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
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/Makefile94
-rw-r--r--source/blender/Makefile2
-rw-r--r--source/blender/avi/intern/avi.c192
-rw-r--r--source/blender/avi/intern/endian.c2
-rw-r--r--source/blender/avi/intern/options.c4
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h5
-rw-r--r--source/blender/blenkernel/BKE_action.h13
-rw-r--r--source/blender/blenkernel/BKE_anim.h5
-rw-r--r--source/blender/blenkernel/BKE_armature.h4
-rw-r--r--source/blender/blenkernel/BKE_bad_level_calls.h38
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_cloth.h259
-rw-r--r--source/blender/blenkernel/BKE_collision.h176
-rw-r--r--source/blender/blenkernel/BKE_constraint.h90
-rw-r--r--source/blender/blenkernel/BKE_displist.h2
-rw-r--r--source/blender/blenkernel/BKE_global.h17
-rw-r--r--source/blender/blenkernel/BKE_group.h5
-rw-r--r--source/blender/blenkernel/BKE_image.h8
-rw-r--r--source/blender/blenkernel/BKE_ipo.h2
-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_material.h3
-rw-r--r--source/blender/blenkernel/BKE_mesh.h14
-rw-r--r--source/blender/blenkernel/BKE_modifier.h20
-rw-r--r--source/blender/blenkernel/BKE_multires.h68
-rw-r--r--source/blender/blenkernel/BKE_node.h46
-rw-r--r--source/blender/blenkernel/BKE_object.h5
-rw-r--r--source/blender/blenkernel/BKE_particle.h314
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h55
-rw-r--r--source/blender/blenkernel/BKE_scene.h2
-rw-r--r--source/blender/blenkernel/BKE_sculpt.h74
-rw-r--r--source/blender/blenkernel/BKE_softbody.h14
-rw-r--r--source/blender/blenkernel/BKE_texture.h3
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h7
-rw-r--r--source/blender/blenkernel/CMakeLists.txt3
-rw-r--r--source/blender/blenkernel/SConscript3
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c209
-rw-r--r--source/blender/blenkernel/intern/Makefile6
-rw-r--r--source/blender/blenkernel/intern/action.c140
-rw-r--r--source/blender/blenkernel/intern/anim.c665
-rw-r--r--source/blender/blenkernel/intern/armature.c332
-rw-r--r--source/blender/blenkernel/intern/blender.c8
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c4
-rw-r--r--source/blender/blenkernel/intern/cloth.c1438
-rw-r--r--source/blender/blenkernel/intern/collision.c1224
-rw-r--r--source/blender/blenkernel/intern/colortools.c32
-rw-r--r--source/blender/blenkernel/intern/constraint.c4753
-rw-r--r--source/blender/blenkernel/intern/curve.c87
-rw-r--r--source/blender/blenkernel/intern/customdata.c89
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c267
-rw-r--r--source/blender/blenkernel/intern/displist.c182
-rw-r--r--source/blender/blenkernel/intern/effect.c8
-rw-r--r--source/blender/blenkernel/intern/group.c35
-rw-r--r--source/blender/blenkernel/intern/image.c574
-rw-r--r--source/blender/blenkernel/intern/implicit.c1638
-rw-r--r--source/blender/blenkernel/intern/ipo.c221
-rw-r--r--source/blender/blenkernel/intern/kdop.c810
-rw-r--r--source/blender/blenkernel/intern/key.c16
-rw-r--r--source/blender/blenkernel/intern/lattice.c1
-rw-r--r--source/blender/blenkernel/intern/library.c25
-rw-r--r--source/blender/blenkernel/intern/material.c37
-rw-r--r--source/blender/blenkernel/intern/mesh.c202
-rw-r--r--source/blender/blenkernel/intern/modifier.c2092
-rw-r--r--source/blender/blenkernel/intern/multires-firstlevel.c (renamed from source/blender/src/multires-firstlevel.c)3
-rw-r--r--source/blender/blenkernel/intern/multires.c1305
-rw-r--r--source/blender/blenkernel/intern/node.c66
-rw-r--r--source/blender/blenkernel/intern/object.c298
-rw-r--r--source/blender/blenkernel/intern/particle.c3733
-rw-r--r--source/blender/blenkernel/intern/particle_system.c4624
-rw-r--r--source/blender/blenkernel/intern/pointcache.c209
-rw-r--r--source/blender/blenkernel/intern/scene.c148
-rw-r--r--source/blender/blenkernel/intern/softbody.c1591
-rw-r--r--source/blender/blenkernel/intern/texture.c20
-rw-r--r--source/blender/blenkernel/intern/world.c8
-rw-r--r--source/blender/blenkernel/intern/writeavi.c5
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c16
-rw-r--r--source/blender/blenlib/BLI_arithb.h30
-rw-r--r--source/blender/blenlib/BLI_blenlib.h15
-rw-r--r--source/blender/blenlib/BLI_boxpack2d.h5
-rw-r--r--source/blender/blenlib/BLI_bpath.h60
-rw-r--r--source/blender/blenlib/BLI_fnmatch.h69
-rw-r--r--source/blender/blenlib/BLI_kdtree.h63
-rw-r--r--source/blender/blenlib/BLI_rand.h3
-rw-r--r--source/blender/blenlib/CMakeLists.txt7
-rw-r--r--source/blender/blenlib/SConscript1
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c18
-rw-r--r--source/blender/blenlib/intern/BLI_kdtree.c341
-rw-r--r--source/blender/blenlib/intern/Makefile3
-rw-r--r--source/blender/blenlib/intern/arithb.c685
-rw-r--r--source/blender/blenlib/intern/bpath.c556
-rw-r--r--source/blender/blenlib/intern/fileops.c36
-rw-r--r--source/blender/blenlib/intern/fnmatch.c250
-rw-r--r--source/blender/blenlib/intern/psfont.c2
-rw-r--r--source/blender/blenlib/intern/rand.c8
-rw-r--r--source/blender/blenlib/intern/storage.c30
-rw-r--r--source/blender/blenlib/intern/threads.c34
-rw-r--r--source/blender/blenlib/intern/util.c215
-rw-r--r--source/blender/blenloader/intern/readfile.c1082
-rw-r--r--source/blender/blenloader/intern/readfile.h4
-rw-r--r--source/blender/blenloader/intern/writefile.c222
-rw-r--r--source/blender/blenpluginapi/iff.h1
-rw-r--r--source/blender/ftfont/intern/Makefile1
-rw-r--r--source/blender/imbuf/IMB_imbuf.h3
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c3
-rw-r--r--source/blender/imbuf/intern/anim.c113
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.cpp172
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.h79
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.cpp67
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.h23
-rw-r--r--source/blender/imbuf/intern/dds/Common.h18
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.cpp587
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.h111
-rw-r--r--source/blender/imbuf/intern/dds/Image.cpp14
-rw-r--r--source/blender/imbuf/intern/dds/Image.h29
-rw-r--r--source/blender/imbuf/intern/dds/PixelFormat.h110
-rw-r--r--source/blender/imbuf/intern/filter.c53
-rw-r--r--source/blender/imbuf/intern/imageprocess.c40
-rw-r--r--source/blender/imbuf/intern/jpeg.c92
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp43
-rw-r--r--source/blender/imbuf/intern/radiance_hdr.c29
-rw-r--r--source/blender/imbuf/intern/rectop.c79
-rw-r--r--source/blender/imbuf/intern/rotate.c61
-rw-r--r--source/blender/imbuf/intern/scaling.c473
-rw-r--r--source/blender/imbuf/intern/thumbs.c12
-rw-r--r--source/blender/imbuf/intern/tiff.c60
-rw-r--r--source/blender/include/BDR_drawaction.h21
-rw-r--r--source/blender/include/BDR_editcurve.h3
-rw-r--r--source/blender/include/BDR_editobject.h8
-rw-r--r--source/blender/include/BDR_sculptmode.h71
-rw-r--r--source/blender/include/BIF_butspace.h4
-rw-r--r--source/blender/include/BIF_drawtext.h2
-rw-r--r--source/blender/include/BIF_editaction.h46
-rw-r--r--source/blender/include/BIF_editarmature.h10
-rw-r--r--source/blender/include/BIF_editconstraint.h18
-rw-r--r--source/blender/include/BIF_editdeform.h3
-rw-r--r--source/blender/include/BIF_editparticle.h98
-rw-r--r--source/blender/include/BIF_editseq.h51
-rw-r--r--source/blender/include/BIF_editsima.h39
-rw-r--r--source/blender/include/BIF_editsound.h2
-rw-r--r--source/blender/include/BIF_editview.h2
-rw-r--r--source/blender/include/BIF_filelist.h1
-rw-r--r--source/blender/include/BIF_gl.h13
-rw-r--r--source/blender/include/BIF_interface.h2
-rw-r--r--source/blender/include/BIF_meshlaplacian.h6
-rw-r--r--source/blender/include/BIF_meshtools.h1
-rw-r--r--source/blender/include/BIF_outliner.h5
-rw-r--r--source/blender/include/BIF_poselib.h55
-rw-r--r--source/blender/include/BIF_poseobject.h12
-rw-r--r--source/blender/include/BIF_radialcontrol.h62
-rw-r--r--source/blender/include/BIF_resources.h11
-rw-r--r--source/blender/include/BIF_space.h2
-rw-r--r--source/blender/include/BIF_transform.h21
-rw-r--r--source/blender/include/BSE_drawipo.h1
-rw-r--r--source/blender/include/BSE_drawview.h2
-rw-r--r--source/blender/include/BSE_editaction_types.h35
-rw-r--r--source/blender/include/BSE_editipo.h8
-rw-r--r--source/blender/include/BSE_node.h9
-rw-r--r--source/blender/include/BSE_seqeffects.h1
-rw-r--r--source/blender/include/BSE_seqscopes.h3
-rw-r--r--source/blender/include/BSE_sequence.h24
-rw-r--r--source/blender/include/BSE_time.h22
-rw-r--r--source/blender/include/BSE_trans_types.h1
-rw-r--r--source/blender/include/blendef.h14
-rw-r--r--source/blender/include/butspace.h94
-rw-r--r--source/blender/include/multires.h30
-rw-r--r--source/blender/include/mydevice.h2
-rw-r--r--source/blender/include/reeb.h127
-rw-r--r--source/blender/include/transform.h57
-rw-r--r--source/blender/makesdna/DNA_ID.h1
-rw-r--r--source/blender/makesdna/DNA_action_types.h174
-rw-r--r--source/blender/makesdna/DNA_armature_types.h120
-rw-r--r--source/blender/makesdna/DNA_cloth_types.h655
-rw-r--r--source/blender/makesdna/DNA_color_types.h5
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h222
-rw-r--r--source/blender/makesdna/DNA_curve_types.h5
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h6
-rw-r--r--source/blender/makesdna/DNA_image_types.h2
-rw-r--r--source/blender/makesdna/DNA_ipo_types.h43
-rw-r--r--source/blender/makesdna/DNA_key_types.h7
-rw-r--r--source/blender/makesdna/DNA_listBase.h9
-rw-r--r--source/blender/makesdna/DNA_material_types.h46
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h3
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h120
-rw-r--r--source/blender/makesdna/DNA_nla_types.h32
-rw-r--r--source/blender/makesdna/DNA_node_types.h52
-rw-r--r--source/blender/makesdna/DNA_object_force.h62
-rw-r--r--source/blender/makesdna/DNA_object_types.h32
-rw-r--r--source/blender/makesdna/DNA_particle_types.h451
-rw-r--r--source/blender/makesdna/DNA_scene_types.h156
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h81
-rw-r--r--source/blender/makesdna/DNA_space_types.h11
-rw-r--r--source/blender/makesdna/DNA_texture_types.h30
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h79
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h1
-rw-r--r--source/blender/makesdna/DNA_world_types.h12
-rw-r--r--source/blender/makesdna/intern/makesdna.c8
-rw-r--r--source/blender/nodes/CMP_node.h9
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c272
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_blur.c142
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c4
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_crop.c119
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_curves.c8
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_defocus.c12
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c143
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_glare.c498
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_idMask.c22
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_image.c9
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c192
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_scale.c6
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_texture.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c173
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c22
-rw-r--r--source/blender/nodes/intern/CMP_nodes/Makefile1
-rw-r--r--source/blender/nodes/intern/CMP_util.c593
-rw-r--r--source/blender/nodes/intern/CMP_util.h39
-rw-r--r--source/blender/nodes/intern/Makefile1
-rw-r--r--source/blender/nodes/intern/SHD_nodes/Makefile1
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_geom.c2
-rw-r--r--source/blender/python/BPY_extern.h10
-rw-r--r--source/blender/python/BPY_interface.c609
-rw-r--r--source/blender/python/api2_2x/Armature.c51
-rw-r--r--source/blender/python/api2_2x/Armature.h2
-rw-r--r--source/blender/python/api2_2x/BGL.c2
-rw-r--r--source/blender/python/api2_2x/BGL.h2
-rw-r--r--source/blender/python/api2_2x/BezTriple.c2
-rw-r--r--source/blender/python/api2_2x/BezTriple.h2
-rw-r--r--source/blender/python/api2_2x/Blender.c93
-rw-r--r--source/blender/python/api2_2x/Blender.h2
-rw-r--r--source/blender/python/api2_2x/Bone.c70
-rw-r--r--source/blender/python/api2_2x/Bone.h3
-rw-r--r--source/blender/python/api2_2x/Camera.c2
-rw-r--r--source/blender/python/api2_2x/Camera.h2
-rw-r--r--source/blender/python/api2_2x/Constraint.c101
-rw-r--r--source/blender/python/api2_2x/Constraint.h2
-rw-r--r--source/blender/python/api2_2x/CurNurb.c34
-rw-r--r--source/blender/python/api2_2x/CurNurb.h2
-rw-r--r--source/blender/python/api2_2x/Curve.c47
-rw-r--r--source/blender/python/api2_2x/Curve.h2
-rw-r--r--source/blender/python/api2_2x/Draw.c67
-rw-r--r--source/blender/python/api2_2x/Draw.h2
-rw-r--r--source/blender/python/api2_2x/EXPP_interface.c2
-rw-r--r--source/blender/python/api2_2x/EXPP_interface.h2
-rw-r--r--source/blender/python/api2_2x/Effect.c2
-rw-r--r--source/blender/python/api2_2x/Effect.h2
-rw-r--r--source/blender/python/api2_2x/Font.h2
-rw-r--r--source/blender/python/api2_2x/Geometry.c41
-rw-r--r--source/blender/python/api2_2x/Geometry.h2
-rw-r--r--source/blender/python/api2_2x/Group.c2
-rw-r--r--source/blender/python/api2_2x/Group.h2
-rw-r--r--source/blender/python/api2_2x/IDProp.c2
-rw-r--r--source/blender/python/api2_2x/Image.c2
-rw-r--r--source/blender/python/api2_2x/Image.h2
-rw-r--r--source/blender/python/api2_2x/Ipo.c2
-rw-r--r--source/blender/python/api2_2x/Ipo.h2
-rw-r--r--source/blender/python/api2_2x/Ipocurve.c2
-rw-r--r--source/blender/python/api2_2x/Ipocurve.h2
-rw-r--r--source/blender/python/api2_2x/Key.c6
-rw-r--r--source/blender/python/api2_2x/Key.h2
-rw-r--r--source/blender/python/api2_2x/Lamp.c6
-rw-r--r--source/blender/python/api2_2x/Lamp.h2
-rw-r--r--source/blender/python/api2_2x/Lattice.c2
-rw-r--r--source/blender/python/api2_2x/Lattice.h2
-rw-r--r--source/blender/python/api2_2x/Library.c2
-rw-r--r--source/blender/python/api2_2x/Library.h2
-rw-r--r--source/blender/python/api2_2x/MTex.c2
-rw-r--r--source/blender/python/api2_2x/MTex.h2
-rw-r--r--source/blender/python/api2_2x/Makefile4
-rw-r--r--source/blender/python/api2_2x/Material.c2
-rw-r--r--source/blender/python/api2_2x/Material.h2
-rw-r--r--source/blender/python/api2_2x/Mathutils.c5
-rw-r--r--source/blender/python/api2_2x/Mathutils.h2
-rw-r--r--source/blender/python/api2_2x/Mesh.c139
-rw-r--r--source/blender/python/api2_2x/Mesh.h2
-rw-r--r--source/blender/python/api2_2x/Metaball.c2
-rw-r--r--source/blender/python/api2_2x/Metaball.h2
-rw-r--r--source/blender/python/api2_2x/Modifier.c6
-rw-r--r--source/blender/python/api2_2x/Modifier.h2
-rw-r--r--source/blender/python/api2_2x/NLA.c5
-rw-r--r--source/blender/python/api2_2x/NLA.h2
-rw-r--r--source/blender/python/api2_2x/NMesh.c2
-rw-r--r--source/blender/python/api2_2x/NMesh.h2
-rw-r--r--source/blender/python/api2_2x/Node.c2
-rw-r--r--source/blender/python/api2_2x/Node.h2
-rw-r--r--source/blender/python/api2_2x/Noise.c2
-rw-r--r--source/blender/python/api2_2x/Object.c30
-rw-r--r--source/blender/python/api2_2x/Object.h2
-rw-r--r--source/blender/python/api2_2x/Particle.c2
-rw-r--r--source/blender/python/api2_2x/Particle.h2
-rw-r--r--source/blender/python/api2_2x/Pose.c35
-rw-r--r--source/blender/python/api2_2x/Registry.c2
-rw-r--r--source/blender/python/api2_2x/Registry.h2
-rw-r--r--source/blender/python/api2_2x/Scene.c39
-rw-r--r--source/blender/python/api2_2x/Scene.h2
-rw-r--r--source/blender/python/api2_2x/Sound.c2
-rw-r--r--source/blender/python/api2_2x/Sound.h2
-rw-r--r--source/blender/python/api2_2x/SurfNurb.c2
-rw-r--r--source/blender/python/api2_2x/SurfNurb.h2
-rw-r--r--source/blender/python/api2_2x/Sys.c2
-rw-r--r--source/blender/python/api2_2x/Sys.h2
-rw-r--r--source/blender/python/api2_2x/Text.c2
-rw-r--r--source/blender/python/api2_2x/Text.h2
-rw-r--r--source/blender/python/api2_2x/Text3d.c2
-rw-r--r--source/blender/python/api2_2x/Text3d.h2
-rw-r--r--source/blender/python/api2_2x/Texture.c35
-rw-r--r--source/blender/python/api2_2x/Texture.h2
-rw-r--r--source/blender/python/api2_2x/Types.c2
-rw-r--r--source/blender/python/api2_2x/Types.h2
-rw-r--r--source/blender/python/api2_2x/Window.c105
-rw-r--r--source/blender/python/api2_2x/World.c2
-rw-r--r--source/blender/python/api2_2x/World.h2
-rw-r--r--source/blender/python/api2_2x/bpy.c2
-rw-r--r--source/blender/python/api2_2x/bpy.h2
-rw-r--r--source/blender/python/api2_2x/bpy_config.c2
-rw-r--r--source/blender/python/api2_2x/bpy_config.h2
-rw-r--r--source/blender/python/api2_2x/bpy_data.c2
-rw-r--r--source/blender/python/api2_2x/bpy_types.h2
-rw-r--r--source/blender/python/api2_2x/charRGBA.c2
-rw-r--r--source/blender/python/api2_2x/charRGBA.h2
-rw-r--r--source/blender/python/api2_2x/constant.c2
-rw-r--r--source/blender/python/api2_2x/constant.h2
-rw-r--r--source/blender/python/api2_2x/doc/Armature.py10
-rw-r--r--source/blender/python/api2_2x/doc/Blender.py4
-rw-r--r--source/blender/python/api2_2x/doc/Curve.py8
-rw-r--r--source/blender/python/api2_2x/doc/Font.py8
-rw-r--r--source/blender/python/api2_2x/doc/Geometry.py7
-rw-r--r--source/blender/python/api2_2x/doc/Ipo.py2
-rw-r--r--source/blender/python/api2_2x/doc/LibData.py8
-rw-r--r--source/blender/python/api2_2x/doc/Mathutils.py10
-rw-r--r--source/blender/python/api2_2x/doc/Mesh.py18
-rw-r--r--source/blender/python/api2_2x/doc/Modifier.py1
-rw-r--r--source/blender/python/api2_2x/doc/NLA.py1
-rw-r--r--source/blender/python/api2_2x/doc/Object.py3
-rw-r--r--source/blender/python/api2_2x/doc/Pose.py6
-rw-r--r--source/blender/python/api2_2x/doc/Render.py19
-rw-r--r--source/blender/python/api2_2x/doc/Scene.py10
-rw-r--r--source/blender/python/api2_2x/doc/Text3d.py4
-rw-r--r--source/blender/python/api2_2x/doc/Texture.py4
-rw-r--r--source/blender/python/api2_2x/doc/Window.py28
-rw-r--r--source/blender/python/api2_2x/euler.c2
-rw-r--r--source/blender/python/api2_2x/euler.h2
-rw-r--r--source/blender/python/api2_2x/gen_library.h2
-rw-r--r--source/blender/python/api2_2x/gen_utils.c2
-rw-r--r--source/blender/python/api2_2x/gen_utils.h2
-rw-r--r--source/blender/python/api2_2x/logic.c2
-rw-r--r--source/blender/python/api2_2x/logic.h2
-rw-r--r--source/blender/python/api2_2x/matrix.c2
-rw-r--r--source/blender/python/api2_2x/matrix.h2
-rw-r--r--source/blender/python/api2_2x/meshPrimitive.c2
-rw-r--r--source/blender/python/api2_2x/meshPrimitive.h2
-rw-r--r--source/blender/python/api2_2x/modules.h2
-rw-r--r--source/blender/python/api2_2x/point.c2
-rw-r--r--source/blender/python/api2_2x/point.h2
-rw-r--r--source/blender/python/api2_2x/quat.c4
-rw-r--r--source/blender/python/api2_2x/quat.h2
-rw-r--r--source/blender/python/api2_2x/rgbTuple.c2
-rw-r--r--source/blender/python/api2_2x/rgbTuple.h2
-rw-r--r--source/blender/python/api2_2x/sceneRadio.c2
-rw-r--r--source/blender/python/api2_2x/sceneRadio.h2
-rw-r--r--source/blender/python/api2_2x/sceneRender.c725
-rw-r--r--source/blender/python/api2_2x/sceneRender.h14
-rw-r--r--source/blender/python/api2_2x/sceneSequence.c58
-rw-r--r--source/blender/python/api2_2x/sceneSequence.h2
-rw-r--r--source/blender/python/api2_2x/sceneTimeLine.c2
-rw-r--r--source/blender/python/api2_2x/sceneTimeLine.h2
-rw-r--r--source/blender/python/api2_2x/vector.c2
-rw-r--r--source/blender/python/api2_2x/vector.h2
-rw-r--r--source/blender/python/api2_2x/windowTheme.c2
-rw-r--r--source/blender/python/api2_2x/windowTheme.h2
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c41
-rw-r--r--source/blender/radiosity/intern/source/radfactors.c10
-rw-r--r--source/blender/radiosity/intern/source/radrender.c393
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h29
-rw-r--r--source/blender/render/extern/include/RE_raytrace.h32
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h6
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h26
-rw-r--r--source/blender/render/intern/include/occlusion.h49
-rw-r--r--source/blender/render/intern/include/render_types.h153
-rw-r--r--source/blender/render/intern/include/rendercore.h7
-rw-r--r--source/blender/render/intern/include/renderdatabase.h90
-rw-r--r--source/blender/render/intern/include/shadbuf.h9
-rw-r--r--source/blender/render/intern/include/shading.h16
-rw-r--r--source/blender/render/intern/include/strand.h116
-rw-r--r--source/blender/render/intern/include/zbuf.h58
-rw-r--r--source/blender/render/intern/source/convertblender.c4606
-rw-r--r--source/blender/render/intern/source/envmap.c135
-rw-r--r--source/blender/render/intern/source/imagetexture.c42
-rw-r--r--source/blender/render/intern/source/initrender.c9
-rw-r--r--source/blender/render/intern/source/occlusion.c1648
-rw-r--r--source/blender/render/intern/source/pipeline.c510
-rw-r--r--source/blender/render/intern/source/pixelblending.c9
-rw-r--r--source/blender/render/intern/source/pixelshading.c11
-rw-r--r--source/blender/render/intern/source/rayshade.c276
-rw-r--r--source/blender/render/intern/source/raytrace.c202
-rw-r--r--source/blender/render/intern/source/rendercore.c837
-rw-r--r--source/blender/render/intern/source/renderdatabase.c1070
-rw-r--r--source/blender/render/intern/source/shadbuf.c423
-rw-r--r--source/blender/render/intern/source/shadeinput.c606
-rw-r--r--source/blender/render/intern/source/shadeoutput.c168
-rw-r--r--source/blender/render/intern/source/sss.c37
-rw-r--r--source/blender/render/intern/source/strand.c1002
-rw-r--r--source/blender/render/intern/source/texture.c183
-rw-r--r--source/blender/render/intern/source/zbuf.c1672
-rw-r--r--source/blender/src/SConscript22
-rw-r--r--source/blender/src/blenderbuttons.c4120
-rw-r--r--source/blender/src/butspace.c7
-rw-r--r--source/blender/src/buttons_editing.c1117
-rw-r--r--source/blender/src/buttons_object.c3506
-rw-r--r--source/blender/src/buttons_scene.c1064
-rw-r--r--source/blender/src/buttons_shading.c444
-rw-r--r--source/blender/src/drawaction.c557
-rw-r--r--source/blender/src/drawarmature.c1262
-rw-r--r--source/blender/src/drawimage.c234
-rw-r--r--source/blender/src/drawimasel.c3
-rw-r--r--source/blender/src/drawipo.c76
-rw-r--r--source/blender/src/drawmesh.c15
-rw-r--r--source/blender/src/drawnla.c54
-rw-r--r--source/blender/src/drawnode.c643
-rw-r--r--source/blender/src/drawobject.c1111
-rw-r--r--source/blender/src/drawscene.c9
-rw-r--r--source/blender/src/drawseq.c639
-rw-r--r--source/blender/src/drawsound.c15
-rw-r--r--source/blender/src/drawtext.c173
-rw-r--r--source/blender/src/drawtime.c201
-rw-r--r--source/blender/src/drawview.c437
-rw-r--r--source/blender/src/edit.c157
-rw-r--r--source/blender/src/editaction.c2115
-rw-r--r--source/blender/src/editarmature.c2072
-rw-r--r--source/blender/src/editconstraint.c1038
-rw-r--r--source/blender/src/editcurve.c478
-rw-r--r--source/blender/src/editdeform.c86
-rw-r--r--source/blender/src/editface.c4
-rw-r--r--source/blender/src/editfont.c4
-rw-r--r--source/blender/src/editgroup.c82
-rw-r--r--source/blender/src/editimasel.c73
-rw-r--r--source/blender/src/editipo.c550
-rw-r--r--source/blender/src/editipo_lib.c25
-rw-r--r--source/blender/src/editipo_mods.c81
-rw-r--r--source/blender/src/editkey.c10
-rw-r--r--source/blender/src/editlattice.c10
-rw-r--r--source/blender/src/editmball.c13
-rw-r--r--source/blender/src/editmesh.c138
-rw-r--r--source/blender/src/editmesh_add.c25
-rw-r--r--source/blender/src/editmesh_lib.c89
-rw-r--r--source/blender/src/editmesh_loop.c2
-rw-r--r--source/blender/src/editmesh_mods.c15
-rw-r--r--source/blender/src/editmesh_tools.c49
-rw-r--r--source/blender/src/editnla.c85
-rw-r--r--source/blender/src/editnode.c200
-rw-r--r--source/blender/src/editobject.c603
-rw-r--r--source/blender/src/editparticle.c3193
-rw-r--r--source/blender/src/editscreen.c24
-rw-r--r--source/blender/src/editseq.c903
-rw-r--r--source/blender/src/editsima.c438
-rw-r--r--source/blender/src/editsound.c4
-rw-r--r--source/blender/src/edittime.c22
-rw-r--r--source/blender/src/editview.c123
-rw-r--r--source/blender/src/filelist.c24
-rw-r--r--source/blender/src/filesel.c40
-rw-r--r--source/blender/src/ghostwinlay.c2
-rw-r--r--source/blender/src/hddaudio.c2
-rw-r--r--source/blender/src/header_action.c325
-rw-r--r--source/blender/src/header_buttonswin.c13
-rw-r--r--source/blender/src/header_filesel.c11
-rw-r--r--source/blender/src/header_image.c13
-rw-r--r--source/blender/src/header_imasel.c15
-rw-r--r--source/blender/src/header_info.c181
-rw-r--r--source/blender/src/header_ipo.c59
-rw-r--r--source/blender/src/header_nla.c58
-rw-r--r--source/blender/src/header_node.c21
-rw-r--r--source/blender/src/header_seq.c111
-rw-r--r--source/blender/src/header_text.c102
-rw-r--r--source/blender/src/header_time.c28
-rw-r--r--source/blender/src/header_view3d.c603
-rw-r--r--source/blender/src/headerbuttons.c34
-rw-r--r--source/blender/src/interface.c45
-rw-r--r--source/blender/src/interface_draw.c95
-rw-r--r--source/blender/src/interface_panel.c7
-rw-r--r--source/blender/src/language.c2
-rw-r--r--source/blender/src/meshlaplacian.c1063
-rw-r--r--source/blender/src/meshtools.c261
-rw-r--r--source/blender/src/multires.c1433
-rw-r--r--source/blender/src/outliner.c244
-rw-r--r--source/blender/src/parametrizer.c68
-rw-r--r--source/blender/src/playanim.c25
-rw-r--r--source/blender/src/poselib.c1325
-rw-r--r--source/blender/src/poseobject.c618
-rw-r--r--source/blender/src/preview.blend.c25478
-rw-r--r--source/blender/src/previewrender.c5
-rw-r--r--source/blender/src/radialcontrol.c267
-rw-r--r--source/blender/src/reeb.c1923
-rw-r--r--source/blender/src/renderwin.c40
-rw-r--r--source/blender/src/resources.c80
-rw-r--r--source/blender/src/retopo.c9
-rw-r--r--source/blender/src/sculptmode-stroke.c17
-rw-r--r--source/blender/src/sculptmode.c1326
-rw-r--r--source/blender/src/seqaudio.c42
-rw-r--r--source/blender/src/seqeffects.c76
-rw-r--r--source/blender/src/seqscopes.c435
-rw-r--r--source/blender/src/sequence.c1697
-rw-r--r--source/blender/src/space.c464
-rw-r--r--source/blender/src/toets.c30
-rw-r--r--source/blender/src/toolbox.c36
-rw-r--r--source/blender/src/transform.c1329
-rw-r--r--source/blender/src/transform_constraints.c33
-rw-r--r--source/blender/src/transform_conversions.c1062
-rw-r--r--source/blender/src/transform_generics.c122
-rw-r--r--source/blender/src/transform_manipulator.c35
-rw-r--r--source/blender/src/transform_snap.c223
-rw-r--r--source/blender/src/unwrapper.c18
-rw-r--r--source/blender/src/usiblender.c108
-rw-r--r--source/blender/src/verse_object.c1
-rw-r--r--source/blender/src/view.c29
-rw-r--r--source/blender/src/vpaint.c34
-rw-r--r--source/blender/src/writeimage.c1
-rw-r--r--source/blender/yafray/YafRay_Api.h2
-rw-r--r--source/blender/yafray/intern/api.cpp2
-rw-r--r--source/blender/yafray/intern/export_File.cpp16
-rw-r--r--source/blender/yafray/intern/export_File.h2
-rw-r--r--source/blender/yafray/intern/export_Plugin.cpp44
-rw-r--r--source/blender/yafray/intern/export_Plugin.h12
-rw-r--r--source/blender/yafray/intern/yafray_Render.cpp144
-rw-r--r--source/blender/yafray/intern/yafray_Render.h12
-rw-r--r--source/creator/CMakeLists.txt12
-rw-r--r--source/creator/Makefile5
-rw-r--r--source/creator/SConscript4
-rw-r--r--source/creator/buildinfo.c1
-rw-r--r--source/creator/creator.c107
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp4
-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.cpp26
-rw-r--r--source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp4
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp4
-rw-r--r--source/gameengine/Ketsji/BL_Shader.cpp4
-rw-r--r--source/gameengine/Ketsji/BL_Texture.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp4
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.cpp31
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h30
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp2
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp4
-rw-r--r--source/nan_compile.mk45
-rw-r--r--source/nan_definitions.mk79
-rw-r--r--source/nan_link.mk16
555 files changed, 94985 insertions, 33691 deletions
diff --git a/source/Makefile b/source/Makefile
index 5161f6b73c5..3553c723b51 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -56,11 +56,11 @@ 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 ##################
-PYPLAYERLIB ?= $(PYLIB)
############# libraries ##################
# COMLIB COMmon LIBraries for all targets
@@ -103,6 +103,8 @@ COMLIB += $(OCGDIR)/blender/nodes_cmp/$(DEBUG_DIR)libnodes_cmp.a
COMLIB += $(OCGDIR)/blender/nodes/$(DEBUG_DIR)libnodes.a
COMLIB += $(OCGDIR)/blender/imbuf/$(DEBUG_DIR)libimbuf.a
COMLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
+COMLIB += $(NAN_OPENNL)/lib/$(DEBUG_DIR)libopennl.a
+COMLIB += $(NAN_SUPERLU)/lib/$(DEBUG_DIR)libsuperlu.a
COMLIB += $(OCGDIR)/blender/avi/$(DEBUG_DIR)libavi.a
COMLIB += $(NAN_JPEG)/lib/libjpeg.a
@@ -173,52 +175,27 @@ ifeq ($(WITH_DDS), true)
COMLIB += $(OCGDIR)/blender/imbuf/dds/$(DEBUG_DIR)libdds.a
endif
+ifeq ($(WITH_BINRELOC), true)
+ COMLIB += $(OCGDIR)/extern/binreloc/$(DEBUG_DIR)libbinreloc.a
+endif
+
ifeq ($(WITH_FREETYPE2), true)
+ COMLIB += $(OCGDIR)/blender/ftfont/$(DEBUG_DIR)libftfont.a
ifeq ($(OS), windows)
ifeq ($(FREE_WINDOWS), true)
+ COMLIB += $(NAN_FTGL)/lib/libftgl.a
COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
else
+ COMLIB += $(NAN_FTGL)/lib/ftgl_static_ST.lib
COMLIB += $(NAN_FREETYPE)/lib/freetype2ST.lib
endif
else
+ COMLIB += $(NAN_FTGL)/lib/libftgl.a
ifeq ($(OS), irix)
COMLIB += $(NAN_FREETYPE)/lib32/libfreetype.a
- else
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- endif
- endif
-endif
-
-ifeq ($(INTERNATIONAL), true)
- COMLIB += $(OCGDIR)/blender/ftfont/$(DEBUG_DIR)libftfont.a
- ifeq ($(OS), windows)
- ifeq ($(FREE_WINDOWS), true)
- COMLIB += $(NAN_GETTEXT)/lib/freegettext.a
- COMLIB += $(NAN_FTGL)/lib/libftgl.a
- #COMLIB += $(NAN_ICONV)/lib/freeiconv.a
- else
- COMLIB += $(NAN_GETTEXT)/lib/gnu_gettext.lib
- COMLIB += $(NAN_FTGL)/lib/ftgl_static_ST.lib
- COMLIB += $(NAN_FREETYPE)/lib/freetype2ST.lib
- COMLIB += $(NAN_ICONV)/lib/iconv.lib
- endif
- else
- COMLIB += $(NAN_FTGL)/lib/libftgl.a
- ifeq ($(OS), irix)
- COMLIB += $(NAN_FREETYPE)/lib32/libfreetype.a
- COMLIB += $(NAN_FREETYPE)/lib32/libintl.a
else
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- endif
- endif
- ifeq ($(OS), darwin)
- COMLIB += $(NAN_GETTEXT)/lib/libintl.a
- ifeq ($(CPU), i386)
- COMLIB += $(NAN_GETTEXT)/lib/libiconv.a
- endif
- endif
- ifeq ($(OS), solaris)
- COMLIB += $(NAN_GETTEXT)/lib/libintl.a
+ COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
+ endif
endif
endif
@@ -351,14 +328,7 @@ ifeq ($(WITH_BF_WEBPLUGIN), true)
endif
endif
-ifdef PY_FRAMEWORK
- PYLIB = -framework Python
-else
- PYLIB = $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
-endif
-
ifeq ($(OS),solaris)
- PYLIB += $(NAN_ZLIB)/lib/libz.a
PULIB += $(NAN_ZLIB)/lib/libz.a
SPLIB += $(NAN_ZLIB)/lib/libz.a
endif
@@ -433,14 +403,6 @@ else
endif
ifeq ($(OS),windows)
- ifeq ($(FREE_WINDOWS),true)
- PYLIB = $(NAN_PYTHON)/lib/freepy.a
- else
- PYLIB = $(NAN_PYTHON)/lib/python23.lib
- endif
-
- PYPLAYERLIB = $(NAN_PYTHON)/static/*.obj
- PYPLAYERLIB = $(PYLIB)
# Might need to change this to $(NAN_MOZILLA_LIB)/nspr4.lib
NSPLUGLIB += $(NAN_NSPR)/lib/nspr4.lib
@@ -544,10 +506,10 @@ 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)
+ $(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderstatic $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(COMLIB) $(PULIB) $(LLIBS) $(SADD) $(LOPTS)
ifdef NAN_BUILDINFO
/bin/rm $(BUILDINFO_O)
endif
@@ -558,10 +520,10 @@ 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)
+ $(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blender$(EXT) $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(COMLIB) $(PULIB) $(LLIBS) $(DADD) $(LOPTS)
ifdef NAN_BUILDINFO
/bin/rm $(BUILDINFO_O)
endif
@@ -572,10 +534,10 @@ 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)
+ $(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(LLIBS) $(DADD) $(LOPTS)
ifdef NAN_BUILDINFO
/bin/rm $(BUILDINFO_O)
endif
@@ -586,10 +548,10 @@ 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)
+ $(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(LLIBS) $(DADD) $(LOPTS)
ifdef NAN_BUILDINFO
/bin/rm $(BUILDINFO_O)
endif
@@ -600,7 +562,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)
@@ -616,10 +578,10 @@ 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)
+# $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
+ $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS) /def:$(DEFFILE)
ifdef NAN_BUILDINFO
/bin/rm $(BUILDINFO_O)
endif
@@ -627,10 +589,10 @@ 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)
+ $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
ifdef NAN_BUILDINFO
/bin/rm $(BUILDINFO_O)
endif
@@ -638,7 +600,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/Makefile b/source/blender/Makefile
index c0001495210..2c1f83edf39 100644
--- a/source/blender/Makefile
+++ b/source/blender/Makefile
@@ -38,7 +38,7 @@ DIRS += avi imbuf render radiosity blenlib blenkernel blenpluginapi
DIRS += makesdna src yafray
DIRS += python nodes
-ifeq ($(INTERNATIONAL), true)
+ifeq ($(WITH_FREETYPE2), true)
DIRS += ftfont
endif
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index 3ad844bfdc1..da51c00c196 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -190,6 +190,7 @@ void AVI_set_debug (int mode) {
AVI_DEBUG= mode;
}
+/*
int AVI_is_avi (char *name) {
FILE *fp;
int ret;
@@ -209,6 +210,195 @@ int AVI_is_avi (char *name) {
fclose(fp);
return ret;
}
+*/
+
+int AVI_is_avi (char *name) {
+ int temp, fcca, j;
+ AviMovie movie;
+ AviMainHeader header;
+ AviBitmapInfoHeader bheader;
+
+ DEBUG("opening movie\n");
+
+ memset(&movie, 0, sizeof(AviMovie));
+
+ movie.type = AVI_MOVIE_READ;
+ movie.fp = fopen (name, "rb");
+ movie.offset_table = NULL;
+
+ if (movie.fp == NULL)
+ return 0;
+
+ if (GET_FCC (movie.fp) != FCC("RIFF") ||
+ !(movie.size = GET_FCC (movie.fp))) {
+ fclose(movie.fp);
+ return 0;
+ }
+
+ movie.header = &header;
+
+ if (GET_FCC (movie.fp) != FCC("AVI ") ||
+ GET_FCC (movie.fp) != FCC("LIST") ||
+ !GET_FCC (movie.fp) ||
+ GET_FCC (movie.fp) != FCC("hdrl") ||
+ (movie.header->fcc = GET_FCC (movie.fp)) != FCC("avih") ||
+ !(movie.header->size = GET_FCC (movie.fp))) {
+ DEBUG("bad initial header info\n");
+ fclose(movie.fp);
+ return 0;
+ }
+
+ movie.header->MicroSecPerFrame = GET_FCC(movie.fp);
+ movie.header->MaxBytesPerSec = GET_FCC(movie.fp);
+ movie.header->PaddingGranularity = GET_FCC(movie.fp);
+ movie.header->Flags = GET_FCC(movie.fp);
+ movie.header->TotalFrames = GET_FCC(movie.fp);
+ movie.header->InitialFrames = GET_FCC(movie.fp);
+ movie.header->Streams = GET_FCC(movie.fp);
+ movie.header->SuggestedBufferSize = GET_FCC(movie.fp);
+ movie.header->Width = GET_FCC(movie.fp);
+ movie.header->Height = GET_FCC(movie.fp);
+ movie.header->Reserved[0] = GET_FCC(movie.fp);
+ movie.header->Reserved[1] = GET_FCC(movie.fp);
+ movie.header->Reserved[2] = GET_FCC(movie.fp);
+ movie.header->Reserved[3] = GET_FCC(movie.fp);
+
+ fseek (movie.fp, movie.header->size-14*4, SEEK_CUR);
+
+ if (movie.header->Streams < 1) {
+ DEBUG("streams less than 1\n");
+ fclose(movie.fp);
+ return 0;
+ }
+
+ movie.streams = (AviStreamRec *) MEM_callocN (sizeof(AviStreamRec) * movie.header->Streams, "moviestreams");
+
+ for (temp=0; temp < movie.header->Streams; temp++) {
+
+ if (GET_FCC(movie.fp) != FCC("LIST") ||
+ !GET_FCC (movie.fp) ||
+ GET_FCC (movie.fp) != FCC ("strl") ||
+ (movie.streams[temp].sh.fcc = GET_FCC (movie.fp)) != FCC ("strh") ||
+ !(movie.streams[temp].sh.size = GET_FCC (movie.fp))) {
+ DEBUG("bad stream header information\n");
+
+ MEM_freeN(movie.streams);
+ fclose(movie.fp);
+ return 0;
+ }
+
+ movie.streams[temp].sh.Type = GET_FCC (movie.fp);
+ movie.streams[temp].sh.Handler = GET_FCC (movie.fp);
+
+ fcca = movie.streams[temp].sh.Handler;
+
+ if (movie.streams[temp].sh.Type == FCC("vids")) {
+ if (fcca == FCC ("DIB ") ||
+ fcca == FCC ("RGB ") ||
+ fcca == FCC ("rgb ") ||
+ fcca == FCC ("RAW ") ||
+ fcca == 0) {
+ movie.streams[temp].format = AVI_FORMAT_AVI_RGB;
+ } else if (fcca == FCC ("mjpg")||fcca == FCC ("MJPG")) {
+ movie.streams[temp].format = AVI_FORMAT_MJPEG;
+ } else {
+ MEM_freeN(movie.streams);
+ fclose(movie.fp);
+ return 0;
+ }
+ }
+
+ movie.streams[temp].sh.Flags = GET_FCC (movie.fp);
+ movie.streams[temp].sh.Priority = GET_TCC (movie.fp);
+ movie.streams[temp].sh.Language = GET_TCC (movie.fp);
+ movie.streams[temp].sh.InitialFrames = GET_FCC (movie.fp);
+ movie.streams[temp].sh.Scale = GET_FCC (movie.fp);
+ movie.streams[temp].sh.Rate = GET_FCC (movie.fp);
+ movie.streams[temp].sh.Start = GET_FCC (movie.fp);
+ movie.streams[temp].sh.Length = GET_FCC (movie.fp);
+ movie.streams[temp].sh.SuggestedBufferSize = GET_FCC (movie.fp);
+ movie.streams[temp].sh.Quality = GET_FCC (movie.fp);
+ movie.streams[temp].sh.SampleSize = GET_FCC (movie.fp);
+ movie.streams[temp].sh.left = GET_TCC (movie.fp);
+ movie.streams[temp].sh.top = GET_TCC (movie.fp);
+ movie.streams[temp].sh.right = GET_TCC (movie.fp);
+ movie.streams[temp].sh.bottom = GET_TCC (movie.fp);
+
+ fseek (movie.fp, movie.streams[temp].sh.size-14*4, SEEK_CUR);
+
+ if (GET_FCC (movie.fp) != FCC("strf")) {
+ DEBUG("no stream format information\n");
+ MEM_freeN(movie.streams);
+ fclose(movie.fp);
+ return 0;
+ }
+
+ movie.streams[temp].sf_size= GET_FCC(movie.fp);
+ if (movie.streams[temp].sh.Type == FCC("vids")) {
+ j = movie.streams[temp].sf_size - (sizeof(AviBitmapInfoHeader) - 8);
+ if (j >= 0) {
+ AviBitmapInfoHeader *bi;
+
+ movie.streams[temp].sf= &bheader;
+ bi= (AviBitmapInfoHeader *) movie.streams[temp].sf;
+
+ bi->fcc= FCC("strf");
+ bi->size= movie.streams[temp].sf_size;
+ bi->Size= GET_FCC(movie.fp);
+ bi->Width= GET_FCC(movie.fp);
+ bi->Height= GET_FCC(movie.fp);
+ bi->Planes= GET_TCC(movie.fp);
+ bi->BitCount= GET_TCC(movie.fp);
+ bi->Compression= GET_FCC(movie.fp);
+ bi->SizeImage= GET_FCC(movie.fp);
+ bi->XPelsPerMeter= GET_FCC(movie.fp);
+ bi->YPelsPerMeter= GET_FCC(movie.fp);
+ bi->ClrUsed= GET_FCC(movie.fp);
+ bi->ClrImportant= GET_FCC(movie.fp);
+
+ fcca = bi->Compression;
+
+ if ( movie.streams[temp].format ==
+ AVI_FORMAT_AVI_RGB) {
+ if (fcca == FCC ("DIB ") ||
+ fcca == FCC ("RGB ") ||
+ fcca == FCC ("rgb ") ||
+ fcca == FCC ("RAW ") ||
+ fcca == 0 ) {
+ } else if ( fcca == FCC ("mjpg") ||
+ fcca == FCC ("MJPG")) {
+ movie.streams[temp].format = AVI_FORMAT_MJPEG;
+ } else {
+ MEM_freeN(movie.streams);
+ fclose(movie.fp);
+ return 0;
+ }
+ }
+
+ }
+ if (j > 0) fseek (movie.fp, j, SEEK_CUR);
+ } else fseek (movie.fp, movie.streams[temp].sf_size, SEEK_CUR);
+
+ /* Walk to the next LIST */
+ while (GET_FCC (movie.fp) != FCC("LIST")) {
+ temp= GET_FCC (movie.fp);
+ if (temp<0 || ftell(movie.fp) > movie.size) {
+ DEBUG("incorrect size in header or error in AVI\n");
+
+ MEM_freeN(movie.streams);
+ fclose(movie.fp);
+ return 0;
+ }
+ fseek(movie.fp, temp, SEEK_CUR);
+ }
+
+ fseek(movie.fp, -4L, SEEK_CUR);
+ }
+
+ MEM_freeN(movie.streams);
+ fclose(movie.fp);
+ return 1;
+}
AviError AVI_open_movie (char *name, AviMovie *movie) {
int temp, fcca, size, j;
@@ -442,7 +632,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
}
void *AVI_read_frame (AviMovie *movie, AviFormat format, int frame, int stream) {
- int cur_frame, temp, i, rewind=1;
+ int cur_frame=-1, temp, i=0, rewind=1;
void *buffer;
/* Retrieve the record number of the desired frame in the index
diff --git a/source/blender/avi/intern/endian.c b/source/blender/avi/intern/endian.c
index 152530dac0d..2ebbd5d4975 100644
--- a/source/blender/avi/intern/endian.c
+++ b/source/blender/avi/intern/endian.c
@@ -50,6 +50,7 @@
#define WORDS_BIGENDIAN
#endif
+#ifdef WORDS_BIGENDIAN
static void invert (int *num) {
int new=0,i,j;
@@ -79,6 +80,7 @@ static void Ichunk (AviChunk *chunk) {
invert (&chunk->fcc);
invert (&chunk->size);
}
+#endif
#ifdef WORDS_BIGENDIAN
static void Ilist (AviList *list){
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 c710e16ad1a..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 */
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index 68a6be04735..1e1c3c110e8 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -60,6 +60,11 @@ extern "C" {
*/
void free_pose_channels(struct bPose *pose);
+/**
+ * Removes and deallocates all data from a pose, and also frees the pose.
+ */
+void free_pose(struct bPose *pose);
+
/**
* Allocate a new pose on the heap, and copy the src pose and it's channels
* into the new pose. *dst is set to the newly allocated structure, and assumed to be NULL.
@@ -119,8 +124,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
diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index c7808331d7e..54fcb19d5dc 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -34,6 +34,8 @@
#ifndef BKE_ANIM_H
#define BKE_ANIM_H
+#define MAX_DUPLI_RECUR 8
+
struct Path;
struct Object;
struct PartEff;
@@ -44,8 +46,9 @@ typedef struct DupliObject {
struct DupliObject *next, *prev;
struct Object *ob;
unsigned int origlay;
- int index, no_draw;
+ int index, no_draw, type, animated;
float mat[4][4], omat[4][4];
+ float orco[3], uv[2];
} DupliObject;
void free_path(struct Path *path);
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 0e3857603b6..2c573faeb87 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -78,9 +78,11 @@ void unlink_armature(struct bArmature *arm);
void free_armature(struct bArmature *arm);
void make_local_armature(struct bArmature *arm);
struct bArmature *copy_armature(struct bArmature *arm);
+
void bone_flip_name (char *name, int strip_number);
+void bone_autoside_name (char *name, int strip_number, short axis, float head, float tail);
-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);
diff --git a/source/blender/blenkernel/BKE_bad_level_calls.h b/source/blender/blenkernel/BKE_bad_level_calls.h
index 296fd5837b5..94eafbf9f71 100644
--- a/source/blender/blenkernel/BKE_bad_level_calls.h
+++ b/source/blender/blenkernel/BKE_bad_level_calls.h
@@ -65,6 +65,7 @@ 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);
@@ -74,9 +75,9 @@ float BPY_pydriver_eval(struct IpoDriver *driver);
void BPY_pydriver_update(void);
/* button python evaluation */
int BPY_button_eval(char *expr, double *value);
-void BPY_pyconstraint_eval(struct bPythonConstraint *con, float ownermat[][4], float targetmat[][4]);
-void BPY_pyconstraint_driver(struct bPythonConstraint *con, struct bConstraintOb *cob, struct Object *target, char subtarget[]);
-int BPY_pyconstraint_targets(struct bPythonConstraint *con, float targetmat[][4]);
+/* 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 */
@@ -90,8 +91,9 @@ extern struct ListBase editNurb;
void mainqenter (unsigned short event, short val);
void waitcursor(int);
void allqueue(unsigned short event, short val);
-#define REDRAWVIEW3D 0x4010
-#define REDRAWBUTSEDIT 0x4019
+#define REDRAWVIEW3D 0x4010
+#define REDRAWBUTSOBJECT 0x4018
+#define REDRAWBUTSEDIT 0x4019
struct Material;
extern struct Material defmaterial;
@@ -205,24 +207,24 @@ void post_layer_create(struct VLayer *vlayer);
void post_layer_destroy(struct VLayer *vlayer);
void post_server_add(void);
-/* multires.c */
-struct Multires;
-struct MultiresLevel;
-struct MultiresLevel *multires_level_n(struct Multires *mr, int n);
-void multires_free(struct Multires *mr);
-void multires_set_level(struct Object *ob, struct Mesh *me, const int render);
-void multires_update_levels(struct Mesh *me, const int render);
-void multires_calc_level_maps(struct MultiresLevel *lvl);
-struct Multires *multires_copy(struct Multires *orig);
-/* sculptmode.c */
-void sculptmode_free_all(struct Scene *sce);
-void sculptmode_init(struct Scene *sce);
-
/* zbuf.c */
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 73af56b9123..6c3ff3f3467 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -44,7 +44,7 @@ struct ListBase;
struct MemFile;
#define BLENDER_VERSION 245
-#define BLENDER_SUBVERSION 5
+#define BLENDER_SUBVERSION 14
#define BLENDER_MINVERSION 240
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
new file mode 100644
index 00000000000..430a8fd50a6
--- /dev/null
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -0,0 +1,259 @@
+/**
+ * BKE_cloth.h
+ *
+ * $Id: BKE_cloth.h,v 1.1 2007/08/01 02:07:27 daniel Exp $
+ *
+ * ***** 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) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+#ifndef BKE_CLOTH_H
+#define BKE_CLOTH_H
+
+#include "float.h"
+#include "BLI_linklist.h"
+#include "BKE_collision.h"
+#include "BKE_customdata.h"
+#include "BKE_DerivedMesh.h"
+#include "DNA_cloth_types.h"
+#include "DNA_customdata_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+struct Object;
+struct Cloth;
+struct MFace;
+struct DerivedMesh;
+struct ClothModifierData;
+struct CollisionTree;
+
+// this is needed for inlining behaviour
+#ifndef _WIN32
+#define LINUX
+#define DO_INLINE inline
+#else
+#define DO_INLINE
+#endif
+
+#define CLOTH_MAX_THREAD 2
+
+/**
+ * The definition of a cloth vertex.
+ */
+typedef struct ClothVertex
+{
+ int flags; /* General flags per vertex. */
+ float v [3]; /* The velocity of the point. */
+ float xconst [3]; /* constrained position */
+ float x [3]; /* The current position of this vertex. */
+ float xold [3]; /* The previous position of this vertex.*/
+ float tx [3]; /* temporary position */
+ float txold [3]; /* temporary old position */
+ float tv[3]; /* temporary "velocity", mostly used as tv = tx-txold */
+ float mass; /* mass / weight of the vertex */
+ float goal; /* goal, from SB */
+ float impulse[3]; /* used in collision.c */
+ unsigned int impulse_count; /* same as above */
+ float avg_spring_len; /* average length of connected springs, UNUSED ATM */
+ float struct_stiff;
+ float bend_stiff;
+ float shear_stiff;
+}
+ClothVertex;
+
+/**
+ * The definition of a spring.
+ */
+typedef struct ClothSpring
+{
+ int ij; /* Pij from the paper, one end of the spring. */
+ int kl; /* Pkl from the paper, one end of the spring. */
+ float restlen; /* The original length of the spring. */
+ int matrix_index; /* needed for implicit solver (fast lookup) */
+ int type; /* types defined in BKE_cloth.h ("springType") */
+ int flags; /* defined in BKE_cloth.h, e.g. deactivated due to tearing */
+ float dfdx[3][3];
+ float dfdv[3][3];
+ float f[3];
+ float stiffness; /* stiffness factor from the vertex groups */
+}
+ClothSpring;
+
+/* goal defines */
+#define SOFTGOALSNAP 0.999f
+
+/* This is approximately the smallest number that can be
+* represented by a float, given its precision. */
+#define ALMOST_ZERO FLT_EPSILON
+
+// some macro enhancements for vector treatment
+#define VECADDADD(v1,v2,v3) {*(v1)+= *(v2) + *(v3); *(v1+1)+= *(v2+1) + *(v3+1); *(v1+2)+= *(v2+2) + *(v3+2);}
+#define VECSUBADD(v1,v2,v3) {*(v1)-= *(v2) + *(v3); *(v1+1)-= *(v2+1) + *(v3+1); *(v1+2)-= *(v2+2) + *(v3+2);}
+#define VECADDSUB(v1,v2,v3) {*(v1)+= *(v2) - *(v3); *(v1+1)+= *(v2+1) - *(v3+1); *(v1+2)+= *(v2+2) - *(v3+2);}
+#define VECSUBADDSS(v1,v2,aS,v3,bS) {*(v1)-= *(v2)*aS + *(v3)*bS; *(v1+1)-= *(v2+1)*aS + *(v3+1)*bS; *(v1+2)-= *(v2+2)*aS + *(v3+2)*bS;}
+#define VECADDSUBSS(v1,v2,aS,v3,bS) {*(v1)+= *(v2)*aS - *(v3)*bS; *(v1+1)+= *(v2+1)*aS - *(v3+1)*bS; *(v1+2)+= *(v2+2)*aS - *(v3+2)*bS;}
+#define VECADDSS(v1,v2,aS,v3,bS) {*(v1)= *(v2)*aS + *(v3)*bS; *(v1+1)= *(v2+1)*aS + *(v3+1)*bS; *(v1+2)= *(v2+2)*aS + *(v3+2)*bS;}
+#define VECADDS(v1,v2,v3,bS) {*(v1)= *(v2) + *(v3)*bS; *(v1+1)= *(v2+1) + *(v3+1)*bS; *(v1+2)= *(v2+2) + *(v3+2)*bS;}
+#define VECSUBMUL(v1,v2,aS) {*(v1)-= *(v2) * aS; *(v1+1)-= *(v2+1) * aS; *(v1+2)-= *(v2+2) * aS;}
+#define VECSUBS(v1,v2,v3,bS) {*(v1)= *(v2) - *(v3)*bS; *(v1+1)= *(v2+1) - *(v3+1)*bS; *(v1+2)= *(v2+2) - *(v3+2)*bS;}
+#define VECSUBSB(v1,v2, v3,bS) {*(v1)= (*(v2)- *(v3))*bS; *(v1+1)= (*(v2+1) - *(v3+1))*bS; *(v1+2)= (*(v2+2) - *(v3+2))*bS;}
+#define VECMULS(v1,aS) {*(v1)*= aS; *(v1+1)*= aS; *(v1+2)*= *aS;}
+#define VECADDMUL(v1,v2,aS) {*(v1)+= *(v2) * aS; *(v1+1)+= *(v2+1) * aS; *(v1+2)+= *(v2+2) * aS;}
+
+/* SIMULATION FLAGS: goal flags,.. */
+/* These are the bits used in SimSettings.flags. */
+typedef enum
+{
+ CLOTH_SIMSETTINGS_FLAG_RESET = ( 1 << 1 ), // The CM object requires a reinitializaiton.
+ CLOTH_SIMSETTINGS_FLAG_COLLOBJ = ( 1 << 2 ),// object is only collision object, no cloth simulation is done
+ CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ), // we have goals enabled
+ CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ),// true if tearing is enabled
+ CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT = ( 1 << 5 ), // true if tearing is enabled
+ CLOTH_SIMSETTINGS_FLAG_EDITMODE = ( 1 << 6 ), // are we in editmode? -several things disabled
+ CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE = (1 << 7), /* force cache freeing */
+ CLOTH_SIMSETTINGS_FLAG_SCALING = (1 << 8), /* is advanced scaling active? */
+ CLOTH_SIMSETTINGS_FLAG_LOADED = (1 << 9), /* did we just got load? */
+} CLOTH_SIMSETTINGS_FLAGS;
+
+/* COLLISION FLAGS */
+typedef enum
+{
+ CLOTH_COLLSETTINGS_FLAG_ENABLED = ( 1 << 1 ), /* enables cloth - object collisions */
+ CLOTH_COLLSETTINGS_FLAG_SELF = ( 1 << 2 ), /* unused */
+} CLOTH_COLLISIONSETTINGS_FLAGS;
+
+/* Spring types as defined in the paper.*/
+typedef enum
+{
+ CLOTH_SPRING_TYPE_STRUCTURAL = 0,
+ CLOTH_SPRING_TYPE_SHEAR,
+ CLOTH_SPRING_TYPE_BENDING,
+} CLOTH_SPRING_TYPES;
+
+/* SPRING FLAGS */
+typedef enum
+{
+ CLOTH_SPRING_FLAG_DEACTIVATE = ( 1 << 1 ),
+ CLOTH_SPRING_FLAG_NEEDED = ( 1 << 2 ), // springs has values to be applied
+} CLOTH_SPRINGS_FLAGS;
+
+/* Bits to or into the ClothVertex.flags. */
+#define CLOTH_VERT_FLAG_PINNED 1
+#define CLOTH_VERT_FLAG_COLLISION 2
+
+typedef void ( *CM_COLLISION_RESPONSE ) ( ClothModifierData *clmd, CollisionModifierData *collmd, CollisionTree *tree1, CollisionTree *tree2 );
+
+
+/////////////////////////////////////////////////
+// collision.c
+////////////////////////////////////////////////
+
+// needed for implicit.c
+void bvh_collision_response ( ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree * tree1, CollisionTree * tree2 );
+int cloth_bvh_objcollision ( ClothModifierData * clmd, float step, float dt );
+
+int bvh_traverse ( ClothModifierData * clmd, CollisionModifierData * collmd, CollisionTree * tree1, CollisionTree * tree2, float step, CM_COLLISION_RESPONSE collision_response );
+////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////
+// implicit.c
+////////////////////////////////////////////////
+
+// needed for cloth.c
+int implicit_init ( Object *ob, ClothModifierData *clmd );
+int implicit_free ( ClothModifierData *clmd );
+int implicit_solver ( Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors );
+void implicit_set_positions ( ClothModifierData *clmd );
+
+// globally needed
+void clmdSetInterruptCallBack(int (*f)(void));
+////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////
+// cloth.c
+////////////////////////////////////////////////
+
+// needed for modifier.c
+void cloth_free_modifier_extern (ClothModifierData *clmd);
+void cloth_free_modifier (Object *ob, ClothModifierData *clmd);
+void cloth_init (ClothModifierData *clmd);
+DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+
+void cloth_update_normals (ClothVertex *verts, int nVerts, MFace *face, int totface);
+
+// needed for collision.c
+void bvh_update_from_cloth(ClothModifierData *clmd, int moving);
+
+// needed for editmesh.c
+void cloth_write_cache(Object *ob, ClothModifierData *clmd, float framenr);
+int cloth_read_cache(Object *ob, ClothModifierData *clmd, float framenr);
+
+// needed for button_object.c
+void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr);
+
+////////////////////////////////////////////////
+
+
+/* Typedefs for function pointers we need for solvers and collision detection. */
+typedef void ( *CM_COLLISION_SELF ) ( ClothModifierData *clmd, int step );
+typedef void ( *CM_COLLISION_OBJ ) ( ClothModifierData *clmd, int step, CM_COLLISION_RESPONSE collision_response );
+
+
+/* This enum provides the IDs for our solvers. */
+// only one available in the moment
+typedef enum {
+ CM_IMPLICIT = 0,
+} CM_SOLVER_ID;
+
+
+/* This structure defines how to call the solver.
+*/
+typedef struct
+{
+ char *name;
+ CM_SOLVER_ID id;
+ int ( *init ) ( Object *ob, ClothModifierData *clmd );
+ int ( *solver ) ( Object *ob, float framenr, ClothModifierData *clmd, ListBase *effectors );
+ int ( *free ) ( ClothModifierData *clmd );
+}
+CM_SOLVER_DEF;
+
+/* used for caching in implicit.c */
+typedef struct Frame
+{
+ ClothVertex *verts;
+ ClothSpring *springs;
+ unsigned int numverts, numsprings;
+ float time; /* we need float since we want to support sub-frames */
+}
+Frame;
+
+#endif
+
diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h
new file mode 100644
index 00000000000..aa46bc625e1
--- /dev/null
+++ b/source/blender/blenkernel/BKE_collision.h
@@ -0,0 +1,176 @@
+/**
+ * BKE_cloth.h
+ *
+ * $Id: BKE_cloth.h,v 1.1 2007/08/01 02:07:27 daniel Exp $
+ *
+ * ***** 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) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+#ifndef BKE_COLLISIONS_H
+#define BKE_COLLISIONS_H
+
+#include <math.h>
+#include "float.h"
+#include <stdlib.h>
+#include <string.h>
+
+/* types */
+#include "BLI_linklist.h"
+#include "BKE_collision.h"
+#include "BKE_customdata.h"
+#include "BKE_DerivedMesh.h"
+#include "DNA_cloth_types.h"
+#include "DNA_customdata_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+struct Object;
+struct Cloth;
+struct MFace;
+struct DerivedMesh;
+struct ClothModifierData;
+struct CollisionTree;
+
+
+////////////////////////////////////////
+// used in kdop.c and collision.c
+////////////////////////////////////////
+typedef struct CollisionTree
+{
+ struct CollisionTree *nodes[4]; // 4 children --> quad-tree
+ struct CollisionTree *parent;
+ struct CollisionTree *nextLeaf;
+ struct CollisionTree *prevLeaf;
+ float bv[26]; // Bounding volume of all nodes / we have 7 axes on a 14-DOP
+ unsigned int tri_index; // this saves the index of the face
+ // int point_index[4]; // supports up to 4 points in a leaf
+ int count_nodes; // how many nodes are used
+ int traversed; // how many nodes already traversed until this level?
+ int isleaf;
+}
+CollisionTree;
+
+typedef struct BVH
+{
+ unsigned int numfaces;
+ unsigned int numverts;
+ MVert *current_x; // e.g. txold in clothvertex
+ MVert *current_xold; // e.g. tx in clothvertex
+ MFace *mfaces; // just a pointer to the original datastructure
+ struct LinkNode *tree;
+ CollisionTree *root; // TODO: saving the root --> is this really needed? YES!
+ CollisionTree *leaf_tree; /* Tail of the leaf linked list. */
+ CollisionTree *leaf_root; /* Head of the leaf linked list. */
+ float epsilon; /* epslion is used for inflation of the k-dop */
+ int flags; /* bvhFlags */
+}
+BVH;
+////////////////////////////////////////
+
+
+////////////////////////////////////////
+// used for collisions in kdop.c and also collision.c
+////////////////////////////////////////
+/* used for collisions in collision.c */
+typedef struct CollPair
+{
+ unsigned int face1; // cloth face
+ unsigned int face2; // object face
+ double distance; // magnitude of vector
+ float normal[3];
+ float vector[3]; // unnormalized collision vector: p2-p1
+ float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
+ int lastsign; // indicates if the distance sign has changed, unused itm
+ float time; // collision time, from 0 up to 1
+ unsigned int ap1, ap2, ap3, bp1, bp2, bp3, bp4;
+ unsigned int pointsb[4];
+}
+CollPair;
+
+/* used for collisions in collision.c */
+typedef struct EdgeCollPair
+{
+ unsigned int p11, p12, p21, p22;
+ float normal[3];
+ float vector[3];
+ float time;
+ int lastsign;
+ float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
+}
+EdgeCollPair;
+
+/* used for collisions in collision.c */
+typedef struct FaceCollPair
+{
+ unsigned int p11, p12, p13, p21;
+ float normal[3];
+ float vector[3];
+ float time;
+ int lastsign;
+ float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
+}
+FaceCollPair;
+////////////////////////////////////////
+
+
+
+/////////////////////////////////////////////////
+// forward declarations
+/////////////////////////////////////////////////
+
+// NOTICE: mvert-routines for building + update the BVH are the most native ones
+
+// builds bounding volume hierarchy
+void bvh_build (BVH *bvh);
+BVH *bvh_build_from_mvert (MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon);
+
+// frees the same
+void bvh_free ( BVH * bvh );
+
+// checks two bounding volume hierarchies for potential collisions and returns some list with those
+
+
+// update bounding volumes, needs updated positions in bvh->x
+void bvh_update_from_mvert(BVH * bvh, MVert *x, unsigned int numverts, MVert *xnew, int moving);
+void bvh_update(BVH * bvh, int moving);
+
+LinkNode *BLI_linklist_append_fast ( LinkNode **listp, void *ptr );
+
+// move Collision modifier object inter-frame with step = [0,1]
+// defined in collisions.c
+void collision_move_object(CollisionModifierData *collmd, float step, float prevstep);
+
+// interface for collision functions
+void collisions_compute_barycentric (float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3);
+void interpolateOnTriangle(float to[3], float v1[3], float v2[3], float v3[3], double w1, double w2, double w3);
+
+/////////////////////////////////////////////////
+
+#endif
+
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h
index 39a3cf13087..a5578377263 100644
--- a/source/blender/blenkernel/BKE_constraint.h
+++ b/source/blender/blenkernel/BKE_constraint.h
@@ -33,22 +33,12 @@
#ifndef BKE_CONSTRAINT_H
#define BKE_CONSTRAINT_H
-
struct bConstraint;
+struct bConstraintTarget;
struct ListBase;
struct Object;
struct bConstraintChannel;
struct bPoseChannel;
-struct bAction;
-struct bArmature;
-
-/* ---------------------------------------------------------------------------- */
-
-/* Constraint target/owner types */
-#define TARGET_OBJECT 1 /* string is "" */
-#define TARGET_BONE 2 /* string is bone-name */
-#define TARGET_VERT 3 /* string is vertex-group name */
-#define TARGET_CV 4 /* string is vertex-group name - is not available until curves get vgroups */
/* ---------------------------------------------------------------------------- */
@@ -65,26 +55,80 @@ typedef struct 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 of 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 *new_constraint_data(short type);
+
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);
+/* Constraints + Proxies function prototypes */
+void extract_proxylocal_constraints(struct ListBase *dst, struct ListBase *src);
+short proxylocked_constraints_owner(struct Object *ob, struct bPoseChannel *pchan);
+
/* Constraint Channel function prototypes */
-struct bConstraintChannel *get_constraint_channel(ListBase *list, const char *name);
-struct bConstraintChannel *verify_constraint_channel(ListBase *list, const char *name);
-void do_constraint_channels(struct ListBase *conbase, struct ListBase *chanbase, float ctime, int onlydrivers);
-void copy_constraint_channels(ListBase *dst, ListBase *src);
+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(ListBase *chanbase);
+void free_constraint_channels(struct ListBase *chanbase);
-/* Target function prototypes */
-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 Evaluation function prototypes */
struct bConstraintOb *constraints_make_evalob(struct Object *ob, void *subdata, short datatype);
@@ -92,8 +136,8 @@ void constraints_clear_evalob(struct bConstraintOb *cob);
void constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan, float mat[][4], short from, short to);
-short get_constraint_target_matrix(struct bConstraint *con, short ownertype, void *ownerdata, float mat[][4], float time);
-void solve_constraints (struct ListBase *conlist, struct bConstraintOb *cob, float ctime);
+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_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 153446caec5..8aaa9e42289 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -175,24 +175,22 @@ 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)
-
+/* #define G_RECORDKEYS (1 << 25) also removed */
/*#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_AUTOMATKEYS (1 << 30) also removed */
+#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
@@ -246,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_group.h b/source/blender/blenkernel/BKE_group.h
index 9038422795d..f7158daa937 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -44,9 +44,10 @@ void free_group(struct Group *group);
void unlink_group(struct Group *group);
struct Group *add_group(char *name);
void add_to_group(struct Group *group, struct Object *ob);
-void rem_from_group(struct Group *group, struct Object *ob);
-struct Group *find_group(struct Object *ob);
+int rem_from_group(struct Group *group, struct Object *ob);
+struct Group *find_group(struct Object *ob, struct Group *group);
int object_in_group(struct Object *ob, struct Group *group);
+int group_is_animated(struct Object *parent, struct Group *group);
void group_tag_recalc(struct Group *group);
void group_handle_recalc_and_update(struct Object *parent, struct Group *group);
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 204e956dbc8..a584722031b 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -46,7 +46,8 @@ struct anim;
/* call from library */
void free_image(struct Image *me);
-void BKE_stamp(struct ImBuf *ibuf);
+void BKE_stamp_info(struct ImBuf *ibuf);
+void BKE_stamp_buf(unsigned char *rect, float *rectf, int width, int height, int channels);
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);
@@ -113,7 +114,7 @@ struct ImBuf *BKE_image_get_ibuf(struct Image *ima, struct ImageUser *iuser);
struct Image *BKE_add_image_file(const char *name);
/* adds image, adds ibuf, generates color or pattern */
-struct Image *BKE_add_image_size(int width, int height, char *name, short uvtestgrid, float color[4]);
+struct Image *BKE_add_image_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4]);
/* for reload, refresh, pack */
void BKE_image_signal(struct Image *ima, struct ImageUser *iuser, int signal);
@@ -147,6 +148,9 @@ void BKE_image_all_free_anim_ibufs(int except_frame);
void BKE_image_memorypack(struct Image *ima);
+/* prints memory statistics for images */
+void BKE_image_print_memlist(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_ipo.h b/source/blender/blenkernel/BKE_ipo.h
index 2a6065eb4f1..01fe0903775 100644
--- a/source/blender/blenkernel/BKE_ipo.h
+++ b/source/blender/blenkernel/BKE_ipo.h
@@ -95,7 +95,7 @@ void do_ipo_nocalc(struct Ipo *ipo);
void do_ipo(struct Ipo *ipo);
void do_mat_ipo(struct Material *ma);
void do_ob_ipo(struct Object *ob);
-void do_seq_ipo(struct Sequence *seq);
+void do_seq_ipo(struct Sequence *seq, int cfra);
void do_ob_ipodrivers(struct Object *ob, struct Ipo *ipo, float ctime);
int has_ipo_code(struct Ipo *ipo, int code);
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 3dc4b49b52b..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],
- float (*defMats)[3][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_material.h b/source/blender/blenkernel/BKE_material.h
index 2add4b95080..0c93e4e32a2 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -57,6 +57,9 @@ struct ID *material_from(struct Object *ob, int act);
void assign_material(struct Object *ob, struct Material *ma, int act);
void new_material_to_objectdata(struct Object *ob);
+int find_material_index(struct Object *ob, struct Material *ma);
+
+
void init_render_material(struct Material *, int, float *);
void init_render_materials(int, float *);
void end_render_material(struct Material *);
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index e9fd059f833..af531a0d50c 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -62,9 +62,9 @@ void make_local_tface(struct Mesh *me);
void make_local_mesh(struct Mesh *me);
void boundbox_mesh(struct Mesh *me, float *loc, float *size);
void tex_space_mesh(struct Mesh *me);
-float *mesh_create_orco_render(struct Object *ob);
-float *mesh_create_orco(struct Object *ob);
-void test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
+float *get_mesh_orco_verts(struct Object *ob);
+void transform_mesh_orco_verts(struct Mesh *me, float (*orco)[3], int totvert, int invert);
+int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
struct Mesh *get_mesh(struct Object *ob);
void set_mesh(struct Object *ob, struct Mesh *me);
void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
@@ -75,7 +75,7 @@ int update_realtime_texture(struct MTFace *tface, double time);
void mesh_delete_material_index(struct Mesh *me, int index);
void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
-struct BoundBox *mesh_get_bb(struct Mesh *me);
+struct BoundBox *mesh_get_bb(struct Object *ob);
void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r);
/* if old, it converts mface->edcode to edge drawflags */
@@ -90,6 +90,7 @@ 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) */
@@ -110,6 +111,11 @@ 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);
+/* Partial Mesh Visibility */
+struct PartialVisibility *mesh_pmv_copy(struct PartialVisibility *);
+void mesh_pmv_free(struct PartialVisibility *);
+void mesh_pmv_revert(struct Object *ob, struct Mesh *me);
+void mesh_pmv_off(struct Object *ob, struct Mesh *me);
/* 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 */
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 297443b883d..fba30264fea 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 {
@@ -79,10 +85,14 @@ typedef enum {
* be placed after any non-deformative modifier.
*/
eModifierTypeFlag_RequiresOriginalData = (1<<5),
+
+ /* For modifiers that support pointcache, so we can check to see if it has files we need to deal with
+ */
+ eModifierTypeFlag_UsesPointCache = (1<<6),
} 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 */
@@ -277,10 +287,16 @@ int modifiers_getCageIndex(struct Object *ob,
int *lastPossibleCageIndex_r);
int modifiers_isSoftbodyEnabled(struct Object *ob);
+int modifiers_isClothEnabled(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);
+void modifier_freeTemporaryData(struct ModifierData *md);
+
+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
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
new file mode 100644
index 00000000000..61eb796e53d
--- /dev/null
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -0,0 +1,68 @@
+/*
+ * $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 *****
+ */
+
+struct CustomData;
+struct EditMesh;
+struct Multires;
+struct MultiresLevel;
+struct Mesh;
+struct Object;
+
+/* Level access */
+struct MultiresLevel *current_level(struct Multires *mr);
+struct MultiresLevel *multires_level_n(struct Multires *mr, int n);
+
+/* Level control */
+void multires_add_level(struct Object *ob, struct Mesh *me, const char subdiv_type);
+void multires_set_level(struct Object *ob, struct Mesh *me, const int render);
+void multires_free_level(struct MultiresLevel *lvl);
+
+void multires_edge_level_update(struct Object *ob, struct Mesh *me);
+
+void multires_free(struct Multires *mr);
+struct Multires *multires_copy(struct Multires *orig);
+void multires_create(struct Object *ob, struct Mesh *me);
+
+/* CustomData */
+void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int type, int n);
+void multires_add_layer(struct Mesh *me, struct CustomData *cd, const int type, const int n);
+void multires_del_lower_customdata(struct Multires *mr, struct MultiresLevel *cr_lvl);
+void multires_to_mcol(struct MultiresColFace *f, MCol mcol[4]);
+/* After adding or removing vcolor layers, run this */
+void multires_load_cols(struct Mesh *me);
+
+/* Private (used in multires-firstlevel.c) */
+void multires_level_to_mesh(struct Object *ob, struct Mesh *me, const int render);
+void multires_update_levels(struct Mesh *me, const int render);
+void multires_update_first_level(struct Mesh *me, struct EditMesh *em);
+void multires_update_customdata(struct MultiresLevel *lvl1, struct CustomData *src,
+ struct CustomData *dst, const int type);
+void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em,
+ struct MultiresLevel *lvl, struct CustomData *src,
+ struct CustomData *dst, const int type);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 2b244656f75..f324c5d693c 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -143,6 +143,7 @@ void nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
void nodeAddToPreview(struct bNode *, float *, int, int);
+void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
struct bNode *nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup);
void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
@@ -150,6 +151,8 @@ struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
+int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
+
struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
int nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
@@ -233,21 +236,22 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, str
/* ************** COMPOSITE NODES *************** */
/* output socket defines */
-#define RRES_OUT_IMAGE 0
-#define RRES_OUT_ALPHA 1
-#define RRES_OUT_Z 2
-#define RRES_OUT_NORMAL 3
-#define RRES_OUT_UV 4
-#define RRES_OUT_VEC 5
-#define RRES_OUT_RGBA 6
-#define RRES_OUT_DIFF 7
-#define RRES_OUT_SPEC 8
-#define RRES_OUT_SHADOW 9
-#define RRES_OUT_AO 10
-#define RRES_OUT_REFLECT 11
-#define RRES_OUT_REFRACT 12
-#define RRES_OUT_RADIO 13
-#define RRES_OUT_INDEXOB 14
+#define RRES_OUT_IMAGE 0
+#define RRES_OUT_ALPHA 1
+#define RRES_OUT_Z 2
+#define RRES_OUT_NORMAL 3
+#define RRES_OUT_UV 4
+#define RRES_OUT_VEC 5
+#define RRES_OUT_RGBA 6
+#define RRES_OUT_DIFF 7
+#define RRES_OUT_SPEC 8
+#define RRES_OUT_SHADOW 9
+#define RRES_OUT_AO 10
+#define RRES_OUT_REFLECT 11
+#define RRES_OUT_REFRACT 12
+#define RRES_OUT_RADIO 13
+#define RRES_OUT_INDEXOB 14
+#define RRES_OUT_MIST 15
/* note: types are needed to restore callbacks, don't change values */
#define CMP_NODE_VIEWER 201
@@ -302,6 +306,13 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, str
#define CMP_NODE_GAMMA 250
#define CMP_NODE_INVERT 251
#define CMP_NODE_NORMALIZE 252
+#define CMP_NODE_CROP 253
+#define CMP_NODE_DBLUR 254
+#define CMP_NODE_BILATERALBLUR 255
+
+#define CMP_NODE_GLARE 301
+#define CMP_NODE_TONEMAP 302
+#define CMP_NODE_LENSDIST 303
/* channel toggles */
#define CMP_CHAN_RGB 1
@@ -320,8 +331,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 b834116f11d..0a4c9a04815 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);
@@ -98,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);
@@ -108,9 +110,10 @@ void solve_tracking (struct Object *ob, float targetmat[][4]);
void object_handle_update(struct Object *ob);
+float give_timeoffset(struct Object *ob);
+
#ifdef __cplusplus
}
#endif
#endif
-
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
new file mode 100644
index 00000000000..3358cfbfd2b
--- /dev/null
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -0,0 +1,314 @@
+/* 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;
+struct RNG;
+
+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, rough; /* 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 col[3];
+ float rot[4];
+ 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;
+
+typedef struct ParticleThreadContext {
+ /* shared */
+ struct Object *ob;
+ struct DerivedMesh *dm;
+ struct ParticleSystemModifierData *psmd;
+ struct ParticleSystem *psys;
+ struct Material *ma;
+
+ /* distribution */
+ struct KDTree *tree;
+
+ struct ParticleSeam *seams;
+ int totseam;
+
+ float *jit, *jitoff, *weight;
+ float maxweight;
+ int *index, *skip, jitlevel;
+
+ int from, cfrom, distr;
+
+ struct ParticleData *tpars;
+
+ /* path caching */
+ int editupdate, between, steps;
+ int totchild, totparent;
+
+ float cfra;
+
+ float *vg_length, *vg_clump, *vg_kink;
+ float *vg_rough1, *vg_rough2, *vg_roughe;
+} ParticleThreadContext;
+
+typedef struct ParticleThread {
+ ParticleThreadContext *ctx;
+ struct RNG *rng, *rng_path;
+ int num, tot;
+} ParticleThread;
+
+/* ----------- 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);
+int psys_check_enabled(struct Object *ob, 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 psys_free_children(struct ParticleSystem *psys);
+
+void psys_render_set(struct Object *ob, struct ParticleSystem *psys, float viewmat[][4], float winmat[][4], int winx, int winy, int timeoffset);
+void psys_render_restore(struct Object *ob, struct ParticleSystem *psys);
+int psys_render_simplify_distribution(struct ParticleThreadContext *ctx, int tot);
+int psys_render_simplify_params(struct ParticleSystem *psys, struct ChildParticle *cpa, float *params);
+
+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, float *orco, float *ornor);
+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, struct ChildParticle *cpa, float cfra);
+float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle *cpa, 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);
+void psys_get_dupli_texture(struct Object *ob, struct ParticleSettings *part, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct ChildParticle *cpa, float *uv, float *orco);
+void psys_get_dupli_path_transform(struct Object *ob, struct ParticleSettings *part, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct ChildParticle *cpa, struct ParticleCacheKey *cache, float mat[][4], float *scale);
+
+ParticleThread *psys_threads_create(struct Object *ob, struct ParticleSystem *psys, int totthread);
+int psys_threads_init_distribution(ParticleThread *threads, struct DerivedMesh *dm, int from);
+int psys_threads_init_path(ParticleThread *threads, float cfra, int editupdate);
+void psys_threads_free(ParticleThread *threads);
+
+void psys_thread_distribute_particle(ParticleThread *thread, struct ParticleData *pa, struct ChildParticle *cpa, int p);
+void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i);
+
+/* 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]);
+void psys_mat_hair_to_orco(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 (*orcodata)[3], float *uv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
+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, float *orco, float *ornor);
+
+/* 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);
+
+void do_effectors(int pa_no, struct ParticleData *pa, struct ParticleKey *state, struct Object *ob, struct ParticleSystem *psys, float *force_field, float *vel,float framestep, float cfra);
+
+void psys_calc_dmfaces(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys);
+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..52cc0ddcaa7
--- /dev/null
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -0,0 +1,55 @@
+/*
+*
+* ***** 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
+
+/* Add the blendfile name after blendcache_ */
+#define PTCACHE_EXT ".bphys"
+#define PTCACHE_PATH "//blendcache_"
+
+/* Global funcs */
+/* void BKE_ptcache_clean(void); - not implimented yet! */
+
+
+/* Object spesific funcs */
+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);
+int BKE_ptcache_id_exist(struct ID *id, int cfra, int stack_index);
+
+#endif
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 69ff6876acd..30953835406 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -34,11 +34,13 @@
#ifndef BKE_SCENE_H
#define BKE_SCENE_H
+struct bglMats;
struct Scene;
struct Object;
struct Base;
struct AviCodecData;
struct QuicktimeCodecData;
+struct SculptData;
/* sequence related defines */
#define WHILE_SEQ(base) { \
diff --git a/source/blender/blenkernel/BKE_sculpt.h b/source/blender/blenkernel/BKE_sculpt.h
new file mode 100644
index 00000000000..e03e38bab75
--- /dev/null
+++ b/source/blender/blenkernel/BKE_sculpt.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 by Nicholas Bishop
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BKE_SCULPT_H
+#define BKE_SCULPT_H
+
+struct NumInput;
+struct RadialControl;
+struct Scene;
+struct SculptData;
+struct SculptSession;
+
+typedef struct SculptSession {
+ struct ProjVert *projverts;
+
+ struct bglMats *mats;
+
+ /* An array of lists; array is sized as
+ large as the number of verts in the mesh,
+ the list for each vert contains the index
+ for all the faces that use that vertex */
+ 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;
+
+ struct RadialControl *radialcontrol;
+
+ /* For rotating around a pivot point */
+ vec3f pivot;
+
+ struct SculptStroke *stroke;
+} SculptSession;
+
+void sculptdata_init(struct Scene *sce);
+void sculptdata_free(struct Scene *sce);
+void sculptsession_free(struct Scene *sce);
+void sculpt_vertexusers_free(struct SculptSession *ss);
+void sculpt_reset_curve(struct SculptData *sd);
+
+#endif
diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h
index 15200bf46f8..91bc4cc070d 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -37,12 +37,26 @@
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 */
+ float impdv[3],impdx[3];
+ int nofsprings; int *springs;
+ float choke,choke2,frozen;
+ 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 a30617a2f15..fc22f6787b1 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -59,6 +59,10 @@
#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 )
#define STREQ2(str, a, b) ( STREQ(str, a) || STREQ(str, b) )
@@ -97,6 +101,8 @@
#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
+#define AVG2(x, y) ( 0.5 * ((x) + (y)) )
+
#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);}
@@ -106,6 +112,7 @@
#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
#define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
+#define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b8c23a6517d..30f21ef83cc 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -32,8 +32,9 @@ FILE(GLOB SRC intern/*.c)
SET(INC
. ../../../intern/guardedalloc ../include ../blenlib ../makesdna
../python ../render/extern/include ../../../intern/decimation/extern
- ../imbuf ../avi ../../../intern/elbeem/extern
+ ../imbuf ../avi ../../../intern/elbeem/extern ../../../intern/opennl/extern
../../../intern/iksolver/extern ../blenloader ../quicktime
+ ../../../intern/bmfont ../../../extern/bullet2/src
../nodes
${SDL_INC}
${ZLIB_INC}
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 5316c50694a..f8f2f0b9f57 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -7,6 +7,9 @@ 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 += ' #/extern/bullet2/src'
+incs += ' #/intern/bmfont'
+incs += ' #/intern/opennl/extern'
incs += ' ' + env['BF_OPENGL_INC']
incs += ' ' + env['BF_ZLIB_INC']
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 299bbc10241..94a968970fa 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,23 @@
#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_multires.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"
@@ -83,8 +88,6 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
-#include "multires.h"
-
// headers for fluidsim bobj meshes
#include <stdlib.h>
#include "LBM_fluidsim.h"
@@ -1809,7 +1812,7 @@ CustomDataMask get_viewedit_datamask()
View3D *view = sa->spacedata.first;
if(view->drawtype == OB_SHADED) {
/* this includes normals for mesh_create_shadedColors */
- mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL;
+ mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL | CD_MASK_ORCO;
}
if((view->drawtype == OB_TEXTURE) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) {
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
@@ -1825,20 +1828,65 @@ CustomDataMask get_viewedit_datamask()
return mask;
}
+static DerivedMesh *create_orco_dm(Object *ob, Mesh *me)
+{
+ DerivedMesh *dm;
+ float (*orco)[3];
+
+ dm= CDDM_from_mesh(me, ob);
+ orco= (float(*)[3])get_mesh_orco_verts(ob);
+ CDDM_apply_vert_coords(dm, orco);
+ CDDM_calc_normals(dm);
+ MEM_freeN(orco);
+
+ return dm;
+}
+
+static void add_orco_dm(Object *ob, DerivedMesh *dm, DerivedMesh *orcodm)
+{
+ float (*orco)[3], (*layerorco)[3];
+ int totvert;
+
+ totvert= dm->getNumVerts(dm);
+
+ if(orcodm) {
+ orco= MEM_callocN(sizeof(float)*3*totvert, "dm orco");
+
+ if(orcodm->getNumVerts(orcodm) == totvert)
+ orcodm->getVertCos(orcodm, orco);
+ else
+ dm->getVertCos(dm, orco);
+ }
+ else
+ orco= (float(*)[3])get_mesh_orco_verts(ob);
+
+ transform_mesh_orco_verts(ob->data, orco, totvert, 0);
+
+ if((layerorco = DM_get_vert_data_layer(dm, CD_ORCO))) {
+ memcpy(layerorco, orco, sizeof(float)*totvert);
+ MEM_freeN(orco);
+ }
+ else
+ DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, orco);
+}
+
static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
DerivedMesh **deform_r, DerivedMesh **final_r,
int useRenderParams, int useDeform,
int needMapping, CustomDataMask dataMask)
{
Mesh *me = ob->data;
- ModifierData *md = modifiers_getVirtualModifierList(ob);
+ ModifierData *firstmd, *md;
LinkNode *datamasks, *curr;
+ CustomDataMask mask;
float (*deformedVerts)[3] = NULL;
- DerivedMesh *dm;
+ DerivedMesh *dm, *orcodm, *finaldm;
int numVerts = me->totvert;
int fluidsimMeshUsed = 0;
int required_mode;
+ md = firstmd = modifiers_getVirtualModifierList(ob);
+
modifiers_clearErrors(ob);
/* we always want to keep original indices */
@@ -1915,7 +1963,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
@@ -1929,6 +1980,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
* OnlyDeform ones.
*/
dm = NULL;
+ orcodm = NULL;
#ifdef WITH_VERSE
/* hack to make sure modifiers don't try to use mesh data from a verse
@@ -1950,12 +2002,20 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
if(mti->isDisabled && mti->isDisabled(md)) continue;
if(needMapping && !modifier_supportsMapping(md)) continue;
+ /* add an orco layer if needed by this modifier */
+ if(dm && mti->requiredDataMask) {
+ mask = mti->requiredDataMask(md);
+ if(mask & CD_MASK_ORCO)
+ add_orco_dm(ob, dm, orcodm);
+ }
+
/* How to apply modifier depends on (a) what we already have as
* a result of previous modifiers (could be a DerivedMesh or just
* deformed vertices) and (b) what type the modifier is.
*/
if(mti->type == eModifierTypeType_OnlyDeform) {
+
/* No existing verts to deform, need to build them. */
if(!deformedVerts) {
if(dm) {
@@ -1995,11 +2055,32 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
}
}
+ /* create an orco derivedmesh in parallel */
+ mask= (CustomDataMask)curr->link;
+ if(mask & CD_MASK_ORCO) {
+ if(!orcodm)
+ orcodm= create_orco_dm(ob, me);
+
+ mask &= ~CD_MASK_ORCO;
+ DM_set_only_copy(orcodm, mask);
+ ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, !inputVertexCos);
+
+ if(ndm) {
+ /* if the modifier returned a new dm, release the old one */
+ if(orcodm && orcodm != ndm) orcodm->release(orcodm);
+ orcodm = ndm;
+ }
+ }
+
/* set the DerivedMesh to only copy needed data */
- DM_set_only_copy(dm, (CustomDataMask)curr->link);
+ DM_set_only_copy(dm, mask);
+
+ /* add an origspace layer if needed */
+ if(((CustomDataMask)curr->link) & CD_MASK_ORIGSPACE)
+ if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
+ DM_add_face_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
- ndm = mti->applyModifier(md, ob, dm, useRenderParams,
- !inputVertexCos);
+ ndm = mti->applyModifier(md, ob, dm, useRenderParams, !inputVertexCos);
if(ndm) {
/* if the modifier returned a new dm, release the old one */
@@ -2017,39 +2098,55 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
}
}
+ for(md=firstmd; md; md=md->next)
+ modifier_freeTemporaryData(md);
+
/* Yay, we are done. If we have a DerivedMesh and deformed vertices
* need to apply these back onto the DerivedMesh. If we have no
* DerivedMesh then we need to build one.
*/
if(dm && deformedVerts) {
- *final_r = CDDM_copy(dm);
+ finaldm = CDDM_copy(dm);
dm->release(dm);
- CDDM_apply_vert_coords(*final_r, deformedVerts);
- CDDM_calc_normals(*final_r);
+ CDDM_apply_vert_coords(finaldm, deformedVerts);
+ CDDM_calc_normals(finaldm);
} else if(dm) {
- *final_r = dm;
+ finaldm = dm;
} else {
#ifdef WITH_VERSE
if(me->vnode)
- *final_r = derivedmesh_from_versemesh(me->vnode, deformedVerts);
+ finaldm = derivedmesh_from_versemesh(me->vnode, deformedVerts);
else {
- *final_r = CDDM_from_mesh(me, ob);
+ finaldm = CDDM_from_mesh(me, ob);
if(deformedVerts) {
- CDDM_apply_vert_coords(*final_r, deformedVerts);
- CDDM_calc_normals(*final_r);
+ CDDM_apply_vert_coords(finaldm, deformedVerts);
+ CDDM_calc_normals(finaldm);
}
}
#else
- *final_r = CDDM_from_mesh(me, ob);
+ finaldm = CDDM_from_mesh(me, ob);
if(deformedVerts) {
- CDDM_apply_vert_coords(*final_r, deformedVerts);
- CDDM_calc_normals(*final_r);
+ CDDM_apply_vert_coords(finaldm, deformedVerts);
+ CDDM_calc_normals(finaldm);
}
#endif
}
+ /* add an orco layer if needed */
+ if(dataMask & CD_MASK_ORCO) {
+ add_orco_dm(ob, finaldm, orcodm);
+
+ if(deform_r && *deform_r)
+ add_orco_dm(ob, *deform_r, NULL);
+ }
+
+ *final_r = finaldm;
+
+ if(orcodm)
+ orcodm->release(orcodm);
+
if(deformedVerts && deformedVerts != inputVertexCos)
MEM_freeN(deformedVerts);
@@ -2177,6 +2274,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))
+ DM_add_face_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
+
ndm = mti->applyModifierEM(md, ob, em, dm);
if (ndm) {
@@ -2268,10 +2369,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) {
@@ -2282,29 +2383,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;
@@ -2315,6 +2428,10 @@ static void clear_mesh_caches(Object *ob)
Mesh *me= ob->data;
/* also serves as signal to remake texspace */
+ if (ob->bb) {
+ MEM_freeN(ob->bb);
+ ob->bb = NULL;
+ }
if (me->bb) {
MEM_freeN(me->bb);
me->bb = NULL;
@@ -2343,7 +2460,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 = (FACESEL_PAINT_TEST);
+ int editing = (FACESEL_PAINT_TEST)|(G.f & G_PARTICLEEDIT);
int needMapping = editing && (ob==obact);
if( (G.f & G_WEIGHTPAINT) && ob==obact ) {
@@ -2362,7 +2479,7 @@ static void mesh_build_data(Object *ob, CustomDataMask dataMask)
CustomData_free_layer_active(&me->fdata, CD_MCOL, me->totface);
} else {
mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
- &ob->derivedFinal, 0, 1,
+ &ob->derivedFinal, G.rendering, 1,
needMapping, dataMask);
}
@@ -2370,7 +2487,9 @@ static void mesh_build_data(Object *ob, CustomDataMask dataMask)
ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
- boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
+ if(!ob->bb)
+ ob->bb= MEM_callocN(sizeof(BoundBox), "bb");
+ boundbox_set_from_min_max(ob->bb, min, max);
ob->derivedFinal->needsFree = 0;
ob->derivedDeform->needsFree = 0;
@@ -2406,7 +2525,9 @@ static void editmesh_build_data(CustomDataMask dataMask)
em->derivedFinal->getMinMax(em->derivedFinal, min, max);
- boundbox_set_from_min_max(mesh_get_bb(G.obedit->data), min, max);
+ if(!G.obedit->bb)
+ G.obedit->bb= MEM_callocN(sizeof(BoundBox), "bb");
+ boundbox_set_from_min_max(G.obedit->bb, min, max);
em->derivedFinal->needsFree = 0;
em->derivedCage->needsFree = 0;
@@ -2480,7 +2601,8 @@ float *multires_render_pin(Object *ob, Mesh *me, int *orig_lvl)
}
/* Propagate the changes to render level - fails if mesh topology changed */
-void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_copy, const int orig_lvl)
+void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_copy,
+ const int orig_lvl, CustomDataMask dataMask)
{
if(me->mr) {
if((*dm)->getNumVerts(*dm) == me->totvert &&
@@ -2501,6 +2623,9 @@ void multires_render_final(Object *ob, Mesh *me, DerivedMesh **dm, float *vert_c
(*dm)= CDDM_copy(old);
old->release(old);
+ if(dataMask & CD_MASK_ORCO)
+ add_orco_dm(ob, *dm, NULL);
+
/* Restore the original verts */
me->mr->newlvl= BLI_countlist(&me->mr->levels);
multires_set_level(ob, me, 1);
@@ -2528,7 +2653,7 @@ DerivedMesh *mesh_create_derived_render(Object *ob, CustomDataMask dataMask)
vert_copy= multires_render_pin(ob, me, &orig_lvl);
mesh_calc_modifiers(ob, NULL, NULL, &final, 1, 1, 0, dataMask);
- multires_render_final(ob, me, &final, vert_copy, orig_lvl);
+ multires_render_final(ob, me, &final, vert_copy, orig_lvl, dataMask);
return final;
}
@@ -2563,7 +2688,7 @@ DerivedMesh *mesh_create_derived_no_deform_render(Object *ob,
vert_copy= multires_render_pin(ob, me, &orig_lvl);
mesh_calc_modifiers(ob, vertCos, NULL, &final, 1, 0, 0, dataMask);
- multires_render_final(ob, me, &final, vert_copy, orig_lvl);
+ multires_render_final(ob, me, &final, vert_copy, orig_lvl, dataMask);
return final;
}
diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile
index 72fcc466de8..488d8801e41 100644
--- a/source/blender/blenkernel/intern/Makefile
+++ b/source/blender/blenkernel/intern/Makefile
@@ -60,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)
@@ -67,6 +69,7 @@ CPPFLAGS += $(NAN_SDLCFLAGS)
CPPFLAGS += -I$(NAN_IKSOLVER)/include
CPPFLAGS += -I$(NAN_DECIMATION)/include
CPPFLAGS += -I$(NAN_ELBEEM)/include
+CPPFLAGS += -I$(NAN_OPENNL)/include
# path to zlib
CPPFLAGS += -I$(NAN_ZLIB)/include
@@ -77,6 +80,9 @@ CPPFLAGS += -I../../nodes
# path to our own external headerfiles
CPPFLAGS += -I..
+# path to bullet2, for cloth
+CPPFLAGS += -I../../../../extern/bullet2/src
+
ifeq ($(WITH_FREETYPE2), true)
CPPFLAGS += -DWITH_FREETYPE2
CPPFLAGS += -I$(NAN_FREETYPE)/include
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 22e621a27e2..b8c05f3bb7b 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -177,24 +177,51 @@ void free_action (bAction *act)
if (act->chanbase.first)
BLI_freelistN(&act->chanbase);
+
+ /* Free groups */
+ if (act->groups.first)
+ BLI_freelistN(&act->groups);
+
+ /* Free pose-references (aka local markers) */
+ if (act->markers.first)
+ BLI_freelistN(&act->markers);
}
bAction *copy_action (bAction *src)
{
bAction *dst = NULL;
bActionChannel *dchan, *schan;
+ bActionGroup *dgrp, *sgrp;
if (!src) return NULL;
dst= copy_libblock(src);
+
duplicatelist(&(dst->chanbase), &(src->chanbase));
+ duplicatelist(&(dst->groups), &(src->groups));
+ duplicatelist(&(dst->markers), &(src->markers));
- for (dchan=dst->chanbase.first, schan=src->chanbase.first; dchan; dchan=dchan->next, schan=schan->next){
+ for (dchan=dst->chanbase.first, schan=src->chanbase.first; dchan; dchan=dchan->next, schan=schan->next) {
+ for (dgrp=dst->groups.first, sgrp=src->groups.first; dgrp && sgrp; dgrp=dgrp->next, sgrp=sgrp->next) {
+ if (dchan->grp == sgrp) {
+ dchan->grp= dgrp;
+
+ if (dgrp->channels.first == schan)
+ dgrp->channels.first= dchan;
+ if (dgrp->channels.last == schan)
+ dgrp->channels.last= dchan;
+
+ break;
+ }
+ }
+
dchan->ipo = copy_ipo(dchan->ipo);
copy_constraint_channels(&dchan->constraintChannels, &schan->constraintChannels);
}
+
dst->id.flag |= LIB_FAKEUSER;
dst->id.us++;
+
return dst;
}
@@ -285,7 +312,7 @@ void free_pose_channels(bPose *pose)
{
bPoseChannel *pchan;
- if (pose->chanbase.first){
+ if (pose->chanbase.first) {
for (pchan = pose->chanbase.first; pchan; pchan=pchan->next){
if(pchan->path)
MEM_freeN(pchan->path);
@@ -295,6 +322,21 @@ void free_pose_channels(bPose *pose)
}
}
+void free_pose(bPose *pose)
+{
+ if (pose) {
+ /* free pose-channels */
+ free_pose_channels(pose);
+
+ /* free pose-groups */
+ if (pose->agroups.first)
+ BLI_freelistN(&pose->agroups);
+
+ /* free pose */
+ MEM_freeN(pose);
+ }
+}
+
static void copy_pose_channel_data(bPoseChannel *pchan, const bPoseChannel *chan)
{
bConstraint *pcon, *con;
@@ -305,8 +347,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 */
@@ -386,7 +430,7 @@ bActionChannel *get_action_channel(bAction *act, const char *name)
if (!act || !name)
return NULL;
- for (chan = act->chanbase.first; chan; chan=chan->next){
+ for (chan = act->chanbase.first; chan; chan=chan->next) {
if (!strcmp (chan->name, name))
return chan;
}
@@ -394,18 +438,16 @@ bActionChannel *get_action_channel(bAction *act, const char *name)
return NULL;
}
-/* returns existing channel, or adds new one. In latter case it doesnt activate it, context is required for that*/
+/* returns existing channel, or adds new one. In latter case it doesnt activate it, context is required for that */
bActionChannel *verify_action_channel(bAction *act, const char *name)
{
bActionChannel *chan;
chan= get_action_channel(act, name);
- if(chan==NULL) {
- if (!chan) {
- chan = MEM_callocN (sizeof(bActionChannel), "actionChannel");
- strncpy (chan->name, name, 31);
- BLI_addtail (&act->chanbase, chan);
- }
+ if (chan == NULL) {
+ chan = MEM_callocN (sizeof(bActionChannel), "actionChannel");
+ strncpy(chan->name, name, 31);
+ BLI_addtail(&act->chanbase, chan);
}
return chan;
}
@@ -431,21 +473,19 @@ static bActionStrip *get_active_strip(Object *ob)
/* non clipped mapping of strip */
static float get_actionstrip_frame(bActionStrip *strip, float cframe, int invert)
{
- float length, actlength, repeat;
+ float length, actlength, repeat, scale;
- if (strip->flag & ACTSTRIP_USESTRIDE)
- repeat= 1.0f;
- else
- repeat= strip->repeat;
-
- length = strip->end-strip->start;
- if(length==0.0f)
- length= 1.0f;
- actlength = strip->actend-strip->actstart;
+ repeat = (strip->flag & ACTSTRIP_USESTRIDE) ? (1.0f) : (strip->repeat);
+ if(strip->scale == 0.0f) strip->scale= 1.0f;
+ scale = abs(strip->scale); /* scale must be positive (for now) */
+ actlength = strip->actend-strip->actstart;
+ if (actlength == 0.0f) actlength = 1.0f;
+ length = repeat * scale * actlength;
- if(invert)
+ /* invert = convert action-strip time to global time */
+ if (invert)
return length*(cframe - strip->actstart)/(repeat*actlength) + strip->start;
else
return repeat*actlength*(cframe - strip->start)/length + strip->actstart;
@@ -605,8 +645,10 @@ void blend_poses(bPose *dst, bPose *src, float srcweight, short mode)
QUATCOPY(squat, schan->quat);
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);
}
@@ -819,7 +861,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");
@@ -1061,6 +1103,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;
@@ -1271,10 +1353,8 @@ static void do_nla(Object *ob, int blocktype)
}
/* free */
- if (tpose){
- free_pose_channels(tpose);
- MEM_freeN(tpose);
- }
+ if (tpose)
+ free_pose(tpose);
if(chanbase.first)
BLI_freelistN(&chanbase);
}
@@ -1331,5 +1411,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 32ea2b3ed2c..58d0e84acd8 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"
@@ -46,7 +47,9 @@
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_modifier_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 +63,11 @@
#include "BKE_global.h"
#include "BKE_ipo.h"
#include "BKE_key.h"
+#include "BKE_lattice.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_utildefines.h"
#include "BKE_bad_level_calls.h"
@@ -70,6 +76,8 @@
#include <config.h>
#endif
+static void object_duplilist_recursive(ID *id, Object *ob, ListBase *duplilist, float par_space_mat[][4], int level, int animated);
+
void free_path(Path *path)
{
if(path->data) MEM_freeN(path->data);
@@ -101,7 +109,7 @@ void calc_curvepath(Object *ob)
cu->path= NULL;
bl= cu->bev.first;
- if(bl==NULL) return;
+ if(bl==NULL || !bl->nr) return;
cu->path=path= MEM_callocN(sizeof(Path), "path");
@@ -223,6 +231,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
/* test for cyclic */
bl= cu->bev.first;
+ if (!bl->nr) return 0;
if(bl && bl->poly> -1) cycl= 1;
ctime *= (path->len-1);
@@ -275,7 +284,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
/* ****************** DUPLICATOR ************** */
-static DupliObject *new_dupli_object(ListBase *lb, Object *ob, float mat[][4], int lay, int index)
+static DupliObject *new_dupli_object(ListBase *lb, Object *ob, float mat[][4], int lay, int index, int type, int animated)
{
DupliObject *dob= MEM_callocN(sizeof(DupliObject), "dupliobject");
@@ -285,20 +294,14 @@ static DupliObject *new_dupli_object(ListBase *lb, Object *ob, float mat[][4], i
Mat4CpyMat4(dob->omat, ob->obmat);
dob->origlay= ob->lay;
dob->index= index;
+ dob->type= type;
+ dob->animated= (type == OB_DUPLIGROUP) && animated;
ob->lay= lay;
- /* allowing duplicators for particle systems... a bit silly still */
- {
- PartEff *paf= give_parteff(ob);
- if(paf) {
- Mat4Invert(ob->imat, ob->obmat);
- Mat4CpyMat4(paf->imat, ob->imat);
- }
- }
return dob;
}
-static void group_duplilist(ListBase *lb, Object *ob, int level)
+static void group_duplilist(ListBase *lb, Object *ob, int level, int animated)
{
DupliObject *dob;
Group *group;
@@ -309,34 +312,39 @@ static void group_duplilist(ListBase *lb, Object *ob, int level)
group= ob->dup_group;
/* simple preventing of too deep nested groups */
- if(level>4) return;
+ if(level>MAX_DUPLI_RECUR) return;
/* handles animated groups, and */
/* we need to check update for objects that are not in scene... */
group_handle_recalc_and_update(ob, group);
+ animated= animated || group_is_animated(ob, group);
for(go= group->gobject.first; go; go= go->next) {
/* note, if you check on layer here, render goes wrong... it still deforms verts and uses parent imat */
if(go->ob!=ob) {
+
Mat4MulMat4(mat, go->ob->obmat, ob->obmat);
- dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0);
+ dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0, OB_DUPLIGROUP, animated);
dob->no_draw= (dob->origlay & group->layer)==0;
- if(go->ob->dup_group && (go->ob->transflag & OB_DUPLIGROUP)) {
+ if(go->ob->transflag & OB_DUPLI) {
Mat4CpyMat4(dob->ob->obmat, dob->mat);
- group_duplilist(lb, go->ob, level+1);
+ object_duplilist_recursive((ID *)group, go->ob, lb, ob->obmat, level+1, animated);
Mat4CpyMat4(dob->ob->obmat, dob->omat);
}
}
}
}
-static void frames_duplilist(ListBase *lb, Object *ob)
+static void frames_duplilist(ListBase *lb, Object *ob, int level, int animated)
{
extern int enable_cu_speed; /* object.c */
Object copyob;
int cfrao, ok;
+ /* simple preventing of too deep nested groups */
+ if(level>MAX_DUPLI_RECUR) return;
+
cfrao= G.scene->r.cfra;
if(ob->parent==NULL && ob->track==NULL && ob->ipo==NULL && ob->constraints.first==NULL) return;
@@ -355,7 +363,7 @@ static void frames_duplilist(ListBase *lb, Object *ob)
if(ok) {
do_ob_ipo(ob);
where_is_object_time(ob, (float)G.scene->r.cfra);
- new_dupli_object(lb, ob, ob->obmat, ob->lay, G.scene->r.cfra);
+ new_dupli_object(lb, ob, ob->obmat, ob->lay, G.scene->r.cfra, OB_DUPLIFRAMES, animated);
}
}
@@ -365,22 +373,28 @@ static void frames_duplilist(ListBase *lb, Object *ob)
}
struct vertexDupliData {
+ ID *id; /* scene or group, for recursive loops */
+ int level;
+ int animated;
ListBase *lb;
float pmat[4][4];
+ float obmat[4][4]; /* Only used for dupliverts inside dupligroups, where the ob->obmat is modified */
Object *ob, *par;
+ float (*orco)[3];
};
static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
{
+ DupliObject *dob;
struct vertexDupliData *vdd= userData;
float vec[3], *q2, mat[3][3], tmat[4][4], obmat[4][4];
VECCOPY(vec, co);
Mat4MulVecfl(vdd->pmat, vec);
VecSubf(vec, vec, vdd->pmat[3]);
- VecAddf(vec, vec, vdd->ob->obmat[3]);
+ VecAddf(vec, vec, vdd->obmat[3]);
- Mat4CpyMat4(obmat, vdd->ob->obmat);
+ Mat4CpyMat4(obmat, vdd->obmat);
VECCOPY(obmat[3], vec);
if(vdd->par->transflag & OB_DUPLIROT) {
@@ -397,38 +411,92 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n
Mat4CpyMat4(tmat, obmat);
Mat4MulMat43(obmat, tmat, mat);
}
- new_dupli_object(vdd->lb, vdd->ob, obmat, vdd->par->lay, index);
+ dob= new_dupli_object(vdd->lb, vdd->ob, obmat, vdd->par->lay, index, OB_DUPLIVERTS, vdd->animated);
+ if(vdd->orco)
+ VECCOPY(dob->orco, vdd->orco[index]);
+
+ if(vdd->ob->transflag & OB_DUPLI) {
+ float tmpmat[4][4];
+ Mat4CpyMat4(tmpmat, vdd->ob->obmat);
+ Mat4CpyMat4(vdd->ob->obmat, obmat); /* pretend we are really this mat */
+ object_duplilist_recursive((ID *)vdd->id, vdd->ob, vdd->lb, obmat, vdd->level+1, vdd->animated);
+ Mat4CpyMat4(vdd->ob->obmat, tmpmat);
+ }
}
-static void vertex_duplilist(ListBase *lb, Scene *sce, Object *par)
+static void vertex_duplilist(ListBase *lb, ID *id, Object *par, float par_space_mat[][4], int level, int animated)
{
- Object *ob;
- Base *base;
+ Object *ob, *ob_iter;
+ Mesh *me;
+ Base *base = NULL;
float vec[3], no[3], pmat[4][4];
- int lay, totvert, a;
+ int lay, totvert, a, oblay;
DerivedMesh *dm;
+ struct vertexDupliData vdd;
+ Scene *sce = NULL;
+ Group *group = NULL;
+ GroupObject * go = NULL;
Mat4CpyMat4(pmat, par->obmat);
- lay= G.scene->lay;
-
+ /* simple preventing of too deep nested groups */
+ if(level>MAX_DUPLI_RECUR) return;
+
if(par==G.obedit)
dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
else
- dm = mesh_get_derived_deform(par, CD_MASK_BAREMESH);
+ dm= mesh_get_derived_deform(par, CD_MASK_BAREMESH);
+
+ if(G.rendering) {
+ me= par->data;
+ vdd.orco= (float(*)[3])get_mesh_orco_verts(par);
+ transform_mesh_orco_verts(me, vdd.orco, me->totvert, 0);
+ }
+ else
+ vdd.orco= NULL;
totvert = dm->getNumVerts(dm);
- base= sce->base.first;
- while(base) {
-
- if(base->object->type>0 && (lay & base->lay) && G.obedit!=base->object) {
- ob= base->object->parent;
+ /* having to loop on scene OR group objects is NOT FUN */
+ if (GS(id->name) == ID_SCE) {
+ sce = (Scene *)id;
+ lay= sce->lay;
+ base= sce->base.first;
+ } else {
+ group = (Group *)id;
+ lay= group->layer;
+ go = group->gobject.first;
+ }
+
+ /* Start looping on Scene OR Group objects */
+ while (base || go) {
+ if (sce) {
+ ob_iter= base->object;
+ oblay = base->lay;
+ } else {
+ ob_iter= go->ob;
+ oblay = ob_iter->lay;
+ }
+
+ if (lay & oblay && G.obedit!=ob_iter) {
+ ob=ob_iter->parent;
while(ob) {
if(ob==par) {
- struct vertexDupliData vdd;
+ ob = ob_iter;
+ /* End Scene/Group object loop, below is generic */
+
- ob= base->object;
+ /* par_space_mat - only used for groups so we can modify the space dupli's are in
+ when par_space_mat is NULL ob->obmat can be used instead of ob__obmat
+ */
+ if(par_space_mat)
+ Mat4MulMat4(vdd.obmat, ob->obmat, par_space_mat);
+ else
+ Mat4CpyMat4(vdd.obmat, ob->obmat);
+
+ vdd.id= id;
+ vdd.level= level;
+ vdd.animated= animated;
vdd.lb= lb;
vdd.ob= ob;
vdd.par= par;
@@ -454,26 +522,37 @@ static void vertex_duplilist(ListBase *lb, Scene *sce, Object *par)
ob= ob->parent;
}
}
- base= base->next;
+ if (sce) base= base->next; /* scene loop */
+ else go= go->next; /* group loop */
}
+ if(vdd.orco)
+ MEM_freeN(vdd.orco);
dm->release(dm);
}
-static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
+static void face_duplilist(ListBase *lb, ID *id, Object *par, float par_space_mat[][4], int level, int animated)
{
- Object *ob;
- Base *base;
+ Object *ob, *ob_iter;
+ Base *base = NULL;
+ DupliObject *dob;
DerivedMesh *dm;
+ Mesh *me;
+ MTFace *mtface;
MFace *mface;
MVert *mvert;
- float pmat[4][4], imat[3][3];
- int lay, totface, a;
-
- Mat4CpyMat4(pmat, par->obmat);
+ float pmat[4][4], imat[3][3], (*orco)[3] = NULL, w;
+ int lay, oblay, totface, a;
+ Scene *sce = NULL;
+ Group *group = NULL;
+ GroupObject *go = NULL;
+ float ob__obmat[4][4]; /* needed for groups where the object matrix needs to be modified */
- lay= G.scene->lay;
+ /* simple preventing of too deep nested groups */
+ if(level>MAX_DUPLI_RECUR) return;
+ Mat4CpyMat4(pmat, par->obmat);
+
if(par==G.obedit) {
int totvert;
dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
@@ -492,26 +571,69 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
mface= dm->getFaceArray(dm);
mvert= dm->getVertArray(dm);
}
+
+ if(G.rendering) {
+ me= (Mesh*)par->data;
+
+ orco= (float(*)[3])get_mesh_orco_verts(par);
+ transform_mesh_orco_verts(me, orco, me->totvert, 0);
+ mtface= me->mtface;
+ }
+ else {
+ orco= NULL;
+ mtface= NULL;
+ }
+ /* having to loop on scene OR group objects is NOT FUN */
+ if (GS(id->name) == ID_SCE) {
+ sce = (Scene *)id;
+ lay= sce->lay;
+ base= sce->base.first;
+ } else {
+ group = (Group *)id;
+ lay= group->layer;
+ go = group->gobject.first;
+ }
- for(base= sce->base.first; base; base= base->next) {
+ /* Start looping on Scene OR Group objects */
+ while (base || go) {
+ if (sce) {
+ ob_iter= base->object;
+ oblay = base->lay;
+ } else {
+ ob_iter= go->ob;
+ oblay = ob_iter->lay;
+ }
- if(base->object->type>0 && (lay & base->lay) && G.obedit!=base->object) {
- ob= base->object->parent;
+ if (lay & oblay && G.obedit!=ob_iter) {
+ ob=ob_iter->parent;
while(ob) {
if(ob==par) {
+ ob = ob_iter;
+ /* End Scene/Group object loop, below is generic */
- ob= base->object;
- Mat3CpyMat4(imat, ob->parentinv);
+ /* par_space_mat - only used for groups so we can modify the space dupli's are in
+ when par_space_mat is NULL ob->obmat can be used instead of ob__obmat
+ */
+ if(par_space_mat)
+ Mat4MulMat4(ob__obmat, ob->obmat, par_space_mat);
+ else
+ Mat4CpyMat4(ob__obmat, ob->obmat);
+ Mat3CpyMat4(imat, ob->parentinv);
+
/* mballs have a different dupli handling */
if(ob->type!=OB_MBALL) ob->flag |= OB_DONE; /* doesnt render */
for(a=0; a<totface; a++) {
- float *v1= mvert[ mface[a].v1 ].co;
- float *v2= mvert[ mface[a].v2 ].co;
- float *v3= mvert[ mface[a].v3 ].co;
- float *v4= mface[a].v4?mvert[ mface[a].v4 ].co:NULL;
+ int mv1 = mface[a].v1;
+ int mv2 = mface[a].v2;
+ int mv3 = mface[a].v3;
+ int mv4 = mface[a].v4;
+ float *v1= mvert[mv1].co;
+ float *v2= mvert[mv2].co;
+ float *v3= mvert[mv3].co;
+ float *v4= (mv4)? mvert[mv4].co: NULL;
float cent[3], quat[4], mat[3][3], mat3[3][3], tmat[4][4], obmat[4][4];
/* translation */
@@ -522,9 +644,10 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
Mat4MulVecfl(pmat, cent);
VecSubf(cent, cent, pmat[3]);
- VecAddf(cent, cent, ob->obmat[3]);
+ VecAddf(cent, cent, ob__obmat[3]);
+
+ Mat4CpyMat4(obmat, ob__obmat);
- Mat4CpyMat4(obmat, ob->obmat);
VECCOPY(obmat[3], cent);
/* rotation */
@@ -534,7 +657,7 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
/* scale */
if(par->transflag & OB_DUPLIFACES_SCALE) {
float size= v4?AreaQ3Dfl(v1, v2, v3, v4):AreaT3Dfl(v1, v2, v3);
- size= sqrt(size);
+ size= sqrt(size) * par->dupfacesca;
Mat3MulFloat(mat[0], size);
}
@@ -544,8 +667,40 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
Mat4CpyMat4(tmat, obmat);
Mat4MulMat43(obmat, tmat, mat);
- new_dupli_object(lb, ob, obmat, lay, a);
+ dob= new_dupli_object(lb, ob, obmat, lay, a, OB_DUPLIFACES, animated);
+ if(G.rendering) {
+ w= (mv4)? 0.25f: 1.0f/3.0f;
+
+ if(orco) {
+ VECADDFAC(dob->orco, dob->orco, orco[mv1], w);
+ VECADDFAC(dob->orco, dob->orco, orco[mv2], w);
+ VECADDFAC(dob->orco, dob->orco, orco[mv3], w);
+ if(mv4)
+ VECADDFAC(dob->orco, dob->orco, orco[mv4], w);
+ }
+
+ if(mtface) {
+ dob->uv[0] += w*mtface[a].uv[0][0];
+ dob->uv[1] += w*mtface[a].uv[0][1];
+ dob->uv[0] += w*mtface[a].uv[1][0];
+ dob->uv[1] += w*mtface[a].uv[1][1];
+ dob->uv[0] += w*mtface[a].uv[2][0];
+ dob->uv[1] += w*mtface[a].uv[2][1];
+ if(mv4) {
+ dob->uv[0] += w*mtface[a].uv[3][0];
+ dob->uv[1] += w*mtface[a].uv[3][1];
+ }
+ }
+ }
+
+ if(ob->transflag & OB_DUPLI) {
+ float tmpmat[4][4];
+ Mat4CpyMat4(tmpmat, ob->obmat);
+ Mat4CpyMat4(ob->obmat, obmat); /* pretend we are really this mat */
+ object_duplilist_recursive((ID *)id, ob, lb, ob->obmat, level+1, animated);
+ Mat4CpyMat4(ob->obmat, tmpmat);
+ }
}
break;
@@ -553,144 +708,212 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
ob= ob->parent;
}
}
+ if (sce) base= base->next; /* scene loop */
+ else go= go->next; /* group loop */
}
if(par==G.obedit) {
MEM_freeN(mface);
MEM_freeN(mvert);
}
+
+ if(orco)
+ MEM_freeN(orco);
dm->release(dm);
}
-
-
-static void particle_duplilist(ListBase *lb, Scene *sce, Object *par, PartEff *paf)
+static void new_particle_duplilist(ListBase *lb, ID *id, Object *par, float par_space_mat[][4], ParticleSystem *psys, int level, int animated)
{
- 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;
- }
+ GroupObject *go;
+ Object *ob=0, **oblist=0;
+ DupliObject *dob;
+ ParticleSettings *part;
+ ParticleData *pa;
+ ChildParticle *cpa=0;
+ ParticleKey state;
+ ParticleCacheKey *cache;
+ ParticleSystemModifierData *psmd;
+ float ctime, pa_time, scale = 1.0f;
+ float tmat[4][4], mat[4][4], obrotmat[4][4], pamat[4][4], size=0.0;
+ float obmat[4][4], (*obmatlist)[4][4]=0;
+ float xvec[3] = {-1.0, 0.0, 0.0}, *q;
+ int lay, a, b, k, step_nbr = 0, counter, hair = 0;
+ int totpart, totchild, totgroup=0, pa_num;
+
+ if(psys==0) return;
- ctime= bsystem_time(par, (float)G.scene->r.cfra, 0.0);
+ /* simple preventing of too deep nested groups */
+ if(level>MAX_DUPLI_RECUR) return;
+ part=psys->part;
+ psmd= psys_get_modifier(par, psys);
+
+ 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) {
+ if(psys->flag & PSYS_HAIR_DONE)
+ hair= (totchild == 0 || psys->childcache) && psys->pathcache;
- /* 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);
- }
+ psys->lattice = psys_get_lattice(par, psys);
- 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);
- }
+ if(part->draw_as==PART_DRAW_GR) {
+ group_handle_recalc_and_update(par, part->dup_group);
+
+ go= part->dup_group->gobject.first;
+ while(go) {
+ go=go->next;
+ totgroup++;
+ }
+
+ oblist= MEM_callocN(totgroup*sizeof(Object *), "dupgroup object list");
+ obmatlist= MEM_callocN(totgroup*sizeof(float)*4*4, "dupgroup obmat list");
+ go= part->dup_group->gobject.first;
+ for(a=0; a<totgroup; a++, go=go->next) {
+ oblist[a]=go->ob;
+ Mat4CpyMat4(obmatlist[a], go->ob->obmat);
+ }
+ }
+ else {
+ ob = part->dup_ob;
+ Mat4CpyMat4(obmat, ob->obmat);
+ }
+
+ 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 */
+ cpa= &psys->child[a - totpart];
+ pa_num = a;
+ pa_time = psys->particles[cpa->parent].time;
+
+ size=psys_get_child_size(psys, cpa, ctime, 0);
+ }
+
+ if(part->draw_as==PART_DRAW_GR) {
+ if(part->draw&PART_DRAW_RAND_GR)
+ b= BLI_rand() % totgroup;
+ else if(part->from==PART_FROM_PARTICLE)
+ b= pa_num % totgroup;
+ else
+ b= a % totgroup;
+
+ ob = oblist[b];
+ Mat4CpyMat4(obmat, obmatlist[b]);
+ }
+
+ for(k=0; k<=step_nbr; k++, counter++) {
+ if(hair) {
+ if(a < totpart) {
+ cache = psys->pathcache[a];
+ psys_get_dupli_path_transform(par, part, psmd, pa, 0, cache, pamat, &scale);
+ }
+ else {
+ cache = psys->childcache[a-totpart];
+ psys_get_dupli_path_transform(par, part, psmd, 0, cpa, cache, pamat, &scale);
}
- /* temp copy, to have ipos etc to work OK */
- *ob= copyob;
+
+ VECCOPY(pamat[3], cache->co);
+ }
+ else if(step_nbr) {
+ state.time = (float)k / (float)step_nbr;
+ psys_get_particle_on_path(par, psys, a, &state, 0);
+
+ QuatToMat4(state.rot, pamat);
+ VECCOPY(pamat[3], state.co);
+ pamat[3][3]= 1.0f;
+ }
+ else {
+ state.time = -1.0;
+ if(psys_get_particle_state(par, psys, a, &state, 0) == 0)
+ continue;
+
+ QuatToMat4(state.rot, pamat);
+ VECCOPY(pamat[3], state.co);
+ pamat[3][3]= 1.0f;
+ }
+
+ if(part->draw_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
+ for(go= part->dup_group->gobject.first, b=0; go; go= go->next, b++) {
+
+ Mat4MulMat4(tmat, obmatlist[b], pamat);
+ Mat4MulFloat3((float *)tmat, size*scale);
+ if(par_space_mat)
+ Mat4MulMat4(mat, tmat, par_space_mat);
+ else
+ Mat4CpyMat4(mat, tmat);
+
+ dob= new_dupli_object(lb, go->ob, mat, par->lay, counter, OB_DUPLIPARTS, animated);
+ if(G.rendering)
+ psys_get_dupli_texture(par, part, psmd, pa, cpa, dob->uv, dob->orco);
+ }
+ }
+ else {
+ /* to give ipos in object correct offset */
+ where_is_object_time(ob, ctime-pa_time);
- break;
+ if(!hair) {
+ q = vectoquat(xvec, ob->trackflag, ob->upflag);
+ QuatToMat4(q, obrotmat);
+ obrotmat[3][3]= 1.0f;
+
+ Mat4MulMat4(mat, obrotmat, pamat);
+ }
+ else
+ Mat4CpyMat4(mat, pamat);
+
+ Mat4MulMat4(tmat, obmat, mat);
+ Mat4MulFloat3((float *)tmat, size*scale);
+ if(par_space_mat)
+ Mat4MulMat4(mat, tmat, par_space_mat);
+ else
+ Mat4CpyMat4(mat, tmat);
+
+ dob= new_dupli_object(lb, ob, mat, par->lay, counter, OB_DUPLIPARTS, animated);
+ if(G.rendering)
+ psys_get_dupli_texture(par, part, psmd, pa, cpa, dob->uv, dob->orco);
}
- ob= ob->parent;
}
}
}
-
- if(G.rendering && paf->disp!=100) {
- MEM_freeN(paf->keys);
- paf->keys= NULL;
+ if(oblist)
+ MEM_freeN(oblist);
+ if(obmatlist)
+ MEM_freeN(obmatlist);
+
+ if(psys->lattice) {
+ end_latt_deform();
+ psys->lattice = 0;
}
-
-
}
static Object *find_family_object(Object **obar, char *family, char ch)
@@ -716,7 +939,7 @@ static Object *find_family_object(Object **obar, char *family, char ch)
}
-static void font_duplilist(ListBase *lb, Object *par)
+static void font_duplilist(ListBase *lb, Object *par, int level, int animated)
{
Object *ob, *obar[256];
Curve *cu;
@@ -724,6 +947,9 @@ static void font_duplilist(ListBase *lb, Object *par)
float vec[3], obmat[4][4], pmat[4][4], fsize, xof, yof;
int slen, a;
+ /* simple preventing of too deep nested groups */
+ if(level>MAX_DUPLI_RECUR) return;
+
Mat4CpyMat4(pmat, par->obmat);
/* in par the family name is stored, use this to find the other objects */
@@ -754,53 +980,72 @@ static void font_duplilist(ListBase *lb, Object *par)
Mat4CpyMat4(obmat, par->obmat);
VECCOPY(obmat[3], vec);
- new_dupli_object(lb, ob, obmat, par->lay, a);
+ new_dupli_object(lb, ob, obmat, par->lay, a, OB_DUPLIVERTS, animated);
}
-
}
MEM_freeN(chartransdata);
}
/* ***************************** */
-
-/* note; group dupli's already set transform matrix. see note in group_duplilist() */
-ListBase *object_duplilist(Scene *sce, Object *ob)
-{
- ListBase *duplilist= MEM_mallocN(sizeof(ListBase), "duplilist");
- duplilist->first= duplilist->last= NULL;
+static void object_duplilist_recursive(ID *id, Object *ob, ListBase *duplilist, float par_space_mat[][4], int level, int animated)
+{
+ if((ob->transflag & OB_DUPLI)==0)
+ return;
- if(ob->transflag & OB_DUPLI) {
- 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);
- }
- else if(ob->type==OB_FONT) {
- font_duplilist(duplilist, ob);
+ /* Should the dupli's be generated for this object? - Respect restrict flags */
+ if (G.rendering) {
+ if (ob->restrictflag & OB_RESTRICT_RENDER) {
+ return;
+ }
+ } else {
+ if (ob->restrictflag & OB_RESTRICT_VIEW) {
+ return;
+ }
+ }
+
+ if(ob->transflag & OB_DUPLIPARTS) {
+ ParticleSystem *psys = ob->particlesystem.first;
+ for(; psys; psys=psys->next)
+ new_particle_duplilist(duplilist, id, ob, par_space_mat, psys, level+1, animated);
+ }
+ else if(ob->transflag & OB_DUPLIVERTS) {
+ if(ob->type==OB_MESH) {
+ vertex_duplilist(duplilist, id, ob, par_space_mat, level+1, animated);
+ }
+ else if(ob->type==OB_FONT) {
+ if (GS(id->name)==ID_SCE) { /* TODO - support dupligroups */
+ font_duplilist(duplilist, ob, level+1, animated);
}
}
- else if(ob->transflag & OB_DUPLIFACES) {
- if(ob->type==OB_MESH)
- face_duplilist(duplilist, sce, ob);
+ }
+ else if(ob->transflag & OB_DUPLIFACES) {
+ if(ob->type==OB_MESH)
+ face_duplilist(duplilist, id, ob, par_space_mat, level+1, animated);
+ }
+ else if(ob->transflag & OB_DUPLIFRAMES) {
+ if (GS(id->name)==ID_SCE) { /* TODO - support dupligroups */
+ frames_duplilist(duplilist, ob, level+1, animated);
}
- else if(ob->transflag & OB_DUPLIFRAMES)
- frames_duplilist(duplilist, ob);
- else if(ob->transflag & OB_DUPLIGROUP) {
- DupliObject *dob;
-
- group_duplilist(duplilist, ob, 0); /* now recursive */
-
- /* make copy already, because in group dupli's deform displists can be makde, requiring parent matrices */
+ } else if(ob->transflag & OB_DUPLIGROUP) {
+ DupliObject *dob;
+
+ group_duplilist(duplilist, ob, level+1, animated); /* now recursive */
+
+ if (level==0) {
for(dob= duplilist->first; dob; dob= dob->next)
- Mat4CpyMat4(dob->ob->obmat, dob->mat);
+ if(dob->type == OB_DUPLIGROUP)
+ Mat4CpyMat4(dob->ob->obmat, dob->mat);
}
-
}
-
+}
+
+/* note; group dupli's already set transform matrix. see note in group_duplilist() */
+ListBase *object_duplilist(Scene *sce, Object *ob)
+{
+ ListBase *duplilist= MEM_mallocN(sizeof(ListBase), "duplilist");
+ duplilist->first= duplilist->last= NULL;
+ object_duplilist_recursive((ID *)sce, ob, duplilist, NULL, 0, 0);
return duplilist;
}
@@ -823,14 +1068,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 10b2a364827..28a5430a5b3 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -30,6 +30,8 @@
#include <math.h>
#include <string.h>
#include <stdio.h>
+#include <float.h>
+
#include "MEM_guardedalloc.h"
#include "nla.h"
@@ -354,6 +356,88 @@ void bone_flip_name (char *name, int strip_number)
sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
}
+/* Finds the best possible extension to the name on a particular axis. (For renaming, check for unique names afterwards)
+ * This assumes that bone names are at most 32 chars long!
+ * strip_number: removes number extensions (TODO: not used)
+ * axis: the axis to name on
+ * head/tail: the head/tail co-ordinate of the bone on the specified axis
+ */
+void bone_autoside_name (char *name, int strip_number, short axis, float head, float tail)
+{
+ int len;
+ char basename[32]={""};
+ char extension[3]={""};
+
+ len= strlen(name);
+ if (len == 0) return;
+ strcpy(basename, name);
+
+ /* Figure out extension to append:
+ * - The extension to append is based upon the axis that we are working on.
+ * - If head happens to be on 0, then we must consider the tail position as well to decide
+ * which side the bone is on
+ * -> If tail is 0, then it's bone is considered to be on axis, so no extension should be added
+ * -> Otherwise, extension is added from perspective of object based on which side tail goes to
+ * - If head is non-zero, extension is added from perspective of object based on side head is on
+ */
+ if (axis == 2) {
+ /* z-axis - vertical (top/bottom) */
+ if (IS_EQ(head, 0)) {
+ if (tail < 0)
+ strcpy(extension, ".Bot");
+ else if (tail > 0)
+ strcpy(extension, ".Top");
+ }
+ else {
+ if (head < 0)
+ strcpy(extension, ".Bot");
+ else
+ strcpy(extension, ".Top");
+ }
+ }
+ else if (axis == 1) {
+ /* y-axis - depth (front/back) */
+ if (IS_EQ(head, 0)) {
+ if (tail < 0)
+ strcpy(extension, ".Fr");
+ else if (tail > 0)
+ strcpy(extension, ".Bk");
+ }
+ else {
+ if (head < 0)
+ strcpy(extension, ".Fr");
+ else
+ strcpy(extension, ".Bk");
+ }
+ }
+ else {
+ /* x-axis - horizontal (left/right) */
+ if (IS_EQ(head, 0)) {
+ if (tail < 0)
+ strcpy(extension, ".R");
+ else if (tail > 0)
+ strcpy(extension, ".L");
+ }
+ else {
+ if (head < 0)
+ strcpy(extension, ".R");
+ else if (head > 0)
+ strcpy(extension, ".L");
+ }
+ }
+
+ /* Simple name truncation
+ * - truncate if there is an extension and it wouldn't be able to fit
+ * - otherwise, just append to end (TODO: this should really check if there was already a tag there, and remove it)
+ */
+ if (extension[0]) {
+ if ((32 - len) < strlen(extension)) {
+ strncpy(name, basename, len-strlen(extension));
+ }
+ }
+
+ sprintf(name, "%s%s", basename, extension);
+}
/* ************* B-Bone support ******************* */
@@ -411,12 +495,31 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
Mat4 *result_array= (rest)? bbone_rest_array: bbone_array;
bPoseChannel *next, *prev;
Bone *bone= pchan->bone;
- float h1[3], h2[3], length, hlength1, hlength2, roll1, roll2;
- 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;
@@ -432,8 +535,14 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
first point = (0,0,0)
last point = (0, length, 0) */
- if(rest)
+ 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);
@@ -527,8 +636,15 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
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(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 result_array;
@@ -758,7 +874,8 @@ static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, Dua
void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
float (*vertexCos)[3], float (*defMats)[3][3],
- int numVerts, int deformflag, const char *defgrp_name)
+ int numVerts, int deformflag,
+ float (*prevCos)[3], const char *defgrp_name)
{
bPoseChannel *pchan, **defnrToPC = NULL;
MDeformVert *dverts = NULL;
@@ -768,6 +885,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
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;
@@ -849,11 +967,12 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
for(i = 0; i < numVerts; i++) {
MDeformVert *dvert;
DualQuat sumdq, *dq = NULL;
- float *co = vertexCos[i];
+ 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;
if(use_quaternion) {
@@ -885,11 +1004,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);
@@ -937,8 +1067,18 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
/* actually should be EPSILON? weight values and contrib can be like 10e-39 small */
if(contrib > 0.0001f) {
if(use_quaternion) {
- DQuatNormalize(dq, contrib, armature_weight);
- DQuatMulVecfl(dq, co, (defMats)? summat: NULL);
+ 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 {
@@ -963,6 +1103,15 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
/* 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);
@@ -1239,7 +1388,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;
@@ -1253,6 +1401,7 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
pchan= pose->chanbase.first;
for(; pchan; pchan= pchan->next) {
if(pchan->bone->layer & layer_protected) {
+ ListBase proxylocal_constraints = {NULL, NULL};
pchanp= get_pose_channel(frompose, pchan->name);
/* copy posechannel to temp, but restore important pointers */
@@ -1263,16 +1412,36 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
pchanw.child= pchan->child;
pchanw.path= NULL;
- /* constraints, set target ob pointer to own object */
+ /* constraints - proxy constraints are flushed... local ones are added after
+ * 1. extract constraints not from proxy (CONSTRAINT_PROXY_LOCAL) from pchan's constraints
+ * 2. copy proxy-pchan's constraints on-to new
+ * 3. add extracted local constraints back on top
+ */
+ extract_proxylocal_constraints(&proxylocal_constraints, &pchan->constraints);
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);
+ addlisttolist(&pchanw.constraints, &proxylocal_constraints);
+
+ /* constraints - set target ob pointer to own object */
+ 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 */
@@ -1498,7 +1667,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)
@@ -1512,11 +1681,11 @@ static void execute_posetree(Object *ob, PoseTree *tree)
/* set DoF flag */
flag= 0;
- if((pchan->ikflag & BONE_IK_NO_XDOF) == 0)
+ if(!(pchan->ikflag & BONE_IK_NO_XDOF) && !(pchan->ikflag & BONE_IK_NO_XDOF_TEMP))
flag |= IK_XDOF;
- if((pchan->ikflag & BONE_IK_NO_YDOF) == 0)
+ if(!(pchan->ikflag & BONE_IK_NO_YDOF) && !(pchan->ikflag & BONE_IK_NO_YDOF_TEMP))
flag |= IK_YDOF;
- if((pchan->ikflag & BONE_IK_NO_ZDOF) == 0)
+ if(!(pchan->ikflag & BONE_IK_NO_ZDOF) && !(pchan->ikflag & BONE_IK_NO_ZDOF_TEMP))
flag |= IK_ZDOF;
if(tree->stretch && (pchan->ikstretch > 0.0)) {
@@ -1586,7 +1755,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);
}
}
@@ -1609,53 +1778,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, 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 */
@@ -1776,12 +1980,42 @@ static void where_is_ik_bone(bPoseChannel *pchan, float ik_mat[][3]) // nr = t
static void do_strip_modifiers(Object *armob, Bone *bone, bPoseChannel *pchan)
{
bActionModifier *amod;
- bActionStrip *strip;
+ bActionStrip *strip, *strip2;
float scene_cfra= G.scene->r.cfra;
+ int do_modif;
for (strip=armob->nlastrips.first; strip; strip=strip->next) {
- if(scene_cfra>=strip->start && scene_cfra<=strip->end) {
+ 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 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;
+ }
+ }
+ /* 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;
+ }
+ }
+ }
+
+ if (do_modif) {
/* temporal solution to prevent 2 strips accumulating */
if(scene_cfra==strip->end && strip->next && strip->next->start==scene_cfra)
continue;
@@ -1910,6 +2144,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);
}
@@ -1926,13 +2175,16 @@ static void where_is_pose_bone(Object *ob, bPoseChannel *pchan, float ctime)
if (pchan->constraints.first) {
bConstraintOb *cob;
+ /* local constraints */
+ do_constraint_channels(&pchan->constraints, NULL, ctime, 0);
+
/* make a copy of location of PoseChannel for later */
VECCOPY(vec, pchan->pose_mat[3]);
/* prepare PoseChannel for Constraint solving
* - makes a copy of matrix, and creates temporary struct to use
*/
- cob= constraints_make_evalob(ob, pchan, TARGET_BONE);
+ cob= constraints_make_evalob(ob, pchan, CONSTRAINT_OBTYPE_BONE);
/* Solve PoseChannel's Constraints */
solve_constraints(&pchan->constraints, cob, ctime); // ctime doesnt alter objects
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index cad8d3b0861..b470800cb8a 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 */
@@ -307,7 +307,6 @@ static void clean_paths(Main *main)
}
BLI_clean(scene->r.backbuf);
BLI_clean(scene->r.pic);
- BLI_clean(scene->r.ftype);
scene= scene->id.next;
}
@@ -409,8 +408,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/cloth.c b/source/blender/blenkernel/intern/cloth.c
new file mode 100644
index 00000000000..e27df5b1ba1
--- /dev/null
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -0,0 +1,1438 @@
+/* cloth.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) Blender Foundation
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+/* types */
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_cloth_types.h"
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_modifier_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_edgehash.h"
+#include "BLI_linklist.h"
+
+#include "BKE_curve.h"
+#include "BKE_deform.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_displist.h"
+#include "BKE_effect.h"
+#include "BKE_global.h"
+#include "BKE_key.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+#include "BKE_cloth.h"
+#include "BKE_modifier.h"
+#include "BKE_utildefines.h"
+#include "BKE_DerivedMesh.h"
+#include "BIF_editdeform.h"
+#include "BIF_editkey.h"
+#include "DNA_screen_types.h"
+#include "BSE_headerbuttons.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+#include "mydevice.h"
+
+#include "BKE_pointcache.h"
+
+#ifdef _WIN32
+void tstart ( void )
+{}
+void tend ( void )
+{
+}
+double tval()
+{
+ return 0;
+}
+#else
+#include <sys/time.h>
+ static struct timeval _tstart, _tend;
+ static struct timezone tz;
+ void tstart ( void )
+{
+ gettimeofday ( &_tstart, &tz );
+}
+void tend ( void )
+{
+ gettimeofday ( &_tend,&tz );
+}
+double tval()
+{
+ double t1, t2;
+ t1 = ( double ) _tstart.tv_sec + ( double ) _tstart.tv_usec/ ( 1000*1000 );
+ t2 = ( double ) _tend.tv_sec + ( double ) _tend.tv_usec/ ( 1000*1000 );
+ return t2-t1;
+}
+#endif
+
+/* Our available solvers. */
+// 255 is the magic reserved number, so NEVER try to put 255 solvers in here!
+// 254 = MAX!
+static CM_SOLVER_DEF solvers [] =
+{
+ { "Implicit", CM_IMPLICIT, implicit_init, implicit_solver, implicit_free },
+ // { "Implicit C++", CM_IMPLICITCPP, implicitcpp_init, implicitcpp_solver, implicitcpp_free },
+};
+
+/* ********** cloth engine ******* */
+/* Prototypes for internal functions.
+*/
+static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm);
+static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm );
+static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr);
+int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
+static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm );
+
+
+/******************************************************************************
+*
+* External interface called by modifier.c clothModifier functions.
+*
+******************************************************************************/
+/**
+ * cloth_init - creates a new cloth simulation.
+ *
+ * 1. create object
+ * 2. fill object with standard values or with the GUI settings if given
+ */
+void cloth_init ( ClothModifierData *clmd )
+{
+ /* Initialize our new data structure to reasonable values. */
+ clmd->sim_parms->gravity [0] = 0.0;
+ clmd->sim_parms->gravity [1] = 0.0;
+ clmd->sim_parms->gravity [2] = -9.81;
+ clmd->sim_parms->structural = 30.0;
+ clmd->sim_parms->shear = 30.0;
+ clmd->sim_parms->bending = 1.0;
+ clmd->sim_parms->Cdis = 5.0;
+ clmd->sim_parms->Cvi = 1.0;
+ clmd->sim_parms->mass = 1.0f;
+ clmd->sim_parms->stepsPerFrame = 5;
+ clmd->sim_parms->sim_time = 1.0;
+ clmd->sim_parms->flags = 0;
+ clmd->sim_parms->solver_type = 0;
+ clmd->sim_parms->preroll = 0;
+ clmd->sim_parms->maxspringlen = 10;
+ clmd->sim_parms->firstframe = 1;
+ clmd->sim_parms->lastframe = 250;
+ clmd->sim_parms->vgroup_mass = 0;
+ clmd->sim_parms->lastcachedframe = 0;
+ clmd->sim_parms->editedframe = 0;
+ clmd->sim_parms->autoprotect = 25;
+ clmd->sim_parms->firstcachedframe = -1.0;
+
+ clmd->coll_parms->self_friction = 5.0;
+ clmd->coll_parms->friction = 5.0;
+ clmd->coll_parms->loop_count = 3;
+ clmd->coll_parms->epsilon = 0.015f;
+ clmd->coll_parms->flags = CLOTH_COLLSETTINGS_FLAG_ENABLED;
+
+ /* These defaults are copied from softbody.c's
+ * softbody_calc_forces() function.
+ */
+ clmd->sim_parms->eff_force_scale = 1000.0;
+ clmd->sim_parms->eff_wind_scale = 250.0;
+
+ // also from softbodies
+ clmd->sim_parms->maxgoal = 1.0f;
+ clmd->sim_parms->mingoal = 0.0f;
+ clmd->sim_parms->defgoal = 0.0f;
+ clmd->sim_parms->goalspring = 100.0f;
+ clmd->sim_parms->goalfrict = 0.0f;
+}
+
+
+BVH *bvh_build_from_cloth (ClothModifierData *clmd, float epsilon)
+{
+ unsigned int i = 0;
+ BVH *bvh=NULL;
+ Cloth *cloth = clmd->clothObject;
+ ClothVertex *verts = NULL;
+
+ if(!clmd)
+ return NULL;
+
+ cloth = clmd->clothObject;
+
+ if(!cloth)
+ return NULL;
+
+ verts = cloth->verts;
+
+ bvh = MEM_callocN(sizeof(BVH), "BVH");
+ if (bvh == NULL)
+ {
+ printf("bvh: Out of memory.\n");
+ return NULL;
+ }
+
+ // springs = cloth->springs;
+ // numsprings = cloth->numsprings;
+
+ bvh->flags = 0;
+ bvh->leaf_tree = NULL;
+ bvh->leaf_root = NULL;
+ bvh->tree = NULL;
+
+ bvh->epsilon = epsilon;
+ bvh->numfaces = cloth->numfaces;
+ bvh->mfaces = cloth->mfaces;
+
+ bvh->numverts = cloth->numverts;
+
+ bvh->current_x = MEM_callocN ( sizeof ( MVert ) * bvh->numverts, "bvh->current_x" );
+ bvh->current_xold = MEM_callocN ( sizeof ( MVert ) * bvh->numverts, "bvh->current_xold" );
+
+ for(i = 0; i < bvh->numverts; i++)
+ {
+ VECCOPY(bvh->current_x[i].co, verts[i].tx);
+ VECCOPY(bvh->current_xold[i].co, verts[i].txold);
+ }
+
+ bvh_build (bvh);
+
+ return bvh;
+}
+
+void bvh_update_from_cloth(ClothModifierData *clmd, int moving)
+{
+ unsigned int i = 0;
+ Cloth *cloth = clmd->clothObject;
+ BVH *bvh = cloth->tree;
+ ClothVertex *verts = cloth->verts;
+
+ if(!bvh)
+ return;
+
+ if(cloth->numverts!=bvh->numverts)
+ return;
+
+ if(cloth->verts)
+ {
+ for(i = 0; i < bvh->numverts; i++)
+ {
+ VECCOPY(bvh->current_x[i].co, verts[i].tx);
+ VECCOPY(bvh->current_xold[i].co, verts[i].txold);
+ }
+ }
+
+ bvh_update(bvh, moving);
+}
+
+// unused in the moment, cloth needs quads from mesh
+DerivedMesh *CDDM_convert_to_triangle ( DerivedMesh *dm )
+{
+ DerivedMesh *result = NULL;
+ int i;
+ int numverts = dm->getNumVerts ( dm );
+ int numedges = dm->getNumEdges ( dm );
+ int numfaces = dm->getNumFaces ( dm );
+
+ MVert *mvert = CDDM_get_verts ( dm );
+ MEdge *medge = CDDM_get_edges ( dm );
+ MFace *mface = CDDM_get_faces ( dm );
+
+ MVert *mvert2;
+ MFace *mface2;
+ unsigned int numtris=0;
+ unsigned int numquads=0;
+ int a = 0;
+ int random = 0;
+ int firsttime = 0;
+ float vec1[3], vec2[3], vec3[3], vec4[3], vec5[3];
+ float mag1=0, mag2=0;
+
+ for ( i = 0; i < numfaces; i++ )
+ {
+ if ( mface[i].v4 )
+ numquads++;
+ else
+ numtris++;
+ }
+
+ result = CDDM_from_template ( dm, numverts, 0, numtris + 2*numquads );
+
+ if ( !result )
+ return NULL;
+
+ // do verts
+ mvert2 = CDDM_get_verts ( result );
+ for ( a=0; a<numverts; a++ )
+ {
+ MVert *inMV;
+ MVert *mv = &mvert2[a];
+
+ inMV = &mvert[a];
+
+ DM_copy_vert_data ( dm, result, a, a, 1 );
+ *mv = *inMV;
+ }
+
+
+ // do faces
+ mface2 = CDDM_get_faces ( result );
+ for ( a=0, i=0; a<numfaces; a++ )
+ {
+ MFace *mf = &mface2[i];
+ MFace *inMF;
+ inMF = &mface[a];
+
+ /*
+ DM_copy_face_data(dm, result, a, i, 1);
+
+ *mf = *inMF;
+ */
+
+ if ( mface[a].v4 && random==1 )
+ {
+ mf->v1 = mface[a].v2;
+ mf->v2 = mface[a].v3;
+ mf->v3 = mface[a].v4;
+ }
+ else
+ {
+ mf->v1 = mface[a].v1;
+ mf->v2 = mface[a].v2;
+ mf->v3 = mface[a].v3;
+ }
+
+ mf->v4 = 0;
+ mf->flag |= ME_SMOOTH;
+
+ test_index_face ( mf, NULL, 0, 3 );
+
+ if ( mface[a].v4 )
+ {
+ MFace *mf2;
+
+ i++;
+
+ mf2 = &mface2[i];
+ /*
+ DM_copy_face_data(dm, result, a, i, 1);
+
+ *mf2 = *inMF;
+ */
+
+ if ( random==1 )
+ {
+ mf2->v1 = mface[a].v1;
+ mf2->v2 = mface[a].v2;
+ mf2->v3 = mface[a].v4;
+ }
+ else
+ {
+ mf2->v1 = mface[a].v4;
+ mf2->v2 = mface[a].v1;
+ mf2->v3 = mface[a].v3;
+ }
+ mf2->v4 = 0;
+ mf2->flag |= ME_SMOOTH;
+
+ test_index_face ( mf2, NULL, 0, 3 );
+ }
+
+ i++;
+ }
+
+ CDDM_calc_edges ( result );
+ CDDM_calc_normals ( result );
+
+ return result;
+
+}
+
+
+DerivedMesh *CDDM_create_tearing ( ClothModifierData *clmd, DerivedMesh *dm )
+{
+ DerivedMesh *result = NULL;
+ unsigned int i = 0, a = 0, j=0;
+ int numverts = dm->getNumVerts ( dm );
+ int numedges = dm->getNumEdges ( dm );
+ int numfaces = dm->getNumFaces ( dm );
+
+ MVert *mvert = CDDM_get_verts ( dm );
+ MEdge *medge = CDDM_get_edges ( dm );
+ MFace *mface = CDDM_get_faces ( dm );
+
+ MVert *mvert2;
+ MFace *mface2;
+ unsigned int numtris=0;
+ unsigned int numquads=0;
+ EdgeHash *edgehash = NULL;
+ Cloth *cloth = clmd->clothObject;
+ ClothSpring *springs = cloth->springs;
+ unsigned int numsprings = cloth->numsprings;
+
+ // create spring tearing hash
+ edgehash = BLI_edgehash_new();
+
+ for ( i = 0; i < numsprings; i++ )
+ {
+ if ( ( springs[i].flags & CLOTH_SPRING_FLAG_DEACTIVATE )
+ && ( !BLI_edgehash_haskey ( edgehash, springs[i].ij, springs[i].kl ) ) )
+ {
+ BLI_edgehash_insert ( edgehash, springs[i].ij, springs[i].kl, NULL );
+ BLI_edgehash_insert ( edgehash, springs[i].kl, springs[i].ij, NULL );
+ j++;
+ }
+ }
+
+ // printf("found %d tears\n", j);
+
+ result = CDDM_from_template ( dm, numverts, 0, numfaces );
+
+ if ( !result )
+ return NULL;
+
+ // do verts
+ mvert2 = CDDM_get_verts ( result );
+ for ( a=0; a<numverts; a++ )
+ {
+ MVert *inMV;
+ MVert *mv = &mvert2[a];
+
+ inMV = &mvert[a];
+
+ DM_copy_vert_data ( dm, result, a, a, 1 );
+ *mv = *inMV;
+ }
+
+
+ // do faces
+ mface2 = CDDM_get_faces ( result );
+ for ( a=0, i=0; a<numfaces; a++ )
+ {
+ MFace *mf = &mface2[i];
+ MFace *inMF;
+ inMF = &mface[a];
+
+ /*
+ DM_copy_face_data(dm, result, a, i, 1);
+
+ *mf = *inMF;
+ */
+
+ if ( ( !BLI_edgehash_haskey ( edgehash, mface[a].v1, mface[a].v2 ) )
+ && ( !BLI_edgehash_haskey ( edgehash, mface[a].v2, mface[a].v3 ) )
+ && ( !BLI_edgehash_haskey ( edgehash, mface[a].v3, mface[a].v4 ) )
+ && ( !BLI_edgehash_haskey ( edgehash, mface[a].v4, mface[a].v1 ) ) )
+ {
+ mf->v1 = mface[a].v1;
+ mf->v2 = mface[a].v2;
+ mf->v3 = mface[a].v3;
+ mf->v4 = mface[a].v4;
+
+ test_index_face ( mf, NULL, 0, 4 );
+
+ i++;
+ }
+ }
+
+ CDDM_lower_num_faces ( result, i );
+ CDDM_calc_edges ( result );
+ CDDM_calc_normals ( result );
+
+ BLI_edgehash_free ( edgehash, NULL );
+
+ return result;
+}
+
+int modifiers_indexInObject(Object *ob, ModifierData *md_seek);
+
+int cloth_read_cache(Object *ob, ClothModifierData *clmd, float framenr)
+{
+ FILE *fp = NULL;
+ int stack_index = -1;
+ unsigned int a, ret = 1;
+ Cloth *cloth = clmd->clothObject;
+
+ if(!cloth)
+ return 0;
+
+ stack_index = modifiers_indexInObject(ob, (ModifierData *)clmd);
+
+ fp = BKE_ptcache_id_fopen((ID *)ob, 'r', framenr, stack_index);
+ if(!fp)
+ ret = 0;
+ else {
+ for(a = 0; a < cloth->numverts; a++)
+ {
+ if(fread(&cloth->verts[a].x, sizeof(float), 3, fp) != 3)
+ {
+ ret = 0;
+ break;
+ }
+ if(fread(&cloth->verts[a].xconst, sizeof(float), 3, fp) != 3)
+ {
+ ret = 0;
+ break;
+ }
+ if(fread(&cloth->verts[a].v, sizeof(float), 3, fp) != 3)
+ {
+ ret = 0;
+ break;
+ }
+ }
+
+ fclose(fp);
+
+ if(clmd->sim_parms->lastcachedframe < framenr)
+ {
+ if(G.rt > 0)
+ printf("cloth_read_cache problem: lnex - f#: %f, lastCF: %d\n", framenr, clmd->sim_parms->lastcachedframe);
+ }
+
+ if(G.rt > 0)
+ printf("cloth_read_cache: %f successfully \n", framenr);
+ }
+
+ if(G.rt > 0)
+ printf("cloth_read_cache: %f\n", framenr);
+
+ return ret;
+}
+
+void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr)
+{
+ int stack_index = -1;
+
+ // don't do anything as long as we're in editmode!
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_EDITMODE)
+ {
+ /* delete cache free request */
+ clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+
+ return;
+ }
+
+ /* clear cache if specific frame cleaning requested or cache is not protected */
+ if((!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT)) || (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE))
+ {
+ stack_index = modifiers_indexInObject(ob, (ModifierData *)clmd);
+
+ BKE_ptcache_id_clear((ID *)ob, PTCACHE_CLEAR_AFTER, framenr, stack_index);
+
+ /* update last cached frame # */
+ clmd->sim_parms->lastcachedframe = framenr;
+
+ /* update first cached frame # */
+ if((framenr < clmd->sim_parms->firstcachedframe) && (clmd->sim_parms->firstcachedframe >=0.0))
+ clmd->sim_parms->firstcachedframe = -1.0;
+
+ if(G.rt > 0)
+ printf("cloth_clear_cache: %f\n", framenr);
+ }
+
+ /* delete cache free request */
+ clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+
+
+}
+void cloth_write_cache(Object *ob, ClothModifierData *clmd, float framenr)
+{
+ FILE *fp = NULL;
+ int stack_index = -1;
+ unsigned int a;
+ Cloth *cloth = clmd->clothObject;
+
+ if(G.rt > 0)
+ printf("cloth_write_cache: %f\n", framenr);
+
+ if(!cloth)
+ {
+ if(G.rt > 0)
+ printf("cloth_write_cache: no cloth\n");
+ return;
+ }
+
+ stack_index = modifiers_indexInObject(ob, (ModifierData *)clmd);
+
+ fp = BKE_ptcache_id_fopen((ID *)ob, 'w', framenr, stack_index);
+ if(!fp)
+ {
+ if(G.rt > 0)
+ printf("cloth_write_cache: no fp\n");
+ return;
+ }
+
+ for(a = 0; a < cloth->numverts; a++)
+ {
+ fwrite(&cloth->verts[a].x, sizeof(float),3,fp);
+ fwrite(&cloth->verts[a].xconst, sizeof(float),3,fp);
+ fwrite(&cloth->verts[a].v, sizeof(float),3,fp);
+ }
+
+ /* update last cached frame # */
+ clmd->sim_parms->lastcachedframe = MAX2(clmd->sim_parms->lastcachedframe, framenr);
+
+ /* update first cached frame # */
+ if((clmd->sim_parms->firstcachedframe < 0.0) || ((framenr < clmd->sim_parms->firstcachedframe) && (clmd->sim_parms->firstcachedframe > 0.0)))
+ clmd->sim_parms->firstcachedframe = framenr;
+
+ if(G.rt > 0)
+ printf("lcf: %d, framenr: %f\n", clmd->sim_parms->lastcachedframe, framenr);
+
+ fclose(fp);
+}
+
+
+
+/************************************************
+ * clothModifier_do - main simulation function
+************************************************/
+DerivedMesh *clothModifier_do(ClothModifierData *clmd,Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+
+{
+ unsigned int i;
+ Cloth *cloth = clmd->clothObject;
+ float framenr = G.scene->r.cfra;
+ float current_time = bsystem_time ( ob, ( float ) G.scene->r.cfra, 0.0 );
+ ListBase *effectors = NULL;
+ ClothVertex *verts = NULL;
+ float deltaTime = current_time - clmd->sim_parms->sim_time;
+ unsigned int numverts = -1;
+ unsigned int numedges = -1;
+ unsigned int numfaces = -1;
+ MVert *mvert = NULL;
+ MEdge *medge = NULL;
+ MFace *mface = NULL;
+ DerivedMesh *result = NULL;
+ int ret = 0;
+
+ if(G.rt > 0)
+ printf("clothModifier_do start\n");
+
+ /* we're getting called two times during file load,
+ resulting in a not valid G.relbase on the first time (cache makes problems)
+ --> just return back */
+ if((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_LOADED) && (!G.relbase_valid))
+ {
+ clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_LOADED;
+ return dm;
+ }
+
+ result = CDDM_copy(dm);
+
+ if(!result)
+ {
+ return dm;
+ }
+
+ numverts = result->getNumVerts(result);
+ numedges = result->getNumEdges(result);
+ numfaces = result->getNumFaces(result);
+ mvert = dm->getVertArray(result);
+ medge = dm->getEdgeArray(result);
+ mface = dm->getFaceArray(result);
+
+ /* check if cache is active / if file is already saved */
+ /*
+ if ((!G.relbase_valid) && ( deltaTime != 1.0f ))
+ {
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+}
+ */
+
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_RESET)
+ {
+ cloth_free_modifier (ob, clmd);
+ if(G.rt > 0)
+ printf("clothModifier_do CLOTH_SIMSETTINGS_FLAG_RESET\n");
+ }
+
+ // unused in the moment, calculated seperately in implicit.c
+ clmd->sim_parms->dt = 1.0f / clmd->sim_parms->stepsPerFrame;
+
+ if ( ( clmd->clothObject == NULL ) || (clmd->clothObject && (numverts != clmd->clothObject->numverts )) )
+ {
+ /* only force free the cache if we have a different number of verts */
+ if(clmd->clothObject && (numverts != clmd->clothObject->numverts ))
+ {
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+ cloth_free_modifier ( ob, clmd );
+ }
+
+ cloth_clear_cache(ob, clmd, 0);
+
+ if ( !cloth_from_object ( ob, clmd, result, framenr ) )
+ return result;
+
+ if ( clmd->clothObject == NULL )
+ return result;
+
+ cloth = clmd->clothObject;
+
+ if(!cloth_read_cache(ob, clmd, framenr))
+ {
+ /* save first frame in case we have a reseted object
+ and we move one frame forward.
+ In that case we would only start with the SECOND frame
+ if we don't save the current state before
+ TODO PROBLEM: IMHO we can't track external movement from the
+ first frame in this case! */
+ /*
+ if ( deltaTime == 1.0f )
+ cloth_write_cache(ob, clmd, framenr-1.0);
+ */
+ if(G.rt > 0)
+ printf("cloth_from_object NO cloth_read_cache cloth_write_cache\n");
+ }
+ else
+ {
+ if(G.rt > 0)
+ printf("cloth_from_object cloth_read_cache\n");
+
+ implicit_set_positions(clmd);
+ }
+
+ clmd->sim_parms->sim_time = current_time;
+ }
+
+ // only be active during a specific period:
+ // that's "first frame" and "last frame" on GUI
+ if ( current_time < clmd->sim_parms->firstframe )
+ {
+ return result;
+ }
+ else if ( current_time > clmd->sim_parms->lastframe )
+ {
+ int stack_index = modifiers_indexInObject(ob, (ModifierData *)clmd);
+
+ if(BKE_ptcache_id_exist((ID *)ob, clmd->sim_parms->lastcachedframe, stack_index))
+ {
+ if(cloth_read_cache(ob, clmd, clmd->sim_parms->lastcachedframe))
+ {
+ implicit_set_positions(clmd);
+
+ // Copy the result back to the object.
+ cloth_to_object (ob, clmd, result);
+ }
+ }
+ return result;
+ }
+
+ // check for autoprotection
+ if(framenr >= clmd->sim_parms->autoprotect)
+ {
+ if(G.rt > 0)
+ printf("fr#: %f, auto: %d\n", framenr, clmd->sim_parms->autoprotect);
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT;
+ }
+ if(G.rt > 0)
+ printf("clothModifier_do deltaTime=1 cachewrite\n");
+
+ /* nice moving one frame forward */
+ if ( deltaTime == 1.0f )
+ {
+ clmd->sim_parms->sim_time = current_time;
+
+ if(G.rt > 0)
+ printf("clothModifier_do deltaTime=1\n");
+
+ if(!cloth_read_cache(ob, clmd, framenr))
+ {
+ verts = cloth->verts;
+
+ // Force any pinned verts to their constrained location.
+ for ( i = 0; i < clmd->clothObject->numverts; i++, verts++ )
+ {
+ // Save the previous position.
+ VECCOPY ( verts->xold, verts->xconst );
+ VECCOPY ( verts->txold, verts->x );
+
+ // Get the current position.
+ VECCOPY ( verts->xconst, mvert[i].co );
+ Mat4MulVecfl ( ob->obmat, verts->xconst );
+ }
+
+ tstart();
+
+ // Call the solver.
+ if ( solvers [clmd->sim_parms->solver_type].solver )
+ {
+ ret = solvers [clmd->sim_parms->solver_type].solver ( ob, framenr, clmd, effectors );
+ }
+
+ tend();
+ // printf ( "Cloth simulation time: %f\n", ( float ) tval() );
+
+ if(ret)
+ cloth_write_cache(ob, clmd, framenr);
+ else
+ clmd->sim_parms->sim_time--;
+ }
+ else
+ {
+ if(G.rt > 0)
+ printf("clothModifier_do deltaTime=1 cacheread\n");
+ implicit_set_positions(clmd);
+ }
+
+ // Copy the result back to the object.
+ cloth_to_object (ob, clmd, result);
+ }
+ else if(deltaTime == 0.0f)
+ {
+ if(G.rt > 0)
+ printf("clothModifier_do deltaTime!=1 clmd->clothObject != NULL\n");
+ if(cloth_read_cache(ob, clmd, framenr))
+ {
+ cloth_to_object (ob, clmd, result);
+ implicit_set_positions(clmd);
+ }
+ else /* same cache parts are missing */
+ {
+ /*
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ */
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+ cloth_clear_cache(ob, clmd, 0);
+
+ cloth_write_cache(ob, clmd, framenr);
+ }
+ }
+ else
+ {
+ if(G.rt > 0)
+ printf("clothModifier_do deltaTime!=1 clmd->clothObject != NULL\n");
+ if(cloth_read_cache(ob, clmd, framenr))
+ {
+ cloth_to_object (ob, clmd, result);
+ implicit_set_positions(clmd);
+ clmd->sim_parms->sim_time = current_time;
+ }
+ else
+ {
+ /* jump to a non-existing frame makes sim reset */
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
+ }
+
+ return result;
+}
+
+/* frees all */
+void cloth_free_modifier ( Object *ob, ClothModifierData *clmd )
+{
+ Cloth *cloth = NULL;
+
+ if ( !clmd )
+ return;
+
+ cloth = clmd->clothObject;
+
+
+ if ( cloth )
+ {
+ // If our solver provides a free function, call it
+ if ( solvers [clmd->sim_parms->solver_type].free )
+ {
+ solvers [clmd->sim_parms->solver_type].free ( clmd );
+ }
+
+ // Free the verts.
+ if ( cloth->verts != NULL )
+ MEM_freeN ( cloth->verts );
+
+ cloth->verts = NULL;
+ cloth->numverts = 0;
+
+ // Free the springs.
+ if ( cloth->springs != NULL )
+ {
+ LinkNode *search = cloth->springs;
+ while(search)
+ {
+ ClothSpring *spring = search->link;
+
+ MEM_freeN ( spring );
+ search = search->next;
+ }
+ BLI_linklist_free(cloth->springs, NULL);
+
+ cloth->springs = NULL;
+ }
+
+ cloth->springs = NULL;
+ cloth->numsprings = 0;
+
+ // free BVH collision tree
+ if ( cloth->tree )
+ bvh_free ( ( BVH * ) cloth->tree );
+
+ // we save our faces for collision objects
+ if ( cloth->mfaces )
+ MEM_freeN ( cloth->mfaces );
+ /*
+ if(clmd->clothObject->facemarks)
+ MEM_freeN(clmd->clothObject->facemarks);
+ */
+ MEM_freeN ( cloth );
+ clmd->clothObject = NULL;
+ }
+ clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_RESET;
+}
+
+/* frees all */
+void cloth_free_modifier_extern ( ClothModifierData *clmd )
+{
+ Cloth *cloth = NULL;
+ if(G.rt > 0)
+ printf("cloth_free_modifier_extern\n");
+
+ if ( !clmd )
+ return;
+
+ cloth = clmd->clothObject;
+
+ if ( cloth )
+ {
+ if(G.rt > 0)
+ printf("cloth_free_modifier_extern in\n");
+
+ // If our solver provides a free function, call it
+ if ( solvers [clmd->sim_parms->solver_type].free )
+ {
+ solvers [clmd->sim_parms->solver_type].free ( clmd );
+ }
+
+ // Free the verts.
+ if ( cloth->verts != NULL )
+ MEM_freeN ( cloth->verts );
+
+ cloth->verts = NULL;
+ cloth->numverts = 0;
+
+ // Free the springs.
+ if ( cloth->springs != NULL )
+ {
+ LinkNode *search = cloth->springs;
+ while(search)
+ {
+ ClothSpring *spring = search->link;
+
+ MEM_freeN ( spring );
+ search = search->next;
+ }
+ BLI_linklist_free(cloth->springs, NULL);
+
+ cloth->springs = NULL;
+ }
+
+ cloth->springs = NULL;
+ cloth->numsprings = 0;
+
+ // free BVH collision tree
+ if ( cloth->tree )
+ bvh_free ( ( BVH * ) cloth->tree );
+
+ // we save our faces for collision objects
+ if ( cloth->mfaces )
+ MEM_freeN ( cloth->mfaces );
+ /*
+ if(clmd->clothObject->facemarks)
+ MEM_freeN(clmd->clothObject->facemarks);
+ */
+ MEM_freeN ( cloth );
+ clmd->clothObject = NULL;
+ }
+}
+
+/******************************************************************************
+*
+* Internal functions.
+*
+******************************************************************************/
+
+/**
+ * cloth_to_object - copies the deformed vertices to the object.
+ *
+ **/
+static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm)
+{
+ unsigned int i = 0;
+ MVert *mvert = NULL;
+ unsigned int numverts;
+ Cloth *cloth = clmd->clothObject;
+
+ if (clmd->clothObject) {
+ /* inverse matrix is not uptodate... */
+ Mat4Invert (ob->imat, ob->obmat);
+
+ mvert = CDDM_get_verts(dm);
+ numverts = dm->getNumVerts(dm);
+
+ for (i = 0; i < numverts; i++)
+ {
+ VECCOPY (mvert[i].co, cloth->verts[i].x);
+ Mat4MulVecfl (ob->imat, mvert[i].co); /* cloth is in global coords */
+ }
+ }
+}
+
+
+/**
+ * cloth_apply_vgroup - applies a vertex group as specified by type
+ *
+ **/
+/* can be optimized to do all groups in one loop */
+static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm )
+{
+ unsigned int i = 0;
+ unsigned int j = 0;
+ MDeformVert *dvert = NULL;
+ Cloth *clothObj = NULL;
+ unsigned int numverts = dm->getNumVerts ( dm );
+ float goalfac = 0;
+ ClothVertex *verts = NULL;
+ // clmd->sim_parms->vgroup_mass
+
+ clothObj = clmd->clothObject;
+
+ if ( !dm )
+ return;
+
+ numverts = dm->getNumVerts ( dm );
+
+ verts = clothObj->verts;
+
+ if ((((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING ) ||
+ (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )) &&
+ ((clmd->sim_parms->vgroup_mass>0) ||
+ (clmd->sim_parms->vgroup_struct>0)||
+ (clmd->sim_parms->vgroup_bend>0)))|| (clmd->sim_parms->vgroup_mass>0))
+ {
+ for ( i = 0; i < numverts; i++, verts++ )
+ {
+ verts->mass = 1.0; // standard mass
+
+ dvert = dm->getVertData ( dm, i, CD_MDEFORMVERT );
+ if ( dvert )
+ {
+ for ( j = 0; j < dvert->totweight; j++ )
+ {
+ if (( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass-1)) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ))
+ {
+ verts->goal = dvert->dw [j].weight;
+ goalfac= 1.0f;
+
+ /*
+ // Kicking goal factor to simplify things...who uses that anyway?
+ // ABS ( clmd->sim_parms->maxgoal - clmd->sim_parms->mingoal );
+ */
+
+ verts->goal = ( float ) pow ( verts->goal , 4.0f );
+ if ( verts->goal >=SOFTGOALSNAP )
+ verts->flags |= CLOTH_VERT_FLAG_PINNED;
+ }
+
+ if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING )
+ {
+ if( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_struct-1))
+ {
+ verts->struct_stiff = dvert->dw [j].weight;
+ verts->shear_stiff = dvert->dw [j].weight;
+ }
+
+ if( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_bend-1))
+ {
+ verts->bend_stiff = dvert->dw [j].weight;
+ }
+ }
+
+ if( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass-1))
+ {
+ verts->mass = dvert->dw [j].weight;
+ }
+ }
+ }
+ }
+ }
+}
+
+static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr)
+{
+ unsigned int i = 0;
+ MVert *mvert = NULL;
+ ClothVertex *verts = NULL;
+ float tnull[3] = {0,0,0};
+ int cache_there = 0;
+
+ // If we have a clothObject, free it.
+ if ( clmd->clothObject != NULL )
+ {
+ cloth_free_modifier ( ob, clmd );
+ if(G.rt > 0)
+ printf("cloth_free_modifier cloth_from_object\n");
+ }
+
+ // Allocate a new cloth object.
+ clmd->clothObject = MEM_callocN ( sizeof ( Cloth ), "cloth" );
+ if ( clmd->clothObject )
+ {
+ clmd->clothObject->old_solver_type = 255;
+ // clmd->clothObject->old_collision_type = 255;
+ }
+ else if ( !clmd->clothObject )
+ {
+ modifier_setError ( & ( clmd->modifier ), "Out of memory on allocating clmd->clothObject." );
+ return 0;
+ }
+
+ // mesh input objects need DerivedMesh
+ if ( !dm )
+ return 0;
+
+ cloth_from_mesh ( ob, clmd, dm );
+
+ if((clmd->sim_parms->firstcachedframe < 0.0) || ((clmd->sim_parms->firstcachedframe >= 0.0) && (!cloth_read_cache(ob, clmd, clmd->sim_parms->firstcachedframe))))
+ {
+ // no cache there
+ cache_there = 0;
+ if(G.rt > 0)
+ printf("cache_there = 0\n");
+ }
+ else
+ {
+ // we have a cache
+ cache_there = 1;
+ if(G.rt > 0)
+ printf("cache_there = 1, fcf: %d\n", clmd->sim_parms->firstcachedframe);
+ }
+
+ // create springs
+ clmd->clothObject->springs = NULL;
+ clmd->clothObject->numsprings = -1;
+
+ mvert = dm->getVertArray ( dm );
+ verts = clmd->clothObject->verts;
+
+ // set initial values
+ for ( i = 0; i < dm->getNumVerts(dm); i++, verts++ )
+ {
+ if(!cache_there)
+ {
+ VECCOPY ( verts->x, mvert[i].co );
+ Mat4MulVecfl ( ob->obmat, verts->x );
+ }
+
+ verts->mass = clmd->sim_parms->mass;
+
+ if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )
+ verts->goal= clmd->sim_parms->defgoal;
+ else
+ verts->goal= 0.0f;
+
+ verts->flags = 0;
+ VECCOPY ( verts->xold, verts->x );
+ VECCOPY ( verts->xconst, verts->x );
+ VECCOPY ( verts->txold, verts->x );
+ VecMulf ( verts->v, 0.0f );
+
+ verts->impulse_count = 0;
+ VECCOPY ( verts->impulse, tnull );
+ }
+
+ // apply / set vertex groups
+ // has to be happen before springs are build!
+ cloth_apply_vgroup (clmd, dm);
+
+
+ if ( !cloth_build_springs ( clmd, dm ) )
+ {
+ cloth_free_modifier ( ob, clmd );
+ modifier_setError ( & ( clmd->modifier ), "Can't build springs." );
+ printf("cloth_free_modifier cloth_build_springs\n");
+ return 0;
+ }
+
+
+ // init our solver
+ if ( solvers [clmd->sim_parms->solver_type].init )
+ solvers [clmd->sim_parms->solver_type].init ( ob, clmd );
+
+ clmd->clothObject->tree = bvh_build_from_cloth ( clmd, clmd->coll_parms->epsilon );
+
+ return 1;
+}
+
+
+static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm )
+{
+ unsigned int numverts = dm->getNumVerts ( dm );
+ unsigned int numfaces = dm->getNumFaces ( dm );
+ MFace *mface = CDDM_get_faces(dm);
+ unsigned int i = 0;
+
+ /* Allocate our vertices.
+ */
+ clmd->clothObject->numverts = numverts;
+ clmd->clothObject->verts = MEM_callocN ( sizeof ( ClothVertex ) * clmd->clothObject->numverts, "clothVertex" );
+ if ( clmd->clothObject->verts == NULL )
+ {
+ cloth_free_modifier ( ob, clmd );
+ modifier_setError ( & ( clmd->modifier ), "Out of memory on allocating clmd->clothObject->verts." );
+ printf("cloth_free_modifier clmd->clothObject->verts\n");
+ return;
+ }
+
+ // save face information
+ clmd->clothObject->numfaces = numfaces;
+ clmd->clothObject->mfaces = MEM_callocN ( sizeof ( MFace ) * clmd->clothObject->numfaces, "clothMFaces" );
+ if ( clmd->clothObject->mfaces == NULL )
+ {
+ cloth_free_modifier ( ob, clmd );
+ modifier_setError ( & ( clmd->modifier ), "Out of memory on allocating clmd->clothObject->mfaces." );
+ printf("cloth_free_modifier clmd->clothObject->mfaces\n");
+ return;
+ }
+ for ( i = 0; i < numfaces; i++ )
+ memcpy ( &clmd->clothObject->mfaces[i], &mface[i], sizeof ( MFace ) );
+
+ /* Free the springs since they can't be correct if the vertices
+ * changed.
+ */
+ if ( clmd->clothObject->springs != NULL )
+ MEM_freeN ( clmd->clothObject->springs );
+
+}
+
+/***************************************************************************************
+* SPRING NETWORK BUILDING IMPLEMENTATION BEGIN
+***************************************************************************************/
+
+// be carefull: implicit solver has to be resettet when using this one!
+// --> only for implicit handling of this spring!
+int cloth_add_spring ( ClothModifierData *clmd, unsigned int indexA, unsigned int indexB, float restlength, int spring_type)
+{
+ Cloth *cloth = clmd->clothObject;
+ ClothSpring *spring = NULL;
+
+ if(cloth)
+ {
+ // TODO: look if this spring is already there
+
+ spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
+
+ spring->ij = indexA;
+ spring->kl = indexB;
+ spring->restlen = restlength;
+ spring->type = spring_type;
+ spring->flags = 0;
+
+ cloth->numsprings++;
+
+ BLI_linklist_append ( &cloth->springs, spring );
+
+ return 1;
+ }
+ return 0;
+}
+
+int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
+{
+ Cloth *cloth = clmd->clothObject;
+ ClothSpring *spring = NULL, *tspring = NULL, *tspring2 = NULL;
+ unsigned int struct_springs = 0, shear_springs=0, bend_springs = 0;
+ unsigned int i = 0;
+ unsigned int numverts = dm->getNumVerts ( dm );
+ unsigned int numedges = dm->getNumEdges ( dm );
+ unsigned int numfaces = dm->getNumFaces ( dm );
+ MEdge *medge = CDDM_get_edges ( dm );
+ MFace *mface = CDDM_get_faces ( dm );
+ unsigned int index2 = 0; // our second vertex index
+ LinkNode **edgelist = NULL;
+ EdgeHash *edgehash = NULL;
+ LinkNode *search = NULL, *search2 = NULL;
+ float temp[3];
+ LinkNode *node = NULL, *node2 = NULL;
+
+ // error handling
+ if ( numedges==0 )
+ return 0;
+
+ cloth->springs = NULL;
+
+ edgelist = MEM_callocN ( sizeof ( LinkNode * ) * numverts, "cloth_edgelist_alloc" );
+ for ( i = 0; i < numverts; i++ )
+ {
+ edgelist[i] = NULL;
+ }
+
+ if ( cloth->springs )
+ MEM_freeN ( cloth->springs );
+
+ // create spring network hash
+ edgehash = BLI_edgehash_new();
+
+ // structural springs
+ for ( i = 0; i < numedges; i++ )
+ {
+ spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
+
+ if ( spring )
+ {
+ spring->ij = medge[i].v1;
+ spring->kl = medge[i].v2;
+ VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x );
+ spring->restlen = sqrt ( INPR ( temp, temp ) );
+ clmd->coll_parms->avg_spring_len += spring->restlen;
+ spring->type = CLOTH_SPRING_TYPE_STRUCTURAL;
+ spring->flags = 0;
+ spring->stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0;
+ struct_springs++;
+
+ if(!i)
+ node2 = BLI_linklist_append_fast ( &cloth->springs, spring );
+ else
+ node2 = BLI_linklist_append_fast ( &node->next, spring );
+ node = node2;
+ }
+ }
+
+ clmd->coll_parms->avg_spring_len /= struct_springs;
+
+ // shear springs
+ for ( i = 0; i < numfaces; i++ )
+ {
+ spring = ( ClothSpring *) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
+
+ spring->ij = mface[i].v1;
+ spring->kl = mface[i].v3;
+ VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x );
+ spring->restlen = sqrt ( INPR ( temp, temp ) );
+ spring->type = CLOTH_SPRING_TYPE_SHEAR;
+ spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0;
+
+ BLI_linklist_append ( &edgelist[spring->ij], spring );
+ BLI_linklist_append ( &edgelist[spring->kl], spring );
+ shear_springs++;
+
+ node2 = BLI_linklist_append_fast ( &node->next, spring );
+ node = node2;
+
+ if ( mface[i].v4 )
+ {
+ spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
+
+ spring->ij = mface[i].v2;
+ spring->kl = mface[i].v4;
+ VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x );
+ spring->restlen = sqrt ( INPR ( temp, temp ) );
+ spring->type = CLOTH_SPRING_TYPE_SHEAR;
+ spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0;
+
+ BLI_linklist_append ( &edgelist[spring->ij], spring );
+ BLI_linklist_append ( &edgelist[spring->kl], spring );
+ shear_springs++;
+
+ node2 = BLI_linklist_append_fast ( &node->next, spring );
+ node = node2;
+ }
+ }
+
+ // bending springs
+ search2 = cloth->springs;
+ for ( i = struct_springs; i < struct_springs+shear_springs; i++ )
+ {
+ if ( !search2 )
+ break;
+
+ tspring2 = search2->link;
+ search = edgelist[tspring2->kl];
+ while ( search )
+ {
+ tspring = search->link;
+ index2 = ( ( tspring->ij==tspring2->kl ) ? ( tspring->kl ) : ( tspring->ij ) );
+
+ // check for existing spring
+ // check also if startpoint is equal to endpoint
+ if ( !BLI_edgehash_haskey ( edgehash, index2, tspring2->ij )
+ && !BLI_edgehash_haskey ( edgehash, tspring2->ij, index2 )
+ && ( index2!=tspring2->ij ) )
+ {
+ spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
+
+ spring->ij = tspring2->ij;
+ spring->kl = index2;
+ VECSUB ( temp, cloth->verts[index2].x, cloth->verts[tspring2->ij].x );
+ spring->restlen = sqrt ( INPR ( temp, temp ) );
+ spring->type = CLOTH_SPRING_TYPE_BENDING;
+ spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0;
+ BLI_edgehash_insert ( edgehash, spring->ij, index2, NULL );
+ bend_springs++;
+
+ node2 = BLI_linklist_append_fast ( &node->next, spring );
+ node = node2;
+ }
+ search = search->next;
+ }
+ search2 = search2->next;
+ }
+
+ cloth->numsprings = struct_springs + shear_springs + bend_springs;
+
+ for ( i = 0; i < numverts; i++ )
+ {
+ BLI_linklist_free ( edgelist[i],NULL );
+ }
+ if ( edgelist )
+ MEM_freeN ( edgelist );
+
+ BLI_edgehash_free ( edgehash, NULL );
+
+ if(G.rt>0)
+ printf("avg_len: %f\n",clmd->coll_parms->avg_spring_len);
+
+ return 1;
+
+} /* cloth_build_springs */
+/***************************************************************************************
+* SPRING NETWORK BUILDING IMPLEMENTATION END
+***************************************************************************************/
+
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
new file mode 100644
index 00000000000..7304ae09ef8
--- /dev/null
+++ b/source/blender/blenkernel/intern/collision.c
@@ -0,0 +1,1224 @@
+/* collision.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) Blender Foundation
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "MEM_guardedalloc.h"
+/* types */
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_cloth_types.h"
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_modifier_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_edgehash.h"
+#include "BLI_linklist.h"
+#include "BKE_curve.h"
+#include "BKE_deform.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_displist.h"
+#include "BKE_effect.h"
+#include "BKE_global.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+#include "BKE_cloth.h"
+#include "BKE_modifier.h"
+#include "BKE_utildefines.h"
+#include "BKE_DerivedMesh.h"
+#include "DNA_screen_types.h"
+#include "BSE_headerbuttons.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+#include "mydevice.h"
+
+#include "Bullet-C-Api.h"
+
+/***********************************
+Collision modifier code start
+***********************************/
+
+/* step is limited from 0 (frame start position) to 1 (frame end position) */
+void collision_move_object(CollisionModifierData *collmd, float step, float prevstep)
+{
+ float tv[3] = {0,0,0};
+ unsigned int i = 0;
+
+ for ( i = 0; i < collmd->numverts; i++ )
+ {
+ VECSUB(tv, collmd->xnew[i].co, collmd->x[i].co);
+ VECADDS(collmd->current_x[i].co, collmd->x[i].co, tv, prevstep);
+ VECADDS(collmd->current_xnew[i].co, collmd->x[i].co, tv, step);
+ VECSUB(collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co);
+ }
+}
+
+/* build bounding volume hierarchy from mverts (see kdop.c for whole BVH code) */
+BVH *bvh_build_from_mvert (MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon)
+{
+ BVH *bvh=NULL;
+
+ bvh = MEM_callocN(sizeof(BVH), "BVH");
+ if (bvh == NULL)
+ {
+ printf("bvh: Out of memory.\n");
+ return NULL;
+ }
+
+ bvh->flags = 0;
+ bvh->leaf_tree = NULL;
+ bvh->leaf_root = NULL;
+ bvh->tree = NULL;
+
+ bvh->epsilon = epsilon;
+ bvh->numfaces = numfaces;
+ bvh->mfaces = mfaces;
+
+ // we have no faces, we save seperate points
+ if(!mfaces)
+ {
+ bvh->numfaces = numverts;
+ }
+
+ bvh->numverts = numverts;
+ bvh->current_x = MEM_dupallocN(x);
+ bvh->current_xold = MEM_dupallocN(x);
+
+ bvh_build(bvh);
+
+ return bvh;
+}
+
+void bvh_update_from_mvert(BVH * bvh, MVert *x, unsigned int numverts, MVert *xnew, int moving)
+{
+ if(!bvh)
+ return;
+
+ if(numverts!=bvh->numverts)
+ return;
+
+ if(x)
+ memcpy(bvh->current_xold, x, sizeof(MVert) * numverts);
+
+ if(xnew)
+ memcpy(bvh->current_x, xnew, sizeof(MVert) * numverts);
+
+ bvh_update(bvh, moving);
+}
+
+/***********************************
+Collision modifier code end
+***********************************/
+
+/**
+ * gsl_poly_solve_cubic -
+ *
+ * copied from SOLVE_CUBIC.C --> GSL
+ */
+
+/* DG: debug hint! don't forget that all functions were "fabs", "sinf", etc before */
+#define mySWAP(a,b) { float tmp = b ; b = a ; a = tmp ; }
+
+int gsl_poly_solve_cubic (float a, float b, float c, float *x0, float *x1, float *x2)
+{
+ float q = (a * a - 3 * b);
+ float r = (2 * a * a * a - 9 * a * b + 27 * c);
+
+ float Q = q / 9;
+ float R = r / 54;
+
+ float Q3 = Q * Q * Q;
+ float R2 = R * R;
+
+ float CR2 = 729 * r * r;
+ float CQ3 = 2916 * q * q * q;
+
+ if (R == 0 && Q == 0)
+ {
+ *x0 = - a / 3 ;
+ *x1 = - a / 3 ;
+ *x2 = - a / 3 ;
+ return 3 ;
+ }
+ else if (CR2 == CQ3)
+ {
+ /* this test is actually R2 == Q3, written in a form suitable
+ for exact computation with integers */
+
+ /* Due to finite precision some float roots may be missed, and
+ considered to be a pair of complex roots z = x +/- epsilon i
+ close to the real axis. */
+
+ float sqrtQ = sqrt (Q);
+
+ if (R > 0)
+ {
+ *x0 = -2 * sqrtQ - a / 3;
+ *x1 = sqrtQ - a / 3;
+ *x2 = sqrtQ - a / 3;
+ }
+ else
+ {
+ *x0 = - sqrtQ - a / 3;
+ *x1 = - sqrtQ - a / 3;
+ *x2 = 2 * sqrtQ - a / 3;
+ }
+ return 3 ;
+ }
+ else if (CR2 < CQ3) /* equivalent to R2 < Q3 */
+ {
+ float sqrtQ = sqrt (Q);
+ float sqrtQ3 = sqrtQ * sqrtQ * sqrtQ;
+ float theta = acos (R / sqrtQ3);
+ float norm = -2 * sqrtQ;
+ *x0 = norm * cos (theta / 3) - a / 3;
+ *x1 = norm * cos ((theta + 2.0 * M_PI) / 3) - a / 3;
+ *x2 = norm * cos ((theta - 2.0 * M_PI) / 3) - a / 3;
+
+ /* Sort *x0, *x1, *x2 into increasing order */
+
+ if (*x0 > *x1)
+ mySWAP(*x0, *x1) ;
+
+ if (*x1 > *x2)
+ {
+ mySWAP(*x1, *x2) ;
+
+ if (*x0 > *x1)
+ mySWAP(*x0, *x1) ;
+ }
+
+ return 3;
+ }
+ else
+ {
+ float sgnR = (R >= 0 ? 1 : -1);
+ float A = -sgnR * pow (ABS (R) + sqrt (R2 - Q3), 1.0/3.0);
+ float B = Q / A ;
+ *x0 = A + B - a / 3;
+ return 1;
+ }
+}
+
+
+/**
+ * gsl_poly_solve_quadratic
+ *
+ * copied from GSL
+ */
+int gsl_poly_solve_quadratic (float a, float b, float c, float *x0, float *x1)
+{
+ float disc = b * b - 4 * a * c;
+
+ if (disc > 0)
+ {
+ if (b == 0)
+ {
+ float r = ABS (0.5 * sqrt (disc) / a);
+ *x0 = -r;
+ *x1 = r;
+ }
+ else
+ {
+ float sgnb = (b > 0 ? 1 : -1);
+ float temp = -0.5 * (b + sgnb * sqrt (disc));
+ float r1 = temp / a ;
+ float r2 = c / temp ;
+
+ if (r1 < r2)
+ {
+ *x0 = r1 ;
+ *x1 = r2 ;
+ }
+ else
+ {
+ *x0 = r2 ;
+ *x1 = r1 ;
+ }
+ }
+ return 2;
+ }
+ else if (disc == 0)
+ {
+ *x0 = -0.5 * b / a ;
+ *x1 = -0.5 * b / a ;
+ return 2 ;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
+
+/*
+ * See Bridson et al. "Robust Treatment of Collision, Contact and Friction for Cloth Animation"
+ * page 4, left column
+ */
+
+int cloth_get_collision_time(float a[3], float b[3], float c[3], float d[3], float e[3], float f[3], float solution[3])
+{
+ int num_sols = 0;
+
+ float g = -a[2] * c[1] * e[0] + a[1] * c[2] * e[0] +
+ a[2] * c[0] * e[1] - a[0] * c[2] * e[1] -
+ a[1] * c[0] * e[2] + a[0] * c[1] * e[2];
+
+ float h = -b[2] * c[1] * e[0] + b[1] * c[2] * e[0] - a[2] * d[1] * e[0] +
+ a[1] * d[2] * e[0] + b[2] * c[0] * e[1] - b[0] * c[2] * e[1] +
+ a[2] * d[0] * e[1] - a[0] * d[2] * e[1] - b[1] * c[0] * e[2] +
+ b[0] * c[1] * e[2] - a[1] * d[0] * e[2] + a[0] * d[1] * e[2] -
+ a[2] * c[1] * f[0] + a[1] * c[2] * f[0] + a[2] * c[0] * f[1] -
+ a[0] * c[2] * f[1] - a[1] * c[0] * f[2] + a[0] * c[1] * f[2];
+
+ float i = -b[2] * d[1] * e[0] + b[1] * d[2] * e[0] +
+ b[2] * d[0] * e[1] - b[0] * d[2] * e[1] -
+ b[1] * d[0] * e[2] + b[0] * d[1] * e[2] -
+ b[2] * c[1] * f[0] + b[1] * c[2] * f[0] -
+ a[2] * d[1] * f[0] + a[1] * d[2] * f[0] +
+ b[2] * c[0] * f[1] - b[0] * c[2] * f[1] +
+ a[2] * d[0] * f[1] - a[0] * d[2] * f[1] -
+ b[1] * c[0] * f[2] + b[0] * c[1] * f[2] -
+ a[1] * d[0] * f[2] + a[0] * d[1] * f[2];
+
+ float j = -b[2] * d[1] * f[0] + b[1] * d[2] * f[0] +
+ b[2] * d[0] * f[1] - b[0] * d[2] * f[1] -
+ b[1] * d[0] * f[2] + b[0] * d[1] * f[2];
+
+ // Solve cubic equation to determine times t1, t2, t3, when the collision will occur.
+ if(ABS(j) > ALMOST_ZERO)
+ {
+ i /= j;
+ h /= j;
+ g /= j;
+
+ num_sols = gsl_poly_solve_cubic(i, h, g, &solution[0], &solution[1], &solution[2]);
+ }
+ else if(ABS(i) > ALMOST_ZERO)
+ {
+ num_sols = gsl_poly_solve_quadratic(i, h, g, &solution[0], &solution[1]);
+ solution[2] = -1.0;
+ }
+ else if(ABS(h) > ALMOST_ZERO)
+ {
+ solution[0] = -g / h;
+ solution[1] = solution[2] = -1.0;
+ num_sols = 1;
+ }
+ else if(ABS(g) > ALMOST_ZERO)
+ {
+ solution[0] = 0;
+ solution[1] = solution[2] = -1.0;
+ num_sols = 1;
+ }
+
+ // Discard negative solutions
+ if ((num_sols >= 1) && (solution[0] < 0))
+ {
+ --num_sols;
+ solution[0] = solution[num_sols];
+ }
+ if ((num_sols >= 2) && (solution[1] < 0))
+ {
+ --num_sols;
+ solution[1] = solution[num_sols];
+ }
+ if ((num_sols == 3) && (solution[2] < 0))
+ {
+ --num_sols;
+ }
+
+ // Sort
+ if (num_sols == 2)
+ {
+ if (solution[0] > solution[1])
+ {
+ double tmp = solution[0];
+ solution[0] = solution[1];
+ solution[1] = tmp;
+ }
+ }
+ else if (num_sols == 3)
+ {
+
+ // Bubblesort
+ if (solution[0] > solution[1]) {
+ double tmp = solution[0]; solution[0] = solution[1]; solution[1] = tmp;
+ }
+ if (solution[1] > solution[2]) {
+ double tmp = solution[1]; solution[1] = solution[2]; solution[2] = tmp;
+ }
+ if (solution[0] > solution[1]) {
+ double tmp = solution[0]; solution[0] = solution[1]; solution[1] = tmp;
+ }
+ }
+
+ return num_sols;
+}
+
+// w3 is not perfect
+void cloth_compute_barycentric (float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3)
+{
+ double tempV1[3], tempV2[3], tempV4[3];
+ double a,b,c,d,e,f;
+
+ VECSUB (tempV1, p1, p3);
+ VECSUB (tempV2, p2, p3);
+ VECSUB (tempV4, pv, p3);
+
+ a = INPR (tempV1, tempV1);
+ b = INPR (tempV1, tempV2);
+ c = INPR (tempV2, tempV2);
+ e = INPR (tempV1, tempV4);
+ f = INPR (tempV2, tempV4);
+
+ d = (a * c - b * b);
+
+ if (ABS(d) < ALMOST_ZERO) {
+ *w1 = *w2 = *w3 = 1.0 / 3.0;
+ return;
+ }
+
+ w1[0] = (float)((e * c - b * f) / d);
+
+ if(w1[0] < 0)
+ w1[0] = 0;
+
+ w2[0] = (float)((f - b * (double)w1[0]) / c);
+
+ if(w2[0] < 0)
+ w2[0] = 0;
+
+ w3[0] = 1.0f - w1[0] - w2[0];
+}
+
+DO_INLINE void interpolateOnTriangle(float to[3], float v1[3], float v2[3], float v3[3], double w1, double w2, double w3)
+{
+ to[0] = to[1] = to[2] = 0;
+ VECADDMUL(to, v1, w1);
+ VECADDMUL(to, v2, w2);
+ VECADDMUL(to, v3, w3);
+}
+
+int cloth_collision_response_static(ClothModifierData *clmd, CollisionModifierData *collmd)
+{
+ unsigned int i = 0;
+ int result = 0;
+ LinkNode *search = NULL;
+ CollPair *collpair = NULL;
+ Cloth *cloth1;
+ float w1, w2, w3, u1, u2, u3;
+ float v1[3], v2[3], relativeVelocity[3];
+ float magrelVel;
+
+ cloth1 = clmd->clothObject;
+
+ search = clmd->coll_parms->collision_list;
+
+ while(search)
+ {
+ collpair = search->link;
+
+ // compute barycentric coordinates for both collision points
+ cloth_compute_barycentric(collpair->pa,
+ cloth1->verts[collpair->ap1].txold,
+ cloth1->verts[collpair->ap2].txold,
+ cloth1->verts[collpair->ap3].txold,
+ &w1, &w2, &w3);
+
+ // was: txold
+ cloth_compute_barycentric(collpair->pb,
+ collmd->current_x[collpair->bp1].co,
+ collmd->current_x[collpair->bp2].co,
+ collmd->current_x[collpair->bp3].co,
+ &u1, &u2, &u3);
+
+ // Calculate relative "velocity".
+ interpolateOnTriangle(v1, cloth1->verts[collpair->ap1].tv, cloth1->verts[collpair->ap2].tv, cloth1->verts[collpair->ap3].tv, w1, w2, w3);
+
+ interpolateOnTriangle(v2, collmd->current_v[collpair->bp1].co, collmd->current_v[collpair->bp2].co, collmd->current_v[collpair->bp3].co, u1, u2, u3);
+
+ VECSUB(relativeVelocity, v1, v2);
+
+ // Calculate the normal component of the relative velocity (actually only the magnitude - the direction is stored in 'normal').
+ magrelVel = INPR(relativeVelocity, collpair->normal);
+
+ // printf("magrelVel: %f\n", magrelVel);
+
+ // Calculate masses of points.
+ // TODO
+
+ // If v_n_mag < 0 the edges are approaching each other.
+ if(magrelVel < -ALMOST_ZERO)
+ {
+ // Calculate Impulse magnitude to stop all motion in normal direction.
+ float magnitude_i = magrelVel / 2.0; // TODO implement masses
+ float tangential[3], magtangent, magnormal;
+ double impulse = 0.0;
+ float epsilon = clmd->coll_parms->epsilon;
+ float vrel_t_pre[3];
+ float vrel_t[3], temp[3];
+
+ VECCOPY(temp, collpair->normal);
+ VecMulf(temp, magrelVel);
+ VECSUB(vrel_t_pre, relativeVelocity, temp);
+
+ VECCOPY(vrel_t, vrel_t_pre);
+
+ VecMulf(vrel_t, MAX2(1.0 - (clmd->coll_parms->friction * magrelVel / sqrt(INPR(vrel_t_pre,vrel_t_pre))), 0));
+
+ VECSUB(tangential, vrel_t_pre, vrel_t);
+ VecMulf(tangential, 0.5);
+
+ // i_tangential = tangential
+ magtangent = INPR(tangential, tangential);
+
+ // Apply friction impulse.
+ if (magtangent > ALMOST_ZERO)
+ {
+ impulse = magtangent / ( 1.0 + w1*w1 + w2*w2 + w3*w3);
+ VECADDMUL(cloth1->verts[collpair->ap1].impulse, tangential, w1 * impulse/magtangent);
+ VECADDMUL(cloth1->verts[collpair->ap2].impulse, tangential, w2 * impulse/magtangent);
+ VECADDMUL(cloth1->verts[collpair->ap3].impulse, tangential, w3 * impulse/magtangent);
+ }
+
+
+ impulse = -2.0f * magrelVel / ( 1.0 + w1*w1 + w2*w2 + w3*w3);
+
+ VECADDMUL(cloth1->verts[collpair->ap1].impulse, collpair->normal, w1 * impulse);
+ cloth1->verts[collpair->ap1].impulse_count++;
+
+ VECADDMUL(cloth1->verts[collpair->ap2].impulse, collpair->normal, w2 * impulse);
+ cloth1->verts[collpair->ap2].impulse_count++;
+
+ VECADDMUL(cloth1->verts[collpair->ap3].impulse, collpair->normal, w3 * impulse);
+ cloth1->verts[collpair->ap3].impulse_count++;
+
+ result = 1;
+ }
+
+ search = search->next;
+ }
+
+
+ return result;
+}
+
+int cloth_collision_response_moving_tris(ClothModifierData *clmd, ClothModifierData *coll_clmd)
+{
+ return 1;
+}
+
+
+int cloth_collision_response_moving_edges(ClothModifierData *clmd, ClothModifierData *coll_clmd)
+{
+ return 1;
+}
+
+void cloth_collision_static(ClothModifierData *clmd, CollisionModifierData *collmd, CollisionTree *tree1, CollisionTree *tree2)
+{
+ CollPair *collpair = NULL;
+ Cloth *cloth1=NULL;
+ MFace *face1=NULL, *face2=NULL;
+ ClothVertex *verts1=NULL;
+ double distance = 0;
+ float epsilon = clmd->coll_parms->epsilon;
+ unsigned int i = 0;
+
+ for(i = 0; i < 4; i++)
+ {
+ collpair = (CollPair *)MEM_callocN(sizeof(CollPair), "cloth coll pair");
+
+ cloth1 = clmd->clothObject;
+
+ verts1 = cloth1->verts;
+
+ face1 = &(cloth1->mfaces[tree1->tri_index]);
+ face2 = &(collmd->mfaces[tree2->tri_index]);
+
+ // check all possible pairs of triangles
+ if(i == 0)
+ {
+ collpair->ap1 = face1->v1;
+ collpair->ap2 = face1->v2;
+ collpair->ap3 = face1->v3;
+
+ collpair->bp1 = face2->v1;
+ collpair->bp2 = face2->v2;
+ collpair->bp3 = face2->v3;
+
+ }
+
+ if(i == 1)
+ {
+ if(face1->v4)
+ {
+ collpair->ap1 = face1->v3;
+ collpair->ap2 = face1->v4;
+ collpair->ap3 = face1->v1;
+
+ collpair->bp1 = face2->v1;
+ collpair->bp2 = face2->v2;
+ collpair->bp3 = face2->v3;
+ }
+ else
+ i++;
+ }
+
+ if(i == 2)
+ {
+ if(face2->v4)
+ {
+ collpair->ap1 = face1->v1;
+ collpair->ap2 = face1->v2;
+ collpair->ap3 = face1->v3;
+
+ collpair->bp1 = face2->v3;
+ collpair->bp2 = face2->v4;
+ collpair->bp3 = face2->v1;
+ }
+ else
+ i+=2;
+ }
+
+ if(i == 3)
+ {
+ if((face1->v4)&&(face2->v4))
+ {
+ collpair->ap1 = face1->v3;
+ collpair->ap2 = face1->v4;
+ collpair->ap3 = face1->v1;
+
+ collpair->bp1 = face2->v3;
+ collpair->bp2 = face2->v4;
+ collpair->bp3 = face2->v1;
+ }
+ else
+ i++;
+ }
+
+ // calc SIPcode (?)
+
+ if(i < 4)
+ {
+ // calc distance + normal
+#if WITH_BULLET == 1
+ distance = plNearestPoints(
+ verts1[collpair->ap1].txold, verts1[collpair->ap2].txold, verts1[collpair->ap3].txold, collmd->current_x[collpair->bp1].co, collmd->current_x[collpair->bp2].co, collmd->current_x[collpair->bp3].co, collpair->pa,collpair->pb,collpair->vector);
+#else
+ // just be sure that we don't add anything
+ distance = 2.0 * (epsilon + ALMOST_ZERO);
+#endif
+ if (distance <= (epsilon + ALMOST_ZERO))
+ {
+ // printf("dist: %f\n", (float)distance);
+
+ // collpair->face1 = tree1->tri_index;
+ // collpair->face2 = tree2->tri_index;
+
+ VECCOPY(collpair->normal, collpair->vector);
+ Normalize(collpair->normal);
+
+ collpair->distance = distance;
+ BLI_linklist_prepend(&clmd->coll_parms->collision_list, collpair);
+
+ }
+ else
+ {
+ MEM_freeN(collpair);
+ }
+ }
+ else
+ {
+ MEM_freeN(collpair);
+ }
+ }
+}
+
+int cloth_are_edges_adjacent(ClothModifierData *clmd, ClothModifierData *coll_clmd, EdgeCollPair *edgecollpair)
+{
+ Cloth *cloth1 = NULL, *cloth2 = NULL;
+ ClothVertex *verts1 = NULL, *verts2 = NULL;
+ float temp[3];
+
+ cloth1 = clmd->clothObject;
+ cloth2 = coll_clmd->clothObject;
+
+ verts1 = cloth1->verts;
+ verts2 = cloth2->verts;
+
+ VECSUB(temp, verts1[edgecollpair->p11].xold, verts2[edgecollpair->p21].xold);
+ if(ABS(INPR(temp, temp)) < ALMOST_ZERO)
+ return 1;
+
+ VECSUB(temp, verts1[edgecollpair->p11].xold, verts2[edgecollpair->p22].xold);
+ if(ABS(INPR(temp, temp)) < ALMOST_ZERO)
+ return 1;
+
+ VECSUB(temp, verts1[edgecollpair->p12].xold, verts2[edgecollpair->p21].xold);
+ if(ABS(INPR(temp, temp)) < ALMOST_ZERO)
+ return 1;
+
+ VECSUB(temp, verts1[edgecollpair->p12].xold, verts2[edgecollpair->p22].xold);
+ if(ABS(INPR(temp, temp)) < ALMOST_ZERO)
+ return 1;
+
+ return 0;
+}
+
+void cloth_collision_moving_edges(ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree *tree1, CollisionTree *tree2)
+{
+ EdgeCollPair edgecollpair;
+ Cloth *cloth1=NULL, *cloth2=NULL;
+ MFace *face1=NULL, *face2=NULL;
+ ClothVertex *verts1=NULL, *verts2=NULL;
+ double distance = 0;
+ float epsilon = clmd->coll_parms->epsilon;
+ unsigned int i = 0, j = 0, k = 0;
+ int numsolutions = 0;
+ float a[3], b[3], c[3], d[3], e[3], f[3], solution[3];
+
+ cloth1 = clmd->clothObject;
+ cloth2 = coll_clmd->clothObject;
+
+ verts1 = cloth1->verts;
+ verts2 = cloth2->verts;
+
+ face1 = &(cloth1->mfaces[tree1->tri_index]);
+ face2 = &(cloth2->mfaces[tree2->tri_index]);
+
+ for( i = 0; i < 5; i++)
+ {
+ if(i == 0)
+ {
+ edgecollpair.p11 = face1->v1;
+ edgecollpair.p12 = face1->v2;
+ }
+ else if(i == 1)
+ {
+ edgecollpair.p11 = face1->v2;
+ edgecollpair.p12 = face1->v3;
+ }
+ else if(i == 2)
+ {
+ if(face1->v4)
+ {
+ edgecollpair.p11 = face1->v3;
+ edgecollpair.p12 = face1->v4;
+ }
+ else
+ {
+ edgecollpair.p11 = face1->v3;
+ edgecollpair.p12 = face1->v1;
+ i+=5; // get out of here after this edge pair is handled
+ }
+ }
+ else if(i == 3)
+ {
+ if(face1->v4)
+ {
+ edgecollpair.p11 = face1->v4;
+ edgecollpair.p12 = face1->v1;
+ }
+ else
+ continue;
+ }
+ else
+ {
+ edgecollpair.p11 = face1->v3;
+ edgecollpair.p12 = face1->v1;
+ }
+
+
+ for( j = 0; j < 5; j++)
+ {
+ if(j == 0)
+ {
+ edgecollpair.p21 = face2->v1;
+ edgecollpair.p22 = face2->v2;
+ }
+ else if(j == 1)
+ {
+ edgecollpair.p21 = face2->v2;
+ edgecollpair.p22 = face2->v3;
+ }
+ else if(j == 2)
+ {
+ if(face2->v4)
+ {
+ edgecollpair.p21 = face2->v3;
+ edgecollpair.p22 = face2->v4;
+ }
+ else
+ {
+ edgecollpair.p21 = face2->v3;
+ edgecollpair.p22 = face2->v1;
+ }
+ }
+ else if(j == 3)
+ {
+ if(face2->v4)
+ {
+ edgecollpair.p21 = face2->v4;
+ edgecollpair.p22 = face2->v1;
+ }
+ else
+ continue;
+ }
+ else
+ {
+ edgecollpair.p21 = face2->v3;
+ edgecollpair.p22 = face2->v1;
+ }
+
+
+ if(!cloth_are_edges_adjacent(clmd, coll_clmd, &edgecollpair))
+ {
+ VECSUB(a, verts1[edgecollpair.p12].xold, verts1[edgecollpair.p11].xold);
+ VECSUB(b, verts1[edgecollpair.p12].v, verts1[edgecollpair.p11].v);
+ VECSUB(c, verts1[edgecollpair.p21].xold, verts1[edgecollpair.p11].xold);
+ VECSUB(d, verts1[edgecollpair.p21].v, verts1[edgecollpair.p11].v);
+ VECSUB(e, verts2[edgecollpair.p22].xold, verts1[edgecollpair.p11].xold);
+ VECSUB(f, verts2[edgecollpair.p22].v, verts1[edgecollpair.p11].v);
+
+ numsolutions = cloth_get_collision_time(a, b, c, d, e, f, solution);
+
+ for (k = 0; k < numsolutions; k++)
+ {
+ if ((solution[k] >= 0.0) && (solution[k] <= 1.0))
+ {
+ float out_collisionTime = solution[k];
+
+ // TODO: check for collisions
+
+ // TODO: put into (edge) collision list
+
+ // printf("Moving edge found!\n");
+ }
+ }
+ }
+ }
+ }
+}
+
+void cloth_collision_moving_tris(ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree *tree1, CollisionTree *tree2)
+{
+ CollPair collpair;
+ Cloth *cloth1=NULL, *cloth2=NULL;
+ MFace *face1=NULL, *face2=NULL;
+ ClothVertex *verts1=NULL, *verts2=NULL;
+ double distance = 0;
+ float epsilon = clmd->coll_parms->epsilon;
+ unsigned int i = 0, j = 0, k = 0;
+ int numsolutions = 0;
+ float a[3], b[3], c[3], d[3], e[3], f[3], solution[3];
+
+ for(i = 0; i < 2; i++)
+ {
+ cloth1 = clmd->clothObject;
+ cloth2 = coll_clmd->clothObject;
+
+ verts1 = cloth1->verts;
+ verts2 = cloth2->verts;
+
+ face1 = &(cloth1->mfaces[tree1->tri_index]);
+ face2 = &(cloth2->mfaces[tree2->tri_index]);
+
+ // check all possible pairs of triangles
+ if(i == 0)
+ {
+ collpair.ap1 = face1->v1;
+ collpair.ap2 = face1->v2;
+ collpair.ap3 = face1->v3;
+
+ collpair.pointsb[0] = face2->v1;
+ collpair.pointsb[1] = face2->v2;
+ collpair.pointsb[2] = face2->v3;
+ collpair.pointsb[3] = face2->v4;
+ }
+
+ if(i == 1)
+ {
+ if(face1->v4)
+ {
+ collpair.ap1 = face1->v3;
+ collpair.ap2 = face1->v4;
+ collpair.ap3 = face1->v1;
+
+ collpair.pointsb[0] = face2->v1;
+ collpair.pointsb[1] = face2->v2;
+ collpair.pointsb[2] = face2->v3;
+ collpair.pointsb[3] = face2->v4;
+ }
+ else
+ i++;
+ }
+
+ // calc SIPcode (?)
+
+ if(i < 2)
+ {
+ VECSUB(a, verts1[collpair.ap2].xold, verts1[collpair.ap1].xold);
+ VECSUB(b, verts1[collpair.ap2].v, verts1[collpair.ap1].v);
+ VECSUB(c, verts1[collpair.ap3].xold, verts1[collpair.ap1].xold);
+ VECSUB(d, verts1[collpair.ap3].v, verts1[collpair.ap1].v);
+
+ for(j = 0; j < 4; j++)
+ {
+ if((j==3) && !(face2->v4))
+ break;
+
+ VECSUB(e, verts2[collpair.pointsb[j]].xold, verts1[collpair.ap1].xold);
+ VECSUB(f, verts2[collpair.pointsb[j]].v, verts1[collpair.ap1].v);
+
+ numsolutions = cloth_get_collision_time(a, b, c, d, e, f, solution);
+
+ for (k = 0; k < numsolutions; k++)
+ {
+ if ((solution[k] >= 0.0) && (solution[k] <= 1.0))
+ {
+ float out_collisionTime = solution[k];
+
+ // TODO: check for collisions
+
+ // TODO: put into (point-face) collision list
+
+ // printf("Moving found!\n");
+
+ }
+ }
+
+ // TODO: check borders for collisions
+ }
+
+ }
+ }
+}
+
+void cloth_collision_moving(ClothModifierData *clmd, ClothModifierData *coll_clmd, CollisionTree *tree1, CollisionTree *tree2)
+{
+ // TODO: check for adjacent
+ cloth_collision_moving_edges(clmd, coll_clmd, tree1, tree2);
+
+ cloth_collision_moving_tris(clmd, coll_clmd, tree1, tree2);
+ cloth_collision_moving_tris(coll_clmd, clmd, tree2, tree1);
+}
+
+// cloth - object collisions
+int cloth_bvh_objcollision(ClothModifierData * clmd, float step, float dt)
+{
+ Base *base=NULL;
+ CollisionModifierData *collmd=NULL;
+ Cloth *cloth=NULL;
+ Object *coll_ob=NULL;
+ BVH *cloth_bvh=NULL;
+ unsigned int i=0, j = 0, numfaces = 0, numverts = 0;
+ unsigned int result = 0, ic = 0, rounds = 0; // result counts applied collisions; ic is for debug output;
+ ClothVertex *verts = NULL;
+ float tnull[3] = {0,0,0};
+ int ret = 0;
+ ClothModifierData *tclmd;
+
+ if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ) || !(((Cloth *)clmd->clothObject)->tree))
+ {
+ return 0;
+ }
+
+ cloth = clmd->clothObject;
+ verts = cloth->verts;
+ cloth_bvh = (BVH *) cloth->tree;
+ numfaces = clmd->clothObject->numfaces;
+ numverts = clmd->clothObject->numverts;
+
+ ////////////////////////////////////////////////////////////
+ // static collisions
+ ////////////////////////////////////////////////////////////
+
+ // update cloth bvh
+ bvh_update_from_cloth(clmd, 0); // 0 means STATIC, 1 means MOVING (see later in this function)
+
+ do
+ {
+ result = 0;
+ ic = 0;
+ clmd->coll_parms->collision_list = NULL;
+
+ // check all collision objects
+ for (base = G.scene->base.first; base; base = base->next)
+ {
+ coll_ob = base->object;
+ collmd = (CollisionModifierData *) modifiers_findByType (coll_ob, eModifierType_Collision);
+
+ if (!collmd)
+ continue;
+
+ tclmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
+ if(tclmd == clmd)
+ continue;
+
+ if (collmd->tree)
+ {
+ BVH *coll_bvh = collmd->tree;
+
+ collision_move_object(collmd, step + dt, step);
+
+ bvh_traverse(clmd, collmd, cloth_bvh->root, coll_bvh->root, step, cloth_collision_static);
+ }
+ else
+ printf ("cloth_bvh_objcollision: found a collision object with clothObject or collData NULL.\n");
+
+
+ // process all collisions (calculate impulses, TODO: also repulses if distance too short)
+ result = 1;
+ for(j = 0; j < 10; j++) // 10 is just a value that ensures convergence
+ {
+ result = 0;
+
+ if (collmd->tree)
+ result += cloth_collision_response_static(clmd, collmd);
+
+
+ // apply impulses in parallel
+ ic=0;
+ for(i = 0; i < numverts; i++)
+ {
+ // calculate "velocities" (just xnew = xold + v; no dt in v)
+ if(verts[i].impulse_count)
+ {
+ VECADDMUL(verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count);
+ VECCOPY(verts[i].impulse, tnull);
+ verts[i].impulse_count = 0;
+
+ ic++;
+ ret++;
+ }
+ }
+ }
+
+ // free collision list
+ if(clmd->coll_parms->collision_list)
+ {
+ LinkNode *search = clmd->coll_parms->collision_list;
+ while(search)
+ {
+ CollPair *coll_pair = search->link;
+
+ MEM_freeN(coll_pair);
+ search = search->next;
+ }
+ BLI_linklist_free(clmd->coll_parms->collision_list,NULL);
+
+ clmd->coll_parms->collision_list = NULL;
+ }
+ }
+ rounds++;
+ }
+ while(result && (clmd->coll_parms->loop_count>rounds));
+
+ ////////////////////////////////////////////////////////////
+ // update positions
+ // this is needed for bvh_calc_DOP_hull_moving() [kdop.c]
+ ////////////////////////////////////////////////////////////
+
+ // verts come from clmd
+ for(i = 0; i < numverts; i++)
+ {
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL)
+ {
+ if(verts [i].goal >= SOFTGOALSNAP)
+ {
+ continue;
+ }
+ }
+
+ VECADD(verts[i].tx, verts[i].txold, verts[i].tv);
+ }
+ ////////////////////////////////////////////////////////////
+
+ ////////////////////////////////////////////////////////////
+ // moving collisions
+ //
+ // response code is just missing itm
+ ////////////////////////////////////////////////////////////
+
+ /*
+ // update cloth bvh
+ bvh_update_from_cloth(clmd, 1); // 0 means STATIC, 1 means MOVING
+
+ // update moving bvh for collision object once
+ for (base = G.scene->base.first; base; base = base->next)
+ {
+
+ coll_ob = base->object;
+ coll_clmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
+ if (!coll_clmd)
+ continue;
+
+ if(!coll_clmd->clothObject)
+ continue;
+
+ // if collision object go on
+ if (coll_clmd->clothObject && coll_clmd->clothObject->tree)
+ {
+ BVH *coll_bvh = coll_clmd->clothObject->tree;
+
+ bvh_update_from_cloth(coll_clmd, 1); // 0 means STATIC, 1 means MOVING
+}
+}
+
+
+ do
+ {
+ result = 0;
+ ic = 0;
+ clmd->coll_parms->collision_list = NULL;
+
+ // check all collision objects
+ for (base = G.scene->base.first; base; base = base->next)
+ {
+ coll_ob = base->object;
+ coll_clmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
+
+ if (!coll_clmd)
+ continue;
+
+ // if collision object go on
+ if (coll_clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ)
+ {
+ if (coll_clmd->clothObject && coll_clmd->clothObject->tree)
+ {
+ BVH *coll_bvh = coll_clmd->clothObject->tree;
+
+ bvh_traverse(clmd, coll_clmd, cloth_bvh->root, coll_bvh->root, step, cloth_collision_moving);
+}
+ else
+ printf ("cloth_bvh_objcollision: found a collision object with clothObject or collData NULL.\n");
+}
+}
+
+ // process all collisions (calculate impulses, TODO: also repulses if distance too short)
+ result = 1;
+ for(j = 0; j < 10; j++) // 10 is just a value that ensures convergence
+ {
+ result = 0;
+
+ // handle all collision objects
+ for (base = G.scene->base.first; base; base = base->next)
+ {
+
+ coll_ob = base->object;
+ coll_clmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
+
+ if (!coll_clmd)
+ continue;
+
+ // if collision object go on
+ if (coll_clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ)
+ {
+ if (coll_clmd->clothObject)
+ result += cloth_collision_response_moving_tris(clmd, coll_clmd);
+ else
+ printf ("cloth_bvh_objcollision: found a collision object with clothObject or collData NULL.\n");
+}
+}
+
+ // apply impulses in parallel
+ ic=0;
+ for(i = 0; i < numverts; i++)
+ {
+ // calculate "velocities" (just xnew = xold + v; no dt in v)
+ if(verts[i].impulse_count)
+ {
+ VECADDMUL(verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count);
+ VECCOPY(verts[i].impulse, tnull);
+ verts[i].impulse_count = 0;
+
+ ic++;
+ ret++;
+}
+}
+}
+
+
+ // verts come from clmd
+ for(i = 0; i < numverts; i++)
+ {
+ VECADD(verts[i].tx, verts[i].txold, verts[i].tv);
+}
+
+ // update cloth bvh
+ bvh_update_from_cloth(clmd, 1); // 0 means STATIC, 1 means MOVING
+
+
+ // free collision list
+ if(clmd->coll_parms->collision_list)
+ {
+ LinkNode *search = clmd->coll_parms->collision_list;
+ while(search)
+ {
+ CollPair *coll_pair = search->link;
+
+ MEM_freeN(coll_pair);
+ search = search->next;
+}
+ BLI_linklist_free(clmd->coll_parms->collision_list,NULL);
+
+ clmd->coll_parms->collision_list = NULL;
+}
+
+ // printf("ic: %d\n", ic);
+ rounds++;
+}
+ while(result && (CLOTH_MAX_THRESHOLD>rounds));
+
+ ////////////////////////////////////////////////////////////
+ // update positions + velocities
+ ////////////////////////////////////////////////////////////
+
+ // verts come from clmd
+ for(i = 0; i < numverts; i++)
+ {
+ VECADD(verts[i].tx, verts[i].txold, verts[i].tv);
+}
+ ////////////////////////////////////////////////////////////
+ */
+
+ return MIN2(ret, 1);
+}
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 83b014cdd63..e4336576e2a 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -167,18 +167,30 @@ void curvemap_remove(CurveMap *cuma, int flag)
void curvemap_insert(CurveMap *cuma, float x, float y)
{
CurveMapPoint *cmp= MEM_callocN((cuma->totpoint+1)*sizeof(CurveMapPoint), "curve points");
- int a;
-
- memcpy(cmp, cuma->curve, (cuma->totpoint)*sizeof(CurveMapPoint));
+ int a, b, foundloc= 0;
+
+ /* insert fragments of the old one and the new point to the new curve */
+ cuma->totpoint++;
+ for(a=0, b=0; a<cuma->totpoint; a++) {
+ if((x < cuma->curve[a].x) && !foundloc) {
+ cmp[a].x= x;
+ cmp[a].y= y;
+ cmp[a].flag= CUMA_SELECT;
+ foundloc= 1;
+ }
+ else {
+ cmp[a].x= cuma->curve[b].x;
+ cmp[a].y= cuma->curve[b].y;
+ cmp[a].flag= cuma->curve[b].flag;
+ cmp[a].flag &= ~CUMA_SELECT; /* make sure old points don't remain selected */
+ cmp[a].shorty= cuma->curve[b].shorty;
+ b++;
+ }
+ }
+
+ /* free old curve and replace it with new one */
MEM_freeN(cuma->curve);
cuma->curve= cmp;
-
- cuma->curve[cuma->totpoint].x= x;
- cuma->curve[cuma->totpoint].y= y;
- cuma->curve[cuma->totpoint].flag = CUMA_SELECT;
- for(a=0; a<cuma->totpoint; a++, cmp++)
- cmp->flag= 0;
- cuma->totpoint++;
}
void curvemap_reset(CurveMap *cuma, rctf *clipr)
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 020350d9e6f..38f25b54fd8 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -31,6 +31,7 @@
*/
#include <stdio.h>
+#include <stddef.h>
#include <string.h>
#include <math.h>
@@ -48,6 +49,7 @@
#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"
@@ -79,39 +81,18 @@
#endif
-/* ********************* Data level ****************** */
-
-void free_constraint_data (bConstraint *con)
-{
- if (con->data) {
- /* any constraint-type specific stuff here */
- switch (con->type) {
- case CONSTRAINT_TYPE_PYTHON:
- {
- bPythonConstraint *data= con->data;
- IDP_FreeProperty(data->prop);
- MEM_freeN(data->prop);
- }
- break;
- }
-
- 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;
@@ -125,27 +106,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) {
- /* check if constraint has a target that needs relinking */
- if (constraint_has_target(con)) {
- Object *tar;
- char *subtarget;
-
- tar = get_constraint_target(con, &subtarget);
- ID_NEW(tar);
- }
- }
-}
-
+/* 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) {
@@ -153,11 +121,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) {
@@ -165,632 +136,101 @@ void clone_constraint_channels (ListBase *dst, ListBase *src)
}
}
-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) {
- con->data = MEM_dupallocN (con->data);
-
- /* only do specific constraints if required */
- if (con->type == CONSTRAINT_TYPE_PYTHON) {
- bPythonConstraint *pycon = (bPythonConstraint *)con->data;
- bPythonConstraint *opycon = (bPythonConstraint *)srccon->data;
-
- pycon->prop = IDP_CopyProperty(opycon->prop);
- }
- }
-}
-
-/* **************** Editor Functions **************** */
+/* ------------- Constraint Channel Tools ------------ */
-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_PYTHON:
- {
- bPythonConstraint *data = con->data;
- if (data->tar) return 1;
- }
- break;
- 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;
- }
- break;
- case CONSTRAINT_TYPE_CHILDOF:
- {
- bChildOfConstraint *data = con->data;
- if (data->tar) return 1;
- }
- break;
- case CONSTRAINT_TYPE_TRANSFORM:
- {
- bTransformConstraint *data = con->data;
- if (data->tar) return 1;
- }
- break;
- }
-
- /* Unknown types or CONSTRAINT_TYPE_NULL or no target */
- return 0;
-}
+ bConstraintChannel *chan;
-Object *get_constraint_target(bConstraint *con, char **subtarget)
-{
- /* 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_PYTHON:
- {
- bPythonConstraint *data=con->data;
- *subtarget = data->subtarget;
- return data->tar;
- }
- break;
- 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;
- case CONSTRAINT_TYPE_CHILDOF:
- {
- bChildOfConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_TRANSFORM:
- {
- bTransformConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
+ if(list) {
+ for (chan = list->first; chan; chan=chan->next) {
+ if (!strcmp(name, chan->name)) {
+ return chan;
+ }
}
- break;
- default:
- *subtarget= NULL;
- break;
}
- return NULL;
-}
-
-void set_constraint_target(bConstraint *con, Object *ob, char *subtarget)
-{
- /* Set the target for this constraint */
- switch (con->type) {
- case CONSTRAINT_TYPE_PYTHON:
- {
- bPythonConstraint *data = con->data;
- data->tar= ob;
- if (subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- 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;
- }
- break;
- case CONSTRAINT_TYPE_CHILDOF:
- {
- bChildOfConstraint *data = con->data;
- data->tar= ob;
- if (subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_TRANSFORM:
- {
- bTransformConstraint *data = con->data;
- data->tar= ob;
- if (subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- }
+ return NULL;
}
-void unique_constraint_name (bConstraint *con, ListBase *list)
+/* Find or create a new constraint channel */
+bConstraintChannel *verify_constraint_channel (ListBase *list, const char name[])
{
- bConstraint *curcon;
- char tempname[64];
- int number = 1, exists = 0;
- char *dot;
+ bConstraintChannel *chan;
- /* See if we are given an empty string */
- if (con->name[0] == '\0') {
- /* give it default name first */
- strcpy(con->name, "Const");
- }
+ chan= get_constraint_channel(list, name);
- /* 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)) {
- exists = 1;
- break;
- }
- }
+ if (chan == NULL) {
+ chan= MEM_callocN(sizeof(bConstraintChannel), "new constraint channel");
+ BLI_addtail(list, chan);
+ strcpy(chan->name, name);
}
- if (!exists)
- return;
-
- /* Strip off the suffix */
- dot=strchr(con->name, '.');
- if (dot)
- *dot=0;
-
- 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)) {
- exists = 1;
- break;
- }
- }
- }
- if (!exists) {
- strcpy(con->name, tempname);
- return;
- }
- }
+ return chan;
}
-void *new_constraint_data (short type)
+/* --------- 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)
{
- void *result;
+ bConstraint *con;
- switch (type) {
- case CONSTRAINT_TYPE_PYTHON:
- {
- bPythonConstraint *data;
- data = MEM_callocN(sizeof(bPythonConstraint), "pythonConstraint");
-
- /* 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;
-
- result = data;
- }
- break;
- 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;
-
- 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;
- }
- 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_SIZELIKE:
- {
- bSizeLikeConstraint *data;
- data = MEM_callocN(sizeof(bLocateLikeConstraint), "SizeLikeConstraint");
- data->flag = SIZELIKE_X|SIZELIKE_Y|SIZELIKE_Z;
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data;
- data = MEM_callocN(sizeof(bActionConstraint), "ActionConstraint");
-
- /* set type to 20 (Loc X), as 0 is Rot X for backwards compatability */
- data->type = 20;
-
- 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");
-
- 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;
- data = MEM_callocN(sizeof(bRigidBodyJointConstraint), "RigidBodyToConstraint");
-
- // removed code which set target of this constraint
- data->type=1;
-
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data;
- data = MEM_callocN(sizeof(bClampToConstraint), "ClampToConstraint");
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_CHILDOF:
- {
- bChildOfConstraint *data;
- data = MEM_callocN(sizeof(bChildOfConstraint), "ChildOfConstraint");
-
- data->flag = (CHILDOF_LOCX | CHILDOF_LOCY | CHILDOF_LOCZ |
- CHILDOF_ROTX |CHILDOF_ROTY | CHILDOF_ROTZ |
- CHILDOF_SIZEX | CHILDOF_SIZEY | CHILDOF_SIZEZ);
- Mat4One(data->invmat);
-
- result = data;
+ /* for each Constraint, calculate its Influence from the corresponding ConstraintChannel */
+ for (con=conbase->first; con; con=con->next) {
+ Ipo *ipo= NULL;
+
+ if(con->flag & CONSTRAINT_OWN_IPO)
+ ipo= con->ipo;
+ else {
+ bConstraintChannel *chan = get_constraint_channel(chanbase, con->name);
+ if(chan) ipo= chan->ipo;
}
- break;
- case CONSTRAINT_TYPE_TRANSFORM:
- {
- bTransformConstraint *data;
- data = MEM_callocN(sizeof(bTransformConstraint), "TransformationConstraint");
+
+ if (ipo) {
+ IpoCurve *icu;
- data->map[0]= 0;
- data->map[1]= 1;
- data->map[2]= 2;
+ calc_ipo(ipo, ctime);
- result = data;
+ for (icu=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;
-
- default:
- result = NULL;
- break;
}
-
- return result;
}
-bConstraintChannel *get_constraint_channel (ListBase *list, const char *name)
-{
- bConstraintChannel *chan;
+/* ************************ 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.
+ */
- for (chan = list->first; chan; chan=chan->next) {
- if (!strcmp(name, chan->name)) {
- return chan;
- }
- }
- return NULL;
-}
+/* -------------- Naming -------------- */
-/* finds or creates new constraint channel */
-bConstraintChannel *verify_constraint_channel (ListBase *list, const char *name)
+/* Find the first available, non-duplicate name for a given constraint */
+void unique_constraint_name (bConstraint *con, ListBase *list)
{
- bConstraintChannel *chan;
-
- 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);
- }
-
- return chan;
+ BLI_uniquename(list, con, "Const", offsetof(bConstraint, name), 32);
}
-
-/* ***************** Evaluating ********************* */
+/* ----------------- 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 */
@@ -803,7 +243,7 @@ bConstraintOb *constraints_make_evalob (Object *ob, void *subdata, short datatyp
/* based on type of available data */
switch (datatype) {
- case TARGET_OBJECT:
+ case CONSTRAINT_OBTYPE_OBJECT:
{
/* disregard subdata... calloc should set other values right */
if (ob) {
@@ -817,7 +257,7 @@ bConstraintOb *constraints_make_evalob (Object *ob, void *subdata, short datatyp
Mat4CpyMat4(cob->startmat, cob->matrix);
}
break;
- case TARGET_BONE:
+ case CONSTRAINT_OBTYPE_BONE:
{
/* only set if we have valid bone, otherwise default */
if (ob && subdata) {
@@ -835,7 +275,7 @@ bConstraintOb *constraints_make_evalob (Object *ob, void *subdata, short datatyp
}
break;
- default: // other types not yet handled
+ default: /* other types not yet handled */
Mat4One(cob->matrix);
Mat4One(cob->startmat);
break;
@@ -855,26 +295,32 @@ void constraints_clear_evalob (bConstraintOb *cob)
/* calculate delta of constraints evaluation */
Mat4Invert(imat, cob->startmat);
- Mat4MulMat4(delta, cob->matrix, imat);
+ Mat4MulMat4(delta, imat, cob->matrix);
/* copy matrices back to source */
switch (cob->type) {
- case TARGET_OBJECT:
+ case CONSTRAINT_OBTYPE_OBJECT:
{
- /* 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);
+ /* 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);
+ }
}
break;
- case TARGET_BONE:
+ case CONSTRAINT_OBTYPE_BONE:
{
- /* 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);
+ /* 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;
}
@@ -883,40 +329,7 @@ void constraints_clear_evalob (bConstraintOb *cob)
MEM_freeN(cob);
}
-/* -------------------------------- Constraint Channels ---------------------------- */
-
-/* does IPO's of constraint channels only */
-void do_constraint_channels (ListBase *conbase, ListBase *chanbase, float ctime, int onlydrivers)
-{
- 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;
- }
- }
- }
- }
- }
-}
-
-/* ------------------------------- Space-Conversion API ---------------------------- */
+/* -------------- Space-Conversion API -------------- */
/* This function is responsible for the correct transformations/conversions
* of a matrix from one space to another for constraint evaluation.
@@ -1112,7 +525,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
}
}
-/* ------------------------------- Target ---------------------------- */
+/* ------------ 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])
@@ -1267,7 +680,7 @@ static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][
/* 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)
+static void constraint_target_to_mat4 (Object *ob, char *substring, float mat[][4], short from, short to, float headtail)
{
/* Case OBJECT */
if (!strlen(substring)) {
@@ -1301,7 +714,22 @@ static void constraint_target_to_mat4 (Object *ob, char *substring, float mat[][
* PoseChannel by the Armature Object's Matrix to get a worldspace
* matrix.
*/
- Mat4MulMat4(mat, pchan->pose_mat, ob->obmat);
+ 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);
@@ -1311,18 +739,283 @@ static void constraint_target_to_mat4 (Object *ob, char *substring, float mat[][
}
}
+/* ************************* 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
+
+/* 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);
+}
+
+/* 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); \
+ }
+
+/* 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.
+ * Note: the pointer to ct will be changed to point to the next in the list (as it gets removed)
+ * (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) { \
+ bConstraintTarget *ctn = ct->next; \
+ if (nocopy == 0) { \
+ datatar= ct->tar; \
+ strcpy(datasubtarget, ct->subtarget); \
+ con->tarspace= ct->space; \
+ } \
+ \
+ BLI_freelinkN(list, ct); \
+ ct= ctn; \
+ } \
+ }
+
+/* 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.
+ * Note: the pointer to ct will be changed to point to the next in the list (as it gets removed)
+ * (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) { \
+ bConstraintTarget *ctn = ct->next; \
+ if (nocopy == 0) { \
+ datatar= ct->tar; \
+ con->tarspace= ct->space; \
+ } \
+ \
+ BLI_freelinkN(list, ct); \
+ ct= ctn; \
+ } \
+ }
+
+/* --------- ChildOf Constraint ------------ */
-/* stupid little cross product function, 0:x, 1:y, 2:z axes */
-static int basis_cross(int n, int m)
+static void childof_new_data (void *cdata)
{
- 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;
+ 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);
}
-static void vectomat(float *vec, float *target_up, short axis, short upflag, short flags, float m[][3])
+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 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)
+ }
+}
+
+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);
+ }
+}
+
+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)
+ }
+}
+
+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)
+ }
+}
+
+
+static int basis_cross (int n, int m)
+{
+ 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])
{
float n[3];
float u[3]; /* vector specifying the up axis */
@@ -1332,17 +1025,16 @@ static void vectomat(float *vec, float *target_up, short axis, short upflag, sho
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];
@@ -1360,7 +1052,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;
@@ -1370,19 +1062,19 @@ 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];
@@ -1397,1449 +1089,2356 @@ 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 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 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 tempmat[4][4], vec[3];
- float s, t;
- short axis;
-
- /* initialise return matrix */
- Mat4One(mat);
-
- /* only continue if there is a target */
- if (data->tar==NULL) return 0;
-
- /* get the transform matrix of the target */
- constraint_target_to_mat4(data->tar, data->subtarget, tempmat, CONSTRAINT_SPACE_WORLD, con->tarspace); // FIXME: change these spaces
-
- /* 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;
- }
-
- /* 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, 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);
-
- /* Clean up */
- free_pose_channels(pose);
- MEM_freeN(pose);
- }
- }
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data = (bLocateLikeConstraint*)con->data;
- Object *ob= data->tar;
-
- if (data->tar) {
- if (data->tar->type==OB_ARMATURE && strlen(data->subtarget)) {
- /* Pose-Channels for the CopyLoc target are handled specially, so that
- * we can support using the bone-tip as an option.
- */
- bPoseChannel *pchan;
- float tmat[4][4];
-
- 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);
-
- /* convert matrix space as required */
- constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- }
- else {
- /* get target matrix as is done normally for other constraints */
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- }
- valid=1;
- }
- else
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data;
- data = (bRotateLikeConstraint*)con->data;
-
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid=1;
- }
- else
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data;
- data = (bSizeLikeConstraint*)con->data;
-
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid=1;
- }
- else
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data = (bMinMaxConstraint*)con->data;
-
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid=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;
+}
+
+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)
+ }
+}
+
+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)
+ SINGLETARGET_FLUSH_TARS(con, data->poletar, data->polesubtarget, ct, list, nocopy)
+ }
+}
+
+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
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data;
- data = (bTrackToConstraint*)con->data;
-
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid=1;
+ 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);
}
- else
- Mat4One (mat);
}
- break;
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data;
- data = (bKinematicConstraint*)con->data;
-
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid=1;
- }
- else if (data->flag & CONSTRAINT_IK_AUTO) {
- Object *ob= (Object *)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;
+ 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) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid=1;
+ if (calc_ipo_spec(cu->ipo, CU_SPEED, &curvetime)==0) {
+ curvetime /= cu->pathlen;
+ CLAMP(curvetime, 0.0, 1.0);
}
- else
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data;
- data = (bFollowPathConstraint*)con->data;
- if (data->tar) {
- Curve *cu;
- float q[4], vec[4], dir[3], *quat, x1;
- float totmat[4][4];
- float curvetime;
-
- Mat4One(totmat);
- Mat4One(mat);
-
- 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 (cu->path && cu->path->data) {
- curvetime= bsystem_time(data->tar, (float)ctime, 0.0) - data->offset;
+ if ( where_on_path(ct->tar, curvetime, vec, dir) ) {
+ if (data->followflag) {
+ quat= vectoquat(dir, (short) data->trackflag, (short) data->upflag);
- if (calc_ipo_spec(cu->ipo, CU_SPEED, &curvetime)==0) {
- curvetime /= cu->pathlen;
- CLAMP(curvetime, 0.0, 1.0);
- }
+ 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);
- if (where_on_path(data->tar, curvetime, vec, dir) ) {
- if (data->followflag) {
- quat= vectoquat(dir, (short) data->trackflag, (short) data->upflag);
-
- 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);
-
- QuatToMat4(quat, totmat);
- }
- VECCOPY(totmat[3], vec);
-
- Mat4MulSerie(mat, data->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
- }
+ 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_STRETCHTO:
- {
- bStretchToConstraint *data;
- data = (bStretchToConstraint*)con->data;
+ }
+ else if (ct)
+ Mat4One(ct->matrix);
+}
+
+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]);
+ }
+}
+
+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;
+ }
+}
+
+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 (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid = 1;
- }
- else
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_PYTHON:
- {
- bPythonConstraint *data;
- data = (bPythonConstraint*)con->data;
+ if (eul[0] > data->xmax)
+ eul[0] = data->xmax;
+ }
+ if (data->flag & LIMIT_YROT) {
+ if (eul[1] < data->ymin)
+ eul[1] = data->ymin;
- /* special exception for curves - depsgraph issues */
- if (data->tar && data->tar->type == OB_CURVE) {
- Curve *cu= data->tar->data;
-
- /* 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(data->tar, 0);
- }
+ if (eul[1] > data->ymax)
+ eul[1] = data->ymax;
+ }
+ if (data->flag & LIMIT_ZROT) {
+ if (eul[2] < data->zmin)
+ eul[2] = data->zmin;
- /* if the script doesn't set the target matrix for any reason, fall back to standard methods */
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- if (BPY_pyconstraint_targets(data, mat) >= 1) {
- valid = 1;
- }
- }
- if (!valid)
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data;
- data = (bClampToConstraint*)con->data;
+ 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);
+}
+
+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]);
+}
+
+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;
+}
+
+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)
+ }
+}
+
+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)
+ }
+}
+
+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->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);
-
- valid = 1;
- }
+ if (data->flag & LOCLIKE_X) {
+ cob->matrix[3][0] = ct->matrix[3][0];
- Mat4One(mat);
+ if (data->flag & LOCLIKE_X_INVERT) cob->matrix[3][0] *= -1;
+ cob->matrix[3][0] += offset[0];
}
- break;
- case CONSTRAINT_TYPE_CHILDOF:
- {
- bChildOfConstraint *data;
- data= (bChildOfConstraint *)con->data;
+ if (data->flag & LOCLIKE_Y) {
+ cob->matrix[3][1] = ct->matrix[3][1];
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid = 1;
- }
- else
- Mat4One(mat);
+ if (data->flag & LOCLIKE_Y_INVERT) cob->matrix[3][1] *= -1;
+ cob->matrix[3][1] += offset[1];
}
- break;
- case CONSTRAINT_TYPE_TRANSFORM:
- {
- bTransformConstraint *data;
- data= (bTransformConstraint *)con->data;
+ if (data->flag & LOCLIKE_Z) {
+ cob->matrix[3][2] = ct->matrix[3][2];
- if (data->tar) {
- constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
- valid = 1;
- }
- else
- Mat4One(mat);
+ if (data->flag & LOCLIKE_Z_INVERT) cob->matrix[3][2] *= -1;
+ cob->matrix[3][2] += offset[2];
}
- break;
-
- default:
- Mat4One(mat);
- break;
}
+}
- return valid;
+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;
}
-/* ---------------------------------------------- Constraint Evaluation ------------------------------------------------- */
+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)
+ }
+}
-/* This is only called during solve_constraints to solve a particular constraint.
- * It works on ownermat, and uses targetmat to help accomplish its tasks.
- */
-static void evaluate_constraint (bConstraint *constraint, float ownermat[][4], float targetmat[][4])
+static void rotlike_flush_tars (bConstraint *con, ListBase *list, short nocopy)
{
- if (constraint == NULL || constraint->data == NULL)
- return;
+ if (con && list) {
+ bRotateLikeConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
- switch (constraint->type) {
- case CONSTRAINT_TYPE_NULL:
- case CONSTRAINT_TYPE_KINEMATIC: /* removed */
- break;
- case CONSTRAINT_TYPE_PYTHON:
- {
- bPythonConstraint *data;
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
+
+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');
- data = constraint->data;
- BPY_pyconstraint_eval(data, ownermat, targetmat);
- }
- break;
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data;
- float temp[4][4];
+ 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');
- data = constraint->data;
- Mat4CpyMat4(temp, ownermat);
+ 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');
- Mat4MulMat4(ownermat, targetmat, temp);
+ if (data->flag & ROTLIKE_Z_INVERT)
+ eul[2] *= -1;
}
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data;
- float offset[3] = {0.0f, 0.0f, 0.0f};
+
+ compatible_eul(eul, obeul);
+ LocEulSizeToMat4(cob->matrix, loc, eul, size);
+ }
+}
- data = constraint->data;
-
- if (data->flag & LOCLIKE_OFFSET)
- VECCOPY(offset, ownermat[3]);
-
- if (data->flag & LOCLIKE_X) {
- ownermat[3][0] = targetmat[3][0];
-
- if(data->flag & LOCLIKE_X_INVERT) ownermat[3][0] *= -1;
- ownermat[3][0] += offset[0];
+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;
+}
+
+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)
+ }
+}
+
+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)
+ }
+}
+
+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]);
}
- if (data->flag & LOCLIKE_Y) {
- ownermat[3][1] = targetmat[3][1];
-
- if(data->flag & LOCLIKE_Y_INVERT) ownermat[3][1] *= -1;
- ownermat[3][1] += offset[1];
+ else
+ VecMulf(cob->matrix[0], size[0] / obsize[0]);
+ }
+ 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]);
}
- if (data->flag & LOCLIKE_Z) {
- ownermat[3][2] = targetmat[3][2];
-
- if(data->flag & LOCLIKE_Z_INVERT) ownermat[3][2] *= -1;
- ownermat[3][2] += offset[2];
+ else
+ VecMulf(cob->matrix[1], size[1] / obsize[1]);
+ }
+ 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]);
}
+ else
+ VecMulf(cob->matrix[2], size[2] / obsize[2]);
}
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data;
- float loc[3];
- float eul[3], obeul[3];
- float size[3];
-
- data = constraint->data;
+ }
+}
+
+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);
+}
+
+static void pycon_relink (bConstraint *con)
+{
+ bPythonConstraint *data= con->data;
+
+ ID_NEW(data->text);
+}
+
+static void pycon_copy (bConstraint *con, bConstraint *srccon)
+{
+ bPythonConstraint *pycon = (bPythonConstraint *)con->data;
+ bPythonConstraint *opycon = (bPythonConstraint *)srccon->data;
+
+ pycon->prop = IDP_CopyProperty(opycon->prop);
+ duplicatelist(&pycon->targets, &opycon->targets);
+}
+
+static void pycon_new_data (void *cdata)
+{
+ bPythonConstraint *data= (bPythonConstraint *)cdata;
+
+ /* 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;
+
+ if (VALID_CONS_TARGET(ct)) {
+ /* special exception for curves - depsgraph issues */
+ if (ct->tar->type == OB_CURVE) {
+ Curve *cu= ct->tar->data;
- VECCOPY(loc, ownermat[3]);
- Mat4ToSize(ownermat, size);
+ /* 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);
+ }
+
+ /* 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);
+}
+
+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;
+ }
+
+ /* 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;
- Mat4ToEul(targetmat, eul);
- Mat4ToEul(ownermat, obeul);
+ /* make a temporary pose and evaluate using that */
+ pose = MEM_callocN(sizeof(bPose), "pose");
- if ((data->flag & ROTLIKE_X)==0) {
- eul[0] = obeul[0];
- }
- else if (data->flag & ROTLIKE_X_INVERT) {
- eul[0] *= -1;
- }
+ pchan = cob->pchan;
+ tchan= verify_pose_channel(pose, pchan->name);
+ extract_pose_from_action(pose, data->act, t);
- if ((data->flag & ROTLIKE_Y)==0) {
- eul[1] = obeul[1];
- }
- else if (data->flag & ROTLIKE_Y_INVERT) {
- eul[1] *= -1;
- }
+ chan_calc_mat(tchan);
- if ((data->flag & ROTLIKE_Z)==0) {
- eul[2] = obeul[2];
- }
- else if (data->flag & ROTLIKE_Z_INVERT) {
- eul[2] *= -1;
- }
+ Mat4CpyMat4(ct->matrix, tchan->chan_mat);
- compatible_eul(eul, obeul);
- LocEulSizeToMat4(ownermat, loc, eul, size);
+ /* Clean up */
+ free_pose(pose);
}
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data;
- float obsize[3], size[3];
-
- data = constraint->data;
-
- Mat4ToSize(targetmat, size);
- Mat4ToSize(ownermat, obsize);
-
- if ((data->flag & SIZELIKE_X) && obsize[0] != 0)
- VecMulf(ownermat[0], size[0] / obsize[0]);
- if ((data->flag & SIZELIKE_Y) && obsize[1] != 0)
- VecMulf(ownermat[1], size[1] / obsize[1]);
- if ((data->flag & SIZELIKE_Z) && obsize[2] != 0)
- VecMulf(ownermat[2], size[2] / obsize[2]);
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
+ 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");
+ }
+ }
+}
+
+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);
+ }
+}
+
+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;
+}
+
+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;
+
+ 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 */
{
- bMinMaxConstraint *data;
- float obmat[4][4], imat[4][4], tarmat[4][4], tmat[4][4];
- float val1, val2;
- int index;
-
- data = constraint->data;
-
- Mat4CpyMat4(obmat, ownermat);
- 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);
- }
-
- 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;
- }
+ 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]);
}
- if (data->flag & MINMAX_USEROT) {
- /* get out of localspace */
- Mat4MulMat4(tmat, obmat, targetmat);
- Mat4CpyMat4(ownermat, tmat);
- }
- else {
- VECCOPY(ownermat[3], obmat[3]);
+ 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]);
}
- }
- else {
- data->flag &= ~MINMAX_STUCK;
+ break;
+ 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 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;
+ 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_TRACKTO:
+ break;
+ case LOCK_Y: /* LOCK Y */
{
- bTrackToConstraint *data;
- float size[3], vec[3];
- float totmat[3][3];
- float tmat[4][4];
-
- data = constraint->data;
-
- if (data->tar) {
- /* Get size property, since ob->size is only the object's own relative size, not its global one */
- Mat4ToSize(ownermat, size);
-
- /* Clear the object's rotation */
- ownermat[0][0]=size[0];
- ownermat[0][1]=0;
- ownermat[0][2]=0;
- ownermat[1][0]=0;
- ownermat[1][1]=size[1];
- ownermat[1][2]=0;
- ownermat[2][0]=0;
- ownermat[2][1]=0;
- ownermat[2][2]=size[2];
-
- /* targetmat[2] instead of ownermat[2] is passed to vectomat
- * for backwards compatability it seems... (Aligorith)
- */
- VecSubf(vec, ownermat[3], targetmat[3]);
- vectomat(vec, targetmat[2],
- (short)data->reserved1, (short)data->reserved2,
- data->flags, totmat);
-
- Mat4CpyMat4(tmat, ownermat);
- Mat4MulMat34(ownermat, totmat, tmat);
+ 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]);
+ }
+ 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]);
+ }
+ 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]);
+ }
+ 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]);
+ }
+ 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_LOCKTRACK:
+ break;
+ case LOCK_Z: /* LOCK Z */
{
- 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 = constraint->data;
-
- if (data->tar) {
- /* Vector object -> target */
- VecSubf(vec, targetmat[3], ownermat[3]);
- switch (data->lockflag){
- case LOCK_X: /* LOCK X */
+ switch (data->trackflag) {
+ case TRACK_X: /* LOCK Z TRACK X */
{
- switch (data->trackflag) {
- case TRACK_Y: /* LOCK X TRACK Y */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ownermat[0]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
-
- /* the x axis is fixed */
- totmat[0][0] = ownermat[0][0];
- totmat[0][1] = ownermat[0][1];
- totmat[0][2] = ownermat[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, ownermat[0]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
-
- /* the x axis is fixed */
- totmat[0][0] = ownermat[0][0];
- totmat[0][1] = ownermat[0][1];
- totmat[0][2] = ownermat[0][2];
- Normalize(totmat[0]);
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[2]);
+ VecSubf(totmat[0], vec, vec2);
+ 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, ownermat[0]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
- VecMulf(totmat[1],-1);
-
- /* the x axis is fixed */
- totmat[0][0] = ownermat[0][0];
- totmat[0][1] = ownermat[0][1];
- totmat[0][2] = ownermat[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, ownermat[0]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
- VecMulf(totmat[2],-1);
-
- /* the x axis is fixed */
- totmat[0][0] = ownermat[0][0];
- totmat[0][1] = ownermat[0][1];
- totmat[0][2] = ownermat[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;
- }
+ /* 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[1], totmat[2], totmat[0]);
}
break;
- case LOCK_Y: /* LOCK Y */
+ case TRACK_Y: /* LOCK Z TRACK Y */
{
- switch (data->trackflag) {
- case TRACK_X: /* LOCK Y TRACK X */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ownermat[1]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
-
- /* the y axis is fixed */
- totmat[1][0] = ownermat[1][0];
- totmat[1][1] = ownermat[1][1];
- totmat[1][2] = ownermat[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, ownermat[1]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
-
- /* the y axis is fixed */
- totmat[1][0] = ownermat[1][0];
- totmat[1][1] = ownermat[1][1];
- totmat[1][2] = ownermat[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, ownermat[1]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
- VecMulf(totmat[0],-1);
-
- /* the y axis is fixed */
- totmat[1][0] = ownermat[1][0];
- totmat[1][1] = ownermat[1][1];
- totmat[1][2] = ownermat[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, ownermat[1]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
- VecMulf(totmat[2],-1);
-
- /* the y axis is fixed */
- totmat[1][0] = ownermat[1][0];
- totmat[1][1] = ownermat[1][1];
- totmat[1][2] = ownermat[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;
- }
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[2]);
+ VecSubf(totmat[1], vec, vec2);
+ Normalize(totmat[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 LOCK_Z: /* LOCK Z */
+ case TRACK_nX: /* LOCK Z TRACK -X */
{
- switch (data->trackflag) {
- case TRACK_X: /* LOCK Z TRACK X */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ownermat[2]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
-
- /* the z axis is fixed */
- totmat[2][0] = ownermat[2][0];
- totmat[2][1] = ownermat[2][1];
- totmat[2][2] = ownermat[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, ownermat[2]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
-
- /* the z axis is fixed */
- totmat[2][0] = ownermat[2][0];
- totmat[2][1] = ownermat[2][1];
- totmat[2][2] = ownermat[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, ownermat[2]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
- VecMulf(totmat[0],-1);
-
- /* the z axis is fixed */
- totmat[2][0] = ownermat[2][0];
- totmat[2][1] = ownermat[2][1];
- totmat[2][2] = ownermat[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_nY: /* LOCK Z TRACK -Y */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ownermat[2]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
- VecMulf(totmat[1],-1);
-
- /* the z axis is fixed */
- totmat[2][0] = ownermat[2][0];
- totmat[2][1] = ownermat[2][1];
- totmat[2][2] = ownermat[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;
- }
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[2]);
+ VecSubf(totmat[0], vec, vec2);
+ Normalize(totmat[0]);
+ VecMulf(totmat[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[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);
+
+ /* 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;
- }
- /* Block to keep matrix heading */
- tmpmat[0][0] = ownermat[0][0];tmpmat[0][1] = ownermat[0][1];tmpmat[0][2] = ownermat[0][2];
- tmpmat[1][0] = ownermat[1][0];tmpmat[1][1] = ownermat[1][1];tmpmat[1][2] = ownermat[1][2];
- tmpmat[2][0] = ownermat[2][0];tmpmat[2][1] = ownermat[2][1];tmpmat[2][2] = ownermat[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, ownermat);
-
- 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(ownermat, totmat, tmat);
+ break;
}
}
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data;
- float obmat[4][4];
- float size[3], obsize[3];
-
- data = constraint->data;
-
- if (data->tar) {
- /* get Object local transform (loc/rot/size) to determine transformation from path */
- //object_to_mat4(ob, obmat);
- Mat4CpyMat4(obmat, ownermat); // FIXME!!!
-
- /* get scaling of object before applying constraint */
- Mat4ToSize(ownermat, size);
-
- /* apply targetmat - containing location on path, and rotation */
- Mat4MulSerie(ownermat, targetmat, obmat, NULL, NULL, NULL, NULL, NULL, NULL);
-
- /* un-apply scaling caused by path */
- Mat4ToSize(ownermat, obsize);
- if (obsize[0] != 0)
- VecMulf(ownermat[0], size[0] / obsize[0]);
- if (obsize[1] != 0)
- VecMulf(ownermat[1], size[1] / obsize[1]);
- if (obsize[2] != 0)
- VecMulf(ownermat[2], size[2] / obsize[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;
}
- 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 = constraint->data;
- Mat4ToSize (ownermat, size);
-
- if (data->tar) {
- /* store X orientation before destroying obmat */
- xx[0] = ownermat[0][0];
- xx[1] = ownermat[0][1];
- xx[2] = ownermat[0][2];
- Normalize(xx);
-
- /* store Z orientation before destroying obmat */
- zz[0] = ownermat[2][0];
- zz[1] = ownermat[2][1];
- zz[2] = ownermat[2][2];
- Normalize(zz);
-
- VecSubf(vec, ownermat[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 */
- ownermat[0][0]=size[0]*scale[0];
- ownermat[0][1]=0;
- ownermat[0][2]=0;
- ownermat[1][0]=0;
- ownermat[1][1]=size[1]*scale[1];
- ownermat[1][2]=0;
- ownermat[2][0]=0;
- ownermat[2][1]=0;
- ownermat[2][2]=size[2]*scale[2];
-
- VecSubf(vec, ownermat[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, ownermat);
-
- Mat4MulMat34(ownermat, totmat, tmat);
- }
- }
- break;
- case CONSTRAINT_TYPE_LOCLIMIT:
- {
- bLocLimitConstraint *data;
+ /* 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);
+ }
+}
- data = constraint->data;
-
- if (data->flag & LIMIT_XMIN) {
- if(ownermat[3][0] < data->xmin)
- ownermat[3][0] = data->xmin;
- }
- if (data->flag & LIMIT_XMAX) {
- if (ownermat[3][0] > data->xmax)
- ownermat[3][0] = data->xmax;
- }
- if (data->flag & LIMIT_YMIN) {
- if(ownermat[3][1] < data->ymin)
- ownermat[3][1] = data->ymin;
- }
- if (data->flag & LIMIT_YMAX) {
- if (ownermat[3][1] > data->ymax)
- ownermat[3][1] = data->ymax;
- }
- if (data->flag & LIMIT_ZMIN) {
- if(ownermat[3][2] < data->zmin)
- ownermat[3][2] = data->zmin;
+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 */
+};
+
+/* ---------- Limit Distance Constraint ----------- */
+
+static void distlimit_new_data (void *cdata)
+{
+ bDistLimitConstraint *data= (bDistLimitConstraint *)cdata;
+
+ data->dist= 0.0;
+}
+
+static void distlimit_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bDistLimitConstraint *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 distlimit_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bDistLimitConstraint *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 distlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bDistLimitConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ /* only evaluate if there is a target */
+ if (VALID_CONS_TARGET(ct)) {
+ float dvec[3], dist=0.0f, sfac=1.0f;
+ short clamp_surf= 0;
+
+ /* calculate our current distance from the target */
+ dist= VecLenf(cob->matrix[3], ct->matrix[3]);
+
+ /* set distance (flag is only set when user demands it) */
+ if (data->dist == 0)
+ data->dist= dist;
+
+ /* check if we're which way to clamp from, and calculate interpolation factor (if needed) */
+ if (data->mode == LIMITDIST_OUTSIDE) {
+ /* if inside, then move to surface */
+ if (dist <= data->dist) {
+ clamp_surf= 1;
+ sfac= data->dist / dist;
}
- if (data->flag & LIMIT_ZMAX) {
- if (ownermat[3][2] > data->zmax)
- ownermat[3][2] = data->zmax;
+ /* if soft-distance is enabled, start fading once owner is dist+softdist from the target */
+ else if (data->flag & LIMITDIST_USESOFT) {
+ if (dist <= (data->dist + data->soft)) {
+
+ }
}
}
- break;
- case CONSTRAINT_TYPE_ROTLIMIT:
- {
- bRotLimitConstraint *data;
- float loc[3];
- float eul[3];
- float size[3];
-
- data = constraint->data;
-
- VECCOPY(loc, ownermat[3]);
- Mat4ToSize(ownermat, size);
-
- Mat4ToEul(ownermat, 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;
+ else if (data->mode == LIMITDIST_INSIDE) {
+ /* if outside, then move to surface */
+ if (dist >= data->dist) {
+ clamp_surf= 1;
+ sfac= data->dist / dist;
}
- if (data->flag & LIMIT_YROT) {
- if (eul[1] < data->ymin)
- eul[1] = data->ymin;
+ /* if soft-distance is enabled, start fading once owner is dist-soft from the target */
+ else if (data->flag & LIMITDIST_USESOFT) {
+ // FIXME: there's a problem with "jumping" when this kicks in
+ if (dist >= (data->dist - data->soft)) {
+ sfac = data->soft*(1.0 - exp(-(dist - data->dist)/data->soft)) + data->dist;
+ sfac /= dist;
- if (eul[1] > data->ymax)
- eul[1] = data->ymax;
+ clamp_surf= 1;
+ }
}
- if (data->flag & LIMIT_ZROT) {
- if (eul[2] < data->zmin)
- eul[2] = data->zmin;
-
- if (eul[2] > data->zmax)
- eul[2] = data->zmax;
+ }
+ else {
+ if (IS_EQ(dist, data->dist)==0) {
+ clamp_surf= 1;
+ sfac= data->dist / dist;
}
-
- /* 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(ownermat, loc, eul, size);
}
- break;
- case CONSTRAINT_TYPE_SIZELIMIT:
- {
- bSizeLimitConstraint *data;
- float obsize[3], size[3];
-
- data = constraint->data;
-
- Mat4ToSize(ownermat, size);
- Mat4ToSize(ownermat, obsize);
+
+ /* clamp to 'surface' (i.e. move owner so that dist == data->dist) */
+ if (clamp_surf) {
+ /* simply interpolate along line formed by target -> owner */
+ VecLerpf(dvec, ct->matrix[3], cob->matrix[3], sfac);
- 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;
+ /* copy new vector onto owner */
+ VECCOPY(cob->matrix[3], dvec);
+ }
+ }
+}
+
+static bConstraintTypeInfo CTI_DISTLIMIT = {
+ CONSTRAINT_TYPE_DISTLIMIT, /* type */
+ sizeof(bDistLimitConstraint), /* size */
+ "Limit Distance", /* name */
+ "bDistLimitConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ distlimit_new_data, /* new data */
+ distlimit_get_tars, /* get constraint targets */
+ distlimit_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get a target matrix */
+ distlimit_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;
+}
+
+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);
+
+ /* 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, 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 & LIMIT_ZMAX) {
- if (size[2] > data->zmax)
- size[2] = data->zmax;
+ 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]);
}
-
- VecMulf(ownermat[0], size[0]/obsize[0]);
- VecMulf(ownermat[1], size[1]/obsize[1]);
- VecMulf(ownermat[2], size[2]/obsize[2]);
+ }
+ else {
+ data->flag &= ~MINMAX_STUCK;
}
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- /* Do nothing. The GameEngine will take care of this.*/
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data;
- Curve *cu;
- float obmat[4][4], targetMatrix[4][4], ownLoc[3];
- float curveMin[3], curveMax[3];
-
- data = constraint->data;
-
- /* prevent crash if user deletes curve */
- if ((data->tar == NULL) || (data->tar->type != OB_CURVE) )
- return;
- else
- cu= data->tar->data;
-
- Mat4CpyMat4(obmat, ownermat);
- Mat4One(targetMatrix);
- VECCOPY(ownLoc, obmat[3]);
-
- INIT_MINMAX(curveMin, curveMax)
- minmax_object(data->tar, curveMin, curveMax);
-
- /* get targetmatrix */
- if (cu->path && cu->path->data) {
- float vec[4], dir[3], totmat[4][4];
- float curvetime;
- short clamp_axis;
+ }
+}
+
+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;
+
+ /* 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;
- /* find best position on curve */
- /* 1. determine which axis to sample on? */
- if (data->flag == CLAMPTO_AUTO) {
- float size[3];
- VecSubf(size, curveMax, curveMin);
+ /* 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 bounding-box range where target is located */
+ if (ownLoc[clamp_axis] < curveMin[clamp_axis]) {
+ /* bounding-box range is before */
+ offset= curveMin[clamp_axis];
- /* 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;
+ while (ownLoc[clamp_axis] < offset)
+ offset -= len;
- /* 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;
+ /* now, we calculate as per normal, except using offset instead of curveMin[clamp_axis] */
+ curvetime = (ownLoc[clamp_axis] - offset) / (len);
+ }
+ else if (ownLoc[clamp_axis] > curveMax[clamp_axis]) {
+ /* bounding-box range is after */
+ offset= curveMax[clamp_axis];
- /* 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;
-
- /* now, we calculate as per normal, except using offset instead of curveMin[clamp_axis] */
- curvetime = (ownLoc[clamp_axis] - offset) / (len);
- }
- 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;
- }
-
- /* 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);
+ while (ownLoc[clamp_axis] > offset) {
+ if ((offset + len) > ownLoc[clamp_axis])
+ break;
+ else
+ offset += len;
}
+
+ /* now, we calculate as per normal, except using offset instead of curveMax[clamp_axis] */
+ curvetime = (ownLoc[clamp_axis] - offset) / (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]);
- }
-
- /* 3. position on curve */
- if(where_on_path(data->tar, curvetime, vec, dir) ) {
- Mat4One(totmat);
- VECCOPY(totmat[3], vec);
-
- Mat4MulSerie(targetMatrix, data->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
+ /* 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]);
+ }
- /* obtain final object position */
- VECCOPY(ownermat[3], targetMatrix[3]);
- }
- break;
- case CONSTRAINT_TYPE_CHILDOF:
- {
- bChildOfConstraint *data;
-
- data = constraint->data;
-
- /* only evaluate if there is a target */
- if (data->tar) {
- 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, targetmat[3]);
- Mat4ToEul(targetmat, eul);
- Mat4ToSize(targetmat, 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(targetmat, 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, targetmat);
+ /* 3. position on curve */
+ if (where_on_path(ct->tar, curvetime, vec, dir) ) {
+ Mat4One(totmat);
+ VECCOPY(totmat[3], vec);
- /* 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, ownermat);
- Mat4MulMat4(ownermat, tempmat, parmat);
+ Mat4MulSerie(targetMatrix, ct->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
}
}
- break;
- case CONSTRAINT_TYPE_TRANSFORM:
- {
- bTransformConstraint *data;
-
- data = constraint->data;
-
- /* only work if there is a target */
- if (data->tar) {
- float loc[3], eul[3], size[3];
- float dvec[3], sval[3];
- short i;
-
- /* obtain target effect */
- switch (data->from) {
- case 2: /* scale */
- Mat4ToSize(targetmat, dvec);
- break;
- case 1: /* rotation */
- Mat4ToEul(targetmat, dvec);
- break;
- default: /* location */
- VecCopyf(dvec, targetmat[3]);
- break;
+
+ /* 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;
+
+ 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])));
- /* extract components of owner's matrix */
- VECCOPY(loc, ownermat[3]);
- Mat4ToEul(ownermat, eul);
- Mat4ToSize(ownermat, size);
+ /* 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]= &CTI_DISTLIMIT; /* Limit Distance 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};
- /* 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;
- }
+ cti->get_constraint_targets(con, &targets);
+ for (ct= targets.first; ct; ct= ct->next) {
+ ID_NEW(ct->tar);
}
- /* 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;
+ 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);
+ }
+}
+
+/* -------- Constraints and Proxies ------- */
+
+/* Rescue all constraints tagged as being CONSTRAINT_PROXY_LOCAL (i.e. added to bone that's proxy-synced in this file) */
+void extract_proxylocal_constraints (ListBase *dst, ListBase *src)
+{
+ bConstraint *con, *next;
+
+ /* for each tagged constraint, remove from src and move to dst */
+ for (con= src->first; con; con= next) {
+ next= con->next;
+
+ /* check if tagged */
+ if (con->flag & CONSTRAINT_PROXY_LOCAL) {
+ BLI_remlink(src, con);
+ BLI_addtail(dst, con);
+ }
+ }
+}
+
+/* Returns if the owner of the constraint is proxy-protected */
+short proxylocked_constraints_owner (Object *ob, bPoseChannel *pchan)
+{
+ /* Currently, constraints can only be on object or bone level */
+ if (ob && ob->proxy) {
+ if (ob->pose && pchan) {
+ bArmature *arm= ob->data;
+
+ /* On bone-level, check if bone is on proxy-protected layer */
+ if ((pchan->bone) && (pchan->bone->layer & arm->layer_protected))
+ return 1;
+ }
+ else {
+ /* FIXME: constraints on object-level are not handled well yet */
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/* -------- 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 if (data->from==0 && data->to==1) {
- /* from degrees to radians */
- for (i=0; i<3; i++)
- sval[i] = sval[i] / 180 * M_PI;
+ else {
+ Mat4One(cob->matrix);
+ Mat4One(cob->startmat);
}
-
- /* 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;
-
- 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, ownermat[3], loc);
- break;
+ }
+ 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);
}
-
- /* apply to matrix */
- LocEulSizeToMat4(ownermat, loc, eul, size);
}
+ 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);
}
- break;
- default:
- printf("Error: Unknown constraint type\n");
- break;
+
+ /* 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 */
+/* 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;
- void *ownerdata;
- float tarmat[4][4], oldmat[4][4];
- float solution[4][4], delta[4][4], imat[4][4];
+ 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 */
@@ -2848,43 +3447,59 @@ void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
/* loop over available constraints, solving and blending them */
for (con= conlist->first; con; con= con->next) {
- /* this we can skip completely */
+ 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;
- /* and inverse kinematics is solved seperate */
- if (con->type==CONSTRAINT_TYPE_KINEMATIC) continue;
- /* rigidbody is really a game-engine thing - and is not solved here */
- if (con->type==CONSTRAINT_TYPE_RIGIDBODYJOINT) continue;
- /* influence of constraint */
- /* value should have been set from IPO's/Constraint Channels already */
+ /* 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);
- /* get the target matrix - in right space to be used */
- ownerdata= ((cob->pchan)? (void *)cob->pchan : (void *)cob->ob);
- get_constraint_target_matrix(con, cob->type, ownerdata, tarmat, ctime);
-
-
- /* Special Hack for PyConstraints to be able to set settings on the owner and/or
- * target. Technically, this violates the design of constraints (as constraints should
- * only act on matrices to alter the final transform of an owner), but on the other
- * hand, this makes PyConstraints more powerful as it enables certain setups to be created
- * and work reliably.
- */
- if (con->type == CONSTRAINT_TYPE_PYTHON) {
- bPythonConstraint *pycon= (bPythonConstraint *)con->data;
+ /* 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);
- /* as usual, the function for this is defined in BPY_interface.c */
- BPY_pyconstraint_driver(pycon, cob, pycon->tar, pycon->subtarget);
+ /* 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 */
- evaluate_constraint(con, cob->matrix, tarmat);
+ 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);
+ }
/* Interpolate the enforcement, to blend result of constraint into final owner transform */
/* 1. Remove effects of original matrix from constraint solution ==> delta */
@@ -2904,7 +3519,7 @@ void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
/* 3. Now multiply the delta by the matrix in use before the evaluation */
Mat4MulMat4(cob->matrix, delta, oldmat);
- /* move target/owner back into worldspace for next constraint/other business */
+ /* 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 ece0a7f1d6c..c23cc90aeb8 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -586,7 +586,7 @@ static void basisNurb(float t, short order, short pnts, float *knots, float *bas
/* this is for float inaccuracy */
if(t < knots[0]) t= knots[0];
- else if(t > knots[opp2]) t= knots[opp2];
+ else if(t > knots[opp2]) t= knots[opp2]; /* Valgrind reports an error here, use a nurbs torus and change u/v res to reproduce a crash TODO*/
/* this part is order '1' */
o2 = order + 1;
@@ -1467,7 +1467,7 @@ void makeBevelList(Object *ob)
BevPoint *bevp, *bevp2, *bevp1 = NULL, *bevp0;
float *data, *data_a, *v1, *v2, min, inp, x1, x2, y1, y2, vec[3];
struct bevelsort *sortdata, *sd, *sd1;
- int a, b, len, nr, poly, resolu;
+ int a, b, nr, poly, resolu, len=0;
/* this function needs an object, because of tflag and upflag */
cu= ob->data;
@@ -1479,14 +1479,17 @@ void makeBevelList(Object *ob)
else nu= cu->nurb.first;
while(nu) {
- if(nu->pntsu>1) {
+ if(nu->pntsu<=1) {
+ bl= MEM_callocN(sizeof(BevList)+1*sizeof(BevPoint), "makeBevelList");
+ BLI_addtail(&(cu->bev), bl);
+ bl->nr= 0;
+ } else {
if(G.rendering && cu->resolu_ren!=0)
resolu= cu->resolu_ren;
else
resolu= nu->resolu;
if((nu->type & 7)==CU_POLY) {
-
len= nu->pntsu;
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList");
BLI_addtail(&(cu->bev), bl);
@@ -1539,7 +1542,7 @@ void makeBevelList(Object *ob)
bevp->y= prevbezt->vec[1][1];
bevp->z= prevbezt->vec[1][2];
bevp->alfa= prevbezt->alfa;
- bevp->f1= 1;
+ bevp->f1= SELECT;
bevp->f2= 0;
bevp++;
bl->nr++;
@@ -1637,28 +1640,30 @@ void makeBevelList(Object *ob)
/* STEP 2: DOUBLE POINTS AND AUTOMATIC RESOLUTION, REDUCE DATABLOCKS */
bl= cu->bev.first;
while(bl) {
- nr= bl->nr;
- bevp1= (BevPoint *)(bl+1);
- bevp0= bevp1+(nr-1);
- nr--;
- while(nr--) {
- if( fabs(bevp0->x-bevp1->x)<0.00001 ) {
- if( fabs(bevp0->y-bevp1->y)<0.00001 ) {
- if( fabs(bevp0->z-bevp1->z)<0.00001 ) {
- bevp0->f2= 1;
- bl->flag++;
+ if (bl->nr) { /* null bevel items come from single points */
+ nr= bl->nr;
+ bevp1= (BevPoint *)(bl+1);
+ bevp0= bevp1+(nr-1);
+ nr--;
+ while(nr--) {
+ if( fabs(bevp0->x-bevp1->x)<0.00001 ) {
+ if( fabs(bevp0->y-bevp1->y)<0.00001 ) {
+ if( fabs(bevp0->z-bevp1->z)<0.00001 ) {
+ bevp0->f2= SELECT;
+ bl->flag++;
+ }
}
}
+ bevp0= bevp1;
+ bevp1++;
}
- bevp0= bevp1;
- bevp1++;
}
bl= bl->next;
}
bl= cu->bev.first;
while(bl) {
blnext= bl->next;
- if(bl->flag) {
+ if(bl->nr && bl->flag) {
nr= bl->nr- bl->flag+1; /* +1 because vectorbezier sets flag too */
blnew= MEM_mallocN(sizeof(BevList)+nr*sizeof(BevPoint), "makeBevelList");
memcpy(blnew, bl, sizeof(BevList));
@@ -1686,7 +1691,7 @@ void makeBevelList(Object *ob)
bl= cu->bev.first;
poly= 0;
while(bl) {
- if(bl->poly>=0) {
+ if(bl->nr && bl->poly>=0) {
poly++;
bl->poly= poly;
bl->gat= 0; /* 'gat' is dutch for hole */
@@ -1969,7 +1974,7 @@ float calc_curve_subdiv_radius(Curve *cu, Nurb *nu, int cursubdiv)
}
if ( ((nu->type & 7)==CU_NURBS) && (nu->flagu & CU_CYCLIC)) {
- if (bp == bplast) bp = bpfirst;
+ if (bp >= bplast) bp = bpfirst;
else bp++;
}
@@ -2162,7 +2167,7 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
if(len1==0.0) len1=1.0;
if(len2==0.0) len2=1.0;
- if(bezt->f1 & 1) { /* order of calculation */
+ if(bezt->f1 & SELECT) { /* order of calculation */
if(bezt->h2==HD_ALIGN) { /* aligned */
len= len2/len1;
p2[3]= p2[0]+len*(p2[0]-p2[-3]);
@@ -2238,9 +2243,9 @@ void testhandlesNurb(Nurb *nu)
a= nu->pntsu;
while(a--) {
flag= 0;
- if(bezt->f1 & 1) flag++;
- if(bezt->f2 & 1) flag += 2;
- if(bezt->f3 & 1) flag += 4;
+ if(bezt->f1 & SELECT) flag++;
+ if(bezt->f2 & SELECT) flag += 2;
+ if(bezt->f3 & SELECT) flag += 4;
if( !(flag==0 || flag==7) ) {
if(bezt->h1==HD_AUTO) { /* auto */
@@ -2351,6 +2356,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 +2388,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 466ba9f4201..d8ce311b5ca 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,15 @@ 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},
+ {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}
};
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", "CDOrco"};
const CustomDataMask CD_MASK_BAREMESH =
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;
@@ -387,8 +468,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_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
+ CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
+ CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO;
static const LayerTypeInfo *layerType_getInfo(int type)
{
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index eb651a925e0..5133381ba9f 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -57,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"
@@ -72,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"
@@ -353,6 +355,7 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
DagNode * node2;
DagNode * node3;
Key *key;
+ ParticleSystem *psys;
int addtoroot= 1;
node = dag_get_node(dag, ob);
@@ -368,27 +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 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);
-
+ 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);
}
+
}
}
}
@@ -579,22 +589,98 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
}
}
}
+
+ psys= ob->particlesystem.first;
+ if(psys) {
+ ParticleEffectorCache *nec;
+ GroupObject *go;
+
+ 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(part->draw_as == PART_DRAW_OB && part->dup_ob) {
+ node2 = dag_get_node(dag, part->dup_ob);
+ dag_add_relation(dag, node, node2, DAG_RL_OB_OB);
+ }
+
+ if(part->draw_as == PART_DRAW_GR && part->dup_group) {
+ for(go=part->dup_group->gobject.first; go; go=go->next) {
+ node2 = dag_get_node(dag, go->ob);
+ dag_add_relation(dag, node, node2, DAG_RL_OB_OB);
+ }
+ }
+
+ 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);
+ 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(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) && str && 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);
}
}
@@ -1718,10 +1804,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);
}
}
}
@@ -1778,6 +1877,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:
@@ -1807,6 +1908,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_check_enabled(ob, psys)) {
+ ob->recalc |= OB_RECALC_DATA;
+ break;
+ }
+ }
+ }
}
}
@@ -1965,8 +2077,8 @@ void DAG_object_update_flags(Scene *sce, Object *ob, unsigned int lay)
/* object not in scene? then handle group exception. needs to be dagged once too */
if(node==NULL) {
- Group *group= find_group(ob);
- if(group) {
+ Group *group= NULL;
+ while( (group = find_group(ob, group)) ) {
GroupObject *go;
/* primitive; tag all... this call helps building groups for particles */
for(go= group->gobject.first; go; go= go->next)
@@ -2076,42 +2188,69 @@ 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(con->ipo) {
+ IpoCurve *icu;
+ for(icu= con->ipo->curve.first; icu; icu= icu->next) {
+ if(icu->driver && icu->driver->ob==ob) {
+ bPoseChannel *target= get_pose_channel(ob->pose, icu->driver->name);
+ if(target) {
+ node2 = dag_get_node(dag, target);
+ dag_add_relation(dag, node2, node, 0);
+ dag_add_parent_relation(dag, node2, node, 0);
+
+ /* uncommented this line, results in dependencies
+ * not being added properly for this constraint,
+ * what is the purpose of this? - brecht */
+ /*cti= NULL;*/ /* trick to get next loop skipped */
+ }
+ }
+ }
+ }
+
+ 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..a9f009cd876 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -152,12 +152,9 @@ DispList *find_displist(ListBase *lb, int type)
int displist_has_faces(ListBase *lb)
{
DispList *dl;
-
- dl= lb->first;
- while(dl) {
+ for(dl= lb->first; dl; dl= dl->next) {
if ELEM3(dl->type, DL_INDEX3, DL_INDEX4, DL_SURF)
return 1;
- dl= dl->next;
}
return 0;
}
@@ -296,7 +293,7 @@ static Render *fastshade_get_render(void)
if(re==NULL) {
re= RE_NewRender("_Shade View_");
- RE_Database_Baking(re, G.scene, 0); /* 0= no faces */
+ RE_Database_Baking(re, G.scene, 0, 0); /* 0= no faces */
}
return re;
}
@@ -485,9 +482,11 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
CustomDataMask dataMask = CD_MASK_BAREMESH | CD_MASK_MCOL
| CD_MASK_MTFACE | CD_MASK_NORMAL;
+
init_fastshade_for_ob(re, ob, &need_orco, mat, imat);
- orco = (need_orco)? mesh_create_orco(ob): NULL;
+ if(need_orco)
+ dataMask |= CD_MASK_ORCO;
if (onlyForMesh)
dm = mesh_get_derived_deform(ob, dataMask);
@@ -499,6 +498,7 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
nors = dm->getFaceDataArray(dm, CD_NORMAL);
totvert = dm->getNumVerts(dm);
totface = dm->getNumFaces(dm);
+ orco= dm->getVertDataArray(dm, CD_ORCO);
if (onlyForMesh) {
col1 = *col1_r;
@@ -577,9 +577,6 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
}
MEM_freeN(vnors);
- if (orco)
- MEM_freeN(orco);
-
dm->release(dm);
end_fastshade_for_ob(ob);
@@ -1098,7 +1095,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 +1253,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);
@@ -1426,99 +1423,102 @@ void makeDispListCurveTypes(Object *ob, int forOrco)
BevPoint *bevp;
int a,b;
- /* exception handling; curve without bevel or extrude, with width correction */
- if(dlbev.first==NULL) {
- dl= MEM_callocN(sizeof(DispList), "makeDispListbev");
- dl->verts= MEM_callocN(3*sizeof(float)*bl->nr, "dlverts");
- BLI_addtail(dispbase, dl);
-
- if(bl->poly!= -1) dl->type= DL_POLY;
- else dl->type= DL_SEGM;
-
- if(dl->type==DL_SEGM) dl->flag = (DL_FRONT_CURVE|DL_BACK_CURVE);
+ if (bl->nr) { /* blank bevel lists can happen */
- dl->parts= 1;
- dl->nr= bl->nr;
- dl->col= nu->mat_nr;
- dl->charidx= nu->charidx;
- dl->rt= nu->flag;
-
- a= dl->nr;
- bevp= (BevPoint *)(bl+1);
- data= dl->verts;
- while(a--) {
- data[0]= bevp->x+widfac*bevp->sina;
- data[1]= bevp->y+widfac*bevp->cosa;
- data[2]= bevp->z;
- bevp++;
- data+=3;
- }
- }
- else {
- DispList *dlb;
-
- for (dlb=dlbev.first; dlb; dlb=dlb->next) {
-
- /* for each part of the bevel use a separate displblock */
- dl= MEM_callocN(sizeof(DispList), "makeDispListbev1");
- dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts");
+ /* exception handling; curve without bevel or extrude, with width correction */
+ if(dlbev.first==NULL) {
+ dl= MEM_callocN(sizeof(DispList), "makeDispListbev");
+ dl->verts= MEM_callocN(3*sizeof(float)*bl->nr, "dlverts");
BLI_addtail(dispbase, dl);
-
- dl->type= DL_SURF;
- dl->flag= dlb->flag & (DL_FRONT_CURVE|DL_BACK_CURVE);
- if(dlb->type==DL_POLY) dl->flag |= DL_CYCL_U;
- if(bl->poly>=0) dl->flag |= DL_CYCL_V;
+ if(bl->poly!= -1) dl->type= DL_POLY;
+ else dl->type= DL_SEGM;
- dl->parts= bl->nr;
- dl->nr= dlb->nr;
+ if(dl->type==DL_SEGM) dl->flag = (DL_FRONT_CURVE|DL_BACK_CURVE);
+
+ dl->parts= 1;
+ dl->nr= bl->nr;
dl->col= nu->mat_nr;
dl->charidx= nu->charidx;
dl->rt= nu->flag;
- dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
- bevp= (BevPoint *)(bl+1);
-
- /* for each point of poly make a bevel piece */
+
+ a= dl->nr;
bevp= (BevPoint *)(bl+1);
- for(a=0; a<bl->nr; a++,bevp++) {
- float fac=1.0;
- if (cu->taperobj==NULL) {
- if ( (cu->bevobj!=NULL) || !((cu->flag & CU_FRONT) || (cu->flag & CU_BACK)) )
- fac = calc_curve_subdiv_radius(cu, nu, a);
- } else {
- fac = calc_taper(cu->taperobj, a, bl->nr);
- }
+ data= dl->verts;
+ while(a--) {
+ data[0]= bevp->x+widfac*bevp->sina;
+ data[1]= bevp->y+widfac*bevp->cosa;
+ data[2]= bevp->z;
+ bevp++;
+ data+=3;
+ }
+ }
+ else {
+ DispList *dlb;
+
+ for (dlb=dlbev.first; dlb; dlb=dlb->next) {
+
+ /* for each part of the bevel use a separate displblock */
+ dl= MEM_callocN(sizeof(DispList), "makeDispListbev1");
+ dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts");
+ BLI_addtail(dispbase, dl);
+
+ dl->type= DL_SURF;
- if (bevp->f1) {
- dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
- }
-
- /* rotate bevel piece and write in data */
- fp1= dlb->verts;
- for (b=0; b<dlb->nr; b++,fp1+=3,data+=3) {
- if(cu->flag & CU_3D) {
- float vec[3];
-
- vec[0]= fp1[1]+widfac;
- vec[1]= fp1[2];
- vec[2]= 0.0;
-
- Mat3MulVecfl(bevp->mat, vec);
-
- data[0]= bevp->x+ fac*vec[0];
- data[1]= bevp->y+ fac*vec[1];
- data[2]= bevp->z+ fac*vec[2];
+ dl->flag= dlb->flag & (DL_FRONT_CURVE|DL_BACK_CURVE);
+ if(dlb->type==DL_POLY) dl->flag |= DL_CYCL_U;
+ if(bl->poly>=0) dl->flag |= DL_CYCL_V;
+
+ dl->parts= bl->nr;
+ dl->nr= dlb->nr;
+ dl->col= nu->mat_nr;
+ dl->charidx= nu->charidx;
+ dl->rt= nu->flag;
+ dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
+ bevp= (BevPoint *)(bl+1);
+
+ /* for each point of poly make a bevel piece */
+ bevp= (BevPoint *)(bl+1);
+ for(a=0; a<bl->nr; a++,bevp++) {
+ float fac=1.0;
+ if (cu->taperobj==NULL) {
+ if ( (cu->bevobj!=NULL) || !((cu->flag & CU_FRONT) || (cu->flag & CU_BACK)) )
+ fac = calc_curve_subdiv_radius(cu, nu, a);
+ } else {
+ fac = calc_taper(cu->taperobj, a, bl->nr);
}
- else {
- data[0]= bevp->x+ fac*(widfac+fp1[1])*bevp->sina;
- data[1]= bevp->y+ fac*(widfac+fp1[1])*bevp->cosa;
- data[2]= bevp->z+ fac*fp1[2];
+
+ if (bevp->f1) {
+ dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
+ }
+
+ /* rotate bevel piece and write in data */
+ fp1= dlb->verts;
+ for (b=0; b<dlb->nr; b++,fp1+=3,data+=3) {
+ if(cu->flag & CU_3D) {
+ float vec[3];
+
+ vec[0]= fp1[1]+widfac;
+ vec[1]= fp1[2];
+ vec[2]= 0.0;
+
+ Mat3MulVecfl(bevp->mat, vec);
+
+ data[0]= bevp->x+ fac*vec[0];
+ data[1]= bevp->y+ fac*vec[1];
+ data[2]= bevp->z+ fac*vec[2];
+ }
+ else {
+ data[0]= bevp->x+ fac*(widfac+fp1[1])*bevp->sina;
+ data[1]= bevp->y+ fac*(widfac+fp1[1])*bevp->cosa;
+ data[2]= bevp->z+ fac*fp1[2];
+ }
}
}
+
+ /* gl array drawing: using indices */
+ displist_surf_indices(dl);
}
-
- /* gl array drawing: using indices */
- displist_surf_indices(dl);
}
}
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 07fe8bbee31..6e33805fbeb 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;
@@ -1552,14 +1552,14 @@ static pMatrixCache *cache_object_matrices(Object *ob, int start, int end)
/* object can be linked in group... stupid exception */
if(NULL==object_in_scene(ob, G.scene))
- group= find_group(ob);
+ group= find_group(ob, NULL); /* TODO - dont just use the first group! - Campbell */
mcache= mc= MEM_mallocN( (end-start+1)*sizeof(pMatrixCache), "ob matrix cache");
framelenold= G.scene->r.framelen;
G.scene->r.framelen= 1.0f;
cfrao= G.scene->r.cfra;
- sfo= ob->sf;
+ sfo= ob->sf; /* warning, dont use sfo, value should be from give_timeoffset if used for anything */
ob->sf= 0.0f;
/* clear storage, copy recalc tag (bad loop) */
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index 201d93220f9..706bdf1245c 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -134,11 +134,11 @@ void add_to_group(Group *group, Object *ob)
}
/* also used for ob==NULL */
-void rem_from_group(Group *group, Object *ob)
+int rem_from_group(Group *group, Object *ob)
{
GroupObject *go, *gon;
-
- if(group==NULL) return;
+ int removed = 0;
+ if(group==NULL) return 0;
go= group->gobject.first;
while(go) {
@@ -146,9 +146,12 @@ void rem_from_group(Group *group, Object *ob)
if(go->ob==ob) {
BLI_remlink(&group->gobject, go);
free_group_object(go);
+ removed = 1;
+ /* should break here since an object being in a group twice cant happen? */
}
go= gon;
}
+ return removed;
}
int object_in_group(Object *ob, Group *group)
@@ -164,9 +167,12 @@ int object_in_group(Object *ob, Group *group)
return 0;
}
-Group *find_group(Object *ob)
+Group *find_group(Object *ob, Group *group)
{
- Group *group= G.main->group.first;
+ if (group)
+ group= group->id.next;
+ else
+ group= G.main->group.first;
while(group) {
if(object_in_group(ob, group))
@@ -188,6 +194,20 @@ void group_tag_recalc(Group *group)
}
}
+int group_is_animated(Object *parent, Group *group)
+{
+ GroupObject *go;
+
+ if(give_timeoffset(parent) != 0.0f || parent->nlastrips.first)
+ return 1;
+
+ for(go= group->gobject.first; go; go= go->next)
+ if(go->ob && go->ob->proxy)
+ return 1;
+
+ return 0;
+}
+
/* only replaces object strips or action when parent nla instructs it */
/* keep checking nla.c though, in case internal structure of strip changes */
static void group_replaces_nla(Object *parent, Object *target, char mode)
@@ -228,7 +248,6 @@ static void group_replaces_nla(Object *parent, Object *target, char mode)
}
}
-
/* puts all group members in local timing system, after this call
you can draw everything, leaves tags in objects to signal it needs further updating */
@@ -238,12 +257,12 @@ void group_handle_recalc_and_update(Object *parent, Group *group)
GroupObject *go;
/* if animated group... */
- if(parent->sf != 0.0f || parent->nlastrips.first) {
+ if(give_timeoffset(parent) != 0.0f || parent->nlastrips.first) {
int cfrao;
/* switch to local time */
cfrao= G.scene->r.cfra;
- G.scene->r.cfra -= (int)parent->sf;
+ G.scene->r.cfra -= (int)give_timeoffset(parent);
/* we need a DAG per group... */
for(go= group->gobject.first; go; go= go->next) {
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 708309934b5..3b7ab4951f6 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -71,6 +71,8 @@
#include "BKE_texture.h"
#include "BKE_utildefines.h"
+#include "BIF_editseq.h"
+
#include "PIL_time.h"
#include "RE_pipeline.h"
@@ -79,7 +81,7 @@
#include "BKE_bad_level_calls.h"
/* for stamp drawing to an image */
-#include "../bmfont/BMF_Api.h"
+#include "BMF_Api.h"
#include "blendef.h"
#include "BSE_time.h"
@@ -93,35 +95,53 @@
/* ******** IMAGE PROCESSING ************* */
-/* used by sequencer */
+/* used by sequencer and image premul option - IMA_DO_PREMUL */
void converttopremul(struct ImBuf *ibuf)
{
- int x, y, val;
- char *cp;
+ int x, y;
if(ibuf==0) return;
- if(ibuf->depth==24) { /* put alpha at 255 */
-
- cp= (char *)(ibuf->rect);
- for(y=0; y<ibuf->y; y++) {
- for(x=0; x<ibuf->x; x++, cp+=4) {
- cp[3]= 255;
+ if (ibuf->rect) {
+ int val;
+ char *cp;
+ if(ibuf->depth==24) { /* put alpha at 255 */
+ cp= (char *)(ibuf->rect);
+ for(y=0; y<ibuf->y; y++) {
+ for(x=0; x<ibuf->x; x++, cp+=4) {
+ cp[3]= 255;
+ }
+ }
+ } else {
+ cp= (char *)(ibuf->rect);
+ for(y=0; y<ibuf->y; y++) {
+ for(x=0; x<ibuf->x; x++, cp+=4) {
+ val= cp[3];
+ cp[0]= (cp[0]*val)>>8;
+ cp[1]= (cp[1]*val)>>8;
+ cp[2]= (cp[2]*val)>>8;
+ }
}
}
- return;
}
-
- cp= (char *)(ibuf->rect);
- for(y=0; y<ibuf->y; y++) {
- for(x=0; x<ibuf->x; x++, cp+=4) {
- if(cp[3]==0) {
- cp[0]= cp[1]= cp[2]= 0;
+ if (ibuf->rect_float) {
+ float val;
+ float *cp;
+ if(ibuf->depth==24) { /* put alpha at 1.0 */
+ cp= ibuf->rect_float;;
+ for(y=0; y<ibuf->y; y++) {
+ for(x=0; x<ibuf->x; x++, cp+=4) {
+ cp[3]= 1.0;
+ }
}
- else if(cp[3]!=255) {
- val= cp[3];
- cp[0]= (cp[0]*val)>>8;
- cp[1]= (cp[1]*val)>>8;
- cp[2]= (cp[2]*val)>>8;
+ } else {
+ cp= ibuf->rect_float;
+ for(y=0; y<ibuf->y; y++) {
+ for(x=0; x<ibuf->x; x++, cp+=4) {
+ val= cp[3];
+ cp[0]= cp[0]*val;
+ cp[1]= cp[1]*val;
+ cp[2]= cp[2]*val;
+ }
}
}
}
@@ -341,7 +361,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);
@@ -376,20 +396,27 @@ Image *BKE_add_image_file(const char *name)
return ima;
}
-static ImBuf *add_ibuf_size(int width, int height, char *name, short uvtestgrid, float color[4])
+static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4])
{
ImBuf *ibuf;
float h=0.0, hoffs=0.0, hue=0.0, s=0.9, v=0.9, r, g, b;
- unsigned char *rect;
+ unsigned char *rect= NULL;
+ float *rect_float= NULL;
int x, y;
int checkerwidth=21, dark=1;
- ibuf= IMB_allocImBuf(width, height, 24, IB_rect, 0);
+ if (floatbuf) {
+ ibuf= IMB_allocImBuf(width, height, 24, IB_rectfloat, 0);
+ rect_float= (float*)ibuf->rect_float;
+ }
+ else {
+ ibuf= IMB_allocImBuf(width, height, 24, IB_rect, 0);
+ rect= (unsigned char*)ibuf->rect;
+ }
+
strcpy(ibuf->name, "Untitled");
ibuf->userflags |= IB_BITMAPDIRTY;
- rect= (unsigned char*)ibuf->rect;
-
if (uvtestgrid) {
/* these two passes could be combined into one, but it's more readable and
* easy to tweak like this, speed isn't really that much of an issue in this situation... */
@@ -398,26 +425,40 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, short uvtestgrid,
for(y=0; y<ibuf->y; y++) {
dark = pow(-1, floor(y / checkerwidth));
- for(x=0; x<ibuf->x; x++, rect+=4) {
+ for(x=0; x<ibuf->x; x++) {
if (x % checkerwidth == 0) dark *= -1;
- if (dark > 0) {
- rect[0] = rect[1] = rect[2] = 64;
- rect[3] = 255;
- } else {
- rect[0] = rect[1] = rect[2] = 150;
- rect[3] = 255;
+ if (floatbuf) {
+ if (dark > 0) {
+ rect_float[0] = rect_float[1] = rect_float[2] = 0.25;
+ rect_float[3] = 1.0;
+ } else {
+ rect_float[0] = rect_float[1] = rect_float[2] = 0.58;
+ rect_float[3] = 1.0;
+ }
+ rect_float+=4;
+ }
+ else {
+ if (dark > 0) {
+ rect[0] = rect[1] = rect[2] = 64;
+ rect[3] = 255;
+ } else {
+ rect[0] = rect[1] = rect[2] = 150;
+ rect[3] = 255;
+ }
+ rect += 4;
}
}
}
/* 2nd pass, colored + */
- rect= (unsigned char*)ibuf->rect;
+ if (floatbuf) rect_float= (float*)ibuf->rect_float;
+ else rect= (unsigned char*)ibuf->rect;
for(y=0; y<ibuf->y; y++) {
hoffs = 0.125 * floor(y / checkerwidth);
- for(x=0; x<ibuf->x; x++, rect+=4) {
+ for(x=0; x<ibuf->x; x++) {
h = 0.125 * floor(x / checkerwidth);
if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 4) &&
@@ -429,22 +470,44 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, short uvtestgrid,
hue = fmod(fabs(h-hoffs), 1.0);
hsv_to_rgb(hue, s, v, &r, &g, &b);
- rect[0]= (char)(r * 255.0);
- rect[1]= (char)(g * 255.0);
- rect[2]= (char)(b * 255.0);
- rect[3]= 255;
+ if (floatbuf) {
+ rect_float[0]= r;
+ rect_float[1]= g;
+ rect_float[2]= b;
+ rect_float[3]= 1.0;
+ }
+ else {
+ rect[0]= (char)(r * 255.0);
+ rect[1]= (char)(g * 255.0);
+ rect[2]= (char)(b * 255.0);
+ rect[3]= 255;
+ }
}
}
-
+
+ if (floatbuf)
+ rect_float+=4;
+ else
+ rect+=4;
}
}
} else { /* blank image */
for(y=0; y<ibuf->y; y++) {
- for(x=0; x<ibuf->x; x++, rect+=4) {
- rect[0]= (char)(color[0] * 255.0);
- rect[1]= (char)(color[1] * 255.0);
- rect[2]= (char)(color[2] * 255.0);
- rect[3]= (char)(color[3] * 255.0);
+ for(x=0; x<ibuf->x; x++) {
+ if (floatbuf) {
+ rect_float[0]= color[0];
+ rect_float[1]= color[1];
+ rect_float[2]= color[2];
+ rect_float[3]= color[3];
+ rect_float+=4;
+ }
+ else {
+ rect[0]= (char)(color[0] * 255.0);
+ rect[1]= (char)(color[1] * 255.0);
+ rect[2]= (char)(color[2] * 255.0);
+ rect[3]= (char)(color[3] * 255.0);
+ rect+=4;
+ }
}
}
}
@@ -452,7 +515,7 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, short uvtestgrid,
}
/* adds new image block, creates ImBuf and initializes color */
-Image *BKE_add_image_size(int width, int height, char *name, short uvtestgrid, float color[4])
+Image *BKE_add_image_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4])
{
Image *ima;
@@ -467,7 +530,7 @@ Image *BKE_add_image_size(int width, int height, char *name, short uvtestgrid, f
ima->gen_y= height;
ima->gen_type= uvtestgrid;
- ibuf= add_ibuf_size(width, height, name, uvtestgrid, color);
+ ibuf= add_ibuf_size(width, height, name, floatbuf, uvtestgrid, color);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
ima->ok= IMA_OK_LOADED;
@@ -566,6 +629,47 @@ void free_old_images()
}
}
+static unsigned long image_mem_size(Image *ima)
+{
+ ImBuf *ibuf, *ibufm;
+ int level;
+ unsigned long size = 0;
+
+ size= 0;
+ for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) {
+ if(ibuf->rect) size += MEM_allocN_len(ibuf->rect);
+ else if(ibuf->rect_float) size += MEM_allocN_len(ibuf->rect_float);
+
+ for(level=0; level<IB_MIPMAP_LEVELS; level++) {
+ ibufm= ibuf->mipmap[level];
+ if(ibufm) {
+ if(ibufm->rect) size += MEM_allocN_len(ibufm->rect);
+ else if(ibufm->rect_float) size += MEM_allocN_len(ibufm->rect_float);
+ }
+ }
+ }
+
+ return size;
+}
+
+void BKE_image_print_memlist(void)
+{
+ Image *ima;
+ unsigned long size, totsize= 0;
+
+ for(ima= G.main->image.first; ima; ima= ima->id.next)
+ totsize += image_mem_size(ima);
+
+ printf("\ntotal image memory len: %.3lf MB\n", (double)totsize/(double)(1024*1024));
+
+ for(ima= G.main->image.first; ima; ima= ima->id.next) {
+ size= image_mem_size(ima);
+
+ if(size)
+ printf("%s len: %.3f MB\n", ima->id.name+2, (double)size/(double)(1024*1024));
+ }
+}
+
void BKE_image_free_all_textures(void)
{
Tex *tex;
@@ -729,7 +833,7 @@ void BKE_add_image_extension(char *string, int imtype)
if(!BLI_testextensie(string, ".hdr"))
extension= ".hdr";
}
- else if(imtype==R_PNG) {
+ else if(imtype==R_PNG || imtype==R_FFMPEG) {
if(!BLI_testextensie(string, ".png"))
extension= ".png";
}
@@ -744,7 +848,7 @@ void BKE_add_image_extension(char *string, int imtype)
extension= ".tga";
}
else if(ELEM5(imtype, R_MOVIE, R_AVICODEC, R_AVIRAW, R_AVIJPEG, R_JPEG90)) {
- if(!BLI_testextensie(string, ".jpg"))
+ if(!( BLI_testextensie(string, ".jpg") || BLI_testextensie(string, ".jpeg")))
extension= ".jpg";
}
else if(imtype==R_BMP) {
@@ -777,15 +881,22 @@ void BKE_add_image_extension(char *string, int imtype)
strcat(string, extension);
}
-void BKE_stamp(struct ImBuf *ibuf)
+/* 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], infotext[256];
- int x, y, h, m, s, f;
- int font_height;
- int text_width;
- int text_pad;
- struct BMF_Font *font;
-
+ char text[256];
#ifndef WIN32
struct tm *tl;
@@ -793,45 +904,51 @@ void BKE_stamp(struct ImBuf *ibuf)
#else
char sdate[9];
#endif /* WIN32 */
-
- if (!ibuf)
- return;
- 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;
+ 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';
}
- font_height = BMF_GetFontHeight(font);
- text_pad = BMF_GetStringWidth(font, " ");
+ if (G.scene->r.stamp & R_STAMP_NOTE) {
+ /* Never do prefix for Note */
+ sprintf(stamp_data->note, "%s", G.scene->r.stamp_udata);
+ } else {
+ stamp_data->note[0] = '\0';
+ }
- IMB_imginfo_change_field (ibuf, "File", G.sce);
- if (G.scene->r.stamp & R_STAMP_DRAW) {
- x = 1;
- y = ibuf->y - font_height;
- sprintf(text, "File: %s", G.sce);
- text_width = BMF_GetStringWidth(font, text);
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, G.sce, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- x = 1;
- y -= font_height+1;
+ 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);
@@ -847,112 +964,194 @@ void BKE_stamp(struct ImBuf *ibuf)
}
if (G.scene->r.frs_sec < 100)
- sprintf (infotext, "%02d:%02d:%02d.%02d", h, m, s, f);
+ sprintf (text, "%02d:%02d:%02d.%02d", h, m, s, f);
else
- sprintf (infotext, "%02d:%02d:%02d.%03d", h, m, s, f);
+ sprintf (text, "%02d:%02d:%02d.%03d", h, m, s, f);
- IMB_imginfo_change_field (ibuf, "Time", infotext);
+ 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 (G.scene->r.stamp & R_STAMP_DRAW) {
- sprintf (text, "Time %s", infotext);
- text_width = BMF_GetStringWidth(font, text);
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, text, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- x += text_width;
- }
+ if (do_prefix) sprintf(stamp_data->strip, "Strip %s", text);
+ else sprintf(stamp_data->strip, "%s", text);
+ } else {
+ stamp_data->strip[0] = '\0';
}
+}
- if (G.scene->r.stamp & R_STAMP_FRAME) {
- sprintf (infotext, "%i", G.scene->r.cfra);
- IMB_imginfo_change_field (ibuf, "Frame", infotext);
-
- if (G.scene->r.stamp & R_STAMP_DRAW) {
- sprintf (text, " Frame %s", infotext);
- text_width = BMF_GetStringWidth(font, text);
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, text, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- x += BMF_GetStringWidth(font, text);
- }
+void BKE_stamp_buf(unsigned char *rect, float *rectf, int width, int height, int channels)
+{
+ 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, channels);
+ y -= font_height+2; /* Top and bottom 1 pix padding each */
}
- if (G.scene->r.stamp & R_STAMP_DATE) {
-#ifdef WIN32
- _strdate (sdate);
- sprintf (infotext, "%s", sdate);
-#else
- t = time (NULL);
- tl = localtime (&t);
- sprintf (infotext, "%02d-%02d-%02d", tl->tm_mon+1, tl->tm_mday, tl->tm_year-100);
-#endif /* WIN32 */
- IMB_imginfo_change_field (ibuf, "Date", infotext);
-
- if (G.scene->r.stamp & R_STAMP_DRAW) {
- x = 1;
- y = 1;
- sprintf (text, "Date %s", infotext);
- text_width = BMF_GetStringWidth(font, text);
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, text, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- x += text_width;
- }
+ /* 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, channels);
+ 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, channels);
}
- if (G.scene->r.stamp & R_STAMP_CAMERA) {
- sprintf(infotext, ((Camera *) G.scene->camera)->id.name+2);
- IMB_imginfo_change_field (ibuf, "Camera", infotext);
-
- if (G.scene->r.stamp & R_STAMP_DRAW) {
- sprintf (text, "Camera: %s", infotext);
- text_width = BMF_GetStringWidth(font, text);
- x = (ibuf->x/2) - (BMF_GetStringWidth(font, text)/2);
- y = 1;
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, text, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- }
+ /* 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, channels);
+ }
+
+ /* 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, channels);
+ 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, channels);
}
- if (G.scene->r.stamp & R_STAMP_SCENE) {
- strcpy(infotext, G.scene->id.name+2);
- IMB_imginfo_change_field (ibuf, "Scene", infotext);
-
- if (G.scene->r.stamp & R_STAMP_DRAW) {
- sprintf (text, "Scene: %s", infotext);
- text_width = BMF_GetStringWidth(font, text);
- x = ibuf->x - (BMF_GetStringWidth(font, text)+1+text_pad);
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, text, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- }
+ 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, channels);
}
- if (G.scene->r.stamp & R_STAMP_NOTE) {
- IMB_imginfo_change_field (ibuf, "Note", G.scene->r.stamp_udata);
-
- if (G.scene->r.stamp & R_STAMP_DRAW) {
- x = 1;
- y = font_height+1;
- text_width = BMF_GetStringWidth(font, G.scene->r.stamp_udata);
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, G.scene->r.stamp_udata, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- }
+ 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, channels);
}
- if (G.scene->r.stamp & R_STAMP_MARKER) {
- TimeMarker *marker = get_frame_marker(CFRA);
-
- if (marker) strcpy(infotext, marker->name);
- else strcpy(infotext, "None");
-
- IMB_imginfo_change_field (ibuf, "Marker", infotext);
-
- if (G.scene->r.stamp & R_STAMP_DRAW) {
- sprintf (text, "Marker: %s", infotext);
- x = 1;
- y = ibuf->y - (font_height+1)*3;
- text_width = BMF_GetStringWidth(font, text);
- IMB_rectfill_area(ibuf, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, text, x, y, G.scene->r.fg_stamp, (unsigned char *)ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y);
- }
+ 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, channels);
}
+
+}
+
+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)
@@ -965,7 +1164,7 @@ int BKE_write_ibuf(ImBuf *ibuf, char *name, int imtype, int subimtype, int quali
else if ((imtype==R_RADHDR)) {
ibuf->ftype= RADHDR;
}
- else if ((imtype==R_PNG)) {
+ else if (imtype==R_PNG || imtype==R_FFMPEG) {
ibuf->ftype= PNG;
}
#ifdef WITH_DDS
@@ -1016,8 +1215,8 @@ 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(ibuf);
-
+ BKE_stamp_info(ibuf);
+
ok = IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat);
if (ok == 0) {
perror(name);
@@ -1463,6 +1662,9 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
if ((ima->packedfile == NULL) && (G.fileflags & G_AUTOPACK))
ima->packedfile = newPackedFile(str);
}
+
+ if(ima->flag & IMA_DO_PREMUL)
+ converttopremul(ibuf);
}
else
ima->ok= 0;
@@ -1655,7 +1857,7 @@ ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
/* UV testgrid or black or solid etc */
if(ima->gen_x==0) ima->gen_x= 256;
if(ima->gen_y==0) ima->gen_y= 256;
- ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, ima->gen_type, color);
+ ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 0, ima->gen_type, color);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
ima->ok= IMA_OK_LOADED;
}
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c
new file mode 100644
index 00000000000..8490966283e
--- /dev/null
+++ b/source/blender/blenkernel/intern/implicit.c
@@ -0,0 +1,1638 @@
+/* implicit.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) Blender Foundation
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+#include "math.h"
+#include "float.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "MEM_guardedalloc.h"
+/* types */
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_cloth_types.h"
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_modifier_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_threads.h"
+#include "BKE_curve.h"
+#include "BKE_displist.h"
+#include "BKE_effect.h"
+#include "BKE_global.h"
+#include "BKE_key.h"
+#include "BKE_object.h"
+#include "BKE_cloth.h"
+#include "BKE_modifier.h"
+#include "BKE_utildefines.h"
+#include "BKE_global.h"
+#include "BIF_editdeform.h"
+
+
+#ifdef _WIN32
+#include <windows.h>
+static LARGE_INTEGER _itstart, _itend;
+static LARGE_INTEGER ifreq;
+void itstart(void)
+{
+ static int first = 1;
+ if(first) {
+ QueryPerformanceFrequency(&ifreq);
+ first = 0;
+ }
+ QueryPerformanceCounter(&_itstart);
+}
+void itend(void)
+{
+ QueryPerformanceCounter(&_itend);
+}
+double itval()
+{
+ return ((double)_itend.QuadPart -
+ (double)_itstart.QuadPart)/((double)ifreq.QuadPart);
+}
+#else
+#include <sys/time.h>
+// intrinsics need better compile flag checking
+// #include <xmmintrin.h>
+// #include <pmmintrin.h>
+// #include <pthread.h>
+
+ static struct timeval _itstart, _itend;
+ static struct timezone itz;
+ void itstart(void)
+{
+ gettimeofday(&_itstart, &itz);
+}
+void itend(void)
+{
+ gettimeofday(&_itend,&itz);
+}
+double itval()
+{
+ double t1, t2;
+ t1 = (double)_itstart.tv_sec + (double)_itstart.tv_usec/(1000*1000);
+ t2 = (double)_itend.tv_sec + (double)_itend.tv_usec/(1000*1000);
+ return t2-t1;
+}
+#endif
+
+/* callbacks for errors and interrupts and some goo */
+static int (*CT_localInterruptCallBack)(void) = NULL;
+
+static float I[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
+static float ZERO[3][3] = {{0,0,0}, {0,0,0}, {0,0,0}};
+
+/*
+#define C99
+#ifdef C99
+#defineDO_INLINE inline
+#else
+#defineDO_INLINE static
+#endif
+*/
+struct Cloth;
+
+//////////////////////////////////////////
+/* fast vector / matrix library, enhancements are welcome :) -dg */
+/////////////////////////////////////////
+
+/* DEFINITIONS */
+typedef float lfVector[3];
+typedef struct fmatrix3x3 {
+ float m[3][3]; /* 3x3 matrix */
+ unsigned int c,r; /* column and row number */
+ int pinned; /* is this vertex allowed to move? */
+ float n1,n2,n3; /* three normal vectors for collision constrains */
+ unsigned int vcount; /* vertex count */
+ unsigned int scount; /* spring count */
+} fmatrix3x3;
+
+///////////////////////////
+// float[3] vector
+///////////////////////////
+/* simple vector code */
+/* STATUS: verified */
+DO_INLINE void mul_fvector_S(float to[3], float from[3], float scalar)
+{
+ to[0] = from[0] * scalar;
+ to[1] = from[1] * scalar;
+ to[2] = from[2] * scalar;
+}
+/* simple cross product */
+/* STATUS: verified */
+DO_INLINE void cross_fvector(float to[3], float vectorA[3], float vectorB[3])
+{
+ to[0] = vectorA[1] * vectorB[2] - vectorA[2] * vectorB[1];
+ to[1] = vectorA[2] * vectorB[0] - vectorA[0] * vectorB[2];
+ to[2] = vectorA[0] * vectorB[1] - vectorA[1] * vectorB[0];
+}
+/* simple v^T * v product ("outer product") */
+/* STATUS: HAS TO BE verified (*should* work) */
+DO_INLINE void mul_fvectorT_fvector(float to[3][3], float vectorA[3], float vectorB[3])
+{
+ mul_fvector_S(to[0], vectorB, vectorA[0]);
+ mul_fvector_S(to[1], vectorB, vectorA[1]);
+ mul_fvector_S(to[2], vectorB, vectorA[2]);
+}
+/* simple v^T * v product with scalar ("outer product") */
+/* STATUS: HAS TO BE verified (*should* work) */
+DO_INLINE void mul_fvectorT_fvectorS(float to[3][3], float vectorA[3], float vectorB[3], float aS)
+{
+ mul_fvectorT_fvector(to, vectorA, vectorB);
+ mul_fvector_S(to[0], to[0], aS);
+ mul_fvector_S(to[1], to[1], aS);
+ mul_fvector_S(to[2], to[2], aS);
+}
+
+
+/* printf vector[3] on console: for debug output */
+void print_fvector(float m3[3])
+{
+ printf("%f\n%f\n%f\n\n",m3[0],m3[1],m3[2]);
+}
+
+///////////////////////////
+// long float vector float (*)[3]
+///////////////////////////
+/* print long vector on console: for debug output */
+DO_INLINE void print_lfvector(float (*fLongVector)[3], unsigned int verts)
+{
+ unsigned int i = 0;
+ for(i = 0; i < verts; i++)
+ {
+ print_fvector(fLongVector[i]);
+ }
+}
+/* create long vector */
+DO_INLINE lfVector *create_lfvector(unsigned int verts)
+{
+ // TODO: check if memory allocation was successfull */
+ return (lfVector *)MEM_callocN (verts * sizeof(lfVector), "cloth_implicit_alloc_vector");
+ // return (lfVector *)cloth_aligned_malloc(&MEMORY_BASE, verts * sizeof(lfVector));
+}
+/* delete long vector */
+DO_INLINE void del_lfvector(float (*fLongVector)[3])
+{
+ if (fLongVector != NULL)
+ {
+ MEM_freeN (fLongVector);
+ // cloth_aligned_free(&MEMORY_BASE, fLongVector);
+ }
+}
+/* copy long vector */
+DO_INLINE void cp_lfvector(float (*to)[3], float (*from)[3], unsigned int verts)
+{
+ memcpy(to, from, verts * sizeof(lfVector));
+}
+/* init long vector with float[3] */
+DO_INLINE void init_lfvector(float (*fLongVector)[3], float vector[3], unsigned int verts)
+{
+ unsigned int i = 0;
+ for(i = 0; i < verts; i++)
+ {
+ VECCOPY(fLongVector[i], vector);
+ }
+}
+/* zero long vector with float[3] */
+DO_INLINE void zero_lfvector(float (*to)[3], unsigned int verts)
+{
+ memset(to, 0.0f, verts * sizeof(lfVector));
+}
+/* multiply long vector with scalar*/
+DO_INLINE void mul_lfvectorS(float (*to)[3], float (*fLongVector)[3], float scalar, unsigned int verts)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < verts; i++)
+ {
+ mul_fvector_S(to[i], fLongVector[i], scalar);
+ }
+}
+/* multiply long vector with scalar*/
+/* A -= B * float */
+DO_INLINE void submul_lfvectorS(float (*to)[3], float (*fLongVector)[3], float scalar, unsigned int verts)
+{
+ unsigned int i = 0;
+ for(i = 0; i < verts; i++)
+ {
+ VECSUBMUL(to[i], fLongVector[i], scalar);
+ }
+}
+/* dot product for big vector */
+DO_INLINE float dot_lfvector(float (*fLongVectorA)[3], float (*fLongVectorB)[3], unsigned int verts)
+{
+ unsigned int i = 0;
+ float temp = 0.0;
+// schedule(guided, 2)
+#pragma omp parallel for reduction(+: temp)
+ for(i = 0; i < verts; i++)
+ {
+ temp += INPR(fLongVectorA[i], fLongVectorB[i]);
+ }
+ return temp;
+}
+/* A = B + C --> for big vector */
+DO_INLINE void add_lfvector_lfvector(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], unsigned int verts)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < verts; i++)
+ {
+ VECADD(to[i], fLongVectorA[i], fLongVectorB[i]);
+ }
+
+}
+/* A = B + C * float --> for big vector */
+DO_INLINE void add_lfvector_lfvectorS(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], float bS, unsigned int verts)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < verts; i++)
+ {
+ VECADDS(to[i], fLongVectorA[i], fLongVectorB[i], bS);
+
+ }
+}
+/* A = B * float + C * float --> for big vector */
+DO_INLINE void add_lfvectorS_lfvectorS(float (*to)[3], float (*fLongVectorA)[3], float aS, float (*fLongVectorB)[3], float bS, unsigned int verts)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < verts; i++)
+ {
+ VECADDSS(to[i], fLongVectorA[i], aS, fLongVectorB[i], bS);
+ }
+}
+/* A = B - C * float --> for big vector */
+DO_INLINE void sub_lfvector_lfvectorS(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], float bS, unsigned int verts)
+{
+ unsigned int i = 0;
+ for(i = 0; i < verts; i++)
+ {
+ VECSUBS(to[i], fLongVectorA[i], fLongVectorB[i], bS);
+ }
+
+}
+/* A = B - C --> for big vector */
+DO_INLINE void sub_lfvector_lfvector(float (*to)[3], float (*fLongVectorA)[3], float (*fLongVectorB)[3], unsigned int verts)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < verts; i++)
+ {
+ VECSUB(to[i], fLongVectorA[i], fLongVectorB[i]);
+ }
+
+}
+///////////////////////////
+// 3x3 matrix
+///////////////////////////
+/* printf 3x3 matrix on console: for debug output */
+void print_fmatrix(float m3[3][3])
+{
+ printf("%f\t%f\t%f\n",m3[0][0],m3[0][1],m3[0][2]);
+ printf("%f\t%f\t%f\n",m3[1][0],m3[1][1],m3[1][2]);
+ printf("%f\t%f\t%f\n\n",m3[2][0],m3[2][1],m3[2][2]);
+}
+
+/* copy 3x3 matrix */
+DO_INLINE void cp_fmatrix(float to[3][3], float from[3][3])
+{
+ // memcpy(to, from, sizeof (float) * 9);
+ VECCOPY(to[0], from[0]);
+ VECCOPY(to[1], from[1]);
+ VECCOPY(to[2], from[2]);
+}
+
+/* copy 3x3 matrix */
+DO_INLINE void initdiag_fmatrixS(float to[3][3], float aS)
+{
+ cp_fmatrix(to, ZERO);
+
+ to[0][0] = aS;
+ to[1][1] = aS;
+ to[2][2] = aS;
+}
+
+/* calculate determinant of 3x3 matrix */
+DO_INLINE float det_fmatrix(float m[3][3])
+{
+ return m[0][0]*m[1][1]*m[2][2] + m[1][0]*m[2][1]*m[0][2] + m[0][1]*m[1][2]*m[2][0]
+ -m[0][0]*m[1][2]*m[2][1] - m[0][1]*m[1][0]*m[2][2] - m[2][0]*m[1][1]*m[0][2];
+}
+
+DO_INLINE void inverse_fmatrix(float to[3][3], float from[3][3])
+{
+ unsigned int i, j;
+ float d;
+
+ if((d=det_fmatrix(from))==0)
+ {
+ printf("can't build inverse");
+ exit(0);
+ }
+ for(i=0;i<3;i++)
+ {
+ for(j=0;j<3;j++)
+ {
+ int i1=(i+1)%3;
+ int i2=(i+2)%3;
+ int j1=(j+1)%3;
+ int j2=(j+2)%3;
+ // reverse indexs i&j to take transpose
+ to[j][i] = (from[i1][j1]*from[i2][j2]-from[i1][j2]*from[i2][j1])/d;
+ /*
+ if(i==j)
+ to[i][j] = 1.0f / from[i][j];
+ else
+ to[i][j] = 0;
+ */
+ }
+ }
+
+}
+
+/* 3x3 matrix multiplied by a scalar */
+/* STATUS: verified */
+DO_INLINE void mul_fmatrix_S(float matrix[3][3], float scalar)
+{
+ mul_fvector_S(matrix[0], matrix[0],scalar);
+ mul_fvector_S(matrix[1], matrix[1],scalar);
+ mul_fvector_S(matrix[2], matrix[2],scalar);
+}
+
+/* a vector multiplied by a 3x3 matrix */
+/* STATUS: verified */
+DO_INLINE void mul_fvector_fmatrix(float *to, float *from, float matrix[3][3])
+{
+ to[0] = matrix[0][0]*from[0] + matrix[1][0]*from[1] + matrix[2][0]*from[2];
+ to[1] = matrix[0][1]*from[0] + matrix[1][1]*from[1] + matrix[2][1]*from[2];
+ to[2] = matrix[0][2]*from[0] + matrix[1][2]*from[1] + matrix[2][2]*from[2];
+}
+
+/* 3x3 matrix multiplied by a vector */
+/* STATUS: verified */
+DO_INLINE void mul_fmatrix_fvector(float *to, float matrix[3][3], float *from)
+{
+ to[0] = INPR(matrix[0],from);
+ to[1] = INPR(matrix[1],from);
+ to[2] = INPR(matrix[2],from);
+}
+/* 3x3 matrix multiplied by a 3x3 matrix */
+/* STATUS: verified */
+DO_INLINE void mul_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ mul_fvector_fmatrix(to[0], matrixA[0],matrixB);
+ mul_fvector_fmatrix(to[1], matrixA[1],matrixB);
+ mul_fvector_fmatrix(to[2], matrixA[2],matrixB);
+}
+/* 3x3 matrix addition with 3x3 matrix */
+DO_INLINE void add_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ VECADD(to[0], matrixA[0], matrixB[0]);
+ VECADD(to[1], matrixA[1], matrixB[1]);
+ VECADD(to[2], matrixA[2], matrixB[2]);
+}
+/* 3x3 matrix add-addition with 3x3 matrix */
+DO_INLINE void addadd_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ VECADDADD(to[0], matrixA[0], matrixB[0]);
+ VECADDADD(to[1], matrixA[1], matrixB[1]);
+ VECADDADD(to[2], matrixA[2], matrixB[2]);
+}
+/* 3x3 matrix sub-addition with 3x3 matrix */
+DO_INLINE void addsub_fmatrixS_fmatrixS(float to[3][3], float matrixA[3][3], float aS, float matrixB[3][3], float bS)
+{
+ VECADDSUBSS(to[0], matrixA[0], aS, matrixB[0], bS);
+ VECADDSUBSS(to[1], matrixA[1], aS, matrixB[1], bS);
+ VECADDSUBSS(to[2], matrixA[2], aS, matrixB[2], bS);
+}
+/* A -= B + C (3x3 matrix sub-addition with 3x3 matrix) */
+DO_INLINE void subadd_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ VECSUBADD(to[0], matrixA[0], matrixB[0]);
+ VECSUBADD(to[1], matrixA[1], matrixB[1]);
+ VECSUBADD(to[2], matrixA[2], matrixB[2]);
+}
+/* A -= B*x + C*y (3x3 matrix sub-addition with 3x3 matrix) */
+DO_INLINE void subadd_fmatrixS_fmatrixS(float to[3][3], float matrixA[3][3], float aS, float matrixB[3][3], float bS)
+{
+ VECSUBADDSS(to[0], matrixA[0], aS, matrixB[0], bS);
+ VECSUBADDSS(to[1], matrixA[1], aS, matrixB[1], bS);
+ VECSUBADDSS(to[2], matrixA[2], aS, matrixB[2], bS);
+}
+/* A = B - C (3x3 matrix subtraction with 3x3 matrix) */
+DO_INLINE void sub_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ VECSUB(to[0], matrixA[0], matrixB[0]);
+ VECSUB(to[1], matrixA[1], matrixB[1]);
+ VECSUB(to[2], matrixA[2], matrixB[2]);
+}
+/* A += B - C (3x3 matrix add-subtraction with 3x3 matrix) */
+DO_INLINE void addsub_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ VECADDSUB(to[0], matrixA[0], matrixB[0]);
+ VECADDSUB(to[1], matrixA[1], matrixB[1]);
+ VECADDSUB(to[2], matrixA[2], matrixB[2]);
+}
+/////////////////////////////////////////////////////////////////
+// special functions
+/////////////////////////////////////////////////////////////////
+/* a vector multiplied and added to/by a 3x3 matrix */
+DO_INLINE void muladd_fvector_fmatrix(float to[3], float from[3], float matrix[3][3])
+{
+ to[0] += matrix[0][0]*from[0] + matrix[1][0]*from[1] + matrix[2][0]*from[2];
+ to[1] += matrix[0][1]*from[0] + matrix[1][1]*from[1] + matrix[2][1]*from[2];
+ to[2] += matrix[0][2]*from[0] + matrix[1][2]*from[1] + matrix[2][2]*from[2];
+}
+/* 3x3 matrix multiplied and added to/by a 3x3 matrix and added to another 3x3 matrix */
+DO_INLINE void muladd_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ muladd_fvector_fmatrix(to[0], matrixA[0],matrixB);
+ muladd_fvector_fmatrix(to[1], matrixA[1],matrixB);
+ muladd_fvector_fmatrix(to[2], matrixA[2],matrixB);
+}
+/* a vector multiplied and sub'd to/by a 3x3 matrix */
+DO_INLINE void mulsub_fvector_fmatrix(float to[3], float from[3], float matrix[3][3])
+{
+ to[0] -= matrix[0][0]*from[0] + matrix[1][0]*from[1] + matrix[2][0]*from[2];
+ to[1] -= matrix[0][1]*from[0] + matrix[1][1]*from[1] + matrix[2][1]*from[2];
+ to[2] -= matrix[0][2]*from[0] + matrix[1][2]*from[1] + matrix[2][2]*from[2];
+}
+/* 3x3 matrix multiplied and sub'd to/by a 3x3 matrix and added to another 3x3 matrix */
+DO_INLINE void mulsub_fmatrix_fmatrix(float to[3][3], float matrixA[3][3], float matrixB[3][3])
+{
+ mulsub_fvector_fmatrix(to[0], matrixA[0],matrixB);
+ mulsub_fvector_fmatrix(to[1], matrixA[1],matrixB);
+ mulsub_fvector_fmatrix(to[2], matrixA[2],matrixB);
+}
+/* 3x3 matrix multiplied+added by a vector */
+/* STATUS: verified */
+DO_INLINE void muladd_fmatrix_fvector(float to[3], float matrix[3][3], float from[3])
+{
+ to[0] += INPR(matrix[0],from);
+ to[1] += INPR(matrix[1],from);
+ to[2] += INPR(matrix[2],from);
+}
+/* 3x3 matrix multiplied+sub'ed by a vector */
+DO_INLINE void mulsub_fmatrix_fvector(float to[3], float matrix[3][3], float from[3])
+{
+ to[0] -= INPR(matrix[0],from);
+ to[1] -= INPR(matrix[1],from);
+ to[2] -= INPR(matrix[2],from);
+}
+/////////////////////////////////////////////////////////////////
+
+///////////////////////////
+// SPARSE SYMMETRIC big matrix with 3x3 matrix entries
+///////////////////////////
+/* printf a big matrix on console: for debug output */
+void print_bfmatrix(fmatrix3x3 *m3)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < m3[0].vcount + m3[0].scount; i++)
+ {
+ print_fmatrix(m3[i].m);
+ }
+}
+/* create big matrix */
+DO_INLINE fmatrix3x3 *create_bfmatrix(unsigned int verts, unsigned int springs)
+{
+ // TODO: check if memory allocation was successfull */
+ fmatrix3x3 *temp = (fmatrix3x3 *)MEM_callocN (sizeof (fmatrix3x3) * (verts + springs), "cloth_implicit_alloc_matrix");
+ temp[0].vcount = verts;
+ temp[0].scount = springs;
+ return temp;
+}
+/* delete big matrix */
+DO_INLINE void del_bfmatrix(fmatrix3x3 *matrix)
+{
+ if (matrix != NULL)
+ {
+ MEM_freeN (matrix);
+ }
+}
+
+/* copy big matrix */
+DO_INLINE void cp_bfmatrix(fmatrix3x3 *to, fmatrix3x3 *from)
+{
+ // TODO bounds checking
+ memcpy(to, from, sizeof(fmatrix3x3) * (from[0].vcount+from[0].scount) );
+}
+
+/* init big matrix */
+// slow in parallel
+DO_INLINE void init_bfmatrix(fmatrix3x3 *matrix, float m3[3][3])
+{
+ unsigned int i;
+
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ cp_fmatrix(matrix[i].m, m3);
+ }
+}
+
+/* init the diagonal of big matrix */
+// slow in parallel
+DO_INLINE void initdiag_bfmatrix(fmatrix3x3 *matrix, float m3[3][3])
+{
+ unsigned int i,j;
+ float tmatrix[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
+
+ for(i = 0; i < matrix[0].vcount; i++)
+ {
+ cp_fmatrix(matrix[i].m, m3);
+ }
+ for(j = matrix[0].vcount; j < matrix[0].vcount+matrix[0].scount; j++)
+ {
+ cp_fmatrix(matrix[j].m, tmatrix);
+ }
+}
+
+/* multiply big matrix with scalar*/
+DO_INLINE void mul_bfmatrix_S(fmatrix3x3 *matrix, float scalar)
+{
+ unsigned int i = 0;
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ mul_fmatrix_S(matrix[i].m, scalar);
+ }
+}
+
+/* SPARSE SYMMETRIC multiply big matrix with long vector*/
+/* STATUS: verified */
+DO_INLINE void mul_bfmatrix_lfvector( float (*to)[3], fmatrix3x3 *from, lfVector *fLongVector)
+{
+ unsigned int i = 0;
+ lfVector *temp = create_lfvector(from[0].vcount);
+
+ zero_lfvector(to, from[0].vcount);
+
+#pragma omp parallel sections private(i)
+ {
+#pragma omp section
+ {
+ for(i = from[0].vcount; i < from[0].vcount+from[0].scount; i++)
+ {
+ muladd_fmatrix_fvector(to[from[i].c], from[i].m, fLongVector[from[i].r]);
+ }
+ }
+#pragma omp section
+ {
+ for(i = 0; i < from[0].vcount+from[0].scount; i++)
+ {
+ muladd_fmatrix_fvector(temp[from[i].r], from[i].m, fLongVector[from[i].c]);
+ }
+ }
+ }
+ add_lfvector_lfvector(to, to, temp, from[0].vcount);
+
+ del_lfvector(temp);
+
+
+}
+
+/* SPARSE SYMMETRIC multiply big matrix with long vector (for diagonal preconditioner) */
+/* STATUS: verified */
+DO_INLINE void mul_prevfmatrix_lfvector( float (*to)[3], fmatrix3x3 *from, lfVector *fLongVector)
+{
+ unsigned int i = 0;
+
+ for(i = 0; i < from[0].vcount; i++)
+ {
+ mul_fmatrix_fvector(to[from[i].r], from[i].m, fLongVector[from[i].c]);
+ }
+}
+
+/* SPARSE SYMMETRIC add big matrix with big matrix: A = B + C*/
+DO_INLINE void add_bfmatrix_bfmatrix( fmatrix3x3 *to, fmatrix3x3 *from, fmatrix3x3 *matrix)
+{
+ unsigned int i = 0;
+
+ /* process diagonal elements */
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ add_fmatrix_fmatrix(to[i].m, from[i].m, matrix[i].m);
+ }
+
+}
+/* SPARSE SYMMETRIC add big matrix with big matrix: A += B + C */
+DO_INLINE void addadd_bfmatrix_bfmatrix( fmatrix3x3 *to, fmatrix3x3 *from, fmatrix3x3 *matrix)
+{
+ unsigned int i = 0;
+
+ /* process diagonal elements */
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ addadd_fmatrix_fmatrix(to[i].m, from[i].m, matrix[i].m);
+ }
+
+}
+/* SPARSE SYMMETRIC subadd big matrix with big matrix: A -= B + C */
+DO_INLINE void subadd_bfmatrix_bfmatrix( fmatrix3x3 *to, fmatrix3x3 *from, fmatrix3x3 *matrix)
+{
+ unsigned int i = 0;
+
+ /* process diagonal elements */
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ subadd_fmatrix_fmatrix(to[i].m, from[i].m, matrix[i].m);
+ }
+
+}
+/* A = B - C (SPARSE SYMMETRIC sub big matrix with big matrix) */
+DO_INLINE void sub_bfmatrix_bfmatrix( fmatrix3x3 *to, fmatrix3x3 *from, fmatrix3x3 *matrix)
+{
+ unsigned int i = 0;
+
+ /* process diagonal elements */
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ sub_fmatrix_fmatrix(to[i].m, from[i].m, matrix[i].m);
+ }
+
+}
+/* SPARSE SYMMETRIC sub big matrix with big matrix S (special constraint matrix with limited entries) */
+DO_INLINE void sub_bfmatrix_Smatrix( fmatrix3x3 *to, fmatrix3x3 *from, fmatrix3x3 *matrix)
+{
+ unsigned int i = 0;
+
+ /* process diagonal elements */
+ for(i = 0; i < matrix[0].vcount; i++)
+ {
+ sub_fmatrix_fmatrix(to[matrix[i].c].m, from[matrix[i].c].m, matrix[i].m);
+ }
+
+}
+/* A += B - C (SPARSE SYMMETRIC addsub big matrix with big matrix) */
+DO_INLINE void addsub_bfmatrix_bfmatrix( fmatrix3x3 *to, fmatrix3x3 *from, fmatrix3x3 *matrix)
+{
+ unsigned int i = 0;
+
+ /* process diagonal elements */
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ addsub_fmatrix_fmatrix(to[i].m, from[i].m, matrix[i].m);
+ }
+
+}
+/* SPARSE SYMMETRIC sub big matrix with big matrix*/
+/* A -= B * float + C * float --> for big matrix */
+/* VERIFIED */
+DO_INLINE void subadd_bfmatrixS_bfmatrixS( fmatrix3x3 *to, fmatrix3x3 *from, float aS, fmatrix3x3 *matrix, float bS)
+{
+ unsigned int i = 0;
+
+ /* process diagonal elements */
+ for(i = 0; i < matrix[0].vcount+matrix[0].scount; i++)
+ {
+ subadd_fmatrixS_fmatrixS(to[i].m, from[i].m, aS, matrix[i].m, bS);
+ }
+
+}
+
+///////////////////////////////////////////////////////////////////
+// simulator start
+///////////////////////////////////////////////////////////////////
+typedef struct Implicit_Data
+{
+ lfVector *X, *V, *Xnew, *Vnew, *olddV, *F, *B, *dV, *z;
+ fmatrix3x3 *A, *dFdV, *dFdX, *S, *P, *Pinv, *bigI, *M;
+} Implicit_Data;
+
+int implicit_init (Object *ob, ClothModifierData *clmd)
+{
+ unsigned int i = 0;
+ unsigned int pinned = 0;
+ Cloth *cloth = NULL;
+ ClothVertex *verts = NULL;
+ ClothSpring *spring = NULL;
+ Implicit_Data *id = NULL;
+ LinkNode *search = NULL;
+
+ if(G.rt > 0)
+ printf("implicit_init\n");
+
+ // init memory guard
+ // MEMORY_BASE.first = MEMORY_BASE.last = NULL;
+
+ cloth = (Cloth *)clmd->clothObject;
+ verts = cloth->verts;
+
+ // create implicit base
+ id = (Implicit_Data *)MEM_callocN (sizeof(Implicit_Data), "implicit vecmat");
+ cloth->implicit = id;
+
+ /* process diagonal elements */
+ id->A = create_bfmatrix(cloth->numverts, cloth->numsprings);
+ id->dFdV = create_bfmatrix(cloth->numverts, cloth->numsprings);
+ id->dFdX = create_bfmatrix(cloth->numverts, cloth->numsprings);
+ id->S = create_bfmatrix(cloth->numverts, 0);
+ id->Pinv = create_bfmatrix(cloth->numverts, cloth->numsprings);
+ id->P = create_bfmatrix(cloth->numverts, cloth->numsprings);
+ id->bigI = create_bfmatrix(cloth->numverts, cloth->numsprings); // TODO 0 springs
+ id->M = create_bfmatrix(cloth->numverts, cloth->numsprings);
+ id->X = create_lfvector(cloth->numverts);
+ id->Xnew = create_lfvector(cloth->numverts);
+ id->V = create_lfvector(cloth->numverts);
+ id->Vnew = create_lfvector(cloth->numverts);
+ id->olddV = create_lfvector(cloth->numverts);
+ zero_lfvector(id->olddV, cloth->numverts);
+ id->F = create_lfvector(cloth->numverts);
+ id->B = create_lfvector(cloth->numverts);
+ id->dV = create_lfvector(cloth->numverts);
+ id->z = create_lfvector(cloth->numverts);
+
+ for(i=0;i<cloth->numverts;i++)
+ {
+ id->A[i].r = id->A[i].c = id->dFdV[i].r = id->dFdV[i].c = id->dFdX[i].r = id->dFdX[i].c = id->P[i].c = id->P[i].r = id->Pinv[i].c = id->Pinv[i].r = id->bigI[i].c = id->bigI[i].r = id->M[i].r = id->M[i].c = i;
+
+ if(verts [i].goal >= SOFTGOALSNAP)
+ {
+ id->S[pinned].pinned = 1;
+ id->S[pinned].c = id->S[pinned].r = i;
+ pinned++;
+ }
+
+ initdiag_fmatrixS(id->M[i].m, verts[i].mass);
+ }
+
+ // S is special and needs specific vcount and scount
+ id->S[0].vcount = pinned; id->S[0].scount = 0;
+
+ // init springs
+ search = cloth->springs;
+ for(i=0;i<cloth->numsprings;i++)
+ {
+ spring = search->link;
+
+ // dFdV_start[i].r = big_I[i].r = big_zero[i].r =
+ id->A[i+cloth->numverts].r = id->dFdV[i+cloth->numverts].r = id->dFdX[i+cloth->numverts].r =
+ id->P[i+cloth->numverts].r = id->Pinv[i+cloth->numverts].r = id->bigI[i+cloth->numverts].r = id->M[i+cloth->numverts].r = spring->ij;
+
+ // dFdV_start[i].c = big_I[i].c = big_zero[i].c =
+ id->A[i+cloth->numverts].c = id->dFdV[i+cloth->numverts].c = id->dFdX[i+cloth->numverts].c =
+ id->P[i+cloth->numverts].c = id->Pinv[i+cloth->numverts].c = id->bigI[i+cloth->numverts].c = id->M[i+cloth->numverts].c = spring->kl;
+
+ spring->matrix_index = i + cloth->numverts;
+
+ search = search->next;
+ }
+
+ for(i = 0; i < cloth->numverts; i++)
+ {
+ VECCOPY(id->X[i], verts[i].x);
+ }
+
+ return 1;
+}
+int implicit_free (ClothModifierData *clmd)
+{
+ Implicit_Data *id;
+ Cloth *cloth;
+ cloth = (Cloth *)clmd->clothObject;
+
+ if(cloth)
+ {
+ id = cloth->implicit;
+
+ if(id)
+ {
+ del_bfmatrix(id->A);
+ del_bfmatrix(id->dFdV);
+ del_bfmatrix(id->dFdX);
+ del_bfmatrix(id->S);
+ del_bfmatrix(id->P);
+ del_bfmatrix(id->Pinv);
+ del_bfmatrix(id->bigI);
+ del_bfmatrix(id->M);
+
+ del_lfvector(id->X);
+ del_lfvector(id->Xnew);
+ del_lfvector(id->V);
+ del_lfvector(id->Vnew);
+ del_lfvector(id->olddV);
+ del_lfvector(id->F);
+ del_lfvector(id->B);
+ del_lfvector(id->dV);
+ del_lfvector(id->z);
+
+ MEM_freeN(id);
+ }
+ }
+
+ return 1;
+}
+
+DO_INLINE float fb(float length, float L)
+{
+ float x = length/L;
+ return (-11.541f*pow(x,4)+34.193f*pow(x,3)-39.083f*pow(x,2)+23.116f*x-9.713f);
+}
+
+DO_INLINE float fbderiv(float length, float L)
+{
+ float x = length/L;
+
+ return (-46.164f*pow(x,3)+102.579f*pow(x,2)-78.166f*x+23.116f);
+}
+
+DO_INLINE float fbstar(float length, float L, float kb, float cb)
+{
+ float tempfb = kb * fb(length, L);
+
+ float fbstar = cb * (length - L);
+
+ if(tempfb < fbstar)
+ return fbstar;
+ else
+ return tempfb;
+}
+
+// function to calculae bending spring force (taken from Choi & Co)
+DO_INLINE float fbstar_jacobi(float length, float L, float kb, float cb)
+{
+ float tempfb = kb * fb(length, L);
+ float fbstar = cb * (length - L);
+
+ if(tempfb < fbstar)
+ {
+ return cb;
+ }
+ else
+ {
+ return kb * fbderiv(length, L);
+ }
+}
+
+DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
+{
+ unsigned int i=0;
+
+ for(i=0;i<S[0].vcount;i++)
+ {
+ mul_fvector_fmatrix(V[S[i].r], V[S[i].r], S[i].m);
+ }
+}
+
+int cg_filtered(lfVector *ldV, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S)
+{
+ // Solves for unknown X in equation AX=B
+ unsigned int conjgrad_loopcount=0, conjgrad_looplimit=100;
+ float conjgrad_epsilon=0.0001f, conjgrad_lasterror=0;
+ lfVector *q, *d, *tmp, *r;
+ float s, starget, a, s_prev;
+ unsigned int numverts = lA[0].vcount;
+ q = create_lfvector(numverts);
+ d = create_lfvector(numverts);
+ tmp = create_lfvector(numverts);
+ r = create_lfvector(numverts);
+
+ // zero_lfvector(ldV, CLOTHPARTICLES);
+ filter(ldV, S);
+
+ add_lfvector_lfvector(ldV, ldV, z, numverts);
+
+ // r = B - Mul(tmp,A,X); // just use B if X known to be zero
+ cp_lfvector(r, lB, numverts);
+ mul_bfmatrix_lfvector(tmp, lA, ldV);
+ sub_lfvector_lfvector(r, r, tmp, numverts);
+
+ filter(r,S);
+
+ cp_lfvector(d, r, numverts);
+
+ s = dot_lfvector(r, r, numverts);
+ starget = s * sqrt(conjgrad_epsilon);
+
+ while((s>starget && conjgrad_loopcount < conjgrad_looplimit))
+ {
+ // Mul(q,A,d); // q = A*d;
+ mul_bfmatrix_lfvector(q, lA, d);
+
+ filter(q,S);
+
+ a = s/dot_lfvector(d, q, numverts);
+
+ // X = X + d*a;
+ add_lfvector_lfvectorS(ldV, ldV, d, a, numverts);
+
+ // r = r - q*a;
+ sub_lfvector_lfvectorS(r, r, q, a, numverts);
+
+ s_prev = s;
+ s = dot_lfvector(r, r, numverts);
+
+ //d = r+d*(s/s_prev);
+ add_lfvector_lfvectorS(d, r, d, (s/s_prev), numverts);
+
+ filter(d,S);
+
+ conjgrad_loopcount++;
+ }
+ conjgrad_lasterror = s;
+
+ del_lfvector(q);
+ del_lfvector(d);
+ del_lfvector(tmp);
+ del_lfvector(r);
+ // printf("W/O conjgrad_loopcount: %d\n", conjgrad_loopcount);
+
+ return conjgrad_loopcount<conjgrad_looplimit; // true means we reached desired accuracy in given time - ie stable
+}
+
+// block diagonalizer
+DO_INLINE void BuildPPinv(fmatrix3x3 *lA, fmatrix3x3 *P, fmatrix3x3 *Pinv)
+{
+ unsigned int i = 0;
+
+ // Take only the diagonal blocks of A
+// #pragma omp parallel for private(i)
+ for(i = 0; i<lA[0].vcount; i++)
+ {
+ // block diagonalizer
+ cp_fmatrix(P[i].m, lA[i].m);
+ inverse_fmatrix(Pinv[i].m, P[i].m);
+
+ }
+}
+
+// version 1.3
+int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv)
+{
+ unsigned int numverts = lA[0].vcount, iterations = 0, conjgrad_looplimit=100;
+ float delta0 = 0, deltaNew = 0, deltaOld = 0, alpha = 0;
+ float conjgrad_epsilon=0.0001; // 0.2 is dt for steps=5
+ lfVector *r = create_lfvector(numverts);
+ lfVector *p = create_lfvector(numverts);
+ lfVector *s = create_lfvector(numverts);
+ lfVector *h = create_lfvector(numverts);
+
+ BuildPPinv(lA, P, Pinv);
+
+ filter(dv, S);
+ add_lfvector_lfvector(dv, dv, z, numverts);
+
+ mul_bfmatrix_lfvector(r, lA, dv);
+ sub_lfvector_lfvector(r, lB, r, numverts);
+ filter(r, S);
+
+ mul_prevfmatrix_lfvector(p, Pinv, r);
+ filter(p, S);
+
+ deltaNew = dot_lfvector(r, p, numverts);
+
+ delta0 = deltaNew * sqrt(conjgrad_epsilon);
+
+ // itstart();
+
+ while ((deltaNew > delta0) && (iterations < conjgrad_looplimit))
+ {
+ iterations++;
+
+ mul_bfmatrix_lfvector(s, lA, p);
+ filter(s, S);
+
+ alpha = deltaNew / dot_lfvector(p, s, numverts);
+
+ add_lfvector_lfvectorS(dv, dv, p, alpha, numverts);
+
+ add_lfvector_lfvectorS(r, r, s, -alpha, numverts);
+
+ mul_prevfmatrix_lfvector(h, Pinv, r);
+ filter(h, S);
+
+ deltaOld = deltaNew;
+
+ deltaNew = dot_lfvector(r, h, numverts);
+
+ add_lfvector_lfvectorS(p, h, p, deltaNew / deltaOld, numverts);
+
+ filter(p, S);
+
+ }
+
+ // itend();
+ // printf("cg_filtered_pre time: %f\n", (float)itval());
+
+ del_lfvector(h);
+ del_lfvector(s);
+ del_lfvector(p);
+ del_lfvector(r);
+
+ // printf("iterations: %d\n", iterations);
+
+ return iterations<conjgrad_looplimit;
+}
+
+// outer product is NOT cross product!!!
+DO_INLINE void dfdx_spring_type1(float to[3][3], float extent[3], float length, float L, float dot, float k)
+{
+ // dir is unit length direction, rest is spring's restlength, k is spring constant.
+ // return (outerprod(dir,dir)*k + (I - outerprod(dir,dir))*(k - ((k*L)/length)));
+ float temp[3][3];
+ float temp1 = k*(1.0 - (L/length));
+ mul_fvectorT_fvectorS(temp, extent, extent, 1.0 / dot);
+ sub_fmatrix_fmatrix(to, I, temp);
+ mul_fmatrix_S(to, temp1);
+ mul_fvectorT_fvectorS(temp, extent, extent, k/ dot);
+ add_fmatrix_fmatrix(to, to, temp);
+ /*
+ mul_fvectorT_fvector(temp, dir, dir);
+ sub_fmatrix_fmatrix(to, I, temp);
+ mul_fmatrix_S(to, k* (1.0f-(L/length)));
+ mul_fmatrix_S(temp, k);
+ add_fmatrix_fmatrix(to, temp, to);
+ */
+}
+
+DO_INLINE void dfdx_spring_type2(float to[3][3], float dir[3], float length, float L, float k, float cb)
+{
+ // return outerprod(dir,dir)*fbstar_jacobi(length, L, k, cb);
+ mul_fvectorT_fvectorS(to, dir, dir, fbstar_jacobi(length, L, k, cb));
+}
+
+DO_INLINE void dfdv_damp(float to[3][3], float ext[3], float damping, float dot)
+{
+ // derivative of force wrt velocity.
+ mul_fvectorT_fvectorS(to, ext, ext, damping / dot);
+
+}
+
+DO_INLINE void dfdx_spring(float to[3][3], float dir[3],float length,float L,float k)
+{
+ // dir is unit length direction, rest is spring's restlength, k is spring constant.
+ //return ( (I-outerprod(dir,dir))*Min(1.0f,rest/length) - I) * -k;
+ mul_fvectorT_fvector(to, dir, dir);
+ sub_fmatrix_fmatrix(to, I, to);
+ mul_fmatrix_S(to, (((L/length)> 1.0f) ? (1.0f): (L/length)));
+ sub_fmatrix_fmatrix(to, to, I);
+ mul_fmatrix_S(to, -k);
+}
+
+// unused atm
+DO_INLINE void dfdx_damp(float to[3][3], float dir[3],float length,const float vel[3],float rest,float damping)
+{
+ // inner spring damping vel is the relative velocity of the endpoints.
+ // return (I-outerprod(dir,dir)) * (-damping * -(dot(dir,vel)/Max(length,rest)));
+ mul_fvectorT_fvector(to, dir, dir);
+ sub_fmatrix_fmatrix(to, I, to);
+ mul_fmatrix_S(to, (-damping * -(INPR(dir,vel)/MAX2(length,rest))));
+
+}
+
+DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX)
+{
+ float extent[3];
+ float length = 0, dot = 0;
+ float dir[3] = {0,0,0};
+ float vel[3];
+ float k = 0.0f;
+ float L = s->restlen;
+ float cb = clmd->sim_parms->structural;
+
+ float nullf[3] = {0,0,0};
+ float stretch_force[3] = {0,0,0};
+ float bending_force[3] = {0,0,0};
+ float damping_force[3] = {0,0,0};
+ float nulldfdx[3][3]={ {0,0,0}, {0,0,0}, {0,0,0}};
+
+ float scaling = 0.0;
+
+ VECCOPY(s->f, nullf);
+ cp_fmatrix(s->dfdx, nulldfdx);
+ cp_fmatrix(s->dfdv, nulldfdx);
+
+ // calculate elonglation
+ VECSUB(extent, X[s->kl], X[s->ij]);
+ VECSUB(vel, V[s->kl], V[s->ij]);
+ dot = INPR(extent, extent);
+ length = sqrt(dot);
+
+ s->flags &= ~CLOTH_SPRING_FLAG_NEEDED;
+
+ if(length > ABS(ALMOST_ZERO))
+ {
+ /*
+ if(length>L)
+ {
+ if((clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED)
+ && ((((length-L)*100.0f/L) > clmd->sim_parms->maxspringlen))) // cut spring!
+ {
+ s->flags |= CSPRING_FLAG_DEACTIVATE;
+ return;
+ }
+ }
+ */
+ mul_fvector_S(dir, extent, 1.0f/length);
+ }
+ else
+ {
+ mul_fvector_S(dir, extent, 0.0f);
+ }
+
+ // calculate force of structural + shear springs
+ if(s->type != CLOTH_SPRING_TYPE_BENDING)
+ {
+ if(length > L) // only on elonglation
+ {
+ s->flags |= CLOTH_SPRING_FLAG_NEEDED;
+
+ k = clmd->sim_parms->structural;
+
+ scaling = k + s->stiffness * ABS(clmd->sim_parms->max_struct-k);
+
+ k = scaling / (clmd->coll_parms->avg_spring_len + FLT_EPSILON);
+ if(G.rt>3)
+ printf("struct scaling: %f\n", k);
+
+ /*
+ if((s->ij == 4) || (s->kl == 4))
+ {
+ printf("length-L: %f, f: %f, len: %f, L: %f\n", length-L, (k*(length-L)), length, L);
+ printf("kl X-x: %f, f-y: %f, f-z: %f\n", X[s->kl][0], X[s->kl][1], X[s->kl][2]);
+ printf("ij X-x: %f, f-y: %f, f-z: %f\n\n", X[s->ij][0], X[s->ij][1], X[s->ij][2]);
+ }
+ */
+
+ // TODO: verify, half verified (couldn't see error)
+ mul_fvector_S(stretch_force, dir, k*(length-L));
+
+ VECADD(s->f, s->f, stretch_force);
+
+ // Ascher & Boxman, p.21: Damping only during elonglation
+ /* VERIFIED */
+ mul_fvector_S(damping_force, extent, clmd->sim_parms->Cdis * (INPR(vel,extent)/dot));
+ VECADD(s->f, s->f, damping_force);
+
+ // TODO: verify, half verified (couldn't see error)
+ dfdx_spring_type1(s->dfdx, extent, length, L, dot, k);
+
+
+ /* VERIFIED */
+ dfdv_damp(s->dfdv, extent, clmd->sim_parms->Cdis, dot);
+ }
+ }
+ else // calculate force of bending springs
+ {
+ if(length < L)
+ {
+ s->flags |= CLOTH_SPRING_FLAG_NEEDED;
+
+ k = clmd->sim_parms->bending;
+
+ scaling = k + s->stiffness * ABS(clmd->sim_parms->max_bend-k);
+ cb = k = scaling / (20.0*(clmd->coll_parms->avg_spring_len + FLT_EPSILON));
+
+ if(G.rt>3)
+ printf("bend scaling: %f\n", k);
+
+ mul_fvector_S(bending_force, dir, fbstar(length, L, k, cb));
+ VECADD(s->f, s->f, bending_force);
+
+ dfdx_spring_type2(s->dfdx, dir, length,L, k, cb);
+ }
+ }
+ /*
+ if((s->ij == 109) || (s->kl == 109))
+ {
+ printf("type: %d, f-x: %f, f-y: %f, f-z: %f\n", s->type, s->f[0], s->f[1], s->f[2]);
+}
+ */
+}
+
+DO_INLINE void cloth_apply_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX)
+{
+ if(s->flags & CLOTH_SPRING_FLAG_NEEDED)
+ {
+ if(s->type != CLOTH_SPRING_TYPE_BENDING)
+ {
+ sub_fmatrix_fmatrix(dFdV[s->ij].m, dFdV[s->ij].m, s->dfdv);
+ sub_fmatrix_fmatrix(dFdV[s->kl].m, dFdV[s->kl].m, s->dfdv);
+ add_fmatrix_fmatrix(dFdV[s->matrix_index].m, dFdV[s->matrix_index].m, s->dfdv);
+ }
+
+ VECADD(lF[s->ij], lF[s->ij], s->f);
+ VECSUB(lF[s->kl], lF[s->kl], s->f);
+
+ sub_fmatrix_fmatrix(dFdX[s->ij].m, dFdX[s->ij].m, s->dfdx);
+ sub_fmatrix_fmatrix(dFdX[s->kl].m, dFdX[s->kl].m, s->dfdx);
+
+ add_fmatrix_fmatrix(dFdX[s->matrix_index].m, dFdX[s->matrix_index].m, s->dfdx);
+ }
+}
+
+DO_INLINE void calculateTriangleNormal(float to[3], lfVector *X, MFace mface)
+{
+ float v1[3], v2[3];
+
+ VECSUB(v1, X[mface.v2], X[mface.v1]);
+ VECSUB(v2, X[mface.v3], X[mface.v1]);
+ cross_fvector(to, v1, v2);
+}
+
+DO_INLINE void calculatQuadNormal(float to[3], lfVector *X, MFace mface)
+{
+ float temp = CalcNormFloat4(X[mface.v1],X[mface.v2],X[mface.v3],X[mface.v4],to);
+ mul_fvector_S(to, to, temp);
+}
+
+void calculateWeightedVertexNormal(ClothModifierData *clmd, MFace *mfaces, float to[3], int index, lfVector *X)
+{
+ float temp[3];
+ int i;
+ Cloth *cloth = clmd->clothObject;
+
+ for(i = 0; i < cloth->numfaces; i++)
+ {
+ // check if this triangle contains the selected vertex
+ if(mfaces[i].v1 == index || mfaces[i].v2 == index || mfaces[i].v3 == index || mfaces[i].v4 == index)
+ {
+ calculatQuadNormal(temp, X, mfaces[i]);
+ VECADD(to, to, temp);
+ }
+ }
+}
+float calculateVertexWindForce(float wind[3], float vertexnormal[3])
+{
+ return fabs(INPR(wind, vertexnormal) * 0.5f);
+}
+
+DO_INLINE void calc_triangle_force(ClothModifierData *clmd, MFace mface, lfVector *F, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors)
+{
+
+}
+
+void cloth_calc_force(ClothModifierData *clmd, lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M)
+{
+ /* Collect forces and derivatives: F,dFdX,dFdV */
+ Cloth *cloth = clmd->clothObject;
+ unsigned int i = 0;
+ float spring_air = clmd->sim_parms->Cvi * 0.01f; /* viscosity of air scaled in percent */
+ float gravity[3];
+ float tm2[3][3] = {{-spring_air,0,0}, {0,-spring_air,0},{0,0,-spring_air}};
+ ClothVertex *verts = cloth->verts;
+ MFace *mfaces = cloth->mfaces;
+ float wind_normalized[3];
+ unsigned int numverts = cloth->numverts;
+ float auxvect[3], velgoal[3], tvect[3];
+ float kd, ks;
+ LinkNode *search = cloth->springs;
+
+
+ VECCOPY(gravity, clmd->sim_parms->gravity);
+ mul_fvector_S(gravity, gravity, 0.001f); /* scale gravity force */
+
+ /* set dFdX jacobi matrix to zero */
+ init_bfmatrix(dFdX, ZERO);
+ /* set dFdX jacobi matrix diagonal entries to -spring_air */
+ initdiag_bfmatrix(dFdV, tm2);
+
+ init_lfvector(lF, gravity, numverts);
+
+ // multiply lF with mass matrix
+ for(i = 0; i < numverts; i++)
+ {
+ float temp[3];
+ VECCOPY(temp, lF[i]);
+ mul_fmatrix_fvector(lF[i], M[i].m, temp);
+ }
+
+ submul_lfvectorS(lF, lV, spring_air, numverts);
+
+ /* do goal stuff */
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL)
+ {
+ for(i = 0; i < numverts; i++)
+ {
+ if(verts [i].goal < SOFTGOALSNAP)
+ {
+ // current_position = xold + t * (newposition - xold)
+ VECSUB(tvect, verts[i].xconst, verts[i].xold);
+ mul_fvector_S(tvect, tvect, time);
+ VECADD(tvect, tvect, verts[i].xold);
+
+ VECSUB(auxvect, tvect, lX[i]);
+ ks = 1.0f/(1.0f- verts [i].goal*clmd->sim_parms->goalspring)-1.0f ;
+ VECADDS(lF[i], lF[i], auxvect, -ks);
+
+ // calulate damping forces generated by goals
+
+ VECSUB(velgoal,verts[i].xold, verts[i].xconst);
+ kd = clmd->sim_parms->goalfrict * 0.01f; // friction force scale taken from SB
+ VECSUBADDSS(lF[i], velgoal, kd, lV[i], kd);
+
+
+ }
+ }
+ }
+
+ /* handle external forces like wind */
+ if(effectors)
+ {
+ float speed[3] = {0.0f, 0.0f,0.0f};
+ float force[3]= {0.0f, 0.0f, 0.0f};
+
+#pragma omp parallel for private (i) shared(lF)
+ for(i = 0; i < cloth->numverts; i++)
+ {
+ float vertexnormal[3]={0,0,0};
+ float fieldfactor = 1000.0f; // windfactor = 250.0f; // from sb
+
+ pdDoEffectors(effectors, lX[i], force, speed, (float)G.scene->r.cfra, 0.0f, PE_WIND_AS_SPEED);
+
+ // TODO apply forcefields here
+ VECADDS(lF[i], lF[i], force, fieldfactor*0.01f);
+
+ VECCOPY(wind_normalized, speed);
+ Normalize(wind_normalized);
+
+ calculateWeightedVertexNormal(clmd, mfaces, vertexnormal, i, lX);
+ VECADDS(lF[i], lF[i], wind_normalized, -calculateVertexWindForce(speed, vertexnormal));
+ }
+ }
+
+ // calculate spring forces
+ search = cloth->springs;
+ while(search)
+ {
+ // only handle active springs
+ // if(((clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED) && !(springs[i].flags & CSPRING_FLAG_DEACTIVATE))|| !(clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED)){}
+ cloth_calc_spring_force(clmd, search->link, lF, lX, lV, dFdV, dFdX);
+
+ search = search->next;
+ }
+
+ // apply spring forces
+ search = cloth->springs;
+ while(search)
+ {
+ // only handle active springs
+ // if(((clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED) && !(springs[i].flags & CSPRING_FLAG_DEACTIVATE))|| !(clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED))
+ cloth_apply_spring_force(clmd, search->link, lF, lX, lV, dFdV, dFdX);
+ search = search->next;
+ }
+ // printf("\n");
+}
+
+void simulate_implicit_euler(lfVector *Vnew, lfVector *lX, lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, lfVector *olddV, fmatrix3x3 *P, fmatrix3x3 *Pinv, fmatrix3x3 *M)
+{
+ unsigned int numverts = dFdV[0].vcount;
+
+ lfVector *dFdXmV = create_lfvector(numverts);
+ zero_lfvector(dV, numverts);
+
+ cp_bfmatrix(A, M);
+
+ subadd_bfmatrixS_bfmatrixS(A, dFdV, dt, dFdX, (dt*dt));
+
+ mul_bfmatrix_lfvector(dFdXmV, dFdX, lV);
+
+ add_lfvectorS_lfvectorS(B, lF, dt, dFdXmV, (dt*dt), numverts);
+
+ itstart();
+
+ cg_filtered(dV, A, B, z, S); /* conjugate gradient algorithm to solve Ax=b */
+ // cg_filtered_pre(dV, A, B, z, S, P, Pinv);
+
+ itend();
+ // printf("cg_filtered calc time: %f\n", (float)itval());
+
+ cp_lfvector(olddV, dV, numverts);
+
+ // advance velocities
+ add_lfvector_lfvector(Vnew, lV, dV, numverts);
+
+
+ del_lfvector(dFdXmV);
+}
+
+int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors)
+{
+ unsigned int i=0;
+ float step=0.0f, tf=1.0f;
+ Cloth *cloth = clmd->clothObject;
+ ClothVertex *verts = cloth->verts;
+ unsigned int numverts = cloth->numverts;
+ float dt = 1.0f / clmd->sim_parms->stepsPerFrame;
+ Implicit_Data *id = cloth->implicit;
+ int result = 0;
+
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) /* do goal stuff */
+ {
+ for(i = 0; i < numverts; i++)
+ {
+ // update velocities with constrained velocities from pinned verts
+ if(verts [i].goal >= SOFTGOALSNAP)
+ {
+ VECSUB(id->V[i], verts[i].xconst, verts[i].xold);
+ // VecMulf(id->V[i], 1.0 / dt);
+ }
+ }
+ }
+
+ while(step < tf)
+ {
+ effectors= pdInitEffectors(ob,NULL);
+
+ // calculate
+ cloth_calc_force(clmd, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step, id->M);
+
+ // printf("F -> x: %f, y: %f; z: %f\n\n", id->F[109][0], id->F[109][1], id->F[109][2]);
+
+ simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv, id->M);
+
+ add_lfvector_lfvectorS(id->Xnew, id->X, id->Vnew, dt, numverts);
+ /*
+ printf("dt: %f\n", dt);
+ printf("Xnew -> x: %f, y: %f; z: %f\n", id->Xnew[4][0], id->Xnew[4][1], id->Xnew[4][2]);
+ printf("X -> x: %f, y: %f; z: %f\n", id->X[4][0], id->X[4][1], id->X[4][2]);
+ printf("Vnew -> x: %f, y: %f; z: %f\n", id->Vnew[4][0], id->Vnew[3][1], id->Vnew[4][2]);
+ printf("V -> x: %f, y: %f; z: %f\n\n", id->V[4][0], id->V[4][1], id->V[4][2]);
+ */
+
+ // clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_ENABLED;
+
+ if(clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED)
+ {
+ // collisions
+ // itstart();
+
+ // update verts to current positions
+ for(i = 0; i < numverts; i++)
+ {
+
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL)
+ {
+ if(verts [i].goal >= SOFTGOALSNAP)
+ {
+ float tvect[3] = {.0,.0,.0};
+ // VECSUB(tvect, id->Xnew[i], verts[i].xold);
+ mul_fvector_S(tvect, id->V[i], step+dt);
+ VECADD(tvect, tvect, verts[i].xold);
+ VECCOPY(id->Xnew[i], tvect);
+ }
+
+ }
+
+ VECCOPY(verts[i].tx, id->Xnew[i]);
+
+ VECSUB(verts[i].tv, verts[i].tx, verts[i].txold);
+ VECCOPY(verts[i].v, verts[i].tv);
+ }
+
+ // call collision function
+ result = cloth_bvh_objcollision(clmd, step + dt, dt);
+
+ // copy corrected positions back to simulation
+ for(i = 0; i < numverts; i++)
+ {
+ if(result)
+ {
+
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL)
+ {
+ if(verts [i].goal >= SOFTGOALSNAP)
+ {
+ continue;
+ }
+ }
+
+
+ // VECADD(verts[i].tx, verts[i].txold, verts[i].tv);
+
+ VECCOPY(verts[i].txold, verts[i].tx);
+
+ VECCOPY(id->Xnew[i], verts[i].tx);
+
+ VECCOPY(id->Vnew[i], verts[i].tv);
+ VecMulf(id->Vnew[i], 1.0f / dt);
+ }
+ else
+ {
+ VECCOPY(verts[i].txold, id->Xnew[i]);
+ }
+ }
+
+ // X = Xnew;
+ cp_lfvector(id->X, id->Xnew, numverts);
+
+ // if there were collisions, advance the velocity from v_n+1/2 to v_n+1
+ if(result)
+ {
+ // V = Vnew;
+ cp_lfvector(id->V, id->Vnew, numverts);
+
+ // calculate
+ cloth_calc_force(clmd, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step, id->M);
+ simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt / 2.0f, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv, id->M);
+ }
+ }
+ else
+ {
+ // X = Xnew;
+ cp_lfvector(id->X, id->Xnew, numverts);
+ }
+
+ // itend();
+ // printf("collision time: %f\n", (float)itval());
+
+ // V = Vnew;
+ cp_lfvector(id->V, id->Vnew, numverts);
+
+ step += dt;
+
+ if(effectors) pdEndEffectors(effectors);
+
+ /* ask for user break */
+ /*
+ don't work very well, gives problems with ctrl-a + esc
+ if (CT_localInterruptCallBack && CT_localInterruptCallBack())
+ return 0;
+ */
+ }
+
+ for(i = 0; i < numverts; i++)
+ {
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL)
+ {
+ if(verts [i].goal < SOFTGOALSNAP)
+ {
+ VECCOPY(verts[i].txold, id->X[i]);
+ VECCOPY(verts[i].x, id->X[i]);
+ VECCOPY(verts[i].v, id->V[i]);
+ }
+ else
+ {
+ VECCOPY(verts[i].txold, verts[i].xconst);
+ VECCOPY(verts[i].x, verts[i].xconst);
+ VECCOPY(verts[i].v, id->V[i]);
+ }
+ }
+ else
+ {
+ VECCOPY(verts[i].txold, id->X[i]);
+ VECCOPY(verts[i].x, id->X[i]);
+ VECCOPY(verts[i].v, id->V[i]);
+ }
+ }
+ return 1;
+}
+
+void implicit_set_positions (ClothModifierData *clmd)
+{
+ Cloth *cloth = clmd->clothObject;
+ ClothVertex *verts = cloth->verts;
+ unsigned int numverts = cloth->numverts, i;
+ Implicit_Data *id = cloth->implicit;
+
+ for(i = 0; i < numverts; i++)
+ {
+ VECCOPY(id->X[i], verts[i].x);
+ VECCOPY(id->V[i], verts[i].v);
+ }
+ if(G.rt > 0)
+ printf("implicit_set_positions\n");
+}
+
+/* Cloth global visible functions */
+void clmdSetInterruptCallBack(int (*f)(void))
+{
+ CT_localInterruptCallBack = f;
+}
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 39602f00053..4af310913d6 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 */
@@ -523,9 +530,9 @@ void testhandles_ipocurve(IpoCurve *icu)
a= icu->totvert;
while(a--) {
flag= 0;
- if(bezt->f1 & 1) flag++;
- if(bezt->f2 & 1) flag += 2;
- if(bezt->f3 & 1) flag += 4;
+ if(bezt->f1 & SELECT) flag++;
+ if(bezt->f2 & SELECT) flag += 2;
+ if(bezt->f3 & SELECT) flag += 4;
if( !(flag==0 || flag==7) ) {
if(bezt->h1==HD_AUTO) { /* auto */
@@ -751,6 +758,49 @@ void berekenx(float *f, float *o, int b)
}
}
+/* we need the local transform = current transform - (parent transform + bone transform) */
+/* (local transform is on action channel level) */
+static void posechannel_get_local_transform(bPoseChannel *pchan, float *loc, float *eul, float *size)
+{
+ float diff_mat[4][4];
+ float parmat[4][4], offs_bone[4][4], imat[4][4];
+
+ if (pchan->parent) {
+ /* get first the parent + bone transform in parmat */
+
+ /* bone transform itself */
+ Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
+ /* The bone's root offset (is in the parent's coordinate system) */
+ VECCOPY(offs_bone[3], pchan->bone->head);
+ /* Get the length translation of parent (length along y axis) */
+ offs_bone[3][1]+= pchan->parent->bone->length;
+
+ Mat4MulSerie(parmat, pchan->parent->pose_mat, offs_bone, NULL, NULL, NULL, NULL, NULL, NULL);
+
+ /* invert it */
+ Mat4Invert(imat, parmat);
+ }
+ else {
+ Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
+ VECCOPY(offs_bone[3], pchan->bone->head);
+
+ /* invert it */
+ Mat4Invert(imat, offs_bone);
+
+ }
+
+ /* difference: current transform - (parent transform + bone transform) */
+ Mat4MulMat4(diff_mat, pchan->pose_mat, imat);
+
+ if(loc)
+ VECCOPY(loc, diff_mat[3]);
+ if(eul)
+ Mat4ToEul(diff_mat, eul);
+ if(size)
+ Mat4ToSize(diff_mat, size);
+
+}
+
/* has to return a float value */
static float eval_driver(IpoDriver *driver, float ipotime)
{
@@ -802,48 +852,49 @@ 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);
+
+ 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 loc[3], eul[3], size[3];
+
+ posechannel_get_local_transform(pchan, loc, eul, size);
+
+ switch(driver->adrcode) {
+ case OB_LOC_X:
+ return loc[0];
+ case OB_LOC_Y:
+ return loc[1];
+ case OB_LOC_Z:
+ return 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];
+ }
}
}
}
@@ -1188,6 +1239,7 @@ void *get_ipo_poin(ID *id, IpoCurve *icu, int *type)
Lamp *la;
Sequence *seq;
World *wo;
+ ParticleSettings *part;
*type= IPO_FLOAT;
@@ -1265,6 +1317,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) {
@@ -1517,7 +1572,48 @@ 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;
}
@@ -1812,6 +1908,29 @@ 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;
@@ -2042,7 +2161,7 @@ void do_ob_ipodrivers(Object *ob, Ipo *ipo, float ctime)
}
}
-void do_seq_ipo(Sequence *seq)
+void do_seq_ipo(Sequence *seq, int cfra)
{
float ctime, div;
@@ -2050,11 +2169,10 @@ void do_seq_ipo(Sequence *seq)
if(seq->ipo) {
if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
- ctime = frame_to_float(G.scene->r.cfra);
+ ctime = frame_to_float(cfra);
div = 1.0;
} else {
- ctime= frame_to_float(G.scene->r.cfra
- - seq->startdisp);
+ ctime= frame_to_float(cfra - seq->startdisp);
div= (seq->enddisp - seq->startdisp)/100.0f;
if(div==0.0) return;
}
@@ -2172,7 +2290,7 @@ void do_all_data_ipos()
|| seq->type == SEQ_HD_SOUND) && (seq->ipo) &&
(seq->startdisp<=G.scene->r.cfra+2) &&
(seq->enddisp>G.scene->r.cfra))
- do_seq_ipo(seq);
+ do_seq_ipo(seq, G.scene->r.cfra);
seq= seq->next;
}
}
@@ -2230,7 +2348,7 @@ void add_to_cfra_elem(ListBase *lb, BezTriple *bezt)
if( ce->cfra==bezt->vec[1][0] ) {
/* do because of double keys */
- if(bezt->f2 & 1) ce->sel= bezt->f2;
+ if(bezt->f2 & SELECT) ce->sel= bezt->f2;
return;
}
else if(ce->cfra > bezt->vec[1][0]) break;
@@ -2282,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/kdop.c b/source/blender/blenkernel/intern/kdop.c
new file mode 100644
index 00000000000..8d2b48144be
--- /dev/null
+++ b/source/blender/blenkernel/intern/kdop.c
@@ -0,0 +1,810 @@
+/* kdop.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) Blender Foundation
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "MEM_guardedalloc.h"
+/* types */
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_cloth_types.h"
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_modifier_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_edgehash.h"
+#include "BLI_linklist.h"
+#include "BKE_curve.h"
+#include "BKE_deform.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_displist.h"
+#include "BKE_effect.h"
+#include "BKE_global.h"
+#include "BKE_key.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+#include "BKE_cloth.h"
+#include "BKE_modifier.h"
+#include "BKE_utildefines.h"
+#include "BKE_DerivedMesh.h"
+#include "BIF_editdeform.h"
+#include "BIF_editkey.h"
+#include "DNA_screen_types.h"
+#include "BSE_headerbuttons.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+#include "mydevice.h"
+
+
+////////////////////////////////////////////////////////////////////////
+// Additional fastened appending function
+// It uses the link to the last inserted node as start value
+// for searching the end of the list
+// NEW: in compare to the original function, this one returns
+// the reference to the last inserted node
+////////////////////////////////////////////////////////////////////////
+LinkNode *BLI_linklist_append_fast(LinkNode **listp, void *ptr) {
+ LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink");
+ LinkNode *node = *listp;
+
+ nlink->link = ptr;
+ nlink->next = NULL;
+
+ if(node == NULL){
+ *listp = nlink;
+ } else {
+ while(node->next != NULL){
+ node = node->next;
+ }
+ node->next = nlink;
+ }
+ return nlink;
+}
+
+
+
+////////////////////////////////////////////////////////////////////////
+// Bounding Volume Hierarchy Definition
+//
+// Notes: From OBB until 26-DOP --> all bounding volumes possible, just choose type below
+// Notes: You have to choose the type at compile time ITM
+// Notes: You can choose the tree type --> binary, quad, octree, choose below
+////////////////////////////////////////////////////////////////////////
+
+static float KDOP_AXES[13][3] =
+{ {1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {1, 1, 1}, {1, -1, 1}, {1, 1, -1},
+{1, -1, -1}, {1, 1, 0}, {1, 0, 1}, {0, 1, 1}, {1, -1, 0}, {1, 0, -1},
+{0, 1, -1}
+};
+
+///////////// choose bounding volume here! /////////////
+
+// #define KDOP_26
+
+// #define KDOP_14
+
+// AABB:
+// #define KDOP_8
+
+// OBB:
+#define KDOP_6
+
+
+
+#ifdef KDOP_26
+#define KDOP_END 13
+#define KDOP_START 0
+#endif
+
+// I didn't test this one!
+#ifdef KDOP_18
+#define KDOP_END 7
+#define KDOP_START 13
+#endif
+
+#ifdef KDOP_14
+#define KDOP_END 7
+#define KDOP_START 0
+#endif
+
+// this is basicly some AABB
+#ifdef KDOP_8
+#define KDOP_END 4
+#define KDOP_START 0
+#endif
+
+// this is basicly some OBB
+#ifdef KDOP_6
+#define KDOP_END 3
+#define KDOP_START 0
+#endif
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+// Introsort
+// with permission deriven from the following Java code:
+// http://ralphunden.net/content/tutorials/a-guide-to-introsort/
+// and he derived it from the SUN STL
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+static int size_threshold = 16;
+/*
+* Common methods for all algorithms
+*/
+DO_INLINE void bvh_exchange(CollisionTree **a, int i, int j)
+{
+ CollisionTree *t=a[i];
+ a[i]=a[j];
+ a[j]=t;
+}
+DO_INLINE int floor_lg(int a)
+{
+ return (int)(floor(log(a)/log(2)));
+}
+
+/*
+* Insertion sort algorithm
+*/
+static void bvh_insertionsort(CollisionTree **a, int lo, int hi, int axis)
+{
+ int i,j;
+ CollisionTree *t;
+ for (i=lo; i < hi; i++)
+ {
+ j=i;
+ t = a[i];
+ while((j!=lo) && (t->bv[axis] < (a[j-1])->bv[axis]))
+ {
+ a[j] = a[j-1];
+ j--;
+ }
+ a[j] = t;
+ }
+}
+
+static int bvh_partition(CollisionTree **a, int lo, int hi, CollisionTree * x, int axis)
+{
+ int i=lo, j=hi;
+ while (1)
+ {
+ while ((a[i])->bv[axis] < x->bv[axis]) i++;
+ j=j-1;
+ while (x->bv[axis] < (a[j])->bv[axis]) j=j-1;
+ if(!(i < j))
+ return i;
+ bvh_exchange(a, i,j);
+ i++;
+ }
+}
+
+/*
+* Heapsort algorithm
+*/
+static void bvh_downheap(CollisionTree **a, int i, int n, int lo, int axis)
+{
+ CollisionTree * d = a[lo+i-1];
+ int child;
+ while (i<=n/2)
+ {
+ child = 2*i;
+ if ((child < n) && ((a[lo+child-1])->bv[axis] < (a[lo+child])->bv[axis]))
+ {
+ child++;
+ }
+ if (!(d->bv[axis] < (a[lo+child-1])->bv[axis])) break;
+ a[lo+i-1] = a[lo+child-1];
+ i = child;
+ }
+ a[lo+i-1] = d;
+}
+
+static void bvh_heapsort(CollisionTree **a, int lo, int hi, int axis)
+{
+ int n = hi-lo, i;
+ for (i=n/2; i>=1; i=i-1)
+ {
+ bvh_downheap(a, i,n,lo, axis);
+ }
+ for (i=n; i>1; i=i-1)
+ {
+ bvh_exchange(a, lo,lo+i-1);
+ bvh_downheap(a, 1,i-1,lo, axis);
+ }
+}
+
+static CollisionTree *bvh_medianof3(CollisionTree **a, int lo, int mid, int hi, int axis) // returns Sortable
+{
+ if ((a[mid])->bv[axis] < (a[lo])->bv[axis])
+ {
+ if ((a[hi])->bv[axis] < (a[mid])->bv[axis])
+ return a[mid];
+ else
+ {
+ if ((a[hi])->bv[axis] < (a[lo])->bv[axis])
+ return a[hi];
+ else
+ return a[lo];
+ }
+ }
+ else
+ {
+ if ((a[hi])->bv[axis] < (a[mid])->bv[axis])
+ {
+ if ((a[hi])->bv[axis] < (a[lo])->bv[axis])
+ return a[lo];
+ else
+ return a[hi];
+ }
+ else
+ return a[mid];
+ }
+}
+/*
+* Quicksort algorithm modified for Introsort
+*/
+static void bvh_introsort_loop (CollisionTree **a, int lo, int hi, int depth_limit, int axis)
+{
+ int p;
+
+ while (hi-lo > size_threshold)
+ {
+ if (depth_limit == 0)
+ {
+ bvh_heapsort(a, lo, hi, axis);
+ return;
+ }
+ depth_limit=depth_limit-1;
+ p=bvh_partition(a, lo, hi, bvh_medianof3(a, lo, lo+((hi-lo)/2)+1, hi-1, axis), axis);
+ bvh_introsort_loop(a, p, hi, depth_limit, axis);
+ hi=p;
+ }
+}
+
+DO_INLINE void bvh_sort(CollisionTree **a0, int begin, int end, int axis)
+{
+ if (begin < end)
+ {
+ CollisionTree **a=a0;
+ bvh_introsort_loop(a, begin, end, 2*floor_lg(end-begin), axis);
+ bvh_insertionsort(a, begin, end, axis);
+ }
+}
+DO_INLINE void bvh_sort_along_axis(CollisionTree **face_list, int start, int end, int axis)
+{
+ bvh_sort(face_list, start, end, axis);
+}
+////////////////////////////////////////////////////////////////////////////////////////////////
+void bvh_free(BVH * bvh)
+{
+ LinkNode *search = NULL;
+ CollisionTree *tree = NULL;
+
+ if (bvh)
+ {
+
+ search = bvh->tree;
+
+ while(search)
+ {
+ LinkNode *next= search->next;
+ tree = search->link;
+
+ MEM_freeN(tree);
+
+ search = next;
+ }
+
+ BLI_linklist_free(bvh->tree,NULL);
+ bvh->tree = NULL;
+
+ if(bvh->current_x)
+ MEM_freeN(bvh->current_x);
+ if(bvh->current_xold)
+ MEM_freeN(bvh->current_xold);
+
+ MEM_freeN(bvh);
+ bvh = NULL;
+ }
+}
+
+// only supports x,y,z axis in the moment
+// but we should use a plain and simple function here for speed sake
+DO_INLINE int bvh_largest_axis(float *bv)
+{
+ float middle_point[3];
+
+ middle_point[0] = (bv[1]) - (bv[0]); // x axis
+ middle_point[1] = (bv[3]) - (bv[2]); // y axis
+ middle_point[2] = (bv[5]) - (bv[4]); // z axis
+ if (middle_point[0] > middle_point[1])
+ {
+ if (middle_point[0] > middle_point[2])
+ return 1; // max x axis
+ else
+ return 5; // max z axis
+ }
+ else
+ {
+ if (middle_point[1] > middle_point[2])
+ return 3; // max y axis
+ else
+ return 5; // max z axis
+ }
+}
+
+// depends on the fact that the BVH's for each face is already build
+DO_INLINE void bvh_calc_DOP_hull_from_faces(BVH * bvh, CollisionTree **tri, int numfaces, float *bv)
+{
+ float newmin,newmax;
+ int i, j;
+ for (j = 0; j < numfaces; j++)
+ {
+ // for all Axes.
+ for (i = KDOP_START; i < KDOP_END; i++)
+ {
+ newmin = (tri [j])->bv[(2 * i)];
+ if ((newmin < bv[(2 * i)]) || (j == 0))
+ {
+ bv[(2 * i)] = newmin;
+ }
+
+ newmax = (tri [j])->bv[(2 * i) + 1];
+ if ((newmax > bv[(2 * i) + 1]) || (j == 0))
+ {
+ bv[(2 * i) + 1] = newmax;
+ }
+ }
+ }
+}
+
+DO_INLINE void bvh_calc_DOP_hull_static(BVH * bvh, CollisionTree **tri, int numfaces, float *bv)
+{
+ MFace *tempMFace = bvh->mfaces;
+ float *tempBV = bv;
+ float newminmax;
+ int i, j, k;
+ for (j = 0; j < numfaces; j++)
+ {
+ tempMFace = bvh->mfaces + (tri [j])->tri_index;
+ // 3 or 4 vertices per face.
+ for (k = 0; k < 4; k++)
+ {
+ int temp = 0;
+ // If this is a triangle.
+ if (k == 3 && !tempMFace->v4)
+ continue;
+ // TODO: other name for "temp" this gets all vertices of a face
+ if (k == 0)
+ temp = tempMFace->v1;
+ else if (k == 1)
+ temp = tempMFace->v2;
+ else if (k == 2)
+ temp = tempMFace->v3;
+ else if (k == 3)
+ temp = tempMFace->v4;
+ // for all Axes.
+ for (i = KDOP_START; i < KDOP_END; i++)
+ {
+ newminmax = INPR(bvh->current_xold[temp].co, KDOP_AXES[i]);
+ if ((newminmax < tempBV[(2 * i)]) || (k == 0 && j == 0))
+ tempBV[(2 * i)] = newminmax;
+ if ((newminmax > tempBV[(2 * i) + 1])|| (k == 0 && j == 0))
+ tempBV[(2 * i) + 1] = newminmax;
+ }
+ }
+ }
+}
+
+DO_INLINE void bvh_calc_DOP_hull_moving(BVH * bvh, CollisionTree **tri, int numfaces, float *bv)
+{
+ MFace *tempMFace = bvh->mfaces;
+ float *tempBV = bv;
+ float newminmax;
+ int i, j, k;
+ for (j = 0; j < numfaces; j++)
+ {
+ tempMFace = bvh->mfaces + (tri [j])->tri_index;
+ // 3 or 4 vertices per face.
+ for (k = 0; k < 4; k++)
+ {
+ int temp = 0;
+ // If this is a triangle.
+ if (k == 3 && !tempMFace->v4)
+ continue;
+ // TODO: other name for "temp" this gets all vertices of a face
+ if (k == 0)
+ temp = tempMFace->v1;
+ else if (k == 1)
+ temp = tempMFace->v2;
+ else if (k == 2)
+ temp = tempMFace->v3;
+ else if (k == 3)
+ temp = tempMFace->v4;
+ // for all Axes.
+ for (i = KDOP_START; i < KDOP_END; i++)
+ {
+ newminmax = INPR(bvh->current_xold[temp].co, KDOP_AXES[i]);
+ if ((newminmax < tempBV[(2 * i)]) || (k == 0 && j == 0))
+ tempBV[(2 * i)] = newminmax;
+ if ((newminmax > tempBV[(2 * i) + 1])|| (k == 0 && j == 0))
+ tempBV[(2 * i) + 1] = newminmax;
+
+ newminmax = INPR(bvh->current_x[temp].co, KDOP_AXES[i]);
+ if ((newminmax < tempBV[(2 * i)]) || (k == 0 && j == 0))
+ tempBV[(2 * i)] = newminmax;
+ if ((newminmax > tempBV[(2 * i) + 1])|| (k == 0 && j == 0))
+ tempBV[(2 * i) + 1] = newminmax;
+ }
+ }
+ }
+}
+
+static void bvh_div_env_node(BVH *bvh, CollisionTree *tree, CollisionTree **face_list, unsigned int start, unsigned int end, int lastaxis, LinkNode *nlink)
+{
+ int i = 0;
+ CollisionTree *newtree = NULL;
+ int laxis = 0, max_nodes=4;
+ unsigned int tstart, tend;
+ LinkNode *nlink1 = nlink;
+ LinkNode *tnlink;
+ tree->traversed = 0;
+ // Determine which axis to split along
+ laxis = bvh_largest_axis(tree->bv);
+
+ // Sort along longest axis
+ if(laxis!=lastaxis)
+ bvh_sort_along_axis(face_list, start, end, laxis);
+
+ max_nodes = MIN2((end-start + 1 ),4);
+
+ for (i = 0; i < max_nodes; i++)
+ {
+ tree->count_nodes++;
+
+ if(end-start > 4)
+ {
+ int quarter = ((float)((float)(end - start + 1) / 4.0f));
+ tstart = start + i * quarter;
+ tend = tstart + quarter - 1;
+
+ // be sure that we get all faces
+ if(i==3)
+ {
+ tend = end;
+ }
+ }
+ else
+ {
+ tend = tstart = start + i;
+ }
+
+ // Build tree until 4 node left.
+ if ((tend-tstart + 1 ) > 1)
+ {
+ newtree = (CollisionTree *)MEM_callocN(sizeof(CollisionTree), "CollisionTree");
+ tnlink = BLI_linklist_append_fast(&nlink1->next, newtree);
+
+ newtree->nodes[0] = newtree->nodes[1] = newtree->nodes[2] = newtree->nodes[3] = NULL;
+ newtree->count_nodes = 0;
+ newtree->parent = tree;
+ newtree->isleaf = 0;
+
+ tree->nodes[i] = newtree;
+
+ nlink1 = tnlink;
+
+ bvh_calc_DOP_hull_from_faces(bvh, &face_list[tstart], tend-tstart + 1, tree->nodes[i]->bv);
+
+ bvh_div_env_node(bvh, tree->nodes[i], face_list, tstart, tend, laxis, nlink1);
+ }
+ else // ok, we have 1 left for this node
+ {
+ CollisionTree *tnode = face_list[tstart];
+ tree->nodes[i] = tnode;
+ tree->nodes[i]->parent = tree;
+ }
+ }
+ return;
+}
+
+/* function cannot be directly called - needs alloced bvh */
+void bvh_build (BVH *bvh)
+{
+ unsigned int i = 0, j = 0, k = 0;
+ CollisionTree **face_list=NULL;
+ CollisionTree *tree=NULL;
+ LinkNode *nlink = NULL;
+
+ tree = (CollisionTree *)MEM_callocN(sizeof(CollisionTree), "CollisionTree");
+ // TODO: check succesfull alloc
+ BLI_linklist_append(&bvh->tree, tree);
+
+ nlink = bvh->tree;
+
+ if (tree == NULL)
+ {
+ printf("bvh_build: Out of memory for nodes.\n");
+ bvh_free(bvh);
+ return;
+ }
+ bvh->root = bvh->tree->link;
+ bvh->root->isleaf = 0;
+ bvh->root->parent = NULL;
+ bvh->root->nodes[0] = bvh->root->nodes[1] = bvh->root->nodes[1] = bvh->root->nodes[3] = NULL;
+
+ if(bvh->numfaces<=1)
+ {
+ bvh->root->tri_index = 0; // Why that? --> only one face there
+ bvh->root->isleaf = 1;
+ bvh->root->traversed = 0;
+ bvh->root->count_nodes = 0;
+ bvh->leaf_root = bvh->root;
+ bvh->leaf_tree = bvh->root;
+ bvh->root->nextLeaf = NULL;
+ bvh->root->prevLeaf = NULL;
+ }
+ else
+ {
+ // create face boxes
+ face_list = MEM_callocN (bvh->numfaces * sizeof (CollisionTree *), "CollisionTree");
+ if (face_list == NULL)
+ {
+ printf("bvh_build: Out of memory for face_list.\n");
+ bvh_free(bvh);
+ return;
+ }
+
+ // create face boxes
+ for(i = 0, k = 0; i < bvh->numfaces; i++)
+ {
+ LinkNode *tnlink;
+
+ tree = (CollisionTree *)MEM_callocN(sizeof(CollisionTree), "CollisionTree");
+ // TODO: check succesfull alloc
+
+ tnlink = BLI_linklist_append_fast(&nlink->next, tree);
+
+ face_list[i] = tree;
+ tree->tri_index = i;
+ tree->isleaf = 1;
+ tree->nextLeaf = NULL;
+ tree->prevLeaf = bvh->leaf_tree;
+ tree->parent = NULL;
+ tree->count_nodes = 0;
+
+ if(i==0)
+ {
+ bvh->leaf_tree = bvh->leaf_root = tree;
+ }
+ else
+ {
+ bvh->leaf_tree->nextLeaf = tree;
+ bvh->leaf_tree = bvh->leaf_tree->nextLeaf;
+ }
+
+ tree->nodes[0] = tree->nodes[1] = tree->nodes[2] = tree->nodes[3] = NULL;
+
+ bvh_calc_DOP_hull_static(bvh, &face_list[i], 1, tree->bv);
+
+ // inflate the bv with some epsilon
+ for (j = KDOP_START; j < KDOP_END; j++)
+ {
+ tree->bv[(2 * j)] -= bvh->epsilon; // minimum
+ tree->bv[(2 * j) + 1] += bvh->epsilon; // maximum
+ }
+
+ nlink = tnlink;
+ }
+
+ // build root bvh
+ bvh_calc_DOP_hull_from_faces(bvh, face_list, bvh->numfaces, bvh->root->bv);
+
+ // This is the traversal function.
+ bvh_div_env_node(bvh, bvh->root, face_list, 0, bvh->numfaces-1, 0, nlink);
+ if (face_list)
+ MEM_freeN(face_list);
+
+ }
+
+}
+
+// bvh_overlap - is it possbile for 2 bv's to collide ?
+DO_INLINE int bvh_overlap(float *bv1, float *bv2)
+{
+ int i = 0;
+ for (i = KDOP_START; i < KDOP_END; i++)
+ {
+ // Minimum test.
+ if (bv1[(2 * i)] > bv2[(2 * i) + 1])
+ {
+ return 0;
+ }
+ // Maxiumum test.
+ if (bv2[(2 * i)] > bv1[(2 * i) + 1])
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+/**
+ * bvh_traverse - traverse two bvh trees looking for potential collisions.
+ *
+ * max collisions are n*n collisions --> every triangle collide with
+ * every other triangle that doesn't require any realloc, but uses
+ * much memory
+ */
+int bvh_traverse ( ClothModifierData * clmd, CollisionModifierData * collmd, CollisionTree * tree1, CollisionTree * tree2, float step, CM_COLLISION_RESPONSE collision_response)
+{
+ int i = 0, ret=0;
+
+ /*
+ // Shouldn't be possible
+ if(!tree1 || !tree2)
+ {
+ printf("Error: no tree there\n");
+ return 0;
+}
+ */
+ if (bvh_overlap(tree1->bv, tree2->bv))
+ {
+ // Check if this node in the first tree is a leaf
+ if (tree1->isleaf)
+ {
+ // Check if this node in the second tree a leaf
+ if (tree2->isleaf)
+ {
+ // Provide the collision response.
+
+ if(collision_response)
+ collision_response (clmd, collmd, tree1, tree2);
+ return 1;
+ }
+ else
+ {
+ // Process the quad tree.
+ for (i = 0; i < 4; i++)
+ {
+ // Only traverse nodes that exist.
+ if (tree2->nodes[i] && bvh_traverse (clmd, collmd, tree1, tree2->nodes[i], step, collision_response))
+ ret = 1;
+ }
+ }
+ }
+ else
+ {
+ // Process the quad tree.
+ for (i = 0; i < 4; i++)
+ {
+ // Only traverse nodes that exist.
+ if (tree1->nodes [i] && bvh_traverse (clmd, collmd, tree1->nodes[i], tree2, step, collision_response))
+ ret = 1;
+ }
+ }
+ }
+
+ return ret;
+}
+
+// bottom up update of bvh tree:
+// join the 4 children here
+void bvh_join(CollisionTree * tree)
+{
+ int i = 0, j = 0;
+ if (!tree)
+ return;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (tree->nodes[i])
+ {
+ for (j = KDOP_START; j < KDOP_END; j++)
+ {
+ // update minimum
+ if ((tree->nodes[i]->bv[(2 * j)] < tree->bv[(2 * j)]) || (i == 0))
+ {
+ tree->bv[(2 * j)] = tree->nodes[i]->bv[(2 * j)];
+ }
+ // update maximum
+ if ((tree->nodes[i]->bv[(2 * j) + 1] > tree->bv[(2 * j) + 1])|| (i == 0))
+ {
+ tree->bv[(2 * j) + 1] = tree->nodes[i]->bv[(2 * j) + 1];
+ }
+ }
+ }
+ else
+ break;
+ }
+}
+
+// update static bvh
+/* you have to update the bvh position before calling this function */
+void bvh_update(BVH * bvh, int moving)
+{
+ CollisionTree *leaf, *parent;
+ int traversecheck = 1; // if this is zero we don't go further
+ unsigned int j = 0;
+
+ for (leaf = bvh->leaf_root; leaf; leaf = leaf->nextLeaf)
+ {
+ traversecheck = 1;
+ if ((leaf->parent) && (leaf->parent->traversed == leaf->parent->count_nodes))
+ {
+ leaf->parent->traversed = 0;
+ }
+ if(!moving)
+ bvh_calc_DOP_hull_static(bvh, &leaf, 1, leaf->bv);
+ else
+ bvh_calc_DOP_hull_moving(bvh, &leaf, 1, leaf->bv);
+
+ // inflate the bv with some epsilon
+ for (j = KDOP_START; j < KDOP_END; j++)
+ {
+ leaf->bv[(2 * j)] -= bvh->epsilon; // minimum
+ leaf->bv[(2 * j) + 1] += bvh->epsilon; // maximum
+ }
+
+ for (parent = leaf->parent; parent; parent = parent->parent)
+ {
+ if (traversecheck)
+ {
+ parent->traversed++; // we tried to go up in hierarchy
+ if (parent->traversed < parent->count_nodes)
+ {
+ traversecheck = 0;
+
+ if (parent->parent)
+ {
+ if (parent->parent->traversed == parent->parent->count_nodes)
+ {
+ parent->parent->traversed = 0;
+ }
+ }
+ break; // we do not need to check further
+ }
+ else
+ {
+ bvh_join(parent);
+ }
+ }
+
+ }
+ }
+}
+
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 8da3ea0b994..b57b799001a 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -672,19 +672,21 @@ static void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, i
/* step 2: do it */
- kb= key->block.first;
- while(kb) {
-
+ for(kb=key->block.first; kb; kb=kb->next) {
if(kb!=key->refkey) {
float icuval= kb->curval;
/* only with value, and no difference allowed */
- if(icuval!=0.0f && kb->totelem==tot) {
+ if(!(kb->flag & KEYBLOCK_MUTE) && 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!
@@ -734,7 +736,6 @@ static void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, i
}
}
}
- kb= kb->next;
}
}
@@ -1308,6 +1309,9 @@ int do_ob_key(Object *ob)
if(ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)) {
KeyBlock *kb= BLI_findlink(&key->block, ob->shapenr-1);
+ if(kb && (kb->flag & KEYBLOCK_MUTE))
+ kb= key->refkey;
+
if(kb==NULL) {
kb= key->block.first;
ob->shapenr= 1;
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 64c081c27a6..2b815c28cc5 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -483,6 +483,7 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir)
/* test for cyclic */
bl= cu->bev.first;
+ if (!bl->nr) return 0;
if(bl && bl->poly> -1) cycl= 1;
if(cycl==0) {
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 28a6aad7b4d..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;
}
@@ -503,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 d70cd683237..42cac46c241 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -581,6 +581,26 @@ void assign_material(Object *ob, Material *ma, int act)
test_object_materials(ob->data);
}
+int find_material_index(Object *ob, Material *ma)
+{
+ Material ***matarar;
+ short a, *totcolp;
+
+ if(ma==NULL) return 0;
+
+ totcolp= give_totcolp(ob);
+ matarar= give_matarar(ob);
+
+ if(totcolp==NULL || matarar==NULL) return 0;
+
+ for(a=0; a<*totcolp; a++)
+ if((*matarar)[a]==ma)
+ break;
+ if(a<*totcolp)
+ return a+1;
+ return 0;
+}
+
void new_material_to_objectdata(Object *ob)
{
Material *ma;
@@ -609,7 +629,7 @@ void new_material_to_objectdata(Object *ob)
static void do_init_render_material(Material *ma, int r_mode, float *amb)
{
MTex *mtex;
- int a, needuv=0;
+ int a, needuv=0, needtang=0;
if(ma->flarec==0) ma->flarec= 1;
@@ -633,8 +653,14 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
if(ma->texco & (TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM|TEXCO_STRAND|TEXCO_STRESS)) needuv= 1;
else if(ma->texco & (TEXCO_GLOB|TEXCO_UV|TEXCO_OBJECT|TEXCO_SPEED)) needuv= 1;
else if(ma->texco & (TEXCO_LAVECTOR|TEXCO_VIEW|TEXCO_STICKY)) needuv= 1;
+
+ if((ma->mapto & MAP_NORM) && (mtex->normapspace == MTEX_NSPACE_TANGENT))
+ needtang= 1;
}
}
+
+ if(needtang) ma->mode |= MA_NORMAP_TANG;
+ else ma->mode &= ~MA_NORMAP_TANG;
if(r_mode & R_RADIO)
if(ma->mode & MA_RADIO) needuv= 1;
@@ -661,6 +687,9 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
/* will become or-ed result of all node modes */
ma->mode_l= ma->mode;
ma->mode_l &= ~MA_SHLESS;
+
+ if(ma->strand_surfnor > 0.0f)
+ ma->mode_l |= MA_STR_SURFDIFF;
}
static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode, float *amb)
@@ -757,9 +786,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",
@@ -767,7 +796,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 6e27f580d88..464af9a3359 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -55,14 +55,13 @@
#include "DNA_meshdata_types.h"
#include "DNA_ipo_types.h"
-#include "BDR_sculptmode.h"
-
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_main.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
+#include "BKE_multires.h"
#include "BKE_subsurf.h"
#include "BKE_displist.h"
#include "BKE_library.h"
@@ -83,8 +82,6 @@
#include "BLI_editVert.h"
#include "BLI_arithb.h"
-#include "multires.h"
-
int update_realtime_texture(MTFace *tface, double time)
{
Image *ima;
@@ -454,11 +451,15 @@ void tex_space_mesh(Mesh *me)
}
}
-BoundBox *mesh_get_bb(Mesh *me)
+BoundBox *mesh_get_bb(Object *ob)
{
- if (!me->bb) {
+ Mesh *me= ob->data;
+
+ if(ob->bb)
+ return ob->bb;
+
+ if (!me->bb)
tex_space_mesh(me);
- }
return me->bb;
}
@@ -474,45 +475,23 @@ void mesh_get_texspace(Mesh *me, float *loc_r, float *rot_r, float *size_r)
if (size_r) VECCOPY(size_r, me->size);
}
-static float *make_orco_mesh_internal(Object *ob, int render)
+float *get_mesh_orco_verts(Object *ob)
{
Mesh *me = ob->data;
- float (*orcoData)[3];
int a, totvert;
- float loc[3], size[3];
- DerivedMesh *dm;
float (*vcos)[3] = NULL;
- /* Get appropriate vertex coordinates */
-
+ /* 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;
- MVert *mvert = NULL;
-
- if(me->mr) {
- lvl = multires_level_n(me->mr, me->mr->pinlvl);
- vcos = MEM_callocN(sizeof(*vcos)*lvl->totvert, "orco mr mesh");
- mvert = me->mr->verts;
- totvert = lvl->totvert;
- }
- else {
- Mesh *tme = me->texcomesh?me->texcomesh:me;
- vcos = MEM_callocN(sizeof(*vcos)*me->totvert, "orco mesh");
- mvert = tme->mvert;
- totvert = MIN2(tme->totvert, me->totvert);
- }
+ MVert *mvert = NULL;
+ Mesh *tme = me->texcomesh?me->texcomesh:me;
+
+ vcos = MEM_callocN(sizeof(*vcos)*me->totvert, "orco mesh");
+ mvert = tme->mvert;
+ totvert = MIN2(tme->totvert, me->totvert);
for(a=0; a<totvert; a++, mvert++) {
vcos[a][0]= mvert->co[0];
@@ -521,45 +500,37 @@ static float *make_orco_mesh_internal(Object *ob, int render)
}
}
- /* Apply orco-changing modifiers */
-
- if (render) {
- dm = mesh_create_derived_no_deform_render(ob, vcos, CD_MASK_BAREMESH);
- } else {
- dm = mesh_create_derived_no_deform(ob, vcos, CD_MASK_BAREMESH);
- }
- totvert = dm->getNumVerts(dm);
+ return (float*)vcos;
+}
- orcoData = MEM_mallocN(sizeof(*orcoData)*totvert, "orcoData");
- dm->getVertCos(dm, orcoData);
- dm->release(dm);
- MEM_freeN(vcos);
+void transform_mesh_orco_verts(Mesh *me, float (*orco)[3], int totvert, int invert)
+{
+ float loc[3], size[3];
+ int a;
mesh_get_texspace(me->texcomesh?me->texcomesh:me, loc, NULL, size);
- for(a=0; a<totvert; a++) {
- float *co = orcoData[a];
- co[0] = (co[0]-loc[0])/size[0];
- co[1] = (co[1]-loc[1])/size[1];
- co[2] = (co[2]-loc[2])/size[2];
+ if(invert) {
+ for(a=0; a<totvert; a++) {
+ float *co = orco[a];
+ co[0] = co[0]*size[0] + loc[0];
+ co[1] = co[1]*size[1] + loc[1];
+ co[2] = co[2]*size[2] + loc[2];
+ }
+ }
+ else {
+ for(a=0; a<totvert; a++) {
+ float *co = orco[a];
+ co[0] = (co[0]-loc[0])/size[0];
+ co[1] = (co[1]-loc[1])/size[1];
+ co[2] = (co[2]-loc[2])/size[2];
+ }
}
-
- return (float*) orcoData;
-}
-
-float *mesh_create_orco_render(Object *ob)
-{
- return make_orco_mesh_internal(ob, 1);
-}
-
-float *mesh_create_orco(Object *ob)
-{
- return make_orco_mesh_internal(ob, 0);
}
/* rotates the vertices of a face in case v[2] or v[3] (vertex index) is = 0.
this is necessary to make the if(mface->v4) check for quads work */
-void test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
+int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
{
/* first test if the face is legal */
if(mface->v3 && mface->v3==mface->v4) {
@@ -601,6 +572,8 @@ void test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
CustomData_swap(fdata, mfindex, corner_indices);
}
}
+
+ return nr;
}
Mesh *get_mesh(Object *ob)
@@ -933,8 +906,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 +1093,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,6 +1102,25 @@ float (*mesh_getVertexCos(Mesh *me, int *numVerts_r))[3]
#endif
}
+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");
+
+ 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)
{
UvVertMap *vmap;
@@ -1239,3 +1230,70 @@ void free_uv_vert_map(UvVertMap *vmap)
}
}
+/* Partial Mesh Visibility */
+PartialVisibility *mesh_pmv_copy(PartialVisibility *pmv)
+{
+ PartialVisibility *n= MEM_dupallocN(pmv);
+ n->vert_map= MEM_dupallocN(pmv->vert_map);
+ n->edge_map= MEM_dupallocN(pmv->edge_map);
+ n->old_edges= MEM_dupallocN(pmv->old_edges);
+ n->old_faces= MEM_dupallocN(pmv->old_faces);
+ return n;
+}
+
+void mesh_pmv_free(PartialVisibility *pv)
+{
+ MEM_freeN(pv->vert_map);
+ MEM_freeN(pv->edge_map);
+ MEM_freeN(pv->old_faces);
+ MEM_freeN(pv->old_edges);
+ MEM_freeN(pv);
+}
+
+void mesh_pmv_revert(Object *ob, Mesh *me)
+{
+ if(me->pv) {
+ unsigned i;
+ MVert *nve, *old_verts;
+
+ /* Reorder vertices */
+ nve= me->mvert;
+ old_verts = MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts");
+ for(i=0; i<me->pv->totvert; ++i)
+ old_verts[i]= nve[me->pv->vert_map[i]];
+
+ /* Restore verts, edges and faces */
+ CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
+ CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
+
+ CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, old_verts, me->pv->totvert);
+ CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, me->pv->old_edges, me->pv->totedge);
+ CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, me->pv->old_faces, me->pv->totface);
+ mesh_update_customdata_pointers(me);
+
+ me->totvert= me->pv->totvert;
+ me->totedge= me->pv->totedge;
+ me->totface= me->pv->totface;
+
+ me->pv->old_edges= NULL;
+ me->pv->old_faces= NULL;
+
+ /* Free maps */
+ MEM_freeN(me->pv->edge_map);
+ me->pv->edge_map= NULL;
+ MEM_freeN(me->pv->vert_map);
+ me->pv->vert_map= NULL;
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+}
+
+void mesh_pmv_off(Object *ob, Mesh *me)
+{
+ if(ob && me->pv) {
+ mesh_pmv_revert(ob, me);
+ MEM_freeN(me->pv);
+ me->pv= NULL;
+ }
+}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 98ba46d49d5..049146fb05f 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -41,16 +41,19 @@
#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"
#include "DNA_armature_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_effect_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
@@ -58,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_scene_types.h"
#include "DNA_texture_types.h"
#include "DNA_curve_types.h"
@@ -71,20 +75,26 @@
#include "BKE_main.h"
#include "BKE_anim.h"
#include "BKE_bad_level_calls.h"
+#include "BKE_cloth.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_cloth.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 +247,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);
}
@@ -913,6 +940,8 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
count - 1);
}
+ if(med.v1 == med.v2) continue;
+
if (initFlags) {
med.flag |= ME_EDGEDRAW | ME_EDGERENDER;
}
@@ -974,7 +1003,9 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if(inMF.v4 && indexMap[inMF.v4].merge_final)
mf->v4 = calc_mapping(indexMap, indexMap[inMF.v4].merge, count-1);
- test_index_face(mf, &result->faceData, numFaces, inMF.v4?4:3);
+ if(test_index_face(mf, &result->faceData, numFaces, inMF.v4?4:3) < 3)
+ continue;
+
numFaces++;
/* if the face has fewer than 3 vertices, don't create it */
@@ -1229,6 +1260,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 +1271,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 +1311,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 +1319,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 +1354,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 +1368,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 +1466,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 +1496,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);
@@ -2651,7 +2733,7 @@ static void displaceModifier_foreachIDLink(ModifierData *md, Object *ob,
walk(userData, ob, (ID **)&dmd->texture);
- displaceModifier_foreachObjectLink(md, ob, (ObjectWalkFunc) walk, userData);
+ displaceModifier_foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
}
static int displaceModifier_isDisabled(ModifierData *md)
@@ -4612,8 +4694,16 @@ static void armatureModifier_deformVerts(
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
+ modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
+
armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL,
- numVerts, amd->deformflag, amd->defgrp_name);
+ 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(
@@ -4626,7 +4716,7 @@ static void armatureModifier_deformVertsEM(
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts,
- amd->deformflag, amd->defgrp_name);
+ amd->deformflag, NULL, amd->defgrp_name);
if(!derivedData) dm->release(dm);
}
@@ -4642,7 +4732,7 @@ static void armatureModifier_deformMatricesEM(
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
- amd->deformflag, amd->defgrp_name);
+ amd->deformflag, NULL, amd->defgrp_name);
if(!derivedData) dm->release(dm);
}
@@ -4855,6 +4945,296 @@ static void softbodyModifier_deformVerts(
sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos, numVerts);
}
+
+/* Cloth */
+
+static void clothModifier_initData(ModifierData *md)
+{
+ ClothModifierData *clmd = (ClothModifierData*) md;
+
+ clmd->sim_parms = MEM_callocN(sizeof(SimulationSettings), "cloth sim parms");
+ clmd->coll_parms = MEM_callocN(sizeof(CollisionSettings), "cloth coll parms");
+
+ /* check for alloc failing */
+ if(!clmd->sim_parms || !clmd->coll_parms)
+ return;
+
+ cloth_init (clmd);
+ if(G.rt >0)
+ printf("clothModifier_initData\n");
+}
+
+static DerivedMesh *clothModifier_applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData, int useRenderParams, int isFinalCalc)
+{
+ ClothModifierData *clmd = (ClothModifierData*) md;
+ DerivedMesh *result=NULL;
+
+ /* check for alloc failing */
+ if(!clmd->sim_parms || !clmd->coll_parms)
+ return derivedData;
+
+ result = clothModifier_do(clmd, ob, derivedData, useRenderParams, isFinalCalc);
+
+ if(result)
+ {
+ CDDM_calc_normals(result);
+ return result;
+ }
+ return derivedData;
+}
+
+static void clothModifier_updateDepgraph(
+ ModifierData *md, DagForest *forest, Object *ob,
+ DagNode *obNode)
+{
+ ClothModifierData *clmd = (ClothModifierData*) md;
+
+ Base *base;
+
+ if(clmd)
+ {
+ for(base = G.scene->base.first; base; base= base->next)
+ {
+ Object *ob1= base->object;
+ if(ob1 != ob)
+ {
+ CollisionModifierData *coll_clmd = (CollisionModifierData *)modifiers_findByType(ob1, eModifierType_Collision);
+ if(coll_clmd)
+ {
+ DagNode *curNode = dag_get_node(forest, ob1);
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
+ }
+ }
+ }
+ }
+}
+
+CustomDataMask clothModifier_requiredDataMask(ModifierData *md)
+{
+ ClothModifierData *clmd = (ClothModifierData *)md;
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups if we need them */
+ dataMask |= (1 << CD_MDEFORMVERT);
+
+ return dataMask;
+}
+
+static void clothModifier_copyData(ModifierData *md, ModifierData *target)
+{
+ ClothModifierData *clmd = (ClothModifierData*) md;
+ ClothModifierData *tclmd = (ClothModifierData*) target;
+
+ if(tclmd->sim_parms)
+ MEM_freeN(tclmd->sim_parms);
+ if(tclmd->coll_parms)
+ MEM_freeN(tclmd->coll_parms);
+
+ tclmd->sim_parms = MEM_dupallocN(clmd->sim_parms);
+ tclmd->coll_parms = MEM_dupallocN(clmd->coll_parms);
+
+ tclmd->sim_parms->lastcachedframe = 0;
+}
+
+
+static int clothModifier_dependsOnTime(ModifierData *md)
+{
+ return 1;
+}
+
+static void clothModifier_freeData(ModifierData *md)
+{
+ ClothModifierData *clmd = (ClothModifierData*) md;
+
+ if (clmd)
+ {
+ if(G.rt > 0)
+ printf("clothModifier_freeData\n");
+
+ cloth_free_modifier_extern (clmd);
+
+ if(clmd->sim_parms)
+ MEM_freeN(clmd->sim_parms);
+ if(clmd->coll_parms)
+ MEM_freeN(clmd->coll_parms);
+ }
+}
+
+/* Collision */
+
+static void collisionModifier_initData(ModifierData *md)
+{
+ CollisionModifierData *collmd = (CollisionModifierData*) md;
+
+ collmd->x = NULL;
+ collmd->xnew = NULL;
+ collmd->current_x = NULL;
+ collmd->current_xnew = NULL;
+ collmd->current_v = NULL;
+ collmd->time = -1;
+ collmd->numverts = 0;
+ collmd->tree = NULL;
+}
+
+static void collisionModifier_freeData(ModifierData *md)
+{
+ CollisionModifierData *collmd = (CollisionModifierData*) md;
+
+ if (collmd)
+ {
+ if(collmd->tree)
+ bvh_free(collmd->tree);
+ if(collmd->x)
+ MEM_freeN(collmd->x);
+ if(collmd->xnew)
+ MEM_freeN(collmd->xnew);
+ if(collmd->current_x)
+ MEM_freeN(collmd->current_x);
+ if(collmd->current_xnew)
+ MEM_freeN(collmd->current_xnew);
+ if(collmd->current_v)
+ MEM_freeN(collmd->current_v);
+
+ if(collmd->mfaces)
+ MEM_freeN(collmd->mfaces);
+
+ collmd->x = NULL;
+ collmd->xnew = NULL;
+ collmd->current_x = NULL;
+ collmd->current_xnew = NULL;
+ collmd->current_v = NULL;
+ collmd->time = -1;
+ collmd->numverts = 0;
+ collmd->tree = NULL;
+ collmd->mfaces = NULL;
+ }
+}
+
+static int collisionModifier_dependsOnTime(ModifierData *md)
+{
+ return 1;
+}
+
+static void collisionModifier_deformVerts(
+ ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], int numVerts)
+{
+ CollisionModifierData *collmd = (CollisionModifierData*) md;
+ DerivedMesh *dm = NULL;
+ float current_time = 0;
+ unsigned int numverts = 0, i = 0;
+ MVert *tempVert = NULL;
+
+ /* if possible use/create DerivedMesh */
+ if(derivedData) dm = CDDM_copy(derivedData);
+ else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
+
+ if(!ob->pd)
+ {
+ printf("collisionModifier_deformVerts: Should not happen!\n");
+ return;
+ }
+
+ if(dm)
+ {
+ CDDM_apply_vert_coords(dm, vertexCos);
+ CDDM_calc_normals(dm);
+
+ current_time = bsystem_time ( ob, ( float ) G.scene->r.cfra, 0.0 );
+
+ if(G.rt > 0)
+ printf("current_time %f, collmd->time %f\n", current_time, collmd->time);
+
+ numverts = dm->getNumVerts ( dm );
+
+ if(current_time > collmd->time)
+ {
+ // check if mesh has changed
+ if(collmd->x && (numverts != collmd->numverts))
+ collisionModifier_freeData((ModifierData *)collmd);
+
+ if(collmd->time == -1) // first time
+ {
+ collmd->x = dm->dupVertArray(dm); // frame start position
+
+ for ( i = 0; i < numverts; i++ )
+ {
+ // we save global positions
+ Mat4MulVecfl ( ob->obmat, collmd->x[i].co );
+ }
+
+ collmd->xnew = MEM_dupallocN(collmd->x); // frame end position
+ collmd->current_x = MEM_dupallocN(collmd->x); // inter-frame
+ collmd->current_xnew = MEM_dupallocN(collmd->x); // inter-frame
+ collmd->current_v = MEM_dupallocN(collmd->x); // inter-frame
+
+ collmd->numverts = numverts;
+
+ collmd->mfaces = dm->dupFaceArray(dm);
+ collmd->numfaces = dm->getNumFaces(dm);
+
+ // TODO: epsilon
+ // create bounding box hierarchy
+ collmd->tree = bvh_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->x, numverts, ob->pd->pdef_sbift);
+
+ collmd->time = current_time;
+ }
+ else if(numverts == collmd->numverts)
+ {
+ // put positions to old positions
+ tempVert = collmd->x;
+ collmd->x = collmd->xnew;
+ collmd->xnew = tempVert;
+
+ memcpy(collmd->xnew, dm->getVertArray(dm), numverts*sizeof(MVert));
+
+ for ( i = 0; i < numverts; i++ )
+ {
+ // we save global positions
+ Mat4MulVecfl ( ob->obmat, collmd->xnew[i].co );
+ }
+
+ memcpy(collmd->current_xnew, collmd->x, numverts*sizeof(MVert));
+ memcpy(collmd->current_x, collmd->x, numverts*sizeof(MVert));
+
+ /* happens on file load (ONLY when i decomment changes in readfile.c */
+ if(!collmd->tree)
+ {
+ collmd->tree = bvh_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->current_x, numverts, ob->pd->pdef_sbift);
+ }
+ else
+ {
+ // recalc static bounding boxes
+ bvh_update_from_mvert(collmd->tree, collmd->current_x, numverts, NULL, 0);
+ }
+
+ collmd->time = current_time;
+ }
+ else if(numverts != collmd->numverts)
+ {
+ collisionModifier_freeData((ModifierData *)collmd);
+ }
+
+ }
+ else if(current_time < collmd->time)
+ {
+ collisionModifier_freeData((ModifierData *)collmd);
+ }
+ else
+ {
+ if(numverts != collmd->numverts)
+ {
+ collisionModifier_freeData((ModifierData *)collmd);
+ }
+ }
+ }
+
+ if(dm)
+ dm->release(dm);
+}
+
+
/* Boolean */
static void booleanModifier_copyData(ModifierData *md, ModifierData *target)
@@ -4921,6 +5301,1543 @@ static DerivedMesh *booleanModifier_applyModifier(
return derivedData;
}
+/* Particles */
+static void particleSystemModifier_initData(ModifierData *md)
+{
+ ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
+ psmd->psys= 0;
+ psmd->dm=0;
+ psmd->totdmvert= psmd->totdmedge= psmd->totdmface= 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;
+
+ dataMask |= CD_MASK_ORCO;
+
+ 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 needsFree=0;
+
+ if(ob->particlesystem.first)
+ psys=psmd->psys;
+ else
+ return;
+
+ if(!psys_check_enabled(ob, psys))
+ 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);
+
+ DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
+
+ 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){
+ 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)!=psmd->totdmvert ||
+ psmd->dm->getNumEdges(psmd->dm)!=psmd->totdmedge ||
+ psmd->dm->getNumFaces(psmd->dm)!=psmd->totdmface){
+ /* in file read dm hasn't really changed but just wasn't saved in file */
+
+ psys->recalc |= PSYS_RECALC_HAIR;
+ psys->recalc |= PSYS_DISTR;
+ psmd->flag |= eParticleSystemFlag_DM_changed;
+
+ psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm);
+ psmd->totdmedge= psmd->dm->getNumEdges(psmd->dm);
+ psmd->totdmface= psmd->dm->getNumFaces(psmd->dm);
+ }
+
+ if(psys){
+ particle_system_update(ob,psys);
+ psmd->flag |= eParticleSystemFlag_psys_updated;
+ psmd->flag &= ~eParticleSystemFlag_DM_changed;
+ }
+}
+
+/* disabled particles in editmode for now, until support for proper derivedmesh
+ * updates is coded */
+#if 0
+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);
+}
+#endif
+
+/* 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], cross[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);
+
+ mv->co[0] = 0.0;
+
+ Normalize(state.vel);
+
+ if(state.vel[0] < -0.9999 || state.vel[0] > 0.9999) {
+ state.rot[0] = 1.0;
+ state.rot[1] = state.rot[2] = state.rot[3] = 0.0f;
+ }
+ else {
+ /* a cross product of state.vel and a unit vector in x-direction */
+ cross[0] = 0.0f;
+ cross[1] = -state.vel[2];
+ cross[2] = state.vel[1];
+
+ /* state.vel[0] is the only component surviving from a dot product with a vector in x-direction*/
+ VecRotToQuat(cross,saacos(state.vel[0]),state.rot);
+ }
+ }
+ else{
+ state.time=-1.0;
+ psys_get_particle_state(pimd->ob,psys,i/totvert,&state,1);
+ }
+
+ 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,psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,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,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
+ || MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumFaces(dm)){
+ 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= mmd->object->derivedFinal;
+
+ if(!cagedm)
+ return;
+
+ /* compute matrices to go in and out of cage object space */
+ Mat4Invert(imat, mmd->object->obmat);
+ Mat4MulMat4(cagemat, ob->obmat, imat);
+ Mat4Invert(icagemat, cagemat);
+ Mat3CpyMat4(iobmat, icagemat);
+
+ /* 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++) {
+ /* get cage vertex in world space with binding transform */
+ VECCOPY(co, cagemvert[a].co);
+
+ if(G.rt != 527) {
+ Mat4MulVecfl(mmd->bindmat, co);
+ /* compute difference with world space bind coord */
+ VECSUB(dco[a], co, bindcos[a]);
+ }
+ else
+ VECCOPY(dco[a], co)
+ }
+
+ 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) {
+ /* transform coordinate into cage's local space */
+ 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);
+ if(G.rt != 527)
+ VECADD(vertexCos[b], vertexCos[b], co)
+ else
+ VECCOPY(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];
@@ -5021,6 +6938,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;
@@ -5139,16 +7058,95 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->flags = eModifierTypeFlag_AcceptsCVs
| eModifierTypeFlag_RequiresOriginalData;
mti->deformVerts = softbodyModifier_deformVerts;
+
+ mti = INIT_TYPE(Cloth);
+ mti->type = eModifierTypeType_Nonconstructive;
+ mti->initData = clothModifier_initData;
+ mti->flags = eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_UsesPointCache;
+ mti->dependsOnTime = clothModifier_dependsOnTime;
+ mti->freeData = clothModifier_freeData;
+ mti->requiredDataMask = clothModifier_requiredDataMask;
+ mti->copyData = clothModifier_copyData;
+ mti->applyModifier = clothModifier_applyModifier;
+ mti->updateDepgraph = clothModifier_updateDepgraph;
+
+ mti = INIT_TYPE(Collision);
+ mti->type = eModifierTypeType_OnlyDeform;
+ mti->initData = collisionModifier_initData;
+ mti->flags = eModifierTypeFlag_AcceptsMesh;
+ mti->dependsOnTime = collisionModifier_dependsOnTime;
+ mti->freeData = collisionModifier_freeData;
+ mti->deformVerts = collisionModifier_deformVerts;
+ // mti->copyData = collisionModifier_copyData;
mti = INIT_TYPE(Boolean);
mti->type = eModifierTypeType_Nonconstructive;
- mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_RequiresOriginalData;
+ mti->flags = eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_RequiresOriginalData
+ | eModifierTypeFlag_UsesPointCache;
mti->copyData = booleanModifier_copyData;
mti->isDisabled = booleanModifier_isDisabled;
mti->applyModifier = booleanModifier_applyModifier;
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_SupportsMapping
+ | eModifierTypeFlag_UsesPointCache;
+#if 0
+ | eModifierTypeFlag_SupportsEditmode;
+ |eModifierTypeFlag_EnableInEditmode;
+#endif
+ mti->initData = particleSystemModifier_initData;
+ mti->freeData = particleSystemModifier_freeData;
+ mti->copyData = particleSystemModifier_copyData;
+ mti->deformVerts = particleSystemModifier_deformVerts;
+#if 0
+ mti->deformVertsEM = particleSystemModifier_deformVertsEM;
+#endif
+ 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
}
@@ -5202,9 +7200,8 @@ int modifier_supportsMapping(ModifierData *md)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- return ( (mti->flags & eModifierTypeFlag_SupportsEditmode) &&
- ( (mti->type==eModifierTypeType_OnlyDeform ||
- (mti->flags & eModifierTypeFlag_SupportsMapping))) );
+ return (mti->type==eModifierTypeType_OnlyDeform ||
+ (mti->flags & eModifierTypeFlag_SupportsMapping));
}
ModifierData *modifiers_findByType(Object *ob, ModifierType type)
@@ -5341,6 +7338,20 @@ int modifiers_isSoftbodyEnabled(Object *ob)
return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
}
+int modifiers_isClothEnabled(Object *ob)
+{
+ ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
+
+ 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;
@@ -5523,3 +7534,38 @@ int modifiers_isDeformed(Object *ob)
}
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;
+}
+
+int modifiers_usesPointCache(Object *ob)
+{
+ ModifierData *md = ob->modifiers.first;
+
+ for (; md; md=md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ if (mti->flags & eModifierTypeFlag_UsesPointCache) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void modifier_freeTemporaryData(ModifierData *md)
+{
+ if(md->type == eModifierType_Armature) {
+ ArmatureModifierData *amd= (ArmatureModifierData*)md;
+
+ if(amd->prevCos)
+ MEM_freeN(amd->prevCos);
+ }
+}
+
+
diff --git a/source/blender/src/multires-firstlevel.c b/source/blender/blenkernel/intern/multires-firstlevel.c
index 2be867b5db0..778dd6f9c77 100644
--- a/source/blender/src/multires-firstlevel.c
+++ b/source/blender/blenkernel/intern/multires-firstlevel.c
@@ -43,13 +43,13 @@
#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
+#include "BKE_multires.h"
#include "BLI_editVert.h"
#include "MEM_guardedalloc.h"
#include "blendef.h"
-#include "multires.h"
#include <string.h>
@@ -392,7 +392,6 @@ void multires_delete_layer(Mesh *me, CustomData *cd, const int type, int n)
}
}
-MultiresLevel *current_level(Multires *mr);
void multires_add_layer(Mesh *me, CustomData *cd, const int type, const int n)
{
if(me && me->mr && cd) {
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
new file mode 100644
index 00000000000..3a8847a5be1
--- /dev/null
+++ b/source/blender/blenkernel/intern/multires.c
@@ -0,0 +1,1305 @@
+/*
+ * $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 *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_vec_types.h"
+
+#include "BIF_editmesh.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_multires.h"
+
+#include "blendef.h"
+#include "editmesh.h"
+
+#include <math.h>
+
+/* Returns the active multires level (currently applied to the mesh) */
+MultiresLevel *current_level(Multires *mr)
+{
+ return BLI_findlink(&mr->levels, mr->current - 1);
+}
+
+/* Returns the nth multires level, starting at 1 */
+MultiresLevel *multires_level_n(Multires *mr, int n)
+{
+ if(mr)
+ return BLI_findlink(&mr->levels, n - 1);
+ else
+ return NULL;
+}
+
+/* Free and clear the temporary connectivity data */
+static void multires_free_temp_data(MultiresLevel *lvl)
+{
+ if(lvl) {
+ if(lvl->edge_boundary_states) MEM_freeN(lvl->edge_boundary_states);
+ if(lvl->vert_edge_map) MEM_freeN(lvl->vert_edge_map);
+ if(lvl->vert_face_map) MEM_freeN(lvl->vert_face_map);
+ if(lvl->map_mem) MEM_freeN(lvl->map_mem);
+
+ lvl->edge_boundary_states = NULL;
+ lvl->vert_edge_map = lvl->vert_face_map = NULL;
+ lvl->map_mem = NULL;
+ }
+}
+
+/* Does not actually free lvl itself */
+void multires_free_level(MultiresLevel *lvl)
+{
+ if(lvl) {
+ if(lvl->faces) MEM_freeN(lvl->faces);
+ if(lvl->edges) MEM_freeN(lvl->edges);
+ if(lvl->colfaces) MEM_freeN(lvl->colfaces);
+
+ multires_free_temp_data(lvl);
+ }
+}
+
+void multires_free(Multires *mr)
+{
+ if(mr) {
+ MultiresLevel* lvl= mr->levels.first;
+
+ /* Free the first-level data */
+ if(lvl) {
+ CustomData_free(&mr->vdata, lvl->totvert);
+ CustomData_free(&mr->fdata, lvl->totface);
+ MEM_freeN(mr->edge_flags);
+ MEM_freeN(mr->edge_creases);
+ }
+
+ while(lvl) {
+ multires_free_level(lvl);
+ lvl= lvl->next;
+ }
+
+ MEM_freeN(mr->verts);
+
+ BLI_freelistN(&mr->levels);
+
+ MEM_freeN(mr);
+ }
+}
+
+static MultiresLevel *multires_level_copy(MultiresLevel *orig)
+{
+ if(orig) {
+ MultiresLevel *lvl= MEM_dupallocN(orig);
+
+ lvl->next= lvl->prev= NULL;
+ lvl->faces= MEM_dupallocN(orig->faces);
+ lvl->colfaces= MEM_dupallocN(orig->colfaces);
+ lvl->edges= MEM_dupallocN(orig->edges);
+ lvl->edge_boundary_states = NULL;
+ lvl->vert_edge_map= lvl->vert_face_map= NULL;
+ lvl->map_mem= NULL;
+
+ return lvl;
+ }
+ return NULL;
+}
+
+Multires *multires_copy(Multires *orig)
+{
+ const CustomDataMask vdata_mask= CD_MASK_MDEFORMVERT;
+
+ if(orig) {
+ Multires *mr= MEM_dupallocN(orig);
+ MultiresLevel *lvl;
+
+ mr->levels.first= mr->levels.last= NULL;
+
+ for(lvl= orig->levels.first; lvl; lvl= lvl->next)
+ BLI_addtail(&mr->levels, multires_level_copy(lvl));
+
+ mr->verts= MEM_dupallocN(orig->verts);
+
+ lvl= mr->levels.first;
+ if(lvl) {
+ CustomData_copy(&orig->vdata, &mr->vdata, vdata_mask, CD_DUPLICATE, lvl->totvert);
+ CustomData_copy(&orig->fdata, &mr->fdata, CD_MASK_MTFACE, CD_DUPLICATE, lvl->totface);
+ mr->edge_flags= MEM_dupallocN(orig->edge_flags);
+ mr->edge_creases= MEM_dupallocN(orig->edge_creases);
+ }
+
+ return mr;
+ }
+ return NULL;
+}
+
+static void multires_get_vert(MVert *out, EditVert *eve, MVert *m, int i)
+{
+ if(eve) {
+ VecCopyf(out->co, eve->co);
+ out->flag= 0;
+ if(eve->f & SELECT) out->flag |= 1;
+ if(eve->h) out->flag |= ME_HIDE;
+ eve->tmp.l= i;
+ }
+ else
+ *out= *m;
+}
+
+void eed_to_medge_flag(EditEdge *eed, short *flag, char *crease)
+{
+ if(!eed || !flag) return;
+
+ /* Would be nice if EditMesh edge flags could be unified with Mesh flags! */
+ *flag= (eed->f & SELECT) | ME_EDGERENDER;
+ if(eed->f2<2) *flag |= ME_EDGEDRAW;
+ if(eed->f2==0) *flag |= ME_LOOSEEDGE;
+ if(eed->sharp) *flag |= ME_SHARP;
+ if(eed->seam) *flag |= ME_SEAM;
+ if(eed->h & EM_FGON) *flag |= ME_FGON;
+ if(eed->h & 1) *flag |= ME_HIDE;
+
+ *crease= (char)(255.0*eed->crease);
+}
+
+static void multires_get_edge(MultiresEdge *e, EditEdge *eed, MEdge *m, short *flag, char *crease)
+{
+ if(eed) {
+ e->v[0]= eed->v1->tmp.l;
+ e->v[1]= eed->v2->tmp.l;
+ eed_to_medge_flag(eed, flag, crease);
+ } else {
+ e->v[0]= m->v1;
+ e->v[1]= m->v2;
+ *flag= m->flag;
+ *crease= m->crease;
+ }
+}
+
+static void multires_get_face(MultiresFace *f, EditFace *efa, MFace *m)
+{
+ if(efa) {
+ MFace tmp;
+ int j;
+ tmp.v1= efa->v1->tmp.l;
+ tmp.v2= efa->v2->tmp.l;
+ tmp.v3= efa->v3->tmp.l;
+ tmp.v4= 0;
+ if(efa->v4) tmp.v4= efa->v4->tmp.l;
+ test_index_face(&tmp, NULL, 0, efa->v4?4:3);
+ for(j=0; j<4; ++j) f->v[j]= (&tmp.v1)[j];
+
+ /* Flags */
+ f->flag= efa->flag;
+ if(efa->f & 1) f->flag |= ME_FACE_SEL;
+ else f->flag &= ~ME_FACE_SEL;
+ if(efa->h) f->flag |= ME_HIDE;
+ f->mat_nr= efa->mat_nr;
+ } else {
+ f->v[0]= m->v1;
+ f->v[1]= m->v2;
+ f->v[2]= m->v3;
+ f->v[3]= m->v4;
+ f->flag= m->flag;
+ f->mat_nr= m->mat_nr;
+ }
+}
+
+/* For manipulating vertex colors / uvs */
+static void mcol_to_multires(MultiresColFace *mrf, MCol *mcol)
+{
+ char i;
+ for(i=0; i<4; ++i) {
+ mrf->col[i].a= mcol[i].a;
+ mrf->col[i].r= mcol[i].r;
+ mrf->col[i].g= mcol[i].g;
+ mrf->col[i].b= mcol[i].b;
+ }
+}
+
+/* 1 <= count <= 4 */
+static void multires_col_avg(MultiresCol *avg, MultiresCol cols[4], char count)
+{
+ unsigned i;
+ avg->a= avg->r= avg->g= avg->b= 0;
+ for(i=0; i<count; ++i) {
+ avg->a+= cols[i].a;
+ avg->r+= cols[i].r;
+ avg->g+= cols[i].g;
+ avg->b+= cols[i].b;
+ }
+ avg->a/= count;
+ avg->r/= count;
+ avg->g/= count;
+ avg->b/= count;
+}
+
+static void multires_col_avg2(MultiresCol *avg, MultiresCol *c1, MultiresCol *c2)
+{
+ MultiresCol in[2];
+ in[0]= *c1;
+ in[1]= *c2;
+ multires_col_avg(avg,in,2);
+}
+
+void multires_load_cols(Mesh *me)
+{
+ MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1), *cur;
+ EditMesh *em= G.obedit ? G.editMesh : NULL;
+ CustomData *src= em ? &em->fdata : &me->fdata;
+ EditFace *efa= NULL;
+ unsigned i,j;
+
+ if(!CustomData_has_layer(src, CD_MCOL) && !CustomData_has_layer(src, CD_MTFACE)) return;
+
+ /* Add texcol data */
+ for(cur= me->mr->levels.first; cur; cur= cur->next)
+ if(!cur->colfaces)
+ cur->colfaces= MEM_callocN(sizeof(MultiresColFace)*cur->totface,"ColFaces");
+
+ me->mr->use_col= CustomData_has_layer(src, CD_MCOL);
+
+ if(em) efa= em->faces.first;
+ for(i=0; i<lvl->totface; ++i) {
+ MultiresColFace *f= &lvl->colfaces[i];
+
+ if(me->mr->use_col)
+ mcol_to_multires(f, em ? CustomData_em_get(src, efa->data, CD_MCOL) : &me->mcol[i*4]);
+
+ if(em) efa= efa->next;
+ }
+
+ /* Update higher levels */
+ lvl= lvl->next;
+ while(lvl) {
+ MultiresColFace *cf= lvl->colfaces;
+ for(i=0; i<lvl->prev->totface; ++i) {
+ const char sides= lvl->prev->faces[i].v[3]?4:3;
+ MultiresCol cntr;
+
+ /* Find average color of 4 (or 3 for triangle) verts */
+ multires_col_avg(&cntr,lvl->prev->colfaces[i].col,sides);
+
+ for(j=0; j<sides; ++j) {
+ MultiresColFace *pf= &lvl->prev->colfaces[i];
+
+ multires_col_avg2(&cf->col[0],
+ &pf->col[j],
+ &pf->col[j==0?sides-1:j-1]);
+ cf->col[1]= pf->col[j];
+ multires_col_avg2(&cf->col[2],
+ &pf->col[j],
+ &pf->col[j==sides-1?0:j+1]);
+ cf->col[3]= cntr;
+
+ ++cf;
+ }
+ }
+ lvl= lvl->next;
+ }
+
+ /* Update lower levels */
+ lvl= me->mr->levels.last;
+ lvl= lvl->prev;
+ while(lvl) {
+ unsigned curf= 0;
+ for(i=0; i<lvl->totface; ++i) {
+ MultiresFace *f= &lvl->faces[i];
+ for(j=0; j<(f->v[3]?4:3); ++j) {
+ lvl->colfaces[i].col[j]= lvl->next->colfaces[curf].col[1];
+ ++curf;
+ }
+ }
+ lvl= lvl->prev;
+ }
+}
+
+void multires_create(Object *ob, Mesh *me)
+{
+ MultiresLevel *lvl;
+ EditMesh *em= G.obedit ? G.editMesh : NULL;
+ EditVert *eve= NULL;
+ EditFace *efa= NULL;
+ EditEdge *eed= NULL;
+ int i;
+
+ lvl= MEM_callocN(sizeof(MultiresLevel), "multires level");
+
+ if(me->pv) mesh_pmv_off(ob, me);
+
+ me->mr= MEM_callocN(sizeof(Multires), "multires data");
+
+ BLI_addtail(&me->mr->levels,lvl);
+ me->mr->current= 1;
+ me->mr->level_count= 1;
+ me->mr->edgelvl= 1;
+ me->mr->pinlvl= 1;
+ me->mr->renderlvl= 1;
+
+ /* Load mesh (or editmesh) into multires data */
+
+ /* Load vertices and vdata (MDeformVerts) */
+ lvl->totvert= em ? BLI_countlist(&em->verts) : me->totvert;
+ me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts");
+ multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata,
+ &me->mr->vdata, CD_MDEFORMVERT);
+ if(em) eve= em->verts.first;
+ for(i=0; i<lvl->totvert; ++i) {
+ multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i);
+ if(em) eve= eve->next;
+ }
+
+ /* Load faces and fdata (MTFaces) */
+ lvl->totface= em ? BLI_countlist(&em->faces) : me->totface;
+ lvl->faces= MEM_callocN(sizeof(MultiresFace)*lvl->totface,"multires faces");
+ multires_update_customdata(me->mr->levels.first, em ? &em->fdata : &me->fdata,
+ &me->mr->fdata, CD_MTFACE);
+ if(em) efa= em->faces.first;
+ for(i=0; i<lvl->totface; ++i) {
+ multires_get_face(&lvl->faces[i], efa, &me->mface[i]);
+ if(em) efa= efa->next;
+ }
+
+ /* Load edges and edge_flags */
+ lvl->totedge= em ? BLI_countlist(&em->edges) : me->totedge;
+ lvl->edges= MEM_callocN(sizeof(MultiresEdge)*lvl->totedge,"multires edges");
+ me->mr->edge_flags= MEM_callocN(sizeof(short)*lvl->totedge, "multires edge flags");
+ me->mr->edge_creases= MEM_callocN(sizeof(short)*lvl->totedge, "multires edge creases");
+ if(em) eed= em->edges.first;
+ for(i=0; i<lvl->totedge; ++i) {
+ multires_get_edge(&lvl->edges[i], eed, &me->medge[i], &me->mr->edge_flags[i], &me->mr->edge_creases[i]);
+ if(em) eed= eed->next;
+ }
+
+ multires_load_cols(me);
+}
+
+typedef struct MultiresMapNode {
+ struct MultiresMapNode *next, *prev;
+ unsigned Index;
+} MultiresMapNode;
+
+/* Produces temporary connectivity data for the multires lvl */
+static void multires_calc_temp_data(MultiresLevel *lvl)
+{
+ unsigned i, j, emax;
+ MultiresMapNode *indexnode= NULL;
+
+ lvl->map_mem= MEM_mallocN(sizeof(MultiresMapNode)*(lvl->totedge*2 + lvl->totface*4), "map_mem");
+ indexnode= lvl->map_mem;
+
+ /* edge map */
+ lvl->vert_edge_map= MEM_callocN(sizeof(ListBase)*lvl->totvert,"vert_edge_map");
+ for(i=0; i<lvl->totedge; ++i) {
+ for(j=0; j<2; ++j, ++indexnode) {
+ indexnode->Index= i;
+ BLI_addtail(&lvl->vert_edge_map[lvl->edges[i].v[j]], indexnode);
+ }
+ }
+
+ /* face map */
+ lvl->vert_face_map= MEM_callocN(sizeof(ListBase)*lvl->totvert,"vert_face_map");
+ for(i=0; i<lvl->totface; ++i){
+ for(j=0; j<(lvl->faces[i].v[3]?4:3); ++j, ++indexnode) {
+ indexnode->Index= i;
+ BLI_addtail(&lvl->vert_face_map[lvl->faces[i].v[j]], indexnode);
+ }
+ }
+
+ /* edge boundaries */
+ emax = (lvl->prev ? (lvl->prev->totedge * 2) : lvl->totedge);
+ lvl->edge_boundary_states= MEM_callocN(sizeof(char)*lvl->totedge, "edge_boundary_states");
+ for(i=0; i<emax; ++i) {
+ MultiresMapNode *n1= lvl->vert_face_map[lvl->edges[i].v[0]].first;
+ unsigned total= 0;
+
+ lvl->edge_boundary_states[i] = 1;
+ while(n1 && lvl->edge_boundary_states[i] == 1) {
+ MultiresMapNode *n2= lvl->vert_face_map[lvl->edges[i].v[1]].first;
+ while(n2) {
+ if(n1->Index == n2->Index) {
+ ++total;
+
+ if(total > 1) {
+ lvl->edge_boundary_states[i] = 0;
+ break;
+ }
+ }
+
+ n2= n2->next;
+ }
+ n1= n1->next;
+ }
+ }
+}
+
+/* CATMULL-CLARK
+ ============= */
+
+typedef struct MultiApplyData {
+ /* Smooth faces */
+ float *corner1, *corner2, *corner3, *corner4;
+ char quad;
+
+ /* Smooth edges */
+ char boundary;
+ float edge_face_neighbor_midpoints_accum[3];
+ unsigned edge_face_neighbor_midpoints_total;
+ float *endpoint1, *endpoint2;
+
+ /* Smooth verts */
+ /* uses 'char boundary' */
+ float *original;
+ int edge_count;
+ float vert_face_neighbor_midpoints_average[3];
+ float vert_edge_neighbor_midpoints_average[3];
+ float boundary_edges_average[3];
+} MultiApplyData;
+
+/* Simply averages the four corners of a polygon. */
+static float catmullclark_smooth_face(MultiApplyData *data, const unsigned i)
+{
+ const float total= data->corner1[i]+data->corner2[i]+data->corner3[i];
+ return data->quad ? (total+data->corner4[i])/4 : total/3;
+}
+
+static float catmullclark_smooth_edge(MultiApplyData *data, const unsigned i)
+{
+ float accum= 0;
+ unsigned count= 2;
+
+ accum+= data->endpoint1[i] + data->endpoint2[i];
+
+ if(!data->boundary) {
+ accum+= data->edge_face_neighbor_midpoints_accum[i];
+ count+= data->edge_face_neighbor_midpoints_total;
+ }
+
+ return accum / count;
+}
+
+static float catmullclark_smooth_vert(MultiApplyData *data, const unsigned i)
+{
+ if(data->boundary) {
+ return data->original[i]*0.75 + data->boundary_edges_average[i]*0.25;
+ } else {
+ return (data->vert_face_neighbor_midpoints_average[i] +
+ 2*data->vert_edge_neighbor_midpoints_average[i] +
+ data->original[i]*(data->edge_count-3))/data->edge_count;
+ }
+}
+
+
+
+/* Call func count times, passing in[i] as the input and storing the output in out[i] */
+static void multi_apply(float *out, MultiApplyData *data,
+ const unsigned count, float (*func)(MultiApplyData *, const unsigned))
+{
+ unsigned i;
+ for(i=0; i<count; ++i)
+ out[i]= func(data,i);
+}
+
+static short multires_vert_is_boundary(MultiresLevel *lvl, unsigned v)
+{
+ MultiresMapNode *node= lvl->vert_edge_map[v].first;
+ while(node) {
+ if(lvl->edge_boundary_states[node->Index])
+ return 1;
+ node= node->next;
+ }
+ return 0;
+}
+
+#define GET_FLOAT(array, i, j, stride) (((float*)((char*)(array)+((i)*(stride))))[(j)])
+
+static void edge_face_neighbor_midpoints_accum(MultiApplyData *data, MultiresLevel *lvl,
+ void *array, const char stride, const MultiresEdge *e)
+{
+ ListBase *neighbors1= &lvl->vert_face_map[e->v[0]];
+ ListBase *neighbors2= &lvl->vert_face_map[e->v[1]];
+ MultiresMapNode *n1, *n2;
+ unsigned j,count= 0;
+ float *out= data->edge_face_neighbor_midpoints_accum;
+
+ out[0]=out[1]=out[2]= 0;
+
+ for(n1= neighbors1->first; n1; n1= n1->next) {
+ for(n2= neighbors2->first; n2; n2= n2->next) {
+ if(n1->Index == n2->Index) {
+ for(j=0; j<3; ++j)
+ out[j]+= GET_FLOAT(array,lvl->faces[n1->Index].mid,j,stride);
+ ++count;
+ }
+ }
+ }
+
+ data->edge_face_neighbor_midpoints_total= count;
+}
+
+static void vert_face_neighbor_midpoints_average(MultiApplyData *data, MultiresLevel *lvl,
+ void *array, const char stride, const unsigned i)
+{
+ ListBase *neighbors= &lvl->vert_face_map[i];
+ MultiresMapNode *n1;
+ unsigned j,count= 0;
+ float *out= data->vert_face_neighbor_midpoints_average;
+
+ out[0]=out[1]=out[2]= 0;
+
+ for(n1= neighbors->first; n1; n1= n1->next) {
+ for(j=0; j<3; ++j)
+ out[j]+= GET_FLOAT(array,lvl->faces[n1->Index].mid,j,stride);
+ ++count;
+ }
+ for(j=0; j<3; ++j) out[j]/= count;
+}
+
+static void vert_edge_neighbor_midpoints_average(MultiApplyData *data, MultiresLevel *lvl,
+ void *array, const char stride, const unsigned i)
+{
+ ListBase *neighbors= &lvl->vert_edge_map[i];
+ MultiresMapNode *n1;
+ unsigned j,count= 0;
+ float *out= data->vert_edge_neighbor_midpoints_average;
+
+ out[0]=out[1]=out[2]= 0;
+
+ for(n1= neighbors->first; n1; n1= n1->next) {
+ for(j=0; j<3; ++j)
+ out[j]+= (GET_FLOAT(array,lvl->edges[n1->Index].v[0],j,stride) +
+ GET_FLOAT(array,lvl->edges[n1->Index].v[1],j,stride)) / 2;
+ ++count;
+ }
+ for(j=0; j<3; ++j) out[j]/= count;
+}
+
+static void boundary_edges_average(MultiApplyData *data, MultiresLevel *lvl,
+ void *array, const char stride, const unsigned i)
+{
+ ListBase *neighbors= &lvl->vert_edge_map[i];
+ MultiresMapNode *n1;
+ unsigned j,count= 0;
+ float *out= data->boundary_edges_average;
+
+ out[0]=out[1]=out[2]= 0;
+
+ for(n1= neighbors->first; n1; n1= n1->next) {
+ const MultiresEdge *e= &lvl->edges[n1->Index];
+ const unsigned end= e->v[0]==i ? e->v[1] : e->v[0];
+
+ if(lvl->edge_boundary_states[n1->Index]) {
+ for(j=0; j<3; ++j)
+ out[j]+= GET_FLOAT(array,end,j,stride);
+ ++count;
+ }
+ }
+ for(j=0; j<3; ++j) out[j]/= count;
+}
+
+/* END CATMULL-CLARK
+ ================= */
+
+/* Update vertex locations and vertex flags */
+static void multires_update_vertices(Mesh *me, EditMesh *em)
+{
+ MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl= NULL,
+ *last_lvl= me->mr->levels.last;
+ vec3f *pr_deltas= NULL, *cr_deltas= NULL, *swap_deltas= NULL;
+ EditVert *eve= NULL;
+ MultiApplyData data;
+ int i, j;
+
+ /* Prepare deltas */
+ pr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 1");
+ cr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 2");
+
+ /* Calculate initial deltas -- current mesh subtracted from current level*/
+ if(em) eve= em->verts.first;
+ for(i=0; i<cr_lvl->totvert; ++i) {
+ if(em) {
+ VecSubf(&cr_deltas[i].x, eve->co, me->mr->verts[i].co);
+ eve= eve->next;
+ } else
+ VecSubf(&cr_deltas[i].x, me->mvert[i].co, me->mr->verts[i].co);
+ }
+
+
+ /* Copy current level's vertex flags and clear the rest */
+ if(em) eve= em->verts.first;
+ for(i=0; i < last_lvl->totvert; ++i) {
+ if(i < cr_lvl->totvert) {
+ MVert mvflag;
+ multires_get_vert(&mvflag, eve, &me->mvert[i], i);
+ if(em) eve= eve->next;
+ me->mr->verts[i].flag= mvflag.flag;
+ }
+ else
+ me->mr->verts[i].flag= 0;
+ }
+
+ /* If already on the highest level, copy current verts (including flags) into current level */
+ if(cr_lvl == last_lvl) {
+ if(em)
+ eve= em->verts.first;
+ for(i=0; i<cr_lvl->totvert; ++i) {
+ multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i);
+ if(em) eve= eve->next;
+ }
+ }
+
+ /* Update higher levels */
+ pr_lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
+ cr_lvl= pr_lvl->next;
+ while(cr_lvl) {
+ multires_calc_temp_data(pr_lvl);
+
+ /* Swap the old/new deltas */
+ swap_deltas= pr_deltas;
+ pr_deltas= cr_deltas;
+ cr_deltas= swap_deltas;
+
+ /* Calculate and add new deltas
+ ============================ */
+ for(i=0; i<pr_lvl->totface; ++i) {
+ const MultiresFace *f= &pr_lvl->faces[i];
+ data.corner1= &pr_deltas[f->v[0]].x;
+ data.corner2= &pr_deltas[f->v[1]].x;
+ data.corner3= &pr_deltas[f->v[2]].x;
+ data.corner4= &pr_deltas[f->v[3]].x;
+ data.quad= f->v[3] ? 1 : 0;
+ multi_apply(&cr_deltas[f->mid].x, &data, 3, catmullclark_smooth_face);
+
+ for(j=0; j<(data.quad?4:3); ++j)
+ me->mr->verts[f->mid].flag |= me->mr->verts[f->v[j]].flag;
+ }
+
+ for(i=0; i<pr_lvl->totedge; ++i) {
+ const MultiresEdge *e= &pr_lvl->edges[i];
+ data.boundary= pr_lvl->edge_boundary_states[i];
+ edge_face_neighbor_midpoints_accum(&data,pr_lvl,cr_deltas,sizeof(vec3f),e);
+ data.endpoint1= &pr_deltas[e->v[0]].x;
+ data.endpoint2= &pr_deltas[e->v[1]].x;
+ multi_apply(&cr_deltas[e->mid].x, &data, 3, catmullclark_smooth_edge);
+
+ for(j=0; j<2; ++j)
+ me->mr->verts[e->mid].flag |= me->mr->verts[e->v[j]].flag;
+ }
+
+ for(i=0; i<pr_lvl->totvert; ++i) {
+ data.boundary= multires_vert_is_boundary(pr_lvl,i);
+ data.original= &pr_deltas[i].x;
+ data.edge_count= BLI_countlist(&pr_lvl->vert_edge_map[i]);
+ if(data.boundary)
+ boundary_edges_average(&data,pr_lvl,pr_deltas,sizeof(vec3f),i);
+ else {
+ vert_face_neighbor_midpoints_average(&data,pr_lvl,cr_deltas,sizeof(vec3f),i);
+ vert_edge_neighbor_midpoints_average(&data,pr_lvl,pr_deltas,sizeof(vec3f),i);
+ }
+ multi_apply(&cr_deltas[i].x, &data, 3, catmullclark_smooth_vert);
+ }
+
+ /* Apply deltas to vertex locations */
+ for(i=0; (cr_lvl == last_lvl) && (i < cr_lvl->totvert); ++i) {
+ VecAddf(me->mr->verts[i].co,
+ me->mr->verts[i].co,
+ &cr_deltas[i].x);
+ }
+
+ multires_free_temp_data(pr_lvl);
+
+ pr_lvl= pr_lvl->next;
+ cr_lvl= cr_lvl->next;
+ }
+ if(pr_deltas) MEM_freeN(pr_deltas);
+ if(cr_deltas) MEM_freeN(cr_deltas);
+
+}
+
+static void multires_update_faces(Mesh *me, EditMesh *em)
+{
+ MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl= NULL,
+ *last_lvl= me->mr->levels.last;
+ char *pr_flag_damaged= NULL, *cr_flag_damaged= NULL, *or_flag_damaged= NULL,
+ *pr_mat_damaged= NULL, *cr_mat_damaged= NULL, *or_mat_damaged= NULL, *swap= NULL;
+ EditFace *efa= NULL;
+ unsigned i,j,curf;
+
+ /* Find for each face whether flag/mat has changed */
+ pr_flag_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "flag_damaged 1");
+ cr_flag_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "flag_damaged 1");
+ pr_mat_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "mat_damaged 1");
+ cr_mat_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "mat_damaged 1");
+ if(em) efa= em->faces.first;
+ for(i=0; i<cr_lvl->totface; ++i) {
+ MultiresFace mftmp;
+ multires_get_face(&mftmp, efa, &me->mface[i]);
+ if(cr_lvl->faces[i].flag != mftmp.flag)
+ cr_flag_damaged[i]= 1;
+ if(cr_lvl->faces[i].mat_nr != mftmp.mat_nr)
+ cr_mat_damaged[i]= 1;
+
+ /* Update current level */
+ cr_lvl->faces[i].flag= mftmp.flag;
+ cr_lvl->faces[i].mat_nr= mftmp.mat_nr;
+
+ if(em) efa= efa->next;
+ }
+ or_flag_damaged= MEM_dupallocN(cr_flag_damaged);
+ or_mat_damaged= MEM_dupallocN(cr_mat_damaged);
+
+ /* Update lower levels */
+ cr_lvl= cr_lvl->prev;
+ while(cr_lvl) {
+ swap= pr_flag_damaged;
+ pr_flag_damaged= cr_flag_damaged;
+ cr_flag_damaged= swap;
+
+ swap= pr_mat_damaged;
+ pr_mat_damaged= cr_mat_damaged;
+ cr_mat_damaged= swap;
+
+ curf= 0;
+ for(i=0; i<cr_lvl->totface; ++i) {
+ const int sides= cr_lvl->faces[i].v[3] ? 4 : 3;
+
+ /* Check damages */
+ for(j=0; j<sides; ++j, ++curf) {
+ if(pr_flag_damaged[curf]) {
+ cr_lvl->faces[i].flag= cr_lvl->next->faces[curf].flag;
+ cr_flag_damaged[i]= 1;
+ }
+ if(pr_mat_damaged[curf]) {
+ cr_lvl->faces[i].mat_nr= cr_lvl->next->faces[curf].mat_nr;
+ cr_mat_damaged[i]= 1;
+ }
+ }
+ }
+
+ cr_lvl= cr_lvl->prev;
+ }
+
+ /* Clear to original damages */
+ if(cr_flag_damaged) MEM_freeN(cr_flag_damaged);
+ if(cr_mat_damaged) MEM_freeN(cr_mat_damaged);
+ cr_flag_damaged= or_flag_damaged;
+ cr_mat_damaged= or_mat_damaged;
+
+ /* Update higher levels */
+ pr_lvl= current_level(me->mr);
+ cr_lvl= pr_lvl->next;
+ while(cr_lvl) {
+ swap= pr_flag_damaged;
+ pr_flag_damaged= cr_flag_damaged;
+ cr_flag_damaged= swap;
+
+ swap= pr_mat_damaged;
+ pr_mat_damaged= cr_mat_damaged;
+ cr_mat_damaged= swap;
+
+ /* Update faces */
+ for(i=0, curf= 0; i<pr_lvl->totface; ++i) {
+ const int sides= cr_lvl->prev->faces[i].v[3] ? 4 : 3;
+ for(j=0; j<sides; ++j, ++curf) {
+ if(pr_flag_damaged[i]) {
+ cr_lvl->faces[curf].flag= pr_lvl->faces[i].flag;
+ cr_flag_damaged[curf]= 1;
+ }
+ if(pr_mat_damaged[i]) {
+ cr_lvl->faces[curf].mat_nr= pr_lvl->faces[i].mat_nr;
+ cr_mat_damaged[curf]= 1;
+ }
+ }
+ }
+
+ pr_lvl= pr_lvl->next;
+ cr_lvl= cr_lvl->next;
+ }
+
+ if(pr_flag_damaged) MEM_freeN(pr_flag_damaged);
+ if(cr_flag_damaged) MEM_freeN(cr_flag_damaged);
+ if(pr_mat_damaged) MEM_freeN(pr_mat_damaged);
+ if(cr_mat_damaged) MEM_freeN(cr_mat_damaged);
+}
+
+static void multires_update_colors(Mesh *me, EditMesh *em)
+{
+ MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
+ MultiresCol *pr_deltas= NULL, *cr_deltas= NULL;
+ CustomData *src= em ? &em->fdata : &me->fdata;
+ EditFace *efa= NULL;
+ unsigned i,j,curf= 0;
+
+ if(me->mr->use_col) {
+ /* Calc initial deltas */
+ cr_deltas= MEM_callocN(sizeof(MultiresCol)*lvl->totface*4,"initial color/uv deltas");
+
+ if(em) efa= em->faces.first;
+ for(i=0; i<lvl->totface; ++i) {
+ MCol *col= em ? CustomData_em_get(src, efa->data, CD_MCOL) : &me->mcol[i*4];
+ for(j=0; j<4; ++j) {
+ if(me->mr->use_col) {
+ cr_deltas[i*4+j].a= col[j].a - lvl->colfaces[i].col[j].a;
+ cr_deltas[i*4+j].r= col[j].r - lvl->colfaces[i].col[j].r;
+ cr_deltas[i*4+j].g= col[j].g - lvl->colfaces[i].col[j].g;
+ cr_deltas[i*4+j].b= col[j].b - lvl->colfaces[i].col[j].b;
+ }
+ }
+ if(em) efa= efa->next;
+ }
+
+ /* Update current level */
+ if(em) efa= em->faces.first;
+ for(i=0; i<lvl->totface; ++i) {
+ MultiresColFace *f= &lvl->colfaces[i];
+
+ if(me->mr->use_col)
+ mcol_to_multires(f, em ? CustomData_em_get(src, efa->data, CD_MCOL) : &me->mcol[i*4]);
+
+ if(em) efa= efa->next;
+ }
+
+ /* Update higher levels */
+ lvl= lvl->next;
+ while(lvl) {
+ /* Set up new deltas, but keep the ones from the previous level */
+ if(pr_deltas) MEM_freeN(pr_deltas);
+ pr_deltas= cr_deltas;
+ cr_deltas= MEM_callocN(sizeof(MultiresCol)*lvl->totface*4,"color deltas");
+
+ curf= 0;
+ for(i=0; i<lvl->prev->totface; ++i) {
+ const char sides= lvl->prev->faces[i].v[3]?4:3;
+ MultiresCol cntr;
+
+ /* Find average color of 4 (or 3 for triangle) verts */
+ multires_col_avg(&cntr,&pr_deltas[i*4],sides);
+
+ for(j=0; j<sides; ++j) {
+ multires_col_avg2(&cr_deltas[curf*4],
+ &pr_deltas[i*4+j],
+ &pr_deltas[i*4+(j==0?sides-1:j-1)]);
+ cr_deltas[curf*4+1]= pr_deltas[i*4+j];
+ multires_col_avg2(&cr_deltas[curf*4+2],
+ &pr_deltas[i*4+j],
+ &pr_deltas[i*4+(j==sides-1?0:j+1)]);
+ cr_deltas[curf*4+3]= cntr;
+ ++curf;
+ }
+ }
+
+ for(i=0; i<lvl->totface; ++i) {
+ for(j=0; j<4; ++j) {
+ lvl->colfaces[i].col[j].a+= cr_deltas[i*4+j].a;
+ lvl->colfaces[i].col[j].r+= cr_deltas[i*4+j].r;
+ lvl->colfaces[i].col[j].g+= cr_deltas[i*4+j].g;
+ lvl->colfaces[i].col[j].b+= cr_deltas[i*4+j].b;
+ }
+ }
+
+ lvl= lvl->next;
+ }
+ if(pr_deltas) MEM_freeN(pr_deltas);
+ if(cr_deltas) MEM_freeN(cr_deltas);
+
+ /* Update lower levels */
+ lvl= me->mr->levels.last;
+ lvl= lvl->prev;
+ while(lvl) {
+ MultiresColFace *nf= lvl->next->colfaces;
+ for(i=0; i<lvl->totface; ++i) {
+ MultiresFace *f= &lvl->faces[i];
+ for(j=0; j<(f->v[3]?4:3); ++j) {
+ lvl->colfaces[i].col[j]= nf->col[1];
+ ++nf;
+ }
+ }
+ lvl= lvl->prev;
+ }
+ }
+}
+
+void multires_update_levels(Mesh *me, const int render)
+{
+ EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
+
+ multires_update_first_level(me, em);
+ multires_update_vertices(me, em);
+ multires_update_faces(me, em);
+ multires_update_colors(me, em);
+}
+
+static void check_colors(Mesh *me)
+{
+ CustomData *src= G.obedit ? &G.editMesh->fdata : &me->fdata;
+ const char col= CustomData_has_layer(src, CD_MCOL);
+
+ /* Check if vertex colors have been deleted or added */
+ if(me->mr->use_col && !col)
+ me->mr->use_col= 0;
+ else if(!me->mr->use_col && col) {
+ me->mr->use_col= 1;
+ multires_load_cols(me);
+ }
+}
+
+static unsigned int find_mid_edge(ListBase *vert_edge_map,
+ MultiresLevel *lvl,
+ const unsigned int v1,
+ const unsigned int v2 )
+{
+ MultiresMapNode *n= vert_edge_map[v1].first;
+ while(n) {
+ if(lvl->edges[n->Index].v[0]==v2 ||
+ lvl->edges[n->Index].v[1]==v2)
+ return lvl->edges[n->Index].mid;
+
+ n= n->next;
+ }
+ return -1;
+}
+
+static float clamp_component(const float c)
+{
+ if(c<0) return 0;
+ else if(c>255) return 255;
+ else return c;
+}
+
+void multires_to_mcol(MultiresColFace *f, MCol mcol[4])
+{
+ unsigned char j;
+ for(j=0; j<4; ++j) {
+ mcol->a= clamp_component(f->col[j].a);
+ mcol->r= clamp_component(f->col[j].r);
+ mcol->g= clamp_component(f->col[j].g);
+ mcol->b= clamp_component(f->col[j].b);
+ ++mcol;
+ }
+}
+
+void multires_level_to_mesh(Object *ob, Mesh *me, const int render)
+{
+ MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
+ int i;
+ EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
+
+ if(em)
+ return;
+
+ CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
+ CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
+ CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
+ CustomData_free_layers(&me->fdata, CD_MTFACE, me->totface);
+ CustomData_free_layers(&me->fdata, CD_MCOL, me->totface);
+
+ me->totvert= lvl->totvert;
+ me->totface= lvl->totface;
+ me->totedge= lvl->totedge;
+
+ CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
+ CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge);
+ CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
+ mesh_update_customdata_pointers(me);
+
+ /* Vertices/Edges/Faces */
+
+ for(i=0; i<lvl->totvert; ++i) {
+ me->mvert[i]= me->mr->verts[i];
+ }
+ for(i=0; i<lvl->totedge; ++i) {
+ me->medge[i].v1= lvl->edges[i].v[0];
+ me->medge[i].v2= lvl->edges[i].v[1];
+ me->medge[i].flag &= ~ME_HIDE;
+ }
+ for(i=0; i<lvl->totface; ++i) {
+ me->mface[i].v1= lvl->faces[i].v[0];
+ me->mface[i].v2= lvl->faces[i].v[1];
+ me->mface[i].v3= lvl->faces[i].v[2];
+ me->mface[i].v4= lvl->faces[i].v[3];
+ me->mface[i].flag= lvl->faces[i].flag;
+ me->mface[i].flag &= ~ME_HIDE;
+ me->mface[i].mat_nr= lvl->faces[i].mat_nr;
+ }
+
+ /* Edge flags */
+ if(lvl==me->mr->levels.first) {
+ for(i=0; i<lvl->totedge; ++i) {
+ me->medge[i].flag= me->mr->edge_flags[i];
+ me->medge[i].crease= me->mr->edge_creases[i];
+ }
+ } else {
+ MultiresLevel *lvl1= me->mr->levels.first;
+ const int last= lvl1->totedge * pow(2, me->mr->current-1);
+ for(i=0; i<last; ++i) {
+ const int ndx= i / pow(2, me->mr->current-1);
+
+ me->medge[i].flag= me->mr->edge_flags[ndx];
+ me->medge[i].crease= me->mr->edge_creases[ndx];
+ }
+ }
+
+ multires_customdata_to_mesh(me, em, lvl, &me->mr->vdata, em ? &em->vdata : &me->vdata, CD_MDEFORMVERT);
+ multires_customdata_to_mesh(me, em, lvl, &me->mr->fdata, em ? &em->fdata : &me->fdata, CD_MTFACE);
+
+ /* Colors */
+ if(me->mr->use_col) {
+ CustomData *src= &me->fdata;
+
+ if(me->mr->use_col) me->mcol= CustomData_add_layer(src, CD_MCOL, CD_CALLOC, NULL, me->totface);
+
+ for(i=0; i<lvl->totface; ++i) {
+ if(me->mr->use_col)
+ multires_to_mcol(&lvl->colfaces[i], &me->mcol[i*4]);
+ }
+
+ }
+
+ mesh_update_customdata_pointers(me);
+
+ multires_edge_level_update(ob,me);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+}
+
+void multires_add_level(Object *ob, Mesh *me, const char subdiv_type)
+{
+ int i,j, curf, cure;
+ MultiresLevel *lvl= NULL;
+ MultiApplyData data;
+ MVert *oldverts= NULL;
+
+ lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel");
+ if(me->pv) mesh_pmv_off(ob, me);
+
+ check_colors(me);
+ multires_update_levels(me, 0);
+
+ ++me->mr->level_count;
+ BLI_addtail(&me->mr->levels,lvl);
+
+ /* Create vertices
+ =============== */
+ lvl->totvert= lvl->prev->totvert + lvl->prev->totedge + lvl->prev->totface;
+ oldverts= me->mr->verts;
+ me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert, "multitres verts");
+ /* Copy old verts */
+ for(i=0; i<lvl->prev->totvert; ++i)
+ me->mr->verts[i]= oldverts[i];
+ /* Create new edge verts */
+ for(i=0; i<lvl->prev->totedge; ++i) {
+ VecMidf(me->mr->verts[lvl->prev->totvert + i].co,
+ oldverts[lvl->prev->edges[i].v[0]].co,
+ oldverts[lvl->prev->edges[i].v[1]].co);
+ lvl->prev->edges[i].mid= lvl->prev->totvert + i;
+ }
+ /* Create new face verts */
+ for(i=0; i<lvl->prev->totface; ++i) {
+ lvl->prev->faces[i].mid= lvl->prev->totvert + lvl->prev->totedge + i;
+ }
+
+ multires_calc_temp_data(lvl->prev);
+
+ /* Create faces
+ ============ */
+ /* Allocate all the new faces (each triangle creates three, and
+ each quad creates four */
+ lvl->totface= 0;
+ for(i=0; i<lvl->prev->totface; ++i)
+ lvl->totface+= lvl->prev->faces[i].v[3] ? 4 : 3;
+ lvl->faces= MEM_callocN(sizeof(MultiresFace)*lvl->totface,"multires faces");
+
+ curf= 0;
+ for(i=0; i<lvl->prev->totface; ++i) {
+ const int max= lvl->prev->faces[i].v[3] ? 3 : 2;
+
+ for(j=0; j<max+1; ++j) {
+ lvl->faces[curf].v[0]= find_mid_edge(lvl->prev->vert_edge_map,lvl->prev,
+ lvl->prev->faces[i].v[j],
+ lvl->prev->faces[i].v[j==0?max:j-1]);
+ lvl->faces[curf].v[1]= lvl->prev->faces[i].v[j];
+ lvl->faces[curf].v[2]= find_mid_edge(lvl->prev->vert_edge_map,lvl->prev,
+ lvl->prev->faces[i].v[j],
+ lvl->prev->faces[i].v[j==max?0:j+1]);
+ lvl->faces[curf].v[3]= lvl->prev->totvert + lvl->prev->totedge + i;
+ lvl->faces[curf].flag= lvl->prev->faces[i].flag;
+ lvl->faces[curf].mat_nr= lvl->prev->faces[i].mat_nr;
+
+ ++curf;
+ }
+ }
+
+ /* Create edges
+ ============ */
+ /* Figure out how many edges to allocate */
+ lvl->totedge= lvl->prev->totedge*2;
+ for(i=0; i<lvl->prev->totface; ++i)
+ lvl->totedge+= lvl->prev->faces[i].v[3]?4:3;
+ lvl->edges= MEM_callocN(sizeof(MultiresEdge)*lvl->totedge,"multires edges");
+
+ for(i=0; i<lvl->prev->totedge; ++i) {
+ lvl->edges[i*2].v[0]= lvl->prev->edges[i].v[0];
+ lvl->edges[i*2].v[1]= lvl->prev->edges[i].mid;
+ lvl->edges[i*2+1].v[0]= lvl->prev->edges[i].mid;
+ lvl->edges[i*2+1].v[1]= lvl->prev->edges[i].v[1];
+ }
+ /* Add edges inside of old polygons */
+ curf= 0;
+ cure= lvl->prev->totedge*2;
+ for(i=0; i<lvl->prev->totface; ++i) {
+ for(j=0; j<(lvl->prev->faces[i].v[3]?4:3); ++j) {
+ lvl->edges[cure].v[0]= lvl->faces[curf].v[2];
+ lvl->edges[cure].v[1]= lvl->faces[curf].v[3];
+ ++cure;
+ ++curf;
+ }
+ }
+
+ /* Smooth vertices
+ =============== */
+ for(i=0; i<lvl->prev->totface; ++i) {
+ const MultiresFace *f= &lvl->prev->faces[i];
+ data.corner1= oldverts[f->v[0]].co;
+ data.corner2= oldverts[f->v[1]].co;
+ data.corner3= oldverts[f->v[2]].co;
+ data.corner4= oldverts[f->v[3]].co;
+ data.quad= f->v[3] ? 1 : 0;
+ multi_apply(me->mr->verts[f->mid].co, &data, 3, catmullclark_smooth_face);
+ }
+
+ if(subdiv_type == 0) {
+ for(i=0; i<lvl->prev->totedge; ++i) {
+ const MultiresEdge *e= &lvl->prev->edges[i];
+ data.boundary= lvl->prev->edge_boundary_states[i];
+ edge_face_neighbor_midpoints_accum(&data,lvl->prev, me->mr->verts, sizeof(MVert),e);
+ data.endpoint1= oldverts[e->v[0]].co;
+ data.endpoint2= oldverts[e->v[1]].co;
+ multi_apply(me->mr->verts[e->mid].co, &data, 3, catmullclark_smooth_edge);
+ }
+
+ for(i=0; i<lvl->prev->totvert; ++i) {
+ data.boundary= multires_vert_is_boundary(lvl->prev,i);
+ data.original= oldverts[i].co;
+ data.edge_count= BLI_countlist(&lvl->prev->vert_edge_map[i]);
+ if(data.boundary)
+ boundary_edges_average(&data,lvl->prev, oldverts, sizeof(MVert),i);
+ else {
+ vert_face_neighbor_midpoints_average(&data,lvl->prev, me->mr->verts,
+ sizeof(MVert),i);
+ vert_edge_neighbor_midpoints_average(&data,lvl->prev, oldverts,
+ sizeof(MVert),i);
+ }
+ multi_apply(me->mr->verts[i].co, &data, 3, catmullclark_smooth_vert);
+ }
+ }
+
+ multires_free_temp_data(lvl->prev);
+ MEM_freeN(oldverts);
+
+ /* Vertex Colors
+ ============= */
+ curf= 0;
+ if(me->mr->use_col) {
+ MultiresColFace *cf= MEM_callocN(sizeof(MultiresColFace)*lvl->totface,"Multirescolfaces");
+ lvl->colfaces= cf;
+ for(i=0; i<lvl->prev->totface; ++i) {
+ const char sides= lvl->prev->faces[i].v[3]?4:3;
+ MultiresCol cntr;
+
+ /* Find average color of 4 (or 3 for triangle) verts */
+ multires_col_avg(&cntr,lvl->prev->colfaces[i].col,sides);
+
+ for(j=0; j<sides; ++j) {
+ multires_col_avg2(&cf->col[0],
+ &lvl->prev->colfaces[i].col[j],
+ &lvl->prev->colfaces[i].col[j==0?sides-1:j-1]);
+ cf->col[1]= lvl->prev->colfaces[i].col[j];
+ multires_col_avg2(&cf->col[2],
+ &lvl->prev->colfaces[i].col[j],
+ &lvl->prev->colfaces[i].col[j==sides-1?0:j+1]);
+ cf->col[3]= cntr;
+
+ ++cf;
+ }
+ }
+ }
+
+ me->mr->newlvl= me->mr->level_count;
+ me->mr->current= me->mr->newlvl;
+ /* Unless the render level has been set to something other than the
+ highest level (by the user), increment the render level to match
+ the highest available level */
+ if(me->mr->renderlvl == me->mr->level_count - 1) me->mr->renderlvl= me->mr->level_count;
+
+ multires_level_to_mesh(ob, me, 0);
+}
+
+void multires_set_level(Object *ob, Mesh *me, const int render)
+{
+ if(me->pv) mesh_pmv_off(ob, me);
+
+ check_colors(me);
+ multires_update_levels(me, render);
+
+ me->mr->current= me->mr->newlvl;
+ if(me->mr->current<1) me->mr->current= 1;
+ else if(me->mr->current>me->mr->level_count) me->mr->current= me->mr->level_count;
+
+ multires_level_to_mesh(ob, me, render);
+}
+
+/* Update the edge visibility flags to only show edges on or below the edgelvl */
+void multires_edge_level_update(Object *ob, Mesh *me)
+{
+ if(!G.obedit) {
+ MultiresLevel *cr_lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
+ MultiresLevel *edge_lvl= BLI_findlink(&me->mr->levels,me->mr->edgelvl-1);
+ const int threshold= edge_lvl->totedge * pow(2, me->mr->current - me->mr->edgelvl);
+ unsigned i;
+
+ for(i=0; i<cr_lvl->totedge; ++i) {
+ const int ndx= me->pv ? me->pv->edge_map[i] : i;
+ if(ndx != -1) { /* -1= hidden edge */
+ 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;
+ }
+ }
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+}
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 1ee0a9c52e3..43a6f2091de 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -483,6 +483,20 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
BLI_addtail(&ngroup->nodes, node);
node->locx-= 0.5f*(min[0]+max[0]);
node->locy-= 0.5f*(min[1]+max[1]);
+
+ /* set selin and selout of the nodetree */
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) {
+ ngroup->selin= sock;
+ break;
+ }
+ }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) {
+ ngroup->selout= sock;
+ break;
+ }
+ }
}
}
@@ -653,7 +667,8 @@ void nodeGroupSocketUseFlags(bNodeTree *ngroup)
}
}
-static void find_node_with_socket(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockindex)
+/* finds a node based on given socket */
+int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockindex)
{
bNode *node;
bNodeSocket *tsock;
@@ -671,13 +686,15 @@ static void find_node_with_socket(bNodeTree *ntree, bNodeSocket *sock, bNode **n
if(tsock)
break;
}
+
if(node) {
*nodep= node;
- *sockindex= index;
- }
- else {
- *nodep= NULL;
+ if(sockindex) *sockindex= index;
+ return 1;
}
+
+ *nodep= NULL;
+ return 0;
}
/* returns 1 if its OK */
@@ -717,7 +734,7 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
for(link= ntree->links.first; link; link= link->next) {
if(link->tonode==gnode) {
/* link->tosock->tosock is on the node we look for */
- find_node_with_socket(ngroup, link->tosock->tosock, &nextn, &index);
+ nodeFindNode(ngroup, link->tosock->tosock, &nextn, &index);
if(nextn==NULL) printf("wrong stuff!\n");
else if(nextn->new_node==NULL) printf("wrong stuff too!\n");
else {
@@ -727,7 +744,7 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
}
else if(link->fromnode==gnode) {
/* link->fromsock->tosock is on the node we look for */
- find_node_with_socket(ngroup, link->fromsock->tosock, &nextn, &index);
+ nodeFindNode(ngroup, link->fromsock->tosock, &nextn, &index);
if(nextn==NULL) printf("1 wrong stuff!\n");
else if(nextn->new_node==NULL) printf("1 wrong stuff too!\n");
else {
@@ -898,6 +915,28 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
nnode->flag |= NODE_SELECT;
}
node->flag &= ~NODE_ACTIVE;
+
+ /* deselect original sockets */
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) sock->flag&= ~SOCK_SEL;
+ }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) sock->flag&= ~SOCK_SEL;
+ }
+
+ /* set tree selin and selout to new sockets */
+ for(sock= nnode->inputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) {
+ ntree->selin= sock;
+ break;
+ }
+ }
+ for(sock= nnode->outputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) {
+ ntree->selout= sock;
+ break;
+ }
+ }
}
if(node==last) break;
}
@@ -941,7 +980,7 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
/* ************** Free stuff ********** */
/* goes over entire tree */
-static void node_unlink_node(bNodeTree *ntree, bNode *node)
+void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
{
bNodeLink *link, *next;
bNodeSocket *sock;
@@ -985,7 +1024,7 @@ static void composit_free_node_cache(bNode *node)
void nodeFreeNode(bNodeTree *ntree, bNode *node)
{
- node_unlink_node(ntree, node);
+ nodeUnlinkNode(ntree, node);
BLI_remlink(&ntree->nodes, node);
/* since it is called while free database, node->id is undefined */
@@ -2172,6 +2211,8 @@ static void force_hidden_passes(bNode *node, int passflag)
if(!(passflag & SCE_PASS_RADIO)) sock->flag |= SOCK_UNAVAIL;
sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB);
if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_MIST);
+ if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL;
}
@@ -2335,6 +2376,8 @@ static void registerCompositNodes(ListBase *ntypelist)
nodeRegisterType(ntypelist, &cmp_node_filter);
nodeRegisterType(ntypelist, &cmp_node_blur);
+ nodeRegisterType(ntypelist, &cmp_node_dblur);
+ nodeRegisterType(ntypelist, &cmp_node_bilateralblur);
nodeRegisterType(ntypelist, &cmp_node_vecblur);
nodeRegisterType(ntypelist, &cmp_node_dilateerode);
nodeRegisterType(ntypelist, &cmp_node_defocus);
@@ -2363,8 +2406,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)
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 20d61456f05..94190f9753b 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"
@@ -101,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"
@@ -164,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 */
@@ -214,13 +225,12 @@ void free_object(Object *ob)
ob->path= 0;
if(ob->ipo) ob->ipo->id.us--;
if(ob->action) ob->action->id.us--;
+ if(ob->poselib) ob->poselib->id.us--;
if(ob->dup_group) ob->dup_group->id.us--;
if(ob->defbase.first)
BLI_freelistN(&ob->defbase);
- if(ob->pose) {
- free_pose_channels(ob->pose);
- MEM_freeN(ob->pose);
- }
+ if(ob->pose)
+ free_pose(ob->pose);
free_effects(&ob->effect);
free_properties(&ob->prop);
object_free_modifiers(ob);
@@ -235,7 +245,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);
}
@@ -264,7 +278,6 @@ void unlink_object(Object *ob)
bConstraint *con;
bActionStrip *strip;
int a;
- char *str;
unlink_controllers(&ob->controllers);
unlink_actuators(&ob->actuators);
@@ -313,9 +326,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)
@@ -326,9 +353,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);
}
}
@@ -353,6 +394,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;
}
@@ -830,6 +912,7 @@ Object *add_only_object(int type, char *name)
ob->ipowin= ID_OB; /* the ipowin shown */
ob->dupon= 1; ob->dupoff= 0;
ob->dupsta= 1; ob->dupend= 100;
+ ob->dupfacesca = 1.0;
/* Game engine defaults*/
ob->mass= ob->inertia= 1.0f;
@@ -889,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)
@@ -917,19 +1002,71 @@ SoftBody *copy_softbody(SoftBody *sb)
return sbn;
}
+ParticleSystem *copy_particlesystem(ParticleSystem *psys)
+{
+ ParticleSystem *psysn;
+ ParticleData *pa;
+ int a;
+
+ psysn= MEM_dupallocN(psys);
+ psysn->particles= MEM_dupallocN(psys->particles);
+ psysn->child= MEM_dupallocN(psys->child);
+
+ for(a=0, pa=psysn->particles; a<psysn->totpart; a++, pa++) {
+ if(pa->hair)
+ pa->hair= MEM_dupallocN(pa->hair);
+ if(pa->keys)
+ pa->keys= MEM_dupallocN(pa->keys);
+ }
+
+ if(psys->soft)
+ psysn->soft= copy_softbody(psys->soft);
+
+ psysn->pathcache= NULL;
+ psysn->childcache= NULL;
+ psysn->edit= NULL;
+ 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;
- copy_pose(&obn->pose, ob->pose, 1);
+ copy_pose(&obn->pose, ob->pose, 1); /* 1 = copy constraints */
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(con->ipo) {
+ IpoCurve *icu;
+ for(icu= con->ipo->curve.first; icu; icu= icu->next) {
+ if(icu->driver && icu->driver->ob==ob)
+ icu->driver->ob= obn;
+ }
+ }
+
+ 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);
+ }
}
}
}
@@ -938,6 +1075,7 @@ Object *copy_object(Object *ob)
{
Object *obn;
ModifierData *md;
+ ParticleSystem *psys;
int a;
obn= copy_libblock(ob);
@@ -988,7 +1126,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 */
@@ -999,6 +1141,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;
@@ -1098,6 +1257,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 */
@@ -1121,6 +1294,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);
@@ -1134,6 +1309,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
/* skip constraints, constraintchannels, nla? */
+
ob->type= target->type;
ob->data= target->data;
id_us_plus((ID *)ob->data); /* ensures lib data becomes LIB_EXTERN */
@@ -1143,6 +1319,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);
}
}
@@ -1187,7 +1365,7 @@ float bsystem_time(Object *ob, float cfra, float ofs)
/* ofset frames */
if ((ob->ipoflag & OB_OFFS_PARENT) && (ob->partype & PARSLOW)==0)
- cfra-= ob->sf;
+ cfra-= give_timeoffset(ob);
}
cfra-= ofs;
@@ -1258,7 +1436,7 @@ static void ob_parcurve(Object *ob, Object *par, float mat[][4])
{
Curve *cu;
float q[4], vec[4], dir[3], *quat, x1, ctime;
- float timeoffs= 0.0;
+ float timeoffs = 0.0, sf_orig = 0.0;
Mat4One(mat);
@@ -1269,7 +1447,8 @@ static void ob_parcurve(Object *ob, Object *par, float mat[][4])
/* exception, timeoffset is regarded as distance offset */
if(cu->flag & CU_OFFS_PATHDIST) {
- SWAP(float, timeoffs, ob->sf);
+ timeoffs = give_timeoffset(ob);
+ SWAP(float, sf_orig, ob->sf);
}
/* catch exceptions: feature for nla stride editing */
@@ -1286,7 +1465,7 @@ static void ob_parcurve(Object *ob, Object *par, float mat[][4])
}
}
else {
- ctime= G.scene->r.cfra - ob->sf;
+ ctime= G.scene->r.cfra - give_timeoffset(ob);
ctime /= cu->pathlen;
CLAMP(ctime, 0.0, 1.0);
@@ -1297,7 +1476,7 @@ static void ob_parcurve(Object *ob, Object *par, float mat[][4])
ctime += timeoffs/cu->path->totdist;
/* restore */
- SWAP(float, timeoffs, ob->sf);
+ SWAP(float, sf_orig, ob->sf);
}
@@ -1555,7 +1734,7 @@ void where_is_object_time(Object *ob, float ctime)
if(ob->parent) {
Object *par= ob->parent;
- if(ob->ipoflag & OB_OFFS_PARENT) ctime-= ob->sf;
+ if(ob->ipoflag & OB_OFFS_PARENT) ctime-= give_timeoffset(ob);
/* hurms, code below conflicts with depgraph... (ton) */
/* and even worse, it gives bad effects for NLA stride too (try ctime != par->ctime, with MBlur) */
@@ -1579,7 +1758,7 @@ void where_is_object_time(Object *ob, float ctime)
if(ob->partype & PARSLOW) {
// include framerate
- fac1= (1.0f/(1.0f+ fabs(ob->sf)));
+ fac1= (1.0f/(1.0f+ fabs(give_timeoffset(ob))));
if(fac1>=1.0) return;
fac2= 1.0f-fac1;
@@ -1606,7 +1785,7 @@ void where_is_object_time(Object *ob, float ctime)
if (ob->constraints.first) {
bConstraintOb *cob;
- cob= constraints_make_evalob(ob, NULL, TARGET_OBJECT);
+ 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);
@@ -1762,7 +1941,7 @@ for a lamp that is the child of another object */
if(ob->partype & PARSLOW) {
- fac1= (float)(1.0/(1.0+ fabs(ob->sf)));
+ fac1= (float)(1.0/(1.0+ fabs(give_timeoffset(ob))));
fac2= 1.0f-fac1;
fp1= ob->obmat[0];
fp2= slowmat[0];
@@ -1783,7 +1962,7 @@ for a lamp that is the child of another object */
if (ob->constraints.first) {
bConstraintOb *cob;
- cob= constraints_make_evalob(ob, NULL, TARGET_OBJECT);
+ cob= constraints_make_evalob(ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
solve_constraints (&ob->constraints, cob, G.scene->r.cfra);
constraints_clear_evalob(cob);
}
@@ -1795,7 +1974,6 @@ for a lamp that is the child of another object */
/* 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);
@@ -1814,7 +1992,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);
}
@@ -1824,7 +2002,7 @@ BoundBox *unit_boundbox()
BoundBox *bb;
float min[3] = {-1,-1,-1}, max[3] = {-1,-1,-1};
- bb= MEM_mallocN(sizeof(BoundBox), "bb");
+ bb= MEM_callocN(sizeof(BoundBox), "bb");
boundbox_set_from_min_max(bb, min, max);
return bb;
@@ -1847,7 +2025,7 @@ BoundBox *object_get_boundbox(Object *ob)
BoundBox *bb= NULL;
if(ob->type==OB_MESH) {
- bb = mesh_get_bb(ob->data);
+ bb = mesh_get_bb(ob);
}
else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
bb= ( (Curve *)ob->data )->bb;
@@ -1909,7 +2087,7 @@ void minmax_object(Object *ob, float *min, float *max)
me= get_mesh(ob);
if(me) {
- bb = *mesh_get_bb(me);
+ bb = *mesh_get_bb(ob);
for(a=0; a<8; a++) {
Mat4MulVecfl(ob->obmat, bb.vec[a]);
@@ -2017,8 +2195,40 @@ void object_handle_update(Object *ob)
where_is_pose(ob);
}
}
+
+ if(ob->particlesystem.first) {
+ ParticleSystem *tpsys, *psys;
+ DerivedMesh *dm;
+
+ psys= ob->particlesystem.first;
+ while(psys) {
+ if(psys_check_enabled(ob, psys)) {
+ 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;
+ }
+
+ if(G.rendering && ob->transflag & OB_DUPLIPARTS) {
+ /* this is to make sure we get render level duplis in groups:
+ * the derivedmesh must be created before init_render_mesh,
+ * since object_duplilist does dupliparticles before that */
+ dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+ dm->release(dm);
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated;
+ }
+ }
}
-
+
/* 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 */
@@ -2036,3 +2246,11 @@ void object_handle_update(Object *ob)
// printf("set proxy pointer for later group stuff %s\n", ob->id.name);
}
}
+
+float give_timeoffset(Object *ob) {
+ if ((ob->ipoflag & OB_OFFS_PARENTADD) && ob->parent) {
+ return ob->sf + give_timeoffset(ob->parent);
+ } else {
+ return ob->sf;
+ }
+}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
new file mode 100644
index 00000000000..cbf7f385dbb
--- /dev/null
+++ b/source/blender/blenkernel/intern/particle.c
@@ -0,0 +1,3733 @@
+/* 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 "BLI_threads.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 "BKE_mesh.h"
+#include "BKE_cdderivedmesh.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);
+}
+int psys_check_enabled(Object *ob, ParticleSystem *psys)
+{
+ ParticleSystemModifierData *psmd;
+
+ if(!(psys->flag & PSYS_ENABLED))
+ return 0;
+
+ psmd= psys_get_modifier(ob, psys);
+ if(psys->renderdata) {
+ if(!(psmd->modifier.mode & eModifierMode_Render))
+ return 0;
+ }
+ else if(!(psmd->modifier.mode & eModifierMode_Realtime))
+ return 0;
+
+ return 1;
+}
+
+/************************************************/
+/* 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);
+}
+void psys_free_children(ParticleSystem *psys)
+{
+ if(psys->child) {
+ MEM_freeN(psys->child);
+ psys->child=0;
+ psys->totchild=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);
+ }
+}
+
+/* these functions move away particle data and bring it back after
+ * rendering, to make different render settings possible without
+ * removing the previous data. this should be solved properly once */
+
+typedef struct ParticleRenderElem {
+ int curchild, totchild, reduce;
+ float lambda, t, scalemin, scalemax;
+} ParticleRenderElem;
+
+typedef struct ParticleRenderData {
+ ChildParticle *child;
+ ParticleCacheKey **pathcache;
+ ParticleCacheKey **childcache;
+ int totchild, totcached, totchildcache;
+ DerivedMesh *dm;
+ int totdmvert, totdmedge, totdmface;
+
+ float mat[4][4];
+ float viewmat[4][4], winmat[4][4];
+ int winx, winy;
+
+ int dosimplify;
+ int timeoffset;
+ ParticleRenderElem *elems;
+ int *origindex;
+} ParticleRenderData;
+
+static float psys_render_viewport_falloff(double rate, float dist, float width)
+{
+ return pow(rate, dist/width);
+}
+
+static float psys_render_projected_area(ParticleSystem *psys, float *center, float area, double vprate, float *viewport)
+{
+ ParticleRenderData *data= psys->renderdata;
+ float co[4], view[3], ortho1[3], ortho2[3], w, dx, dy, radius;
+
+ /* transform to view space */
+ VECCOPY(co, center);
+ co[3]= 1.0f;
+ Mat4MulVec4fl(data->viewmat, co);
+
+ /* compute two vectors orthogonal to view vector */
+ VECCOPY(view, co);
+ Normalize(view);
+ VecOrthoBasisf(view, ortho1, ortho2);
+
+ /* compute on screen minification */
+ w= co[2]*data->winmat[2][3] + data->winmat[3][3];
+ dx= data->winx*ortho2[0]*data->winmat[0][0];
+ dy= data->winy*ortho2[1]*data->winmat[1][1];
+ w= sqrt(dx*dx + dy*dy)/w;
+
+ /* w squared because we are working with area */
+ area= area*w*w;
+
+ /* viewport of the screen test */
+
+ /* project point on screen */
+ Mat4MulVec4fl(data->winmat, co);
+ if(co[3] != 0.0f) {
+ co[0]= 0.5f*data->winx*(1.0f + co[0]/co[3]);
+ co[1]= 0.5f*data->winy*(1.0f + co[1]/co[3]);
+ }
+
+ /* screen space radius */
+ radius= sqrt(area/M_PI);
+
+ /* make smaller using fallof once over screen edge */
+ *viewport= 1.0f;
+
+ if(co[0]+radius < 0.0f)
+ *viewport *= psys_render_viewport_falloff(vprate, -(co[0]+radius), data->winx);
+ else if(co[0]-radius > data->winx)
+ *viewport *= psys_render_viewport_falloff(vprate, (co[0]-radius) - data->winx, data->winx);
+
+ if(co[1]+radius < 0.0f)
+ *viewport *= psys_render_viewport_falloff(vprate, -(co[1]+radius), data->winy);
+ else if(co[1]-radius > data->winy)
+ *viewport *= psys_render_viewport_falloff(vprate, (co[1]-radius) - data->winy, data->winy);
+
+ return area;
+}
+
+void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[][4], float winmat[][4], int winx, int winy, int timeoffset)
+{
+ ParticleRenderData*data;
+ ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
+
+ if(!G.rendering)
+ return;
+ if(psys->renderdata)
+ return;
+
+ data= MEM_callocN(sizeof(ParticleRenderData), "ParticleRenderData");
+
+ data->child= psys->child;
+ data->totchild= psys->totchild;
+ data->pathcache= psys->pathcache;
+ data->totcached= psys->totcached;
+ data->childcache= psys->childcache;
+ data->totchildcache= psys->totchildcache;
+
+ if(psmd->dm)
+ data->dm= CDDM_copy(psmd->dm);
+ data->totdmvert= psmd->totdmvert;
+ data->totdmedge= psmd->totdmedge;
+ data->totdmface= psmd->totdmface;
+
+ psys->child= NULL;
+ psys->pathcache= NULL;
+ psys->childcache= NULL;
+ psys->totchild= psys->totcached= psys->totchildcache= 0;
+
+ Mat4CpyMat4(data->winmat, winmat);
+ Mat4MulMat4(data->viewmat, ob->obmat, viewmat);
+ Mat4MulMat4(data->mat, data->viewmat, winmat);
+ data->winx= winx;
+ data->winy= winy;
+
+ data->timeoffset= timeoffset;
+
+ psys->renderdata= data;
+}
+
+void psys_render_restore(Object *ob, ParticleSystem *psys)
+{
+ ParticleRenderData*data;
+ ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
+
+ data= psys->renderdata;
+ if(!data)
+ return;
+
+ if(data->elems)
+ MEM_freeN(data->elems);
+
+ if(psmd->dm) {
+ psmd->dm->needsFree= 1;
+ psmd->dm->release(psmd->dm);
+ }
+
+ psys_free_path_cache(psys);
+
+ if(psys->child){
+ MEM_freeN(psys->child);
+ psys->child= 0;
+ psys->totchild= 0;
+ }
+
+ psys->child= data->child;
+ psys->totchild= data->totchild;
+ psys->pathcache= data->pathcache;
+ psys->totcached= data->totcached;
+ psys->childcache= data->childcache;
+ psys->totchildcache= data->totchildcache;
+
+ psmd->dm= data->dm;
+ psmd->totdmvert= data->totdmvert;
+ psmd->totdmedge= data->totdmedge;
+ psmd->totdmface= data->totdmface;
+ psmd->flag &= ~eParticleSystemFlag_psys_updated;
+
+ if(psys->part->from==PART_FROM_FACE && psmd->dm)
+ psys_calc_dmfaces(ob, psmd->dm, psys);
+
+ MEM_freeN(data);
+ psys->renderdata= NULL;
+}
+
+int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
+{
+ DerivedMesh *dm= ctx->dm;
+ Mesh *me= (Mesh*)(ctx->ob->data);
+ MFace *mf, *mface;
+ MVert *mvert;
+ ParticleRenderData *data;
+ ParticleRenderElem *elems, *elem;
+ ParticleSettings *part= ctx->psys->part;
+ float *facearea, (*facecenter)[3], size[3], fac, powrate, scaleclamp;
+ float co1[3], co2[3], co3[3], co4[3], lambda, arearatio, t, area, viewport;
+ double vprate;
+ int *origindex, *facetotvert;
+ int a, b, totorigface, totface, newtot, skipped;
+
+ if(part->draw_as!=PART_DRAW_PATH || !(part->draw & PART_DRAW_REN_STRAND))
+ return tot;
+ if(!ctx->psys->renderdata)
+ return tot;
+
+ data= ctx->psys->renderdata;
+ if(data->timeoffset)
+ return 0;
+ if(!(part->simplify_flag & PART_SIMPLIFY_ENABLE))
+ return tot;
+
+ mvert= dm->getVertArray(dm);
+ mface= dm->getFaceArray(dm);
+ origindex= dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ totface= dm->getNumFaces(dm);
+ totorigface= me->totface;
+
+ if(totface == 0 || totorigface == 0 || origindex == NULL)
+ return tot;
+
+ facearea= MEM_callocN(sizeof(float)*totorigface, "SimplifyFaceArea");
+ facecenter= MEM_callocN(sizeof(float[3])*totorigface, "SimplifyFaceCenter");
+ facetotvert= MEM_callocN(sizeof(int)*totorigface, "SimplifyFaceArea");
+ elems= MEM_callocN(sizeof(ParticleRenderElem)*totorigface, "SimplifyFaceElem");
+
+ if(data->elems)
+ MEM_freeN(data->elems);
+
+ data->dosimplify= 1;
+ data->elems= elems;
+ data->origindex= origindex;
+
+ /* compute number of children per original face */
+ for(a=0; a<tot; a++) {
+ b= origindex[ctx->index[a]];
+ if(b != -1)
+ elems[b].totchild++;
+ }
+
+ /* compute areas and centers of original faces */
+ for(mf=mface, a=0; a<totface; a++, mf++) {
+ b= origindex[a];
+
+ if(b != -1) {
+ VECCOPY(co1, mvert[mf->v1].co);
+ VECCOPY(co2, mvert[mf->v2].co);
+ VECCOPY(co3, mvert[mf->v3].co);
+
+ VECADD(facecenter[b], facecenter[b], co1);
+ VECADD(facecenter[b], facecenter[b], co2);
+ VECADD(facecenter[b], facecenter[b], co3);
+
+ if(mf->v4) {
+ VECCOPY(co4, mvert[mf->v4].co);
+ VECADD(facecenter[b], facecenter[b], co4);
+ facearea[b] += AreaQ3Dfl(co1, co2, co3, co4);
+ facetotvert[b] += 4;
+ }
+ else {
+ facearea[b] += AreaT3Dfl(co1, co2, co3);
+ facetotvert[b] += 3;
+ }
+ }
+ }
+
+ for(a=0; a<totorigface; a++)
+ if(facetotvert[a] > 0)
+ VecMulf(facecenter[a], 1.0f/facetotvert[a]);
+
+ /* for conversion from BU area / pixel area to reference screen size */
+ mesh_get_texspace(me, 0, 0, size);
+ fac= ((size[0] + size[1] + size[2])/3.0f)/part->simplify_refsize;
+ fac= fac*fac;
+
+ powrate= log(0.5f)/log(part->simplify_rate*0.5f);
+ if(part->simplify_flag & PART_SIMPLIFY_VIEWPORT)
+ vprate= pow(1.0 - part->simplify_viewport, 5.0);
+ else
+ vprate= 1.0;
+
+ /* set simplification parameters per original face */
+ for(a=0, elem=elems; a<totorigface; a++, elem++) {
+ area = psys_render_projected_area(ctx->psys, facecenter[a], facearea[a], vprate, &viewport);
+ arearatio= fac*area/facearea[a];
+
+ if((arearatio < 1.0f || viewport < 1.0f) && elem->totchild) {
+ /* lambda is percentage of elements to keep */
+ lambda= (arearatio < 1.0f)? pow(arearatio, powrate): 1.0f;
+ lambda *= viewport;
+
+ lambda= MAX2(lambda, 1.0f/elem->totchild);
+
+ /* compute transition region */
+ t= part->simplify_transition;
+ elem->t= (lambda-t < 0.0f)? lambda: (lambda+t > 1.0f)? 1.0f-lambda: t;
+ elem->reduce= 1;
+
+ /* scale at end and beginning of the transition region */
+ elem->scalemax= (lambda+t < 1.0f)? 1.0f/lambda: 1.0f/(1.0f - elem->t*elem->t/t);
+ elem->scalemin= (lambda+t < 1.0f)? 0.0f: elem->scalemax*(1.0f-elem->t/t);
+
+ elem->scalemin= sqrt(elem->scalemin);
+ elem->scalemax= sqrt(elem->scalemax);
+
+ /* clamp scaling */
+ scaleclamp= MIN2(elem->totchild, 10.0f);
+ elem->scalemin= MIN2(scaleclamp, elem->scalemin);
+ elem->scalemax= MIN2(scaleclamp, elem->scalemax);
+
+ /* extend lambda to include transition */
+ lambda= lambda + elem->t;
+ if(lambda > 1.0f)
+ lambda= 1.0f;
+ }
+ else {
+ lambda= arearatio;
+
+ elem->scalemax= 1.0f; //sqrt(lambda);
+ elem->scalemin= 1.0f; //sqrt(lambda);
+ elem->reduce= 0;
+ }
+
+ elem->lambda= lambda;
+ elem->scalemin= sqrt(elem->scalemin);
+ elem->scalemax= sqrt(elem->scalemax);
+ elem->curchild= 0;
+ }
+
+ MEM_freeN(facearea);
+ MEM_freeN(facecenter);
+ MEM_freeN(facetotvert);
+
+ /* move indices and set random number skipping */
+ ctx->skip= MEM_callocN(sizeof(int)*tot, "SimplificationSkip");
+
+ skipped= 0;
+ for(a=0, newtot=0; a<tot; a++) {
+ b= origindex[ctx->index[a]];
+ if(b != -1) {
+ if(elems[b].curchild++ < ceil(elems[b].lambda*elems[b].totchild)) {
+ ctx->index[newtot]= ctx->index[a];
+ ctx->skip[newtot]= skipped;
+ skipped= 0;
+ newtot++;
+ }
+ else skipped++;
+ }
+ else skipped++;
+ }
+
+ for(a=0, elem=elems; a<totorigface; a++, elem++)
+ elem->curchild= 0;
+
+ return newtot;
+}
+
+int psys_render_simplify_params(ParticleSystem *psys, ChildParticle *cpa, float *params)
+{
+ ParticleRenderData *data;
+ ParticleRenderElem *elem;
+ float x, w, scale, alpha, lambda, t, scalemin, scalemax;
+ int b;
+
+ if(!(psys->renderdata && (psys->part->simplify_flag & PART_SIMPLIFY_ENABLE)))
+ return 0;
+
+ data= psys->renderdata;
+ if(!data->dosimplify)
+ return 0;
+
+ b= data->origindex[cpa->num];
+ if(b == -1)
+ return 0;
+
+ elem= &data->elems[b];
+
+ lambda= elem->lambda;
+ t= elem->t;
+ scalemin= elem->scalemin;
+ scalemax= elem->scalemax;
+
+ if(!elem->reduce) {
+ scale= scalemin;
+ alpha= 1.0f;
+ }
+ else {
+ x= (elem->curchild+0.5f)/elem->totchild;
+ if(x < lambda-t) {
+ scale= scalemax;
+ alpha= 1.0f;
+ }
+ else if(x >= lambda+t) {
+ scale= scalemin;
+ alpha= 0.0f;
+ }
+ else {
+ w= (lambda+t - x)/(2.0f*t);
+ scale= scalemin + (scalemax - scalemin)*w;
+ alpha= w;
+ }
+ }
+
+ params[0]= scale;
+ params[1]= alpha;
+
+ elem->curchild++;
+
+ return 1;
+}
+
+/************************************************/
+/* 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, int velocity)
+{
+ 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(velocity){
+ float temp[3];
+
+ if(dt>0.999f){
+ set_four_ipo(dt-0.001f, t, type);
+ weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp);
+ VECSUB(result->vel, result->co, temp);
+ }
+ else{
+ set_four_ipo(dt+0.001f, t, type);
+ weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp);
+ VECSUB(result->vel, temp, result->co);
+ }
+ }
+ }
+}
+
+
+
+/************************************************/
+/* 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 (*orcodata)[3], float *w, float *vec, float *nor, float *utan, float *vtan, float *orco,float *ornor){
+ 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];
+ float *o1, *o2, *o3, *o4;
+
+ 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]);
+ }
+
+ if(orco) {
+ if(orcodata) {
+ o1= orcodata[mface->v1];
+ o2= orcodata[mface->v2];
+ o3= orcodata[mface->v3];
+
+ if(mface->v4) {
+ o4= orcodata[mface->v4];
+ orco[0]= w[0]*o1[0] + w[1]*o2[0] + w[2]*o3[0] + w[3]*o4[0];
+ orco[1]= w[0]*o1[1] + w[1]*o2[1] + w[2]*o3[1] + w[3]*o4[1];
+ orco[2]= w[0]*o1[2] + w[1]*o2[2] + w[2]*o3[2] + w[3]*o4[2];
+
+ if(ornor)
+ CalcNormFloat4(o1, o2, o3, o4, ornor);
+ }
+ else {
+ orco[0]= w[0]*o1[0] + w[1]*o2[0] + w[2]*o3[0];
+ orco[1]= w[0]*o1[1] + w[1]*o2[1] + w[2]*o3[1];
+ orco[2]= w[0]*o1[2] + w[1]*o2[2] + w[2]*o3[2];
+
+ if(ornor)
+ CalcNormFloat(o1, o2, o3, ornor);
+ }
+ }
+ else {
+ VECCOPY(orco, vec);
+ if(ornor)
+ VECCOPY(ornor, nor);
+ }
+ }
+}
+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, float *orco, float *ornor)
+{
+ float (*orcodata)[3];
+
+ if(index < 0){ /* 'no dm' error has happened! */
+ PARTICLE_ERROR(nor, vec);
+ return;
+ }
+ orcodata= dm->getVertDataArray(dm, CD_ORCO);
+
+ if (dm->deformedOnly || index_dmcache == DMCACHE_ISCHILD) {
+ /* this works for meshes with deform verts only - constructive modifiers wont work properly*/
+ float temp1[3];
+
+ if(from == PART_FROM_VERT) {
+ if(index >= dm->getNumVerts(dm)) {
+ PARTICLE_ERROR(nor, vec);
+ return;
+ }
+
+ dm->getVertCo(dm,index,vec);
+ if(nor){
+ dm->getVertNo(dm,index,nor);
+ Normalize(nor);
+ }
+ if(orco)
+ VECCOPY(orco, orcodata[index])
+ if(ornor) {
+ dm->getVertNo(dm,index,nor);
+ Normalize(nor);
+ }
+ }
+ else { /* PART_FROM_FACE / PART_FROM_VOLUME */
+ MFace *mface;
+ MTFace *mtface=0;
+ MVert *mvert;
+ int uv_index;
+
+ if(index >= dm->getNumFaces(dm)) {
+ PARTICLE_ERROR(nor, vec);
+ return;
+ }
+
+ mface=dm->getFaceData(dm,index,CD_MFACE);
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+ 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,orcodata,fw,vec,temp1,utan,vtan,orco,ornor);
+ if(nor)
+ VECCOPY(nor,temp1);
+ Normalize(temp1);
+ VecMulf(temp1,-foffset);
+ VECADD(vec,vec,temp1);
+ }
+ else
+ psys_interpolate_face(mvert,mface,mtface,orcodata,fw,vec,nor,utan,vtan,orco,ornor);
+ }
+ } 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,orcodata,fw_mod,vec,nor,utan,vtan,orco,ornor);
+ }
+ 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, float *orco, float *ornor)
+{
+ /* 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);
+ }
+ if(orco){
+ VECCOPY(orco,zerovec);
+ }
+ if(ornor){
+ VECCOPY(ornor,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, float *orco, float *ornor){
+ 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,orco,ornor);
+ }
+ else
+ psys_particle_on_shape(from,index,fuv,vec,nor,utan,vtan,orco,ornor);
+
+}
+/************************************************/
+/* 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, ParticleCacheKey *keys, ParticleCacheKey *state, float max_length, float *cur_length, float length, float *dvec)
+{
+ 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);
+ keys->steps = k;
+ /* something over the maximum step value */
+ return k=100000;
+ //}
+ }
+ else {
+ *cur_length+=length;
+ return k;
+ }
+}
+static void finalize_path_length(ParticleCacheKey *keys)
+{
+ ParticleCacheKey *state = keys;
+ 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], orco[3];
+ 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,orco,0);
+ BLI_kdtree_insert(tree, p, orco, 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,orco,0);
+ cpa->parent=BLI_kdtree_find_nearest(tree, orco, NULL, NULL);
+ }
+
+ BLI_kdtree_free(tree);
+}
+
+static void get_strand_normal(Material *ma, float *surfnor, float surfdist, float *nor)
+{
+ float cross[3], nstrand[3], vnor[3], blend;
+
+ if(!((ma->mode & MA_STR_SURFDIFF) || (ma->strand_surfnor > 0.0f)))
+ return;
+
+ if(ma->mode & MA_STR_SURFDIFF) {
+ Crossf(cross, surfnor, nor);
+ Crossf(nstrand, nor, cross);
+
+ blend= INPR(nstrand, surfnor);
+ CLAMP(blend, 0.0f, 1.0f);
+
+ VecLerpf(vnor, nstrand, surfnor, blend);
+ Normalize(vnor);
+ }
+ else
+ VECCOPY(vnor, nor)
+
+ if(ma->strand_surfnor > 0.0f) {
+ if(ma->strand_surfnor > surfdist) {
+ blend= (ma->strand_surfnor - surfdist)/ma->strand_surfnor;
+ VecLerpf(vnor, vnor, surfnor, blend);
+ Normalize(vnor);
+ }
+ }
+
+ VECCOPY(nor, vnor);
+}
+
+int psys_threads_init_path(ParticleThread *threads, float cfra, int editupdate)
+{
+ ParticleThreadContext *ctx= threads[0].ctx;
+ Object *ob= ctx->ob;
+ ParticleSystem *psys= ctx->psys;
+ ParticleSettings *part = psys->part;
+ ParticleEditSettings *pset = &G.scene->toolsettings->particle;
+ int totparent=0, between=0;
+ int steps = (int)pow(2.0,(double)part->draw_step);
+ int totchild = psys->totchild;
+ int i, seed, totthread= threads[0].tot;
+
+ /*---start figuring out what is actually wanted---*/
+ if(psys_in_edit_mode(psys))
+ if(psys->renderdata==0 && (psys->edit==NULL || pset->flag & PE_SHOW_CHILD)==0)
+ totchild=0;
+
+ 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(psys->renderdata)
+ steps=(int)pow(2.0,(double)part->ren_step);
+ else{
+ totchild=(int)((float)totchild*(float)part->disp/100.0f);
+ totparent=MIN2(totparent,totchild);
+ }
+
+ if(totchild==0) return 0;
+
+ /* init random number generator */
+ if(ctx->psys->part->flag & PART_ANIM_BRANCHING)
+ seed= 31415926 + ctx->psys->seed + (int)cfra;
+ else
+ seed= 31415926 + ctx->psys->seed;
+
+ if(part->flag & PART_BRANCHING || ctx->editupdate || totchild < 10000)
+ totthread= 1;
+
+ for(i=0; i<totthread; i++) {
+ threads[i].rng_path= rng_new(seed);
+ threads[i].tot= totthread;
+ }
+
+ /* fill context values */
+ ctx->between= between;
+ ctx->steps= steps;
+ ctx->totchild= totchild;
+ ctx->totparent= totparent;
+ ctx->cfra= cfra;
+
+ psys->lattice = psys_get_lattice(ob, psys);
+
+ /* cache all relevant vertex groups if they exist */
+ if(part->from!=PART_FROM_PARTICLE){
+ ctx->vg_length = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_LENGTH);
+ ctx->vg_clump = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_CLUMP);
+ ctx->vg_kink = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_KINK);
+ ctx->vg_rough1 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH1);
+ ctx->vg_rough2 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH2);
+ ctx->vg_roughe = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGHE);
+ }
+
+ /* set correct ipo timing */
+ if(part->flag&PART_ABS_TIME && part->ipo){
+ calc_ipo(part->ipo, cfra);
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ return 1;
+}
+
+/* note: this function must be thread safe, except for branching! */
+void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i)
+{
+ ParticleThreadContext *ctx= thread->ctx;
+ Object *ob= ctx->ob;
+ ParticleSystem *psys = ctx->psys;
+ ParticleSettings *part = psys->part;
+ ParticleCacheKey **cache= psys->childcache;
+ ParticleCacheKey **pcache= psys->pathcache;
+ ParticleCacheKey *state, *par = NULL, *key[4];
+ ParticleData *pa;
+ ParticleTexture ptex;
+ float *cpa_fuv=0;
+ float co[3], orco[3], ornor[3], t, rough_t, cpa_1st[3], dvec[3];
+ float branch_begin, branch_end, branch_prob, branchfac, rough_rand;
+ float pa_rough1, pa_rough2, pa_roughe;
+ float length, pa_length, pa_clump, pa_kink;
+ float max_length = 1.0f, cur_length = 0.0f;
+ int k, cpa_num, guided=0;
+ short cpa_from;
+
+ if(part->flag & PART_BRANCHING) {
+ branch_begin=rng_getFloat(thread->rng_path);
+ branch_end=branch_begin+(1.0f-branch_begin)*rng_getFloat(thread->rng_path);
+ branch_prob=rng_getFloat(thread->rng_path);
+ rough_rand=rng_getFloat(thread->rng_path);
+ }
+ else {
+ branch_begin= 0.0f;
+ branch_end= 0.0f;
+ branch_prob= 0.0f;
+ rough_rand= 0.0f;
+ }
+
+ if(i<psys->totpart){
+ branch_begin=0.0f;
+ branch_end=1.0f;
+ branch_prob=0.0f;
+ }
+
+ if(ctx->between){
+ int w, needupdate;
+ float foffset;
+
+ if(ctx->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)
+ return;
+ else
+ memset(keys, 0, sizeof(*keys)*(ctx->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,ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,ornor,0,0,orco,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,co);
+ Mat4MulVecfl(ob->obmat,cpa_1st);
+
+ pa=0;
+ }
+ else{
+ if(ctx->editupdate && !(part->flag & PART_BRANCHING)) {
+ if(!(psys->particles[cpa->parent].flag & PARS_EDIT_RECALC))
+ return;
+
+ memset(keys, 0, sizeof(*keys)*(ctx->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,ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,ornor,0,0,orco,0);
+ }
+
+ keys->steps = ctx->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*(ctx->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;
+ ptex.rough= 1.0;
+
+ get_cpa_texture(ctx->dm,ctx->ma,cpa_num,cpa_fuv,orco,&ptex,
+ MAP_PA_LENGTH|MAP_PA_CLUMP|MAP_PA_KINK|MAP_PA_ROUGH);
+
+ pa_length=ptex.length;
+ pa_clump=ptex.clump;
+ pa_kink=ptex.kink;
+ pa_rough1=ptex.rough;
+ pa_rough2=ptex.rough;
+ pa_roughe=ptex.rough;
+
+ if(ctx->vg_length)
+ pa_length*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_length);
+ if(ctx->vg_clump)
+ pa_clump*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_clump);
+ if(ctx->vg_kink)
+ pa_kink*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_kink);
+ if(ctx->vg_rough1)
+ pa_rough1*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_rough1);
+ if(ctx->vg_rough2)
+ pa_rough2*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_rough2);
+ if(ctx->vg_roughe)
+ pa_roughe*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_roughe);
+
+ /* create the child path */
+ for(k=0,state=keys; k<=ctx->steps; k++,state++){
+ t=(float)k/(float)ctx->steps;
+
+ if(ctx->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(ctx->totparent){
+ if(i>=ctx->totparent)
+ /* this is not threadsafe, but should only happen for
+ * branching particles particles, which are not threaded */
+ 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 && ctx->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 && ctx->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
+ /* this is not threadsafe, but should only happen for
+ * branching particles particles, which are not threaded */
+ 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);
+
+ if(ctx->ma && (part->draw & PART_DRAW_MAT_COL))
+ get_strand_normal(ctx->ma, ornor, cur_length, (state-1)->vel);
+ }
+
+ /* 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)ctx->steps;
+
+ k=check_path_length(k,keys,state,max_length,&cur_length,length,dvec);
+ }
+ else{
+ /* initialize length calculation */
+ if(part->flag&PART_ABS_LENGTH)
+ max_length= part->abslength*pa_length;
+ else
+ max_length= pa_length;
+
+ cur_length= 0.0f;
+ }
+
+ if(ctx->ma && (part->draw & PART_DRAW_MAT_COL)) {
+ VECCOPY(state->col, &ctx->ma->r)
+ get_strand_normal(ctx->ma, ornor, cur_length, state->vel);
+ }
+ }
+
+ /* now let's finalise the interpolated parents that we might have left half done before */
+ if(i<ctx->totparent)
+ finalize_path_length(keys);
+}
+
+void *exec_child_path_cache(void *data)
+{
+ ParticleThread *thread= (ParticleThread*)data;
+ ParticleThreadContext *ctx= thread->ctx;
+ ParticleSystem *psys= ctx->psys;
+ ParticleCacheKey **cache= psys->childcache;
+ ChildParticle *cpa;
+ int i, totchild= ctx->totchild;
+
+ cpa= psys->child + thread->num;
+ for(i=thread->num; i<totchild; i+=thread->tot, cpa+=thread->tot)
+ psys_thread_create_path(thread, cpa, cache[i], i);
+
+ return 0;
+}
+
+void psys_cache_child_paths(Object *ob, ParticleSystem *psys, float cfra, int editupdate)
+{
+ ParticleSettings *part = psys->part;
+ ParticleThread *pthreads;
+ ParticleThreadContext *ctx;
+ ParticleCacheKey **cache, *tcache;
+ ListBase threads;
+ int i, totchild, totparent, totthread;
+ unsigned long totchildstep;
+
+ pthreads= psys_threads_create(ob, psys, G.scene->r.threads);
+
+ if(!psys_threads_init_path(pthreads, cfra, editupdate)) {
+ psys_threads_free(pthreads);
+ return;
+ }
+
+ ctx= pthreads[0].ctx;
+ totchild= ctx->totchild;
+ totparent= ctx->totparent;
+
+ 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");
+ totchildstep= totchild*(ctx->steps + 1);
+ tcache = MEM_callocN(totchildstep*sizeof(ParticleCacheKey), "Child path cache");
+ for(i=0; i<totchild; i++)
+ cache[i] = tcache + i * (ctx->steps + 1);
+
+ psys->totchildcache = totchild;
+ }
+
+ totthread= pthreads[0].tot;
+
+ if(totthread > 1) {
+ BLI_init_threads(&threads, exec_child_path_cache, totthread);
+
+ for(i=0; i<totthread; i++)
+ BLI_insert_thread(&threads, &pthreads[i]);
+
+ BLI_end_threads(&threads);
+ }
+ else
+ exec_child_path_cache(&pthreads[0]);
+
+ psys_threads_free(pthreads);
+}
+
+/* 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};
+
+ Material *ma;
+
+ float birthtime = 0.0, dietime = 0.0;
+ float t, time = 0.0, keytime = 0.0, 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];
+ float length, vec[3];
+ float *vg_effector= NULL, effector=0.0f;
+
+ /* 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(psys->renderdata)
+ 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);
+ ma= give_current_material(ob, psys->part->omat);
+ if(ma && (psys->part->draw & PART_DRAW_MAT_COL))
+ VECCOPY(col, &ma->r)
+
+ if(psys->part->from!=PART_FROM_PARTICLE)
+ vg_effector = psys_cache_vgroup(psmd->dm, psys, PSYS_VG_EFFECTOR);
+
+ /*---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, 0);
+
+ /* 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);
+ }
+
+ VECCOPY(ca->co, result.co);
+ }
+
+ /*--modify paths--*/
+
+ VecSubf(vec,(cache[i]+1)->co,cache[i]->co);
+ length = VecLength(vec);
+
+ effector= 1.0f;
+ if(vg_effector)
+ effector*= psys_interpolate_value_from_verts(psmd->dm,psys->part->from,pa->num,pa->fuv,vg_effector);
+
+ for(k=0, ca=cache[i]; k<=steps; k++, ca++) {
+ /* apply effectors */
+ if(edit==0 && k) {
+ float force[3] = {0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f};
+ ParticleKey eff_key;
+
+ VECCOPY(eff_key.co,(ca-1)->co);
+ VECCOPY(eff_key.vel,(ca-1)->vel);
+ QUATCOPY(eff_key.rot,(ca-1)->rot);
+
+ do_effectors(i, pa, &eff_key, ob, psys, force, vel, dfra, cfra);
+
+ VecMulf(force, effector*pow((float)k / (float)steps, 100.0f * psys->part->eff_hair) / (float)steps);
+
+ VecAddf(force, force, vec);
+
+ Normalize(force);
+
+ if(k < steps) {
+ VecSubf(vec, (ca+1)->co, ca->co);
+ length = VecLength(vec);
+ }
+
+ VECADDFAC(ca->co, (ca-1)->co, force, length);
+ }
+
+ /* 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);
+
+ /* apply lattice */
+ if(psys->lattice && edit==0)
+ calc_latt_deform(ca->co, 1.0f);
+
+ /* figure out rotation */
+
+ if(k) {
+ float angle, tangent[3], normal[3], q[4];
+
+ if(k == 1) {
+ float *q2;
+
+ VECSUB(tangent, ca->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, ca->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);
+ }
+ }
+
+
+ /* set velocity */
+
+ 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);
+ }
+ }
+ }
+
+ psys->totcached = totpart;
+
+ if(psys && psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+
+ if(vg_effector)
+ MEM_freeN(vg_effector);
+}
+/************************************************/
+/* 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(Object *ob, DerivedMesh *dm, ParticleData *pa, float mat[][4], int orco)
+{
+ float v[3][3];
+ MFace *mface;
+ OrigSpaceFace *osface;
+ float (*orcodata)[3];
+
+ 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);
+
+ if(orco && (orcodata=dm->getVertDataArray(dm, CD_ORCO))) {
+ VECCOPY(v[0], orcodata[mface->v1]);
+ VECCOPY(v[1], orcodata[mface->v2]);
+ VECCOPY(v[2], orcodata[mface->v3]);
+
+ /* ugly hack to use non-transformed orcos, since only those
+ * give symmetric results for mirroring in particle mode */
+ transform_mesh_orco_verts(ob->data, v, 3, 1);
+ }
+ else {
+ dm->getVertCo(dm,mface->v1,v[0]);
+ dm->getVertCo(dm,mface->v2,v[1]);
+ dm->getVertCo(dm,mface->v3,v[2]);
+ }
+
+ triatomat(v[0], v[1], v[2], (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(0, dm, pa, hairmat, 0);
+ psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, 0, 0);
+ VECCOPY(hairmat[3],vec);
+}
+
+void psys_mat_hair_to_orco(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
+{
+ float vec[3], orco[3];
+
+ psys_face_mat(ob, dm, pa, hairmat, 1);
+ psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, orco, 0);
+
+ /* see psys_face_mat for why this function is called */
+ transform_mesh_orco_verts(ob->data, &orco, 1, 1);
+ VECCOPY(hairmat[3],orco);
+}
+
+/*
+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(0, dm, pa, mat, 0);
+ 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= 5;
+ part->keys_step= 5;
+ part->draw_step= 2;
+ part->ren_step= 3;
+ 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->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->ren_child_nbr=100;
+ 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;
+
+ part->simplify_refsize= 1920;
+ part->simplify_rate= 1.0f;
+ part->simplify_transition= 0.1f;
+ part->simplify_viewport= 0.8;
+}
+
+
+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_KINK);
+ if((event & mtex->pmapto) & MAP_PA_ROUGH)
+ ptex->rough= texture_value_blend(value,ptex->rough,value,var,blend,neg & MAP_PA_ROUGH);
+ }
+ }
+ if(event & MAP_PA_TIME) { CLAMP(ptex->time,0.0,1.0); }
+ if(event & MAP_PA_LENGTH) { CLAMP(ptex->length,0.0,1.0); }
+ if(event & MAP_PA_CLUMP) { CLAMP(ptex->clump,0.0,1.0); }
+ if(event & MAP_PA_KINK) { CLAMP(ptex->kink,0.0,1.0); }
+ if(event & MAP_PA_ROUGH) { CLAMP(ptex->rough,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], co[3], 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 */
+ /* <brecht> the code only does dm based lookup now, so passing num_dmcache anyway to avoid^
+ * massive slowdown here */
+ psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 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,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 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);
+ }
+ }
+ if(event & MAP_PA_TIME) { CLAMP(ptex->time,0.0,1.0); }
+ if(event & MAP_PA_LIFE) { CLAMP(ptex->life,0.0,1.0); }
+ if(event & MAP_PA_DENS) { CLAMP(ptex->exist,0.0,1.0); }
+ if(event & MAP_PA_SIZE) { CLAMP(ptex->size,0.0,1.0); }
+ if(event & MAP_PA_IVEL) { CLAMP(ptex->ivel,0.0,1.0); }
+ if(event & MAP_PA_LENGTH) { CLAMP(ptex->length,0.0,1.0); }
+ if(event & MAP_PA_CLUMP) { CLAMP(ptex->clump,0.0,1.0); }
+ if(event & MAP_PA_KINK) { 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, ChildParticle *cpa, float cfra)
+{
+ ParticleSettings *part = psys->part;
+
+ 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, ChildParticle *cpa, float cfra, float *pa_time)
+{
+ ParticleSettings *part = psys->part;
+ float size, time;
+
+ if(part->childtype==PART_CHILD_FACES){
+ if(pa_time)
+ time=*pa_time;
+ else
+ time=psys_get_child_time(psys,cpa,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 *kkey[2] = {NULL, NULL};
+ HairKey *hkey[2];
+ ParticleKey *par=0, keys[4];
+
+ float t, real_t, dfra, keytime, frs_sec = G.scene->r.frs_sec;
+ float co[3], orco[3];
+ float hairmat[4][4];
+ 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;
+ //}
+
+ /* 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;
+ }
+
+ if(psys->flag & PSYS_KEYED) {
+ kkey[0] = pa->keys;
+ kkey[1] = kkey[0] + 1;
+
+ real_t = kkey[0]->time + t * (kkey[0][pa->totkey-1].time - kkey[0]->time);
+ }
+ else {
+ hkey[0] = pa->hair;
+ hkey[1] = pa->hair + 1;
+
+ real_t = hkey[0]->time + (hkey[0][pa->totkey-1].time - hkey[0]->time) * t;
+ }
+
+ if(psys->flag & PSYS_KEYED) {
+ while(kkey[1]->time < real_t) {
+ kkey[1]++;
+ }
+ kkey[0] = kkey[1] - 1;
+
+ memcpy(keys + 1, kkey[0], sizeof(ParticleKey));
+ memcpy(keys + 2, kkey[1], sizeof(ParticleKey));
+ }
+ else {
+ 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((psys->flag & PSYS_KEYED)==0) {
+ //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;
+
+ /* convert velocity to timestep size */
+ if(psys->flag & PSYS_KEYED){
+ VecMulf(keys[1].vel, dfra / frs_sec);
+ VecMulf(keys[2].vel, dfra / frs_sec);
+ QuatInterpol(state->rot,keys[1].rot,keys[2].rot,keytime);
+ }
+
+ interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */
+ : ((psys->part->flag & PART_HAIR_BSPLINE) ? KEY_BSPLINE : KEY_CARDINAL)
+ ,keys, keytime, state, 1);
+
+ /* the velocity needs to be converted back from cubic interpolation */
+ if(psys->flag & PSYS_KEYED){
+ VecMulf(state->vel, frs_sec / dfra);
+ }
+ else {
+ if((pa->flag & PARS_REKEY)==0) {
+ psys_mat_hair_to_global(ob, psmd->dm, part->from, pa, hairmat);
+ Mat4MulVecfl(hairmat, state->co);
+ Mat4Mul3Vecfl(hairmat, state->vel);
+
+ 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,co,0,0,0,orco,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,co);
+
+ //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,co,0,0,0,orco,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_CLUMP|MAP_PA_KINK);
+
+ 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(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,&psys->child[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(psys->flag & PSYS_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);
+
+ 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;
+ }
+}
+
+void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float *uv, float *orco)
+{
+ MFace *mface;
+ MTFace *mtface;
+ float loc[3];
+ int num;
+
+ if(cpa) {
+ if(part->childtype == PART_CHILD_FACES) {
+ mtface= CustomData_get_layer(&psmd->dm->faceData, CD_MTFACE);
+ if(mtface) {
+ mface= psmd->dm->getFaceData(psmd->dm, cpa->num, CD_MFACE);
+ mtface += cpa->num;
+ psys_interpolate_uvs(mtface, mface->v4, cpa->fuv, uv);
+ }
+ else
+ uv[0]= uv[1]= 0.0f;
+ }
+ else
+ uv[0]= uv[1]= 0.0f;
+
+ psys_particle_on_emitter(ob, psmd,
+ (part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
+ cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,0,0,0,orco,0);
+ }
+ else {
+ if(part->from == PART_FROM_FACE) {
+ mtface= CustomData_get_layer(&psmd->dm->faceData, CD_MTFACE);
+ num= pa->num_dmcache;
+
+ if(num == DMCACHE_NOTFOUND)
+ if(pa->num < psmd->dm->getNumFaces(psmd->dm))
+ num= pa->num;
+
+ if(mtface && num != DMCACHE_NOTFOUND) {
+ mface= psmd->dm->getFaceData(psmd->dm, num, CD_MFACE);
+ mtface += num;
+ psys_interpolate_uvs(mtface, mface->v4, pa->fuv, uv);
+ }
+ else
+ uv[0]= uv[1]= 0.0f;
+ }
+ else
+ uv[0]= uv[1]= 0.0f;
+
+ psys_particle_on_emitter(ob,psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,orco,0);
+ }
+}
+
+void psys_get_dupli_path_transform(Object *ob, ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale)
+{
+ float loc[3], nor[3], vec[3], side[3], len;
+
+ VecSubf(vec, (cache+cache->steps-1)->co, cache->co);
+ len= Normalize(vec);
+
+ if(pa)
+ psys_particle_on_emitter(ob,psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
+ else
+ psys_particle_on_emitter(ob, psmd,
+ (part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
+ cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0);
+
+ Crossf(side, nor, vec);
+ Normalize(side);
+ Crossf(nor, vec, side);
+
+ Mat4One(mat);
+ VECCOPY(mat[0], vec);
+ VECCOPY(mat[1], side);
+ VECCOPY(mat[2], nor);
+
+ *scale= len;
+}
+
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
new file mode 100644
index 00000000000..c0ffb7c62f8
--- /dev/null
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -0,0 +1,4624 @@
+/* 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 "BLI_threads.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_mesh.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(psys->renderdata || (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(Object *ob, 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->child) {
+ MEM_freeN(psys->child);
+ psys->child=0;
+ psys->totchild=0;
+ }
+
+ psys->totpart=totpart;
+}
+
+static int get_alloc_child_particles_tot(ParticleSystem *psys)
+{
+ int child_nbr;
+
+ if(!psys->part->childtype)
+ return 0;
+
+ child_nbr= (psys->renderdata)? psys->part->ren_child_nbr: psys->part->child_nbr;
+ return psys->totpart*child_nbr;
+}
+
+static void alloc_child_particles(ParticleSystem *psys, int tot)
+{
+ if(psys->child){
+ MEM_freeN(psys->child);
+ psys->child=0;
+ psys->totchild=0;
+ }
+
+ if(psys->part->childtype) {
+ psys->totchild= tot;
+ if(psys->totchild)
+ psys->child= MEM_callocN(psys->totchild*sizeof(ChildParticle), "child_particles");
+ }
+}
+
+/* only run this if from == PART_FROM_FACE */
+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;
+}
+
+/* note: this function must be thread safe, for from == PART_FROM_CHILD */
+#define ONLY_WORKING_WITH_PA_VERTS 0
+void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, ChildParticle *cpa, int p)
+{
+ ParticleThreadContext *ctx= thread->ctx;
+ Object *ob= ctx->ob;
+ DerivedMesh *dm= ctx->dm;
+ ParticleData *tpa;
+ ParticleSettings *part= ctx->psys->part;
+ float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3], ornor1[3];
+ float cur_d, min_d;
+ int from= ctx->from;
+ int cfrom= ctx->cfrom;
+ int distr= ctx->distr;
+ int i, intersect, tot;
+
+ if(from == PART_FROM_VERT) {
+ /* TODO_PARTICLE - use original index */
+ pa->num= ctx->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(ctx->tree){
+ KDTreeNearest ptn[3];
+ int w, maxw;
+
+ psys_particle_on_dm(ctx->ob,ctx->dm,from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,orco1,0);
+ transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
+ maxw = BLI_kdtree_find_n_nearest(ctx->tree,3,orco1,NULL,ptn);
+
+ for(w=0; w<maxw; w++){
+ pa->verts[w]=ptn->num;
+ }
+ }
+#endif
+ }
+ else if(from == PART_FROM_FACE || from == PART_FROM_VOLUME) {
+ MFace *mface;
+
+ pa->num = i = ctx->index[p];
+ mface = dm->getFaceData(dm,i,CD_MFACE);
+
+ switch(distr){
+ case PART_DISTR_JIT:
+ ctx->jitoff[i] = fmod(ctx->jitoff[i],(float)ctx->jitlevel);
+ psys_uv_to_w(ctx->jit[2*(int)ctx->jitoff[i]], ctx->jit[2*(int)ctx->jitoff[i]+1], mface->v4, pa->fuv);
+ ctx->jitoff[i]++;
+ //ctx->jitoff[i]=(float)fmod(ctx->jitoff[i]+ctx->maxweight/ctx->weight[i],(float)ctx->jitlevel);
+ break;
+ case PART_DISTR_RAND:
+ psys_uv_to_w(rng_getFloat(thread->rng), rng_getFloat(thread->rng), 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,0,pa->fuv,co1,nor,0,0,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*= ctx->jit[2*(int)ctx->jitoff[i]];
+ break;
+ case PART_DISTR_RAND:
+ pa->foffset*=BLI_frand();
+ break;
+ }
+ }
+ }
+ else if(from == PART_FROM_PARTICLE) {
+ //pa->verts[0]=0; /* not applicable */
+ //pa->verts[1]=0;
+ //pa->verts[2]=0;
+
+ tpa=ctx->tpars+ctx->index[p];
+ pa->num=ctx->index[p];
+ pa->fuv[0]=tpa->fuv[0];
+ pa->fuv[1]=tpa->fuv[1];
+ /* abusing foffset a little for timing in near reaction */
+ pa->foffset=ctx->weight[ctx->index[p]];
+ ctx->weight[ctx->index[p]]+=ctx->maxweight;
+ }
+ else if(from == PART_FROM_CHILD) {
+ MFace *mf;
+
+ if(ctx->index[p] < 0) {
+ 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;
+ return;
+ }
+
+ mf= dm->getFaceData(dm, ctx->index[p], CD_MFACE);
+
+ //switch(distr){
+ // case PART_DISTR_JIT:
+ // i=index[p];
+ // psys_uv_to_w(ctx->jit[2*(int)ctx->jitoff[i]], ctx->jit[2*(int)ctx->jitoff[i]+1], mf->v4, cpa->fuv);
+ // ctx->jitoff[i]=(float)fmod(ctx->jitoff[i]+ctx->maxweight/ctx->weight[i],(float)ctx->jitlevel);
+ // break;
+ // case PART_DISTR_RAND:
+ psys_uv_to_w(rng_getFloat(thread->rng), rng_getFloat(thread->rng), mf->v4, cpa->fuv);
+ // break;
+ //}
+
+ cpa->rand[0] = rng_getFloat(thread->rng);
+ cpa->rand[1] = rng_getFloat(thread->rng);
+ cpa->rand[2] = rng_getFloat(thread->rng);
+ cpa->num = ctx->index[p];
+
+ if(ctx->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 && ctx->seams);
+
+ psys_particle_on_dm(ob,dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,0,0,orco1,ornor1);
+ transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
+ maxw = BLI_kdtree_find_n_nearest(ctx->tree,(do_seams)?10:4,orco1,ornor1,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));
+ //pweight[w]= (1.0f - ptn[w].dist*ptn[w].dist/(maxd*maxd));
+ //pweight[w] *= pweight[w];
+ }
+ for(;w<10; w++){
+ parent[w]=-1;
+ pweight[w]=0.0f;
+ }
+ if(do_seams){
+ ParticleSeam *seam=ctx->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<ctx->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=ctx->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];
+ }
+ }
+}
+
+void *exec_distribution(void *data)
+{
+ ParticleThread *thread= (ParticleThread*)data;
+ ParticleSystem *psys= thread->ctx->psys;
+ ParticleData *pa;
+ ChildParticle *cpa;
+ int p, totpart;
+
+ if(thread->ctx->from == PART_FROM_CHILD) {
+ totpart= psys->totchild;
+ cpa= psys->child;
+
+ for(p=0; p<totpart; p++, cpa++) {
+ if(thread->ctx->skip) /* simplification skip */
+ rng_skip(thread->rng, 5*thread->ctx->skip[p]);
+
+ if((p+thread->num) % thread->tot == 0)
+ psys_thread_distribute_particle(thread, NULL, cpa, p);
+ else /* thread skip */
+ rng_skip(thread->rng, 5);
+ }
+ }
+ else {
+ totpart= psys->totpart;
+ pa= psys->particles + thread->num;
+ for(p=thread->num; p<totpart; p+=thread->tot, pa+=thread->tot)
+ psys_thread_distribute_particle(thread, pa, NULL, p);
+ }
+
+ return 0;
+}
+
+/* not thread safe, but qsort doesn't take userdata argument */
+static int *COMPARE_ORIG_INDEX = NULL;
+static int compare_orig_index(const void *p1, const void *p2)
+{
+ int index1 = COMPARE_ORIG_INDEX[*(const int*)p1];
+ int index2 = COMPARE_ORIG_INDEX[*(const int*)p2];
+
+ if(index1 < index2)
+ return -1;
+ else if(index1 == index2)
+ return 0;
+ else
+ return 1;
+}
+
+/* creates a distribution of coordinates on a DerivedMesh */
+/* */
+/* 1. lets check from what we are emitting */
+/* 2. now we know that we have something to emit from so */
+/* let's calculate some weights */
+/* 2.1 from even distribution */
+/* 2.2 and from vertex groups */
+/* 3. next we determine the indexes of emitting thing that */
+/* the particles will have */
+/* 4. let's do jitter if we need it */
+/* 5. now we're ready to set the indexes & distributions to */
+/* the particles */
+/* 6. and we're done! */
+
+/* This is to denote functionality that does not yet work with mesh - only derived mesh */
+int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm, int from)
+{
+ ParticleThreadContext *ctx= threads[0].ctx;
+ Object *ob= ctx->ob;
+ ParticleSystem *psys= ctx->psys;
+ Object *tob;
+ ParticleData *pa=0, *tpars= 0;
+ ParticleSettings *part;
+ ParticleSystem *tpsys;
+ ParticleSeam *seams= 0;
+ ChildParticle *cpa=0;
+ KDTree *tree=0;
+ DerivedMesh *dm= NULL;
+ float *jit= NULL;
+ int i, seed, p=0, totthread= threads[0].tot;
+ int no_distr=0, cfrom=0;
+ int tot=0, totpart, *index=0, children=0, totseam=0;
+ //int *vertpart=0;
+ int jitlevel= 1, distr;
+ float *weight=0,*sum=0,*jitoff=0;
+ float cur, maxweight=0.0, tweight, totweight, co[3], nor[3], orco[3], ornor[3];
+
+ if(ob==0 || psys==0 || psys->part==0)
+ return 0;
+
+ part=psys->part;
+ totpart=psys->totpart;
+ if(totpart==0)
+ return 0;
+
+ if (!finaldm->deformedOnly && !CustomData_has_layer( &finaldm->faceData, CD_ORIGINDEX ) ) {
+ error("Can't paint with the current modifier stack, disable destructive modifiers");
+ return 0;
+ }
+
+ BLI_srandom(31415926 + psys->seed);
+
+ if(from==PART_FROM_CHILD){
+ distr=PART_DISTR_RAND;
+ 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,orco,ornor);
+ transform_mesh_orco_verts((Mesh*)ob->data, &orco, 1, 1);
+ BLI_kdtree_insert(tree, p, orco, ornor);
+ }
+
+ BLI_kdtree_balance(tree);
+
+ totpart=get_alloc_child_particles_tot(psys);
+ 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 */
+ int child_nbr= (psys->renderdata)? part->ren_child_nbr: part->child_nbr;
+
+ totpart= get_alloc_child_particles_tot(psys);
+ alloc_child_particles(psys, totpart);
+ cpa=psys->child;
+ for(i=0; i<child_nbr; i++){
+ for(p=0; p<psys->totpart; p++,cpa++){
+ float length=2.0;
+ cpa->parent=p;
+
+ /* create even spherical distribution inside unit sphere */
+ while(length>=1.0f){
+ cpa->fuv[0]=2.0f*BLI_frand()-1.0f;
+ cpa->fuv[1]=2.0f*BLI_frand()-1.0f;
+ cpa->fuv[2]=2.0f*BLI_frand()-1.0f;
+ length=VecLength(cpa->fuv);
+ }
+
+ cpa->rand[0]=BLI_frand();
+ cpa->rand[1]=BLI_frand();
+ cpa->rand[2]=BLI_frand();
+
+ cpa->num=-1;
+ }
+ }
+
+ return 0;
+ }
+ }
+ 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 0;
+ }
+
+ /* we need orco for consistent distributions */
+ DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
+
+ distr=part->distr;
+ pa=psys->particles;
+ if(from==PART_FROM_VERT){
+ MVert *mv= dm->getVertDataArray(dm, CD_MVERT);
+ float (*orcodata)[3]= dm->getVertDataArray(dm, CD_ORCO);
+ int totvert = dm->getNumVerts(dm);
+
+ tree=BLI_kdtree_new(totvert);
+
+ for(p=0; p<totvert; p++){
+ if(orcodata) {
+ VECCOPY(co,orcodata[p])
+ transform_mesh_orco_verts((Mesh*)ob->data, &co, 1, 1);
+ }
+ else
+ VECCOPY(co,mv[p].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 0;
+ }
+
+ /* 2. */
+
+ weight=MEM_callocN(sizeof(float)*tot, "particle_distribution_weights");
+ index=MEM_callocN(sizeof(int)*totpart, "particle_distribution_indexes");
+ sum=MEM_callocN(sizeof(float)*(tot+1), "particle_distribution_sum");
+ jitoff=MEM_callocN(sizeof(float)*tot, "particle_distribution_jitoff");
+
+ /* 2.1 */
+ if((part->flag&PART_EDISTR || children) && ELEM(from,PART_FROM_PARTICLE,PART_FROM_VERT)==0){
+ MVert *v1, *v2, *v3, *v4;
+ float totarea=0.0, co1[3], co2[3], co3[3], co4[3];
+ float (*orcodata)[3];
+
+ orcodata= dm->getVertDataArray(dm, CD_ORCO);
+
+ for(i=0; i<tot; i++){
+ MFace *mf=dm->getFaceData(dm,i,CD_MFACE);
+
+ if(orcodata) {
+ VECCOPY(co1, orcodata[mf->v1]);
+ VECCOPY(co2, orcodata[mf->v2]);
+ VECCOPY(co3, orcodata[mf->v3]);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co1, 1, 1);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co2, 1, 1);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co3, 1, 1);
+ }
+ else {
+ v1= (MVert*)dm->getVertData(dm,mf->v1,CD_MVERT);
+ v2= (MVert*)dm->getVertData(dm,mf->v2,CD_MVERT);
+ v3= (MVert*)dm->getVertData(dm,mf->v3,CD_MVERT);
+ VECCOPY(co1, v1->co);
+ VECCOPY(co2, v2->co);
+ VECCOPY(co3, v3->co);
+ }
+
+ if (mf->v4){
+ if(orcodata) {
+ VECCOPY(co4, orcodata[mf->v4]);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co4, 1, 1);
+ }
+ else {
+ v4= (MVert*)dm->getVertData(dm,mf->v4,CD_MVERT);
+ VECCOPY(co4, v4->co);
+ }
+ cur= AreaQ3Dfl(co1, co2, co3, co4);
+ }
+ else
+ cur= AreaT3Dfl(co1, co2, co3);
+
+ 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. */
+ totweight= 0.0f;
+ for(i=0;i<tot; i++)
+ totweight += weight[i];
+
+ if(totweight > 0.0f)
+ totweight= 1.0f/totweight;
+
+ sum[0]= 0.0f;
+ for(i=0;i<tot; i++)
+ sum[i+1]= sum[i]+weight[i]*totweight;
+
+ if((part->flag&PART_TRAND) || (part->simplify_flag&PART_SIMPLIFY_ENABLE)) {
+ float pos;
+
+ for(p=0; p<totpart; p++) {
+ pos= BLI_frand();
+ index[p]= binary_search_distribution(sum, tot, pos);
+ index[p]= MIN2(tot-1, index[p]);
+ jitoff[index[p]]= pos;
+ }
+ }
+ else {
+ double step, pos;
+
+ step= (totpart <= 1)? 0.5: 1.0/(totpart-1);
+ pos= 1e-16f; /* tiny offset to avoid zero weight face */
+ i= 0;
+
+ for(p=0; p<totpart; p++, pos+=step) {
+ while((i < tot) && (pos > sum[i+1]))
+ i++;
+
+ index[p]= MIN2(tot-1, i);
+
+ /* avoid zero weight face */
+ if(p == totpart-1 && weight[index[p]] == 0.0f)
+ index[p]= index[p-1];
+
+ jitoff[index[p]]= pos;
+ }
+ }
+
+ MEM_freeN(sum);
+
+ /* for hair, sort by origindex, allows optimizations in rendering */
+ if(part->type == PART_HAIR) {
+ COMPARE_ORIG_INDEX= dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ if(COMPARE_ORIG_INDEX)
+ qsort(index, totpart, sizeof(int), compare_orig_index);
+ }
+
+ /* 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. */
+ ctx->tree= tree;
+ ctx->seams= seams;
+ ctx->totseam= totseam;
+ ctx->psys= psys;
+ ctx->index= index;
+ ctx->jit= jit;
+ ctx->jitlevel= jitlevel;
+ ctx->jitoff= jitoff;
+ ctx->weight= weight;
+ ctx->maxweight= maxweight;
+ ctx->from= (children)? PART_FROM_CHILD: from;
+ ctx->cfrom= cfrom;
+ ctx->distr= distr;
+ ctx->dm= dm;
+ ctx->tpars= tpars;
+
+ if(children) {
+ totpart= psys_render_simplify_distribution(ctx, totpart);
+ alloc_child_particles(psys, totpart);
+ }
+
+ if(!children || psys->totchild < 10000)
+ totthread= 1;
+
+ seed= 31415926 + ctx->psys->seed;
+ for(i=0; i<totthread; i++) {
+ threads[i].rng= rng_new(seed);
+ threads[i].tot= totthread;
+ }
+
+ return 1;
+}
+
+static void distribute_particles_on_dm(DerivedMesh *finaldm, Object *ob, ParticleSystem *psys, int from)
+{
+ ListBase threads;
+ ParticleThread *pthreads;
+ ParticleThreadContext *ctx;
+ int i, totthread;
+
+ pthreads= psys_threads_create(ob, psys, G.scene->r.threads);
+
+ if(!psys_threads_init_distribution(pthreads, finaldm, from)) {
+ psys_threads_free(pthreads);
+ return;
+ }
+
+ totthread= pthreads[0].tot;
+ if(totthread > 1) {
+ BLI_init_threads(&threads, exec_distribution, totthread);
+
+ for(i=0; i<totthread; i++)
+ BLI_insert_thread(&threads, &pthreads[i]);
+
+ BLI_end_threads(&threads);
+ }
+ else
+ exec_distribution(&pthreads[0]);
+
+ if (from == PART_FROM_FACE)
+ psys_calc_dmfaces(ob, finaldm, psys);
+
+ ctx= pthreads[0].ctx;
+ if(ctx->dm != finaldm)
+ ctx->dm->release(ctx->dm);
+
+ psys_threads_free(pthreads);
+}
+
+/* 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;
+ }
+ }
+}
+
+/* threaded child particle distribution and path caching */
+ParticleThread *psys_threads_create(struct Object *ob, struct ParticleSystem *psys, int totthread)
+{
+ ParticleThread *threads;
+ ParticleThreadContext *ctx;
+ int i;
+
+ threads= MEM_callocN(sizeof(ParticleThread)*totthread, "ParticleThread");
+ ctx= MEM_callocN(sizeof(ParticleThreadContext), "ParticleThreadContext");
+
+ ctx->ob= ob;
+ ctx->psys= psys;
+ ctx->psmd= psys_get_modifier(ob, psys);
+ ctx->dm= ctx->psmd->dm;
+ ctx->ma= give_current_material(ob, psys->part->omat);
+
+ memset(threads, 0, sizeof(ParticleThread)*totthread);
+
+ for(i=0; i<totthread; i++) {
+ threads[i].ctx= ctx;
+ threads[i].num= i;
+ threads[i].tot= totthread;
+ }
+
+ return threads;
+}
+
+void psys_threads_free(ParticleThread *threads)
+{
+ ParticleThreadContext *ctx= threads[0].ctx;
+ int i, totthread= threads[0].tot;
+
+ /* path caching */
+ if(ctx->vg_length)
+ MEM_freeN(ctx->vg_length);
+ if(ctx->vg_clump)
+ MEM_freeN(ctx->vg_clump);
+ if(ctx->vg_kink)
+ MEM_freeN(ctx->vg_kink);
+ if(ctx->vg_rough1)
+ MEM_freeN(ctx->vg_rough1);
+ if(ctx->vg_rough2)
+ MEM_freeN(ctx->vg_rough2);
+ if(ctx->vg_roughe)
+ MEM_freeN(ctx->vg_roughe);
+
+ if(ctx->psys->lattice){
+ end_latt_deform();
+ ctx->psys->lattice=0;
+ }
+
+ /* distribution */
+ if(ctx->jit) MEM_freeN(ctx->jit);
+ if(ctx->jitoff) MEM_freeN(ctx->jitoff);
+ if(ctx->weight) MEM_freeN(ctx->weight);
+ if(ctx->index) MEM_freeN(ctx->index);
+ if(ctx->skip) MEM_freeN(ctx->skip);
+ if(ctx->seams) MEM_freeN(ctx->seams);
+ //if(ctx->vertpart) MEM_freeN(ctx->vertpart);
+ BLI_kdtree_free(ctx->tree);
+
+ /* threads */
+ for(i=0; i<totthread; i++) {
+ if(threads[i].rng)
+ rng_free(threads[i].rng);
+ if(threads[i].rng_path)
+ rng_free(threads[i].rng_path);
+ }
+
+ MEM_freeN(ctx);
+ MEM_freeN(threads);
+}
+
+/* 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 */
+ 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, phasefac, 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}, rot_vec[3]={0.0,0.0,0.0};
+ float 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,0,0);
+
+ /* 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->randrotfac != 0.0f){
+ 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){
+ /* create vector into which rotation is aligned */
+ switch(part->rotmode){
+ case PART_ROT_NOR:
+ VecCopyf(rot_vec, nor);
+ break;
+ case PART_ROT_VEL:
+ VecCopyf(rot_vec, vel);
+ break;
+ case PART_ROT_GLOB_X:
+ case PART_ROT_GLOB_Y:
+ case PART_ROT_GLOB_Z:
+ rot_vec[part->rotmode - PART_ROT_GLOB_X] = 1.0f;
+ break;
+ case PART_ROT_OB_X:
+ case PART_ROT_OB_Y:
+ case PART_ROT_OB_Z:
+ VecCopyf(rot_vec, ob->obmat[part->rotmode - PART_ROT_OB_X]);
+ break;
+ }
+
+ /* create rotation quat */
+ VecMulf(rot_vec,-1.0);
+ q2= vectoquat(rot_vec, OB_POSX, OB_POSZ);
+
+ /* randomize rotation quat */
+ if(part->randrotfac!=0.0f)
+ QuatInterpol(rot, q2, r_rot, part->randrotfac);
+ else
+ QuatCopy(rot,q2);
+
+ /* rotation phase */
+ phasefac = part->phasefac;
+ if(part->randphasefac != 0.0f) /* abuse r_ave[0] as a random number */
+ phasefac += part->randphasefac * pa->r_ave[0];
+ VecRotToQuat(x_vec, phasefac*(float)M_PI, q_phase);
+
+ /* combine base rotation & 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);
+
+ 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 falloff_func(float fac, int usemin, float mindist, int usemax, float maxdist, float power)
+{
+ if(!usemin)
+ mindist= 0.0f;
+
+ if(fac < mindist) {
+ return 1.0f;
+ }
+ else if(usemax) {
+ if(fac>maxdist || (maxdist-mindist)<=0.0f)
+ return 0.0f;
+
+ fac= (fac-mindist)/(maxdist-mindist);
+ return 1.0f - (float)pow((double)fac, (double)power);
+ }
+ else
+ return pow((double)1.0f+fac-mindist, (double)-power);
+}
+
+static float falloff_func_dist(PartDeflect *pd, float fac)
+{
+ return falloff_func(fac, pd->flag&PFIELD_USEMIN, pd->mindist, pd->flag&PFIELD_USEMAX, pd->maxdist, pd->f_power);
+}
+
+static float falloff_func_rad(PartDeflect *pd, float fac)
+{
+ return falloff_func(fac, pd->flag&PFIELD_USEMINR, pd->minrad, pd->flag&PFIELD_USEMAXR, pd->maxrad, pd->f_power_r);
+}
+
+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);
+ falloff= falloff_func_dist(pd, fac);
+ break;
+
+ case PFIELD_FALL_TUBE:
+ fac=Inpf(vec_to_part,eff_dir);
+ falloff= falloff_func_dist(pd, ABS(fac));
+ if(falloff == 0.0f)
+ break;
+
+ VECADDFAC(temp,vec_to_part,eff_dir,-fac);
+ r_fac=VecLength(temp);
+ falloff*= falloff_func_rad(pd, r_fac);
+ break;
+ case PFIELD_FALL_CONE:
+ fac=Inpf(vec_to_part,eff_dir);
+ falloff= falloff_func_dist(pd, ABS(fac));
+ if(falloff == 0.0f)
+ break;
+
+ r_fac=saacos(fac/VecLength(vec_to_part))*180.0f/(float)M_PI;
+ falloff*= falloff_func_rad(pd, r_fac);
+
+ 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,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*/
+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 */
+ if(part->type != PART_HAIR)
+ 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,0,min_w,ipoint,unit_nor,0,0,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,0,min_w,loc,nor,0,0,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,0,min_w,loc,nor,0,0,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)){
+ if(cfra < pa->dietime)
+ pa->alive = PARS_ALIVE;
+ }
+ else
+ 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 */
+ 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;
+ int child_nbr= (psys->renderdata)? part->ren_child_nbr: part->child_nbr;
+
+ if((psys->part->childtype && psys->totchild != psys->totpart*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(ob,psys,psys->totpart);
+
+ if(get_alloc_child_particles_tot(psys)) {
+ /* don't generate children while computing the hair keys */
+ if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) {
+ 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->type==PART_HAIR || part->draw_as==PART_DRAW_PATH) || part->draw&PART_DRAW_KEYS)){
+ psys_cache_paths(ob, psys, cfra, 0);
+
+ /* for render, child particle paths are computed on the fly */
+ if(part->childtype) {
+ if(((psys->totchild!=0)) || (psys_in_edit_mode(psys) && (pset->flag&PE_SHOW_CHILD)))
+ if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE))
+ 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;
+ int child_nbr;
+
+ /*----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(ELEM(part->phystype, PART_PHYS_NO, PART_PHYS_KEYED))
+ ; /* cache shouldn't be used for "none" or "keyed" physics */
+ else {
+ if(psys->recalc && (psys->flag & PSYS_PROTECT_CACHE) == 0)
+ 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;
+
+ /* this is a bad level call, but currently type change
+ * can happen after redraw, so force redraw from here */
+ allqueue(REDRAWBUTSOBJECT, 0);
+ }
+ 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;
+
+ child_nbr= (psys->renderdata)? part->ren_child_nbr: part->child_nbr;
+ if(oldtotpart != totpart || psys->recalc&PSYS_ALLOC || (psys->part->childtype && psys->totchild != psys->totpart*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(ob, psys, totpart);
+
+ distribute_particles(ob, psys, part->from);
+
+ if((psys->part->type == PART_HAIR) && !(psys->flag & PSYS_HAIR_DONE))
+ /* don't generate children while growing hair - waste of time */
+ psys_free_children(psys);
+ else if(get_alloc_child_particles_tot(psys))
+ 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;
+
+ 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)
+ 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 || part->phystype == PART_PHYS_NO
+ || (part->phystype == PART_PHYS_KEYED && psys->flag & PSYS_FIRST_KEYED))
+ ; /* cache shouldn't be used for hair or "none" or "first keyed" physics */
+ else
+ 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(psys->recalc || force_recalc)
+ 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;
+
+ /* 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_check_enabled(ob, psys))
+ return;
+
+ cfra=bsystem_time(ob,(float)CFRA,0.0);
+ psmd= psys_get_modifier(ob, psys);
+
+ /* 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;
+ }
+
+ if(!psmd->dm)
+ 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);
+
+ Mat4Invert(psys->imat, ob->obmat); /* 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..2afcf19427c
--- /dev/null
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -0,0 +1,209 @@
+/**
+ *
+ * ***** 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)
+{
+ char dir[FILE_MAX], file[FILE_MAX]; /* we dont want the dir, only the file */
+ int i;
+
+ BLI_split_dirfile(G.sce, dir, file);
+ i = strlen(file);
+
+ /* remove .blend */
+ if (i > 6)
+ file[i-6] = '\0';
+
+ sprintf(filename, PTCACHE_PATH"%s/", file); /* add blend file name to pointcache dir */
+ 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;
+
+ if (!G.relbase_valid) return 0; /* save blend fiel before using pointcache */
+
+ /* 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];
+
+ if (!G.relbase_valid) return NULL; /* save blend fiel before using pointcache */
+
+ 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];
+
+ if (!G.relbase_valid) return; /* save blend fiel before using pointcache */
+
+ /* 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;
+}
+
+int BKE_ptcache_id_exist(struct ID *id, int cfra, int stack_index)
+{
+ char filename[(FILE_MAXDIR+FILE_MAXFILE)*2];
+
+ BKE_ptcache_id_filename(id, filename, cfra, stack_index, 1, 1);
+
+ return BLI_exists(filename);
+}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 7cce8c5e8c9..74b86415c63 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -47,6 +47,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_armature_types.h"
+#include "DNA_color_types.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
#include "DNA_group_types.h"
@@ -63,6 +64,7 @@
#include "BKE_anim.h"
#include "BKE_armature.h"
#include "BKE_bad_level_calls.h"
+#include "BKE_colortools.h"
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -75,11 +77,11 @@
#include "BKE_node.h"
#include "BKE_object.h"
#include "BKE_scene.h"
+#include "BKE_sculpt.h"
#include "BKE_world.h"
#include "BKE_utildefines.h"
#include "BIF_previewrender.h"
-#include "BDR_sculptmode.h"
#include "BPY_extern.h"
#include "BLI_arithb.h"
@@ -151,6 +153,7 @@ void free_scene(Scene *sce)
}
BLI_freelistN(&sce->markers);
+ BLI_freelistN(&sce->transform_spaces);
BLI_freelistN(&sce->r.layers);
if(sce->toolsettings){
@@ -168,12 +171,14 @@ void free_scene(Scene *sce)
MEM_freeN(sce->nodetree);
}
- sculptmode_free_all(sce);
+ sculptdata_free(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,12 +202,14 @@ 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;
sce->r.bake_osa= 5;
sce->r.bake_flag= R_BAKE_CLEAR;
+ sce->r.bake_normal_space= R_BAKE_SPACE_TANGENT;
sce->r.xplay= 640;
sce->r.yplay= 480;
@@ -231,18 +238,30 @@ Scene *add_scene(char *name)
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;
strcpy(sce->r.backbuf, "//backbuf");
strcpy(sce->r.pic, U.renderdir);
- strcpy(sce->r.ftype, "//ftype");
BLI_init_rctf(&sce->r.safety, 0.1f, 0.9f, 0.1f, 0.9f);
sce->r.osa= 8;
- sculptmode_init(sce);
+ sculptdata_init(sce);
/* note; in header_info.c the scene copy happens..., if you add more to renderdata it has to be checked there */
scene_add_render_layer(sce);
@@ -561,3 +580,124 @@ void scene_add_render_layer(Scene *sce)
srl->passflag= SCE_PASS_COMBINED|SCE_PASS_Z;
}
+/* Initialize 'permanent' sculpt data that is saved with file kept after
+ switching out of sculptmode. */
+void sculptdata_init(Scene *sce)
+{
+ SculptData *sd;
+
+ if(!sce)
+ return;
+
+ sd= &sce->sculptdata;
+
+ if(sd->cumap)
+ curvemapping_free(sd->cumap);
+
+ memset(sd, 0, sizeof(SculptData));
+
+ sd->drawbrush.size = sd->smoothbrush.size = sd->pinchbrush.size =
+ sd->inflatebrush.size = sd->grabbrush.size =
+ sd->layerbrush.size = sd->flattenbrush.size = 50;
+ sd->drawbrush.strength = sd->smoothbrush.strength =
+ sd->pinchbrush.strength = sd->inflatebrush.strength =
+ sd->grabbrush.strength = sd->layerbrush.strength =
+ sd->flattenbrush.strength = 25;
+ sd->drawbrush.dir = sd->pinchbrush.dir = sd->inflatebrush.dir = sd->layerbrush.dir= 1;
+ sd->drawbrush.flag = sd->smoothbrush.flag =
+ sd->pinchbrush.flag = sd->inflatebrush.flag =
+ sd->layerbrush.flag = sd->flattenbrush.flag = 0;
+ sd->drawbrush.view= 0;
+ sd->brush_type= DRAW_BRUSH;
+ sd->texact= -1;
+ sd->texfade= 1;
+ sd->averaging= 1;
+ sd->texsep= 0;
+ sd->texrept= SCULPTREPT_DRAG;
+ sd->flags= SCULPT_DRAW_BRUSH;
+ sd->tablet_size=3;
+ sd->tablet_strength=10;
+ sd->rake=0;
+ sculpt_reset_curve(sd);
+}
+
+void sculptdata_free(Scene *sce)
+{
+ SculptData *sd= &sce->sculptdata;
+ int a;
+
+ sculptsession_free(sce);
+
+ for(a=0; a<MAX_MTEX; a++) {
+ MTex *mtex= sd->mtex[a];
+ if(mtex) {
+ if(mtex->tex) mtex->tex->id.us--;
+ MEM_freeN(mtex);
+ }
+ }
+
+ curvemapping_free(sd->cumap);
+ sd->cumap = NULL;
+}
+
+void sculpt_vertexusers_free(SculptSession *ss)
+{
+ if(ss && ss->vertex_users){
+ MEM_freeN(ss->vertex_users);
+ MEM_freeN(ss->vertex_users_mem);
+ ss->vertex_users= NULL;
+ ss->vertex_users_mem= NULL;
+ ss->vertex_users_size= 0;
+ }
+}
+
+void sculptsession_free(Scene *sce)
+{
+ SculptSession *ss= sce->sculptdata.session;
+ if(ss) {
+ if(ss->projverts)
+ MEM_freeN(ss->projverts);
+ if(ss->mats)
+ MEM_freeN(ss->mats);
+
+ if(ss->radialcontrol)
+ MEM_freeN(ss->radialcontrol);
+
+ sculpt_vertexusers_free(ss);
+ if(ss->texcache)
+ MEM_freeN(ss->texcache);
+ MEM_freeN(ss);
+ sce->sculptdata.session= NULL;
+ }
+}
+
+/* Default curve approximates 0.5 * (cos(pi * x) + 1), with 0 <= x <= 1 */
+void sculpt_reset_curve(SculptData *sd)
+{
+ CurveMap *cm = NULL;
+
+ if(!sd->cumap)
+ sd->cumap = curvemapping_add(1, 0, 0, 1, 1);
+
+ cm = sd->cumap->cm;
+
+ if(cm->curve)
+ MEM_freeN(cm->curve);
+ cm->curve= MEM_callocN(6*sizeof(CurveMapPoint), "curve points");
+ cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
+ cm->totpoint= 6;
+ cm->curve[0].x= 0;
+ cm->curve[0].y= 1;
+ cm->curve[1].x= 0.1;
+ cm->curve[1].y= 0.97553;
+ cm->curve[2].x= 0.3;
+ cm->curve[2].y= 0.79389;
+ cm->curve[3].x= 0.9;
+ cm->curve[3].y= 0.02447;
+ cm->curve[4].x= 0.7;
+ cm->curve[4].y= 0.20611;
+ cm->curve[5].x= 1;
+ cm->curve[5].y= 0;
+
+ curvemapping_changed(sd->cumap, 0);
+}
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index c62f59106a3..0186fad5c13 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,13 +77,17 @@ 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"
#include "PIL_time.h"
+#include "ONL_opennl.h"
/* callbacks for errors and interrupts and some goo */
static int (*SB_localInterruptCallBack)(void) = NULL;
@@ -90,21 +96,9 @@ 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;
+ float len, strength, cf,load;
float ext_force[3]; /* edges colliding and sailing */
short order;
short flag;
@@ -112,7 +106,7 @@ typedef struct BodySpring {
typedef struct BodyFace {
int v1, v2, v3 ,v4;
- float ext_force[3]; /* edges colliding and sailing */
+ float ext_force[3]; /* faces colliding */
short flag;
} BodyFace;
@@ -127,6 +121,11 @@ typedef struct SBScratch {
float aabbmin[3],aabbmax[3];
}SBScratch;
+#define NLF_BUILD 1
+#define NLF_SOLVE 2
+
+#define MID_PRESERVE 1
+
#define SOFTGOALSNAP 0.999f
/* if bp-> goal is above make it a *forced follow original* and skip all ODE stuff for this bp
removes *unnecessary* stiffnes from ODE system
@@ -136,7 +135,9 @@ typedef struct SBScratch {
#define BSF_INTERSECT 1 /* edge intersects collider face */
#define SBF_DOFUZZY 1 /* edge intersects collider face */
-#define BFF_INTERSECT 1 /* edge intersects collider face */
+
+#define BFF_INTERSECT 1 /* collider edge intrudes face */
+#define BFF_CLOSEVERT 2 /* collider vertex repulses face */
float SoftHeunTol = 1.0f; /* humm .. this should be calculated from sb parameters and sizes */
@@ -480,21 +481,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){
@@ -582,6 +593,7 @@ static void add_mesh_quad_diag_springs(Object *ob)
if (ob->soft){
int nofquads;
+ float s_shear = ob->soft->shearstiff*ob->soft->shearstiff;
nofquads = count_mesh_quads(me);
if (nofquads) {
@@ -602,12 +614,12 @@ static void add_mesh_quad_diag_springs(Object *ob)
if(mface->v4) {
bs->v1= mface->v1;
bs->v2= mface->v3;
- bs->strength= 1.0;
+ bs->strength= s_shear;
bs->order =2;
bs++;
bs->v1= mface->v2;
bs->v2= mface->v4;
- bs->strength= 1.0;
+ bs->strength= s_shear;
bs->order =2;
bs++;
@@ -689,6 +701,7 @@ static void add_2nd_order_springs(Object *ob,float stiffness)
{
int counter = 0;
BodySpring *bs_new;
+ stiffness *=stiffness;
add_2nd_order_roller(ob,stiffness,&counter,0); /* counting */
if (counter) {
@@ -782,21 +795,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 +865,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 +883,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;
@@ -880,6 +894,8 @@ static void renew_softbody(Object *ob, int totpoint, int totspring)
bp->nofsprings= 0;
bp->springs= NULL;
bp->choke = 0.0f;
+ bp->choke2 = 0.0f;
+ bp->frozen = 1.0f;
bp->colball = 0.0f;
bp->flag = 0;
@@ -900,7 +916,6 @@ static void free_softbody_baked(SoftBody *sb)
sb->keys= NULL;
sb->totkey= 0;
-
}
static void free_scratch(SoftBody *sb)
{
@@ -1099,6 +1114,103 @@ int sb_detect_aabb_collisionCached( float force[3], unsigned int par_layer,struc
/* +++ the face external section*/
+int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
+ float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+ {
+ Object *ob;
+ GHash *hash;
+ GHashIterator *ihash;
+ float nv1[3], edge1[3], edge2[3], d_nvect[3], aabbmin[3],aabbmax[3];
+ float facedist,outerfacethickness,tune = 10.f;
+ int a, deflected=0;
+
+ aabbmin[0] = MIN3(face_v1[0],face_v2[0],face_v3[0]);
+ aabbmin[1] = MIN3(face_v1[1],face_v2[1],face_v3[1]);
+ aabbmin[2] = MIN3(face_v1[2],face_v2[2],face_v3[2]);
+ aabbmax[0] = MAX3(face_v1[0],face_v2[0],face_v3[0]);
+ aabbmax[1] = MAX3(face_v1[1],face_v2[1],face_v3[1]);
+ aabbmax[2] = MAX3(face_v1[2],face_v2[2],face_v3[2]);
+
+ /* calculate face normal once again SIGH */
+ VECSUB(edge1, face_v1, face_v2);
+ VECSUB(edge2, face_v3, face_v2);
+ Crossf(d_nvect, edge2, edge1);
+ Normalize(d_nvect);
+
+
+ hash = vertexowner->soft->scratch->colliderhash;
+ ihash = BLI_ghashIterator_new(hash);
+ while (!BLI_ghashIterator_isDone(ihash) ) {
+
+ ccd_Mesh *ccdm = BLI_ghashIterator_getValue (ihash);
+ ob = BLI_ghashIterator_getKey (ihash);
+ /* only with deflecting set */
+ if(ob->pd && ob->pd->deflect) {
+ MVert *mvert= NULL;
+ MVert *mprevvert= NULL;
+ if(ccdm){
+ mvert= ccdm->mvert;
+ a = ccdm->totvert;
+ mprevvert= ccdm->mprevvert;
+ outerfacethickness =ob->pd->pdef_sboft;
+ if ((aabbmax[0] < ccdm->bbmin[0]) ||
+ (aabbmax[1] < ccdm->bbmin[1]) ||
+ (aabbmax[2] < ccdm->bbmin[2]) ||
+ (aabbmin[0] > ccdm->bbmax[0]) ||
+ (aabbmin[1] > ccdm->bbmax[1]) ||
+ (aabbmin[2] > ccdm->bbmax[2]) ) {
+ /* boxes dont intersect */
+ BLI_ghashIterator_step(ihash);
+ continue;
+ }
+
+ }
+ else{
+ /*aye that should be cached*/
+ printf("missing cache error \n");
+ BLI_ghashIterator_step(ihash);
+ continue;
+ }
+
+
+ /* use mesh*/
+ if (mvert) {
+ while(a){
+ VECCOPY(nv1,mvert[a-1].co);
+ if(mprevvert){
+ VecMulf(nv1,time);
+ Vec3PlusStVec(nv1,(1.0f-time),mprevvert[a-1].co);
+ }
+ /* origin to face_v2*/
+ VECSUB(nv1, nv1, face_v2);
+ facedist = Inpf(nv1,d_nvect);
+ if (ABS(facedist)<outerfacethickness){
+ if (point_in_tri_prism(nv1, face_v1,face_v2,face_v3) ){
+ float df;
+ if (facedist > 0){
+ df = (outerfacethickness-facedist)/outerfacethickness;
+ }
+ else {
+ df = (outerfacethickness+facedist)/outerfacethickness;
+ }
+
+ *damp=df*tune*ob->pd->pdef_sbdamp;
+
+ df = 0.01f*exp(- 100.0f*df);
+ Vec3PlusStVec(force,-df,d_nvect);
+ deflected = 3;
+ }
+ }
+ a--;
+ }/* while(a)*/
+ } /* if (mvert) */
+ } /* if(ob->pd && ob->pd->deflect) */
+ BLI_ghashIterator_step(ihash);
+ } /* while () */
+ BLI_ghashIterator_free(ihash);
+ return deflected;
+}
+
int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
@@ -1107,7 +1219,7 @@ int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_
GHash *hash;
GHashIterator *ihash;
float nv1[3], nv2[3], nv3[3], nv4[3], edge1[3], edge2[3], d_nvect[3], aabbmin[3],aabbmax[3];
- float t;
+ float t,tune = 10.0f;
int a, deflected=0;
aabbmin[0] = MIN3(face_v1[0],face_v2[0],face_v3[0]);
@@ -1203,11 +1315,11 @@ 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) ){
- Vec3PlusStVec(force,-1.0f,d_nvect);
- *damp=ob->pd->pdef_sbdamp;
+ 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,-0.5f,d_nvect);
+ *damp=tune*ob->pd->pdef_sbdamp;
deflected = 2;
}
if (mface->v4){ /* quad */
@@ -1217,11 +1329,12 @@ 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) ){
- Vec3PlusStVec(force,-1.0f,d_nvect);
- *damp=ob->pd->pdef_sbdamp;
+ /* LineIntersectsTriangle(nv1, nv3, face_v1, face_v2, face_v3, &t, NULL) ||
+ we did that edge allready */
+ LineIntersectsTriangle(nv3, nv4, face_v1, face_v2, face_v3, &t, NULL) ||
+ LineIntersectsTriangle(nv4, nv1, face_v1, face_v2, face_v3, &t, NULL) ){
+ Vec3PlusStVec(force,-0.5f,d_nvect);
+ *damp=tune*ob->pd->pdef_sbdamp;
deflected = 2;
}
}
@@ -1242,7 +1355,7 @@ void scan_for_ext_face_forces(Object *ob,float timenow)
SoftBody *sb = ob->soft;
BodyFace *bf;
int a;
- float damp;
+ float damp=0.0f,choke=1.0f;
float tune = -10.0f;
float feedback[3];
@@ -1252,43 +1365,71 @@ void scan_for_ext_face_forces(Object *ob,float timenow)
bf = sb->scratch->bodyface;
for(a=0; a<sb->scratch->totface; a++, bf++) {
bf->ext_force[0]=bf->ext_force[1]=bf->ext_force[2]=0.0f;
+/*+++edges intruding*/
+ bf->flag &= ~BFF_INTERSECT;
feedback[0]=feedback[1]=feedback[2]=0.0f;
- bf->flag &= ~BFF_INTERSECT;
-
if (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos,
&damp, feedback, ob->lay ,ob , timenow)){
- Vec3PlusStVec(bf->ext_force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v2].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
+// Vec3PlusStVec(bf->ext_force,tune,feedback);
bf->flag |= BFF_INTERSECT;
+ choke = MIN2(MAX2(damp,choke),1.0f);
}
feedback[0]=feedback[1]=feedback[2]=0.0f;
if ((bf->v4) && (sb_detect_face_collisionCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos,
&damp, feedback, ob->lay ,ob , timenow))){
- Vec3PlusStVec(bf->ext_force,tune,feedback);
- bf->flag |= BFF_INTERSECT;
+ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v4].force,tune,feedback);
+// Vec3PlusStVec(bf->ext_force,tune,feedback);
+ bf->flag |= BFF_INTERSECT;
+ choke = MIN2(MAX2(damp,choke),1.0f);
}
- }
+/*---edges intruding*/
+
+/*+++ close vertices*/
+ if (( bf->flag & BFF_INTERSECT)==0){
+ bf->flag &= ~BFF_CLOSEVERT;
+ tune = -1.0f;
+ feedback[0]=feedback[1]=feedback[2]=0.0f;
+ if (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v2].pos, sb->bpoint[bf->v3].pos,
+ &damp, feedback, ob->lay ,ob , timenow)){
+ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v2].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
+// Vec3PlusStVec(bf->ext_force,tune,feedback);
+ bf->flag |= BFF_CLOSEVERT;
+ choke = MIN2(MAX2(damp,choke),1.0f);
+ }
-
-
+ feedback[0]=feedback[1]=feedback[2]=0.0f;
+ if ((bf->v4) && (sb_detect_face_pointCached(sb->bpoint[bf->v1].pos,sb->bpoint[bf->v3].pos, sb->bpoint[bf->v4].pos,
+ &damp, feedback, ob->lay ,ob , timenow))){
+ Vec3PlusStVec(sb->bpoint[bf->v1].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v3].force,tune,feedback);
+ Vec3PlusStVec(sb->bpoint[bf->v4].force,tune,feedback);
+// Vec3PlusStVec(bf->ext_force,tune,feedback);
+ bf->flag |= BFF_CLOSEVERT;
+ choke = MIN2(MAX2(damp,choke),1.0f);
+ }
+ }
+/*--- close vertices*/
+ }
bf = sb->scratch->bodyface;
for(a=0; a<sb->scratch->totface; a++, bf++) {
- if ( bf->flag & BFF_INTERSECT)
+ if (( bf->flag & BFF_INTERSECT) || ( bf->flag & BFF_CLOSEVERT))
{
- VECADD(sb->bpoint[bf->v1].force,sb->bpoint[bf->v1].force,bf->ext_force);
- VECADD(sb->bpoint[bf->v2].force,sb->bpoint[bf->v2].force,bf->ext_force);
- VECADD(sb->bpoint[bf->v3].force,sb->bpoint[bf->v3].force,bf->ext_force);
+ sb->bpoint[bf->v1].choke2=MAX2(sb->bpoint[bf->v1].choke2,choke);
+ sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke);
+ sb->bpoint[bf->v3].choke2=MAX2(sb->bpoint[bf->v3].choke2,choke);
if (bf->v4){
- VECADD(sb->bpoint[bf->v4].force,sb->bpoint[bf->v4].force,bf->ext_force);
+ sb->bpoint[bf->v2].choke2=MAX2(sb->bpoint[bf->v2].choke2,choke);
}
-
- }
-
+ }
}
-
-
-
-
}
}
@@ -1402,7 +1543,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 +1562,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);
@@ -1447,6 +1588,7 @@ int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp
}
+
void scan_for_ext_spring_forces(Object *ob,float timenow)
{
SoftBody *sb = ob->soft;
@@ -1498,14 +1640,20 @@ void scan_for_ext_spring_forces(Object *ob,float timenow)
}
f = Normalize(vel);
f = -0.0001f*f*f*sb->aeroedge;
- /* todo add a nice angle dependant function */
- /* look up one at bergman scheafer */
+ /* (todo) add a nice angle dependant function done for now BUT */
+ /* still there could be some nice drag/lift function, but who needs it */
VECSUB(sp, sb->bpoint[bs->v1].pos , sb->bpoint[bs->v2].pos);
Projf(pr,vel,sp);
VECSUB(vel,vel,pr);
Normalize(vel);
- Vec3PlusStVec(bs->ext_force,f,vel);
+ if (ob->softflag & OB_SB_AERO_ANGLE){
+ Normalize(sp);
+ Vec3PlusStVec(bs->ext_force,f*(1.0f-ABS(Inpf(vel,sp))),vel);
+ }
+ else{
+ Vec3PlusStVec(bs->ext_force,f,vel); // to keep compatible with 2.45 release files
+ }
}
/* --- springs seeing wind */
}
@@ -1547,15 +1695,15 @@ 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],
+ 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;
@@ -2092,8 +2240,110 @@ static int sb_deflect_face(Object *ob,float *actpos,float *facenormal,float *for
return(deflected);
}
+static void dfdx_spring(int ia, int ic, int op, float dir[3],float L,float len,float factor)
+{
+ float m,delta_ij;
+ int i ,j;
+ if (L < len){
+ for(i=0;i<3;i++)
+ for(j=0;j<3;j++){
+ delta_ij = (i==j ? (1.0f): (0.0f));
+ m=factor*(dir[i]*dir[j] + (1-L/len)*(delta_ij - dir[i]*dir[j]));
+ nlMatrixAdd(ia+i,op+ic+j,m);
+ }
+ }
+ else{
+ for(i=0;i<3;i++)
+ for(j=0;j<3;j++){
+ m=factor*dir[i]*dir[j];
+ nlMatrixAdd(ia+i,op+ic+j,m);
+ }
+ }
+}
+
+
+static void dfdx_goal(int ia, int ic, int op, float factor)
+{
+ int i;
+ for(i=0;i<3;i++) nlMatrixAdd(ia+i,op+ic+i,factor);
+}
-static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
+static void dfdv_goal(int ia, int ic,float factor)
+{
+ int i;
+ for(i=0;i<3;i++) nlMatrixAdd(ia+i,ic+i,factor);
+}
+static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags)
+{
+ SoftBody *sb= ob->soft; /* is supposed to be there */
+ BodyPoint *bp1,*bp2;
+
+ float dir[3],dvel[3];
+ float distance,forcefactor,kd,absvel,projvel;
+ int ia,ic;
+ /* prepare depending on which side of the spring we are on */
+ if (bpi == bs->v1){
+ bp1 = &sb->bpoint[bs->v1];
+ bp2 = &sb->bpoint[bs->v2];
+ ia =3*bs->v1;
+ ic =3*bs->v2;
+ }
+ else if (bpi == bs->v2){
+ bp1 = &sb->bpoint[bs->v2];
+ bp2 = &sb->bpoint[bs->v1];
+ ia =3*bs->v2;
+ ic =3*bs->v1;
+ }
+ else{
+ /* TODO make this debug option */
+ /**/
+ printf("bodypoint <bpi> is not attached to spring <*bs> --> sb_spring_force()\n");
+ return;
+ }
+
+ /* do bp1 <--> bp2 elastic */
+ VecSubf(dir,bp1->pos,bp2->pos);
+ distance = Normalize(dir);
+ if (bs->len < distance)
+ iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */
+ else
+ iks = 1.0f/(1.0f-sb->inpush)-1.0f ;/* inner spring constants function */
+
+ if(bs->len > 0.0f) /* check for degenerated springs */
+ forcefactor = iks/bs->len;
+ else
+ forcefactor = iks;
+ forcefactor *= bs->strength;
+ Vec3PlusStVec(bp1->force,(bs->len - distance)*forcefactor,dir);
+
+ /* do bp1 <--> bp2 viscous */
+ VecSubf(dvel,bp1->vec,bp2->vec);
+ kd = sb->infrict * sb_fric_force_scale(ob);
+ absvel = Normalize(dvel);
+ projvel = Inpf(dir,dvel);
+ kd *= absvel * projvel;
+ Vec3PlusStVec(bp1->force,-kd,dir);
+
+ /* do jacobian stuff if needed */
+ if(nl_flags & NLF_BUILD){
+ int op =3*sb->totpoint;
+ float mvel = -forcetime*kd;
+ float mpos = -forcetime*forcefactor;
+ /* depending on my pos */
+ dfdx_spring(ia,ia,op,dir,bs->len,distance,-mpos);
+ /* depending on my vel */
+ dfdv_goal(ia,ia,mvel); // well that ignores geometie
+ if(bp2->goal < SOFTGOALSNAP){ /* ommit this bp when it snaps */
+ /* depending on other pos */
+ dfdx_spring(ia,ic,op,dir,bs->len,distance,mpos);
+ /* depending on other vel */
+ dfdv_goal(ia,ia,-mvel); // well that ignores geometie
+ }
+ }
+}
+
+
+static void softbody_calc_forces(Object *ob, float forcetime, float timenow, int nl_flags)
{
/* rule we never alter free variables :bp->vec bp->pos in here !
* this will ruin adaptive stepsize AKA heun! (BM)
@@ -2103,10 +2353,20 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
BodyPoint *bproot;
BodySpring *bs;
ListBase *do_effector;
- float iks, ks, kd, gravity, actspringlen, forcefactor, sd[3];
+ float iks, ks, kd, gravity;
float fieldfactor = 1000.0f, windfactor = 250.0f;
float tune = sb->ballstiff;
int a, b, do_deflector,do_selfcollision,do_springcollision,do_aero;
+
+
+
+ NLboolean success;
+
+ if(nl_flags){
+ nlBegin(NL_SYSTEM);
+ nlBegin(NL_MATRIX);
+ }
+
gravity = sb->grav * sb_grav_force_scale(ob);
@@ -2129,17 +2389,32 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
do_deflector = sb_detect_aabb_collisionCached(defforce,ob->lay,ob,timenow);
}
- if (do_selfcollision ){
- float ce[3];
- VecMidf(ce,sb->scratch->aabbmax,sb->scratch->aabbmin);
- for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
- bp->octantflag = set_octant_flags(ce,bp->pos,bp->colball);
- }
- }
-
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
/* clear forces accumulator */
bp->force[0]= bp->force[1]= bp->force[2]= 0.0;
+ if(nl_flags & NLF_BUILD){
+ int ia =3*(sb->totpoint-a);
+ int op =3*sb->totpoint;
+ /* dF/dV = v */
+
+ nlMatrixAdd(op+ia,ia,-forcetime);
+ nlMatrixAdd(op+ia+1,ia+1,-forcetime);
+ nlMatrixAdd(op+ia+2,ia+2,-forcetime);
+
+
+ /* we need [unit - h* dF/dy]^-1 */
+
+ nlMatrixAdd(ia,ia,1);
+ nlMatrixAdd(ia+1,ia+1,1);
+ nlMatrixAdd(ia+2,ia+2,1);
+
+ nlMatrixAdd(op+ia,op+ia,1);
+ nlMatrixAdd(op+ia+1,op+ia+1,1);
+ nlMatrixAdd(op+ia+2,op+ia+2,1);
+
+
+
+ }
/* naive ball self collision */
/* needs to be done if goal snaps or not */
@@ -2153,7 +2428,7 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
for(c=sb->totpoint, obp= sb->bpoint; c>=a; c--, obp++) {
- if ((bp->octantflag & obp->octantflag) == 0) continue;
+ //if ((bp->octantflag & obp->octantflag) == 0) continue;
compare = (obp->colball + bp->colball);
VecSubf(def, bp->pos, obp->pos);
@@ -2179,8 +2454,33 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
VecSubf(dvel,velcenter,bp->vec);
VecMulf(dvel,sb->nodemass);
- Vec3PlusStVec(bp->force,sb->balldamp,dvel);
Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def);
+ Vec3PlusStVec(bp->force,sb->balldamp,dvel);
+
+ if(nl_flags & NLF_BUILD){
+ int ia =3*(sb->totpoint-a);
+ int ic =3*(sb->totpoint-c);
+ int op =3*sb->totpoint;
+ float mvel = forcetime*sb->nodemass*sb->balldamp;
+ float mpos = forcetime*tune*(1.0f-sb->balldamp);
+ /*some quick and dirty entries to the jacobian*/
+ dfdx_goal(ia,ia,op,mpos);
+ dfdv_goal(ia,ia,mvel);
+ /* exploit force(a,b) == -force(b,a) part1/2 */
+ dfdx_goal(ic,ic,op,mpos);
+ dfdv_goal(ic,ic,mvel);
+
+
+ /*TODO sit down an X-out the true jacobian entries*/
+ /*well does not make to much sense because the eigenvalues
+ of the jacobian go negative; and negative eigenvalues
+ on a complex iterative system z(n+1)=A * z(n)
+ give imaginary roots in the charcateristic polynom
+ --> solutions that to z(t)=u(t)* exp ( i omega t) --> oscilations we don't want here
+ where u(t) is a unknown amplitude function (worst case rising fast)
+ */
+ }
+
/* exploit force(a,b) == -force(b,a) part2/2 */
VecSubf(dvel,velcenter,obp->vec);
VecMulf(dvel,sb->nodemass);
@@ -2188,6 +2488,7 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
Vec3PlusStVec(obp->force,sb->balldamp,dvel);
Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def);
+
}
}
}
@@ -2198,23 +2499,39 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
float auxvect[3];
float velgoal[3];
float absvel =0, projvel= 0;
-
/* do goal stuff */
if(ob->softflag & OB_SB_GOAL) {
/* true elastic goal */
- VecSubf(auxvect,bp->origT,bp->pos);
+ VecSubf(auxvect,bp->pos,bp->origT);
ks = 1.0f/(1.0f- bp->goal*sb->goalspring)-1.0f ;
- bp->force[0]+= ks*(auxvect[0]);
- bp->force[1]+= ks*(auxvect[1]);
- bp->force[2]+= ks*(auxvect[2]);
+ bp->force[0]+= -ks*(auxvect[0]);
+ bp->force[1]+= -ks*(auxvect[1]);
+ bp->force[2]+= -ks*(auxvect[2]);
+
+ if(nl_flags & NLF_BUILD){
+ int ia =3*(sb->totpoint-a);
+ int op =3*(sb->totpoint);
+ /* depending on my pos */
+ dfdx_goal(ia,ia,op,ks*forcetime);
+ }
+
+
/* calulate damping forces generated by goals*/
VecSubf(velgoal,bp->origS, bp->origE);
kd = sb->goalfrict * sb_fric_force_scale(ob) ;
+ VecAddf(auxvect,velgoal,bp->vec);
if (forcetime > 0.0 ) { /* make sure friction does not become rocket motor on time reversal */
- bp->force[0]-= kd * (velgoal[0] + bp->vec[0]);
- bp->force[1]-= kd * (velgoal[1] + bp->vec[1]);
- bp->force[2]-= kd * (velgoal[2] + bp->vec[2]);
+ bp->force[0]-= kd * (auxvect[0]);
+ bp->force[1]-= kd * (auxvect[1]);
+ bp->force[2]-= kd * (auxvect[2]);
+ if(nl_flags & NLF_BUILD){
+ int ia =3*(sb->totpoint-a);
+ Normalize(auxvect);
+ /* depending on my vel */
+ dfdv_goal(ia,ia,kd*forcetime);
+ }
+
}
else {
bp->force[0]-= kd * (velgoal[0] - bp->vec[0]);
@@ -2227,6 +2544,7 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
/* gravitation */
bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */
+ //bp->force[1]-= gravity*sb->nodemass; /* individual mass of node here */
/* particle field & vortex */
@@ -2257,16 +2575,27 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
bp->force[1]-= bp->vec[1]*kd;
bp->force[2]-= bp->vec[2]*kd;
/* friction in media done */
+ if(nl_flags & NLF_BUILD){
+ int ia =3*(sb->totpoint-a);
+ int op =3*sb->totpoint;
+ /* da/dv = */
+
+ nlMatrixAdd(ia,ia,forcetime*kd);
+ nlMatrixAdd(ia+1,ia+1,forcetime*kd);
+ nlMatrixAdd(ia+2,ia+2,forcetime*kd);
+ }
+
}
/* +++cached collision targets */
bp->choke = 0.0f;
+ bp->choke2 = 0.0f;
bp->flag &= ~SBF_DOFUZZY;
if(do_deflector) {
float cfforce[3],defforce[3] ={0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f}, facenormal[3], cf = 1.0f,intrusion;
kd = 1.0f;
if (sb_deflect_face(ob,bp->pos,facenormal,defforce,&cf,timenow,vel,&intrusion)){
- if (intrusion < 0.0f){
+ if ((!nl_flags)&&(intrusion < 0.0f)){
/*bjornmose: uugh.. what an evil hack
violation of the 'don't touch bp->pos in here' rule
but works nice, like this-->
@@ -2284,8 +2613,15 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
VECSUB(cfforce,bp->vec,vel);
Vec3PlusStVec(bp->force,-cf*50.0f,cfforce);
}
-
Vec3PlusStVec(bp->force,kd,defforce);
+ if (nl_flags & NLF_BUILD){
+ int ia =3*(sb->totpoint-a);
+ int op =3*sb->totpoint;
+ //dfdx_goal(ia,ia,op,mpos); // don't do unless you know
+ //dfdv_goal(ia,ia,-cf);
+
+ }
+
}
}
@@ -2302,50 +2638,8 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
bp->choke = bs->cf;
}
-
- if (( (sb->totpoint-a) == bs->v1) ){
- actspringlen= VecLenf( (bproot+bs->v2)->pos, bp->pos);
- VecSubf(sd,(bproot+bs->v2)->pos, bp->pos);
- Normalize(sd);
-
- /* friction stuff V1 */
- VecSubf(velgoal,bp->vec,(bproot+bs->v2)->vec);
- kd = sb->infrict * sb_fric_force_scale(ob);
- absvel = Normalize(velgoal);
- projvel = ABS(Inpf(sd,velgoal));
- kd *= absvel * projvel;
- Vec3PlusStVec(bp->force,-kd,velgoal);
-
- if(bs->len > 0.0f) /* check for degenerated springs */
- forcefactor = (bs->len - actspringlen)/bs->len * iks;
- else
- forcefactor = actspringlen * iks;
- forcefactor *= bs->strength;
-
- Vec3PlusStVec(bp->force,-forcefactor,sd);
-
- }
-
- if (( (sb->totpoint-a) == bs->v2) ){
- actspringlen= VecLenf( (bproot+bs->v1)->pos, bp->pos);
- VecSubf(sd,bp->pos,(bproot+bs->v1)->pos);
- Normalize(sd);
-
- /* friction stuff V2 */
- VecSubf(velgoal,bp->vec,(bproot+bs->v1)->vec);
- kd = sb->infrict * sb_fric_force_scale(ob);
- absvel = Normalize(velgoal);
- projvel = ABS(Inpf(sd,velgoal));
- kd *= absvel * projvel;
- Vec3PlusStVec(bp->force,-kd,velgoal);
-
- if(bs->len > 0.0)
- forcefactor = (bs->len - actspringlen)/bs->len * iks;
- else
- forcefactor = actspringlen * iks;
- forcefactor *= bs->strength;
- Vec3PlusStVec(bp->force,+forcefactor,sd);
- }
+ // sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags)
+ sb_spring_force(ob,sb->totpoint-a,bs,iks,forcetime,nl_flags);
}/* loop springs */
}/* existing spring list */
}/*any edges*/
@@ -2355,14 +2649,211 @@ static void softbody_calc_forces(Object *ob, float forcetime, float timenow)
/* finally add forces caused by face collision */
- if (ob->softflag & OB_SB_FACECOLL) scan_for_ext_face_forces(ob,timenow);
+ if (ob->softflag & OB_SB_FACECOLL) scan_for_ext_face_forces(ob,timenow);
+
+ /* finish matrix and solve */
+ if(nl_flags & NLF_SOLVE){
+ //double sct,sst=PIL_check_seconds_timer();
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+ int iv =3*(sb->totpoint-a);
+ int ip =3*(2*sb->totpoint-a);
+ int n;
+ for (n=0;n<3;n++) {nlRightHandSideSet(0, iv+n, bp->force[0+n]);}
+ for (n=0;n<3;n++) {nlRightHandSideSet(0, ip+n, bp->vec[0+n]);}
+ }
+ nlEnd(NL_MATRIX);
+ nlEnd(NL_SYSTEM);
+
+ if ((G.rt >0) && (nl_flags & NLF_BUILD))
+ {
+ printf("####MEE#####\n");
+ nlPrintMatrix();
+ }
+
+ success= nlSolveAdvanced(NULL, 1);
+
+ // nlPrintMatrix(); /* for debug purpose .. anyhow cropping B vector looks like working */
+ if(success){
+ float f;
+ int index =0;
+ /* for debug purpose .. anyhow cropping B vector looks like working */
+ if (G.rt >0)
+ for(a=2*sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+ f=nlGetVariable(0,index);
+ printf("(%f ",f);index++;
+ f=nlGetVariable(0,index);
+ printf("%f ",f);index++;
+ f=nlGetVariable(0,index);
+ printf("%f)",f);index++;
+ }
+
+ index =0;
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+ f=nlGetVariable(0,index);
+ bp->impdv[0] = f; index++;
+ f=nlGetVariable(0,index);
+ bp->impdv[1] = f; index++;
+ f=nlGetVariable(0,index);
+ bp->impdv[2] = f; index++;
+ }
+ /*
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+ f=nlGetVariable(0,index);
+ bp->impdx[0] = f; index++;
+ f=nlGetVariable(0,index);
+ bp->impdx[1] = f; index++;
+ f=nlGetVariable(0,index);
+ bp->impdx[2] = f; index++;
+ }
+ */
+ }
+ else{
+ printf("Matrix inversion failed \n");
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+ VECCOPY(bp->impdv,bp->force);
+ }
+
+ }
+
+ //sct=PIL_check_seconds_timer();
+ //if (sct-sst > 0.01f) printf(" implicit solver time %f %s \r",sct-sst,ob->id.name);
+ }
/* cleanup */
+
if(do_effector) pdEndEffectors(do_effector);
}
+static void softbody_apply_fake_implicit_forces(Object *ob, float forcetime, float *err, float *err_ref_pos,float *err_ref_vel)
+{
+ /* time evolution */
+ /* do semi implicit euler */
+ SoftBody *sb= ob->soft; /* is supposed to be there */
+ BodyPoint *bp;
+ float *perp,*perv;
+ float erp[3],erv[3],dx[3],dv[3],aabbmin[3],aabbmax[3],cm[3]={0.0f,0.0f,0.0f};
+ float timeovermass;
+ float maxerrpos= 0.0f,maxerrvel = 0.0f,maxerrvel2 = 0.0f;
+ int a,fuzzy=0;
+
+ forcetime *= sb_time_scale(ob);
+
+ aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f;
+ aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f;
+
+ /* claim a minimum mass for vertex */
+ if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass;
+ else timeovermass = forcetime/0.009999f;
+ /* step along error reference vector */
+ perp =err_ref_pos;
+ perv =err_ref_vel;
+
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+ /* step along error reference vector */
+ if(perp) {VECCOPY(erp,perp);perp +=3;}
+ if(perv) {VECCOPY(erv,perv);perv +=3;}
+ if(bp->goal < SOFTGOALSNAP){
+
+ /* so here is (v)' = a(cceleration) = sum(F_springs)/m + gravitation + some friction forces + more forces*/
+ /* the ( ... )' operator denotes derivate respective time */
+ /* the "implicit" euler step for velocity then becomes */
+ /* v(t + dt) = v(t) + O * X(t) * dt */
+ /* O = [1-dt*dA/d(X)]^1 */
+ /* with X = (a[n],v[n]) */
+ /* da/dv | da/dx */
+ /* dA/d(X) = ( ------------- )*/
+ /* dv/dv | dv/dx */
+ /* note!! we did not solve any implicit system but looking forward more or less smart
+ what a implicit solution may look like by means of taylor expansion */
+ VECCOPY(dx,bp->vec);
+
+ bp->force[0]= timeovermass * bp->impdv[0]; /* individual mass of node here */
+ bp->force[1]= timeovermass * bp->impdv[1];
+ bp->force[2]= timeovermass * bp->impdv[2];
+ VECCOPY(dv,bp->force);
+ if(perv){
+ maxerrvel = MAX2(maxerrvel,ABS(dv[0] - erv[0]));
+ maxerrvel = MAX2(maxerrvel,ABS(dv[1] - erv[1]));
+ maxerrvel = MAX2(maxerrvel,ABS(dv[2] - erv[2]));
+ }
+
+ maxerrvel2 = MAX2(maxerrvel2,ABS(dv[0]));
+ maxerrvel2 = MAX2(maxerrvel2,ABS(dv[1]));
+ maxerrvel2 = MAX2(maxerrvel2,ABS(dv[2]));
+
+ VECADD(bp->vec, bp->vec, dv);
-static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *err)
+ /* so here is (x)'= v(elocity) */
+ /* the euler step for location then becomes */
+ /* x(t + dt) = x(t) + v(t) * dt */
+
+// VECCOPY(dx,bp->vec);
+
+ dx[0]*=forcetime;
+ dx[1]*=forcetime;
+ dx[2]*=forcetime;
+
+ /* bp->choke is set when we need to pull a vertex or edge out of the collider.
+ the collider object signals to get out by pushing hard. on the other hand
+ we don't want to end up in deep space so we add some <viscosity>
+ to balance that out */
+ if (bp->choke > 0.0f){
+ dx[0]*=(1.0f - bp->choke);
+ dx[1]*=(1.0f - bp->choke);
+ dx[2]*=(1.0f - bp->choke);
+ }
+ if (bp->choke2 > 0.0f){
+ dx[0]*=(1.0f - bp->choke2);
+ dx[1]*=(1.0f - bp->choke2);
+ dx[2]*=(1.0f - bp->choke2);
+ }
+
+
+ /* should be possible to get more out of the matrix inversion
+ but not verified yet
+ dx[0]*=forcetime*forcetime*bp->impdx[0];
+ dx[1]*=forcetime*forcetime*bp->impdx[1];
+ dx[2]*=forcetime*forcetime*bp->impdx[2];
+ */
+ VECADD(bp->pos, bp->pos, dx);
+ if (perp){
+ maxerrpos = MAX2(maxerrpos,ABS(bp->pos[0]-erp[0]));
+ maxerrpos = MAX2(maxerrpos,ABS(bp->pos[1]-erp[1]));
+ maxerrpos = MAX2(maxerrpos,ABS(bp->pos[2]-erp[2]));
+ }
+
+
+ }/*snap*/
+ /* so while we are looping BPs anyway do statistics on the fly */
+ aabbmin[0] = MIN2(aabbmin[0],bp->pos[0]);
+ aabbmin[1] = MIN2(aabbmin[1],bp->pos[1]);
+ aabbmin[2] = MIN2(aabbmin[2],bp->pos[2]);
+ aabbmax[0] = MAX2(aabbmax[0],bp->pos[0]);
+ aabbmax[1] = MAX2(aabbmax[1],bp->pos[1]);
+ aabbmax[2] = MAX2(aabbmax[2],bp->pos[2]);
+ if (bp->flag & SBF_DOFUZZY) fuzzy =1;
+ } /*for*/
+
+ if (sb->totpoint) VecMulf(cm,1.0f/sb->totpoint);
+ if (sb->scratch){
+ VECCOPY(sb->scratch->aabbmin,aabbmin);
+ VECCOPY(sb->scratch->aabbmax,aabbmax);
+ }
+
+ if (err){ /* so step size will be controlled by biggest difference in slope */
+ if (sb->solverflags & SBSO_OLDERR)
+ *err = MAX2(maxerrpos,maxerrvel);
+ else
+ if (perp) *err = maxerrpos;
+ else *err = maxerrvel2;
+ //printf("EP %f EV %f \n",maxerrpos,maxerrvel);
+ if (fuzzy){
+ *err /= sb->fuzzyness;
+ }
+ }
+}
+
+static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *err, int mid_flags)
{
/* time evolution */
/* actually does an explicit euler step mode == 0 */
@@ -2370,7 +2861,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
SoftBody *sb= ob->soft; /* is supposed to be there */
BodyPoint *bp;
float dx[3],dv[3],aabbmin[3],aabbmax[3],cm[3]={0.0f,0.0f,0.0f};
- float timeovermass;
+ float timeovermass,freezeloc=0.00001f,freezeforce=0.00000000001f;
float maxerrpos= 0.0f,maxerrvel = 0.0f;
int a,fuzzy=0;
@@ -2385,14 +2876,14 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
if(bp->goal < SOFTGOALSNAP){
+ /* this makes t~ = t */
+ if(mid_flags & MID_PRESERVE) VECCOPY(dx,bp->vec);
/* so here is (v)' = a(cceleration) = sum(F_springs)/m + gravitation + some friction forces + more forces*/
/* the ( ... )' operator denotes derivate respective time */
/* the euler step for velocity then becomes */
/* v(t + dt) = v(t) + a(t) * dt */
- bp->force[0]*= timeovermass; /* individual mass of node here */
- bp->force[1]*= timeovermass;
- bp->force[2]*= timeovermass;
+ VecMulf(bp->force,timeovermass);/* individual mass of node here */
/* some nasty if's to have heun in here too */
VECCOPY(dv,bp->force);
@@ -2413,14 +2904,23 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
}
else {VECADD(bp->vec, bp->vec, bp->force);}
+ /* this makes t~ = t+dt */
+ if(!(mid_flags & MID_PRESERVE)) VECCOPY(dx,bp->vec);
+
/* so here is (x)'= v(elocity) */
/* the euler step for location then becomes */
- /* x(t + dt) = x(t) + v(t) * dt */
-
- VECCOPY(dx,bp->vec);
- dx[0]*=forcetime;
- dx[1]*=forcetime;
- dx[2]*=forcetime;
+ /* x(t + dt) = x(t) + v(t~) * dt */
+ VecMulf(dx,forcetime);
+
+ /* the freezer */
+ if ((Inpf(dx,dx)<freezeloc )&&(Inpf(bp->force,bp->force)<freezeforce )){
+ bp->frozen /=2;
+ }
+ else{
+ bp->frozen =MIN2(bp->frozen*1.05f,1.0f);
+ }
+ VecMulf(dx,bp->frozen);
+
/* again some nasty if's to have heun in here too */
if (mode ==1){
VECCOPY(bp->prevpos,bp->pos);
@@ -2430,7 +2930,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
if (mode ==2){
bp->pos[0] = bp->prevpos[0] + 0.5f * ( dx[0] + bp->prevdx[0]);
bp->pos[1] = bp->prevpos[1] + 0.5f * ( dx[1] + bp->prevdx[1]);
- bp->pos[2] = bp->prevpos[2] + 0.5f* ( dx[2] + bp->prevdx[2]);
+ bp->pos[2] = bp->prevpos[2] + 0.5f * ( dx[2] + bp->prevdx[2]);
maxerrpos = MAX2(maxerrpos,ABS(dx[0] - bp->prevdx[0]));
maxerrpos = MAX2(maxerrpos,ABS(dx[1] - bp->prevdx[1]));
maxerrpos = MAX2(maxerrpos,ABS(dx[2] - bp->prevdx[2]));
@@ -2439,10 +2939,11 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
the collider object signals to get out by pushing hard. on the other hand
we don't want to end up in deep space so we add some <viscosity>
to balance that out */
+ if (bp->choke2 > 0.0f){
+ VecMulf(bp->vec,(1.0f - bp->choke2));
+ }
if (bp->choke > 0.0f){
- bp->vec[0] = bp->vec[0]*(1.0f - bp->choke);
- bp->vec[1] = bp->vec[1]*(1.0f - bp->choke);
- bp->vec[2] = bp->vec[2]*(1.0f - bp->choke);
+ VecMulf(bp->vec,(1.0f - bp->choke));
}
}
@@ -2489,6 +2990,79 @@ static void softbody_restore_prev_step(Object *ob)
}
}
+static void softbody_store_step(Object *ob)
+{
+ SoftBody *sb= ob->soft; /* is supposed to be there*/
+ BodyPoint *bp;
+ int a;
+
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+ VECCOPY(bp->prevvec,bp->vec);
+ VECCOPY(bp->prevpos,bp->pos);
+ }
+}
+
+
+/* used by predictors and correctors */
+static void softbody_store_state(Object *ob,float *ppos,float *pvel)
+{
+ SoftBody *sb= ob->soft; /* is supposed to be there*/
+ BodyPoint *bp;
+ int a;
+ float *pp=ppos,*pv=pvel;
+
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+
+ VECCOPY(pv, bp->vec);
+ pv+=3;
+
+ VECCOPY(pp, bp->pos);
+ pp+=3;
+ }
+}
+
+/* used by predictors and correctors */
+static void softbody_retrieve_state(Object *ob,float *ppos,float *pvel)
+{
+ SoftBody *sb= ob->soft; /* is supposed to be there*/
+ BodyPoint *bp;
+ int a;
+ float *pp=ppos,*pv=pvel;
+
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+
+ VECCOPY(bp->vec,pv);
+ pv+=3;
+
+ VECCOPY(bp->pos,pp);
+ pp+=3;
+ }
+}
+
+/* used by predictors and correctors */
+static void softbody_swap_state(Object *ob,float *ppos,float *pvel)
+{
+ SoftBody *sb= ob->soft; /* is supposed to be there*/
+ BodyPoint *bp;
+ int a;
+ float *pp=ppos,*pv=pvel;
+ float temp[3];
+
+ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+
+ VECCOPY(temp, bp->vec);
+ VECCOPY(bp->vec,pv);
+ VECCOPY(pv,temp);
+ pv+=3;
+
+ VECCOPY(temp, bp->pos);
+ VECCOPY(bp->pos,pp);
+ VECCOPY(pp,temp);
+ pp+=3;
+ }
+}
+
+
/* care for bodypoints taken out of the 'ordinary' solver step
** because they are screwed to goal by bolts
** they just need to move along with the goal in time
@@ -2509,6 +3083,30 @@ static void softbody_apply_goalsnap(Object *ob)
}
}
+
+void apply_spring_memory(Object *ob)
+{
+ SoftBody *sb = ob->soft;
+ BodySpring *bs;
+ BodyPoint *bp1, *bp2;
+ int a;
+ float b,l,r;
+
+ b = sb->plastic;
+ if (sb && sb->totspring){
+ for(a=0; a<sb->totspring; a++) {
+ bs = &sb->bspring[a];
+ bp1 =&sb->bpoint[bs->v1];
+ bp2 =&sb->bpoint[bs->v2];
+ l = VecLenf(bp1->pos,bp2->pos);
+ r = bs->len/l;
+ if (( r > 1.05f) || (r < 0.95)){
+ bs->len = ((100.0f - b) * bs->len + b*l)/100.0f;
+ }
+ }
+ }
+}
+
/* expects full initialized softbody */
static void interpolate_exciter(Object *ob, int timescale, int time)
{
@@ -2953,6 +3551,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)
{
@@ -2969,117 +3664,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, 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, 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)
@@ -3118,6 +3790,8 @@ SoftBody *sbNew(void)
sb->inspring= 0.5f;
sb->infrict= 0.5f;
+ /*todo backward file compat should copy inspring to inpush while reading old files*/
+ sb->inpush = 0.5f;
sb->interval= 10;
sb->sfra= G.scene->r.sfra;
@@ -3130,9 +3804,13 @@ SoftBody *sbNew(void)
sb->minloops = 10;
+ sb->maxloops = 300;
sb->choke = 3;
sb_new_scratch(sb);
+ /*todo backward file compat should set sb->shearstiff = 1.0f while reading old files*/
+ sb->shearstiff = 1.0f;
+ sb->solverflags |= SBSO_OLDERR;
return sb;
}
@@ -3175,15 +3853,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 dtime,ctime,forcetime;
+ 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 */
@@ -3194,7 +3871,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;
@@ -3220,6 +3903,10 @@ 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: */
@@ -3231,17 +3918,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);
@@ -3253,9 +3968,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);
@@ -3283,23 +4018,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) {
@@ -3315,8 +4049,10 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
}
- if (TRUE) { /* */
+ if (sb->solver_ID < 2) {
/* special case of 2nd order Runge-Kutta type AKA Heun */
+ int mid_flags=0;
+ float err = 0;
float forcetimemax = 1.0f;
float forcetimemin = 0.001f;
float timedone =0.0; /* how far did we get without violating error condition */
@@ -3328,7 +4064,8 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
if (sb->minloops > 0) forcetimemax = 1.0f / sb->minloops;
if (sb->maxloops > 0) forcetimemin = 1.0f / sb->maxloops;
-
+
+ if(sb->solver_ID>0) mid_flags |= MID_PRESERVE;
//forcetime = dtime; /* hope for integrating in one step */
forcetime =forcetimemax; /* hope for integrating in one step */
@@ -3339,13 +4076,13 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
sb->scratch->flag &= ~SBF_DOFUZZY;
/* do predictive euler step */
- softbody_calc_forces(ob, forcetime,timedone/dtime);
- softbody_apply_forces(ob, forcetime, 1, NULL);
+ softbody_calc_forces(ob, forcetime,timedone/dtime,0);
+ softbody_apply_forces(ob, forcetime, 1, NULL,mid_flags);
/* crop new slope values to do averaged slope step */
- softbody_calc_forces(ob, forcetime,timedone/dtime);
- softbody_apply_forces(ob, forcetime, 2, &err);
+ softbody_calc_forces(ob, forcetime,timedone/dtime,0);
+ softbody_apply_forces(ob, forcetime, 2, &err,mid_flags);
softbody_apply_goalsnap(ob);
@@ -3386,6 +4123,7 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
sct=PIL_check_seconds_timer();
if (sct-sst > 0.5f) printf("%3.0f%% \r",100.0f*timedone);
}
+ /* ask for user break */
if (SB_localInterruptCallBack && SB_localInterruptCallBack()) break;
}
@@ -3400,21 +4138,274 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
}
}
+ else if (sb->solver_ID == 2)
+ {
+ /* do semi "fake" implicit euler */
+ float *predict_vel=NULL,*predict_pos=NULL; /* for BDF style stepping */
+ NLContext *sb_nlc = NULL;
+ int npredict=0,predict_mem_size;
+ int nvar = 3*2*sb->totpoint;
+ int loops =0 ;
+ float forcetimemax = 1.0f; // this one needs 5 steps as a minimum
+ float forcetimemin = 0.001f;
+ float timedone =0.0; /* how far did we get without violating error condition */
+ /* loops = counter for emergency brake
+ * we don't want to lock up the system if physics fail
+ */
+ SoftHeunTol = sb->rklimit; /* humm .. this should be calculated from sb parameters and sizes */
+ if (sb->minloops > 0) forcetimemax = 1.0f / sb->minloops;
+ if (sb->maxloops > 0) forcetimemin = 1.0f / sb->maxloops;
+
+
+ forcetime =forcetimemax; /* hope for integrating as fast as possible */
+
+ //allocate predictor buffers
+ npredict =1;
+ predict_mem_size =3*sizeof(float)*npredict*sb->totpoint;
+ predict_pos = MEM_mallocN(predict_mem_size,"SB_predict_pos");
+ predict_vel = MEM_mallocN(predict_mem_size,"SB_predict_vel");
+
+
+ while ( (ABS(timedone) < ABS(dtime)) && (loops < 2000) ){
+ float loss_of_accuracy=0;
+ // create new solver context for this loop
+ sb_nlc = (NLContext*)nlNewContext();
+ /* hum it smells like threading trouble */
+ nlSolverParameteri(NL_NB_VARIABLES, nvar);
+ nlSolverParameteri(NL_LEAST_SQUARES, NL_FALSE);
+
+ interpolate_exciter(ob,200,(int)(200.0*(timedone/dtime)));
+ softbody_store_step(ob); /* used for rolling back step guessing */
+ softbody_store_state(ob,predict_pos,predict_vel);
+ softbody_calc_forces(ob, forcetime,timedone/dtime,NLF_BUILD|NLF_SOLVE);
+ // go full step
+ softbody_apply_fake_implicit_forces(ob, forcetime, NULL,NULL,NULL);
+
+ // restore old situation and store 1rst solution to predictors
+ softbody_swap_state(ob,predict_pos,predict_vel);
+ // the following is to find out how good we were
+ // may be we can do smarter
+ // so now using the forces and jacobian we calculated before
+ // go only 1/2
+ softbody_apply_fake_implicit_forces(ob, forcetime/2.0f, NULL,NULL,NULL);
+ // explore situation here without redoing the jacobian
+ softbody_calc_forces(ob, forcetime,timedone/dtime,NLF_SOLVE);
+ // go next 1/2
+ softbody_apply_fake_implicit_forces(ob, forcetime/2.0f,&loss_of_accuracy,predict_pos,predict_vel );
+ // now we have "loss_of_accuracy"
+
+ softbody_apply_goalsnap(ob);
+
+ if (loss_of_accuracy > SoftHeunTol) { /* error needs to be scaled to some quantity */
+
+ if (forcetime > forcetimemin){
+ forcetime = MAX2(forcetime / 2.0f,forcetimemin);
+ softbody_restore_prev_step(ob);
+ //printf("down,");
+ }
+ else {
+ timedone += forcetime;
+ }
+ }
+ else {
+ float newtime = forcetime * 1.5f; /* hope for 1.1 times better conditions in next step */
+ // all that 1/2 stepping was useless ... hum we know now ..
+ softbody_swap_state(ob,predict_pos,predict_vel);
+ if (0){//(sb->scratch->flag & SBF_DOFUZZY){
+ //if (err > SoftHeunTol/(2.0f*sb->fuzzyness)) { /* stay with this stepsize unless err really small */
+ newtime = forcetime;
+ //}
+ }
+ else {
+ if (loss_of_accuracy > SoftHeunTol/1.1f) { /* stay with this stepsize unless err really small */
+ newtime = forcetime;
+ }
+ }
+
+ timedone += forcetime;
+ newtime=MIN2(forcetimemax,MAX2(newtime,forcetimemin));
+ //if (newtime > forcetime) printf("up,");
+ if (forcetime > 0.0)
+ forcetime = MIN2(dtime - timedone,newtime);
+ else
+ forcetime = MAX2(dtime - timedone,newtime);
+ }
+ loops++;
+ // give away solver context within loop
+ if (sb_nlc)
+ {
+ if (sb_nlc != nlGetCurrent())printf("Aye NL context mismatch! in softbody.c !\n");
+ nlDeleteContext(sb_nlc);
+ sb_nlc = NULL;
+ }
+
+ if(sb->solverflags & SBSO_MONITOR ){
+ sct=PIL_check_seconds_timer();
+ if (sct-sst > 0.5f) printf("%3.0f%% \r",100.0f*timedone);
+ }
+
+ /* ask for user break */
+ if (SB_localInterruptCallBack && SB_localInterruptCallBack()) break;
+ }
+
+ // give away buffers
+ if (predict_pos) MEM_freeN(predict_pos);
+ if (predict_vel) MEM_freeN(predict_vel);
+
+ if(sb->solverflags & SBSO_MONITOR ){
+ if (loops > HEUNWARNLIMIT) /* monitor high loop counts */
+ printf("\r needed %d steps/frame ",loops);
+ }
+
+
+ }/*SOLVER SELECT*/
+ else if (sb->solver_ID == 4)
+ {
+ /* do semi "fake" implicit euler */
+ NLContext *sb_nlc = NULL;
+ int nvar = 3*2*sb->totpoint;
+ int loops =0 ;
+ float forcetimemax = 1.0f; // this one needs 5 steps as a minimum
+ float forcetimemin = 0.001f;
+ float timedone =0.0; /* how far did we get without violating error condition */
+ /* loops = counter for emergency brake
+ * we don't want to lock up the system if physics fail
+ */
+ SoftHeunTol = sb->rklimit; /* humm .. this should be calculated from sb parameters and sizes */
+ if (sb->minloops > 0) forcetimemax = 1.0f / sb->minloops;
+ if (sb->maxloops > 0) forcetimemin = 1.0f / sb->maxloops;
+
+
+ forcetime =forcetimemax; /* hope for integrating as fast as possible */
+ while ( (ABS(timedone) < ABS(dtime)) && (loops < 2000) ){
+ float loss_of_accuracy=0;
+ // create new solver context for this loop
+ sb_nlc = (NLContext*)nlNewContext();
+ /* hum it smells like threading trouble */
+ nlSolverParameteri(NL_NB_VARIABLES, nvar);
+ nlSolverParameteri(NL_LEAST_SQUARES, NL_FALSE);
+
+
+ interpolate_exciter(ob,200,(int)(200.0*(timedone/dtime)));
+ softbody_store_step(ob); /* used for rolling back step guessing */
+ softbody_calc_forces(ob, forcetime,timedone/dtime,NLF_BUILD|NLF_SOLVE);
+ softbody_apply_fake_implicit_forces(ob, forcetime,&loss_of_accuracy,NULL,NULL);
+ softbody_apply_goalsnap(ob);
+
+ if (loss_of_accuracy > SoftHeunTol) { /* error needs to be scaled to some quantity */
+
+ if (forcetime > forcetimemin){
+ forcetime = MAX2(forcetime / 2.0f,forcetimemin);
+ softbody_restore_prev_step(ob);
+ //printf("down,");
+ }
+ else {
+ timedone += forcetime;
+ }
+ }
+ else {
+ float newtime = forcetime * 1.1f; /* hope for 1.1 times better conditions in next step */
+ if (0){//(sb->scratch->flag & SBF_DOFUZZY){
+ //if (err > SoftHeunTol/(2.0f*sb->fuzzyness)) { /* stay with this stepsize unless err really small */
+ newtime = forcetime;
+ //}
+ }
+ else {
+ if (loss_of_accuracy > SoftHeunTol/2.0f) { /* stay with this stepsize unless err really small */
+ newtime = forcetime;
+ }
+ }
+
+ timedone += forcetime;
+ newtime=MIN2(forcetimemax,MAX2(newtime,forcetimemin));
+ //if (newtime > forcetime) printf("up,");
+ if (forcetime > 0.0)
+ forcetime = MIN2(dtime - timedone,newtime);
+ else
+ forcetime = MAX2(dtime - timedone,newtime);
+ }
+ loops++;
+ // give away solver context within loop
+ if (sb_nlc)
+ {
+ if (sb_nlc != nlGetCurrent())printf("Aye NL context mismatch! in softbody.c !\n");
+ nlDeleteContext(sb_nlc);
+ sb_nlc = NULL;
+ }
+
+ if(sb->solverflags & SBSO_MONITOR ){
+ sct=PIL_check_seconds_timer();
+ if (sct-sst > 0.5f) printf("%3.0f%% \r",100.0f*timedone);
+ }
+
+ /* ask for user break */
+ if (SB_localInterruptCallBack && SB_localInterruptCallBack()) break;
+ }
+
+
+ if(sb->solverflags & SBSO_MONITOR ){
+ if (loops > HEUNWARNLIMIT) /* monitor high loop counts */
+ printf("\r needed %d steps/frame ",loops);
+ }
+
+
+ }/*SOLVER SELECT*/
+ else if (sb->solver_ID == 3){
+ /* do "stupid" semi "fake" implicit euler */
+ NLContext *sb_nlc = NULL;
+ int nvar = 3*2*sb->totpoint;
+ int loops =0 ;
+ float forcetimemax = 1.0f; // this one needs 5 steps as a minimum
+ float timedone =0.0; /* how far did we get without violating error condition */
+ /* loops = counter for emergency brake
+ * we don't want to lock up the system if physics fail
+ */
+ if (sb->minloops > 0) forcetimemax = 1.0f / sb->minloops;
+
+
+ forcetime =forcetimemax; /* hope for integrating as fast as possible */
+
+ while ( (ABS(timedone) < ABS(dtime)) && (loops < 2000) ){
+
+ sb_nlc = (NLContext*)nlNewContext();
+ /* hum it smells like threading trouble */
+ nlSolverParameteri(NL_NB_VARIABLES, nvar);
+ nlSolverParameteri(NL_LEAST_SQUARES, NL_FALSE);
+
+ interpolate_exciter(ob,200,(int)(200.0*(timedone/dtime)));
+ softbody_calc_forces(ob, forcetime,timedone/dtime,NLF_BUILD|NLF_SOLVE);
+ softbody_apply_fake_implicit_forces(ob, forcetime, NULL,NULL,NULL);
+ softbody_apply_goalsnap(ob);
+ timedone += forcetime;
+ loops++;
+ if (sb_nlc)
+ {
+ if (sb_nlc != nlGetCurrent())printf("Aye NL context mismatch! in softbody.c !\n");
+ nlDeleteContext(sb_nlc);
+ sb_nlc = NULL;
+ }
+ /* ask for user break */
+ if (SB_localInterruptCallBack && SB_localInterruptCallBack()) break;
+ }
+
+
+
+ }/*SOLVER SELECT*/
else{
- /* do brute force explicit euler */
- /* removed but left this branch for better integrators / solvers (BM) */
- /* yah! Nicholas Guttenberg (NichG) here is the place to plug in */
- }
+ printf("softbody no valid solver ID!");
+ }/*SOLVER SELECT*/
+ if(sb->plastic){ apply_spring_memory(ob);}
+
if(sb->solverflags & SBSO_MONITOR ){
sct=PIL_check_seconds_timer();
if (sct-sst > 0.5f) printf(" solver time %f %s \r",sct-sst,ob->id.name);
}
}
- 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/texture.c b/source/blender/blenkernel/intern/texture.c
index d41ceb5a4b7..d4a085ff8bd 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;
}
@@ -405,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;
@@ -419,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;
@@ -510,6 +517,7 @@ void default_mtex(MTex *mtex)
mtex->norfac= 0.5;
mtex->varfac= 1.0;
mtex->dispfac=0.2;
+ mtex->normapspace= MTEX_NSPACE_TANGENT;
}
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 625ca57dbf3..8d3234475a4 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -98,12 +98,12 @@ World *add_world(char *name)
wrld->exp= 0.0f;
wrld->exposure=wrld->range= 1.0f;
- wrld->aodist= 5.0;
+ wrld->aodist= 5.0f;
wrld->aosamp= 5;
- wrld->aoenergy= 1.0;
- wrld->aobias= 0.05;
+ wrld->aoenergy= 1.0f;
+ wrld->aobias= 0.05f;
wrld->ao_samp_method = WO_AOSAMP_HAMMERSLEY;
-
+ wrld->ao_approx_error= 0.25f;
wrld->physicsEngine= WOPHY_BULLET;//WOPHY_SUMO; Bullet by default
wrld->preview = NULL;
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 34aa44e9357..cbaf1f8c605 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -355,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
diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h
index fc132250fc6..54999b1f72b 100644
--- a/source/blender/blenlib/BLI_arithb.h
+++ b/source/blender/blenlib/BLI_arithb.h
@@ -54,6 +54,12 @@ extern "C" {
#define M_SQRT1_2 0.70710678118654752440
#endif
+#ifdef WIN32
+ #ifndef FREE_WINDOWS
+ #define isnan(n) _isnan(n)
+ #endif
+#endif
+
#define MAT4_UNITY {{ 1.0, 0.0, 0.0, 0.0},\
{ 0.0, 1.0, 0.0, 0.0},\
{ 0.0, 0.0, 1.0, 0.0},\
@@ -119,6 +125,8 @@ 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);
@@ -126,7 +134,6 @@ 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 QuatCopy(float *q1, float *q2);
@@ -247,6 +254,7 @@ 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);
@@ -280,9 +288,15 @@ float AreaPoly3Dfl(int nr, float *verts, float *normal);
extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
+/*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]);
+
/* 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(
float vx, float vy,
@@ -356,9 +370,17 @@ 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];
@@ -370,7 +392,7 @@ typedef struct 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, float factor);
+void DQuatNormalize(DualQuat *dq, float totweight);
void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index 3306be76c47..4fc4241e6dc 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -107,11 +107,14 @@ 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_uniquename(struct ListBase *list, void *vlink, char defname[], short name_offs, short len);
void BLI_newname(char * name, int add);
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);
@@ -133,7 +136,8 @@ void BLI_dlist_reinit(struct DynamicList *dlist);
* converts it to a regular full path.
* Also removes garbage from directory paths, like /../ or double slashes etc
*/
-void BLI_cleanup_dir(const char *relabase, char *dir);
+void BLI_cleanup_file(const char *relabase, char *dir);
+void BLI_cleanup_dir(const char *relabase, char *dir); /* same as above but adds a trailing slash */
/**
* Blender's path code replacement function.
@@ -251,7 +255,7 @@ void BLI_free_file_lines(struct LinkNode *lines);
* @param fullname The full path and full name of the executable
* @param name The name of the executable (usually argv[0]) to be checked
*/
-void BLI_where_am_i(char *fullname, char *name);
+void BLI_where_am_i(char *fullname, const char *name);
/**
* determines the full path to the application bundle on OS X
@@ -268,6 +272,7 @@ int BLI_getInstallationDir(char *str);
/* BLI_storage.h */
int BLI_filesize(int file);
+int BLI_filepathsize(const char *path);
double BLI_diskfree(char *dir);
char *BLI_getwdN(char *dir);
void BLI_hide_dot_files(int set);
@@ -293,8 +298,8 @@ int BLI_rename(char *from, char *to);
int BLI_gzip(char *from, char *to);
int BLI_delete(char *file, int dir, int recursive);
int BLI_move(char *file, char *to);
-int BLI_touch(char *file);
-char *BLI_last_slash(char *string);
+int BLI_touch(const char *file);
+char *BLI_last_slash(const char *string);
/* BLI_rct.c */
/**
@@ -366,7 +371,7 @@ void BLI_setInterruptCallBack(int (*f)(void));
char *BLI_strcasestr(const char *s, const char *find);
int BLI_strcasecmp(const char *s1, const char *s2);
int BLI_strncasecmp(const char *s1, const char *s2, int n);
-void BLI_timestr(double time, char *str);
+void BLI_timestr(double _time, char *str); /* time var is global */
/**
* Trick to address 32 GB with an int (only for malloced pointers)
diff --git a/source/blender/blenlib/BLI_boxpack2d.h b/source/blender/blenlib/BLI_boxpack2d.h
index b5cf9cd81e9..50b864df5f8 100644
--- a/source/blender/blenlib/BLI_boxpack2d.h
+++ b/source/blender/blenlib/BLI_boxpack2d.h
@@ -28,10 +28,7 @@
* Contributor(s): Campbell Barton
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
- *
- * The old math stuff from Ton. These will slowly phase out in favour
- * of MTC calls. (or even MoTO :) )
- * */
+ */
/* Box Packer */
diff --git a/source/blender/blenlib/BLI_bpath.h b/source/blender/blenlib/BLI_bpath.h
new file mode 100644
index 00000000000..e932c39eb06
--- /dev/null
+++ b/source/blender/blenlib/BLI_bpath.h
@@ -0,0 +1,60 @@
+/**
+ *
+ * ***** 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): Campbell Barton
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/* Based on ghash, difference is ghash is not a fixed size,
+ * so for BPath we dont need to malloc */
+
+struct BPathIterator {
+ char* path;
+ char* lib;
+ char* name;
+ void* data;
+ int len;
+ int type;
+};
+
+void BLI_bpathIterator_init (struct BPathIterator *bpi);
+char* BLI_bpathIterator_getPath (struct BPathIterator *bpi);
+char* BLI_bpathIterator_getLib (struct BPathIterator *bpi);
+char* BLI_bpathIterator_getName (struct BPathIterator *bpi);
+int BLI_bpathIterator_getType (struct BPathIterator *bpi);
+int BLI_bpathIterator_getPathMaxLen(struct BPathIterator *bpi);
+void BLI_bpathIterator_step (struct BPathIterator *bpi);
+int BLI_bpathIterator_isDone (struct BPathIterator *bpi);
+void BLI_bpathIterator_copyPathExpanded( struct BPathIterator *bpi, char *path_expanded);
+
+/* high level funcs */
+
+/* creates a text file with missing files if there are any */
+void checkMissingFiles(char *txtname );
+void makeFilesRelative(char *txtname, int *tot, int *changed, int *failed, int *linked);
+void makeFilesAbsolute(char *txtname, int *tot, int *changed, int *failed, int *linked);
+void findMissingFiles(char *str);
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/source/blender/blenlib/BLI_kdtree.h b/source/blender/blenlib/BLI_kdtree.h
new file mode 100644
index 00000000000..d32e85c150c
--- /dev/null
+++ b/source/blender/blenlib/BLI_kdtree.h
@@ -0,0 +1,63 @@
+/**
+ * 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
+ * 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 *****
+ */
+
+#ifndef BLI_KDTREE_H
+#define BLI_KDTREE_H
+
+struct KDTree;
+typedef struct KDTree KDTree;
+
+typedef struct KDTreeNearest {
+ int index;
+ float dist;
+ float co[3];
+} KDTreeNearest;
+
+/* Creates or free a kdtree */
+KDTree* BLI_kdtree_new(int maxsize);
+void BLI_kdtree_free(KDTree *tree);
+
+/* 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);
+
+/* 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
+
diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h
index da2ecb79651..638f36b7414 100644
--- a/source/blender/blenlib/BLI_rand.h
+++ b/source/blender/blenlib/BLI_rand.h
@@ -52,6 +52,9 @@ double rng_getDouble (struct RNG* rng);
float rng_getFloat (struct RNG* rng);
void rng_shuffleArray(struct RNG *rng, void *data, int elemSize, int numElems);
+ /** Note that skipping is as slow as generating n numbers! */
+void rng_skip (struct RNG *rng, int n);
+
/** Seed the random number generator */
void BLI_srand (unsigned int seed);
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 4812cad033d..ac2f3235646 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -36,6 +36,13 @@ SET(INC
${ZLIB_INC}
)
+IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+SET(INC
+ ${INC}
+ ${BINRELOC_INC}
+)
+ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+
IF(WITH_VERSE)
ADD_DEFINITIONS(-DWITH_VERSE)
SET(INC ${INC} ${VERSE_INC})
diff --git a/source/blender/blenlib/SConscript b/source/blender/blenlib/SConscript
index e11934d968e..649d3cb5659 100644
--- a/source/blender/blenlib/SConscript
+++ b/source/blender/blenlib/SConscript
@@ -19,6 +19,7 @@ if env['WITH_BF_VERSE']:
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
incs += ' ' + env['BF_PTHREADS_INC']
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 5846bbda40e..6af377edfba 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -117,14 +117,16 @@ void BLI_ghash_insert(GHash *gh, void *key, void *val) {
}
}
-void* BLI_ghash_lookup(GHash *gh, void *key) {
- unsigned int hash= gh->hashfp(key)%gh->nbuckets;
- Entry *e;
-
- for (e= gh->buckets[hash]; e; e= e->next)
- if (gh->cmpfp(key, e->key)==0)
- return e->val;
-
+void* BLI_ghash_lookup(GHash *gh, void *key)
+{
+ if(gh) {
+ unsigned int hash= gh->hashfp(key)%gh->nbuckets;
+ Entry *e;
+
+ for (e= gh->buckets[hash]; e; e= e->next)
+ if (gh->cmpfp(key, e->key)==0)
+ return e->val;
+ }
return NULL;
}
diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c
new file mode 100644
index 00000000000..80e92cb8809
--- /dev/null
+++ b/source/blender/blenlib/intern/BLI_kdtree.c
@@ -0,0 +1,341 @@
+/**
+ * $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(co[root->d] < root->co[root->d]) {
+ if(root->right)
+ stack[cur++]=root->right;
+ if(root->left)
+ stack[cur++]=root->left;
+ }
+ else {
+ 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(co[root->d] < root->co[root->d]) {
+ if(root->right)
+ stack[cur++]=root->right;
+ if(root->left)
+ stack[cur++]=root->left;
+ }
+ else {
+ 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 68148a1eb37..9f40710209d 100644
--- a/source/blender/blenlib/intern/Makefile
+++ b/source/blender/blenlib/intern/Makefile
@@ -59,3 +59,6 @@ endif
ifeq ($(WITH_FREETYPE2), true)
CPPFLAGS += -DWITH_FREETYPE2
endif
+ifeq ($(OS),linux)
+ CPPFLAGS += -I$(OCGDIR)/extern/binreloc/include
+endif \ No newline at end of file
diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c
index f95d102763a..cf02fc67ec4 100644
--- a/source/blender/blenlib/intern/arithb.c
+++ b/source/blender/blenlib/intern/arithb.c
@@ -1109,6 +1109,7 @@ void QuatInv(float *q)
QuatMulf(q, 1.0f/f);
}
+/* simple mult */
void QuatMulf(float *q, float f)
{
q[0] *= f;
@@ -1124,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])
{
@@ -1196,7 +1211,7 @@ void QuatToMat4( float *q, float m[][4])
m[3][3]= 1.0f;
}
-void Mat3ToQuat( float wmat[][3], float *q) /* from Sig.Proc.85 pag 253 */
+void Mat3ToQuat(float wmat[][3], float *q)
{
double tr, s;
float mat[3][3];
@@ -1210,34 +1225,38 @@ void Mat3ToQuat( float wmat[][3], float *q) /* from Sig.Proc.85 pag 253 */
if(tr>FLT_EPSILON) {
s= sqrt( tr);
q[0]= (float)s;
- s*= 4.0;
- q[1]= (float)((mat[1][2]-mat[2][1])/s);
- q[2]= (float)((mat[2][0]-mat[0][2])/s);
- q[3]= (float)((mat[0][1]-mat[1][0])/s);
+ s= 1.0/(4.0*s);
+ q[1]= (float)((mat[1][2]-mat[2][1])*s);
+ q[2]= (float)((mat[2][0]-mat[0][2])*s);
+ q[3]= (float)((mat[0][1]-mat[1][0])*s);
}
else {
- q[0]= 0.0f;
- s= -0.5*(mat[1][1]+mat[2][2]);
-
- if(s>FLT_EPSILON) {
- s= sqrt(s);
- q[1]= (float)s;
- q[2]= (float)(mat[0][1]/(2*s));
- q[3]= (float)(mat[0][2]/(2*s));
+ if(mat[0][0] > mat[1][1] && mat[0][0] > mat[2][2]) {
+ s= 2.0*sqrtf(1.0 + mat[0][0] - mat[1][1] - mat[2][2]);
+ q[1]= (float)(0.25*s);
+
+ s= 1.0/s;
+ q[0]= (float)((mat[2][1] - mat[1][2])*s);
+ q[2]= (float)((mat[1][0] + mat[0][1])*s);
+ q[3]= (float)((mat[2][0] + mat[0][2])*s);
+ }
+ else if(mat[1][1] > mat[2][2]) {
+ s= 2.0*sqrtf(1.0 + mat[1][1] - mat[0][0] - mat[2][2]);
+ q[2]= (float)(0.25*s);
+
+ s= 1.0/s;
+ q[0]= (float)((mat[2][0] - mat[0][2])*s);
+ q[1]= (float)((mat[1][0] + mat[0][1])*s);
+ q[3]= (float)((mat[2][1] + mat[1][2])*s);
}
else {
- q[1]= 0.0f;
- s= 0.5*(1.0-mat[2][2]);
-
- if(s>FLT_EPSILON) {
- s= sqrt(s);
- q[2]= (float)s;
- q[3]= (float)(mat[1][2]/(2*s));
- }
- else {
- q[2]= 0.0f;
- q[3]= 1.0f;
- }
+ s= 2.0*sqrtf(1.0 + mat[2][2] - mat[0][0] - mat[1][1]);
+ q[3]= (float)(0.25*s);
+
+ s= 1.0/s;
+ q[0]= (float)((mat[1][0] - mat[0][1])*s);
+ q[1]= (float)((mat[2][0] + mat[0][2])*s);
+ q[2]= (float)((mat[2][1] + mat[1][2])*s);
}
}
NormalQuat(q);
@@ -1739,9 +1758,9 @@ void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight)
}
}
-void DQuatNormalize(DualQuat *dq, float totweight, float factor)
+void DQuatNormalize(DualQuat *dq, float totweight)
{
- float scale= factor/totweight;
+ float scale= 1.0f/totweight;
QuatMulf(dq->quat, scale);
QuatMulf(dq->trans, scale);
@@ -2406,6 +2425,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];
@@ -2506,7 +2617,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 *************** */
@@ -2974,6 +3131,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;
@@ -3253,6 +3415,8 @@ void tubemap(float x, float y, float z, float *u, float *v)
len= sqrt(x*x+y*y);
if(len>0) {
*u = (1.0 - (atan2(x/len,y/len) / M_PI)) / 2.0;
+ } else {
+ *v = *u = 0.0f; /* to avoid un-initialized variables */
}
}
@@ -3270,6 +3434,8 @@ void spheremap(float x, float y, float z, float *u, float *v)
z/=len;
*v = 1.0- saacos(z)/M_PI;
+ } else {
+ *v = *u = 0.0f; /* to avoid un-initialized variables */
}
}
@@ -3440,7 +3606,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];
@@ -3466,15 +3632,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;
@@ -3486,6 +3955,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])
{
@@ -3495,7 +3965,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])
{
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
new file mode 100644
index 00000000000..219ca424df8
--- /dev/null
+++ b/source/blender/blenlib/intern/bpath.c
@@ -0,0 +1,556 @@
+/**
+ *
+ * ***** 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): Campbell barton
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include "BLI_bpath.h"
+#include "BKE_global.h"
+#include "DNA_ID.h" /* Library */
+#include "DNA_vfont_types.h"
+#include "DNA_image_types.h"
+#include "DNA_sound_types.h"
+#include "DNA_scene_types.h" /* to get the current frame */
+#include <stdlib.h>
+#include <string.h>
+
+#include "BKE_main.h" /* so we can access G.main->*.first */
+#include "BKE_image.h" /* so we can check the image's type */
+
+#include "blendef.h"
+#include "BKE_utildefines.h"
+
+/* for writing to a textblock */
+#include "BKE_text.h"
+#include "BLI_blenlib.h"
+#include "DNA_text_types.h"
+
+/* path/file handeling stuff */
+#ifndef WIN32
+ #include <dirent.h>
+ #include <unistd.h>
+#else
+ #include "BLI_winstuff.h"
+ #include <io.h>
+#endif
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+#define FILE_MAX 240
+
+
+/* TODO - BPATH_PLUGIN, BPATH_SEQ */
+enum BPathTypes {
+ BPATH_IMAGE = 0,
+ BPATH_SOUND,
+ BPATH_FONT,
+ BPATH_LIB,
+
+ BPATH_DONE
+};
+
+
+void BLI_bpathIterator_init( struct BPathIterator *bpi ) {
+ bpi->type = BPATH_IMAGE;
+ bpi->data = NULL;
+ BLI_bpathIterator_step(bpi);
+}
+
+char* BLI_bpathIterator_getPath( struct BPathIterator *bpi) {
+ return bpi->path;
+}
+void BLI_bpathIterator_copyPathExpanded( struct BPathIterator *bpi, char *path_expanded) {
+ char *filepath, *libpath;
+
+ filepath = BLI_bpathIterator_getPath(bpi);
+ libpath = BLI_bpathIterator_getLib(bpi);
+
+ BLI_strncpy(path_expanded, filepath, FILE_MAXDIR*2);
+
+ if (libpath) { /* check the files location relative to its library path */
+ BLI_convertstringcode(path_expanded, libpath, G.scene->r.cfra);
+ } else { /* local data, use the blend files path */
+ BLI_convertstringcode(path_expanded, G.sce, G.scene->r.cfra);
+ }
+}
+char* BLI_bpathIterator_getLib( struct BPathIterator *bpi) {
+ return bpi->lib;
+}
+char* BLI_bpathIterator_getName( struct BPathIterator *bpi) {
+ return bpi->name;
+}
+int BLI_bpathIterator_getType( struct BPathIterator *bpi) {
+ return bpi->type;
+}
+int BLI_bpathIterator_getPathMaxLen( struct BPathIterator *bpi) {
+ return bpi->len;
+}
+
+/* gets the first or the next image that has a path - not a viewer node or generated image */
+static struct Image *ima_getpath__internal(struct Image *ima, int step_next) {
+ if (ima==NULL)
+ return NULL;
+
+ if (step_next)
+ ima = ima->id.next;
+
+ while (ima) {
+ if (ima->packedfile==NULL && ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
+ break;
+ /* image is not a image with a path, skip it */
+ ima = ima->id.next;
+ }
+ return ima;
+}
+
+static struct VFont *vf_getpath__internal(struct VFont *vf, int step_next) {
+ if (vf==NULL)
+ return NULL;
+
+ if (step_next)
+ vf = vf->id.next;
+
+ while (vf) {
+ if (vf->packedfile==NULL && BLI_streq(vf->name, "<builtin>")==0) {
+ break;
+ }
+
+ /* font with no path, skip it */
+ vf = vf->id.next;
+ }
+ return vf;
+}
+
+static struct bSound *snd_getpath__internal(struct bSound *snd, int step_next) {
+ if (snd==NULL)
+ return NULL;
+
+ if (step_next)
+ snd = snd->id.next;
+
+ while (snd) {
+ if (snd->packedfile==NULL) {
+ break;
+ }
+
+ /* font with no path, skip it */
+ snd = snd->id.next;
+ }
+ return snd;
+}
+
+void BLI_bpathIterator_step( struct BPathIterator *bpi) {
+ while (bpi->type != BPATH_DONE) {
+
+ if ((bpi->type) == BPATH_IMAGE) {
+ /*if (bpi->data) bpi->data = ((ID *)bpi->data)->next;*/
+ if (bpi->data) bpi->data = ima_getpath__internal( (Image *)bpi->data, 1 ); /* must skip images that have no path */
+ else bpi->data = ima_getpath__internal(G.main->image.first, 0);
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ Image *ima = (Image *)bpi->data;
+
+ bpi->lib = ima->id.lib ? ima->id.lib->filename : NULL;
+ bpi->path = ima->name;
+ bpi->name = ima->id.name+2;
+ bpi->len = sizeof(ima->name);
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+
+ } else {
+ bpi->type+=1; /* advance to the next type */
+ }
+
+
+ } else if ((bpi->type) == BPATH_SOUND) {
+ if (bpi->data) bpi->data = snd_getpath__internal( (bSound *)bpi->data, 1 ); /* must skip images that have no path */
+ else bpi->data = snd_getpath__internal(G.main->sound.first, 0);
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ bSound *snd = (bSound *)bpi->data;
+
+ bpi->lib = snd->id.lib ? snd->id.lib->filename : NULL;
+ bpi->path = snd->sample->name;
+ bpi->name = snd->id.name+2;
+ bpi->len = sizeof(snd->sample->name);
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+ } else {
+ bpi->type+=1; /* advance to the next type */
+ }
+
+
+ } else if ((bpi->type) == BPATH_FONT) {
+
+ if (bpi->data) bpi->data = vf_getpath__internal( (VFont *)bpi->data, 1 );
+ else bpi->data = vf_getpath__internal( G.main->vfont.first, 0 );
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ VFont *vf = (VFont *)bpi->data;
+
+ bpi->lib = vf->id.lib ? vf->id.lib->filename : NULL;
+ bpi->path = vf->name;
+ bpi->name = vf->id.name+2;
+ bpi->len = sizeof(vf->name);
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+ } else {
+ bpi->type+=1; /* advance to the next type */
+ }
+
+
+ } else if ((bpi->type) == BPATH_LIB) {
+
+ if (bpi->data) bpi->data = ((ID *)bpi->data)->next;
+ else bpi->data = G.main->library.first;
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ Library *lib = (Library *)bpi->data;
+
+ bpi->lib = NULL;
+ bpi->path = lib->name;
+ bpi->name = NULL;
+ bpi->len = sizeof(lib->name);
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+ } else {
+ bpi->type+=1; /* advance to the next type */
+ }
+ }
+ }
+}
+
+int BLI_bpathIterator_isDone( struct BPathIterator *bpi) {
+ return bpi->type==BPATH_DONE;
+}
+
+/* include the path argument */
+static void bpathToText(Text *btxt, struct BPathIterator *bpi)
+{
+ char *name;
+ char path_expanded[FILE_MAXDIR*2];
+
+ switch(BLI_bpathIterator_getType(bpi)) {
+ case BPATH_IMAGE:
+ txt_insert_buf( btxt, "Image \"" );
+ break;
+ case BPATH_SOUND:
+ txt_insert_buf( btxt, "Sound \"" );
+ break;
+ case BPATH_FONT:
+ txt_insert_buf( btxt, "Font \"" );
+ break;
+ case BPATH_LIB:
+ txt_insert_buf( btxt, "Library \"" );
+ break;
+ default:
+ txt_insert_buf( btxt, "Unknown \"" );
+ break;
+ }
+
+ name = BLI_bpathIterator_getName(bpi);
+
+ if (name) {
+ txt_insert_buf( btxt, name );
+ }
+ txt_insert_buf( btxt, "\" " );
+
+ BLI_bpathIterator_copyPathExpanded(bpi, path_expanded);
+
+ txt_insert_buf( btxt, path_expanded );
+ txt_insert_buf( btxt, "\n" );
+ txt_move_eof( btxt, 0 );
+}
+
+/* high level function */
+void checkMissingFiles( char *txtname ) {
+ Text *btxt = NULL;
+ struct BPathIterator bpi;
+
+ /* be sure there is low chance of the path being too short */
+ char filepath_expanded[FILE_MAXDIR*2];
+ char *filepath, *libpath;
+ int files_missing = 0;
+
+ BLI_bpathIterator_init(&bpi);
+ while (!BLI_bpathIterator_isDone(&bpi)) {
+ filepath = BLI_bpathIterator_getPath(&bpi);
+ libpath = BLI_bpathIterator_getLib(&bpi);
+
+ BLI_bpathIterator_copyPathExpanded( &bpi, filepath_expanded );
+
+ if (!BLI_exists(filepath_expanded)) {
+ if (!btxt) {
+ btxt = add_empty_text( "missing_files.log" );
+ if (txtname) {
+ BLI_strncpy(txtname, btxt->id.name+2, 24);
+ }
+ }
+ bpathToText(btxt, &bpi);
+ files_missing = 1;
+ }
+ BLI_bpathIterator_step(&bpi);
+ }
+}
+
+/* dont log any errors at the moment, should probably do this */
+void makeFilesRelative(char *txtname, int *tot, int *changed, int *failed, int *linked) {
+ struct BPathIterator bpi;
+ char *filepath, *libpath;
+
+ /* be sure there is low chance of the path being too short */
+ char filepath_relative[(FILE_MAXDIR * 2) + FILE_MAXFILE];
+
+ Text *btxt = NULL;
+
+ *tot = *changed = *failed = *linked = 0;
+
+ BLI_bpathIterator_init(&bpi);
+ while (!BLI_bpathIterator_isDone(&bpi)) {
+ filepath = BLI_bpathIterator_getPath(&bpi);
+ libpath = BLI_bpathIterator_getLib(&bpi);
+
+ if(strncmp(filepath, "//", 2)) {
+ if (libpath) { /* cant make relative if we are library - TODO, LOG THIS */
+ (*linked)++;
+ } else { /* local data, use the blend files path */
+ BLI_strncpy(filepath_relative, filepath, sizeof(filepath_relative));
+ /* Important BLI_cleanup_dir runs before the path is made relative
+ * because it wont work for paths that start with "//../" */
+ BLI_cleanup_file(G.sce, filepath_relative); /* fix any /foo/../foo/ */
+ BLI_makestringcode(G.sce, filepath_relative);
+ /* be safe and check the length */
+ if (BLI_bpathIterator_getPathMaxLen(&bpi) <= strlen(filepath_relative)) {
+ if (!btxt) {
+ btxt = add_empty_text( "missing_no_rel.log" );
+ if (txtname) {
+ BLI_strncpy(txtname, btxt->id.name+2, 24);
+ }
+ }
+ bpathToText(btxt, &bpi);
+ (*failed)++;
+ } else {
+ if(strncmp(filepath_relative, "//", 2)==0) {
+ strcpy(filepath, filepath_relative);
+ (*changed)++;
+ } else {
+ if (!btxt) {
+ btxt = add_empty_text( "missing_no_rel.log" );
+ if (txtname) {
+ BLI_strncpy(txtname, btxt->id.name+2, 24);
+ }
+ }
+ bpathToText(btxt, &bpi);
+ (*failed)++;
+ }
+ }
+ }
+ }
+ BLI_bpathIterator_step(&bpi);
+ (*tot)++;
+ }
+}
+
+/* dont log any errors at the moment, should probably do this -
+ * Verry similar to makeFilesRelative - keep in sync! */
+void makeFilesAbsolute(char *txtname, int *tot, int *changed, int *failed, int *linked) {
+ struct BPathIterator bpi;
+ char *filepath, *libpath;
+
+ /* be sure there is low chance of the path being too short */
+ char filepath_absolute[(FILE_MAXDIR * 2) + FILE_MAXFILE];
+
+ Text *btxt = NULL;
+
+ *tot = *changed = *failed = *linked = 0;
+
+ BLI_bpathIterator_init(&bpi);
+ while (!BLI_bpathIterator_isDone(&bpi)) {
+ filepath = BLI_bpathIterator_getPath(&bpi);
+ libpath = BLI_bpathIterator_getLib(&bpi);
+
+ if(strncmp(filepath, "//", 2)==0) {
+ if (libpath) { /* cant make absolute if we are library - TODO, LOG THIS */
+ (*linked)++;
+ } else { /* get the expanded path and check it is relative or too long */
+ BLI_bpathIterator_copyPathExpanded( &bpi, filepath_absolute );
+ BLI_cleanup_file(G.sce, filepath_absolute); /* fix any /foo/../foo/ */
+ /* to be safe, check the length */
+ if (BLI_bpathIterator_getPathMaxLen(&bpi) <= strlen(filepath_absolute)) {
+ if (!btxt) {
+ btxt = add_empty_text( "missing_no_abs.log" );
+ if (txtname) {
+ BLI_strncpy(txtname, btxt->id.name+2, 24);
+ }
+ }
+ bpathToText(btxt, &bpi);
+ (*failed)++;
+ } else {
+ if(strncmp(filepath_absolute, "//", 2)) {
+ strcpy(filepath, filepath_absolute);
+ (*changed)++;
+ } else {
+ if (!btxt) {
+ btxt = add_empty_text( "missing_no_abs.log" );
+ if (txtname) {
+ BLI_strncpy(txtname, btxt->id.name+2, 24);
+ }
+ }
+ bpathToText(btxt, &bpi);
+ (*failed)++;
+ }
+ }
+ }
+ }
+ BLI_bpathIterator_step(&bpi);
+ (*tot)++;
+ }
+}
+
+
+/* find this file recursively, use the biggest file so thumbnails dont get used by mistake
+ - dir: subdir to search
+ - filename: set this filename
+ - filesize: filesize for the file
+*/
+#define MAX_RECUR 16
+static int findFileRecursive(char *filename_new, const char *dirname, const char *filename, int *filesize, int *recur_depth)
+{
+ /* file searching stuff */
+ DIR *dir;
+ struct dirent *de;
+ struct stat status;
+ char path[FILE_MAX];
+ int size;
+
+ dir = opendir(dirname);
+
+ if (dir==0)
+ return 0;
+
+ if (*filesize == -1)
+ *filesize = 0; /* dir opened fine */
+
+ while ((de = readdir(dir)) != NULL) {
+
+ if (strncmp(".", de->d_name, 2)==0 || strncmp("..", de->d_name, 3)==0)
+ continue;
+
+ BLI_join_dirfile(path, dirname, de->d_name);
+
+ if (stat(path, &status) != 0)
+ continue; /* cant stat, dont bother with this file, could print debug info here */
+
+ if (S_ISREG(status.st_mode)) { /* is file */
+ if (strncmp(filename, de->d_name, FILE_MAX)==0) { /* name matches */
+ /* open the file to read its size */
+ size = BLI_filepathsize(path);
+ if ((size > 0) && (size > *filesize)) { /* find the biggest file */
+ *filesize = size;
+ BLI_strncpy(filename_new, path, FILE_MAX);
+ }
+ }
+ } else if (S_ISDIR(status.st_mode)) { /* is subdir */
+ if (*recur_depth <= MAX_RECUR) {
+ (*recur_depth)++;
+ findFileRecursive(filename_new, path, filename, filesize, recur_depth);
+ (*recur_depth)--;
+ }
+ }
+ }
+ closedir(dir);
+ return 1;
+}
+
+/* high level function - call from fileselector */
+void findMissingFiles(char *str) {
+ struct BPathIterator bpi;
+
+ /* be sure there is low chance of the path being too short */
+ char filepath_expanded[FILE_MAXDIR*2];
+ char *filepath, *libpath;
+ int filesize, recur_depth;
+
+ char dirname[FILE_MAX], filename[FILE_MAX], filename_new[FILE_MAX], dummyname[FILE_MAX];
+
+ BLI_split_dirfile(str, dirname, dummyname);
+
+ BLI_bpathIterator_init(&bpi);
+
+ while (!BLI_bpathIterator_isDone(&bpi)) {
+ filepath = BLI_bpathIterator_getPath(&bpi);
+ libpath = BLI_bpathIterator_getLib(&bpi);
+
+ if (libpath==NULL) {
+
+ BLI_bpathIterator_copyPathExpanded( &bpi, filepath_expanded );
+
+ if (!BLI_exists(filepath_expanded)) {
+ /* can the dir be opened? */
+ filesize = -1;
+ recur_depth = 0;
+ BLI_split_dirfile(filepath, dummyname, filename); /* the file to find */
+
+ findFileRecursive(filename_new, dirname, filename, &filesize, &recur_depth);
+ if (filesize == -1) { /* could not open dir */
+ printf("Could not open dir \"%s\"\n", dirname);
+ return;
+ }
+
+ if (filesize > 0) {
+
+ if (BLI_bpathIterator_getPathMaxLen( &bpi ) < strlen(filename_new)) {
+ printf("cannot set path \"%s\" too long!", filename_new);
+ } else {
+ /* copy the found path into the old one */
+ if (G.relbase_valid)
+ BLI_makestringcode(G.sce, filename_new);
+
+ strcpy( BLI_bpathIterator_getPath( &bpi ), filename_new );
+ }
+ }
+ }
+ }
+ BLI_bpathIterator_step(&bpi);
+ }
+}
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index fcea30982bd..2ee42d16176 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -79,7 +79,7 @@ char *first_slash(char *string) {
else return fbslash;
}
-char *BLI_last_slash(char *string) {
+char *BLI_last_slash(const char *string) {
char *lfslash, *lbslash;
lfslash= strrchr(string, '/');
@@ -140,6 +140,23 @@ int BLI_is_writable(char *filename)
}
}
+int BLI_touch(const char *file)
+{
+ FILE *f = fopen(file,"r+b");
+ if (f != NULL) {
+ char c = getc(f);
+ rewind(f);
+ putc(c,f);
+ } else {
+ f = fopen(file,"wb");
+ }
+ if (f) {
+ fclose(f);
+ return 1;
+ }
+ return 0;
+}
+
#ifdef WIN32
static char str[MAXPATHLEN+12];
@@ -161,12 +178,6 @@ int BLI_delete(char *file, int dir, int recursive) {
return err;
}
-int BLI_touch(char *file) {
- callLocalErrorCallBack("Touching files is unsupported on Windows");
-
- return 1;
-}
-
int BLI_move(char *file, char *to) {
int err;
@@ -296,17 +307,6 @@ int BLI_delete(char *file, int dir, int recursive)
return -1;
}
-int BLI_touch(char *file)
-{
-
- if( BLI_exists("/bin/touch") )
- sprintf(str, "/bin/touch %s", file);
- else
- sprintf(str, "/usr/bin/touch %s", file);
-
- return system(str);
-}
-
int BLI_move(char *file, char *to) {
sprintf(str, "/bin/mv -f \"%s\" \"%s\"", file, to);
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/psfont.c b/source/blender/blenlib/intern/psfont.c
index 941bf4204a8..1fcb6653dc9 100644
--- a/source/blender/blenlib/intern/psfont.c
+++ b/source/blender/blenlib/intern/psfont.c
@@ -1949,7 +1949,7 @@ static VFontData *objfnt_to_vfontdata(objfnt *fnt)
chardesc *cd;
short *_data, *data;
int a, i, count, stop, ready, meet;
- short first[2], last[2];
+ short first[2]={0,0}, last[2]={0,0};
struct Nurb *nu;
struct BezTriple *bezt, *bez2;
float scale, dx, dy;
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index df01288aab8..71df0ede037 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -116,6 +116,14 @@ void rng_shuffleArray(RNG *rng, void *data, int elemSize, int numElems)
free(temp);
}
+void rng_skip(RNG *rng, int n)
+{
+ int i;
+
+ for(i=0; i<n; i++)
+ rng_getInt(rng);
+}
+
/***/
static RNG theBLI_rng = {0};
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index 1d46679cbf2..5902b7dd68a 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -50,7 +50,9 @@
#include <time.h>
#include <sys/stat.h>
-#if !defined(linux) && (defined(__sgi) || defined(__sun__) || defined(__sun) || defined(__sparc) || defined(__sparc__))
+#if defined (__sun__) || defined (__sun)
+#include <sys/statvfs.h> /* Other modern unix os's should probably use this also */
+#elif !defined(linux) && (defined(__sgi) || defined(__sparc) || defined(__sparc__))
#include <sys/statfs.h>
#endif
@@ -179,7 +181,12 @@ double BLI_diskfree(char *dir)
return (double) (freec*bytesps*sectorspc);
#else
+
+#if defined (__sun__) || defined (__sun)
+ struct statvfs disk;
+#else
struct statfs disk;
+#endif
char name[FILE_MAXDIR],*slash;
int len = strlen(dir);
@@ -199,12 +206,12 @@ double BLI_diskfree(char *dir)
#ifdef __BeOS
return -1;
#endif
-#if !defined(linux) && (defined (__sgi) || defined (__sun__) || defined (__sun) || defined(__sparc) || defined(__sparc__))
- if (statfs(name, &disk, sizeof(struct statfs), 0)){
- /* printf("diskfree: Couldn't get information about %s.\n",dir); */
- return(-1);
- }
+#if defined (__sun__) || defined (__sun)
+ if (statvfs(name, &disk)) return(-1);
+#elif !defined(linux) && (defined (__sgi) || defined(__sparc) || defined(__sparc__))
+ /* WARNING - This may not be supported by geeneric unix os's - Campbell */
+ if (statfs(name, &disk, sizeof(struct statfs), 0)) return(-1);
#endif
return ( ((double) disk.f_bsize) * ((double) disk.f_bfree));
@@ -472,6 +479,17 @@ int BLI_filesize(int file)
return (buf.st_size);
}
+int BLI_filepathsize(const char *path)
+{
+ int size, file = open(path, O_BINARY|O_RDONLY);
+
+ if (file <= 0)
+ return -1;
+
+ size = BLI_filesize(file);
+ close(file);
+ return size;
+}
int BLI_exist(char *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 f5ba3c34b18..d0f58a50eb9 100644
--- a/source/blender/blenlib/intern/util.c
+++ b/source/blender/blenlib/intern/util.c
@@ -84,6 +84,10 @@
#include <CoreFoundation/CoreFoundation.h>
#endif
+#ifdef __linux__
+#include "binreloc.h"
+#endif
+
/* local */
static int add_win32_extension(char *name);
@@ -216,6 +220,79 @@ void BLI_newname(char *name, int add)
BLI_stringenc(name, head, tail, digits, pic);
}
+/* little helper macro for BLI_uniquename */
+#ifndef GIVE_STRADDR
+ #define GIVE_STRADDR(data, offset) ( ((char *)data) + offset )
+#endif
+
+/* Generic function to set a unique name. It is only designed to be used in situations
+ * where the name is part of the struct, and also that the name is at most 128 chars long.
+ *
+ * For places where this is used, see constraint.c for example...
+ *
+ * name_offs: should be calculated using offsetof(structname, membername) macro from stddef.h
+ * len: maximum length of string (to prevent overflows, etc.)
+ * defname: the name that should be used by default if none is specified already
+ */
+void BLI_uniquename(ListBase *list, void *vlink, char defname[], short name_offs, short len)
+{
+ Link *link;
+ char tempname[128];
+ int number = 1, exists = 0;
+ char *dot;
+
+ /* Make sure length can be handled */
+ if ((len < 0) || (len > 128))
+ return;
+
+ /* See if we are given an empty string */
+ if (ELEM(NULL, vlink, defname))
+ return;
+
+ if (GIVE_STRADDR(vlink, name_offs) == '\0') {
+ /* give it default name first */
+ BLI_strncpy(GIVE_STRADDR(vlink, name_offs), defname, len);
+ }
+
+ /* See if we even need to do this */
+ if (list == NULL)
+ return;
+
+ for (link = list->first; link; link= link->next) {
+ if (link != vlink) {
+ if (!strcmp(GIVE_STRADDR(link, name_offs), GIVE_STRADDR(vlink, name_offs))) {
+ exists = 1;
+ break;
+ }
+ }
+ }
+ if (exists == 0)
+ return;
+
+ /* Strip off the suffix */
+ dot = strchr(GIVE_STRADDR(vlink, name_offs), '.');
+ if (dot)
+ *dot=0;
+
+ for (number = 1; number <= 999; number++) {
+ BLI_snprintf(tempname, 128, "%s.%03d", GIVE_STRADDR(vlink, name_offs), number);
+
+ exists = 0;
+ for (link= list->first; link; link= link->next) {
+ if (vlink != link) {
+ if (!strcmp(GIVE_STRADDR(link, name_offs), tempname)) {
+ exists = 1;
+ break;
+ }
+ }
+ }
+ if (exists == 0) {
+ BLI_strncpy(GIVE_STRADDR(vlink, name_offs), tempname, len);
+ return;
+ }
+ }
+}
+
void BLI_addhead(ListBase *listbase, void *vlink)
{
@@ -312,6 +389,70 @@ void BLI_insertlink(ListBase *listbase, void *vprevlink, void *vnewlink)
newlink->prev= prevlink;
}
+/* 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; current = next )
+ {
+ next = current->next;
+ previous = current->prev;
+
+ BLI_remlink(listbase, current);
+
+ while(previous && cmp(previous, current) == 1)
+ {
+ previous = previous->prev;
+ }
+
+ BLI_insertlinkafter(listbase, previous, current);
+ }
+ }
+}
+
+void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *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;
+
+ 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;
@@ -713,6 +854,16 @@ int BLI_strcaseeq(char *a, char *b) {
void BLI_cleanup_dir(const char *relabase, char *dir)
{
+ BLI_cleanup_file(relabase, dir);
+#ifdef WIN32
+ strcat(dir, "\\");
+#else
+ strcat(dir, "/");
+#endif
+}
+
+void BLI_cleanup_file(const char *relabase, char *dir)
+{
short a;
char *start, *eind;
@@ -750,9 +901,7 @@ void BLI_cleanup_dir(const char *relabase, char *dir)
dir[a] = 0;
}
}
-
- strcat(dir, "\\");
-#else
+#else
if(dir[0]=='.') { /* happens, for example in FILE_MAIN */
dir[0]= '/';
dir[1]= 0;
@@ -786,8 +935,6 @@ void BLI_cleanup_dir(const char *relabase, char *dir)
if (a<=0) break;
}
}
-
- strcat(dir, "/");
#endif
}
@@ -953,6 +1100,7 @@ int BLI_convertstringcode(char *path, const char *basepath, int framenum)
return wasrelative;
}
+/* copy di to fi without directory only */
void BLI_splitdirstring(char *di, char *fi)
{
char *lslash= BLI_last_slash(di);
@@ -1205,26 +1353,28 @@ 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
@@ -1245,15 +1395,15 @@ 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)) ) {
@@ -1264,7 +1414,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);
}
}
@@ -1371,10 +1521,10 @@ static int add_win32_extension(char *name)
return (retval);
}
-void BLI_where_am_i(char *fullname, char *name)
+void BLI_where_am_i(char *fullname, const char *name)
{
char filename[FILE_MAXDIR+FILE_MAXFILE];
- char *path, *temp;
+ char *path = NULL, *temp;
int len;
#ifdef _WIN32
char *seperator = ";";
@@ -1384,6 +1534,17 @@ void BLI_where_am_i(char *fullname, char *name)
char *slash = "/";
#endif
+
+#ifdef __linux__
+ /* linux uses binreloc since argv[0] is not relyable, call br_init( NULL ) first */
+ path = br_find_exe( NULL );
+ if (path) {
+ strcpy(fullname, path);
+ return;
+ }
+#endif
+
+ /* unix and non linux */
if (name && fullname && strlen(name)) {
strcpy(fullname, name);
if (name[0] == '.') {
@@ -1554,13 +1715,13 @@ void BLI_string_to_utf8(char *original, char *utf_8, char *code)
}
#endif // WITH_ICONV
-void BLI_timestr(double time, char *str)
+void BLI_timestr(double _time, char *str)
{
/* format 00:00:00.00 (hr:min:sec) string has to be 12 long */
- int hr= ((int) time) / (60*60);
- int min= ( ((int) time) / 60 ) % 60;
- int sec= ((int) (time)) % 60;
- int hun= ((int) (time * 100.0)) % 100;
+ int hr= ( (int) _time) / (60*60);
+ int min= (((int) _time) / 60 ) % 60;
+ int sec= ( (int) (_time)) % 60;
+ int hun= ( (int) (_time * 100.0)) % 100;
if (hr) {
sprintf(str, "%.2d:%.2d:%.2d.%.2d",hr,min,sec,hun);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 4b588c690e0..e663bd35fa4 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -60,6 +60,7 @@
#include "DNA_actuator_types.h"
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_color_types.h"
#include "DNA_controller_types.h"
#include "DNA_constraint_types.h"
@@ -86,6 +87,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 +114,7 @@
#include "BKE_action.h"
#include "BKE_armature.h"
+#include "BKE_cloth.h"
#include "BKE_colortools.h"
#include "BKE_constraint.h"
#include "BKE_curve.h"
@@ -122,6 +125,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
@@ -129,10 +133,12 @@
#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"
#include "BKE_softbody.h" // sbNew()
+#include "BKE_sculpt.h"
#include "BKE_texture.h" // for open_plugin_tex
#include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND
#include "BKE_idprop.h"
@@ -144,8 +150,6 @@
#include "BLO_undofile.h"
#include "BLO_readblenfile.h" // streaming read pipe, for BLO_readblenfile BLO_readblenfilememory
-#include "multires.h"
-
#include "readfile.h"
#include "genfile.h"
@@ -476,7 +480,27 @@ static void cleanup_path(const char *relabase, char *name)
strcat(name, filename);
}
-static Main *blo_find_main(ListBase *mainlist, const char *name, const char *relabase)
+static void read_file_version(FileData *fd, Main *main)
+{
+ BHead *bhead;
+
+ for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
+ if (bhead->code==GLOB) {
+ FileGlobal *fg= read_struct(fd, bhead, "Global");
+ if(fg) {
+ main->subversionfile= fg->subversion;
+ main->minversionfile= fg->minversion;
+ main->minsubversionfile= fg->minsubversion;
+ MEM_freeN(fg);
+ }
+ else if (bhead->code==ENDB)
+ break;
+ }
+ }
+}
+
+
+static Main *blo_find_main(FileData *fd, ListBase *mainlist, const char *name, const char *relabase)
{
Main *m;
Library *lib;
@@ -505,6 +529,8 @@ static Main *blo_find_main(ListBase *mainlist, const char *name, const char *rel
m->curlib= lib;
+ read_file_version(fd, m);
+
if(G.f & G_DEBUG) printf("blo_find_main: added new lib %s\n", name);
return m;
}
@@ -701,8 +727,8 @@ BHead *blo_prevbhead(FileData *fd, BHead *thisblock)
BHead *blo_nextbhead(FileData *fd, BHead *thisblock)
{
- BHeadN *new_bhead = 0;
- BHead *bhead = 0;
+ BHeadN *new_bhead = NULL;
+ BHead *bhead = NULL;
if (thisblock) {
// bhead is actually a sub part of BHeadN
@@ -725,26 +751,6 @@ BHead *blo_nextbhead(FileData *fd, BHead *thisblock)
return(bhead);
}
-#if 0
-static void get_blender_subversion(FileData *fd)
-{
- BHead *bhead;
-
- for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
- if (bhead->code==GLOB) {
- FileGlobal *fg= read_struct(fd, bhead, "Global");
- fd->filesubversion= fg->subversion;
- fd->fileminversion= fg->minversion;
- fd->fileminsubversion= fg->minsubversion;
- MEM_freeN(fg);
- return;
- }
- else if (bhead->code==ENDB)
- break;
- }
-}
-#endif
-
static void decode_blender_header(FileData *fd)
{
char header[SIZEOFBLENDERHEADER], num[4];
@@ -1027,7 +1033,9 @@ void blo_freefiledata(FileData *fd)
oldnewmap_free(fd->imamap);
if (fd->libmap && !(fd->flags & FD_FLAGS_NOT_MY_LIBMAP))
oldnewmap_free(fd->libmap);
-
+ if (fd->bheadmap)
+ MEM_freeN(fd->bheadmap);
+
MEM_freeN(fd);
}
}
@@ -1520,6 +1528,22 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
link->tosock= newdataadr(fd, link->tosock);
}
+ /* set selin and selout */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) {
+ ntree->selin= sock;
+ break;
+ }
+ }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->flag & SOCK_SEL) {
+ ntree->selout= sock;
+ break;
+ }
+ }
+ }
+
/* type verification is in lib-link */
}
@@ -1616,13 +1640,18 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
if(con->data==NULL) {
con->type= CONSTRAINT_TYPE_NULL;
}
-
+ /* own ipo, all constraints have it */
+ con->ipo= newlibadr_us(fd, id->lib, con->ipo);
+
switch (con->type) {
case CONSTRAINT_TYPE_PYTHON:
{
- bPythonConstraint *data;
- data= (bPythonConstraint*)con->data;
- data->tar = newlibadr(fd, id->lib, data->tar);
+ 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);
}
@@ -1661,6 +1690,7 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
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:
@@ -1726,6 +1756,13 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
data->tar = newlibadr(fd, id->lib, data->tar);
}
break;
+ case CONSTRAINT_TYPE_DISTLIMIT:
+ {
+ bDistLimitConstraint *data;
+ data= ((bDistLimitConstraint*)con->data);
+ data->tar = newlibadr(fd, id->lib, data->tar);
+ }
+ break;
case CONSTRAINT_TYPE_NULL:
break;
}
@@ -1739,8 +1776,10 @@ 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);
}
@@ -1804,12 +1843,12 @@ static void lib_link_action(FileData *fd, Main *main)
while(act) {
if(act->id.flag & LIB_NEEDLINK) {
act->id.flag -= LIB_NEEDLINK;
-
+
for (chan=act->chanbase.first; chan; chan=chan->next) {
chan->ipo= newlibadr_us(fd, act->id.lib, chan->ipo);
lib_link_constraint_channels(fd, &act->id, &chan->constraintChannels);
}
-
+
}
act= act->id.next;
}
@@ -1832,12 +1871,24 @@ static void direct_link_bones(FileData *fd, Bone* bone)
static void direct_link_action(FileData *fd, bAction *act)
{
bActionChannel *achan;
+ bActionGroup *agrp;
link_list(fd, &act->chanbase);
+ link_list(fd, &act->groups);
+ link_list(fd, &act->markers);
- for (achan = act->chanbase.first; achan; achan=achan->next)
+ for (achan = act->chanbase.first; achan; achan=achan->next) {
+ achan->grp= newdataadr(fd, achan->grp);
+
link_list(fd, &achan->constraintChannels);
-
+ }
+
+ for (agrp = act->groups.first; agrp; agrp= agrp->next) {
+ if (agrp->channels.first) {
+ agrp->channels.first= newdataadr(fd, agrp->channels.first);
+ agrp->channels.last= newdataadr(fd, agrp->channels.last);
+ }
+ }
}
static void direct_link_armature(FileData *fd, bArmature *arm)
@@ -2446,6 +2497,84 @@ static void direct_link_material(FileData *fd, Material *ma)
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);
+ }
+ if(psys->particles && psys->particles->keys){
+ ParticleData *pa = psys->particles;
+ for(a=0; a<psys->totpart; a++, pa++)
+ pa->keys=newdataadr(fd,pa->keys);
+ }
+ 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 ***************** */
static void lib_link_mtface(FileData *fd, Mesh *me, MTFace *mtface, int totface)
@@ -2684,6 +2813,7 @@ static void lib_link_object(FileData *fd, Main *main)
ob->track= newlibadr(fd, ob->id.lib, ob->track);
ob->ipo= newlibadr_us(fd, ob->id.lib, ob->ipo);
ob->action = newlibadr_us(fd, ob->id.lib, ob->action);
+ ob->poselib= newlibadr_us(fd, ob->id.lib, ob->poselib);
ob->dup_group= newlibadr_us(fd, ob->id.lib, ob->dup_group);
ob->proxy= newlibadr_us(fd, ob->id.lib, ob->proxy);
@@ -2712,8 +2842,7 @@ static void lib_link_object(FileData *fd, Main *main)
else printf("Object %s lost data.", ob->id.name+2);
if(ob->pose) {
- free_pose_channels(ob->pose);
- MEM_freeN(ob->pose);
+ free_pose(ob->pose);
ob->pose= NULL;
ob->flag &= ~OB_POSEMODE;
}
@@ -2829,8 +2958,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;
@@ -2848,6 +2983,7 @@ static void direct_link_pose(FileData *fd, bPose *pose) {
return;
link_list(fd, &pose->chanbase);
+ link_list(fd, &pose->agroups);
for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) {
pchan->bone= NULL;
@@ -2857,7 +2993,6 @@ static void direct_link_pose(FileData *fd, bPose *pose) {
pchan->iktree.first= pchan->iktree.last= NULL;
pchan->path= NULL;
}
-
}
static void direct_link_modifiers(FileData *fd, ListBase *lb)
@@ -2877,7 +3012,46 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
SubsurfModifierData *smd = (SubsurfModifierData*) md;
smd->emCache = smd->mCache = 0;
- } else if (md->type==eModifierType_Hook) {
+ }
+ else if (md->type==eModifierType_Cloth) {
+ ClothModifierData *clmd = (ClothModifierData*) md;
+
+ clmd->clothObject = NULL;
+
+ clmd->sim_parms= newdataadr(fd, clmd->sim_parms);
+ clmd->coll_parms= newdataadr(fd, clmd->coll_parms);
+
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_LOADED;
+ clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_EDITMODE;
+
+ }
+ else if (md->type==eModifierType_Collision) {
+
+ CollisionModifierData *collmd = (CollisionModifierData*) md;
+ /*
+ // TODO: CollisionModifier should use pointcache
+ // + have proper reset events before enabling this
+ collmd->x = newdataadr(fd, collmd->x);
+ collmd->xnew = newdataadr(fd, collmd->xnew);
+ collmd->mfaces = newdataadr(fd, collmd->mfaces);
+
+ collmd->current_x = MEM_callocN(sizeof(MVert)*collmd->numverts,"current_x");
+ collmd->current_xnew = MEM_callocN(sizeof(MVert)*collmd->numverts,"current_xnew");
+ collmd->current_v = MEM_callocN(sizeof(MVert)*collmd->numverts,"current_v");
+ */
+
+ collmd->x = NULL;
+ collmd->xnew = NULL;
+ collmd->current_x = NULL;
+ collmd->current_xnew = NULL;
+ collmd->current_v = NULL;
+ collmd->time = -1;
+ collmd->numverts = 0;
+ collmd->tree = NULL;
+ collmd->mfaces = NULL;
+
+ }
+ else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
hmd->indexar= newdataadr(fd, hmd->indexar);
@@ -2887,6 +3061,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_psys_updated;
+ } 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])
+ }
}
}
}
@@ -2989,8 +3196,8 @@ static void direct_link_object(FileData *fd, Object *ob)
sb->bpoint= NULL; // init pointers so it gets rebuilt nicely
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) {
@@ -3007,6 +3214,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;
@@ -3180,7 +3390,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
Editing *ed;
Sequence *seq;
MetaStack *ms;
- StripElem *se;
int a;
sce->theDag = NULL;
@@ -3200,6 +3409,12 @@ static void direct_link_scene(FileData *fd, Scene *sce)
/* SculptData textures */
for(a=0; a<MAX_MTEX; ++a)
sce->sculptdata.mtex[a]= newdataadr(fd,sce->sculptdata.mtex[a]);
+ /* Sculpt intensity curve */
+ sce->sculptdata.cumap= newdataadr(fd, sce->sculptdata.cumap);
+ if(sce->sculptdata.cumap)
+ direct_link_curvemapping(fd, sce->sculptdata.cumap);
+ else
+ sculpt_reset_curve(&sce->sculptdata);
if(sce->ed) {
ListBase *old_seqbasep= &((Editing *)sce->ed)->seqbase;
@@ -3216,8 +3431,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);
@@ -3228,59 +3441,43 @@ 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;
- }
- }
+ seq->strip->tstripdata = 0;
+ seq->strip->tstripdata_startstill = 0;
+ seq->strip->tstripdata_endstill = 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->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;
- }
- }
+ if (seq->flag & SEQ_USE_CROP) {
+ seq->strip->crop = newdataadr(
+ fd, seq->strip->crop);
+ } else {
+ seq->strip->crop = 0;
}
- 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;
- }
- }
+ if (seq->flag & SEQ_USE_TRANSFORM) {
+ seq->strip->transform = newdataadr(
+ fd, seq->strip->transform);
+ } else {
+ seq->strip->transform = 0;
+ }
+ if (seq->flag & SEQ_USE_PROXY) {
+ seq->strip->proxy = newdataadr(
+ fd, seq->strip->proxy);
+ } else {
+ seq->strip->proxy = 0;
+ }
+ if (seq->flag & SEQ_USE_COLOR_BALANCE) {
+ seq->strip->color_balance = newdataadr(
+ fd, seq->strip->color_balance);
+ } else {
+ seq->strip->color_balance = 0;
}
- else if(seq->len>0)
- seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
-
}
}
END_SEQ
@@ -3339,6 +3536,7 @@ static void direct_link_scene(FileData *fd, Scene *sce)
}
link_list(fd, &(sce->markers));
+ link_list(fd, &(sce->transform_spaces));
link_list(fd, &(sce->r.layers));
sce->nodetree= newdataadr(fd, sce->nodetree);
@@ -3877,11 +4075,26 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
static void lib_link_library(FileData *fd, Main *main)
{
Library *lib;
-
- lib= main->library.first;
- while(lib) {
+ for(lib= main->library.first; lib; lib= lib->id.next) {
lib->id.us= 1;
- lib= lib->id.next;
+ }
+}
+
+/* Always call this once you havbe loaded new library data to set the relative paths correctly in relation to the blend file */
+static void fix_relpaths_library(const char *basepath, Main *main)
+{
+ Library *lib;
+ /* BLO_read_from_memory uses a blank filename */
+ if (basepath==NULL || basepath[0] == '\0')
+ return;
+
+ for(lib= main->library.first; lib; lib= lib->id.next) {
+ /* Libraries store both relative and abs paths, recreate relative paths,
+ * relative to the blend file since indirectly linked libs will be relative to their direct linked library */
+ if (strncmp(lib->name, "//", 2)==0) { /* if this is relative to begin with? */
+ strncpy(lib->name, lib->filename, sizeof(lib->name));
+ BLI_makestringcode(basepath, lib->name);
+ }
}
}
@@ -3979,6 +4192,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";
@@ -4115,6 +4329,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*/
@@ -5261,7 +5478,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)
@@ -5272,9 +5491,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;
@@ -5283,7 +5505,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
ob->track = 0;
}
-
+
ob = ob->id.next;
}
@@ -6509,29 +6731,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
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;
- /* Copy over old per-level multires vertex data
- into a single vertex array in struct Multires */
-
- for(me = main->mesh.first; me; me=me->id.next) {
- if(me->mr) {
- MultiresLevel *lvl = me->mr->levels.last;
- if(lvl) {
- me->mr->verts = lvl->verts;
- lvl->verts = NULL;
- /* Don't need the other vert arrays */
- for(lvl = lvl->prev; lvl; lvl = lvl->prev) {
- MEM_freeN(lvl->verts);
- lvl->verts = NULL;
- }
- }
- }
- }
-
/* correct older action editors - incorrect scrolling */
for(sc= main->screen.first; sc; sc= sc->id.next) {
ScrArea *sa;
@@ -6564,7 +6766,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
else
wrld->ao_samp_method = WO_AOSAMP_HAMMERSLEY;
- wrld->ao_adapt_thresh = 0.005;
+ wrld->ao_adapt_thresh = 0.005f;
}
for(la=main->lamp.first; la; la= la->id.next) {
@@ -6578,14 +6780,20 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
if(main->versionfile <= 245) {
+ Scene *sce;
bScreen *sc;
Object *ob;
Image *ima;
Lamp *la;
Material *ma;
+ ParticleSettings *part;
+ World *wrld;
+ Mesh *me;
/* unless the file was created 2.44.3 but not 2.45, update the constraints */
- if (!(main->versionfile==244 && main->subversionfile==3)) {
+ 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;
@@ -6610,14 +6818,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
curcon->ownspace = CONSTRAINT_SPACE_LOCAL;
}
break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data= (bStretchToConstraint *)curcon->data;
-
- /* force recalc of rest-length */
- data->orglength = 0;
- }
- break;
}
}
}
@@ -6649,14 +6849,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
curcon->tarspace = CONSTRAINT_SPACE_LOCAL;
}
break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data= (bStretchToConstraint *)curcon->data;
-
- /* force recalc of rest-length */
- data->orglength = 0;
- }
- break;
}
}
@@ -6720,6 +6912,23 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
+
+ /* Copy over old per-level multires vertex data
+ into a single vertex array in struct Multires */
+ for(me = main->mesh.first; me; me=me->id.next) {
+ if(me->mr && !me->mr->verts) {
+ MultiresLevel *lvl = me->mr->levels.last;
+ if(lvl) {
+ me->mr->verts = lvl->verts;
+ lvl->verts = NULL;
+ /* Don't need the other vert arrays */
+ for(lvl = lvl->prev; lvl; lvl = lvl->prev) {
+ MEM_freeN(lvl->verts);
+ lvl->verts = NULL;
+ }
+ }
+ }
+ }
if (main->versionfile != 245 || main->subversionfile < 1) {
for(la=main->lamp.first; la; la= la->id.next) {
@@ -6734,7 +6943,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
for(ma=main->mat.first; ma; ma= ma->id.next) {
- if (ma->samp_gloss_mir == 0) {
+ 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;
@@ -6742,30 +6951,75 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ma->dist_mir = 0.0;
ma->fadeto_mir = MA_RAYMIR_FADETOSKY;
}
+
+ if(ma->strand_min == 0.0f)
+ ma->strand_min= 1.0f;
+ }
+
+ for(part=main->particle.first; part; part=part->id.next) {
+ if(part->ren_child_nbr==0)
+ part->ren_child_nbr= part->child_nbr;
+
+ if(part->simplify_refsize==0) {
+ part->simplify_refsize= 1920;
+ part->simplify_rate= 1.0f;
+ part->simplify_transition= 0.1f;
+ part->simplify_viewport= 0.8f;
+ }
+ }
+
+ for(wrld=main->world.first; wrld; wrld= wrld->id.next) {
+ if(wrld->ao_approx_error == 0.0f)
+ wrld->ao_approx_error= 0.25f;
+ }
+
+ if (main->versionfile < 245 || main->subversionfile < 12)
+ {
+ /* initialize skeleton generation toolsettings */
+ for(sce=main->scene.first; sce; sce = sce->id.next)
+ {
+ sce->toolsettings->skgen_resolution = 50;
+ sce->toolsettings->skgen_threshold_internal = 0.01f;
+ sce->toolsettings->skgen_threshold_external = 0.01f;
+ sce->toolsettings->skgen_angle_limit = 45.0f;
+ sce->toolsettings->skgen_length_ratio = 1.3f;
+ sce->toolsettings->skgen_length_limit = 1.5f;
+ sce->toolsettings->skgen_correlation_limit = 0.98f;
+ sce->toolsettings->skgen_symmetry_limit = 0.1f;
+ sce->toolsettings->skgen_postpro = SKGEN_SMOOTH;
+ sce->toolsettings->skgen_postpro_passes = 1;
+ sce->toolsettings->skgen_options = SKGEN_FILTER_INTERNAL|SKGEN_FILTER_EXTERNAL|SKGEN_SUB_CORRELATION;
+ sce->toolsettings->skgen_subdivisions[0] = SKGEN_SUB_CORRELATION;
+ sce->toolsettings->skgen_subdivisions[1] = SKGEN_SUB_LENGTH;
+ sce->toolsettings->skgen_subdivisions[2] = SKGEN_SUB_ANGLE;
+ }
}
-
}
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 2)) {
- Image *ima;
+ 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)
+
+ 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)) {
@@ -6773,9 +7027,377 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
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--;
+ part->id.flag |= (ob->id.flag & LIB_NEEDLINK);
+
+ 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 = MIN2(paf->totpart, 100000);
+ 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;
+ }
+ }
+ }
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 9)) {
+ Material *ma;
+ int a;
+
+ for(ma=main->mat.first; ma; ma= ma->id.next)
+ if(ma->mode & MA_NORMAP_TANG)
+ for(a=0; a<MAX_MTEX; a++)
+ if(ma->mtex[a] && ma->mtex[a]->tex)
+ ma->mtex[a]->normapspace = MTEX_NSPACE_TANGENT;
+ }
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 10)) {
+ Object *ob;
+
+ /* dupliface scale */
+ for(ob= main->object.first; ob; ob= ob->id.next)
+ ob->dupfacesca = 1.0f;
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 11)) {
+ Object *ob;
+ bActionStrip *strip;
+
+ /* nla-strips - scale */
+ for (ob= main->object.first; ob; ob= ob->id.next) {
+ for (strip= ob->nlastrips.first; strip; strip= strip->next) {
+ float length, actlength, repeat;
+
+ if (strip->flag & ACTSTRIP_USESTRIDE)
+ repeat= 1.0f;
+ else
+ repeat= strip->repeat;
+
+ length = strip->end-strip->start;
+ if (length == 0.0f) length= 1.0f;
+ actlength = strip->actend-strip->actstart;
+
+ strip->scale = length / (repeat * actlength);
+ if (strip->scale == 0.0f) strip->scale= 1.0f;
+ }
+ if(ob->soft){
+ ob->soft->inpush = ob->soft->inspring;
+ ob->soft->shearstiff = 1.0f;
+ }
+ }
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 14)) {
+ Scene *sce= main->scene.first;
+ Sequence *seq;
+ Editing *ed;
+
+ while(sce) {
+ ed= sce->ed;
+ if(ed) {
+ WHILE_SEQ(&ed->seqbase) {
+ if (seq->blend_mode == 0) {
+ seq->blend_opacity = 100.0;
+ }
+ }
+ END_SEQ
+ }
+
+ sce= sce->id.next;
+ }
+ }
+
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
@@ -6810,6 +7432,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 */
@@ -6889,13 +7512,14 @@ BlendFileData *blo_read_file_internal(FileData *fd, BlendReadError *error_r)
/* do before read_libraries, but skip undo case */
// if(fd->memfile==NULL) (the mesh shuffle hacks don't work yet? ton)
do_versions(fd, NULL, bfd->main);
-
+
read_libraries(fd, &fd->mainlist);
blo_join_main(&fd->mainlist);
lib_link_all(fd, bfd->main);
lib_verify_nodetree(bfd->main);
+ fix_relpaths_library(fd->filename, bfd->main); /* make all relative paths, relative to the open blend file */
if(fg)
link_global(fd, bfd, fg); /* as last */
@@ -6908,6 +7532,43 @@ BlendFileData *blo_read_file_internal(FileData *fd, BlendReadError *error_r)
/* ************* APPEND LIBRARY ************** */
+struct bheadsort {
+ BHead *bhead;
+ void *old;
+};
+
+static int verg_bheadsort(const void *v1, const void *v2)
+{
+ const struct bheadsort *x1=v1, *x2=v2;
+
+ if( x1->old > x2->old) return 1;
+ else if( x1->old < x2->old) return -1;
+ return 0;
+}
+
+static void sort_bhead_old_map(FileData *fd)
+{
+ BHead *bhead;
+ struct bheadsort *bhs;
+ int tot= 0;
+
+ for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead))
+ tot++;
+
+ fd->tot_bheadmap= tot;
+ if(tot==0) return;
+
+ bhs= fd->bheadmap= MEM_mallocN(tot*sizeof(struct bheadsort), "bheadsort");
+
+ for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead), bhs++) {
+ bhs->bhead= bhead;
+ bhs->old= bhead->old;
+ }
+
+ qsort(fd->bheadmap, tot, sizeof(struct bheadsort), verg_bheadsort);
+
+}
+
static BHead *find_previous_lib(FileData *fd, BHead *bhead)
{
for (; bhead; bhead= blo_prevbhead(fd, bhead))
@@ -6919,14 +7580,28 @@ static BHead *find_previous_lib(FileData *fd, BHead *bhead)
static BHead *find_bhead(FileData *fd, void *old)
{
+#if 0
BHead *bhead;
-
+#endif
+ struct bheadsort *bhs, bhs_s;
+
if (!old)
return NULL;
+ if (fd->bheadmap==NULL)
+ sort_bhead_old_map(fd);
+
+ bhs_s.old= old;
+ bhs= bsearch(&bhs_s, fd->bheadmap, fd->tot_bheadmap, sizeof(struct bheadsort), verg_bheadsort);
+
+ if(bhs)
+ return bhs->bhead;
+
+#if 0
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead))
if (bhead->old==old)
return bhead;
+#endif
return NULL;
}
@@ -6967,7 +7642,7 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old)
if(bheadlib) {
Library *lib= read_struct(fd, bheadlib, "Library");
- Main *ptr= blo_find_main(&fd->mainlist, lib->name, fd->filename);
+ Main *ptr= blo_find_main(fd, &fd->mainlist, lib->name, fd->filename);
id= is_yet_read(fd, ptr, bhead);
@@ -7003,6 +7678,14 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old)
}
}
+static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSettings *part)
+{
+ expand_doit(fd, mainvar, part->dup_ob);
+ expand_doit(fd, mainvar, part->dup_group);
+ expand_doit(fd, mainvar, part->eff_group);
+ expand_doit(fd, mainvar, part->bb_ob);
+}
+
static void expand_ipo(FileData *fd, Main *mainvar, Ipo *ipo)
{
IpoCurve *icu;
@@ -7169,13 +7852,21 @@ static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb)
bConstraint *curcon;
for (curcon=lb->first; curcon; curcon=curcon->next) {
+
+ if (curcon->ipo)
+ expand_doit(fd, mainvar, curcon->ipo);
+
switch (curcon->type) {
case CONSTRAINT_TYPE_NULL:
break;
case CONSTRAINT_TYPE_PYTHON:
{
bPythonConstraint *data = (bPythonConstraint*)curcon->data;
- expand_doit(fd, mainvar, data->tar);
+ bConstraintTarget *ct;
+
+ for (ct= data->targets.first; ct; ct= ct->next)
+ expand_doit(fd, mainvar, ct->tar);
+
expand_doit(fd, mainvar, data->text);
}
break;
@@ -7208,6 +7899,7 @@ static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb)
{
bKinematicConstraint *data = (bKinematicConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
+ expand_doit(fd, mainvar, data->poletar);
}
break;
case CONSTRAINT_TYPE_TRACKTO:
@@ -7264,6 +7956,12 @@ static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb)
expand_doit(fd, mainvar, data->tar);
}
break;
+ case CONSTRAINT_TYPE_DISTLIMIT:
+ {
+ bDistLimitConstraint *data = (bDistLimitConstraint*)curcon->data;
+ expand_doit(fd, mainvar, data->tar);
+ }
+ break;
default:
break;
}
@@ -7337,6 +8035,17 @@ 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);
+ }
+ else if (md->type==eModifierType_Displace) {
+ DisplaceModifierData *dmd = (DisplaceModifierData*) md;
+
+ expand_doit(fd, mainvar, dmd->map_object);
+ expand_doit(fd, mainvar, dmd->texture);
+ }
}
static void expand_scriptlink(FileData *fd, Main *mainvar, ScriptLink *slink)
@@ -7351,6 +8060,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;
@@ -7362,6 +8072,7 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
expand_doit(fd, mainvar, ob->data);
expand_doit(fd, mainvar, ob->ipo);
expand_doit(fd, mainvar, ob->action);
+ expand_doit(fd, mainvar, ob->poselib);
for (md=ob->modifiers.first; md; md=md->next) {
expand_modifier(fd, mainvar, md);
@@ -7393,6 +8104,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++) {
@@ -7570,6 +8284,8 @@ static void expand_main(FileData *fd, Main *mainvar)
case ID_IP:
expand_ipo(fd, mainvar, (Ipo *)id);
break;
+ case ID_PA:
+ expand_particlesettings(fd, mainvar, (ParticleSettings *)id);
}
doit= 1;
@@ -7593,34 +8309,42 @@ static int object_in_any_scene(Object *ob)
}
/* when *lib set, it also does objects that were in the appended group */
-static void give_base_to_objects(Scene *sce, ListBase *lb, Library *lib)
+static void give_base_to_objects(Scene *sce, ListBase *lb, Library *lib, int is_group_append)
{
Object *ob;
Base *base;
/* give all objects which are LIB_INDIRECT a base, or for a group when *lib has been set */
for(ob= lb->first; ob; ob= ob->id.next) {
-
+
if( ob->id.flag & LIB_INDIRECT ) {
- int do_it= 0;
- if(ob->id.us==0)
- do_it= 1;
- else if(ob->id.us==1 && lib)
- if(ob->id.lib==lib && (ob->flag & OB_FROMGROUP) && object_in_any_scene(ob)==0)
+ /* IF below is quite confusing!
+ if we are appending, but this object wasnt just added allong with a group,
+ then this is alredy used indirectly in the scene somewhere else and we didnt just append it.
+
+ (ob->id.flag & LIB_APPEND_TAG)==0 means that this is a newly appended object - Campbell */
+ if (is_group_append==0 || (ob->id.flag & LIB_APPEND_TAG)==0) {
+
+ int do_it= 0;
+
+ if(ob->id.us==0)
do_it= 1;
+ else if(ob->id.us==1 && lib)
+ if(ob->id.lib==lib && (ob->flag & OB_FROMGROUP) && object_in_any_scene(ob)==0)
+ do_it= 1;
+
+ if(do_it) {
+ base= MEM_callocN( sizeof(Base), "add_ext_base");
+ BLI_addtail(&(sce->base), base);
+ base->lay= ob->lay;
+ base->object= ob;
+ base->flag= ob->flag;
+ ob->id.us= 1;
- if(do_it) {
- base= MEM_callocN( sizeof(Base), "add_ext_base");
- BLI_addtail(&(sce->base), base);
- base->lay= ob->lay;
- base->object= ob;
- base->flag= ob->flag;
- ob->id.us= 1;
-
- ob->id.flag -= LIB_INDIRECT;
- ob->id.flag |= LIB_EXTERN;
-
+ ob->id.flag -= LIB_INDIRECT;
+ ob->id.flag |= LIB_EXTERN;
+ }
}
}
}
@@ -7719,7 +8443,7 @@ static Library* library_append( Scene *scene, char* file, char *dir, int idcode,
blo_split_main(&fd->mainlist, G.main);
/* which one do we need? */
- mainl = blo_find_main(&fd->mainlist, dir, G.sce);
+ mainl = blo_find_main(fd, &fd->mainlist, dir, G.sce);
mainl->versionfile= fd->fileversion; /* needed for do_version */
@@ -7757,13 +8481,18 @@ static Library* library_append( Scene *scene, char* file, char *dir, int idcode,
lib_link_all(fd, G.main);
lib_verify_nodetree(G.main);
+ fix_relpaths_library(G.sce, G.main); /* make all relative paths, relative to the open blend file */
/* 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), (flag & FILE_LINK)?NULL:curlib);
- else
- give_base_to_objects(scene, &(G.main->object), NULL);
-
+ if(idcode==ID_GR) {
+ if (flag & FILE_LINK) {
+ give_base_to_objects(scene, &(G.main->object), NULL, 0);
+ } else {
+ give_base_to_objects(scene, &(G.main->object), curlib, 1);
+ }
+ } else {
+ give_base_to_objects(scene, &(G.main->object), NULL, 0);
+ }
/* has been removed... erm, why? s..ton) */
/* 20040907: looks like they are give base already in append_named_part(); -Nathan L */
/* 20041208: put back. It only linked direct, not indirect objects (ton) */
@@ -7928,6 +8657,9 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
mainptr->curlib->filedata= fd;
mainptr->versionfile= fd->fileversion;
+
+ /* subversion */
+ read_file_version(fd, mainptr);
}
else mainptr->curlib->filedata= NULL;
@@ -8009,10 +8741,10 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
if(mainptr->curlib->filedata) blo_freefiledata(mainptr->curlib->filedata);
mainptr->curlib->filedata= NULL;
-
}
}
+
/* reading runtime */
BlendFileData *blo_read_blendafterruntime(int file, int actualsize, BlendReadError *error_r)
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index 79392023a56..d8644ca52f2 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -37,6 +37,7 @@
struct OldNewMap;
struct MemFile;
+struct bheadsort;
typedef struct FileData {
// linked list of BHeadN's
@@ -76,6 +77,9 @@ typedef struct FileData {
struct OldNewMap *libmap;
struct OldNewMap *imamap;
+ struct bheadsort *bheadmap;
+ int tot_bheadmap;
+
ListBase mainlist;
/* ick ick, used to return
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 17860039f6f..d9766af6ba1 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -107,6 +107,7 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "DNA_actuator_types.h"
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_color_types.h"
#include "DNA_constraint_types.h"
#include "DNA_controller_types.h"
@@ -132,6 +133,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"
@@ -154,6 +156,7 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "BKE_action.h"
#include "BKE_bad_level_calls.h" // build_seqar (from WHILE_SEQ) free_oops error
#include "BKE_blender.h"
+#include "BKE_cloth.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
#include "BKE_constraint.h"
@@ -526,6 +529,50 @@ 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++)
+ writestruct(wd, DATA, "HairKey", pa->totkey, pa->hair);
+ }
+
+ if(psys->particles->keys) {
+ ParticleData *pa = psys->particles;
+
+ for(a=0; a<psys->totpart; a++, pa++)
+ writestruct(wd, DATA, "ParticleKey", pa->totkey, pa->keys);
+ }
+ }
+ 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;
@@ -701,74 +748,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_PYTHON:
- {
- bPythonConstraint *data = (bPythonConstraint*) con->data;
- writestruct(wd, DATA, "bPythonConstraint", 1, data);
-
- /* Write ID Properties -- and copy this comment EXACTLY for easy finding
- of library blocks that implement this.*/
- IDP_WriteProperty(data->prop, wd);
+ 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;
}
- break;
- case CONSTRAINT_TYPE_CHILDOF:
- writestruct(wd, DATA, "bChildOfConstraint", 1, con->data);
- 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;
- case CONSTRAINT_TYPE_TRANSFORM:
- writestruct(wd, DATA, "bTransformConstraint", 1, con->data);
- break;
- default:
- break;
}
+
/* Write the constraint */
writestruct(wd, DATA, "bConstraint", 1, con);
}
@@ -777,6 +782,7 @@ static void write_constraints(WriteData *wd, ListBase *conlist)
static void write_pose(WriteData *wd, bPose *pose)
{
bPoseChannel *chan;
+ bActionGroup *grp;
/* Write each channel */
if (!pose)
@@ -792,6 +798,10 @@ static void write_pose(WriteData *wd, bPose *pose)
writestruct(wd, DATA, "bPoseChannel", 1, chan);
}
+
+ /* Write groups */
+ for (grp=pose->agroups.first; grp; grp=grp->next)
+ writestruct(wd, DATA, "bActionGroup", 1, grp);
/* Write this pose */
writestruct(wd, DATA, "bPose", 1, pose);
@@ -822,21 +832,50 @@ 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_Cloth) {
+ ClothModifierData *clmd = (ClothModifierData*) md;
+
+ writestruct(wd, DATA, "SimulationSettings", 1, clmd->sim_parms);
+ writestruct(wd, DATA, "CollisionSettings", 1, clmd->coll_parms);
+
+ }
+ else if (md->type==eModifierType_Collision) {
+
+ /*
+ CollisionModifierData *collmd = (CollisionModifierData*) md;
+ // TODO: CollisionModifier should use pointcache
+ // + have proper reset events before enabling this
+ writestruct(wd, DATA, "MVert", collmd->numverts, collmd->x);
+ writestruct(wd, DATA, "MVert", collmd->numverts, collmd->xnew);
+ writestruct(wd, DATA, "MFace", collmd->numfaces, collmd->mfaces);
+ */
+ }
+ 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) {
@@ -872,17 +911,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;
@@ -1405,6 +1436,7 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
MetaStack *ms;
Strip *strip;
TimeMarker *marker;
+ TransformOrientation *ts;
SceneRenderLayer *srl;
int a;
@@ -1426,6 +1458,8 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
for(a=0; a<MAX_MTEX; ++a)
writestruct(wd, DATA, "MTex", 1, sce->sculptdata.mtex[a]);
+ if(sce->sculptdata.cumap)
+ write_curvemapping(wd, sce->sculptdata.cumap);
ed= sce->ed;
if(ed) {
@@ -1465,7 +1499,18 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
strip= seq->strip;
writestruct(wd, DATA, "Strip", 1, strip);
-
+ if(seq->flag & SEQ_USE_CROP && strip->crop) {
+ writestruct(wd, DATA, "StripCrop", 1, strip->crop);
+ }
+ if(seq->flag & SEQ_USE_TRANSFORM && strip->transform) {
+ writestruct(wd, DATA, "StripTransform", 1, strip->transform);
+ }
+ if(seq->flag & SEQ_USE_PROXY && strip->proxy) {
+ writestruct(wd, DATA, "StripProxy", 1, strip->proxy);
+ }
+ if(seq->flag & SEQ_USE_COLOR_BALANCE && strip->color_balance) {
+ writestruct(wd, DATA, "StripColorBalance", 1, strip->color_balance);
+ }
if(seq->type==SEQ_IMAGE)
writestruct(wd, DATA, "StripElem", strip->len, strip->stripdata);
else if(seq->type==SEQ_MOVIE || seq->type==SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND)
@@ -1499,6 +1544,10 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
for(marker= sce->markers.first; marker; marker= marker->next)
writestruct(wd, DATA, "TimeMarker", 1, marker);
+ /* writing dynamic list of TransformOrientations to the blend file */
+ for(ts = sce->transform_spaces.first; ts; ts = ts->next)
+ writestruct(wd, DATA, "TransformOrientation", 1, ts);
+
for(srl= sce->r.layers.first; srl; srl= srl->next)
writestruct(wd, DATA, "SceneRenderLayer", 1, srl);
@@ -1732,16 +1781,26 @@ static void write_actions(WriteData *wd, ListBase *idbase)
{
bAction *act;
bActionChannel *chan;
+ bActionGroup *grp;
+ TimeMarker *marker;
for(act=idbase->first; act; act= act->id.next) {
if (act->id.us>0 || wd->current) {
writestruct(wd, ID_AC, "bAction", 1, act);
if (act->id.properties) IDP_WriteProperty(act->id.properties, wd);
-
+
for (chan=act->chanbase.first; chan; chan=chan->next) {
writestruct(wd, DATA, "bActionChannel", 1, chan);
write_constraint_channels(wd, &chan->constraintChannels);
}
+
+ for (grp=act->groups.first; grp; grp=grp->next) {
+ writestruct(wd, DATA, "bActionGroup", 1, grp);
+ }
+
+ for (marker=act->markers.first; marker; marker=marker->next) {
+ writestruct(wd, DATA, "TimeMarker", 1, marker);
+ }
}
}
}
@@ -1790,7 +1849,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;
@@ -1942,6 +2001,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 f63f753e553..5eb52158a1a 100644
--- a/source/blender/blenpluginapi/iff.h
+++ b/source/blender/blenpluginapi/iff.h
@@ -209,6 +209,7 @@ LIBEXPORT void IMB_rectcpy(struct ImBuf *dbuf, struct ImBuf *sbuf,
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/ftfont/intern/Makefile b/source/blender/ftfont/intern/Makefile
index 064ec5dc597..4668241c5c8 100644
--- a/source/blender/ftfont/intern/Makefile
+++ b/source/blender/ftfont/intern/Makefile
@@ -47,6 +47,7 @@ CPPFLAGS += -I$(NAN_FTGL)/include
CPPFLAGS += -I$(NAN_FTGL)/include/FTGL
CPPFLAGS += -I$(NAN_GETTEXT)/include
CPPFLAGS += -I$(NAN_FREETYPE)/include
+CPPFLAGS += -I$(OPENGL_HEADERS)
ifeq ($(OS), windows)
CPPFLAGS += -I$(NAN_ICONV)/include
ifeq ($(FREE_WINDOWS), true)
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 4d91a82a58f..dbbddd2a070 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -547,6 +547,9 @@ void IMB_freezbuffloatImBuf(struct ImBuf * ibuf);
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);
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index a5d404740cf..bc750e455a6 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -280,6 +280,7 @@ short imb_addrectfloatImBuf(struct ImBuf * ibuf)
size = ibuf->x * ibuf->y;
size = size * 4 * sizeof(float);
+ ibuf->channels= 4;
if ( (ibuf->rect_float = MEM_mapallocN(size, "imb_addrectfloatImBuf")) ){
ibuf->mall |= IB_rectfloat;
@@ -445,7 +446,7 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1)
memcpy(ibuf2->rect, ibuf1->rect, x * y * sizeof(int));
if (flags & IB_rectfloat)
- memcpy(ibuf2->rect_float, ibuf1->rect_float, 4 * x * y * sizeof(float));
+ memcpy(ibuf2->rect_float, ibuf1->rect_float, ibuf1->channels * x * y * sizeof(float));
if (flags & IB_planes)
memcpy(*(ibuf2->planes),*(ibuf1->planes),ibuf1->depth * ibuf1->skipx * y * sizeof(int));
diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim.c
index e99c35e45ce..1700790c4fa 100644
--- a/source/blender/imbuf/intern/anim.c
+++ b/source/blender/imbuf/intern/anim.c
@@ -594,7 +594,7 @@ static int startffmpeg(struct anim * anim) {
anim->pFrame = avcodec_alloc_frame();
anim->pFrameRGB = avcodec_alloc_frame();
- if (avpicture_get_size(PIX_FMT_RGBA32, anim->x, anim->y)
+ if (avpicture_get_size(PIX_FMT_BGR32, anim->x, anim->y)
!= anim->x * anim->y * 4) {
fprintf (stderr,
"ffmpeg has changed alloc scheme ... ARGHHH!\n");
@@ -617,7 +617,7 @@ static int startffmpeg(struct anim * anim) {
anim->pCodecCtx->pix_fmt,
anim->pCodecCtx->width,
anim->pCodecCtx->height,
- PIX_FMT_RGBA,
+ PIX_FMT_BGR32,
SWS_FAST_BILINEAR | SWS_PRINT_INFO,
NULL, NULL, NULL);
@@ -637,7 +637,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
avpicture_fill((AVPicture *)anim->pFrameRGB,
(unsigned char*) ibuf->rect,
- PIX_FMT_RGBA32, anim->x, anim->y);
+ PIX_FMT_BGR32, anim->x, anim->y);
if (position != anim->curposition + 1) {
if (position > anim->curposition + 1
@@ -714,23 +714,98 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
if(frameFinished && pos_found == 1) {
- 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);
+ if (G.order == B_ENDIAN) {
+ 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], 0, 0, 0 };
+ int x,y,h,w;
+ unsigned char* bottom;
+ unsigned char* top;
+
+ sws_scale(anim->img_convert_ctx,
+ anim->pFrame->data,
+ anim->pFrame->linesize,
+ 0,
+ anim->pCodecCtx->height,
+ dst2,
+ dstStride2);
+
+ /* workaround: sws_scale
+ sets alpha = 0 and compensate
+ for altivec-bugs and flipy... */
+
+ bottom = (unsigned char*) ibuf->rect;
+ top = bottom
+ + ibuf->x * (ibuf->y-1) * 4;
+
+ h = (ibuf->y + 1) / 2;
+ w = ibuf->x;
+
+ for (y = 0; y < h; y++) {
+ unsigned char tmp[4];
+ unsigned long * tmp_l =
+ (unsigned long*) tmp;
+ tmp[3] = 0xff;
+
+ for (x = 0; x < w; x++) {
+ tmp[0] = bottom[3];
+ tmp[1] = bottom[2];
+ tmp[2] = bottom[1];
+
+ bottom[0] = top[3];
+ bottom[1] = top[2];
+ bottom[2] = top[1];
+ bottom[3] = 0xff;
+
+ *(unsigned long*) top
+ = *tmp_l;
+
+ bottom +=4;
+ top += 4;
+ }
+ top -= 8 * w;
+ }
- av_free_packet(&packet);
- break;
+ av_free_packet(&packet);
+ break;
+ } else {
+ 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 };
+ int i;
+ unsigned char* r;
+
+ sws_scale(anim->img_convert_ctx,
+ anim->pFrame->data,
+ anim->pFrame->linesize,
+ 0,
+ anim->pCodecCtx->height,
+ dst2,
+ dstStride2);
+
+ /* workaround: sws_scale
+ sets alpha = 0... */
+
+ r = (unsigned char*) ibuf->rect;
+
+ for (i = 0; i < ibuf->x * ibuf->y;i++){
+ r[3] = 0xff;
+ r+=4;
+ }
+
+ av_free_packet(&packet);
+ break;
+ }
}
}
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.cpp b/source/blender/imbuf/intern/dds/BlockDXT.cpp
index 5290a677678..24a090d93f6 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.cpp
+++ b/source/blender/imbuf/intern/dds/BlockDXT.cpp
@@ -64,7 +64,7 @@
BlockDXT1
----------------------------------------------------------------------------*/
-unsigned int BlockDXT1::evaluatePalette(Color32 color_array[4]) const
+uint BlockDXT1::evaluatePalette(Color32 color_array[4]) const
{
// Does bit expansion before interpolation.
color_array[0].b = (col0.b << 3) | (col0.b >> 2);
@@ -179,9 +179,9 @@ void BlockDXT1::decodeBlock(ColorBlock * block) const
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;
+ for( uint j = 0; j < 4; j++ ) {
+ for( uint i = 0; i < 4; i++ ) {
+ uint idx = (row[j] >> (2 * i)) & 3;
block->color(i, j) = color_array[idx];
}
}
@@ -190,7 +190,7 @@ void BlockDXT1::decodeBlock(ColorBlock * block) const
void BlockDXT1::setIndices(int * idx)
{
indices = 0;
- for(unsigned int i = 0; i < 16; i++) {
+ for(uint i = 0; i < 16; i++) {
indices |= (idx[i] & 3) << (2 * i);
}
}
@@ -199,16 +199,14 @@ void BlockDXT1::setIndices(int * idx)
/// Flip DXT1 block vertically.
inline void BlockDXT1::flip4()
{
- unsigned char tmp;
- swap(row[0], row[3], tmp);
- swap(row[1], row[2], tmp);
+ swap(row[0], row[3]);
+ swap(row[1], row[2]);
}
/// Flip half DXT1 block vertically.
inline void BlockDXT1::flip2()
{
- unsigned char tmp;
- swap(row[0], row[1], tmp);
+ swap(row[0], row[1]);
}
@@ -248,16 +246,14 @@ void AlphaBlockDXT3::decodeBlock(ColorBlock * block) const
/// Flip DXT3 alpha block vertically.
void AlphaBlockDXT3::flip4()
{
- unsigned short tmp;
- swap(row[0], row[3], tmp);
- swap(row[1], row[2], tmp);
+ swap(row[0], row[3]);
+ swap(row[1], row[2]);
}
/// Flip half DXT3 alpha block vertically.
void AlphaBlockDXT3::flip2()
{
- unsigned short tmp;
- swap(row[0], row[1], tmp);
+ swap(row[0], row[1]);
}
/// Flip DXT3 block vertically.
@@ -279,7 +275,7 @@ void BlockDXT3::flip2()
BlockDXT5
----------------------------------------------------------------------------*/
-void AlphaBlockDXT5::evaluatePalette(unsigned char alpha[8]) const
+void AlphaBlockDXT5::evaluatePalette(uint8 alpha[8]) const
{
if (alpha0 > alpha1) {
evaluatePalette8(alpha);
@@ -289,35 +285,35 @@ void AlphaBlockDXT5::evaluatePalette(unsigned char alpha[8]) const
}
}
-void AlphaBlockDXT5::evaluatePalette8(unsigned char alpha[8]) const
+void AlphaBlockDXT5::evaluatePalette8(uint8 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
+ alpha[2] = (6 * alpha[0] + 1 * alpha[1]) / 7; // bit code 010
+ alpha[3] = (5 * alpha[0] + 2 * alpha[1]) / 7; // bit code 011
+ alpha[4] = (4 * alpha[0] + 3 * alpha[1]) / 7; // bit code 100
+ alpha[5] = (3 * alpha[0] + 4 * alpha[1]) / 7; // bit code 101
+ alpha[6] = (2 * alpha[0] + 5 * alpha[1]) / 7; // bit code 110
+ alpha[7] = (1 * alpha[0] + 6 * alpha[1]) / 7; // bit code 111
}
-void AlphaBlockDXT5::evaluatePalette6(unsigned char alpha[8]) const
+void AlphaBlockDXT5::evaluatePalette6(uint8 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[2] = (4 * alpha[0] + 1 * alpha[1]) / 5; // Bit code 010
+ alpha[3] = (3 * alpha[0] + 2 * alpha[1]) / 5; // Bit code 011
+ alpha[4] = (2 * alpha[0] + 3 * alpha[1]) / 5; // Bit code 100
+ alpha[5] = (1 * alpha[0] + 4 * alpha[1]) / 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
+void AlphaBlockDXT5::indices(uint8 index_array[16]) const
{
index_array[0x0] = bits0;
index_array[0x1] = bits1;
@@ -337,52 +333,52 @@ void AlphaBlockDXT5::indices(unsigned char index_array[16]) const
index_array[0xF] = bitsF;
}
-unsigned int AlphaBlockDXT5::index(unsigned int index) const
+uint AlphaBlockDXT5::index(uint index) const
{
int offset = (3 * index + 16);
- return (this->u >> offset) & 0x7;
+ return uint((this->u >> offset) & 0x7);
}
-void AlphaBlockDXT5::setIndex(unsigned int index, unsigned int value)
+void AlphaBlockDXT5::setIndex(uint index, uint 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);
+ uint64 mask = uint64(0x7) << offset;
+ this->u = (this->u & ~mask) | (uint64(value) << offset);
}
void AlphaBlockDXT5::decodeBlock(ColorBlock * block) const
{
- unsigned char alpha_array[8];
+ uint8 alpha_array[8];
evaluatePalette(alpha_array);
- unsigned char index_array[16];
+ uint8 index_array[16];
indices(index_array);
- for(unsigned int i = 0; i < 16; i++) {
+ for(uint 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;
+ uint64 * b = (uint64 *)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;
+ uint64 tmp = (*b & (uint64)(0x000000000000FFFFLL));
+ tmp |= (*b & (uint64)(0x000000000FFF0000LL)) << 36;
+ tmp |= (*b & (uint64)(0x000000FFF0000000LL)) << 12;
+ tmp |= (*b & (uint64)(0x000FFF0000000000LL)) >> 12;
+ tmp |= (*b & (uint64)(0xFFF0000000000000LL)) >> 36;
*b = tmp;
}
void AlphaBlockDXT5::flip2()
{
- unsigned int * b = (unsigned int *)this;
+ uint * b = (uint *)this;
// @@ The masks might have to be byte swapped.
- unsigned int tmp = (*b & 0xFF000000);
+ uint tmp = (*b & 0xFF000000);
tmp |= (*b & 0x00000FFF) << 12;
tmp |= (*b & 0x00FFF000) >> 12;
@@ -396,6 +392,7 @@ void BlockDXT5::decodeBlock(ColorBlock * block) const
// Decode alpha.
alpha.decodeBlock(block);
+
}
/// Flip DXT5 block vertically.
@@ -416,13 +413,13 @@ void BlockDXT5::flip2()
/// Decode ATI1 block.
void BlockATI1::decodeBlock(ColorBlock * block) const
{
- unsigned char alpha_array[8];
+ uint8 alpha_array[8];
alpha.evaluatePalette(alpha_array);
- unsigned char index_array[16];
+ uint8 index_array[16];
alpha.indices(index_array);
- for(unsigned int i = 0; i < 16; i++) {
+ for(uint i = 0; i < 16; i++) {
Color32 & c = block->color(i);
c.b = c.g = c.r = alpha_array[index_array[i]];
c.a = 255;
@@ -445,13 +442,13 @@ void BlockATI1::flip2()
/// Decode ATI2 block.
void BlockATI2::decodeBlock(ColorBlock * block) const
{
- unsigned char alpha_array[8];
- unsigned char index_array[16];
+ uint8 alpha_array[8];
+ uint8 index_array[16];
x.evaluatePalette(alpha_array);
x.indices(index_array);
- for(unsigned int i = 0; i < 16; i++) {
+ for(uint i = 0; i < 16; i++) {
Color32 & c = block->color(i);
c.r = alpha_array[index_array[i]];
}
@@ -459,7 +456,7 @@ void BlockATI2::decodeBlock(ColorBlock * block) const
y.evaluatePalette(alpha_array);
y.indices(index_array);
- for(unsigned int i = 0; i < 16; i++) {
+ for(uint i = 0; i < 16; i++) {
Color32 & c = block->color(i);
c.g = alpha_array[index_array[i]];
c.b = 0;
@@ -481,6 +478,68 @@ void BlockATI2::flip2()
y.flip2();
}
+
+void BlockCTX1::evaluatePalette(Color32 color_array[4]) const
+{
+ // Does bit expansion before interpolation.
+ color_array[0].b = 0x00;
+ color_array[0].g = col0[1];
+ color_array[0].r = col0[0];
+ color_array[0].a = 0xFF;
+
+ color_array[1].r = 0x00;
+ color_array[1].g = col0[1];
+ color_array[1].b = col1[0];
+ color_array[1].a = 0xFF;
+
+ color_array[2].r = 0x00;
+ 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 = 0x00;
+ 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 BlockCTX1::decodeBlock(ColorBlock * block) const
+{
+ // Decode color block.
+ Color32 color_array[4];
+ evaluatePalette(color_array);
+
+ // Write color block.
+ for( uint j = 0; j < 4; j++ ) {
+ for( uint i = 0; i < 4; i++ ) {
+ uint idx = (row[j] >> (2 * i)) & 3;
+ block->color(i, j) = color_array[idx];
+ }
+ }
+}
+
+void BlockCTX1::setIndices(int * idx)
+{
+ indices = 0;
+ for(uint i = 0; i < 16; i++) {
+ indices |= (idx[i] & 3) << (2 * i);
+ }
+}
+
+
+/// Flip CTX1 block vertically.
+inline void BlockCTX1::flip4()
+{
+ swap(row[0], row[3]);
+ swap(row[1], row[2]);
+}
+
+/// Flip half CTX1 block vertically.
+inline void BlockCTX1::flip2()
+{
+ swap(row[0], row[1]);
+}
+
void mem_read(Stream & mem, BlockDXT1 & block)
{
mem_read(mem, block.col0.u);
@@ -521,3 +580,12 @@ void mem_read(Stream & mem, BlockATI2 & block)
mem_read(mem, block.y);
}
+void mem_read(Stream & mem, BlockCTX1 & block)
+{
+ mem_read(mem, block.col0[0]);
+ mem_read(mem, block.col0[1]);
+ mem_read(mem, block.col1[0]);
+ mem_read(mem, block.col1[1]);
+ mem_read(mem, block.indices);
+}
+
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.h b/source/blender/imbuf/intern/dds/BlockDXT.h
index 1f710360c3c..5c232201f0c 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.h
+++ b/source/blender/imbuf/intern/dds/BlockDXT.h
@@ -58,6 +58,7 @@
#ifndef _DDS_BLOCKDXT_H
#define _DDS_BLOCKDXT_H
+#include <Common.h>
#include <Color.h>
#include <ColorBlock.h>
#include <Stream.h>
@@ -68,14 +69,14 @@ struct BlockDXT1
Color16 col0;
Color16 col1;
union {
- unsigned char row[4];
- unsigned int indices;
+ uint8 row[4];
+ uint indices;
};
bool isFourColorMode() const;
- unsigned int evaluatePalette(Color32 color_array[4]) const;
- unsigned int evaluatePaletteFast(Color32 color_array[4]) const;
+ uint evaluatePalette(Color32 color_array[4]) const;
+ uint evaluatePaletteFast(Color32 color_array[4]) const;
void evaluatePalette3(Color32 color_array[4]) const;
void evaluatePalette4(Color32 color_array[4]) const;
@@ -90,7 +91,7 @@ struct BlockDXT1
/// Return true if the block uses four color mode, false otherwise.
inline bool BlockDXT1::isFourColorMode() const
{
- return col0.u >= col1.u; // @@ > or >= ?
+ return col0.u > col1.u;
}
@@ -99,24 +100,24 @@ 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;
+ uint alpha0 : 4;
+ uint alpha1 : 4;
+ uint alpha2 : 4;
+ uint alpha3 : 4;
+ uint alpha4 : 4;
+ uint alpha5 : 4;
+ uint alpha6 : 4;
+ uint alpha7 : 4;
+ uint alpha8 : 4;
+ uint alpha9 : 4;
+ uint alphaA : 4;
+ uint alphaB : 4;
+ uint alphaC : 4;
+ uint alphaD : 4;
+ uint alphaE : 4;
+ uint alphaF : 4;
};
- unsigned short row[4];
+ uint16 row[4];
};
void decodeBlock(ColorBlock * block) const;
@@ -163,16 +164,16 @@ struct AlphaBlockDXT5
unsigned int bitsE : 3; // 45 - 61
unsigned int bitsF : 3; // 48 - 64
};
- unsigned long long u;
+ uint64 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;
+ void evaluatePalette(uint8 alpha[8]) const;
+ void evaluatePalette8(uint8 alpha[8]) const;
+ void evaluatePalette6(uint8 alpha[8]) const;
+ void indices(uint8 index_array[16]) const;
- unsigned int index(unsigned int index) const;
- void setIndex(unsigned int index, unsigned int value);
+ uint index(uint index) const;
+ void setIndex(uint index, uint value);
void decodeBlock(ColorBlock * block) const;
@@ -216,6 +217,25 @@ struct BlockATI2
void flip2();
};
+/// CTX1 block.
+struct BlockCTX1
+{
+ uint8 col0[2];
+ uint8 col1[2];
+ union {
+ uint8 row[4];
+ uint indices;
+ };
+
+ void evaluatePalette(Color32 color_array[4]) const;
+ void setIndices(int * idx);
+
+ 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);
@@ -223,5 +243,6 @@ 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);
+void mem_read(Stream & mem, BlockCTX1 & block);
#endif // _DDS_BLOCKDXT_H
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.cpp b/source/blender/imbuf/intern/dds/ColorBlock.cpp
index 63997f93c8c..0199d15ada7 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.cpp
+++ b/source/blender/imbuf/intern/dds/ColorBlock.cpp
@@ -39,13 +39,13 @@
#include <Common.h>
// Get approximate luminance.
- inline static unsigned int colorLuminance(Color32 c)
+ inline static uint 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)
+ inline static uint 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);
}
@@ -59,22 +59,22 @@ 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++) {
+ for(uint 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)
+ColorBlock::ColorBlock(const Image * img, uint x, uint y)
{
init(img, x, y);
}
-void ColorBlock::init(const Image * img, unsigned int x, unsigned int y)
+void ColorBlock::init(const Image * img, uint x, uint y)
{
- const unsigned int bw = min(img->width() - x, 4U);
- const unsigned int bh = min(img->height() - y, 4U);
+ const uint bw = min(img->width() - x, 4U);
+ const uint bh = min(img->height() - y, 4U);
static int remainder[] = {
0, 0, 0, 0,
@@ -86,10 +86,10 @@ void ColorBlock::init(const Image * img, unsigned int x, unsigned int y)
// 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++) {
+ for(uint 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++) {
+ for(uint 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);
@@ -111,7 +111,7 @@ void ColorBlock::splatX()
{
for(int i = 0; i < 16; i++)
{
- unsigned char x = m_color[i].r;
+ uint8 x = m_color[i].r;
m_color[i] = Color32(x, x, x, x);
}
}
@@ -120,16 +120,16 @@ void ColorBlock::splatY()
{
for(int i = 0; i < 16; i++)
{
- unsigned char y = m_color[i].g;
+ uint8 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
+uint ColorBlock::countUniqueColors() const
{
- unsigned int count = 0;
+ uint count = 0;
// @@ This does not have to be o(n^2)
for(int i = 0; i < 16; i++)
@@ -152,17 +152,27 @@ unsigned int ColorBlock::countUniqueColors() const
/// Get average color of the block.
Color32 ColorBlock::averageColor() const
{
- unsigned int r, g, b, a;
+ uint r, g, b, a;
r = g = b = a = 0;
- for(unsigned int i = 0; i < 16; i++) {
+ for(uint 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));
+ return Color32(uint8(r / 16), uint8(g / 16), uint8(b / 16), uint8(a / 16));
+}
+
+/// Return true if the block is not fully opaque.
+bool ColorBlock::hasAlpha() const
+{
+ for (uint i = 0; i < 16; i++)
+ {
+ if (m_color[i].a != 255) return true;
+ }
+ return false;
}
@@ -170,11 +180,11 @@ Color32 ColorBlock::averageColor() const
void ColorBlock::diameterRange(Color32 * start, Color32 * end) const
{
Color32 c0, c1;
- unsigned int best_dist = 0;
+ uint 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]);
+ uint dist = colorDistance(m_color[i], m_color[j]);
if( dist > best_dist ) {
best_dist = dist;
c0 = m_color[i];
@@ -191,13 +201,13 @@ void ColorBlock::diameterRange(Color32 * start, Color32 * end) const
void ColorBlock::luminanceRange(Color32 * start, Color32 * end) const
{
Color32 minColor, maxColor;
- unsigned int minLuminance, maxLuminance;
+ uint minLuminance, maxLuminance;
maxLuminance = minLuminance = colorLuminance(m_color[0]);
- for(unsigned int i = 1; i < 16; i++)
+ for(uint i = 1; i < 16; i++)
{
- unsigned int luminance = colorLuminance(m_color[i]);
+ uint luminance = colorLuminance(m_color[i]);
if (luminance > maxLuminance) {
maxLuminance = luminance;
@@ -219,7 +229,7 @@ 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++)
+ for(uint 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; }
@@ -253,7 +263,7 @@ 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++)
+ for(uint 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; }
@@ -290,11 +300,11 @@ void ColorBlock::boundsRangeAlpha(Color32 * start, Color32 * end) const
void ColorBlock::sortColorsByAbsoluteValue()
{
// Dummy selection sort.
- for( unsigned int a = 0; a < 16; a++ ) {
- unsigned int max = a;
+ for( uint a = 0; a < 16; a++ ) {
+ uint max = a;
Color16 cmax(m_color[a]);
- for( unsigned int b = a+1; b < 16; b++ ) {
+ for( uint b = a+1; b < 16; b++ ) {
Color16 cb(m_color[b]);
if( cb.u > cmax.u ) {
@@ -302,9 +312,6 @@ void ColorBlock::sortColorsByAbsoluteValue()
cmax = cb;
}
}
- Color32 tmp;
- swap( m_color[a], m_color[max], tmp );
+ swap( m_color[a], m_color[max] );
}
}
-
-
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h
index eba372768ad..72049be5f3c 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.h
+++ b/source/blender/imbuf/intern/dds/ColorBlock.h
@@ -45,16 +45,17 @@ struct ColorBlock
{
ColorBlock();
ColorBlock(const ColorBlock & block);
- ColorBlock(const Image * img, unsigned int x, unsigned int y);
+ ColorBlock(const Image * img, uint x, uint y);
- void init(const Image * img, unsigned int x, unsigned int y);
+ void init(const Image * img, uint x, uint y);
void swizzleDXT5n();
void splatX();
void splatY();
- unsigned int countUniqueColors() const;
+ uint countUniqueColors() const;
Color32 averageColor() const;
+ bool hasAlpha() const;
void diameterRange(Color32 * start, Color32 * end) const;
void luminanceRange(Color32 * start, Color32 * end) const;
@@ -69,11 +70,11 @@ struct ColorBlock
// Accessors
const Color32 * colors() const;
- Color32 color(unsigned int i) const;
- Color32 & color(unsigned int i);
+ Color32 color(uint i) const;
+ Color32 & color(uint i);
- Color32 color(unsigned int x, unsigned int y) const;
- Color32 & color(unsigned int x, unsigned int y);
+ Color32 color(uint x, uint y) const;
+ Color32 & color(uint x, uint y);
private:
@@ -89,25 +90,25 @@ inline const Color32 * ColorBlock::colors() const
}
/// Get block color.
-inline Color32 ColorBlock::color(unsigned int i) const
+inline Color32 ColorBlock::color(uint i) const
{
return m_color[i];
}
/// Get block color.
-inline Color32 & ColorBlock::color(unsigned int i)
+inline Color32 & ColorBlock::color(uint i)
{
return m_color[i];
}
/// Get block color.
-inline Color32 ColorBlock::color(unsigned int x, unsigned int y) const
+inline Color32 ColorBlock::color(uint x, uint y) const
{
return m_color[y * 4 + x];
}
/// Get block color.
-inline Color32 & ColorBlock::color(unsigned int x, unsigned int y)
+inline Color32 & ColorBlock::color(uint x, uint y)
{
return m_color[y * 4 + x];
}
diff --git a/source/blender/imbuf/intern/dds/Common.h b/source/blender/imbuf/intern/dds/Common.h
index 5aa8972e437..0c687e2ca9a 100644
--- a/source/blender/imbuf/intern/dds/Common.h
+++ b/source/blender/imbuf/intern/dds/Common.h
@@ -37,8 +37,20 @@
#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
+
+template<typename T>
+inline void
+swap(T & a, T & b)
+{
+ T tmp = a;
+ a = b;
+ b = tmp;
+}
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
#endif
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
index c28f8b5b72d..f842c756ce1 100644
--- a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
@@ -55,103 +55,232 @@
// 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 <PixelFormat.h>
#include <stdio.h> // printf
#include <math.h> // sqrt
+#include <sys/types.h>
/*** 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 ))
+ ((uint)((unsigned char)(ch0)) | \
+ ((uint)((unsigned char)(ch1)) << 8) | \
+ ((uint)((unsigned char)(ch2)) << 16) | \
+ ((uint)((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;
+static const uint FOURCC_DDS = MAKEFOURCC('D', 'D', 'S', ' ');
+static const uint FOURCC_DXT1 = MAKEFOURCC('D', 'X', 'T', '1');
+static const uint FOURCC_DXT2 = MAKEFOURCC('D', 'X', 'T', '2');
+static const uint FOURCC_DXT3 = MAKEFOURCC('D', 'X', 'T', '3');
+static const uint FOURCC_DXT4 = MAKEFOURCC('D', 'X', 'T', '4');
+static const uint FOURCC_DXT5 = MAKEFOURCC('D', 'X', 'T', '5');
+static const uint FOURCC_RXGB = MAKEFOURCC('R', 'X', 'G', 'B');
+static const uint FOURCC_ATI1 = MAKEFOURCC('A', 'T', 'I', '1');
+static const uint FOURCC_ATI2 = MAKEFOURCC('A', 'T', 'I', '2');
+
+// 32 bit RGB formats.
+static const uint D3DFMT_R8G8B8 = 20;
+static const uint D3DFMT_A8R8G8B8 = 21;
+static const uint D3DFMT_X8R8G8B8 = 22;
+static const uint D3DFMT_R5G6B5 = 23;
+static const uint D3DFMT_X1R5G5B5 = 24;
+static const uint D3DFMT_A1R5G5B5 = 25;
+static const uint D3DFMT_A4R4G4B4 = 26;
+static const uint D3DFMT_R3G3B2 = 27;
+static const uint D3DFMT_A8 = 28;
+static const uint D3DFMT_A8R3G3B2 = 29;
+static const uint D3DFMT_X4R4G4B4 = 30;
+static const uint D3DFMT_A2B10G10R10 = 31;
+static const uint D3DFMT_A8B8G8R8 = 32;
+static const uint D3DFMT_X8B8G8R8 = 33;
+static const uint D3DFMT_G16R16 = 34;
+static const uint D3DFMT_A2R10G10B10 = 35;
+
+static const uint D3DFMT_A16B16G16R16 = 36;
// Palette formats.
-static const unsigned int D3DFMT_A8P8 = 40;
-static const unsigned int D3DFMT_P8 = 41;
+static const uint D3DFMT_A8P8 = 40;
+static const uint 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;
+static const uint D3DFMT_L8 = 50;
+static const uint D3DFMT_A8L8 = 51;
+static const uint D3DFMT_A4L4 = 52;
+static const uint D3DFMT_L16 = 81;
// 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 uint D3DFMT_R16F = 111;
+static const uint D3DFMT_G16R16F = 112;
+static const uint D3DFMT_A16B16G16R16F = 113;
+static const uint D3DFMT_R32F = 114;
+static const uint D3DFMT_G32R32F = 115;
+static const uint 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 uint DDSD_CAPS = 0x00000001U;
+static const uint DDSD_PIXELFORMAT = 0x00001000U;
+static const uint DDSD_WIDTH = 0x00000004U;
+static const uint DDSD_HEIGHT = 0x00000002U;
+static const uint DDSD_PITCH = 0x00000008U;
+static const uint DDSD_MIPMAPCOUNT = 0x00020000U;
+static const uint DDSD_LINEARSIZE = 0x00080000U;
+static const uint 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.
+static const uint DDSCAPS_COMPLEX = 0x00000008U;
+static const uint DDSCAPS_TEXTURE = 0x00001000U;
+static const uint DDSCAPS_MIPMAP = 0x00400000U;
+static const uint DDSCAPS2_VOLUME = 0x00200000U;
+static const uint DDSCAPS2_CUBEMAP = 0x00000200U;
+
+static const uint DDSCAPS2_CUBEMAP_POSITIVEX = 0x00000400U;
+static const uint DDSCAPS2_CUBEMAP_NEGATIVEX = 0x00000800U;
+static const uint DDSCAPS2_CUBEMAP_POSITIVEY = 0x00001000U;
+static const uint DDSCAPS2_CUBEMAP_NEGATIVEY = 0x00002000U;
+static const uint DDSCAPS2_CUBEMAP_POSITIVEZ = 0x00004000U;
+static const uint DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x00008000U;
+static const uint DDSCAPS2_CUBEMAP_ALL_FACES = 0x0000FC00U;
+
+static const uint DDPF_ALPHAPIXELS = 0x00000001U;
+static const uint DDPF_ALPHA = 0x00000002U;
+static const uint DDPF_FOURCC = 0x00000004U;
+static const uint DDPF_RGB = 0x00000040U;
+static const uint DDPF_PALETTEINDEXED1 = 0x00000800U;
+static const uint DDPF_PALETTEINDEXED2 = 0x00001000U;
+static const uint DDPF_PALETTEINDEXED4 = 0x00000008U;
+static const uint DDPF_PALETTEINDEXED8 = 0x00000020U;
+static const uint DDPF_LUMINANCE = 0x00020000U;
+static const uint DDPF_ALPHAPREMULT = 0x00008000U;
+static const uint DDPF_NORMAL = 0x80000000U; // @@ Custom nv flag.
+
+ // DX10 formats.
+ enum DXGI_FORMAT
+ {
+ DXGI_FORMAT_UNKNOWN = 0,
+
+ DXGI_FORMAT_R32G32B32A32_TYPELESS = 1,
+ DXGI_FORMAT_R32G32B32A32_FLOAT = 2,
+ DXGI_FORMAT_R32G32B32A32_UINT = 3,
+ DXGI_FORMAT_R32G32B32A32_SINT = 4,
+
+ DXGI_FORMAT_R32G32B32_TYPELESS = 5,
+ DXGI_FORMAT_R32G32B32_FLOAT = 6,
+ DXGI_FORMAT_R32G32B32_UINT = 7,
+ DXGI_FORMAT_R32G32B32_SINT = 8,
+
+ DXGI_FORMAT_R16G16B16A16_TYPELESS = 9,
+ DXGI_FORMAT_R16G16B16A16_FLOAT = 10,
+ DXGI_FORMAT_R16G16B16A16_UNORM = 11,
+ DXGI_FORMAT_R16G16B16A16_UINT = 12,
+ DXGI_FORMAT_R16G16B16A16_SNORM = 13,
+ DXGI_FORMAT_R16G16B16A16_SINT = 14,
+
+ DXGI_FORMAT_R32G32_TYPELESS = 15,
+ DXGI_FORMAT_R32G32_FLOAT = 16,
+ DXGI_FORMAT_R32G32_UINT = 17,
+ DXGI_FORMAT_R32G32_SINT = 18,
+
+ DXGI_FORMAT_R32G8X24_TYPELESS = 19,
+ DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20,
+ DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21,
+ DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22,
+
+ DXGI_FORMAT_R10G10B10A2_TYPELESS = 23,
+ DXGI_FORMAT_R10G10B10A2_UNORM = 24,
+ DXGI_FORMAT_R10G10B10A2_UINT = 25,
+
+ DXGI_FORMAT_R11G11B10_FLOAT = 26,
+
+ DXGI_FORMAT_R8G8B8A8_TYPELESS = 27,
+ DXGI_FORMAT_R8G8B8A8_UNORM = 28,
+ DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29,
+ DXGI_FORMAT_R8G8B8A8_UINT = 30,
+ DXGI_FORMAT_R8G8B8A8_SNORM = 31,
+ DXGI_FORMAT_R8G8B8A8_SINT = 32,
+
+ DXGI_FORMAT_R16G16_TYPELESS = 33,
+ DXGI_FORMAT_R16G16_FLOAT = 34,
+ DXGI_FORMAT_R16G16_UNORM = 35,
+ DXGI_FORMAT_R16G16_UINT = 36,
+ DXGI_FORMAT_R16G16_SNORM = 37,
+ DXGI_FORMAT_R16G16_SINT = 38,
+
+ DXGI_FORMAT_R32_TYPELESS = 39,
+ DXGI_FORMAT_D32_FLOAT = 40,
+ DXGI_FORMAT_R32_FLOAT = 41,
+ DXGI_FORMAT_R32_UINT = 42,
+ DXGI_FORMAT_R32_SINT = 43,
+
+ DXGI_FORMAT_R24G8_TYPELESS = 44,
+ DXGI_FORMAT_D24_UNORM_S8_UINT = 45,
+ DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46,
+ DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47,
+
+ DXGI_FORMAT_R8G8_TYPELESS = 48,
+ DXGI_FORMAT_R8G8_UNORM = 49,
+ DXGI_FORMAT_R8G8_UINT = 50,
+ DXGI_FORMAT_R8G8_SNORM = 51,
+ DXGI_FORMAT_R8G8_SINT = 52,
+
+ DXGI_FORMAT_R16_TYPELESS = 53,
+ DXGI_FORMAT_R16_FLOAT = 54,
+ DXGI_FORMAT_D16_UNORM = 55,
+ DXGI_FORMAT_R16_UNORM = 56,
+ DXGI_FORMAT_R16_UINT = 57,
+ DXGI_FORMAT_R16_SNORM = 58,
+ DXGI_FORMAT_R16_SINT = 59,
+
+ DXGI_FORMAT_R8_TYPELESS = 60,
+ DXGI_FORMAT_R8_UNORM = 61,
+ DXGI_FORMAT_R8_UINT = 62,
+ DXGI_FORMAT_R8_SNORM = 63,
+ DXGI_FORMAT_R8_SINT = 64,
+ DXGI_FORMAT_A8_UNORM = 65,
+
+ DXGI_FORMAT_R1_UNORM = 66,
+
+ DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67,
+
+ DXGI_FORMAT_R8G8_B8G8_UNORM = 68,
+ DXGI_FORMAT_G8R8_G8B8_UNORM = 69,
+
+ DXGI_FORMAT_BC1_TYPELESS = 70,
+ DXGI_FORMAT_BC1_UNORM = 71,
+ DXGI_FORMAT_BC1_UNORM_SRGB = 72,
+
+ DXGI_FORMAT_BC2_TYPELESS = 73,
+ DXGI_FORMAT_BC2_UNORM = 74,
+ DXGI_FORMAT_BC2_UNORM_SRGB = 75,
+
+ DXGI_FORMAT_BC3_TYPELESS = 76,
+ DXGI_FORMAT_BC3_UNORM = 77,
+ DXGI_FORMAT_BC3_UNORM_SRGB = 78,
+
+ DXGI_FORMAT_BC4_TYPELESS = 79,
+ DXGI_FORMAT_BC4_UNORM = 80,
+ DXGI_FORMAT_BC4_SNORM = 81,
+
+ DXGI_FORMAT_BC5_TYPELESS = 82,
+ DXGI_FORMAT_BC5_UNORM = 83,
+ DXGI_FORMAT_BC5_SNORM = 84,
+
+ DXGI_FORMAT_B5G6R5_UNORM = 85,
+ DXGI_FORMAT_B5G5R5A1_UNORM = 86,
+ DXGI_FORMAT_B8G8R8A8_UNORM = 87,
+ DXGI_FORMAT_B8G8R8X8_UNORM = 88,
+ };
+
+ enum D3D10_RESOURCE_DIMENSION
+ {
+ D3D10_RESOURCE_DIMENSION_UNKNOWN = 0,
+ D3D10_RESOURCE_DIMENSION_BUFFER = 1,
+ D3D10_RESOURCE_DIMENSION_TEXTURE1D = 2,
+ D3D10_RESOURCE_DIMENSION_TEXTURE2D = 3,
+ D3D10_RESOURCE_DIMENSION_TEXTURE3D = 4,
+ };
/*** implementation ***/
@@ -175,6 +304,15 @@ void mem_read(Stream & mem, DDSCaps & caps)
mem_read(mem, caps.caps4);
}
+void mem_read(Stream & mem, DDSHeader10 & header)
+{
+ mem_read(mem, header.dxgiFormat);
+ mem_read(mem, header.resourceDimension);
+ mem_read(mem, header.miscFlag);
+ mem_read(mem, header.arraySize);
+ mem_read(mem, header.reserved);
+}
+
void mem_read(Stream & mem, DDSHeader & header)
{
mem_read(mem, header.fourcc);
@@ -185,12 +323,19 @@ void mem_read(Stream & mem, DDSHeader & header)
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]);
+ for (uint 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);
+
+ if (header.hasDX10Header())
+ {
+ mem_read(mem, header.header10);
+ }
}
+
+
DDSHeader::DDSHeader()
{
this->fourcc = FOURCC_DDS;
@@ -201,11 +346,11 @@ DDSHeader::DDSHeader()
this->pitch = 0;
this->depth = 0;
this->mipmapcount = 0;
- for (unsigned int i = 0; i < 11; i++) this->reserved[i] = 0;
+ for (uint 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->reserved[10] = (0 << 16) | (9 << 8) | (5); // major.minor.revision
this->pf.size = 32;
this->pf.flags = 0;
@@ -220,29 +365,35 @@ DDSHeader::DDSHeader()
this->caps.caps3 = 0;
this->caps.caps4 = 0;
this->notused = 0;
+
+ this->header10.dxgiFormat = DXGI_FORMAT_UNKNOWN;
+ this->header10.resourceDimension = D3D10_RESOURCE_DIMENSION_UNKNOWN;
+ this->header10.miscFlag = 0;
+ this->header10.arraySize = 0;
+ this->header10.reserved = 0;
}
-void DDSHeader::setWidth(unsigned int w)
+void DDSHeader::setWidth(uint w)
{
this->flags |= DDSD_WIDTH;
this->width = w;
}
-void DDSHeader::setHeight(unsigned int h)
+void DDSHeader::setHeight(uint h)
{
this->flags |= DDSD_HEIGHT;
this->height = h;
}
-void DDSHeader::setDepth(unsigned int d)
+void DDSHeader::setDepth(uint d)
{
this->flags |= DDSD_DEPTH;
this->height = d;
}
-void DDSHeader::setMipmapCount(unsigned int count)
+void DDSHeader::setMipmapCount(uint count)
{
- if (count == 0)
+ if (count == 0 || count == 1)
{
this->flags &= ~DDSD_MIPMAPCOUNT;
this->mipmapcount = 0;
@@ -265,35 +416,40 @@ void DDSHeader::setMipmapCount(unsigned int count)
void DDSHeader::setTexture2D()
{
- // nothing to do here.
+ this->header10.resourceDimension = D3D10_RESOURCE_DIMENSION_TEXTURE2D;
}
void DDSHeader::setTexture3D()
{
this->caps.caps2 = DDSCAPS2_VOLUME;
+
+ this->header10.resourceDimension = D3D10_RESOURCE_DIMENSION_TEXTURE3D;
}
void DDSHeader::setTextureCube()
{
this->caps.caps1 |= DDSCAPS_COMPLEX;
this->caps.caps2 = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALL_FACES;
+
+ this->header10.resourceDimension = D3D10_RESOURCE_DIMENSION_TEXTURE2D;
+ this->header10.arraySize = 6;
}
-void DDSHeader::setLinearSize(unsigned int size)
+void DDSHeader::setLinearSize(uint size)
{
this->flags &= ~DDSD_PITCH;
this->flags |= DDSD_LINEARSIZE;
this->pitch = size;
}
-void DDSHeader::setPitch(unsigned int pitch)
+void DDSHeader::setPitch(uint 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)
+void DDSHeader::setFourCC(uint8 c0, uint8 c1, uint8 c2, uint8 c3)
{
// set fourcc pixel format.
this->pf.flags = DDPF_FOURCC;
@@ -305,7 +461,7 @@ void DDSHeader::setFourCC(unsigned char c0, unsigned char c1, unsigned char c2,
this->pf.amask = 0;
}
-void DDSHeader::setPixelFormat(unsigned int bitcount, unsigned int rmask, unsigned int gmask, unsigned int bmask, unsigned int amask)
+void DDSHeader::setPixelFormat(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask)
{
// Make sure the masks are correct.
if ((rmask & gmask) || \
@@ -327,15 +483,25 @@ void DDSHeader::setPixelFormat(unsigned int bitcount, unsigned int rmask, unsign
if (bitcount == 0)
{
// Compute bit count from the masks.
- unsigned int total = rmask | gmask | bmask | amask;
+ uint total = rmask | gmask | bmask | amask;
while(total != 0) {
bitcount++;
total >>= 1;
}
- // @@ Align to 8?
}
- this->pf.fourcc = 0;
+ if (!(bitcount > 0 && bitcount <= 32)) {
+ printf("DDS: bad bit count, pixel format not set\n");
+ return;
+ }
+
+ // Align to 8.
+ if (bitcount < 8) bitcount = 8;
+ else if (bitcount < 16) bitcount = 16;
+ else if (bitcount < 24) bitcount = 24;
+ else bitcount = 32;
+
+ this->pf.fourcc = 0; //findD3D9Format(bitcount, rmask, gmask, bmask, amask);
this->pf.bitcount = bitcount;
this->pf.rmask = rmask;
this->pf.gmask = gmask;
@@ -343,46 +509,24 @@ void DDSHeader::setPixelFormat(unsigned int bitcount, unsigned int rmask, unsign
this->pf.amask = amask;
}
+void DDSHeader::setDX10Format(uint format)
+{
+ this->pf.flags = 0;
+ this->header10.dxgiFormat = format;
+}
+
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);
+bool DDSHeader::hasDX10Header() const
+{
+ return this->pf.flags == 0;
}
-*/
-
-DirectDrawSurface::DirectDrawSurface(unsigned char *mem, unsigned int size) : stream(mem, size), header()
+DirectDrawSurface::DirectDrawSurface(unsigned char *mem, uint size) : stream(mem, size), header()
{
mem_read(stream, header);
}
@@ -398,7 +542,7 @@ bool DirectDrawSurface::isValid() const
return false;
}
- const unsigned int required = (DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS|DDSD_PIXELFORMAT);
+ const uint required = (DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS|DDSD_PIXELFORMAT);
if( (header.flags & required) != required ) {
return false;
}
@@ -436,19 +580,7 @@ bool DirectDrawSurface::isSupported() const
}
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;
- }
+ // All RGB formats are supported now.
}
else
{
@@ -471,26 +603,26 @@ bool DirectDrawSurface::isSupported() const
}
-unsigned int DirectDrawSurface::mipmapCount() const
+uint DirectDrawSurface::mipmapCount() const
{
if (header.flags & DDSD_MIPMAPCOUNT) return header.mipmapcount;
else return 0;
}
-unsigned int DirectDrawSurface::width() const
+uint DirectDrawSurface::width() const
{
if (header.flags & DDSD_WIDTH) return header.width;
else return 1;
}
-unsigned int DirectDrawSurface::height() const
+uint DirectDrawSurface::height() const
{
if (header.flags & DDSD_HEIGHT) return header.height;
else return 1;
}
-unsigned int DirectDrawSurface::depth() const
+uint DirectDrawSurface::depth() const
{
if (header.flags & DDSD_DEPTH) return header.depth;
else return 1;
@@ -527,18 +659,18 @@ bool DirectDrawSurface::isTextureCube() const
return (header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0;
}
-void DirectDrawSurface::mipmap(Image * img, unsigned int face, unsigned int mipmap)
+void DirectDrawSurface::mipmap(Image * img, uint face, uint mipmap)
{
stream.seek(offset(face, mipmap));
- unsigned int w = width();
- unsigned int h = height();
+ uint w = width();
+ uint h = height();
// Compute width and height.
- for (unsigned int m = 0; m < mipmap; m++)
+ for (uint m = 0; m < mipmap; m++)
{
- w = max(w/2, 1U);
- h = max(h/2, 1U);
+ w = max(1U, w / 2);
+ h = max(1U, h / 2);
}
img->allocate(w, h);
@@ -553,73 +685,30 @@ void DirectDrawSurface::mipmap(Image * img, unsigned int face, unsigned int mipm
}
}
-/* 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);
+ const uint w = img->width();
+ const uint h = img->height();
+
+ uint rshift, rsize;
+ PixelFormat::maskShiftAndSize(header.pf.rmask, &rshift, &rsize);
- unsigned int bshift, bsize;
- maskShiftAndSize(header.pf.bmask, &bshift, &bsize);
+ uint gshift, gsize;
+ PixelFormat::maskShiftAndSize(header.pf.gmask, &gshift, &gsize);
- unsigned int ashift, asize;
- maskShiftAndSize(header.pf.amask, &ashift, &asize);
+ uint bshift, bsize;
+ PixelFormat::maskShiftAndSize(header.pf.bmask, &bshift, &bsize);
+
+ uint ashift, asize;
+ PixelFormat::maskShiftAndSize(header.pf.amask, &ashift, &asize);
+
+ uint byteCount = (header.pf.bitcount + 7) / 8;
- 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?)");
+ printf("DDS: bitcount too large");
return;
}
@@ -629,18 +718,18 @@ void DirectDrawSurface::readLinearImage(Image * img)
}
// Read linear RGB images.
- for (unsigned int y = 0; y < h; y++)
+ for (uint y = 0; y < h; y++)
{
- for (unsigned int x = 0; x < w; x++)
+ for (uint x = 0; x < w; x++)
{
- unsigned int c = 0;
+ uint 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);
+ pixel.r = PixelFormat::convert(c >> rshift, rsize, 8);
+ pixel.g = PixelFormat::convert(c >> gshift, gsize, 8);
+ pixel.b = PixelFormat::convert(c >> bshift, bsize, 8);
+ pixel.a = PixelFormat::convert(c >> ashift, asize, 8);
img->pixel(x, y) = pixel;
}
@@ -649,15 +738,15 @@ void DirectDrawSurface::readLinearImage(Image * img)
void DirectDrawSurface::readBlockImage(Image * img)
{
- const unsigned int w = img->width();
- const unsigned int h = img->height();
+ const uint w = img->width();
+ const uint h = img->height();
- const unsigned int bw = (w + 3) / 4;
- const unsigned int bh = (h + 3) / 4;
+ const uint bw = (w + 3) / 4;
+ const uint bh = (h + 3) / 4;
- for (unsigned int by = 0; by < bh; by++)
+ for (uint by = 0; by < bh; by++)
{
- for (unsigned int bx = 0; bx < bw; bx++)
+ for (uint bx = 0; bx < bw; bx++)
{
ColorBlock block;
@@ -665,9 +754,9 @@ void DirectDrawSurface::readBlockImage(Image * img)
readBlock(&block);
// Write color block.
- for (unsigned int y = 0; y < min(4U, h-4*by); y++)
+ for (uint y = 0; y < min(4U, h-4*by); y++)
{
- for (unsigned int x = 0; x < min(4U, w-4*bx); x++)
+ for (uint x = 0; x < min(4U, w-4*bx); x++)
{
img->pixel(4*bx+x, 4*by+y) = block.color(x, y);
}
@@ -676,12 +765,13 @@ void DirectDrawSurface::readBlockImage(Image * img)
}
}
-static Color32 buildNormal(unsigned char x, unsigned char y)
+static Color32 buildNormal(uint8 x, uint8 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);
+ float nx = 2 * (x / 255.0f) - 1;
+ float ny = 2 * (y / 255.0f) - 1;
+ float nz = 0.0f;
+ if (1 - nx*nx - ny*ny > 0) nz = sqrt(1 - nx*nx - ny*ny);
+ uint8 z = clamp(int(255.0f * (nz + 1) / 2.0f), 0, 255);
return Color32(x, y, z);
}
@@ -716,7 +806,7 @@ void DirectDrawSurface::readBlock(ColorBlock * rgba)
for (int i = 0; i < 16; i++)
{
Color32 & c = rgba->color(i);
- unsigned int tmp = c.r;
+ uint tmp = c.r;
c.r = c.a;
c.a = tmp;
}
@@ -751,14 +841,14 @@ void DirectDrawSurface::readBlock(ColorBlock * rgba)
for (int i = 0; i < 16; i++)
{
Color32 & c = rgba->color(i);
- c = buildNormal(c.g, c.a);
+ c = buildNormal(c.a, c.g);
}
}
}
}
-unsigned int DirectDrawSurface::blockSize() const
+uint DirectDrawSurface::blockSize() const
{
switch(header.pf.fourcc)
{
@@ -778,13 +868,13 @@ unsigned int DirectDrawSurface::blockSize() const
return 0;
}
-unsigned int DirectDrawSurface::mipmapSize(unsigned int mipmap) const
+uint DirectDrawSurface::mipmapSize(uint mipmap) const
{
- unsigned int w = width();
- unsigned int h = height();
- unsigned int d = depth();
+ uint w = width();
+ uint h = height();
+ uint d = depth();
- for (unsigned int m = 0; m < mipmap; m++)
+ for (uint m = 0; m < mipmap; m++)
{
w = max(1U, w / 2);
h = max(1U, h / 2);
@@ -801,10 +891,10 @@ unsigned int DirectDrawSurface::mipmapSize(unsigned int mipmap) const
else if (header.pf.flags & DDPF_RGB)
{
// Align pixels to bytes.
- unsigned int byteCount = (header.pf.bitcount + 7) / 8;
+ uint byteCount = (header.pf.bitcount + 7) / 8;
// Align pitch to 4 bytes.
- unsigned int pitch = 4 * ((w * byteCount + 3) / 4);
+ uint pitch = 4 * ((w * byteCount + 3) / 4);
return pitch * h * d;
}
@@ -814,12 +904,12 @@ unsigned int DirectDrawSurface::mipmapSize(unsigned int mipmap) const
};
}
-unsigned int DirectDrawSurface::faceSize() const
+uint DirectDrawSurface::faceSize() const
{
- const unsigned int count = mipmapCount();
- unsigned int size = 0;
+ const uint count = mipmapCount();
+ uint size = 0;
- for (unsigned int m = 0; m < count; m++)
+ for (uint m = 0; m < count; m++)
{
size += mipmapSize(m);
}
@@ -827,16 +917,16 @@ unsigned int DirectDrawSurface::faceSize() const
return size;
}
-unsigned int DirectDrawSurface::offset(const unsigned int face, const unsigned int mipmap)
+uint DirectDrawSurface::offset(const uint face, const uint mipmap)
{
- unsigned int size = sizeof(DDSHeader);
+ uint size = 128; //sizeof(DDSHeader);
if (face != 0)
{
size += face * faceSize();
}
- for (unsigned int m = 0; m < mipmap; m++)
+ for (uint m = 0; m < mipmap; m++)
{
size += mipmapSize(m);
}
@@ -911,6 +1001,15 @@ void DirectDrawSurface::printInfo() const
printf("\tCaps 3: 0x%.8X\n", header.caps.caps3);
printf("\tCaps 4: 0x%.8X\n", header.caps.caps4);
+ if (header.pf.flags == 0)
+ {
+ printf("DX10 Header:\n");
+ printf("\tDXGI Format: %u\n", header.header10.dxgiFormat);
+ printf("\tResource dimension: %u\n", header.header10.resourceDimension);
+ printf("\tMisc flag: %u\n", header.header10.miscFlag);
+ printf("\tArray size: %u\n", header.header10.arraySize);
+ }
+
if (header.reserved[9] == MAKEFOURCC('N', 'V', 'T', 'T'))
{
int major = (header.reserved[10] >> 16) & 0xFF;
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.h b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
index 2b3319d05a1..d29d82f53f9 100644
--- a/source/blender/imbuf/intern/dds/DirectDrawSurface.h
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
@@ -58,92 +58,110 @@
#ifndef _DDS_DIRECTDRAWSURFACE_H
#define _DDS_DIRECTDRAWSURFACE_H
+#include <Common.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 DDSPixelFormat
+{
+ uint size;
+ uint flags;
+ uint fourcc;
+ uint bitcount;
+ uint rmask;
+ uint gmask;
+ uint bmask;
+ uint amask;
};
-struct DDSCaps {
- unsigned int caps1;
- unsigned int caps2;
- unsigned int caps3;
- unsigned int caps4;
+struct DDSCaps
+{
+ uint caps1;
+ uint caps2;
+ uint caps3;
+ uint caps4;
+};
+
+/// DDS file header for DX10.
+struct DDSHeader10
+{
+ uint dxgiFormat;
+ uint resourceDimension;
+ uint miscFlag;
+ uint arraySize;
+ uint reserved;
};
/// 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];
+struct DDSHeader
+{
+ uint fourcc;
+ uint size;
+ uint flags;
+ uint height;
+ uint width;
+ uint pitch;
+ uint depth;
+ uint mipmapcount;
+ uint reserved[11];
DDSPixelFormat pf;
DDSCaps caps;
- unsigned int notused;
-
+ uint notused;
+ DDSHeader10 header10;
+
+
// Helper methods.
DDSHeader();
- void setWidth(unsigned int w);
- void setHeight(unsigned int h);
- void setDepth(unsigned int d);
- void setMipmapCount(unsigned int count);
+ void setWidth(uint w);
+ void setHeight(uint h);
+ void setDepth(uint d);
+ void setMipmapCount(uint 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 setLinearSize(uint size);
+ void setPitch(uint pitch);
+ void setFourCC(uint8 c0, uint8 c1, uint8 c2, uint8 c3);
+ void setPixelFormat(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask);
+ void setDX10Format(uint format);
void setNormalFlag(bool b);
- /* void swapBytes(); */
+ bool hasDX10Header() const;
};
/// DirectDraw Surface. (DDS)
class DirectDrawSurface
{
public:
- DirectDrawSurface(unsigned char *mem, unsigned int size);
+ DirectDrawSurface(unsigned char *mem, uint size);
~DirectDrawSurface();
bool isValid() const;
bool isSupported() const;
- unsigned int mipmapCount() const;
- unsigned int width() const;
- unsigned int height() const;
- unsigned int depth() const;
+ uint mipmapCount() const;
+ uint width() const;
+ uint height() const;
+ uint depth() const;
bool isTexture2D() const;
bool isTexture3D() const;
bool isTextureCube() const;
- bool hasAlpha() const; /* false for DXT1, true for all others */
+ bool hasAlpha() const; /* false for DXT1, true for all other DXTs */
- void mipmap(Image * img, unsigned int f, unsigned int m);
+ void mipmap(Image * img, uint f, uint m);
+ // void mipmap(FloatImage * img, uint f, uint m);
void printInfo() const;
private:
- unsigned int blockSize() const;
- unsigned int faceSize() const;
- unsigned int mipmapSize(unsigned int m) const;
+ uint blockSize() const;
+ uint faceSize() const;
+ uint mipmapSize(uint m) const;
- unsigned int offset(unsigned int f, unsigned int m);
+ uint offset(uint f, uint m);
void readLinearImage(Image * img);
void readBlockImage(Image * img);
@@ -158,5 +176,6 @@ private:
void mem_read(Stream & mem, DDSPixelFormat & pf);
void mem_read(Stream & mem, DDSCaps & caps);
void mem_read(Stream & mem, DDSHeader & header);
+void mem_read(Stream & mem, DDSHeader10 & header);
#endif // _DDS_DIRECTDRAWSURFACE_H
diff --git a/source/blender/imbuf/intern/dds/Image.cpp b/source/blender/imbuf/intern/dds/Image.cpp
index f3e6fa38955..d8be7857c3f 100644
--- a/source/blender/imbuf/intern/dds/Image.cpp
+++ b/source/blender/imbuf/intern/dds/Image.cpp
@@ -48,7 +48,7 @@ Image::~Image()
free();
}
-void Image::allocate(unsigned int w, unsigned int h)
+void Image::allocate(uint w, uint h)
{
free();
m_width = w;
@@ -63,17 +63,17 @@ void Image::free()
}
-unsigned int Image::width() const
+uint Image::width() const
{
return m_width;
}
-unsigned int Image::height() const
+uint Image::height() const
{
return m_height;
}
-const Color32 * Image::scanline(unsigned int h) const
+const Color32 * Image::scanline(uint h) const
{
if (h >= m_height) {
printf("DDS: scanline beyond dimensions of image");
@@ -82,7 +82,7 @@ const Color32 * Image::scanline(unsigned int h) const
return m_data + h * m_width;
}
-Color32 * Image::scanline(unsigned int h)
+Color32 * Image::scanline(uint h)
{
if (h >= m_height) {
printf("DDS: scanline beyond dimensions of image");
@@ -101,7 +101,7 @@ Color32 * Image::pixels()
return m_data;
}
-const Color32 & Image::pixel(unsigned int idx) const
+const Color32 & Image::pixel(uint idx) const
{
if (idx >= m_width * m_height) {
printf("DDS: pixel beyond dimensions of image");
@@ -110,7 +110,7 @@ const Color32 & Image::pixel(unsigned int idx) const
return m_data[idx];
}
-Color32 & Image::pixel(unsigned int idx)
+Color32 & Image::pixel(uint idx)
{
if (idx >= m_width * m_height) {
printf("DDS: pixel beyond dimensions of image");
diff --git a/source/blender/imbuf/intern/dds/Image.h b/source/blender/imbuf/intern/dds/Image.h
index 10356774777..0241839d01d 100644
--- a/source/blender/imbuf/intern/dds/Image.h
+++ b/source/blender/imbuf/intern/dds/Image.h
@@ -37,6 +37,7 @@
#ifndef _DDS_IMAGE_H
#define _DDS_IMAGE_H
+#include <Common.h>
#include <Color.h>
/// 32 bit RGBA image.
@@ -53,28 +54,28 @@ public:
Image();
~Image();
- void allocate(unsigned int w, unsigned int h);
+ void allocate(uint w, uint h);
/*
bool load(const char * name);
- void wrap(void * data, unsigned int w, unsigned int h);
+ void wrap(void * data, uint w, uint h);
void unwrap();
*/
- unsigned int width() const;
- unsigned int height() const;
+ uint width() const;
+ uint height() const;
- const Color32 * scanline(unsigned int h) const;
- Color32 * scanline(unsigned int h);
+ const Color32 * scanline(uint h) const;
+ Color32 * scanline(uint h);
const Color32 * pixels() const;
Color32 * pixels();
- const Color32 & pixel(unsigned int idx) const;
- Color32 & pixel(unsigned int idx);
+ const Color32 & pixel(uint idx) const;
+ Color32 & pixel(uint idx);
- const Color32 & pixel(unsigned int x, unsigned int y) const;
- Color32 & pixel(unsigned int x, unsigned int y);
+ const Color32 & pixel(uint x, uint y) const;
+ Color32 & pixel(uint x, uint y);
Format format() const;
void setFormat(Format f);
@@ -83,19 +84,19 @@ private:
void free();
private:
- unsigned int m_width;
- unsigned int m_height;
+ uint m_width;
+ uint m_height;
Format m_format;
Color32 * m_data;
};
-inline const Color32 & Image::pixel(unsigned int x, unsigned int y) const
+inline const Color32 & Image::pixel(uint x, uint y) const
{
return pixel(y * width() + x);
}
-inline Color32 & Image::pixel(unsigned int x, unsigned int y)
+inline Color32 & Image::pixel(uint x, uint y)
{
return pixel(y * width() + x);
}
diff --git a/source/blender/imbuf/intern/dds/PixelFormat.h b/source/blender/imbuf/intern/dds/PixelFormat.h
new file mode 100644
index 00000000000..93f55f8266a
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/PixelFormat.h
@@ -0,0 +1,110 @@
+/**
+ * $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_PIXELFORMAT_H
+#define _DDS_PIXELFORMAT_H
+
+#include <Common.h>
+
+ namespace PixelFormat
+ {
+
+ // Convert component @a c having @a inbits to the returned value having @a outbits.
+ inline uint convert(uint c, uint inbits, uint outbits)
+ {
+ if (inbits == 0)
+ {
+ return 0;
+ }
+ else if (inbits >= outbits)
+ {
+ // truncate
+ return c >> (inbits - outbits);
+ }
+ else
+ {
+ // bitexpand
+ return (c << (outbits - inbits)) | convert(c, inbits, outbits - inbits);
+ }
+ }
+
+ // Get pixel component shift and size given its mask.
+ inline void maskShiftAndSize(uint mask, uint * shift, uint * 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;
+ }
+ }
+
+ } // PixelFormat namespace
+
+#endif // _DDS_IMAGE_PIXELFORMAT_H
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index fd9dac1af2b..6c82a1e24a7 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -242,7 +242,7 @@ void IMB_filter(struct ImBuf *ibuf)
#define EXTEND_PIXEL(a, w) if((a)[3]) {r+= w*(a)[0]; g+= w*(a)[1]; b+= w*(a)[2]; tot+=w;}
-/* if alpha is zero, it checks surrounding pixels and averages color. sets new alphas to 255 */
+/* if alpha is zero, it checks surrounding pixels and averages color. sets new alphas to 1.0 */
void IMB_filter_extend(struct ImBuf *ibuf)
{
register char *row1, *row2, *row3;
@@ -251,7 +251,56 @@ void IMB_filter_extend(struct ImBuf *ibuf)
rowlen= ibuf->x;
- if(ibuf->rect) {
+
+ if (ibuf->rect_float) {
+ float *temprect;
+ float *row1f, *row2f, *row3f;
+ float *fp;
+ temprect= MEM_dupallocN(ibuf->rect_float);
+
+ for(y=1; y<=ibuf->y; y++) {
+ /* setup rows */
+ row1f= (float *)(temprect + (y-2)*rowlen*4);
+ row2f= row1f + 4*rowlen;
+ row3f= row2f + 4*rowlen;
+ if(y==1)
+ row1f= row2f;
+ else if(y==ibuf->y)
+ row3f= row2f;
+
+ fp= (float *)(ibuf->rect_float + (y-1)*rowlen*4);
+
+ for(x=0; x<rowlen; x++) {
+ if(fp[3]==0.0f) {
+ int tot= 0;
+ float r=0.0f, g=0.0f, b=0.0f;
+
+ EXTEND_PIXEL(row1f, 1);
+ EXTEND_PIXEL(row2f, 2);
+ EXTEND_PIXEL(row3f, 1);
+ EXTEND_PIXEL(row1f+4, 2);
+ EXTEND_PIXEL(row3f+4, 2);
+ if(x!=rowlen-1) {
+ EXTEND_PIXEL(row1f+8, 1);
+ EXTEND_PIXEL(row2f+8, 2);
+ EXTEND_PIXEL(row3f+8, 1);
+ }
+ if(tot) {
+ fp[0]= r/tot;
+ fp[1]= g/tot;
+ fp[2]= b/tot;
+ fp[3]= 1.0;
+ }
+ }
+ fp+=4;
+
+ if(x!=0) {
+ row1f+=4; row2f+=4; row3f+=4;
+ }
+ }
+ }
+ }
+ else if(ibuf->rect) {
int *temprect;
/* make a copy, to prevent flooding */
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c
index d3f75c9d64a..aa09fc3ee38 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -51,22 +51,28 @@ I stole it from util.h in the plugins api */
/* Only this one is used liberally here, and in imbuf */
void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf)
{
- int size, do_float=0;
+ int size;
unsigned char rt, *cp = (unsigned char *)ibuf->rect;
float rtf, *cpf = ibuf->rect_float;
-
- if (ibuf->rect_float) do_float = 1;
- size = ibuf->x * ibuf->y;
- while(size-- > 0) {
- rt= cp[0];
- cp[0]= cp[3];
- cp[3]= rt;
- rt= cp[1];
- cp[1]= cp[2];
- cp[2]= rt;
- cp+= 4;
- if (do_float) {
+ if (ibuf->rect) {
+ size = ibuf->x * ibuf->y;
+
+ while(size-- > 0) {
+ rt= cp[0];
+ cp[0]= cp[3];
+ cp[3]= rt;
+ rt= cp[1];
+ cp[1]= cp[2];
+ cp[2]= rt;
+ cp+= 4;
+ }
+ }
+
+ if (ibuf->rect_float) {
+ size = ibuf->x * ibuf->y;
+
+ while(size-- > 0) {
rtf= cpf[0];
cpf[0]= cpf[3];
cpf[3]= rtf;
@@ -183,8 +189,12 @@ void bilinear_interpolation(ImBuf *in, ImBuf *out, float u, float v, int xout, i
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
@@ -254,8 +264,12 @@ void neareast_interpolation(ImBuf *in, ImBuf *out, float u, float v,int xout, in
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;
diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index 1774aa7c156..eab07c19265 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -41,6 +41,7 @@
#include "imbuf_patch.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
+#include "IMB_imginfo.h"
#include "IMB_jpeg.h"
#include "jpeglib.h"
@@ -244,11 +245,14 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f
int x, y, depth, r, g, b, k;
struct ImBuf * ibuf = 0;
uchar * rect;
+ jpeg_saved_marker_ptr marker;
+ char *str, *key, *value;
/* install own app1 handler */
ibuf_ftype = 0;
jpeg_set_marker_processor(cinfo, 0xe1, handle_app1);
cinfo->dct_method = JDCT_FLOAT;
+ jpeg_save_markers(cinfo, JPEG_COM, 0xffff);
if (jpeg_read_header(cinfo, FALSE) == JPEG_HEADER_OK) {
x = cinfo->image_width;
@@ -335,6 +339,64 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f
}
}
}
+
+ marker= cinfo->marker_list;
+ while(marker) {
+ if(marker->marker != JPEG_COM)
+ goto next_stamp_marker;
+
+ /*
+ * Because JPEG format don't support the
+ * pair "key/value" like PNG, we store the
+ * stampinfo in a single "encode" string:
+ * "Blender:key:value"
+ *
+ * That is why we need split it to the
+ * common key/value here.
+ */
+ if(strncmp((char *) marker->data, "Blender", 7)) {
+ /*
+ * Maybe the file have text that
+ * we don't know "what it's", in that
+ * case we keep the text (with a
+ * key "None").
+ * This is only for don't "lose"
+ * the information when we write
+ * it back to disk.
+ */
+ IMB_imginfo_add_field(ibuf, "None", (char *) marker->data);
+ ibuf->flags |= IB_imginfo;
+ goto next_stamp_marker;
+ }
+
+ str = BLI_strdup ((char *) marker->data);
+ key = strchr (str, ':');
+ /*
+ * A little paranoid, but the file maybe
+ * is broken... and a "extra" check is better
+ * that a segfaul ;)
+ */
+ if (!key) {
+ MEM_freeN(str);
+ goto next_stamp_marker;
+ }
+
+ key++;
+ value = strchr (key, ':');
+ if (!value) {
+ MEM_freeN(str);
+ goto next_stamp_marker;
+ }
+
+ *value = '\0'; /* need finish the key string */
+ value++;
+ IMB_imginfo_add_field(ibuf, key, value);
+ ibuf->flags |= IB_imginfo;
+ MEM_freeN(str);
+next_stamp_marker:
+ marker= marker->next;
+ }
+
jpeg_finish_decompress(cinfo);
}
@@ -391,7 +453,8 @@ static void write_jpeg(struct jpeg_compress_struct * cinfo, struct ImBuf * ibuf)
uchar * rect;
int x, y;
char neogeo[128];
-
+ ImgInfo *iptr;
+ char *text;
jpeg_start_compress(cinfo, TRUE);
@@ -401,6 +464,33 @@ static void write_jpeg(struct jpeg_compress_struct * cinfo, struct ImBuf * ibuf)
memcpy(neogeo + 6, &ibuf_ftype, 4);
jpeg_write_marker(cinfo, 0xe1, (JOCTET*) neogeo, 10);
+ if(ibuf->img_info) {
+ /* key + max value + "Blender" */
+ text= MEM_mallocN(530, "stamp info read");
+ iptr= ibuf->img_info;
+ while(iptr) {
+ if (!strcmp (iptr->key, "None")) {
+ jpeg_write_marker(cinfo, JPEG_COM, (JOCTET *) iptr->value, strlen (iptr->value) + 1);
+ goto next_stamp_info;
+ }
+
+ /*
+ * The JPEG format don't support a pair "key/value"
+ * like PNG, so we "encode" the stamp in a
+ * single string:
+ * "Blender:key:value"
+ *
+ * The first "Blender" is a simple identify to help
+ * in the read process.
+ */
+ sprintf (text, "Blender:%s:%s", iptr->key, iptr->value);
+ jpeg_write_marker(cinfo, JPEG_COM, (JOCTET *) text, strlen (text)+1);
+next_stamp_info:
+ iptr = iptr->next;
+ }
+ MEM_freeN(text);
+ }
+
row_pointer[0] =
mallocstruct(JSAMPLE,
cinfo->input_components *
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index 3cbada812b9..c5f5a33a5d1 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -478,7 +478,7 @@ int IMB_exr_begin_read(void *handle, char *filename, int *width, int *height)
{
ExrHandle *data= (ExrHandle *)handle;
- if(BLI_exists(filename)) {
+ if(BLI_exists(filename) && BLI_filepathsize(filename)>32) { /* 32 is arbitrary, but zero length files crashes exr */
data->ifile = new InputFile(filename);
if(data->ifile) {
Box2i dw = data->ifile->header().dataWindow();
@@ -547,9 +547,14 @@ void IMB_exrtile_write_channels(void *handle, int partx, int party)
}
data->tofile->setFrameBuffer (frameBuffer);
- // printf("write tile %d %d\n", partx/data->tilex, party/data->tiley);
- data->tofile->writeTile (partx/data->tilex, party/data->tiley);
-
+
+ try {
+ // printf("write tile %d %d\n", partx/data->tilex, party/data->tiley);
+ data->tofile->writeTile (partx/data->tilex, party/data->tiley);
+ }
+ catch (const std::exception &exc) {
+ std::cerr << "OpenEXR-writeTile: ERROR: " << exc.what() << std::endl;
+ }
}
void IMB_exr_write_channels(void *handle)
@@ -615,7 +620,6 @@ void IMB_exr_multilayer_convert(void *handle, void *base,
void IMB_exr_close(void *handle)
{
ExrHandle *data= (ExrHandle *)handle;
- ExrChannel *echan;
ExrLayer *lay;
ExrPass *pass;
@@ -778,28 +782,28 @@ static ExrHandle *imb_exr_begin_read_mem(InputFile *file, int width, int height)
/* we can have RGB(A), XYZ(W), UVA */
if(pass->totchan==3 || pass->totchan==4) {
if(pass->chan[0]->chan_id=='B' || pass->chan[1]->chan_id=='B' || pass->chan[2]->chan_id=='B') {
- lookup['R']= 0;
- lookup['G']= 1;
- lookup['B']= 2;
- lookup['A']= 3;
+ lookup[(unsigned int)'R']= 0;
+ lookup[(unsigned int)'G']= 1;
+ lookup[(unsigned int)'B']= 2;
+ lookup[(unsigned int)'A']= 3;
}
else if(pass->chan[0]->chan_id=='Y' || pass->chan[1]->chan_id=='Y' || pass->chan[2]->chan_id=='Y') {
- lookup['X']= 0;
- lookup['Y']= 1;
- lookup['Z']= 2;
- lookup['W']= 3;
+ lookup[(unsigned int)'X']= 0;
+ lookup[(unsigned int)'Y']= 1;
+ lookup[(unsigned int)'Z']= 2;
+ lookup[(unsigned int)'W']= 3;
}
else {
- lookup['U']= 0;
- lookup['V']= 1;
- lookup['A']= 2;
+ lookup[(unsigned int)'U']= 0;
+ lookup[(unsigned int)'V']= 1;
+ lookup[(unsigned int)'A']= 2;
}
for(a=0; a<pass->totchan; a++) {
echan= pass->chan[a];
- echan->rect= pass->rect + lookup[echan->chan_id];
+ echan->rect= pass->rect + lookup[(unsigned int)echan->chan_id];
echan->xstride= pass->totchan;
echan->ystride= width*pass->totchan;
- pass->chan_id[ lookup[echan->chan_id] ]= echan->chan_id;
+ pass->chan_id[ (unsigned int)lookup[(unsigned int)echan->chan_id] ]= echan->chan_id;
}
}
else { /* unknown */
@@ -831,6 +835,7 @@ typedef struct RGBA
} RGBA;
+#if 0
static void exr_print_filecontents(InputFile *file)
{
const ChannelList &channels = file->header().channels();
@@ -841,6 +846,7 @@ static void exr_print_filecontents(InputFile *file)
printf("OpenEXR-load: Found channel %s of type %d\n", i.name(), channel.type);
}
}
+#endif
static int exr_has_zbuffer(InputFile *file)
{
@@ -848,7 +854,6 @@ static int exr_has_zbuffer(InputFile *file)
for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); ++i)
{
- const Channel &channel = i.channel();
if(strcmp("Z", i.name())==0)
return 1;
}
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/rectop.c b/source/blender/imbuf/intern/rectop.c
index 55cd4b9b6a1..63de3bd2355 100644
--- a/source/blender/imbuf/intern/rectop.c
+++ b/source/blender/imbuf/intern/rectop.c
@@ -521,52 +521,81 @@ void IMB_rectfill(struct ImBuf *drect, float col[4])
#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 IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, int y2)
+
+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;
-
- if ((!ibuf) || (!col))
+ float a, ai;
+ if ((!rect && !rectf) || (!col) || col[3]==0.0)
return;
/* sanity checks for coords */
- CLAMP(x1, 0, ibuf->x);
- CLAMP(x2, 0, ibuf->x);
- CLAMP(y1, 0, ibuf->y);
- CLAMP(y2, 0, ibuf->y);
+ 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;
- if (ibuf->rect) {
- unsigned char *img, *pixel;
- unsigned char chr, chg, chb;
+ a = col[3];
+ ai = 1-a;
- chr = FTOCHAR(col[0]);
- chg = FTOCHAR(col[1]);
- chb = FTOCHAR(col[2]);
+
+ if (rect) {
+ unsigned char *pixel;
+ unsigned char chr=0, chg=0, chb=0;
+ float fr=0, fg=0, fb=0;
- img = (unsigned char *) ibuf->rect;
+ 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 = img + 4 * (((y1 + j) * ibuf->x) + (x1 + i));
- pixel[0] = chr;
- pixel[1] = chg;
- pixel[2] = chb;
+ 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 (ibuf->rect_float) {
- float *img, *pixel;
- img = ibuf->rect_float;
+ if (rectf) {
+ float *pixel;
for (j = 0; j < y2-y1; j++) {
for (i = 0; i < x2-x1; i++) {
- pixel = img + 4 * (((y1 + j) * ibuf->x) + (x1 + i));
- pixel[0] = col[0];
- pixel[1] = col[1];
- pixel[2] = col[2];
+ 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 42b30d6284f..8f5fb39d956 100644
--- a/source/blender/imbuf/intern/rotate.c
+++ b/source/blender/imbuf/intern/rotate.c
@@ -43,48 +43,55 @@
void IMB_flipy(struct ImBuf * ibuf)
{
- short x, y;
- unsigned int *top, *bottom, do_float=0, *line;
- float *topf=NULL, *bottomf=NULL, *linef=NULL;
+ int x, y;
if (ibuf == NULL) return;
- if (ibuf->rect == NULL) return;
-
- if (ibuf->rect_float) do_float =1;
- x = ibuf->x;
- y = ibuf->y;
+ if (ibuf->rect) {
+ unsigned int *top, *bottom, *line;
+
+ x = ibuf->x;
+ y = ibuf->y;
- top = ibuf->rect;
- bottom = top + ((y-1) * x);
- line= MEM_mallocN(x*sizeof(int), "linebuf");
+ top = ibuf->rect;
+ bottom = top + ((y-1) * x);
+ line= MEM_mallocN(x*sizeof(int), "linebuf");
- if (do_float) {
+ y >>= 1;
+
+ for(;y>0;y--) {
+ memcpy(line, top, x*sizeof(int));
+ memcpy(top, bottom, x*sizeof(int));
+ memcpy(bottom, line, x*sizeof(int));
+ bottom -= x;
+ top+= x;
+ }
+
+ MEM_freeN(line);
+ }
+
+ if (ibuf->rect_float) {
+ float *topf=NULL, *bottomf=NULL, *linef=NULL;
+
+ x = ibuf->x;
+ y = ibuf->y;
+
topf= ibuf->rect_float;
bottomf = topf + 4*((y-1) * x);
linef= MEM_mallocN(4*x*sizeof(float), "linebuff");
- }
- y >>= 1;
-
- for(;y>0;y--) {
-
- memcpy(line, top, x*sizeof(int));
- memcpy(top, bottom, x*sizeof(int));
- memcpy(bottom, line, x*sizeof(int));
- bottom -= x;
- top+= x;
-
- if(do_float) {
+
+ y >>= 1;
+
+ for(;y>0;y--) {
memcpy(linef, topf, 4*x*sizeof(float));
memcpy(topf, bottomf, 4*x*sizeof(float));
memcpy(bottomf, linef, 4*x*sizeof(float));
bottomf -= 4*x;
topf+= 4*x;
}
+
+ MEM_freeN(linef);
}
-
- MEM_freeN(line);
- if(linef) MEM_freeN(linef);
}
void IMB_flipx(struct ImBuf * ibuf)
diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c
index cd933cb0767..59a5c310601 100644
--- a/source/blender/imbuf/intern/scaling.c
+++ b/source/blender/imbuf/intern/scaling.c
@@ -483,6 +483,468 @@ struct ImBuf *IMB_halflace(struct ImBuf *ibuf1)
return (ibuf2);
}
+/* q_scale_linear_interpolation helper functions */
+
+static void enlarge_picture_byte(
+ unsigned char* src, unsigned char* dst, int src_width,
+ int src_height, int dst_width, int dst_height)
+{
+ double ratiox = (double) (dst_width - 1.0)
+ / (double) (src_width - 1.001);
+ double ratioy = (double) (dst_height - 1.0)
+ / (double) (src_height - 1.001);
+ unsigned long x_src, dx_src, x_dst;
+ unsigned long y_src, dy_src, y_dst;
+
+ dx_src = 65536.0 / ratiox;
+ dy_src = 65536.0 / ratioy;
+
+ y_src = 0;
+ for (y_dst = 0; y_dst < dst_height; y_dst++) {
+ unsigned char* line1 = src + (y_src >> 16) * 4 * src_width;
+ unsigned char* line2 = line1 + 4 * src_width;
+ unsigned long weight1y = 65536 - (y_src & 0xffff);
+ unsigned long weight2y = 65536 - weight1y;
+
+ if ((y_src >> 16) == src_height - 1) {
+ line2 = line1;
+ }
+
+ x_src = 0;
+ for (x_dst = 0; x_dst < dst_width; x_dst++) {
+ unsigned long weight1x = 65536 - (x_src & 0xffff);
+ unsigned long weight2x = 65536 - weight1x;
+
+ unsigned long x = (x_src >> 16) * 4;
+
+ *dst++ = ((((line1[x] * weight1y) >> 16)
+ * weight1x) >> 16)
+ + ((((line2[x] * weight2y) >> 16)
+ * weight1x) >> 16)
+ + ((((line1[4 + x] * weight1y) >> 16)
+ * weight2x) >> 16)
+ + ((((line2[4 + x] * weight2y) >> 16)
+ * weight2x) >> 16);
+
+ *dst++ = ((((line1[x + 1] * weight1y) >> 16)
+ * weight1x) >> 16)
+ + ((((line2[x + 1] * weight2y) >> 16)
+ * weight1x) >> 16)
+ + ((((line1[4 + x + 1] * weight1y) >> 16)
+ * weight2x) >> 16)
+ + ((((line2[4 + x + 1] * weight2y) >> 16)
+ * weight2x) >> 16);
+
+ *dst++ = ((((line1[x + 2] * weight1y) >> 16)
+ * weight1x) >> 16)
+ + ((((line2[x + 2] * weight2y) >> 16)
+ * weight1x) >> 16)
+ + ((((line1[4 + x + 2] * weight1y) >> 16)
+ * weight2x) >> 16)
+ + ((((line2[4 + x + 2] * weight2y) >> 16)
+ * weight2x) >> 16);
+
+ *dst++ = ((((line1[x + 3] * weight1y) >> 16)
+ * weight1x) >> 16)
+ + ((((line2[x + 3] * weight2y) >> 16)
+ * weight1x) >> 16)
+ + ((((line1[4 + x + 3] * weight1y) >> 16)
+ * weight2x) >> 16)
+ + ((((line2[4 + x + 3] * weight2y) >> 16)
+ * weight2x) >> 16);
+
+ x_src += dx_src;
+ }
+ y_src += dy_src;
+ }
+}
+
+struct scale_outpix_byte {
+ unsigned long r;
+ unsigned long g;
+ unsigned long b;
+ unsigned long a;
+
+ unsigned long weight;
+};
+
+static void shrink_picture_byte(
+ unsigned char* src, unsigned char* dst, int src_width,
+ int src_height, int dst_width, int dst_height)
+{
+ double ratiox = (double) (dst_width) / (double) (src_width);
+ double ratioy = (double) (dst_height) / (double) (src_height);
+ unsigned long x_src, dx_dst, x_dst;
+ unsigned long y_src, dy_dst, y_dst;
+ long y_counter;
+ unsigned char * dst_begin = dst;
+
+ struct scale_outpix_byte * dst_line1 = NULL;
+ struct scale_outpix_byte * dst_line2 = NULL;
+
+ dst_line1 = (struct scale_outpix_byte*) MEM_callocN(
+ (dst_width + 1) * sizeof(struct scale_outpix_byte),
+ "shrink_picture_byte 1");
+ dst_line2 = (struct scale_outpix_byte*) MEM_callocN(
+ (dst_width + 1) * sizeof(struct scale_outpix_byte),
+ "shrink_picture_byte 2");
+
+ dx_dst = 65536.0 * ratiox;
+ dy_dst = 65536.0 * ratioy;
+
+ y_dst = 0;
+ y_counter = 65536;
+ for (y_src = 0; y_src < src_height; y_src++) {
+ unsigned char* line = src + y_src * 4 * src_width;
+ unsigned long weight1y = 65536 - (y_dst & 0xffff);
+ unsigned long weight2y = 65536 - weight1y;
+ x_dst = 0;
+ for (x_src = 0; x_src < src_width; x_src++) {
+ unsigned long weight1x = 65536 - (x_dst & 0xffff);
+ unsigned long weight2x = 65536 - weight1x;
+
+ unsigned long x = x_dst >> 16;
+
+ unsigned long w;
+
+ w = (weight1y * weight1x) >> 16;
+
+ dst_line1[x].r += (line[0] * w) >> 16;
+ dst_line1[x].g += (line[1] * w) >> 16;
+ dst_line1[x].b += (line[2] * w) >> 16;
+ dst_line1[x].a += (line[3] * w) >> 16;
+ dst_line1[x].weight += w;
+
+ w = (weight2y * weight1x) >> 16;
+
+ dst_line2[x].r += (line[0] * w) >> 16;
+ dst_line2[x].g += (line[1] * w) >> 16;
+ dst_line2[x].b += (line[2] * w) >> 16;
+ dst_line2[x].a += (line[3] * w) >> 16;
+ dst_line2[x].weight += w;
+
+ w = (weight1y * weight2x) >> 16;
+
+ dst_line1[x+1].r += (line[0] * w) >> 16;
+ dst_line1[x+1].g += (line[1] * w) >> 16;
+ dst_line1[x+1].b += (line[2] * w) >> 16;
+ dst_line1[x+1].a += (line[3] * w) >> 16;
+ dst_line1[x+1].weight += w;
+
+ w = (weight2y * weight2x) >> 16;
+
+ dst_line2[x+1].r += (line[0] * w) >> 16;
+ dst_line2[x+1].g += (line[1] * w) >> 16;
+ dst_line2[x+1].b += (line[2] * w) >> 16;
+ dst_line2[x+1].a += (line[3] * w) >> 16;
+ dst_line2[x+1].weight += w;
+
+ x_dst += dx_dst;
+ line += 4;
+ }
+
+ y_dst += dy_dst;
+ y_counter -= dy_dst;
+ if (y_counter < 0) {
+ unsigned long x;
+ struct scale_outpix_byte * temp;
+
+ y_counter += 65536;
+
+ for (x=0; x < dst_width; x++) {
+ unsigned long f = 0x80000000UL
+ / dst_line1[x].weight;
+ *dst++ = (dst_line1[x].r * f) >> 15;
+ *dst++ = (dst_line1[x].g * f) >> 15;
+ *dst++ = (dst_line1[x].b * f) >> 15;
+ *dst++ = (dst_line1[x].a * f) >> 15;
+ }
+ memset(dst_line1, 0, dst_width *
+ sizeof(struct scale_outpix_byte));
+ temp = dst_line1;
+ dst_line1 = dst_line2;
+ dst_line2 = temp;
+ }
+ }
+ if (dst - dst_begin < dst_width * dst_height * 4) {
+ unsigned long x;
+ for (x = 0; x < dst_width; x++) {
+ unsigned long f = 0x80000000UL / dst_line1[x].weight;
+ *dst++ = (dst_line1[x].r * f) >> 15;
+ *dst++ = (dst_line1[x].g * f) >> 15;
+ *dst++ = (dst_line1[x].b * f) >> 15;
+ *dst++ = (dst_line1[x].a * f) >> 15;
+ }
+ }
+ MEM_freeN(dst_line1);
+ MEM_freeN(dst_line2);
+}
+
+
+static void q_scale_byte(unsigned char* in, unsigned char* out, int in_width,
+ int in_height, int dst_width, int dst_height)
+{
+ if (dst_width > in_width && dst_height > in_height) {
+ enlarge_picture_byte(in, out, in_width, in_height,
+ dst_width, dst_height);
+ } else if (dst_width < in_width && dst_height < in_height) {
+ shrink_picture_byte(in, out, in_width, in_height,
+ dst_width, dst_height);
+ }
+}
+
+static void enlarge_picture_float(
+ float* src, float* dst, int src_width,
+ int src_height, int dst_width, int dst_height)
+{
+ double ratiox = (double) (dst_width - 1.0)
+ / (double) (src_width - 1.001);
+ double ratioy = (double) (dst_height - 1.0)
+ / (double) (src_height - 1.001);
+ unsigned long x_dst;
+ unsigned long y_dst;
+ double x_src, dx_src;
+ double y_src, dy_src;
+
+ dx_src = 1.0 / ratiox;
+ dy_src = 1.0 / ratioy;
+
+ y_src = 0;
+ for (y_dst = 0; y_dst < dst_height; y_dst++) {
+ float* line1 = src + ((int) y_src) * 4 * src_width;
+ float* line2 = line1 + 4 * src_width;
+ float weight1y = 1.0 - (y_src - (int) y_src);
+ float weight2y = 1.0 - weight1y;
+
+ if ((int) y_src == src_height - 1) {
+ line2 = line1;
+ }
+
+ x_src = 0;
+ for (x_dst = 0; x_dst < dst_width; x_dst++) {
+ float weight1x = 1.0 - (x_src - (int) x_src);
+ float weight2x = 1.0 - weight1x;
+
+ float w11 = weight1y * weight1x;
+ float w21 = weight2y * weight1x;
+ float w12 = weight1y * weight2x;
+ float w22 = weight2y * weight2x;
+
+ unsigned long x = ((int) x_src) * 4;
+
+ *dst++ = line1[x] * w11
+ + line2[x] * w21
+ + line1[4 + x] * w12
+ + line2[4 + x] * w22;
+
+ *dst++ = line1[x + 1] * w11
+ + line2[x + 1] * w21
+ + line1[4 + x + 1] * w12
+ + line2[4 + x + 1] * w22;
+
+ *dst++ = line1[x + 2] * w11
+ + line2[x + 2] * w21
+ + line1[4 + x + 2] * w12
+ + line2[4 + x + 2] * w22;
+
+ *dst++ = line1[x + 3] * w11
+ + line2[x + 3] * w21
+ + line1[4 + x + 3] * w12
+ + line2[4 + x + 3] * w22;
+
+ x_src += dx_src;
+ }
+ y_src += dy_src;
+ }
+}
+
+struct scale_outpix_float {
+ float r;
+ float g;
+ float b;
+ float a;
+
+ float weight;
+};
+
+static void shrink_picture_float(
+ float* src, float* dst, int src_width,
+ int src_height, int dst_width, int dst_height)
+{
+ double ratiox = (double) (dst_width) / (double) (src_width);
+ double ratioy = (double) (dst_height) / (double) (src_height);
+ unsigned long x_src;
+ unsigned long y_src;
+ float dx_dst, x_dst;
+ float dy_dst, y_dst;
+ float y_counter;
+ float * dst_begin = dst;
+
+ struct scale_outpix_float * dst_line1;
+ struct scale_outpix_float * dst_line2;
+
+ dst_line1 = (struct scale_outpix_float*) MEM_callocN(
+ (dst_width + 1) * sizeof(struct scale_outpix_float),
+ "shrink_picture_float 1");
+ dst_line2 = (struct scale_outpix_float*) MEM_callocN(
+ (dst_width + 1) * sizeof(struct scale_outpix_float),
+ "shrink_picture_float 2");
+
+ dx_dst = ratiox;
+ dy_dst = ratioy;
+
+ y_dst = 0;
+ y_counter = 1.0;
+ for (y_src = 0; y_src < src_height; y_src++) {
+ float* line = src + y_src * 4 * src_width;
+ unsigned long weight1y = 1.0 - (y_dst - (int) y_dst);
+ unsigned long weight2y = 1.0 - weight1y;
+ x_dst = 0;
+ for (x_src = 0; x_src < src_width; x_src++) {
+ unsigned long weight1x = 1.0 - (x_dst - (int) x_dst);
+ unsigned long weight2x = 1.0 - weight1x;
+
+ unsigned long x = (int) x_dst;
+
+ float w;
+
+ w = weight1y * weight1x;
+
+ dst_line1[x].r += line[0] * w;
+ dst_line1[x].g += line[1] * w;
+ dst_line1[x].b += line[2] * w;
+ dst_line1[x].a += line[3] * w;
+ dst_line1[x].weight += w;
+
+ w = weight2y * weight1x;
+
+ dst_line2[x].r += line[0] * w;
+ dst_line2[x].g += line[1] * w;
+ dst_line2[x].b += line[2] * w;
+ dst_line2[x].a += line[3] * w;
+ dst_line2[x].weight += w;
+
+ w = weight1y * weight2x;
+
+ dst_line1[x+1].r += line[0] * w;
+ dst_line1[x+1].g += line[1] * w;
+ dst_line1[x+1].b += line[2] * w;
+ dst_line1[x+1].a += line[3] * w;
+ dst_line1[x+1].weight += w;
+
+ w = weight2y * weight2x;
+
+ dst_line2[x+1].r += line[0] * w;
+ dst_line2[x+1].g += line[1] * w;
+ dst_line2[x+1].b += line[2] * w;
+ dst_line2[x+1].a += line[3] * w;
+ dst_line2[x+1].weight += w;
+
+ x_dst += dx_dst;
+ line += 4;
+ }
+
+ y_dst += dy_dst;
+ y_counter -= dy_dst;
+ if (y_counter < 0) {
+ unsigned long x;
+ struct scale_outpix_float * temp;
+
+ y_counter += 1.0;
+
+ for (x=0; x < dst_width; x++) {
+ float f = 1.0 / dst_line1[x].weight;
+ *dst++ = dst_line1[x].r * f;
+ *dst++ = dst_line1[x].g * f;
+ *dst++ = dst_line1[x].b * f;
+ *dst++ = dst_line1[x].a * f;
+ }
+ memset(dst_line1, 0, dst_width *
+ sizeof(struct scale_outpix_float));
+ temp = dst_line1;
+ dst_line1 = dst_line2;
+ dst_line2 = temp;
+ }
+ }
+ if (dst - dst_begin < dst_width * dst_height * 4) {
+ unsigned long x;
+ for (x = 0; x < dst_width; x++) {
+ float f = 1.0 / dst_line1[x].weight;
+ *dst++ = dst_line1[x].r * f;
+ *dst++ = dst_line1[x].g * f;
+ *dst++ = dst_line1[x].b * f;
+ *dst++ = dst_line1[x].a * f;
+ }
+ }
+ MEM_freeN(dst_line1);
+ MEM_freeN(dst_line2);
+}
+
+
+static void q_scale_float(float* in, float* out, int in_width,
+ int in_height, int dst_width, int dst_height)
+{
+ if (dst_width > in_width && dst_height > in_height) {
+ enlarge_picture_float(in, out, in_width, in_height,
+ dst_width, dst_height);
+ } else if (dst_width < in_width && dst_height < in_height) {
+ shrink_picture_float(in, out, in_width, in_height,
+ dst_width, dst_height);
+ }
+}
+
+/* q_scale_linear_interpolation (derived from ppmqscale, http://libdv.sf.net)
+
+ q stands for quick _and_ quality :)
+
+ only handles common cases when we either
+
+ scale both, x and y or
+ shrink both, x and y
+
+ but that is pretty fast:
+ * does only blit once instead of two passes like the old code
+ (fewer cache misses)
+ * uses fixed point integer arithmetic for byte buffers
+ * doesn't branch in tight loops
+
+ Should be comparable in speed to the ImBuf ..._fast functions at least
+ for byte-buffers.
+
+*/
+static int q_scale_linear_interpolation(
+ struct ImBuf *ibuf, int newx, int newy)
+{
+ if ((newx > ibuf->x && newy < ibuf->y) ||
+ (newx < ibuf->x && newy > ibuf->y)) {
+ return FALSE;
+ }
+
+ if (ibuf->rect) {
+ unsigned char * newrect =
+ MEM_mallocN(newx * newy * sizeof(int), "q_scale rect");
+ q_scale_byte(ibuf->rect, newrect, ibuf->x, ibuf->y,
+ newx, newy);
+
+ imb_freerectImBuf(ibuf);
+ ibuf->mall |= IB_rect;
+ ibuf->rect = (unsigned int *) newrect;
+ }
+ if (ibuf->rect_float) {
+ float * newrect =
+ MEM_mallocN(newx * newy * 4 *sizeof(float),
+ "q_scale rectfloat");
+ q_scale_float(ibuf->rect_float, newrect, ibuf->x, ibuf->y,
+ newx, newy);
+ imb_freerectfloatImBuf(ibuf);
+ ibuf->mall |= IB_rectfloat;
+ ibuf->rect_float = newrect;
+ }
+ ibuf->x = newx;
+ ibuf->y = newy;
+
+ return TRUE;
+}
static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx)
{
@@ -1113,11 +1575,18 @@ struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy)
{
if (ibuf==NULL) return (0);
if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
+
+ if (newx == ibuf->x && newy == ibuf->y) { return ibuf; }
- // scaleup / scaledown functions below change ibuf->x and ibuf->y
- // so we first scale the Z-buffer (if any)
+ /* scaleup / scaledown functions below change ibuf->x and ibuf->y
+ so we first scale the Z-buffer (if any) */
scalefast_Z_ImBuf(ibuf, newx, newy);
+ /* try to scale common cases in a fast way */
+ if (q_scale_linear_interpolation(ibuf, newx, newy)) {
+ return ibuf;
+ }
+
if (newx < ibuf->x) if (newx) scaledownx(ibuf,newx);
if (newy < ibuf->y) if (newy) scaledowny(ibuf,newy);
if (newx > ibuf->x) if (newx) scaleupx(ibuf,newx);
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index 131d2ef38f7..718b0537b48 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -27,8 +27,9 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
+/* also defined in BKE_utildefines, repeated here to avoid dependency */
+#define FILE_MAX 240
+
#include "BLI_blenlib.h"
#include "MEM_guardedalloc.h"
@@ -76,18 +77,17 @@ static int get_thumb_dir( char* dir , ThumbSize size)
#endif
switch(size) {
case THB_NORMAL:
- strcat(dir, "/.thumbnails/normal");
+ strcat(dir, "/.thumbnails/normal/");
break;
case THB_LARGE:
- strcat(dir, "/.thumbnails/large");
+ strcat(dir, "/.thumbnails/large/");
break;
case THB_FAIL:
- strcat(dir, "/.thumbnails/fail/blender");
+ strcat(dir, "/.thumbnails/fail/blender/");
break;
default:
return 0; /* unknown size */
}
- BLI_cleanup_dir(G.sce, dir);
return 1;
}
diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c
index 6fc5fb99f8b..42c8ddb7d38 100644
--- a/source/blender/imbuf/intern/tiff.c
+++ b/source/blender/imbuf/intern/tiff.c
@@ -43,7 +43,6 @@
* used to compress images.
*/
-#include <assert.h>
#include <string.h>
#include "imbuf.h"
@@ -108,7 +107,6 @@ int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
*
* @return: Number of bytes actually read.
* 0 = EOF.
- * -1 = Error (never returned).
*/
tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n)
{
@@ -118,8 +116,10 @@ tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n)
/* get the pointer to the in-memory file */
mfile = IMB_TIFF_GET_MEMFILE(handle);
- assert(mfile != NULL);
- assert(mfile->mem != NULL);
+ if (!mfile || !mfile->mem) {
+ fprintf(stderr, "imb_tiff_ReadProc: !mfile || !mfile->mem!\n");
+ return 0;
+ }
/* find the actual number of bytes to read (copy) */
nCopy = n;
@@ -136,7 +136,6 @@ tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n)
return (0);
/* all set -> do the read (copy) */
- assert(sizeof(unsigned char) == 1);
srcAddr = (void*)(&(mfile->mem[mfile->offset]));
memcpy((void*)data, srcAddr, nCopy);
mfile->offset += nCopy; /* advance file ptr by copied bytes */
@@ -180,8 +179,10 @@ toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence)
/* get the pointer to the in-memory file */
mfile = IMB_TIFF_GET_MEMFILE(handle);
- assert(mfile != NULL);
- assert(mfile->mem != NULL);
+ if (!mfile || !mfile->mem) {
+ fprintf(stderr, "imb_tiff_SeekProc: !mfile || !mfile->mem!\n");
+ return (-1);
+ }
/* find the location we plan to seek to */
switch (whence) {
@@ -193,7 +194,9 @@ toff_t imb_tiff_SeekProc(thandle_t handle, toff_t ofs, int whence)
break;
default:
/* no other types are supported - return an error */
- printf("Unsupported TIFF SEEK type.\n");
+ fprintf(stderr,
+ "imb_tiff_SeekProc: "
+ "Unsupported TIFF SEEK type.\n");
return (-1);
}
@@ -222,8 +225,10 @@ int imb_tiff_CloseProc(thandle_t handle)
/* get the pointer to the in-memory file */
mfile = IMB_TIFF_GET_MEMFILE(handle);
- assert(mfile != NULL);
- assert(mfile->mem != NULL); /* the file has not been closed yet */
+ if (!mfile || !mfile->mem) {
+ fprintf(stderr,"imb_tiff_CloseProc: !mfile || !mfile->mem!\n");
+ return (0);
+ }
/* virtually close the file */
mfile->mem = NULL;
@@ -246,8 +251,10 @@ toff_t imb_tiff_SizeProc(thandle_t handle)
/* get the pointer to the in-memory file */
mfile = IMB_TIFF_GET_MEMFILE(handle);
- assert(mfile != NULL);
- assert(mfile->mem != NULL);
+ if (!mfile || !mfile->mem) {
+ fprintf(stderr,"imb_tiff_SizeProc: !mfile || !mfile->mem!\n");
+ return (0);
+ }
/* return the size */
return (toff_t)(mfile->size);
@@ -317,7 +324,10 @@ struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
memFile.size = size;
/* check whether or not we have a TIFF file */
- assert(size >= IMB_TIFF_NCB);
+ if (size < IMB_TIFF_NCB) {
+ fprintf(stderr, "imb_loadtiff: size < IMB_TIFF_NCB\n");
+ return NULL;
+ }
if (imb_is_a_tiff(mem) == 0)
return NULL;
@@ -340,7 +350,8 @@ struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
if (ibuf) {
ibuf->ftype = TIF;
} else {
- printf("imb_loadtiff: could not allocate memory for TIFF " \
+ fprintf(stderr,
+ "imb_loadtiff: could not allocate memory for TIFF " \
"image.\n");
libtiff_TIFFClose(image);
return NULL;
@@ -362,7 +373,8 @@ struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
success = libtiff_TIFFReadRGBAImage(
image, width, height, raster, 0);
if (!success) {
- printf("imb_loadtiff: This TIFF format is not " \
+ fprintf(stderr,
+ "imb_loadtiff: This TIFF format is not "
"currently supported by Blender.\n");
libtiff__TIFFfree(raster);
libtiff_TIFFClose(image);
@@ -378,7 +390,8 @@ struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
/* this may not be entirely necessary, but is put here
* in case sizeof(unsigned int) is not a 32-bit
* quantity */
- printf("imb_loadtiff: using (slower) component-wise " \
+ fprintf(stderr,
+ "imb_loadtiff: using (slower) component-wise "
"buffer copy.\n");
to = (unsigned char*)ibuf->rect;
for (pixel_i=0; pixel_i < width*height; pixel_i++)
@@ -437,7 +450,8 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags)
* to gray, RGB, RGBA respectively. */
samplesperpixel = (uint16)((ibuf->depth + 7) >> 3);
if ((samplesperpixel > 4) || (samplesperpixel == 2)) {
- printf("imb_savetiff: unsupported number of bytes per " \
+ fprintf(stderr,
+ "imb_savetiff: unsupported number of bytes per "
"pixel: %d\n", samplesperpixel);
return (0);
}
@@ -445,7 +459,8 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags)
/* open TIFF file for writing */
if (flags & IB_mem) {
/* bork at the creation of a TIFF in memory */
- printf("imb_savetiff: creation of in-memory TIFF files is " \
+ fprintf(stderr,
+ "imb_savetiff: creation of in-memory TIFF files is "
"not yet supported.\n");
return (0);
} else {
@@ -453,7 +468,8 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags)
image = libtiff_TIFFOpen(name, "w");
}
if (image == NULL) {
- printf("imb_savetiff: could not open TIFF for writing.\n");
+ fprintf(stderr,
+ "imb_savetiff: could not open TIFF for writing.\n");
return (0);
}
@@ -462,7 +478,8 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags)
pixels = (unsigned char*)libtiff__TIFFmalloc(npixels *
samplesperpixel * sizeof(unsigned char));
if (pixels == NULL) {
- printf("imb_savetiff: could not allocate pixels array.\n");
+ fprintf(stderr,
+ "imb_savetiff: could not allocate pixels array.\n");
libtiff_TIFFClose(image);
return (0);
}
@@ -533,7 +550,8 @@ short imb_savetiff(struct ImBuf *ibuf, char *name, int flags)
libtiff_TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
if (libtiff_TIFFWriteEncodedStrip(image, 0, pixels,
ibuf->x*ibuf->y*samplesperpixel) == -1) {
- printf("imb_savetiff: Could not write encoded TIFF.\n");
+ fprintf(stderr,
+ "imb_savetiff: Could not write encoded TIFF.\n");
libtiff_TIFFClose(image);
libtiff__TIFFfree(pixels);
return (1);
diff --git a/source/blender/include/BDR_drawaction.h b/source/blender/include/BDR_drawaction.h
index 673b13672c1..72b3de1e54d 100644
--- a/source/blender/include/BDR_drawaction.h
+++ b/source/blender/include/BDR_drawaction.h
@@ -38,6 +38,7 @@ struct Ipo;
struct IpoCurve;
struct gla2DDrawInfo;
struct bAction;
+struct bActionGroup;
struct Object;
struct ListBase;
@@ -67,6 +68,12 @@ typedef struct ActKeyBlock {
} ActKeyBlock;
+/* Inclusion-Range Limiting Struct (optional) */
+typedef struct ActKeysInc {
+ struct Object *ob; /* if present, used to find action-scaled time */
+ float start, end; /* frames (global-time) to only consider keys between */
+} ActKeysInc;
+
/* ******************************* Methods ****************************** */
/* Action Generics */
@@ -75,14 +82,16 @@ void draw_cfra_action(void);
/* Channel Drawing */
void draw_icu_channel(struct gla2DDrawInfo *di, struct IpoCurve *icu, float ypos);
void draw_ipo_channel(struct gla2DDrawInfo *di, struct Ipo *ipo, float ypos);
-void draw_action_channel(struct gla2DDrawInfo *di, bAction *act, float ypos);
-void draw_object_channel(struct gla2DDrawInfo *di, Object *ob, float ypos);
+void draw_agroup_channel(struct gla2DDrawInfo *di, struct bActionGroup *agrp, float ypos);
+void draw_action_channel(struct gla2DDrawInfo *di, struct bAction *act, float ypos);
+void draw_object_channel(struct gla2DDrawInfo *di, struct Object *ob, float ypos);
/* Keydata Generation */
-void icu_to_keylist(struct IpoCurve *icu, 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);
+void icu_to_keylist(struct IpoCurve *icu, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
+void ipo_to_keylist(struct Ipo *ipo, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
+void agroup_to_keylist(struct bActionGroup *agrp, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
+void action_to_keylist(struct bAction *act, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
+void ob_to_keylist(struct Object *ob, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
#endif /* BDR_DRAWACTION_H */
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_editobject.h b/source/blender/include/BDR_editobject.h
index 2a96a8d65cb..df7c41a6b12 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);
@@ -77,6 +79,8 @@ void link_to_scene(unsigned short nr);
void make_links_menu(void);
void make_links(short event);
void make_duplilist_real(void);
+void apply_objects_locrot(void);
+void apply_objects_visual_tx(void);
void apply_object(void);
/* old transform */
@@ -93,6 +97,7 @@ void single_object_users(int flag);
void new_id_matar(struct Material **matar, int totcol);
void single_obdata_users(int flag);
void single_mat_users(int flag);
+void single_ipo_users(int flag);
void do_single_tex_user(struct Tex **from);
void single_tex_users_expand(void);
void single_mat_users_expand(void);
@@ -107,6 +112,8 @@ void set_ob_ipoflags(void);
void select_select_keys(void);
int vergbaseco(const void *a1, const void *a2);
void auto_timeoffs(void);
+void ofs_timeoffs(void);
+void rand_timeoffs(void);
void texspace_edit(void);
void flip_subdivison(int);
void mirrormenu(void);
@@ -117,6 +124,7 @@ void add_hook(void);
void hook_select(struct HookModifierData *hmd);
int hook_getIndexArray(int *tot, int **indexar, char *name, float *cent_r);
+int object_is_libdata(struct Object *ob);
int object_data_is_libdata(struct Object *ob);
void hide_objects(int select);
void show_objects(void);
diff --git a/source/blender/include/BDR_sculptmode.h b/source/blender/include/BDR_sculptmode.h
index c80f9ea8626..e36b8674612 100644
--- a/source/blender/include/BDR_sculptmode.h
+++ b/source/blender/include/BDR_sculptmode.h
@@ -32,13 +32,11 @@
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
-/* For bglMats */
-#include "BIF_glutil.h"
-#include "transform.h"
+#include "BKE_sculpt.h"
struct uiBlock;
+struct BrushAction;
struct BrushData;
-struct EditData;
struct IndexNode;
struct KeyBlock;
struct Mesh;
@@ -49,74 +47,25 @@ struct ScrArea;
struct SculptData;
struct SculptStroke;
-typedef enum PropsetMode {
- PropsetNone = 0,
- PropsetSize,
- PropsetStrength,
- PropsetTexRot
-} PropsetMode;
-typedef struct PropsetData {
- PropsetMode mode;
- unsigned int tex;
- short origloc[2];
- float *texdata;
-
- short origsize;
- char origstrength;
- float origtexrot;
-
- NumInput num;
-} PropsetData;
-
-typedef struct SculptSession {
- bglMats mats;
-
- /* An array of lists; array is sized as
- large as the number of verts in the mesh,
- the list for each vert contains the index
- for all the faces that use that vertex */
- 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;
-
- PropsetData *propset;
-
- /* For rotating around a pivot point */
- vec3f pivot;
-
- struct SculptStroke *stroke;
-} SculptSession;
-
-SculptSession *sculpt_session(void);
+struct SculptSession *sculpt_session(void);
struct SculptData *sculpt_data(void);
/* Memory */
-void sculptmode_init(struct Scene *);
-void sculptmode_free_all(struct Scene *);
void sculptmode_correct_state(void);
/* Interface */
void sculptmode_draw_interface_tools(struct uiBlock *block,unsigned short cx, unsigned short cy);
+void sculptmode_draw_interface_brush(struct uiBlock *block,unsigned short cx, unsigned short cy);
void sculptmode_draw_interface_textures(struct uiBlock *block,unsigned short cx, unsigned short cy);
void sculptmode_rem_tex(void*,void*);
-void sculptmode_propset_init(PropsetMode mode);
-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();
+void sculpt_radialcontrol_start(int mode);
struct BrushData *sculptmode_brush(void);
-float tex_angle(void);
-void do_symmetrical_brush_actions(struct EditData *e, short *, short *);
+void do_symmetrical_brush_actions(struct BrushAction *a, short *, short *);
void sculptmode_update_tex(void);
char sculpt_modifiers_active(struct Object *ob);
@@ -127,16 +76,12 @@ void set_sculptmode(void);
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_apply(struct BrushAction *);
+void sculpt_stroke_apply_all(struct BrushAction *);
void sculpt_stroke_draw();
/* Partial Mesh Visibility */
-struct PartialVisibility *sculptmode_copy_pmv(struct PartialVisibility *);
-void sculptmode_pmv_free(struct PartialVisibility *);
-void sculptmode_revert_pmv(struct Mesh *me);
-void sculptmode_pmv_off(struct Mesh *me);
void sculptmode_pmv(int mode);
#endif
diff --git a/source/blender/include/BIF_butspace.h b/source/blender/include/BIF_butspace.h
index eb2cafad792..9d5e1961178 100644
--- a/source/blender/include/BIF_butspace.h
+++ b/source/blender/include/BIF_butspace.h
@@ -83,11 +83,13 @@ 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
+#define TAB_SCENE_WORLD 1
#define TAB_SCENE_ANIM 2
#define TAB_SCENE_SOUND 3
+#define TAB_SCENE_SEQUENCER 4
/* buts->scaflag */
diff --git a/source/blender/include/BIF_drawtext.h b/source/blender/include/BIF_drawtext.h
index a63e2bb264d..6950f3ba215 100644
--- a/source/blender/include/BIF_drawtext.h
+++ b/source/blender/include/BIF_drawtext.h
@@ -47,7 +47,7 @@ void add_text_fs(char *file);
void free_txt_data(void);
void pop_space_text(struct SpaceText *st);
-void get_format_string(void);
+void get_format_string(struct SpaceText *st);
void do_brackets(void);
#endif
diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h
index fe6f81b9416..f5c13cac69a 100644
--- a/source/blender/include/BIF_editaction.h
+++ b/source/blender/include/BIF_editaction.h
@@ -43,8 +43,10 @@
/* Some types for easier type-testing */
enum {
ACTTYPE_NONE= 0,
+ ACTTYPE_GROUP,
ACTTYPE_ACHAN,
ACTTYPE_CONCHAN,
+ ACTTYPE_CONCHAN2,
ACTTYPE_ICU,
ACTTYPE_FILLIPO,
ACTTYPE_FILLCON,
@@ -53,6 +55,10 @@ enum {
};
/* Macros for easier/more consistant state testing */
+#define EDITABLE_AGRP(agrp) ((agrp->flag & AGRP_PROTECTED)==0)
+#define EXPANDED_AGRP(agrp) (agrp->flag & AGRP_EXPANDED)
+#define SEL_AGRP(agrp) ((agrp->flag & AGRP_SELECTED) || (agrp->flag & AGRP_ACTIVE))
+
#define VISIBLE_ACHAN(achan) ((achan->flag & ACHAN_HIDDEN)==0)
#define EDITABLE_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && ((achan->flag & ACHAN_PROTECTED)==0))
#define EXPANDED_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && (achan->flag & ACHAN_EXPANDED))
@@ -81,7 +87,6 @@ enum {
/* constants for setting ipo-extrapolation type */
enum {
-
SET_EXTEND_MENU = 9,
SET_EXTEND_POPUP = 10,
@@ -91,41 +96,63 @@ enum {
SET_EXTEND_CYCLICEXTRAPOLATION
};
+/* constants for channel rearranging */
+/* WARNING: don't change exising ones without modifying rearrange func accordingly */
+enum {
+ REARRANGE_ACTCHAN_TOP= -2,
+ REARRANGE_ACTCHAN_UP= -1,
+ REARRANGE_ACTCHAN_DOWN= 1,
+ REARRANGE_ACTCHAN_BOTTOM= 2
+};
+
struct bAction;
struct bActionChannel;
+struct bActionGroup;
+struct bPose;
struct bPoseChannel;
struct Object;
struct Ipo;
struct BWinEvent;
struct Key;
struct ListBase;
+struct TimeMarker;
/* Key operations */
void transform_action_keys(int mode, int dummy);
void duplicate_action_keys(void);
+void snap_cfra_action(void);
void snap_action_keys(short mode);
void mirror_action_keys(short mode);
void insertkey_action(void);
void delete_action_keys(void);
void delete_action_channels(void);
void clean_action(void);
+void sample_action_keys(void);
/* Column/Channel Key select */
void column_select_action_keys(int mode);
void selectall_action_keys(short mval[], short mode, short selectmode);
void markers_selectkeys_between(void);
+void nextprev_action_keyframe(short dir);
/* 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);
-void top_sel_action(void);
-void bottom_sel_action(void);
+/* Group/Channel Operations */
+struct bActionGroup *get_active_actiongroup(struct bAction *act);
+void set_active_actiongroup(struct bAction *act, struct bActionGroup *agrp, short select);
+void verify_pchan2achan_grouping(struct bAction *act, struct bPose *pose, char name[]);
+void action_groups_group(short add_group);
+void action_groups_ungroup(void);
+
+/* Channel/Strip Operations */
+void rearrange_action_channels(short mode);
+
+void expand_all_action(void);
+void openclose_level_action(short mode);
/* IPO/Handle Types */
void sethandles_action_keys(int code);
@@ -138,6 +165,13 @@ 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 selectkeys_leftright (short leftright, short select_mode);
+
+/* Action Markers */
+void action_set_activemarker(struct bAction *act, struct TimeMarker *active, short deselect);
+void action_add_localmarker(struct bAction *act, int frame);
+void action_rename_localmarker(struct bAction *act);
+void action_remove_localmarkers(struct bAction *act);
/* ShapeKey stuff */
struct Key *get_action_mesh_key(void);
diff --git a/source/blender/include/BIF_editarmature.h b/source/blender/include/BIF_editarmature.h
index 903c663e5f3..cc34cb58ae3 100644
--- a/source/blender/include/BIF_editarmature.h
+++ b/source/blender/include/BIF_editarmature.h
@@ -84,8 +84,11 @@ void delete_armature(void);
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(int numcuts);
+void fill_bones_armature(void);
+void merge_armature(void);
void free_editArmature(void);
@@ -101,6 +104,8 @@ void make_trans_bones (char mode);
int do_pose_selectbuffer(struct Base *base, unsigned int *buffer, short hits);
+void generateSkeleton(void);
+
void mouse_armature(void);
void remake_editArmature(void);
void selectconnected_armature(void);
@@ -117,12 +122,13 @@ void hide_selected_pose_bones(void);
void hide_unselected_pose_bones(void);
void show_all_pose_bones(void);
-int bone_looper(Object *ob, struct Bone *bone, void *data,
- int (*bone_func)(Object *, struct Bone *, void *));
+int bone_looper(struct Object *ob, struct Bone *bone, void *data,
+ int (*bone_func)(struct Object *, struct Bone *, void *));
void undo_push_armature(char *name);
void armature_bone_rename(struct bArmature *arm, char *oldname, char *newname);
void armature_flip_names(void);
+void armature_autoside_names(short axis);
EditBone *armature_bone_get_mirrored(EditBone *ebo);
void transform_armature_mirror_update(void);
diff --git a/source/blender/include/BIF_editconstraint.h b/source/blender/include/BIF_editconstraint.h
index f9ed4048fc7..81e2356e6cb 100644
--- a/source/blender/include/BIF_editconstraint.h
+++ b/source/blender/include/BIF_editconstraint.h
@@ -41,29 +41,23 @@ struct bConstraintChannel;
struct Text;
/* generic constraint editing functions */
-
-struct bConstraint *add_new_constraint(short type);
-
-void add_constraint_to_object(struct bConstraint *con, struct Object *ob);
-
struct ListBase *get_active_constraints(struct Object *ob);
struct bConstraint *get_active_constraint(struct Object *ob);
struct ListBase *get_active_constraint_channels (struct Object *ob, int forcevalid);
struct bConstraintChannel *get_active_constraint_channel(struct Object *ob);
-void object_test_constraints(struct Object *owner);
-
-void add_constraint(int only_IK);
+void add_constraint_to_object(struct bConstraint *con, struct Object *ob);
+struct bConstraint *add_new_constraint(short type);
+void add_constraint(short 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);
+void object_test_constraints(struct Object *owner);
-/* two special functions for PyConstraints */
+/* 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);
diff --git a/source/blender/include/BIF_editdeform.h b/source/blender/include/BIF_editdeform.h
index 2a8f43c14e7..84deb134be9 100644
--- a/source/blender/include/BIF_editdeform.h
+++ b/source/blender/include/BIF_editdeform.h
@@ -50,6 +50,7 @@ void del_defgroup (struct Object *ob);
void duplicate_defgroup ( struct Object *ob );
void assign_verts_defgroup (void);
void remove_verts_defgroup (int allverts);
+void remove_verts_defgroups (int allverts);
void sel_verts_defgroup (int select);
struct MDeformWeight *get_defweight (struct MDeformVert *dv, int defgroup);
@@ -61,6 +62,8 @@ void add_vert_to_defgroup (struct Object *ob, struct bDeformGroup *dg,
int assignmode);
void remove_vert_defgroup (struct Object *ob, struct bDeformGroup *dg,
int vertnum);
+float get_vert_defgroup (struct Object *ob, struct bDeformGroup *dg,
+ int vertnum);
void create_dverts(ID *id);
void vertexgroup_select_by_name(struct Object *ob, char *name);
diff --git a/source/blender/include/BIF_editparticle.h b/source/blender/include/BIF_editparticle.h
new file mode 100644
index 00000000000..6074dcd4fec
--- /dev/null
+++ b/source/blender/include/BIF_editparticle.h
@@ -0,0 +1,98 @@
+/* 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;
+struct RadialControl;
+
+/* 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);
+int PE_can_edit(struct ParticleSystem *psys);
+
+/* 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);
+struct RadialControl **PE_radialcontrol();
+
+/* 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, int useflag);
+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);
+void PE_selectbrush_menu(void);
+void PE_remove_doubles(void);
+void PE_radialcontrol_start(const int mode);
+
+/* 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 54c57e3331d..2874cade043 100644
--- a/source/blender/include/BIF_editseq.h
+++ b/source/blender/include/BIF_editseq.h
@@ -40,9 +40,11 @@ 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);
@@ -60,6 +62,7 @@ void mouse_select_seq(void);
void no_gaps(void);
void seq_snap(short event);
void seq_snap_menu(void);
+void seq_mute_sel( int mute );
void set_filter_seq(void);
void swap_select_seq(void);
void touch_seq_files(void);
@@ -75,8 +78,17 @@ 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);
+int test_overlap_seq(struct Sequence *test);
+void shuffle_seq(struct Sequence *test);
struct Sequence* alloc_sequence(ListBase *lb, int cfra, int machine); /*used from python*/
-int check_single_image_seq(struct Sequence *seq);
+int check_single_seq(struct Sequence *seq);
+
+/* seq funcs 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.
+*/
/* sequence transform functions, for internal used */
int seq_tx_get_start(struct Sequence *seq);
@@ -92,42 +104,9 @@ void seq_tx_set_final_right(struct Sequence *seq, int i);
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)
+#define SEQ_DEBUG_INFO(seq) printf("seq into '%s' -- len:%i start:%i startstill:%i endstill:%i startofs:%i endofs:%i depth:%i\n",\
+ seq->name, seq->len, seq->start, seq->startstill, seq->endstill, seq->startofs, seq->endofs, seq->depth)
-/* 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);
#endif
diff --git a/source/blender/include/BIF_editsima.h b/source/blender/include/BIF_editsima.h
index a8a5c16df1a..aba2430fe1f 100644
--- a/source/blender/include/BIF_editsima.h
+++ b/source/blender/include/BIF_editsima.h
@@ -40,31 +40,6 @@ struct MTFace;
#define TF_PIN_MASK(id) (TF_PIN1 << id)
#define TF_SEL_MASK(id) (TF_SEL1 << id)
-
-/* this checks weather a face is drarn without the local image check
- * - warning - no check for G.sima->flag, use SIMA_FACEDRAW_CHECK
- */
-#define SIMA_FACEDRAW_CHECK_NOLOCAL(efa) \
- ((G.sima->flag & SI_SYNC_UVSEL) ? (efa->h==0) : (efa->h==0 && efa->f & SELECT))
-
-/* this check includes the local image check - (does the faces image match the space image?) */
-#define SIMA_FACEDRAW_CHECK(efa, tf) \
- ((G.sima && G.sima->flag & SI_LOCAL_UV) ? ((tf->tpage==G.sima->image) ? SIMA_FACEDRAW_CHECK_NOLOCAL(efa):0) : (SIMA_FACEDRAW_CHECK_NOLOCAL(efa)))
-
-#define SIMA_FACESEL_CHECK(efa, tf) \
- ((G.sima && G.sima->flag & SI_SYNC_UVSEL) ? (efa->f & SELECT) : (!(~tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) &&(!efa->v4 || tf->flag & TF_SEL4)))
-#define SIMA_FACESEL_SET(efa, tf) \
- ((G.sima && G.sima->flag & SI_SYNC_UVSEL) ? (EM_select_face(efa, 1)) : (tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)))
-#define SIMA_FACESEL_UNSET(efa, tf) \
- ((G.sima && G.sima->flag & SI_SYNC_UVSEL) ? (EM_select_face(efa, 0)) : (tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)))
-
-#define SIMA_UVSEL_CHECK(efa, tf, i) ((G.sima && G.sima->flag & SI_SYNC_UVSEL) ? \
- (G.scene->selectmode == SCE_SELECT_FACE ? efa->f & SELECT : ((*(&efa->v1 + i))->f & SELECT) ) : (tf->flag & TF_SEL_MASK(i) ))
-#define SIMA_UVSEL_SET(efa, tf, i) ((G.sima && G.sima->flag & SI_SYNC_UVSEL) ? \
- (G.scene->selectmode == SCE_SELECT_FACE ? EM_select_face(efa, 1) : ((*(&efa->v1 + i))->f |= SELECT) ) : (tf->flag |= TF_SEL_MASK(i) ))
-#define SIMA_UVSEL_UNSET(efa, tf, i) ((G.sima && G.sima->flag & SI_SYNC_UVSEL) ? \
- (G.scene->selectmode == SCE_SELECT_FACE ? EM_select_face(efa, 0) : ((*(&efa->v1 + i))->f &= ~SELECT) ) : (tf->flag &= ~TF_SEL_MASK(i) ))
-
struct Object;
void object_uvs_changed(struct Object *ob);
@@ -90,7 +65,6 @@ 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_limit_uv_tface(void);
@@ -122,3 +96,16 @@ void pack_image_sima(void);
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..d47bd82332f 100644
--- a/source/blender/include/BIF_editview.h
+++ b/source/blender/include/BIF_editview.h
@@ -39,10 +39,12 @@ 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);
void selectswap(void);
+void selectrandom(void);
void selectall_type(short obtype);
void selectall_layer(unsigned int layernum);
void draw_sel_circle(short *mval, short *mvalo, float rad, float rado, int selecting);
diff --git a/source/blender/include/BIF_filelist.h b/source/blender/include/BIF_filelist.h
index b81be38da01..730a41c22e9 100644
--- a/source/blender/include/BIF_filelist.h
+++ b/source/blender/include/BIF_filelist.h
@@ -52,7 +52,6 @@ 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);
-void BIF_filelist_appenddir(struct FileList* filelist, const char *relname);
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);
diff --git a/source/blender/include/BIF_gl.h b/source/blender/include/BIF_gl.h
index 215e88dc002..67d51edc531 100644
--- a/source/blender/include/BIF_gl.h
+++ b/source/blender/include/BIF_gl.h
@@ -53,11 +53,16 @@
#endif
#ifdef __APPLE__
-#include <OpenGL/gl.h>
-#include <OpenGL/glu.h>
+ #include <OpenGL/gl.h>
+ #include <OpenGL/glu.h>
#else
-#include <GL/gl.h>
-#include <GL/glu.h>
+ #if defined (__sun) || defined (__sun__)
+ #include <GL/gl.h>
+ #include <mesa/glu.h>
+ #else
+ #include <GL/gl.h>
+ #include <GL/glu.h>
+ #endif
#endif
/*
* these should be phased out. cpack should be replaced in
diff --git a/source/blender/include/BIF_interface.h b/source/blender/include/BIF_interface.h
index 453e4e628fe..4fadfe12297 100644
--- a/source/blender/include/BIF_interface.h
+++ b/source/blender/include/BIF_interface.h
@@ -188,7 +188,7 @@ void uiGetMouse(int win, short *adr);
void uiComposeLinks(uiBlock *block);
void uiSetButLock(int val, char *lockstr);
void uiClearButLock(void);
-int uiDoBlocks(struct ListBase *lb, int event);
+int uiDoBlocks(struct ListBase *lb, int event, int movemouse_quit);
void uiSetCurFont(uiBlock *block, int index);
void uiDefFont(unsigned int index, void *xl, void *large, void *medium, void *small);
void uiFreeBlock(uiBlock *block);
diff --git a/source/blender/include/BIF_meshlaplacian.h b/source/blender/include/BIF_meshlaplacian.h
index 1e10336723f..74e4fef0937 100644
--- a/source/blender/include/BIF_meshlaplacian.h
+++ b/source/blender/include/BIF_meshlaplacian.h
@@ -39,6 +39,7 @@
struct Object;
struct Mesh;
struct bDeformGroup;
+struct MeshDeformModifierData;
#ifdef RIGID_DEFORM
struct EditMesh;
@@ -77,5 +78,10 @@ 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_outliner.h b/source/blender/include/BIF_outliner.h
index 34ed7950421..582b2cc1ada 100644
--- a/source/blender/include/BIF_outliner.h
+++ b/source/blender/include/BIF_outliner.h
@@ -78,6 +78,8 @@ typedef struct TreeElement {
#define TSE_LINKED_MAT 22
/* NOTE, is used for light group */
#define TSE_LINKED_LAMP 23
+#define TSE_POSEGRP_BASE 24
+#define TSE_POSEGRP 25
/* outliner search flags */
#define OL_FIND 0
@@ -97,6 +99,9 @@ extern void outliner_show_hierarchy(struct ScrArea *sa);
extern void outliner_one_level(struct ScrArea *sa, int add);
extern void outliner_select(struct ScrArea *sa);
extern void outliner_toggle_selected(struct ScrArea *sa);
+extern void outliner_toggle_visibility(struct ScrArea *sa);
+extern void outliner_toggle_selectability(struct ScrArea *sa);
+extern void outliner_toggle_renderability(struct ScrArea *sa);
extern void outliner_del(struct ScrArea *sa);
extern void outliner_operation_menu(struct ScrArea *sa);
extern void outliner_page_up_down(struct ScrArea *sa, int up);
diff --git a/source/blender/include/BIF_poselib.h b/source/blender/include/BIF_poselib.h
new file mode 100644
index 00000000000..209c386d2d6
--- /dev/null
+++ b/source/blender/include/BIF_poselib.h
@@ -0,0 +1,55 @@
+/**
+ * $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) 2007 Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: this is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef BIF_POSELIB_H
+#define BIF_POSELIB_H
+
+struct Object;
+struct bAction;
+struct TimeMarker;
+
+char *poselib_build_poses_menu(struct bAction *act, char title[]);
+int poselib_get_free_index(struct bAction *act);
+struct TimeMarker *poselib_get_active_pose(struct bAction *act);
+
+struct bAction *poselib_init_new(struct Object *ob);
+struct bAction *poselib_validate(struct Object *ob);
+
+void poselib_validate_act(struct bAction *act);
+
+void poselib_remove_pose(struct Object *ob, struct TimeMarker *marker);
+void poselib_rename_pose(struct Object *ob);
+void poselib_add_current_pose(struct Object *ob, int mode);
+
+void poselib_preview_poses(struct Object *ob, short apply_active);
+
+#endif
diff --git a/source/blender/include/BIF_poseobject.h b/source/blender/include/BIF_poseobject.h
index a640d3abe84..d0f4428f3f8 100644
--- a/source/blender/include/BIF_poseobject.h
+++ b/source/blender/include/BIF_poseobject.h
@@ -35,6 +35,7 @@
struct Object;
+struct bPose;
struct bPoseChannel;
void enter_posemode(void);
@@ -60,12 +61,21 @@ void paste_posebuf (int flip);
void pose_adds_vgroups(struct Object *meshobj, int heatweights);
+void pose_add_posegroup(void);
+void pose_remove_posegroup(void);
+char *build_posegroups_menustr(struct bPose *pose, short for_pupmenu);
+void pose_assign_to_posegroup(short active);
+void pose_remove_from_posegroups(void);
+void pgroup_operation_with_menu(void);
+
void pose_calculate_path(struct Object *ob);
+void pose_recalculate_paths(struct Object *ob);
void pose_clear_paths(struct Object *ob);
void pose_flip_names(void);
+void pose_autoside_names(short axis);
void pose_activate_flipped_bone(void);
void pose_movetolayer(void);
-
+void pose_relax(void);
#endif
diff --git a/source/blender/include/BIF_radialcontrol.h b/source/blender/include/BIF_radialcontrol.h
new file mode 100644
index 00000000000..81181a3a91e
--- /dev/null
+++ b/source/blender/include/BIF_radialcontrol.h
@@ -0,0 +1,62 @@
+/*
+ * $Id: multires.h 13015 2007-12-27 07:27:03Z nicholasbishop $
+ *
+ * ***** 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) 2008 by Nicholas Bishop
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef RADIALCONTROL_H
+#define RADIALCONTROL_H
+
+struct NumInput;
+
+#define RADIALCONTROL_NONE 0
+#define RADIALCONTROL_SIZE 1
+#define RADIALCONTROL_STRENGTH 2
+#define RADIALCONTROL_ROTATION 3
+
+typedef void (*RadialControlCallback)(const int, const int);
+
+typedef struct RadialControl {
+ int mode;
+ short origloc[2];
+
+ unsigned int tex;
+
+ int new_value;
+ int original_value;
+ int max_value;
+ RadialControlCallback callback;
+
+ struct NumInput *num;
+} RadialControl;
+
+RadialControl *radialcontrol_start(const int mode, RadialControlCallback callback,
+ const int original_value, const int max_value,
+ const unsigned int tex);
+void radialcontrol_do_events(RadialControl *rc, const unsigned short event);
+void radialcontrol_draw(RadialControl *rc);
+
+#endif
diff --git a/source/blender/include/BIF_resources.h b/source/blender/include/BIF_resources.h
index e63e84efcbd..c76f0a9c66e 100644
--- a/source/blender/include/BIF_resources.h
+++ b/source/blender/include/BIF_resources.h
@@ -66,16 +66,16 @@ typedef enum {
ICON_ORTHO,
ICON_PERSP,
ICON_CAMERA,
- ICON_EFFECTS,
+ ICON_PARTICLES,
ICON_BBOX,
ICON_WIRE,
ICON_SOLID,
ICON_SMOOTH,
ICON_POTATO,
ICON_MARKER_HLT,
- ICON_NORMALVIEW,
- ICON_LOCALVIEW,
- ICON_UNUSEDVIEW,
+ ICON_PMARKER_ACT,
+ ICON_PMARKER_SEL,
+ ICON_PMARKER,
ICON_VIEWZOOM,
ICON_SORTALPHA,
ICON_SORTTIME,
@@ -268,7 +268,7 @@ typedef enum {
ICON_EYEDROPPER,
ICON_WINDOW_WINDOW,
ICON_PANEL_CLOSE,
- ICON_BLANK35,
+ ICON_PHYSICS,
ICON_BLANK36,
ICON_BLANK37,
ICON_BLANK38,
@@ -494,6 +494,7 @@ enum {
TH_NORMAL,
TH_FACE_DOT,
TH_FACEDOT_SIZE,
+ TH_CFRAME,
TH_SYNTAX_B,
TH_SYNTAX_V,
diff --git a/source/blender/include/BIF_space.h b/source/blender/include/BIF_space.h
index 855773b3497..43f0629f935 100644
--- a/source/blender/include/BIF_space.h
+++ b/source/blender/include/BIF_space.h
@@ -55,6 +55,7 @@ struct SpaceOops;
#define VIEW3D_HANDLER_OBJECT 3
#define VIEW3D_HANDLER_PREVIEW 4
#define VIEW3D_HANDLER_MULTIRES 5
+#define VIEW3D_HANDLER_TRANSFORM 6
/* ipo handler codes */
#define IPO_HANDLER_PROPERTIES 20
@@ -120,6 +121,7 @@ extern void force_draw_plus(int type, int header);
extern void freespacelist(struct ScrArea *sa);
extern void handle_view3d_around(void);
extern void handle_view3d_lock(void);
+extern void handle_view_middlemouse(void);
extern void init_v2d_oops(struct ScrArea *, struct SpaceOops *);
extern void initipo(struct ScrArea *sa);
extern void newspace(struct ScrArea *sa, int type);
diff --git a/source/blender/include/BIF_transform.h b/source/blender/include/BIF_transform.h
index eeb465135de..a0f991f2631 100644
--- a/source/blender/include/BIF_transform.h
+++ b/source/blender/include/BIF_transform.h
@@ -58,6 +58,8 @@
#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
@@ -65,10 +67,11 @@
#define CTX_EDGE 2
#define CTX_NO_PET 4
#define CTX_TWEAK 8
+#define CTX_NO_MIRROR 16
+#define CTX_AUTOCONFIRM 32
void initTransform(int mode, int context);
void Transform(void);
-void Mirror(short mode);
/* Standalone call to get the transformation center corresponding to the current situation
* returns 1 if successful, 0 otherwise (usually means there's no selection)
@@ -78,6 +81,8 @@ int calculateTransformCenter(int centerMode, float *vec);
struct TransInfo;
struct ScrArea;
+struct Base;
+struct Scene;
struct TransInfo * BIF_GetTransInfo(void);
void BIF_setSingleAxisConstraint(float vec[3], char *text);
@@ -85,6 +90,20 @@ 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);
+int BIF_snappingSupported(void);
+
+struct TransformOrientation;
+
+void BIF_clearTransformOrientation(void);
+void BIF_removeTransformOrientation(struct TransformOrientation *ts);
+void BIF_manageTransformOrientation(int confirm, int set);
+int BIF_menuselectTransformOrientation(void);
+void BIF_selectTransformOrientation(struct TransformOrientation *ts);
+void BIF_selectTransformOrientationFromIndex(int index);
+
+char * BIF_menustringTransformOrientation(); /* the returned value was allocated and needs to be freed after use */
+int BIF_countTransformOrientation();
+
/* Drawing callbacks */
void BIF_drawConstraint(void);
void BIF_drawPropCircle(void);
diff --git a/source/blender/include/BSE_drawipo.h b/source/blender/include/BSE_drawipo.h
index 07f116d8d67..2053f41a178 100644
--- a/source/blender/include/BSE_drawipo.h
+++ b/source/blender/include/BSE_drawipo.h
@@ -55,6 +55,7 @@ void ipoco_to_areaco_noclip (struct View2D *v2d, float *vec, short *mval);
void view2d_do_locks (struct ScrArea *cursa, int flag);
void view2d_zoom (struct View2D *v2d, float factor, int winx, int winy);
+void view2d_getscale (struct View2D *v2d, float *x, float *y);
void test_view2d (struct View2D *v2d, int winx, int winy);
void calc_scrollrcts (struct ScrArea *sa, struct View2D *v2d, int winx, int winy);
diff --git a/source/blender/include/BSE_drawview.h b/source/blender/include/BSE_drawview.h
index 9c577746da9..c425cbc62ea 100644
--- a/source/blender/include/BSE_drawview.h
+++ b/source/blender/include/BSE_drawview.h
@@ -58,7 +58,7 @@ struct ImBuf *read_backbuf(short xmin, short ymin, short xmax, short ymax);
unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, int *dist, short strict, unsigned int (*indextest)(unsigned int index));
void drawview3dspace(struct ScrArea *sa, void *spacedata);
-void drawview3d_render(struct View3D *v3d, int winx, int winy);
+void drawview3d_render(struct View3D *v3d, int winx, int winy, float winmat[][4]);
int update_time(void);
void calc_viewborder(struct View3D *v3d, struct rctf *viewborder_r);
diff --git a/source/blender/include/BSE_editaction_types.h b/source/blender/include/BSE_editaction_types.h
index 48f0bc39ffc..ae61b09a13a 100644
--- a/source/blender/include/BSE_editaction_types.h
+++ b/source/blender/include/BSE_editaction_types.h
@@ -37,9 +37,12 @@
/* FILTERED ACTION DATA - TYPES */
/* types of keyframe data in ActListElem */
-#define ALE_NONE 0
-#define ALE_IPO 1
-#define ALE_ICU 2
+typedef enum ALE_KEYTYPE {
+ ALE_NONE = 0,
+ ALE_IPO,
+ ALE_ICU,
+ ALE_GROUP
+} ALE_KEYTYPE;
/* This struct defines a structure used for quick access */
typedef struct bActListElem {
@@ -53,6 +56,8 @@ typedef struct bActListElem {
void *key_data; /* motion data - ipo or ipo-curve */
short datatype; /* type of motion data to expect */
+ struct bActionGroup *grp; /* action group that owns the channel */
+
void *owner; /* will either be an action channel or fake ipo-channel (for keys) */
short ownertype; /* type of owner */
} bActListElem;
@@ -61,17 +66,21 @@ typedef struct bActListElem {
/* FILTER ACTION DATA - METHODS/TYPES */
/* filtering flags - under what circumstances should a channel be added */
-#define ACTFILTER_VISIBLE 0x001 /* should channels be visible */
-#define ACTFILTER_SEL 0x002 /* should channels be selected */
-#define ACTFILTER_FOREDIT 0x004 /* does editable status matter */
-#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 */
+typedef enum ACTFILTER_FLAGS {
+ ACTFILTER_VISIBLE = (1<<0), /* should channels be visible */
+ ACTFILTER_SEL = (1<<1), /* should channels be selected */
+ ACTFILTER_FOREDIT = (1<<2), /* does editable status matter */
+ ACTFILTER_CHANNELS = (1<<3), /* do we only care that it is a channel */
+ ACTFILTER_IPOKEYS = (1<<4), /* only channels referencing ipo's */
+ ACTFILTER_ONLYICU = (1<<5), /* only reference ipo-curves */
+ ACTFILTER_FORDRAWING = (1<<6) /* make list for interface drawing */
+} ACTFILTER_FLAGS;
/* Action Editor - Main Data types */
-#define ACTCONT_NONE 0
-#define ACTCONT_ACTION 1
-#define ACTCONT_SHAPEKEY 2
+typedef enum ACTCONT_TYPES {
+ ACTCONT_NONE = 0,
+ ACTCONT_ACTION,
+ ACTCONT_SHAPEKEY
+} ACTCONT_TYPES;
#endif
diff --git a/source/blender/include/BSE_editipo.h b/source/blender/include/BSE_editipo.h
index 37cae858656..99a7930ddb1 100644
--- a/source/blender/include/BSE_editipo.h
+++ b/source/blender/include/BSE_editipo.h
@@ -60,6 +60,7 @@ 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, struct Object *ob);
int geticon_ipo_blocktype(short blocktype);
@@ -88,8 +89,8 @@ void do_ipo_selectbuttons(void);
/* gets ipo curve, creates if needed */
-struct IpoCurve *verify_ipocurve(struct ID *, short, char *, char *, int);
-struct Ipo *verify_ipo(struct ID *, short, char *, char *);
+struct IpoCurve *verify_ipocurve(struct ID *, short, char *, char *, char *, int);
+struct Ipo *verify_ipo(struct ID *, short, char *, char *, char *);
int texchannel_to_adrcode(int channel);
int insert_bezt_icu(struct IpoCurve *icu, struct BezTriple *bezt);
@@ -150,12 +151,13 @@ void transform_ipo(int mode);
void actstrip_map_ipo_keys(struct Object *ob, struct Ipo *ipo, short restore, short only_keys);
void sethandles_ipo_keys(struct Ipo *ipo, int code);
+void snap_cfra_ipo_keys(struct Ipo *ipo, short mode);
void snap_ipo_keys(struct Ipo *ipo, short snaptype);
void mirror_ipo_keys(struct Ipo *ipo, short mirror_mode);
void setipotype_ipo(struct Ipo *ipo, int code);
void set_ipo_key_selection(struct Ipo *ipo, int sel);
int is_ipo_key_selected(struct Ipo *ipo);
-void delete_icu_key(struct IpoCurve *icu, int index);
+void delete_icu_key(struct IpoCurve *icu, int index, short do_recalc);
void delete_ipo_keys(struct Ipo *ipo);
int fullselect_ipo_keys(struct Ipo *ipo);
int add_trans_ipo_keys(struct Ipo *ipo, struct TransVert *tv, int tvtot);
diff --git a/source/blender/include/BSE_node.h b/source/blender/include/BSE_node.h
index 171a277e8e6..b946ff3b1c7 100644
--- a/source/blender/include/BSE_node.h
+++ b/source/blender/include/BSE_node.h
@@ -54,6 +54,8 @@ struct Material *editnode_get_active_material(struct Material *ma);
struct bNode *editnode_get_active_idnode(struct bNodeTree *ntree, short id_code);
struct bNode *editnode_get_active(struct bNodeTree *ntree);
+void node_rename(struct SpaceNode *snode);
+
void snode_tag_dirty(struct SpaceNode *snode);
void snode_set_context(struct SpaceNode *snode);
@@ -71,7 +73,9 @@ 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 node_read_fullsamplelayers(struct SpaceNode *snode);
void clear_scene_in_nodes(struct Scene *sce);
+void node_make_link(struct SpaceNode *snode);
void node_transform_ext(int mode, int unused);
void node_shader_default(struct Material *ma);
@@ -96,8 +100,13 @@ struct SpaceNode;
struct bNodeLink;
void node_draw_link(struct SpaceNode *snode, struct bNodeLink *link);
+void node_rename_but(char *s);
+
void init_node_butfuncs(void);
+void node_curvemap_sample(float *col);
+
+
/* exported to CMP and SHD nodes */
//void node_ID_title_cb(void *node_v, void *unused_v);
//void node_but_title_cb(void *node_v, void *but_v);
diff --git a/source/blender/include/BSE_seqeffects.h b/source/blender/include/BSE_seqeffects.h
index 2962bbf3676..2dde9d3cc79 100644
--- a/source/blender/include/BSE_seqeffects.h
+++ b/source/blender/include/BSE_seqeffects.h
@@ -89,6 +89,7 @@ struct SeqEffectHandle {
};
struct SeqEffectHandle get_sequence_effect(struct Sequence * seq);
+struct SeqEffectHandle get_sequence_blend(struct Sequence * seq);
int get_sequence_effect_num_inputs(int seq_type);
void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force);
diff --git a/source/blender/include/BSE_seqscopes.h b/source/blender/include/BSE_seqscopes.h
index 3dd5e495928..a2b3c65d6e9 100644
--- a/source/blender/include/BSE_seqscopes.h
+++ b/source/blender/include/BSE_seqscopes.h
@@ -32,7 +32,10 @@
struct ImBuf;
struct ImBuf *make_waveform_view_from_ibuf(struct ImBuf * ibuf);
+struct ImBuf *make_sep_waveform_view_from_ibuf(struct ImBuf * ibuf);
struct ImBuf *make_vectorscope_view_from_ibuf(struct ImBuf * ibuf);
+struct ImBuf *make_zebra_view_from_ibuf(struct ImBuf * ibuf, float perc);
+struct ImBuf *make_histogram_view_from_ibuf(struct ImBuf * ibuf);
#endif
diff --git a/source/blender/include/BSE_sequence.h b/source/blender/include/BSE_sequence.h
index ff79d417537..9f15b729e1c 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,30 +45,45 @@ 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);
+
+#define BUILD_SEQAR_COUNT_NOTHING 0
+#define BUILD_SEQAR_COUNT_CURRENT 1
+#define BUILD_SEQAR_COUNT_CHILDREN 2
+
+void build_seqar_cb(struct ListBase *seqbase, struct Sequence ***seqar,
+ int *totseq, int (*test_func)(struct Sequence * seq));
void free_editing(struct Editing *ed);
void calc_sequence(struct Sequence *seq);
void calc_sequence_disp(struct Sequence *seq);
+void reload_sequence_new_file(struct Sequence * seq);
+void seq_proxy_rebuild(struct Sequence * seq);
void sort_seq(void);
void clear_scene_in_allseqs(struct Scene *sce);
+char *give_seqname_by_type(int type);
+char *give_seqname(struct Sequence *seq);
+
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_threaded(int rectx, int recty, int cfra,
- int chanshown);
+struct ImBuf * give_ibuf_seq_threaded(int rectx, int recty, int cfra,
+ int chanshown);
void free_imbuf_seq_except(int cfra);
diff --git a/source/blender/include/BSE_time.h b/source/blender/include/BSE_time.h
index d5cff9f5e5f..27560c09e75 100644
--- a/source/blender/include/BSE_time.h
+++ b/source/blender/include/BSE_time.h
@@ -35,8 +35,14 @@
struct ListBase;
struct View2D;
+struct TimeMarker;
-/* ******** Markers - General Api ********* */
+/* ****** Marker Macros - General API ****** */
+
+/* macro for getting the scene's set of markers */
+#define SCE_MARKERS (&(G.scene->markers))
+
+/* ******** Markers - General API ********* */
void add_marker(int frame);
void duplicate_marker(void);
void remove_marker(void);
@@ -45,17 +51,25 @@ void transform_markers(int mode, int smode);
void borderselect_markers(void);
void deselect_markers(short test, short sel);
-struct TimeMarker *find_nearest_marker(int clip_y);
+struct TimeMarker *find_nearest_marker(struct ListBase *markers, int clip_y);
void nextprev_marker(short dir);
void get_minmax_markers(short sel, float *first, float *last);
int find_nearest_marker_time(float dx);
+struct TimeMarker *get_frame_marker(int frame);
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(int lines);
-TimeMarker *get_frame_marker(int frame);
+/* ********* Markers - Drawing API ********* */
+
+/* flags for drawing markers */
+enum {
+ DRAW_MARKERS_LINES = (1<<0),
+ DRAW_MARKERS_LOCAL = (1<<1)
+};
+
+void draw_markers_timespace(struct ListBase *markers, int flag);
/* ******** 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/blendef.h b/source/blender/include/blendef.h
index 036b67301e4..4ded73f10b6 100644
--- a/source/blender/include/blendef.h
+++ b/source/blender/include/blendef.h
@@ -113,12 +113,17 @@
#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) )
#define ISPOIN4(a, b, c, d, e) ( (a->b) && (a->c) && (a->d) && (a->e) )
-#define BEZSELECTED(bezt) (((bezt)->f1 & 1) || ((bezt)->f2 & 1) || ((bezt)->f3 & 1))
+#define BEZSELECTED(bezt) (((bezt)->f1 & SELECT) || ((bezt)->f2 & SELECT) || ((bezt)->f3 & SELECT))
+/* for curve objects in editmode that can have hidden handles - may use for IPO's later */
+#define BEZSELECTED_HIDDENHANDLES(bezt) ((G.f & G_HIDDENHANDLES) ? (bezt)->f2 & SELECT : BEZSELECTED(bezt))
/* psfont */
#define FNT_PDRAW 1
@@ -229,6 +234,10 @@
#define B_MAN_TRANS 161
#define B_MAN_ROT 162
#define B_MAN_SCALE 163
+#define B_SEL_PATH 166
+#define B_SEL_POINT 167
+#define B_SEL_END 168
+#define B_MAN_MODE 169
/* IPO: 200 */
#define B_IPOHOME 201
@@ -248,7 +257,7 @@
#define B_IPO_ACTION_KEY 214
#define B_IPOVIEWCENTER 215
#define B_IPOVIEWALL 216
-
+#define B_IPOREDRAW 217
/* OOPS: 250 */
#define B_OOPSHOME 251
@@ -284,6 +293,7 @@
#define B_UITHEMEEXPORT 324
#define B_MEMCACHELIMIT 325
+#define B_WPAINT_RANGE 326
/* Definitions for the fileselect buttons in user prefs */
#define B_FONTDIRFILESEL 330
diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h
index 4f09ad716d7..7d047610a3a 100644
--- a/source/blender/include/butspace.h
+++ b/source/blender/include/butspace.h
@@ -64,10 +64,13 @@ extern void do_render_panels(unsigned short event);
extern void anim_panels(void);
extern void sound_panels(void);
extern void do_soundbuts(unsigned short event);
+extern void sequencer_panels(void);
+extern void do_sequencer_panels(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,8 +89,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 */
extern void editing_panels(void);
@@ -103,6 +104,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
@@ -168,6 +170,8 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_ARMATUREPANEL3 1013
#define B_OBJECTPANELSCALE 1014
#define B_OBJECTPANELDIMS 1015
+#define B_TRANSFORMSPACEADD 1016
+#define B_TRANSFORMSPACECLEAR 1017
/* *********************** */
#define B_LAMPBUTS 1200
@@ -213,6 +217,8 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
/* world buttons: buttons-preview update, and redraw 3dview */
#define B_WORLDPRV2 1224
+#define B_MAT_PARTICLE 1225
+
/* *********************** */
#define B_TEXBUTS 1400
@@ -283,6 +289,14 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_GROUP_RELINK 1460
#define B_OBJECT_IPOFLAG 1461
+#define B_BAKEABLE_CHANGE 1470
+
+/* Cloth sim button defines */
+#define B_CLOTH_CLEARCACHEALL 1480
+#define B_CLOTH_CLEARCACHEFRAME 1481
+#define B_CLOTH_CHANGEPREROLL 1482
+#define B_CLOTH_RENEW 1483
+
/* *********************** */
#define B_WORLDBUTS 1600
@@ -291,15 +305,16 @@ 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
+#define B_RENDERBUTS 1690
+#define B_SEQUENCERBUTS 1699
#define B_FS_PIC 1601
#define B_FS_BACKBUF 1602
-#define B_FS_FTYPE 1604
+#define B_FS_FTYPE 1604 /* FTYPE is no more */
#define B_DORENDER 1605
#define B_DOANIM 1606
#define B_PLAYANIM 1607
@@ -316,7 +331,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_PR_PANO 1619
#define B_PR_NTSC 1620
-#define B_IS_FTYPE 1622
+#define B_IS_FTYPE 1622 /* FTYPE is nomore */
#define B_IS_BACKBUF 1623
#define B_PR_PC 1624
@@ -343,6 +358,14 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_ADD_RENDERLAYER 1645
#define B_SET_PASS 1646
+#define B_SEQ_BUT_PLUGIN 1691
+#define B_SEQ_BUT_RELOAD 1692
+#define B_SEQ_BUT_EFFECT 1693
+#define B_SEQ_BUT_RELOAD_ALL 1694
+#define B_SEQ_BUT_TRANSFORM 1695
+#define B_SEQ_BUT_RELOAD_FILE 1696
+#define B_SEQ_BUT_REBUILD_PROXY 1697
+
/* *********************** */
#define B_ARMATUREBUTS 1800
#define B_POSE 1701
@@ -366,6 +389,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_DOCENTER 2015
#define B_DOCENTERNEW 2016
#define B_DOCENTERCURSOR 2017
+#define B_MATASS_BROWSE 2018
/* 20 values! */
#define B_OBLAY 2019
@@ -377,6 +401,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_PREVKEY 2045
#define B_NEXTKEY 2046
#define B_LOCKKEY 2047
+#define B_MATCOL2 2048
#define B_MESHBUTS 2090
@@ -414,6 +439,8 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_SETTFACE_RND 2082
#define B_SETMCOL_RND 2083
+#define B_GEN_SKELETON 2090
+
/* *********************** */
#define B_VGROUPBUTS 2100
@@ -456,6 +483,10 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#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
@@ -489,6 +520,22 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_ARM_CALCPATHS 2303
#define B_ARM_CLEARPATHS 2304
+#define B_POSELIB_VALIDATE 2310
+#define B_POSELIB_ADDPOSE 2311
+#define B_POSELIB_REPLACEP 2312
+#define B_POSELIB_REMOVEP 2313
+#define B_POSELIB_APPLYP 2314
+
+ /* these shouldn't be here... */
+#define B_POSELIB_BROWSE 2320
+#define B_POSELIB_ALONE 2321
+#define B_POSELIB_DELETE 2322
+
+
+#define B_POSEGRP_RECALC 2330
+#define B_POSEGRP_ADD 2331
+#define B_POSEGRP_REMOVE 2332
+
/* *********************** */
#define B_CAMBUTS 2500
@@ -575,6 +622,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
@@ -646,7 +701,7 @@ enum {
B_CONSTRAINT_ADD_ACTION,
B_CONSTRAINT_ADD_LOCKTRACK,
B_CONSTRAINT_ADD_FOLLOWPATH,
- B_CONSTRAINT_ADD_DISTANCELIMIT,
+ B_CONSTRAINT_ADD_DISTLIMIT,
B_CONSTRAINT_ADD_STRETCHTO,
B_CONSTRAINT_ADD_LOCLIMIT,
B_CONSTRAINT_ADD_ROTLIMIT,
@@ -682,7 +737,7 @@ enum {
#define B_EFFECTSBUTS 3500
-#define B_AUTOTIMEOFS 3403
+#define B_AUTOTIMEOFS 3403 /* see B_OFSTIMEOFS, B_RANDTIMEOFS also */
#define B_FRAMEMAP 3404
#define B_NEWEFFECT 3405
#define B_PREVEFFECT 3406
@@ -697,6 +752,29 @@ 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_PART_ENABLE 3437
+#define B_OFSTIMEOFS 3438 /* see B_AUTOTIMEOFS too */
+#define B_RANDTIMEOFS 3439
+#define B_PART_REDRAW_DEPS 3440
#define B_MODIFIER_BUTS 3600
diff --git a/source/blender/include/multires.h b/source/blender/include/multires.h
index bfa765e62ef..e4726c02d7e 100644
--- a/source/blender/include/multires.h
+++ b/source/blender/include/multires.h
@@ -43,39 +43,17 @@ struct uiBlock;
int multires_test();
int multires_level1_test();
-struct MultiresLevel *multires_level_n(struct Multires *mr, int n);
-
void multires_draw_interface(struct uiBlock *block, unsigned short cx, unsigned short cy);
-void multires_disp_map(void *, void*);
void multires_make(void *ob, void *me);
void multires_delete(void *ob, void *me);
-struct Multires *multires_copy(struct Multires *orig);
-void multires_free(struct Multires *mr);
-void multires_free_level(struct MultiresLevel *lvl);
+void multires_level_to_editmesh(struct Object *ob, struct Mesh *me, const int render);
+void multires_finish_mesh_update(struct Object *ob);
+void multires_subdivide(void *ob, void *me);
void multires_del_lower(void *ob, void *me);
void multires_del_higher(void *ob, void *me);
-void multires_add_level(void *ob, void *me);
void multires_set_level_cb(void *ob, void *me);
-void multires_set_level(struct Object *ob, struct Mesh *me, const int render);
-void multires_update_levels(struct Mesh *me, const int render);
-void multires_level_to_mesh(struct Object *ob, struct Mesh *me, const int render);
-void multires_edge_level_update(void *ob, void *me);
+void multires_edge_level_update_cb(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);
-void multires_update_customdata(struct MultiresLevel *lvl1, struct CustomData *src,
- struct CustomData *dst, const int type);
-void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em, struct MultiresLevel *lvl,
- struct CustomData *src, struct CustomData *dst, const int type);
-void multires_del_lower_customdata(struct Multires *mr, struct MultiresLevel *cr_lvl);
-
-void multires_add_layer(struct Mesh *me, struct CustomData *cd, const int type, const int n);
-void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int type, int n);
-
#endif
diff --git a/source/blender/include/mydevice.h b/source/blender/include/mydevice.h
index 02e7404584b..bec0e13726b 100644
--- a/source/blender/include/mydevice.h
+++ b/source/blender/include/mydevice.h
@@ -254,7 +254,7 @@
#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/reeb.h b/source/blender/include/reeb.h
new file mode 100644
index 00000000000..c8352aedec5
--- /dev/null
+++ b/source/blender/include/reeb.h
@@ -0,0 +1,127 @@
+/**
+ * $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.
+ *
+ * Contributor(s): Martin Poirier
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef REEB_H_
+#define REEB_H_
+
+#include "DNA_listBase.h"
+
+struct EdgeHash;
+struct ReebArc;
+struct ReebEdge;
+struct ReebNode;
+
+typedef struct ReebGraph {
+ ListBase arcs;
+ ListBase nodes;
+ int totnodes;
+ struct EdgeHash *emap;
+} ReebGraph;
+
+typedef struct EmbedBucket {
+ float val;
+ int nv;
+ float p[3];
+} EmbedBucket;
+
+typedef struct ReebNode {
+ struct ReebNode *next, *prev;
+ struct ReebArc **arcs;
+ int index;
+ int degree;
+ float weight;
+ float p[3];
+ int flags;
+} ReebNode;
+
+typedef struct ReebEdge {
+ struct ReebEdge *next, *prev;
+ struct ReebArc *arc;
+ struct ReebNode *v1, *v2;
+ struct ReebEdge *nextEdge;
+} ReebEdge;
+
+typedef struct ReebArc {
+ struct ReebArc *next, *prev;
+ ListBase edges;
+ struct ReebNode *v1, *v2;
+ struct EmbedBucket *buckets;
+ int bcount;
+ int flags;
+} ReebArc;
+
+typedef struct ReebArcIterator {
+ struct ReebArc *arc;
+ int index;
+ int start;
+ int end;
+ int stride;
+} ReebArcIterator;
+
+struct EditMesh;
+
+int weightToHarmonic(struct EditMesh *em);
+int weightFromDistance(struct EditMesh *em);
+int weightFromLoc(struct EditMesh *me, int axis);
+void weightToVCol(struct EditMesh *em);
+void renormalizeWeight(struct EditMesh *em, float newmax);
+
+ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
+void freeGraph(ReebGraph *rg);
+void exportGraph(ReebGraph *rg, int count);
+
+#define OTHER_NODE(arc, node) ((arc->v1 == node) ? arc->v2 : arc->v1)
+
+void initArcIterator(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
+void initArcIterator2(struct ReebArcIterator *iter, struct ReebArc *arc, int start, int end);
+struct EmbedBucket * nextBucket(struct ReebArcIterator *iter);
+
+/* Filtering */
+void filterNullReebGraph(ReebGraph *rg);
+int filterExternalReebGraph(ReebGraph *rg, float threshold);
+int filterInternalReebGraph(ReebGraph *rg, float threshold);
+
+/* Post-Build processing */
+void repositionNodes(ReebGraph *rg);
+void postprocessGraph(ReebGraph *rg, char mode);
+void removeNormalNodes(ReebGraph *rg);
+
+/* Graph processing */
+void buildAdjacencyList(ReebGraph *rg);
+
+void sortNodes(ReebGraph *rg);
+void sortArcs(ReebGraph *rg);
+
+int subtreeDepth(ReebNode *node, ReebArc *rootArc);
+int countConnectedArcs(ReebGraph *rg, ReebNode *node);
+int hasAdjacencyList(ReebGraph *rg);
+int isGraphCyclic(ReebGraph *rg);
+
+/* Sanity check */
+void verifyBuckets(ReebGraph *rg);
+
+#endif /*REEB_H_*/
diff --git a/source/blender/include/transform.h b/source/blender/include/transform.h
index 5ee4f9e84fe..8f6d9bd75c7 100644
--- a/source/blender/include/transform.h
+++ b/source/blender/include/transform.h
@@ -45,6 +45,7 @@ struct Object;
struct View3D;
struct ScrArea;
struct bPose;
+struct bConstraint;
typedef struct NumInput {
@@ -121,7 +122,7 @@ typedef struct TransDataExtension {
float iquat[4]; /* Initial rotation quaternion */
float *size; /* Size of the data to transform (Faculative) */
float isize[3]; /* Initial size */
- float obmat[3][3]; /* Object matrix */
+ float obmat[4][4]; /* Object matrix */
} TransDataExtension;
typedef struct TransData2D {
@@ -142,6 +143,7 @@ typedef struct TransData {
float smtx[3][3]; /* Transformation matrix from global space to data space */
float axismtx[3][3];/* Axis orientation matrix of the data */
struct Object *ob;
+ struct bConstraint *con; /* for objects/bones, the first constraint in its constraint stack */
TransDataExtension *ext; /* for objects, poses. 1 single malloc per TransInfo! */
TransDataIpokey *tdi; /* for objects, ipo keys. per transdata a malloc */
void *tdmir; /* mirrored element pointer, in editmode mesh to EditVert */
@@ -228,7 +230,7 @@ typedef struct TransInfo {
// for manipulator exceptions, like scaling using center point, drawing help lines
#define T_USES_MANIPULATOR (1 << 7)
-/* restrictions flags */
+ /* restrictions flags */
#define T_ALL_RESTRICTIONS ((1 << 8)|(1 << 9)|(1 << 10))
#define T_NO_CONSTRAINT (1 << 8)
#define T_NULL_ONE (1 << 9)
@@ -237,14 +239,17 @@ typedef struct TransInfo {
#define T_PROP_EDIT (1 << 11)
#define T_PROP_CONNECTED (1 << 12)
-/* if MMB is pressed or not */
+ /* if MMB is pressed or not */
#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 */
+ /* for 2d views like uv or ipo */
+#define T_2D_EDIT (1 << 15)
#define T_CLIP_UV (1 << 16)
#define T_FREE_CUSTOMDATA (1 << 17)
+ /* auto-ik is on */
+#define T_AUTOIK (1 << 18)
/* ******************************************************************************** */
@@ -260,15 +265,19 @@ typedef struct TransInfo {
/* transdata->flag */
#define TD_SELECTED 1
-#define TD_NOACTION 2
-#define TD_USEQUAT 4
-#define TD_NOTCONNECTED 8
-#define TD_SINGLESIZE 16 /* used for scaling of MetaElem->rad */
+#define TD_ACTIVE (1 << 1)
+#define TD_NOACTION (1 << 2)
+#define TD_USEQUAT (1 << 3)
+#define TD_NOTCONNECTED (1 << 4)
+#define TD_SINGLESIZE (1 << 5) /* used for scaling of MetaElem->rad */
#ifdef WITH_VERSE
- #define TD_VERSE_OBJECT 32
- #define TD_VERSE_VERT 64
+ #define TD_VERSE_OBJECT (1 << 6)
+ #define TD_VERSE_VERT (1 << 7)
#endif
-#define TD_TIMEONLY 128
+#define TD_TIMEONLY (1 << 8)
+#define TD_NOCENTER (1 << 9)
+#define TD_NO_EXT (1 << 10) /* ext abused for particle key timing */
+#define TD_SKIP (1 << 11) /* don't transform this data */
/* transsnap->status */
#define SNAP_ON 1
@@ -283,6 +292,7 @@ typedef struct TransInfo {
#define SNAP_CLOSEST 0
#define SNAP_CENTER 1
#define SNAP_MEDIAN 2
+#define SNAP_ACTIVE 3
void checkFirstTime(void);
@@ -295,6 +305,7 @@ void convertVecToDisplayNum(float *vec, float *num);
void convertDisplayNumToVec(float *num, float *vec);
void initWarp(TransInfo *t);
+int handleEventWarp(TransInfo *t, unsigned short event, short val);
int Warp(TransInfo *t, short mval[2]);
void initShear(TransInfo *t);
@@ -349,10 +360,17 @@ 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]);
+
+void initMirror(TransInfo *t);
+int Mirror(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 ********** */
@@ -366,7 +384,10 @@ void sort_trans_data_dist(TransInfo *t);
void add_tdi_poin(float *poin, float *old, float delta);
void special_aftertrans_update(TransInfo *t);
+void transform_autoik_update(TransInfo *t, short mode);
+
/* auto-keying stuff used by special_aftertrans_update */
+short autokeyframe_cfra_can_key(struct Object *ob);
void autokeyframe_ob_cb_func(struct Object *ob, int tmode);
void autokeyframe_pose_cb_func(struct Object *ob, int tmode, short targetless_ik);
@@ -447,5 +468,19 @@ short hasNumInput(NumInput *n);
void applyNumInput(NumInput *n, float *vec);
char handleNumInput(NumInput *n, unsigned short event);
+/*********************** TransSpace ******************************/
+
+int manageObjectSpace(int confirm, int set);
+int manageMeshSpace(int confirm, int set);
+
+/* Those two fill in mat and return non-zero on success */
+int createSpaceNormal(float mat[3][3], float normal[3]);
+int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]);
+
+int addMatrixSpace(float mat[3][3], char name[]);
+int addObjectSpace(struct Object *ob);
+void applyTransformOrientation(void);
+
#endif
+
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index d939d0dc879..57aec75700f 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -183,6 +183,7 @@ typedef struct PreviewImage {
#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 5bdb4419b6e..03b546f42f1 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -35,12 +35,12 @@
#include "DNA_view2d_types.h"
struct SpaceLink;
-struct ListBase;
struct Object;
+/* -------------- Poses ----------------- */
+
/* PoseChannel stores the results of Actions (ipos) and transform information
with respect to the restposition of Armature bones */
-
typedef struct bPoseChannel {
struct bPoseChannel *next, *prev;
ListBase constraints;/* Constraints that act on this PoseChannel */
@@ -51,7 +51,7 @@ typedef struct bPoseChannel {
short ikflag; /* settings for IK bones */
short selectflag; /* copy of bone flag, so you can work with library armatures */
short protectflag; /* protect channels from being transformed */
- short pad2;
+ short agrp_index; /* index of action-group this bone belongs to (0 = default/no group) */
int pathlen; /* for drawing paths, the amount of frames */
int pathsf; /* for drawing paths, the start frame number */
@@ -85,7 +85,6 @@ typedef struct bPoseChannel {
float *path; /* totpath x 3 x float */
struct Object *custom; /* draws custom object instead of this channel */
-
} bPoseChannel;
/* Pose-Object. It is only found under ob->pose. It is not library data, even
@@ -93,17 +92,52 @@ typedef struct bPoseChannel {
*/
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() */
+
+
+ ListBase agroups; /* list of bActionGroups */
+
+ int active_group; /* index of active group (starts from 1) */
+ int pad;
} bPose;
+
+/* ------------- Action ---------------- */
+
+/* Action-Channel Group. These are stored as a list per-Action, and are only used to
+ * group that Action's Action-Channels when displayed in the Action Editor.
+ *
+ * Even though all Action-Channels live in a big list per Action, each group they are in also
+ * holds references to the achans within that list which belong to it. Care must be taken to
+ * ensure that action-groups never end up being the sole 'owner' of a channel.
+ */
+typedef struct bActionGroup {
+ struct bActionGroup *next, *prev;
+
+ int flag; /* settings for this action-group */
+ int customCol; /* index of custom color set to use when used for bones (0=default - used for all old files) */
+ char name[32]; /* name of the group */
+
+ ListBase channels; /* Note: this must not be touched by standard listbase functions */
+} bActionGroup;
+
/* Action Channels belong to Actions. They are linked with an IPO block, and can also own
* Constraint Channels in certain situations.
+ *
+ * Action-Channels can only belong to one group at a time, but they still live the Action's
+ * list of achans (to preserve backwards compatability, and also minimise the code
+ * that would need to be recoded). Grouped achans are stored at the start of the list, according
+ * to the position of the group in the list, and their position within the group.
*/
typedef struct bActionChannel {
struct bActionChannel *next, *prev;
+ bActionGroup *grp; /* Action Group this Action Channel belongs to */
+
struct Ipo *ipo; /* IPO block this action channel references */
ListBase constraintChannels; /* Constraint Channels (when Action Channel represents an Object or Bone) */
@@ -117,9 +151,18 @@ typedef struct bActionChannel {
*/
typedef struct bAction {
ID id;
+
ListBase chanbase; /* Action Channels in this Action */
+ ListBase groups; /* Action Groups in the Action */
+ ListBase markers; /* TimeMarkers local to this Action for labelling 'poses' */
+
+ int active_marker; /* Index of active-marker (first marker = 1) */
+ int pad;
} bAction;
+
+/* ------------- Action Editor --------------------- */
+
/* Action Editor Space. This is defined here instead of in DNA_space_types.h */
typedef struct SpaceAction {
struct SpaceLink *next, *prev;
@@ -130,6 +173,7 @@ typedef struct SpaceAction {
short blockhandler[8];
View2D v2d;
+
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 */
@@ -137,39 +181,75 @@ typedef struct SpaceAction {
float timeslide; /* for Time-Slide transform mode drawing - current frame? */
} SpaceAction;
+
+/* -------------- Action Flags -------------- */
+
/* 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;
+
+
+/* Action Group flags */
+typedef enum AGRP_FLAG {
+ AGRP_SELECTED = (1<<0),
+ AGRP_ACTIVE = (1<<1),
+ AGRP_PROTECTED = (1<<2),
+ AGRP_EXPANDED = (1<<3),
+
+ AGRP_TEMP = (1<<30),
+ AGRP_MOVED = (1<<31)
+} AGRP_FLAG;
+
+/* ------------ Action Editor Flags -------------- */
/* SpaceAction flag */
- /* during transform */
-#define SACTION_MOVING 1
- /* show sliders (if relevant) - limited to shape keys for now */
-#define SACTION_SLIDERS 2
- /* draw time in seconds instead of time in frames */
-#define SACTION_DRAWTIME 4
+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),
+ /* don't filter action channels according to visibility */
+ SACTION_NOHIDE = (1<<3),
+ /* don't kill overlapping keyframes after transform */
+ SACTION_NOTRANSKEYCULL = (1<<4),
+ /* don't include keyframes that are out of view */
+ SACTION_HORIZOPTIMISEON = (1<<5)
+} SACTION_FLAG;
/* SpaceAction AutoSnap Settings (also used by SpaceNLA) */
- /* no auto-snap */
-#define SACTSNAP_OFF 0
- /* snap to 1.0 frame/second intervals */
-#define SACTSNAP_STEP 1
- /* snap to actual frames/seconds (nla-action time) */
-#define SACTSNAP_FRAME 2
+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 Flags --------------- */
/* Pose->flag */
- /* results in armature_rebuild_pose being called */
-#define POSE_RECALC 1
- /* prevents any channel from getting overridden by anim from IPO */
-#define POSE_LOCKED 2
- /* clears the POSE_LOCKED flag for the next time the pose is evaluated */
-#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 {
@@ -189,22 +269,30 @@ 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
+typedef enum PCHAN_IKFLAG {
+ BONE_IK_NO_XDOF = (1<<0),
+ BONE_IK_NO_YDOF = (1<<1),
+ BONE_IK_NO_ZDOF = (1<<2),
-#define BONE_IK_XLIMIT 8
-#define BONE_IK_YLIMIT 16
-#define BONE_IK_ZLIMIT 32
+ BONE_IK_XLIMIT = (1<<3),
+ BONE_IK_YLIMIT = (1<<4),
+ BONE_IK_ZLIMIT = (1<<5),
+
+ BONE_IK_NO_XDOF_TEMP = (1<<10),
+ BONE_IK_NO_YDOF_TEMP = (1<<11),
+ BONE_IK_NO_ZDOF_TEMP = (1<<12)
+} PCHAN_IKFLAG;
#endif
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index 1fc50f4eec4..fc17ba62b44 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -68,7 +68,7 @@ typedef struct Bone {
float size[3]; /* patch for upward compat, UNUSED! */
short layer;
short segments; /* for B-bones */
-}Bone;
+} Bone;
typedef struct bArmature {
ID id;
@@ -79,74 +79,84 @@ 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 */
-}bArmature;
+ 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 */
/* dont use bit 7, was saved in files to disable stuff */
-
-/* armature->flag */
-#define ARM_RESTPOS 0x001
- /* XRAY is here only for backwards converting */
-#define ARM_DRAWXRAY 0x002
-#define ARM_DRAWAXES 0x004
-#define ARM_DRAWNAMES 0x008
-#define ARM_POSEMODE 0x010
-#define ARM_EDITMODE 0x020
-#define ARM_DELAYDEFORM 0x040
-#define ARM_DONT_USE 0x080
-#define ARM_MIRROR_EDIT 0x100
-#define ARM_AUTO_IK 0x200
- /* made option negative, for backwards compat */
-#define ARM_NO_CUSTOM 0x400
-#define ARM_COL_CUSTOM 0x800
+typedef enum eArmature_Flag {
+ ARM_RESTPOS = (1<<0),
+ ARM_DRAWXRAY = (1<<1), /* XRAY is here only for backwards converting */
+ ARM_DRAWAXES = (1<<2),
+ ARM_DRAWNAMES = (1<<3),
+ ARM_POSEMODE = (1<<4),
+ ARM_EDITMODE = (1<<5),
+ ARM_DELAYDEFORM = (1<<6),
+ ARM_DONT_USE = (1<<7),
+ ARM_MIRROR_EDIT = (1<<8),
+ ARM_AUTO_IK = (1<<9),
+ ARM_NO_CUSTOM = (1<<10), /* made option negative, for backwards compat */
+ ARM_COL_CUSTOM = (1<<11), /* draw custom colours - not yet used... */
+ ARM_GHOST_ONLYSEL = (1<<12) /* when ghosting, only show selected bones (this should belong to ghostflag instead) */
+} eArmature_Flag;
/* armature->drawtype */
-#define ARM_OCTA 0
-#define ARM_LINE 1
-#define ARM_B_BONE 2
-#define ARM_ENVELOPE 3
+typedef enum eArmature_Drawtype {
+ ARM_OCTA = 0,
+ ARM_LINE,
+ ARM_B_BONE,
+ ARM_ENVELOPE
+} eArmature_Drawtype;
/* armature->deformflag */
-#define ARM_DEF_VGROUP 1
-#define ARM_DEF_ENVELOPE 2
-#define ARM_DEF_QUATERNION 4
-#define ARM_DEF_B_BONE_REST 8
+typedef enum eArmature_DeformFlag {
+ ARM_DEF_VGROUP = (1<<0),
+ ARM_DEF_ENVELOPE = (1<<1),
+ ARM_DEF_QUATERNION = (1<<2),
+ ARM_DEF_B_BONE_REST = (1<<3),
+ ARM_DEF_INVERT_VGROUP = (1<<4)
+} eArmature_DeformFlag;
/* armature->pathflag */
-#define ARM_PATH_FNUMS 0x001
-#define ARM_PATH_KFRAS 0x002
-#define ARM_PATH_HEADS 0x004
+typedef enum eArmature_PathFlag {
+ ARM_PATH_FNUMS = (1<<0),
+ ARM_PATH_KFRAS = (1<<1),
+ ARM_PATH_HEADS = (1<<2),
+ ARM_PATH_ACFRA = (1<<3),
+ ARM_PATH_KFNOS = (1<<4)
+} eArmature_PathFlag;
/* armature->ghosttype */
-#define ARM_GHOST_CUR 0
-#define ARM_GHOST_RANGE 1
+typedef enum eArmature_GhostType {
+ ARM_GHOST_CUR = 0,
+ ARM_GHOST_RANGE,
+ ARM_GHOST_KEYS
+} eArmature_GhostType;
/* bone->flag */
-#define BONE_SELECTED 1
-#define BONE_ROOTSEL 2
-#define BONE_TIPSEL 4
- /* Used instead of BONE_SELECTED during transform */
-#define BONE_TRANSFORM 8
-#define BONE_CONNECTED 16
- /* 32 used to be quatrot, was always set in files, do not reuse unless you clear it always */
- /* hidden Bones when drawing Posechannels */
-#define BONE_HIDDEN_P 64
- /* For detecting cyclic dependancies */
-#define BONE_DONE 128
- /* active is on mouse clicks only */
-#define BONE_ACTIVE 256
- /* No parent rotation or scale */
-#define BONE_HINGE 512
- /* hidden Bones when drawing Armature Editmode */
-#define BONE_HIDDEN_A 1024
- /* 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
+typedef enum eBone_Flag {
+ BONE_SELECTED = (1<<0),
+ BONE_ROOTSEL = (1<<1),
+ BONE_TIPSEL = (1<<2),
+ BONE_TRANSFORM = (1<<3), /* Used instead of BONE_SELECTED during transform */
+ BONE_CONNECTED = (1<<4),
+ /* 32 used to be quatrot, was always set in files, do not reuse unless you clear it always */
+ BONE_HIDDEN_P = (1<<6), /* hidden Bones when drawing PoseChannels */
+ BONE_DONE = (1<<7), /* For detecting cyclic dependancies */
+ BONE_ACTIVE = (1<<8), /* active is on mouse clicks only */
+ BONE_HINGE = (1<<9), /* No parent rotation or scale */
+ BONE_HIDDEN_A = (1<<10), /* hidden Bones when drawing Armature Editmode */
+ BONE_MULT_VG_ENV = (1<<11), /* multiplies vgroup with envelope */
+ BONE_NO_DEFORM = (1<<12),
+ BONE_UNKEYED = (1<<13), /* set to prevent destruction of its unkeyframed pose (after transform) */
+ BONE_HINGE_CHILD_TRANSFORM = (1<<14), /* set to prevent hinge child bones from influencing the transform center */
+ BONE_NO_SCALE = (1<<15), /* No parent scale */
+ BONE_HIDDEN_PG = (1<<16), /* hidden bone when drawing PoseChannels (for ghost drawing) */
+ BONE_DRAWWIRE = (1<<17) /* bone should be drawn as OB_WIRE, regardless of draw-types of view+armature */
+} eBone_Flag;
#endif
diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h
new file mode 100644
index 00000000000..b7e5478259c
--- /dev/null
+++ b/source/blender/makesdna/DNA_cloth_types.h
@@ -0,0 +1,655 @@
+/**
+* $Id: DNA_cloth_types.h,v 1.1 2007/08/01 02:28:34 daniel Exp $
+*
+* ***** 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) 2006 by NaN Holding BV.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Daniel (Genscher)
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+#ifndef DNA_CLOTH_TYPES_H
+#define DNA_CLOTH_TYPES_H
+
+#include "DNA_listBase.h"
+
+/**
+* This struct contains all the global data required to run a simulation.
+* At the time of this writing, this structure contains data appropriate
+* to run a simulation as described in Deformation Constraints in a
+* Mass-Spring Model to Describe Rigid Cloth Behavior by Xavier Provot.
+*
+* I've tried to keep similar, if not exact names for the variables as
+* are presented in the paper. Where I've changed the concept slightly,
+* as in stepsPerFrame comapred to the time step in the paper, I've used
+* variables with different names to minimize confusion.
+**/
+typedef struct SimulationSettings
+{
+ short vgroup_mass; /* optional vertexgroup name for assigning weight.*/
+ short vgroup_struct; /* vertex group for scaling structural stiffness */
+ float mingoal; /* see SB */
+ int preroll; /* How many frames of simulation to do before we start. */
+ float Cdis; /* Mechanical damping of springs. */
+ float Cvi; /* Viscous/fluid damping. */
+ int stepsPerFrame; /* Number of time steps per frame. */
+ float gravity [3]; /* Gravity/external force vector. */
+ float ufluid [3]; /* Velocity vector of the fluid. */
+ float dt; /* This is the duration of our time step, computed. */
+ float mass; /* The mass of the entire cloth. */
+ float structural; /* Structural spring stiffness. */
+ float shear; /* Shear spring stiffness. */
+ float bending; /* Flexion spring stiffness. */
+ float sim_time;
+ int flags; /* flags, see CSIMSETT_FLAGS enum above. */
+ short solver_type; /* which solver should be used? txold */
+ short vgroup_bend; /* vertex group for scaling bending stiffness */
+ float maxgoal; /* see SB */
+ float eff_force_scale;/* Scaling of effector forces (see softbody_calc_forces).*/
+ float eff_wind_scale; /* Scaling of effector wind (see softbody_calc_forces). */
+ float sim_time_old;
+ struct LinkNode *cache; /* UNUSED atm */
+ float defgoal;
+ int goalfrict;
+ float goalspring;
+ int maxspringlen; /* in percent!; if tearing enabled, a spring will get cut */
+ int lastframe; /* frame on which simulation stops */
+ int firstframe; /* frame on which simulation starts */
+ int lastcachedframe;
+ int editedframe; /* which frame is in buffer */
+ int autoprotect; /* starting from this frame, cache gets protected */
+ float max_bend; /* max bending scaling value, min is "bending" */
+ float max_struct; /* max structural scaling value, min is "structural" */
+ float max_shear; /* max shear scaling value, UNUSED */
+ int firstcachedframe;
+ int pad;
+}
+SimulationSettings;
+
+
+typedef struct CollisionSettings
+{
+ float epsilon; /* The radius of a particle in the cloth. */
+ float self_friction; /* Fiction/damping with self contact. */
+ float friction; /* Friction/damping applied on contact with other object.*/
+ short collision_type; /* which collision system is used. */
+ short loop_count; /* How many iterations for the collision loop. */
+ struct LinkNode *collision_list; /* e.g. pointer to temp memory for collisions */
+ int flags; /* collision flags defined in BKE_cloth.h */
+ float avg_spring_len; /* for selfcollision */
+}
+CollisionSettings;
+
+
+/**
+* This structure describes a cloth object against which the
+* simulation can run.
+*
+* The m and n members of this structure represent the assumed
+* rectangular ordered grid for which the original paper is written.
+* At some point they need to disappear and we need to determine out
+* own connectivity of the mesh based on the actual edges in the mesh.
+*
+**/
+typedef struct Cloth
+{
+ struct ClothVertex *verts; /* The vertices that represent this cloth. */
+ struct LinkNode *springs; /* The springs connecting the mesh. */
+ unsigned int numverts; /* The number of verts == m * n. */
+ unsigned int numsprings; /* The count of springs. */
+ unsigned int numfaces;
+ unsigned char old_solver_type; /* unused, only 1 solver here */
+ unsigned char pad2;
+ short pad3;
+ struct BVH *tree; /* collision tree for this cloth object */
+ struct MFace *mfaces;
+ struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */
+}
+Cloth;
+
+#endif
+/**
+* $Id: DNA_cloth_types.h,v 1.1 2007/08/01 02:28:34 daniel Exp $
+*
+* ***** 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) 2006 by NaN Holding BV.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Daniel (Genscher)
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+#ifndef DNA_CLOTH_TYPES_H
+#define DNA_CLOTH_TYPES_H
+
+#include "DNA_listBase.h"
+
+/**
+* This struct contains all the global data required to run a simulation.
+* At the time of this writing, this structure contains data appropriate
+* to run a simulation as described in Deformation Constraints in a
+* Mass-Spring Model to Describe Rigid Cloth Behavior by Xavier Provot.
+*
+* I've tried to keep similar, if not exact names for the variables as
+* are presented in the paper. Where I've changed the concept slightly,
+* as in stepsPerFrame comapred to the time step in the paper, I've used
+* variables with different names to minimize confusion.
+**/
+typedef struct SimulationSettings
+{
+ short vgroup_mass; /* optional vertexgroup name for assigning weight.*/
+ short vgroup_struct; /* vertex group for scaling structural stiffness */
+ float mingoal; /* see SB */
+ int preroll; /* How many frames of simulation to do before we start. */
+ float Cdis; /* Mechanical damping of springs. */
+ float Cvi; /* Viscous/fluid damping. */
+ int stepsPerFrame; /* Number of time steps per frame. */
+ float gravity [3]; /* Gravity/external force vector. */
+ float ufluid [3]; /* Velocity vector of the fluid. */
+ float dt; /* This is the duration of our time step, computed. */
+ float mass; /* The mass of the entire cloth. */
+ float structural; /* Structural spring stiffness. */
+ float shear; /* Shear spring stiffness. */
+ float bending; /* Flexion spring stiffness. */
+ float sim_time;
+ int flags; /* flags, see CSIMSETT_FLAGS enum above. */
+ short solver_type; /* which solver should be used? txold */
+ short vgroup_bend; /* vertex group for scaling bending stiffness */
+ float maxgoal; /* see SB */
+ float eff_force_scale;/* Scaling of effector forces (see softbody_calc_forces).*/
+ float eff_wind_scale; /* Scaling of effector wind (see softbody_calc_forces). */
+ float sim_time_old;
+ struct LinkNode *cache; /* UNUSED atm */
+ float defgoal;
+ int goalfrict;
+ float goalspring;
+ int maxspringlen; /* in percent!; if tearing enabled, a spring will get cut */
+ int lastframe; /* frame on which simulation stops */
+ int firstframe; /* frame on which simulation starts */
+ int lastcachedframe;
+ int editedframe; /* which frame is in buffer */
+ int autoprotect; /* starting from this frame, cache gets protected */
+ float max_bend; /* max bending scaling value, min is "bending" */
+ float max_struct; /* max structural scaling value, min is "structural" */
+ float max_shear; /* max shear scaling value, UNUSED */
+ int firstcachedframe;
+ int pad;
+}
+SimulationSettings;
+
+
+typedef struct CollisionSettings
+{
+ float epsilon; /* The radius of a particle in the cloth. */
+ float self_friction; /* Fiction/damping with self contact. */
+ float friction; /* Friction/damping applied on contact with other object.*/
+ short collision_type; /* which collision system is used. */
+ short loop_count; /* How many iterations for the collision loop. */
+ struct LinkNode *collision_list; /* e.g. pointer to temp memory for collisions */
+ int flags; /* collision flags defined in BKE_cloth.h */
+ float avg_spring_len; /* for selfcollision */
+}
+CollisionSettings;
+
+
+/**
+* This structure describes a cloth object against which the
+* simulation can run.
+*
+* The m and n members of this structure represent the assumed
+* rectangular ordered grid for which the original paper is written.
+* At some point they need to disappear and we need to determine out
+* own connectivity of the mesh based on the actual edges in the mesh.
+*
+**/
+typedef struct Cloth
+{
+ struct ClothVertex *verts; /* The vertices that represent this cloth. */
+ struct LinkNode *springs; /* The springs connecting the mesh. */
+ unsigned int numverts; /* The number of verts == m * n. */
+ unsigned int numsprings; /* The count of springs. */
+ unsigned int numfaces;
+ unsigned char old_solver_type; /* unused, only 1 solver here */
+ unsigned char pad2;
+ short pad3;
+ struct BVH *tree; /* collision tree for this cloth object */
+ struct MFace *mfaces;
+ struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */
+}
+Cloth;
+
+#endif
+/**
+* $Id: DNA_cloth_types.h,v 1.1 2007/08/01 02:28:34 daniel Exp $
+*
+* ***** 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) 2006 by NaN Holding BV.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Daniel (Genscher)
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+#ifndef DNA_CLOTH_TYPES_H
+#define DNA_CLOTH_TYPES_H
+
+#include "DNA_listBase.h"
+
+/**
+* This struct contains all the global data required to run a simulation.
+* At the time of this writing, this structure contains data appropriate
+* to run a simulation as described in Deformation Constraints in a
+* Mass-Spring Model to Describe Rigid Cloth Behavior by Xavier Provot.
+*
+* I've tried to keep similar, if not exact names for the variables as
+* are presented in the paper. Where I've changed the concept slightly,
+* as in stepsPerFrame comapred to the time step in the paper, I've used
+* variables with different names to minimize confusion.
+**/
+typedef struct SimulationSettings
+{
+ short vgroup_mass; /* optional vertexgroup name for assigning weight.*/
+ short vgroup_struct; /* vertex group for scaling structural stiffness */
+ float mingoal; /* see SB */
+ int preroll; /* How many frames of simulation to do before we start. */
+ float Cdis; /* Mechanical damping of springs. */
+ float Cvi; /* Viscous/fluid damping. */
+ int stepsPerFrame; /* Number of time steps per frame. */
+ float gravity [3]; /* Gravity/external force vector. */
+ float ufluid [3]; /* Velocity vector of the fluid. */
+ float dt; /* This is the duration of our time step, computed. */
+ float mass; /* The mass of the entire cloth. */
+ float structural; /* Structural spring stiffness. */
+ float shear; /* Shear spring stiffness. */
+ float bending; /* Flexion spring stiffness. */
+ float sim_time;
+ int flags; /* flags, see CSIMSETT_FLAGS enum above. */
+ short solver_type; /* which solver should be used? txold */
+ short vgroup_bend; /* vertex group for scaling bending stiffness */
+ float maxgoal; /* see SB */
+ float eff_force_scale;/* Scaling of effector forces (see softbody_calc_forces).*/
+ float eff_wind_scale; /* Scaling of effector wind (see softbody_calc_forces). */
+ float sim_time_old;
+ struct LinkNode *cache; /* UNUSED atm */
+ float defgoal;
+ int goalfrict;
+ float goalspring;
+ int maxspringlen; /* in percent!; if tearing enabled, a spring will get cut */
+ int lastframe; /* frame on which simulation stops */
+ int firstframe; /* frame on which simulation starts */
+ int lastcachedframe;
+ int editedframe; /* which frame is in buffer */
+ int autoprotect; /* starting from this frame, cache gets protected */
+ float max_bend; /* max bending scaling value, min is "bending" */
+ float max_struct; /* max structural scaling value, min is "structural" */
+ float max_shear; /* max shear scaling value, UNUSED */
+ int firstcachedframe;
+ int pad;
+}
+SimulationSettings;
+
+
+typedef struct CollisionSettings
+{
+ float epsilon; /* The radius of a particle in the cloth. */
+ float self_friction; /* Fiction/damping with self contact. */
+ float friction; /* Friction/damping applied on contact with other object.*/
+ short collision_type; /* which collision system is used. */
+ short loop_count; /* How many iterations for the collision loop. */
+ struct LinkNode *collision_list; /* e.g. pointer to temp memory for collisions */
+ int flags; /* collision flags defined in BKE_cloth.h */
+ float avg_spring_len; /* for selfcollision */
+}
+CollisionSettings;
+
+
+/**
+* This structure describes a cloth object against which the
+* simulation can run.
+*
+* The m and n members of this structure represent the assumed
+* rectangular ordered grid for which the original paper is written.
+* At some point they need to disappear and we need to determine out
+* own connectivity of the mesh based on the actual edges in the mesh.
+*
+**/
+typedef struct Cloth
+{
+ struct ClothVertex *verts; /* The vertices that represent this cloth. */
+ struct LinkNode *springs; /* The springs connecting the mesh. */
+ unsigned int numverts; /* The number of verts == m * n. */
+ unsigned int numsprings; /* The count of springs. */
+ unsigned int numfaces;
+ unsigned char old_solver_type; /* unused, only 1 solver here */
+ unsigned char pad2;
+ short pad3;
+ struct BVH *tree; /* collision tree for this cloth object */
+ struct MFace *mfaces;
+ struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */
+}
+Cloth;
+
+#endif
+/**
+* $Id: DNA_cloth_types.h,v 1.1 2007/08/01 02:28:34 daniel Exp $
+*
+* ***** 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) 2006 by NaN Holding BV.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Daniel (Genscher)
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+#ifndef DNA_CLOTH_TYPES_H
+#define DNA_CLOTH_TYPES_H
+
+#include "DNA_listBase.h"
+
+/**
+* This struct contains all the global data required to run a simulation.
+* At the time of this writing, this structure contains data appropriate
+* to run a simulation as described in Deformation Constraints in a
+* Mass-Spring Model to Describe Rigid Cloth Behavior by Xavier Provot.
+*
+* I've tried to keep similar, if not exact names for the variables as
+* are presented in the paper. Where I've changed the concept slightly,
+* as in stepsPerFrame comapred to the time step in the paper, I've used
+* variables with different names to minimize confusion.
+**/
+typedef struct SimulationSettings
+{
+ short vgroup_mass; /* optional vertexgroup name for assigning weight.*/
+ short vgroup_struct; /* vertex group for scaling structural stiffness */
+ float mingoal; /* see SB */
+ int preroll; /* How many frames of simulation to do before we start. */
+ float Cdis; /* Mechanical damping of springs. */
+ float Cvi; /* Viscous/fluid damping. */
+ int stepsPerFrame; /* Number of time steps per frame. */
+ float gravity [3]; /* Gravity/external force vector. */
+ float ufluid [3]; /* Velocity vector of the fluid. */
+ float dt; /* This is the duration of our time step, computed. */
+ float mass; /* The mass of the entire cloth. */
+ float structural; /* Structural spring stiffness. */
+ float shear; /* Shear spring stiffness. */
+ float bending; /* Flexion spring stiffness. */
+ float sim_time;
+ int flags; /* flags, see CSIMSETT_FLAGS enum above. */
+ short solver_type; /* which solver should be used? txold */
+ short vgroup_bend; /* vertex group for scaling bending stiffness */
+ float maxgoal; /* see SB */
+ float eff_force_scale;/* Scaling of effector forces (see softbody_calc_forces).*/
+ float eff_wind_scale; /* Scaling of effector wind (see softbody_calc_forces). */
+ float sim_time_old;
+ struct LinkNode *cache; /* UNUSED atm */
+ float defgoal;
+ int goalfrict;
+ float goalspring;
+ int maxspringlen; /* in percent!; if tearing enabled, a spring will get cut */
+ int lastframe; /* frame on which simulation stops */
+ int firstframe; /* frame on which simulation starts */
+ int lastcachedframe;
+ int editedframe; /* which frame is in buffer */
+ int autoprotect; /* starting from this frame, cache gets protected */
+ float max_bend; /* max bending scaling value, min is "bending" */
+ float max_struct; /* max structural scaling value, min is "structural" */
+ float max_shear; /* max shear scaling value, UNUSED */
+ int firstcachedframe;
+ int pad;
+}
+SimulationSettings;
+
+
+typedef struct CollisionSettings
+{
+ float epsilon; /* The radius of a particle in the cloth. */
+ float self_friction; /* Fiction/damping with self contact. */
+ float friction; /* Friction/damping applied on contact with other object.*/
+ short collision_type; /* which collision system is used. */
+ short loop_count; /* How many iterations for the collision loop. */
+ struct LinkNode *collision_list; /* e.g. pointer to temp memory for collisions */
+ int flags; /* collision flags defined in BKE_cloth.h */
+ float avg_spring_len; /* for selfcollision */
+}
+CollisionSettings;
+
+
+/**
+* This structure describes a cloth object against which the
+* simulation can run.
+*
+* The m and n members of this structure represent the assumed
+* rectangular ordered grid for which the original paper is written.
+* At some point they need to disappear and we need to determine out
+* own connectivity of the mesh based on the actual edges in the mesh.
+*
+**/
+typedef struct Cloth
+{
+ struct ClothVertex *verts; /* The vertices that represent this cloth. */
+ struct LinkNode *springs; /* The springs connecting the mesh. */
+ unsigned int numverts; /* The number of verts == m * n. */
+ unsigned int numsprings; /* The count of springs. */
+ unsigned int numfaces;
+ unsigned char old_solver_type; /* unused, only 1 solver here */
+ unsigned char pad2;
+ short pad3;
+ struct BVH *tree; /* collision tree for this cloth object */
+ struct MFace *mfaces;
+ struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */
+}
+Cloth;
+
+#endif
+/**
+* $Id: DNA_cloth_types.h,v 1.1 2007/08/01 02:28:34 daniel Exp $
+*
+* ***** 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) 2006 by NaN Holding BV.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Daniel (Genscher)
+*
+* ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+#ifndef DNA_CLOTH_TYPES_H
+#define DNA_CLOTH_TYPES_H
+
+#include "DNA_listBase.h"
+
+/**
+* This struct contains all the global data required to run a simulation.
+* At the time of this writing, this structure contains data appropriate
+* to run a simulation as described in Deformation Constraints in a
+* Mass-Spring Model to Describe Rigid Cloth Behavior by Xavier Provot.
+*
+* I've tried to keep similar, if not exact names for the variables as
+* are presented in the paper. Where I've changed the concept slightly,
+* as in stepsPerFrame comapred to the time step in the paper, I've used
+* variables with different names to minimize confusion.
+**/
+typedef struct SimulationSettings
+{
+ short vgroup_mass; /* optional vertexgroup name for assigning weight.*/
+ short vgroup_struct; /* vertex group for scaling structural stiffness */
+ float mingoal; /* see SB */
+ int preroll; /* How many frames of simulation to do before we start. */
+ float Cdis; /* Mechanical damping of springs. */
+ float Cvi; /* Viscous/fluid damping. */
+ int stepsPerFrame; /* Number of time steps per frame. */
+ float gravity [3]; /* Gravity/external force vector. */
+ float ufluid [3]; /* Velocity vector of the fluid. */
+ float dt; /* This is the duration of our time step, computed. */
+ float mass; /* The mass of the entire cloth. */
+ float structural; /* Structural spring stiffness. */
+ float shear; /* Shear spring stiffness. */
+ float bending; /* Flexion spring stiffness. */
+ float sim_time;
+ int flags; /* flags, see CSIMSETT_FLAGS enum above. */
+ short solver_type; /* which solver should be used? txold */
+ short vgroup_bend; /* vertex group for scaling bending stiffness */
+ float maxgoal; /* see SB */
+ float eff_force_scale;/* Scaling of effector forces (see softbody_calc_forces).*/
+ float eff_wind_scale; /* Scaling of effector wind (see softbody_calc_forces). */
+ float sim_time_old;
+ struct LinkNode *cache; /* UNUSED atm */
+ float defgoal;
+ int goalfrict;
+ float goalspring;
+ int maxspringlen; /* in percent!; if tearing enabled, a spring will get cut */
+ int lastframe; /* frame on which simulation stops */
+ int firstframe; /* frame on which simulation starts */
+ int lastcachedframe;
+ int editedframe; /* which frame is in buffer */
+ int autoprotect; /* starting from this frame, cache gets protected */
+ float max_bend; /* max bending scaling value, min is "bending" */
+ float max_struct; /* max structural scaling value, min is "structural" */
+ float max_shear; /* max shear scaling value, UNUSED */
+ int firstcachedframe;
+ int pad;
+}
+SimulationSettings;
+
+
+typedef struct CollisionSettings
+{
+ float epsilon; /* The radius of a particle in the cloth. */
+ float self_friction; /* Fiction/damping with self contact. */
+ float friction; /* Friction/damping applied on contact with other object.*/
+ short collision_type; /* which collision system is used. */
+ short loop_count; /* How many iterations for the collision loop. */
+ struct LinkNode *collision_list; /* e.g. pointer to temp memory for collisions */
+ int flags; /* collision flags defined in BKE_cloth.h */
+ float avg_spring_len; /* for selfcollision */
+}
+CollisionSettings;
+
+
+/**
+* This structure describes a cloth object against which the
+* simulation can run.
+*
+* The m and n members of this structure represent the assumed
+* rectangular ordered grid for which the original paper is written.
+* At some point they need to disappear and we need to determine out
+* own connectivity of the mesh based on the actual edges in the mesh.
+*
+**/
+typedef struct Cloth
+{
+ struct ClothVertex *verts; /* The vertices that represent this cloth. */
+ struct LinkNode *springs; /* The springs connecting the mesh. */
+ unsigned int numverts; /* The number of verts == m * n. */
+ unsigned int numsprings; /* The count of springs. */
+ unsigned int numfaces;
+ unsigned char old_solver_type; /* unused, only 1 solver here */
+ unsigned char pad2;
+ short pad3;
+ struct BVH *tree; /* collision tree for this cloth object */
+ struct MFace *mfaces;
+ struct Implicit_Data *implicit; /* our implicit solver connects to this pointer */
+}
+Cloth;
+
+#endif
diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h
index a4224976f5f..3caa74c9a72 100644
--- a/source/blender/makesdna/DNA_color_types.h
+++ b/source/blender/makesdna/DNA_color_types.h
@@ -69,13 +69,16 @@ typedef struct CurveMapping {
CurveMap cm[4]; /* max 4 builtin curves per mapping struct now */
float black[3], white[3]; /* black/white point (black[0] abused for current frame) */
- float bwmul[3], padf; /* black/white point multiply value, for speed */
+ float bwmul[3]; /* black/white point multiply value, for speed */
+
+ float sample[3]; /* sample values, if flag set it draws line and intersection */
} CurveMapping;
/* cumapping->flag */
#define CUMA_DO_CLIP 1
#define CUMA_PREMULLED 2
#define CUMA_DRAW_CFRA 4
+#define CUMA_DRAW_SAMPLE 8
#endif
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index fcde95371ac..2bcf2412588 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -36,13 +36,12 @@
#include "DNA_ID.h"
#include "DNA_ipo_types.h"
+#include "DNA_listBase.h"
#include "DNA_object_types.h"
struct Action;
struct Text;
-#ifndef __cplusplus
-struct PyObject;
-#endif
+struct Ipo;
/* channels reside in Object or Action (ListBase) constraintChannels */
typedef struct bConstraintChannel {
@@ -55,46 +54,93 @@ typedef struct bConstraintChannel {
/* A Constraint */
typedef struct bConstraint {
struct bConstraint *next, *prev;
+
void *data; /* Constraint data (a valid constraint type) */
short type; /* Constraint type */
short flag; /* Flag - General Settings */
char ownspace; /* Space that owner should be evaluated in */
- char tarspace; /* Space that target should be evaluated in */
+ char tarspace; /* Space that target should be evaluated in (only used if 1 target) */
- char name[30]; /* Constraint name */
+ 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;
+ struct Ipo *ipo; /* local influence ipo or driver */
} bConstraint;
-/* Python Script Constraint */
-typedef struct bPythonConstraint {
- Object *tar; /* object to use as target (if required) */
- char subtarget[32]; /* bone to use as subtarget (if required) */
+/* 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 pad;
+ 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;
-/* Single-target subobject constraints --------------------- */
+
/* 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 */
+ short rootbone; /* index to rootbone, if zero go all the way to mother bone */
+ short max_rootbone; /* for auto-ik, maximum length of chain */
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;
+
+/* Single-target subobject constraints --------------------- */
/* Track To Constraint */
typedef struct bTrackToConstraint {
Object *tar;
@@ -125,10 +171,10 @@ typedef struct bLocateLikeConstraint {
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;
@@ -143,13 +189,13 @@ typedef struct bSizeLikeConstraint {
/* Action Constraint */
typedef struct bActionConstraint {
Object *tar;
- short type;
+ short type; /* what transform 'channel' drives the result */
short local; /* was used in versions prior to the Constraints recode */
- int start;
- int end;
+ int start;
+ int end;
float min;
float max;
- int pad;
+ int pad;
struct bAction *act;
char subtarget[32];
} bActionConstraint;
@@ -249,7 +295,7 @@ typedef struct bRotLimitConstraint {
float ymin, ymax;
float zmin, zmax;
short flag;
- short pad1;
+ short flag2;
} bRotLimitConstraint;
/* Limit Scaling Constraint */
@@ -258,56 +304,94 @@ typedef struct bSizeLimitConstraint {
float ymin, ymax;
float zmin, zmax;
short flag;
- short pad1;
+ short flag2;
} bSizeLimitConstraint;
-/* bConstraint.type */
-#define CONSTRAINT_TYPE_NULL 0
-#define CONSTRAINT_TYPE_CHILDOF 1 /* Unimplemented non longer :) - during constraints recode, Aligorith */
-#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 no longer :) - Aligorith. Scripts */
-#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 /* was never properly coded - removed! */
-#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 */
-#define CONSTRAINT_TYPE_TRANSFORM 19 /* transformation constraint */
+/* Limit Distance Constraint */
+typedef struct bDistLimitConstraint {
+ Object *tar;
+ char subtarget[32];
+
+ float dist; /* distance (radius of clamping sphere) from target */
+ float soft; /* distance from clamping-sphere to start applying 'fade' */
+
+ short flag; /* settings */
+ short mode; /* how to limit in relation to clamping sphere */
+ int pad;
+} bDistLimitConstraint;
+
+/* ------------------------------------------ */
+
+/* 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_DISTLIMIT, /* limit distance */
+ 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
- /* flag 0x20 was used to indicate that a constraint was evaluated using a 'local' hack for posebones only */
+ 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 */
-#define CONSTRAINT_SPACEONCE 0x40
+ CONSTRAINT_SPACEONCE = (1<<6),
+ /* influence ipo is on constraint itself, not in action channel */
+ CONSTRAINT_OWN_IPO = (1<<7),
+ /* indicates that constraint was added locally (i.e. didn't come from the proxy-lib) */
+ CONSTRAINT_PROXY_LOCAL = (1<<8)
+} B_CONSTRAINT_FLAG;
/* bConstraint->ownspace/tarspace */
- /* default for all - worldspace */
-#define CONSTRAINT_SPACE_WORLD 0
- /* for objects (relative to parent/without parent influence), for bones (along normals of bone, without parent/restposi) */
-#define CONSTRAINT_SPACE_LOCAL 1
- /* for posechannels - pose space */
-#define CONSTRAINT_SPACE_POSE 2
- /* for posechannels - local with parent */
-#define CONSTRAINT_SPACE_PARLOCAL 3
+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
@@ -327,6 +411,7 @@ typedef struct bSizeLimitConstraint {
#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
@@ -383,6 +468,8 @@ typedef struct bSizeLimitConstraint {
#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
@@ -401,9 +488,20 @@ typedef struct bSizeLimitConstraint {
#define LIMIT_YROT 0x02
#define LIMIT_ZROT 0x04
-/* not used anymore - for older Limit Location constraints only */
+ /* not used anymore - for older Limit Location constraints only */
#define LIMIT_NOPARENT 0x01
+ /* for all Limit constraints - allow to be used during transform? */
+#define LIMIT_TRANSFORM 0x02
+/* distance limit constraint */
+ /* bDistLimitConstraint->flag */
+#define LIMITDIST_USESOFT (1<<0)
+
+ /* bDistLimitConstraint->mode */
+#define LIMITDIST_INSIDE 0
+#define LIMITDIST_OUTSIDE 1
+#define LIMITDIST_ONSURFACE 2
+
/* python constraint -> flag */
#define PYCON_USETARGETS 0x01
#define PYCON_SCRIPTERROR 0x02
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index bd772bbeecb..807fc2add07 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -193,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..09af11fa64b 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -67,7 +67,9 @@ 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_ORCO 14
+#define CD_NUMTYPES 15
/* Bits for CustomDataMask */
#define CD_MASK_MVERT (1 << CD_MVERT)
@@ -83,6 +85,8 @@ 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)
+#define CD_MASK_ORCO (1 << CD_ORCO)
/* CustomData.flag */
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 8a5a7ce4a4c..d5e4b7a1142 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -108,7 +108,7 @@ typedef struct Image {
#define IMA_REFLECT 16
#define IMA_NOCOLLECT 32
#define IMA_ANTIALI 64
-
+#define IMA_DO_PREMUL 128
/* tpageflag */
#define IMA_TILES 1
diff --git a/source/blender/makesdna/DNA_ipo_types.h b/source/blender/makesdna/DNA_ipo_types.h
index 57f44e22334..8ec412a3534 100644
--- a/source/blender/makesdna/DNA_ipo_types.h
+++ b/source/blender/makesdna/DNA_ipo_types.h
@@ -69,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
@@ -107,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
/* ******************** */
@@ -317,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
@@ -351,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 ********************* */
@@ -397,3 +430,5 @@ typedef short IPO_Channel;
#endif
+
+
diff --git a/source/blender/makesdna/DNA_key_types.h b/source/blender/makesdna/DNA_key_types.h
index 3292e07f80e..87c09fb0ee4 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, flag; /* relative == 0 means first key is reference */
+ int totelem, pad2;
void *data;
float *weights;
@@ -87,5 +87,8 @@ typedef struct Key {
#define KEY_CARDINAL 1
#define KEY_BSPLINE 2
+/* keyblock->flag */
+#define KEYBLOCK_MUTE 1
+
#endif
diff --git a/source/blender/makesdna/DNA_listBase.h b/source/blender/makesdna/DNA_listBase.h
index 10a1b59fb01..e81cb886d6f 100644
--- a/source/blender/makesdna/DNA_listBase.h
+++ b/source/blender/makesdna/DNA_listBase.h
@@ -43,11 +43,20 @@
extern "C" {
#endif
+/* generic - all structs which are used in linked-lists used this */
typedef struct Link
{
struct Link *next,*prev;
} Link;
+
+/* use this when it is not worth defining a custom one... */
+typedef struct LinkData
+{
+ struct LinkData *next, *prev;
+ void *data;
+} LinkData;
+
/* never change the size of this! genfile.c detects pointerlen with it */
typedef struct ListBase
{
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 252af0ebdb1..d885bfcae82 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -79,15 +79,19 @@ typedef struct Material {
float aniso_gloss_mir;
float dist_mir;
short fadeto_mir;
- short pad1;
+ short shade_flag; /* like Cubic interpolation */
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;
+ float strand_sta, strand_end, strand_ease, strand_surfnor;
+ float strand_min, strand_widthfade;
+ char strand_uvname[32];
- float sbias; /* shadow bias */
- float shad_alpha, padf; /* in use for irregular shadowbuffer */
+ float sbias; /* shadow bias to prevent terminator prob */
+ float lbias; /* factor to multiply lampbias with (0.0 = no mult) */
+ float shad_alpha; /* in use for irregular shadowbuffer */
+ float padf; /* free padding, take me! */
/* for buttons and render*/
char rgbsel, texact, pr_type, use_nodes;
@@ -120,6 +124,7 @@ typedef struct Material {
float fhdist, xyfrict;
short dynamode, pad2;
+ /* subsurface scattering */
float sss_radius[3], sss_col[3];
float sss_error, sss_scale, sss_ior;
float sss_colfac, sss_texfac;
@@ -188,13 +193,19 @@ 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_STR_SURFDIFF 0x80000000
-#define MA_MODE_MASK 0x1fffffff /* all valid mode bits */
+#define MA_MODE_MASK 0x4fffffff /* all valid mode bits */
/* ray mirror fadeout */
#define MA_RAYMIR_FADETOSKY 0
#define MA_RAYMIR_FADETOMAT 1
+/* shade_flag */
+#define MA_CUBIC 1
+
/* diff_shader */
#define MA_DIFF_LAMBERT 0
#define MA_DIFF_ORENNAYAR 1
@@ -273,6 +284,31 @@ 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 912
+#define MAP_PA_CLUMP 128
+#define MAP_PA_KINK 256
+#define MAP_PA_ROUGH 512
+
/* pr_type */
#define MA_FLAT 0
#define MA_SPHERE 1
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 68d9bb245cf..1c038c51298 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -99,6 +99,9 @@ typedef struct MStringProperty{
char s[256];
} MStringProperty;
+typedef struct OrigSpaceFace {
+ float uv[4][2];
+} OrigSpaceFace;
/* Multiresolution modeling */
typedef struct MultiresCol {
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 71e850e4368..1c70508509b 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -28,6 +28,12 @@ typedef enum ModifierType {
eModifierType_UVProject,
eModifierType_Smooth,
eModifierType_Cast,
+ eModifierType_MeshDeform,
+ eModifierType_ParticleSystem,
+ eModifierType_ParticleInstance,
+ eModifierType_Explode,
+ eModifierType_Cloth,
+ eModifierType_Collision,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -159,6 +165,7 @@ typedef struct MirrorModifierData {
short axis, flag;
float tolerance;
+ struct Object *mirror_ob;
} MirrorModifierData;
/* MirrorModifierData->flag */
@@ -311,9 +318,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;
@@ -335,6 +343,33 @@ typedef struct SoftbodyModifierData {
ModifierData modifier;
} SoftbodyModifierData;
+typedef struct ClothModifierData {
+ ModifierData modifier;
+
+ struct Cloth *clothObject; /* The internal data structure for cloth. */
+ struct SimulationSettings *sim_parms; /* definition is in DNA_cloth_types.h */
+ struct CollisionSettings *coll_parms; /* definition is in DNA_cloth_types.h */
+} ClothModifierData;
+
+typedef struct CollisionModifierData {
+ ModifierData modifier;
+
+ struct MVert *x; /* position at the beginning of the frame */
+ struct MVert *xnew; /* position at the end of the frame */
+ struct MVert *xold; /* unsued atm, but was discussed during sprint */
+ struct MVert *current_xnew; /* new position at the actual inter-frame step */
+ struct MVert *current_x; /* position at the actual inter-frame step */
+ struct MVert *current_v; /* position at the actual inter-frame step */
+
+ struct MFace *mfaces; /* object face data */
+
+ unsigned int numverts;
+ unsigned int numfaces;
+ int pad;
+ float time;
+ struct BVH *tree; /* collision tree for this cloth object */
+} CollisionModifierData;
+
typedef enum {
eBooleanModifierOp_Intersect,
eBooleanModifierOp_Union,
@@ -347,4 +382,87 @@ 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;
+ int totdmvert, totdmedge, totdmface;
+ short flag, rt;
+} 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 d7ccfe01085..e9a0a3d0602 100644
--- a/source/blender/makesdna/DNA_nla_types.h
+++ b/source/blender/makesdna/DNA_nla_types.h
@@ -70,17 +70,17 @@ typedef struct bActionStrip {
struct Object *object; /* For groups, the actual object being nla'ed */
float start, end; /* The range of frames covered by this strip */
float actstart, actend; /* The range of frames taken from the action */
- float actoffs, padf; /* Offset within action, for cycles and striding */
+ float actoffs; /* Offset within action, for cycles and striding */
float stridelen; /* The stridelength (considered when flag & ACT_USESTRIDE) */
float repeat; /* The number of times to repeat the action range */
+ float scale; /* The amount the action range is scaled by */
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 */
- struct ListBase modifiers; /* modifier stack */
-
+ ListBase modifiers; /* modifier stack */
} bActionStrip;
/* strip->mode (these defines aren't really used, but are here for reference) */
@@ -88,18 +88,20 @@ typedef struct bActionStrip {
#define ACTSTRIPMODE_ADD 1
/* strip->flag */
-#define ACTSTRIP_SELECT 0x01
-#define ACTSTRIP_USESTRIDE 0x02
-#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 /* 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
-#define ACTSTRIP_AUTO_BLENDS 0x800
+typedef enum eActStrip_Flag {
+ ACTSTRIP_SELECT = (1<<0),
+ ACTSTRIP_USESTRIDE = (1<<1),
+ ACTSTRIP_BLENDTONEXT = (1<<2), /* Not implemented. Is not used anywhere */
+ ACTSTRIP_HOLDLASTFRAME = (1<<3),
+ ACTSTRIP_ACTIVE = (1<<4),
+ ACTSTRIP_LOCK_ACTION = (1<<5),
+ ACTSTRIP_MUTE = (1<<6),
+ ACTSTRIP_REVERSE = (1<<7), /* This has yet to be implemented. To indicate that a strip should be played backwards */
+ ACTSTRIP_CYCLIC_USEX = (1<<8),
+ ACTSTRIP_CYCLIC_USEY = (1<<9),
+ ACTSTRIP_CYCLIC_USEZ = (1<<10),
+ ACTSTRIP_AUTO_BLENDS = (1<<11)
+} eActStrip_Flag;
#endif
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 63ead419766..b5c0afe59d7 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -92,7 +92,8 @@ typedef struct bNodeSocket {
#define SOCK_IN_USE 4
/* unavailable is for dynamic sockets */
#define SOCK_UNAVAIL 8
-
+ /* flag for selection status */
+#define SOCK_SEL 16
#
#
typedef struct bNodePreview {
@@ -106,6 +107,7 @@ typedef struct bNode {
struct bNode *next, *prev, *new_node;
char name[32];
+ char username[32]; /* custom name defined by user */
short type, flag;
short done, level; /* both for dependency and sorting */
short lasty, menunr; /* lasty: check preview render status, menunr: browse ID blocks */
@@ -167,6 +169,10 @@ typedef struct bNodeTree {
ListBase alltypes; /* type definitions */
struct bNodeType *owntype; /* for groups or dynamic trees, no read/write */
+ /* selected input/output socket */
+ bNodeSocket *selin;
+ bNodeSocket *selout;
+
/* callbacks */
void (*timecursor)(int nr);
void (*stats_draw)(char *str);
@@ -191,13 +197,27 @@ typedef struct NodeImageAnim {
} NodeImageAnim;
typedef struct NodeBlurData {
- short sizex, sizey, samples, maxspeed, minspeed, pad1;
- float fac;
+ short sizex, sizey;
+ short samples, maxspeed, minspeed, relative;
+ float fac, percentx, percenty;
short filtertype;
char bokeh, gamma;
- int pad2;
+ short curved;
+ short pad;
+ int image_in_width, image_in_height; /* needed for absolute/relative conversions */
} NodeBlurData;
+typedef struct NodeDBlurData {
+ float center_x, center_y, distance, angle, spin, zoom;
+ short iter;
+ char wrap, pad;
+} NodeDBlurData;
+
+typedef struct NodeBilateralBlurData {
+ float sigma_color, sigma_space;
+ short iter, pad;
+} NodeBilateralBlurData;
+
typedef struct NodeHueSat {
float hue, sat, val;
} NodeHueSat;
@@ -214,6 +234,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 +254,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..c2500fba7fe 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*/
@@ -109,10 +129,13 @@ typedef struct SoftBody {
minloops,
maxloops,
choke,
- pad3,pad4,pad5
+ solver_ID,
+ plastic,pad5
;
struct SBScratch *scratch; /* scratch pad/cache on live time not saved in file */
+ float shearstiff;
+ float inpush;
} SoftBody;
@@ -122,11 +145,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 +190,20 @@ typedef struct SoftBody {
#define OB_SB_FACECOLL 1024
#define OB_SB_EDGECOLL 2048
#define OB_SB_COLLFINAL 4096
+#define OB_SB_PROTECT_CACHE 8192
+#define OB_SB_AERO_ANGLE 16384
+/* 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 25322fbe477..f3a0dfdfdc7 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 {
@@ -83,6 +84,7 @@ typedef struct Object {
struct Path *path;
struct BoundBox *bb;
struct bAction *action;
+ struct bAction *poselib;
struct bPose *pose;
void *data;
@@ -117,7 +119,7 @@ typedef struct Object {
int dupon, dupoff, dupsta, dupend;
- float sf, ctime;
+ float sf, ctime; /* sf is time-offset, ctime is the objects current time */
/* during realtime */
@@ -140,8 +142,9 @@ typedef struct Object {
char dt, dtx;
char totcol; /* copy of mesh or curve or meta */
char actcol; /* currently selected material in the user interface */
- char empty_drawtype, pad1[7];
+ char empty_drawtype, pad1[3];
float empty_drawsize;
+ float dupfacesca; /* dupliface scale */
ScriptLink scriptlink;
ListBase prop;
@@ -181,6 +184,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 */
@@ -195,7 +199,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;
@@ -266,7 +270,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
@@ -275,6 +279,8 @@ extern Object workob;
#define OB_DUPLIGROUP 256
#define OB_DUPLIFACES 512
#define OB_DUPLIFACES_SCALE 1024
+#define OB_DUPLIPARTS 2048
+#define OB_RENDER_DUPLI 4096
/* (short) ipoflag */
#define OB_DRAWKEY 1
@@ -291,6 +297,9 @@ extern Object workob;
/* for stride edit */
#define OB_DISABLE_PATH 1024
+#define OB_OFFS_PARENTADD 2048
+
+
/* (short) trackflag / upflag */
#define OB_POSX 0
#define OB_POSY 1
@@ -308,6 +317,18 @@ 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))
+
+#define CHECK_OB_DRAWFACEDOT(sce, vd, dt) \
+ ( (sce->selectmode & SCE_SELECT_FACE) && \
+ (vd->drawtype<=OB_SOLID) && \
+ (((vd->drawtype==OB_SOLID) && (dt>=OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX) && (vd->flag & V3D_ZBUF_SELECT)) == 0) \
+ )
+
+
/* dtx: flags, char! */
#define OB_AXIS 2
#define OB_TEXSPACE 4
@@ -326,6 +347,8 @@ extern Object workob;
#define OB_CIRCLE 3
#define OB_SINGLE_ARROW 4
#define OB_CUBE 5
+#define OB_EMPTY_SPHERE 6
+#define OB_EMPTY_CONE 7
/* boundtype */
#define OB_BOUND_BOX 0
@@ -437,3 +460,4 @@ extern Object workob;
#endif
+
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
new file mode 100644
index 00000000000..6fcedcd934a
--- /dev/null
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -0,0 +1,451 @@
+/* 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];
+
+ /* simplification */
+ short simplify_flag, simplify_refsize;
+ float simplify_rate, simplify_transition;
+ float simplify_viewport;
+
+ /* general values */
+ float sta, end, lifetime, randlife;
+ float timetweak, jitfac, keyed_time, eff_hair, rt;
+ int totpart, userjit, grid_res;
+
+ /* initial velocity factors */
+ float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
+ float avefac, phasefac, randrotfac, randphasefac;
+ /* 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, ren_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];
+
+ /* temporary storage during render */
+ void *renderdata;
+}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 10000 /* 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)
+#define PART_DRAW_REN_STRAND (1<<15)
+
+/* part->simplify_flag */
+#define PART_SIMPLIFY_ENABLE 1
+#define PART_SIMPLIFY_VIEWPORT 2
+
+/* 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_GLOB_X 3
+#define PART_ROT_GLOB_Y 4
+#define PART_ROT_GLOB_Z 5
+#define PART_ROT_OB_X 6
+#define PART_ROT_OB_Y 7
+#define PART_ROT_OB_Z 8
+
+/* 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 12
+
+#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
+#define PSYS_VG_EFFECTOR 11
+
+/* 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 56b44c3ec97..29fc39e838f 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -120,7 +120,11 @@ typedef struct SceneRenderLayer {
struct Group *light_override;
unsigned int lay; /* scene->lay itself has priority over this */
+ unsigned int lay_zmask; /* has to be after lay, this is for Z-masking */
int layflag;
+
+ int pad;
+
int passflag; /* pass_xor has to be after passflag */
int pass_xor;
} SceneRenderLayer;
@@ -137,6 +141,7 @@ typedef struct SceneRenderLayer {
#define SCE_LAY_ALL_Z 0x8000
#define SCE_LAY_XOR 0x10000
#define SCE_LAY_DISABLE 0x20000
+#define SCE_LAY_ZMASK 0x40000
/* srl->passflag */
#define SCE_PASS_COMBINED 1
@@ -153,6 +158,8 @@ typedef struct SceneRenderLayer {
#define SCE_PASS_INDEXOB 2048
#define SCE_PASS_UV 4096
#define SCE_PASS_RADIO 8192
+#define SCE_PASS_MIST 16384
+
/* note, srl->passflag is treestore element 'nr' in outliner, short still... */
@@ -240,9 +247,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 +257,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 */
@@ -264,6 +272,8 @@ typedef struct RenderData {
/* Bake Render options */
short bake_osa, bake_filter, bake_mode, bake_flag;
+ short bake_normal_space, bpad;
+ float bake_maxdist;
/* yafray: global panel params. TODO: move elsewhere */
short GIquality, GIcache, GImethod, GIphotons, GIdirect;
@@ -276,7 +286,7 @@ typedef struct RenderData {
float YF_gamma, YF_exposure, YF_raybias, YF_AApixelsize, YF_AAthreshold;
/* paths to backbufffer, output, ftype */
- char backbuf[160], pic[160], ftype[160];
+ char backbuf[160], pic[160];
/* stamps flags. */
int stamp;
@@ -307,11 +317,34 @@ 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 TransformOrientation {
+ struct TransformOrientation *next, *prev;
+ char name[36];
+ float mat[3][3];
+} TransformOrientation;
typedef struct ToolSettings {
/* Subdivide Settings */
@@ -343,10 +376,14 @@ typedef struct ToolSettings {
short uvcalc_mapalign;
short uvcalc_flag;
- short pad2;
-
- /* Image Paint (8 byte aligned please!) */
+ /* Auto-IK */
+ short autoik_chainlen;
+
+ /* Image Paint (8 byttse aligned please!) */
struct ImagePaintSettings imapaint;
+
+ /* Particle Editing */
+ struct ParticleEditSettings particle;
/* Select Group Threshold */
float select_thresh;
@@ -362,7 +399,21 @@ typedef struct ToolSettings {
/* Multires */
char multires_subdiv_type;
- char pad4[2];
+ /* Skeleton generation */
+ short skgen_resolution;
+ float skgen_threshold_internal;
+ float skgen_threshold_external;
+ float skgen_length_ratio;
+ float skgen_length_limit;
+ float skgen_angle_limit;
+ float skgen_correlation_limit;
+ float skgen_symmetry_limit;
+ short skgen_options;
+ char skgen_postpro;
+ char skgen_postpro_passes;
+ char skgen_subdivisions[3];
+
+ char pad3[5];
} ToolSettings;
/* Used by all brushes to store their properties, which can be directly set
@@ -372,8 +423,8 @@ typedef struct BrushData
{
short size;
char strength, dir; /* Not used for smooth brush */
- char airbrush;
char view;
+ char flag;
char pad[2];
} BrushData;
@@ -386,6 +437,9 @@ typedef struct SculptData
/* Pointers to all of sculptmodes's textures */
struct MTex *mtex[10];
+ /* Editable brush shape */
+ struct CurveMapping *cumap;
+
/* Settings for each brush */
BrushData drawbrush, smoothbrush, pinchbrush, inflatebrush, grabbrush, layerbrush, flattenbrush;
short brush_type;
@@ -406,6 +460,10 @@ typedef struct SculptData
/* Symmetry is separate from the other BrushData because the same
settings are always used for all brush types */
char symm;
+
+ /* Added to store if the 'Rake' setting has been set */
+ char rake;
+ char pad[7];
} SculptData;
typedef struct Scene {
@@ -426,7 +484,7 @@ 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;
@@ -449,6 +507,7 @@ typedef struct Scene {
ScriptLink scriptlink;
ListBase markers;
+ ListBase transform_spaces;
short jumpframe, pad1;
short snap_flag, snap_target;
@@ -497,6 +556,9 @@ typedef struct Scene {
#define R_THREADS 0x80000
#define R_SPEED 0x100000
#define R_SSS 0x200000
+#define R_NO_OVERWRITE 0x400000 /* skip existing files */
+#define R_TOUCH 0x800000 /* touch files before rendering */
+
/* filtertype */
#define R_FILTER_BOX 0
@@ -506,6 +568,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
@@ -526,8 +589,9 @@ typedef struct Scene {
#define R_EXR_TILE_FILE 0x0400
#define R_COMP_FREE 0x0800
#define R_NO_IMAGE_LOAD 0x1000
-#define R_NO_TEX 0x2000
+#define R_NO_TEX 0x2000
#define R_STAMP_INFO 0x4000
+#define R_FULL_SAMPLE 0x8000
/* r->stamp */
#define R_STAMP_TIME 0x0001
@@ -538,6 +602,8 @@ typedef struct Scene {
#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
@@ -553,7 +619,7 @@ typedef struct Scene {
#define R_TARGA 0
#define R_IRIS 1
#define R_HAMX 2
-#define R_FTYPE 3
+#define R_FTYPE 3 /* ftype is nomore */
#define R_JPEG90 4
#define R_MOVIE 5
#define R_IRIZ 7
@@ -581,8 +647,15 @@ typedef struct Scene {
/* bake_mode: same as RE_BAKE_xxx defines */
/* bake_flag: */
-#define R_BAKE_CLEAR 1
-#define R_BAKE_OSA 2
+#define R_BAKE_CLEAR 1
+#define R_BAKE_OSA 2
+#define R_BAKE_TO_ACTIVE 4
+
+/* bake_normal_space */
+#define R_BAKE_SPACE_CAMERA 0
+#define R_BAKE_SPACE_WORLD 1
+#define R_BAKE_SPACE_OBJECT 2
+#define R_BAKE_SPACE_TANGENT 3
/* **************** SCENE ********************* */
#define RAD_PHASE_PATCHES 1
@@ -596,12 +669,18 @@ typedef struct Scene {
#define SCE_SNAP_TARGET_CLOSEST 0
#define SCE_SNAP_TARGET_CENTER 1
#define SCE_SNAP_TARGET_MEDIAN 2
+#define SCE_SNAP_TARGET_ACTIVE 3
/* 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
@@ -628,6 +707,9 @@ typedef struct Scene {
#define FFMPEG_MULTIPLEX_AUDIO 1
#define FFMPEG_AUTOSPLIT_OUTPUT 2
+/* Sculpt brush flags */
+#define SCULPT_BRUSH_AIRBRUSH 1
+#define SCULPT_BRUSH_ANCHORED 2
/* SculptData.flags */
#define SCULPT_INPUT_SMOOTH 1
#define SCULPT_DRAW_FAST 2
@@ -654,6 +736,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
@@ -663,6 +767,24 @@ typedef struct Scene {
#define RETOPO_LINE 2
#define RETOPO_ELLIPSE 4
+/* toolsettings->skgen_options */
+#define SKGEN_FILTER_INTERNAL 1
+#define SKGEN_FILTER_EXTERNAL 2
+#define SKGEN_SYMMETRY 4
+#define SKGEN_CUT_LENGTH 8
+#define SKGEN_CUT_ANGLE 16
+#define SKGEN_CUT_CORRELATION 32
+
+#define SKGEN_SUB_LENGTH 0
+#define SKGEN_SUB_ANGLE 1
+#define SKGEN_SUB_CORRELATION 2
+#define SKGEN_SUB_TOTAL 3
+
+/* toolsettings->skgen_postpro */
+#define SKGEN_SMOOTH 0
+#define SKGEN_AVERAGE 1
+#define SKGEN_SHARPEN 2
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index bd6976f1414..8e8f84f0bb6 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -46,19 +46,56 @@ struct Scene;
typedef struct StripElem {
char name[80];
+} StripElem;
+
+typedef struct TStripElem {
struct ImBuf *ibuf;
- struct StripElem *se1, *se2, *se3;
+ struct ImBuf *ibuf_comp;
+ struct TStripElem *se1, *se2, *se3;
short ok;
- short pad;
+ short flag;
int nr;
-} StripElem;
+} TStripElem;
+
+typedef struct StripCrop {
+ int top;
+ int bottom;
+ int left;
+ int right;
+} StripCrop;
+
+typedef struct StripTransform {
+ int xofs;
+ int yofs;
+} StripTransform;
+
+typedef struct StripColorBalance {
+ float lift[3];
+ float gamma[3];
+ float gain[3];
+ int flag;
+ float exposure;
+ float saturation;
+} StripColorBalance;
+
+typedef struct StripProxy {
+ char dir[160];
+} StripProxy;
typedef struct Strip {
struct Strip *next, *prev;
int rt, len, us, done;
+ int startstill, endstill;
StripElem *stripdata;
char dir[160];
int orx, ory;
+ StripProxy *proxy;
+ StripCrop *crop;
+ StripTransform *transform;
+ StripColorBalance *color_balance;
+ TStripElem *tstripdata;
+ TStripElem *tstripdata_startstill;
+ TStripElem *tstripdata_endstill;
} Strip;
@@ -87,13 +124,12 @@ typedef struct PluginSeq {
/* WATCH IT: first part identical to ID (for use in ipo's) */
typedef struct Sequence {
-
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 flag, type; /*flags bitmap (see below) and the type of sequence*/
int len; /* the length of the contense of this strip - before handles are applied */
int start, startofs, endofs;
int startstill, endstill;
@@ -102,9 +138,9 @@ typedef struct Sequence {
float mul, handsize;
/* is sfra needed anymore? - it looks like its only used in one place */
int sfra; /* starting frame according to the timeline of the scene. */
+ int anim_preseek;
Strip *strip;
- StripElem *curelem; /* reference the current frame - value from give_stripelem */
struct Ipo *ipo;
struct Scene *scene;
@@ -126,7 +162,13 @@ typedef struct Sequence {
void *effectdata; /* Struct pointer for effect settings */
- int anim_preseek;
+ int anim_startofs; /* only use part of animation file */
+ int anim_endofs; /* is subtle different to startofs / endofs */
+
+ int blend_mode;
+ float blend_opacity;
+
+ int scenenr; /* for scene selection */
int pad;
} Sequence;
@@ -185,7 +227,7 @@ typedef struct SpeedControlVars {
float globalSpeed;
int flags;
int length;
- int pad;
+ int lastValidFrame;
} SpeedControlVars;
/* SpeedControlVars->flags */
@@ -208,6 +250,17 @@ typedef struct SpeedControlVars {
#define SEQ_FLAG_DELETE 1024
#define SEQ_FLIPX 2048
#define SEQ_FLIPY 4096
+#define SEQ_MAKE_FLOAT 8192
+#define SEQ_LOCK 16384
+#define SEQ_USE_PROXY 32768
+#define SEQ_USE_TRANSFORM 65536
+#define SEQ_USE_CROP 131072
+#define SEQ_USE_COLOR_BALANCE 262144
+#define SEQ_USE_PROXY_CUSTOM_DIR 524288
+
+#define SEQ_COLOR_BALANCE_INVERSE_GAIN 1
+#define SEQ_COLOR_BALANCE_INVERSE_GAMMA 2
+#define SEQ_COLOR_BALANCE_INVERSE_LIFT 4
/* seq->type WATCH IT: SEQ_EFFECT BIT is used to determine if this is an effect strip!!! */
#define SEQ_IMAGE 0
@@ -233,7 +286,19 @@ typedef struct SpeedControlVars {
#define SEQ_TRANSFORM 27
#define SEQ_COLOR 28
#define SEQ_SPEED 29
+#define SEQ_EFFECT_MAX 29
+
+#define STRIPELEM_FAILED 0
+#define STRIPELEM_OK 1
+#define STRIPELEM_META 2
+
+#define STRIPELEM_PREVIEW_DONE 1
+#define SEQ_BLEND_REPLACE 0
+/* all other BLEND_MODEs are simple SEQ_EFFECT ids and therefore identical
+ to the table above. (Only those effects that handle _exactly_ two inputs,
+ otherwise, you can't really blend, right :) !)
+*/
#endif
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 10f488c9f61..c805221567f 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -94,7 +94,7 @@ typedef struct SpaceIpo {
/* the ipo context we need to store */
struct Ipo *ipo;
struct ID *from;
- char actname[32], constname[32];
+ char actname[32], constname[32], bonename[32];
short totipo, pin;
short butofs, channel;
@@ -150,7 +150,7 @@ typedef struct SpaceSeq {
float xof, yof; /* offset for drawing the image preview */
short mainb, zoom;
short chanshown;
- short pad2;
+ short zebra;
int flag;
int pad;
} SpaceSeq;
@@ -421,7 +421,7 @@ typedef struct SpaceImaSel {
/* filesel types */
#define FILE_UNIX 8
-#define FILE_BLENDER 8
+#define FILE_BLENDER 8 /* dont display relative paths */
#define FILE_SPECIAL 9
#define FILE_LOADLIB 1
@@ -618,10 +618,13 @@ typedef struct SpaceImaSel {
#define SEQ_DRAW_IMG_IMBUF 1
#define SEQ_DRAW_IMG_WAVEFORM 2
#define SEQ_DRAW_IMG_VECTORSCOPE 3
+#define SEQ_DRAW_IMG_HISTOGRAM 4
/* sseq->flag */
-#define SEQ_DRAWFRAMES 1
+#define SEQ_DRAWFRAMES 1
#define SEQ_MARKER_TRANS 2
+#define SEQ_DRAW_COLOR_SEPERATED 4
+#define SEQ_DRAW_SAFE_MARGINS 8
/* 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 794d818d8fe..bc2b0521d4f 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -57,9 +57,10 @@ typedef struct MTex {
char projx, projy, projz, mapping;
float ofs[3], size[3];
- short texflag, colormodel;
+ short texflag, colormodel, pmapto, pmaptoneg;
+ short normapspace, pad[3];
float r, g, b, k;
- float def_var;
+ float def_var, rt;
float colfac, norfac, varfac;
float dispfac;
@@ -107,6 +108,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];
@@ -156,7 +158,7 @@ typedef struct Tex {
float cropxmin, cropymin, cropxmax, cropymax;
short xrepeat, yrepeat;
short extend;
-
+
/* variables disabled, moved to struct iuser */
short fie_ima;
int len;
@@ -246,6 +248,7 @@ typedef struct TexMapping {
#define TEX_CALCALPHA 32
#define TEX_NORMALMAP 2048
#define TEX_GAUSS_MIP 4096
+#define TEX_FILTER_MIN 8192
/* imaflag unused, only for version check */
#define TEX_FIELDS_ 8
@@ -318,6 +321,12 @@ typedef struct TexMapping {
#define TEX_COL2 2
#define TEX_COL3 3
+/* mtex->normapspace */
+#define MTEX_NSPACE_CAMERA 0
+#define MTEX_NSPACE_WORLD 1
+#define MTEX_NSPACE_OBJECT 2
+#define MTEX_NSPACE_TANGENT 3
+
/* wrap */
#define MTEX_FLAT 0
#define MTEX_CUBE 1
@@ -338,11 +347,12 @@ typedef struct TexMapping {
#define PROJ_Z 3
/* texflag */
-#define MTEX_RGBTOINT 1
-#define MTEX_STENCIL 2
-#define MTEX_NEGATIVE 4
-#define MTEX_ALPHAMIX 8
-#define MTEX_VIEWSPACE 16
+#define MTEX_RGBTOINT 1
+#define MTEX_STENCIL 2
+#define MTEX_NEGATIVE 4
+#define MTEX_ALPHAMIX 8
+#define MTEX_VIEWSPACE 16
+#define MTEX_DUPLI_MAPTO 32
/* blendtype */
#define MTEX_BLEND 0
@@ -355,6 +365,10 @@ typedef struct TexMapping {
#define MTEX_LIGHT 7
#define MTEX_SCREEN 8
#define MTEX_OVERLAY 9
+#define MTEX_BLEND_HUE 10
+#define MTEX_BLEND_SAT 11
+#define MTEX_BLEND_VAL 12
+#define MTEX_BLEND_COLOR 13
/* **************** EnvMap ********************* */
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 4991fa38e1e..b22966e61d8 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -36,11 +36,12 @@
#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
-
+/* global, button colors */
typedef struct ThemeUI {
char outline[4];
char neutral[4];
@@ -63,11 +64,11 @@ typedef struct ThemeUI {
char but_drawtype;
char pad[3];
char iconfile[80]; // FILE_MAXFILE length
-
} ThemeUI;
-// try to put them all in one, if needed a special struct can be created as well
-// for example later on, when we introduce wire colors for ob types or so...
+/* try to put them all in one, if needed a special struct can be created as well
+ * for example later on, when we introduce wire colors for ob types or so...
+ */
typedef struct ThemeSpace {
char back[4];
char text[4];
@@ -92,6 +93,7 @@ typedef struct ThemeSpace {
char normal[4];
char bone_solid[4], bone_pose[4];
char strip[4], strip_select[4];
+ char cframe[4], pad[4];
char vertex_size, facedot_size;
char bpad[2];
@@ -102,16 +104,31 @@ 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 editmesh_active[4];
-
} ThemeSpace;
+/* set of colors for use as a custom color set for Objects/Bones wire drawing */
+typedef struct ThemeWireColor {
+ char solid[4];
+ char select[4];
+ char active[4];
+
+ short flag;
+ short pad;
+} ThemeWireColor;
+
+/* flags for ThemeWireColor */
+#define TH_WIRECOLOR_CONSTCOLS (1<<0)
+
+/* A theme */
typedef struct bTheme {
struct bTheme *next, *prev;
char name[32];
+ /* Interface Elements (buttons, menus, icons) */
ThemeUI tui;
+ /* Individual Spacetypes */
ThemeSpace tbuts;
ThemeSpace tv3d;
ThemeSpace tfile;
@@ -127,9 +144,12 @@ typedef struct bTheme {
ThemeSpace toops;
ThemeSpace ttime;
ThemeSpace tnode;
+
+ /* 20 sets of bone colors for this theme */
+ ThemeWireColor tarm[20];
+ /*ThemeWireColor tobj[20];*/
unsigned char bpad[4], bpad1[4];
-
} bTheme;
typedef struct SolidLight {
@@ -177,13 +197,17 @@ typedef struct UserDef {
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;
- float glalphaclip, pad;
+ char versemaster[160];
+ char verseuser[160];
+ float glalphaclip;
+
+ short autokey_mode; /* autokeying mode */
+ short autokey_flag; /* flags for autokeying */
+ struct ColorBand coba_weight; /* from texture.h */
} UserDef;
extern UserDef U; /* from usiblender.c !!!! */
@@ -208,6 +232,10 @@ extern UserDef U; /* from usiblender.c !!!! */
#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)
+#define USER_RELPATHS (1 << 20)
/* viewzom */
#define USER_ZOOM_CONT 0
@@ -215,9 +243,8 @@ extern UserDef U; /* from usiblender.c !!!! */
#define USER_ZOOM_DOLLY 2
/* uiflag */
-
-#define USER_KEYINSERTACT (1 << 0)
-#define USER_KEYINSERTOBJ (1 << 1)
+// old flag for #define USER_KEYINSERTACT (1 << 0)
+// old flag for #define USER_KEYINSERTOBJ (1 << 1)
#define USER_WHEELZOOMDIR (1 << 2)
#define USER_FILTERFILEEXTS (1 << 3)
#define USER_DRAWVIEWINFO (1 << 4)
@@ -231,15 +258,32 @@ extern UserDef U; /* from usiblender.c !!!! */
#define USER_LOCKAROUND (1 << 12)
#define USER_GLOBALUNDO (1 << 13)
#define USER_ORBIT_SELECTION (1 << 14)
-#define USER_KEYINSERTAVAI (1 << 15)
+// old flag for #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)
+// old flag for #define USER_KEYINSERTNEED (1 << 19)
#define USER_ZOOM_TO_MOUSEPOS (1 << 20)
+#define USER_SHOW_FPS (1 << 21)
-/* transopts */
+/* Auto-Keying mode */
+ /* AUTOKEY_ON is a bitflag */
+#define AUTOKEY_ON 1
+ /* AUTOKEY_ON + 2**n... (i.e. AUTOKEY_MODE_NORMAL = AUTOKEY_ON + 2) to preserve setting, even when autokey turned off */
+#define AUTOKEY_MODE_NORMAL 3
+#define AUTOKEY_MODE_EDITKEYS 5
+
+/* Auto-Keying flag */
+#define AUTOKEY_FLAG_INSERTAVAIL (1<<0)
+#define AUTOKEY_FLAG_INSERTNEEDED (1<<1)
+#define AUTOKEY_FLAG_AUTOMATKEY (1<<2)
+/* Auto-Keying macros */
+#define IS_AUTOKEY_ON (U.autokey_mode & AUTOKEY_ON)
+#define IS_AUTOKEY_MODE(mode) (U.autokey_mode == AUTOKEY_MODE_##mode)
+#define IS_AUTOKEY_FLAG(flag) (U.autokey_flag == AUTOKEY_FLAG_##flag)
+
+/* transopts */
#define USER_TR_TOOLTIPS (1 << 0)
#define USER_TR_BUTTONS (1 << 1)
#define USER_TR_MENUS (1 << 2)
@@ -250,7 +294,6 @@ extern UserDef U; /* from usiblender.c !!!! */
#define CONVERT_TO_UTF8 (1 << 7)
/* dupflag */
-
#define USER_DUP_MESH (1 << 0)
#define USER_DUP_CURVE (1 << 1)
#define USER_DUP_SURF (1 << 2)
@@ -264,13 +307,11 @@ extern UserDef U; /* from usiblender.c !!!! */
#define USER_DUP_ACT (1 << 10)
/* gameflags */
-
#define USER_VERTEX_ARRAYS 1
#define USER_DISABLE_SOUND 2
#define USER_DISABLE_MIPMAP 4
/* vrml flag */
-
#define USER_VRML_LAYERS 1
#define USER_VRML_AUTOSCALE 2
#define USER_VRML_TWOSIDED 4
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index ee75d7b8f0f..78605464268 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -200,6 +200,7 @@ typedef struct View3D {
#define V3D_MANIP_LOCAL 1
#define V3D_MANIP_NORMAL 2
#define V3D_MANIP_VIEW 3
+#define V3D_MANIP_CUSTOM 4 /* anything of value 4 or higher is custom */
/* View3d->twflag */
/* USE = user setting, DRAW = based on selection */
diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h
index 769d11ecebe..e7a8d839227 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -103,10 +103,9 @@ typedef struct World {
/* ambient occlusion */
float aodist, aodistfac, aoenergy, aobias;
short aomode, aosamp, aomix, aocolor;
- float ao_adapt_thresh;
- float pad2[3];
- short ao_samp_method;
- short pad1[3];
+ float ao_adapt_thresh, ao_adapt_speed_fac;
+ float ao_approx_error, ao_approx_correction;
+ short ao_samp_method, ao_gather_method, ao_approx_passes, pad1;
float *aosphere, *aotables;
@@ -151,12 +150,17 @@ typedef struct World {
/* aomode (use distances & random sampling modes) */
#define WO_AODIST 1
#define WO_AORNDSMP 2
+#define WO_AOCACHE 4
/* aocolor */
#define WO_AOPLAIN 0
#define WO_AOSKYCOL 1
#define WO_AOSKYTEX 2
+/* ao_gather_method */
+#define WO_AOGATHER_RAYTRACE 0
+#define WO_AOGATHER_APPROX 1
+
/* texco (also in DNA_material_types.h) */
#define TEXCO_ANGMAP 64
#define TEXCO_H_SPHEREMAP 256
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 4d437861751..ecf2a8e73b0 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -127,6 +127,8 @@ char *includefiles[] = {
"DNA_color_types.h",
"DNA_brush_types.h",
"DNA_customdata_types.h",
+ "DNA_particle_types.h",
+ "DNA_cloth_types.h",
// if you add files here, please add them at the end
// of makesdna.c (this file) as well
@@ -714,8 +716,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 +1148,6 @@ 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"
+#include "DNA_cloth_types.h"
/* end of list */
diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/CMP_node.h
index 6e800303887..3e62ea9970f 100644
--- a/source/blender/nodes/CMP_node.h
+++ b/source/blender/nodes/CMP_node.h
@@ -66,6 +66,8 @@ extern bNodeType cmp_node_normalize;
extern bNodeType cmp_node_filter;
extern bNodeType cmp_node_blur;
+extern bNodeType cmp_node_dblur;
+extern bNodeType cmp_node_bilateralblur;
extern bNodeType cmp_node_vecblur;
extern bNodeType cmp_node_dilateerode;
extern bNodeType cmp_node_defocus;
@@ -94,9 +96,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/intern/CMP_nodes/CMP_bilateralblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
new file mode 100644
index 00000000000..b954e876ea1
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
@@ -0,0 +1,272 @@
+/**
+ *
+ *
+ * ***** 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): Vilem Novak
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include "../CMP_util.h"
+
+/* **************** BILATERALBLUR ******************** */
+static bNodeSocketType cmp_node_bilateralblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketType cmp_node_bilateralblur_out[]= {
+ { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+#define INIT_C3\
+ mean0 = 1; mean1[0] = src[0];mean1[1] = src[1];mean1[2] = src[2];mean1[3] = src[3];
+
+/* finds color distances */
+#define COLOR_DISTANCE_C3(c1, c2)\
+ ((c1[0] - c2[0])*(c1[0] - c2[0]) + \
+ (c1[1] - c2[1])*(c1[1] - c2[1]) + \
+ (c1[2] - c2[2])*(c1[2] - c2[2]) + \
+ (c1[3] - c2[3])*(c1[3] - c2[3]))
+
+/* this is the main kernel function for comparing color distances
+ and adding them weighted to the final color */
+#define KERNEL_ELEMENT_C3(k)\
+ temp_color = src + deltas[k];\
+ ref_color = ref + deltas[k];\
+ w = weight_tab[k] + COLOR_DISTANCE_C3(ref, ref_color )*i2sigma_color;\
+ w = 1./(w*w + 1); \
+ mean0 += w;\
+ mean1[0] += temp_color[0]*w; \
+ mean1[1] += temp_color[1]*w; \
+ mean1[2] += temp_color[2]*w; \
+ mean1[3] += temp_color[3]*w;
+
+/* write blurred values to image */
+#define UPDATE_OUTPUT_C3\
+ mean0 = 1./mean0;\
+ dest[x*pix + 0] = mean1[0]*mean0; \
+ dest[x*pix + 1] = mean1[1]*mean0; \
+ dest[x*pix + 2] = mean1[2]*mean0; \
+ dest[x*pix + 3] = mean1[3]*mean0;
+
+/* initializes deltas for fast access to neighbour pixels */
+#define INIT_3X3_DELTAS( deltas, step, nch ) \
+ ((deltas)[0] = (nch), (deltas)[1] = -(step) + (nch), \
+ (deltas)[2] = -(step), (deltas)[3] = -(step) - (nch), \
+ (deltas)[4] = -(nch), (deltas)[5] = (step) - (nch), \
+ (deltas)[6] = (step), (deltas)[7] = (step) + (nch));
+
+
+/* code of this node was heavily inspired by the smooth function of opencv library.
+The main change is an optional image input */
+static void node_composit_exec_bilateralblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ NodeBilateralBlurData *nbbd= node->storage;
+ CompBuf *new, *source, *img= in[0]->data , *refimg= in[1]->data;
+ double mean0, w, i2sigma_color, i2sigma_space;
+ double mean1[4];
+ double weight_tab[8];
+ float *src, *dest, *ref, *temp_color, *ref_color;
+ float sigma_color, sigma_space;
+ int imgx, imgy, x, y, pix, i, step;
+ int deltas[8];
+ short found_determinator= 0;
+
+ if(img == NULL || out[0]->hasoutput == 0)
+ return;
+
+ if(img->type != CB_RGBA) {
+ img= typecheck_compbuf(in[0]->data, CB_RGBA);
+ }
+
+ imgx= img->x;
+ imgy= img->y;
+ pix= img->type;
+ step= pix * imgx;
+
+ if(refimg) {
+ if(refimg->x == imgx && refimg->y == imgy) {
+ if(ELEM3(refimg->type, CB_VAL, CB_VEC2, CB_VEC3)) {
+ refimg= typecheck_compbuf(in[1]->data, CB_RGBA);
+ found_determinator= 1;
+ }
+ }
+ }
+ else {
+ refimg= img;
+ }
+
+ /* allocs */
+ source= dupalloc_compbuf(img);
+ new= alloc_compbuf(imgx, imgy, pix, 1);
+
+ /* accept image offsets from other nodes */
+ new->xof= img->xof;
+ new->yof= img->yof;
+
+ /* bilateral code properties */
+ sigma_color= nbbd->sigma_color;
+ sigma_space= nbbd->sigma_space;
+
+ i2sigma_color= 1. / (sigma_color * sigma_color);
+ i2sigma_space= 1. / (sigma_space * sigma_space);
+
+ INIT_3X3_DELTAS(deltas, step, pix);
+
+ weight_tab[0] = weight_tab[2] = weight_tab[4] = weight_tab[6] = i2sigma_space;
+ weight_tab[1] = weight_tab[3] = weight_tab[5] = weight_tab[7] = i2sigma_space * 2;
+
+ /* iterations */
+ for(i= 0; i < nbbd->iter; i++) {
+ src= source->rect;
+ ref= refimg->rect;
+ dest= new->rect;
+ /*goes through image, there are more loops for 1st/last line and all other lines*/
+ /*kernel element accumulates surrounding colors, which are then written with the update_output function*/
+ for(x= 0; x < imgx; x++, src+= pix, ref+= pix) {
+ INIT_C3;
+
+ KERNEL_ELEMENT_C3(6);
+
+ if(x > 0) {
+ KERNEL_ELEMENT_C3(5);
+ KERNEL_ELEMENT_C3(4);
+ }
+
+ if(x < imgx - 1) {
+ KERNEL_ELEMENT_C3(7);
+ KERNEL_ELEMENT_C3(0);
+ }
+
+ UPDATE_OUTPUT_C3;
+ }
+
+ dest+= step;
+
+ for(y= 1; y < imgy - 1; y++, dest+= step, src+= pix, ref+= pix) {
+ x= 0;
+
+ INIT_C3;
+
+ KERNEL_ELEMENT_C3(0);
+ KERNEL_ELEMENT_C3(1);
+ KERNEL_ELEMENT_C3(2);
+ KERNEL_ELEMENT_C3(6);
+ KERNEL_ELEMENT_C3(7);
+
+ UPDATE_OUTPUT_C3;
+
+ src+= pix;
+ ref+= pix;
+
+ for(x= 1; x < imgx - 1; x++, src+= pix, ref+= pix) {
+ INIT_C3;
+
+ KERNEL_ELEMENT_C3(0);
+ KERNEL_ELEMENT_C3(1);
+ KERNEL_ELEMENT_C3(2);
+ KERNEL_ELEMENT_C3(3);
+ KERNEL_ELEMENT_C3(4);
+ KERNEL_ELEMENT_C3(5);
+ KERNEL_ELEMENT_C3(6);
+ KERNEL_ELEMENT_C3(7);
+
+ UPDATE_OUTPUT_C3;
+ }
+
+ INIT_C3;
+
+ KERNEL_ELEMENT_C3(2);
+ KERNEL_ELEMENT_C3(3);
+ KERNEL_ELEMENT_C3(4);
+ KERNEL_ELEMENT_C3(5);
+ KERNEL_ELEMENT_C3(6);
+
+ UPDATE_OUTPUT_C3;
+ }
+
+ for(x= 0; x < imgx; x++, src+= pix, ref+= pix) {
+ INIT_C3;
+
+ KERNEL_ELEMENT_C3(2);
+
+ if(x > 0) {
+ KERNEL_ELEMENT_C3(3);
+ KERNEL_ELEMENT_C3(4);
+ }
+ if(x < imgx - 1) {
+ KERNEL_ELEMENT_C3(1);
+ KERNEL_ELEMENT_C3(0);
+ }
+
+ UPDATE_OUTPUT_C3;
+ }
+
+ if(node->exec & NODE_BREAK) break;
+
+ SWAP(CompBuf, *source, *new);
+ }
+
+ if(node->exec & NODE_BREAK)
+ free_compbuf(source);
+
+ if(img != in[0]->data)
+ free_compbuf(img);
+
+ if(found_determinator == 1) {
+ if(refimg != in[1]->data)
+ free_compbuf(refimg);
+ }
+
+ out[0]->data= source;
+
+ free_compbuf(new);
+}
+
+static void node_composit_init_bilateralblur(bNode* node)
+{
+ NodeBilateralBlurData *nbbd= MEM_callocN(sizeof(NodeBilateralBlurData), "node bilateral blur data");
+ node->storage= nbbd;
+ nbbd->sigma_color= 0.3;
+ nbbd->sigma_space= 5.0;
+}
+
+bNodeType cmp_node_bilateralblur= {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ CMP_NODE_BILATERALBLUR,
+ /* name */ "Bilateral Blur",
+ /* width+range */ 150, 120, 200,
+ /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ /* input sock */ cmp_node_bilateralblur_in,
+ /* output sock */ cmp_node_bilateralblur_out,
+ /* storage */ "NodeBilateralBlurData",
+ /* execfunc */ node_composit_exec_bilateralblur,
+ /* butfunc */ NULL,
+ /* initfunc */ node_composit_init_bilateralblur,
+ /* freestoragefunc */ node_free_standard_storage,
+ /* copystoragefunc */ node_copy_standard_storage,
+ /* id */ NULL
+
+};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
index 91a04e3128a..3d6b3dd2955 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
@@ -22,15 +22,14 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva,
+ * Juho Vepsäläinen
*
* ***** END GPL LICENSE BLOCK *****
*/
#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,44 +554,59 @@ 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;
+ NodeBlurData *nbd= node->storage;
- if(img==NULL || out[0]->hasoutput==0)
- return;
+ if(img==NULL) return;
- if(img->type==CB_VEC2 || img->type==CB_VEC3) {
- img= typecheck_compbuf(in[0]->data, CB_RGBA);
- }
+ /* store image in size that is needed for absolute/relative conversions on ui level */
+ nbd->image_in_width= img->x;
+ nbd->image_in_height= img->y;
- /* 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;
+ if(out[0]->hasoutput==0) return;
+
+ 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];*/
+ 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 +614,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_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
index d836a829696..6a40018e659 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
@@ -89,8 +89,8 @@ static void do_chroma_key(bNode *node, float *out, float *in)
if(kfg>0.0) { /* found a pixel that is within key color */
newY=in[0]-(1-c->t3)*kfg;
- newCb=in[1]-kfg*cosf(theta);
- newCr=in[2]-kfg*sinf(theta);
+ newCb=in[1]-kfg*cos((double)theta);
+ newCr=in[2]-kfg*sin((double)theta);
alpha=(kfg+c->fsize)*(c->fstrength);
beta=atan2(newCr,newCb);
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_curves.c b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
index 17d9821a5ef..01af0e1db1d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Björn C. Schaefer
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -123,6 +123,8 @@ bNodeType cmp_node_curve_vec= {
static bNodeSocketType cmp_node_curve_rgb_in[]= {
{ SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
{ SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+ { SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+ { SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f},
{ -1, 0, "" }
};
@@ -157,7 +159,7 @@ static void do_curves_fac(bNode *node, float *out, float *in, float *fac)
static void node_composit_exec_curve_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
- /* stack order input: fac, image */
+ /* stack order input: fac, image, black level, white level */
/* stack order output: image */
if(out[0]->hasoutput==0)
@@ -172,6 +174,8 @@ static void node_composit_exec_curve_rgb(void *data, bNode *node, bNodeStack **i
CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
+ curvemapping_set_black_white(node->storage, in[2]->vec, in[3]->vec);
+
if(in[0]->vec[0] == 1.0)
composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_curves, CB_RGBA);
else
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
index ee68b81cde8..a7db8c2d53d 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;
@@ -322,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,
@@ -376,8 +376,10 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
// some sort of visual feedback would be nice, or at least this text in the renderwin header
// but for now just print some info in the console every 8 scanlines.
if (((y & 7)==0) || (y==(img->y-1))) {
- printf("\rdefocus: Processing Line %d of %d ... ", y+1, img->y);
- fflush(stdout);
+ if(G.background==0) {
+ printf("\rdefocus: Processing Line %d of %d ... ", y+1, img->y);
+ fflush(stdout);
+ }
}
// esc set by main calling process
if(node->exec & NODE_BREAK)
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
new file mode 100644
index 00000000000..27f535186db
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
@@ -0,0 +1,143 @@
+/**
+ *
+ * ***** 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_dblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f, 0.f, 1.f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketType cmp_node_dblur_out[]= {
+ { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static CompBuf *dblur(bNode *node, CompBuf *img, int iterations, int wrap,
+ float center_x, float center_y, float dist, float angle, float spin, float zoom)
+{
+ if ((dist != 0.f) || (spin != 0.f) || (zoom != 0.f)) {
+ void (*getpix)(CompBuf*, float, float, float*) = wrap ? qd_getPixelLerpWrap : qd_getPixelLerp;
+ const float a= angle * (float)M_PI / 180.f;
+ const float itsc= 1.f / pow(2.f, (float)iterations);
+ float D;
+ float center_x_pix, center_y_pix;
+ float tx, ty;
+ float sc, rot;
+ CompBuf *tmp;
+ int i, j;
+
+ tmp= dupalloc_compbuf(img);
+
+ D= dist * sqrtf(img->x * img->x + img->y * img->y);
+ center_x_pix= center_x * img->x;
+ center_y_pix= center_y * img->y;
+
+ tx= itsc * D * cos(a);
+ ty= -itsc * D * sin(a);
+ sc= itsc * zoom;
+ rot= itsc * spin * (float)M_PI / 180.f;
+
+ /* blur the image */
+ for(i= 0; i < iterations; ++i) {
+ const float cs= cos(rot), ss= sin(rot);
+ const float isc= 1.f / (1.f + sc);
+ unsigned int x, y;
+ float col[4]= {0,0,0,0};
+
+ for(y= 0; y < img->y; ++y) {
+ const float v= isc * (y - center_y_pix) + ty;
+
+ for(x= 0; x < img->x; ++x) {
+ const float u= isc * (x - center_x_pix) + tx;
+ unsigned int p= (x + y * img->x) * img->type;
+
+ getpix(tmp, cs * u + ss * v + center_x_pix, cs * v - ss * u + center_y_pix, col);
+
+ /* mix img and transformed tmp */
+ for(j= 0; j < 4; ++j)
+ img->rect[p + j]= AVG2(img->rect[p + j], col[j]);
+ }
+ }
+
+ /* copy img to tmp */
+ if(i != (iterations - 1))
+ memcpy(tmp->rect, img->rect, sizeof(float) * img->x * img->y * img->type);
+
+ /* double transformations */
+ tx *= 2.f, ty *= 2.f;
+ sc *= 2.f, rot *= 2.f;
+
+ if(node->exec & NODE_BREAK) break;
+ }
+
+ free_compbuf(tmp);
+ }
+
+ return img;
+}
+
+static void node_composit_exec_dblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ NodeDBlurData *ndbd= node->storage;
+ 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);
+
+ out[0]->data= dblur(node, new, ndbd->iter, ndbd->wrap, ndbd->center_x, ndbd->center_y, ndbd->distance, ndbd->angle, ndbd->spin, ndbd->zoom);
+}
+
+static void node_composit_init_dblur(bNode* node)
+{
+ NodeDBlurData *ndbd= MEM_callocN(sizeof(NodeDBlurData), "node dblur data");
+ node->storage= ndbd;
+ ndbd->center_x= 0.5;
+ ndbd->center_y= 0.5;
+}
+
+bNodeType cmp_node_dblur = {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ CMP_NODE_DBLUR,
+ /* name */ "Directional Blur",
+ /* width+range */ 150, 120, 200,
+ /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ /* input sock */ cmp_node_dblur_in,
+ /* output sock */ cmp_node_dblur_out,
+ /* storage */ "NodeDBlurData",
+ /* execfunc */ node_composit_exec_dblur,
+ /* butfunc */ NULL,
+ /* initfunc */ node_composit_init_dblur,
+ /* freestoragefunc */ node_free_standard_storage,
+ /* copystoragefunc */ node_copy_standard_storage,
+ /* id */ NULL
+};
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..e7b8fd00c93
--- /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 = cos((double)an), vy = sin((double)an);
+ for (n=0; n<ndg->iter; ++n) {
+ const float p4 = pow(4.0, (double)n);
+ const float vxp = vx*p4, vyp = vy*p4;
+ const float wt = pow((double)ndg->fade, (double)p4);
+ const float cmo = 1.f - pow((double)ndg->colmod, (double)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*cos((double)u*M_PI))*(0.5f + 0.5f*cos((double)v*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_idMask.c b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
index abb9fa98d97..a40579ac3b2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
@@ -63,8 +63,25 @@ static void do_idmask(CompBuf *stackbuf, CompBuf *cbuf, float idnr)
MEM_freeN(abuf);
}
+/* full sample version */
+static void do_idmask_fsa(CompBuf *stackbuf, CompBuf *cbuf, float idnr)
+{
+ float *rect, *rs;
+ int x;
+
+ rect= cbuf->rect;
+ rs= stackbuf->rect;
+ for(x= cbuf->x*cbuf->y - 1; x>=0; x--)
+ if(rect[x]==idnr)
+ rs[x]= 1.0f;
+
+}
+
+
static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
+ RenderData *rd= data;
+
if(out[0]->hasoutput==0)
return;
@@ -77,7 +94,10 @@ static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in,
stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */;
- do_idmask(stackbuf, cbuf, (float)node->custom1);
+ if(rd->scemode & R_FULL_SAMPLE)
+ do_idmask_fsa(stackbuf, cbuf, (float)node->custom1);
+ else
+ do_idmask(stackbuf, cbuf, (float)node->custom1);
out[0]->data= stackbuf;
}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
index 20308e968d3..0984aa4bfe1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
@@ -48,6 +48,7 @@ static bNodeSocketType cmp_node_rlayers_out[]= {
{ SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Radio", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -149,6 +150,8 @@ void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, I
out[RRES_OUT_RADIO]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_RADIO);
if(out[RRES_OUT_INDEXOB]->hasoutput)
out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB);
+ if(out[RRES_OUT_MIST]->hasoutput)
+ out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST);
};
@@ -236,7 +239,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in
CompBuf *buf;
int buftype= CB_VEC3;
- if(ELEM(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB))
+ if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST))
buftype= CB_VAL;
else if(passcode==SCE_PASS_VECTOR)
buftype= CB_VEC4;
@@ -282,7 +285,9 @@ void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out
if(out[RRES_OUT_RADIO]->hasoutput)
out[RRES_OUT_RADIO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RADIO);
if(out[RRES_OUT_INDEXOB]->hasoutput)
- out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB);
+ out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB);
+ if(out[RRES_OUT_MIST]->hasoutput)
+ out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST);
};
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_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 4ddab661627..31afe74bd11 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
@@ -89,6 +89,7 @@ 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;
@@ -99,8 +100,8 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
sizex = rr->rectx;
sizey = rr->recty;
} else {
- sizex = G.scene->r.xsch;
- sizey = G.scene->r.ysch;
+ sizex = rd->xsch;
+ sizey = rd->ysch;
}
prevbuf->rect_procedural= texture_procedural;
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..662d8e8dde9
--- /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 += (float)log((double)MAX2(L, 0.0) + 1e-5);
+ maxl = (L > maxl) ? L : maxl;
+ minl = (L < minl) ? L : minl;
+ bc++;
+ }
+ *Lav *= sc;
+ fRGB_mult(Cav, sc);
+ maxl = log((double)maxl + 1e-5); minl = log((double)minl + 1e-5f); avl = lsum*sc;
+ *auto_key = (maxl > minl) ? ((maxl - avl) / (maxl - minl)) : 1.f;
+ return exp((double)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 = exp((double)-ntm->f);
+ const float m = (ntm->m > 0.f) ? ntm->m : (0.3f + 0.7f*pow((double)auto_key, 1.4));
+ 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] + pow((double)f*I_a, (double)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] + pow((double)f*I_a,(double)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] + pow((double)f*I_a, (double)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] = pow((double)MAX2(dp[x][0], 0.), igm);
+ dp[x][1] = pow((double)MAX2(dp[x][1], 0.), igm);
+ dp[x][2] = pow((double)MAX2(dp[x][2], 0.), 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/CMP_zcombine.c b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
index 29cf8f34d54..eb939100644 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
@@ -45,6 +45,16 @@ static bNodeSocketType cmp_node_zcombine_out[]= {
{ -1, 0, "" }
};
+static void do_zcombine(bNode *node, float *out, float *src1, float *z1, float *src2, float *z2)
+{
+ if(*z1 <= *z2) {
+ QUATCOPY(out, src1);
+ }
+ else {
+ QUATCOPY(out, src2);
+ }
+}
+
static void do_zcombine_mask(bNode *node, float *out, float *z1, float *z2)
{
if(*z1 > *z2) {
@@ -67,6 +77,8 @@ static void do_zcombine_add(bNode *node, float *out, float *col1, float *col2, f
static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
+ RenderData *rd= data;
+
/* stack order in: col z col z */
/* stack order out: col z */
if(out[0]->hasoutput==0)
@@ -76,6 +88,16 @@ static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in
if(in[0]->data==NULL) {
return;
}
+ else if(rd->scemode & R_FULL_SAMPLE) {
+ /* make output size of first input image */
+ CompBuf *cbuf= in[0]->data;
+ CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs
+
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec,
+ in[3]->data, in[3]->vec, do_zcombine, CB_RGBA, CB_VAL, CB_RGBA, CB_VAL);
+
+ out[0]->data= stackbuf;
+ }
else {
/* make output size of first input image */
CompBuf *cbuf= in[0]->data;
diff --git a/source/blender/nodes/intern/CMP_nodes/Makefile b/source/blender/nodes/intern/CMP_nodes/Makefile
index 036812548b4..3564bf9034b 100644
--- a/source/blender/nodes/intern/CMP_nodes/Makefile
+++ b/source/blender/nodes/intern/CMP_nodes/Makefile
@@ -45,3 +45,4 @@ CPPFLAGS += -I../../../blenlib
CPPFLAGS += -I../../../include
CPPFLAGS += -I../../../imbuf
CPPFLAGS += -I../../../render/extern/include
+CPPFLAGS += -I$(OPENGL_HEADERS)
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 83f85160625..7cb10b75f3a 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/intern/CMP_util.h
@@ -176,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 bae9a8dcf1d..3b7783c5d1e 100644
--- a/source/blender/nodes/intern/Makefile
+++ b/source/blender/nodes/intern/Makefile
@@ -45,3 +45,4 @@ CPPFLAGS += -I../../blenlib
CPPFLAGS += -I../../include
CPPFLAGS += -I../../imbuf
CPPFLAGS += -I../../render/extern/include
+CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/SHD_nodes/Makefile b/source/blender/nodes/intern/SHD_nodes/Makefile
index 6344af4a5cb..0ab6134ac93 100644
--- a/source/blender/nodes/intern/SHD_nodes/Makefile
+++ b/source/blender/nodes/intern/SHD_nodes/Makefile
@@ -45,3 +45,4 @@ CPPFLAGS += -I../../../blenlib
CPPFLAGS += -I../../../include
CPPFLAGS += -I../../../imbuf
CPPFLAGS += -I../../../render/extern/include
+CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
index b15aa6802f3..24395059c60 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
@@ -51,7 +51,7 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **in, bNod
if(data) {
ShadeInput *shi= ((ShaderCallData *)data)->shi;
NodeGeometry *ngeo= (NodeGeometry*)node->storage;
- ShadeInputUV *suv= &shi->uv[0];
+ ShadeInputUV *suv= &shi->uv[shi->actuv];
static float defaultvcol[4] = {1.0f, 1.0f, 1.0f, 1.0f};
static float front= 0.0;
int i;
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 0e662c38d31..e4986727ab1 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -46,8 +46,10 @@ 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; /* BKE_constraint.h */
+struct bConstraintOb; /* DNA_constraint_types.h */
+struct bConstraintTarget; /* DNA_constraint_types.h*/
#ifdef __cplusplus
extern "C" {
#endif
@@ -71,10 +73,10 @@ extern "C" {
void BPy_Set_DrawButtonsList(void *list);
void BPy_Free_DrawButtonsList(void);
- void BPY_pyconstraint_eval(struct bPythonConstraint *con, float ownermat[][4], float targetmat[][4]);
- void BPY_pyconstraint_driver(struct bPythonConstraint *con, struct bConstraintOb *cob, struct Object *target, char subtarget[]);
+ void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
void BPY_pyconstraint_settings(void *arg1, void *arg2);
- int BPY_pyconstraint_targets(struct bPythonConstraint *con, float targetmat[][4]);
+ 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 );
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c
index 9fbd1d9a204..acede12244f 100644
--- a/source/blender/python/BPY_interface.c
+++ b/source/blender/python/BPY_interface.c
@@ -45,6 +45,7 @@
#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 */
@@ -59,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"
@@ -1069,10 +1071,13 @@ static int bpy_pydriver_create_dict(void)
mod = PyImport_ImportModule("math");
if (mod) {
+ PyDict_Merge(d, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */
+
+ /* Only keep for backwards compat! - just import all math into root, they are standard */
PyDict_SetItemString(d, "math", mod);
PyDict_SetItemString(d, "m", mod);
Py_DECREF(mod);
- }
+ }
mod = PyImport_ImportModule("Blender.Noise");
if (mod) {
@@ -1104,7 +1109,8 @@ static int bpy_pydriver_create_dict(void)
Py_DECREF(fcn);
}
}
-
+
+ /* TODO - change these */
/* me(meshname) == Blender.Mesh.Get(meshname) */
mod = PyImport_ImportModule("Blender.Mesh");
if (mod) {
@@ -1157,13 +1163,16 @@ static float pydriver_error(IpoDriver *driver) {
/********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;
@@ -1171,45 +1180,162 @@ int BPY_is_pyconstraint(Text *text)
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, float ownermat[][4], float targetmat[][4])
+void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase *targets)
{
- PyObject *srcmat, *tarmat, *idprop;
+ PyObject *srcmat, *tarmat, *tarmats, *idprop;
PyObject *globals;
PyObject *gval;
PyObject *pyargs, *retval;
+ bConstraintTarget *ct;
MatrixObject *retmat;
- int row, col;
+ int row, col, index;
- if ( !con->text ) return;
- if ( con->flag & PYCON_SCRIPTERROR) return;
+ if (!con->text) return;
+ if (con->flag & PYCON_SCRIPTERROR) return;
globals = CreateGlobalDictionary();
- srcmat = newMatrixObject( (float*)ownermat, 4, 4, Py_NEW );
- tarmat = newMatrixObject( (float*)targetmat, 4, 4, Py_NEW );
- idprop = BPy_Wrap_IDProperty( NULL, con->prop, NULL);
+ /* 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);
-/* 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;
+ 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_SET_ITEM(tarmats, index, tarmat);
}
-*/
- retval = RunPython( con->text, globals );
-
- if ( retval == NULL ) {
+
+ if (!setup_armature_weakrefs()) {
+ fprintf(stderr, "Oops - weakref dict setup\n");
+ return;
+ }
+
+ 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 );
- Py_XDECREF( srcmat );
- Py_XDECREF( tarmat );
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+
+ ReleaseGlobalDictionary(globals);
+
return;
}
@@ -1218,29 +1344,34 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, float ownermat[][4], float ta
gval = PyDict_GetItemString(globals, "doConstraint");
if (!gval) {
- ReleaseGlobalDictionary( globals );
-
- /* free temp objects */
- Py_XDECREF( idprop );
- Py_XDECREF( srcmat );
- Py_XDECREF( tarmat );
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, tarmat, idprop);
+ if (PyFunction_Check(gval)) {
+ pyargs = Py_BuildValue("OOO", srcmat, tarmats, idprop);
retval = PyObject_CallObject(gval, pyargs);
- Py_XDECREF( pyargs );
- } else {
+ Py_XDECREF(pyargs);
+ }
+ else {
printf("ERROR: doConstraint is supposed to be a function!\n");
con->flag |= PYCON_SCRIPTERROR;
- ReleaseGlobalDictionary( globals );
- Py_XDECREF( idprop );
- Py_XDECREF( srcmat );
- Py_XDECREF( tarmat );
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+
+ ReleaseGlobalDictionary(globals);
+
return;
}
@@ -1249,11 +1380,12 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, float ownermat[][4], float ta
con->flag |= PYCON_SCRIPTERROR;
/* free temp objects */
- ReleaseGlobalDictionary( globals );
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+
+ ReleaseGlobalDictionary(globals);
- Py_XDECREF( idprop );
- Py_XDECREF( srcmat );
- Py_XDECREF( tarmat );
return;
}
@@ -1261,303 +1393,197 @@ void BPY_pyconstraint_eval(bPythonConstraint *con, float ownermat[][4], float ta
if (!PyObject_TypeCheck(retval, &matrix_Type)) {
printf("Error in PyConstraint - doConstraint: Function not returning a matrix!\n");
con->flag |= PYCON_SCRIPTERROR;
- ReleaseGlobalDictionary( globals );
- Py_XDECREF( idprop );
- Py_XDECREF( srcmat );
- Py_XDECREF( tarmat );
- Py_XDECREF( retval );
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+ Py_XDECREF(retval);
+
+ ReleaseGlobalDictionary(globals);
+
return;
}
- retmat = (MatrixObject*) retval;
+ 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;
- ReleaseGlobalDictionary( globals );
- Py_XDECREF( idprop );
- Py_XDECREF( srcmat );
- Py_XDECREF( tarmat );
- Py_XDECREF( retval );
+ 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++) {
- ownermat[row][col] = retmat->contigPtr[row*4+col];
+ cob->matrix[row][col] = retmat->contigPtr[row*4+col];
}
}
- /* clear globals */
- ReleaseGlobalDictionary( globals );
-
/* free temp objects */
- Py_XDECREF( idprop );
- Py_XDECREF( srcmat );
- Py_XDECREF( tarmat );
- Py_XDECREF( retval );
-}
-
-/* PyConstraints 'Driver' Function
- * This function is responsible for running any code that requires full access to the owner and the target
- * It should be used sparringly, and only for doing 'hacks' which are not possible any other way.
- */
-void BPY_pyconstraint_driver(bPythonConstraint *con, bConstraintOb *cob, Object *target, char subtarget[])
-{
- PyObject *owner, *subowner, *tar, *subtar;
- PyObject *idprop;
- PyObject *globals, *gval;
- PyObject *pyargs, *retval;
-
- if ( !con->text ) return;
- if ( con->flag & PYCON_SCRIPTERROR) return;
-
- globals = CreateGlobalDictionary();
-
- owner = Object_CreatePyObject( cob->ob );
- subowner = PyPoseBone_FromPosechannel( cob->pchan );
-
- tar = Object_CreatePyObject( target );
- if ( (target) && (target->type==OB_ARMATURE) ) {
- bPoseChannel *pchan;
- pchan = get_pose_channel( target->pose, subtarget );
- subtar = PyPoseBone_FromPosechannel( pchan );
- }
- else
- subtar = PyString_FromString(subtarget);
-
- 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);
- ReleaseGlobalDictionary( globals );
- con->flag |= PYCON_SCRIPTERROR;
-
- /* free temp objects */
- Py_XDECREF( idprop );
- Py_XDECREF( owner );
- Py_XDECREF( subowner );
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- return;
- }
-
- if (retval) {Py_XDECREF( retval );}
- retval = NULL;
-
- gval = PyDict_GetItemString(globals, "doDriver");
- if (!gval) {
- ReleaseGlobalDictionary( globals );
-
- /* free temp objects */
- Py_XDECREF( idprop );
- Py_XDECREF( owner );
- Py_XDECREF( subowner );
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- return;
- }
-
- /* Now for the fun part! Try and find the functions we need. */
- if (PyFunction_Check(gval) ) {
- pyargs = Py_BuildValue("OOOOO", owner, subowner, tar, subtar, idprop);
- retval = PyObject_CallObject(gval, pyargs);
- Py_XDECREF( pyargs );
- } else {
- printf("ERROR: doDriver is supposed to be a function!\n");
- con->flag |= PYCON_SCRIPTERROR;
- ReleaseGlobalDictionary( globals );
-
- Py_XDECREF( idprop );
- Py_XDECREF( owner );
- Py_XDECREF( subowner );
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- return;
- }
-
- /* an error occurred while running the function? */
- if (!retval) {
- BPY_Err_Handle(con->text->id.name);
- con->flag |= PYCON_SCRIPTERROR;
- }
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+ Py_XDECREF(retval);
/* clear globals */
- ReleaseGlobalDictionary( globals );
-
- /* free temp objects */
- Py_XDECREF( idprop );
- Py_XDECREF( owner );
- Py_XDECREF( subowner );
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
+ ReleaseGlobalDictionary(globals);
}
-/* This evaluates whether constraint uses targets, and also the target matrix
- * Return code of 0 = doesn't use targets, 1 = uses targets + matrix set, -1 = uses targets + matrix not set
+/* This evaluates the target matrix for each target the PyConstraint uses.
+ * NOTE: it only does one target at a time!
*/
-int BPY_pyconstraint_targets(bPythonConstraint *con, float targetmat[][4])
+void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct)
{
PyObject *tar, *subtar;
PyObject *tarmat, *idprop;
PyObject *globals;
- PyObject *gval, *gval2;
+ PyObject *gval;
PyObject *pyargs, *retval;
MatrixObject *retmat;
int row, col;
- if ( !con->text ) return 0;
- if ( con->flag & PYCON_SCRIPTERROR) return 0;
+ if (!con->text) return;
+ if (con->flag & PYCON_SCRIPTERROR) return;
+ if (!ct) return;
globals = CreateGlobalDictionary();
- tar = Object_CreatePyObject( con->tar );
- if ( (con->tar) && (con->tar->type==OB_ARMATURE) ) {
+ tar = Object_CreatePyObject(ct->tar);
+ if ((ct->tar) && (ct->tar->type==OB_ARMATURE)) {
bPoseChannel *pchan;
- pchan = get_pose_channel( con->tar->pose, con->subtarget );
- subtar = PyPoseBone_FromPosechannel( pchan );
+ pchan = get_pose_channel(ct->tar->pose, ct->subtarget);
+ subtar = PyPoseBone_FromPosechannel(pchan);
}
else
- subtar = PyString_FromString(con->subtarget);
+ subtar = PyString_FromString(ct->subtarget);
- tarmat = newMatrixObject( (float*)targetmat, 4, 4, Py_NEW );
+ 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;
+ if (!setup_armature_weakrefs()) {
+ fprintf(stderr, "Oops - weakref dict setup\n");
+ return;
}
-*/
- retval = RunPython( con->text, globals );
+
+ retval = RunPython(con->text, globals);
- if ( retval == NULL ) {
+ if (retval == NULL) {
BPY_Err_Handle(con->text->id.name);
- ReleaseGlobalDictionary( globals );
con->flag |= PYCON_SCRIPTERROR;
-
+
/* free temp objects */
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- return 0;
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
}
- Py_XDECREF( retval );
+ Py_XDECREF(retval);
retval = NULL;
- /* try to find USE_TARGET global constant */
- gval = PyDict_GetItemString(globals, "USE_TARGET");
- if (!gval || PyObject_IsTrue(gval) != 1) {
- ReleaseGlobalDictionary( globals );
-
- /* free temp objects */
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- return 0;
- }
-
/* try to find doTarget function to set the target matrix */
- gval2 = PyDict_GetItemString(globals, "doTarget");
- if (!gval2) {
- ReleaseGlobalDictionary( globals );
-
+ gval = PyDict_GetItemString(globals, "doTarget");
+ if (!gval) {
/* free temp objects */
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- return -1;
+ 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(gval2) ) {
+ if (PyFunction_Check(gval)) {
pyargs = Py_BuildValue("OOOO", tar, subtar, tarmat, idprop);
- retval = PyObject_CallObject(gval2, pyargs);
- Py_XDECREF( pyargs );
- } else {
+ retval = PyObject_CallObject(gval, pyargs);
+ Py_XDECREF(pyargs);
+ }
+ else {
printf("ERROR: doTarget is supposed to be a function!\n");
con->flag |= PYCON_SCRIPTERROR;
- ReleaseGlobalDictionary( globals );
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- return -1;
+ 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 */
- ReleaseGlobalDictionary( globals );
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- return -1;
+ ReleaseGlobalDictionary(globals);
+ return;
}
if (!PyObject_TypeCheck(retval, &matrix_Type)) {
- ReleaseGlobalDictionary( globals );
+ con->flag |= PYCON_SCRIPTERROR;
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- Py_XDECREF( retval );
- return -1;
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+ Py_XDECREF(retval);
+
+ ReleaseGlobalDictionary(globals);
+ return;
}
- retmat = (MatrixObject*) retval;
+ 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;
- ReleaseGlobalDictionary( globals );
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- Py_XDECREF( retval );
- return -1;
+ 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++) {
- targetmat[row][col] = retmat->contigPtr[row*4+col];
+ ct->matrix[row][col] = retmat->contigPtr[row*4+col];
}
}
- /* clear globals */
- ReleaseGlobalDictionary( globals );
-
/* free temp objects */
- Py_XDECREF( tar );
- Py_XDECREF( subtar );
- Py_XDECREF( idprop );
- Py_XDECREF( tarmat );
- Py_XDECREF( retval );
- return 1;
+ 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 */
@@ -1569,22 +1595,22 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2)
PyObject *gval;
PyObject *retval;
- if ( !con->text ) return;
- if ( con->flag & PYCON_SCRIPTERROR) return;
+ 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 );
+ retval = RunPython(con->text, globals);
- if ( retval == NULL ) {
+ if (retval == NULL) {
BPY_Err_Handle(con->text->id.name);
- ReleaseGlobalDictionary( globals );
+ ReleaseGlobalDictionary(globals);
con->flag |= PYCON_SCRIPTERROR;
/* free temp objects */
- Py_XDECREF( idprop );
+ Py_XDECREF(idprop);
return;
}
@@ -1597,18 +1623,19 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2)
/* free temp objects */
ReleaseGlobalDictionary( globals );
- Py_XDECREF( idprop );
+ Py_XDECREF(idprop);
return;
}
/* Now for the fun part! Try and find the functions we need. */
- if (PyFunction_Check(gval) ) {
+ if (PyFunction_Check(gval)) {
retval = PyObject_CallFunction(gval, "O", idprop);
- } else {
+ }
+ else {
printf("ERROR: getSettings is supposed to be a function!\n");
ReleaseGlobalDictionary( globals );
- Py_XDECREF( idprop );
+ Py_XDECREF(idprop);
return;
}
@@ -1617,17 +1644,17 @@ void BPY_pyconstraint_settings(void *arg1, void *arg2)
con->flag |= PYCON_SCRIPTERROR;
/* free temp objects */
- ReleaseGlobalDictionary( globals );
- Py_XDECREF( idprop );
+ ReleaseGlobalDictionary(globals);
+ Py_XDECREF(idprop);
return;
}
else {
/* clear globals */
- ReleaseGlobalDictionary( globals );
+ ReleaseGlobalDictionary(globals);
/* free temp objects */
- Py_XDECREF( idprop );
- Py_DECREF( retval );
+ Py_XDECREF(idprop);
+ Py_DECREF(retval);
return;
}
}
@@ -1683,7 +1710,7 @@ struct Object **BPY_pydriver_get_objects(IpoDriver *driver)
float BPY_pydriver_eval(IpoDriver *driver)
{
char *expr = NULL;
- PyObject *retval, *floatval, *bpy_ob = NULL;
+ PyObject *retval, *bpy_ob = NULL;
float result = 0.0f; /* default return */
int setitem_retval;
@@ -1721,15 +1748,11 @@ float BPY_pydriver_eval(IpoDriver *driver)
return pydriver_error(driver);
}
- floatval = PyNumber_Float(retval);
- Py_DECREF(retval);
-
- if (floatval == NULL)
+ result = ( float )PyFloat_AsDouble( retval );
+
+ if (result == -1 && PyErr_Occurred())
return pydriver_error(driver);
- result = (float)PyFloat_AsDouble(floatval);
- Py_DECREF(floatval);
-
/* remove 'self', since this dict is also used by py buttons */
if (setitem_retval == 0) PyDict_DelItemString(bpy_pydriver_Dict, "self");
@@ -1909,6 +1932,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( );
@@ -1918,7 +1942,13 @@ void BPY_do_pyscript( ID * id, short event )
return;
if( !setup_armature_weakrefs()){
- printf("Oops - weakref dict\n");
+ 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;
}
@@ -1929,13 +1959,11 @@ void BPY_do_pyscript( ID * id, short event )
disable_where_scriptlink( (short)during_slink );
/* 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 ) );
+ PyDict_SetItemString( g_blenderdict, "bylink", Py_True);
+ EXPP_dict_set_item_str( g_blenderdict, "link", value );
EXPP_dict_set_item_str( g_blenderdict, "event",
PyString_FromString( event_to_name
( event ) ) );
-
if (event == SCRIPT_POSTRENDER) event = SCRIPT_RENDER;
for( index = 0; index < scriptlink->totscript; index++ ) {
@@ -1971,10 +1999,9 @@ void BPY_do_pyscript( ID * id, short event )
/* cleanup bylink flag and clear link so PyObject
* can be released
*/
- EXPP_dict_set_item_str( g_blenderdict, "bylink", EXPP_incr_ret_False() );
+ PyDict_SetItemString(g_blenderdict, "bylink", Py_False);
PyDict_SetItemString( g_blenderdict, "link", Py_None );
- EXPP_dict_set_item_str( g_blenderdict, "event",
- PyString_FromString( "" ) );
+ EXPP_dict_set_item_str( g_blenderdict, "event", PyString_FromString( "" ) );
}
}
@@ -2149,13 +2176,17 @@ 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());
+ PyDict_SetItemString(g_blenderdict, "bylink", Py_True);
/* unlike normal scriptlinks, here Blender.link is int (space event type) */
EXPP_dict_set_item_str(g_blenderdict, "link", PyInt_FromLong(space_event));
/* note: DRAW space_events set event to 0 */
EXPP_dict_set_item_str(g_blenderdict, "event", PyInt_FromLong(event));
-
/* now run all assigned space handlers for this space and space_event */
for( index = 0; index < scriptlink->totscript; index++ ) {
@@ -2210,7 +2241,7 @@ int BPY_do_spacehandlers( ScrArea *sa, unsigned short event,
}
- EXPP_dict_set_item_str(g_blenderdict, "bylink", EXPP_incr_ret_False());
+ PyDict_SetItemString(g_blenderdict, "bylink", Py_False);
PyDict_SetItemString(g_blenderdict, "link", Py_None );
EXPP_dict_set_item_str(g_blenderdict, "event", PyString_FromString(""));
}
diff --git a/source/blender/python/api2_2x/Armature.c b/source/blender/python/api2_2x/Armature.c
index 1ad5938c17e..f1fb3812625 100644
--- a/source/blender/python/api2_2x/Armature.c
+++ b/source/blender/python/api2_2x/Armature.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Armature.c 12813 2007-12-07 09:51:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -297,9 +297,7 @@ static int BonesDict_SetItem(BPy_BonesDict *self, PyObject *key, PyObject *value
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;
+ editbone->layer= ((BPy_EditBone*)value)->layer;
//set object pointer
((BPy_EditBone*)value)->editbone = editbone;
@@ -884,9 +882,9 @@ AttributeError:
static PyObject *Armature_getVertexGroups(BPy_Armature *self, void *closure)
{
if (self->armature->deformflag & ARM_DEF_VGROUP)
- return EXPP_incr_ret(Py_True);
+ Py_RETURN_TRUE;
else
- return EXPP_incr_ret(Py_False);
+ Py_RETURN_FALSE;
}
//------------------------Armature.vertexGroups (setter)
static int Armature_setVertexGroups(BPy_Armature *self, PyObject *value, void *closure)
@@ -927,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
@@ -974,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
@@ -1172,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);
@@ -1189,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;
diff --git a/source/blender/python/api2_2x/Armature.h b/source/blender/python/api2_2x/Armature.h
index 7f543e375a1..bafd49772b0 100644
--- a/source/blender/python/api2_2x/Armature.h
+++ b/source/blender/python/api2_2x/Armature.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Armature.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/BGL.c b/source/blender/python/api2_2x/BGL.c
index 56cc8c63b5f..5d78fd09e2d 100644
--- a/source/blender/python/api2_2x/BGL.c
+++ b/source/blender/python/api2_2x/BGL.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: BGL.c 12267 2007-10-17 09:51:13Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/BGL.h b/source/blender/python/api2_2x/BGL.h
index c7fbf079010..f8dea726d73 100644
--- a/source/blender/python/api2_2x/BGL.h
+++ b/source/blender/python/api2_2x/BGL.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: BGL.h 5407 2005-10-02 17:09:11Z zuster $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/BezTriple.c b/source/blender/python/api2_2x/BezTriple.c
index 2aa908ff2b0..e4a872c52c0 100644
--- a/source/blender/python/api2_2x/BezTriple.c
+++ b/source/blender/python/api2_2x/BezTriple.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: BezTriple.c 11241 2007-07-12 11:51:21Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/BezTriple.h b/source/blender/python/api2_2x/BezTriple.h
index e2e015b502d..38c9b88e185 100644
--- a/source/blender/python/api2_2x/BezTriple.h
+++ b/source/blender/python/api2_2x/BezTriple.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: BezTriple.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c
index 07384391d27..db47d6550c2 100644
--- a/source/blender/python/api2_2x/Blender.c
+++ b/source/blender/python/api2_2x/Blender.c
@@ -1,5 +1,6 @@
/*
* $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -36,8 +37,10 @@ struct ID; /*keep me up here */
/* for open, close in Blender_Load */
#include <fcntl.h>
#include "BDR_editobject.h" /* exit_editmode() */
+#include "BDR_drawmesh.h" /* set_mipmap() */
#include "BIF_usiblender.h"
#include "BLI_blenlib.h"
+#include "BLI_bpath.h"
#include "BLO_writefile.h"
#include "BKE_blender.h"
#include "BKE_exotic.h"
@@ -110,7 +113,7 @@ static PyObject *Blender_UpdateMenus( PyObject * self);
static PyObject *Blender_PackAll( PyObject * self);
static PyObject *Blender_UnpackAll( PyObject * self, PyObject * value);
static PyObject *Blender_CountPackedFiles( PyObject * self );
-
+static PyObject *Blender_GetPaths( PyObject * self, PyObject *args, PyObject *keywds );
extern PyObject *Text3d_Init( void ); /* missing in some include */
/*****************************************************************************/
@@ -194,6 +197,9 @@ All files will be unpacked using specified mode.\n\n\
static char Blender_CountPackedFiles_doc[] =
"() - Returns the number of packed files.";
+static char Blender_GetPaths_doc[] =
+"() - Returns a list of paths used in this blend file.";
+
/*****************************************************************************/
/* Python method structure definition. */
/*****************************************************************************/
@@ -207,6 +213,7 @@ static struct PyMethodDef Blender_methods[] = {
{"Run", Blender_Run, METH_O, Blender_Run_doc},
{"ShowHelp", Blender_ShowHelp, METH_O, Blender_ShowHelp_doc},
{"CountPackedFiles", ( PyCFunction ) Blender_CountPackedFiles, METH_NOARGS, Blender_CountPackedFiles_doc},
+ {"GetPaths", ( PyCFunction ) Blender_GetPaths, METH_VARARGS|METH_KEYWORDS, Blender_GetPaths_doc},
{"PackAll", ( PyCFunction ) Blender_PackAll, METH_NOARGS, Blender_PackAll_doc},
{"UnpackAll", Blender_UnpackAll, METH_O, Blender_UnpackAll_doc},
{"UpdateMenus", ( PyCFunction ) Blender_UpdateMenus, METH_NOARGS,
@@ -278,7 +285,31 @@ static PyObject *Blender_Set( PyObject * self, PyObject * args )
if ( !PyArg_Parse( arg , "s" , &dir ))
return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" );
BLI_strncpy(U.tempdir, dir, FILE_MAXDIR);
- } else
+ } else if (StringEqual( name , "compressfile" ) ) {
+ int value = PyObject_IsTrue( arg );
+
+ if (value==-1)
+ return EXPP_ReturnPyObjError( PyExc_ValueError,
+ "expected an integer" );
+
+ if (value)
+ U.flag |= USER_FILECOMPRESS;
+ else
+ U.flag &= ~USER_FILECOMPRESS;
+ } else if (StringEqual( name , "mipmap" ) ) {
+ int value = PyObject_IsTrue( arg );
+
+ if (value==-1)
+ return EXPP_ReturnPyObjError( PyExc_ValueError,
+ "expected an integer" );
+
+ if (value)
+ U.gameflags &= ~USER_DISABLE_MIPMAP;
+ else
+ U.gameflags |= USER_DISABLE_MIPMAP;
+
+ set_mipmap(!(U.gameflags & USER_DISABLE_MIPMAP));
+ }else
return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
"value given is not a blender setting" ) );
Py_RETURN_NONE;
@@ -506,13 +537,18 @@ static PyObject *Blender_Get( PyObject * self, PyObject * value )
} /* End 'quick hack' part. */
else if(StringEqual( str, "version" ))
ret = PyInt_FromLong( G.version );
+
+ else if(StringEqual( str, "compressfile" ))
+ ret = PyInt_FromLong( (U.flag & USER_FILECOMPRESS) >> 15 );
+ else if(StringEqual( str, "mipmap" ))
+ ret = PyInt_FromLong( (U.gameflags & USER_DISABLE_MIPMAP) == 0 );
else
return EXPP_ReturnPyObjError( PyExc_AttributeError, "unknown attribute" );
if (ret) return ret;
else
return EXPP_ReturnPyObjError (PyExc_MemoryError,
- "could not create pystring!");
+ "could not create the PyObject!");
}
/*****************************************************************************/
@@ -685,10 +721,16 @@ static PyObject *Blender_Save( PyObject * self, PyObject * args )
disable_where_script( 1 ); /* to avoid error popups in the write_* functions */
- if( BLI_testextensie( fname, ".blend" ) ) {
+ if( BLI_testextensie( fname, ".blend" ) ) {
+ int writeflags;
if( G.fileflags & G_AUTOPACK )
packAll( );
- if( !BLO_write_file( fname, G.fileflags, &error ) ) {
+
+ writeflags= G.fileflags & ~G_FILE_COMPRESS;
+ if(U.flag & USER_FILECOMPRESS)
+ writeflags |= G_FILE_COMPRESS;
+
+ if( !BLO_write_file( fname, writeflags, &error ) ) {
disable_where_script( 0 );
return EXPP_ReturnPyObjError( PyExc_SystemError,
error );
@@ -866,6 +908,47 @@ static PyObject *Blender_CountPackedFiles( PyObject * self )
int nfiles = countPackedFiles();
return PyInt_FromLong( nfiles );
}
+
+/*****************************************************************************/
+/* Function: Blender_GetPaths */
+/* Python equivalent: Blender.GetPaths */
+/*****************************************************************************/
+static PyObject *Blender_GetPaths( PyObject * self, PyObject *args, PyObject *keywds )
+{
+ struct BPathIterator bpi;
+ PyObject *list = PyList_New(0), *st;
+ /* be sure there is low chance of the path being too short */
+ char filepath_expanded[FILE_MAXDIR*2];
+
+ int absolute = 0;
+ static char *kwlist[] = {"absolute", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywds, "|i", kwlist, &absolute ) )
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "expected nothing or one bool (0 or 1) as argument" );
+
+ BLI_bpathIterator_init(&bpi);
+
+ while (!BLI_bpathIterator_isDone(&bpi)) {
+
+ /* build the list */
+ if (absolute) {
+ BLI_bpathIterator_copyPathExpanded( &bpi, filepath_expanded );
+ st = PyString_FromString(filepath_expanded);
+ } else {
+ st = PyString_FromString(BLI_bpathIterator_getPath(&bpi));
+ }
+
+ PyList_Append(list, st);
+ Py_DECREF(st);
+
+ BLI_bpathIterator_step(&bpi);
+ }
+
+ return list;
+}
+
+
static PyObject *Blender_UnpackModesDict( void )
{
PyObject *UnpackModes = PyConstant_New( );
diff --git a/source/blender/python/api2_2x/Blender.h b/source/blender/python/api2_2x/Blender.h
index df80daf3cea..77f21ed333c 100644
--- a/source/blender/python/api2_2x/Blender.h
+++ b/source/blender/python/api2_2x/Blender.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Blender.h 4803 2005-07-18 03:50:37Z ascotan $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Bone.c b/source/blender/python/api2_2x/Bone.c
index 733b8251215..704fe20d6db 100644
--- a/source/blender/python/api2_2x/Bone.c
+++ b/source/blender/python/api2_2x/Bone.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Bone.c 12399 2007-10-26 08:19:40Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -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}
};
@@ -803,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;
@@ -1203,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
@@ -1246,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
diff --git a/source/blender/python/api2_2x/Bone.h b/source/blender/python/api2_2x/Bone.h
index c3f5de81714..da7efe27931 100644
--- a/source/blender/python/api2_2x/Bone.h
+++ b/source/blender/python/api2_2x/Bone.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Bone.h 12399 2007-10-26 08:19:40Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -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 f6b443e5d06..bd1e7932f5c 100644
--- a/source/blender/python/api2_2x/Camera.c
+++ b/source/blender/python/api2_2x/Camera.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Camera.c 12078 2007-09-18 06:41:29Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Camera.h b/source/blender/python/api2_2x/Camera.h
index c92e51c1468..bb751a8849a 100644
--- a/source/blender/python/api2_2x/Camera.h
+++ b/source/blender/python/api2_2x/Camera.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Camera.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Constraint.c b/source/blender/python/api2_2x/Constraint.c
index 4dddd274a0e..51dbe6a85f9 100644
--- a/source/blender/python/api2_2x/Constraint.c
+++ b/source/blender/python/api2_2x/Constraint.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Constraint.c 12705 2007-11-28 12:42:36Z ton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -409,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!" );
@@ -423,10 +424,23 @@ 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 );
- icu= verify_ipocurve((ID *)ob, ID_CO, actname, con->name, CO_ENFORCE);
+
+ /* 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, NULL, CO_ENFORCE);
if (!icu)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
@@ -534,7 +548,10 @@ static int constspace_setter( BPy_Constraint *self, int type, PyObject *value )
Object *tar;
char *subtarget;
- tar= get_constraint_target(con, &subtarget);
+ // FIXME!!!
+ //tar= get_constraint_target(con, &subtarget);
+ tar = NULL;
+ subtarget = NULL;
/* only copy depending on target-type */
if (tar && subtarget[0]) {
@@ -1318,10 +1335,11 @@ static PyObject *script_getter( BPy_Constraint * self, int type )
bPythonConstraint *con = (bPythonConstraint *)(self->con->data);
switch( type ) {
- case EXPP_CONSTR_TARGET:
- return Object_CreatePyObject( con->tar );
- case EXPP_CONSTR_BONE:
- return PyString_FromString( con->subtarget );
+ // 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:
@@ -1336,24 +1354,25 @@ static int script_setter( BPy_Constraint *self, int type, PyObject *value )
bPythonConstraint *con = (bPythonConstraint *)(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;
- }
+ // 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 ) )
@@ -1852,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: */
diff --git a/source/blender/python/api2_2x/Constraint.h b/source/blender/python/api2_2x/Constraint.h
index 116eabbf380..a9b983fadb4 100644
--- a/source/blender/python/api2_2x/Constraint.h
+++ b/source/blender/python/api2_2x/Constraint.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Constraint.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/CurNurb.c b/source/blender/python/api2_2x/CurNurb.c
index 642e7b7b5e6..fc79296e952 100644
--- a/source/blender/python/api2_2x/CurNurb.c
+++ b/source/blender/python/api2_2x/CurNurb.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: CurNurb.c 12813 2007-12-07 09:51:02Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -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 */
};
@@ -423,6 +430,19 @@ static PyObject *CurNurb_getPoints( BPy_CurNurb * self )
return PyInt_FromLong( ( long ) self->nurb->pntsu );
}
+static PyObject *CurNurb_getFlagBits( BPy_CurNurb * self, void *type )
+{
+ return EXPP_getBitfield( (void *)&self->nurb->flag,
+ (int)type, 'h' );
+}
+
+static int CurNurb_setFlagBits( BPy_CurNurb * self, PyObject *value,
+ void *type )
+{
+ return EXPP_setBitfield( value, (void *)&self->nurb->flag,
+ (int)type, 'h' );
+}
+
/*
* CurNurb_append( point )
* append a new point to a nurb curve.
@@ -756,9 +776,9 @@ static PyObject *CurNurb_isNurb( BPy_CurNurb * self )
*/
if( self->nurb->bp ) {
- return EXPP_incr_ret_True();
+ Py_RETURN_TRUE;
} else {
- return EXPP_incr_ret_False();
+ Py_RETURN_FALSE;
}
}
@@ -772,9 +792,9 @@ static PyObject *CurNurb_isCyclic( BPy_CurNurb * self )
/* supposing that the flagu is always set */
if( self->nurb->flagu & CU_CYCLIC ) {
- return EXPP_incr_ret_True();
+ Py_RETURN_TRUE;
} else {
- return EXPP_incr_ret_False();
+ Py_RETURN_FALSE;
}
}
diff --git a/source/blender/python/api2_2x/CurNurb.h b/source/blender/python/api2_2x/CurNurb.h
index 06dbf7190ac..f7c50c41bb9 100644
--- a/source/blender/python/api2_2x/CurNurb.h
+++ b/source/blender/python/api2_2x/CurNurb.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: CurNurb.h 10269 2007-03-15 01:09:14Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/Curve.c b/source/blender/python/api2_2x/Curve.c
index e849522ef00..e96e25c25d8 100644
--- a/source/blender/python/api2_2x/Curve.c
+++ b/source/blender/python/api2_2x/Curve.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Curve.c 12752 2007-12-01 23:25:00Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -124,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 );
@@ -820,9 +821,9 @@ static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * value )
new_nurb->type = CU_BEZIER;
new_nurb->bezt->h1 = HD_ALIGN;
new_nurb->bezt->h2 = HD_ALIGN;
- new_nurb->bezt->f1 = 1;
- new_nurb->bezt->f2 = 1;
- new_nurb->bezt->f3 = 1;
+ new_nurb->bezt->f1 = SELECT;
+ new_nurb->bezt->f2 = SELECT;
+ new_nurb->bezt->f3 = SELECT;
new_nurb->bezt->hide = 0;
/* calchandlesNurb( new_nurb ); */
} else { /* set up bp */
@@ -1111,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. */
@@ -1430,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/Curve.h b/source/blender/python/api2_2x/Curve.h
index 70be37500f1..b6c80058b77 100644
--- a/source/blender/python/api2_2x/Curve.h
+++ b/source/blender/python/api2_2x/Curve.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Curve.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c
index 54ff927a2b3..621c72efc2a 100644
--- a/source/blender/python/api2_2x/Draw.c
+++ b/source/blender/python/api2_2x/Draw.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Draw.c 12893 2007-12-15 18:24:16Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -362,47 +362,34 @@ static char Method_Exit_doc[] = "() - Exit the windowing interface";
*/
PyObject *M_Button_List = NULL;
-/*
-* here we engage in some macro trickery to define the PyMethodDef table
-*/
-
-#define _MethodDef(func, prefix) \
- {#func, prefix##_##func, METH_VARARGS, prefix##_##func##_doc}
-
-/* So that _MethodDef(delete, Scene) expands to:
- * {"delete", Scene_delete, METH_VARARGS, Scene_delete_doc} */
-
-#undef MethodDef
-#define MethodDef(func) _MethodDef(func, Method)
-
static struct PyMethodDef Draw_methods[] = {
- MethodDef( Create ),
- MethodDef( UIBlock ),
- MethodDef( Button ),
- MethodDef( Toggle ),
- MethodDef( Menu ),
- MethodDef( Slider ),
- MethodDef( Scrollbar ),
- MethodDef( ColorPicker ),
- MethodDef( Normal ),
- MethodDef( Number ),
- MethodDef( String ),
- MethodDef( GetStringWidth ),
- MethodDef( Text ),
- MethodDef( Label ),
- MethodDef( PupMenu ),
- MethodDef( PupIntInput ),
- MethodDef( PupFloatInput ),
- MethodDef( PupStrInput ),
- MethodDef( PupBlock ),
- MethodDef( Image ),
+ {"Create", (PyCFunction)Method_Create, METH_VARARGS, Method_Create_doc},
+ {"UIBlock", (PyCFunction)Method_UIBlock, METH_VARARGS, Method_UIBlock_doc},
+ {"Button", (PyCFunction)Method_Button, METH_VARARGS, Method_Button_doc},
+ {"Toggle", (PyCFunction)Method_Toggle, METH_VARARGS, Method_Toggle_doc},
+ {"Menu", (PyCFunction)Method_Menu, METH_VARARGS, Method_Menu_doc},
+ {"Slider", (PyCFunction)Method_Slider, METH_VARARGS, Method_Slider_doc},
+ {"Scrollbar", (PyCFunction)Method_Scrollbar, METH_VARARGS, Method_Scrollbar_doc},
+ {"ColorPicker", (PyCFunction)Method_ColorPicker, METH_VARARGS, Method_ColorPicker_doc},
+ {"Normal", (PyCFunction)Method_Normal, METH_VARARGS, Method_Normal_doc},
+ {"Number", (PyCFunction)Method_Number, METH_VARARGS, Method_Number_doc},
+ {"String", (PyCFunction)Method_String, METH_VARARGS, Method_String_doc},
+ {"GetStringWidth", (PyCFunction)Method_GetStringWidth, METH_VARARGS, Method_GetStringWidth_doc},
+ {"Text", (PyCFunction)Method_Text, METH_VARARGS, Method_Text_doc},
+ {"Label", (PyCFunction)Method_Label, METH_VARARGS, Method_Label_doc},
+ {"PupMenu", (PyCFunction)Method_PupMenu, METH_VARARGS, Method_PupMenu_doc},
+ {"PupIntInput", (PyCFunction)Method_PupIntInput, METH_VARARGS, Method_PupIntInput_doc},
+ {"PupFloatInput", (PyCFunction)Method_PupFloatInput, METH_VARARGS, Method_PupFloatInput_doc},
+ {"PupStrInput", (PyCFunction)Method_PupStrInput, METH_VARARGS, Method_PupStrInput_doc},
+ {"PupBlock", (PyCFunction)Method_PupBlock, METH_VARARGS, Method_PupBlock_doc},
+ {"Image", (PyCFunction)Method_Image, METH_VARARGS, Method_Image_doc},
{"Exit", (PyCFunction)Method_Exit, METH_NOARGS, Method_Exit_doc},
- MethodDef( Redraw ),
+ {"Redraw", (PyCFunction)Method_Redraw, METH_VARARGS, Method_Redraw_doc},
{"Draw", (PyCFunction)Method_Draw, METH_NOARGS, Method_Draw_doc},
- MethodDef( Register ),
+ {"Register", (PyCFunction)Method_Register, METH_VARARGS, Method_Register_doc},
{"PushButton", (PyCFunction)Method_Button, METH_VARARGS, Method_Button_doc},
- MethodDef( BeginAlign ),
- MethodDef( EndAlign),
+ {"BeginAlign", (PyCFunction)Method_BeginAlign, METH_VARARGS, Method_BeginAlign_doc},
+ {"EndAlign", (PyCFunction)Method_EndAlign, METH_VARARGS, Method_EndAlign_doc},
{NULL, NULL, 0, NULL}
};
@@ -730,7 +717,7 @@ void BPY_spacescript_do_pywin_event( SpaceScript * sc, unsigned short event,
if (val) {
- if (uiDoBlocks( &curarea->uiblocks, event ) != UI_NOTHING) event = 0;
+ if (uiDoBlocks( &curarea->uiblocks, event, 1 ) != UI_NOTHING) event = 0;
if (event == UI_BUT_EVENT) {
/* check that event is in free range for script button events;
@@ -1117,7 +1104,7 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args )
/* Done clearing events */
uiBoundsBlock(uiblock, 5);
- uiDoBlocks(&listb, 0);
+ uiDoBlocks(&listb, 0, 1);
}
uiFreeBlocks(&listb);
uiblock = NULL;
diff --git a/source/blender/python/api2_2x/Draw.h b/source/blender/python/api2_2x/Draw.h
index 12712713d1d..a78b19b0ebd 100644
--- a/source/blender/python/api2_2x/Draw.h
+++ b/source/blender/python/api2_2x/Draw.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Draw.h 11387 2007-07-27 06:14:25Z joeedh $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/EXPP_interface.c b/source/blender/python/api2_2x/EXPP_interface.c
index ee8b04ebde9..9d49746ff41 100644
--- a/source/blender/python/api2_2x/EXPP_interface.c
+++ b/source/blender/python/api2_2x/EXPP_interface.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: EXPP_interface.c 7338 2006-04-30 16:22:31Z ianwill $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/EXPP_interface.h b/source/blender/python/api2_2x/EXPP_interface.h
index 80767af1c01..8ed0836820d 100644
--- a/source/blender/python/api2_2x/EXPP_interface.h
+++ b/source/blender/python/api2_2x/EXPP_interface.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: EXPP_interface.h 7338 2006-04-30 16:22:31Z ianwill $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Effect.c b/source/blender/python/api2_2x/Effect.c
index ce6b553da0d..43c86ebe634 100644
--- a/source/blender/python/api2_2x/Effect.c
+++ b/source/blender/python/api2_2x/Effect.c
@@ -1330,7 +1330,7 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self )
/* if object is in motion */
if( ob->ipoflag & OB_OFFS_PARTICLE )
- p_time= ob->sf;
+ p_time= give_timeoffset(ob);
else
p_time= 0.0;
diff --git a/source/blender/python/api2_2x/Effect.h b/source/blender/python/api2_2x/Effect.h
index b26e77f1794..86996b9f8a6 100644
--- a/source/blender/python/api2_2x/Effect.h
+++ b/source/blender/python/api2_2x/Effect.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Effect.h 5817 2005-11-17 19:19:05Z khughes $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Font.h b/source/blender/python/api2_2x/Font.h
index c1a1ec73fe2..75867c5b6e7 100644
--- a/source/blender/python/api2_2x/Font.h
+++ b/source/blender/python/api2_2x/Font.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Font.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Geometry.c b/source/blender/python/api2_2x/Geometry.c
index fcfe1eeae04..909e6e449cb 100644
--- a/source/blender/python/api2_2x/Geometry.c
+++ b/source/blender/python/api2_2x/Geometry.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Geometry.c 12867 2007-12-13 15:06:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -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;
+
+ 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/Geometry.h b/source/blender/python/api2_2x/Geometry.h
index c74f832c642..a9a1c7cf818 100644
--- a/source/blender/python/api2_2x/Geometry.h
+++ b/source/blender/python/api2_2x/Geometry.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Geometry.h 10324 2007-03-21 17:06:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Group.c b/source/blender/python/api2_2x/Group.c
index 26e5edd0733..b4819a425f3 100644
--- a/source/blender/python/api2_2x/Group.c
+++ b/source/blender/python/api2_2x/Group.c
@@ -697,7 +697,7 @@ static PyObject *GroupObSeq_unlink( BPy_GroupObSeq * self, BPy_Object *value )
rem_from_group(self->bpygroup->group, blen_ob);
- if(find_group(blen_ob)==NULL) {
+ if(find_group(blen_ob, NULL)==NULL) {
blen_ob->flag &= ~OB_FROMGROUP;
base= object_in_scene(blen_ob, G.scene);
diff --git a/source/blender/python/api2_2x/Group.h b/source/blender/python/api2_2x/Group.h
index 0512623b5f8..68b6ce3eb17 100644
--- a/source/blender/python/api2_2x/Group.h
+++ b/source/blender/python/api2_2x/Group.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Group.h 11864 2007-08-28 10:07:08Z sirdude $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/IDProp.c b/source/blender/python/api2_2x/IDProp.c
index 4f2fa82b21e..cf5cf42de5d 100644
--- a/source/blender/python/api2_2x/IDProp.c
+++ b/source/blender/python/api2_2x/IDProp.c
@@ -392,7 +392,7 @@ PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
if (!name) {
return EXPP_ReturnPyObjError( PyExc_TypeError,
- "pop expected at least 1 arguments, got 0" );
+ "pop expected at least 1 argument, got 0" );
}
for (loop=self->prop->data.group.first; loop; loop=loop->next) {
diff --git a/source/blender/python/api2_2x/Image.c b/source/blender/python/api2_2x/Image.c
index ddfc17c7deb..ec822004596 100644
--- a/source/blender/python/api2_2x/Image.c
+++ b/source/blender/python/api2_2x/Image.c
@@ -243,7 +243,7 @@ static PyObject *M_Image_New( PyObject * self, PyObject * args)
if (width > 5000 || height > 5000 || width < 1 || height < 1)
return ( EXPP_ReturnPyObjError( PyExc_TypeError,
"Image width and height must be between 1 and 5000" ) );
- image = BKE_add_image_size(width, height, name, 0, color);
+ image = BKE_add_image_size(width, height, name, 0, 0, color);
if( !image )
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
"couldn't create PyObject Image_Type" ) );
diff --git a/source/blender/python/api2_2x/Image.h b/source/blender/python/api2_2x/Image.h
index a36627cb236..a2fb22563bb 100644
--- a/source/blender/python/api2_2x/Image.h
+++ b/source/blender/python/api2_2x/Image.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Image.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Ipo.c b/source/blender/python/api2_2x/Ipo.c
index 9b2fd082bee..e150a10259c 100644
--- a/source/blender/python/api2_2x/Ipo.c
+++ b/source/blender/python/api2_2x/Ipo.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Ipo.c 12078 2007-09-18 06:41:29Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Ipo.h b/source/blender/python/api2_2x/Ipo.h
index d3bf2fd108b..35893015a79 100644
--- a/source/blender/python/api2_2x/Ipo.h
+++ b/source/blender/python/api2_2x/Ipo.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Ipo.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Ipocurve.c b/source/blender/python/api2_2x/Ipocurve.c
index b8f3c3f6dd0..cc4cb066fe7 100644
--- a/source/blender/python/api2_2x/Ipocurve.c
+++ b/source/blender/python/api2_2x/Ipocurve.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Ipocurve.c 12078 2007-09-18 06:41:29Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Ipocurve.h b/source/blender/python/api2_2x/Ipocurve.h
index 0844e11b04b..6c4216fa4bd 100644
--- a/source/blender/python/api2_2x/Ipocurve.h
+++ b/source/blender/python/api2_2x/Ipocurve.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Ipocurve.h 10943 2007-06-16 12:24:41Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Key.c b/source/blender/python/api2_2x/Key.c
index 88facd80b4e..b223a382818 100644
--- a/source/blender/python/api2_2x/Key.c
+++ b/source/blender/python/api2_2x/Key.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Key.c 12867 2007-12-13 15:06:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -41,6 +41,7 @@
#include <BKE_main.h>
#include <BKE_curve.h>
#include <BKE_library.h>
+#include <BKE_utildefines.h>
#include "BIF_space.h"
#include "Ipocurve.h"
@@ -60,9 +61,6 @@
#define KEY_TYPE_CURVE 1
#define KEY_TYPE_LATTICE 2
-/* macro from blenkernel/intern/key.c:98 */
-#define GS(a) (*((short *)(a)))
-
static int Key_compare( BPy_Key * a, BPy_Key * b );
static PyObject *Key_repr( BPy_Key * self );
static void Key_dealloc( BPy_Key * self );
diff --git a/source/blender/python/api2_2x/Key.h b/source/blender/python/api2_2x/Key.h
index 87cb55d10eb..35e92fc5fea 100644
--- a/source/blender/python/api2_2x/Key.h
+++ b/source/blender/python/api2_2x/Key.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Key.h 10783 2007-05-26 12:58:46Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Lamp.c b/source/blender/python/api2_2x/Lamp.c
index d40cc5a2cfc..8112d1372c6 100644
--- a/source/blender/python/api2_2x/Lamp.c
+++ b/source/blender/python/api2_2x/Lamp.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Lamp.c 12810 2007-12-06 20:15:03Z khughes $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -1503,7 +1503,7 @@ static PyObject *Lamp_oldsetType( BPy_Lamp * self, PyObject * value )
/* build tuple, call wrapper */
- arg = PyInt_FromLong( (long)type );
+ arg = Py_BuildValue( "(i)", type );
error = EXPP_setterWrapper ( (void *)self, arg, (setter)Lamp_setType );
Py_DECREF ( arg );
return error;
@@ -1562,7 +1562,7 @@ static PyObject *Lamp_oldsetMode( BPy_Lamp * self, PyObject * args )
/* build tuple, call wrapper */
- value = PyInt_FromLong( (long)flag );
+ value = Py_BuildValue( "(i)", flag );
error = EXPP_setterWrapper ( (void *)self, value, (setter)Lamp_setMode );
Py_DECREF ( value );
return error;
diff --git a/source/blender/python/api2_2x/Lamp.h b/source/blender/python/api2_2x/Lamp.h
index 3ad6348a152..01c80e0006b 100644
--- a/source/blender/python/api2_2x/Lamp.h
+++ b/source/blender/python/api2_2x/Lamp.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Lamp.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Lattice.c b/source/blender/python/api2_2x/Lattice.c
index 070e8225531..6a9f3891e52 100644
--- a/source/blender/python/api2_2x/Lattice.c
+++ b/source/blender/python/api2_2x/Lattice.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Lattice.c 11130 2007-06-30 00:18:10Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Lattice.h b/source/blender/python/api2_2x/Lattice.h
index fb47c2dd2e4..dd141f1b8dd 100644
--- a/source/blender/python/api2_2x/Lattice.h
+++ b/source/blender/python/api2_2x/Lattice.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Lattice.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Library.c b/source/blender/python/api2_2x/Library.c
index 1aacaf56786..412daf24bd2 100644
--- a/source/blender/python/api2_2x/Library.c
+++ b/source/blender/python/api2_2x/Library.c
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: Library.c 10943 2007-06-16 12:24:41Z campbellbarton $
*
* Blender.Library BPython module implementation.
* This submodule has functions to append data from .blend files.
diff --git a/source/blender/python/api2_2x/Library.h b/source/blender/python/api2_2x/Library.h
index 4814bf1410c..1ddc138ea57 100644
--- a/source/blender/python/api2_2x/Library.h
+++ b/source/blender/python/api2_2x/Library.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Library.h 10323 2007-03-21 14:25:31Z stiv $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/MTex.c b/source/blender/python/api2_2x/MTex.c
index 4f7cff35c11..61d809411a1 100644
--- a/source/blender/python/api2_2x/MTex.c
+++ b/source/blender/python/api2_2x/MTex.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: MTex.c 10279 2007-03-16 11:38:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/MTex.h b/source/blender/python/api2_2x/MTex.h
index 2148212d82f..36cfa1c477a 100644
--- a/source/blender/python/api2_2x/MTex.h
+++ b/source/blender/python/api2_2x/MTex.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: MTex.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Makefile b/source/blender/python/api2_2x/Makefile
index 8a13adae989..488c81c7100 100644
--- a/source/blender/python/api2_2x/Makefile
+++ b/source/blender/python/api2_2x/Makefile
@@ -44,6 +44,10 @@ ifeq ($(WITH_FFMPEG), true)
CPPFLAGS += -DWITH_FFMPEG
endif
+ifeq ($(WITH_OPENEXR),true)
+ CPPFLAGS += -DWITH_OPENEXR
+endif
+
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
CPPFLAGS += -I../../makesdna
diff --git a/source/blender/python/api2_2x/Material.c b/source/blender/python/api2_2x/Material.c
index 851a46d51e5..8ec1a8fab06 100644
--- a/source/blender/python/api2_2x/Material.c
+++ b/source/blender/python/api2_2x/Material.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Material.c 12078 2007-09-18 06:41:29Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Material.h b/source/blender/python/api2_2x/Material.h
index c4061f795c7..18fc87ee803 100644
--- a/source/blender/python/api2_2x/Material.h
+++ b/source/blender/python/api2_2x/Material.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Material.h 10649 2007-05-04 03:23:40Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Mathutils.c b/source/blender/python/api2_2x/Mathutils.c
index 3605c956a58..65ae46ffccd 100644
--- a/source/blender/python/api2_2x/Mathutils.c
+++ b/source/blender/python/api2_2x/Mathutils.c
@@ -500,10 +500,7 @@ PyObject *M_Mathutils_AngleBetweenVecs(PyObject * self, PyObject * args)
}
dot /= (sqrt(test_v1) * sqrt(test_v2));
- if (dot < -1.0f || dot > 1.0f) {
- CLAMP(dot,-1.0f,1.0f);
- }
- angleRads = (double)acos(dot);
+ angleRads = (double)saacos(dot);
return PyFloat_FromDouble(angleRads * (180/ Py_PI));
diff --git a/source/blender/python/api2_2x/Mathutils.h b/source/blender/python/api2_2x/Mathutils.h
index 901cb2139d7..56d96d8f281 100644
--- a/source/blender/python/api2_2x/Mathutils.h
+++ b/source/blender/python/api2_2x/Mathutils.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Mathutils.h 10943 2007-06-16 12:24:41Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c
index 494a1250728..803c0b96ef3 100644
--- a/source/blender/python/api2_2x/Mesh.c
+++ b/source/blender/python/api2_2x/Mesh.c
@@ -60,6 +60,7 @@
#include "BKE_mesh.h"
#include "BKE_material.h"
#include "BKE_main.h"
+#include "BKE_multires.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_DerivedMesh.h"
@@ -5004,7 +5005,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 );
@@ -5034,6 +5036,20 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args,
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 */
@@ -5319,7 +5335,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 );
@@ -5379,7 +5395,7 @@ static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"sequence must contain at least one int or MFace" );
- face_table = (unsigned int *)MEM_callocN( len*sizeof( unsigned int ),
+ face_table = MEM_callocN( len*sizeof( unsigned int ),
"face_table" );
/* get the indices of faces to be removed */
@@ -5502,15 +5518,12 @@ static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args )
++face_count;
}
}
-
- /* for each face, deselect each edge */
+
+ /* for each remaining face, select all edges */
tmpface = mesh->mface;
fface = (struct fourEdges *)face_edges;
for( i = mesh->totface; i--; ++tmpface, ++fface ) {
if( tmpface->v1 != UINT_MAX ) {
- FaceEdges (*face)[4];
- face = (void *)face_edges;
- face += face_table[i];
fface->v[0]->sel = 1;
fface->v[1]->sel = 1;
fface->v[2]->sel = 1;
@@ -5518,7 +5531,6 @@ static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args )
fface->v[3]->sel = 1;
}
}
-
/* now mark the selected edges for deletion */
edge_count = 0;
@@ -6409,6 +6421,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" );
@@ -6431,8 +6447,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;
@@ -7145,7 +7161,7 @@ static int Mesh_setMultires( BPy_Mesh * self, PyObject *value, void *type )
switch ((int)type) {
case MESH_MULTIRES_LEVEL:
self->mesh->mr->newlvl = i;
- multires_set_level(self->object, self->mesh, 0);
+ multires_set_level_cb(self->object, self->mesh);
break;
case MESH_MULTIRES_EDGE:
self->mesh->mr->edgelvl = i;
@@ -7162,6 +7178,36 @@ static int Mesh_setMultires( BPy_Mesh * self, PyObject *value, void *type )
return 0;
}
+static PyObject *Mesh_addMultiresLevel( BPy_Mesh * self, PyObject * args )
+{
+ char typenum;
+ int i, levels = 1;
+ char *type = NULL;
+ if( G.obedit )
+ return EXPP_ReturnPyObjError(PyExc_RuntimeError,
+ "can't add multires level while in edit mode" );
+ if( !PyArg_ParseTuple( args, "|is", &levels, &type ) )
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "expected nothing or an int and optionally a string as arguments" );
+ if( !type || !strcmp( type, "catmull-clark" ) )
+ typenum = 0;
+ else if( !strcmp( type, "simple" ) )
+ typenum = 1;
+ else
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "if given, type should be 'catmull-clark' or 'simple'" );
+ if (!self->mesh->mr)
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "the mesh has no multires data" );
+ for( i = 0; i < levels; i++ ) {
+ multires_add_level(self->object, self->mesh, typenum);
+ };
+ multires_update_levels(self->mesh, 0);
+ multires_level_to_editmesh(self->object, self->mesh, 0);
+ multires_finish_mesh_update(self->object);
+ Py_RETURN_NONE;
+}
+
/* end multires */
@@ -7379,52 +7425,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)
@@ -7509,7 +7569,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 */
@@ -7529,6 +7589,9 @@ static struct PyMethodDef BPy_Mesh_methods[] = {
"Rename a UV Layer"},
{"renameColorLayer", (PyCFunction)Mesh_renameColorLayer, METH_VARARGS,
"Rename a Color Layer"},
+ /* mesh multires */
+ {"addMultiresLevel", (PyCFunction)Mesh_addMultiresLevel, METH_VARARGS,
+ "(levels=1, type='catmull-clark') - adds multires levels of given type"},
/* python standard class functions */
{"__copy__", (PyCFunction)Mesh_copy, METH_NOARGS,
@@ -7577,7 +7640,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;
diff --git a/source/blender/python/api2_2x/Mesh.h b/source/blender/python/api2_2x/Mesh.h
index 0938f5fe8ef..d73c5c5925e 100644
--- a/source/blender/python/api2_2x/Mesh.h
+++ b/source/blender/python/api2_2x/Mesh.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Mesh.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Metaball.c b/source/blender/python/api2_2x/Metaball.c
index 98dc7ea1127..72152bd1a9a 100644
--- a/source/blender/python/api2_2x/Metaball.c
+++ b/source/blender/python/api2_2x/Metaball.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Metaball.c 11136 2007-07-01 05:41:23Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Metaball.h b/source/blender/python/api2_2x/Metaball.h
index a54424302df..6be35dbd3fb 100644
--- a/source/blender/python/api2_2x/Metaball.h
+++ b/source/blender/python/api2_2x/Metaball.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Metaball.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Modifier.c b/source/blender/python/api2_2x/Modifier.c
index a1b052eb674..57f09332c03 100644
--- a/source/blender/python/api2_2x/Modifier.c
+++ b/source/blender/python/api2_2x/Modifier.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Modifier.c 12840 2007-12-11 01:58:22Z khughes $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -776,8 +776,6 @@ static PyObject *array_getter( BPy_Modifier * self, int type )
return PyFloat_FromDouble( md->length );
else if( type == EXPP_MOD_MERGE_DIST )
return PyFloat_FromDouble( md->merge_dist );
- else if( type == EXPP_MOD_MERGE_DIST )
- return PyFloat_FromDouble( md->merge_dist );
else if( type == EXPP_MOD_OFFSET_VEC)
return newVectorObject( md->offset, 3, Py_NEW );
else if( type == EXPP_MOD_SCALE_VEC)
@@ -1505,6 +1503,8 @@ static PyObject *M_Modifier_TypeDict( void )
PyInt_FromLong( eModifierType_Smooth ) );
PyConstant_Insert( d, "CAST",
PyInt_FromLong( eModifierType_Cast ) );
+ PyConstant_Insert( d, "DISPLACE",
+ PyInt_FromLong( eModifierType_Displace ) );
}
return S;
}
diff --git a/source/blender/python/api2_2x/Modifier.h b/source/blender/python/api2_2x/Modifier.h
index e61371cd192..12afc591c2c 100644
--- a/source/blender/python/api2_2x/Modifier.h
+++ b/source/blender/python/api2_2x/Modifier.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Modifier.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/NLA.c b/source/blender/python/api2_2x/NLA.c
index 7d701382f7b..8fbb468de88 100644
--- a/source/blender/python/api2_2x/NLA.c
+++ b/source/blender/python/api2_2x/NLA.c
@@ -805,7 +805,8 @@ static int ActionStrip_setBlendMode( BPy_ActionStrip * self, PyObject * value )
*/
#define ACTIONSTRIP_MASK (ACTSTRIP_SELECT | ACTSTRIP_USESTRIDE \
- | ACTSTRIP_HOLDLASTFRAME | ACTSTRIP_ACTIVE | ACTSTRIP_LOCK_ACTION)
+ | ACTSTRIP_HOLDLASTFRAME | ACTSTRIP_ACTIVE | ACTSTRIP_LOCK_ACTION \
+ | ACTSTRIP_MUTE)
static PyObject *ActionStrip_getFlag( BPy_ActionStrip * self )
{
@@ -1181,6 +1182,8 @@ static PyObject *M_ActionStrip_FlagsDict( void )
PyInt_FromLong( ACTSTRIP_ACTIVE ) );
PyConstant_Insert( d, "LOCK_ACTION",
PyInt_FromLong( ACTSTRIP_LOCK_ACTION ) );
+ PyConstant_Insert( d, "MUTE",
+ PyInt_FromLong( ACTSTRIP_MUTE ) );
}
return S;
}
diff --git a/source/blender/python/api2_2x/NLA.h b/source/blender/python/api2_2x/NLA.h
index 45873db40a4..50bfa32b7e7 100644
--- a/source/blender/python/api2_2x/NLA.h
+++ b/source/blender/python/api2_2x/NLA.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: NLA.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index e50c9678606..6570613e94a 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: NMesh.c 12108 2007-09-22 17:54:13Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/NMesh.h b/source/blender/python/api2_2x/NMesh.h
index 13ae12af522..3a3b6e10088 100644
--- a/source/blender/python/api2_2x/NMesh.h
+++ b/source/blender/python/api2_2x/NMesh.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: NMesh.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Node.c b/source/blender/python/api2_2x/Node.c
index 296a30dea4e..2871eda9432 100644
--- a/source/blender/python/api2_2x/Node.c
+++ b/source/blender/python/api2_2x/Node.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Node.c 10454 2007-04-04 11:27:43Z jesterking $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Node.h b/source/blender/python/api2_2x/Node.h
index f4796d1b80b..434d0aa684a 100644
--- a/source/blender/python/api2_2x/Node.h
+++ b/source/blender/python/api2_2x/Node.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Node.h 10449 2007-04-03 11:24:11Z jesterking $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Noise.c b/source/blender/python/api2_2x/Noise.c
index c1a41d46714..dcee6f45d2a 100644
--- a/source/blender/python/api2_2x/Noise.c
+++ b/source/blender/python/api2_2x/Noise.c
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id: Noise.c 12056 2007-09-17 06:11:06Z aligorith $
*
* Blender.Noise BPython module implementation.
* This submodule has functions to generate noise of various types.
diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c
index e62f685cdf5..83c8ed7df3d 100644
--- a/source/blender/python/api2_2x/Object.c
+++ b/source/blender/python/api2_2x/Object.c
@@ -134,6 +134,7 @@ struct rctf;
#define IPOKEY_PI_SURFACEDAMP 8
#define IPOKEY_PI_RANDOMDAMP 9
#define IPOKEY_PI_PERM 10
+#define IPOKEY_LAYER 19
#define PFIELD_FORCE 1
#define PFIELD_VORTEX 2
@@ -172,6 +173,7 @@ enum obj_consts {
EXPP_OBJ_ATTR_DUPOFF,
EXPP_OBJ_ATTR_DUPSTA,
EXPP_OBJ_ATTR_DUPEND,
+ EXPP_OBJ_ATTR_DUPFACESCALEFAC,
EXPP_OBJ_ATTR_TIMEOFFSET,
EXPP_OBJ_ATTR_DRAWSIZE,
EXPP_OBJ_ATTR_PARENT_TYPE,
@@ -276,6 +278,8 @@ enum obj_consts {
#define EXPP_OBJECT_SBINSPRINGMAX 0.999f
#define EXPP_OBJECT_SBINFRICTMIN 0.0f
#define EXPP_OBJECT_SBINFRICTMAX 10.0f
+#define EXPP_OBJECT_DUPFACESCALEFACMIN 0.001f
+#define EXPP_OBJECT_DUPFACESCALEFACMAX 10000.0f
/*****************************************************************************/
/* Python API function prototypes for the Blender module. */
@@ -1481,7 +1485,7 @@ static PyObject *Object_getBoundBox( BPy_Object * self )
switch ( self->object->type ) {
case OB_MESH:
me = self->object->data;
- vec = (float*) mesh_get_bb(me)->vec;
+ vec = (float*) mesh_get_bb(self->object)->vec;
break;
case OB_CURVE:
case OB_FONT:
@@ -2340,7 +2344,7 @@ static int Object_setMatrix( BPy_Object * self, MatrixObject * mat )
/*
* Object_insertIpoKey()
- * inserts Object IPO key for LOC, ROT, SIZE, LOCROT, or LOCROTSIZE
+ * inserts Object IPO key for LOC, ROT, SIZE, LOCROT, LOCROTSIZE, or LAYER
* Note it also inserts actions!
*/
@@ -2372,6 +2376,9 @@ static PyObject *Object_insertIpoKey( BPy_Object * self, PyObject * args )
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_LAYER ){
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_LAY, 0);
+ }
if (key == IPOKEY_PI_STRENGTH ){
insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FSTR, 0);
@@ -2510,7 +2517,7 @@ static PyObject *Object_setConstraintInfluenceForBone( BPy_Object * self,
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expects bonename, constraintname, influenceval" );
- icu = verify_ipocurve((ID *)self->object, ID_CO, boneName, constName,
+ icu = verify_ipocurve((ID *)self->object, ID_CO, boneName, constName, NULL,
CO_ENFORCE);
if (!icu)
@@ -3843,6 +3850,9 @@ static PyObject *getFloatAttr( BPy_Object *self, void *type )
case EXPP_OBJ_ATTR_SB_INFRICT:
param = object->soft->infrict;
break;
+ case EXPP_OBJ_ATTR_DUPFACESCALEFAC:
+ param = object->dupfacesca;
+ break;
default:
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"undefined type in getFloatAttr" );
@@ -3990,6 +4000,12 @@ static int setFloatAttrClamp( BPy_Object *self, PyObject *value, void *type )
max = EXPP_OBJECT_SBINFRICTMAX;
param = &self->object->soft->infrict;
break;
+ case EXPP_OBJ_ATTR_DUPFACESCALEFAC:
+ min = EXPP_OBJECT_DUPFACESCALEFACMIN;
+ max = EXPP_OBJECT_DUPFACESCALEFACMAX;
+ param = &self->object->dupfacesca;
+ break;
+
default:
return EXPP_ReturnIntError( PyExc_RuntimeError,
"undefined type in setFloatAttrClamp" );
@@ -4984,6 +5000,10 @@ static PyGetSetDef BPy_Object_getseters[] = {
(getter)Object_getTransflagBits, (setter)Object_setTransflagBits,
"Use face scale to scale all dupliFaces",
(void *)OB_DUPLIFACES_SCALE},
+ {"dupFacesScaleFac",
+ (getter)getFloatAttr, (setter)setFloatAttr,
+ "Use face scale to scale all dupliFaces",
+ (void *)EXPP_OBJ_ATTR_DUPFACESCALEFAC},
{"enableDupFrames",
(getter)Object_getTransflagBits, (setter)Object_setTransflagBits,
"Make copy of object for every frame",
@@ -5307,6 +5327,7 @@ static PyObject *M_Object_IpoKeyTypesDict( void )
PyConstant_Insert( d, "SIZE", PyInt_FromLong( IPOKEY_SIZE ) );
PyConstant_Insert( d, "LOCROT", PyInt_FromLong( IPOKEY_LOCROT ) );
PyConstant_Insert( d, "LOCROTSIZE", PyInt_FromLong( IPOKEY_LOCROTSIZE ) );
+ PyConstant_Insert( d, "LAYER", PyInt_FromLong( IPOKEY_LAYER ) );
PyConstant_Insert( d, "PI_STRENGTH", PyInt_FromLong( IPOKEY_PI_STRENGTH ) );
PyConstant_Insert( d, "PI_FALLOFF", PyInt_FromLong( IPOKEY_PI_FALLOFF ) );
@@ -5344,7 +5365,8 @@ PyObject *Object_Init( void )
PyModule_AddIntConstant( module, "SIZE", IPOKEY_SIZE );
PyModule_AddIntConstant( module, "LOCROT", IPOKEY_LOCROT );
PyModule_AddIntConstant( module, "LOCROTSIZE", IPOKEY_LOCROTSIZE );
-
+ PyModule_AddIntConstant( module, "LAYER", IPOKEY_LAYER );
+
PyModule_AddIntConstant( module, "PI_STRENGTH", IPOKEY_PI_STRENGTH );
PyModule_AddIntConstant( module, "PI_FALLOFF", IPOKEY_PI_FALLOFF );
PyModule_AddIntConstant( module, "PI_SURFACEDAMP", IPOKEY_PI_SURFACEDAMP );
diff --git a/source/blender/python/api2_2x/Object.h b/source/blender/python/api2_2x/Object.h
index 557513560fd..7891f99da09 100644
--- a/source/blender/python/api2_2x/Object.h
+++ b/source/blender/python/api2_2x/Object.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Object.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Particle.c b/source/blender/python/api2_2x/Particle.c
index e2fdbc5b6ad..84c0c727792 100644
--- a/source/blender/python/api2_2x/Particle.c
+++ b/source/blender/python/api2_2x/Particle.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Particle.c 10279 2007-03-16 11:38:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Particle.h b/source/blender/python/api2_2x/Particle.h
index f9b75b20c63..73b5363dac6 100644
--- a/source/blender/python/api2_2x/Particle.h
+++ b/source/blender/python/api2_2x/Particle.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Particle.h 5702 2005-11-04 20:34:38Z khughes $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Pose.c b/source/blender/python/api2_2x/Pose.c
index e71747b50d3..01fbe591a74 100644
--- a/source/blender/python/api2_2x/Pose.c
+++ b/source/blender/python/api2_2x/Pose.c
@@ -723,14 +723,12 @@ AttributeError:
//Gets the pose_mat
static PyObject *PoseBone_getPoseMatrix(BPy_PoseBone *self, void *closure)
{
- printmatrix4("posemat GET", self->posechannel->pose_mat );
return newMatrixObject((float*)self->posechannel->pose_mat, 4, 4, Py_WRAP);
}
//------------------------PoseBone.poseMatrix (setter)
//Sets the pose_mat
static int PoseBone_setPoseMatrix(BPy_PoseBone *self, MatrixObject *value, void *closure)
{
- float loc_mat[4][4];
float delta_mat[4][4], quat[4]; /* rotation */
float size[4]; /* size only */
@@ -739,7 +737,7 @@ static int PoseBone_setPoseMatrix(BPy_PoseBone *self, MatrixObject *value, void
"expected matrix object as argument" );
if( value->colSize != 4 || value->rowSize != 4 )
- return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ return EXPP_ReturnIntError( PyExc_AttributeError,
"matrix must be a 4x4 transformation matrix\n"
"for example as returned by object.matrixWorld" );
@@ -1130,6 +1128,34 @@ static int PoseBone_setIKFlag(BPy_PoseBone *self, PyObject *value, void *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
@@ -1190,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/Registry.c b/source/blender/python/api2_2x/Registry.c
index 8fa77b20741..4eb4fd93294 100644
--- a/source/blender/python/api2_2x/Registry.c
+++ b/source/blender/python/api2_2x/Registry.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Registry.c 4803 2005-07-18 03:50:37Z ascotan $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Registry.h b/source/blender/python/api2_2x/Registry.h
index 4383d63e0bc..58cfe65dfd0 100644
--- a/source/blender/python/api2_2x/Registry.h
+++ b/source/blender/python/api2_2x/Registry.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Registry.h 3209 2004-10-07 19:25:40Z stiv $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c
index 62b3a44690b..397cee0ad5e 100644
--- a/source/blender/python/api2_2x/Scene.c
+++ b/source/blender/python/api2_2x/Scene.c
@@ -51,12 +51,15 @@ struct View3D;
#include "BLI_blenlib.h" /* only for SceneObSeq_new */
#include "BSE_drawview.h" /* for play_anim */
#include "BSE_headerbuttons.h" /* for copy_scene */
+#include "BSE_sequence.h" /* to clear_scene_in_allseqs */
+#include "BSE_node.h" /* to clear_scene_in_nodes */
#include "BIF_drawscene.h" /* for set_scene */
#include "BIF_space.h" /* for copy_view3d_lock() */
#include "BIF_screen.h" /* curarea */
#include "BDR_editobject.h" /* free_and_unlink_base() */
#include "mydevice.h" /* for #define REDRAW */
#include "DNA_view3d_types.h"
+
/* python types */
#include "Object.h"
#include "Camera.h"
@@ -718,8 +721,9 @@ static PyObject *M_Scene_Unlink( PyObject * self, PyObject * args )
{
PyObject *pyobj;
BPy_Scene *pyscn;
- Scene *scene;
-
+ Scene *scene, *sce;
+ bScreen *sc;
+
if( !PyArg_ParseTuple( args, "O!", &Scene_Type, &pyobj ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected Scene PyType object" );
@@ -733,6 +737,23 @@ static PyObject *M_Scene_Unlink( PyObject * self, PyObject * args )
return EXPP_ReturnPyObjError( PyExc_SystemError,
"current Scene cannot be removed!" );
+ /* Copied from header_info.c */
+
+ /* check all sets */
+ for (sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if(sce->set == scene) sce->set= 0;
+ }
+
+ /* check all sequences */
+ clear_scene_in_allseqs(scene);
+
+ /* check render layer nodes in other scenes */
+ clear_scene_in_nodes(scene);
+
+ for (sc= G.main->screen.first; sc; sc= sc->id.next ) {
+ if(sc->scene == scene) sc->scene= G.scene;
+ }
+
free_libblock( &G.main->scene, scene );
pyscn->scene= NULL;
@@ -805,10 +826,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"
diff --git a/source/blender/python/api2_2x/Scene.h b/source/blender/python/api2_2x/Scene.h
index e6e509159d5..eefa72562b5 100644
--- a/source/blender/python/api2_2x/Scene.h
+++ b/source/blender/python/api2_2x/Scene.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Scene.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Sound.c b/source/blender/python/api2_2x/Sound.c
index 6e20e4c3ee5..25f557eb0c1 100644
--- a/source/blender/python/api2_2x/Sound.c
+++ b/source/blender/python/api2_2x/Sound.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Sound.c 11123 2007-06-29 08:59:26Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Sound.h b/source/blender/python/api2_2x/Sound.h
index 7a84bbd901d..06e9a95bdc5 100644
--- a/source/blender/python/api2_2x/Sound.h
+++ b/source/blender/python/api2_2x/Sound.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Sound.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/SurfNurb.c b/source/blender/python/api2_2x/SurfNurb.c
index 3499ec09936..1d2e74a26a8 100644
--- a/source/blender/python/api2_2x/SurfNurb.c
+++ b/source/blender/python/api2_2x/SurfNurb.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: SurfNurb.c 11400 2007-07-28 09:26:53Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/SurfNurb.h b/source/blender/python/api2_2x/SurfNurb.h
index 0559d84cbaf..30d9a48012e 100644
--- a/source/blender/python/api2_2x/SurfNurb.h
+++ b/source/blender/python/api2_2x/SurfNurb.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: SurfNurb.h 10269 2007-03-15 01:09:14Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/Sys.c b/source/blender/python/api2_2x/Sys.c
index 7dc841e9d68..e936eb56b59 100644
--- a/source/blender/python/api2_2x/Sys.c
+++ b/source/blender/python/api2_2x/Sys.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Sys.c 10945 2007-06-16 13:17:41Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Sys.h b/source/blender/python/api2_2x/Sys.h
index d6e2689bba5..3e5f78f4922 100644
--- a/source/blender/python/api2_2x/Sys.h
+++ b/source/blender/python/api2_2x/Sys.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Sys.h 4803 2005-07-18 03:50:37Z ascotan $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Text.c b/source/blender/python/api2_2x/Text.c
index d507d623c99..29c404f7266 100644
--- a/source/blender/python/api2_2x/Text.c
+++ b/source/blender/python/api2_2x/Text.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Text.c 11123 2007-06-29 08:59:26Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Text.h b/source/blender/python/api2_2x/Text.h
index b40c3807a81..90de82f1254 100644
--- a/source/blender/python/api2_2x/Text.h
+++ b/source/blender/python/api2_2x/Text.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Text.h 10136 2007-02-25 01:07:28Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Text3d.c b/source/blender/python/api2_2x/Text3d.c
index 57a9c74b71d..6194b232401 100644
--- a/source/blender/python/api2_2x/Text3d.c
+++ b/source/blender/python/api2_2x/Text3d.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Text3d.c 11099 2007-06-28 13:46:42Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Text3d.h b/source/blender/python/api2_2x/Text3d.h
index 6486278f20d..ddab385ca66 100644
--- a/source/blender/python/api2_2x/Text3d.h
+++ b/source/blender/python/api2_2x/Text3d.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Text3d.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Texture.c b/source/blender/python/api2_2x/Texture.c
index 34906757ebd..a8b5441acfc 100644
--- a/source/blender/python/api2_2x/Texture.c
+++ b/source/blender/python/api2_2x/Texture.c
@@ -32,6 +32,7 @@
#include "Texture.h" /*This must come first*/
#include "BKE_global.h"
+#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_idprop.h"
#include "BKE_library.h"
@@ -504,7 +505,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 );
/*****************************************************************************/
@@ -1572,6 +1573,7 @@ static int Texture_setImage( BPy_Texture * self, PyObject * value )
}
self->texture->ima = blimg;
+ BKE_image_signal(blimg, &self->texture->iuser, IMA_SIGNAL_RELOAD );
id_us_plus( &blimg->id );
return 0;
@@ -2472,19 +2474,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/Texture.h b/source/blender/python/api2_2x/Texture.h
index a5451687779..a00fe6faf94 100644
--- a/source/blender/python/api2_2x/Texture.h
+++ b/source/blender/python/api2_2x/Texture.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Texture.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Types.c b/source/blender/python/api2_2x/Types.c
index 8b51c590a5b..425584f84ac 100644
--- a/source/blender/python/api2_2x/Types.c
+++ b/source/blender/python/api2_2x/Types.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Types.c 11713 2007-08-19 19:06:42Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/Types.h b/source/blender/python/api2_2x/Types.h
index adaf59bbfbf..b905ab75d62 100644
--- a/source/blender/python/api2_2x/Types.h
+++ b/source/blender/python/api2_2x/Types.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Types.h 7266 2006-04-16 15:28:50Z stiv $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/Window.c b/source/blender/python/api2_2x/Window.c
index 9bcf1290bb0..73edcb2df9c 100644
--- a/source/blender/python/api2_2x/Window.c
+++ b/source/blender/python/api2_2x/Window.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: Window.c 12813 2007-12-07 09:51:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
@@ -47,6 +47,7 @@
#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"
@@ -60,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);
@@ -86,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 );
@@ -104,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 +197,8 @@ static char M_Window_EditMode_doc[] =
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\
@@ -282,6 +302,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: */
/*****************************************************************************/
@@ -325,6 +357,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: */
@@ -367,6 +401,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}
};
@@ -949,6 +987,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;
@@ -1421,12 +1485,37 @@ 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,
@@ -1439,6 +1528,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;
@@ -1489,5 +1579,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 7804a443639..a6fac327360 100644
--- a/source/blender/python/api2_2x/World.c
+++ b/source/blender/python/api2_2x/World.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: World.c 12078 2007-09-18 06:41:29Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/World.h b/source/blender/python/api2_2x/World.h
index ff0ec8709d7..71c407bff19 100644
--- a/source/blender/python/api2_2x/World.h
+++ b/source/blender/python/api2_2x/World.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: World.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/bpy.c b/source/blender/python/api2_2x/bpy.c
index cee862c0e23..6ddbcfe4096 100644
--- a/source/blender/python/api2_2x/bpy.c
+++ b/source/blender/python/api2_2x/bpy.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: bpy.c 10550 2007-04-18 22:53:20Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/bpy.h b/source/blender/python/api2_2x/bpy.h
index 668196d8271..855da49bd2b 100644
--- a/source/blender/python/api2_2x/bpy.h
+++ b/source/blender/python/api2_2x/bpy.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: bpy.h 10546 2007-04-18 14:40:01Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/bpy_config.c b/source/blender/python/api2_2x/bpy_config.c
index a061f31d8a0..ce8ce0bc39c 100644
--- a/source/blender/python/api2_2x/bpy_config.c
+++ b/source/blender/python/api2_2x/bpy_config.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: bpy_config.c 11123 2007-06-29 08:59:26Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/bpy_config.h b/source/blender/python/api2_2x/bpy_config.h
index 979953acd76..ae1f114dc81 100644
--- a/source/blender/python/api2_2x/bpy_config.h
+++ b/source/blender/python/api2_2x/bpy_config.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: bpy_config.h 10546 2007-04-18 14:40:01Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/bpy_data.c b/source/blender/python/api2_2x/bpy_data.c
index edb894bd982..8ad577bd175 100644
--- a/source/blender/python/api2_2x/bpy_data.c
+++ b/source/blender/python/api2_2x/bpy_data.c
@@ -538,7 +538,7 @@ PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd)
break;
case ID_IM:
{
- id = (ID *)BKE_add_image_size(img_width, img_height, name?name:"Image", 0, color);
+ id = (ID *)BKE_add_image_size(img_width, img_height, name?name:"Image", 0, 0, color);
if( !id )
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
"couldn't create PyObject Image_Type" ) );
diff --git a/source/blender/python/api2_2x/bpy_types.h b/source/blender/python/api2_2x/bpy_types.h
index 0b83db6c674..fcada098d1e 100644
--- a/source/blender/python/api2_2x/bpy_types.h
+++ b/source/blender/python/api2_2x/bpy_types.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: bpy_types.h 4803 2005-07-18 03:50:37Z ascotan $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/charRGBA.c b/source/blender/python/api2_2x/charRGBA.c
index 43c9b7772fa..087ddecc1c5 100644
--- a/source/blender/python/api2_2x/charRGBA.c
+++ b/source/blender/python/api2_2x/charRGBA.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: charRGBA.c 10782 2007-05-26 04:39:31Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/charRGBA.h b/source/blender/python/api2_2x/charRGBA.h
index 20573f1ce7b..9cc3dc739d1 100644
--- a/source/blender/python/api2_2x/charRGBA.h
+++ b/source/blender/python/api2_2x/charRGBA.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: charRGBA.h 10280 2007-03-16 14:44:31Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/constant.c b/source/blender/python/api2_2x/constant.c
index 3a64de610f1..1034fbd616c 100644
--- a/source/blender/python/api2_2x/constant.c
+++ b/source/blender/python/api2_2x/constant.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: constant.c 10778 2007-05-25 16:43:25Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/constant.h b/source/blender/python/api2_2x/constant.h
index a3eb7e98e0d..1e325cef012 100644
--- a/source/blender/python/api2_2x/constant.h
+++ b/source/blender/python/api2_2x/constant.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: constant.h 7089 2006-03-18 15:23:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
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/Blender.py b/source/blender/python/api2_2x/doc/Blender.py
index 51666d0e211..9e994bfbe64 100644
--- a/source/blender/python/api2_2x/doc/Blender.py
+++ b/source/blender/python/api2_2x/doc/Blender.py
@@ -60,6 +60,7 @@ def Set (request, data):
@type request: string
@param request: The setting to change:
- 'curframe': the current animation frame
+ - 'compressfile' : compress file writing a blend file (Use a boolean value True/False).
- 'uscriptsdir': user scripts dir
- 'yfexportdir': yafray temp xml storage dir
- 'fontsdir': font dir
@@ -68,6 +69,7 @@ def Set (request, data):
- 'renderdir': default render output dir
- 'soundsdir': sound dir
- 'tempdir': temp file storage dir
+ - 'mipmap' : Use mipmapping in the 3d view (Use a boolean value True/False).
@type data: int or string
@param data: The new value.
"""
@@ -79,6 +81,7 @@ def Get (request):
@param request: The setting data to be returned:
- 'curframe': the current animation frame.
- 'curtime' : the current animation time.
+ - 'compressfile' : compress setting from the file menu, return 0 for false or 1 for true.
- 'staframe': the start frame of the animation.
- 'endframe': the end frame of the animation.
- 'rt': the value of the 'rt' button for general debugging
@@ -104,6 +107,7 @@ def Get (request):
- 'soundsdir': the path to the user defined dir for sound files. (*)
- 'tempdir': the path to the user defined dir for storage of Blender
temporary files. (*)
+ - 'mipmap' : Use mipmapping in the 3d view. (*)
- 'version' : the Blender version number.
@note: (*) these can be set in Blender at the User Preferences window -> File
Paths tab.
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/Font.py b/source/blender/python/api2_2x/doc/Font.py
index c0ad66d0462..44fa3d81f91 100644
--- a/source/blender/python/api2_2x/doc/Font.py
+++ b/source/blender/python/api2_2x/doc/Font.py
@@ -52,17 +52,17 @@ class Font:
def pack():
"""
- Packs the sound into the current blend file.
- @note: An error will be raised if the sound is already packed or the filename path does not exist.
+ Packs the font into the current blend file.
+ @note:
@returns: nothing
@rtype: none
"""
def unpack(mode):
"""
- Unpacks the sound to the samples filename.
+ Unpacks the font.
@param mode: One of the values in Blender.UnpackModes dict.
- @note: An error will be raised if the sound is not packed or the filename path does not exist.
+ @note: An error will be raised if the font is not packed or the filename path does not exist.
@returns: nothing
@rtype: none
@type mode: int
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 b8c472b371a..c479926ccf3 100644
--- a/source/blender/python/api2_2x/doc/Ipo.py
+++ b/source/blender/python/api2_2x/doc/Ipo.py
@@ -47,7 +47,7 @@ The valid IpoCurve constants are:
4. Camera Ipo: CA_LENS, CA_CLSTA, CA_CLEND, CA_APERT, CA_FDIST
5. Object Ipo: OB_LOCX, OB_LOCY, OB_LOCZ, OB_DLOCX, OB_DLOCY, OB_DLOCZ,
OB_ROTX, OB_ROTY, OB_ROTZ, OB_DROTX, OB_DROTY, OB_DROTZ,
- OB_SIZEX, OB_SIZEY, OB_SIZEZ, OB_DSIZEX, OB_DSIZEY, OB_DSIZEZ,
+ OB_SCALEX, OB_SCALEY, OB_SCALEZ, OB_DSCALEX, OB_DSCALEY, OB_DSCALEZ,
OB_LAYER, OB_TIME, OB_COLR, OB_COLG, OB_COLB, OB_COLA,
OB_FSTRENG, OB_FFALL, OB_RDAMP, OB_DAMPING, OB_PERM
6. Curve Ipo: CU_SPEED
diff --git a/source/blender/python/api2_2x/doc/LibData.py b/source/blender/python/api2_2x/doc/LibData.py
index 7884ea50659..7b6f4950c76 100644
--- a/source/blender/python/api2_2x/doc/LibData.py
+++ b/source/blender/python/api2_2x/doc/LibData.py
@@ -18,7 +18,7 @@ which module is supported in the end.
Example::
import bpy
- scn= bpy.scenes.active # get current scene
+ scn= bpy.data.scenes.active # get current scene
lib = bpy.libraries.load('//file.blend') # open file.blend
ob = scn.objects.link(lib.objects.append('Cube')) # append Cube object from library to current scene
mat = lib.objects.link('Material') # get a link to a material
@@ -103,17 +103,17 @@ class LibData:
B{Note}: Blender Objects cannot be appended or linked without linking
them to a scene. For this reason, lib.objects.append() returns a
special "wrapper object" which must be passed to Scene.objects.link()
- or bpy.scenes.active.link() in order to actually create the object.
+ or bpy.data.scenes.active.link() in order to actually create the object.
So the following code will not create a new object::
import bpy
- scn= bpy.scenes.active # get current scene
+ scn= bpy.data.scenes.active # get current scene
lib = bpy.libraries.load('//file.blend') # open file.blend
pseudoOb = lib.objects.append('Cube')) # get an object wrapper
But this code will::
import bpy
- scn= bpy.scenes.active # get current scene
+ scn= bpy.data.scenes.active # get current scene
lib = bpy.libraries.load('//file.blend') # open file.blend
pseudoOb = lib.objects.append('Cube')) # get an object wrapper
ob = scn.objects.link(pseudoOb) # link to scene
diff --git a/source/blender/python/api2_2x/doc/Mathutils.py b/source/blender/python/api2_2x/doc/Mathutils.py
index 7546bb5b6d5..8b0c41b9a69 100644
--- a/source/blender/python/api2_2x/doc/Mathutils.py
+++ b/source/blender/python/api2_2x/doc/Mathutils.py
@@ -28,15 +28,15 @@ Example::
print angle
"""
-def Rand (high = 1, low = 0):
+def Rand (low=0.0, high = 1.0):
"""
Return a random number within a range.
- High and low represent the range from which the random
- number must return its result.
- @type high: float
- @param high: The upper range.
+ low and high represent are optional parameters which represent the range
+ from which the random number must return its result.
@type low: float
@param low: The lower range.
+ @type high: float
+ @param high: The upper range.
"""
def Intersect(vec1, vec2, vec3, ray, orig, clip=1):
diff --git a/source/blender/python/api2_2x/doc/Mesh.py b/source/blender/python/api2_2x/doc/Mesh.py
index e572d6a91ae..0690b94712b 100644
--- a/source/blender/python/api2_2x/doc/Mesh.py
+++ b/source/blender/python/api2_2x/doc/Mesh.py
@@ -834,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):
@@ -869,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
@@ -1097,6 +1102,15 @@ class Mesh:
@param name: The name of the new Color layer, 31 characters max.
"""
+ def addMultiresLevel(levels = 1, type = 'catmull-clark'):
+ """
+ Adds multires levels to this mesh.
+ @type levels: int
+ @param levels: The number of levels to add
+ @type type: string
+ @param type: The type of multires level, 'catmull-clark' or 'simple'.
+ """
+
def removeUVLayer(name):
"""
Removes the active UV/Image layer.
diff --git a/source/blender/python/api2_2x/doc/Modifier.py b/source/blender/python/api2_2x/doc/Modifier.py
index 0c53f470b63..1d7d2e121c9 100644
--- a/source/blender/python/api2_2x/doc/Modifier.py
+++ b/source/blender/python/api2_2x/doc/Modifier.py
@@ -49,6 +49,7 @@ Example::
@var Types: Constant Modifier dict used for L{ModSeq.append} to a
modifier sequence and comparing with L{Modifier.type}:
- ARMATURE - type value for Armature modifiers
+ - ARRAY - type value for Array modifiers
- BOOLEAN - type value for Boolean modifiers
- BUILD - type value for Build modifiers
- CURVE - type value for Curve modifiers
diff --git a/source/blender/python/api2_2x/doc/NLA.py b/source/blender/python/api2_2x/doc/NLA.py
index adfcf77d965..aeb5178f3d7 100644
--- a/source/blender/python/api2_2x/doc/NLA.py
+++ b/source/blender/python/api2_2x/doc/NLA.py
@@ -18,6 +18,7 @@ It is a bitmask and settings are ORed together.
- HOLD: continue displaying the last frame past the end of the strip
- ACTIVE: action strip is active in NLA window
- LOCK_ACTION: action start/end are automatically mapped to strip duration
+ - MUTE: action strip does not contribute to the NLA solution
@type StrideAxes: readonly dictionary
@var StrideAxes: Constant dict used by the L{ActionStrip.strideAxis} attribute.
diff --git a/source/blender/python/api2_2x/doc/Object.py b/source/blender/python/api2_2x/doc/Object.py
index 34cdd4b7821..4228f6de1a8 100644
--- a/source/blender/python/api2_2x/doc/Object.py
+++ b/source/blender/python/api2_2x/doc/Object.py
@@ -105,6 +105,7 @@ Example::
- SIZE
- LOCROT
- LOCROTSIZE
+ - LAYER
- PI_STRENGTH
- PI_FALLOFF
- PI_SURFACEDAMP
@@ -428,6 +429,8 @@ class Object:
@type enableDupFaces: boolean
@ivar enableDupFacesScale: The DupliFacesScale status of the object.
@type enableDupFacesScale: boolean
+ @ivar dupFacesScaleFac: Scale factor for dupliface instance, 1.0 by default.
+ @type dupFacesScaleFac: float
@ivar enableDupFrames: The DupliFrames status of the object.
Does not indicate that this object has any dupliFrames,
(as returned by L{DupObjects}) just that dupliFrames are enabled.
diff --git a/source/blender/python/api2_2x/doc/Pose.py b/source/blender/python/api2_2x/doc/Pose.py
index e0c0c241044..ad1b44da5e2 100644
--- a/source/blender/python/api2_2x/doc/Pose.py
+++ b/source/blender/python/api2_2x/doc/Pose.py
@@ -217,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 70ac308768b..ddcc5a239af 100644
--- a/source/blender/python/api2_2x/doc/Render.py
+++ b/source/blender/python/api2_2x/doc/Render.py
@@ -246,10 +246,12 @@ class RenderData:
@type extensions: boolean
@ivar compositor: 'Do Compositor' enabled.
@type compositor: boolean
- @ivar freeImages: 'Do Compositor' enabled.
+ @ivar freeImages: Texture images are freed after render.
@type freeImages: boolean
@ivar singleLayer: Only render the active layer.
@type singleLayer: boolean
+ @ivar activeLayer: The active render layer. Must be in range[0,num render layers-1]
+ @type activeLayer: int
@ivar saveBuffers: Save render buffers to disk while rendering, saves memory.
@type saveBuffers: boolean
@ivar compositeFree: Free nodes that are not used while composite.
@@ -293,7 +295,11 @@ class RenderData:
@type oversampling: boolean
@ivar fps: Frames per second.
Values are clamped to the range [1,120].
- @type fps: int
+ @ivar fpsBase: 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 fpsBase: float
@ivar timeCode: Get the current frame in HH:MM:SS:FF format. Read-only.
@type timeCode: string
@ivar environmentMap: Environment map rendering enabled.
@@ -426,6 +432,15 @@ class RenderData:
sequences.
"""
+ def getFrameFilename( frame ):
+ """
+ Get the filename used for the remdered image.
+ @type frame: int
+ @param path: the frame to use in the filename, if no argument given, use the current frame.
+ @rtype: string
+ @return: Returns the filename that blender would render to, taking into account output path, extension and frame number.
+ """
+
def setBackbufPath(path):
"""
Set the path to a background image and load it.
diff --git a/source/blender/python/api2_2x/doc/Scene.py b/source/blender/python/api2_2x/doc/Scene.py
index 77e33e143f5..caa5b56e8d5 100644
--- a/source/blender/python/api2_2x/doc/Scene.py
+++ b/source/blender/python/api2_2x/doc/Scene.py
@@ -117,6 +117,16 @@ class Scene:
@ivar render: The scenes L{render<Render.RenderData>} settings. (read only)
@type radiosity: RenderData
@ivar radiosity: The scenes L{radiosity<Radio>} settings. (read only)
+ @type halfFloat: OpenEXR's half float option
+ @ivar halfFloat: boolean
+ @type zbuf: OpenEXR's save zbuf option
+ @ivar zbuf: boolean
+ @type preview: OpenEXR's save preview option
+ @ivar preview: boolean
+ @type touch: enable creating empty image files while they are rendered.
+ @ivar touch: boolean
+ @type noOverwrite: Skip rendering existing image files
+ @ivar noOverwrite: boolean
"""
def getName():
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 004cd2df274..dfba93c9978 100644
--- a/source/blender/python/api2_2x/doc/Texture.py
+++ b/source/blender/python/api2_2x/doc/Texture.py
@@ -480,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
@@ -532,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/euler.c b/source/blender/python/api2_2x/euler.c
index 53489e0f737..acbc2b4e680 100644
--- a/source/blender/python/api2_2x/euler.c
+++ b/source/blender/python/api2_2x/euler.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: euler.c 12314 2007-10-20 20:24:09Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/euler.h b/source/blender/python/api2_2x/euler.h
index 62e5855891b..d992d61b402 100644
--- a/source/blender/python/api2_2x/euler.h
+++ b/source/blender/python/api2_2x/euler.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: euler.h 8367 2006-08-22 09:13:44Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/gen_library.h b/source/blender/python/api2_2x/gen_library.h
index 9fb922619c2..ea182ad1a29 100644
--- a/source/blender/python/api2_2x/gen_library.h
+++ b/source/blender/python/api2_2x/gen_library.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: gen_library.h 11877 2007-08-29 03:09:22Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/gen_utils.c b/source/blender/python/api2_2x/gen_utils.c
index 8a98fd279b7..f05be1ba68b 100644
--- a/source/blender/python/api2_2x/gen_utils.c
+++ b/source/blender/python/api2_2x/gen_utils.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: gen_utils.c 11932 2007-09-03 17:28:50Z stiv $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/gen_utils.h b/source/blender/python/api2_2x/gen_utils.h
index f13722e03d0..3ff1517b86c 100644
--- a/source/blender/python/api2_2x/gen_utils.h
+++ b/source/blender/python/api2_2x/gen_utils.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: gen_utils.h 11732 2007-08-20 10:08:59Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/logic.c b/source/blender/python/api2_2x/logic.c
index a09b7fa48e7..6e0813be8f3 100644
--- a/source/blender/python/api2_2x/logic.c
+++ b/source/blender/python/api2_2x/logic.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: logic.c 11123 2007-06-29 08:59:26Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/logic.h b/source/blender/python/api2_2x/logic.h
index 013c26af4f2..ea415d06a0a 100644
--- a/source/blender/python/api2_2x/logic.h
+++ b/source/blender/python/api2_2x/logic.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: logic.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/matrix.c b/source/blender/python/api2_2x/matrix.c
index fadadbb5c6a..d52318e93bf 100644
--- a/source/blender/python/api2_2x/matrix.c
+++ b/source/blender/python/api2_2x/matrix.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: matrix.c 11958 2007-09-07 07:55:36Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/matrix.h b/source/blender/python/api2_2x/matrix.h
index a2581ab009b..b830038bfcc 100644
--- a/source/blender/python/api2_2x/matrix.h
+++ b/source/blender/python/api2_2x/matrix.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: matrix.h 8363 2006-08-21 13:52:32Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/meshPrimitive.c b/source/blender/python/api2_2x/meshPrimitive.c
index 098d5f7d5f6..754f4986646 100644
--- a/source/blender/python/api2_2x/meshPrimitive.c
+++ b/source/blender/python/api2_2x/meshPrimitive.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: meshPrimitive.c 10773 2007-05-24 15:00:10Z khughes $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/meshPrimitive.h b/source/blender/python/api2_2x/meshPrimitive.h
index 1aa60c31eb4..e864ffd0d17 100644
--- a/source/blender/python/api2_2x/meshPrimitive.h
+++ b/source/blender/python/api2_2x/meshPrimitive.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: meshPrimitive.h 7512 2006-05-25 16:45:24Z khughes $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/modules.h b/source/blender/python/api2_2x/modules.h
index fd03469f772..81e138da798 100644
--- a/source/blender/python/api2_2x/modules.h
+++ b/source/blender/python/api2_2x/modules.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: modules.h 4803 2005-07-18 03:50:37Z ascotan $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/point.c b/source/blender/python/api2_2x/point.c
index 686a4529d9b..969fe2d53af 100644
--- a/source/blender/python/api2_2x/point.c
+++ b/source/blender/python/api2_2x/point.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: point.c 10782 2007-05-26 04:39:31Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/point.h b/source/blender/python/api2_2x/point.h
index 0ea8cb1fe6e..4ecceb64491 100644
--- a/source/blender/python/api2_2x/point.h
+++ b/source/blender/python/api2_2x/point.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: point.h 7266 2006-04-16 15:28:50Z stiv $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/quat.c b/source/blender/python/api2_2x/quat.c
index 3793db47686..a4a99c28d72 100644
--- a/source/blender/python/api2_2x/quat.c
+++ b/source/blender/python/api2_2x/quat.c
@@ -184,13 +184,13 @@ static PyObject *Quaternion_getattr(QuaternionObject * self, char *name)
}
if(STREQ(name, "angle")) {
mag = self->quat[0];
- mag = 2 * (acos(mag));
+ mag = 2 * (saacos(mag));
mag *= (180 / Py_PI);
return PyFloat_FromDouble(mag);
}
if(STREQ(name, "axis")) {
mag = self->quat[0] * (Py_PI / 180);
- mag = 2 * (acos(mag));
+ mag = 2 * (saacos(mag));
mag = sin(mag / 2);
for(x = 0; x < 3; x++) {
vec[x] = (float)(self->quat[x + 1] / mag);
diff --git a/source/blender/python/api2_2x/quat.h b/source/blender/python/api2_2x/quat.h
index 2e5f6788b2e..c66300de498 100644
--- a/source/blender/python/api2_2x/quat.h
+++ b/source/blender/python/api2_2x/quat.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: quat.h 8367 2006-08-22 09:13:44Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/rgbTuple.c b/source/blender/python/api2_2x/rgbTuple.c
index d8bfd930752..85fa26433fc 100644
--- a/source/blender/python/api2_2x/rgbTuple.c
+++ b/source/blender/python/api2_2x/rgbTuple.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: rgbTuple.c 11713 2007-08-19 19:06:42Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/rgbTuple.h b/source/blender/python/api2_2x/rgbTuple.h
index a1af0e27549..59c0f02643f 100644
--- a/source/blender/python/api2_2x/rgbTuple.h
+++ b/source/blender/python/api2_2x/rgbTuple.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: rgbTuple.h 5317 2005-09-21 19:48:40Z stiv $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/sceneRadio.c b/source/blender/python/api2_2x/sceneRadio.c
index ca76869a615..a39186b8e28 100644
--- a/source/blender/python/api2_2x/sceneRadio.c
+++ b/source/blender/python/api2_2x/sceneRadio.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: sceneRadio.c 10270 2007-03-15 01:47:53Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/sceneRadio.h b/source/blender/python/api2_2x/sceneRadio.h
index 9d7d43aed8b..98604d9afb2 100644
--- a/source/blender/python/api2_2x/sceneRadio.h
+++ b/source/blender/python/api2_2x/sceneRadio.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: sceneRadio.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c
index ba39e5e0f73..9b96d4aa12a 100644
--- a/source/blender/python/api2_2x/sceneRender.c
+++ b/source/blender/python/api2_2x/sceneRender.c
@@ -33,12 +33,16 @@ struct View3D; /* keep me up here */
#include "sceneRender.h" /*This must come first*/
+#include "MEM_guardedalloc.h"
+
#include "DNA_image_types.h"
+#include "DNA_node_types.h"
#include "BKE_image.h"
#include "BKE_global.h"
#include "BKE_screen.h"
#include "BKE_scene.h"
+#include "BKE_node.h"
#include "BIF_drawscene.h"
#include "BIF_renderwin.h"
@@ -52,8 +56,10 @@ struct View3D; /* keep me up here */
#include "butspace.h"
#include "blendef.h"
#include "gen_utils.h"
+#include "gen_library.h"
#include "Scene.h"
+#include "Group.h"
/* local defines */
#define PY_NONE 0
@@ -75,6 +81,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,
@@ -115,8 +122,6 @@ static PyObject *RenderData_SetRenderPath( BPy_RenderData *self,
PyObject *args );
static PyObject *RenderData_SetBackbufPath( BPy_RenderData *self,
PyObject *args );
-static PyObject *RenderData_SetFtypePath( BPy_RenderData *self,
- PyObject *args );
static PyObject *RenderData_SetOversamplingLevel( BPy_RenderData * self,
PyObject * args );
static PyObject *RenderData_SetRenderWinSize( BPy_RenderData * self,
@@ -285,7 +290,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 +299,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;
@@ -979,7 +986,6 @@ static int RenderData_setImageType( BPy_RenderData *self, PyObject *value )
case R_HAMX :
case R_IRIS :
case R_IRIZ :
- case R_FTYPE :
case R_TIFF :
case R_CINEON :
case R_DPX :
@@ -1057,20 +1063,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 +1088,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 +1747,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,10 +1759,73 @@ 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);
}
+
+/***************************************************************************/
+/* Render layer functions */
+/***************************************************************************/
+PyObject *RenderData_getRenderLayers(BPy_RenderData * self)
+{
+ PyObject *list, *layer;
+ SceneRenderLayer *srl;
+
+ list = PyList_New(0);
+
+ for(srl= self->renderContext->layers.first; srl; srl= srl->next) {
+ layer = RenderLayer_CreatePyObject( self->scene, srl );
+ PyList_Append(list, layer);
+ Py_DECREF(layer);
+ }
+ return list;
+}
+
+PyObject *RenderData_removeRenderLayer(BPy_RenderData * self, BPy_RenderLayer *value)
+{
+ int index;
+ if (!BPy_RenderLayer_Check(value))
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "can only remove a render layer" );
+
+ index = BLI_findindex(&self->renderContext->layers, value->renderLayer);
+
+ if (index == -1)
+ return EXPP_ReturnPyObjError( PyExc_ValueError,
+ "render layer is not in this scene" );
+
+ if (BLI_countlist(&self->renderContext->layers)<=1)
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "cannot remove the last render layer" );
+
+ BLI_remlink(&self->scene->r.layers, value->renderLayer);
+ MEM_freeN(value->renderLayer);
+ self->scene->r.actlay= 0;
+
+ if(self->scene->nodetree) {
+ bNode *node;
+ for(node= self->scene->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
+ if(node->custom1==index)
+ node->custom1= 0;
+ else if(node->custom1 > index)
+ node->custom1--;
+ }
+ }
+ }
+
+ value->renderLayer = NULL;
+ Py_RETURN_NONE;
+}
+
+PyObject *RenderData_addRenderLayer(BPy_RenderData * self ) {
+ scene_add_render_layer(self->scene);
+ return RenderLayer_CreatePyObject( self->scene, self->renderContext->layers.last );
+
+}
+
/***************************************************************************/
/* generic handlers for getting/setting attributes */
/***************************************************************************/
@@ -1762,6 +1845,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 +1876,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" );
@@ -1925,6 +2016,18 @@ static int RenderData_setIValueAttrClamp( BPy_RenderData *self, PyObject *value,
/* handlers for other getting/setting attributes */
/***************************************************************************/
+static PyObject *RenderData_getSubImTypeBits( BPy_RenderData *self, void* type )
+{
+ return EXPP_getBitfield( &self->renderContext->subimtype, (int)type, 'h' );
+}
+
+static int RenderData_setSubImTypeBits( BPy_RenderData* self, PyObject *value,
+ void* type )
+{
+ return EXPP_setBitfield( value, &self->renderContext->subimtype,
+ (int)type, 'h' );
+}
+
static PyObject *RenderData_getModeBit( BPy_RenderData *self, void* type )
{
return EXPP_getBitfield( &self->renderContext->mode,
@@ -2166,6 +2269,19 @@ static int RenderData_setRenderPath( BPy_RenderData * self, PyObject * value )
return 0;
}
+static PyObject *RenderData_getFrameFilename( BPy_RenderData * self, PyObject *args )
+{
+ char name[FILE_MAX];
+ int frame = self->renderContext->cfra;
+
+ if( !PyArg_ParseTuple( args, "|i", &( frame ) ) )
+ return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "expected int argument or nothing" ) );
+
+ BKE_makepicstring(name, self->renderContext->pic, frame, self->renderContext->imtype);
+ return PyString_FromString( name );
+}
+
PyObject *RenderData_getBackbufPath( BPy_RenderData * self )
{
return PyString_FromString( self->renderContext->backbuf );
@@ -2194,29 +2310,6 @@ static int RenderData_setBackbufPath( BPy_RenderData *self, PyObject *value )
return 0;
}
-PyObject *RenderData_getFtypePath( BPy_RenderData * self )
-{
- return PyString_FromString( self->renderContext->ftype );
-}
-
-static int RenderData_setFtypePath( BPy_RenderData *self, PyObject *value )
-{
- char *name;
-
- name = PyString_AsString( value );
- if( !name )
- return EXPP_ReturnIntError( PyExc_TypeError, "expected a string" );
-
- if( strlen( name ) >= sizeof(self->renderContext->ftype) )
- return EXPP_ReturnIntError( PyExc_ValueError,
- "ftype path is too long" );
-
- strcpy( self->renderContext->ftype, name );
- EXPP_allqueue( REDRAWBUTSSCENE, 0 );
-
- return 0;
-}
-
PyObject *RenderData_getRenderWinSize( BPy_RenderData * self )
{
return PyInt_FromLong( (long) self->renderContext->size );
@@ -2331,6 +2424,32 @@ static int RenderData_setThreads( BPy_RenderData *self, PyObject *value )
return 0;
}
+PyObject *RenderData_getActiveLayer( BPy_RenderData * self )
+{
+ return PyInt_FromLong( (long) self->renderContext->actlay );
+}
+
+static int RenderData_setActiveLayer( BPy_RenderData *self, PyObject *value )
+{
+ int layer;
+ short nr;
+ SceneRenderLayer *srl;
+
+ if( !PyInt_Check( value ) )
+ return EXPP_ReturnIntError( PyExc_TypeError, "active layer must be an int" );
+
+ layer = PyInt_AsLong( value );
+ for(nr=0, srl= self->renderContext->layers.first; srl; srl= srl->next, nr++) {
+ }
+ if(layer >= nr)
+ return EXPP_ReturnIntError( PyExc_ValueError, "value larger than number of render layers" );
+
+ self->renderContext->actlay = layer;
+ EXPP_allqueue(REDRAWBUTSSCENE, 0);
+ EXPP_allqueue(REDRAWNODE, 0);
+ return 0;
+}
+
/***************************************************************************/
/* BPy_RenderData attribute def */
/***************************************************************************/
@@ -2393,6 +2512,16 @@ static PyGetSetDef BPy_RenderData_getseters[] = {
(getter)RenderData_getModeBit, (setter)RenderData_setModeBit,
"Ray tracing enabled",
(void *)R_RAYTRACE},
+
+ {"touch",
+ (getter)RenderData_getModeBit, (setter)RenderData_setModeBit,
+ "Create an empry file with the frame name before rendering",
+ (void *)R_TOUCH},
+ {"noOverwrite",
+ (getter)RenderData_getModeBit, (setter)RenderData_setModeBit,
+ "Skip rendering existing image files",
+ (void *)R_NO_OVERWRITE},
+
/* R_GAUSS unused */
/* R_FBUF unused */
/* R_THREADS unused */
@@ -2455,10 +2584,6 @@ static PyGetSetDef BPy_RenderData_getseters[] = {
(getter)RenderData_getBackbufPath, (setter)RenderData_setBackbufPath,
"Path to a background image (setting loads image)",
NULL},
- {"ftypePath",
- (getter)RenderData_getFtypePath, (setter)RenderData_setFtypePath,
- "The path to Ftype file",
- NULL},
{"edgeColor",
(getter)RenderData_getEdgeColor, (setter)RenderData_setEdgeColor,
"RGB color triplet for edges in Toon shading",
@@ -2540,6 +2665,10 @@ static PyGetSetDef BPy_RenderData_getseters[] = {
(getter)RenderData_getIValueAttr, (setter)RenderData_setIValueAttrClamp,
"Frames per second",
(void *)EXPP_RENDER_ATTR_FPS},
+ {"fpsBase",
+ (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)",
@@ -2570,6 +2699,29 @@ static PyGetSetDef BPy_RenderData_getseters[] = {
"Scene link 'set' value",
NULL},
+ /* renderlayers */
+ {"activeLayer",
+ (getter)RenderData_getActiveLayer, (setter)RenderData_setActiveLayer,
+ "Active rendering layer",
+ NULL},
+ {"renderLayers",
+ (getter)RenderData_getRenderLayers, (setter)NULL,
+ "Active rendering layer",
+ NULL},
+
+ {"halfFloat",
+ (getter)RenderData_getSubImTypeBits, (setter)RenderData_setSubImTypeBits,
+ "'Half' openexr option enabled",
+ (void *)R_OPENEXR_HALF},
+ {"zbuf",
+ (getter)RenderData_getSubImTypeBits, (setter)RenderData_setSubImTypeBits,
+ "'ZBuf' openexr option enabled",
+ (void *)R_OPENEXR_ZBUF},
+ {"preview",
+ (getter)RenderData_getSubImTypeBits, (setter)RenderData_setSubImTypeBits,
+ "'preview' openexr option enabled",
+ (void *)R_PREVIEW_JPG},
+
{"yafrayGIMethod",
(getter)RenderData_getYafrayGIMethod, (setter)RenderData_setYafrayGIMethod,
"Global illumination method",
@@ -2660,6 +2812,9 @@ static PyMethodDef BPy_RenderData_methods[] = {
{"getRenderPath", ( PyCFunction ) RenderData_getRenderPath,
METH_NOARGS,
"() - get the path to directory where rendered images will go"},
+ {"getFrameFilename", ( PyCFunction ) RenderData_getFrameFilename,
+ METH_VARARGS,
+ "() - get the filename of the frame this will be rendered, taking into account extension and frame range"},
{"setBackbufPath", ( PyCFunction ) RenderData_SetBackbufPath,
METH_VARARGS,
"(string) - get/set the path to a background image and load it"},
@@ -2669,10 +2824,6 @@ static PyMethodDef BPy_RenderData_methods[] = {
{"enableBackbuf", ( PyCFunction ) RenderData_EnableBackbuf,
METH_VARARGS,
"(bool) - enable/disable the backbuf image"},
- {"setFtypePath", ( PyCFunction ) RenderData_SetFtypePath, METH_VARARGS,
- "(string) - get/set the path to output the Ftype file"},
- {"getFtypePath", ( PyCFunction ) RenderData_getFtypePath, METH_NOARGS,
- "() - get the path to Ftype file"},
{"enableExtensions", ( PyCFunction ) RenderData_EnableExtensions,
METH_VARARGS,
"(bool) - enable/disable windows extensions for output files"},
@@ -2882,6 +3033,11 @@ static PyMethodDef BPy_RenderData_methods[] = {
"(int) - get/set specify old map value in frames"},
{"newMapValue", ( PyCFunction ) RenderData_NewMapValue, METH_VARARGS,
"(int) - get/set specify new map value in frames"},
+ /* renderlayers */
+ {"addRenderLayer", ( PyCFunction ) RenderData_addRenderLayer, METH_VARARGS,
+ "(string) - add a new render layer"},
+ {"removeRenderLayer", ( PyCFunction ) RenderData_removeRenderLayer, METH_O,
+ "(renderLayer) - remove a render layer from this scene"},
{NULL, NULL, 0, NULL}
};
@@ -2968,6 +3124,470 @@ PyTypeObject RenderData_Type = {
NULL
};
+
+
+
+/* render layers */
+
+static PyObject *RenderLayer_repr( BPy_RenderLayer * self )
+{
+ if( self->renderLayer )
+ return PyString_FromFormat( "[RenderLayer \"%s\"]",
+ self->renderLayer->name );
+ else
+ return PyString_FromString( "NULL" );
+}
+
+static PyObject *RenderLayer_getName( BPy_RenderLayer * self )
+{
+ if( !self->renderLayer )
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ return PyString_FromString( self->renderLayer->name );
+}
+
+static int RenderLayer_setName( BPy_RenderLayer * self, PyObject *value )
+{
+ char *name = NULL;
+ int index = BLI_findindex(&self->scene->r.layers, self->renderLayer);
+
+ if( !self->renderLayer )
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ name = PyString_AsString ( value );
+ if( !name )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected string argument" );
+
+ /* No check for doubles? - blender dosnt so we dont have to! */
+ BLI_strncpy( self->renderLayer->name, name, sizeof( self->renderLayer->name ) );
+
+ if(self->scene->nodetree) {
+ bNode *node;
+ for(node= self->scene->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
+ if(node->custom1==index)
+ BLI_strncpy(node->name, self->renderLayer->name, NODE_MAXSTR);
+ }
+ }
+ }
+
+ return 0;
+}
+
+static PyObject *RenderLayer_getLightGroup( BPy_RenderLayer * self )
+{
+ if( !self->renderLayer )
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+ return Group_CreatePyObject( self->renderLayer->light_override );
+}
+static int RenderLayer_setLightGroup( BPy_RenderLayer * self, PyObject * value )
+{
+ if( !self->renderLayer )
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+ return GenericLib_assignData(value, (void **) &self->renderLayer->light_override, NULL, 1, ID_GR, 0);
+}
+
+
+/*****************************************************************************/
+/* Python BPy_Render getsetattr funcs: */
+/*****************************************************************************/
+static int RenderLayer_setLayers( BPy_RenderLayer * self, PyObject * value, void *zlay )
+{
+ unsigned int laymask = 0;
+
+ if( !self->renderLayer )
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ if( !PyInt_Check( value ) )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected an integer (bitmask) as argument" );
+
+ laymask = ( unsigned int )PyInt_AS_LONG( value );
+
+ if((laymask < 0) || (!zlay && laymask == 0))
+ return EXPP_ReturnIntError( PyExc_ValueError,
+ "layer value too low" );
+
+ if (zlay) {
+ self->renderLayer->lay_zmask= laymask & ((1<<20) - 1);
+ } else {
+ self->renderLayer->lay= laymask & ((1<<20) - 1);
+ }
+ return 0;
+}
+
+static PyObject *RenderLayer_getLayers( BPy_RenderLayer * self, void *zlay )
+{
+ if (zlay) {
+ return PyInt_FromLong( self->renderLayer->lay_zmask );
+ } else {
+ return PyInt_FromLong( self->renderLayer->lay );
+ }
+}
+
+static PyObject *RenderLayer_getLayflagBits( BPy_RenderLayer *self, void *type )
+{
+ int itype = (int)type;
+ if( !self->renderLayer )
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ /* use negative numbers to flip truth */
+ if (self->renderLayer->lay & itype) Py_RETURN_TRUE;
+ else Py_RETURN_FALSE;
+}
+
+static int RenderLayer_setLayflagBits( BPy_RenderLayer *self, PyObject *value,
+ void *type )
+{
+ /* use negative numbers to flip truth */
+ int param = PyObject_IsTrue( value );
+
+ if( !self->renderLayer )
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if (param) {
+ self->renderLayer->lay |= (int)type;
+ } else {
+ self->renderLayer->lay &= ~(int)type;
+ }
+ return 0;
+}
+
+static PyObject *RenderLayer_getPassBits( BPy_RenderLayer *self, void *type )
+{
+ int itype = (int)type;
+ if( !self->renderLayer )
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ /* use negative numbers to flip truth */
+ if (self->renderLayer->passflag & itype) Py_RETURN_TRUE;
+ else Py_RETURN_FALSE;
+}
+
+static int RenderLayer_setPassBits( BPy_RenderLayer *self, PyObject *value,
+ void *type )
+{
+ /* use negative numbers to flip truth */
+ int param = PyObject_IsTrue( value );
+
+ if( !self->renderLayer )
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if (param) {
+ self->renderLayer->passflag |= ((int)type);
+ } else {
+ self->renderLayer->passflag &= ~((int)type);
+ }
+ return 0;
+}
+
+static PyObject *RenderLayer_getPassXorBits( BPy_RenderLayer *self, void *type )
+{
+ if( !self->renderLayer )
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ /* use negative numbers to flip truth */
+ if (self->renderLayer->pass_xor & (int)type) Py_RETURN_TRUE;
+ else Py_RETURN_FALSE;
+}
+
+static int RenderLayer_setPassXorBits( BPy_RenderLayer *self, PyObject *value,
+ void *type )
+{
+ int param = PyObject_IsTrue( value );
+
+ if( !self->renderLayer )
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This render layer has been removed!" );
+
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if (param) {
+ self->renderLayer->passflag |= (int)type;
+ } else {
+ self->renderLayer->passflag &= ~(int)type;
+ }
+ return 0;
+}
+
+/***************************************************************************/
+/* BPy_RenderData attribute def */
+/***************************************************************************/
+static PyGetSetDef BPy_RenderLayer_getseters[] = {
+ {"name",
+ (getter)RenderLayer_getName, (setter)RenderLayer_setName,
+ "",
+ (void *)NULL},
+ {"lightGroup",
+ (getter)RenderLayer_getLightGroup, (setter)RenderLayer_setLightGroup,
+ "",
+ (void *)NULL},
+ /*{"material",
+ (getter)RenderLayer_getMaterial, (setter)RenderLayer_setMaterial,
+ "",
+ (void *)NULL},*/
+ {"enable",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "enable this render layer",
+ (void *)SCE_LAY_DISABLE},
+ {"enableZMask",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Only render what's in front of the solid z values",
+ (void *)SCE_LAY_ZMASK},
+ {"enableZMaskAll",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Fill in Z values for solid faces in invisible layers, for masking",
+ (void *)SCE_LAY_ALL_Z},
+
+ {"enableSolid",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Render Solid faces in this Layer",
+ (void *)SCE_LAY_SOLID},
+ {"enableZTra",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Render Z-Transparent faces in this Layer (On top of Solid and Halos)",
+ (void *)SCE_LAY_ZTRA},
+ {"enableHalo",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Render Halos in this Layer (on top of Solid)",
+ (void *)SCE_LAY_HALO},
+ {"enableEdge",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Render Edge-enhance in this Layer (only works for Solid faces)",
+ (void *)SCE_LAY_EDGE},
+ {"enableSky",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Render Sky or backbuffer in this Layer",
+ (void *)SCE_LAY_SKY},
+ {"enableStrand",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Render Strands in this Layer",
+ (void *)SCE_LAY_STRAND},
+
+ {"layerMask",
+ (getter)RenderLayer_getLayers, (setter)RenderLayer_setLayers,
+ "",
+ (void *)0},
+ {"zLayerMask",
+ (getter)RenderLayer_getLayers, (setter)RenderLayer_setLayers,
+ "",
+ (void *)1},
+
+ /* passes */
+ {"passCombined",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver full combined RGBA buffer",
+ (void *)SCE_PASS_COMBINED},
+ {"passZ",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Z values pass",
+ (void *)SCE_PASS_Z},
+ {"passSpeed",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Speed Vector pass",
+ (void *)SCE_PASS_VECTOR},
+ {"passNormal",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Normal pass",
+ (void *)SCE_PASS_NORMAL},
+ {"passUV",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Texture UV pass",
+ (void *)SCE_PASS_UV},
+ {"passMist",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Mist factor pass (0-1)",
+ (void *)SCE_PASS_MIST},
+ {"passIndex",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Object Index pass",
+ (void *)SCE_PASS_INDEXOB},
+ {"passColor",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver shade-less Color pass",
+ (void *)SCE_PASS_RGBA},
+ {"passDiffuse",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Diffuse pass",
+ (void *)SCE_PASS_DIFFUSE},
+ {"passSpecular",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Specular pass",
+ (void *)SCE_PASS_SPEC},
+ {"passShadow",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Shadow pass",
+ (void *)SCE_PASS_SHADOW},
+ {"passAO",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver AO pass",
+ (void *)SCE_PASS_AO},
+ {"passReflect",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Raytraced Reflection pass",
+ (void *)SCE_PASS_REFLECT},
+ {"passRefract",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Raytraced Reflection pass",
+ (void *)SCE_PASS_REFRACT},
+ {"passRadiosiy",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Radiosity pass",
+ (void *)SCE_PASS_RADIO},
+
+ /* xor */
+ {"passSpecularXOR",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Specular pass XOR",
+ (void *)SCE_PASS_SPEC},
+ {"passShadowXOR",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver Shadow pass XOR",
+ (void *)SCE_PASS_SHADOW},
+ {"passAOXOR",
+ (getter)RenderLayer_getPassBits, (setter)RenderLayer_setPassBits,
+ "Deliver AO pass XOR",
+ (void *)SCE_PASS_AO},
+ {"passRefractXOR",
+ (getter)RenderLayer_getPassXorBits, (setter)RenderLayer_setPassXorBits,
+ "Deliver Raytraced Reflection pass XOR",
+ (void *)SCE_PASS_REFRACT},
+ {"passRadiosiyXOR",
+ (getter)RenderLayer_getPassXorBits, (setter)RenderLayer_setPassXorBits,
+ "Deliver Radiosity pass XOR",
+ (void *)SCE_PASS_RADIO},
+
+ {NULL,NULL,NULL,NULL,NULL}
+};
+
+/* no methods */
+
+/*------------------------------------BPy_RenderData Type defintion------ */
+PyTypeObject RenderLayer_Type = {
+ PyObject_HEAD_INIT( NULL ) /* required py macro */
+ 0, /* ob_size */
+ /* For printing, in format "<module>.<name>" */
+ "Blender RenderLayer", /* char *tp_name; */
+ sizeof( BPy_RenderLayer ), /* int tp_basicsize; */
+ 0, /* tp_itemsize; For allocation */
+
+ /* Methods to implement standard operations */
+
+ NULL, /* destructor tp_dealloc; */
+ NULL, /* printfunc tp_print; */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* cmpfunc tp_compare; */
+ ( reprfunc ) RenderLayer_repr, /* reprfunc tp_repr; */
+
+ /* Method suites for standard classes */
+
+ NULL, /* PyNumberMethods *tp_as_number; */
+ NULL, /* PySequenceMethods *tp_as_sequence; */
+ NULL, /* PyMappingMethods *tp_as_mapping; */
+
+ /* More standard operations (here for binary compatibility) */
+
+ NULL, /* hashfunc tp_hash; */
+ NULL, /* ternaryfunc tp_call; */
+ NULL, /* reprfunc tp_str; */
+ NULL, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
+
+ /* Functions to access object as input/output buffer */
+ NULL, /* PyBufferProcs *tp_as_buffer; */
+
+ /*** Flags to define presence of optional/expanded features ***/
+ Py_TPFLAGS_DEFAULT, /* long tp_flags; */
+
+ NULL, /* char *tp_doc; Documentation string */
+ /*** Assigned meaning in release 2.0 ***/
+ /* call function for all accessible objects */
+ NULL, /* traverseproc tp_traverse; */
+
+ /* delete references to contained objects */
+ NULL, /* inquiry tp_clear; */
+
+ /*** Assigned meaning in release 2.1 ***/
+ /*** rich comparisons ***/
+ NULL, /* richcmpfunc tp_richcompare; */
+
+ /*** weak reference enabler ***/
+ 0, /* long tp_weaklistoffset; */
+
+ /*** Added in release 2.2 ***/
+ /* Iterators */
+ NULL, /* getiterfunc tp_iter; */
+ NULL, /* iternextfunc tp_iternext; */
+
+ /*** Attribute descriptor and subclassing stuff ***/
+ NULL, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMemberDef *tp_members; */
+ BPy_RenderLayer_getseters, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct _typeobject *tp_base; */
+ NULL, /* PyObject *tp_dict; */
+ NULL, /* descrgetfunc tp_descr_get; */
+ NULL, /* descrsetfunc tp_descr_set; */
+ 0, /* long tp_dictoffset; */
+ NULL, /* initproc tp_init; */
+ NULL, /* allocfunc tp_alloc; */
+ NULL, /* newfunc tp_new; */
+ /* Low-level free-memory routine */
+ NULL, /* freefunc tp_free; */
+ /* For PyObject_IS_GC */
+ NULL, /* inquiry tp_is_gc; */
+ NULL, /* PyObject *tp_bases; */
+ /* method resolution order */
+ NULL, /* PyObject *tp_mro; */
+ NULL, /* PyObject *tp_cache; */
+ NULL, /* PyObject *tp_subclasses; */
+ NULL, /* PyObject *tp_weaklist; */
+ NULL
+};
+
+/***************************************************************************/
+/* BPy_RenderData Callbacks */
+/***************************************************************************/
+
+PyObject *RenderLayer_CreatePyObject( struct Scene * scene, struct SceneRenderLayer * renderLayer )
+{
+ BPy_RenderLayer *py_renderlayer;
+
+ py_renderlayer =
+ ( BPy_RenderLayer * ) PyObject_NEW( BPy_RenderLayer,
+ &RenderLayer_Type );
+
+ if( py_renderlayer == NULL ) {
+ return ( NULL );
+ }
+ py_renderlayer->renderLayer = renderLayer;
+ py_renderlayer->scene = scene;
+
+ return ( ( PyObject * ) py_renderlayer );
+}
+
+
/***************************************************************************/
/* Render method def */
/***************************************************************************/
@@ -3052,6 +3672,9 @@ PyObject *Render_Init( void )
if( PyType_Ready( &RenderData_Type ) < 0 )
return NULL;
+ if( PyType_Ready( &RenderLayer_Type ) < 0 )
+ return NULL;
+
submodule = Py_InitModule3( "Blender.Scene.Render",
M_Render_methods, M_Render_doc );
@@ -3079,7 +3702,6 @@ PyObject *Render_Init( void )
PyModule_AddIntConstant( submodule, "HAMX", R_HAMX );
PyModule_AddIntConstant( submodule, "IRIS", R_IRIS );
PyModule_AddIntConstant( submodule, "IRISZ", R_IRIZ );
- PyModule_AddIntConstant( submodule, "FTYPE", R_FTYPE );
PyModule_AddIntConstant( submodule, "PAL", B_PR_PAL );
PyModule_AddIntConstant( submodule, "NTSC", B_PR_NTSC );
PyModule_AddIntConstant( submodule, "DEFAULT", B_PR_PRESET );
@@ -3143,13 +3765,6 @@ static PyObject *RenderData_SetBackbufPath( BPy_RenderData *self,
(setter)RenderData_setBackbufPath );
}
-static PyObject *RenderData_SetFtypePath( BPy_RenderData *self,
- PyObject *args )
-{
- return EXPP_setterWrapperTuple( (void *)self, args,
- (setter)RenderData_setFtypePath );
-}
-
static PyObject *RenderData_SetOversamplingLevel( BPy_RenderData * self,
PyObject * args )
{
diff --git a/source/blender/python/api2_2x/sceneRender.h b/source/blender/python/api2_2x/sceneRender.h
index 73bf71f5c06..1200bb87af2 100644
--- a/source/blender/python/api2_2x/sceneRender.h
+++ b/source/blender/python/api2_2x/sceneRender.h
@@ -36,17 +36,27 @@
#include <Python.h>
#include "DNA_scene_types.h"
+PyTypeObject RenderLayer_Type;
+
#define BPy_RenderData_Check(v) ((v)->ob_type == &RenderData_Type)
+#define BPy_RenderLayer_Check(v) ((v)->ob_type == &RenderLayer_Type)
//------------------------------------Struct definitions-------
typedef struct {
PyObject_HEAD
struct RenderData *renderContext;
- Scene *scene;
+ struct Scene *scene;
} BPy_RenderData;
+
+typedef struct {
+ PyObject_HEAD
+ struct SceneRenderLayer *renderLayer; /* this is totally weak, pointer can become invalid */
+ struct Scene *scene;
+} BPy_RenderLayer;
+
//------------------------------------Visible prototypes-------
PyObject *Render_Init( void );
PyObject *RenderData_CreatePyObject( struct Scene *scene );
-
+PyObject *RenderLayer_CreatePyObject( struct Scene *scene, struct SceneRenderLayer * renderLayer );
#endif /* EXPP_SCENERENDER_H */
diff --git a/source/blender/python/api2_2x/sceneSequence.c b/source/blender/python/api2_2x/sceneSequence.c
index 9d3d4eb5508..86e36655c28 100644
--- a/source/blender/python/api2_2x/sceneSequence.c
+++ b/source/blender/python/api2_2x/sceneSequence.c
@@ -156,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++;
}
@@ -169,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;
@@ -179,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 */
@@ -205,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 );
@@ -540,7 +531,46 @@ static PyObject *Sequence_getImages( BPy_Sequence * self )
return ret;
}
-
+static int Sequence_setImages( BPy_Sequence * self, PyObject *value )
+{
+ Strip *strip;
+ StripElem *se;
+ int i;
+ PyObject *list;
+ char *basepath, *name;
+
+ if (self->seq->type != SEQ_IMAGE) {
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "Sequence is not an image type" );
+ }
+
+ if( !PyArg_ParseTuple
+ ( value, "sO!", &basepath, &PyList_Type, &list ) )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected string and optional list argument" );
+
+ strip = self->seq->strip;
+ se = strip->stripdata;
+
+ /* for now dont support different image list sizes */
+ if (PyList_Size(list) != strip->len) {
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "at the moment only image lista with the same number of images as the strip are supported" );
+ }
+
+ strncpy(strip->dir, basepath, sizeof(strip->dir));
+
+ for (i=0; i<strip->len; i++, se++) {
+ name = PyString_AsString(PyList_GetItem(list, i));
+ if (name) {
+ strncpy(se->name, name, sizeof(se->name));
+ } else {
+ PyErr_Clear();
+ }
+ }
+
+ return 0;
+}
/*
* get floating point attributes
@@ -578,7 +608,7 @@ static PyObject *getIntAttr( BPy_Sequence *self, void *type )
break;
default:
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "undefined type in getFloatAttr" );
+ "undefined type in getIntAttr" );
}
return PyInt_FromLong( param );
@@ -733,7 +763,7 @@ static PyGetSetDef BPy_Sequence_getseters[] = {
"Sequence name",
NULL},
{"images",
- (getter)Sequence_getImages, (setter)NULL,
+ (getter)Sequence_getImages, (setter)Sequence_setImages,
"Sequence scene",
NULL},
diff --git a/source/blender/python/api2_2x/sceneSequence.h b/source/blender/python/api2_2x/sceneSequence.h
index 952e861f46d..2d8431fae80 100644
--- a/source/blender/python/api2_2x/sceneSequence.h
+++ b/source/blender/python/api2_2x/sceneSequence.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: sceneSequence.h 11400 2007-07-28 09:26:53Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/sceneTimeLine.c b/source/blender/python/api2_2x/sceneTimeLine.c
index ab74115574e..9feba1eb462 100644
--- a/source/blender/python/api2_2x/sceneTimeLine.c
+++ b/source/blender/python/api2_2x/sceneTimeLine.c
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: sceneTimeLine.c 10778 2007-05-25 16:43:25Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/sceneTimeLine.h b/source/blender/python/api2_2x/sceneTimeLine.h
index ffeff1ef3b7..0a3aa62b571 100644
--- a/source/blender/python/api2_2x/sceneTimeLine.h
+++ b/source/blender/python/api2_2x/sceneTimeLine.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: sceneTimeLine.h 10269 2007-03-15 01:09:14Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/vector.c b/source/blender/python/api2_2x/vector.c
index 2e13122f09f..45ad36d0093 100644
--- a/source/blender/python/api2_2x/vector.c
+++ b/source/blender/python/api2_2x/vector.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: vector.c 12314 2007-10-20 20:24:09Z campbellbarton $
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/python/api2_2x/vector.h b/source/blender/python/api2_2x/vector.h
index 3f58d9fa6d5..040f1ba5594 100644
--- a/source/blender/python/api2_2x/vector.h
+++ b/source/blender/python/api2_2x/vector.h
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: vector.h 10313 2007-03-20 12:07:02Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/windowTheme.c b/source/blender/python/api2_2x/windowTheme.c
index 6a27d59436e..98894c9a0ec 100644
--- a/source/blender/python/api2_2x/windowTheme.c
+++ b/source/blender/python/api2_2x/windowTheme.c
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: windowTheme.c 12139 2007-09-25 03:31:12Z campbellbarton $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
diff --git a/source/blender/python/api2_2x/windowTheme.h b/source/blender/python/api2_2x/windowTheme.h
index 761d509724d..45900830706 100644
--- a/source/blender/python/api2_2x/windowTheme.h
+++ b/source/blender/python/api2_2x/windowTheme.h
@@ -1,5 +1,5 @@
/*
- * $Id$
+ * $Id: windowTheme.h 8774 2006-11-07 11:24:11Z jesterking $
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
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/radiosity/intern/source/radfactors.c b/source/blender/radiosity/intern/source/radfactors.c
index 46fb6b2c910..d2d1b581ae8 100644
--- a/source/blender/radiosity/intern/source/radfactors.c
+++ b/source/blender/radiosity/intern/source/radfactors.c
@@ -744,11 +744,9 @@ void subdivideshootElements(int it)
}
}
if(rn) {
- min[0]= min[1]= min[2]= 1.0e10;
- max[0]= max[1]= max[2]= -1.0e10;
+ INIT_MINMAX(min, max);
/* errmin and max are the filtered colors */
- errmin[0]= errmin[1]= errmin[2]= 1.0e10;
- errmax[0]= errmax[1]= errmax[2]= -1.0e10;
+ INIT_MINMAX(errmin, errmax);
minmaxradelemfilt(rp->first, min, max, errmin, errmax);
/* if small difference between colors: no subdiv */
@@ -912,8 +910,8 @@ void inithemiwindows()
memset(vw, 0, sizeof(RadView));
vw->rectx= RG.hemires;
vw->recty= RG.hemires;
- vw->rectz= MEM_mallocN(4*vw->rectx*vw->recty, "initwindows");
- vw->rect= MEM_mallocN(4*vw->rectx*vw->recty, "initwindows");
+ vw->rectz= MEM_mallocN(sizeof(int)*vw->rectx*vw->recty, "initwindows");
+ vw->rect= MEM_mallocN(sizeof(int)*vw->rectx*vw->recty, "initwindows");
vw->mynear= RG.maxsize/2000.0;
vw->myfar= 2.0*RG.maxsize;
vw->wx1= -vw->mynear;
diff --git a/source/blender/radiosity/intern/source/radrender.c b/source/blender/radiosity/intern/source/radrender.c
index 42c7fa58da5..52e2b46d506 100644
--- a/source/blender/radiosity/intern/source/radrender.c
+++ b/source/blender/radiosity/intern/source/radrender.c
@@ -84,60 +84,69 @@ static float maxenergy;
/* find the face with maximum energy to become shooter */
/* nb: _rr means rad-render version of existing radio call */
-static VlakRen *findshoot_rr(Render *re)
+static void findshoot_rr(Render *re, VlakRen **shoot_p, RadFace **shootrf_p)
{
- RadFace *rf;
+ RadFace *rf, *shootrf, **radface;
+ ObjectRen *obr;
VlakRen *vlr=NULL, *shoot;
float energy;
int a;
shoot= NULL;
+ shootrf= NULL;
maxenergy= 0.0;
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
- if(vlr->radface) {
- rf= vlr->radface;
- rf->flag &= ~RAD_SHOOT;
-
- energy= rf->unshot[0]*rf->area;
- energy+= rf->unshot[1]*rf->area;
- energy+= rf->unshot[2]*rf->area;
-
- if(energy>maxenergy) {
- shoot= vlr;
- maxenergy= energy;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
+ if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+ rf= *radface;
+ rf->flag &= ~RAD_SHOOT;
+
+ energy= rf->unshot[0]*rf->area;
+ energy+= rf->unshot[1]*rf->area;
+ energy+= rf->unshot[2]*rf->area;
+
+ if(energy>maxenergy) {
+ shoot= vlr;
+ shootrf= rf;
+ maxenergy= energy;
+ }
}
}
}
- if(shoot) {
+ if(shootrf) {
maxenergy/= RG.totenergy;
- if(maxenergy<RG.convergence) return NULL;
- shoot->radface->flag |= RAD_SHOOT;
+ if(maxenergy<RG.convergence) {
+ *shoot_p= NULL;
+ *shootrf_p= NULL;
+ }
+ shootrf->flag |= RAD_SHOOT;
}
- return shoot;
+ *shoot_p= shoot;
+ *shootrf_p= shootrf;
}
-static void backface_test_rr(Render *re, VlakRen *shoot)
+static void backface_test_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
{
+ ObjectRen *obr;
VlakRen *vlr=NULL;
- RadFace *rf;
+ RadFace *rf, **radface;
float tvec[3];
int a;
/* backface testing */
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
- if(vlr->radface) {
- if(vlr!=shoot) {
- rf= vlr->radface;
- VecSubf(tvec, shoot->radface->cent, rf->cent);
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
+ if(vlr != shoot && (radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+ rf= *radface;
+ VecSubf(tvec, shootrf->cent, rf->cent);
- if( tvec[0]*rf->norm[0]+ tvec[1]*rf->norm[1]+ tvec[2]*rf->norm[2] < 0.0) {
+ if(tvec[0]*rf->norm[0]+ tvec[1]*rf->norm[1]+ tvec[2]*rf->norm[2] < 0.0)
rf->flag |= RAD_BACKFACE;
- }
}
}
}
@@ -145,17 +154,20 @@ static void backface_test_rr(Render *re, VlakRen *shoot)
static void clear_backface_test_rr(Render *re)
{
+ ObjectRen *obr;
VlakRen *vlr=NULL;
- RadFace *rf;
+ RadFace *rf, **radface;
int a;
/* backface flag clear */
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
-
- if(vlr->radface) {
- rf= vlr->radface;
- rf->flag &= ~RAD_BACKFACE;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
+
+ if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+ rf= *radface;
+ rf->flag &= ~RAD_BACKFACE;
+ }
}
}
}
@@ -163,10 +175,11 @@ static void clear_backface_test_rr(Render *re)
extern RadView hemitop, hemiside; // radfactors.c
/* hemi-zbuffering, delivers formfactors array */
-static void makeformfactors_rr(Render *re, VlakRen *shoot)
+static void makeformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
{
+ ObjectRen *obr;
VlakRen *vlr=NULL;
- RadFace *rf;
+ RadFace *rf, **radface;
float len, vec[3], up[3], side[3], tar[5][3], *fp;
int a;
@@ -175,25 +188,25 @@ static void makeformfactors_rr(Render *re, VlakRen *shoot)
/* set up hemiview */
/* first: upvector for hemitop, we use diagonal hemicubes to prevent aliasing */
- VecSubf(vec, shoot->v1->co, shoot->radface->cent);
- Crossf(up, shoot->radface->norm, vec);
+ VecSubf(vec, shoot->v1->co, shootrf->cent);
+ Crossf(up, shootrf->norm, vec);
len= Normalize(up);
VECCOPY(hemitop.up, up);
- VECCOPY(hemiside.up, shoot->radface->norm);
+ VECCOPY(hemiside.up, shootrf->norm);
- Crossf(side, shoot->radface->norm, up);
+ Crossf(side, shootrf->norm, up);
/* five targets */
- VecAddf(tar[0], shoot->radface->cent, shoot->radface->norm);
- VecAddf(tar[1], shoot->radface->cent, up);
- VecSubf(tar[2], shoot->radface->cent, up);
- VecAddf(tar[3], shoot->radface->cent, side);
- VecSubf(tar[4], shoot->radface->cent, side);
+ VecAddf(tar[0], shootrf->cent, shootrf->norm);
+ VecAddf(tar[1], shootrf->cent, up);
+ VecSubf(tar[2], shootrf->cent, up);
+ VecAddf(tar[3], shootrf->cent, side);
+ VecSubf(tar[4], shootrf->cent, side);
/* camera */
- VECCOPY(hemiside.cam, shoot->radface->cent);
- VECCOPY(hemitop.cam, shoot->radface->cent);
+ VECCOPY(hemiside.cam, shootrf->cent);
+ VECCOPY(hemitop.cam, shootrf->cent);
/* do it! */
VECCOPY(hemitop.tar, tar[0]);
@@ -207,62 +220,67 @@ static void makeformfactors_rr(Render *re, VlakRen *shoot)
/* convert factors to real radiosity */
fp= RG.formfactors;
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
-
- if(vlr->radface) {
- rf= vlr->radface;
- if(*fp!=0.0 && rf->area!=0.0) {
- *fp *= shoot->radface->area/rf->area;
- if(*fp>1.0) *fp= 1.0001;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
+
+ if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+ rf= *radface;
+ if(*fp!=0.0 && rf->area!=0.0) {
+ *fp *= shootrf->area/rf->area;
+ if(*fp>1.0) *fp= 1.0001;
+ }
+ fp++;
}
- fp++;
}
}
}
/* based at RG.formfactors array, distribute shoot energy over other faces */
-static void applyformfactors_rr(Render *re, VlakRen *shoot)
+static void applyformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
{
+ ObjectRen *obr;
VlakRen *vlr=NULL;
- RadFace *rf;
+ RadFace *rf, **radface;
float *fp, *ref, unr, ung, unb, r, g, b;
int a;
- unr= shoot->radface->unshot[0];
- ung= shoot->radface->unshot[1];
- unb= shoot->radface->unshot[2];
+ unr= shootrf->unshot[0];
+ ung= shootrf->unshot[1];
+ unb= shootrf->unshot[2];
fp= RG.formfactors;
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
-
- if(vlr->radface) {
- rf= vlr->radface;
- if(*fp!= 0.0) {
-
- ref= &(vlr->mat->r);
-
- r= (*fp)*unr*ref[0];
- g= (*fp)*ung*ref[1];
- b= (*fp)*unb*ref[2];
-
- // if(rf->flag & RAD_BACKFACE) {
-
- rf->totrad[0]+= r;
- rf->totrad[1]+= g;
- rf->totrad[2]+= b;
-
- rf->unshot[0]+= r;
- rf->unshot[1]+= g;
- rf->unshot[2]+= b;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
+
+ if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+ rf= *radface;
+ if(*fp!= 0.0) {
+
+ ref= &(vlr->mat->r);
+
+ r= (*fp)*unr*ref[0];
+ g= (*fp)*ung*ref[1];
+ b= (*fp)*unb*ref[2];
+
+ // if(rf->flag & RAD_BACKFACE) {
+
+ rf->totrad[0]+= r;
+ rf->totrad[1]+= g;
+ rf->totrad[2]+= b;
+
+ rf->unshot[0]+= r;
+ rf->unshot[1]+= g;
+ rf->unshot[2]+= b;
+ }
+ fp++;
}
- fp++;
}
}
/* shoot energy has been shot */
- shoot->radface->unshot[0]= shoot->radface->unshot[1]= shoot->radface->unshot[2]= 0.0;
+ shootrf->unshot[0]= shootrf->unshot[1]= shootrf->unshot[2]= 0.0;
}
@@ -270,29 +288,30 @@ static void applyformfactors_rr(Render *re, VlakRen *shoot)
static void progressiverad_rr(Render *re)
{
VlakRen *shoot;
+ RadFace *shootrf;
float unshot[3];
int it= 0;
- shoot= findshoot_rr(re);
+ findshoot_rr(re, &shoot, &shootrf);
while( shoot ) {
/* backfaces receive no energy, but are zbuffered... */
- backface_test_rr(re, shoot);
+ backface_test_rr(re, shoot, shootrf);
/* ...unless it's two sided */
- if(shoot->radface->flag & RAD_TWOSIDED) {
- VECCOPY(unshot, shoot->radface->unshot);
- VecMulf(shoot->radface->norm, -1.0);
- makeformfactors_rr(re, shoot);
- applyformfactors_rr(re, shoot);
- VecMulf(shoot->radface->norm, -1.0);
- VECCOPY(shoot->radface->unshot, unshot);
+ if(shootrf->flag & RAD_TWOSIDED) {
+ VECCOPY(unshot, shootrf->unshot);
+ VecMulf(shootrf->norm, -1.0);
+ makeformfactors_rr(re, shoot, shootrf);
+ applyformfactors_rr(re, shoot, shootrf);
+ VecMulf(shootrf->norm, -1.0);
+ VECCOPY(shootrf->unshot, unshot);
}
/* hemi-zbuffers */
- makeformfactors_rr(re, shoot);
+ makeformfactors_rr(re, shoot, shootrf);
/* based at RG.formfactors array, distribute shoot energy over other faces */
- applyformfactors_rr(re, shoot);
+ applyformfactors_rr(re, shoot, shootrf);
it++;
re->timecursor(it);
@@ -302,7 +321,7 @@ static void progressiverad_rr(Render *re)
if(re->test_break()) break;
if(RG.maxiter && RG.maxiter<=it) break;
- shoot= findshoot_rr(re);
+ findshoot_rr(re, &shoot, &shootrf);
}
printf(" Unshot energy:%f\n", 1000.0*maxenergy);
@@ -313,8 +332,9 @@ static RadFace *radfaces=NULL;
static void initradfaces(Render *re)
{
+ ObjectRen *obr;
VlakRen *vlr= NULL;
- RadFace *rf;
+ RadFace *rf, **radface;
int a, b;
/* globals */
@@ -326,58 +346,63 @@ static void initradfaces(Render *re)
RG.max[0]= RG.max[1]= RG.max[2]= -1.0e20;
/* count first for fast malloc */
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
-
- if(vlr->mat->mode & MA_RADIO) {
- if(vlr->mat->emit > 0.0) {
- RG.totpatch++;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
+
+ if(vlr->mat->mode & MA_RADIO) {
+ if(vlr->mat->emit > 0.0) {
+ RG.totpatch++;
+ }
+ RG.totelem++;
}
- RG.totelem++;
}
}
-
+
printf(" Rad elems: %d emittors %d\n", RG.totelem, RG.totpatch);
if(RG.totelem==0 || RG.totpatch==0) return;
/* make/init radfaces */
rf=radfaces= MEM_callocN(RG.totelem*sizeof(RadFace), "radfaces");
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
-
- if(vlr->mat->mode & MA_RADIO) {
-
- /* during render, vlr->n gets flipped/corrected, we cannot have that */
- if(vlr->v4) CalcNormFloat4(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co, rf->norm);
- else CalcNormFloat(vlr->v1->co, vlr->v2->co, vlr->v3->co, rf->norm);
-
- rf->totrad[0]= vlr->mat->emit*vlr->mat->r;
- rf->totrad[1]= vlr->mat->emit*vlr->mat->g;
- rf->totrad[2]= vlr->mat->emit*vlr->mat->b;
- VECCOPY(rf->unshot, rf->totrad);
-
- if(vlr->v4) {
- rf->area= AreaQ3Dfl(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co);
- CalcCent4f(rf->cent, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co);
- }
- else {
- rf->area= AreaT3Dfl(vlr->v1->co, vlr->v2->co, vlr->v3->co);
- CalcCent3f(rf->cent, vlr->v1->co, vlr->v2->co, vlr->v3->co);
- }
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
- RG.totenergy+= rf->unshot[0]*rf->area;
- RG.totenergy+= rf->unshot[1]*rf->area;
- RG.totenergy+= rf->unshot[2]*rf->area;
-
- for(b=0; b<3; b++) {
- RG.min[b]= MIN2(RG.min[b], rf->cent[b]);
- RG.max[b]= MAX2(RG.max[b], rf->cent[b]);
- }
+ if(vlr->mat->mode & MA_RADIO) {
+
+ /* during render, vlr->n gets flipped/corrected, we cannot have that */
+ if(vlr->v4) CalcNormFloat4(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co, rf->norm);
+ else CalcNormFloat(vlr->v1->co, vlr->v2->co, vlr->v3->co, rf->norm);
+
+ rf->totrad[0]= vlr->mat->emit*vlr->mat->r;
+ rf->totrad[1]= vlr->mat->emit*vlr->mat->g;
+ rf->totrad[2]= vlr->mat->emit*vlr->mat->b;
+ VECCOPY(rf->unshot, rf->totrad);
+
+ if(vlr->v4) {
+ rf->area= AreaQ3Dfl(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co);
+ CalcCent4f(rf->cent, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co);
+ }
+ else {
+ rf->area= AreaT3Dfl(vlr->v1->co, vlr->v2->co, vlr->v3->co);
+ CalcCent3f(rf->cent, vlr->v1->co, vlr->v2->co, vlr->v3->co);
+ }
+
+ RG.totenergy+= rf->unshot[0]*rf->area;
+ RG.totenergy+= rf->unshot[1]*rf->area;
+ RG.totenergy+= rf->unshot[2]*rf->area;
+
+ for(b=0; b<3; b++) {
+ RG.min[b]= MIN2(RG.min[b], rf->cent[b]);
+ RG.max[b]= MAX2(RG.max[b], rf->cent[b]);
+ }
-// uncommented; this isnt satisfying, but i leave it in the code for now (ton)
-// if(vlr->mat->translucency!=0.0) rf->flag |= RAD_TWOSIDED;
-
- vlr->radface= rf++;
+ // uncommented; this isnt satisfying, but i leave it in the code for now (ton)
+ // if(vlr->mat->translucency!=0.0) rf->flag |= RAD_TWOSIDED;
+
+ radface=RE_vlakren_get_radface(obr, vlr, 1);
+ *radface= rf++;
+ }
}
}
RG.size[0]= (RG.max[0]- RG.min[0]);
@@ -408,9 +433,10 @@ static void vecaddfac(float *vec, float *v1, float *v2, float fac)
static void make_vertex_rad_values(Render *re)
{
+ ObjectRen *obr;
VertRen *v1=NULL;
VlakRen *vlr=NULL;
- RadFace *rf;
+ RadFace *rf, **radface;
float *col;
int a;
@@ -418,54 +444,55 @@ static void make_vertex_rad_values(Render *re)
RG.radfactor= RG.radfac*pow(64*64, RG.igamma)/128.0; /* compatible with radio-tool */
/* accumulate vertexcolors */
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
-
- if(vlr->radface) {
- rf= vlr->radface;
-
- /* apply correction */
- rf->totrad[0]= RG.radfactor*pow( rf->totrad[0], RG.igamma);
- rf->totrad[1]= RG.radfactor*pow( rf->totrad[1], RG.igamma);
- rf->totrad[2]= RG.radfactor*pow( rf->totrad[2], RG.igamma);
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
- /* correct rf->rad values for color */
- if(vlr->mat->r > 0.0) rf->totrad[0]/= vlr->mat->r;
- if(vlr->mat->g > 0.0) rf->totrad[1]/= vlr->mat->g;
- if(vlr->mat->b > 0.0) rf->totrad[2]/= vlr->mat->b;
-
- col= RE_vertren_get_rad(re, vlr->v1, 1);
- vecaddfac(col, col, rf->totrad, rf->area);
- col[3]+= rf->area;
-
- col= RE_vertren_get_rad(re, vlr->v2, 1);
- vecaddfac(col, col, rf->totrad, rf->area);
- col[3]+= rf->area;
-
- col= RE_vertren_get_rad(re, vlr->v3, 1);
- vecaddfac(col, col, rf->totrad, rf->area);
- col[3]+= rf->area;
-
- if(vlr->v4) {
- col= RE_vertren_get_rad(re, vlr->v4, 1);
+ if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+ rf= *radface;
+
+ /* apply correction */
+ rf->totrad[0]= RG.radfactor*pow( rf->totrad[0], RG.igamma);
+ rf->totrad[1]= RG.radfactor*pow( rf->totrad[1], RG.igamma);
+ rf->totrad[2]= RG.radfactor*pow( rf->totrad[2], RG.igamma);
+
+ /* correct rf->rad values for color */
+ if(vlr->mat->r > 0.0) rf->totrad[0]/= vlr->mat->r;
+ if(vlr->mat->g > 0.0) rf->totrad[1]/= vlr->mat->g;
+ if(vlr->mat->b > 0.0) rf->totrad[2]/= vlr->mat->b;
+
+ col= RE_vertren_get_rad(obr, vlr->v1, 1);
+ vecaddfac(col, col, rf->totrad, rf->area);
+ col[3]+= rf->area;
+
+ col= RE_vertren_get_rad(obr, vlr->v2, 1);
+ vecaddfac(col, col, rf->totrad, rf->area);
+ col[3]+= rf->area;
+
+ col= RE_vertren_get_rad(obr, vlr->v3, 1);
vecaddfac(col, col, rf->totrad, rf->area);
col[3]+= rf->area;
+
+ if(vlr->v4) {
+ col= RE_vertren_get_rad(obr, vlr->v4, 1);
+ vecaddfac(col, col, rf->totrad, rf->area);
+ col[3]+= rf->area;
+ }
}
}
- }
- /* make vertex colors */
- for(a=0; a<re->totvert; a++) {
- if((a & 255)==0) v1= RE_findOrAddVert(re, a); else v1++;
-
- col= RE_vertren_get_rad(re, v1, 0);
- if(col && col[3]>0.0) {
- col[0]/= col[3];
- col[1]/= col[3];
- col[2]/= col[3];
+ /* make vertex colors */
+ for(a=0; a<obr->totvert; a++) {
+ if((a & 255)==0) v1= RE_findOrAddVert(obr, a); else v1++;
+
+ col= RE_vertren_get_rad(obr, v1, 0);
+ if(col && col[3]>0.0) {
+ col[0]/= col[3];
+ col[1]/= col[3];
+ col[2]/= col[3];
+ }
}
}
-
}
/* main call, extern */
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 9abc873172f..c9b973c4f1d 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -37,6 +37,8 @@
struct Scene;
struct RenderData;
struct NodeBlurData;
+struct Object;
+struct bNodeTree;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* this include is what is exposed of render to outside world */
@@ -72,7 +74,7 @@ typedef struct RenderLayer {
/* copy of RenderData */
char name[RE_MAXNAME];
- unsigned int lay;
+ unsigned int lay, lay_zmask;
int layflag, passflag, pass_xor;
struct Material *mat_override;
@@ -80,16 +82,18 @@ typedef struct RenderLayer {
float *rectf; /* 4 float, standard rgba buffer (read not above!) */
float *acolrect; /* 4 float, optional transparent buffer, needs storage for display updates */
+ float *scolrect; /* 4 float, optional strand buffer, needs storage for display updates */
ListBase passes;
} RenderLayer;
typedef struct RenderResult {
+ struct RenderResult *next, *prev;
/* target image size */
int rectx, recty;
- short crop, pad;
+ short crop, sample_nr;
/* optional, 32 bits version of picture, used for ogl render and image curves */
int *rect32;
@@ -111,7 +115,6 @@ typedef struct RenderResult {
volatile RenderLayer *renlay;
/* optional saved endresult on disk */
- char exrfile[FILE_MAXDIR];
void *exrhandle;
/* for render results in Image, verify validity for sequences */
@@ -119,8 +122,9 @@ typedef struct RenderResult {
} RenderResult;
+
typedef struct RenderStats {
- int totface, totvert, tothalo, totlamp, totpart;
+ int totface, totvert, totstrand, tothalo, totlamp, totpart;
short curfield, curblur, curpart, partsdone, convertdone;
double starttime, lastframetime;
char *infostr;
@@ -184,6 +188,9 @@ void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
+/* do a full sample buffer compo */
+void RE_MergeFullSample(struct Render *re, struct Scene *sce, struct bNodeTree *ntree);
+
/* ancient stars function... go away! */
void RE_make_stars(struct Render *re, void (*initfunc)(void),
void (*vertexfunc)(float*), void (*termfunc)(void));
@@ -204,14 +211,16 @@ float RE_filter_value(int type, float x);
void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
/* shaded view or baking options */
-#define RE_BAKE_LIGHT 0
-#define RE_BAKE_ALL 1
-#define RE_BAKE_AO 2
-#define RE_BAKE_NORMALS 3
-#define RE_BAKE_TEXTURE 4
-void RE_Database_Baking(struct Render *re, struct Scene *scene, int type);
+#define RE_BAKE_LIGHT 0
+#define RE_BAKE_ALL 1
+#define RE_BAKE_AO 2
+#define RE_BAKE_NORMALS 3
+#define RE_BAKE_TEXTURE 4
+#define RE_BAKE_DISPLACEMENT 5
+void RE_Database_Baking(struct Render *re, struct Scene *scene, int type, struct Object *actob);
void RE_DataBase_GetView(struct Render *re, float mat[][4]);
+void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
#endif /* RE_PIPELINE_H */
diff --git a/source/blender/render/extern/include/RE_raytrace.h b/source/blender/render/extern/include/RE_raytrace.h
index 095ffcf0c18..aec1c69b3dc 100644
--- a/source/blender/render/extern/include/RE_raytrace.h
+++ b/source/blender/render/extern/include/RE_raytrace.h
@@ -41,6 +41,19 @@ typedef void RayTree;
/* abstraction of face type */
typedef void RayFace;
+/* object numbers above this are transformed */
+#define RE_RAY_TRANSFORM_OFFS 0x8000000
+
+/* convert from pointer to index in array and back, with offset if the
+ * instance is transformed */
+#define RAY_OBJECT_SET(re, obi) \
+ ((obi == NULL)? 0: \
+ ((obi - (re)->objectinstance) + ((obi->flag & R_TRANSFORMED)? RE_RAY_TRANSFORM_OFFS: 0)))
+
+#define RAY_OBJECT_GET(re, i) \
+ ((re)->objectinstance + ((i >= RE_RAY_TRANSFORM_OFFS)? i-RE_RAY_TRANSFORM_OFFS: i))
+
+
/* struct for intersection data */
typedef struct Isect {
float start[3]; /* start+vec = end, in ray_tree_intersect */
@@ -50,8 +63,11 @@ typedef struct Isect {
float labda, u, v; /* distance to hitpoint, uv weights */
RayFace *face; /* face is where to intersect with */
+ int ob;
RayFace *faceorig; /* start face */
+ int oborig;
RayFace *face_last; /* for shadow optimize, last intersected face */
+ int ob_last;
short isect; /* which half of quad */
short mode; /* RE_RAYSHADOW, RE_RAYMIRROR, RE_RAYSHADOW_TRA */
@@ -62,25 +78,33 @@ typedef struct Isect {
/* octree only */
RayFace *facecontr;
+ int obcontr;
float ddalabda;
short faceisect; /* flag if facecontr was done or not */
+
+ /* custom pointer to be used in the RayCheckFunc */
+ void *userdata;
} 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);
+typedef int (*RayCheckFunc)(Isect *is, int ob, RayFace *face);
+typedef float *(*RayObjectTransformFunc)(void *userdata, int ob);
/* 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);
+ RayCoordsFunc coordfunc, RayCheckFunc checkfunc,
+ RayObjectTransformFunc transformfunc, void *userdata);
+void RE_ray_tree_add_face(RayTree *tree, int ob, 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);
+int RE_ray_tree_intersect_check(RayTree *tree, Isect *is, RayCheckFunc check);
+int RE_ray_face_intersection(Isect *is, RayObjectTransformFunc transformfunc,
+ RayCoordsFunc coordsfunc);
/* retrieve the diameter of the tree structure, for setting intersection
end distance */
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..8e3d60d4d80 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -47,7 +47,7 @@ typedef struct ShadeResult
{
float combined[4];
float col[4];
- float alpha;
+ float alpha, mist, z;
float diff[3]; /* no ramps, shadow, etc */
float spec[3];
float shad[3];
@@ -64,8 +64,12 @@ struct ShadeInputCopy {
struct Material *mat;
struct VlakRen *vlr;
+ struct StrandRen *strand;
+ struct ObjectInstanceRen *obi;
+ struct ObjectRen *obr;
int facenr;
float facenor[3]; /* copy from face */
+ short flippednor; /* is facenor flipped? */
struct VertRen *v1, *v2, *v3; /* vertices can be in any order for quads... */
short i1, i2, i3; /* original vertex indices */
short puno;
@@ -93,8 +97,12 @@ typedef struct ShadeInput
struct Material *mat;
struct VlakRen *vlr;
+ struct StrandRen *strand;
+ struct ObjectInstanceRen *obi;
+ struct ObjectRen *obr;
int facenr;
float facenor[3]; /* copy from face */
+ short flippednor; /* is facenor flipped? */
struct VertRen *v1, *v2, *v3; /* vertices can be in any order for quads... */
short i1, i2, i3; /* original vertex indices */
short puno;
@@ -120,17 +128,18 @@ typedef struct ShadeInput
/* end direct copy from material */
/* individual copies: */
- int har;
+ int har; /* hardness */
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];
+ float strandco, tang[3], stress, winspeed[4];
+ float duplilo[3], dupliuv[3];
ShadeInputUV uv[8]; /* 8 = MAX_MTFACE */
ShadeInputCol col[8]; /* 8 = MAX_MCOL */
- int totuv, totcol;
+ int totuv, totcol, actuv, actcol;
/* dx/dy OSA coordinates */
float dxco[3], dyco[3];
@@ -148,16 +157,20 @@ typedef struct ShadeInput
int xs, ys; /* pixel to be rendered */
int mask; /* subsample mask */
+
int samplenr; /* sample counter, to detect if we should do shadow again */
int depth; /* 1 or larger on raytrace shading */
/* stored copy of original face normal (facenor)
* before flipping. Used in Front/back output on geometry node */
float orignor[3];
+ /* for strand shading, normal at the surface */
+ float surfnor[3], surfdist;
/* from initialize, part or renderlayer */
short do_preview; /* for nodes, in previewrender */
short thread, sample; /* sample: ShadeSample array index */
+
unsigned int lay;
int layflag, passflag, combinedflag;
struct Group *light_override;
@@ -173,9 +186,10 @@ int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osa
/* shaded view and bake */
struct Render;
struct Image;
+struct Object;
void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr);
-int RE_bake_shade_all_selected(struct Render *re, int type);
+int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob);
struct Image *RE_bake_shade_get_image(void);
#endif /* RE_SHADER_EXT_H */
diff --git a/source/blender/render/intern/include/occlusion.h b/source/blender/render/intern/include/occlusion.h
new file mode 100644
index 00000000000..646ad30b318
--- /dev/null
+++ b/source/blender/render/intern/include/occlusion.h
@@ -0,0 +1,49 @@
+/*
+ * $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) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Brecht Van Lommel.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef OCCLUSION_H
+#define OCCLUSION_H
+
+struct Render;
+struct ShadeInput;
+struct ShadeResult;
+struct RenderPart;
+struct ShadeSample;
+struct DerivedMesh;
+struct ObjectRen;
+
+void make_occ_tree(struct Render *re);
+void free_occ(struct Render *re);
+void sample_occ(struct Render *re, struct ShadeInput *shi);
+
+void cache_occ_samples(struct Render *re, struct RenderPart *pa, struct ShadeSample *ssamp);
+void free_occ_samples(struct Render *re, struct RenderPart *pa);
+
+#endif
+
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index abcdf417b62..7b68552e5fb 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -48,6 +48,8 @@ struct MemArena;
struct VertTableNode;
struct VlakTableNode;
struct GHash;
+struct RenderBuckets;
+struct ObjectInstanceRen;
#define TABLEINITSIZE 1024
#define LAMPINITSIZE 256
@@ -77,16 +79,18 @@ typedef struct RenderPart
{
struct RenderPart *next, *prev;
- /* result of part rendering */
- RenderResult *result;
+ RenderResult *result; /* result of part rendering */
+ ListBase fullresult; /* optional full sample buffers */
+ int *recto; /* object table for objects */
int *rectp; /* polygon index table */
int *rectz; /* zbuffer */
long *rectdaps; /* delta acum buffer for pixel structs */
+ int *rectbacko; /* object table for backside sss */
int *rectbackp; /* polygon index table for backside sss */
int *rectbackz; /* zbuffer for backside sss */
long *rectall; /* buffer for all faces for sss */
-
+
rcti disprect; /* part coordinates within total picture */
int rectx, recty; /* the size */
short crop, ready; /* crop is amount of pixels we crop, for filter */
@@ -109,6 +113,8 @@ struct Render
RenderResult *result;
/* if render with single-layer option, other rendered layers are stored here */
RenderResult *pushedresult;
+ /* a list of RenderResults, for fullsample */
+ ListBase fullresult;
/* window size, display rect, viewplane */
int winx, winy;
@@ -154,23 +160,27 @@ struct Render
/* octree tables and variables for raytrace */
void *raytree;
+
+ /* occlusion tree */
+ void *occlusiontree;
+ ListBase strandsurface;
/* use this instead of R.r.cfra */
float cfra;
/* render database */
- int totvlak, totvert, tothalo, totlamp;
+ int totvlak, totvert, tothalo, totstrand, totlamp;
+ struct HaloRen **sortedhalos;
+
ListBase lights; /* GroupObject pointers */
ListBase lampren; /* storage, for free */
- int vertnodeslen;
- struct VertTableNode *vertnodes;
- int vlaknodeslen;
- struct VlakTableNode *vlaknodes;
- int blohalen;
- struct HaloRen **bloha;
ListBase objecttable;
+ struct ObjectInstanceRen *objectinstance;
+ ListBase instancetable;
+ int totinstance;
+
struct Image *backbuf, *bakebuf;
struct GHash *orco_hash;
@@ -181,6 +191,8 @@ struct Render
ListBase customdata_names;
+ struct Object *excludeob;
+
/* arena for allocating data for use during render, for
* example dynamic TFaces to go in the VlakRen structure.
*/
@@ -228,23 +240,54 @@ typedef struct ShadBuf {
} ShadBuf;
/* ------------------------------------------------------------------------- */
-/* lookup of objects in database */
+
typedef struct ObjectRen {
struct ObjectRen *next, *prev;
struct Object *ob, *par;
- int index, startvert, endvert, startface, endface;
- float *vectors;
+ struct Scene *sce;
+ int index, psysindex, flag, lay;
+
+ float boundbox[2][3];
+
+ int totvert, totvlak, totstrand, tothalo;
+ int vertnodeslen, vlaknodeslen, strandnodeslen, blohalen;
+ struct VertTableNode *vertnodes;
+ struct VlakTableNode *vlaknodes;
+ struct StrandTableNode *strandnodes;
+ struct HaloRen **bloha;
+ struct StrandBuffer *strandbuf;
+
+ char (*mtface)[32];
+ char (*mcol)[32];
+ int actmtface, actmcol;
+
+ float obmat[4][4]; /* only used in convertblender.c, for instancing */
} ObjectRen;
+typedef struct ObjectInstanceRen {
+ struct ObjectInstanceRen *next, *prev;
+
+ ObjectRen *obr;
+ Object *ob, *par;
+ int index, psysindex;
+
+ float mat[4][4], imat[3][3];
+ short flag;
+
+ float dupliorco[3], dupliuv[2];
+
+ float *vectors;
+ int totvector;
+} ObjectInstanceRen;
+
/* ------------------------------------------------------------------------- */
typedef struct VertRen
{
float co[3];
float n[3];
- float ho[4];
float *orco;
- short clip;
+ short clip;
unsigned short flag; /* in use for clipping zbuffer parts, temp setting stuff in convertblender.c */
float accum; /* accum for radio weighting, and for strand texco static particles */
int index; /* index allows extending vertren with any property */
@@ -269,13 +312,10 @@ typedef struct RadFace {
typedef struct VlakRen {
struct VertRen *v1, *v2, *v3, *v4; /* keep in order for ** addressing */
- unsigned int lay;
float n[3];
struct Material *mat;
- char noflag, puno;
+ char puno;
char flag, ec;
- RadFace *radface;
- Object *ob;
int index;
} VlakRen;
@@ -295,6 +335,57 @@ typedef struct HaloRen
struct Material *mat;
} HaloRen;
+/* ------------------------------------------------------------------------- */
+
+typedef struct StrandVert {
+ float co[3];
+ float strandco;
+} StrandVert;
+
+typedef struct StrandSurface {
+ struct StrandSurface *next, *prev;
+ ObjectRen obr;
+ int (*face)[4];
+ float (*co)[3];
+ /* for occlusion caching */
+ float (*col)[3];
+ /* for speedvectors */
+ float (*prevco)[3], (*nextco)[3];
+ int totvert, totface;
+} StrandSurface;
+
+typedef struct StrandBound {
+ int start, end;
+ float boundbox[2][3];
+} StrandBound;
+
+typedef struct StrandBuffer {
+ struct StrandBuffer *next, *prev;
+ struct StrandVert *vert;
+ struct StrandBound *bound;
+ int totvert, totbound;
+
+ struct ObjectRen *obr;
+ struct Material *ma;
+ struct StrandSurface *surface;
+ unsigned int lay;
+ int overrideuv;
+ int flag, maxdepth;
+ float adaptcos, minwidth, widthfade;
+
+ float winmat[4][4];
+ int winx, winy;
+} StrandBuffer;
+
+typedef struct StrandRen {
+ StrandVert *vert;
+ StrandBuffer *buffer;
+ int totvert, flag;
+ int clip, index;
+ float orco[3];
+} StrandRen;
+
+
struct LampRen;
struct MTex;
@@ -356,7 +447,7 @@ typedef struct LampRen {
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;
@@ -380,8 +471,13 @@ typedef struct LampRen {
/* ray optim */
VlakRen *vlr_last[BLENDER_MAX_THREADS];
+ ObjectInstanceRen *obi_last[BLENDER_MAX_THREADS];
struct MTex *mtex[MAX_MTEX];
+
+ /* threading */
+ int thread_assigned;
+ int thread_ready;
} LampRen;
/* **************** defines ********************* */
@@ -394,10 +490,11 @@ typedef struct LampRen {
#define R_SEC_FIELD 4
#define R_LAMPHALO 8
#define R_GLOB_NOPUNOFLIP 16
+#define R_NEED_TANGENT 32
/* vlakren->flag (vlak = face in dutch) char!!! */
#define R_SMOOTH 1
-#define R_VISIBLE 2
+#define R_HIDDEN 2
/* strand flag, means special handling */
#define R_STRAND 4
#define R_NOPUNOFLIP 8
@@ -408,13 +505,17 @@ typedef struct LampRen {
/* vertex normals are tangent or view-corrected vector, for hair strands */
#define R_TANGENT 128
-/* vlakren->noflag (char) */
-#define R_SNPROJ_X 1
-#define R_SNPROJ_Y 2
-#define R_SNPROJ_Z 4
-#define R_FLIPPED_NO 8
+/* strandbuffer->flag */
+#define R_STRAND_BSPLINE 1
+#define R_STRAND_B_UNITS 2
+/* objectren->flag */
+#define R_INSTANCEABLE 1
+/* objectinstance->flag */
+#define R_DUPLI_TRANSFORMED 1
+#define R_ENV_TRANSFORMED 2
+#define R_TRANSFORMED (1|2)
#endif /* RENDER_TYPES_H */
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index 0d807d56180..4ca644c6381 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -49,13 +49,15 @@ struct ShadeResult;
struct World;
struct RenderPart;
struct RenderLayer;
+struct ObjectRen;
+struct ListBase;
/* ------------------------------------------------------------------------- */
typedef struct PixStr
{
struct PixStr *next;
- int facenr, z;
+ int obi, facenr, z;
unsigned short mask;
short shadfac;
} PixStr;
@@ -89,6 +91,9 @@ void zbufshadeDA_tile(struct RenderPart *pa);
void zbufshade_sss_tile(struct RenderPart *pa);
+int get_sample_layers(struct RenderPart *pa, struct RenderLayer *rl, struct RenderLayer **rlpp);
+
+
/* -------- ray.c ------- */
extern void freeraytree(Render *re);
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 75aea05fee2..a204aa7876b 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -39,6 +39,10 @@ struct Render;
struct MCol;
struct MTFace;
struct CustomData;
+struct StrandBuffer;
+struct StrandRen;
+struct ObjectInstanceRen;
+struct RadFace;
#define RE_QUAD_MASK 0x7FFFFFF
#define RE_QUAD_OFFS 0x8000000
@@ -56,50 +60,72 @@ typedef struct VertTableNode {
typedef struct VlakTableNode {
struct VlakRen *vlak;
- struct MTFace **mtface;
- struct MCol **mcol;
+ struct MTFace *mtface;
+ struct MCol *mcol;
int totmtface, totmcol;
- struct CustomDataNames **names;
+ float *surfnor;
+ struct RadFace **radface;
} VlakTableNode;
-typedef struct CustomDataNames{
- struct CustomDataNames *next, *prev;
-
- char (*mtface)[32];
- char (*mcol)[32];
-} CustomDataNames;
+typedef struct StrandTableNode {
+ struct StrandRen *strand;
+ float *winspeed;
+ float *surfnor;
+ float *simplify;
+ int *face;
+ struct MCol *mcol;
+ float *uv;
+ int totuv, totmcol;
+} StrandTableNode;
/* renderdatabase.c */
void free_renderdata_tables(struct Render *re);
void free_renderdata_vertnodes(struct VertTableNode *vertnodes);
void free_renderdata_vlaknodes(struct VlakTableNode *vlaknodes);
-void set_normalflags(Render *re);
-void project_renderdata(struct Render *re, void (*projectfunc)(float *, float mat[][4], float *), int do_pano, float xoffs);
+void set_normalflags(struct Render *re, struct ObjectRen *obr);
+void project_renderdata(struct Render *re, void (*projectfunc)(float *, float mat[][4], float *), int do_pano, float xoffs, int do_buckets);
+int clip_render_object(float boundbox[][3], float *bounds, float mat[][4]);
/* functions are not exported... so wrong names */
-struct VlakRen *RE_findOrAddVlak(struct Render *re, int nr);
-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);
-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);
-float *RE_vertren_get_stress(struct Render *re, struct VertRen *ver, int verify);
-float *RE_vertren_get_rad(struct Render *re, struct VertRen *ver, int verify);
-float *RE_vertren_get_strand(struct Render *re, struct VertRen *ver, int verify);
-float *RE_vertren_get_tangent(struct Render *re, struct VertRen *ver, int verify);
-float *RE_vertren_get_winspeed(struct Render *re, struct VertRen *ver, int verify);
-
-struct MTFace *RE_vlakren_get_tface(struct Render *re, VlakRen *ren, int n, char **name, int verify);
-struct MCol *RE_vlakren_get_mcol(struct Render *re, VlakRen *ren, int n, char **name, int verify);
-
-struct VertRen *RE_vertren_copy(struct Render *re, struct VertRen *ver);
-struct VlakRen *RE_vlakren_copy(struct Render *re, struct VlakRen *vlr);
-
-void RE_vlakren_set_customdata_names(struct Render *re, struct CustomData *data);
+struct VlakRen *RE_findOrAddVlak(struct ObjectRen *obr, int nr);
+struct VertRen *RE_findOrAddVert(struct ObjectRen *obr, int nr);
+struct StrandRen *RE_findOrAddStrand(struct ObjectRen *obr, int nr);
+struct HaloRen *RE_findOrAddHalo(struct ObjectRen *obr, int nr);
+struct HaloRen *RE_inithalo(struct Render *re, struct ObjectRen *obr, struct Material *ma, float *vec, float *vec1, float *orco, float hasize, float vectsize, int seed);
+struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma, float *vec, float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed);
+struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
+
+struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);
+struct ObjectInstanceRen *RE_addRenderInstance(struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par, int index, int psysindex, float mat[][4]);
+void RE_makeRenderInstances(struct Render *re);
+void RE_instanceTransformNormal(struct ObjectInstanceRen *obi, float *nor, float *tnor);
+
+float *RE_vertren_get_sticky(struct ObjectRen *obr, struct VertRen *ver, int verify);
+float *RE_vertren_get_stress(struct ObjectRen *obr, struct VertRen *ver, int verify);
+float *RE_vertren_get_rad(struct ObjectRen *obr, struct VertRen *ver, int verify);
+float *RE_vertren_get_strand(struct ObjectRen *obr, struct VertRen *ver, int verify);
+float *RE_vertren_get_tangent(struct ObjectRen *obr, struct VertRen *ver, int verify);
+float *RE_vertren_get_winspeed(struct ObjectInstanceRen *obi, struct VertRen *ver, int verify);
+
+struct MTFace *RE_vlakren_get_tface(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
+struct MCol *RE_vlakren_get_mcol(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
+float *RE_vlakren_get_surfnor(struct ObjectRen *obr, VlakRen *ren, int verify);
+RadFace **RE_vlakren_get_radface(struct ObjectRen *obr, VlakRen *ren, int verify);
+int RE_vlakren_get_normal(struct Render *re, struct ObjectInstanceRen *obi, struct VlakRen *vlr, float *nor);
+
+float *RE_strandren_get_surfnor(struct ObjectRen *obr, struct StrandRen *strand, int verify);
+float *RE_strandren_get_uv(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify);
+struct MCol *RE_strandren_get_mcol(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify);
+float *RE_strandren_get_simplify(struct ObjectRen *obr, struct StrandRen *strand, int verify);
+int *RE_strandren_get_face(struct ObjectRen *obr, struct StrandRen *strand, int verify);
+float *RE_strandren_get_winspeed(struct ObjectInstanceRen *obi, struct StrandRen *strand, int verify);
+
+struct VertRen *RE_vertren_copy(struct ObjectRen *obr, struct VertRen *ver);
+struct VlakRen *RE_vlakren_copy(struct ObjectRen *obr, struct VlakRen *vlr);
+
+void RE_set_customdata_names(struct ObjectRen *obr, struct CustomData *data);
/* haloren->type: flags */
#define HA_ONLYSKY 1
diff --git a/source/blender/render/intern/include/shadbuf.h b/source/blender/render/intern/include/shadbuf.h
index 8b786c6e098..c5d8f2690c7 100644
--- a/source/blender/render/intern/include/shadbuf.h
+++ b/source/blender/render/intern/include/shadbuf.h
@@ -37,6 +37,8 @@
#include "render_types.h"
+struct ObjectRen;
+
/**
* Calculates shadowbuffers for a vector of shadow-giving lamps
* @param lar The vector of lamps
@@ -44,6 +46,8 @@
void makeshadowbuf(struct Render *re, LampRen *lar);
void freeshadowbuf(struct LampRen *lar);
+void threaded_makeshadowbufs(struct Render *re);
+
/**
* Determines the shadow factor for a face and lamp. There is some
* communication with global variables here.
@@ -53,7 +57,7 @@ void freeshadowbuf(struct LampRen *lar);
* @param inp The inproduct between viewvector and ?
*
*/
-float testshadowbuf(struct ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp);
+float testshadowbuf(struct ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp, float mat_bias);
/**
* Determines the shadow factor for lamp <lar>, between <p1>
@@ -80,6 +84,7 @@ float ISB_getshadow(ShadeInput *shi, ShadBuf *shb);
typedef struct ISBSample {
float zco[3]; /* coordinate in lampview projection */
short *shadfac; /* initialized zero = full lighted */
+ int obi; /* object for face lookup */
int facenr; /* index in faces list */
} ISBSample;
@@ -87,6 +92,7 @@ typedef struct ISBSample {
typedef struct ISBSampleA {
float zco[3]; /* coordinate in lampview projection */
short *shadfac; /* NULL = full lighted */
+ int obi; /* object for face lookup */
int facenr; /* index in faces list */
struct ISBSampleA *next; /* in end, we want the first items to align with ISBSample */
} ISBSampleA;
@@ -94,6 +100,7 @@ typedef struct ISBSampleA {
/* used for transparent storage only */
typedef struct ISBShadfacA {
struct ISBShadfacA *next;
+ int obi;
int facenr;
float shadfac;
} ISBShadfacA;
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
index 902899bce94..e015309784d 100644
--- a/source/blender/render/intern/include/shading.h
+++ b/source/blender/render/intern/include/shading.h
@@ -29,6 +29,10 @@ struct RenderPart;
struct RenderLayer;
struct PixStr;
struct LampRen;
+struct VlakRen;
+struct StrandSegment;
+struct StrandPoint;
+struct ObjectInstanceRen obi;
/* shadeinput.c */
@@ -36,7 +40,9 @@ struct LampRen;
/* needed to calculate shadow and AO for an entire pixel */
typedef struct ShadeSample {
- int tot; /* amount of shi in use, can be 1 for not FULL_OSA */
+ int tot; /* amount of shi in use, can be 1 for not FULL_OSA */
+
+ RenderLayer *rlpp[RE_MAX_OSA]; /* fast lookup from sample to renderlayer (fullsample buf) */
/* could be malloced once */
ShadeInput shi[RE_MAX_OSA];
@@ -49,19 +55,23 @@ typedef struct ShadeSample {
/* also the node shader callback */
void shade_material_loop(struct ShadeInput *shi, struct ShadeResult *shr);
-void shade_input_set_triangle_i(struct ShadeInput *shi, struct VlakRen *vlr, short i1, short i2, short i3);
-void shade_input_set_triangle(struct ShadeInput *shi, volatile int facenr, int normal_flip);
+void shade_input_set_triangle_i(struct ShadeInput *shi, struct ObjectInstanceRen *obi, struct VlakRen *vlr, short i1, short i2, short i3);
+void shade_input_set_triangle(struct ShadeInput *shi, volatile int obi, volatile int facenr, int normal_flip);
void shade_input_copy_triangle(struct ShadeInput *shi, struct ShadeInput *from);
void shade_input_set_viewco(struct ShadeInput *shi, float x, float y, float z);
void shade_input_set_uv(struct ShadeInput *shi);
void shade_input_set_normals(struct ShadeInput *shi);
+void shade_input_flip_normals(struct ShadeInput *shi);
void shade_input_set_shade_texco(struct ShadeInput *shi);
+void shade_input_set_strand(struct ShadeInput *shi, struct StrandRen *strand, struct StrandPoint *spoint);
+void shade_input_set_strand_texco(struct ShadeInput *shi, struct StrandRen *strand, struct StrandVert *svert, struct StrandPoint *spoint);
void shade_input_do_shade(struct ShadeInput *shi, struct ShadeResult *shr);
void shade_input_initialize(struct ShadeInput *shi, struct RenderPart *pa, struct RenderLayer *rl, int sample);
void shade_sample_initialize(struct ShadeSample *ssamp, struct RenderPart *pa, struct RenderLayer *rl);
void shade_samples_do_AO(struct ShadeSample *ssamp);
+void shade_samples_fill_with_ps(struct ShadeSample *ssamp, struct PixStr *ps, int x, int y);
int shade_samples(struct ShadeSample *ssamp, struct PixStr *ps, int x, int y);
void vlr_set_uv_indices(struct VlakRen *vlr, int *i1, int *i2, int *i3);
diff --git a/source/blender/render/intern/include/strand.h b/source/blender/render/intern/include/strand.h
new file mode 100644
index 00000000000..ebe026e3fec
--- /dev/null
+++ b/source/blender/render/intern/include/strand.h
@@ -0,0 +1,116 @@
+/*
+ * $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): Brecht Van Lommel.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef STRAND_H
+#define STRAND_H
+
+struct StrandVert;
+struct StrandRen;
+struct StrandBuffer;
+struct ShadeSample;
+struct StrandPart;
+struct Render;
+struct RenderPart;
+struct RenderBuckets;
+struct RenderPrimitiveIterator;
+struct ZSpan;
+struct ObjectInstanceRen;
+struct StrandSurface;
+struct DerivedMesh;
+struct ObjectRen;
+
+typedef struct StrandPoint {
+ /* position within segment */
+ float t;
+
+ /* camera space */
+ float co[3];
+ float nor[3];
+ float tan[3];
+ float strandco;
+ float width;
+
+ /* derivatives */
+ float dtco[3], dsco[3];
+ float dtstrandco;
+
+ /* outer points */
+ float co1[3], co2[3];
+ float hoco1[4], hoco2[4];
+ float zco1[3], zco2[3];
+ int clip1, clip2;
+
+ /* screen space */
+ float hoco[4];
+ float x, y;
+
+ /* simplification */
+ float alpha;
+} StrandPoint;
+
+typedef struct StrandSegment {
+ struct StrandVert *v[4];
+ struct StrandRen *strand;
+ struct StrandBuffer *buffer;
+ struct ObjectInstanceRen *obi;
+ float sqadaptcos;
+
+ StrandPoint point1, point2;
+ int shaded;
+} StrandSegment;
+
+struct StrandShadeCache;
+typedef struct StrandShadeCache StrandShadeCache;
+
+void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint);
+void render_strand_segment(struct Render *re, float winmat[][4], struct StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
+void strand_minmax(struct StrandRen *strand, float *min, float *max);
+
+struct StrandSurface *cache_strand_surface(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, float mat[][4], int timeoffset);
+void free_strand_surface(struct Render *re);
+
+struct StrandShadeCache *strand_shade_cache_create(void);
+void strand_shade_cache_free(struct StrandShadeCache *cache);
+void strand_shade_segment(struct Render *re, struct StrandShadeCache *cache, struct StrandSegment *sseg, struct ShadeSample *ssamp, float t, float s, int addpassflag);
+void strand_shade_unref(struct StrandShadeCache *cache, struct StrandVert *svert);
+
+struct RenderBuckets *init_buckets(struct Render *re);
+void add_buckets_primitive(struct RenderBuckets *buckets, float *min, float *max, void *prim);
+void free_buckets(struct RenderBuckets *buckets);
+void project_hoco_to_bucket(struct RenderBuckets *buckets, float *hoco, float *bucketco);
+
+struct RenderPrimitiveIterator *init_primitive_iterator(struct Render *re, struct RenderBuckets *buckets, struct RenderPart *pa);
+void *next_primitive_iterator(struct RenderPrimitiveIterator *iter);
+void free_primitive_iterator(struct RenderPrimitiveIterator *iter);
+
+#endif
+
diff --git a/source/blender/render/intern/include/zbuf.h b/source/blender/render/intern/include/zbuf.h
index ed3f93adfdd..2a16bde829b 100644
--- a/source/blender/render/intern/include/zbuf.h
+++ b/source/blender/render/intern/include/zbuf.h
@@ -35,6 +35,9 @@ struct RenderLayer;
struct LampRen;
struct VlakRen;
struct ListBase;
+struct ZSpan;
+struct APixstrand;
+struct StrandShadeCache;
void fillrect(int *rect, int x, int y, int val);
@@ -46,25 +49,37 @@ void projectvert(float *v1, float winmat[][4], float *adr);
void projectverto(float *v1, float winmat[][4], float *adr);
int testclip(float *v);
-void set_part_zbuf_clipflag(struct RenderPart *pa);
-void zbuffer_shadow(struct Render *re, struct LampRen *lar, int *rectz, int size, float jitx, float jity);
-void zbuffer_solid(struct RenderPart *pa, unsigned int layer, short layflag);
-unsigned short *zbuffer_transp_shade(struct RenderPart *pa, struct RenderLayer *rl, float *pass);
+void zbuffer_shadow(struct Render *re, float winmat[][4], struct LampRen *lar, int *rectz, int size, float jitx, float jity);
+void zbuffer_solid(struct RenderPart *pa, struct RenderLayer *rl, void (*fillfunc)(struct RenderPart*, struct ZSpan*, int, void*), void *data);
+
+unsigned short *zbuffer_transp_shade(struct RenderPart *pa, struct RenderLayer *rl, float *pass, struct ListBase *psmlist);
void convert_zbuf_to_distbuf(struct RenderPart *pa, struct RenderLayer *rl);
-void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(void *, int, int, int, int));
+void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(void*, int, int, int, int, int));
+int zbuffer_strands_abuf(struct Render *re, struct RenderPart *pa, struct RenderLayer *rl, struct APixstrand *apixbuf, struct ListBase *apsmbase, struct StrandShadeCache *cache);
typedef struct APixstr {
- unsigned short mask[4]; /* jitter mask */
- int z[4]; /* distance */
- int p[4]; /* index */
- short shadfac[4]; /* optimize storage for irregular shadow */
+ unsigned short mask[4]; /* jitter mask */
+ int z[4]; /* distance */
+ int p[4]; /* index */
+ int obi[4]; /* object instance */
+ short shadfac[4]; /* optimize storage for irregular shadow */
struct APixstr *next;
} APixstr;
+typedef struct APixstrand {
+ unsigned short mask[4]; /* jitter mask */
+ int z[4]; /* distance */
+ int p[4]; /* index */
+ int obi[4]; /* object instance */
+ int seg[4]; /* for strands, segment number */
+ float u[4], v[4]; /* for strands, u,v coordinate in segment */
+ struct APixstrand *next;
+} APixstrand;
+
typedef struct APixstrMain
{
struct APixstrMain *next, *prev;
- struct APixstr *ps;
+ void *ps;
} APixstrMain;
/* span fill in method, is also used to localize data for zbuffering */
@@ -80,32 +95,41 @@ typedef struct ZSpan {
int *rectz, *arectz; /* zbuffers, arectz is for transparant */
int *rectz1; /* seconday z buffer for shadowbuffer (2nd closest z) */
int *rectp; /* polygon index buffer */
+ int *recto; /* object buffer */
APixstr *apixbuf, *curpstr; /* apixbuf for transparent */
+ APixstrand *curpstrand; /* same for strands */
struct ListBase *apsmbase;
int polygon_offset; /* offset in Z */
float shad_alpha; /* copy from material, used by irregular shadbuf */
int mask, apsmcounter; /* in use by apixbuf */
+ int apstrandmcounter;
+
+ float clipcrop; /* for shadow, was in R global before */
void *sss_handle; /* used by sss */
- void (*sss_func)(void *, int, int, int, int);
+ void (*sss_func)(void *, int, int, int, int, int);
- void (*zbuffunc)(struct ZSpan *, int, float *, float *, float *, float *);
- void (*zbuflinefunc)(struct ZSpan *, int, float *, float *);
+ void (*zbuffunc)(struct ZSpan *, int, int, float *, float *, float *, float *);
+ void (*zbuflinefunc)(struct ZSpan *, int, int, float *, float *);
} ZSpan;
/* exported to shadbuf.c */
-void zbufclip4(struct ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, float *f4, int c1, int c2, int c3, int c4);
+void zbufclip4(struct ZSpan *zspan, int obi, int zvlnr, float *f1, float *f2, float *f3, float *f4, int c1, int c2, int c3, int c4);
void zbuf_free_span(struct ZSpan *zspan);
/* to rendercore.c */
void zspan_scanconvert(struct ZSpan *zpan, void *handle, float *v1, float *v2, float *v3, void (*func)(void *, int, int, float, float) );
/* exported to edge render... */
-void zbufclip(struct ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, int c1, int c2, int c3);
-void zbuf_alloc_span(struct ZSpan *zspan, int rectx, int recty);
-void zbufclipwire(struct ZSpan *zspan, int zvlnr, struct VlakRen *vlr);
+void zbufclip(struct ZSpan *zspan, int obi, int zvlnr, float *f1, float *f2, float *f3, int c1, int c2, int c3);
+void zbuf_alloc_span(struct ZSpan *zspan, int rectx, int recty, float clipcrop);
+void zbufclipwire(struct ZSpan *zspan, int obi, int zvlnr, int ec, float *ho1, float *ho2, float *ho3, float *ho4, int c1, int c2, int c3, int c4);
+
+/* exported to shadeinput.c */
+void zbuf_make_winmat(Render *re, float duplimat[][4], float winmat[][4]);
+void zbuf_render_project(float winmat[][4], float *co, float *ho);
#endif
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 29b48413ca7..c25a1aeadf8 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"
@@ -83,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"
@@ -96,6 +100,7 @@
#include "envmap.h"
#include "multires.h"
+#include "occlusion.h"
#include "render_types.h"
#include "rendercore.h"
#include "renderdatabase.h"
@@ -103,8 +108,10 @@
#include "radio.h"
#include "shadbuf.h"
#include "shading.h"
+#include "strand.h"
#include "texture.h"
#include "sss.h"
+#include "strand.h"
#include "zbuf.h"
#ifndef DISABLE_YAFRAY /* disable yafray */
@@ -115,22 +122,15 @@
* Same is true for lamp coords & vec.
* Duplicated data objects & dupliframe/duplivert objects are only stored once,
* only the matrix is stored for all others, in yafray these objects are instances of the original.
- * The main changes are in RE_rotateBlenderScene().
+ * The main changes are in RE_Database_FromScene().
*/
#endif /* disable yafray */
-/* ------------------------------------------------------------------------- */
-/* Local functions */
-/* ------------------------------------------------------------------------- */
-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 );
-
/* 10 times larger than normal epsilon, test it on default nurbs sphere with ray_transp (for quad detection) */
/* or for checking vertex normal flips */
#define FLT_EPSILON10 1.19209290e-06F
-
/* ------------------------------------------------------------------------- */
/* Stuff for stars. This sits here because it uses gl-things. Part of
@@ -138,14 +138,14 @@ this code may move down to the converter. */
/* ------------------------------------------------------------------------- */
/* this is a bad beast, since it is misused by the 3d view drawing as well. */
-static HaloRen *initstar(Render *re, float *vec, float hasize)
+static HaloRen *initstar(Render *re, ObjectRen *obr, float *vec, float hasize)
{
HaloRen *har;
float hoco[4];
projectverto(vec, re->winmat, hoco);
- har= RE_findOrAddHalo(re, re->tothalo++);
+ har= RE_findOrAddHalo(obr, obr->tothalo++);
/* projectvert is done in function zbufvlaggen again, because of parts */
VECCOPY(har->co, vec);
@@ -166,6 +166,7 @@ void RE_make_stars(Render *re, void (*initfunc)(void),
void (*vertexfunc)(float*), void (*termfunc)(void))
{
extern unsigned char hash[512];
+ ObjectRen *obr= NULL;
World *wrld= NULL;
HaloRen *har;
Scene *scene;
@@ -229,11 +230,14 @@ void RE_make_stars(Render *re, void (*initfunc)(void),
if (initfunc) {
initfunc();
}
+
+ if(re) /* add render object for stars */
+ obr= RE_addRenderObject(re, NULL, NULL, 0, 0, 0);
for (x = sx, fx = sx * stargrid; x <= ex; x++, fx += stargrid) {
for (y = sy, fy = sy * stargrid; y <= ey ; y++, fy += stargrid) {
for (z = sz, fz = sz * stargrid; z <= ez; z++, fz += stargrid) {
-
+
BLI_srand((hash[z & 0xff] << 24) + (hash[y & 0xff] << 16) + (hash[x & 0xff] << 8));
vec[0] = fx + (hlfrand * BLI_drand()) - dblrand;
vec[1] = fy + (hlfrand * BLI_drand()) - dblrand;
@@ -276,7 +280,7 @@ void RE_make_stars(Render *re, void (*initfunc)(void),
if (alpha != 0.0) {
fac = force * BLI_drand();
- har = initstar(re, vec, fac);
+ har = initstar(re, obr, vec, fac);
if (har) {
har->alfa = sqrt(sqrt(alpha));
@@ -300,6 +304,9 @@ void RE_make_stars(Render *re, void (*initfunc)(void),
}
}
if (termfunc) termfunc();
+
+ if(obr)
+ re->tothalo += obr->tothalo;
}
@@ -323,35 +330,35 @@ u | | F1 | F2 |
/* ------------------------------------------------------------------------- */
-static void split_v_renderfaces(Render *re, int startvlak, int startvert, int usize, int vsize, int uIndex, int cyclu, int cyclv)
+static void split_v_renderfaces(ObjectRen *obr, int startvlak, int startvert, int usize, int vsize, int uIndex, int cyclu, int cyclv)
{
int vLen = vsize-1+(!!cyclv);
int v;
for (v=0; v<vLen; v++) {
- VlakRen *vlr = RE_findOrAddVlak(re, startvlak + vLen*uIndex + v);
- VertRen *vert = RE_vertren_copy(re, vlr->v2);
+ VlakRen *vlr = RE_findOrAddVlak(obr, startvlak + vLen*uIndex + v);
+ VertRen *vert = RE_vertren_copy(obr, vlr->v2);
if (cyclv) {
vlr->v2 = vert;
if (v==vLen-1) {
- VlakRen *vlr = RE_findOrAddVlak(re, startvlak + vLen*uIndex + 0);
+ VlakRen *vlr = RE_findOrAddVlak(obr, startvlak + vLen*uIndex + 0);
vlr->v1 = vert;
} else {
- VlakRen *vlr = RE_findOrAddVlak(re, startvlak + vLen*uIndex + v+1);
+ VlakRen *vlr = RE_findOrAddVlak(obr, startvlak + vLen*uIndex + v+1);
vlr->v1 = vert;
}
} else {
vlr->v2 = vert;
if (v<vLen-1) {
- VlakRen *vlr = RE_findOrAddVlak(re, startvlak + vLen*uIndex + v+1);
+ VlakRen *vlr = RE_findOrAddVlak(obr, startvlak + vLen*uIndex + v+1);
vlr->v1 = vert;
}
if (v==0) {
- vlr->v1 = RE_vertren_copy(re, vlr->v1);
+ vlr->v1 = RE_vertren_copy(obr, vlr->v1);
}
}
}
@@ -369,6 +376,8 @@ static int check_vnormal(float *n, float *veno)
}
/* ------------------------------------------------------------------------- */
+/* Stress, tangents and normals */
+/* ------------------------------------------------------------------------- */
static void calc_edge_stress_add(float *accum, VertRen *v1, VertRen *v2)
{
@@ -384,20 +393,20 @@ static void calc_edge_stress_add(float *accum, VertRen *v1, VertRen *v2)
acc[1]+= 1.0f;
}
-static void calc_edge_stress(Render *re, Mesh *me, int startvert, int startvlak)
+static void calc_edge_stress(Render *re, ObjectRen *obr, Mesh *me)
{
float loc[3], size[3], *accum, *acc, *accumoffs, *stress;
int a;
- if(startvert==re->totvert) return;
+ if(obr->totvert==0) return;
mesh_get_texspace(me, loc, NULL, size);
- accum= MEM_callocN(2*sizeof(float)*(re->totvert-startvert), "temp accum for stress");
+ accum= MEM_callocN(2*sizeof(float)*obr->totvert, "temp accum for stress");
/* de-normalize orco */
- for(a=startvert; a<re->totvert; a++) {
- VertRen *ver= RE_findOrAddVert(re, a);
+ for(a=0; a<obr->totvert; a++) {
+ VertRen *ver= RE_findOrAddVert(obr, a);
if(ver->orco) {
ver->orco[0]= ver->orco[0]*size[0] +loc[0];
ver->orco[1]= ver->orco[1]*size[1] +loc[1];
@@ -406,9 +415,9 @@ static void calc_edge_stress(Render *re, Mesh *me, int startvert, int startvlak)
}
/* add stress values */
- accumoffs= accum - 2*startvert; /* so we can use vertex index */
- for(a=startvlak; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
+ accumoffs= accum; /* so we can use vertex index */
+ for(a=0; a<obr->totvlak; a++) {
+ VlakRen *vlr= RE_findOrAddVlak(obr, a);
if(vlr->v1->orco && vlr->v4) {
calc_edge_stress_add(accumoffs, vlr->v1, vlr->v2);
@@ -422,14 +431,14 @@ static void calc_edge_stress(Render *re, Mesh *me, int startvert, int startvlak)
}
}
- for(a=startvert; a<re->totvert; a++) {
- VertRen *ver= RE_findOrAddVert(re, a);
+ for(a=0; a<obr->totvert; a++) {
+ VertRen *ver= RE_findOrAddVert(obr, a);
if(ver->orco) {
/* find stress value */
acc= accumoffs + 2*ver->index;
if(acc[1]!=0.0f)
acc[0]/= acc[1];
- stress= RE_vertren_get_stress(re, ver, 1);
+ stress= RE_vertren_get_stress(obr, ver, 1);
*stress= *acc;
/* restore orcos */
@@ -442,14 +451,39 @@ static void calc_edge_stress(Render *re, Mesh *me, int startvert, int startvlak)
MEM_freeN(accum);
}
+void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang)
+{
+ float tangv[3], ct[3], e1[3], e2[3], s1, t1, s2, t2, det;
+
+ s1= uv2[0] - uv1[0];
+ s2= uv3[0] - uv1[0];
+ t1= uv2[1] - uv1[1];
+ t2= uv3[1] - uv1[1];
+ det= 1.0f / (s1 * t2 - s2 * t1);
+
+ /* normals in render are inversed... */
+ VecSubf(e1, co1, co2);
+ VecSubf(e2, co1, co3);
+ tang[0] = (t2*e1[0] - t1*e2[0])*det;
+ tang[1] = (t2*e1[1] - t1*e2[1])*det;
+ tang[2] = (t2*e1[2] - t1*e2[2])*det;
+ tangv[0] = (s1*e2[0] - s2*e1[0])*det;
+ tangv[1] = (s1*e2[1] - s2*e1[1])*det;
+ tangv[2] = (s1*e2[2] - s2*e1[2])*det;
+ Crossf(ct, tang, tangv);
+
+ /* check flip */
+ if ((ct[0]*n[0] + ct[1]*n[1] + ct[2]*n[2]) < 0.0f)
+ VecMulf(tang, -1.0f);
+}
+
/* gets tangent from tface or orco */
-static void calc_tangent_vector(Render *re, VlakRen *vlr)
+static void calc_tangent_vector(ObjectRen *obr, VlakRen *vlr)
{
- MTFace *tface= RE_vlakren_get_tface(re, vlr, 0, NULL, 0);
+ MTFace *tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
VertRen *v1=vlr->v1, *v2=vlr->v2, *v3=vlr->v3, *v4=vlr->v4;
- float tang[3], tangv[3], ct[3], e1[3], e2[3], *tav;
+ float tang[3], *tav;
float *uv1, *uv2, *uv3, *uv4;
- float s1, s2, t1, t2, det;
float uv[4][2];
if(tface) {
@@ -467,78 +501,43 @@ static void calc_tangent_vector(Render *re, VlakRen *vlr)
spheremap(v4->orco[0], v4->orco[1], v4->orco[2], &uv[3][0], &uv[3][1]);
}
else return;
+
+ tangent_from_uv(uv1, uv2, uv3, v1->co, v2->co, v3->co, vlr->n, tang);
- s1= uv2[0] - uv1[0];
- s2= uv3[0] - uv1[0];
- t1= uv2[1] - uv1[1];
- t2= uv3[1] - uv1[1];
- det= 1.0f / (s1 * t2 - s2 * t1);
-
- /* normals in render are inversed... */
- VecSubf(e1, v1->co, v2->co);
- VecSubf(e2, v1->co, v3->co);
- tang[0] = (t2*e1[0] - t1*e2[0])*det;
- tang[1] = (t2*e1[1] - t1*e2[1])*det;
- tang[2] = (t2*e1[2] - t1*e2[2])*det;
- tangv[0] = (s1*e2[0] - s2*e1[0])*det;
- tangv[1] = (s1*e2[1] - s2*e1[1])*det;
- tangv[2] = (s1*e2[2] - s2*e1[2])*det;
- Crossf(ct, tang, tangv);
- /* check flip */
- if ((ct[0]*vlr->n[0] + ct[1]*vlr->n[1] + ct[2]*vlr->n[2]) < 0.f)
- VecMulf(tang, -1.f);
-
- tav= RE_vertren_get_tangent(re, v1, 1);
+ tav= RE_vertren_get_tangent(obr, v1, 1);
VECADD(tav, tav, tang);
- tav= RE_vertren_get_tangent(re, v2, 1);
+ tav= RE_vertren_get_tangent(obr, v2, 1);
VECADD(tav, tav, tang);
- tav= RE_vertren_get_tangent(re, v3, 1);
+ tav= RE_vertren_get_tangent(obr, v3, 1);
VECADD(tav, tav, tang);
if(v4) {
- s1= uv3[0] - uv1[0];
- s2= uv4[0] - uv1[0];
- t1= uv3[1] - uv1[1];
- t2= uv4[1] - uv1[1];
- det= 1.0f / (s1 * t2 - s2 * t1);
-
- /* normals in render are inversed... */
- VecSubf(e1, v1->co, v3->co);
- VecSubf(e2, v1->co, v4->co);
- tang[0] = (t2*e1[0] - t1*e2[0])*det;
- tang[1] = (t2*e1[1] - t1*e2[1])*det;
- tang[2] = (t2*e1[2] - t1*e2[2])*det;
- tangv[0] = (s1*e2[0] - s2*e1[0])*det;
- tangv[1] = (s1*e2[1] - s2*e1[1])*det;
- tangv[2] = (s1*e2[2] - s2*e1[2])*det;
- Crossf(ct, tang, tangv);
- if ((ct[0]*vlr->n[0] + ct[1]*vlr->n[1] + ct[2]*vlr->n[2]) < 0.f)
- VecMulf(tang, -1.f);
+ tangent_from_uv(uv1, uv3, uv4, v1->co, v3->co, v4->co, vlr->n, tang);
- tav= RE_vertren_get_tangent(re, v1, 1);
+ tav= RE_vertren_get_tangent(obr, v1, 1);
VECADD(tav, tav, tang);
- tav= RE_vertren_get_tangent(re, v3, 1);
+ tav= RE_vertren_get_tangent(obr, v3, 1);
VECADD(tav, tav, tang);
- tav= RE_vertren_get_tangent(re, v4, 1);
+ tav= RE_vertren_get_tangent(obr, v4, 1);
VECADD(tav, tav, tang);
}
}
-static void calc_vertexnormals(Render *re, int startvert, int startvlak, int do_tangent)
+static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent)
{
int a;
/* clear all vertex normals */
- for(a=startvert; a<re->totvert; a++) {
- VertRen *ver= RE_findOrAddVert(re, a);
+ for(a=0; a<obr->totvert; a++) {
+ VertRen *ver= RE_findOrAddVert(obr, a);
ver->n[0]=ver->n[1]=ver->n[2]= 0.0f;
}
/* calculate cos of angles and point-masses, use as weight factor to
add face normal to vertex */
- for(a=startvlak; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
+ for(a=0; a<obr->totvlak; a++) {
+ VlakRen *vlr= RE_findOrAddVlak(obr, a);
if(vlr->flag & ME_SMOOTH) {
VertRen *v1= vlr->v1;
VertRen *v2= vlr->v2;
@@ -604,13 +603,13 @@ static void calc_vertexnormals(Render *re, int startvert, int startvlak, int do_
if(do_tangent) {
/* tangents still need to be calculated for flat faces too */
/* weighting removed, they are not vertexnormals */
- calc_tangent_vector(re, vlr);
+ calc_tangent_vector(obr, vlr);
}
}
/* do solid faces */
- for(a=startvlak; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
+ for(a=0; a<obr->totvlak; a++) {
+ VlakRen *vlr= RE_findOrAddVlak(obr, a);
if((vlr->flag & ME_SMOOTH)==0) {
float *f1= vlr->v1->n;
if(f1[0]==0.0 && f1[1]==0.0 && f1[2]==0.0) VECCOPY(f1, vlr->n);
@@ -626,11 +625,11 @@ static void calc_vertexnormals(Render *re, int startvert, int startvlak, int do_
}
/* normalize vertex normals */
- for(a=startvert; a<re->totvert; a++) {
- VertRen *ver= RE_findOrAddVert(re, a);
+ for(a=0; a<obr->totvert; a++) {
+ VertRen *ver= RE_findOrAddVert(obr, a);
Normalize(ver->n);
if(do_tangent) {
- float *tav= RE_vertren_get_tangent(re, ver, 0);
+ float *tav= RE_vertren_get_tangent(obr, ver, 0);
if (tav) {
/* orthonorm. */
float tdn = tav[0]*ver->n[0] + tav[1]*ver->n[1] + tav[2]*ver->n[2];
@@ -641,40 +640,20 @@ static void calc_vertexnormals(Render *re, int startvert, int startvlak, int do_
}
}
}
-
- /* vertex normal (puno) switch flags for during render */
- for(a=startvlak; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
-
- if((vlr->flag & R_NOPUNOFLIP)==0) {
- float *v1= vlr->v1->n;
- float *v2= vlr->v2->n;
- float *v3= vlr->v3->n;
- float *v4= vlr->v4?vlr->v4->n:NULL;
- float *nor= vlr->n;
- vlr->puno &= ~15;
- if ((nor[0]*v1[0] + nor[1]*v1[1] + nor[2]*v1[2]) < -FLT_EPSILON10) vlr->puno= 1;
- if ((nor[0]*v2[0] + nor[1]*v2[1] + nor[2]*v2[2]) < -FLT_EPSILON10) vlr->puno+= 2;
- if ((nor[0]*v3[0] + nor[1]*v3[1] + nor[2]*v3[2]) < -FLT_EPSILON10) vlr->puno+= 4;
- if(v4) {
- if((nor[0]*v4[0] + nor[1]*v4[1] + nor[2]*v4[2]) < -FLT_EPSILON10 ) vlr->puno+= 8;
- }
- }
- }
}
// NT same as calc_vertexnormals, but dont modify the existing vertex normals
// only recalculate other render data. If this is at some point used for other things than fluidsim,
// this could be made on option for the normal calc_vertexnormals
-static void calc_fluidsimnormals(Render *re, int startvert, int startvlak, int do_tangent)
+static void calc_fluidsimnormals(Render *re, ObjectRen *obr, int do_tangent)
{
int a;
/* dont clear vertex normals here */
- // OFF for(a=startvert; a<re->totvert; a++) { VertRen *ver= RE_findOrAddVert(re, a); ver->n[0]=ver->n[1]=ver->n[2]= 0.0; }
+ // OFF for(a=0; a<obr->totvert; a++) { VertRen *ver= RE_findOrAddVert(obr, a); ver->n[0]=ver->n[1]=ver->n[2]= 0.0; }
/* calculate cos of angles and point-masses, use as weight factor to add face normal to vertex */
- for(a=startvlak; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
+ for(a=0; a<obr->totvlak; a++) {
+ VlakRen *vlr= RE_findOrAddVlak(obr, a);
if(vlr->flag & ME_SMOOTH) {
VertRen *v1= vlr->v1;
VertRen *v2= vlr->v2;
@@ -714,18 +693,18 @@ static void calc_fluidsimnormals(Render *re, int startvert, int startvlak, int d
}
//if(do_tangent)
- // calc_tangent_vector(re, vlr, fac1, fac2, fac3, fac4);
+ // calc_tangent_vector(obr, vlr, fac1, fac2, fac3, fac4);
}
if(do_tangent) {
/* tangents still need to be calculated for flat faces too */
/* weighting removed, they are not vertexnormals */
- calc_tangent_vector(re, vlr);
+ calc_tangent_vector(obr, vlr);
}
}
/* do solid faces */
- for(a=startvlak; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
+ for(a=0; a<obr->totvlak; a++) {
+ VlakRen *vlr= RE_findOrAddVlak(obr, a);
if((vlr->flag & ME_SMOOTH)==0) {
float *f1= vlr->v1->n;
if(f1[0]==0.0 && f1[1]==0.0 && f1[2]==0.0) VECCOPY(f1, vlr->n);
@@ -741,32 +720,14 @@ static void calc_fluidsimnormals(Render *re, int startvert, int startvlak, int d
}
/* normalize vertex normals */
- for(a=startvert; a<re->totvert; a++) {
- VertRen *ver= RE_findOrAddVert(re, a);
+ for(a=0; a<obr->totvert; a++) {
+ VertRen *ver= RE_findOrAddVert(obr, a);
Normalize(ver->n);
if(do_tangent) {
- float *tav= RE_vertren_get_tangent(re, ver, 0);
+ float *tav= RE_vertren_get_tangent(obr, ver, 0);
if(tav) Normalize(tav);
}
}
-
- /* vertex normal (puno) switch flags for during render */
- for(a=startvlak; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
- if((vlr->flag & R_NOPUNOFLIP)==0) {
- VertRen *v1= vlr->v1;
- VertRen *v2= vlr->v2;
- VertRen *v3= vlr->v3;
- VertRen *v4= vlr->v4;
- vlr->puno &= ~15;
- if ((vlr->n[0]*v1->n[0]+vlr->n[1]*v1->n[1]+vlr->n[2]*v1->n[2])<0.0) vlr->puno= 1;
- if ((vlr->n[0]*v2->n[0]+vlr->n[1]*v2->n[1]+vlr->n[2]*v2->n[2])<0.0) vlr->puno+= 2;
- if ((vlr->n[0]*v3->n[0]+vlr->n[1]*v3->n[1]+vlr->n[2]*v3->n[2])<0.0) vlr->puno+= 4;
- if(v4) {
- if((vlr->n[0]*v4->n[0]+vlr->n[1]*v4->n[1]+vlr->n[2]*v4->n[2])<0.0) vlr->puno+= 8;
- }
- }
- }
}
/* ------------------------------------------------------------------------- */
@@ -865,18 +826,17 @@ static VertRen *as_findvertex(VlakRen *vlr, VertRen *ver, ASvert *asv, float thr
/* note; autosmooth happens in object space still, after applying autosmooth we rotate */
/* note2; actually, when original mesh and displist are equal sized, face normals are from original mesh */
-static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak, int degr)
+static void autosmooth(Render *re, ObjectRen *obr, float mat[][4], int degr)
{
- ASvert *asv, *asverts, *asvertoffs;
+ ASvert *asv, *asverts;
ASface *asf;
VertRen *ver, *v1;
VlakRen *vlr;
float thresh;
int a, b, totvert;
- if(startvert==re->totvert) return;
- asverts= MEM_callocN(sizeof(ASvert)*(re->totvert-startvert), "all smooth verts");
- asvertoffs= asverts-startvert; /* se we can use indices */
+ if(obr->totvert==0) return;
+ asverts= MEM_callocN(sizeof(ASvert)*obr->totvert, "all smooth verts");
thresh= cos( M_PI*(0.5f+(float)degr)/180.0 );
@@ -884,24 +844,24 @@ static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak,
/* step one: construct listbase of all vertices and pointers to faces */
- for(a=startvlak; a<re->totvlak; a++) {
- vlr= RE_findOrAddVlak(re, a);
+ for(a=0; a<obr->totvlak; a++) {
+ vlr= RE_findOrAddVlak(obr, a);
/* skip wire faces */
if(vlr->v2 != vlr->v3) {
- as_addvert(asvertoffs+vlr->v1->index, vlr->v1, vlr);
- as_addvert(asvertoffs+vlr->v2->index, vlr->v2, vlr);
- as_addvert(asvertoffs+vlr->v3->index, vlr->v3, vlr);
+ as_addvert(asverts+vlr->v1->index, vlr->v1, vlr);
+ as_addvert(asverts+vlr->v2->index, vlr->v2, vlr);
+ as_addvert(asverts+vlr->v3->index, vlr->v3, vlr);
if(vlr->v4)
- as_addvert(asvertoffs+vlr->v4->index, vlr->v4, vlr);
+ as_addvert(asverts+vlr->v4->index, vlr->v4, vlr);
}
}
+ totvert= obr->totvert;
/* we now test all vertices, when faces have a normal too much different: they get a new vertex */
- totvert= re->totvert;
- for(a=startvert, asv=asverts; a<totvert; a++, asv++) {
+ for(a=0, asv=asverts; a<totvert; a++, asv++) {
if(asv && asv->totface>1) {
- ver= RE_findOrAddVert(re, a);
-
+ ver= RE_findOrAddVert(obr, a);
+
asf= asv->faces.first;
while(asf) {
for(b=0; b<4; b++) {
@@ -914,7 +874,7 @@ static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak,
v1= as_findvertex(vlr, ver, asv, thresh);
if(v1==NULL) {
/* make a new vertex */
- v1= RE_vertren_copy(re, ver);
+ v1= RE_vertren_copy(obr, ver);
}
asf->nver[b]= v1;
if(vlr->v1==ver) vlr->v1= v1;
@@ -929,18 +889,18 @@ static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak,
}
/* free */
- for(a=0; a<totvert-startvert; a++) {
+ for(a=0; a<totvert; a++) {
BLI_freelistN(&asverts[a].faces);
}
MEM_freeN(asverts);
/* rotate vertices and calculate normal of faces */
- for(a=startvert; a<re->totvert; a++) {
- ver= RE_findOrAddVert(re, a);
+ for(a=0; a<obr->totvert; a++) {
+ ver= RE_findOrAddVert(obr, a);
MTC_Mat4MulVecfl(mat, ver->co);
}
- for(a=startvlak; a<re->totvlak; a++) {
- vlr= RE_findOrAddVlak(re, a);
+ for(a=0; a<obr->totvlak; a++) {
+ vlr= RE_findOrAddVlak(obr, a);
/* skip wire faces */
if(vlr->v2 != vlr->v3) {
@@ -953,14 +913,9 @@ static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak,
}
/* ------------------------------------------------------------------------- */
-/* End of autosmoothing: */
+/* Orco hash and Materials */
/* ------------------------------------------------------------------------- */
-/* ------------------------------------------------------------------------- */
-/* Orco hash */
-/* ------------------------------------------------------------------------- */
-
-
static float *get_object_orco(Render *re, Object *ob)
{
float *orco;
@@ -971,9 +926,7 @@ static float *get_object_orco(Render *re, Object *ob)
orco = BLI_ghash_lookup(re->orco_hash, ob);
if (!orco) {
- if (ob->type==OB_MESH) {
- orco = mesh_create_orco_render(ob);
- } else if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
+ if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
orco = make_orco_curve(ob);
} else if (ob->type==OB_SURF) {
orco = make_orco_surf(ob);
@@ -986,6 +939,14 @@ static float *get_object_orco(Render *re, Object *ob)
return orco;
}
+static void set_object_orco(Render *re, void *ob, float *orco)
+{
+ if (!re->orco_hash)
+ re->orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+
+ BLI_ghash_insert(re->orco_hash, ob, orco);
+}
+
static void free_mesh_orco_hash(Render *re)
{
if (re->orco_hash) {
@@ -994,59 +955,6 @@ static void free_mesh_orco_hash(Render *re)
}
}
-/* ******************** END ORCO HASH ***************** */
-
-
-static void make_render_halos(Render *re, Object *ob, Mesh *me, int totvert, MVert *mvert, Material *ma, float *orco)
-{
- HaloRen *har;
- float xn, yn, zn, nor[3], view[3];
- float vec[3], hasize, mat[4][4], imat[3][3];
- int a, ok, seed= ma->seed1;
-
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat3CpyMat4(imat, ob->imat);
-
- re->flag |= R_HALO;
-
- for(a=0; a<totvert; a++, mvert++) {
- ok= 1;
-
- if(ok) {
- hasize= ma->hasize;
-
- VECCOPY(vec, mvert->co);
- MTC_Mat4MulVecfl(mat, vec);
-
- if(ma->mode & MA_HALOPUNO) {
- xn= mvert->no[0];
- yn= mvert->no[1];
- zn= mvert->no[2];
-
- /* transpose ! */
- nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
- nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
- nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
- Normalize(nor);
-
- VECCOPY(view, vec);
- Normalize(view);
-
- zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
- if(zn>=0.0) hasize= 0.0;
- else hasize*= zn*zn*zn*zn;
- }
-
- if(orco) har= RE_inithalo(re, ma, vec, NULL, orco, hasize, 0.0, seed);
- else har= RE_inithalo(re, ma, vec, NULL, mvert->co, hasize, 0.0, seed);
- if(har) har->lay= ob->lay;
- }
- if(orco) orco+= 3;
- seed++;
- }
-}
-
-/* ------------------------------------------------------------------------- */
static Material *give_render_material(Render *re, Object *ob, int nr)
{
extern Material defmaterial; /* material.c */
@@ -1067,176 +975,32 @@ static Material *give_render_material(Render *re, Object *ob, int nr)
return ma;
}
-
-
-static void render_particle_system(Render *re, Object *ob, Object *par, PartEff *paf)
-{
- Particle *pa=0;
- HaloRen *har=0;
- Material *ma=0;
- float xn, yn, zn, imat[3][3], tmat[4][4], mat[4][4], hasize, stime, ptime, ctime, vec[3], vec1[3], view[3], nor[3];
- float haloScale = 1.0; //NT scale halos
- float iniAlpha = 0.0; // restore material alpha
- int a, mat_nr=1, seed;
- int useFluidsimParticles = 0; // FSPARTICLE
-
- ma= give_render_material(re, ob, paf->omat);
-
- if( (ob->fluidsimSettings) && (ob->fluidsimSettings->type == OB_FLUIDSIM_PARTICLE)) {
- useFluidsimParticles = 1;
- iniAlpha = ma->alpha;
- }
-
- pa= paf->keys;
- if(pa==NULL || paf->disp!=100 || useFluidsimParticles) {
- build_particle_system(ob);
- pa= paf->keys;
- if(pa==NULL) return;
- }
-
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat); /* this is correct, for imat texture */
-
- /* enable duplicators to work */
- if(par) {
- Mat4MulMat4(tmat, paf->imat, ob->obmat);
- MTC_Mat4MulMat4(mat, tmat, re->viewmat);
-
- MTC_Mat4Invert(tmat, mat);
- MTC_Mat3CpyMat4(imat, tmat);
- }
- else {
- MTC_Mat4CpyMat4(mat, re->viewmat);
-
- MTC_Mat4Invert(tmat, re->viewmat);
- MTC_Mat3CpyMat4(imat, tmat);
-
- }
-
- re->flag |= R_HALO;
-
- if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
- else ptime= 0.0;
- ctime= bsystem_time(ob, (float)re->scene->r.cfra, ptime);
- seed= ma->seed1;
-
- for(a=0; a<paf->totpart; a++, pa+=paf->totkey, seed++) {
-
- /* offset time for calculating normal */
- stime= ctime;
- ptime= ctime+1.0f;
- if(ctime < pa->time) {
- if(paf->flag & PAF_UNBORN)
- ptime= pa->time+1.0f;
- else
- continue;
- }
- if(ctime > pa->time+pa->lifetime) {
- if(paf->flag & PAF_DIED)
- stime= pa->time+pa->lifetime-1.0f;
- else
- continue;
- }
-
- /* watch it: also calculate the normal of a particle */
- if(paf->stype==PAF_VECT || ma->mode & MA_HALO_SHADE) {
- where_is_particle(paf, pa, stime, vec);
- MTC_Mat4MulVecfl(mat, vec);
- where_is_particle(paf, pa, ptime, vec1);
- MTC_Mat4MulVecfl(mat, vec1);
- }
- else {
- where_is_particle(paf, pa, ctime, vec);
- MTC_Mat4MulVecfl(mat, vec);
- }
-
- if(pa->mat_nr != mat_nr) {
- mat_nr= pa->mat_nr;
- ma= give_render_material(re, ob, mat_nr);
- }
-
- if(ma->ipo) {
- /* correction for lifetime */
- ptime= 100.0*(ctime-pa->time)/pa->lifetime;
- calc_ipo(ma->ipo, ptime);
- execute_ipo((ID *)ma, ma->ipo);
- }
-
- //NT scale halos FSPARTICLE
- if(useFluidsimParticles) {
- // rescale to 1.0-10.0, then div by 5 afterwards, gives values in range 0.2-2.0
- double fspsize = ((double)pa->rt / 1000.0f) / 5.0 ;
- haloScale = 1.0/(float)pow(fspsize, (double)ob->fluidsimSettings->particleInfSize);
- ma->alpha = iniAlpha / (float)pow( fspsize, (double)ob->fluidsimSettings->particleInfAlpha);
- if(ma->alpha>1.) ma->alpha = 1.;
- }
-
- hasize= ma->hasize * haloScale;
-
- if(ma->mode & MA_HALOPUNO) {
- xn= pa->no[0];
- yn= pa->no[1];
- zn= pa->no[2];
-
- /* transpose ! */
- nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
- nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
- nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
- Normalize(nor);
-
- VECCOPY(view, vec);
- Normalize(view);
-
- zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
- if(zn>=0.0) hasize= 0.0;
- else hasize*= zn*zn*zn*zn;
- }
-
- if(paf->stype==PAF_VECT) har= RE_inithalo(re, ma, vec, vec1, pa->co, hasize, paf->vectsize, seed);
- else {
- har= RE_inithalo(re, ma, vec, NULL, pa->co, hasize, 0.0, seed);
- if(har && ma->mode & MA_HALO_SHADE) {
- VecSubf(har->no, vec, vec1);
- Normalize(har->no);
- }
- }
- if(har) har->lay= ob->lay;
- }
-
- /* restore material */
- for(a=1; a<=ob->totcol; a++) {
- ma= give_render_material(re, ob, a);
- if(ma) do_mat_ipo(ma);
- }
-
- if(paf->disp!=100) {
- MEM_freeN(paf->keys);
- paf->keys= NULL;
- }
-
- if(useFluidsimParticles) { ma->alpha = iniAlpha; }// FSPARTICLE restore...
-}
-
-
+/* ------------------------------------------------------------------------- */
+/* Particles */
/* ------------------------------------------------------------------------- */
/* 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, ObjectRen *obr, Material *ma, float *orco, float *surfnor,
+ 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;
+ float nor[3], cross[3], crosslen, w, dx, dy, width;
+ 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);
-
+
/* 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);
+ dx= re->winx*cross[0]*re->winmat[0][0];
+ dy= re->winy*cross[1]*re->winmat[1][1];
+ w= sqrt(dx*dx + dy*dy)/w;
+
if(w!=0.0f) {
float fac;
if(ma->strand_ease!=0.0f) {
@@ -1246,8 +1010,23 @@ 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 minimum width */
+ if(ma->mode & MA_STR_B_UNITS){
+ crosslen= VecLength(cross);
+ w= 2.0f*crosslen*ma->strand_min/w;
+
+ if(width < w)
+ width= w;
+
+ /*cross is the radius of the strand so we want it to be half of full width */
+ VecMulf(cross,0.5/crosslen);
+ }
+ else
+ width/=w;
+
VecMulf(cross, width);
}
else width= 1.0f;
@@ -1261,10 +1040,80 @@ 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) {
- v1= RE_findOrAddVert(re, re->totvert++);
- v2= RE_findOrAddVert(re, re->totvert++);
+ /* single face line */
+ if(line) {
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->flag= flag;
+ vlr->v1= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v2= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v3= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v4= RE_findOrAddVert(obr, obr->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;
+
+ if(surfnor) {
+ float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
+ VECCOPY(snor, surfnor);
+ }
+
+ if(uvco){
+ for(i=0; i<totuv; i++){
+ MTFace *mtf;
+ mtf=RE_vlakren_get_tface(obr,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(obr,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(obr, obr->totvert++);
+ v2= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(v1->co, vec);
VecAddf(v1->co, v1->co, cross);
@@ -1278,19 +1127,56 @@ 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(obr, obr->totvlak++);
+ vlr->flag= flag;
+ vlr->v1= v1;
+ vlr->v2= v2;
+ vlr->v3= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v4= RE_findOrAddVert(obr, obr->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(obr, obr->totvlak++);
+ vlr->flag= flag;
+ vlr->v1= v1;
+ vlr->v2= v2;
+ vlr->v3= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v4= RE_findOrAddVert(obr, obr->totvert++);
+
+ v1= vlr->v4; // cycle
+ v2= vlr->v3; // cycle
+
+ VECCOPY(anor,nor);
+ VECCOPY(avec,vec);
+ }
+ else{
+ vlr= RE_findOrAddVlak(obr, obr->totvlak-1);
+ }
+ }
+
VECCOPY(vlr->v4->co, vec);
VecAddf(vlr->v4->co, vlr->v4->co, cross);
VECCOPY(vlr->v4->n, nor);
@@ -1307,250 +1193,1079 @@ static void static_particle_strand(Render *re, Object *ob, Material *ma, float *
vlr->mat= ma;
vlr->ec= ME_V2V3;
- vlr->lay= ob->lay;
+
+ if(surfnor) {
+ float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
+ VECCOPY(snor, surfnor);
+ }
+
+ if(uvco){
+ for(i=0; i<totuv; i++){
+ MTFace *mtf;
+ mtf=RE_vlakren_get_tface(obr,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(obr,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 render_static_particle_system(Render *re, Object *ob, PartEff *paf)
+static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float *vec1, int first, int line)
{
- Particle *pa=0;
- HaloRen *har=0;
- Material *ma=0;
- VertRen *v1= NULL;
VlakRen *vlr;
- float xn, yn, zn, imat[3][3], mat[4][4], hasize;
- float mtime, ptime, ctime, vec[3], vec1[3], view[3], nor[3];
- float *orco= NULL, loc_tex[3], size_tex[3];
- int a, mat_nr=1, seed, totvlako, totverto, first;
+ static VertRen *v1;
+
+ if(line) {
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v2= RE_findOrAddVert(obr, obr->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;
- pa= paf->keys;
- if(pa==NULL || (paf->flag & PAF_ANIMATED) || paf->disp!=100) {
- build_particle_system(ob);
- pa= paf->keys;
- if(pa==NULL) return;
}
+ else if(first) {
+ v1= RE_findOrAddVert(obr, obr->totvert++);
+ VECCOPY(v1->co, vec);
+ }
+ else {
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= v1;
+ vlr->v2= RE_findOrAddVert(obr, obr->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;
+ }
+
+}
+static void particle_billboard(Render *re, ObjectRen *obr, 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(obr, obr->totvlak++);
+ vlr->v1= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v2= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v3= RE_findOrAddVert(obr, obr->totvert++);
+ vlr->v4= RE_findOrAddVert(obr, obr->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);
- totvlako= re->totvlak;
- totverto= re->totvert;
+ 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);
- ma= give_render_material(re, ob, paf->omat);
- if(ma->mode & MA_HALO)
- re->flag |= R_HALO;
+ vlr->mat= ma;
+ vlr->ec= ME_V2V3;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat); /* need to be that way, for imat texture */
+ 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);
- MTC_Mat3CpyMat4(imat, ob->imat);
+ }
+ 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(obr,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(obr,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(obr,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, ObjectRen *obr, DerivedMesh *dm, Material *ma, int path, int first, int line,
+ float time, float *loc, float *loc1, float *orco, float *surfnor, 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(obr, ma, loc, loc1, first, line);
+ else if(ma->mode & MA_HALO){
+ har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, orco, uvco, size, 1.0, seed);
+ if(har) har->lay= obr->ob->lay;
+ }
+ else
+ static_particle_strand(re, obr, ma, orco, surfnor, uvco, totuv, loc, loc1, time, first, line, adapt, adapt_angle, adapt_pix, override_uv);
+ }
+ else{
+ har= RE_inithalo_particle(re, obr, dm, ma, loc, NULL, orco, uvco, size, 0.0, seed);
+ if(har) har->lay= obr->ob->lay;
+ }
+}
+static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys, int timeoffset)
+{
+ Object *ob= obr->ob;
+ 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;
+ StrandBuffer *strandbuf=0;
+ StrandVert *svert=0;
+ StrandBound *sbound= 0;
+ StrandRen *strand=0;
+ RNG *rng= 0;
+ float loc[3],loc1[3],loc0[3],vel[3],mat[4][4],nmat[3][3],co[3],nor[3],time;
+ float *orco=0,*surfnor=0,*uvco=0, strandlen=0.0f, curlen=0.0f;
+ float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(ob,(float)CFRA,0.0);
+ float adapt_angle=0.0, adapt_pix=0.0, random, simplify[2];
+ int i, a, k, max_k=0, totpart, totuv=0, override_uv=-1, dosimplify = 0, dosurfacecache = 0;
+ 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}, num;
+ int totface, *origindex = 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_check_enabled(ob, psys))
+ return 0;
- /* orcos */
- if(!(ma->mode & (MA_HALO|MA_WIRE))) {
- orco= MEM_mallocN(3*sizeof(float)*paf->totpart, "static particle orcos");
- if (!re->orco_hash)
- re->orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
- BLI_ghash_insert(re->orco_hash, paf, orco); /* pointer is particles, otherwise object uses it */
+ 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;
}
+
+ psmd= psys_get_modifier(ob,psys);
+ if(!(psmd->modifier.mode & eModifierMode_Render))
+ return 0;
+
+ if(G.rendering == 0) { /* preview render */
+ totchild = (int)((float)totchild * (float)part->disp / 100.0f);
+ }
+
+ psys->flag|=PSYS_DRAWING;
+
+ rng= rng_new(psys->seed);
- mesh_get_texspace(ob->data, loc_tex, NULL, size_tex);
+ ma= give_render_material(re, ob, part->omat);
+
+ if(part->bb_ob)
+ bb_ob=part->bb_ob;
- if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
- else ptime= 0.0;
- ctime= bsystem_time(ob, (float)re->scene->r.cfra, ptime);
- seed= ma->seed1;
+ if(ma->ipo){
+ calc_ipo(ma->ipo, cfra);
+ execute_ipo((ID *)ma, ma->ipo);
+ }
- for(a=0; a<paf->totpart; a++, pa+=paf->totkey) {
-
- where_is_particle(paf, pa, pa->time, vec1);
- if(orco) {
- orco[0] = (vec1[0]-loc_tex[0])/size_tex[0];
- orco[1] = (vec1[1]-loc_tex[1])/size_tex[1];
- orco[2] = (vec1[2]-loc_tex[2])/size_tex[2];
+ RE_set_customdata_names(obr, &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(ma->strand_uvname[0]) {
+ override_uv= CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,ma->strand_uvname);
+ override_uv-= CustomData_get_layer_index(&psmd->dm->faceData,CD_MTFACE);
}
- MTC_Mat4MulVecfl(mat, vec1);
- mtime= pa->time+pa->lifetime+paf->staticstep-1;
-
- first= 1;
- for(ctime= pa->time; ctime<mtime; ctime+=paf->staticstep) {
-
- /* make sure hair grows until the end.. */
- if(ctime>pa->time+pa->lifetime) ctime= pa->time+pa->lifetime;
-
- /* watch it: also calc the normal of a particle */
- if(paf->stype==PAF_VECT || ma->mode & MA_HALO_SHADE) {
- where_is_particle(paf, pa, ctime+1.0, vec);
- MTC_Mat4MulVecfl(mat, vec);
+ }
+
+ 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;
+
+ MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ MTC_Mat4Invert(ob->imat, mat); /* need to be that way, for imat texture */
+ Mat3CpyMat4(nmat, ob->imat);
+ Mat3Transp(nmat);
+
+ totpart=psys->totpart;
+
+ 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");
+ set_object_orco(re, psys, orco);
+ }
+ path=1;
}
- else {
- where_is_particle(paf, pa, ctime, vec);
- MTC_Mat4MulVecfl(mat, vec);
+
+ 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));
}
- if(pa->mat_nr != mat_nr) {
- mat_nr= pa->mat_nr;
- ma= give_render_material(re, ob, mat_nr);
+ if(re->r.renderer==R_INTERN && part->draw&PART_DRAW_REN_STRAND) {
+ strandbuf= RE_addStrandBuffer(obr, (totpart+totchild)*(path_nbr+1));
+ strandbuf->ma= ma;
+ strandbuf->lay= ob->lay;
+ Mat4CpyMat4(strandbuf->winmat, re->winmat);
+ strandbuf->winx= re->winx;
+ strandbuf->winy= re->winy;
+ strandbuf->maxdepth= 2;
+ strandbuf->adaptcos= cos((float)part->adapt_angle*(float)(M_PI/180.0));
+ strandbuf->overrideuv= override_uv;
+ strandbuf->minwidth= ma->strand_min;
+
+ if(ma->strand_widthfade == 0.0f)
+ strandbuf->widthfade= 0.0f;
+ else if(ma->strand_widthfade >= 1.0f)
+ strandbuf->widthfade= 2.0f - ma->strand_widthfade;
+ else
+ strandbuf->widthfade= 1.0f/MAX2(ma->strand_widthfade, 1e-5f);
+
+ if(part->flag & PART_HAIR_BSPLINE)
+ strandbuf->flag |= R_STRAND_BSPLINE;
+ if(ma->mode & MA_STR_B_UNITS)
+ strandbuf->flag |= R_STRAND_B_UNITS;
+
+ svert= strandbuf->vert;
+
+ if(re->r.mode & R_SPEED)
+ dosurfacecache= 1;
+ else if((re->wrld.mode & WO_AMB_OCC) && (re->wrld.ao_gather_method == WO_AOGATHER_APPROX))
+ if(ma->amb != 0.0f)
+ dosurfacecache= 1;
+
+ totface= psmd->dm->getNumFaces(psmd->dm);
+ origindex= psmd->dm->getFaceDataArray(psmd->dm, CD_ORIGINDEX);
+ if(origindex) {
+ for(a=0; a<totface; a++)
+ strandbuf->totbound= MAX2(strandbuf->totbound, origindex[a]);
+ strandbuf->totbound++;
+ }
+ strandbuf->totbound++;
+ strandbuf->bound= MEM_callocN(sizeof(StrandBound)*strandbuf->totbound, "StrandBound");
+ sbound= strandbuf->bound;
+ sbound->start= sbound->end= 0;
}
-
- /* wires */
- if(ma->mode & MA_WIRE) {
- if(ctime == pa->time) {
- v1= RE_findOrAddVert(re, re->totvert++);
- VECCOPY(v1->co, vec);
+ }
+ }
+ 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 = rng_getFloat(rng);
+
+ 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);
}
- 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;
+ if(part->ipo){
+ /* correction for lifetime */
+ calc_ipo(part->ipo, 100.0f*pa_time);
+ execute_ipo((ID *)part, part->ipo);
}
}
- else {
- if(ma->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,pa->num_dmcache,tpa->fuv,tpa->foffset,co,nor,0,0,orco,0);
+ }
+ else
+ psys_particle_on_emitter(ob, psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,0);
+
+ num= pa->num_dmcache;
+
+ if(num == DMCACHE_NOTFOUND)
+ if(pa->num < psmd->dm->getNumFaces(psmd->dm))
+ num= pa->num;
+
+ 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++){
+ if(num != DMCACHE_NOTFOUND) {
+ MFace *mface=psmd->dm->getFaceData(psmd->dm,num,CD_MFACE);
+ mtface=(MTFace*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MTFACE,i);
+ mtface+=num;
+
+ psys_interpolate_uvs(mtface,mface->v4,pa->fuv,uvco+2*i);
+ }
+ else {
+ uvco[2*i]= 0.0f;
+ uvco[2*i + 1]= 0.0f;
+ }
+ }
+ }
+
+ 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, cpa, cfra);
+
+ if((part->flag&PART_ABS_TIME)==0){
+ if(ma->ipo){
/* correction for lifetime */
- ptime= 100.0*(ctime-pa->time)/pa->lifetime;
- calc_ipo(ma->ipo, ptime);
+ calc_ipo(ma->ipo, 100.0f*pa_time);
execute_ipo((ID *)ma, ma->ipo);
}
-
- if(ma->mode & MA_HALO) {
- hasize= ma->hasize;
+ if(part->ipo){
+ /* correction for lifetime */
+ calc_ipo(part->ipo, 100.0f*pa_time);
+ execute_ipo((ID *)part, part->ipo);
+ }
+ }
- if(ma->mode & MA_HALOPUNO) {
- xn= pa->no[0];
- yn= pa->no[1];
- zn= pa->no[2];
+ pa_size=psys_get_child_size(psys, cpa, cfra, &pa_time);
- /* transpose ! */
- nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
- nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
- nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
- Normalize(nor);
+ r_tilt=2.0f*cpa->rand[2];
- VECCOPY(view, vec);
- Normalize(view);
+ num= cpa->num;
- zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
- if(zn>=0.0) hasize= 0.0;
- else hasize*= zn*zn*zn*zn;
- }
+ /* get orco */
+ psys_particle_on_emitter(ob, psmd,
+ (part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
+ cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,nor,0,0,orco,0);
- if(paf->stype==PAF_VECT) har= RE_inithalo(re, ma, vec, vec1, pa->co, hasize, paf->vectsize, seed);
- else {
- har= RE_inithalo(re, ma, vec, NULL, pa->co, hasize, 0.0, seed);
- if(har && (ma->mode & MA_HALO_SHADE)) {
- VecSubf(har->no, vec, vec1);
- Normalize(har->no);
- har->lay= ob->lay;
+ 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){
+ 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;
+
+ psys_interpolate_uvs(mtface,mface->v4,cpa->fuv,uvco+2*i);
+ }
+ else{
+ uvco[2*i]=uvco[2*i+1]=0.0f;
}
}
- if(har) har->lay= ob->lay;
}
- else { /* generate pixel sized hair strand */
- float strandco= 1.0f;
-
- /* last strand, texco to end */
- if(ctime + paf->staticstep < mtime)
- strandco= (ctime-pa->time)/(mtime-pa->time);
-
- static_particle_strand(re, ob, ma, orco, vec, vec1, strandco, first);
+ else if(ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
+ for(i=0; i<totuv; i++){
+ ParticleData *parent = psys->particles+cpa->parent;
+ 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;
+
+ psys_interpolate_uvs(mtface,mface->v4,parent->fuv,uvco+2*i);
+ }
+ }
+ }
+
+ dosimplify= psys_render_simplify_params(psys, cpa, simplify);
+
+ if(path_nbr) {
+ cache = psys->childcache[a-totpart];
+ max_k = (int)cache->steps;
+ }
+
+ if(strandbuf) {
+ if(origindex[cpa->num]+1 > sbound - strandbuf->bound) {
+ sbound= strandbuf->bound + origindex[cpa->num]+1;
+ sbound->start= sbound->end= obr->totstrand;
}
}
-
- VECCOPY(vec1, vec);
- first= 0;
}
-
- seed++;
- if(orco) orco+=3;
+
+ /* surface normal shading setup */
+ if(ma->mode_l & MA_STR_SURFDIFF) {
+ Mat3MulVecfl(nmat, nor);
+ surfnor= nor;
+ }
+ else
+ surfnor= NULL;
+
+ /* strand render setup */
+ if(strandbuf) {
+ strand= RE_findOrAddStrand(obr, obr->totstrand++);
+ strand->buffer= strandbuf;
+ strand->vert= svert;
+ VECCOPY(strand->orco, orco);
+
+ if(dosimplify) {
+ float *ssimplify= RE_strandren_get_simplify(obr, strand, 1);
+ ssimplify[0]= simplify[0];
+ ssimplify[1]= simplify[1];
+ }
+
+ if(surfnor) {
+ float *snor= RE_strandren_get_surfnor(obr, strand, 1);
+ VECCOPY(snor, surfnor);
+ }
+
+ if(dosurfacecache && num >= 0) {
+ int *facenum= RE_strandren_get_face(obr, strand, 1);
+ *facenum= num;
+ }
+
+ if(uvco){
+ for(i=0; i<totuv; i++){
+ if(i != override_uv) {
+ float *uv= RE_strandren_get_uv(obr, strand, i, NULL, 1);
+
+ uv[0]= uvco[2*i];
+ uv[1]= uvco[2*i+1];
+ }
+ }
+ }
+
+ sbound->end++;
+ }
+
+ /* strandco computation setup */
+ if(path_nbr) {
+ strandlen= 0.0f;
+ curlen= 0.0f;
+ for(k=1; k<=path_nbr; k++)
+ if(k<=max_k)
+ strandlen += VecLenf((cache+k-1)->co, (cache+k)->co);
+ }
+
+ for(k=0; k<=path_nbr; k++){
+ if(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;
+
+ if(k > 0)
+ curlen += VecLenf((cache+k-1)->co, (cache+k)->co);
+ time= curlen/strandlen;
+ }
+ 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,obr,psmd->dm,ma,1,0,1,0.0f,loc0,loc1,
+ orco,surfnor,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,obr,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(strandbuf) {
+ VECCOPY(svert->co, loc);
+ svert->strandco= -1.0f + 2.0f*time;
+ svert++;
+ strand->totvert++;
+ }
+ else{
+ if(k==1){
+ VECSUB(loc0,loc1,loc);
+ VECADD(loc0,loc1,loc0);
+ render_new_particle(re,obr,psmd->dm,ma,path,1,0,0.0f,loc1,loc0,
+ orco,surfnor,totuv,uvco,hasize,seed,override_uv,
+ adapt,adapt_angle,adapt_pix);
+ }
+
+ if(path_nbr==0 || k)
+ render_new_particle(re,obr,psmd->dm,ma,path,0,0,time,loc,loc1,
+ orco,surfnor,totuv,uvco,hasize,seed,override_uv,
+ adapt,adapt_angle,adapt_pix);
+
+ VECCOPY(loc1,loc);
+ }
+ }
+
+ if(orco1==0)
+ orco+=3;
+
+ if(re->test_break())
+ break;
}
- if(paf->disp!=100) {
- MEM_freeN(paf->keys);
- paf->keys= NULL;
+ if(dosurfacecache)
+ strandbuf->surface= cache_strand_surface(re, obr, psmd->dm, mat, timeoffset);
+
+/* 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);
+
+ rng_free(rng);
+
+ psys->flag &= ~PSYS_DRAWING;
+
+ if(psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
}
- if((ma->mode & MA_TANGENT_STR)==0)
- calc_vertexnormals(re, totverto, totvlako, 0);
-}
+ if(path && (ma->mode_l & MA_TANGENT_STR)==0)
+ calc_vertexnormals(re, obr, 0);
+ return 1;
+}
/* ------------------------------------------------------------------------- */
+/* Halo's */
+/* ------------------------------------------------------------------------- */
+
+static void make_render_halos(Render *re, ObjectRen *obr, Mesh *me, int totvert, MVert *mvert, Material *ma, float *orco)
+{
+ Object *ob= obr->ob;
+ HaloRen *har;
+ float xn, yn, zn, nor[3], view[3];
+ float vec[3], hasize, mat[4][4], imat[3][3];
+ int a, ok, seed= ma->seed1;
+
+ MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ MTC_Mat3CpyMat4(imat, ob->imat);
+
+ re->flag |= R_HALO;
+
+ for(a=0; a<totvert; a++, mvert++) {
+ ok= 1;
+
+ if(ok) {
+ hasize= ma->hasize;
+
+ VECCOPY(vec, mvert->co);
+ MTC_Mat4MulVecfl(mat, vec);
+
+ if(ma->mode & MA_HALOPUNO) {
+ xn= mvert->no[0];
+ yn= mvert->no[1];
+ zn= mvert->no[2];
+
+ /* transpose ! */
+ nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
+ nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
+ nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+ Normalize(nor);
+
+ VECCOPY(view, vec);
+ Normalize(view);
+
+ zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
+ if(zn>=0.0) hasize= 0.0;
+ else hasize*= zn*zn*zn*zn;
+ }
+
+ if(orco) har= RE_inithalo(re, obr, ma, vec, NULL, orco, hasize, 0.0, seed);
+ else har= RE_inithalo(re, obr, ma, vec, NULL, mvert->co, hasize, 0.0, seed);
+ if(har) har->lay= ob->lay;
+ }
+ if(orco) orco+= 3;
+ seed++;
+ }
+}
static int verghalo(const void *a1, const void *a2)
{
- const struct halosort *x1=a1, *x2=a2;
+ const HaloRen *har1= a1, *har2= a2;
- if( x1->z < x2->z ) return 1;
- else if( x1->z > x2->z) return -1;
+ if(har1->zs < har2->zs) return 1;
+ else if(har1->zs > har2->zs) return -1;
return 0;
}
-/* ------------------------------------------------------------------------- */
-static void sort_halos(Render *re)
+static void sort_halos(Render *re, int totsort)
{
- struct halosort *hablock, *haso;
- HaloRen *har = NULL, **bloha;
+ ObjectRen *obr;
+ HaloRen *har= NULL, **haso;
int a;
if(re->tothalo==0) return;
- /* make datablock with halo pointers, sort */
- haso= hablock= MEM_mallocN(sizeof(struct halosort)*re->tothalo, "hablock");
+ re->sortedhalos= MEM_callocN(sizeof(HaloRen*)*re->tothalo, "sorthalos");
+ haso= re->sortedhalos;
- for(a=0; a<re->tothalo; a++) {
- if((a & 255)==0) har= re->bloha[a>>8];
- else har++;
- haso->har= har;
- haso->z= har->zs;
- haso++;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->tothalo; a++) {
+ if((a & 255)==0) har= obr->bloha[a>>8];
+ else har++;
+
+ *(haso++)= har;
+ }
}
- qsort(hablock, re->tothalo, sizeof(struct halosort), verghalo);
+ qsort(re->sortedhalos, totsort, sizeof(HaloRen*), verghalo);
+}
- /* re-assamble re->bloha */
+/* ------------------------------------------------------------------------- */
+/* Displacement Mapping */
+/* ------------------------------------------------------------------------- */
- bloha= re->bloha;
- re->bloha= (HaloRen **)MEM_callocN(sizeof(void *)*(re->blohalen),"Bloha");
+static short test_for_displace(Render *re, Object *ob)
+{
+ /* return 1 when this object uses displacement textures. */
+ Material *ma;
+ int i;
+
+ for (i=1; i<=ob->totcol; i++) {
+ ma=give_render_material(re, ob, i);
+ /* ma->mapto is ORed total of all mapto channels */
+ if(ma && (ma->mapto & MAP_DISPLACE)) return 1;
+ }
+ return 0;
+}
- haso= hablock;
- for(a=0; a<re->tothalo; a++) {
- har= RE_findOrAddHalo(re, a);
- *har= *(haso->har);
+static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale)
+{
+ MTFace *tface;
+ short texco= shi->mat->texco;
+ float sample=0;
+ char *name;
+ int i;
+
+ /* shi->co is current render coord, just make sure at least some vector is here */
+ VECCOPY(shi->co, vr->co);
+ /* vertex normal is used for textures type 'col' and 'var' */
+ VECCOPY(shi->vn, vr->n);
- haso++;
+ if (texco & TEXCO_UV) {
+ shi->totuv= 0;
+ shi->actuv= obr->actmtface;
+
+ for (i=0; (tface=RE_vlakren_get_tface(obr, shi->vlr, i, &name, 0)); i++) {
+ ShadeInputUV *suv= &shi->uv[i];
+
+ /* shi.uv needs scale correction from tface uv */
+ suv->uv[0]= 2*tface->uv[vindex][0]-1.0f;
+ suv->uv[1]= 2*tface->uv[vindex][1]-1.0f;
+ suv->uv[2]= 0.0f;
+ suv->name= name;
+ shi->totuv++;
+ }
}
- /* free */
- a= 0;
- while(bloha[a]) {
- MEM_freeN(bloha[a]);
- a++;
+ /* set all rendercoords, 'texco' is an ORed value for all textures needed */
+ if ((texco & TEXCO_ORCO) && (vr->orco)) {
+ VECCOPY(shi->lo, vr->orco);
+ }
+ if (texco & TEXCO_STICKY) {
+ float *sticky= RE_vertren_get_sticky(obr, vr, 0);
+ if(sticky) {
+ shi->sticky[0]= sticky[0];
+ shi->sticky[1]= sticky[1];
+ shi->sticky[2]= 0.0f;
+ }
+ }
+ if (texco & TEXCO_GLOB) {
+ VECCOPY(shi->gl, shi->co);
+ MTC_Mat4MulVecfl(re->viewinv, shi->gl);
+ }
+ if (texco & TEXCO_NORM) {
+ VECCOPY(shi->orn, shi->vn);
+ }
+ if(texco & TEXCO_REFL) {
+ /* not (yet?) */
+ }
+
+ shi->displace[0]= shi->displace[1]= shi->displace[2]= 0.0;
+
+ do_material_tex(shi);
+
+ //printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2],
+ //vr->co[0], vr->co[1], vr->co[2]);
+
+ /* 0.5 could become button once? */
+ vr->co[0] += shi->displace[0] * scale[0] ;
+ vr->co[1] += shi->displace[1] * scale[1] ;
+ vr->co[2] += shi->displace[2] * scale[2] ;
+
+ //printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]);
+
+ /* we just don't do this vertex again, bad luck for other face using same vertex with
+ different material... */
+ vr->flag |= 1;
+
+ /* Pass sample back so displace_face can decide which way to split the quad */
+ sample = shi->displace[0]*shi->displace[0];
+ sample += shi->displace[1]*shi->displace[1];
+ sample += shi->displace[2]*shi->displace[2];
+
+ vr->accum=sample;
+ /* Should be sqrt(sample), but I'm only looking for "bigger". Save the cycles. */
+ return;
+}
+
+static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float *scale)
+{
+ ShadeInput shi;
+
+ /* Warning, This is not that nice, and possibly a bit slow,
+ however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
+ memset(&shi, 0, sizeof(ShadeInput));
+ /* end warning! - Campbell */
+
+ /* set up shadeinput struct for multitex() */
+
+ /* memset above means we dont need this */
+ /*shi.osatex= 0;*/ /* signal not to use dx[] and dy[] texture AA vectors */
+
+ shi.vlr= vlr; /* current render face */
+ shi.mat= vlr->mat; /* current input material */
+
+ /* Displace the verts, flag is set when done */
+ if (!vlr->v1->flag)
+ displace_render_vert(re, obr, &shi, vlr->v1,0, scale);
+
+ if (!vlr->v2->flag)
+ displace_render_vert(re, obr, &shi, vlr->v2, 1, scale);
+
+ if (!vlr->v3->flag)
+ displace_render_vert(re, obr, &shi, vlr->v3, 2, scale);
+
+ if (vlr->v4) {
+ if (!vlr->v4->flag)
+ displace_render_vert(re, obr, &shi, vlr->v4, 3, scale);
+
+ /* closest in displace value. This will help smooth edges. */
+ if ( fabs(vlr->v1->accum - vlr->v3->accum) > fabs(vlr->v2->accum - vlr->v4->accum))
+ vlr->flag |= R_DIVIDE_24;
+ else vlr->flag &= ~R_DIVIDE_24;
}
- MEM_freeN(bloha);
- MEM_freeN(hablock);
+
+ /* Recalculate the face normal - if flipped before, flip now */
+ if(vlr->v4) {
+ CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+ }
+ else {
+ CalcNormFloat(vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+ }
+}
+static void do_displacement(Render *re, ObjectRen *obr)
+{
+ VertRen *vr;
+ VlakRen *vlr;
+// float min[3]={1e30, 1e30, 1e30}, max[3]={-1e30, -1e30, -1e30};
+ float scale[3]={1.0f, 1.0f, 1.0f}, temp[3];//, xn
+ int i; //, texflag=0;
+ Object *obt;
+
+ /* Object Size with parenting */
+ obt=obr->ob;
+ while(obt){
+ VecAddf(temp, obt->size, obt->dsize);
+ scale[0]*=temp[0]; scale[1]*=temp[1]; scale[2]*=temp[2];
+ obt=obt->parent;
+ }
+
+ /* Clear all flags */
+ for(i=0; i<obr->totvert; i++){
+ vr= RE_findOrAddVert(obr, i);
+ vr->flag= 0;
+ }
+
+ for(i=0; i<obr->totvlak; i++){
+ vlr=RE_findOrAddVlak(obr, i);
+ displace_render_face(re, obr, vlr, scale);
+ }
+
+ /* Recalc vertex normals */
+ calc_vertexnormals(re, obr, 0);
}
/* ------------------------------------------------------------------------- */
-static void init_render_mball(Render *re, Object *ob)
+/* Metaball */
+/* ------------------------------------------------------------------------- */
+
+static void init_render_mball(Render *re, ObjectRen *obr)
{
+ Object *ob= obr->ob;
DispList *dl;
VertRen *ver;
VlakRen *vlr, *vlr1;
Material *ma;
float *data, *nors, mat[4][4], imat[3][3], xn, yn, zn;
- int a, need_orco, startvert, *index;
+ int a, need_orco, *index;
if (ob!=find_basis_mball(ob))
return;
@@ -1570,19 +2285,19 @@ static void init_render_mball(Render *re, Object *ob)
dl= ob->disp.first;
if(dl==0) return;
- startvert= re->totvert;
data= dl->verts;
nors= dl->nors;
for(a=0; a<dl->nr; a++, data+=3, nors+=3) {
- ver= RE_findOrAddVert(re, re->totvert++);
+ ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, data);
MTC_Mat4MulVecfl(mat, ver->co);
- xn= nors[0];
- yn= nors[1];
- zn= nors[2];
+ /* render normals are inverted */
+ xn= -nors[0];
+ yn= -nors[1];
+ zn= -nors[2];
/* transpose ! */
ver->n[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
@@ -1597,11 +2312,10 @@ static void init_render_mball(Render *re, Object *ob)
index= dl->index;
for(a=0; a<dl->parts; a++, index+=4) {
- vlr= RE_findOrAddVlak(re, re->totvlak++);
- vlr->ob= ob;
- vlr->v1= RE_findOrAddVert(re, startvert+index[0]);
- vlr->v2= RE_findOrAddVert(re, startvert+index[1]);
- vlr->v3= RE_findOrAddVert(re, startvert+index[2]);
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= RE_findOrAddVert(obr, index[0]);
+ vlr->v2= RE_findOrAddVert(obr, index[1]);
+ vlr->v3= RE_findOrAddVert(obr, index[2]);
vlr->v4= 0;
if(ob->transflag & OB_NEG_SCALE)
@@ -1612,14 +2326,13 @@ static void init_render_mball(Render *re, Object *ob)
vlr->mat= ma;
vlr->flag= ME_SMOOTH+R_NOPUNOFLIP;
vlr->ec= 0;
- vlr->lay= ob->lay;
/* mball -too bad- always has triangles, because quads can be non-planar */
if(index[3] && index[3]!=index[2]) {
- vlr1= RE_findOrAddVlak(re, re->totvlak++);
+ vlr1= RE_findOrAddVlak(obr, obr->totvlak++);
*vlr1= *vlr;
vlr1->v2= vlr1->v3;
- vlr1->v3= RE_findOrAddVert(re, startvert+index[3]);
+ vlr1->v3= RE_findOrAddVert(obr, index[3]);
if(ob->transflag & OB_NEG_SCALE)
CalcNormFloat(vlr1->v1->co, vlr1->v2->co, vlr1->v3->co, vlr1->n);
else
@@ -1639,17 +2352,444 @@ static void init_render_mball(Render *re, Object *ob)
/* this enforces remake for real, orco displist is small (in scale) */
ob->recalc |= OB_RECALC_DATA;
}
+
+/* ------------------------------------------------------------------------- */
+/* Surfaces and Curves */
/* ------------------------------------------------------------------------- */
-/* convert */
-static int vlakren_customdata_layer_num(int n, int active)
+/* returns amount of vertices added for orco */
+static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar, float *orco, float mat[4][4])
{
- /* make the active layer the first */
- if (n == active) return 0;
- else if (n < active) return n+1;
- else return n;
+ Object *ob= obr->ob;
+ VertRen *v1, *v2, *v3, *v4, *ver;
+ VlakRen *vlr, *vlr1, *vlr2, *vlr3;
+ Curve *cu= ob->data;
+ float *data, n1[3], flen;
+ int u, v, orcoret= 0;
+ int p1, p2, p3, p4, a;
+ int sizeu, nsizeu, sizev, nsizev;
+ int startvert, startvlak;
+
+ startvert= obr->totvert;
+ nsizeu = sizeu = dl->parts; nsizev = sizev = dl->nr;
+
+ data= dl->verts;
+ for (u = 0; u < sizeu; u++) {
+ v1 = RE_findOrAddVert(obr, obr->totvert++); /* save this for possible V wrapping */
+ VECCOPY(v1->co, data); data += 3;
+ if(orco) {
+ v1->orco= orco; orco+= 3; orcoret++;
+ }
+ MTC_Mat4MulVecfl(mat, v1->co);
+
+ for (v = 1; v < sizev; v++) {
+ ver= RE_findOrAddVert(obr, obr->totvert++);
+ VECCOPY(ver->co, data); data += 3;
+ if(orco) {
+ ver->orco= orco; orco+= 3; orcoret++;
+ }
+ MTC_Mat4MulVecfl(mat, ver->co);
+ }
+ /* if V-cyclic, add extra vertices at end of the row */
+ if (dl->flag & DL_CYCL_U) {
+ ver= RE_findOrAddVert(obr, obr->totvert++);
+ VECCOPY(ver->co, v1->co);
+ if(orco) {
+ ver->orco= orco; orco+=3; orcoret++; //orcobase + 3*(u*sizev + 0);
+ }
+ }
+ }
+
+ /* Done before next loop to get corner vert */
+ if (dl->flag & DL_CYCL_U) nsizev++;
+ if (dl->flag & DL_CYCL_V) nsizeu++;
+
+ /* if U cyclic, add extra row at end of column */
+ if (dl->flag & DL_CYCL_V) {
+ for (v = 0; v < nsizev; v++) {
+ v1= RE_findOrAddVert(obr, startvert + v);
+ ver= RE_findOrAddVert(obr, obr->totvert++);
+ VECCOPY(ver->co, v1->co);
+ if(orco) {
+ ver->orco= orco; orco+=3; orcoret++; //ver->orco= orcobase + 3*(0*sizev + v);
+ }
+ }
+ }
+
+ sizeu = nsizeu;
+ sizev = nsizev;
+
+ startvlak= obr->totvlak;
+
+ for(u = 0; u < sizeu - 1; u++) {
+ p1 = startvert + u * sizev; /* walk through face list */
+ p2 = p1 + 1;
+ p3 = p2 + sizev;
+ p4 = p3 - 1;
+
+ for(v = 0; v < sizev - 1; v++) {
+ v1= RE_findOrAddVert(obr, p1);
+ v2= RE_findOrAddVert(obr, p2);
+ v3= RE_findOrAddVert(obr, p3);
+ v4= RE_findOrAddVert(obr, p4);
+
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4;
+
+ flen= CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, n1);
+ VECCOPY(vlr->n, n1);
+
+ vlr->mat= matar[ dl->col];
+ vlr->ec= ME_V1V2+ME_V2V3;
+ vlr->flag= dl->rt;
+ if( (cu->flag & CU_NOPUNOFLIP) ) {
+ vlr->flag |= R_NOPUNOFLIP;
+ }
+
+ VecAddf(v1->n, v1->n, n1);
+ VecAddf(v2->n, v2->n, n1);
+ VecAddf(v3->n, v3->n, n1);
+ VecAddf(v4->n, v4->n, n1);
+
+ p1++; p2++; p3++; p4++;
+ }
+ }
+ /* fix normals for U resp. V cyclic faces */
+ sizeu--; sizev--; /* dec size for face array */
+ if (dl->flag & DL_CYCL_V) {
+
+ for (v = 0; v < sizev; v++)
+ {
+ /* optimize! :*/
+ vlr= RE_findOrAddVlak(obr, UVTOINDEX(sizeu - 1, v));
+ vlr1= RE_findOrAddVlak(obr, UVTOINDEX(0, v));
+ VecAddf(vlr1->v1->n, vlr1->v1->n, vlr->n);
+ VecAddf(vlr1->v2->n, vlr1->v2->n, vlr->n);
+ VecAddf(vlr->v3->n, vlr->v3->n, vlr1->n);
+ VecAddf(vlr->v4->n, vlr->v4->n, vlr1->n);
+ }
+ }
+ if (dl->flag & DL_CYCL_U) {
+
+ for (u = 0; u < sizeu; u++)
+ {
+ /* optimize! :*/
+ vlr= RE_findOrAddVlak(obr, UVTOINDEX(u, 0));
+ vlr1= RE_findOrAddVlak(obr, UVTOINDEX(u, sizev-1));
+ VecAddf(vlr1->v2->n, vlr1->v2->n, vlr->n);
+ VecAddf(vlr1->v3->n, vlr1->v3->n, vlr->n);
+ VecAddf(vlr->v1->n, vlr->v1->n, vlr1->n);
+ VecAddf(vlr->v4->n, vlr->v4->n, vlr1->n);
+ }
+ }
+ /* last vertex is an extra case:
+
+ ^ ()----()----()----()
+ | | | || |
+ u | |(0,n)||(0,0)|
+ | | || |
+ ()====()====[]====()
+ | | || |
+ | |(m,n)||(m,0)|
+ | | || |
+ ()----()----()----()
+ v ->
+
+ vertex [] is no longer shared, therefore distribute
+ normals of the surrounding faces to all of the duplicates of []
+ */
+
+ if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U))
+ {
+ vlr= RE_findOrAddVlak(obr, UVTOINDEX(sizeu - 1, sizev - 1)); /* (m,n) */
+ vlr1= RE_findOrAddVlak(obr, UVTOINDEX(0,0)); /* (0,0) */
+ VecAddf(n1, vlr->n, vlr1->n);
+ vlr2= RE_findOrAddVlak(obr, UVTOINDEX(0, sizev-1)); /* (0,n) */
+ VecAddf(n1, n1, vlr2->n);
+ vlr3= RE_findOrAddVlak(obr, UVTOINDEX(sizeu-1, 0)); /* (m,0) */
+ VecAddf(n1, n1, vlr3->n);
+ VECCOPY(vlr->v3->n, n1);
+ VECCOPY(vlr1->v1->n, n1);
+ VECCOPY(vlr2->v2->n, n1);
+ VECCOPY(vlr3->v4->n, n1);
+ }
+ for(a = startvert; a < obr->totvert; a++) {
+ ver= RE_findOrAddVert(obr, a);
+ Normalize(ver->n);
+ }
+
+
+ return orcoret;
+}
+
+static void init_render_surf(Render *re, ObjectRen *obr)
+{
+ Object *ob= obr->ob;
+ Nurb *nu=0;
+ Curve *cu;
+ ListBase displist;
+ DispList *dl;
+ Material *matar[32];
+ float *orco=NULL, *orcobase=NULL, mat[4][4];
+ int a, need_orco=0;
+
+ cu= ob->data;
+ nu= cu->nurb.first;
+ if(nu==0) return;
+
+ MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ MTC_Mat4Invert(ob->imat, mat);
+
+ /* material array */
+ memset(matar, 0, 4*32);
+ matar[0]= give_render_material(re, ob, 0);
+ for(a=0; a<ob->totcol; a++) {
+ matar[a]= give_render_material(re, ob, a+1);
+ if(matar[a] && matar[a]->texco & TEXCO_ORCO) {
+ need_orco= 1;
+ }
+ }
+
+ if(ob->parent && (ob->parent->type==OB_LATTICE)) need_orco= 1;
+
+ if(need_orco) orcobase= orco= get_object_orco(re, ob);
+
+ displist.first= displist.last= 0;
+ makeDispListSurf(ob, &displist, 1);
+
+ dl= displist.first;
+ /* walk along displaylist and create rendervertices/-faces */
+ while(dl) {
+ /* watch out: u ^= y, v ^= x !! */
+ if(dl->type==DL_SURF) {
+ orco+= 3*dl_surf_to_renderdata(obr, dl, matar, orco, mat);
+ }
+
+ dl= dl->next;
+ }
+ freedisplist(&displist);
}
+static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
+{
+ Object *ob= obr->ob;
+ Curve *cu;
+ VertRen *ver;
+ VlakRen *vlr;
+ DispList *dl;
+ ListBase olddl={NULL, NULL};
+ Material *matar[32];
+ float len, *data, *fp, *orco=NULL, *orcobase= NULL;
+ float n[3], mat[4][4];
+ int nr, startvert, startvlak, a, b;
+ int frontside, need_orco=0;
+
+ cu= ob->data;
+ if(cu->nurb.first==NULL) return;
+
+ /* no modifier call here, is in makedisp */
+
+ if(cu->resolu_ren)
+ SWAP(ListBase, olddl, cu->disp);
+
+ /* test displist */
+ if(cu->disp.first==NULL)
+ makeDispListCurveTypes(ob, 0);
+ dl= cu->disp.first;
+ if(cu->disp.first==NULL) return;
+
+ MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ MTC_Mat4Invert(ob->imat, mat);
+
+ /* material array */
+ memset(matar, 0, 4*32);
+ matar[0]= give_render_material(re, ob, 0);
+ for(a=0; a<ob->totcol; a++) {
+ matar[a]= give_render_material(re, ob, a+1);
+ if(matar[a]->texco & TEXCO_ORCO) {
+ need_orco= 1;
+ }
+ }
+
+ if(need_orco) orcobase=orco= get_object_orco(re, ob);
+
+ dl= cu->disp.first;
+ while(dl) {
+ if(dl->type==DL_INDEX3) {
+ int *index;
+
+ startvert= obr->totvert;
+ data= dl->verts;
+
+ n[0]= ob->imat[0][2];
+ n[1]= ob->imat[1][2];
+ n[2]= ob->imat[2][2];
+ Normalize(n);
+
+ for(a=0; a<dl->nr; a++, data+=3) {
+ ver= RE_findOrAddVert(obr, obr->totvert++);
+ VECCOPY(ver->co, data);
+
+ /* flip normal if face is backfacing, also used in face loop below */
+ if(ver->co[2] < 0.0) {
+ VECCOPY(ver->n, n);
+ ver->flag = 1;
+ }
+ else {
+ ver->n[0]= -n[0]; ver->n[1]= -n[1]; ver->n[2]= -n[2];
+ ver->flag = 0;
+ }
+
+ MTC_Mat4MulVecfl(mat, ver->co);
+
+ if (orco) {
+ ver->orco = orco;
+ orco += 3;
+ }
+ }
+
+ if(timeoffset==0) {
+ startvlak= obr->totvlak;
+ index= dl->index;
+ for(a=0; a<dl->parts; a++, index+=3) {
+
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= RE_findOrAddVert(obr, startvert+index[0]);
+ vlr->v2= RE_findOrAddVert(obr, startvert+index[1]);
+ vlr->v3= RE_findOrAddVert(obr, startvert+index[2]);
+ vlr->v4= NULL;
+
+ if(vlr->v1->flag) {
+ VECCOPY(vlr->n, n);
+ }
+ else {
+ vlr->n[0]= -n[0]; vlr->n[1]= -n[1]; vlr->n[2]= -n[2];
+ }
+
+ vlr->mat= matar[ dl->col ];
+ vlr->flag= 0;
+ if( (cu->flag & CU_NOPUNOFLIP) ) {
+ vlr->flag |= R_NOPUNOFLIP;
+ }
+ vlr->ec= 0;
+ }
+ }
+ }
+ else if (dl->type==DL_SURF) {
+
+ /* cyclic U means an extruded full circular curve, we skip bevel splitting then */
+ if (dl->flag & DL_CYCL_U) {
+ orco+= 3*dl_surf_to_renderdata(obr, dl, matar, orco, mat);
+ }
+ else {
+ int p1,p2,p3,p4;
+
+ fp= dl->verts;
+ startvert= obr->totvert;
+ nr= dl->nr*dl->parts;
+
+ while(nr--) {
+ ver= RE_findOrAddVert(obr, obr->totvert++);
+
+ VECCOPY(ver->co, fp);
+ MTC_Mat4MulVecfl(mat, ver->co);
+ fp+= 3;
+
+ if (orco) {
+ ver->orco = orco;
+ orco += 3;
+ }
+ }
+
+ if(dl->bevelSplitFlag || timeoffset==0) {
+ startvlak= obr->totvlak;
+
+ for(a=0; a<dl->parts; a++) {
+
+ frontside= (a >= dl->nr/2);
+
+ DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
+ p1+= startvert;
+ p2+= startvert;
+ p3+= startvert;
+ p4+= startvert;
+
+ for(; b<dl->nr; b++) {
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= RE_findOrAddVert(obr, p2);
+ vlr->v2= RE_findOrAddVert(obr, p1);
+ vlr->v3= RE_findOrAddVert(obr, p3);
+ vlr->v4= RE_findOrAddVert(obr, p4);
+ vlr->ec= ME_V2V3+ME_V3V4;
+ if(a==0) vlr->ec+= ME_V1V2;
+
+ vlr->flag= dl->rt;
+
+ /* this is not really scientific: the vertices
+ * 2, 3 en 4 seem to give better vertexnormals than 1 2 3:
+ * front and backside treated different!!
+ */
+
+ if(frontside)
+ CalcNormFloat(vlr->v2->co, vlr->v3->co, vlr->v4->co, vlr->n);
+ else
+ CalcNormFloat(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->n);
+
+ vlr->mat= matar[ dl->col ];
+
+ p4= p3;
+ p3++;
+ p2= p1;
+ p1++;
+ }
+ }
+
+ if (dl->bevelSplitFlag) {
+ for(a=0; a<dl->parts-1+!!(dl->flag&DL_CYCL_V); a++)
+ if(dl->bevelSplitFlag[a>>5]&(1<<(a&0x1F)))
+ split_v_renderfaces(obr, startvlak, startvert, dl->parts, dl->nr, a, dl->flag&DL_CYCL_V, dl->flag&DL_CYCL_U);
+ }
+
+ /* vertex normals */
+ for(a= startvlak; a<obr->totvlak; a++) {
+ vlr= RE_findOrAddVlak(obr, a);
+
+ VecAddf(vlr->v1->n, vlr->v1->n, vlr->n);
+ VecAddf(vlr->v3->n, vlr->v3->n, vlr->n);
+ VecAddf(vlr->v2->n, vlr->v2->n, vlr->n);
+ VecAddf(vlr->v4->n, vlr->v4->n, vlr->n);
+ }
+ for(a=startvert; a<obr->totvert; a++) {
+ ver= RE_findOrAddVert(obr, a);
+ len= Normalize(ver->n);
+ if(len==0.0) ver->flag= 1; /* flag abuse, its only used in zbuf now */
+ else ver->flag= 0;
+ }
+ for(a= startvlak; a<obr->totvlak; a++) {
+ vlr= RE_findOrAddVlak(obr, a);
+ if(vlr->v1->flag) VECCOPY(vlr->v1->n, vlr->n);
+ if(vlr->v2->flag) VECCOPY(vlr->v2->n, vlr->n);
+ if(vlr->v3->flag) VECCOPY(vlr->v3->n, vlr->n);
+ if(vlr->v4->flag) VECCOPY(vlr->v4->n, vlr->n);
+ }
+ }
+ }
+ }
+
+ dl= dl->next;
+ }
+
+ /* not very elegant... but we want original displist in UI */
+ if(cu->resolu_ren) {
+ freedisplist(&cu->disp);
+ SWAP(ListBase, olddl, cu->disp);
+ }
+}
+
+/* ------------------------------------------------------------------------- */
+/* Mesh */
+/* ------------------------------------------------------------------------- */
+
struct edgesort {
int v1, v2;
int f;
@@ -1727,13 +2867,13 @@ static struct edgesort *make_mesh_edge_lookup(DerivedMesh *dm, int *totedgesort)
return edsort;
}
-static void use_mesh_edge_lookup(Render *re, DerivedMesh *dm, MEdge *medge, VlakRen *vlr, struct edgesort *edgetable, int totedge)
+static void use_mesh_edge_lookup(ObjectRen *obr, DerivedMesh *dm, MEdge *medge, VlakRen *vlr, struct edgesort *edgetable, int totedge)
{
struct edgesort ed, *edp;
CustomDataLayer *layer;
MTFace *mtface, *mtf;
MCol *mcol, *mc;
- int index, mtfn, mcn, n;
+ int index, mtfn, mcn;
char *name;
if(medge->v1 < medge->v2) {
@@ -1757,8 +2897,7 @@ static void use_mesh_edge_lookup(Render *re, DerivedMesh *dm, MEdge *medge, Vlak
if(layer->type == CD_MTFACE && mtfn < MAX_MTFACE) {
mtface= &((MTFace*)layer->data)[edp->f];
- n= vlakren_customdata_layer_num(mtfn++, layer->active_rnd);
- mtf= RE_vlakren_get_tface(re, vlr, n, &name, 1);
+ mtf= RE_vlakren_get_tface(obr, vlr, mtfn++, &name, 1);
*mtf= *mtface;
@@ -1769,8 +2908,7 @@ static void use_mesh_edge_lookup(Render *re, DerivedMesh *dm, MEdge *medge, Vlak
}
else if(layer->type == CD_MCOL && mcn < MAX_MCOL) {
mcol= &((MCol*)layer->data)[edp->f*4];
- n= vlakren_customdata_layer_num(mcn++, layer->active_rnd);
- mc= RE_vlakren_get_mcol(re, vlr, n, &name, 1);
+ mc= RE_vlakren_get_mcol(obr, vlr, mcn++, &name, 1);
mc[0]= mcol[edp->i1];
mc[1]= mc[2]= mc[3]= mcol[edp->i2];
@@ -1779,8 +2917,9 @@ static void use_mesh_edge_lookup(Render *re, DerivedMesh *dm, MEdge *medge, Vlak
}
}
-static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts)
+static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
{
+ Object *ob= obr->ob;
Mesh *me;
MVert *mvert = NULL;
MFace *mface;
@@ -1788,35 +2927,23 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
VertRen *ver;
Material *ma;
MSticky *ms = NULL;
- PartEff *paf;
DerivedMesh *dm;
+ CustomDataMask mask;
float xn, yn, zn, imat[3][3], mat[4][4]; //nor[3],
float *orco=0;
- int a, a1, ok, need_orco=0, need_stress=0, need_tangent=0, totvlako, totverto, vertofs;
+ int a, a1, ok, need_orco=0, need_stress=0, need_tangent=0, vertofs;
int end, do_autosmooth=0, totvert = 0;
int useFluidmeshNormals= 0; // NT fluidsim, use smoothed normals?
int use_original_normals= 0;
me= ob->data;
- paf = give_parteff(ob);
- if(paf) {
- /* warning; build_particle_system does modifier calls itself */
- if(paf->flag & PAF_STATIC) render_static_particle_system(re, ob, paf);
- else render_particle_system(re, ob, par, paf);
- if((paf->flag & PAF_SHOWE)==0) return;
- }
-
MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
MTC_Mat4Invert(ob->imat, mat);
MTC_Mat3CpyMat4(imat, ob->imat);
- if(me->totvert==0) {
+ if(me->totvert==0)
return;
- }
-
- totvlako= re->totvlak;
- totverto= re->totvert;
need_orco= 0;
for(a=1; a<=ob->totcol; a++) {
@@ -1838,22 +2965,37 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
do_autosmooth= 1;
}
}
+
+ if(re->flag & R_NEED_TANGENT) {
+ /* exception for tangent space baking */
+ need_tangent= 1;
+ if(me->mtface==NULL)
+ need_orco= 1;
+ }
/* check autosmooth and displacement, we then have to skip only-verts optimize */
do_autosmooth |= (me->flag & ME_AUTOSMOOTH);
if(do_autosmooth)
- only_verts= 0;
+ timeoffset= 0;
if(test_for_displace(re, ob ) )
- only_verts= 0;
+ timeoffset= 0;
- if(!only_verts)
- if(need_orco) orco = get_object_orco(re, ob);
+ mask= CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
+ if(!timeoffset)
+ if(need_orco)
+ mask |= CD_MASK_ORCO;
- dm = mesh_create_derived_render(ob,
- CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
-
+ dm= mesh_create_derived_render(ob, mask);
if(dm==NULL) return; /* in case duplicated object fails? */
+ if(mask & CD_MASK_ORCO) {
+ orco= dm->getVertDataArray(dm, CD_ORCO);
+ if(orco) {
+ orco= MEM_dupallocN(orco);
+ set_object_orco(re, ob, orco);
+ }
+ }
+
if((ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) &&
(ob->fluidsimSettings->type & OB_FLUIDSIM_DOMAIN)&&
(ob->fluidsimSettings->meshSurface) ) {
@@ -1872,20 +3014,21 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
ma= give_render_material(re, ob, 1);
if(ma->mode & MA_HALO) {
- make_render_halos(re, ob, me, totvert, mvert, ma, orco);
+ make_render_halos(re, obr, me, totvert, mvert, ma, orco);
}
else {
for(a=0; a<totvert; a++, mvert++) {
- ver= RE_findOrAddVert(re, re->totvert++);
+ ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, mvert->co);
if(do_autosmooth==0) /* autosmooth on original unrotated data to prevent differences between frames */
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;
@@ -1897,21 +3040,21 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
orco+=3;
}
if(ms) {
- float *sticky= RE_vertren_get_sticky(re, ver, 1);
+ float *sticky= RE_vertren_get_sticky(obr, ver, 1);
sticky[0]= ms->co[0];
sticky[1]= ms->co[1];
ms++;
}
}
- if(!only_verts) {
+ if(!timeoffset) {
/* store customdata names, because DerivedMesh is freed */
- RE_vlakren_set_customdata_names(re, &dm->faceData);
+ RE_set_customdata_names(obr, &dm->faceData);
/* still to do for keys: the correct local texture coordinate */
/* faces in order of color blocks */
- vertofs= re->totvert - totvert;
+ vertofs= obr->totvert - totvert;
for(a1=0; (a1<ob->totcol || (a1==0 && ob->totcol==0)); a1++) {
ma= give_render_material(re, ob, a1+1);
@@ -1949,13 +3092,12 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
v3= mface->v3;
v4= mface->v4;
flag= mface->flag & ME_SMOOTH;
-
- vlr= RE_findOrAddVlak(re, re->totvlak++);
- vlr->ob= ob;
- vlr->v1= RE_findOrAddVert(re, vertofs+v1);
- vlr->v2= RE_findOrAddVert(re, vertofs+v2);
- vlr->v3= RE_findOrAddVert(re, vertofs+v3);
- if(v4) vlr->v4= RE_findOrAddVert(re, vertofs+v4);
+
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= RE_findOrAddVert(obr, vertofs+v1);
+ vlr->v2= RE_findOrAddVert(obr, vertofs+v2);
+ vlr->v3= RE_findOrAddVert(obr, vertofs+v3);
+ if(v4) vlr->v4= RE_findOrAddVert(obr, vertofs+v4);
else vlr->v4= 0;
/* render normals are inverted in render */
@@ -1981,14 +3123,13 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
vlr->flag |= R_NOPUNOFLIP;
}
vlr->ec= 0; /* mesh edges rendered separately */
- vlr->lay= ob->lay;
- if(len==0) re->totvlak--;
+ if(len==0) obr->totvlak--;
else {
CustomDataLayer *layer;
MTFace *mtface, *mtf;
MCol *mcol, *mc;
- int index, mtfn= 0, mcn= 0, n;
+ int index, mtfn= 0, mcn= 0;
char *name;
for(index=0; index<dm->faceData.totlayer; index++) {
@@ -1996,14 +3137,12 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
name= layer->name;
if(layer->type == CD_MTFACE && mtfn < MAX_MTFACE) {
- n= vlakren_customdata_layer_num(mtfn++, layer->active_rnd);
- mtf= RE_vlakren_get_tface(re, vlr, n, &name, 1);
+ mtf= RE_vlakren_get_tface(obr, vlr, mtfn++, &name, 1);
mtface= (MTFace*)layer->data;
*mtf= mtface[a];
}
else if(layer->type == CD_MCOL && mcn < MAX_MCOL) {
- n= vlakren_customdata_layer_num(mcn++, layer->active_rnd);
- mc= RE_vlakren_get_mcol(re, vlr, n, &name, 1);
+ mc= RE_vlakren_get_mcol(obr, vlr, mcn++, &name, 1);
mcol= (MCol*)layer->data;
memcpy(mc, &mcol[a*4], sizeof(MCol)*4);
}
@@ -2033,16 +3172,14 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
MVert *v0 = &mvert[medge->v1];
MVert *v1 = &mvert[medge->v2];
- vlr= RE_findOrAddVlak(re, re->totvlak++);
- vlr->ob= ob;
- vlr->v1= RE_findOrAddVert(re, vertofs+medge->v1);
- vlr->v2= RE_findOrAddVert(re, vertofs+medge->v2);
+ vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ vlr->v1= RE_findOrAddVert(obr, vertofs+medge->v1);
+ vlr->v2= RE_findOrAddVert(obr, vertofs+medge->v2);
vlr->v3= vlr->v2;
vlr->v4= NULL;
- if(edgetable) {
- use_mesh_edge_lookup(re, dm, medge, vlr, edgetable, totedge);
- }
+ if(edgetable)
+ use_mesh_edge_lookup(obr, dm, medge, vlr, edgetable, totedge);
xn= -(v0->no[0]+v1->no[0]);
yn= -(v0->no[1]+v1->no[1]);
@@ -2056,7 +3193,6 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
vlr->mat= ma;
vlr->flag= 0;
vlr->ec= ME_V1V2;
- vlr->lay= ob->lay;
}
}
if(edgetable)
@@ -2065,31 +3201,33 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
}
}
- if(!only_verts) {
+ if(!timeoffset) {
if (test_for_displace(re, ob ) ) {
- calc_vertexnormals(re, totverto, totvlako, 0);
- do_displacement(re, ob, totvlako, re->totvlak-totvlako, totverto, re->totvert-totverto);
+ calc_vertexnormals(re, obr, 0);
+ do_displacement(re, obr);
}
if(do_autosmooth) {
- autosmooth(re, mat, totverto, totvlako, me->smoothresh);
+ autosmooth(re, obr, mat, me->smoothresh);
}
if(useFluidmeshNormals) {
// do not recalculate, only init render data
- calc_fluidsimnormals(re, totverto, totvlako, need_tangent);
+ calc_fluidsimnormals(re, obr, need_tangent);
} else {
- calc_vertexnormals(re, totverto, totvlako, need_tangent);
+ calc_vertexnormals(re, obr, need_tangent);
}
if(need_stress)
- calc_edge_stress(re, me, totverto, totvlako);
+ calc_edge_stress(re, obr, me);
}
dm->release(dm);
}
/* ------------------------------------------------------------------------- */
+/* Lamps and Shadowbuffers */
+/* ------------------------------------------------------------------------- */
static void initshadowbuf(Render *re, LampRen *lar, float mat[][4])
{
@@ -2143,11 +3281,15 @@ static void initshadowbuf(Render *re, LampRen *lar, float mat[][4])
}
-
static void area_lamp_vectors(LampRen *lar)
{
- float xsize= 0.5*lar->area_size, ysize= 0.5*lar->area_sizey;
+ float xsize= 0.5*lar->area_size, ysize= 0.5*lar->area_sizey, multifac;
+ /* make it smaller, so area light can be multisampled */
+ multifac= 1.0f/sqrt((float)lar->ray_totsamp);
+ xsize *= multifac;
+ ysize *= multifac;
+
/* corner vectors */
lar->area[0][0]= lar->co[0] - xsize*lar->mat[0][0] - ysize*lar->mat[1][0];
lar->area[0][1]= lar->co[1] - xsize*lar->mat[0][1] - ysize*lar->mat[1][1];
@@ -2249,6 +3391,13 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->area_sizez= la->area_sizez;
lar->area_shape= la->area_shape;
+
+ /* Annoying, lamp UI does this, but the UI might not have been used? - add here too.
+ * make sure this matches buttons_shading.c's logic */
+ 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;
+
lar->ray_samp_method= la->ray_samp_method;
lar->ray_samp_type= la->ray_samp_type;
@@ -2282,6 +3431,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
}
area_lamp_vectors(lar);
+ init_jitter_plane(lar); // subsamples
}
else lar->ray_totsamp= 0;
@@ -2396,16 +3546,22 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
/* this is the way used all over to check for shadow */
if(lar->shb || (lar->mode & LA_SHAD_RAY)) {
+ LampShadowSample *ls;
LampShadowSubSample *lss;
- int a, b, tot= re->r.threads*re->r.osa;
+ int a, b;
lar->shadsamp= MEM_mallocN(re->r.threads*sizeof(LampShadowSample), "lamp shadow sample");
- lss= lar->shadsamp[0].s;
+ ls= lar->shadsamp;
+
/* shadfacs actually mean light, let's put them to 1 to prevent unitialized accidents */
- for(a=0; a<tot; a++, lss++) {
- for(b=0; b<4; b++) {
+ for(a=0; a<re->r.threads; a++, ls++) {
+ lss= ls->s;
+ for(b=0; b<re->r.osa; b++, lss++) {
lss->samplenr= -1; /* used to detect whether we store or read */
- lss->shadfac[b]= 1.0f;
+ lss->shadfac[0]= 1.0f;
+ lss->shadfac[1]= 1.0f;
+ lss->shadfac[2]= 1.0f;
+ lss->shadfac[3]= 1.0f;
}
}
}
@@ -2415,442 +3571,123 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
return go;
}
-/* ------------------------------------------------------------------------- */
-
-/* returns amount of vertices added for orco */
-static int dl_surf_to_renderdata(Render *re, Object *ob, DispList *dl, Material **matar, float *orco, float mat[4][4])
+/* layflag: allows material group to ignore layerflag */
+static void add_lightgroup(Render *re, Group *group, int exclusive)
{
- VertRen *v1, *v2, *v3, *v4, *ver;
- VlakRen *vlr, *vlr1, *vlr2, *vlr3;
- Curve *cu= ob->data;
- float *data, n1[3], flen;
- int u, v, orcoret= 0;
- int p1, p2, p3, p4, a;
- int sizeu, nsizeu, sizev, nsizev;
- int startvert, startvlak;
-
- startvert= re->totvert;
- nsizeu = sizeu = dl->parts; nsizev = sizev = dl->nr;
+ GroupObject *go, *gol;
- data= dl->verts;
- for (u = 0; u < sizeu; u++) {
- v1 = RE_findOrAddVert(re, re->totvert++); /* save this for possible V wrapping */
- VECCOPY(v1->co, data); data += 3;
- if(orco) {
- v1->orco= orco; orco+= 3; orcoret++;
- }
- MTC_Mat4MulVecfl(mat, v1->co);
+ group->id.flag &= ~LIB_DOIT;
+
+ /* it's a bit too many loops in loops... but will survive */
+ /* note that 'exclusive' will remove it from the global list */
+ for(go= group->gobject.first; go; go= go->next) {
+ go->lampren= NULL;
- for (v = 1; v < sizev; v++) {
- ver= RE_findOrAddVert(re, re->totvert++);
- VECCOPY(ver->co, data); data += 3;
- if(orco) {
- ver->orco= orco; orco+= 3; orcoret++;
- }
- MTC_Mat4MulVecfl(mat, ver->co);
- }
- /* if V-cyclic, add extra vertices at end of the row */
- if (dl->flag & DL_CYCL_U) {
- ver= RE_findOrAddVert(re, re->totvert++);
- VECCOPY(ver->co, v1->co);
- if(orco) {
- ver->orco= orco; orco+=3; orcoret++; //orcobase + 3*(u*sizev + 0);
- }
- }
- }
-
- /* Done before next loop to get corner vert */
- if (dl->flag & DL_CYCL_U) nsizev++;
- if (dl->flag & DL_CYCL_V) nsizeu++;
-
- /* if U cyclic, add extra row at end of column */
- if (dl->flag & DL_CYCL_V) {
- for (v = 0; v < nsizev; v++) {
- v1= RE_findOrAddVert(re, startvert + v);
- ver= RE_findOrAddVert(re, re->totvert++);
- VECCOPY(ver->co, v1->co);
- if(orco) {
- ver->orco= orco; orco+=3; orcoret++; //ver->orco= orcobase + 3*(0*sizev + v);
+ if(go->ob->lay & re->scene->lay) {
+ if(go->ob && go->ob->type==OB_LAMP) {
+ for(gol= re->lights.first; gol; gol= gol->next) {
+ if(gol->ob==go->ob) {
+ go->lampren= gol->lampren;
+ break;
+ }
+ }
+ if(go->lampren==NULL)
+ gol= add_render_lamp(re, go->ob);
+ if(gol && exclusive) {
+ BLI_remlink(&re->lights, gol);
+ MEM_freeN(gol);
+ }
}
}
}
+}
+
+static void set_material_lightgroups(Render *re)
+{
+ Group *group;
+ Material *ma;
- sizeu = nsizeu;
- sizev = nsizev;
-
- startvlak= re->totvlak;
+ /* not for preview render */
+ if(re->scene->r.scemode & R_PREVIEWBUTS)
+ return;
- for(u = 0; u < sizeu - 1; u++) {
- p1 = startvert + u * sizev; /* walk through face list */
- p2 = p1 + 1;
- p3 = p2 + sizev;
- p4 = p3 - 1;
-
- for(v = 0; v < sizev - 1; v++) {
- v1= RE_findOrAddVert(re, p1);
- v2= RE_findOrAddVert(re, p2);
- v3= RE_findOrAddVert(re, p3);
- v4= RE_findOrAddVert(re, p4);
-
- vlr= RE_findOrAddVlak(re, re->totvlak++);
- vlr->ob= ob;
- vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4;
-
- flen= CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, n1);
- VECCOPY(vlr->n, n1);
-
- vlr->lay= ob->lay;
- vlr->mat= matar[ dl->col];
- vlr->ec= ME_V1V2+ME_V2V3;
- vlr->flag= dl->rt;
- if( (cu->flag & CU_NOPUNOFLIP) ) {
- vlr->flag |= R_NOPUNOFLIP;
- }
-
- VecAddf(v1->n, v1->n, n1);
- VecAddf(v2->n, v2->n, n1);
- VecAddf(v3->n, v3->n, n1);
- VecAddf(v4->n, v4->n, n1);
-
- p1++; p2++; p3++; p4++;
- }
- }
- /* fix normals for U resp. V cyclic faces */
- sizeu--; sizev--; /* dec size for face array */
- if (dl->flag & DL_CYCL_V) {
-
- for (v = 0; v < sizev; v++)
- {
- /* optimize! :*/
- vlr= RE_findOrAddVlak(re, UVTOINDEX(sizeu - 1, v));
- vlr1= RE_findOrAddVlak(re, UVTOINDEX(0, v));
- VecAddf(vlr1->v1->n, vlr1->v1->n, vlr->n);
- VecAddf(vlr1->v2->n, vlr1->v2->n, vlr->n);
- VecAddf(vlr->v3->n, vlr->v3->n, vlr1->n);
- VecAddf(vlr->v4->n, vlr->v4->n, vlr1->n);
- }
- }
- if (dl->flag & DL_CYCL_U) {
-
- for (u = 0; u < sizeu; u++)
- {
- /* optimize! :*/
- vlr= RE_findOrAddVlak(re, UVTOINDEX(u, 0));
- vlr1= RE_findOrAddVlak(re, UVTOINDEX(u, sizev-1));
- VecAddf(vlr1->v2->n, vlr1->v2->n, vlr->n);
- VecAddf(vlr1->v3->n, vlr1->v3->n, vlr->n);
- VecAddf(vlr->v1->n, vlr->v1->n, vlr1->n);
- VecAddf(vlr->v4->n, vlr->v4->n, vlr1->n);
- }
- }
- /* last vertex is an extra case:
-
- ^ ()----()----()----()
- | | | || |
- u | |(0,n)||(0,0)|
- | | || |
- ()====()====[]====()
- | | || |
- | |(m,n)||(m,0)|
- | | || |
- ()----()----()----()
- v ->
-
- vertex [] is no longer shared, therefore distribute
- normals of the surrounding faces to all of the duplicates of []
- */
+ for(group= G.main->group.first; group; group=group->id.next)
+ group->id.flag |= LIB_DOIT;
- if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U))
- {
- vlr= RE_findOrAddVlak(re, UVTOINDEX(sizeu - 1, sizev - 1)); /* (m,n) */
- vlr1= RE_findOrAddVlak(re, UVTOINDEX(0,0)); /* (0,0) */
- VecAddf(n1, vlr->n, vlr1->n);
- vlr2= RE_findOrAddVlak(re, UVTOINDEX(0, sizev-1)); /* (0,n) */
- VecAddf(n1, n1, vlr2->n);
- vlr3= RE_findOrAddVlak(re, UVTOINDEX(sizeu-1, 0)); /* (m,0) */
- VecAddf(n1, n1, vlr3->n);
- VECCOPY(vlr->v3->n, n1);
- VECCOPY(vlr1->v1->n, n1);
- VECCOPY(vlr2->v2->n, n1);
- VECCOPY(vlr3->v4->n, n1);
- }
- for(a = startvert; a < re->totvert; a++) {
- ver= RE_findOrAddVert(re, a);
- Normalize(ver->n);
+ /* it's a bit too many loops in loops... but will survive */
+ /* hola! materials not in use...? */
+ for(ma= G.main->mat.first; ma; ma=ma->id.next) {
+ if(ma->group && (ma->group->id.flag & LIB_DOIT))
+ add_lightgroup(re, ma->group, ma->mode & MA_GROUP_NOLAY);
}
-
-
- return orcoret;
}
-static void init_render_surf(Render *re, Object *ob)
+static void set_renderlayer_lightgroups(Render *re, Scene *sce)
{
- Nurb *nu=0;
- Curve *cu;
- ListBase displist;
- DispList *dl;
- Material *matar[32];
- float *orco=NULL, *orcobase=NULL, mat[4][4];
- int a, need_orco=0;
-
- cu= ob->data;
- nu= cu->nurb.first;
- if(nu==0) return;
-
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
-
- /* material array */
- memset(matar, 0, 4*32);
- matar[0]= give_render_material(re, ob, 0);
- for(a=0; a<ob->totcol; a++) {
- matar[a]= give_render_material(re, ob, a+1);
- if(matar[a] && matar[a]->texco & TEXCO_ORCO) {
- need_orco= 1;
- }
- }
-
- if(ob->parent && (ob->parent->type==OB_LATTICE)) need_orco= 1;
-
- if(need_orco) orcobase= orco= get_object_orco(re, ob);
-
- displist.first= displist.last= 0;
- makeDispListSurf(ob, &displist, 1);
-
- dl= displist.first;
- /* walk along displaylist and create rendervertices/-faces */
- while(dl) {
- /* watch out: u ^= y, v ^= x !! */
- if(dl->type==DL_SURF) {
- orco+= 3*dl_surf_to_renderdata(re, ob, dl, matar, orco, mat);
- }
-
- dl= dl->next;
+ SceneRenderLayer *srl;
+
+ for(srl= sce->r.layers.first; srl; srl= srl->next) {
+ if(srl->light_override)
+ add_lightgroup(re, srl->light_override, 0);
}
- freedisplist(&displist);
}
-static void init_render_curve(Render *re, Object *ob, int only_verts)
-{
- Curve *cu;
- VertRen *ver;
- VlakRen *vlr;
- DispList *dl;
- ListBase olddl={NULL, NULL};
- Material *matar[32];
- float len, *data, *fp, *orco=NULL, *orcobase= NULL;
- float n[3], mat[4][4];
- int nr, startvert, startvlak, a, b;
- int frontside, need_orco=0;
-
- cu= ob->data;
- if(cu->nurb.first==NULL) return;
-
- /* no modifier call here, is in makedisp */
+/* ------------------------------------------------------------------------- */
+/* World */
+/* ------------------------------------------------------------------------- */
- if(cu->resolu_ren)
- SWAP(ListBase, olddl, cu->disp);
-
- /* test displist */
- if(cu->disp.first==NULL)
- makeDispListCurveTypes(ob, 0);
- dl= cu->disp.first;
- if(cu->disp.first==NULL) return;
+void init_render_world(Render *re)
+{
+ int a;
+ char *cp;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
-
- /* material array */
- memset(matar, 0, 4*32);
- matar[0]= give_render_material(re, ob, 0);
- for(a=0; a<ob->totcol; a++) {
- matar[a]= give_render_material(re, ob, a+1);
- if(matar[a]->texco & TEXCO_ORCO) {
- need_orco= 1;
- }
+ if(re->scene && re->scene->world) {
+ re->wrld= *(re->scene->world);
+
+ cp= (char *)&re->wrld.fastcol;
+
+ cp[0]= 255.0*re->wrld.horr;
+ cp[1]= 255.0*re->wrld.horg;
+ cp[2]= 255.0*re->wrld.horb;
+ cp[3]= 1;
+
+ VECCOPY(re->grvec, re->viewmat[2]);
+ Normalize(re->grvec);
+ Mat3CpyMat4(re->imat, re->viewinv);
+
+ for(a=0; a<MAX_MTEX; a++)
+ if(re->wrld.mtex[a] && re->wrld.mtex[a]->tex) re->wrld.skytype |= WO_SKYTEX;
+
+ /* AO samples should be OSA minimum */
+ if(re->osa)
+ while(re->wrld.aosamp*re->wrld.aosamp < re->osa)
+ re->wrld.aosamp++;
+ if(!(re->r.mode & R_RAYTRACE) && (re->wrld.ao_gather_method == WO_AOGATHER_RAYTRACE))
+ re->wrld.mode &= ~WO_AMB_OCC;
}
-
- if(need_orco) orcobase=orco= get_object_orco(re, ob);
-
- dl= cu->disp.first;
- while(dl) {
- if(dl->type==DL_INDEX3) {
- int *index;
-
- startvert= re->totvert;
- data= dl->verts;
-
- n[0]= ob->imat[0][2];
- n[1]= ob->imat[1][2];
- n[2]= ob->imat[2][2];
- Normalize(n);
-
- for(a=0; a<dl->nr; a++, data+=3) {
- ver= RE_findOrAddVert(re, re->totvert++);
- VECCOPY(ver->co, data);
-
- /* flip normal if face is backfacing, also used in face loop below */
- if(ver->co[2] < 0.0) {
- VECCOPY(ver->n, n);
- ver->flag = 1;
- }
- else {
- ver->n[0]= -n[0]; ver->n[1]= -n[1]; ver->n[2]= -n[2];
- ver->flag = 0;
- }
-
- MTC_Mat4MulVecfl(mat, ver->co);
-
- if (orco) {
- ver->orco = orco;
- orco += 3;
- }
- }
-
- if(only_verts==0) {
- startvlak= re->totvlak;
- index= dl->index;
- for(a=0; a<dl->parts; a++, index+=3) {
-
- vlr= RE_findOrAddVlak(re, re->totvlak++);
- vlr->ob = ob;
- vlr->v1= RE_findOrAddVert(re, startvert+index[0]);
- vlr->v2= RE_findOrAddVert(re, startvert+index[1]);
- vlr->v3= RE_findOrAddVert(re, startvert+index[2]);
- vlr->v4= NULL;
-
- if(vlr->v1->flag) {
- VECCOPY(vlr->n, n);
- }
- else {
- vlr->n[0]= -n[0]; vlr->n[1]= -n[1]; vlr->n[2]= -n[2];
- }
-
- vlr->mat= matar[ dl->col ];
- vlr->flag= 0;
- if( (cu->flag & CU_NOPUNOFLIP) ) {
- vlr->flag |= R_NOPUNOFLIP;
- }
- vlr->ec= 0;
- vlr->lay= ob->lay;
- }
- }
- }
- else if (dl->type==DL_SURF) {
-
- /* cyclic U means an extruded full circular curve, we skip bevel splitting then */
- if (dl->flag & DL_CYCL_U) {
- orco+= 3*dl_surf_to_renderdata(re, ob, dl, matar, orco, mat);
- }
- else {
- int p1,p2,p3,p4;
-
- fp= dl->verts;
- startvert= re->totvert;
- nr= dl->nr*dl->parts;
-
- while(nr--) {
- ver= RE_findOrAddVert(re, re->totvert++);
-
- VECCOPY(ver->co, fp);
- MTC_Mat4MulVecfl(mat, ver->co);
- fp+= 3;
-
- if (orco) {
- ver->orco = orco;
- orco += 3;
- }
- }
-
- if(dl->bevelSplitFlag || only_verts==0) {
- startvlak= re->totvlak;
-
- for(a=0; a<dl->parts; a++) {
-
- frontside= (a >= dl->nr/2);
-
- DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts);
- p1+= startvert;
- p2+= startvert;
- p3+= startvert;
- p4+= startvert;
-
- for(; b<dl->nr; b++) {
- vlr= RE_findOrAddVlak(re, re->totvlak++);
- vlr->ob= ob;
- vlr->v1= RE_findOrAddVert(re, p2);
- vlr->v2= RE_findOrAddVert(re, p1);
- vlr->v3= RE_findOrAddVert(re, p3);
- vlr->v4= RE_findOrAddVert(re, p4);
- vlr->ec= ME_V2V3+ME_V3V4;
- if(a==0) vlr->ec+= ME_V1V2;
-
- vlr->flag= dl->rt;
- vlr->lay= ob->lay;
-
- /* this is not really scientific: the vertices
- * 2, 3 en 4 seem to give better vertexnormals than 1 2 3:
- * front and backside treated different!!
- */
-
- if(frontside)
- CalcNormFloat(vlr->v2->co, vlr->v3->co, vlr->v4->co, vlr->n);
- else
- CalcNormFloat(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->n);
-
- vlr->mat= matar[ dl->col ];
-
- p4= p3;
- p3++;
- p2= p1;
- p1++;
- }
- }
-
- if (dl->bevelSplitFlag) {
- for(a=0; a<dl->parts-1+!!(dl->flag&DL_CYCL_V); a++)
- if(dl->bevelSplitFlag[a>>5]&(1<<(a&0x1F)))
- split_v_renderfaces(re, startvlak, startvert, dl->parts, dl->nr, a, dl->flag&DL_CYCL_V, dl->flag&DL_CYCL_U);
- }
-
- /* vertex normals */
- for(a= startvlak; a<re->totvlak; a++) {
- vlr= RE_findOrAddVlak(re, a);
-
- VecAddf(vlr->v1->n, vlr->v1->n, vlr->n);
- VecAddf(vlr->v3->n, vlr->v3->n, vlr->n);
- VecAddf(vlr->v2->n, vlr->v2->n, vlr->n);
- VecAddf(vlr->v4->n, vlr->v4->n, vlr->n);
- }
- for(a=startvert; a<re->totvert; a++) {
- ver= RE_findOrAddVert(re, a);
- len= Normalize(ver->n);
- if(len==0.0) ver->flag= 1; /* flag abuse, its only used in zbuf now */
- else ver->flag= 0;
- }
- for(a= startvlak; a<re->totvlak; a++) {
- vlr= RE_findOrAddVlak(re, a);
- if(vlr->v1->flag) VECCOPY(vlr->v1->n, vlr->n);
- if(vlr->v2->flag) VECCOPY(vlr->v2->n, vlr->n);
- if(vlr->v3->flag) VECCOPY(vlr->v3->n, vlr->n);
- if(vlr->v4->flag) VECCOPY(vlr->v4->n, vlr->n);
- }
- }
- }
- }
-
- dl= dl->next;
+ else {
+ memset(&re->wrld, 0, sizeof(World));
+ re->wrld.exp= 0.0f;
+ re->wrld.range= 1.0f;
+
+ /* for mist pass */
+ re->wrld.miststa= re->clipsta;
+ re->wrld.mistdist= re->clipend-re->clipsta;
+ re->wrld.misi= 1.0f;
}
- /* not very elegant... but we want original displist in UI */
- if(cu->resolu_ren) {
- freedisplist(&cu->disp);
- SWAP(ListBase, olddl, cu->disp);
- }
+ re->wrld.linfac= 1.0 + pow((2.0*re->wrld.exp + 0.5), -10);
+ re->wrld.logfac= log( (re->wrld.linfac-1.0)/re->wrld.linfac )/re->wrld.range;
}
+
+
+/* ------------------------------------------------------------------------- */
+/* Object Finalization */
+/* ------------------------------------------------------------------------- */
+
/* prevent phong interpolation for giving ray shadow errors (terminator problem) */
-static void set_phong_threshold(Render *re, Object *ob, int startface, int numface, int startvert, int numvert )
+static void set_phong_threshold(ObjectRen *obr)
{
// VertRen *ver;
VlakRen *vlr;
@@ -2861,8 +3698,8 @@ static void set_phong_threshold(Render *re, Object *ob, int startface, int numfa
are taken into account. This threshold is meant to work on smooth geometry, not
for extreme cases (ton) */
- for(i=startface; i<startface+numface; i++) {
- vlr= RE_findOrAddVlak(re, i);
+ for(i=0; i<obr->totvlak; i++) {
+ vlr= RE_findOrAddVlak(obr, i);
if(vlr->flag & R_SMOOTH) {
dot= INPR(vlr->n, vlr->v1->n);
dot= ABS(dot);
@@ -2893,142 +3730,13 @@ static void set_phong_threshold(Render *re, Object *ob, int startface, int numfa
if(tot) {
thresh/= (float)tot;
- ob->smoothresh= cos(0.5*M_PI-saacos(thresh));
- }
-}
-
-/* par = pointer to duplicator parent, needed for object lookup table */
-/* index = when duplicater copies same object (particle), the counter */
-static void init_render_object(Render *re, Object *ob, Object *par, int index, int only_verts)
-{
- static double lasttime= 0.0;
- double time;
- float mat[4][4];
- int startface, startvert;
-
- 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);
- }
-
- /* generic post process here */
- if(startvert!=re->totvert) {
-
- RE_addRenderObject(re, ob, par, index, startvert, re->totvert, startface, re->totvlak);
-
- /* the exception below is because displace code now is in init_render_mesh call,
- I will look at means to have autosmooth enabled for all object types
- and have it as general postprocess, like displace */
- if (ob->type!=OB_MESH && test_for_displace(re, ob ) )
- do_displacement(re, ob, startface, re->totvlak-startface, startvert, re->totvert-startvert);
-
- /* phong normal interpolation can cause error in tracing (terminator prob) */
- ob->smoothresh= 0.0;
- if( (re->r.mode & R_RAYTRACE) && (re->r.mode & R_SHADOW) )
- set_phong_threshold(re, ob, startface, re->totvlak-startface, startvert, re->totvert-startvert);
- }
-
- time= PIL_check_seconds_timer();
- if(time - lasttime > 1.0) {
- lasttime= time;
- /* clumsy copying still */
- re->i.totvert= re->totvert;
- re->i.totface= re->totvlak;
- re->i.tothalo= re->tothalo;
- re->i.totlamp= re->totlamp;
- re->stats_draw(&re->i);
- }
-}
-
-void RE_Database_Free(Render *re)
-{
- Object *ob = NULL;
- LampRen *lar;
-
- /* FREE */
-
- for(lar= re->lampren.first; lar; lar= lar->next) {
- 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);
- BLI_freelistN(&re->lights);
-
- free_renderdata_tables(re);
-
- /* free orco. check all objects because of duplis and sets */
- ob= G.main->object.first;
- while(ob) {
- if(ob->type==OB_MBALL) {
- if(ob->disp.first && ob->disp.first!=ob->disp.last) {
- DispList *dl= ob->disp.first;
- BLI_remlink(&ob->disp, dl);
- freedisplist(&ob->disp);
- BLI_addtail(&ob->disp, dl);
- }
- }
- ob= ob->id.next;
- }
-
- free_mesh_orco_hash(re);
-
- end_radio_render();
- end_render_materials();
-
- if(re->wrld.aosphere) {
- MEM_freeN(re->wrld.aosphere);
- re->wrld.aosphere= NULL;
- re->scene->world->aosphere= NULL;
- }
- if(re->wrld.aotables) {
- MEM_freeN(re->wrld.aotables);
- 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) freeraytree(re);
-
- free_sss(re);
-
- re->totvlak=re->totvert=re->totlamp=re->tothalo= 0;
- re->i.convertdone= 0;
-
- if(re->scene)
- if(re->scene->r.scemode & R_FREE_IMAGE)
- if((re->r.scemode & R_PREVIEWBUTS)==0)
- BKE_image_free_all_textures();
-
- if(re->memArena) {
- BLI_memarena_free(re->memArena);
- re->memArena = NULL;
+ obr->ob->smoothresh= cos(0.5*M_PI-saacos(thresh));
}
}
/* per face check if all samples should be taken.
- if raytrace, do always for raytraced material, or when material full_osa set */
-static void set_fullsample_flag(Render *re)
+ if raytrace or multisample, do always for raytraced material, or when material full_osa set */
+static void set_fullsample_flag(Render *re, ObjectRen *obr)
{
VlakRen *vlr;
int a, trace;
@@ -3038,10 +3746,11 @@ static void set_fullsample_flag(Render *re)
trace= re->r.mode & R_RAYTRACE;
- for(a=re->totvlak-1; a>=0; a--) {
- vlr= RE_findOrAddVlak(re, a);
+ for(a=obr->totvlak-1; a>=0; a--) {
+ vlr= RE_findOrAddVlak(obr, a);
- if(vlr->mat->mode & MA_FULL_OSA) vlr->flag |= R_FULL_OSA;
+ 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))
@@ -3053,15 +3762,15 @@ static void set_fullsample_flag(Render *re)
}
}
-static void check_non_flat_quads(Render *re)
+static void check_non_flat_quads(ObjectRen *obr)
{
VlakRen *vlr, *vlr1;
VertRen *v1, *v2, *v3, *v4;
float nor[3], xn, flen;
int a;
- for(a=re->totvlak-1; a>=0; a--) {
- vlr= RE_findOrAddVlak(re, a);
+ for(a=obr->totvlak-1; a>=0; a--) {
+ vlr= RE_findOrAddVlak(obr, a);
/* test if rendering as a quad or triangle, skip wire */
if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->mode & MA_WIRE)==0) {
@@ -3117,7 +3826,7 @@ static void check_non_flat_quads(Render *re)
if(ABS(xn) < 0.999995 ) { // checked on noisy fractal grid
float d1, d2;
- vlr1= RE_vlakren_copy(re, vlr);
+ vlr1= RE_vlakren_copy(obr, vlr);
vlr1->flag |= R_FACE_SPLIT;
/* split direction based on vnorms */
@@ -3160,112 +3869,559 @@ static void check_non_flat_quads(Render *re)
}
}
-/* layflag: allows material group to ignore layerflag */
-static void add_lightgroup(Render *re, Group *group, int exclusive)
+static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
{
- GroupObject *go, *gol;
-
- group->id.flag &= ~LIB_DOIT;
+ Object *ob= obr->ob;
+ VertRen *ver= NULL;
+ StrandRen *strand= NULL;
+ StrandBound *sbound= NULL;
+ float min[3], max[3], smin[3], smax[3];
+ int a, b;
- /* it's a bit too many loops in loops... but will survive */
- /* note that 'exclusive' will remove it from the global list */
- for(go= group->gobject.first; go; go= go->next) {
- go->lampren= NULL;
-
- if(go->ob->lay & re->scene->lay) {
- if(go->ob && go->ob->type==OB_LAMP) {
- for(gol= re->lights.first; gol; gol= gol->next) {
- if(gol->ob==go->ob) {
- go->lampren= gol->lampren;
- break;
+ if(obr->totvert || obr->totvlak || obr->tothalo || obr->totstrand) {
+ /* the exception below is because displace code now is in init_render_mesh call,
+ I will look at means to have autosmooth enabled for all object types
+ and have it as general postprocess, like displace */
+ if(ob->type!=OB_MESH && test_for_displace(re, ob))
+ do_displacement(re, obr);
+
+ if(!timeoffset) {
+ /* phong normal interpolation can cause error in tracing
+ * (terminator problem) */
+ ob->smoothresh= 0.0;
+ if((re->r.mode & R_RAYTRACE) && (re->r.mode & R_SHADOW))
+ set_phong_threshold(obr);
+
+ check_non_flat_quads(obr);
+ set_fullsample_flag(re, obr);
+
+ /* compute bounding boxes for clipping */
+ INIT_MINMAX(min, max);
+ for(a=0; a<obr->totvert; a++) {
+ if((a & 255)==0) ver= obr->vertnodes[a>>8].vert;
+ else ver++;
+
+ DO_MINMAX(ver->co, min, max);
+ }
+
+ if(obr->strandbuf) {
+ sbound= obr->strandbuf->bound;
+ for(b=0; b<obr->strandbuf->totbound; b++, sbound++) {
+ INIT_MINMAX(smin, smax);
+
+ for(a=sbound->start; a<sbound->end; a++) {
+ strand= RE_findOrAddStrand(obr, a);
+ strand_minmax(strand, smin, smax);
}
- }
- if(go->lampren==NULL)
- gol= add_render_lamp(re, go->ob);
- if(gol && exclusive) {
- BLI_remlink(&re->lights, gol);
- MEM_freeN(gol);
+
+ VECCOPY(sbound->boundbox[0], smin);
+ VECCOPY(sbound->boundbox[1], smax);
+
+ DO_MINMAX(smin, min, max);
+ DO_MINMAX(smax, min, max);
}
}
+
+ VECCOPY(obr->boundbox[0], min);
+ VECCOPY(obr->boundbox[1], max);
}
}
}
-static void set_material_lightgroups(Render *re)
+/* ------------------------------------------------------------------------- */
+/* Database */
+/* ------------------------------------------------------------------------- */
+
+static int render_object_type(int type)
{
- Group *group;
- Material *ma;
-
- /* not for preview render */
- if(re->scene->r.scemode & R_PREVIEWBUTS)
- return;
-
- for(group= G.main->group.first; group; group=group->id.next)
- group->id.flag |= LIB_DOIT;
+ return ELEM5(type, OB_FONT, OB_CURVE, OB_SURF, OB_MESH, OB_MBALL);
+}
+
+static void find_dupli_instances(Render *re, ObjectRen *obr)
+{
+ ObjectInstanceRen *obi;
+ float imat[4][4], obmat[4][4], obimat[4][4], nmat[3][3];
+ int first = 1;
+
+ Mat4MulMat4(obmat, obr->obmat, re->viewmat);
+ Mat4Invert(imat, obmat);
+
+ for(obi=re->instancetable.last; obi; obi=obi->prev) {
+ if(!obi->obr && obi->ob == obr->ob && obi->psysindex == obr->psysindex) {
+ obi->obr= obr;
+
+ /* compute difference between object matrix and
+ * object matrix with dupli transform, in viewspace */
+ Mat4CpyMat4(obimat, obi->mat);
+ Mat4MulMat4(obi->mat, imat, obimat);
+
+ Mat3CpyMat4(nmat, obi->mat);
+ Mat3Inv(obi->imat, nmat);
+
+ if(!first) {
+ re->totvert += obr->totvert;
+ re->totvlak += obr->totvlak;
+ re->tothalo += obr->tothalo;
+ re->totstrand += obr->totstrand;
+ }
+ else
+ first= 0;
+ }
+ }
+}
+
+static void assign_dupligroup_dupli(Render *re, ObjectInstanceRen *obi, ObjectRen *obr)
+{
+ float imat[4][4], obmat[4][4], obimat[4][4], nmat[3][3];
+
+ Mat4MulMat4(obmat, obr->obmat, re->viewmat);
+ Mat4Invert(imat, obmat);
+
+ obi->obr= obr;
+
+ /* compute difference between object matrix and
+ * object matrix with dupli transform, in viewspace */
+ Mat4CpyMat4(obimat, obi->mat);
+ Mat4MulMat4(obi->mat, imat, obimat);
+
+ Mat3CpyMat4(nmat, obi->mat);
+ Mat3Inv(obi->imat, nmat);
+
+ re->totvert += obr->totvert;
+ re->totvlak += obr->totvlak;
+ re->tothalo += obr->tothalo;
+ re->totstrand += obr->totstrand;
+}
+
+static ObjectRen *find_dupligroup_dupli(Render *re, Object *ob, int psysindex)
+{
+ ObjectRen *obr;
+
+ for(obr=re->objecttable.first; obr; obr=obr->next)
+ if(obr->ob == ob && obr->psysindex == psysindex && (obr->flag & R_INSTANCEABLE))
+ return obr;
- /* it's a bit too many loops in loops... but will survive */
- /* hola! materials not in use...? */
- for(ma= G.main->mat.first; ma; ma=ma->id.next) {
- if(ma->group && (ma->group->id.flag & LIB_DOIT))
- add_lightgroup(re, ma->group, ma->mode & MA_GROUP_NOLAY);
+ return NULL;
+}
+
+static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset)
+{
+ Object *ob= obr->ob;
+ ParticleSystem *psys;
+ int i;
+
+ if(obr->psysindex) {
+ if((!obr->prev || obr->prev->ob != ob) && ob->type==OB_MESH) {
+ /* the emitter mesh wasn't rendered so the modifier stack wasn't
+ * evaluated with render settings */
+ DerivedMesh *dm;
+ dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+ dm->release(dm);
+ }
+
+ for(psys=ob->particlesystem.first, i=0; i<obr->psysindex-1; i++)
+ psys= psys->next;
+
+ render_new_particle_system(re, obr, psys, timeoffset);
+ }
+ else {
+ if ELEM(ob->type, OB_FONT, OB_CURVE)
+ init_render_curve(re, obr, timeoffset);
+ else if(ob->type==OB_SURF)
+ init_render_surf(re, obr);
+ else if(ob->type==OB_MESH)
+ init_render_mesh(re, obr, timeoffset);
+ else if(ob->type==OB_MBALL)
+ init_render_mball(re, obr);
+ }
+
+ finalize_render_object(re, obr, timeoffset);
+
+ re->totvert += obr->totvert;
+ re->totvlak += obr->totvlak;
+ re->tothalo += obr->tothalo;
+ re->totstrand += obr->totstrand;
+}
+
+static void add_render_object(Render *re, Object *ob, Object *par, int index, int timeoffset, int instanceable)
+{
+ ObjectRen *obr;
+ ParticleSystem *psys;
+ int show_emitter, allow_render= 1, psysindex;
+
+ /* 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) {
+ show_emitter= 0;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ show_emitter += psys->part->draw & PART_DRAW_EMITTER;
+ psys_render_set(ob, psys, re->viewmat, re->winmat, re->winx, re->winy, timeoffset);
+ }
+
+ /* if no psys has "show emitter" selected don't render emitter */
+ if(show_emitter == 0)
+ allow_render= 0;
+ }
+
+ /* one render object for the data itself */
+ if(allow_render) {
+ obr= RE_addRenderObject(re, ob, par, index, 0, ob->lay);
+ if(instanceable) {
+ obr->flag |= R_INSTANCEABLE;
+ Mat4CpyMat4(obr->obmat, ob->obmat);
+ }
+ init_render_object_data(re, obr, timeoffset);
+
+ /* only add instance for objects that have not been used for dupli */
+ if(!(ob->transflag & OB_RENDER_DUPLI))
+ RE_addRenderInstance(re, obr, ob, par, index, 0, NULL);
+ else
+ find_dupli_instances(re, obr);
+ }
+
+ /* and one render object per particle system */
+ if(ob->particlesystem.first) {
+ psysindex= 1;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next, psysindex++) {
+ obr= RE_addRenderObject(re, ob, par, index, psysindex, ob->lay);
+ if(instanceable) {
+ obr->flag |= R_INSTANCEABLE;
+ Mat4CpyMat4(obr->obmat, ob->obmat);
+ }
+ init_render_object_data(re, obr, timeoffset);
+ psys_render_restore(ob, psys);
+
+ /* only add instance for objects that have not been used for dupli */
+ if(!(ob->transflag & OB_RENDER_DUPLI))
+ RE_addRenderInstance(re, obr, ob, par, index, psysindex, NULL);
+ else
+ find_dupli_instances(re, obr);
+ }
}
}
-static void set_renderlayer_lightgroups(Render *re, Scene *sce)
+/* par = pointer to duplicator parent, needed for object lookup table */
+/* index = when duplicater copies same object (particle), the counter */
+static void init_render_object(Render *re, Object *ob, Object *par, int index, int timeoffset, int instanceable)
{
- SceneRenderLayer *srl;
+ static double lasttime= 0.0;
+ double time;
+ float mat[4][4];
+
+ if(ob->type==OB_LAMP)
+ add_render_lamp(re, ob);
+ else if(render_object_type(ob->type))
+ add_render_object(re, ob, par, index, timeoffset, instanceable);
+ else {
+ MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ MTC_Mat4Invert(ob->imat, mat);
+ }
- for(srl= sce->r.layers.first; srl; srl= srl->next) {
- if(srl->light_override)
- add_lightgroup(re, srl->light_override, 0);
+ time= PIL_check_seconds_timer();
+ if(time - lasttime > 1.0) {
+ lasttime= time;
+ /* clumsy copying still */
+ re->i.totvert= re->totvert;
+ re->i.totface= re->totvlak;
+ re->i.totstrand= re->totstrand;
+ re->i.tothalo= re->tothalo;
+ re->i.totlamp= re->totlamp;
+ re->stats_draw(&re->i);
}
+
+ ob->flag |= OB_DONE;
}
-void init_render_world(Render *re)
+void RE_Database_Free(Render *re)
{
- int a;
- char *cp;
+ Object *ob = NULL;
+ LampRen *lar;
- if(re->scene && re->scene->world) {
- re->wrld= *(re->scene->world);
-
- cp= (char *)&re->wrld.fastcol;
-
- cp[0]= 255.0*re->wrld.horr;
- cp[1]= 255.0*re->wrld.horg;
- cp[2]= 255.0*re->wrld.horb;
- cp[3]= 1;
-
- VECCOPY(re->grvec, re->viewmat[2]);
- Normalize(re->grvec);
- Mat3CpyMat4(re->imat, re->viewinv);
-
- for(a=0; a<MAX_MTEX; a++)
- if(re->wrld.mtex[a] && re->wrld.mtex[a]->tex) re->wrld.skytype |= WO_SKYTEX;
-
- /* AO samples should be OSA minimum */
- if(re->osa)
- while(re->wrld.aosamp*re->wrld.aosamp < re->osa)
- re->wrld.aosamp++;
- if(!(re->r.mode & R_RAYTRACE))
- re->wrld.mode &= ~WO_AMB_OCC;
+ /* statistics for debugging render memory usage */
+ if(G.f & G_DEBUG) {
+ if((re->r.scemode & R_PREVIEWBUTS)==0) {
+ BKE_image_print_memlist();
+ MEM_printmemlist_stats();
+ }
}
- else {
- memset(&re->wrld, 0, sizeof(World));
- re->wrld.exp= 0.0;
- re->wrld.range= 1.0;
+
+ /* FREE */
+
+ for(lar= re->lampren.first; lar; lar= lar->next) {
+ 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);
}
- re->wrld.linfac= 1.0 + pow((2.0*re->wrld.exp + 0.5), -10);
- re->wrld.logfac= log( (re->wrld.linfac-1.0)/re->wrld.linfac )/re->wrld.range;
+ BLI_freelistN(&re->lampren);
+ BLI_freelistN(&re->lights);
+
+ free_renderdata_tables(re);
+
+ /* free orco. check all objects because of duplis and sets */
+ ob= G.main->object.first;
+ while(ob) {
+ if(ob->type==OB_MBALL) {
+ if(ob->disp.first && ob->disp.first!=ob->disp.last) {
+ DispList *dl= ob->disp.first;
+ BLI_remlink(&ob->disp, dl);
+ freedisplist(&ob->disp);
+ BLI_addtail(&ob->disp, dl);
+ }
+ }
+ ob= ob->id.next;
+ }
+
+ free_mesh_orco_hash(re);
+
+ end_radio_render();
+ end_render_materials();
+
+ if(re->wrld.aosphere) {
+ MEM_freeN(re->wrld.aosphere);
+ re->wrld.aosphere= NULL;
+ re->scene->world->aosphere= NULL;
+ }
+ if(re->wrld.aotables) {
+ MEM_freeN(re->wrld.aotables);
+ 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) freeraytree(re);
+
+ free_sss(re);
+ free_occ(re);
+ free_strand_surface(re);
+
+ re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
+ re->i.convertdone= 0;
+
+ if(re->scene)
+ if(re->scene->r.scemode & R_FREE_IMAGE)
+ if((re->r.scemode & R_PREVIEWBUTS)==0)
+ BKE_image_free_all_textures();
+
+ if(re->memArena) {
+ BLI_memarena_free(re->memArena);
+ re->memArena = NULL;
+ }
+}
+
+static int allow_render_object(Object *ob, int nolamps, int onlyselected, Object *actob)
+{
+ /* override not showing object when duplis are used with particles */
+ if(ob->transflag & OB_DUPLIPARTS){
+ int allow= 0;
+
+ if(ob->particlesystem.first) {
+ ParticleSystem *psys;
+ ParticleSettings *part;
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ part=psys->part;
+
+ if(part->draw & PART_DRAW_EMITTER)
+ allow= 1;
+ }
+ }
+
+ if(!allow)
+ return 0;
+ }
+ else if(ob->transflag & OB_DUPLI)
+ return 0;
+
+ if(nolamps && (ob->type==OB_LAMP))
+ return 0;
+
+ if(onlyselected && (ob!=actob && !(ob->flag & SELECT)))
+ return 0;
+
+ return 1;
+}
+
+static int allow_render_dupli_instance(Render *re, DupliObject *dob, Object *obd)
+{
+ return (render_object_type(obd->type) &&
+ (!(dob->type == OB_DUPLIGROUP) || !dob->animated) &&
+ !(re->r.mode & R_RADIO));
+}
+
+static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, int level, int enable)
+{
+ /* ugly function, but we need to set particle systems to their render
+ * settings before calling object_duplilist, to get render level duplis */
+ Group *group;
+ GroupObject *go;
+ ParticleSystem *psys;
+ DerivedMesh *dm;
+
+ if(level >= MAX_DUPLI_RECUR)
+ return;
+
+ if(ob->transflag & OB_DUPLIPARTS) {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ if(ELEM(psys->part->draw_as, PART_DRAW_OB, PART_DRAW_GR)) {
+ if(enable)
+ psys_render_set(ob, psys, re->viewmat, re->winmat, re->winx, re->winy, timeoffset);
+ else
+ psys_render_restore(ob, psys);
+ }
+ }
+
+ if(level == 0 && enable) {
+ /* this is to make sure we get render level duplis in groups:
+ * the derivedmesh must be created before init_render_mesh,
+ * since object_duplilist does dupliparticles before that */
+ dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+ dm->release(dm);
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated;
+ }
+ }
+
+ if(ob->dup_group==NULL) return;
+ group= ob->dup_group;
+
+ for(go= group->gobject.first; go; go= go->next)
+ dupli_render_particle_set(re, go->ob, timeoffset, level+1, enable);
+}
+
+static void database_init_objects(Render *re, unsigned int lay, int nolamps, int onlyselected, Object *actob, int timeoffset)
+{
+ Base *base;
+ Object *ob;
+ ObjectInstanceRen *obi;
+ Scene *sce;
+ float mat[4][4];
+
+ for(SETLOOPER(re->scene, base)) {
+ ob= base->object;
+ /* imat objects has to be done here, since displace can have texture using Object map-input */
+ MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ MTC_Mat4Invert(ob->imat, mat);
+ /* each object should only be rendered once */
+ ob->flag &= ~OB_DONE;
+ ob->transflag &= ~OB_RENDER_DUPLI;
+ }
+
+ for(SETLOOPER(re->scene, base)) {
+ ob= base->object;
+
+ /* if the object has been restricted from rendering in the outliner, ignore it */
+ if(ob->restrictflag & OB_RESTRICT_RENDER) continue;
+
+ /* OB_DONE means the object itself got duplicated, so was already converted */
+ if(ob->flag & OB_DONE) {
+ if(ob->transflag & OB_RENDER_DUPLI)
+ if(allow_render_object(ob, nolamps, onlyselected, actob))
+ init_render_object(re, ob, NULL, 0, timeoffset, 1);
+ }
+ else if((base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->scene->lay)) ) {
+ if((ob->transflag & OB_DUPLI) && (ob->type!=OB_MBALL)) {
+ DupliObject *dob;
+ ListBase *lb;
+
+ dupli_render_particle_set(re, ob, timeoffset, 0, 1);
+ lb= object_duplilist(sce, ob);
+ dupli_render_particle_set(re, ob, timeoffset, 0, 0);
+
+ for(dob= lb->first; dob; dob= dob->next) {
+ Object *obd= dob->ob;
+
+ Mat4CpyMat4(obd->obmat, dob->mat);
+
+ /* group duplis need to set ob matrices correct, for deform. so no_draw is part handled */
+ if(!(obd->transflag & OB_RENDER_DUPLI) && dob->no_draw)
+ continue;
+
+ if(obd->restrictflag & OB_RESTRICT_RENDER)
+ continue;
+
+ if(obd->type==OB_MBALL)
+ continue;
+
+ if(!allow_render_object(obd, nolamps, onlyselected, actob))
+ continue;
+
+ if(allow_render_dupli_instance(re, dob, obd)) {
+ ParticleSystem *psys;
+ ObjectRen *obr = NULL;
+ int psysindex;
+ float mat[4][4];
+
+ if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, 0))) {
+ Mat4MulMat4(mat, dob->mat, re->viewmat);
+ obi= RE_addRenderInstance(re, NULL, obd, ob, dob->index, 0, mat);
+
+ if(dob->type != OB_DUPLIGROUP) {
+ VECCOPY(obi->dupliorco, dob->orco);
+ obi->dupliuv[0]= dob->uv[0];
+ obi->dupliuv[1]= dob->uv[1];
+ }
+ else {
+ assign_dupligroup_dupli(re, obi, obr);
+ if(obd->transflag & OB_RENDER_DUPLI)
+ find_dupli_instances(re, obr);
+ }
+ }
+ else
+ init_render_object(re, obd, ob, dob->index, timeoffset, !dob->animated);
+
+ psysindex= 1;
+ for(psys=obd->particlesystem.first; psys; psys=psys->next) {
+ if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, ob, psysindex))) {
+ obi= RE_addRenderInstance(re, NULL, obd, ob, dob->index, psysindex++, mat);
+ if(dob->type != OB_DUPLIGROUP) {
+ VECCOPY(obi->dupliorco, dob->orco);
+ obi->dupliuv[0]= dob->uv[0];
+ obi->dupliuv[1]= dob->uv[1];
+ }
+ else {
+ assign_dupligroup_dupli(re, obi, obr);
+ if(obd->transflag & OB_RENDER_DUPLI)
+ find_dupli_instances(re, obr);
+ }
+ }
+ }
+
+ if(dob->type != OB_DUPLIGROUP) {
+ obd->flag |= OB_DONE;
+ obd->transflag |= OB_RENDER_DUPLI;
+ }
+ }
+ else
+ init_render_object(re, obd, ob, dob->index, timeoffset, !dob->animated);
+
+ if(re->test_break()) break;
+ }
+ free_object_duplilist(lb);
+
+ if(allow_render_object(ob, nolamps, onlyselected, actob))
+ init_render_object(re, ob, NULL, 0, timeoffset, 0);
+ }
+ else if(allow_render_object(ob, nolamps, onlyselected, actob))
+ init_render_object(re, ob, NULL, 0, timeoffset, 0);
+ }
+
+ if(re->test_break()) break;
+ }
+
+ if(!re->test_break())
+ RE_makeRenderInstances(re);
}
/* used to be 'rotate scene' */
void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
{
extern int slurph_opt; /* key.c */
- Base *base;
- Object *ob;
Scene *sce;
float mat[4][4];
unsigned int lay;
@@ -3278,7 +4434,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* XXX add test if dbase was filled already? */
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
- re->totvlak=re->totvert=re->totlamp=re->tothalo= 0;
+ re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->lights.first= re->lights.last= NULL;
re->lampren.first= re->lampren.last= NULL;
@@ -3301,7 +4457,7 @@ 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) {
+ if((re->r.mode & R_RAYTRACE) && (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)
@@ -3313,148 +4469,12 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
init_render_materials(re->r.mode, &re->wrld.ambr);
set_node_shader_lamp_loop(shade_material_loop);
- for(SETLOOPER(re->scene, base)) {
- ob= base->object;
- /* imat objects has to be done here, since displace can have texture using Object map-input */
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
- /* each object should only be rendered once */
- ob->flag &= ~OB_DONE;
- }
-
/* MAKE RENDER DATA */
-
- for(SETLOOPER(re->scene, base)) {
- ob= base->object;
-
- /* if the object has been restricted from rendering in the outliner, ignore it */
- if (ob->restrictflag & OB_RESTRICT_RENDER) continue;
-
- /* OB_DONE means the object itself got duplicated, so was already converted */
- if (ob->flag & OB_DONE) {
-#ifndef DISABLE_YAFRAY
- /* yafray: for some reason this part was removed, but yafray really needs it...
- Dupliverts objects are treated as instances of an original 'sourceobject',
- which needs to be included in the renderlist here.
- exception: lamps, lattices, armatures & camera's */
- if ((re->r.renderer==R_YAFRAY) && ((ob->type!=OB_LATTICE) && (ob->type!=OB_ARMATURE) &&
- (ob->type!=OB_LAMP) && (ob->type!=OB_CAMERA)))
- {
- printf("Duplivert object %s, adding to renderlist\n", ob->id.name);
- ob->flag &= ~OB_DONE;
- init_render_object(re, ob, NULL, 0, 0);
- ob->flag |= OB_DONE;
- }
-#endif /* disable yafray */
- }
- else if( (base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->scene->lay)) ) {
- if(ob->transflag & OB_DUPLI) {
-
- /* exception: mballs! */
-#ifndef DISABLE_YAFRAY
- /* yafray: except for mballs, include at least one copy of a dupliframe object in the renderlist. */
- if (re->r.renderer==R_YAFRAY) {
- if ((ob->type!=OB_MBALL) && ((ob->transflag & OB_DUPLIFRAMES)!=0)) {
- printf("Dupliframe Object %s, adding to renderlist\n", ob->id.name);
- init_render_object(re, ob, NULL, 0, 0);
- }
- }
-#endif /* disable yafray */
- /* before make duplis, update particle for current frame */
- if(ob->transflag & OB_DUPLIVERTS) {
- PartEff *paf= give_parteff(ob);
- if(paf) {
- if(paf->flag & PAF_ANIMATED) build_particle_system(ob);
- }
- }
-
- if(ob->type==OB_MBALL) {
- init_render_object(re, ob, NULL, 0, 0);
- }
- else {
- DupliObject *dob;
- ListBase *lb= object_duplilist(sce, ob);
-
- for(dob= lb->first; dob; dob= dob->next) {
- Object *obd= dob->ob;
-
- if (obd->restrictflag & OB_RESTRICT_RENDER) continue;
-
- Mat4CpyMat4(obd->obmat, dob->mat);
-
- /* group duplis need to set ob matrices correct, for deform. so no_draw is part handled */
- if(dob->no_draw)
- continue;
-
- if(obd->type!=OB_MBALL) {
-#ifndef DISABLE_YAFRAY
- /* yafray: special case handling of duplivert/dupligroup objects.
- Only one copy included in renderlist(see above), all others treated as instance of that.
- So only need to store name and matrix. Exception are lamps. lattices, armatures and camera's */
- if (re->r.renderer==R_YAFRAY) {
- /* dupligroup obs are included directly */
- if (obd->flag & OB_FROMGROUP) {
- printf("Dupligroup object %s, adding to renderlist\n", obd->id.name);
- init_render_object(re, obd, ob, dob->index, 0);
- }
- else if ((obd->type!=OB_LATTICE) && (obd->type!=OB_ARMATURE) &&
- (obd->type!=OB_LAMP) && (obd->type!=OB_CAMERA))
- {
- printf("Adding dupli matrix for object %s\n", obd->id.name);
- YAF_addDupliMtx(obd);
- }
- else init_render_object(re, obd, ob, dob->index, 0);
- }
- else init_render_object(re, obd, ob, dob->index, 0);
-#else
- init_render_object(re, obd, ob, dob->index, 0);
-#endif /* disable yafray */
- }
-
- if(re->test_break()) break;
- }
- free_object_duplilist(lb);
- }
- }
- else {
-#ifndef DISABLE_YAFRAY
- /* yafray: linked data objects treated similarly to dupliverts,
- If object not known yet (not in renderlist), include in the renderlist,
- otherwise treat as instance of it, so only name and matrix are stored
- Exception: objects which have materials linked to object instead of mesh */
- if ((re->r.renderer==R_YAFRAY) && (ob->colbits==0))
- {
- /* Special case, parent object dupli's: ignore if object itself is lamp or parent is lattice or empty */
- if (ob->parent) {
- if ((ob->type!=OB_LAMP) && (ob->parent->type!=OB_EMPTY) &&
- (ob->parent->type!=OB_LATTICE) && YAF_objectKnownData(ob))
- printf("From parent: Added dupli matrix for linked data object %s\n", ob->id.name);
- else
- init_render_object(re, ob, NULL, 0, 0);
- }
- else if ((ob->type!=OB_EMPTY) && (ob->type!=OB_LAMP) &&
- (ob->type!=OB_ARMATURE) && YAF_objectKnownData(ob))
- printf("Added dupli matrix for linked data object %s\n", ob->id.name);
- else
- init_render_object(re, ob, NULL, 0, 0);
- }
- else init_render_object(re, ob, NULL, 0, 0);
-#else
- init_render_object(re, ob, NULL, 0, 0);
-#endif /* disable yafray */
- }
-
- }
+ database_init_objects(re, lay, 0, 0, 0, 0);
- if(re->test_break()) break;
- }
-
-
if(!re->test_break()) {
- LampRen *lar;
-
- sort_halos(re);
-
+ int tothalo;
+
set_material_lightgroups(re);
for(sce= re->scene; sce; sce= sce->set)
set_renderlayer_lightgroups(re, sce);
@@ -3464,29 +4484,23 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* for now some clumsy copying still */
re->i.totvert= re->totvert;
re->i.totface= re->totvlak;
+ re->i.totstrand= re->totstrand;
re->i.tothalo= re->tothalo;
re->i.totlamp= re->totlamp;
re->stats_draw(&re->i);
- set_fullsample_flag(re);
- check_non_flat_quads(re);
- set_normalflags(re);
-
+ /* don't sort stars */
+ tothalo= re->tothalo;
if(!re->test_break())
- if(re->wrld.mode & WO_STARS)
+ if(re->wrld.mode & WO_STARS)
RE_make_stars(re, NULL, NULL, NULL);
+ sort_halos(re, tothalo);
re->i.infostr= "Creating Shadowbuffers";
re->stats_draw(&re->i);
/* SHADOW BUFFER */
- for(lar=re->lampren.first; lar; lar= lar->next) {
- if(re->test_break()) break;
- if(lar->shb) {
- /* if type is irregular, this only sets the perspective matrix and autoclips */
- makeshadowbuf(re, lar);
- }
- }
+ threaded_makeshadowbufs(re);
/* yafray: 'direct' radiosity, environment maps and raytree init not needed for yafray render */
/* although radio mode could be useful at some point, later */
@@ -3507,11 +4521,17 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
}
if(!re->test_break())
- project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0);
+ project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0, 1);
+
+ /* Occlusion */
+ if((re->wrld.mode & WO_AMB_OCC) && !re->test_break())
+ if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
+ if(re->r.renderer==R_INTERN)
+ make_occ_tree(re);
/* SSS */
if((re->r.mode & R_SSS) && !re->test_break())
- if (re->r.renderer==R_INTERN)
+ if(re->r.renderer==R_INTERN)
make_sss_tree(re);
}
@@ -3524,12 +4544,24 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
re->stats_draw(&re->i);
}
+/* exported call to recalculate hoco for vertices, when winmat changed */
+void RE_DataBase_ApplyWindow(Render *re)
+{
+ project_renderdata(re, projectverto, 0, 0, 0);
+}
+
+void RE_DataBase_GetView(Render *re, float mat[][4])
+{
+ Mat4CpyMat4(mat, re->viewmat);
+}
+
+/* ------------------------------------------------------------------------- */
+/* Speed Vectors */
+/* ------------------------------------------------------------------------- */
+
static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
{
extern int slurph_opt; /* key.c */
- Base *base;
- Object *ob;
- Scene *sce;
float mat[4][4];
unsigned int lay;
@@ -3538,8 +4570,8 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
/* XXX add test if dbase was filled already? */
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
- re->totvlak=re->totvert=re->totlamp=re->tothalo= 0;
- re->i.totface=re->i.totvert=re->i.totlamp=re->i.tothalo= 0;
+ re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
+ re->i.totface=re->i.totvert=re->i.totstrand=re->i.totlamp=re->i.tothalo= 0;
re->lights.first= re->lights.last= NULL;
slurph_opt= 0;
@@ -3559,73 +4591,18 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
RE_SetView(re, mat);
}
- for(SETLOOPER(re->scene, base)) {
- ob= base->object;
- /* imat objects has to be done here, since displace can have texture using Object map-input */
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
- /* each object should only be rendered once */
- ob->flag &= ~OB_DONE;
- }
-
/* MAKE RENDER DATA */
-
- for(SETLOOPER(re->scene, base)) {
- ob= base->object;
-
- if (ob->restrictflag & OB_RESTRICT_RENDER) continue;
-
- /* OB_DONE means the object itself got duplicated, so was already converted */
- if(ob->flag & OB_DONE);
- else if( (base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->scene->lay)) ) {
- if(ob->transflag & OB_DUPLI) {
-
- /* before make duplis, update particle for current frame */
- if(ob->transflag & OB_DUPLIVERTS) {
- PartEff *paf= give_parteff(ob);
- if(paf) {
- if(paf->flag & PAF_ANIMATED) build_particle_system(ob);
- }
- }
-
- if(ob->type==OB_MBALL) {
- init_render_object(re, ob, NULL, 0, 1);
- }
- else {
- DupliObject *dob;
- ListBase *lb= object_duplilist(sce, ob);
-
- for(dob= lb->first; dob; dob= dob->next) {
- Object *obd= dob->ob;
-
- if (obd->restrictflag & OB_RESTRICT_RENDER) continue;
-
- Mat4CpyMat4(obd->obmat, dob->mat);
-
- if(obd->type!=OB_MBALL) {
- init_render_object(re, obd, ob, dob->index, 1);
- }
- }
- free_object_duplilist(lb);
- }
- }
- else {
- init_render_object(re, ob, NULL, 0, 1);
- }
-
- }
- if(re->test_break()) break;
- }
+ database_init_objects(re, lay, 0, 0, 0, timeoffset);
if(!re->test_break())
- project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0);
+ project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0, 1);
/* do this in end, particles for example need cfra */
G.scene->r.cfra-=timeoffset;
}
/* choose to use static, to prevent giving too many args to this call */
-static void speedvector_project(Render *re, float *zco, VertRen *ver)
+static void speedvector_project(Render *re, float *zco, float *co, float *ho)
{
static float pixelphix=0.0f, pixelphiy=0.0f, zmulx=0.0f, zmuly=0.0f;
static int pano= 0;
@@ -3653,14 +4630,14 @@ static void speedvector_project(Render *re, float *zco, VertRen *ver)
}
/* now map hocos to screenspace, uses very primitive clip still */
- if(ver->ho[3]<0.1f) div= 10.0f;
- else div= 1.0f/ver->ho[3];
+ if(ho[3]<0.1f) div= 10.0f;
+ else div= 1.0f/ho[3];
/* use cylinder projection */
if(pano) {
float vec[3], ang;
- /* angle between (0,0,-1) and (ver->co) */
- VECCOPY(vec, ver->co);
+ /* angle between (0,0,-1) and (co) */
+ VECCOPY(vec, co);
ang= saacos(-vec[2]/sqrt(vec[0]*vec[0] + vec[2]*vec[2]));
if(vec[0]<0.0f) ang= -ang;
@@ -3671,70 +4648,157 @@ static void speedvector_project(Render *re, float *zco, VertRen *ver)
}
else {
- zco[0]= zmulx*(1.0f+ver->ho[0]*div);
- zco[1]= zmuly*(1.0f+ver->ho[1]*div);
+ zco[0]= zmulx*(1.0f+ho[0]*div);
+ zco[1]= zmuly*(1.0f+ho[1]*div);
}
}
-static void calculate_speedvectors(Render *re, float *vectors, int startvert, int endvert, int step)
+static void calculate_speedvector(float *vectors, int step, float winsq, float winroot, float *co, float *ho, float *speed)
{
- VertRen *ver= NULL;
- float *speed, zco[2];
- float len;
- float winsq= re->winx*re->winy, winroot= sqrt(winsq);
- int a;
+ float zco[2], len;
+
+ speedvector_project(NULL, zco, co, ho);
- /* set first vertex OK */
- a= startvert-1;
- ver= re->vertnodes[a>>8].vert + (a & 255);
+ zco[0]= vectors[0] - zco[0];
+ zco[1]= vectors[1] - zco[1];
- for(a=startvert; a<endvert; a++, vectors+=2) {
- if((a & 255)==0)
- ver= re->vertnodes[a>>8].vert;
+ /* enable nice masks for hardly moving stuff or float inaccuracy */
+ if(zco[0]<0.1f && zco[0]>-0.1f && zco[1]<0.1f && zco[1]>-0.1f ) {
+ zco[0]= 0.0f;
+ zco[1]= 0.0f;
+ }
+
+ /* maximize speed for image width, otherwise it never looks good */
+ len= zco[0]*zco[0] + zco[1]*zco[1];
+ if(len > winsq) {
+ len= winroot/sqrt(len);
+ zco[0]*= len;
+ zco[1]*= len;
+ }
+
+ /* note; in main vecblur loop speedvec is negated again */
+ if(step) {
+ speed[2]= -zco[0];
+ speed[3]= -zco[1];
+ }
+ else {
+ speed[0]= zco[0];
+ speed[1]= zco[1];
+ }
+}
+
+static float *calculate_strandsurface_speedvectors(Render *re, ObjectInstanceRen *obi, StrandSurface *mesh)
+{
+ float winsq= re->winx*re->winy, winroot= sqrt(winsq), (*winspeed)[4];
+ float ho[4], prevho[4], nextho[4], winmat[4][4], vec[2];
+ int a;
+
+ if(mesh->co && mesh->prevco && mesh->nextco) {
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulMat4(winmat, obi->mat, re->winmat);
else
- ver++;
-
- speedvector_project(NULL, zco, ver);
-
- zco[0]= vectors[0] - zco[0];
- zco[1]= vectors[1] - zco[1];
-
- /* enable nice masks for hardly moving stuff or float inaccuracy */
- if(zco[0]<0.1f && zco[0]>-0.1f && zco[1]<0.1f && zco[1]>-0.1f ) {
- zco[0]= 0.0f;
- zco[1]= 0.0f;
- }
-
- /* maximize speed for image width, otherwise it never looks good */
- len= zco[0]*zco[0] + zco[1]*zco[1];
- if(len > winsq) {
- len= winroot/sqrt(len);
- zco[0]*= len;
- zco[1]*= len;
+ Mat4CpyMat4(winmat, re->winmat);
+
+ winspeed= MEM_callocN(sizeof(float)*4*mesh->totvert, "StrandSurfWin");
+
+ for(a=0; a<mesh->totvert; a++) {
+ projectvert(mesh->co[a], winmat, ho);
+
+ projectvert(mesh->prevco[a], winmat, prevho);
+ speedvector_project(NULL, vec, mesh->prevco[a], prevho);
+ calculate_speedvector(vec, 0, winsq, winroot, mesh->co[a], ho, winspeed[a]);
+
+ projectvert(mesh->nextco[a], winmat, nextho);
+ speedvector_project(NULL, vec, mesh->nextco[a], nextho);
+ calculate_speedvector(vec, 1, winsq, winroot, mesh->co[a], ho, winspeed[a]);
}
-
- speed= RE_vertren_get_winspeed(re, ver, 1);
- /* note; in main vecblur loop speedvec is negated again */
- if(step) {
- speed[2]= -zco[0];
- speed[3]= -zco[1];
+
+ return (float*)winspeed;
+ }
+
+ return NULL;
+}
+
+static void calculate_speedvectors(Render *re, ObjectInstanceRen *obi, float *vectors, int step)
+{
+ ObjectRen *obr= obi->obr;
+ VertRen *ver= NULL;
+ StrandRen *strand= NULL;
+ StrandBuffer *strandbuf;
+ StrandSurface *mesh= NULL;
+ float *speed, (*winspeed)[4]=NULL, ho[4], winmat[4][4];
+ float *co1, *co2, *co3, *co4, w[4];
+ float winsq= re->winx*re->winy, winroot= sqrt(winsq);
+ int a, *face, *index;
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulMat4(winmat, obi->mat, re->winmat);
+ else
+ Mat4CpyMat4(winmat, re->winmat);
+
+ if(obr->vertnodes) {
+ for(a=0; a<obr->totvert; a++, vectors+=2) {
+ if((a & 255)==0) ver= obr->vertnodes[a>>8].vert;
+ else ver++;
+
+ speed= RE_vertren_get_winspeed(obi, ver, 1);
+ projectvert(ver->co, winmat, ho);
+ calculate_speedvector(vectors, step, winsq, winroot, ver->co, ho, speed);
}
- else {
- speed[0]= zco[0];
- speed[1]= zco[1];
+ }
+
+ if(obr->strandnodes) {
+ strandbuf= obr->strandbuf;
+ mesh= (strandbuf)? strandbuf->surface: NULL;
+
+ /* compute speed vectors at surface vertices */
+ if(mesh)
+ winspeed= (float(*)[4])calculate_strandsurface_speedvectors(re, obi, mesh);
+
+ if(winspeed) {
+ for(a=0; a<obr->totstrand; a++, vectors+=2) {
+ if((a & 255)==0) strand= obr->strandnodes[a>>8].strand;
+ else strand++;
+
+ index= RE_strandren_get_face(obr, strand, 0);
+ if(index) {
+ speed= RE_strandren_get_winspeed(obi, strand, 1);
+
+ /* interpolate speed vectors from strand surface */
+ face= mesh->face[*index];
+
+ co1= mesh->co[face[0]];
+ co2= mesh->co[face[1]];
+ co3= mesh->co[face[2]];
+ co4= (face[3])? mesh->co[face[3]]: NULL;
+
+ InterpWeightsQ3Dfl(co1, co2, co3, co4, strand->vert->co, w);
+
+ speed[0]= speed[1]= speed[2]= speed[3]= 0.0f;
+ QUATADDFAC(speed, speed, winspeed[face[0]], w[0]);
+ QUATADDFAC(speed, speed, winspeed[face[1]], w[1]);
+ QUATADDFAC(speed, speed, winspeed[face[2]], w[2]);
+ if(face[3])
+ QUATADDFAC(speed, speed, winspeed[face[3]], w[3]);
+ }
+ }
+
+ MEM_freeN(winspeed);
}
}
}
-static int load_fluidsimspeedvectors(Render *re, float *vectors, int startvert, int endvert, int step, Object *fsob)
+static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *vectors, int step)
{
+ ObjectRen *obr= obi->obr;
+ Object *fsob= obr->ob;
VertRen *ver= NULL;
float *speed, div, zco[2];
float zmulx= re->winx/2, zmuly= re->winy/2, len;
float winsq= re->winx*re->winy, winroot= sqrt(winsq);
int a, j;
- float hoco[4], fsvec[4], camco[4];
- float mat[4][4];
+ float hoco[4], ho[4], fsvec[4], camco[4];
+ float mat[4][4], winmat[4][4];
float imat[4][4];
MVert *vverts;
@@ -3745,28 +4809,30 @@ static int load_fluidsimspeedvectors(Render *re, float *vectors, int startvert,
MTC_Mat4Invert(imat, mat);
/* set first vertex OK */
- a= startvert-1;
- ver= re->vertnodes[a>>8].vert + (a & 255);
-
if( (!fsob->fluidsimSettings) || (!fsob->fluidsimSettings->meshSurfNormals) ) return 0;
vverts = fsob->fluidsimSettings->meshSurfNormals;
//fprintf(stderr, "GZ_VEL obj '%s', calc load_fluidsimspeedvectors\n",fsob->id.name); // NT DEBUG
- if( endvert-startvert != fsob->fluidsimSettings->meshSurface->totvert ) {
- //fprintf(stderr, "load_fluidsimspeedvectors - modified fluidsim mesh, not using speed vectors (%d,%d)...\n", endvert-startvert , fsob->fluidsimSettings->meshSurface->totvert); // DEBUG
+ if( obr->totvert != fsob->fluidsimSettings->meshSurface->totvert ) {
+ //fprintf(stderr, "load_fluidsimspeedvectors - modified fluidsim mesh, not using speed vectors (%d,%d)...\n", obr->totvert, fsob->fluidsimSettings->meshSurface->totvert); // DEBUG
return 0;
}
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulMat4(winmat, obi->mat, re->winmat);
+ else
+ Mat4CpyMat4(winmat, re->winmat);
- for(a=startvert; a<endvert; a++, vectors+=2) {
+ for(a=0; a<obr->totvert; a++, vectors+=2) {
if((a & 255)==0)
- ver= re->vertnodes[a>>8].vert;
+ ver= obr->vertnodes[a>>8].vert;
else
ver++;
// get fluid velocity
fsvec[3] = 0.;
//fsvec[0] = fsvec[1] = fsvec[2] = fsvec[3] = 0.; fsvec[2] = 2.; // NT fixed test
- for(j=0;j<3;j++) fsvec[j] = vverts[a-startvert].co[j];
+ for(j=0;j<3;j++) fsvec[j] = vverts[a].co[j];
// transform (=rotate) to cam space
camco[0]= imat[0][0]*fsvec[0] + imat[0][1]*fsvec[1] + imat[0][2]*fsvec[2];
@@ -3774,12 +4840,13 @@ static int load_fluidsimspeedvectors(Render *re, float *vectors, int startvert,
camco[2]= imat[2][0]*fsvec[0] + imat[2][1]*fsvec[1] + imat[2][2]*fsvec[2];
// get homogenous coordinates
- projectverto(camco, re->winmat, hoco);
+ projectvert(camco, winmat, hoco);
+ projectvert(ver->co, winmat, ho);
/* now map hocos to screenspace, uses very primitive clip still */
// use ho[3] of original vertex, xy component of vel. direction
- if(ver->ho[3]<0.1f) div= 10.0f;
- else div= 1.0f/ver->ho[3];
+ if(ho[3]<0.1f) div= 10.0f;
+ else div= 1.0f/ho[3];
zco[0]= zmulx*hoco[0]*div;
zco[1]= zmuly*hoco[1]*div;
@@ -3790,7 +4857,7 @@ static int load_fluidsimspeedvectors(Render *re, float *vectors, int startvert,
zco[0]*= len; zco[1]*= len;
}
- speed= RE_vertren_get_winspeed(re, ver, 1);
+ speed= RE_vertren_get_winspeed(obi, ver, 1);
// set both to the same value
speed[0]= speed[2]= zco[0];
speed[1]= speed[3]= zco[1];
@@ -3804,28 +4871,35 @@ static int load_fluidsimspeedvectors(Render *re, float *vectors, int startvert,
/* result should be that we can free entire database */
static void copy_dbase_object_vectors(Render *re, ListBase *lb)
{
- ObjectRen *obren, *obrenlb;
- VertRen *ver;
- float *vec;
- int a;
-
- for(obren= re->objecttable.first; obren; obren= obren->next) {
- obrenlb= MEM_dupallocN(obren);
- BLI_addtail(lb, obrenlb);
- if(obren->endvert>obren->startvert) {
- vec= obrenlb->vectors= MEM_mallocN(2*sizeof(float)*(obren->endvert- obren->startvert), "vector array");
+ ObjectInstanceRen *obi, *obilb;
+ ObjectRen *obr;
+ VertRen *ver= NULL;
+ float *vec, ho[4], winmat[4][4];
+ int a, totvector;
- /* first vertex */
- a= obren->startvert-1;
- ver= re->vertnodes[a>>8].vert + (a & 255);
+ for(obi= re->instancetable.first; obi; obi= obi->next) {
+ obr= obi->obr;
- for(a=obren->startvert; a<obren->endvert; a++, vec+=2) {
- if((a & 255)==0)
- ver= re->vertnodes[a>>8].vert;
- else
- ver++;
+ obilb= MEM_mallocN(sizeof(ObjectInstanceRen), "ObInstanceVector");
+ memcpy(obilb, obi, sizeof(ObjectInstanceRen));
+ BLI_addtail(lb, obilb);
+
+ obilb->totvector= totvector= obr->totvert;
+
+ if(totvector > 0) {
+ vec= obilb->vectors= MEM_mallocN(2*sizeof(float)*totvector, "vector array");
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulMat4(winmat, obi->mat, re->winmat);
+ else
+ Mat4CpyMat4(winmat, re->winmat);
+
+ for(a=0; a<obr->totvert; a++, vec+=2) {
+ if((a & 255)==0) ver= obr->vertnodes[a>>8].vert;
+ else ver++;
- speedvector_project(NULL, vec, ver);
+ projectvert(ver->co, winmat, ho);
+ speedvector_project(NULL, vec, ver->co, ho);
}
}
}
@@ -3833,25 +4907,27 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb)
static void free_dbase_object_vectors(ListBase *lb)
{
- ObjectRen *obren;
+ ObjectInstanceRen *obi;
- for(obren= lb->first; obren; obren= obren->next)
- if(obren->vectors)
- MEM_freeN(obren->vectors);
+ for(obi= lb->first; obi; obi= obi->next)
+ if(obi->vectors)
+ MEM_freeN(obi->vectors);
BLI_freelistN(lb);
}
void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
{
- ObjectRen *obren, *oldobren;
+ ObjectInstanceRen *obi, *oldobi;
+ StrandSurface *mesh;
ListBase *table;
ListBase oldtable= {NULL, NULL}, newtable= {NULL, NULL};
+ ListBase strandsurface;
int step;
re->i.infostr= "Calculating previous vectors";
re->r.mode |= R_SPEED;
- speedvector_project(re, NULL, NULL); /* initializes projection code */
+ speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */
/* creates entire dbase */
database_fromscene_vectors(re, sce, -1);
@@ -3860,7 +4936,10 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
copy_dbase_object_vectors(re, &oldtable);
/* free dbase and make the future one */
+ strandsurface= re->strandsurface;
+ memset(&re->strandsurface, 0, sizeof(ListBase));
RE_Database_Free(re);
+ re->strandsurface= strandsurface;
if(!re->test_break()) {
/* creates entire dbase */
@@ -3872,7 +4951,10 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
copy_dbase_object_vectors(re, &newtable);
/* free dbase and make the real one */
+ strandsurface= re->strandsurface;
+ memset(&re->strandsurface, 0, sizeof(ListBase));
RE_Database_Free(re);
+ re->strandsurface= strandsurface;
if(!re->test_break())
RE_Database_FromScene(re, sce, 1);
@@ -3885,39 +4967,41 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
else
table= &oldtable;
- oldobren= table->first;
- for(obren= re->objecttable.first; obren && oldobren; obren= obren->next, oldobren= oldobren->next) {
+ oldobi= table->first;
+ for(obi= re->instancetable.first; obi && oldobi; obi= obi->next, oldobi= oldobi->next) {
int ok= 1;
+ obi->totvector= obi->obr->totvert;
+
/* find matching object in old table */
- if(oldobren->ob!=obren->ob || oldobren->par!=obren->par || oldobren->index!=obren->index) {
+ if(oldobi->ob!=obi->ob || oldobi->par!=obi->par || oldobi->index!=obi->index || oldobi->psysindex!=obi->psysindex) {
ok= 0;
- for(oldobren= table->first; oldobren; oldobren= oldobren->next)
- if(oldobren->ob==obren->ob && oldobren->par==obren->par && oldobren->index==obren->index)
+ for(oldobi= table->first; oldobi; oldobi= oldobi->next)
+ if(oldobi->ob==obi->ob && oldobi->par==obi->par && oldobi->index==obi->index && oldobi->psysindex==obi->psysindex)
break;
- if(oldobren==NULL)
- oldobren= table->first;
+ if(oldobi==NULL)
+ oldobi= table->first;
else
ok= 1;
}
if(ok==0) {
- printf("speed table: missing object %s\n", obren->ob->id.name+2);
+ printf("speed table: missing object %s\n", obi->ob->id.name+2);
continue;
}
// NT check for fluidsim special treatment
- if((obren->ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) && (obren->ob->fluidsimSettings->type & OB_FLUIDSIM_DOMAIN)) {
+ if((obi->ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) && (obi->ob->fluidsimSettings->type & OB_FLUIDSIM_DOMAIN)) {
// use preloaded per vertex simulation data , only does calculation for step=1
// NOTE/FIXME - velocities and meshes loaded unnecessarily often during the database_fromscene_vectors calls...
- load_fluidsimspeedvectors(re, oldobren->vectors, obren->startvert, obren->endvert, step, obren->ob);
+ load_fluidsimspeedvectors(re, obi, oldobi->vectors, step);
} else {
/* check if both have same amounts of vertices */
- if(obren->endvert-obren->startvert != oldobren->endvert-oldobren->startvert) {
- printf("Warning: object %s has different amount of vertices on other frame\n", obren->ob->id.name+2);
+ if(obi->totvector!=oldobi->totvector) {
+ printf("Warning: object %s has different amount of vertices or strands on other frame\n", obi->ob->id.name+2);
continue;
}
- calculate_speedvectors(re, oldobren->vectors, obren->startvert, obren->endvert, step);
+ calculate_speedvectors(re, obi, oldobi->vectors, step);
} // not fluidsim
}
}
@@ -3925,17 +5009,26 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
free_dbase_object_vectors(&oldtable);
free_dbase_object_vectors(&newtable);
+
+ for(mesh=re->strandsurface.first; mesh; mesh=mesh->next) {
+ if(mesh->prevco) {
+ MEM_freeN(mesh->prevco);
+ mesh->prevco= NULL;
+ }
+ if(mesh->nextco) {
+ MEM_freeN(mesh->nextco);
+ mesh->nextco= NULL;
+ }
+ }
re->i.infostr= NULL;
re->stats_draw(&re->i);
}
-/* exported call to recalculate hoco for vertices, when winmat changed */
-void RE_DataBase_ApplyWindow(Render *re)
-{
- project_renderdata(re, projectverto, 0, 0);
-}
+/* ------------------------------------------------------------------------- */
+/* Baking */
+/* ------------------------------------------------------------------------- */
/* setup for shaded view or bake, so only lamps and materials are initialized */
/* type:
@@ -3944,14 +5037,13 @@ void RE_DataBase_ApplyWindow(Render *re)
RE_BAKE_NORMALS:for baking, no lamps and only selected objects
RE_BAKE_AO: for baking, no lamps, but all objects
RE_BAKE_TEXTURE:for baking, no lamps, only selected objects
+ RE_BAKE_DISPLACEMENT:for baking, no lamps, only selected objects
*/
-void RE_Database_Baking(Render *re, Scene *scene, int type)
+void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
{
- Base *base;
- Object *ob;
- Scene *sce;
float mat[4][4];
unsigned int lay;
+ int onlyselected, nolamps;
re->scene= scene;
@@ -3959,8 +5051,12 @@ void RE_Database_Baking(Render *re, Scene *scene, int type)
re->r= scene->r;
re->r.mode &= ~R_OSA;
re->flag |= R_GLOB_NOPUNOFLIP;
+ re->excludeob= actob;
+
+ if(type==RE_BAKE_NORMALS && re->r.bake_normal_space==R_BAKE_SPACE_TANGENT)
+ re->flag |= R_NEED_TANGENT;
- if( ELEM3(type, RE_BAKE_LIGHT, RE_BAKE_NORMALS, RE_BAKE_TEXTURE) ) {
+ if(!actob && ELEM4(type, RE_BAKE_LIGHT, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT)) {
re->r.mode &= ~R_SHADOW;
re->r.mode &= ~R_RAYTRACE;
}
@@ -3969,7 +5065,7 @@ void RE_Database_Baking(Render *re, Scene *scene, int type)
if(type!=RE_BAKE_LIGHT)
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
- re->totvlak=re->totvert=re->totlamp=re->tothalo= 0;
+ re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->lights.first= re->lights.last= NULL;
re->lampren.first= re->lampren.last= NULL;
@@ -3989,117 +5085,40 @@ 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) {
+ if((re->r.mode & R_RAYTRACE) && (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);
init_render_materials(re->r.mode, &re->wrld.ambr);
set_node_shader_lamp_loop(shade_material_loop);
-
- for(SETLOOPER(re->scene, base)) {
- ob= base->object;
- /* imat objects has to be done here, since displace can have texture using Object map-input */
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
- /* each object should only be rendered once */
- ob->flag &= ~OB_DONE;
- }
/* MAKE RENDER DATA */
- for(SETLOOPER(re->scene, base)) {
- ob= base->object;
-
- /* if the object has been restricted from rendering in the outliner, ignore it */
- if (ob->restrictflag & OB_RESTRICT_RENDER) continue;
-
- /* OB_DONE means the object itself got duplicated, so was already converted */
- if(ob->flag & OB_DONE);
- else if( (base->lay & lay) || ((base->lay & re->scene->lay)) ) {
-
- /* check for dupli lamps or non selected groups */
- if(ob->transflag & OB_DUPLI) {
- DupliObject *dob;
- ListBase *lb= object_duplilist(sce, ob);
-
- for(dob= lb->first; dob; dob= dob->next) {
- Object *obd= dob->ob;
-
- if(obd->type==OB_LAMP) {
- if( ELEM(type, RE_BAKE_LIGHT, RE_BAKE_ALL) ) {
- Mat4CpyMat4(obd->obmat, dob->mat);
- init_render_object(re, obd, ob, dob->index, 0);
- }
- }
- else if( ELEM(type, RE_BAKE_AO, RE_BAKE_ALL) ) {
- if((base->flag & SELECT)==0) {
- Mat4CpyMat4(obd->obmat, dob->mat);
- init_render_object(re, obd, ob, dob->index, 0);
- }
- }
- }
- free_object_duplilist(lb);
- }
- else {
- if(ob->type==OB_LAMP) {
- if( ELEM(type, RE_BAKE_LIGHT, RE_BAKE_ALL) )
- init_render_object(re, ob, NULL, 0, 0);
- }
- else if(type!=RE_BAKE_LIGHT) {
- if( !ELEM(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE) || (ob->flag & SELECT))
- init_render_object(re, ob, NULL, 0, 0);
- }
- }
- }
- }
+ nolamps= !ELEM(type, RE_BAKE_LIGHT, RE_BAKE_ALL);
+ onlyselected= ELEM3(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT);
+
+ database_init_objects(re, lay, nolamps, onlyselected, actob, 0);
+
set_material_lightgroups(re);
- check_non_flat_quads(re);
- /* don't call set_normalflags(), no flipping */
-
- if(type!=RE_BAKE_LIGHT) {
- if(re->r.mode & R_SHADOW) {
- LampRen *lar;
-
- /* SHADOW BUFFER */
- for(lar=re->lampren.first; lar; lar= lar->next) {
-
- if(re->test_break()) break;
- if(lar->shb) {
- /* if type is irregular, this only sets the perspective matrix and autoclips */
- /* but, that's not supported for bake... */
- makeshadowbuf(re, lar);
- }
- }
- }
- }
-
- if(type!=RE_BAKE_LIGHT) {
- /* raytree */
- if(!re->test_break()) {
- if(re->r.mode & R_RAYTRACE) {
- makeraytree(re);
- }
- }
- }
-}
+ /* SHADOW BUFFER */
+ if(type!=RE_BAKE_LIGHT)
+ if(re->r.mode & R_SHADOW)
+ threaded_makeshadowbufs(re);
-void RE_DataBase_GetView(Render *re, float mat[][4])
-{
- Mat4CpyMat4(mat, re->viewmat);
+ /* raytree */
+ if(!re->test_break())
+ if(re->r.mode & R_RAYTRACE)
+ makeraytree(re);
}
-
-
-
-/* **************************************************************** */
-/* sticky texture coords */
-/* **************************************************************** */
+/* ------------------------------------------------------------------------- */
+/* Sticky texture coords */
+/* ------------------------------------------------------------------------- */
void RE_make_sticky(void)
{
@@ -4165,172 +5184,3 @@ void RE_make_sticky(void)
}
}
-
-
-/* **************************************************************** */
-/* Displacement mapping */
-/* **************************************************************** */
-static short test_for_displace(Render *re, Object *ob)
-{
- /* return 1 when this object uses displacement textures. */
- Material *ma;
- int i;
-
- for (i=1; i<=ob->totcol; i++) {
- ma=give_render_material(re, ob, i);
- /* ma->mapto is ORed total of all mapto channels */
- if(ma && (ma->mapto & MAP_DISPLACE)) return 1;
- }
- return 0;
-}
-
-static void displace_render_vert(Render *re, ShadeInput *shi, VertRen *vr, int vindex, float *scale)
-{
- MTFace *tface;
- short texco= shi->mat->texco;
- float sample=0;
- char *name;
- int i;
-
- /* shi->co is current render coord, just make sure at least some vector is here */
- VECCOPY(shi->co, vr->co);
- /* vertex normal is used for textures type 'col' and 'var' */
- VECCOPY(shi->vn, vr->n);
-
- if (texco & TEXCO_UV) {
- shi->totuv= 0;
-
- for (i=0; (tface=RE_vlakren_get_tface(re, shi->vlr, i, &name, 0)); i++) {
- ShadeInputUV *suv= &shi->uv[i];
-
- /* shi.uv needs scale correction from tface uv */
- suv->uv[0]= 2*tface->uv[vindex][0]-1.0f;
- suv->uv[1]= 2*tface->uv[vindex][1]-1.0f;
- suv->uv[2]= 0.0f;
- suv->name= name;
- shi->totuv++;
- }
- }
-
- /* set all rendercoords, 'texco' is an ORed value for all textures needed */
- if ((texco & TEXCO_ORCO) && (vr->orco)) {
- VECCOPY(shi->lo, vr->orco);
- }
- if (texco & TEXCO_STICKY) {
- float *sticky= RE_vertren_get_sticky(re, vr, 0);
- if(sticky) {
- shi->sticky[0]= sticky[0];
- shi->sticky[1]= sticky[1];
- shi->sticky[2]= 0.0f;
- }
- }
- if (texco & TEXCO_GLOB) {
- VECCOPY(shi->gl, shi->co);
- MTC_Mat4MulVecfl(re->viewinv, shi->gl);
- }
- if (texco & TEXCO_NORM) {
- VECCOPY(shi->orn, shi->vn);
- }
- if(texco & TEXCO_REFL) {
- /* not (yet?) */
- }
-
- shi->displace[0]= shi->displace[1]= shi->displace[2]= 0.0;
-
- do_material_tex(shi);
-
- //printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2],
- //vr->co[0], vr->co[1], vr->co[2]);
-
- /* 0.5 could become button once? */
- vr->co[0] += shi->displace[0] * scale[0] ;
- vr->co[1] += shi->displace[1] * scale[1] ;
- vr->co[2] += shi->displace[2] * scale[2] ;
-
- //printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]);
-
- /* we just don't do this vertex again, bad luck for other face using same vertex with
- different material... */
- vr->flag |= 1;
-
- /* Pass sample back so displace_face can decide which way to split the quad */
- sample = shi->displace[0]*shi->displace[0];
- sample += shi->displace[1]*shi->displace[1];
- sample += shi->displace[2]*shi->displace[2];
-
- vr->accum=sample;
- /* Should be sqrt(sample), but I'm only looking for "bigger". Save the cycles. */
- return;
-}
-
-static void displace_render_face(Render *re, VlakRen *vlr, float *scale)
-{
- ShadeInput shi;
-
- /* set up shadeinput struct for multitex() */
- shi.osatex= 0; /* signal not to use dx[] and dy[] texture AA vectors */
- shi.vlr= vlr; /* current render face */
- shi.mat= vlr->mat; /* current input material */
-
- /* Displace the verts, flag is set when done */
- if (!vlr->v1->flag)
- displace_render_vert(re, &shi, vlr->v1,0, scale);
-
- if (!vlr->v2->flag)
- displace_render_vert(re, &shi, vlr->v2, 1, scale);
-
- if (!vlr->v3->flag)
- displace_render_vert(re, &shi, vlr->v3, 2, scale);
-
- if (vlr->v4) {
- if (!vlr->v4->flag)
- displace_render_vert(re, &shi, vlr->v4, 3, scale);
-
- /* closest in displace value. This will help smooth edges. */
- if ( fabs(vlr->v1->accum - vlr->v3->accum) > fabs(vlr->v2->accum - vlr->v4->accum))
- vlr->flag |= R_DIVIDE_24;
- else vlr->flag &= ~R_DIVIDE_24; // E: typo?, was missing '='
- }
-
- /* Recalculate the face normal - if flipped before, flip now */
- if(vlr->v4) {
- CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
- }
- else {
- CalcNormFloat(vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
- }
-}
-
-
-static void do_displacement(Render *re, Object *ob, int startface, int numface, int startvert, int numvert )
-{
- VertRen *vr;
- VlakRen *vlr;
-// float min[3]={1e30, 1e30, 1e30}, max[3]={-1e30, -1e30, -1e30};
- float scale[3]={1.0f, 1.0f, 1.0f}, temp[3];//, xn
- int i; //, texflag=0;
- Object *obt;
-
- /* Object Size with parenting */
- obt=ob;
- while(obt){
- VecAddf(temp, obt->size, obt->dsize);
- scale[0]*=temp[0]; scale[1]*=temp[1]; scale[2]*=temp[2];
- obt=obt->parent;
- }
-
- /* Clear all flags */
- for(i=startvert; i<startvert+numvert; i++){
- vr= RE_findOrAddVert(re, i);
- vr->flag= 0;
- }
-
- for(i=startface; i<startface+numface; i++){
- vlr=RE_findOrAddVlak(re, i);
- displace_render_face(re, vlr, scale);
- }
-
- /* Recalc vertex normals */
- calc_vertexnormals(re, startvert, startface, 0);
-}
-
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index ebb444833e8..81d5c8ea9ed 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -148,16 +148,15 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->totvlak= re->totvlak;
envre->totvert= re->totvert;
envre->tothalo= re->tothalo;
+ envre->totstrand= re->totstrand;
envre->totlamp= re->totlamp;
envre->lights= re->lights;
- envre->vertnodeslen= re->vertnodeslen;
- envre->vertnodes= re->vertnodes;
- envre->blohalen= re->blohalen;
- envre->bloha= re->bloha;
- envre->vlaknodeslen= re->vlaknodeslen;
- envre->vlaknodes= re->vlaknodes;
+ envre->objecttable= re->objecttable;
envre->customdata_names= re->customdata_names;
envre->raytree= re->raytree;
+ envre->totinstance= re->totinstance;
+ envre->instancetable= re->instancetable;
+ envre->objectinstance= re->objectinstance;
return envre;
}
@@ -168,16 +167,15 @@ static void envmap_free_render_copy(Render *envre)
envre->totvlak= 0;
envre->totvert= 0;
envre->tothalo= 0;
+ envre->totstrand= 0;
envre->totlamp= 0;
+ envre->totinstance= 0;
envre->lights.first= envre->lights.last= NULL;
- envre->vertnodeslen= 0;
- envre->vertnodes= NULL;
- envre->blohalen= 0;
- envre->bloha= NULL;
- envre->vlaknodeslen= 0;
- envre->vlaknodes= NULL;
+ envre->objecttable.first= envre->objecttable.last= NULL;
envre->customdata_names.first= envre->customdata_names.last= NULL;
envre->raytree= NULL;
+ envre->instancetable.first= envre->instancetable.last= NULL;
+ envre->objectinstance= NULL;
RE_FreeRender(envre);
}
@@ -219,11 +217,11 @@ static void envmap_transmatrix(float mat[][4], int part)
static void env_rotate_scene(Render *re, float mat[][4], int mode)
{
GroupObject *go;
- VlakRen *vlr = NULL;
- VertRen *ver = NULL;
+ ObjectRen *obr;
+ ObjectInstanceRen *obi;
LampRen *lar = NULL;
HaloRen *har = NULL;
- float xn, yn, zn, imat[3][3], pmat[4][4], smat[4][4], tmat[4][4], cmat[3][3];
+ float imat[3][3], pmat[4][4], smat[4][4], tmat[4][4], cmat[3][3];
int a;
if(mode==0) {
@@ -234,46 +232,36 @@ static void env_rotate_scene(Render *re, float mat[][4], int mode)
MTC_Mat4CpyMat4(tmat, mat);
MTC_Mat3CpyMat4(imat, mat);
}
-
- for(a=0; a<re->totvert; a++) {
- if((a & 255)==0) ver= RE_findOrAddVert(re, a);
- else ver++;
-
- MTC_Mat4MulVecfl(tmat, ver->co);
-
- xn= ver->n[0];
- yn= ver->n[1];
- zn= ver->n[2];
- /* no transpose ! */
- ver->n[0]= imat[0][0]*xn+imat[1][0]*yn+imat[2][0]*zn;
- ver->n[1]= imat[0][1]*xn+imat[1][1]*yn+imat[2][1]*zn;
- ver->n[2]= imat[0][2]*xn+imat[1][2]*yn+imat[2][2]*zn;
- Normalize(ver->n);
+
+ for(obi=re->instancetable.first; obi; obi=obi->next) {
+ /* append or set matrix depending on dupli */
+ if(obi->flag & R_DUPLI_TRANSFORMED)
+ Mat4MulMat4(obi->mat, tmat, obi->mat);
+ else if(mode==1)
+ Mat4CpyMat4(obi->mat, tmat);
+ else
+ Mat4One(obi->mat);
+
+ Mat3CpyMat4(cmat, obi->mat);
+ Mat3Inv(obi->imat, cmat);
+
+ /* indicate the renderer has to use transform matrices */
+ if(mode==0)
+ obi->flag &= ~R_ENV_TRANSFORMED;
+ else
+ obi->flag |= R_ENV_TRANSFORMED;
}
- for(a=0; a<re->tothalo; a++) {
- if((a & 255)==0) har= re->bloha[a>>8];
- else har++;
-
- MTC_Mat4MulVecfl(tmat, har->co);
- }
-
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak;
- else vlr++;
+
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->tothalo; a++) {
+ if((a & 255)==0) har= obr->bloha[a>>8];
+ else har++;
- xn= vlr->n[0];
- yn= vlr->n[1];
- zn= vlr->n[2];
- /* no transpose ! */
- vlr->n[0]= imat[0][0]*xn+imat[1][0]*yn+imat[2][0]*zn;
- vlr->n[1]= imat[0][1]*xn+imat[1][1]*yn+imat[2][1]*zn;
- vlr->n[2]= imat[0][2]*xn+imat[1][2]*yn+imat[2][2]*zn;
- Normalize(vlr->n);
+ MTC_Mat4MulVecfl(tmat, har->co);
+ }
}
- set_normalflags(re);
-
for(go=re->lights.first; go; go= go->next) {
lar= go->lampren;
@@ -308,6 +296,7 @@ static void env_rotate_scene(Render *re, float mat[][4], int mode)
static void env_layerflags(Render *re, unsigned int notlay)
{
+ ObjectRen *obr;
VlakRen *vlr = NULL;
int a;
@@ -321,23 +310,48 @@ static void env_layerflags(Render *re, unsigned int notlay)
notlay= ~notlay;
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak;
- else vlr++;
- if((vlr->lay & notlay)==0)
- vlr->flag &= ~R_VISIBLE;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ if((obr->lay & notlay)==0) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
+
+ vlr->flag |= R_HIDDEN;
+ }
+ }
}
}
static void env_hideobject(Render *re, Object *ob)
{
+ ObjectRen *obr;
+ VlakRen *vlr = NULL;
+ int a;
+
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
+
+ if(obr->ob == ob)
+ vlr->flag |= R_HIDDEN;
+ }
+ }
+}
+
+static void env_showobjects(Render *re)
+{
+ ObjectRen *obr;
VlakRen *vlr = NULL;
int a;
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak;
- else vlr++;
- if(vlr->ob == ob) vlr->flag &= ~R_VISIBLE;
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
+
+ vlr->flag &= ~R_HIDDEN;
+ }
}
}
@@ -403,7 +417,7 @@ static void render_envmap(Render *re, EnvMap *env)
env_rotate_scene(envre, tmat, 1);
init_render_world(envre);
- project_renderdata(envre, projectverto, 0, 0);
+ project_renderdata(envre, projectverto, 0, 0, 1);
env_layerflags(envre, env->notlay);
env_hideobject(envre, env->object);
env_set_imats(envre);
@@ -413,6 +427,7 @@ static void render_envmap(Render *re, EnvMap *env)
}
/* rotate back */
+ env_showobjects(envre);
env_rotate_scene(envre, tmat, 0);
if(re->test_break()==0) {
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index 82abab62637..7dc205e2794 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -93,10 +93,10 @@ static void ibuf_get_color(float *col, struct ImBuf *ibuf, int x, int y)
else {
char *rect = (char *)( ibuf->rect+ ofs);
- col[0] = ((float)rect[0])/255.0f;
- col[1] = ((float)rect[1])/255.0f;
- col[2] = ((float)rect[2])/255.0f;
- col[3] = ((float)rect[3])/255.0f;
+ col[0] = ((float)rect[0])*(1.0f/255.0f);
+ col[1] = ((float)rect[1])*(1.0f/255.0f);
+ col[2] = ((float)rect[2])*(1.0f/255.0f);
+ col[3] = ((float)rect[3])*(1.0f/255.0f);
}
}
@@ -244,6 +244,14 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre
if(tex->flag & TEX_NEGALPHA) texres->ta= 1.0f-texres->ta;
+ /* de-premul, this is being premulled in shade_input_do_shade() */
+ if(texres->ta!=1.0f && texres->ta!=0.0f) {
+ fx= 1.0f/texres->ta;
+ texres->tr*= fx;
+ texres->tg*= fx;
+ texres->tb*= fx;
+ }
+
return retval;
}
@@ -691,10 +699,22 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, f
maxy= MAX3(dxt[1],dyt[1],dxt[1]+dyt[1] );
/* tex_sharper has been removed */
- minx= tex->filtersize*(maxx-minx)/2.0f;
- miny= tex->filtersize*(maxy-miny)/2.0f;
+ minx= (maxx-minx)/2.0f;
+ miny= (maxy-miny)/2.0f;
- if(tex->filtersize!=1.0f) {
+ if(tex->imaflag & TEX_FILTER_MIN) {
+ /* make sure the filtersize is minimal in pixels (normal, ref map can have miniature pixel dx/dy) */
+ float addval= (0.5f * tex->filtersize) / (float) MIN2(ibuf->x, ibuf->y);
+
+ if(addval > minx)
+ minx= addval;
+ if(addval > miny)
+ miny= addval;
+ }
+ else if(tex->filtersize!=1.0f) {
+ minx*= tex->filtersize;
+ miny*= tex->filtersize;
+
dxt[0]*= tex->filtersize;
dxt[1]*= tex->filtersize;
dyt[0]*= tex->filtersize;
@@ -968,5 +988,13 @@ 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/initrender.c b/source/blender/render/intern/source/initrender.c
index 83c0be6283b..3ea8c6edffa 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -543,7 +543,7 @@ void RE_SetCamera(Render *re, Object *camera)
re->viewdx= pixsize;
re->viewdy= re->ycor*pixsize;
-
+
if(re->r.mode & R_ORTHO)
RE_SetOrtho(re, &viewplane, clipsta, clipend);
else
@@ -557,6 +557,13 @@ void RE_SetPixelSize(Render *re, float pixsize)
re->viewdy= re->ycor*pixsize;
}
+void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4])
+{
+ re->r.cfra= frame;
+ RE_SetCamera(re, camera);
+ Mat4CpyMat4(mat, re->winmat);
+}
+
/* ~~~~~~~~~~~~~~~~ part (tile) calculus ~~~~~~~~~~~~~~~~~~~~~~ */
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
new file mode 100644
index 00000000000..68553a5605a
--- /dev/null
+++ b/source/blender/render/intern/source/occlusion.c
@@ -0,0 +1,1648 @@
+/*
+ * $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) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Brecht Van Lommel.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_material_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_memarena.h"
+#include "BLI_threads.h"
+
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+
+#include "RE_shader_ext.h"
+
+/* local includes */
+#include "occlusion.h"
+#include "render_types.h"
+#include "rendercore.h"
+#include "renderdatabase.h"
+#include "pixelshading.h"
+#include "shading.h"
+#include "zbuf.h"
+
+/* ------------------------- Declarations --------------------------- */
+
+#define INVALID_INDEX ((int)(~0))
+#define INVPI 0.31830988618379069f
+#define TOTCHILD 8
+#define CACHE_STEP 3
+
+typedef struct OcclusionCacheSample {
+ float co[3], n[3], col[3], intensity, dist2;
+ int x, y, filled;
+} OcclusionCacheSample;
+
+typedef struct OcclusionCache {
+ OcclusionCacheSample *sample;
+ int x, y, w, h, step;
+} OcclusionCache;
+
+typedef struct OccFace {
+ int obi;
+ int facenr;
+} OccFace;
+
+typedef struct OccNode {
+ float co[3], area;
+ float sh[9], dco;
+ float occlusion;
+ int childflag;
+ union {
+ //OccFace face;
+ int face;
+ struct OccNode *node;
+ } child[TOTCHILD];
+} OccNode;
+
+typedef struct OcclusionTree {
+ MemArena *arena;
+
+ float (*co)[3]; /* temporary during build */
+
+ OccFace *face; /* instance and face indices */
+ float *occlusion; /* occlusion for faces */
+
+ OccNode *root;
+
+ OccNode **stack[BLENDER_MAX_THREADS];
+ int maxdepth;
+
+ int totface;
+
+ float error;
+ float distfac;
+
+ OcclusionCache *cache;
+} OcclusionTree;
+
+/* ------------------------- Shading --------------------------- */
+
+extern Render R; // meh
+
+#if 0
+static void occ_shade(ShadeSample *ssamp, ObjectInstanceRen *obi, VlakRen *vlr, float *rad)
+{
+ ShadeInput *shi= ssamp->shi;
+ ShadeResult *shr= ssamp->shr;
+ float l, u, v, *v1, *v2, *v3;
+
+ /* init */
+ if(vlr->v4) {
+ shi->u= u= 0.5f;
+ shi->v= v= 0.5f;
+ }
+ else {
+ shi->u= u= 1.0f/3.0f;
+ shi->v= v= 1.0f/3.0f;
+ }
+
+ /* setup render coordinates */
+ v1= vlr->v1->co;
+ v2= vlr->v2->co;
+ v3= vlr->v3->co;
+
+ /* renderco */
+ l= 1.0f-u-v;
+
+ shi->co[0]= l*v3[0]+u*v1[0]+v*v2[0];
+ shi->co[1]= l*v3[1]+u*v1[1]+v*v2[1];
+ shi->co[2]= l*v3[2]+u*v1[2]+v*v2[2];
+
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
+
+ /* set up view vector */
+ VECCOPY(shi->view, shi->co);
+ Normalize(shi->view);
+
+ /* cache for shadow */
+ shi->samplenr++;
+
+ shi->xs= 0; // TODO
+ shi->ys= 0;
+
+ shade_input_set_normals(shi);
+
+ /* no normal flip */
+ if(shi->flippednor)
+ shade_input_flip_normals(shi);
+
+ /* not a pretty solution, but fixes common cases */
+ if(shi->obr->ob && shi->obr->ob->transflag & OB_NEG_SCALE) {
+ VecMulf(shi->vn, -1.0f);
+ VecMulf(shi->vno, -1.0f);
+ }
+
+ /* init material vars */
+ // note, keep this synced with render_types.h
+ memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
+ shi->har= shi->mat->har;
+
+ /* render */
+ shade_input_set_shade_texco(shi);
+ shade_material_loop(shi, shr); /* todo: nodes */
+
+ VECCOPY(rad, shr->combined);
+}
+
+static void occ_build_shade(Render *re, OcclusionTree *tree)
+{
+ ShadeSample ssamp;
+ ObjectInstanceRen *obi;
+ VlakRen *vlr;
+ int a;
+
+ R= *re;
+
+ /* setup shade sample with correct passes */
+ memset(&ssamp, 0, sizeof(ShadeSample));
+ ssamp.shi[0].lay= re->scene->lay;
+ ssamp.shi[0].passflag= SCE_PASS_DIFFUSE|SCE_PASS_RGBA;
+ ssamp.shi[0].combinedflag= ~(SCE_PASS_SPEC);
+ ssamp.tot= 1;
+
+ for(a=0; a<tree->totface; a++) {
+ obi= &R.objectinstance[tree->face[a].obi];
+ vlr= RE_findOrAddVlak(obi->obr, tree->face[a].vlr);
+
+ occ_shade(&ssamp, obi, vlr, tree->rad[a]);
+ }
+}
+#endif
+
+/* ------------------------- Spherical Harmonics --------------------------- */
+
+/* Use 2nd order SH => 9 coefficients, stored in this order:
+ 0 = (0,0),
+ 1 = (1,-1), 2 = (1,0), 3 = (1,1),
+ 4 = (2,-2), 5 = (2,-1), 6 = (2,0), 7 = (2,1), 8 = (2,2) */
+
+static void sh_copy(float *shresult, float *sh)
+{
+ memcpy(shresult, sh, sizeof(float)*9);
+}
+
+static void sh_mul(float *sh, float f)
+{
+ int i;
+
+ for(i=0; i<9; i++)
+ sh[i] *= f;
+}
+
+static void sh_add(float *shresult, float *sh1, float *sh2)
+{
+ int i;
+
+ for(i=0; i<9; i++)
+ shresult[i]= sh1[i] + sh2[i];
+}
+
+static void sh_from_disc(float *n, float area, float *shresult)
+{
+ /* See formula (3) in:
+ "An Efficient Representation for Irradiance Environment Maps" */
+ float sh[9], x, y, z;
+
+ x= n[0];
+ y= n[1];
+ z= n[2];
+
+ sh[0]= 0.282095f;
+
+ sh[1]= 0.488603f*y;
+ sh[2]= 0.488603f*z;
+ sh[3]= 0.488603f*x;
+
+ sh[4]= 1.092548f*x*y;
+ sh[5]= 1.092548f*y*z;
+ sh[6]= 0.315392f*(3.0f*z*z - 1.0f);
+ sh[7]= 1.092548f*x*z;
+ sh[8]= 0.546274f*(x*x - y*y);
+
+ sh_mul(sh, area);
+ sh_copy(shresult, sh);
+}
+
+static float sh_eval(float *sh, float *v)
+{
+ /* See formula (13) in:
+ "An Efficient Representation for Irradiance Environment Maps" */
+ static const float c1 = 0.429043f, c2 = 0.511664f, c3 = 0.743125f;
+ static const float c4 = 0.886227f, c5 = 0.247708f;
+ float x, y, z, sum;
+
+ x= v[0];
+ y= v[1];
+ z= v[2];
+
+ sum= c1*sh[8]*(x*x - y*y);
+ sum += c3*sh[6]*z*z;
+ sum += c4*sh[0];
+ sum += -c5*sh[6];
+ sum += 2.0f*c1*(sh[4]*x*y + sh[7]*x*z + sh[5]*y*z);
+ sum += 2.0f*c2*(sh[3]*x + sh[1]*y + sh[2]*z);
+
+ return sum;
+}
+
+/* ------------------------------ Building --------------------------------- */
+
+static void occ_face(const OccFace *face, float *co, float *normal, float *area)
+{
+ ObjectInstanceRen *obi;
+ VlakRen *vlr;
+ float v1[3], v2[3], v3[3], v4[3];
+
+ obi= &R.objectinstance[face->obi];
+ vlr= RE_findOrAddVlak(obi->obr, face->facenr);
+
+ if(co) {
+ if(vlr->v4)
+ VecLerpf(co, vlr->v1->co, vlr->v3->co, 0.5f);
+ else
+ CalcCent3f(co, vlr->v1->co, vlr->v2->co, vlr->v3->co);
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulVecfl(obi->mat, co);
+ }
+
+ if(normal) {
+ normal[0]= -vlr->n[0];
+ normal[1]= -vlr->n[1];
+ normal[2]= -vlr->n[2];
+
+ if(obi->flag & R_TRANSFORMED) {
+ float xn, yn, zn, (*imat)[3]= obi->imat;
+
+ xn= normal[0];
+ yn= normal[1];
+ zn= normal[2];
+
+ normal[0]= imat[0][0]*xn + imat[0][1]*yn + imat[0][2]*zn;
+ normal[1]= imat[1][0]*xn + imat[1][1]*yn + imat[1][2]*zn;
+ normal[2]= imat[2][0]*xn + imat[2][1]*yn + imat[2][2]*zn;
+ }
+ }
+
+ if(area) {
+ VECCOPY(v1, vlr->v1->co);
+ VECCOPY(v2, vlr->v2->co);
+ VECCOPY(v3, vlr->v3->co);
+ if(vlr->v4) VECCOPY(v4, vlr->v4->co);
+
+ if(obi->flag & R_TRANSFORMED) {
+ Mat4MulVecfl(obi->mat, v1);
+ Mat4MulVecfl(obi->mat, v2);
+ Mat4MulVecfl(obi->mat, v3);
+ if(vlr->v4) Mat4MulVecfl(obi->mat, v4);
+ }
+
+ /* todo: correct area for instances */
+ if(vlr->v4)
+ *area= AreaQ3Dfl(v1, v2, v3, v4);
+ else
+ *area= AreaT3Dfl(v1, v2, v3);
+ }
+}
+
+static void occ_sum_occlusion(OcclusionTree *tree, OccNode *node)
+{
+ OccNode *child;
+ float occ, area, totarea;
+ int a, b;
+
+ occ= 0.0f;
+ totarea= 0.0f;
+
+ for(b=0; b<TOTCHILD; b++) {
+ if(node->childflag & (1<<b)) {
+ a= node->child[b].face;
+ occ_face(&tree->face[a], 0, 0, &area);
+ occ += area*tree->occlusion[a];
+ totarea += area;
+ }
+ else if(node->child[b].node) {
+ child= node->child[b].node;
+ occ_sum_occlusion(tree, child);
+
+ occ += child->area*child->occlusion;
+ totarea += child->area;
+ }
+ }
+
+ if(totarea != 0.0f)
+ occ /= totarea;
+
+ node->occlusion= occ;
+}
+
+static int occ_find_bbox_axis(OcclusionTree *tree, int begin, int end, float *min, float *max)
+{
+ float len, maxlen= -1.0f;
+ int a, axis = 0;
+
+ INIT_MINMAX(min, max);
+
+ for(a=begin; a<end; a++)
+ DO_MINMAX(tree->co[a], min, max)
+
+ for(a=0; a<3; a++) {
+ len= max[a] - min[a];
+
+ if(len > maxlen) {
+ maxlen= len;
+ axis= a;
+ }
+ }
+
+ return axis;
+}
+
+void occ_node_from_face(OccFace *face, OccNode *node)
+{
+ float n[3];
+
+ occ_face(face, node->co, n, &node->area);
+ node->dco= 0.0f;
+ sh_from_disc(n, node->area, node->sh);
+}
+
+static void occ_build_dco(OcclusionTree *tree, OccNode *node, float *co, float *dco)
+{
+ OccNode *child;
+ float dist, d[3], nco[3];
+ int b;
+
+ for(b=0; b<TOTCHILD; b++) {
+ if(node->childflag & (1<<b)) {
+ occ_face(tree->face+node->child[b].face, nco, 0, 0);
+ }
+ else if(node->child[b].node) {
+ child= node->child[b].node;
+ occ_build_dco(tree, child, co, dco);
+ VECCOPY(nco, child->co);
+ }
+
+ VECSUB(d, nco, co);
+ dist= INPR(d, d);
+ if(dist > *dco)
+ *dco= dist;
+ }
+}
+
+static void occ_build_split(OcclusionTree *tree, int begin, int end, int *split)
+{
+ float min[3], max[3], mid;
+ int axis, a, enda;
+
+ /* split in middle of boundbox. this seems faster than median split
+ * on complex scenes, possibly since it avoids two distant faces to
+ * be in the same node better? */
+ axis= occ_find_bbox_axis(tree, begin, end, min, max);
+ mid= 0.5f*(min[axis]+max[axis]);
+
+ a= begin;
+ enda= end;
+ while(a<enda) {
+ if(tree->co[a][axis] > mid) {
+ enda--;
+ SWAP(OccFace, tree->face[a], tree->face[enda]);
+ SWAP(float, tree->co[a][0], tree->co[enda][0]);
+ SWAP(float, tree->co[a][1], tree->co[enda][1]);
+ SWAP(float, tree->co[a][2], tree->co[enda][2]);
+ }
+ else
+ a++;
+ }
+
+ *split= enda;
+}
+
+static void occ_build_8_split(OcclusionTree *tree, int begin, int end, int *offset, int *count)
+{
+ /* split faces into eight groups */
+ int b, splitx, splity[2], splitz[4];
+
+ occ_build_split(tree, begin, end, &splitx);
+
+ /* force split if none found, to deal with degenerate geometry */
+ if(splitx == begin || splitx == end)
+ splitx= (begin+end)/2;
+
+ occ_build_split(tree, begin, splitx, &splity[0]);
+ occ_build_split(tree, splitx, end, &splity[1]);
+
+ occ_build_split(tree, begin, splity[0], &splitz[0]);
+ occ_build_split(tree, splity[0], splitx, &splitz[1]);
+ occ_build_split(tree, splitx, splity[1], &splitz[2]);
+ occ_build_split(tree, splity[1], end, &splitz[3]);
+
+ offset[0]= begin;
+ offset[1]= splitz[0];
+ offset[2]= splity[0];
+ offset[3]= splitz[1];
+ offset[4]= splitx;
+ offset[5]= splitz[2];
+ offset[6]= splity[1];
+ offset[7]= splitz[3];
+
+ for(b=0; b<7; b++)
+ count[b]= offset[b+1] - offset[b];
+ count[7]= end - offset[7];
+}
+
+static OccNode *occ_build_recursive(OcclusionTree *tree, int begin, int end, int depth)
+{
+ OccNode *node, *child, tmpnode;
+ OccFace *face;
+ int a, b, offset[TOTCHILD], count[TOTCHILD];
+
+ /* keep track of maximum depth for stack */
+ if(depth > tree->maxdepth)
+ tree->maxdepth= depth;
+
+ /* add a new node */
+ node= BLI_memarena_alloc(tree->arena, sizeof(OccNode));
+ node->occlusion= 1.0f;
+
+ /* leaf node with only children */
+ if(end - begin <= TOTCHILD) {
+ for(a=begin, b=0; a<end; a++, b++) {
+ face= &tree->face[a];
+ node->child[b].face= a;
+ node->childflag |= (1<<b);
+ }
+ }
+ else {
+ /* order faces */
+ occ_build_8_split(tree, begin, end, offset, count);
+
+ for(b=0; b<TOTCHILD; b++) {
+ if(count[b] == 0) {
+ node->child[b].node= NULL;
+ }
+ else if(count[b] == 1) {
+ face= &tree->face[offset[b]];
+ node->child[b].face= offset[b];
+ node->childflag |= (1<<b);
+ }
+ else {
+ child= occ_build_recursive(tree, offset[b], offset[b]+count[b], depth+1);
+ node->child[b].node= child;
+ }
+ }
+ }
+
+ /* combine area, position and sh */
+ for(b=0; b<TOTCHILD; b++) {
+ if(node->childflag & (1<<b)) {
+ child= &tmpnode;
+ occ_node_from_face(tree->face+node->child[b].face, &tmpnode);
+ }
+ else {
+ child= node->child[b].node;
+ }
+
+ if(child) {
+ node->area += child->area;
+ sh_add(node->sh, node->sh, child->sh);
+ VECADDFAC(node->co, node->co, child->co, child->area);
+ }
+ }
+
+ if(node->area != 0.0f)
+ VecMulf(node->co, 1.0f/node->area);
+
+ /* compute maximum distance from center */
+ node->dco= 0.0f;
+ occ_build_dco(tree, node, node->co, &node->dco);
+
+ return node;
+}
+
+static void occ_build_sh_normalize(OccNode *node)
+{
+ /* normalize spherical harmonics to not include area, so
+ * we can clamp the dot product and then mutliply by area */
+ int b;
+
+ if(node->area != 0.0f)
+ sh_mul(node->sh, 1.0f/node->area);
+
+ for(b=0; b<TOTCHILD; b++) {
+ if(node->childflag & (1<<b));
+ else if(node->child[b].node)
+ occ_build_sh_normalize(node->child[b].node);
+ }
+}
+
+static OcclusionTree *occ_tree_build(Render *re)
+{
+ OcclusionTree *tree;
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
+ VlakRen *vlr= NULL;
+ int a, b, c, totface;
+
+ /* count */
+ totface= 0;
+ for(obi=re->instancetable.first; obi; obi=obi->next) {
+ obr= obi->obr;
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
+
+ if(vlr->mat->mode & MA_TRACEBLE)
+ totface++;
+ }
+ }
+
+ if(totface == 0)
+ return NULL;
+
+ tree= MEM_callocN(sizeof(OcclusionTree), "OcclusionTree");
+ tree->totface= totface;
+
+ /* parameters */
+ tree->error= re->wrld.ao_approx_error;
+ tree->distfac= (re->wrld.aomode & WO_AODIST)? re->wrld.aodistfac: 0.0f;
+
+ /* allocation */
+ tree->arena= BLI_memarena_new(0x8000 * sizeof(OccNode));
+ BLI_memarena_use_calloc(tree->arena);
+
+ if(re->wrld.aomode & WO_AOCACHE)
+ tree->cache= MEM_callocN(sizeof(OcclusionCache)*BLENDER_MAX_THREADS, "OcclusionCache");
+
+ tree->face= MEM_callocN(sizeof(OccFace)*totface, "OcclusionFace");
+ tree->co= MEM_callocN(sizeof(float)*3*totface, "OcclusionCo");
+ tree->occlusion= MEM_callocN(sizeof(float)*totface, "OcclusionOcclusion");
+
+ /* make array of face pointers */
+ for(b=0, c=0, obi=re->instancetable.first; obi; obi=obi->next, c++) {
+ obr= obi->obr;
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
+
+ if(vlr->mat->mode & MA_TRACEBLE) {
+ tree->face[b].obi= c;
+ tree->face[b].facenr= a;
+ tree->occlusion[b]= 1.0f;
+ occ_face(&tree->face[b], tree->co[b], NULL, NULL);
+ b++;
+ }
+ }
+ }
+
+ /* recurse */
+ tree->root= occ_build_recursive(tree, 0, totface, 1);
+
+#if 0
+ if(tree->doindirect) {
+ occ_build_shade(re, tree);
+ occ_sum_occlusion(tree, tree->root);
+ }
+#endif
+
+ MEM_freeN(tree->co);
+ tree->co= NULL;
+
+ occ_build_sh_normalize(tree->root);
+
+ for(a=0; a<BLENDER_MAX_THREADS; a++)
+ tree->stack[a]= MEM_callocN(sizeof(OccNode)*TOTCHILD*(tree->maxdepth+1), "OccStack");
+
+ return tree;
+}
+
+static void occ_free_tree(OcclusionTree *tree)
+{
+ int a;
+
+ if(tree) {
+ if(tree->arena) BLI_memarena_free(tree->arena);
+ for(a=0; a<BLENDER_MAX_THREADS; a++)
+ if(tree->stack[a])
+ MEM_freeN(tree->stack[a]);
+ if(tree->occlusion) MEM_freeN(tree->occlusion);
+ if(tree->face) MEM_freeN(tree->face);
+ if(tree->cache) MEM_freeN(tree->cache);
+ MEM_freeN(tree);
+ }
+}
+
+/* ------------------------- Traversal --------------------------- */
+
+static float occ_solid_angle(OccNode *node, float *v, float d2, float *receivenormal)
+{
+ float dotreceive, dotemit, invd2 = 1.0f/sqrtf(d2);
+ float ev[3];
+
+ ev[0]= -v[0]*invd2;
+ ev[1]= -v[1]*invd2;
+ ev[2]= -v[2]*invd2;
+ dotemit= sh_eval(node->sh, ev);
+ dotreceive= INPR(receivenormal, v)*invd2;
+
+ CLAMP(dotemit, 0.0f, 1.0f);
+ CLAMP(dotreceive, 0.0f, 1.0f);
+
+ return ((node->area*dotemit*dotreceive)/(d2 + node->area*INVPI))*INVPI;
+}
+
+static void VecAddDir(float *result, float *v1, float *v2, float fac)
+{
+ result[0]= v1[0] + fac*(v2[0] - v1[0]);
+ result[1]= v1[1] + fac*(v2[1] - v1[1]);
+ result[2]= v1[2] + fac*(v2[2] - v1[2]);
+}
+
+static int occ_visible_quad(float *p, float *n, float *v0, float *v1, float *v2, float *q0, float *q1, float *q2, float *q3)
+{
+ static const float epsilon = 1e-6f;
+ float c, sd[3];
+
+ c= INPR(n, p);
+
+ /* signed distances from the vertices to the plane. */
+ sd[0]= INPR(n, v0) - c;
+ sd[1]= INPR(n, v1) - c;
+ sd[2]= INPR(n, v2) - c;
+
+ if(fabs(sd[0]) < epsilon) sd[0] = 0.0f;
+ if(fabs(sd[1]) < epsilon) sd[1] = 0.0f;
+ if(fabs(sd[2]) < epsilon) sd[2] = 0.0f;
+
+ if(sd[0] > 0) {
+ if(sd[1] > 0) {
+ if(sd[2] > 0) {
+ // +++
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ else if(sd[2] < 0) {
+ // ++-
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VecAddDir(q2, v1, v2, (sd[1]/(sd[1]-sd[2])));
+ VecAddDir(q3, v0, v2, (sd[0]/(sd[0]-sd[2])));
+ }
+ else {
+ // ++0
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ }
+ else if(sd[1] < 0) {
+ if(sd[2] > 0) {
+ // +-+
+ VECCOPY(q0, v0);
+ VecAddDir(q1, v0, v1, (sd[0]/(sd[0]-sd[1])));
+ VecAddDir(q2, v1, v2, (sd[1]/(sd[1]-sd[2])));
+ VECCOPY(q3, v2);
+ }
+ else if(sd[2] < 0) {
+ // +--
+ VECCOPY(q0, v0);
+ VecAddDir(q1, v0, v1, (sd[0]/(sd[0]-sd[1])));
+ VecAddDir(q2, v0, v2, (sd[0]/(sd[0]-sd[2])));
+ VECCOPY(q3, q2);
+ }
+ else {
+ // +-0
+ VECCOPY(q0, v0);
+ VecAddDir(q1, v0, v1, (sd[0]/(sd[0]-sd[1])));
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ }
+ else {
+ if(sd[2] > 0) {
+ // +0+
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ else if(sd[2] < 0) {
+ // +0-
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VecAddDir(q2, v0, v2, (sd[0]/(sd[0]-sd[2])));
+ VECCOPY(q3, q2);
+ }
+ else {
+ // +00
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ }
+ }
+ else if(sd[0] < 0) {
+ if(sd[1] > 0) {
+ if(sd[2] > 0) {
+ // -++
+ VecAddDir(q0, v0, v1, (sd[0]/(sd[0]-sd[1])));
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VecAddDir(q3, v0, v2, (sd[0]/(sd[0]-sd[2])));
+ }
+ else if(sd[2] < 0) {
+ // -+-
+ VecAddDir(q0, v0, v1, (sd[0]/(sd[0]-sd[1])));
+ VECCOPY(q1, v1);
+ VecAddDir(q2, v1, v2, (sd[1]/(sd[1]-sd[2])));
+ VECCOPY(q3, q2);
+ }
+ else {
+ // -+0
+ VecAddDir(q0, v0, v1, (sd[0]/(sd[0]-sd[1])));
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ }
+ else if(sd[1] < 0) {
+ if(sd[2] > 0) {
+ // --+
+ VecAddDir(q0, v0, v2, (sd[0]/(sd[0]-sd[2])));
+ VecAddDir(q1, v1, v2, (sd[1]/(sd[1]-sd[2])));
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ else if(sd[2] < 0) {
+ // ---
+ return 0;
+ }
+ else {
+ // --0
+ return 0;
+ }
+ }
+ else {
+ if(sd[2] > 0) {
+ // -0+
+ VecAddDir(q0, v0, v2, (sd[0]/(sd[0]-sd[2])));
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ else if(sd[2] < 0) {
+ // -0-
+ return 0;
+ }
+ else {
+ // -00
+ return 0;
+ }
+ }
+ }
+ else {
+ if(sd[1] > 0) {
+ if(sd[2] > 0) {
+ // 0++
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ else if(sd[2] < 0) {
+ // 0+-
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VecAddDir(q2, v1, v2, (sd[1]/(sd[1]-sd[2])));
+ VECCOPY(q3, q2);
+ }
+ else {
+ // 0+0
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ }
+ else if(sd[1] < 0) {
+ if(sd[2] > 0) {
+ // 0-+
+ VECCOPY(q0, v0);
+ VecAddDir(q1, v1, v2, (sd[1]/(sd[1]-sd[2])));
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ else if(sd[2] < 0) {
+ // 0--
+ return 0;
+ }
+ else {
+ // 0-0
+ return 0;
+ }
+ }
+ else {
+ if(sd[2] > 0) {
+ // 00+
+ VECCOPY(q0, v0);
+ VECCOPY(q1, v1);
+ VECCOPY(q2, v2);
+ VECCOPY(q3, q2);
+ }
+ else if(sd[2] < 0) {
+ // 00-
+ return 0;
+ }
+ else {
+ // 000
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+/* altivec optimization, this works, but is unused */
+
+#if 0
+#include <Accelerate/Accelerate.h>
+
+typedef union {
+ vFloat v;
+ float f[4];
+} vFloatResult;
+
+static vFloat vec_splat_float(float val)
+{
+ return (vFloat){val, val, val, val};
+}
+
+static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, float *q2, float *q3)
+{
+ vFloat vcos, rlen, vrx, vry, vrz, vsrx, vsry, vsrz, gx, gy, gz, vangle;
+ vUInt8 rotate = (vUInt8){4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3};
+ vFloatResult vresult;
+ float result;
+
+ /* compute r* */
+ vrx = (vFloat){q0[0], q1[0], q2[0], q3[0]} - vec_splat_float(p[0]);
+ vry = (vFloat){q0[1], q1[1], q2[1], q3[1]} - vec_splat_float(p[1]);
+ vrz = (vFloat){q0[2], q1[2], q2[2], q3[2]} - vec_splat_float(p[2]);
+
+ /* normalize r* */
+ rlen = vec_rsqrte(vrx*vrx + vry*vry + vrz*vrz + vec_splat_float(1e-16f));
+ vrx = vrx*rlen;
+ vry = vry*rlen;
+ vrz = vrz*rlen;
+
+ /* rotate r* for cross and dot */
+ vsrx= vec_perm(vrx, vrx, rotate);
+ vsry= vec_perm(vry, vry, rotate);
+ vsrz= vec_perm(vrz, vrz, rotate);
+
+ /* cross product */
+ gx = vsry*vrz - vsrz*vry;
+ gy = vsrz*vrx - vsrx*vrz;
+ gz = vsrx*vry - vsry*vrx;
+
+ /* normalize */
+ rlen = vec_rsqrte(gx*gx + gy*gy + gz*gz + vec_splat_float(1e-16f));
+ gx = gx*rlen;
+ gy = gy*rlen;
+ gz = gz*rlen;
+
+ /* angle */
+ vcos = vrx*vsrx + vry*vsry + vrz*vsrz;
+ vcos= vec_max(vec_min(vcos, vec_splat_float(1.0f)), vec_splat_float(-1.0f));
+ vangle= vacosf(vcos);
+
+ /* dot */
+ vresult.v = (vec_splat_float(n[0])*gx +
+ vec_splat_float(n[1])*gy +
+ vec_splat_float(n[2])*gz)*vangle;
+
+ result= (vresult.f[0] + vresult.f[1] + vresult.f[2] + vresult.f[3])*(0.5f/(float)M_PI);
+ result= MAX2(result, 0.0f);
+
+ return result;
+}
+
+#endif
+
+/* SSE optimization, acos code doesn't work */
+
+#if 0
+
+#include <xmmintrin.h>
+
+static __m128 sse_approx_acos(__m128 x)
+{
+ /* needs a better approximation than taylor expansion of acos, since that
+ * gives big erros for near 1.0 values, sqrt(2*x)*acos(1-x) should work
+ * better, see http://www.tom.womack.net/projects/sse-fast-arctrig.html */
+
+ return _mm_set_ps1(1.0f);
+}
+
+static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, float *q2, float *q3)
+{
+ float r0[3], r1[3], r2[3], r3[3], g0[3], g1[3], g2[3], g3[3];
+ float a1, a2, a3, a4, dot1, dot2, dot3, dot4, result;
+ float fresult[4] __attribute__((aligned(16)));
+ __m128 qx, qy, qz, rx, ry, rz, rlen, srx, sry, srz, gx, gy, gz, glen, rcos, angle, aresult;
+
+ /* compute r */
+ qx = _mm_set_ps(q3[0], q2[0], q1[0], q0[0]);
+ qy = _mm_set_ps(q3[1], q2[1], q1[1], q0[1]);
+ qz = _mm_set_ps(q3[2], q2[2], q1[2], q0[2]);
+
+ rx = qx - _mm_set_ps1(p[0]);
+ ry = qy - _mm_set_ps1(p[1]);
+ rz = qz - _mm_set_ps1(p[2]);
+
+ /* normalize r */
+ rlen = _mm_rsqrt_ps(rx*rx + ry*ry + rz*rz + _mm_set_ps1(1e-16f));
+ rx = rx*rlen;
+ ry = ry*rlen;
+ rz = rz*rlen;
+
+ /* cross product */
+ srx = _mm_shuffle_ps(rx, rx, _MM_SHUFFLE(0,3,2,1));
+ sry = _mm_shuffle_ps(ry, ry, _MM_SHUFFLE(0,3,2,1));
+ srz = _mm_shuffle_ps(rz, rz, _MM_SHUFFLE(0,3,2,1));
+
+ gx = sry*rz - srz*ry;
+ gy = srz*rx - srx*rz;
+ gz = srx*ry - sry*rx;
+
+ /* normalize g */
+ glen = _mm_rsqrt_ps(gx*gx + gy*gy + gz*gz + _mm_set_ps1(1e-16f));
+ gx = gx*glen;
+ gy = gy*glen;
+ gz = gz*glen;
+
+ /* compute angle */
+ rcos = rx*srx + ry*sry + rz*srz;
+ rcos= _mm_max_ps(_mm_min_ps(rcos, _mm_set_ps1(1.0f)), _mm_set_ps1(-1.0f));
+
+ angle = sse_approx_cos(rcos);
+ aresult = (_mm_set_ps1(n[0])*gx + _mm_set_ps1(n[1])*gy + _mm_set_ps1(n[2])*gz)*angle;
+
+ /* sum together */
+ result= (fresult[0] + fresult[1] + fresult[2] + fresult[3])*(0.5f/(float)M_PI);
+ result= MAX2(result, 0.0f);
+
+ return result;
+}
+
+#endif
+
+static float saacosf(float fac)
+{
+ if(fac<= -1.0f) return (float)M_PI;
+ else if(fac>=1.0f) return 0.0f;
+ else return acos(fac); /* acosf(fac) */
+}
+
+static void normalizef(float *n)
+{
+ float d;
+
+ d= INPR(n, n);
+
+ if(d > 1.0e-35F) {
+ d= 1.0f/sqrt(d); /* sqrtf(d) */
+
+ n[0] *= d;
+ n[1] *= d;
+ n[2] *= d;
+ }
+}
+
+static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, float *q2, float *q3)
+{
+ float r0[3], r1[3], r2[3], r3[3], g0[3], g1[3], g2[3], g3[3];
+ float a1, a2, a3, a4, dot1, dot2, dot3, dot4, result;
+
+ VECSUB(r0, q0, p);
+ VECSUB(r1, q1, p);
+ VECSUB(r2, q2, p);
+ VECSUB(r3, q3, p);
+
+ normalizef(r0);
+ normalizef(r1);
+ normalizef(r2);
+ normalizef(r3);
+
+ Crossf(g0, r1, r0); normalizef(g0);
+ Crossf(g1, r2, r1); normalizef(g1);
+ Crossf(g2, r3, r2); normalizef(g2);
+ Crossf(g3, r0, r3); normalizef(g3);
+
+ a1= saacosf(INPR(r0, r1));
+ a2= saacosf(INPR(r1, r2));
+ a3= saacosf(INPR(r2, r3));
+ a4= saacosf(INPR(r3, r0));
+
+ dot1= INPR(n, g0);
+ dot2= INPR(n, g1);
+ dot3= INPR(n, g2);
+ dot4= INPR(n, g3);
+
+ result= (a1*dot1 + a2*dot2 + a3*dot3 + a4*dot4)*0.5f/(float)M_PI;
+ result= MAX2(result, 0.0f);
+
+ return result;
+}
+
+float occ_form_factor(OccFace *face, float *p, float *n)
+{
+ ObjectInstanceRen *obi;
+ VlakRen *vlr;
+ float v1[3], v2[3], v3[3], v4[3], q0[3], q1[3], q2[3], q3[3], contrib= 0.0f;
+
+ obi= &R.objectinstance[face->obi];
+ vlr= RE_findOrAddVlak(obi->obr, face->facenr);
+
+ VECCOPY(v1, vlr->v1->co);
+ VECCOPY(v2, vlr->v2->co);
+ VECCOPY(v3, vlr->v3->co);
+
+ if(obi->flag & R_TRANSFORMED) {
+ Mat4MulVecfl(obi->mat, v1);
+ Mat4MulVecfl(obi->mat, v2);
+ Mat4MulVecfl(obi->mat, v3);
+ }
+
+ if(occ_visible_quad(p, n, v1, v2, v3, q0, q1, q2, q3))
+ contrib += occ_quad_form_factor(p, n, q0, q1, q2, q3);
+
+ if(vlr->v4) {
+ VECCOPY(v4, vlr->v4->co);
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulVecfl(obi->mat, v4);
+
+ if(occ_visible_quad(p, n, v1, v3, v4, q0, q1, q2, q3))
+ contrib += occ_quad_form_factor(p, n, q0, q1, q2, q3);
+ }
+
+ return contrib;
+}
+
+static void occ_lookup(OcclusionTree *tree, int thread, OccFace *exclude, float *pp, float *pn, float *occ, float *bentn)
+{
+ OccNode *node, **stack;
+ OccFace *face;
+ float resultocc, v[3], p[3], n[3], co[3];
+ float distfac, fac, error, d2, weight, emitarea;
+ int b, totstack;
+
+ /* init variables */
+ VECCOPY(p, pp);
+ VECCOPY(n, pn);
+ VECADDFAC(p, p, n, 1e-4f);
+
+ if(bentn)
+ VECCOPY(bentn, n);
+
+ error= tree->error;
+ distfac= tree->distfac;
+
+ resultocc= 0.0f;
+
+ /* init stack */
+ stack= tree->stack[thread];
+ stack[0]= tree->root;
+ totstack= 1;
+
+ while(totstack) {
+ /* pop point off the stack */
+ node= stack[--totstack];
+
+ VECSUB(v, node->co, p);
+ d2= INPR(v, v) + 1e-16f;
+ emitarea= MAX2(node->area, node->dco);
+
+ if(d2*error > emitarea) {
+ if(distfac != 0.0f) {
+ fac= 1.0f/(1.0f + distfac*d2);
+ if(fac < 0.01f)
+ continue;
+ }
+ else
+ fac= 1.0f;
+
+ /* accumulate occlusion from spherical harmonics */
+ weight= occ_solid_angle(node, v, d2, n);
+ weight *= node->occlusion;
+
+ if(bentn) {
+ Normalize(v);
+ bentn[0] -= weight*v[0];
+ bentn[1] -= weight*v[1];
+ bentn[2] -= weight*v[2];
+ }
+
+ resultocc += weight*fac;
+ }
+ else {
+ /* traverse into children */
+ for(b=0; b<TOTCHILD; b++) {
+ if(node->childflag & (1<<b)) {
+ face= tree->face+node->child[b].face;
+
+ /* accumulate occlusion with face form factor */
+ if(!exclude || !(face->obi == exclude->obi && face->facenr == exclude->facenr)) {
+ if(bentn || distfac != 0.0f) {
+ occ_face(face, co, NULL, NULL);
+ VECSUB(v, co, p);
+ d2= INPR(v, v) + 1e-16f;
+
+ fac= (distfac == 0.0f)? 1.0f: 1.0f/(1.0f + distfac*d2);
+ if(fac < 0.01f)
+ continue;
+ }
+ else
+ fac= 1.0f;
+
+ weight= occ_form_factor(face, p, n);
+ weight *= tree->occlusion[node->child[b].face];
+
+ if(bentn) {
+ Normalize(v);
+ bentn[0] -= weight*v[0];
+ bentn[1] -= weight*v[1];
+ bentn[2] -= weight*v[2];
+ }
+
+ resultocc += weight*fac;
+ }
+ }
+ else if(node->child[b].node) {
+ /* push child on the stack */
+ stack[totstack++]= node->child[b].node;
+ }
+ }
+ }
+ }
+
+ if(occ) *occ= resultocc;
+}
+
+static void occ_compute_passes(Render *re, OcclusionTree *tree, int totpass)
+{
+ float *occ, co[3], n[3];
+ int pass, i;
+
+ occ= MEM_callocN(sizeof(float)*tree->totface, "OcclusionPassOcc");
+
+ for(pass=0; pass<totpass; pass++) {
+ for(i=0; i<tree->totface; i++) {
+ occ_face(&tree->face[i], co, n, NULL);
+ VecMulf(n, -1.0f);
+ VECADDFAC(co, co, n, 1e-8f);
+
+ occ_lookup(tree, 0, &tree->face[i], co, n, &occ[i], NULL);
+ if(re->test_break())
+ break;
+ }
+
+ if(re->test_break())
+ break;
+
+ for(i=0; i<tree->totface; i++) {
+ tree->occlusion[i] -= occ[i]; //MAX2(1.0f-occ[i], 0.0f);
+ if(tree->occlusion[i] < 0.0f)
+ tree->occlusion[i]= 0.0f;
+ }
+
+ occ_sum_occlusion(tree, tree->root);
+ }
+
+ MEM_freeN(occ);
+}
+
+static void sample_occ_tree(Render *re, OcclusionTree *tree, OccFace *exclude, float *co, float *n, int thread, int onlyshadow, float *skycol)
+{
+ float nn[3], bn[3], dxyview[3], fac, occ, occlusion, correction;
+ int aocolor;
+
+ aocolor= re->wrld.aocolor;
+ if(onlyshadow)
+ aocolor= WO_AOPLAIN;
+
+ VECCOPY(nn, n);
+ VecMulf(nn, -1.0f);
+
+ occ_lookup(tree, thread, exclude, co, nn, &occ, (aocolor)? bn: NULL);
+
+ correction= re->wrld.ao_approx_correction;
+
+ occlusion= (1.0f-correction)*(1.0f-occ);
+ CLAMP(occlusion, 0.0f, 1.0f);
+ if(correction != 0.0f)
+ occlusion += correction*exp(-occ);
+
+ if(aocolor) {
+ /* sky shading using bent normal */
+ if(aocolor==WO_AOSKYCOL) {
+ fac= 0.5*(1.0f+bn[0]*re->grvec[0]+ bn[1]*re->grvec[1]+ bn[2]*re->grvec[2]);
+ skycol[0]= (1.0f-fac)*re->wrld.horr + fac*re->wrld.zenr;
+ skycol[1]= (1.0f-fac)*re->wrld.horg + fac*re->wrld.zeng;
+ skycol[2]= (1.0f-fac)*re->wrld.horb + fac*re->wrld.zenb;
+ }
+ else { /* WO_AOSKYTEX */
+ dxyview[0]= 1.0f;
+ dxyview[1]= 1.0f;
+ dxyview[2]= 0.0f;
+ shadeSkyView(skycol, co, bn, dxyview);
+ }
+
+ VecMulf(skycol, occlusion);
+ }
+ else {
+ skycol[0]= occlusion;
+ skycol[1]= occlusion;
+ skycol[2]= occlusion;
+ }
+}
+
+/* ---------------------------- Caching ------------------------------- */
+
+static OcclusionCacheSample *find_occ_sample(OcclusionCache *cache, int x, int y)
+{
+ x -= cache->x;
+ y -= cache->y;
+
+ x /= cache->step;
+ y /= cache->step;
+ x *= cache->step;
+ y *= cache->step;
+
+ if(x < 0 || x >= cache->w || y < 0 || y >= cache->h)
+ return NULL;
+ else
+ return &cache->sample[y*cache->w + x];
+}
+
+static int sample_occ_cache(OcclusionTree *tree, float *co, float *n, int x, int y, int thread, float *col)
+{
+ OcclusionCache *cache;
+ OcclusionCacheSample *samples[4], *sample;
+ float wn[4], wz[4], wb[4], tx, ty, w, totw, mino, maxo;
+ float d[3], dist2;
+ int i, x1, y1, x2, y2;
+
+ if(!tree->cache)
+ return 0;
+
+ /* first try to find a sample in the same pixel */
+ cache= &tree->cache[thread];
+
+ if(cache->sample && cache->step) {
+ sample= &cache->sample[(y-cache->y)*cache->w + (x-cache->x)];
+ if(sample->filled) {
+ VECSUB(d, sample->co, co);
+ dist2= INPR(d, d);
+ if(dist2 < 0.5f*sample->dist2 && INPR(sample->n, n) > 0.98f) {
+ VECCOPY(col, sample->col);
+ return 1;
+ }
+ }
+ }
+ else
+ return 0;
+
+ /* try to interpolate between 4 neighbouring pixels */
+ samples[0]= find_occ_sample(cache, x, y);
+ samples[1]= find_occ_sample(cache, x+cache->step, y);
+ samples[2]= find_occ_sample(cache, x, y+cache->step);
+ samples[3]= find_occ_sample(cache, x+cache->step, y+cache->step);
+
+ for(i=0; i<4; i++)
+ if(!samples[i] || !samples[i]->filled)
+ return 0;
+
+ /* require intensities not being too different */
+ mino= MIN4(samples[0]->intensity, samples[1]->intensity, samples[2]->intensity, samples[3]->intensity);
+ maxo= MAX4(samples[0]->intensity, samples[1]->intensity, samples[2]->intensity, samples[3]->intensity);
+
+ if(maxo - mino > 0.05f)
+ return 0;
+
+ /* compute weighted interpolation between samples */
+ col[0]= col[1]= col[2]= 0.0f;
+ totw= 0.0f;
+
+ x1= samples[0]->x;
+ y1= samples[0]->y;
+ x2= samples[3]->x;
+ y2= samples[3]->y;
+
+ tx= (float)(x2 - x)/(float)(x2 - x1);
+ ty= (float)(y2 - y)/(float)(y2 - y1);
+
+ wb[3]= (1.0f-tx)*(1.0f-ty);
+ wb[2]= (tx)*(1.0f-ty);
+ wb[1]= (1.0f-tx)*(ty);
+ wb[0]= tx*ty;
+
+ for(i=0; i<4; i++) {
+ VECSUB(d, samples[i]->co, co);
+ dist2= INPR(d, d);
+
+ wz[i]= 1.0f; //(samples[i]->dist2/(1e-4f + dist2));
+ wn[i]= pow(INPR(samples[i]->n, n), 32.0f);
+
+ w= wb[i]*wn[i]*wz[i];
+
+ totw += w;
+ col[0] += w*samples[i]->col[0];
+ col[1] += w*samples[i]->col[1];
+ col[2] += w*samples[i]->col[2];
+ }
+
+ if(totw >= 0.9f) {
+ totw= 1.0f/totw;
+ col[0] *= totw;
+ col[1] *= totw;
+ col[2] *= totw;
+ return 1;
+ }
+
+ return 0;
+}
+
+static void sample_occ_surface(ShadeInput *shi)
+{
+ StrandRen *strand= shi->strand;
+ StrandSurface *mesh= strand->buffer->surface;
+ int *face, *index = RE_strandren_get_face(shi->obr, strand, 0);
+ float w[4], *co1, *co2, *co3, *co4;
+
+ if(mesh && index) {
+ face= mesh->face[*index];
+
+ co1= mesh->co[face[0]];
+ co2= mesh->co[face[1]];
+ co3= mesh->co[face[2]];
+ co4= (face[3])? mesh->co[face[3]]: NULL;
+
+ InterpWeightsQ3Dfl(co1, co2, co3, co4, strand->vert->co, w);
+
+ shi->ao[0]= shi->ao[1]= shi->ao[2]= 0.0f;
+ VECADDFAC(shi->ao, shi->ao, mesh->col[face[0]], w[0]);
+ VECADDFAC(shi->ao, shi->ao, mesh->col[face[1]], w[1]);
+ VECADDFAC(shi->ao, shi->ao, mesh->col[face[2]], w[2]);
+ if(face[3])
+ VECADDFAC(shi->ao, shi->ao, mesh->col[face[3]], w[3]);
+ }
+ else {
+ shi->ao[0]= 1.0f;
+ shi->ao[1]= 1.0f;
+ shi->ao[2]= 1.0f;
+ }
+}
+
+/* ------------------------- External Functions --------------------------- */
+
+void make_occ_tree(Render *re)
+{
+ StrandSurface *mesh;
+ float col[3], co[3], n[3], *co1, *co2, *co3, *co4;
+ int a, *face, *count;
+
+ /* ugly, needed for occ_face */
+ R= *re;
+
+ re->i.infostr= "Occlusion preprocessing";
+ re->stats_draw(&re->i);
+
+ re->occlusiontree= occ_tree_build(re);
+
+ if(re->occlusiontree) {
+ if(re->wrld.ao_approx_passes)
+ occ_compute_passes(re, re->occlusiontree, re->wrld.ao_approx_passes);
+
+ for(mesh=re->strandsurface.first; mesh; mesh=mesh->next) {
+ count= MEM_callocN(sizeof(int)*mesh->totvert, "OcclusionCount");
+
+ for(a=0; a<mesh->totface; a++) {
+ face= mesh->face[a];
+ co1= mesh->co[face[0]];
+ co2= mesh->co[face[1]];
+ co3= mesh->co[face[2]];
+
+ if(face[3]) {
+ co4= mesh->co[face[3]];
+
+ VecLerpf(co, co1, co3, 0.5f);
+ CalcNormFloat4(co1, co2, co3, co4, n);
+ }
+ else {
+ CalcCent3f(co, co1, co2, co3);
+ CalcNormFloat(co1, co2, co3, n);
+ }
+ VecMulf(n, -1.0f);
+
+ sample_occ_tree(re, re->occlusiontree, NULL, co, n, 0, 0, col);
+
+ VECADD(mesh->col[face[0]], mesh->col[face[0]], col);
+ count[face[0]]++;
+ VECADD(mesh->col[face[1]], mesh->col[face[1]], col);
+ count[face[1]]++;
+ VECADD(mesh->col[face[2]], mesh->col[face[2]], col);
+ count[face[2]]++;
+
+ if(face[3]) {
+ VECADD(mesh->col[face[3]], mesh->col[face[3]], col);
+ count[face[3]]++;
+ }
+ }
+
+ for(a=0; a<mesh->totvert; a++)
+ if(count[a])
+ VecMulf(mesh->col[a], 1.0f/count[a]);
+
+ MEM_freeN(count);
+ }
+ }
+}
+
+void free_occ(Render *re)
+{
+ if(re->occlusiontree) {
+ occ_free_tree(re->occlusiontree);
+ re->occlusiontree = NULL;
+ }
+}
+
+void sample_occ(Render *re, ShadeInput *shi)
+{
+ OcclusionTree *tree= re->occlusiontree;
+ OcclusionCache *cache;
+ OcclusionCacheSample *sample;
+ OccFace exclude;
+ int onlyshadow;
+
+ if(tree) {
+ if(shi->strand) {
+ sample_occ_surface(shi);
+ }
+ /* try to get result from the cache if possible */
+ else if(!sample_occ_cache(tree, shi->co, shi->vno, shi->xs, shi->ys, shi->thread, shi->ao)) {
+ /* no luck, let's sample the occlusion */
+ exclude.obi= shi->obi - re->objectinstance;
+ exclude.facenr= shi->vlr->index;
+ onlyshadow= (shi->mat->mode & MA_ONLYSHADOW);
+ sample_occ_tree(re, tree, &exclude, shi->co, shi->vno, shi->thread, onlyshadow, shi->ao);
+
+ if(G.rt & 32)
+ shi->ao[2] *= 2.0f;
+
+ /* fill result into sample, each time */
+ if(tree->cache) {
+ cache= &tree->cache[shi->thread];
+
+ if(cache->sample && cache->step) {
+ sample= &cache->sample[(shi->ys-cache->y)*cache->w + (shi->xs-cache->x)];
+ VECCOPY(sample->co, shi->co);
+ VECCOPY(sample->n, shi->vno);
+ VECCOPY(sample->col, shi->ao);
+ sample->intensity= MAX3(sample->col[0], sample->col[1], sample->col[2]);
+ sample->dist2= INPR(shi->dxco, shi->dxco) + INPR(shi->dyco, shi->dyco);
+ sample->filled= 1;
+ }
+ }
+ }
+ }
+ else {
+ shi->ao[0]= 1.0f;
+ shi->ao[1]= 1.0f;
+ shi->ao[2]= 1.0f;
+ }
+}
+
+void cache_occ_samples(Render *re, RenderPart *pa, ShadeSample *ssamp)
+{
+ OcclusionTree *tree= re->occlusiontree;
+ PixStr ps;
+ OcclusionCache *cache;
+ OcclusionCacheSample *sample;
+ OccFace exclude;
+ ShadeInput *shi;
+ int *ro, *rp, *rz, onlyshadow;
+ int x, y, step = CACHE_STEP;
+
+ if(!tree->cache)
+ return;
+
+ cache= &tree->cache[pa->thread];
+ cache->w= pa->rectx;
+ cache->h= pa->recty;
+ cache->x= pa->disprect.xmin;
+ cache->y= pa->disprect.ymin;
+ cache->step= step;
+ cache->sample= MEM_callocN(sizeof(OcclusionCacheSample)*cache->w*cache->h, "OcclusionCacheSample");
+ sample= cache->sample;
+
+ ps.next= NULL;
+ ps.mask= (1<<re->osa);
+
+ ro= pa->recto;
+ rp= pa->rectp;
+ rz= pa->rectz;
+
+ /* compute a sample at every step pixels */
+ for(y=pa->disprect.ymin; y<pa->disprect.ymax; y++) {
+ for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, ro++, rp++, rz++, sample++) {
+ if((((x - pa->disprect.xmin + step) % step) == 0 || x == pa->disprect.xmax-1) && (((y - pa->disprect.ymin + step) % step) == 0 || y == pa->disprect.ymax-1)) {
+ if(*rp) {
+ ps.obi= *ro;
+ ps.facenr= *rp;
+ ps.z= *rz;
+
+ shade_samples_fill_with_ps(ssamp, &ps, x, y);
+ shi= ssamp->shi;
+ if(!shi->vlr)
+ continue;
+
+ onlyshadow= (shi->mat->mode & MA_ONLYSHADOW);
+ exclude.obi= shi->obi - re->objectinstance;
+ exclude.facenr= shi->vlr->index;
+ sample_occ_tree(re, tree, &exclude, shi->co, shi->vno, shi->thread, onlyshadow, shi->ao);
+
+ VECCOPY(sample->co, shi->co);
+ VECCOPY(sample->n, shi->vno);
+ VECCOPY(sample->col, shi->ao);
+ sample->intensity= MAX3(sample->col[0], sample->col[1], sample->col[2]);
+ sample->dist2= INPR(shi->dxco, shi->dxco) + INPR(shi->dyco, shi->dyco);
+ sample->x= shi->xs;
+ sample->y= shi->ys;
+ sample->filled= 1;
+ }
+
+ if(re->test_break())
+ break;
+ }
+ }
+ }
+}
+
+void free_occ_samples(Render *re, RenderPart *pa)
+{
+ OcclusionTree *tree= re->occlusiontree;
+ OcclusionCache *cache;
+
+ if(tree->cache) {
+ cache= &tree->cache[pa->thread];
+
+ if(cache->sample)
+ MEM_freeN(cache->sample);
+
+ cache->w= 0;
+ cache->h= 0;
+ cache->step= 0;
+ }
+}
+
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index db077c8a1b1..0a982a21174 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -78,6 +78,7 @@
#include "envmap.h"
#include "initrender.h"
#include "shadbuf.h"
+#include "pixelblending.h"
#include "zbuf.h"
@@ -141,26 +142,23 @@ static void stats_background(RenderStats *rs)
float megs_used_memory= mem_in_use/(1024.0*1024.0);
char str[400], *spos= str;
- if(rs->convertdone) {
-
- spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", G.scene->r.cfra, megs_used_memory);
-
- if(rs->curfield)
- spos+= sprintf(spos, "Field %d ", rs->curfield);
- if(rs->curblur)
- spos+= sprintf(spos, "Blur %d ", rs->curblur);
-
- if(rs->infostr) {
- spos+= sprintf(spos, "| %s", rs->infostr);
- }
- else {
- if(rs->tothalo)
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
- else
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->totlamp);
- }
- printf(str); printf("\n");
- }
+ spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", G.scene->r.cfra, megs_used_memory);
+
+ if(rs->curfield)
+ spos+= sprintf(spos, "Field %d ", rs->curfield);
+ if(rs->curblur)
+ spos+= sprintf(spos, "Blur %d ", rs->curblur);
+
+ if(rs->infostr) {
+ spos+= sprintf(spos, "| %s", rs->infostr);
+ }
+ else {
+ if(rs->tothalo)
+ spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
+ else
+ spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->totlamp);
+ }
+ printf(str); printf("\n");
}
void RE_FreeRenderResult(RenderResult *res)
@@ -171,8 +169,9 @@ void RE_FreeRenderResult(RenderResult *res)
RenderLayer *rl= res->layers.first;
if(rl->rectf) MEM_freeN(rl->rectf);
- /* acolrect is optionally allocated in shade_tile, only free here since it can be used for drawing */
+ /* acolrect and scolrect are optionally allocated in shade_tile, only free here since it can be used for drawing */
if(rl->acolrect) MEM_freeN(rl->acolrect);
+ if(rl->scolrect) MEM_freeN(rl->scolrect);
while(rl->passes.first) {
RenderPass *rpass= rl->passes.first;
@@ -194,6 +193,22 @@ void RE_FreeRenderResult(RenderResult *res)
MEM_freeN(res);
}
+/* version that's compatible with fullsample buffers */
+static void free_render_result(ListBase *lb, RenderResult *rr)
+{
+ RenderResult *rrnext;
+
+ for(; rr; rr= rrnext) {
+ rrnext= rr->next;
+
+ if(lb && lb->first)
+ BLI_remlink(lb, rr);
+
+ RE_FreeRenderResult(rr);
+ }
+}
+
+
/* all layers except the active one get temporally pushed away */
static void push_render_result(Render *re)
{
@@ -330,6 +345,10 @@ static char *get_pass_name(int passtype, int channel)
if(channel==-1) return "IndexOB";
return "IndexOB.X";
}
+ if(passtype == SCE_PASS_MIST) {
+ if(channel==-1) return "Mist";
+ return "Mist.Z";
+ }
return "Unknown";
}
@@ -378,18 +397,26 @@ static int passtype_from_name(char *str)
if(strcmp(str, "IndexOB")==0)
return SCE_PASS_INDEXOB;
+ if(strcmp(str, "Mist")==0)
+ return SCE_PASS_MIST;
+
return 0;
}
-static void render_unique_exr_name(Render *re, char *str)
+static void render_unique_exr_name(Render *re, char *str, int sample)
{
char di[FILE_MAX], name[FILE_MAXFILE], fi[FILE_MAXFILE];
BLI_strncpy(di, G.sce, FILE_MAX);
BLI_splitdirstring(di, fi);
- sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
+
+ if(sample==0)
+ sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
+ else
+ sprintf(name, "%s_%s%d.exr", fi, re->scene->id.name+2, sample);
+
if(G.background)
BLI_make_file_string("/", str, "/tmp/", name);
else
@@ -413,17 +440,22 @@ static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channel
IMB_exr_add_channel(rr->exrhandle, rl->name, get_pass_name(passtype, a), 0, 0, NULL);
}
else {
+ float *rect;
+ int x;
+
+ rpass->rect= MEM_mapallocN(sizeof(float)*rectsize, typestr);
+
if(passtype==SCE_PASS_VECTOR) {
- float *rect;
- int x;
-
/* initialize to max speed */
- rect= rpass->rect= MEM_mapallocN(sizeof(float)*rectsize, typestr);
+ rect= rpass->rect;
for(x= rectsize-1; x>=0; x--)
rect[x]= PASS_VECTOR_MAX;
}
- else
- rpass->rect= MEM_mapallocN(sizeof(float)*rectsize, typestr);
+ else if(passtype==SCE_PASS_Z) {
+ rect= rpass->rect;
+ for(x= rectsize-1; x>=0; x--)
+ rect[x]= 10e10;
+ }
}
}
@@ -497,6 +529,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
strcpy(rl->name, srl->name);
rl->lay= srl->lay;
+ rl->lay_zmask= srl->lay_zmask;
rl->layflag= srl->layflag;
rl->passflag= srl->passflag;
rl->pass_xor= srl->pass_xor;
@@ -526,22 +559,20 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
render_layer_add_pass(rr, rl, 3, SCE_PASS_DIFFUSE);
if(srl->passflag & SCE_PASS_SPEC)
render_layer_add_pass(rr, rl, 3, SCE_PASS_SPEC);
- if(re->r.mode & R_SHADOW)
- if(srl->passflag & SCE_PASS_SHADOW)
- render_layer_add_pass(rr, rl, 3, SCE_PASS_SHADOW);
- if(re->r.mode & R_RAYTRACE) {
- if(srl->passflag & SCE_PASS_AO)
- render_layer_add_pass(rr, rl, 3, SCE_PASS_AO);
- if(srl->passflag & SCE_PASS_REFLECT)
- render_layer_add_pass(rr, rl, 3, SCE_PASS_REFLECT);
- if(srl->passflag & SCE_PASS_REFRACT)
- render_layer_add_pass(rr, rl, 3, SCE_PASS_REFRACT);
- }
- if(re->r.mode & R_RADIO)
- if(srl->passflag & SCE_PASS_RADIO)
- render_layer_add_pass(rr, rl, 3, SCE_PASS_RADIO);
+ if(srl->passflag & SCE_PASS_AO)
+ render_layer_add_pass(rr, rl, 3, SCE_PASS_AO);
+ if(srl->passflag & SCE_PASS_SHADOW)
+ render_layer_add_pass(rr, rl, 3, SCE_PASS_SHADOW);
+ if(srl->passflag & SCE_PASS_REFLECT)
+ render_layer_add_pass(rr, rl, 3, SCE_PASS_REFLECT);
+ if(srl->passflag & SCE_PASS_REFRACT)
+ render_layer_add_pass(rr, rl, 3, SCE_PASS_REFRACT);
+ if(srl->passflag & SCE_PASS_RADIO)
+ render_layer_add_pass(rr, rl, 3, SCE_PASS_RADIO);
if(srl->passflag & SCE_PASS_INDEXOB)
render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXOB);
+ if(srl->passflag & SCE_PASS_MIST)
+ render_layer_add_pass(rr, rl, 1, SCE_PASS_MIST);
}
/* sss, previewrender and envmap don't do layers, so we make a default one */
@@ -641,9 +672,8 @@ static void merge_render_result(RenderResult *rr, RenderResult *rrpart)
}
-static void save_render_result_tile(Render *re, RenderPart *pa)
+static void save_render_result_tile(RenderResult *rr, RenderResult *rrpart)
{
- RenderResult *rrpart= pa->result;
RenderLayer *rlp;
RenderPass *rpassp;
int offs, partx, party;
@@ -663,23 +693,23 @@ static void save_render_result_tile(Render *re, RenderPart *pa)
if(rlp->rectf) {
int a, xstride= 4;
for(a=0; a<xstride; a++)
- IMB_exr_set_channel(re->result->exrhandle, rlp->name, get_pass_name(SCE_PASS_COMBINED, a),
- xstride, xstride*pa->rectx, rlp->rectf+a + xstride*offs);
+ IMB_exr_set_channel(rr->exrhandle, rlp->name, get_pass_name(SCE_PASS_COMBINED, a),
+ xstride, xstride*rrpart->rectx, rlp->rectf+a + xstride*offs);
}
/* passes are allocated in sync */
for(rpassp= rlp->passes.first; rpassp; rpassp= rpassp->next) {
int a, xstride= rpassp->channels;
for(a=0; a<xstride; a++)
- IMB_exr_set_channel(re->result->exrhandle, rlp->name, get_pass_name(rpassp->passtype, a),
- xstride, xstride*pa->rectx, rpassp->rect+a + xstride*offs);
+ IMB_exr_set_channel(rr->exrhandle, rlp->name, get_pass_name(rpassp->passtype, a),
+ xstride, xstride*rrpart->rectx, rpassp->rect+a + xstride*offs);
}
}
party= rrpart->tilerect.ymin + rrpart->crop;
partx= rrpart->tilerect.xmin + rrpart->crop;
- IMB_exrtile_write_channels(re->result->exrhandle, partx, party);
+ IMB_exrtile_write_channels(rr->exrhandle, partx, party);
BLI_unlock_thread(LOCK_IMAGE);
@@ -688,14 +718,17 @@ static void save_render_result_tile(Render *re, RenderPart *pa)
static void save_empty_result_tiles(Render *re)
{
RenderPart *pa;
+ RenderResult *rr;
- IMB_exrtile_clear_channels(re->result->exrhandle);
+ for(rr= re->result; rr; rr= rr->next) {
+ IMB_exrtile_clear_channels(rr->exrhandle);
- for(pa= re->parts.first; pa; pa= pa->next) {
- if(pa->ready==0) {
- int party= pa->disprect.ymin - re->disprect.ymin + pa->crop;
- int partx= pa->disprect.xmin - re->disprect.xmin + pa->crop;
- IMB_exrtile_write_channels(re->result->exrhandle, partx, party);
+ for(pa= re->parts.first; pa; pa= pa->next) {
+ if(pa->ready==0) {
+ int party= pa->disprect.ymin - re->disprect.ymin + pa->crop;
+ int partx= pa->disprect.xmin - re->disprect.xmin + pa->crop;
+ IMB_exrtile_write_channels(rr->exrhandle, partx, party);
+ }
}
}
}
@@ -822,7 +855,7 @@ static void renderresult_add_names(RenderResult *rr)
/* only for temp buffer files, makes exact copy of render result */
-static void read_render_result(Render *re)
+static void read_render_result(Render *re, int sample)
{
RenderLayer *rl;
RenderPass *rpass;
@@ -833,13 +866,15 @@ static void read_render_result(Render *re)
RE_FreeRenderResult(re->result);
re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
- render_unique_exr_name(re, str);
+ render_unique_exr_name(re, str, sample);
if(IMB_exr_begin_read(exrhandle, str, &rectx, &recty)==0) {
IMB_exr_close(exrhandle);
printf("cannot read: %s\n", str);
return;
}
+ printf("read exr tmp file: %s\n", str);
+
if(rectx!=re->result->rectx || recty!=re->result->recty) {
printf("error in reading render result\n");
}
@@ -1045,7 +1080,8 @@ void RE_InitState(Render *re, RenderData *rd, int winx, int winy, rcti *disprect
re->recty= winy;
}
- if(re->rectx < 2 || re->recty < 2) {
+ if(re->rectx < 2 || re->recty < 2 || (BKE_imtype_is_movie(rd->imtype) &&
+ (re->rectx < 16 || re->recty < 16) )) {
re->error("Image too small");
re->ok= 0;
}
@@ -1074,6 +1110,7 @@ void RE_InitState(Render *re, RenderData *rd, int winx, int winy, rcti *disprect
}
}
+/* part of external api, not called for regular render pipeline */
void RE_SetDispRect (struct Render *re, rcti *disprect)
{
re->disprect= *disprect;
@@ -1174,13 +1211,36 @@ static int render_display_draw_enabled(Render *re)
return 1;
}
+/* allocate osa new results for samples */
+static RenderResult *new_full_sample_buffers(Render *re, ListBase *lb, rcti *partrct, int crop)
+{
+ int a;
+
+ if(re->osa==0)
+ return new_render_result(re, partrct, crop, RR_USEMEM);
+
+ for(a=0; a<re->osa; a++) {
+ RenderResult *rr= new_render_result(re, partrct, crop, RR_USEMEM);
+ BLI_addtail(lb, rr);
+ rr->sample_nr= a;
+ }
+
+ return lb->first;
+}
+
+
+/* the main thread call, renders an entire part */
static void *do_part_thread(void *pa_v)
{
RenderPart *pa= pa_v;
/* need to return nicely all parts on esc */
if(R.test_break()==0) {
- pa->result= new_render_result(&R, &pa->disprect, pa->crop, RR_USEMEM);
+
+ if(!R.sss_points && (R.r.scemode & R_FULL_SAMPLE))
+ pa->result= new_full_sample_buffers(&R, &pa->fullresult, &pa->disprect, pa->crop);
+ else
+ pa->result= new_render_result(&R, &pa->disprect, pa->crop, RR_USEMEM);
if(R.sss_points)
zbufshade_sss_tile(pa);
@@ -1190,8 +1250,13 @@ static void *do_part_thread(void *pa_v)
zbufshade_tile(pa);
/* merge too on break! */
- if(R.result->exrhandle)
- save_render_result_tile(&R, pa);
+ if(R.result->exrhandle) {
+ RenderResult *rr, *rrpart;
+
+ for(rr= R.result, rrpart= pa->result; rr && rrpart; rr= rr->next, rrpart= rrpart->next)
+ save_render_result_tile(rr, rrpart);
+
+ }
else if(render_display_draw_enabled(&R))
merge_render_result(R.result, pa->result);
}
@@ -1307,7 +1372,7 @@ static RenderPart *find_next_pano_slice(Render *re, int *minx, rctf *viewplane)
Mat4CpyMat4(R.winmat, re->winmat);
/* rotate database according to part coordinates */
- project_renderdata(re, projectverto, 1, -R.panodxp*phi);
+ project_renderdata(re, projectverto, 1, -R.panodxp*phi, 1);
R.panosi= sin(R.panodxp*phi);
R.panoco= cos(R.panodxp*phi);
}
@@ -1365,33 +1430,52 @@ static void print_part_stats(Render *re, RenderPart *pa)
re->i.infostr= NULL;
}
+/* make osa new results for samples */
+static RenderResult *new_full_sample_buffers_exr(Render *re)
+{
+ int a;
+
+ for(a=0; a<re->osa; a++) {
+ RenderResult *rr= new_render_result(re, &re->disprect, 0, 1);
+ BLI_addtail(&re->fullresult, rr);
+ rr->sample_nr= a;
+ }
+
+ return re->fullresult.first;
+}
+
static void threaded_tile_processor(Render *re)
{
ListBase threads;
RenderPart *pa, *nextpa;
- RenderResult *rr;
rctf viewplane= re->viewplane;
int rendering=1, counter= 1, drawtimer=0, hasdrawn, minx=0;
- /* first step; the entire render result, or prepare exr buffer saving */
+ /* first step; free the entire render result, make new, and/or prepare exr buffer saving */
RE_FreeRenderResult(re->result);
- rr= re->result= new_render_result(re, &re->disprect, 0, re->r.scemode & R_EXR_TILE_FILE);
- if(rr==NULL)
+ if(!re->sss_points && (re->r.scemode & R_FULL_SAMPLE))
+ re->result= new_full_sample_buffers_exr(re);
+ else
+ re->result= new_render_result(re, &re->disprect, 0, re->r.scemode & R_EXR_TILE_FILE);
+
+ if(re->result==NULL)
return;
+
/* warning; no return here without closing exr file */
-// if(re->re->test_break())
-// return;
initparts(re);
- if(rr->exrhandle) {
+ if(re->result->exrhandle) {
+ RenderResult *rr;
char str[FILE_MAX];
- render_unique_exr_name(re, str);
+ for(rr= re->result; rr; rr= rr->next) {
+ render_unique_exr_name(re, str, rr->sample_nr);
- printf("write exr tmp file, %dx%d, %s\n", rr->rectx, rr->recty, str);
- IMB_exrtile_begin_write(rr->exrhandle, str, rr->rectx, rr->recty, rr->rectx/re->xparts, rr->recty/re->yparts);
+ printf("write exr tmp file, %dx%d, %s\n", rr->rectx, rr->recty, str);
+ IMB_exrtile_begin_write(rr->exrhandle, str, rr->rectx, rr->recty, rr->rectx/re->xparts, rr->recty/re->yparts);
+ }
}
BLI_init_threads(&threads, do_part_thread, re->r.threads);
@@ -1446,7 +1530,7 @@ static void threaded_tile_processor(Render *re)
re->display_draw(pa->result, NULL);
print_part_stats(re, pa);
- RE_FreeRenderResult(pa->result);
+ free_render_result(&pa->fullresult, pa->result);
pa->result= NULL;
re->i.partsdone++;
hasdrawn= 1;
@@ -1470,11 +1554,20 @@ static void threaded_tile_processor(Render *re)
}
- if(rr->exrhandle) {
+ if(re->result->exrhandle) {
+ RenderResult *rr;
+
save_empty_result_tiles(re);
- IMB_exr_close(rr->exrhandle);
- rr->exrhandle= NULL;
- read_render_result(re);
+
+ for(rr= re->result; rr; rr= rr->next) {
+ IMB_exr_close(rr->exrhandle);
+ rr->exrhandle= NULL;
+ }
+
+ free_render_result(&re->fullresult, re->result);
+ re->result= NULL;
+
+ read_render_result(re, 0);
}
/* unset threadsafety */
@@ -1483,7 +1576,6 @@ static void threaded_tile_processor(Render *re)
BLI_end_threads(&threads);
freeparts(re);
re->viewplane= viewplane; /* restore viewplane, modified by pano render */
-
}
/* currently only called by preview renders and envmap */
@@ -1808,11 +1900,18 @@ static void do_render_fields_blur_3d(Render *re)
static void render_scene(Render *re, Scene *sce, int cfra)
{
Render *resc= RE_NewRender(sce->id.name);
+ int winx= re->winx, winy= re->winy;
sce->r.cfra= cfra;
+ /* exception: scene uses own size (unfinished code) */
+ if(0) {
+ winx= (sce->r.size*sce->r.xsch)/100;
+ winy= (sce->r.size*sce->r.ysch)/100;
+ }
+
/* initial setup */
- RE_InitState(resc, &sce->r, re->winx, re->winy, &re->disprect);
+ RE_InitState(resc, &sce->r, winx, winy, &re->disprect);
/* this to enable this scene to create speed vectors */
resc->r.scemode |= R_DOCOMP;
@@ -1823,6 +1922,10 @@ static void render_scene(Render *re, Scene *sce, int cfra)
/* ensure scene has depsgraph, base flags etc OK. Warning... also sets G.scene */
set_scene_bg(sce);
+ /* fullsample wants uniform osa levels */
+ if(resc->r.scemode & R_FULL_SAMPLE)
+ resc->r.osa= resc->osa= re->osa;
+
/* copy callbacks */
resc->display_draw= re->display_draw;
resc->test_break= re->test_break;
@@ -1831,10 +1934,15 @@ static void render_scene(Render *re, Scene *sce, int cfra)
do_render_fields_blur_3d(resc);
}
-static void ntree_render_scenes(Render *re)
+static void tag_scenes_for_render(Render *re)
{
bNode *node;
- int cfra= re->scene->r.cfra;
+ Scene *sce;
+
+ for(sce= G.main->scene.first; sce; sce= sce->id.next)
+ sce->id.flag &= ~LIB_DOIT;
+
+ re->scene->id.flag |= LIB_DOIT;
if(re->scene->nodetree==NULL) return;
@@ -1844,12 +1952,21 @@ static void ntree_render_scenes(Render *re)
if(node->id) {
if(node->id != (ID *)re->scene)
node->id->flag |= LIB_DOIT;
- else
- node->id->flag &= ~LIB_DOIT;
}
}
}
+}
+
+static void ntree_render_scenes(Render *re)
+{
+ bNode *node;
+ int cfra= re->scene->r.cfra;
+
+ if(re->scene->nodetree==NULL) return;
+
+ tag_scenes_for_render(re);
+
/* now foreach render-result node tagged we do a full render */
/* results are stored in a way compisitor will find it */
for(node= re->scene->nodetree->nodes.first; node; node= node->next) {
@@ -1895,6 +2012,113 @@ static void render_composit_stats(char *str)
R.i.infostr= NULL;
}
+
+/* reads all buffers, calls optional composite, merges in first result->rectf */
+static void do_merge_fullsample(Render *re, bNodeTree *ntree)
+{
+ float *rectf;
+ int sample;
+
+ /* filtmask needs it */
+ R= *re;
+
+ /* we accumulate in here */
+ rectf= MEM_mapallocN(re->rectx*re->recty*sizeof(float)*4, "fullsample rgba");
+
+ for(sample=0; sample<re->r.osa; sample++) {
+ RenderResult rres;
+ int x, y, mask;
+
+ /* set all involved renders on the samplebuffers (first was done by render itself) */
+ /* also function below assumes this */
+ if(sample) {
+ Render *re1;
+
+ tag_scenes_for_render(re);
+ for(re1= RenderList.first; re1; re1= re1->next) {
+ if(re1->scene->id.flag & LIB_DOIT)
+ if(re1->r.scemode & R_FULL_SAMPLE)
+ read_render_result(re1, sample);
+ }
+ }
+
+ /* composite */
+ if(ntree) {
+ ntreeCompositTagRender(re->scene);
+ ntreeCompositTagAnimated(ntree);
+
+ ntreeCompositExecTree(ntree, &re->r, G.background==0);
+ }
+
+ /* ensure we get either composited result or the active layer */
+ RE_GetResultImage(re, &rres);
+
+ /* accumulate with filter, and clip */
+ mask= (1<<sample);
+ for(y=1; y<re->recty-1; y++) {
+ float *rf= rectf + 4*y*re->rectx + 4;
+ float *col= rres.rectf + 4*y*re->rectx + 4;
+
+ for(x=1; x<re->rectx-1; x++, rf+=4, col+=4) {
+ if(col[0]<0.0f) col[0]=0.0f; else if(col[0] > 1.0f) col[0]= 1.0f;
+ if(col[1]<0.0f) col[1]=0.0f; else if(col[1] > 1.0f) col[1]= 1.0f;
+ if(col[2]<0.0f) col[2]=0.0f; else if(col[2] > 1.0f) col[2]= 1.0f;
+
+ add_filt_fmask(mask, col, rf, re->rectx);
+ }
+ }
+
+ /* show stuff */
+ if(sample!=re->osa-1) {
+ /* 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);
+ }
+
+ if(re->test_break())
+ break;
+ }
+
+ if(re->result->rectf)
+ MEM_freeN(re->result->rectf);
+ re->result->rectf= rectf;
+}
+
+void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
+{
+ Scene *scene;
+ bNode *node;
+
+ /* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
+
+ /* tag scenes unread */
+ for(scene= G.main->scene.first; scene; scene= scene->id.next)
+ scene->id.flag |= LIB_DOIT;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS) {
+ Scene *nodescene= (Scene *)node->id;
+
+ if(nodescene==NULL) nodescene= sce;
+ if(nodescene->id.flag & LIB_DOIT) {
+ nodescene->r.mode |= R_OSA; /* render struct needs tables */
+ RE_ReadRenderResult(sce, nodescene);
+ nodescene->id.flag &= ~LIB_DOIT;
+ }
+ }
+ }
+
+ /* own render result should be read/allocated */
+ if(G.scene->id.flag & LIB_DOIT)
+ RE_ReadRenderResult(G.scene, G.scene);
+
+ /* and now we can draw (result is there) */
+ re->display_init(re->result);
+ re->display_clear(re->result);
+
+ do_merge_fullsample(re, ntree);
+}
+
/* returns fully composited render-result on given time step (in RenderData) */
static void do_render_composite_fields_blur_3d(Render *re)
{
@@ -1914,11 +2138,14 @@ static void do_render_composite_fields_blur_3d(Render *re)
if(re->r.scemode & R_SINGLE_LAYER)
pop_render_result(re);
- if(!re->test_break() && ntree) {
- ntreeCompositTagRender(re->scene);
- ntreeCompositTagAnimated(ntree);
+ if(!re->test_break()) {
+
+ if(ntree) {
+ ntreeCompositTagRender(re->scene);
+ ntreeCompositTagAnimated(ntree);
+ }
- if(re->r.scemode & R_DOCOMP) {
+ if(ntree && re->r.scemode & R_DOCOMP) {
/* checks if there are render-result nodes that need scene */
if((re->r.scemode & R_SINGLE_LAYER)==0)
ntree_render_scenes(re);
@@ -1929,13 +2156,23 @@ static void do_render_composite_fields_blur_3d(Render *re)
/* in case it was never initialized */
R.stats_draw= re->stats_draw;
- ntreeCompositExecTree(ntree, &re->r, G.background==0);
+ if(re->r.scemode & R_FULL_SAMPLE)
+ do_merge_fullsample(re, ntree);
+ else
+ ntreeCompositExecTree(ntree, &re->r, G.background==0);
+
ntree->stats_draw= NULL;
ntree->test_break= NULL;
}
}
+ else
+ if(re->r.scemode & R_FULL_SAMPLE)
+ do_merge_fullsample(re, NULL);
+
}
+ /* 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 +2235,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, 4);
+}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -2035,7 +2281,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)
@@ -2069,14 +2322,20 @@ static int is_rendering_allowed(Render *re)
if(re->r.scemode & R_EXR_TILE_FILE) {
char str[FILE_MAX];
- render_unique_exr_name(re, str);
+ render_unique_exr_name(re, str, 0);
if (BLI_is_writable(str)==0) {
re->error("Can not save render buffers, check the temp default path");
return 0;
}
+ /* no osa + fullsample won't work... */
+ if(re->osa==0)
+ re->r.scemode &= ~R_FULL_SAMPLE;
+
}
+ else
+ re->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */
if(re->r.scemode & R_DOCOMP) {
if(re->scene->use_nodes) {
@@ -2137,6 +2396,7 @@ static int is_rendering_allowed(Render *re)
/* evaluating scene options for general Blender render */
static int render_initialize_from_scene(Render *re, Scene *scene)
{
+ Scene *sce;
int winx, winy;
rcti disprect;
@@ -2161,17 +2421,23 @@ static int render_initialize_from_scene(Render *re, Scene *scene)
disprect.ymax= winy;
}
- if(scene->r.scemode & R_EXR_TILE_FILE) {
- int partx= winx/scene->r.xparts, party= winy/scene->r.yparts;
-
- /* stupid exr tiles dont like different sizes */
- if(winx != partx*scene->r.xparts || winy != party*scene->r.yparts) {
- re->error("Sorry... exr tile saving only allowed with equally sized parts");
- return 0;
- }
- if((scene->r.mode & R_FIELDS) && (party & 1)) {
- re->error("Sorry... exr tile saving only allowed with equally sized parts");
- return 0;
+ re->scene= scene;
+
+ /* check all scenes involved */
+ tag_scenes_for_render(re);
+ for(sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if(sce->r.scemode & R_EXR_TILE_FILE) {
+ int partx= winx/sce->r.xparts, party= winy/sce->r.yparts;
+
+ /* stupid exr tiles dont like different sizes */
+ if(winx != partx*sce->r.xparts || winy != party*sce->r.yparts) {
+ re->error("Sorry... exr tile saving only allowed with equally sized parts");
+ return 0;
+ }
+ if((sce->r.mode & R_FIELDS) && (party & 1)) {
+ re->error("Sorry... exr tile saving only allowed with equally sized parts");
+ return 0;
+ }
}
}
@@ -2179,11 +2445,12 @@ static int render_initialize_from_scene(Render *re, Scene *scene)
push_render_result(re);
RE_InitState(re, &scene->r, winx, winy, &disprect);
+ if(!re->ok) /* if an error was printed, abort */
+ return 0;
/* initstate makes new result, have to send changed tags around */
ntreeCompositTagRender(re->scene);
- re->scene= scene;
if(!is_rendering_allowed(re))
return 0;
@@ -2314,17 +2581,37 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra)
}
}
} else {
- for(scene->r.cfra= sfra;
- scene->r.cfra<=efra; scene->r.cfra++) {
+ for(scene->r.cfra= sfra; scene->r.cfra<=efra; scene->r.cfra++) {
+ char name[FILE_MAX];
+ if (scene->r.mode & (R_NO_OVERWRITE | R_TOUCH) ) {
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype);
+ }
+
+ if (scene->r.mode & R_NO_OVERWRITE && BLI_exist(name)) {
+ printf("skipping existing frame \"%s\"\n", name);
+ continue;
+ }
+ if (scene->r.mode & R_TOUCH && !BLI_exist(name)) {
+ BLI_make_existing_file(name); /* makes the dir if its not there */
+ BLI_touch(name);
+ }
+
re->r.cfra= scene->r.cfra; /* weak.... */
-
+
do_render_all_options(re);
-
+
if(re->test_break() == 0) {
do_write_image_or_movie(re, scene, mh);
}
- if(G.afbreek==1) break;
+ if(G.afbreek==1) {
+ /* remove touched file */
+ if (scene->r.mode & R_TOUCH && BLI_exist(name) && BLI_filepathsize(name) == 0) {
+ BLI_delete(name, 0, 0);
+ }
+
+ break;
+ }
}
}
@@ -2340,7 +2627,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra)
/* note; repeated win/disprect calc... solve that nicer, also in compo */
-/* only temp file! */
+/* only the temp file! */
void RE_ReadRenderResult(Scene *scene, Scene *scenode)
{
Render *re;
@@ -2368,11 +2655,14 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode)
if(scenode)
scene= scenode;
- re= RE_NewRender(scene->id.name);
+ /* get render: it can be called from UI with draw callbacks */
+ re= RE_GetRender(scene->id.name);
+ if(re==NULL)
+ re= RE_NewRender(scene->id.name);
RE_InitState(re, &scene->r, winx, winy, &disprect);
re->scene= scene;
- read_render_result(re);
+ read_render_result(re, 0);
}
void RE_set_max_threads(int threads)
diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c
index 119cceaf3c2..2c7d5e1d9cc 100644
--- a/source/blender/render/intern/source/pixelblending.c
+++ b/source/blender/render/intern/source/pixelblending.c
@@ -91,15 +91,6 @@ void addAlphaOverFloat(float *dest, float *source)
void addAlphaUnderFloat(float *dest, float *source)
{
float mul;
-
- if( (-RE_EMPTY_COLOR_FLOAT < dest[3])
- && (dest[3] < RE_EMPTY_COLOR_FLOAT) ) {
- dest[0] = source[0];
- dest[1] = source[1];
- dest[2] = source[2];
- dest[3] = source[3];
- return;
- }
mul= 1.0 - dest[3];
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index cffed99c738..4e589789412 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -25,6 +25,7 @@
*/
#include <math.h>
+#include <string.h>
#include "BLI_arithb.h"
/* External modules: */
@@ -130,6 +131,12 @@ static void render_lighting_halo(HaloRen *har, float *colf)
if(lar->mode & LA_TEXTURE) {
ShadeInput shi;
+
+ /* Warning, This is not that nice, and possibly a bit slow,
+ however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
+ memset(&shi, 0, sizeof(ShadeInput));
+ /* end warning! - Campbell */
+
VECCOPY(shi.co, rco);
shi.osatex= 0;
do_lamp_tex(lar, lv, &shi, lacol);
@@ -175,7 +182,7 @@ static void render_lighting_halo(HaloRen *har, float *colf)
inp= vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2];
if(inp>0.0) {
/* testshadowbuf==0.0 : 100% shadow */
- shadfac = testshadowbuf(lar->shb, rco, dco, dco, inp);
+ shadfac = testshadowbuf(lar->shb, rco, dco, dco, inp, 0.0f);
if( shadfac>0.0 ) {
shadfac*= inp*soft*lar->energy;
ir -= shadfac;
@@ -212,7 +219,7 @@ static void render_lighting_halo(HaloRen *har, float *colf)
if(i> -0.41) { /* heuristic valua! */
shadfac= 1.0;
if(lar->shb) {
- shadfac = testshadowbuf(lar->shb, rco, dco, dco, inp);
+ shadfac = testshadowbuf(lar->shb, rco, dco, dco, inp, 0.0f);
if(shadfac==0.0) continue;
i*= shadfac;
}
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 08fbe8472c0..218f5fe931e 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -77,15 +77,23 @@ static void vlr_face_coords(RayFace *face, float **v1, float **v2, float **v3, f
*v4 = (vlr->v4)? vlr->v4->co: NULL;
}
-static int vlr_check_intersect(Isect *is, RayFace *face)
+static int vlr_check_intersect(Isect *is, int ob, RayFace *face)
{
+ ObjectInstanceRen *obi= RAY_OBJECT_GET((Render*)is->userdata, ob);
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);
+ return (is->lay & obi->obr->lay);
+}
+
+static float *vlr_get_transform(void *userdata, int i)
+{
+ ObjectInstanceRen *obi= RAY_OBJECT_GET((Render*)userdata, i);
+
+ return (obi->flag & R_TRANSFORMED)? (float*)obi->mat: NULL;
}
void freeraytree(Render *re)
@@ -98,61 +106,89 @@ void freeraytree(Render *re)
void makeraytree(Render *re)
{
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
VlakRen *vlr= NULL;
- float min[3], max[3];
+ float min[3], max[3], co1[3], co2[3], co3[3], co4[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);
- }
+ for(obi=re->instancetable.first; obi; obi=obi->next) {
+ obr= obi->obr;
+
+ if(re->excludeob && obr->ob == re->excludeob)
+ continue;
+
+ for(v=0;v<obr->totvlak;v++) {
+ if((v & 255)==0) vlr= obr->vlaknodes[v>>8].vlak;
+ else vlr++;
+ if(vlr->mat->mode & MA_TRACEBLE) {
+ if((vlr->mat->mode & MA_WIRE)==0) {
+ VECCOPY(co1, vlr->v1->co);
+ VECCOPY(co2, vlr->v2->co);
+ VECCOPY(co3, vlr->v3->co);
+
+ if(obi->flag & R_TRANSFORMED) {
+ Mat4MulVecfl(obi->mat, co1);
+ Mat4MulVecfl(obi->mat, co2);
+ Mat4MulVecfl(obi->mat, co3);
+ }
+
+ DO_MINMAX(co1, min, max);
+ DO_MINMAX(co2, min, max);
+ DO_MINMAX(co3, min, max);
+
+ if(vlr->v4) {
+ VECCOPY(co4, vlr->v4->co);
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulVecfl(obi->mat, co4);
+ DO_MINMAX(co4, min, max);
+ }
- totface++;
+ totface++;
+ }
}
}
}
- re->raytree= RE_ray_tree_create(re->r.ocres, totface, min, max, vlr_face_coords, vlr_check_intersect);
+ re->raytree= RE_ray_tree_create(re->r.ocres, totface, min, max,
+ vlr_face_coords, vlr_check_intersect, vlr_get_transform, re);
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();
+ for(obi=re->instancetable.first; obi; obi=obi->next) {
+ obr= obi->obr;
- 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);
+ if(re->excludeob && obr->ob == re->excludeob)
+ continue;
+
+ for(v=0; v<obr->totvlak; v++) {
+ if((v & 255)==0) {
+ double time= PIL_check_seconds_timer();
+
+ vlr= obr->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, RAY_OBJECT_SET(re, obi), vlr);
}
}
@@ -165,7 +201,8 @@ void makeraytree(Render *re)
static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
{
VlakRen *vlr= (VlakRen*)is->face;
- int osatex= 0, norflip;
+ ObjectInstanceRen *obi= RAY_OBJECT_GET(&R, is->ob);
+ int osatex= 0;
/* set up view vector */
VECCOPY(shi->view, is->vec);
@@ -177,6 +214,8 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
Normalize(shi->view);
+ shi->obi= obi;
+ shi->obr= obi->obr;
shi->vlr= vlr;
shi->mat= vlr->mat;
memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
@@ -194,35 +233,26 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
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);
+ shade_input_set_triangle_i(shi, obi, vlr, 2, 1, 3);
else
- shade_input_set_triangle_i(shi, vlr, 0, 1, 3);
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 3);
}
else {
- shade_input_set_triangle_i(shi, vlr, 0, 1, 2);
+ shade_input_set_triangle_i(shi, obi, 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);
+
+ /* point normals to viewing direction */
+ if(INPR(shi->facenor, shi->view) < 0.0f)
+ shade_input_flip_normals(shi);
+
shade_input_set_shade_texco(shi);
if(is->mode==RE_RAY_SHADOW_TRA)
@@ -371,7 +401,7 @@ static void ray_fadeout(Isect *is, ShadeInput *shi, float *col, float *blendcol,
}
/* the main recursive tracer itself */
-static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, float *start, float *vec, float *col, VlakRen *vlr, int traflag)
+static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, float *start, float *vec, float *col, ObjectInstanceRen *obi, VlakRen *vlr, int traflag)
{
ShadeInput shi;
ShadeResult shr;
@@ -380,6 +410,11 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
float ref[3], maxsize=RE_ray_tree_max_size(R.raytree);
float dist_mir = origshi->mat->dist_mir;
+ /* Warning, This is not that nice, and possibly a bit slow for every ray,
+ however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
+ memset(&shi, 0, sizeof(ShadeInput));
+ /* end warning! - Campbell */
+
VECCOPY(isec.start, start);
if (dist_mir > 0.0) {
isec.end[0]= start[0]+dist_mir*vec[0];
@@ -392,6 +427,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
}
isec.mode= RE_RAY_MIRROR;
isec.faceorig= (RayFace*)vlr;
+ isec.oborig= RAY_OBJECT_SET(&R, obi);
if(RE_ray_tree_intersect(R.raytree, &isec)) {
float d= 1.0f;
@@ -400,13 +436,13 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
shi.osatex= origshi->osatex;
shi.depth= 1; /* only used to indicate tracing */
shi.thread= origshi->thread;
- shi.sample= 0;
+ //shi.sample= 0; // memset above, so dont need this
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.do_preview= 0; // memset above, so dont need this
shi.light_override= origshi->light_override;
shi.mat_override= origshi->mat_override;
@@ -441,10 +477,10 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
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);
+ traceray(origshi, origshr, depth-1, shi.co, refract, tracol, shi.obi, shi.vlr, traflag ^ RAY_TRAFLIP);
}
else
- traceray(origshi, origshr, depth-1, shi.co, shi.view, tracol, shi.vlr, 0);
+ traceray(origshi, origshr, depth-1, shi.co, shi.view, tracol, shi.obi, shi.vlr, 0);
f= shr.alpha; f1= 1.0f-f;
nf= d * shi.mat->filter;
@@ -474,7 +510,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
float mircol[4];
reflection(ref, shi.vn, shi.view, NULL);
- traceray(origshi, origshr, depth-1, shi.co, ref, mircol, shi.vlr, 0);
+ traceray(origshi, origshr, depth-1, shi.co, ref, mircol, shi.obi, shi.vlr, 0);
f1= 1.0f-f;
@@ -579,6 +615,9 @@ void init_jitter_plane(LampRen *lar)
float *fp;
int x, iter=12, tot= lar->ray_totsamp;
+ /* test if already initialized */
+ if(lar->jitter) return;
+
/* at least 4, or max threads+1 tables */
if(BLENDER_MAX_THREADS < 4) x= 4;
else x= BLENDER_MAX_THREADS+1;
@@ -641,7 +680,7 @@ static void halton_sample(double *ht_invprimes, double *ht_nums, double *v)
for (i = 0; i < 2; i++)
{
- double r = (1.0 - ht_nums[i]) - 1e-10;
+ double r = fabs((1.0 - ht_nums[i]) - 1e-10);
if (ht_invprimes[i] >= r)
{
@@ -806,6 +845,25 @@ static void QMC_sampleHemi(float *vec, QMCSampler *qsa, int thread, int num)
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)
@@ -821,11 +879,13 @@ void init_render_hammersley(Render *re)
void free_lamp_qmcsampler(LampRen *lar)
{
QMC_freeSampler(lar->qsa);
+ lar->qsa = NULL;
}
void free_render_qmcsampler(Render *re)
{
QMC_freeSampler(re->qsa);
+ re->qsa = NULL;
}
static int adaptive_sample_variance(int samples, float *col, float *colsq, float thresh)
@@ -861,6 +921,20 @@ static int adaptive_sample_contrast_val(int samples, float prev, float val, floa
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 ************** */
@@ -915,7 +989,7 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
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);
+ traceray(shi, shr, shi->mat->ray_depth_tra, shi->co, v_refract_new, sampcol, shi->obi, shi->vlr, RAY_TRA|RAY_TRAFLIP);
col[0] += sampcol[0];
col[1] += sampcol[1];
@@ -955,7 +1029,7 @@ static void trace_reflect(float *col, ShadeInput *shi, ShadeResult *shr, float f
int samp_type;
float samp3d[3], orthx[3], orthy[3];
- float v_nor_new[3], v_facenor_new[3], v_reflect[3];
+ float v_nor_new[3], v_reflect[3];
float sampcol[4], colsq[4];
float blur = pow(1.0 - shi->mat->gloss_mir, 3);
@@ -978,8 +1052,6 @@ static void trace_reflect(float *col, ShadeInput *shi, ShadeResult *shr, float f
} else
max_samples = 1;
- VECCOPY(v_facenor_new, shi->facenor);
-
while (samples < max_samples) {
if (max_samples > 1) {
@@ -1002,21 +1074,18 @@ static void trace_reflect(float *col, ShadeInput *shi, ShadeResult *shr, float f
/* and perturb the normal in it */
VecAddf(v_nor_new, shi->vn, orthx);
VecAddf(v_nor_new, v_nor_new, orthy);
- VecAddf(v_facenor_new, shi->facenor, orthx);
- VecAddf(v_facenor_new, v_facenor_new, orthy);
Normalize(v_nor_new);
- Normalize(v_facenor_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, v_facenor_new);
+ 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);
+ traceray(shi, shr, shi->mat->ray_depth, shi->co, v_reflect, sampcol, shi->obi, shi->vlr, 0);
col[0] += sampcol[0];
@@ -1170,16 +1239,22 @@ static void ray_trace_shadow_tra(Isect *is, int depth, int traflag)
float d= 1.0f;
/* we got a face */
+ /* Warning, This is not that nice, and possibly a bit slow for every ray,
+ however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
+ memset(&shi, 0, sizeof(ShadeInput));
+ /* end warning! - Campbell */
+
shi.depth= 1; /* only used to indicate tracing */
shi.mask= 1;
- shi.osatex= 0;
+
+ /*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;
+ shi.mat_override= NULL;*/
shade_ray(is, &shi, &shr);
if (traflag & RAY_TRA)
@@ -1192,6 +1267,7 @@ static void ray_trace_shadow_tra(Isect *is, int depth, int traflag)
/* adapt isect struct */
VECCOPY(is->start, shi.co);
+ is->oborig= RAY_OBJECT_SET(&R, shi.obi);
is->faceorig= (RayFace*)shi.vlr;
ray_trace_shadow_tra(is, depth-1, traflag | RAY_TRA);
@@ -1219,6 +1295,7 @@ int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
accum[0]= accum[1]= accum[2]= 0.0f;
isec.mode= RE_RAY_MIRROR;
isec.faceorig= (RayFace*)ship->vlr;
+ isec.oborig= RAY_OBJECT_SET(&R, ship->obi);
for(a=0; a<8*8; a++) {
@@ -1237,6 +1314,12 @@ int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
if(RE_ray_tree_intersect(R.raytree, &isec)) {
float fac;
+
+ /* Warning, This is not that nice, and possibly a bit slow for every ray,
+ however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
+ memset(&shi, 0, sizeof(ShadeInput));
+ /* end warning! - Campbell */
+
shade_ray(&isec, &shi, &shr_t);
fac= isec.labda*isec.labda;
fac= 1.0f;
@@ -1407,6 +1490,7 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
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;
@@ -1416,7 +1500,9 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
int aocolor;
isec.faceorig= (RayFace*)shi->vlr;
+ isec.oborig= RAY_OBJECT_SET(&R, shi->obi);
isec.face_last= NULL;
+ isec.ob_last= 0;
isec.mode= (R.wrld.aomode & WO_AODIST)?RE_RAY_SHADOW_TRA:RE_RAY_SHADOW;
isec.lay= -1;
VECCOPY(isec.start, shi->co);
@@ -1447,9 +1533,16 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
VecOrthoBasisf(nrm, up, side);
/* sampling init */
- if (R.wrld.ao_samp_method==WO_AOSAMP_HALTON)
+ 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)
+ } else if (R.wrld.ao_samp_method==WO_AOSAMP_HAMMERSLEY)
qsa = R.qsa;
QMC_initPixel(qsa, shi->thread);
@@ -1458,7 +1551,7 @@ void ray_ao_qmc(ShadeInput *shi, float *shadfac)
/* 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]);
@@ -1535,7 +1628,9 @@ void ray_ao_spheresamp(ShadeInput *shi, float *shadfac)
int j= -1, tot, actual=0, skyadded=0, aocolor;
isec.faceorig= (RayFace*)shi->vlr;
+ isec.oborig= RAY_OBJECT_SET(&R, shi->obi);
isec.face_last= NULL;
+ isec.ob_last= 0;
isec.mode= (R.wrld.aomode & WO_AODIST)?RE_RAY_SHADOW_TRA:RE_RAY_SHADOW;
isec.lay= -1;
@@ -1662,7 +1757,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
float adapt_thresh = lar->adapt_thresh;
int max_samples = lar->ray_totsamp;
float pos[3];
- int do_soft=1;
+ int do_soft=1, full_osa=0;
colsq[0] = colsq[1] = colsq[2] = 0.0;
if(isec->mode==RE_RAY_SHADOW_TRA) {
@@ -1671,8 +1766,9 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
shadfac[3]= 1.0f;
if (lar->ray_totsamp < 2) do_soft = 0;
-
- if (shi->vlr->flag & R_FULL_OSA) {
+ 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 {
@@ -1697,12 +1793,13 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
while (samples < max_samples) {
isec->faceorig= (RayFace*)shi->vlr;
+ isec->oborig= RAY_OBJECT_SET(&R, shi->obi);
/* 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 && ((shi->vlr->flag & R_FULL_OSA) == 0)) {
+ 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];
@@ -1833,6 +1930,7 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, floa
}
isec->faceorig= (RayFace*)shi->vlr;
+ isec->oborig= RAY_OBJECT_SET(&R, shi->obi);
vec[0]= jitlamp[0];
vec[1]= jitlamp[1];
@@ -1889,10 +1987,14 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
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)
+ if(shi->depth==0) {
isec.face_last= (RayFace*)lar->vlr_last[shi->thread];
- else
+ isec.ob_last= RAY_OBJECT_SET(&R, lar->obi_last[shi->thread]);
+ }
+ else {
isec.face_last= NULL;
+ isec.ob_last= 0;
+ }
if(lar->type==LA_SUN || lar->type==LA_HEMI) {
maxsize= RE_ray_tree_max_size(R.raytree);
@@ -1912,6 +2014,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
if(lar->ray_totsamp<2) {
isec.faceorig= (RayFace*)shi->vlr;
+ isec.oborig= RAY_OBJECT_SET(&R, shi->obi);
shadfac[3]= 1.0f; // 1.0=full light
/* set up isec vec */
@@ -1934,8 +2037,10 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
}
/* for first hit optim, set last interesected shadow face */
- if(shi->depth==0)
+ if(shi->depth==0) {
lar->vlr_last[shi->thread]= (VlakRen*)isec.face_last;
+ lar->obi_last[shi->thread]= RAY_OBJECT_GET(&R, isec.ob_last);
+ }
}
@@ -1961,6 +2066,7 @@ void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co)
}
isec.faceorig= (RayFace*)shi->vlr;
+ isec.oborig= RAY_OBJECT_SET(&R, shi->obi);
/* set up isec vec */
VECCOPY(isec.start, shi->co);
diff --git a/source/blender/render/intern/source/raytrace.c b/source/blender/render/intern/source/raytrace.c
index f86032b5d68..d18e22c3bfb 100644
--- a/source/blender/render/intern/source/raytrace.c
+++ b/source/blender/render/intern/source/raytrace.c
@@ -61,6 +61,7 @@ typedef struct OcVal
typedef struct Node
{
struct RayFace *v[8];
+ int ob[8];
struct OcVal ov[8];
struct Node *next;
} Node;
@@ -76,6 +77,8 @@ typedef struct Octree {
char *ocface; /* during building only */
RayCoordsFunc coordsfunc;
RayCheckFunc checkfunc;
+ RayObjectTransformFunc transformfunc;
+ void *userdata;
} Octree;
/* ******** globals ***************** */
@@ -230,7 +233,7 @@ static int face_in_node(RayFace *face, short x, short y, short z, float rtf[][3]
return 0;
}
-static void ocwrite(Octree *oc, RayFace *face, int quad, short x, short y, short z, float rtf[][3])
+static void ocwrite(Octree *oc, int ob, RayFace *face, int quad, short x, short y, short z, float rtf[][3])
{
Branch *br;
Node *no;
@@ -281,6 +284,7 @@ static void ocwrite(Octree *oc, RayFace *face, int quad, short x, short y, short
}
no->v[a]= face;
+ no->ob[a]= ob;
if(quad)
calc_ocval_face(rtf[0], rtf[1], rtf[2], rtf[3], x>>2, y>>1, z, &no->ov[a]);
@@ -435,7 +439,7 @@ void RE_ray_tree_free(RayTree *tree)
MEM_freeN(oc);
}
-RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max, RayCoordsFunc coordsfunc, RayCheckFunc checkfunc)
+RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max, RayCoordsFunc coordsfunc, RayCheckFunc checkfunc, RayObjectTransformFunc transformfunc, void *userdata)
{
Octree *oc;
float t00, t01, t02;
@@ -447,6 +451,8 @@ RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max, RayC
oc->coordsfunc= coordsfunc;
oc->checkfunc= checkfunc;
+ oc->transformfunc= transformfunc;
+ oc->userdata= userdata;
/* only for debug info */
raycount=0;
@@ -486,10 +492,11 @@ RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max, RayC
return (RayTree*)oc;
}
-void RE_ray_tree_add_face(RayTree *tree, RayFace *face)
+void RE_ray_tree_add_face(RayTree *tree, int ob, RayFace *face)
{
Octree *oc = (Octree*)tree;
float *v1, *v2, *v3, *v4, ocfac[3], rtf[4][3];
+ float co1[3], co2[3], co3[3], co4[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;
@@ -503,16 +510,34 @@ void RE_ray_tree_add_face(RayTree *tree, RayFace *face)
ocmax= ocmin+3;
oc->coordsfunc(face, &v1, &v2, &v3, &v4);
+
+ VECCOPY(co1, v1);
+ VECCOPY(co2, v2);
+ VECCOPY(co3, v3);
+ if(v4)
+ VECCOPY(co4, v4);
+
+ if(ob >= RE_RAY_TRANSFORM_OFFS) {
+ float (*mat)[4]= (float(*)[4])oc->transformfunc(oc->userdata, ob);
+
+ if(mat) {
+ Mat4MulVecfl(mat, co1);
+ Mat4MulVecfl(mat, co2);
+ Mat4MulVecfl(mat, co3);
+ if(v4)
+ Mat4MulVecfl(mat, co4);
+ }
+ }
for(c=0;c<3;c++) {
- rtf[0][c]= (v1[c]-oc->min[c])*ocfac[c] ;
+ rtf[0][c]= (co1[c]-oc->min[c])*ocfac[c] ;
rts[0][c]= (short)rtf[0][c];
- rtf[1][c]= (v2[c]-oc->min[c])*ocfac[c] ;
+ rtf[1][c]= (co2[c]-oc->min[c])*ocfac[c] ;
rts[1][c]= (short)rtf[1][c];
- rtf[2][c]= (v3[c]-oc->min[c])*ocfac[c] ;
+ rtf[2][c]= (co3[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] ;
+ rtf[3][c]= (co4[c]-oc->min[c])*ocfac[c] ;
rts[3][c]= (short)rtf[3][c];
}
}
@@ -535,7 +560,7 @@ void RE_ray_tree_add_face(RayTree *tree, RayFace *face)
}
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);
+ ocwrite(oc, ob, face, (v4 != NULL), ocmin[0], ocmin[1], ocmin[2], rtf);
}
else {
@@ -574,7 +599,7 @@ void RE_ray_tree_add_face(RayTree *tree, RayFace *face)
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);
+ ocwrite(oc, ob, face, (v4 != NULL), x,y,z, rtf);
}
}
}
@@ -611,9 +636,9 @@ void RE_ray_tree_done(RayTree *tree)
/* ************ 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)
+static int intersection2(RayFace *face, int ob, RayObjectTransformFunc transformfunc, RayCoordsFunc coordsfunc, void *userdata, float r0, float r1, float r2, float rx1, float ry1, float rz1)
{
- float *v1, *v2, *v3, *v4;
+ float *v1, *v2, *v3, *v4, co1[3], co2[3], co3[3], co4[3];
float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22;
float m0, m1, m2, divdet, det, det1;
float u1, v, u2;
@@ -623,17 +648,35 @@ static int intersection2(RayFace *face, RayCoordsFunc coordsfunc, float r0, floa
/* happens for baking with non existing face */
if(v1==NULL)
return 1;
-
- if (v4) {
+
+ if(v4) {
SWAP(float*, v3, v4);
}
+
+ VECCOPY(co1, v1);
+ VECCOPY(co2, v2);
+ VECCOPY(co3, v3);
+ if(v4)
+ VECCOPY(co4, v4);
+
+ if(ob >= RE_RAY_TRANSFORM_OFFS) {
+ float (*mat)[4]= (float(*)[4])transformfunc(userdata, ob);
+
+ if(mat) {
+ Mat4MulVecfl(mat, co1);
+ Mat4MulVecfl(mat, co2);
+ Mat4MulVecfl(mat, co3);
+ if(v4)
+ Mat4MulVecfl(mat, co4);
+ }
+ }
- 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];
+ t00= co3[0]-co1[0];
+ t01= co3[1]-co1[1];
+ t02= co3[2]-co1[2];
+ t10= co3[0]-co2[0];
+ t11= co3[1]-co2[1];
+ t12= co3[2]-co2[2];
x0= t11*r2-t12*r1;
x1= t12*r0-t10*r2;
@@ -641,9 +684,9 @@ static int intersection2(RayFace *face, RayCoordsFunc coordsfunc, float r0, floa
divdet= t00*x0+t01*x1+t02*x2;
- m0= rx1-v3[0];
- m1= ry1-v3[1];
- m2= rz1-v3[2];
+ m0= rx1-co3[0];
+ m1= ry1-co3[1];
+ m2= rz1-co3[2];
det1= m0*x0+m1*x1+m2*x2;
if(divdet!=0.0f) {
@@ -663,9 +706,9 @@ static int intersection2(RayFace *face, RayCoordsFunc coordsfunc, float r0, floa
if(v4) {
- t20= v3[0]-v4[0];
- t21= v3[1]-v4[1];
- t22= v3[2]-v4[2];
+ t20= co3[0]-co4[0];
+ t21= co3[1]-co4[1];
+ t22= co3[2]-co4[2];
divdet= t20*x0+t21*x1+t22*x2;
if(divdet!=0.0f) {
@@ -752,10 +795,11 @@ static int intersection_strand(Isect *is)
#endif
/* ray - triangle or quad intersection */
-int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
+int RE_ray_face_intersection(Isect *is, RayObjectTransformFunc transformfunc, RayCoordsFunc coordsfunc)
{
RayFace *face= is->face;
- float *v1,*v2,*v3,*v4;
+ int ob= is->ob;
+ float *v1,*v2,*v3,*v4,co1[3],co2[3],co3[3],co4[3];
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;
@@ -767,16 +811,34 @@ int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
coordsfunc(face, &v1, &v2, &v3, &v4);
- if (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];
+ VECCOPY(co1, v1);
+ VECCOPY(co2, v2);
+ VECCOPY(co3, v3);
+ if(v4)
+ VECCOPY(co4, v4);
+
+ if(ob) {
+ float (*mat)[4]= (float(*)[4])transformfunc(is->userdata, ob);
+
+ if(mat) {
+ Mat4MulVecfl(mat, co1);
+ Mat4MulVecfl(mat, co2);
+ Mat4MulVecfl(mat, co3);
+ if(v4)
+ Mat4MulVecfl(mat, co4);
+ }
+ }
+
+ t00= co3[0]-co1[0];
+ t01= co3[1]-co1[1];
+ t02= co3[2]-co1[2];
+ t10= co3[0]-co2[0];
+ t11= co3[1]-co2[1];
+ t12= co3[2]-co2[2];
r0= is->vec[0];
r1= is->vec[1];
@@ -788,9 +850,9 @@ int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
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];
+ m0= is->start[0]-co3[0];
+ m1= is->start[1]-co3[1];
+ m2= is->start[2]-co3[2];
det1= m0*x0+m1*x1+m2*x2;
if(divdet!=0.0f) {
@@ -821,9 +883,9 @@ int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
if(ok==0 && v4) {
- t20= v3[0]-v4[0];
- t21= v3[1]-v4[1];
- t22= v3[2]-v4[2];
+ t20= co3[0]-co4[0];
+ t21= co3[1]-co4[1];
+ t22= co3[2]-co4[2];
divdet= t20*x0+t21*x1+t22*x2;
if(divdet!=0.0f) {
@@ -874,11 +936,13 @@ int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
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(ob == is->oborig) {
+ 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
@@ -886,8 +950,9 @@ int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
the intersection is invalid, 0 */
if(is->facecontr==NULL) {
+ is->obcontr= is->oborig;
is->facecontr= face;
- is->faceisect= intersection2(face, coordsfunc, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]);
+ is->faceisect= intersection2(face, is->oborig, transformfunc, coordsfunc, is->userdata, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]);
}
if(is->faceisect) return 1;
@@ -902,9 +967,10 @@ int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
}
/* check all faces in this node */
-static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval)
+static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval, RayCheckFunc checkfunc)
{
RayFace *face;
+ int ob;
short nr=0;
OcVal *ov;
@@ -912,18 +978,21 @@ static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval)
if(is->mode==RE_RAY_SHADOW) {
face= no->v[0];
+ ob= no->ob[0];
while(face) {
- if(is->faceorig != face) {
+ if(!(is->faceorig == face && is->oborig == ob)) {
- if(oc->checkfunc(is, face)) {
+ if(checkfunc(is, ob, face)) {
ov= no->ov+nr;
if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
//accepted++;
+ is->ob= ob;
is->face= face;
- if(RE_ray_face_intersection(is, oc->coordsfunc)) {
+ if(RE_ray_face_intersection(is, oc->transformfunc, oc->coordsfunc)) {
+ is->ob_last= ob;
is->face_last= face;
return 1;
}
@@ -939,6 +1008,7 @@ static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval)
nr=0;
}
face= no->v[nr];
+ ob= no->ob[nr];
}
}
else { /* else mirror or glass or shadowtra, return closest face */
@@ -949,16 +1019,18 @@ static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval)
isect= *is; /* copy for sorting */
face= no->v[0];
+ ob= no->ob[0];
while(face) {
- if(is->faceorig != face) {
- if(oc->checkfunc(is, face)) {
+ if(!(is->faceorig == face && is->oborig == ob)) {
+ if(checkfunc(is, ob, face)) {
ov= no->ov+nr;
if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
//accepted++;
+ isect.ob= ob;
isect.face= face;
- if(RE_ray_face_intersection(&isect, oc->coordsfunc)) {
+ if(RE_ray_face_intersection(&isect, oc->transformfunc, oc->coordsfunc)) {
if(isect.labda<is->labda) *is= isect;
found= 1;
}
@@ -974,6 +1046,7 @@ static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval)
nr=0;
}
face= no->v[nr];
+ ob= no->ob[nr];
}
return found;
@@ -1097,9 +1170,16 @@ static int do_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, i
*/
+int RE_ray_tree_intersect(RayTree *tree, Isect *is)
+{
+ Octree *oc= (Octree*)tree;
+
+ return RE_ray_tree_intersect_check(tree, is, oc->checkfunc);
+}
+
/* return 1: found valid intersection */
/* starts with is->faceorig */
-int RE_ray_tree_intersect(RayTree *tree, Isect *is)
+int RE_ray_tree_intersect_check(RayTree *tree, Isect *is, RayCheckFunc checkfunc)
{
Octree *oc= (Octree*)tree;
Node *no;
@@ -1116,17 +1196,20 @@ int RE_ray_tree_intersect(RayTree *tree, Isect *is)
/* do this before intersect calls */
is->facecontr= NULL; /* to check shared edge */
+ is->obcontr= 0;
is->faceisect= is->isect= 0; /* shared edge, quad half flag */
+ is->userdata= oc->userdata;
/* 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)) {
+ if(is->face_last!=NULL && !(is->face_last==is->faceorig && is->ob_last==is->oborig)) {
+ if(checkfunc(is, is->ob_last, is->face_last)) {
+ is->ob= is->ob_last;
is->face= is->face_last;
VECSUB(is->vec, is->end, is->start);
- if(RE_ray_face_intersection(is, oc->coordsfunc)) return 1;
+ if(RE_ray_face_intersection(is, oc->transformfunc, oc->coordsfunc)) return 1;
}
}
}
@@ -1193,7 +1276,7 @@ int RE_ray_tree_intersect(RayTree *tree, Isect *is)
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;
+ if( testnode(oc, is, no, ocval, checkfunc) ) return 1;
}
}
else {
@@ -1272,7 +1355,7 @@ int RE_ray_tree_intersect(RayTree *tree, Isect *is)
calc_ocval_ray(&ocval, (float)xo, (float)yo, (float)zo, vec1, vec2);
is->ddalabda= ddalabda;
- if( testnode(oc, is, no, ocval) ) return 1;
+ if( testnode(oc, is, no, ocval, checkfunc) ) return 1;
}
labdao= ddalabda;
@@ -1342,6 +1425,7 @@ int RE_ray_tree_intersect(RayTree *tree, Isect *is)
}
/* reached end, no intersections found */
+ is->ob_last= 0;
is->face_last= NULL;
return 0;
}
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index b12d6094f2b..a87824e23af 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -60,12 +60,14 @@
#include "renderpipeline.h"
#include "render_types.h"
#include "renderdatabase.h"
+#include "occlusion.h"
#include "pixelblending.h"
#include "pixelshading.h"
#include "shadbuf.h"
#include "shading.h"
#include "sss.h"
#include "zbuf.h"
+#include "RE_raytrace.h"
#include "PIL_time.h"
@@ -213,7 +215,7 @@ static void halo_pixelstruct(HaloRen *har, float *rb, float dist, float xn, floa
static void halo_tile(RenderPart *pa, float *pass, unsigned int lay)
{
- HaloRen *har = NULL;
+ HaloRen *har;
rcti disprect= pa->disprect, testrect= pa->disprect;
float dist, xsq, ysq, xn, yn, *rb;
float col[4];
@@ -230,9 +232,7 @@ static void halo_tile(RenderPart *pa, float *pass, unsigned int lay)
}
for(a=0; a<R.tothalo; a++) {
- if((a & 255)==0)
- har= R.bloha[a>>8];
- else har++;
+ har= R.sortedhalos[a];
/* layer test, clip halo with y */
if((har->lay & lay)==0);
@@ -297,7 +297,7 @@ static void lamphalo_tile(RenderPart *pa, RenderLayer *rl)
long *rd= pa->rectdaps;
int x, y, *rz= pa->rectz;
- shade_input_initialize(&shi, pa, rl, 0);
+ shade_input_initialize(&shi, pa, rl, 0); /* this zero's ShadeInput for us */
for(y=pa->disprect.ymin; y<pa->disprect.ymax; y++) {
for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, rz++, pass+=4) {
@@ -348,12 +348,19 @@ static void lamphalo_tile(RenderPart *pa, RenderLayer *rl)
static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset, ShadeInput *shi, ShadeResult *shr)
{
RenderPass *rpass;
+
+ /* combined rgb */
+ add_filt_fmask(curmask, shr->combined, rl->rectf + 4*offset, rectx);
for(rpass= rl->passes.first; rpass; rpass= rpass->next) {
float *fp, *col= NULL;
int pixsize= 3;
switch(rpass->passtype) {
+ case SCE_PASS_Z:
+ fp= rpass->rect + offset;
+ *fp= shr->z;
+ break;
case SCE_PASS_RGBA:
col= shr->col;
pixsize= 4;
@@ -387,8 +394,8 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset,
if(shi->totuv) {
float mult= (float)count_mask(curmask)/(float)R.osa;
fp= rpass->rect + 3*offset;
- fp[0]+= mult*(0.5f + 0.5f*shi->uv[0].uv[0]);
- fp[1]+= mult*(0.5f + 0.5f*shi->uv[0].uv[1]);
+ fp[0]+= mult*(0.5f + 0.5f*shi->uv[shi->actuv].uv[0]);
+ fp[1]+= mult*(0.5f + 0.5f*shi->uv[shi->actuv].uv[1]);
fp[2]+= mult;
}
break;
@@ -397,9 +404,15 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset,
if(shi->vlr) {
fp= rpass->rect + offset;
if(*fp==0.0f)
- *fp= (float)shi->vlr->ob->index;
+ *fp= (float)shi->obr->ob->index;
}
break;
+ case SCE_PASS_MIST:
+ /* */
+ col= &shr->mist;
+ pixsize= 1;
+ break;
+
case SCE_PASS_VECTOR:
{
/* add minimum speed in pixel, no filter */
@@ -426,12 +439,20 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset,
static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult *shr)
{
RenderPass *rpass;
+ float *fp;
+
+ fp= rl->rectf + 4*offset;
+ QUATCOPY(fp, shr->combined);
for(rpass= rl->passes.first; rpass; rpass= rpass->next) {
- float *fp, *col= NULL, uvcol[3];
+ float *col= NULL, uvcol[3];
int a, pixsize= 3;
switch(rpass->passtype) {
+ case SCE_PASS_Z:
+ fp= rpass->rect + offset;
+ *fp= shr->z;
+ break;
case SCE_PASS_RGBA:
col= shr->col;
pixsize= 4;
@@ -462,8 +483,8 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult
break;
case SCE_PASS_UV:
if(shi->totuv) {
- uvcol[0]= 0.5f + 0.5f*shi->uv[0].uv[0];
- uvcol[1]= 0.5f + 0.5f*shi->uv[0].uv[1];
+ uvcol[0]= 0.5f + 0.5f*shi->uv[shi->actuv].uv[0];
+ uvcol[1]= 0.5f + 0.5f*shi->uv[shi->actuv].uv[1];
uvcol[2]= 1.0f;
col= uvcol;
}
@@ -475,9 +496,13 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult
case SCE_PASS_INDEXOB:
if(shi->vlr) {
fp= rpass->rect + offset;
- *fp= (float)shi->vlr->ob->index;
+ *fp= (float)shi->obr->ob->index;
}
break;
+ case SCE_PASS_MIST:
+ fp= rpass->rect + offset;
+ *fp= shr->mist;
+ break;
}
if(col) {
fp= rpass->rect + pixsize*offset;
@@ -487,26 +512,60 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult
}
}
+int get_sample_layers(RenderPart *pa, RenderLayer *rl, RenderLayer **rlpp)
+{
+
+ if(pa->fullresult.first) {
+ int sample, nr= BLI_findindex(&pa->result->layers, rl);
+
+ for(sample=0; sample<R.osa; sample++) {
+ RenderResult *rr= BLI_findlink(&pa->fullresult, sample);
+
+ rlpp[sample]= BLI_findlink(&rr->layers, nr);
+ }
+ return R.osa;
+ }
+ else {
+ rlpp[0]= rl;
+ return 1;
+ }
+}
+
+
/* only do sky, is default in the solid layer (shade_tile) btw */
-static void sky_tile(RenderPart *pa, float *pass)
+static void sky_tile(RenderPart *pa, RenderLayer *rl)
{
- float col[4];
- int x, y;
+ RenderLayer *rlpp[RE_MAX_OSA];
+ int x, y, od=0, totsample;
if(R.r.alphamode!=R_ADDSKY)
return;
+ totsample= get_sample_layers(pa, rl, rlpp);
+
for(y=pa->disprect.ymin; y<pa->disprect.ymax; y++) {
- for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, pass+=4) {
- if(pass[3]<1.0f) {
- if(pass[3]==0.0f)
- shadeSkyPixel(pass, x, y);
- else {
- shadeSkyPixel(col, x, y);
- addAlphaOverFloat(col, pass);
- QUATCOPY(pass, col);
+ for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, od+=4) {
+ float col[4];
+ int sample, done= 0;
+
+ for(sample= 0; sample<totsample; sample++) {
+ float *pass= rlpp[sample]->rectf + od;
+
+ if(pass[3]<1.0f) {
+
+ if(done==0) {
+ shadeSkyPixel(col, x, y);
+ done= 1;
+ }
+
+ if(pass[3]==0.0f) {
+ QUATCOPY(pass, col);
+ }
+ else {
+ addAlphaUnderFloat(pass, col);
+ }
}
- }
+ }
}
if(y&1)
@@ -518,10 +577,9 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
{
RenderResult *rr= pa->result;
ShadeSample ssamp;
- float *fcol, *rf, *rectf= rl->rectf;
long *rd, *rectdaps= pa->rectdaps;
int samp;
- int x, y, seed, crop=0, offs=0, od, addpassflag;
+ int x, y, seed, crop=0, offs=0, od;
if(R.test_break()) return;
@@ -534,12 +592,14 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
/* general shader info, passes */
shade_sample_initialize(&ssamp, pa, rl);
- addpassflag= rl->passflag & ~(SCE_PASS_Z|SCE_PASS_COMBINED);
-
+
+ /* occlusion caching */
+ if(R.occlusiontree)
+ cache_occ_samples(&R, pa, &ssamp);
+
/* filtered render, for now we assume only 1 filter size */
if(pa->crop) {
crop= 1;
- rectf+= 4*(pa->rectx + 1);
rectdaps+= pa->rectx + 1;
offs= pa->rectx + 1;
}
@@ -550,28 +610,35 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
rr->renlay= rl;
for(y=pa->disprect.ymin+crop; y<pa->disprect.ymax-crop; y++, rr->renrect.ymax++) {
- rf= rectf;
rd= rectdaps;
od= offs;
- for(x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, rd++, rf+=4, od++) {
+ for(x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, rd++, od++) {
BLI_thread_srandom(pa->thread, seed++);
if(*rd) {
if(shade_samples(&ssamp, (PixStr *)(*rd), x, y)) {
- for(samp=0; samp<ssamp.tot; samp++) {
-
- fcol= ssamp.shr[samp].combined;
- add_filt_fmask(ssamp.shi[samp].mask, fcol, rf, pa->rectx);
-
- if(addpassflag)
+
+ /* multisample buffers or filtered mask filling? */
+ if(pa->fullresult.first) {
+ int a;
+ for(samp=0; samp<ssamp.tot; samp++) {
+ int smask= ssamp.shi[samp].mask;
+ for(a=0; a<R.osa; a++) {
+ int mask= 1<<a;
+ if(smask & mask)
+ add_passes(ssamp.rlpp[a], od, &ssamp.shi[samp], &ssamp.shr[samp]);
+ }
+ }
+ }
+ else {
+ for(samp=0; samp<ssamp.tot; samp++)
add_filt_passes(rl, ssamp.shi[samp].mask, pa->rectx, od, &ssamp.shi[samp], &ssamp.shr[samp]);
}
}
}
}
- rectf+= 4*pa->rectx;
rectdaps+= pa->rectx;
offs+= pa->rectx;
@@ -583,6 +650,9 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
if(R.r.mode & R_SHADOW)
ISB_free(pa);
+
+ if(R.occlusiontree)
+ free_occ_samples(&R, pa);
}
/* ************* pixel struct ******** */
@@ -614,7 +684,7 @@ static void freeps(ListBase *lb)
lb->first= lb->last= NULL;
}
-static void addps(ListBase *lb, long *rd, int facenr, int z, unsigned short mask)
+static void addps(ListBase *lb, long *rd, int obi, int facenr, int z, unsigned short mask)
{
PixStrMain *psm;
PixStr *ps, *last= NULL;
@@ -623,7 +693,7 @@ static void addps(ListBase *lb, long *rd, int facenr, int z, unsigned short mask
ps= (PixStr *)(*rd);
while(ps) {
- if( ps->facenr == facenr ) {
+ if( ps->obi == obi && ps->facenr == facenr ) {
ps->mask |= mask;
return;
}
@@ -644,30 +714,13 @@ static void addps(ListBase *lb, long *rd, int facenr, int z, unsigned short mask
else *rd= (long)ps;
ps->next= NULL;
+ ps->obi= obi;
ps->facenr= facenr;
ps->z= z;
ps->mask = mask;
ps->shadfac= 0;
}
-static void make_pixelstructs(RenderPart *pa, ListBase *lb)
-{
- long *rd= pa->rectdaps;
- int *rp= pa->rectp;
- int *rz= pa->rectz;
- int x, y;
- int mask= 1<<pa->sample;
-
- for(y=0; y<pa->recty; y++) {
- for(x=0; x<pa->rectx; x++, rd++, rp++) {
- if(*rp) {
- addps(lb, rd, *rp, *(rz+x), mask);
- }
- }
- rz+= pa->rectx;
- }
-}
-
static void edge_enhance_add(RenderPart *pa, float *rectf, float *arect)
{
float addcol[4];
@@ -703,7 +756,7 @@ static void convert_to_key_alpha(RenderPart *pa, float *rectf)
}
/* adds only alpha values */
-static void edge_enhance_tile(RenderPart *pa, float *rectf)
+void edge_enhance_tile(RenderPart *pa, float *rectf)
{
/* use zbuffer to define edges, add it to the image */
int y, x, col, *rz, *rz1, *rz2, *rz3;
@@ -834,6 +887,36 @@ static void addAlphaOverFloatMask(float *dest, float *source, unsigned short dma
dest[3]= (mul*dest[3]) + source[3];
}
+typedef struct ZbufSolidData {
+ RenderLayer *rl;
+ ListBase *psmlist;
+ float *edgerect;
+} ZbufSolidData;
+
+void make_pixelstructs(RenderPart *pa, ZSpan *zspan, int sample, void *data)
+{
+ ZbufSolidData *sdata= (ZbufSolidData*)data;
+ ListBase *lb= sdata->psmlist;
+ long *rd= pa->rectdaps;
+ int *ro= zspan->recto;
+ int *rp= zspan->rectp;
+ int *rz= zspan->rectz;
+ int x, y;
+ int mask= 1<<sample;
+
+ for(y=0; y<pa->recty; y++) {
+ for(x=0; x<pa->rectx; x++, rd++, rp++, ro++) {
+ if(*rp) {
+ addps(lb, rd, *ro, *rp, *(rz+x), mask);
+ }
+ }
+ rz+= pa->rectx;
+ }
+
+ if(sdata->rl->layflag & SCE_LAY_EDGE)
+ if(R.r.mode & R_EDGE)
+ edge_enhance_tile(pa, sdata->edgerect);
+}
/* main call for shading Delta Accum, for OSA */
/* supposed to be fully threadable! */
@@ -844,10 +927,9 @@ void zbufshadeDA_tile(RenderPart *pa)
ListBase psmlist= {NULL, NULL};
float *edgerect= NULL;
- set_part_zbuf_clipflag(pa);
-
/* allocate the necessary buffers */
/* zbuffer inits these rects */
+ pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
@@ -862,14 +944,13 @@ void zbufshadeDA_tile(RenderPart *pa)
edgerect= MEM_callocN(sizeof(float)*pa->rectx*pa->recty, "rectedge");
/* always fill visibility */
- for(pa->sample=0; pa->sample<R.osa; pa->sample++) {
- zbuffer_solid(pa, rl->lay, rl->layflag);
- make_pixelstructs(pa, &psmlist);
-
- if(rl->layflag & SCE_LAY_EDGE)
- if(R.r.mode & R_EDGE)
- edge_enhance_tile(pa, edgerect);
-
+ for(pa->sample=0; pa->sample<R.osa; pa->sample+=4) {
+ ZbufSolidData sdata;
+
+ sdata.rl= rl;
+ sdata.psmlist= &psmlist;
+ sdata.edgerect= edgerect;
+ zbuffer_solid(pa, rl, make_pixelstructs, &sdata);
if(R.test_break()) break;
}
@@ -886,60 +967,63 @@ void zbufshadeDA_tile(RenderPart *pa)
if(R.flag & R_HALO)
if(rl->layflag & SCE_LAY_HALO)
halo_tile(pa, rl->rectf, rl->lay);
-
+
/* transp layer */
- if(R.flag & R_ZTRA) {
- if(rl->layflag & SCE_LAY_ZTRA) {
- unsigned short *ztramask, *solidmask= NULL; /* 16 bits, MAX_OSA */
-
- /* allocate, but not free here, for asynchronous display of this rect in main thread */
- rl->acolrect= MEM_callocN(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer");
-
- /* swap for live updates, and it is used in zbuf.c!!! */
- SWAP(float *, rl->acolrect, rl->rectf);
- ztramask= zbuffer_transp_shade(pa, rl, rl->rectf);
- SWAP(float *, rl->acolrect, rl->rectf);
-
- /* zbuffer transp only returns ztramask if there's solid rendered */
- if(ztramask)
- solidmask= make_solid_mask(pa);
-
- if(ztramask && solidmask) {
- unsigned short *sps= solidmask, *spz= ztramask;
- unsigned short fullmask= (1<<R.osa)-1;
- float *fcol= rl->rectf; float *acol= rl->acolrect;
- int x;
+ if(R.flag & R_ZTRA || R.totstrand) {
+ if(rl->layflag & (SCE_LAY_ZTRA|SCE_LAY_STRAND)) {
+ if(pa->fullresult.first) {
+ zbuffer_transp_shade(pa, rl, rl->rectf, &psmlist);
+ }
+ else {
+ unsigned short *ztramask, *solidmask= NULL; /* 16 bits, MAX_OSA */
- for(x=pa->rectx*pa->recty; x>0; x--, acol+=4, fcol+=4, sps++, spz++) {
- if(*sps == fullmask)
- addAlphaOverFloat(fcol, acol);
- else
- addAlphaOverFloatMask(fcol, acol, *sps, *spz);
+ /* allocate, but not free here, for asynchronous display of this rect in main thread */
+ rl->acolrect= MEM_callocN(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer");
+
+ /* swap for live updates, and it is used in zbuf.c!!! */
+ SWAP(float *, rl->acolrect, rl->rectf);
+ ztramask= zbuffer_transp_shade(pa, rl, rl->rectf, &psmlist);
+ SWAP(float *, rl->acolrect, rl->rectf);
+
+ /* zbuffer transp only returns ztramask if there's solid rendered */
+ if(ztramask)
+ solidmask= make_solid_mask(pa);
+
+ if(ztramask && solidmask) {
+ unsigned short *sps= solidmask, *spz= ztramask;
+ unsigned short fullmask= (1<<R.osa)-1;
+ float *fcol= rl->rectf; float *acol= rl->acolrect;
+ int x;
+
+ for(x=pa->rectx*pa->recty; x>0; x--, acol+=4, fcol+=4, sps++, spz++) {
+ if(*sps == fullmask)
+ addAlphaOverFloat(fcol, acol);
+ else
+ addAlphaOverFloatMask(fcol, acol, *sps, *spz);
+ }
}
- }
- else {
- float *fcol= rl->rectf; float *acol= rl->acolrect;
- int x;
- for(x=pa->rectx*pa->recty; x>0; x--, acol+=4, fcol+=4) {
- addAlphaOverFloat(fcol, acol);
+ else {
+ float *fcol= rl->rectf; float *acol= rl->acolrect;
+ int x;
+ for(x=pa->rectx*pa->recty; x>0; x--, acol+=4, fcol+=4) {
+ addAlphaOverFloat(fcol, acol);
+ }
}
+ if(solidmask) MEM_freeN(solidmask);
+ if(ztramask) MEM_freeN(ztramask);
}
- if(solidmask) MEM_freeN(solidmask);
- if(ztramask) MEM_freeN(ztramask);
}
}
+
/* sky before edge */
if(rl->layflag & SCE_LAY_SKY)
- sky_tile(pa, rl->rectf);
+ sky_tile(pa, rl);
/* extra layers */
if(rl->layflag & SCE_LAY_EDGE)
if(R.r.mode & R_EDGE)
edge_enhance_add(pa, rl->rectf, edgerect);
- if(rl->passflag & SCE_PASS_Z)
- convert_zbuf_to_distbuf(pa, rl);
-
if(rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
@@ -956,9 +1040,9 @@ void zbufshadeDA_tile(RenderPart *pa)
}
/* free all */
+ MEM_freeN(pa->recto); pa->recto= NULL;
MEM_freeN(pa->rectp); pa->rectp= NULL;
MEM_freeN(pa->rectz); pa->rectz= NULL;
- MEM_freeN(pa->clipflag); pa->clipflag= NULL;
/* display active layer */
rr->renrect.ymin=rr->renrect.ymax= 0;
@@ -977,15 +1061,13 @@ void zbufshade_tile(RenderPart *pa)
RenderLayer *rl;
PixStr ps;
float *edgerect= NULL;
- int addpassflag;
/* fake pixel struct, to comply to osa render */
ps.next= NULL;
ps.mask= 0xFFFF;
- set_part_zbuf_clipflag(pa);
-
/* zbuffer code clears/inits rects */
+ pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
@@ -993,9 +1075,8 @@ void zbufshade_tile(RenderPart *pa)
/* general shader info, passes */
shade_sample_initialize(&ssamp, pa, rl);
- addpassflag= rl->passflag & ~(SCE_PASS_Z|SCE_PASS_COMBINED);
- zbuffer_solid(pa, rl->lay, rl->layflag);
+ zbuffer_solid(pa, rl, NULL, NULL);
if(!R.test_break()) { /* NOTE: this if() is not consistant */
@@ -1013,7 +1094,8 @@ void zbufshade_tile(RenderPart *pa)
if(rl->layflag & SCE_LAY_SOLID) {
float *fcol= rl->rectf;
- int x, y, *rp= pa->rectp, *rz= pa->rectz, offs=0, seed;
+ int *ro= pa->recto, *rp= pa->rectp, *rz= pa->rectz;
+ int x, y, offs=0, seed;
/* we set per pixel a fixed seed, for random AO and shadow samples */
seed= pa->rectx*pa->disprect.ymin;
@@ -1021,21 +1103,22 @@ void zbufshade_tile(RenderPart *pa)
/* irregular shadowb buffer creation */
if(R.r.mode & R_SHADOW)
ISB_create(pa, NULL);
+
+ if(R.occlusiontree)
+ cache_occ_samples(&R, pa, &ssamp);
for(y=pa->disprect.ymin; y<pa->disprect.ymax; y++, rr->renrect.ymax++) {
- for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, rz++, rp++, fcol+=4, offs++) {
+ for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, ro++, rz++, rp++, fcol+=4, offs++) {
/* per pixel fixed seed */
BLI_thread_srandom(pa->thread, seed++);
if(*rp) {
+ ps.obi= *ro;
ps.facenr= *rp;
ps.z= *rz;
if(shade_samples(&ssamp, &ps, x, y)) {
- QUATCOPY(fcol, ssamp.shr[0].combined);
-
- /* passes */
- if(addpassflag)
- add_passes(rl, offs, ssamp.shi, ssamp.shr);
+ /* combined and passes */
+ add_passes(rl, offs, ssamp.shi, ssamp.shr);
}
}
}
@@ -1043,6 +1126,9 @@ void zbufshade_tile(RenderPart *pa)
if(R.test_break()) break;
}
+ if(R.occlusiontree)
+ free_occ_samples(&R, pa);
+
if(R.r.mode & R_SHADOW)
ISB_free(pa);
}
@@ -1061,8 +1147,8 @@ void zbufshade_tile(RenderPart *pa)
if(rl->layflag & SCE_LAY_HALO)
halo_tile(pa, rl->rectf, rl->lay);
- if(R.flag & R_ZTRA) {
- if(rl->layflag & SCE_LAY_ZTRA) {
+ if(R.flag & R_ZTRA || R.totstrand) {
+ if(rl->layflag & (SCE_LAY_ZTRA|SCE_LAY_STRAND)) {
float *fcol, *acol;
int x;
@@ -1071,7 +1157,7 @@ void zbufshade_tile(RenderPart *pa)
/* swap for live updates */
SWAP(float *, rl->acolrect, rl->rectf);
- zbuffer_transp_shade(pa, rl, rl->rectf);
+ zbuffer_transp_shade(pa, rl, rl->rectf, NULL);
SWAP(float *, rl->acolrect, rl->rectf);
fcol= rl->rectf; acol= rl->acolrect;
@@ -1083,7 +1169,7 @@ void zbufshade_tile(RenderPart *pa)
/* sky before edge */
if(rl->layflag & SCE_LAY_SKY)
- sky_tile(pa, rl->rectf);
+ sky_tile(pa, rl);
if(!R.test_break()) {
if(rl->layflag & SCE_LAY_EDGE)
@@ -1091,9 +1177,6 @@ void zbufshade_tile(RenderPart *pa)
edge_enhance_add(pa, rl->rectf, edgerect);
}
- if(rl->passflag & SCE_PASS_Z)
- convert_zbuf_to_distbuf(pa, rl);
-
if(rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
@@ -1109,9 +1192,9 @@ void zbufshade_tile(RenderPart *pa)
rr->renrect.ymin=rr->renrect.ymax= 0;
rr->renlay= render_get_active_layer(&R, rr);
+ MEM_freeN(pa->recto); pa->recto= NULL;
MEM_freeN(pa->rectp); pa->rectp= NULL;
MEM_freeN(pa->rectz); pa->rectz= NULL;
- MEM_freeN(pa->clipflag); pa->clipflag= NULL;
}
/* SSS preprocess tile render, fully threadable */
@@ -1121,7 +1204,7 @@ typedef struct ZBufSSSHandle {
int totps;
} ZBufSSSHandle;
-static void addps_sss(void *cb_handle, int facenr, int x, int y, int z)
+static void addps_sss(void *cb_handle, int obi, int facenr, int x, int y, int z)
{
ZBufSSSHandle *handle = cb_handle;
RenderPart *pa= handle->pa;
@@ -1136,57 +1219,50 @@ static void addps_sss(void *cb_handle, int facenr, int x, int y, int z)
if(pa->rectall) {
long *rs= pa->rectall + pa->rectx*y + x;
- addps(&handle->psmlist, rs, facenr, z, 0);
+ addps(&handle->psmlist, rs, obi, facenr, z, 0);
handle->totps++;
}
if(pa->rectz) {
int *rz= pa->rectz + pa->rectx*y + x;
int *rp= pa->rectp + pa->rectx*y + x;
+ int *ro= pa->recto + pa->rectx*y + x;
if(z < *rz) {
if(*rp == 0)
handle->totps++;
*rz= z;
*rp= facenr;
+ *ro= obi;
}
}
if(pa->rectbackz) {
int *rz= pa->rectbackz + pa->rectx*y + x;
int *rp= pa->rectbackp + pa->rectx*y + x;
+ int *ro= pa->rectbacko + pa->rectx*y + x;
if(z >= *rz) {
if(*rp == 0)
handle->totps++;
*rz= z;
*rp= facenr;
+ *ro= obi;
}
}
}
-static void shade_sample_sss(ShadeSample *ssamp, Material *mat, VlakRen *vlr, int quad, float x, float y, float z, float *co, float *color, float *area)
+static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRen *obi, VlakRen *vlr, int quad, float x, float y, float z, float *co, float *color, float *area)
{
ShadeInput *shi= ssamp->shi;
ShadeResult shr;
float texfac, orthoarea, nor[3];
- /* normal flipping must be disabled to make back scattering work, so that
- backside faces actually face any lighting from the back */
- shi->puno= 0;
-
/* cache for shadow */
shi->samplenr++;
if(quad)
- shade_input_set_triangle_i(shi, vlr, 0, 2, 3);
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
else
- 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];
- }
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
/* center pixel */
x += 0.5f;
@@ -1209,11 +1285,19 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, VlakRen *vlr, in
*area= VecLength(shi->dxco)*VecLength(shi->dyco);
*area= MIN2(*area, 2.0f*orthoarea);
- shi->osatex= 0;
-
shade_input_set_uv(shi);
shade_input_set_normals(shi);
+ /* we don't want flipped normals, they screw up back scattering */
+ if(shi->flippednor)
+ shade_input_flip_normals(shi);
+
+ /* not a pretty solution, but fixes common cases */
+ if(shi->obr->ob && shi->obr->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)
@@ -1250,15 +1334,16 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, VlakRen *vlr, in
static void zbufshade_sss_free(RenderPart *pa)
{
- MEM_freeN(pa->clipflag); pa->clipflag= NULL;
#if 0
MEM_freeN(pa->rectall); pa->rectall= NULL;
freeps(&handle.psmlist);
#else
MEM_freeN(pa->rectz); pa->rectz= NULL;
MEM_freeN(pa->rectp); pa->rectp= NULL;
+ MEM_freeN(pa->recto); pa->recto= NULL;
MEM_freeN(pa->rectbackz); pa->rectbackz= NULL;
MEM_freeN(pa->rectbackp); pa->rectbackp= NULL;
+ MEM_freeN(pa->rectbacko); pa->rectbacko= NULL;
#endif
}
@@ -1268,20 +1353,18 @@ void zbufshade_sss_tile(RenderPart *pa)
ShadeSample ssamp;
ZBufSSSHandle handle;
RenderResult *rr= pa->result;
- RenderLayer *rl= rr->layers.first;
+ RenderLayer *rl;
VlakRen *vlr;
Material *mat= re->sss_mat;
- float (*co)[3], (*color)[3], *area, *fcol= rl->rectf;
+ float (*co)[3], (*color)[3], *area, *fcol;
int x, y, seed, quad, totpoint, display = !(re->r.scemode & R_PREVIEWBUTS);
- int *rz, *rp, *rbz, *rbp;
+ int *ro, *rz, *rp, *rbo, *rbz, *rbp, lay;
#if 0
PixStr *ps;
long *rs;
int z;
#endif
- set_part_zbuf_clipflag(pa);
-
/* setup pixelstr list and buffer for zbuffering */
handle.pa= pa;
handle.totps= 0;
@@ -1292,19 +1375,40 @@ void zbufshade_sss_tile(RenderPart *pa)
pa->rectall= MEM_callocN(sizeof(long)*pa->rectx*pa->recty+4, "rectall");
#else
+ pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
+ pa->rectbacko= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbacko");
pa->rectbackp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackp");
pa->rectbackz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackz");
#endif
+ /* setup shade sample with correct passes */
+ memset(&ssamp, 0, sizeof(ssamp));
+ shade_sample_initialize(&ssamp, pa, rr->layers.first);
+ ssamp.tot= 1;
+
+ for(rl=rr->layers.first; rl; rl=rl->next) {
+ ssamp.shi[0].lay |= rl->lay;
+ ssamp.shi[0].layflag |= rl->layflag;
+ ssamp.shi[0].passflag |= rl->passflag;
+ ssamp.shi[0].combinedflag |= ~rl->pass_xor;
+ }
+
+ rl= rr->layers.first;
+ ssamp.shi[0].passflag |= SCE_PASS_RGBA|SCE_PASS_COMBINED;
+ ssamp.shi[0].combinedflag &= ~(SCE_PASS_SPEC);
+ lay= ssamp.shi[0].lay;
+
/* create the pixelstrs to be used later */
- zbuffer_sss(pa, rl->lay, &handle, addps_sss);
+ zbuffer_sss(pa, lay, &handle, addps_sss);
if(handle.totps==0) {
zbufshade_sss_free(pa);
return;
}
+
+ fcol= rl->rectf;
co= MEM_mallocN(sizeof(float)*3*handle.totps, "SSSCo");
color= MEM_mallocN(sizeof(float)*3*handle.totps, "SSSColor");
@@ -1316,14 +1420,6 @@ void zbufshade_sss_tile(RenderPart *pa)
ISB_create(pa, NULL);
#endif
- /* setup shade sample with correct passes */
- memset(&ssamp, 0, sizeof(ssamp));
- shade_sample_initialize(&ssamp, pa, rl);
- ssamp.shi[0].passflag= SCE_PASS_DIFFUSE|SCE_PASS_AO|SCE_PASS_RADIO;
- ssamp.shi[0].passflag |= SCE_PASS_RGBA;
- ssamp.shi[0].combinedflag= ~(SCE_PASS_SPEC);
- ssamp.tot= 1;
-
if(display) {
/* initialize scanline updates for main thread */
rr->renrect.ymin= 0;
@@ -1336,8 +1432,10 @@ void zbufshade_sss_tile(RenderPart *pa)
#else
rz= pa->rectz;
rp= pa->rectp;
+ ro= pa->recto;
rbz= pa->rectbackz;
rbp= pa->rectbackp;
+ rbo= pa->rectbacko;
#endif
totpoint= 0;
@@ -1350,11 +1448,13 @@ void zbufshade_sss_tile(RenderPart *pa)
if(rs) {
/* for each sample in this pixel, shade it */
for(ps=(PixStr*)*rs; ps; ps=ps->next) {
- vlr= RE_findOrAddVlak(re, (ps->facenr-1) & RE_QUAD_MASK);
+ ObjectInstanceRen *obi= &re->objectinstance[ps->obi];
+ ObjectRen *obr= obi->obr;
+ vlr= RE_findOrAddVlak(obr, (ps->facenr-1) & RE_QUAD_MASK);
quad= (ps->facenr & RE_QUAD_OFFS);
z= ps->z;
- shade_sample_sss(&ssamp, mat, vlr, quad, x, y, z,
+ shade_sample_sss(&ssamp, mat, obi, vlr, quad, x, y, z,
co[totpoint], color[totpoint], &area[totpoint]);
totpoint++;
@@ -1368,11 +1468,14 @@ void zbufshade_sss_tile(RenderPart *pa)
#else
if(rp) {
if(*rp != 0) {
+ ObjectInstanceRen *obi= &re->objectinstance[*ro];
+ ObjectRen *obr= obi->obr;
+
/* shade front */
- vlr= RE_findOrAddVlak(re, (*rp-1) & RE_QUAD_MASK);
+ vlr= RE_findOrAddVlak(obr, (*rp-1) & RE_QUAD_MASK);
quad= ((*rp) & RE_QUAD_OFFS);
- shade_sample_sss(&ssamp, mat, vlr, quad, x, y, *rz,
+ shade_sample_sss(&ssamp, mat, obi, vlr, quad, x, y, *rz,
co[totpoint], color[totpoint], &area[totpoint]);
VECADD(fcol, fcol, color[totpoint]);
@@ -1380,16 +1483,19 @@ void zbufshade_sss_tile(RenderPart *pa)
totpoint++;
}
- rp++; rz++;
+ rp++; rz++; ro++;
}
if(rbp) {
- if(*rbp != 0 && *rbp != *(rp-1)) {
+ if(*rbp != 0 && !(*rbp == *(rp-1) && *rbo == *(ro-1))) {
+ ObjectInstanceRen *obi= &re->objectinstance[*rbo];
+ ObjectRen *obr= obi->obr;
+
/* shade back */
- vlr= RE_findOrAddVlak(re, (*rbp-1) & RE_QUAD_MASK);
+ vlr= RE_findOrAddVlak(obr, (*rbp-1) & RE_QUAD_MASK);
quad= ((*rbp) & RE_QUAD_OFFS);
- shade_sample_sss(&ssamp, mat, vlr, quad, x, y, *rbz,
+ shade_sample_sss(&ssamp, mat, obi, vlr, quad, x, y, *rbz,
co[totpoint], color[totpoint], &area[totpoint]);
/* to indicate this is a back sample */
@@ -1400,7 +1506,7 @@ void zbufshade_sss_tile(RenderPart *pa)
totpoint++;
}
- rbz++; rbp++;
+ rbz++; rbp++; rbo++;
}
#endif
}
@@ -1576,7 +1682,7 @@ void add_halo_flare(Render *re)
{
RenderResult *rr= re->result;
RenderLayer *rl;
- HaloRen *har = NULL;
+ HaloRen *har;
int a, mode, do_draw=0;
/* for now, we get the first renderlayer in list with halos set */
@@ -1590,11 +1696,10 @@ void add_halo_flare(Render *re)
mode= R.r.mode;
R.r.mode &= ~R_PANORAMA;
- project_renderdata(&R, projectverto, 0, 0);
+ project_renderdata(&R, projectverto, 0, 0, 0);
for(a=0; a<R.tothalo; a++) {
- if((a & 255)==0) har= R.bloha[a>>8];
- else har++;
+ har= R.sortedhalos[a];
if(har->flarec) {
do_draw= 1;
@@ -1617,6 +1722,8 @@ void add_halo_flare(Render *re)
void RE_shade_external(Render *re, ShadeInput *shi, ShadeResult *shr)
{
static VlakRen vlr;
+ static ObjectRen obr;
+ static ObjectInstanceRen obi;
/* init */
if(re) {
@@ -1624,11 +1731,16 @@ void RE_shade_external(Render *re, ShadeInput *shi, ShadeResult *shr)
/* fake render face */
memset(&vlr, 0, sizeof(VlakRen));
- vlr.lay= -1;
+ memset(&obr, 0, sizeof(ObjectRen));
+ memset(&obi, 0, sizeof(ObjectInstanceRen));
+ obr.lay= -1;
+ obi.obr= &obr;
return;
}
shi->vlr= &vlr;
+ shi->obr= &obr;
+ shi->obi= &obi;
if(shi->mat->nodetree && shi->mat->use_nodes)
ntreeShaderExecTree(shi->mat->nodetree, shi, shr);
@@ -1647,6 +1759,7 @@ void RE_shade_external(Render *re, ShadeInput *shi, ShadeResult *shr)
typedef struct BakeShade {
ShadeSample ssamp;
+ ObjectInstanceRen *obi;
VlakRen *vlr;
ZSpan *zspan;
@@ -1654,58 +1767,42 @@ typedef struct BakeShade {
ImBuf *ibuf;
int rectx, recty, quad, type, vdone, ready;
+
+ float dir[3];
+ Object *actob;
unsigned int *rect;
float *rect_float;
} BakeShade;
-static void do_bake_shade(void *handle, int x, int y, float u, float v)
+static void bake_set_shade_input(ObjectInstanceRen *obi, VlakRen *vlr, ShadeInput *shi, int quad, int isect, int x, int y, float u, float v)
{
- BakeShade *bs= handle;
- ShadeSample *ssamp= &bs->ssamp;
- ShadeInput *shi= ssamp->shi;
- ShadeResult shr;
- VlakRen *vlr= bs->vlr;
- float l, *v1, *v2, *v3;
-
- /* fast threadsafe break test */
- if(R.test_break())
- return;
-
- /* setup render coordinates */
- if(bs->quad) {
- v1= vlr->v1->co;
- v2= vlr->v3->co;
- v3= vlr->v4->co;
+ if(isect) {
+ /* raytrace intersection with different u,v than scanconvert */
+ if(vlr->v4) {
+ if(quad)
+ shade_input_set_triangle_i(shi, obi, vlr, 2, 1, 3);
+ else
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 3);
+ }
+ else
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
}
else {
- v1= vlr->v1->co;
- v2= vlr->v2->co;
- v3= vlr->v3->co;
+ /* regular scanconvert */
+ if(quad)
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
+ else
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
}
-
- /* renderco */
- l= 1.0f-u-v;
-
- shi->co[0]= l*v3[0]+u*v1[0]+v*v2[0];
- shi->co[1]= l*v3[1]+u*v1[1]+v*v2[1];
- shi->co[2]= l*v3[2]+u*v1[2]+v*v2[2];
-
+
/* set up view vector */
VECCOPY(shi->view, shi->co);
Normalize(shi->view);
- /* no face normal flip */
- shi->puno= 0;
-
/* cache for shadow */
shi->samplenr++;
- if(bs->quad)
- shade_input_set_triangle_i(shi, vlr, 0, 2, 3);
- else
- shade_input_set_triangle_i(shi, vlr, 0, 1, 2);
-
shi->u= -u;
shi->v= -v;
shi->xs= x;
@@ -1713,6 +1810,18 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
shade_input_set_normals(shi);
+ /* no normal flip */
+ if(shi->flippednor)
+ shade_input_flip_normals(shi);
+}
+
+static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int x, int y, float u, float v, float *tvn, float *ttang)
+{
+ BakeShade *bs= handle;
+ ShadeSample *ssamp= &bs->ssamp;
+ ShadeResult shr;
+ VlakRen *vlr= shi->vlr;
+
/* init material vars */
memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
shi->har= shi->mat->har;
@@ -1722,7 +1831,6 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
ambient_occlusion_to_diffuse(shi, shr.combined);
}
else {
-
shade_input_set_shade_texco(shi);
shade_samples_do_AO(ssamp);
@@ -1735,9 +1843,39 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
shade_material_loop(shi, &shr);
if(bs->type==RE_BAKE_NORMALS) {
- shr.combined[0]= shi->vn[0]/2.0f + 0.5f;
- shr.combined[1]= 0.5f - shi->vn[1]/2.0f;
- shr.combined[2]= shi->vn[2]/2.0f + 0.5f;
+ float nor[3];
+
+ VECCOPY(nor, shi->vn);
+
+ if(R.r.bake_normal_space == R_BAKE_SPACE_CAMERA);
+ else if(R.r.bake_normal_space == R_BAKE_SPACE_TANGENT) {
+ float mat[3][3], imat[3][3];
+
+ /* bitangent */
+ if(tvn && ttang) {
+ VECCOPY(mat[0], ttang);
+ Crossf(mat[1], tvn, ttang);
+ VECCOPY(mat[2], tvn);
+ }
+ else {
+ VECCOPY(mat[0], shi->tang);
+ Crossf(mat[1], shi->vn, shi->tang);
+ VECCOPY(mat[2], shi->vn);
+ }
+
+ Mat3Inv(imat, mat);
+ Mat3MulVecfl(imat, nor);
+ }
+ else if(R.r.bake_normal_space == R_BAKE_SPACE_OBJECT)
+ Mat4Mul3Vecfl(ob->imat, nor); /* ob->imat includes viewinv! */
+ else if(R.r.bake_normal_space == R_BAKE_SPACE_WORLD)
+ Mat4Mul3Vecfl(R.viewinv, nor);
+
+ Normalize(nor); /* in case object has scaling */
+
+ shr.combined[0]= nor[0]/2.0f + 0.5f;
+ shr.combined[1]= 0.5f - nor[1]/2.0f;
+ shr.combined[2]= nor[2]/2.0f + 0.5f;
}
else if(bs->type==RE_BAKE_TEXTURE) {
shr.combined[0]= shi->r;
@@ -1760,62 +1898,226 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
}
}
+static void bake_displacement(void *handle, ShadeInput *shi, Isect *isec, int dir, int x, int y)
+{
+ BakeShade *bs= handle;
+ float disp;
+
+ disp = 0.5 + (isec->labda*VecLength(isec->vec) * -dir);
+
+ if(bs->rect_float) {
+ float *col= bs->rect_float + 4*(bs->rectx*y + x);
+ col[0] = col[1] = col[2] = disp;
+ col[3]= 1.0f;
+ } else {
+ char *col= (char *)(bs->rect + bs->rectx*y + x);
+ col[0]= FTOCHAR(disp);
+ col[1]= FTOCHAR(disp);
+ col[2]= FTOCHAR(disp);
+ col[3]= 255;
+ }
+}
+
+static int bake_check_intersect(Isect *is, int ob, RayFace *face)
+{
+ BakeShade *bs = (BakeShade*)is->userdata;
+
+ /* no direction checking for now, doesn't always improve the result
+ * (INPR(shi->facenor, bs->dir) > 0.0f); */
+
+ return (R.objectinstance[ob].obr->ob != bs->actob);
+}
+
+static int bake_intersect_tree(RayTree* raytree, Isect* isect, float *dir, float sign, float *hitco)
+{
+ float maxdist;
+ int hit;
+
+ /* might be useful to make a user setting for maxsize*/
+ if(R.r.bake_maxdist > 0.0f)
+ maxdist= R.r.bake_maxdist;
+ else
+ maxdist= RE_ray_tree_max_size(R.raytree);
+
+ isect->end[0] = isect->start[0] + dir[0]*maxdist*sign;
+ isect->end[1] = isect->start[1] + dir[1]*maxdist*sign;
+ isect->end[2] = isect->start[2] + dir[2]*maxdist*sign;
+
+ hit = RE_ray_tree_intersect_check(R.raytree, isect, bake_check_intersect);
+ if(hit) {
+ hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
+ hitco[1] = isect->start[1] + isect->labda*isect->vec[1];
+ hitco[2] = isect->start[2] + isect->labda*isect->vec[2];
+ }
+
+ return hit;
+}
+
+static void do_bake_shade(void *handle, int x, int y, float u, float v)
+{
+ BakeShade *bs= handle;
+ VlakRen *vlr= bs->vlr;
+ ObjectInstanceRen *obi= bs->obi;
+ Object *ob= obi->obr->ob;
+ float l, *v1, *v2, *v3, tvn[3], ttang[3];
+ int quad;
+ ShadeSample *ssamp= &bs->ssamp;
+ ShadeInput *shi= ssamp->shi;
+
+ /* fast threadsafe break test */
+ if(R.test_break())
+ return;
+
+ /* setup render coordinates */
+ if(bs->quad) {
+ v1= vlr->v1->co;
+ v2= vlr->v3->co;
+ v3= vlr->v4->co;
+ }
+ else {
+ v1= vlr->v1->co;
+ v2= vlr->v2->co;
+ v3= vlr->v3->co;
+ }
+
+ /* renderco */
+ l= 1.0f-u-v;
+
+ shi->co[0]= l*v3[0]+u*v1[0]+v*v2[0];
+ shi->co[1]= l*v3[1]+u*v1[1]+v*v2[1];
+ shi->co[2]= l*v3[2]+u*v1[2]+v*v2[2];
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulVecfl(obi->mat, shi->co);
+
+ quad= bs->quad;
+ bake_set_shade_input(obi, vlr, shi, quad, 0, x, y, u, v);
+
+ if(bs->type==RE_BAKE_NORMALS && R.r.bake_normal_space==R_BAKE_SPACE_TANGENT) {
+ shade_input_set_shade_texco(shi);
+ VECCOPY(tvn, shi->vn);
+ VECCOPY(ttang, shi->tang);
+ }
+
+ /* if we are doing selected to active baking, find point on other face */
+ if(bs->actob) {
+ Isect isec, minisec;
+ float co[3], minco[3];
+ int hit, sign, dir=1;
+
+ /* intersect with ray going forward and backward*/
+ hit= 0;
+ memset(&minisec, 0, sizeof(minisec));
+ minco[0]= minco[1]= minco[2]= 0.0f;
+
+ VECCOPY(bs->dir, shi->vn);
+
+ for(sign=-1; sign<=1; sign+=2) {
+ memset(&isec, 0, sizeof(isec));
+ VECCOPY(isec.start, shi->co);
+ isec.mode= RE_RAY_MIRROR;
+ isec.faceorig= (RayFace*)vlr;
+ isec.oborig= RAY_OBJECT_SET(&R, obi);
+ isec.userdata= bs;
+
+ if(bake_intersect_tree(R.raytree, &isec, shi->vn, sign, co)) {
+ if(!hit || VecLenf(shi->co, co) < VecLenf(shi->co, minco)) {
+ minisec= isec;
+ VECCOPY(minco, co);
+ hit= 1;
+ dir = sign;
+ }
+ }
+ }
+
+ if (hit && bs->type==RE_BAKE_DISPLACEMENT) {;
+ bake_displacement(handle, shi, &minisec, dir, x, y);
+ return;
+ }
+
+ /* if hit, we shade from the new point, otherwise from point one starting face */
+ if(hit) {
+ vlr= (VlakRen*)minisec.face;
+ obi= RAY_OBJECT_GET(&R, minisec.ob);
+ quad= (minisec.isect == 2);
+ VECCOPY(shi->co, minco);
+
+ u= -minisec.u;
+ v= -minisec.v;
+ bake_set_shade_input(obi, vlr, shi, quad, 1, x, y, u, v);
+ }
+ }
+
+ if(bs->type==RE_BAKE_NORMALS && R.r.bake_normal_space==R_BAKE_SPACE_TANGENT)
+ bake_shade(handle, ob, shi, quad, x, y, u, v, tvn, ttang);
+ else
+ bake_shade(handle, ob, shi, quad, x, y, u, v, 0, 0);
+}
+
static int get_next_bake_face(BakeShade *bs)
{
+ ObjectRen *obr;
VlakRen *vlr;
MTFace *tface;
static int v= 0, vdone= 0;
+ static ObjectInstanceRen *obi= NULL;
if(bs==NULL) {
vlr= NULL;
v= vdone= 0;
+ obi= R.instancetable.first;
return 0;
}
BLI_lock_thread(LOCK_CUSTOM1);
-
- for(; v<R.totvlak; v++) {
- vlr= RE_findOrAddVlak(&R, v);
-
- if(vlr->ob->flag & SELECT) {
- tface= RE_vlakren_get_tface(&R, vlr, 0, NULL, 0);
- if(tface && tface->tpage) {
- Image *ima= tface->tpage;
- ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
- float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
-
- if(ibuf==NULL)
- continue;
-
- if(ibuf->rect==NULL && ibuf->rect_float==NULL)
- continue;
-
- if(ibuf->rect_float && !(ibuf->channels==0 || ibuf->channels==4))
- continue;
-
- /* find the image for the first time? */
- if(ima->id.flag & LIB_DOIT) {
- ima->id.flag &= ~LIB_DOIT;
+ for(; obi; obi=obi->next, v=0) {
+ obr= obi->obr;
+
+ for(; v<obr->totvlak; v++) {
+ vlr= RE_findOrAddVlak(obr, v);
+
+ if((bs->actob && bs->actob == obr->ob) || (!bs->actob && (obr->ob->flag & SELECT))) {
+ tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
+
+ if(tface && tface->tpage) {
+ Image *ima= tface->tpage;
+ ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
+ float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
- /* we either fill in float or char, this ensures things go fine */
- if(ibuf->rect_float)
- imb_freerectImBuf(ibuf);
- /* clear image */
- if(R.r.bake_flag & R_BAKE_CLEAR)
- IMB_rectfill(ibuf, vec);
-
- /* might be read by UI to set active image for display */
- R.bakebuf= ima;
- }
-
- bs->vlr= vlr;
-
- bs->vdone++; /* only for error message if nothing was rendered */
- v++;
-
- BLI_unlock_thread(LOCK_CUSTOM1);
- return 1;
+ if(ibuf==NULL)
+ continue;
+
+ if(ibuf->rect==NULL && ibuf->rect_float==NULL)
+ continue;
+
+ if(ibuf->rect_float && !(ibuf->channels==0 || ibuf->channels==4))
+ continue;
+
+ /* find the image for the first time? */
+ if(ima->id.flag & LIB_DOIT) {
+ ima->id.flag &= ~LIB_DOIT;
+
+ /* we either fill in float or char, this ensures things go fine */
+ if(ibuf->rect_float)
+ imb_freerectImBuf(ibuf);
+ /* clear image */
+ if(R.r.bake_flag & R_BAKE_CLEAR)
+ IMB_rectfill(ibuf, vec);
+
+ /* might be read by UI to set active image for display */
+ R.bakebuf= ima;
+ }
+
+ bs->obi= obi;
+ bs->vlr= vlr;
+
+ bs->vdone++; /* only for error message if nothing was rendered */
+ v++;
+
+ BLI_unlock_thread(LOCK_CUSTOM1);
+ return 1;
+ }
}
}
}
@@ -1828,7 +2130,9 @@ static int get_next_bake_face(BakeShade *bs)
static void shade_tface(BakeShade *bs)
{
VlakRen *vlr= bs->vlr;
- MTFace *tface= RE_vlakren_get_tface(&R, vlr, 0, NULL, 0);
+ ObjectInstanceRen *obi= bs->obi;
+ ObjectRen *obr= obi->obr;
+ MTFace *tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
Image *ima= tface->tpage;
float vec[4][2];
int a, i1, i2, i3;
@@ -1839,7 +2143,7 @@ static void shade_tface(BakeShade *bs)
bs->ibuf= BKE_image_get_ibuf(ima, NULL);
/* note, these calls only free/fill contents of zspan struct, not zspan itself */
zbuf_free_span(bs->zspan);
- zbuf_alloc_span(bs->zspan, bs->ibuf->x, bs->ibuf->y);
+ zbuf_alloc_span(bs->zspan, bs->ibuf->x, bs->ibuf->y, R.clipcrop);
}
bs->rectx= bs->ibuf->x;
@@ -1884,12 +2188,16 @@ static void *do_bake_thread(void *bs_v)
/* using object selection tags, the faces with UV maps get baked */
/* render should have been setup */
/* returns 0 if nothing was handled */
-int RE_bake_shade_all_selected(Render *re, int type)
+int RE_bake_shade_all_selected(Render *re, int type, Object *actob)
{
BakeShade handles[BLENDER_MAX_THREADS];
ListBase threads;
Image *ima;
int a, vdone=0;
+
+ /* initialize render global */
+ R= *re;
+ R.bakebuf= NULL;
/* initialize static vars */
get_next_bake_face(NULL);
@@ -1898,10 +2206,6 @@ int RE_bake_shade_all_selected(Render *re, int type)
for(ima= G.main->image.first; ima; ima= ima->id.next)
ima->id.flag |= LIB_DOIT;
- /* initialize render global */
- R= *re;
- R.bakebuf= NULL;
-
BLI_init_threads(&threads, do_bake_thread, re->r.threads);
/* get the threads running */
@@ -1916,6 +2220,7 @@ int RE_bake_shade_all_selected(Render *re, int type)
handles[a].ssamp.tot= 1;
handles[a].type= type;
+ handles[a].actob= actob;
handles[a].zspan= MEM_callocN(sizeof(ZSpan), "zspan for bake");
BLI_insert_thread(&threads, &handles[a]);
@@ -1932,13 +2237,15 @@ int RE_bake_shade_all_selected(Render *re, int type)
break;
}
- /* filter images */
+ /* filter and refresh images */
for(ima= G.main->image.first; ima; ima= ima->id.next) {
if((ima->id.flag & LIB_DOIT)==0) {
ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
for(a=0; a<re->r.bake_filter; a++)
IMB_filter_extend(ibuf);
ibuf->userflags |= IB_BITMAPDIRTY;
+
+ if (ibuf->rect_float) IMB_rect_from_float(ibuf);
}
}
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 6d9f0e4eb01..5a749515416 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -62,6 +62,7 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
#include "BLI_memarena.h"
#include "DNA_material_types.h"
@@ -71,6 +72,7 @@
#include "BKE_customdata.h"
#include "BKE_texture.h"
+#include "BKE_DerivedMesh.h"
#include "RE_render_ext.h" /* externtex */
@@ -78,6 +80,7 @@
#include "render_types.h"
#include "renderdatabase.h"
#include "texture.h"
+#include "strand.h"
#include "zbuf.h"
/* ------------------------------------------------------------------------- */
@@ -99,31 +102,36 @@
#define RE_WINSPEED_ELEMS 4
#define RE_MTFACE_ELEMS 1
#define RE_MCOL_ELEMS 4
+#define RE_UV_ELEMS 2
+#define RE_SURFNOR_ELEMS 3
+#define RE_RADFACE_ELEMS 1
+#define RE_SIMPLIFY_ELEMS 2
+#define RE_FACE_ELEMS 1
-float *RE_vertren_get_sticky(Render *re, VertRen *ver, int verify)
+float *RE_vertren_get_sticky(ObjectRen *obr, VertRen *ver, int verify)
{
float *sticky;
int nr= ver->index>>8;
- sticky= re->vertnodes[nr].sticky;
+ sticky= obr->vertnodes[nr].sticky;
if(sticky==NULL) {
if(verify)
- sticky= re->vertnodes[nr].sticky= MEM_mallocN(256*RE_STICKY_ELEMS*sizeof(float), "sticky table");
+ sticky= obr->vertnodes[nr].sticky= MEM_mallocN(256*RE_STICKY_ELEMS*sizeof(float), "sticky table");
else
return NULL;
}
return sticky + (ver->index & 255)*RE_STICKY_ELEMS;
}
-float *RE_vertren_get_stress(Render *re, VertRen *ver, int verify)
+float *RE_vertren_get_stress(ObjectRen *obr, VertRen *ver, int verify)
{
float *stress;
int nr= ver->index>>8;
- stress= re->vertnodes[nr].stress;
+ stress= obr->vertnodes[nr].stress;
if(stress==NULL) {
if(verify)
- stress= re->vertnodes[nr].stress= MEM_mallocN(256*RE_STRESS_ELEMS*sizeof(float), "stress table");
+ stress= obr->vertnodes[nr].stress= MEM_mallocN(256*RE_STRESS_ELEMS*sizeof(float), "stress table");
else
return NULL;
}
@@ -131,30 +139,30 @@ float *RE_vertren_get_stress(Render *re, VertRen *ver, int verify)
}
/* this one callocs! */
-float *RE_vertren_get_rad(Render *re, VertRen *ver, int verify)
+float *RE_vertren_get_rad(ObjectRen *obr, VertRen *ver, int verify)
{
float *rad;
int nr= ver->index>>8;
- rad= re->vertnodes[nr].rad;
+ rad= obr->vertnodes[nr].rad;
if(rad==NULL) {
if(verify)
- rad= re->vertnodes[nr].rad= MEM_callocN(256*RE_RAD_ELEMS*sizeof(float), "rad table");
+ rad= obr->vertnodes[nr].rad= MEM_callocN(256*RE_RAD_ELEMS*sizeof(float), "rad table");
else
return NULL;
}
return rad + (ver->index & 255)*RE_RAD_ELEMS;
}
-float *RE_vertren_get_strand(Render *re, VertRen *ver, int verify)
+float *RE_vertren_get_strand(ObjectRen *obr, VertRen *ver, int verify)
{
float *strand;
int nr= ver->index>>8;
- strand= re->vertnodes[nr].strand;
+ strand= obr->vertnodes[nr].strand;
if(strand==NULL) {
if(verify)
- strand= re->vertnodes[nr].strand= MEM_mallocN(256*RE_STRAND_ELEMS*sizeof(float), "strand table");
+ strand= obr->vertnodes[nr].strand= MEM_mallocN(256*RE_STRAND_ELEMS*sizeof(float), "strand table");
else
return NULL;
}
@@ -162,15 +170,15 @@ float *RE_vertren_get_strand(Render *re, VertRen *ver, int verify)
}
/* needs calloc */
-float *RE_vertren_get_tangent(Render *re, VertRen *ver, int verify)
+float *RE_vertren_get_tangent(ObjectRen *obr, VertRen *ver, int verify)
{
float *tangent;
int nr= ver->index>>8;
- tangent= re->vertnodes[nr].tangent;
+ tangent= obr->vertnodes[nr].tangent;
if(tangent==NULL) {
if(verify)
- tangent= re->vertnodes[nr].tangent= MEM_callocN(256*RE_TANGENT_ELEMS*sizeof(float), "tangent table");
+ tangent= obr->vertnodes[nr].tangent= MEM_callocN(256*RE_TANGENT_ELEMS*sizeof(float), "tangent table");
else
return NULL;
}
@@ -178,64 +186,62 @@ float *RE_vertren_get_tangent(Render *re, VertRen *ver, int verify)
}
/* needs calloc! not all renderverts have them */
-float *RE_vertren_get_winspeed(Render *re, VertRen *ver, int verify)
+/* also winspeed is exception, it is stored per instance */
+float *RE_vertren_get_winspeed(ObjectInstanceRen *obi, VertRen *ver, int verify)
{
float *winspeed;
- int nr= ver->index>>8;
+ int totvector;
- winspeed= re->vertnodes[nr].winspeed;
+ winspeed= obi->vectors;
if(winspeed==NULL) {
- if(verify)
- winspeed= re->vertnodes[nr].winspeed= MEM_callocN(256*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+ if(verify) {
+ totvector= obi->obr->totvert + obi->obr->totstrand;
+ winspeed= obi->vectors= MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+ }
else
return NULL;
}
- return winspeed + (ver->index & 255)*RE_WINSPEED_ELEMS;
+ return winspeed + ver->index*RE_WINSPEED_ELEMS;
}
-VertRen *RE_vertren_copy(Render *re, VertRen *ver)
+VertRen *RE_vertren_copy(ObjectRen *obr, VertRen *ver)
{
- VertRen *v1= RE_findOrAddVert(re, re->totvert++);
+ VertRen *v1= RE_findOrAddVert(obr, obr->totvert++);
float *fp1, *fp2;
int index= v1->index;
*v1= *ver;
v1->index= index;
- fp1= RE_vertren_get_sticky(re, ver, 0);
+ fp1= RE_vertren_get_sticky(obr, ver, 0);
if(fp1) {
- fp2= RE_vertren_get_sticky(re, v1, 1);
+ fp2= RE_vertren_get_sticky(obr, v1, 1);
memcpy(fp2, fp1, RE_STICKY_ELEMS*sizeof(float));
}
- fp1= RE_vertren_get_stress(re, ver, 0);
+ fp1= RE_vertren_get_stress(obr, ver, 0);
if(fp1) {
- fp2= RE_vertren_get_stress(re, v1, 1);
+ fp2= RE_vertren_get_stress(obr, v1, 1);
memcpy(fp2, fp1, RE_STRESS_ELEMS*sizeof(float));
}
- fp1= RE_vertren_get_rad(re, ver, 0);
+ fp1= RE_vertren_get_rad(obr, ver, 0);
if(fp1) {
- fp2= RE_vertren_get_rad(re, v1, 1);
+ fp2= RE_vertren_get_rad(obr, v1, 1);
memcpy(fp2, fp1, RE_RAD_ELEMS*sizeof(float));
}
- fp1= RE_vertren_get_strand(re, ver, 0);
+ fp1= RE_vertren_get_strand(obr, ver, 0);
if(fp1) {
- fp2= RE_vertren_get_strand(re, v1, 1);
+ fp2= RE_vertren_get_strand(obr, v1, 1);
memcpy(fp2, fp1, RE_STRAND_ELEMS*sizeof(float));
}
- fp1= RE_vertren_get_tangent(re, ver, 0);
+ fp1= RE_vertren_get_tangent(obr, ver, 0);
if(fp1) {
- fp2= RE_vertren_get_tangent(re, v1, 1);
+ fp2= RE_vertren_get_tangent(obr, v1, 1);
memcpy(fp2, fp1, RE_TANGENT_ELEMS*sizeof(float));
}
- fp1= RE_vertren_get_winspeed(re, ver, 0);
- if(fp1) {
- fp2= RE_vertren_get_winspeed(re, v1, 1);
- memcpy(fp2, fp1, RE_WINSPEED_ELEMS*sizeof(float));
- }
return v1;
}
-VertRen *RE_findOrAddVert(Render *re, int nr)
+VertRen *RE_findOrAddVert(ObjectRen *obr, int nr)
{
VertTableNode *temp;
VertRen *v;
@@ -247,23 +253,23 @@ VertRen *RE_findOrAddVert(Render *re, int nr)
}
a= nr>>8;
- if (a>=re->vertnodeslen-1) { /* Need to allocate more columns..., and keep last element NULL for free loop */
- temp= re->vertnodes;
+ if (a>=obr->vertnodeslen-1) { /* Need to allocate more columns..., and keep last element NULL for free loop */
+ temp= obr->vertnodes;
- re->vertnodes= MEM_mallocN(sizeof(VertTableNode)*(re->vertnodeslen+TABLEINITSIZE) , "vertnodes");
- if(temp) memcpy(re->vertnodes, temp, re->vertnodeslen*sizeof(VertTableNode));
- memset(re->vertnodes+re->vertnodeslen, 0, TABLEINITSIZE*sizeof(VertTableNode));
+ obr->vertnodes= MEM_mallocN(sizeof(VertTableNode)*(obr->vertnodeslen+TABLEINITSIZE) , "vertnodes");
+ if(temp) memcpy(obr->vertnodes, temp, obr->vertnodeslen*sizeof(VertTableNode));
+ memset(obr->vertnodes+obr->vertnodeslen, 0, TABLEINITSIZE*sizeof(VertTableNode));
- re->vertnodeslen+=TABLEINITSIZE;
+ obr->vertnodeslen+=TABLEINITSIZE;
if(temp) MEM_freeN(temp);
}
- v= re->vertnodes[a].vert;
+ v= obr->vertnodes[a].vert;
if(v==NULL) {
int i;
v= (VertRen *)MEM_callocN(256*sizeof(VertRen),"findOrAddVert");
- re->vertnodes[a].vert= v;
+ obr->vertnodes[a].vert= v;
for(i= (nr & 0xFFFFFF00), a=0; a<256; a++, i++) {
v[a].index= i;
@@ -275,171 +281,219 @@ VertRen *RE_findOrAddVert(Render *re, int nr)
/* ------------------------------------------------------------------------ */
-MTFace *RE_vlakren_get_tface(Render *re, VlakRen *vlr, int n, char **name, int verify)
+MTFace *RE_vlakren_get_tface(ObjectRen *obr, VlakRen *vlr, int n, char **name, int verify)
{
VlakTableNode *node;
int nr= vlr->index>>8, vlakindex= (vlr->index&255);
int index= (n<<8) + vlakindex;
- node= &re->vlaknodes[nr];
+ node= &obr->vlaknodes[nr];
if(verify) {
if(n>=node->totmtface) {
- MTFace **mtface= node->mtface;
+ MTFace *mtface= node->mtface;
int size= size= (n+1)*256;
- node->mtface= MEM_callocN(size*sizeof(MTFace*), "Vlak mtface");
+ node->mtface= MEM_callocN(size*sizeof(MTFace), "Vlak mtface");
if(mtface) {
size= node->totmtface*256;
- memcpy(node->mtface, mtface, size*sizeof(MTFace*));
+ memcpy(node->mtface, mtface, size*sizeof(MTFace));
MEM_freeN(mtface);
}
node->totmtface= n+1;
-
- if (!node->names) {
- size= sizeof(*node->names)*256;
- node->names= MEM_callocN(size, "Vlak names");
- }
- }
-
- if(node->mtface[index]==NULL) {
- node->mtface[index]= BLI_memarena_alloc(re->memArena,
- sizeof(MTFace)*RE_MTFACE_ELEMS);
-
- node->names[vlakindex]= re->customdata_names.last;
}
}
else {
- if(n>=node->totmtface || node->mtface[index]==NULL)
+ if(n>=node->totmtface)
return NULL;
- if(name) *name= node->names[vlakindex]->mtface[n];
+ if(name) *name= obr->mtface[n];
}
- return node->mtface[index];
+ return node->mtface + index;
}
-MCol *RE_vlakren_get_mcol(Render *re, VlakRen *vlr, int n, char **name, int verify)
+MCol *RE_vlakren_get_mcol(ObjectRen *obr, VlakRen *vlr, int n, char **name, int verify)
{
VlakTableNode *node;
int nr= vlr->index>>8, vlakindex= (vlr->index&255);
int index= (n<<8) + vlakindex;
- node= &re->vlaknodes[nr];
+ node= &obr->vlaknodes[nr];
if(verify) {
if(n>=node->totmcol) {
- MCol **mcol= node->mcol;
+ MCol *mcol= node->mcol;
int size= (n+1)*256;
- node->mcol= MEM_callocN(size*sizeof(MCol*), "Vlak mcol");
+ node->mcol= MEM_callocN(size*sizeof(MCol)*RE_MCOL_ELEMS, "Vlak mcol");
if(mcol) {
size= node->totmcol*256;
- memcpy(node->mcol, mcol, size*sizeof(MCol*));
+ memcpy(node->mcol, mcol, size*sizeof(MCol)*RE_MCOL_ELEMS);
MEM_freeN(mcol);
}
node->totmcol= n+1;
-
- if (!node->names) {
- size= sizeof(*node->names)*256;
- node->names= MEM_callocN(size, "Vlak names");
- }
- }
-
- if(node->mcol[index]==NULL) {
- node->mcol[index]= BLI_memarena_alloc(re->memArena,
- sizeof(MCol)*RE_MCOL_ELEMS);
-
- node->names[vlakindex]= re->customdata_names.last;
}
}
else {
- if(n>=node->totmcol || node->mcol[index]==NULL)
+ if(n>=node->totmcol)
return NULL;
- if(name) *name= node->names[vlakindex]->mcol[n];
+ if(name) *name= obr->mcol[n];
+ }
+
+ return node->mcol + index*RE_MCOL_ELEMS;
+}
+
+float *RE_vlakren_get_surfnor(ObjectRen *obr, VlakRen *vlak, int verify)
+{
+ float *surfnor;
+ int nr= vlak->index>>8;
+
+ surfnor= obr->vlaknodes[nr].surfnor;
+ if(surfnor==NULL) {
+ if(verify)
+ surfnor= obr->vlaknodes[nr].surfnor= MEM_callocN(256*RE_SURFNOR_ELEMS*sizeof(float), "surfnor table");
+ else
+ return NULL;
}
+ return surfnor + (vlak->index & 255)*RE_SURFNOR_ELEMS;
+}
- return node->mcol[index];
+RadFace **RE_vlakren_get_radface(ObjectRen *obr, VlakRen *vlak, int verify)
+{
+ RadFace **radface;
+ int nr= vlak->index>>8;
+
+ radface= obr->vlaknodes[nr].radface;
+ if(radface==NULL) {
+ if(verify)
+ radface= obr->vlaknodes[nr].radface= MEM_callocN(256*RE_RADFACE_ELEMS*sizeof(void*), "radface table");
+ else
+ return NULL;
+ }
+ return radface + (vlak->index & 255)*RE_RADFACE_ELEMS;
}
-VlakRen *RE_vlakren_copy(Render *re, VlakRen *vlr)
+VlakRen *RE_vlakren_copy(ObjectRen *obr, VlakRen *vlr)
{
- VlakRen *vlr1 = RE_findOrAddVlak(re, re->totvlak++);
+ VlakRen *vlr1 = RE_findOrAddVlak(obr, obr->totvlak++);
MTFace *mtface, *mtface1;
MCol *mcol, *mcol1;
- VlakTableNode *node = &re->vlaknodes[vlr->index>>8];
- VlakTableNode *node1 = &re->vlaknodes[vlr1->index>>8];
+ float *surfnor, *surfnor1;
+ RadFace **radface, **radface1;
int i, index = vlr1->index;
char *name;
*vlr1= *vlr;
vlr1->index= index;
- for (i=0; (mtface=RE_vlakren_get_tface(re, vlr, i, &name, 0)) != NULL; i++) {
- mtface1= RE_vlakren_get_tface(re, vlr1, i, &name, 1);
+ for (i=0; (mtface=RE_vlakren_get_tface(obr, vlr, i, &name, 0)) != NULL; i++) {
+ mtface1= RE_vlakren_get_tface(obr, vlr1, i, &name, 1);
memcpy(mtface1, mtface, sizeof(MTFace)*RE_MTFACE_ELEMS);
}
- for (i=0; (mcol=RE_vlakren_get_mcol(re, vlr, i, &name, 0)) != NULL; i++) {
- mcol1= RE_vlakren_get_mcol(re, vlr1, i, &name, 1);
+ for (i=0; (mcol=RE_vlakren_get_mcol(obr, vlr, i, &name, 0)) != NULL; i++) {
+ mcol1= RE_vlakren_get_mcol(obr, vlr1, i, &name, 1);
memcpy(mcol1, mcol, sizeof(MCol)*RE_MCOL_ELEMS);
}
- if (node->names && node1->names)
- node1->names[vlr1->index&255] = node->names[vlr->index&255];
+ surfnor= RE_vlakren_get_surfnor(obr, vlr, 0);
+ if(surfnor) {
+ surfnor1= RE_vlakren_get_surfnor(obr, vlr1, 1);
+ VECCOPY(surfnor1, surfnor);
+ }
+
+ radface= RE_vlakren_get_radface(obr, vlr, 0);
+ if(radface) {
+ radface1= RE_vlakren_get_radface(obr, vlr1, 1);
+ *radface1= *radface;
+ }
return vlr1;
}
-static int vlakren_remap_layer_num(int n, int active)
+int RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, float *nor)
{
- /* make the active layer the first */
- if (n == active) return 0;
- else if (n < active) return n+1;
- else return n;
+ float xn, yn, zn, v1[3];
+ float (*imat)[3]= obi->imat;
+ int flipped= 0;
+
+ if(obi->flag & R_TRANSFORMED) {
+ xn= vlr->n[0];
+ yn= vlr->n[1];
+ zn= vlr->n[2];
+
+ /* transpose! */
+ nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
+ nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
+ nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+ Normalize(nor);
+ }
+ else
+ VECCOPY(nor, vlr->n);
+
+ if((vlr->flag & R_NOPUNOFLIP)==0) {
+ if(re->r.mode & R_ORTHO) {
+ if(nor[2] > 0.0f)
+ flipped= 1;
+ }
+ else {
+ VECCOPY(v1, vlr->v1->co);
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulVecfl(obi->mat, v1);
+ if(INPR(v1, nor) < 0.0f) {
+ flipped= 1;
+ }
+ }
+
+ if(flipped) {
+ nor[0]= -nor[0];
+ nor[1]= -nor[1];
+ nor[2]= -nor[2];
+ }
+ }
+
+ return flipped;
}
-void RE_vlakren_set_customdata_names(Render *re, CustomData *data)
+void RE_set_customdata_names(ObjectRen *obr, CustomData *data)
{
/* CustomData layer names are stored per object here, because the
DerivedMesh which stores the layers is freed */
- CustomDataNames *cdn= MEM_callocN(sizeof(*cdn), "CustomDataNames");
CustomDataLayer *layer;
- int numlayers, i, mtfn, mcn, n;
-
- BLI_addtail(&re->customdata_names, cdn);
+ int numlayers, i, mtfn, mcn;
if (CustomData_has_layer(data, CD_MTFACE)) {
numlayers= CustomData_number_of_layers(data, CD_MTFACE);
- cdn->mtface= MEM_callocN(sizeof(*cdn->mtface)*numlayers, "mtfacenames");
+ obr->mtface= MEM_callocN(sizeof(*obr->mtface)*numlayers, "mtfacenames");
}
if (CustomData_has_layer(data, CD_MCOL)) {
numlayers= CustomData_number_of_layers(data, CD_MCOL);
- cdn->mcol= MEM_callocN(sizeof(*cdn->mcol)*numlayers, "mcolnames");
+ obr->mcol= MEM_callocN(sizeof(*obr->mcol)*numlayers, "mcolnames");
}
for (i=0, mtfn=0, mcn=0; i < data->totlayer; i++) {
layer= &data->layers[i];
if (layer->type == CD_MTFACE) {
- n= vlakren_remap_layer_num(mtfn++, layer->active_rnd);
- strcpy(cdn->mtface[n], layer->name);
+ strcpy(obr->mtface[mtfn++], layer->name);
+ obr->actmtface= layer->active_rnd;
}
else if (layer->type == CD_MCOL) {
- n= vlakren_remap_layer_num(mcn++, layer->active_rnd);
- strcpy(cdn->mcol[n], layer->name);
+ strcpy(obr->mcol[mcn++], layer->name);
+ obr->actmcol= layer->active_rnd;
}
}
}
-VlakRen *RE_findOrAddVlak(Render *re, int nr)
+VlakRen *RE_findOrAddVlak(ObjectRen *obr, int nr)
{
VlakTableNode *temp;
VlakRen *v;
@@ -447,28 +501,199 @@ VlakRen *RE_findOrAddVlak(Render *re, int nr)
if(nr<0) {
printf("error in findOrAddVlak: %d\n",nr);
- return re->vlaknodes[0].vlak;
+ return obr->vlaknodes[0].vlak;
}
a= nr>>8;
- if (a>=re->vlaknodeslen-1){ /* Need to allocate more columns..., and keep last element NULL for free loop */
- temp= re->vlaknodes;
+ if (a>=obr->vlaknodeslen-1){ /* Need to allocate more columns..., and keep last element NULL for free loop */
+ temp= obr->vlaknodes;
- re->vlaknodes= MEM_mallocN(sizeof(VlakTableNode)*(re->vlaknodeslen+TABLEINITSIZE) , "vlaknodes");
- if(temp) memcpy(re->vlaknodes, temp, re->vlaknodeslen*sizeof(VlakTableNode));
- memset(re->vlaknodes+re->vlaknodeslen, 0, TABLEINITSIZE*sizeof(VlakTableNode));
+ obr->vlaknodes= MEM_mallocN(sizeof(VlakTableNode)*(obr->vlaknodeslen+TABLEINITSIZE) , "vlaknodes");
+ if(temp) memcpy(obr->vlaknodes, temp, obr->vlaknodeslen*sizeof(VlakTableNode));
+ memset(obr->vlaknodes+obr->vlaknodeslen, 0, TABLEINITSIZE*sizeof(VlakTableNode));
- re->vlaknodeslen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
+ obr->vlaknodeslen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
if(temp) MEM_freeN(temp);
}
- v= re->vlaknodes[a].vlak;
+ v= obr->vlaknodes[a].vlak;
if(v==NULL) {
int i;
v= (VlakRen *)MEM_callocN(256*sizeof(VlakRen),"findOrAddVlak");
- re->vlaknodes[a].vlak= v;
+ obr->vlaknodes[a].vlak= v;
+
+ for(i= (nr & 0xFFFFFF00), a=0; a<256; a++, i++)
+ v[a].index= i;
+ }
+ v+= (nr & 255);
+ return v;
+}
+
+/* ------------------------------------------------------------------------ */
+
+float *RE_strandren_get_surfnor(ObjectRen *obr, StrandRen *strand, int verify)
+{
+ float *surfnor;
+ int nr= strand->index>>8;
+
+ surfnor= obr->strandnodes[nr].surfnor;
+ if(surfnor==NULL) {
+ if(verify)
+ surfnor= obr->strandnodes[nr].surfnor= MEM_callocN(256*RE_SURFNOR_ELEMS*sizeof(float), "surfnor table");
+ else
+ return NULL;
+ }
+ return surfnor + (strand->index & 255)*RE_SURFNOR_ELEMS;
+}
+
+float *RE_strandren_get_uv(ObjectRen *obr, StrandRen *strand, int n, char **name, int verify)
+{
+ StrandTableNode *node;
+ int nr= strand->index>>8, strandindex= (strand->index&255);
+ int index= (n<<8) + strandindex;
+
+ node= &obr->strandnodes[nr];
+
+ if(verify) {
+ if(n>=node->totuv) {
+ float *uv= node->uv;
+ int size= (n+1)*256;
+
+ node->uv= MEM_callocN(size*sizeof(float)*RE_UV_ELEMS, "Strand uv");
+
+ if(uv) {
+ size= node->totuv*256;
+ memcpy(node->uv, uv, size*sizeof(float)*RE_UV_ELEMS);
+ MEM_freeN(uv);
+ }
+
+ node->totuv= n+1;
+ }
+ }
+ else {
+ if(n>=node->totuv)
+ return NULL;
+
+ if(name) *name= obr->mtface[n];
+ }
+
+ return node->uv + index*RE_UV_ELEMS;
+}
+
+MCol *RE_strandren_get_mcol(ObjectRen *obr, StrandRen *strand, int n, char **name, int verify)
+{
+ StrandTableNode *node;
+ int nr= strand->index>>8, strandindex= (strand->index&255);
+ int index= (n<<8) + strandindex;
+
+ node= &obr->strandnodes[nr];
+
+ if(verify) {
+ if(n>=node->totmcol) {
+ MCol *mcol= node->mcol;
+ int size= (n+1)*256;
+
+ node->mcol= MEM_callocN(size*sizeof(MCol)*RE_MCOL_ELEMS, "Strand mcol");
+
+ if(mcol) {
+ size= node->totmcol*256;
+ memcpy(node->mcol, mcol, size*sizeof(MCol)*RE_MCOL_ELEMS);
+ MEM_freeN(mcol);
+ }
+
+ node->totmcol= n+1;
+ }
+ }
+ else {
+ if(n>=node->totmcol)
+ return NULL;
+
+ if(name) *name= obr->mcol[n];
+ }
+
+ return node->mcol + index*RE_MCOL_ELEMS;
+}
+
+float *RE_strandren_get_simplify(struct ObjectRen *obr, struct StrandRen *strand, int verify)
+{
+ float *simplify;
+ int nr= strand->index>>8;
+
+ simplify= obr->strandnodes[nr].simplify;
+ if(simplify==NULL) {
+ if(verify)
+ simplify= obr->strandnodes[nr].simplify= MEM_callocN(256*RE_SIMPLIFY_ELEMS*sizeof(float), "simplify table");
+ else
+ return NULL;
+ }
+ return simplify + (strand->index & 255)*RE_SIMPLIFY_ELEMS;
+}
+
+int *RE_strandren_get_face(ObjectRen *obr, StrandRen *strand, int verify)
+{
+ int *face;
+ int nr= strand->index>>8;
+
+ face= obr->strandnodes[nr].face;
+ if(face==NULL) {
+ if(verify)
+ face= obr->strandnodes[nr].face= MEM_callocN(256*RE_FACE_ELEMS*sizeof(int), "face table");
+ else
+ return NULL;
+ }
+ return face + (strand->index & 255)*RE_FACE_ELEMS;
+}
+
+/* winspeed is exception, it is stored per instance */
+float *RE_strandren_get_winspeed(ObjectInstanceRen *obi, StrandRen *strand, int verify)
+{
+ float *winspeed;
+ int totvector;
+
+ winspeed= obi->vectors;
+ if(winspeed==NULL) {
+ if(verify) {
+ totvector= obi->obr->totvert + obi->obr->totstrand;
+ winspeed= obi->vectors= MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+ }
+ else
+ return NULL;
+ }
+ return winspeed + (obi->obr->totvert + strand->index)*RE_WINSPEED_ELEMS;
+}
+
+StrandRen *RE_findOrAddStrand(ObjectRen *obr, int nr)
+{
+ StrandTableNode *temp;
+ StrandRen *v;
+ int a;
+
+ if(nr<0) {
+ printf("error in findOrAddStrand: %d\n",nr);
+ return obr->strandnodes[0].strand;
+ }
+ a= nr>>8;
+
+ if (a>=obr->strandnodeslen-1){ /* Need to allocate more columns..., and keep last element NULL for free loop */
+ temp= obr->strandnodes;
+
+ obr->strandnodes= MEM_mallocN(sizeof(StrandTableNode)*(obr->strandnodeslen+TABLEINITSIZE) , "strandnodes");
+ if(temp) memcpy(obr->strandnodes, temp, obr->strandnodeslen*sizeof(StrandTableNode));
+ memset(obr->strandnodes+obr->strandnodeslen, 0, TABLEINITSIZE*sizeof(StrandTableNode));
+
+ obr->strandnodeslen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
+ if(temp) MEM_freeN(temp);
+ }
+
+ v= obr->strandnodes[a].strand;
+
+ if(v==NULL) {
+ int i;
+
+ v= (StrandRen *)MEM_callocN(256*sizeof(StrandRen),"findOrAddStrand");
+ obr->strandnodes[a].strand= v;
for(i= (nr & 0xFFFFFF00), a=0; a<256; a++, i++)
v[a].index= i;
@@ -477,20 +702,34 @@ VlakRen *RE_findOrAddVlak(Render *re, int nr)
return v;
}
+StrandBuffer *RE_addStrandBuffer(ObjectRen *obr, int totvert)
+{
+ StrandBuffer *strandbuf;
+
+ strandbuf= MEM_callocN(sizeof(StrandBuffer), "StrandBuffer");
+ strandbuf->vert= MEM_callocN(sizeof(StrandVert)*totvert, "StrandVert");
+ strandbuf->totvert= totvert;
+ strandbuf->obr= obr;
+
+ obr->strandbuf= strandbuf;
+
+ return strandbuf;
+}
+
/* ------------------------------------------------------------------------ */
-void RE_addRenderObject(Render *re, Object *ob, Object *par, int index, int sve, int eve, int sfa, int efa)
+ObjectRen *RE_addRenderObject(Render *re, Object *ob, Object *par, int index, int psysindex, int lay)
{
- ObjectRen *obr= MEM_mallocN(sizeof(ObjectRen), "object render struct");
+ ObjectRen *obr= MEM_callocN(sizeof(ObjectRen), "object render struct");
BLI_addtail(&re->objecttable, obr);
obr->ob= ob;
obr->par= par;
obr->index= index;
- obr->startvert= sve;
- obr->endvert= eve;
- obr->startface= sfa;
- obr->endface= efa;
+ obr->psysindex= psysindex;
+ obr->lay= lay;
+
+ return obr;
}
void free_renderdata_vertnodes(VertTableNode *vertnodes)
@@ -532,54 +771,114 @@ void free_renderdata_vlaknodes(VlakTableNode *vlaknodes)
MEM_freeN(vlaknodes[a].mtface);
if(vlaknodes[a].mcol)
MEM_freeN(vlaknodes[a].mcol);
- if(vlaknodes[a].names)
- MEM_freeN(vlaknodes[a].names);
+ if(vlaknodes[a].surfnor)
+ MEM_freeN(vlaknodes[a].surfnor);
+ if(vlaknodes[a].radface)
+ MEM_freeN(vlaknodes[a].radface);
}
MEM_freeN(vlaknodes);
}
+void free_renderdata_strandnodes(StrandTableNode *strandnodes)
+{
+ int a;
+
+ if(strandnodes==NULL) return;
+
+ for(a=0; strandnodes[a].strand; a++) {
+ MEM_freeN(strandnodes[a].strand);
+
+ if(strandnodes[a].uv)
+ MEM_freeN(strandnodes[a].uv);
+ if(strandnodes[a].mcol)
+ MEM_freeN(strandnodes[a].mcol);
+ if(strandnodes[a].winspeed)
+ MEM_freeN(strandnodes[a].winspeed);
+ if(strandnodes[a].surfnor)
+ MEM_freeN(strandnodes[a].surfnor);
+ if(strandnodes[a].simplify)
+ MEM_freeN(strandnodes[a].simplify);
+ if(strandnodes[a].face)
+ MEM_freeN(strandnodes[a].face);
+ }
+
+ MEM_freeN(strandnodes);
+}
+
void free_renderdata_tables(Render *re)
{
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
+ StrandBuffer *strandbuf;
int a=0;
- CustomDataNames *cdn;
- if(re->bloha) {
- for(a=0; re->bloha[a]; a++)
- MEM_freeN(re->bloha[a]);
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ if(obr->vertnodes) {
+ free_renderdata_vertnodes(obr->vertnodes);
+ obr->vertnodes= NULL;
+ obr->vertnodeslen= 0;
+ }
- MEM_freeN(re->bloha);
- re->bloha= NULL;
- re->blohalen= 0;
- }
+ if(obr->vlaknodes) {
+ free_renderdata_vlaknodes(obr->vlaknodes);
+ obr->vlaknodes= NULL;
+ obr->vlaknodeslen= 0;
+ obr->totvlak= 0;
+ }
- if(re->vertnodes) {
- free_renderdata_vertnodes(re->vertnodes);
- re->vertnodes= NULL;
- re->vertnodeslen= 0;
+ if(obr->bloha) {
+ for(a=0; obr->bloha[a]; a++)
+ MEM_freeN(obr->bloha[a]);
+
+ MEM_freeN(obr->bloha);
+ obr->bloha= NULL;
+ obr->blohalen= 0;
+ }
+
+ if(obr->strandnodes) {
+ free_renderdata_strandnodes(obr->strandnodes);
+ obr->strandnodes= NULL;
+ obr->strandnodeslen= 0;
+ }
+
+ strandbuf= obr->strandbuf;
+ if(strandbuf) {
+ if(strandbuf->vert) MEM_freeN(strandbuf->vert);
+ if(strandbuf->bound) MEM_freeN(strandbuf->bound);
+ MEM_freeN(strandbuf);
+ }
+
+ if(obr->mtface)
+ MEM_freeN(obr->mtface);
+ if(obr->mcol)
+ MEM_freeN(obr->mcol);
}
- if(re->vlaknodes) {
- free_renderdata_vlaknodes(re->vlaknodes);
- re->vlaknodes= NULL;
- re->vlaknodeslen= 0;
+ if(re->objectinstance) {
+ for(obi=re->instancetable.first; obi; obi=obi->next)
+ if(obi->vectors)
+ MEM_freeN(obi->vectors);
+
+ MEM_freeN(re->objectinstance);
+ re->objectinstance= NULL;
+ re->totinstance= 0;
+ re->instancetable.first= re->instancetable.last= NULL;
}
- for(cdn=re->customdata_names.first; cdn; cdn=cdn->next) {
- if(cdn->mtface)
- MEM_freeN(cdn->mtface);
- if(cdn->mcol)
- MEM_freeN(cdn->mcol);
+ if(re->sortedhalos) {
+ MEM_freeN(re->sortedhalos);
+ re->sortedhalos= NULL;
}
BLI_freelistN(&re->customdata_names);
BLI_freelistN(&re->objecttable);
+ BLI_freelistN(&re->instancetable);
}
-
/* ------------------------------------------------------------------------ */
-HaloRen *RE_findOrAddHalo(Render *re, int nr)
+HaloRen *RE_findOrAddHalo(ObjectRen *obr, int nr)
{
HaloRen *h, **temp;
int a;
@@ -590,22 +889,22 @@ HaloRen *RE_findOrAddHalo(Render *re, int nr)
}
a= nr>>8;
- if (a>=re->blohalen-1){ /* Need to allocate more columns..., and keep last element NULL for free loop */
+ if (a>=obr->blohalen-1){ /* Need to allocate more columns..., and keep last element NULL for free loop */
//printf("Allocating %i more halo groups. %i total.\n",
- // TABLEINITSIZE, re->blohalen+TABLEINITSIZE );
- temp=re->bloha;
+ // TABLEINITSIZE, obr->blohalen+TABLEINITSIZE );
+ temp=obr->bloha;
- re->bloha=(HaloRen**)MEM_callocN(sizeof(void*)*(re->blohalen+TABLEINITSIZE) , "Bloha");
- if(temp) memcpy(re->bloha, temp, re->blohalen*sizeof(void*));
- memset(&(re->bloha[re->blohalen]), 0, TABLEINITSIZE*sizeof(void*));
- re->blohalen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
+ obr->bloha=(HaloRen**)MEM_callocN(sizeof(void*)*(obr->blohalen+TABLEINITSIZE) , "Bloha");
+ if(temp) memcpy(obr->bloha, temp, obr->blohalen*sizeof(void*));
+ memset(&(obr->bloha[obr->blohalen]), 0, TABLEINITSIZE*sizeof(void*));
+ obr->blohalen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
if(temp) MEM_freeN(temp);
}
- h= re->bloha[a];
+ h= obr->bloha[a];
if(h==NULL) {
h= (HaloRen *)MEM_callocN(256*sizeof(HaloRen),"findOrAdHalo");
- re->bloha[a]= h;
+ obr->bloha[a]= h;
}
h+= (nr & 255);
return h;
@@ -613,7 +912,7 @@ HaloRen *RE_findOrAddHalo(Render *re, int nr)
/* ------------------------------------------------------------------------- */
-HaloRen *RE_inithalo(Render *re, Material *ma, float *vec, float *vec1,
+HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, float *vec1,
float *orco, float hasize, float vectsize, int seed)
{
HaloRen *har;
@@ -630,7 +929,7 @@ HaloRen *RE_inithalo(Render *re, Material *ma, float *vec, float *vec1,
if(hoco1[3]==0.0) return NULL;
}
- har= RE_findOrAddHalo(re, re->tothalo++);
+ har= RE_findOrAddHalo(obr, obr->tothalo++);
VECCOPY(har->co, vec);
har->hasize= hasize;
@@ -723,6 +1022,152 @@ HaloRen *RE_inithalo(Render *re, Material *ma, float *vec, float *vec1,
return har;
}
+HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, 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(obr, obr->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 */
@@ -759,180 +1204,181 @@ static int panotestclip(Render *re, int do_pano, float *v)
- shadow buffering (shadbuf.c)
*/
-void project_renderdata(Render *re, void (*projectfunc)(float *, float mat[][4], float *), int do_pano, float xoffs)
+void project_renderdata(Render *re, void (*projectfunc)(float *, float mat[][4], float *), int do_pano, float xoffs, int do_buckets)
{
- VlakRen *vlr = NULL;
- VertRen *ver = NULL;
+ ObjectRen *obr;
HaloRen *har = NULL;
float zn, vec[3], hoco[4];
int a;
-
+
if(do_pano) {
float panophi= xoffs;
re->panosi= sin(panophi);
re->panoco= cos(panophi);
}
-
- /* calculate view coordinates (and zbuffer value) */
- for(a=0; a< re->totvert;a++) {
- if((a & 255)==0) ver= RE_findOrAddVert(re, a);
- else ver++;
- if(do_pano) {
- vec[0]= re->panoco*ver->co[0] + re->panosi*ver->co[2];
- vec[1]= ver->co[1];
- vec[2]= -re->panosi*ver->co[0] + re->panoco*ver->co[2];
- }
- else {
- VECCOPY(vec, ver->co);
- }
- /* Go from wcs to hcs ... */
- projectfunc(vec, re->winmat, ver->ho);
- /* ... and clip in that system. */
- ver->clip = testclip(ver->ho);
- /*
- Because all other ops are performed in other systems, this is
- the only thing that has to be done.
- */
- }
-
- /* calculate view coordinates (and zbuffer value) */
- for(a=0; a<re->tothalo; a++) {
- if((a & 255)==0) har= re->bloha[a>>8];
- else har++;
-
- if(do_pano) {
- vec[0]= re->panoco*har->co[0] + re->panosi*har->co[2];
- vec[1]= har->co[1];
- vec[2]= -re->panosi*har->co[0] + re->panoco*har->co[2];
- }
- else {
- VECCOPY(vec, har->co);
- }
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ /* calculate view coordinates (and zbuffer value) */
+ for(a=0; a<obr->tothalo; a++) {
+ if((a & 255)==0) har= obr->bloha[a>>8];
+ else har++;
- projectfunc(vec, re->winmat, hoco);
-
- /* we clip halos less critical, but not for the Z */
- hoco[0]*= 0.5;
- hoco[1]*= 0.5;
-
- if( panotestclip(re, do_pano, hoco) ) {
- har->miny= har->maxy= -10000; /* that way render clips it */
- }
- else if(hoco[3]<0.0) {
- har->miny= har->maxy= -10000; /* render clips it */
- }
- else /* do the projection...*/
- {
- /* bring back hocos */
- hoco[0]*= 2.0;
- hoco[1]*= 2.0;
+ if(do_pano) {
+ vec[0]= re->panoco*har->co[0] + re->panosi*har->co[2];
+ vec[1]= har->co[1];
+ vec[2]= -re->panosi*har->co[0] + re->panoco*har->co[2];
+ }
+ else {
+ VECCOPY(vec, har->co);
+ }
+
+ projectfunc(vec, re->winmat, hoco);
- zn= hoco[3];
- har->xs= 0.5*re->winx*(1.0+hoco[0]/zn); /* the 0.5 negates the previous 2...*/
- har->ys= 0.5*re->winy*(1.0+hoco[1]/zn);
-
- /* this should be the zbuffer coordinate */
- har->zs= 0x7FFFFF*(hoco[2]/zn);
- /* taking this from the face clip functions? seems ok... */
- har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
+ /* we clip halos less critical, but not for the Z */
+ hoco[0]*= 0.5;
+ hoco[1]*= 0.5;
- vec[0]+= har->hasize;
- projectfunc(vec, re->winmat, hoco);
- vec[0]-= har->hasize;
- zn= hoco[3];
- har->rad= fabs(har->xs- 0.5*re->winx*(1.0+hoco[0]/zn));
-
- /* this clip is not really OK, to prevent stars to become too large */
- if(har->type & HA_ONLYSKY) {
- if(har->rad>3.0) har->rad= 3.0;
+ if( panotestclip(re, do_pano, hoco) ) {
+ har->miny= har->maxy= -10000; /* that way render clips it */
}
-
- har->radsq= har->rad*har->rad;
-
- har->miny= har->ys - har->rad/re->ycor;
- har->maxy= har->ys + har->rad/re->ycor;
-
- /* the Zd value is still not really correct for pano */
-
- vec[2]-= har->hasize; /* z negative, otherwise it's clipped */
- projectfunc(vec, re->winmat, hoco);
- zn= hoco[3];
- zn= fabs( (float)har->zs - 0x7FFFFF*(hoco[2]/zn));
- har->zd= CLAMPIS(zn, 0, INT_MAX);
-
+ else if(hoco[3]<0.0) {
+ har->miny= har->maxy= -10000; /* render clips it */
+ }
+ else /* do the projection...*/
+ {
+ /* bring back hocos */
+ hoco[0]*= 2.0;
+ hoco[1]*= 2.0;
+
+ zn= hoco[3];
+ har->xs= 0.5*re->winx*(1.0+hoco[0]/zn); /* the 0.5 negates the previous 2...*/
+ har->ys= 0.5*re->winy*(1.0+hoco[1]/zn);
+
+ /* this should be the zbuffer coordinate */
+ har->zs= 0x7FFFFF*(hoco[2]/zn);
+ /* taking this from the face clip functions? seems ok... */
+ har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
+
+ vec[0]+= har->hasize;
+ projectfunc(vec, re->winmat, hoco);
+ vec[0]-= har->hasize;
+ zn= hoco[3];
+ har->rad= fabs(har->xs- 0.5*re->winx*(1.0+hoco[0]/zn));
+
+ /* this clip is not really OK, to prevent stars to become too large */
+ if(har->type & HA_ONLYSKY) {
+ if(har->rad>3.0) har->rad= 3.0;
+ }
+
+ har->radsq= har->rad*har->rad;
+
+ har->miny= har->ys - har->rad/re->ycor;
+ har->maxy= har->ys + har->rad/re->ycor;
+
+ /* the Zd value is still not really correct for pano */
+
+ vec[2]-= har->hasize; /* z negative, otherwise it's clipped */
+ projectfunc(vec, re->winmat, hoco);
+ zn= hoco[3];
+ zn= fabs( (float)har->zs - 0x7FFFFF*(hoco[2]/zn));
+ har->zd= CLAMPIS(zn, 0, INT_MAX);
+
+ }
+
}
-
}
+}
- /* set flags at 0 if clipped away */
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak;
- else vlr++;
+/* ------------------------------------------------------------------------- */
- vlr->flag |= R_VISIBLE;
- if(vlr->v4) {
- if(vlr->v1->clip & vlr->v2->clip & vlr->v3->clip & vlr->v4->clip) vlr->flag &= ~R_VISIBLE;
- }
- else if(vlr->v1->clip & vlr->v2->clip & vlr->v3->clip) vlr->flag &= ~R_VISIBLE;
+ObjectInstanceRen *RE_addRenderInstance(Render *re, ObjectRen *obr, Object *ob, Object *par, int index, int psysindex, float mat[][4])
+{
+ ObjectInstanceRen *obi;
+ float mat3[3][3];
+
+ obi= MEM_callocN(sizeof(ObjectInstanceRen), "ObjectInstanceRen");
+ obi->obr= obr;
+ obi->ob= ob;
+ obi->par= par;
+ obi->index= index;
+ obi->psysindex= psysindex;
+
+ if(mat) {
+ Mat4CpyMat4(obi->mat, mat);
+ Mat3CpyMat4(mat3, mat);
+ Mat3Inv(obi->imat, mat3);
+ obi->flag |= R_DUPLI_TRANSFORMED;
+ }
- }
+ BLI_addtail(&re->instancetable, obi);
+ return obi;
}
-/* ------------------------------------------------------------------------- */
-
-void set_normalflags(Render *re)
+void RE_makeRenderInstances(Render *re)
{
- VlakRen *vlr = NULL;
- float *v1, xn, yn, zn;
- int a1, doflip;
-
- /* switch normal 'snproj' values (define which axis is the optimal one for calculations) */
- for(a1=0; a1<re->totvlak; a1++) {
- if((a1 & 255)==0) vlr= re->vlaknodes[a1>>8].vlak;
- else vlr++;
-
- vlr->noflag= 0;
-
- /* abuse of this flag... this is code that just sets face normal in direction of camera */
- /* that convention we should get rid of */
- if((vlr->flag & R_NOPUNOFLIP)==0) {
-
- doflip= 0;
- if(re->r.mode & R_ORTHO) {
- if(vlr->n[2]>0.0) doflip= 1;
- }
- else {
- v1= vlr->v1->co;
- if( (v1[0]*vlr->n[0] +v1[1]*vlr->n[1] +v1[2]*vlr->n[2])<0.0 ) doflip= 1;
- }
- if(doflip) {
- vlr->n[0]= -vlr->n[0];
- vlr->n[1]= -vlr->n[1];
- vlr->n[2]= -vlr->n[2];
- vlr->noflag |= R_FLIPPED_NO;
- }
+ ObjectInstanceRen *obi, *oldobi;
+ ListBase newlist;
+ int tot;
+
+ /* convert list of object instances to an array for index based lookup */
+ tot= BLI_countlist(&re->instancetable);
+ re->objectinstance= MEM_callocN(sizeof(ObjectInstanceRen)*tot, "ObjectInstance");
+ re->totinstance= tot;
+ newlist.first= newlist.last= NULL;
+
+ obi= re->objectinstance;
+ for(oldobi=re->instancetable.first; oldobi; oldobi=oldobi->next) {
+ *obi= *oldobi;
+
+ if(obi->obr) {
+ obi->prev= obi->next= NULL;
+ BLI_addtail(&newlist, obi);
+ obi++;
}
-
- /* recalculate puno. Displace & flipped matrices can screw up */
- vlr->puno= 0;
- if(!(vlr->flag & R_TANGENT)) {
- if( Inpf(vlr->n, vlr->v1->n) < 0.0 ) vlr->puno |= ME_FLIPV1;
- if( Inpf(vlr->n, vlr->v2->n) < 0.0 ) vlr->puno |= ME_FLIPV2;
- if( Inpf(vlr->n, vlr->v3->n) < 0.0 ) vlr->puno |= ME_FLIPV3;
- if(vlr->v4 && Inpf(vlr->n, vlr->v4->n) < 0.0 ) vlr->puno |= ME_FLIPV4;
- }
- xn= fabs(vlr->n[0]);
- yn= fabs(vlr->n[1]);
- zn= fabs(vlr->n[2]);
- if(zn>=xn && zn>=yn) vlr->noflag |= R_SNPROJ_X;
- else if(yn>=xn && yn>=zn) vlr->noflag |= R_SNPROJ_Y;
- else vlr->noflag |= R_SNPROJ_Z;
-
+ else
+ re->totinstance--;
}
+
+ BLI_freelistN(&re->instancetable);
+ re->instancetable= newlist;
}
+int clip_render_object(float boundbox[][3], float *bounds, float winmat[][4])
+{
+ float mat[4][4], vec[4];
+ int a, fl, flag= -1;
+
+ Mat4CpyMat4(mat, winmat);
+
+ for(a=0; a<8; a++) {
+ vec[0]= (a & 1)? boundbox[0][0]: boundbox[1][0];
+ vec[1]= (a & 2)? boundbox[0][1]: boundbox[1][1];
+ vec[2]= (a & 4)? boundbox[0][2]: boundbox[1][2];
+ vec[3]= 1.0;
+ Mat4MulVec4fl(mat, vec);
+
+ fl= 0;
+ if(bounds) {
+ if(vec[0] > bounds[1]*vec[3]) fl |= 1;
+ if(vec[0]< bounds[0]*vec[3]) fl |= 2;
+ if(vec[1] > bounds[3]*vec[3]) fl |= 4;
+ if(vec[1]< bounds[2]*vec[3]) fl |= 8;
+ }
+ else {
+ if(vec[0] < -vec[3]) fl |= 1;
+ if(vec[0] > vec[3]) fl |= 2;
+ if(vec[1] < -vec[3]) fl |= 4;
+ if(vec[1] > vec[3]) fl |= 8;
+ }
+ if(vec[2] < -vec[3]) fl |= 16;
+ if(vec[2] > vec[3]) fl |= 32;
+
+ flag &= fl;
+ if(flag==0) return 0;
+ }
+ return flag;
+}
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 5e010080ac0..fcd9220df0e 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -42,6 +42,8 @@
#include "BLI_memarena.h"
#include "BLI_rand.h"
+#include "PIL_time.h"
+
#include "renderpipeline.h"
#include "render_types.h"
#include "renderdatabase.h"
@@ -279,72 +281,86 @@ static void compress_shadowbuf(ShadBuf *shb, int *rectz, int square)
/* sets start/end clipping. lar->shb should be initialized */
static void shadowbuf_autoclip(Render *re, LampRen *lar)
{
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
VlakRen *vlr= NULL;
VertRen *ver= NULL;
Material *ma= NULL;
- float minz, maxz, vec[3], viewmat[4][4];
+ float minz, maxz, vec[3], viewmat[4][4], obviewmat[4][4];
unsigned int lay = -1;
- int a, ok= 1;
+ int i, a, maxtotvert, ok= 1;
+ char *clipflag;
minz= 1.0e30f; maxz= -1.0e30f;
Mat4CpyMat4(viewmat, lar->shb->viewmat);
if(lar->mode & LA_LAYER) lay= lar->lay;
-
- /* clear clip, is being set if face is visible (clip is calculated for real later) */
- for(a=0; a<re->totvert; a++) {
- if((a & 255)==0) ver= RE_findOrAddVert(re, a);
- else ver++;
-
- ver->clip= 0;
- }
-
+
+ maxtotvert= 0;
+ for(obr=re->objecttable.first; obr; obr=obr->next)
+ maxtotvert= MAX2(obr->totvert, maxtotvert);
+
+ clipflag= MEM_callocN(sizeof(char)*maxtotvert, "autoclipflag");
+
/* set clip in vertices when face visible */
- for(a=0; a<re->totvlak; a++) {
-
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak;
- else vlr++;
-
- /* note; these conditions are copied from zbuffer_shadow() */
- if(vlr->mat!= ma) {
- ma= vlr->mat;
- ok= 1;
- if((ma->mode & MA_SHADBUF)==0) ok= 0;
- }
-
- if(ok && (vlr->lay & lay)) {
- vlr->v1->clip= 1;
- vlr->v2->clip= 1;
- vlr->v3->clip= 1;
- if(vlr->v4) vlr->v4->clip= 1;
- }
- }
-
- /* calculate min and max */
- for(a=0; a< re->totvert;a++) {
- if((a & 255)==0) ver= RE_findOrAddVert(re, a);
- else ver++;
+ for(i=0, obi=re->instancetable.first; obi; i++, obi=obi->next) {
+ obr= obi->obr;
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulMat4(obviewmat, obi->mat, viewmat);
+ else
+ Mat4CpyMat4(obviewmat, viewmat);
+
+ memset(clipflag, 0, sizeof(char)*obr->totvert);
+
+ /* clear clip, is being set if face is visible (clip is calculated for real later) */
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
+
+ /* note; these conditions are copied from zbuffer_shadow() */
+ if(vlr->mat!= ma) {
+ ma= vlr->mat;
+ ok= 1;
+ if((ma->mode & MA_SHADBUF)==0) ok= 0;
+ }
+
+ if(ok && (obr->lay & lay)) {
+ clipflag[vlr->v1->index]= 1;
+ clipflag[vlr->v2->index]= 1;
+ clipflag[vlr->v3->index]= 1;
+ if(vlr->v4) clipflag[vlr->v4->index]= 1;
+ }
+ }
- if(ver->clip) {
- VECCOPY(vec, ver->co);
- Mat4MulVecfl(viewmat, vec);
- /* Z on visible side of lamp space */
- if(vec[2] < 0.0f) {
- float inpr, z= -vec[2];
-
- /* since vec is rotated in lampspace, this is how to get the cosine of angle */
- /* precision is set 20% larger */
- vec[2]*= 1.2f;
- Normalize(vec);
- inpr= - vec[2];
-
- if(inpr>=lar->spotsi) {
- if(z<minz) minz= z;
- if(z>maxz) maxz= z;
+ /* calculate min and max */
+ for(a=0; a< obr->totvert;a++) {
+ if((a & 255)==0) ver= RE_findOrAddVert(obr, a);
+ else ver++;
+
+ if(clipflag[a]) {
+ VECCOPY(vec, ver->co);
+ Mat4MulVecfl(obviewmat, vec);
+ /* Z on visible side of lamp space */
+ if(vec[2] < 0.0f) {
+ float inpr, z= -vec[2];
+
+ /* since vec is rotated in lampspace, this is how to get the cosine of angle */
+ /* precision is set 20% larger */
+ vec[2]*= 1.2f;
+ Normalize(vec);
+ inpr= - vec[2];
+
+ if(inpr>=lar->spotsi) {
+ if(z<minz) minz= z;
+ if(z>maxz) maxz= z;
+ }
}
}
}
}
+
+ MEM_freeN(clipflag);
/* set clipping min and max */
if(minz < maxz) {
@@ -369,9 +385,6 @@ void makeshadowbuf(Render *re, LampRen *lar)
float wsize, *jitbuf, twozero[2]= {0.0f, 0.0f}, angle, temp;
int *rectz, samples;
- /* XXXX EVIL! this global is used in clippyra(), zbuf.c */
- R.clipcrop= 1.0f;
-
if(lar->bufflag & (LA_SHADBUF_AUTO_START|LA_SHADBUF_AUTO_END))
shadowbuf_autoclip(re, lar);
@@ -391,38 +404,132 @@ void makeshadowbuf(Render *re, LampRen *lar)
MTC_Mat4MulMat4(shb->persmat, shb->viewmat, shb->winmat);
if(ELEM(lar->buftype, LA_SHADBUF_REGULAR, LA_SHADBUF_HALFWAY)) {
- /* jitter, weights */
+ /* jitter, weights - not threadsafe! */
+ BLI_lock_thread(LOCK_CUSTOM1);
shb->jit= give_jitter_tab(shb->samp);
make_jitter_weight_tab(shb, lar->filtertype);
+ BLI_unlock_thread(LOCK_CUSTOM1);
shb->totbuf= lar->buffers;
if(shb->totbuf==4) jitbuf= give_jitter_tab(2);
else if(shb->totbuf==9) jitbuf= give_jitter_tab(3);
else jitbuf= twozero;
- /* temp, will be restored */
- MTC_Mat4SwapMat4(shb->persmat, re->winmat);
-
- project_renderdata(re, projectvert, 0, 0);
-
/* zbuffering */
rectz= MEM_mapallocN(sizeof(int)*shb->size*shb->size, "makeshadbuf");
for(samples=0; samples<shb->totbuf; samples++) {
- zbuffer_shadow(re, lar, rectz, shb->size, jitbuf[2*samples], jitbuf[2*samples+1]);
+ zbuffer_shadow(re, shb->persmat, lar, rectz, shb->size, jitbuf[2*samples], jitbuf[2*samples+1]);
/* create Z tiles (for compression): this system is 24 bits!!! */
compress_shadowbuf(shb, rectz, lar->mode & LA_SQUARE);
+
+ if(re->test_break())
+ break;
}
MEM_freeN(rectz);
-
- /* old matrix back */
- MTC_Mat4SwapMat4(shb->persmat, re->winmat);
/* printf("lampbuf %d\n", sizeoflampbuf(shb)); */
}
}
+static void *do_shadow_thread(void *re_v)
+{
+ Render *re= (Render*)re_v;
+ LampRen *lar;
+
+ do {
+ BLI_lock_thread(LOCK_CUSTOM1);
+ for(lar=re->lampren.first; lar; lar=lar->next) {
+ if(lar->shb && !lar->thread_assigned) {
+ lar->thread_assigned= 1;
+ break;
+ }
+ }
+ BLI_unlock_thread(LOCK_CUSTOM1);
+
+ /* if type is irregular, this only sets the perspective matrix and autoclips */
+ if(lar) {
+ makeshadowbuf(re, lar);
+ BLI_lock_thread(LOCK_CUSTOM1);
+ lar->thread_ready= 1;
+ BLI_unlock_thread(LOCK_CUSTOM1);
+ }
+ } while(lar && !re->test_break());
+
+ return NULL;
+}
+
+static volatile int g_break= 0;
+static int thread_break(void)
+{
+ return g_break;
+}
+
+void threaded_makeshadowbufs(Render *re)
+{
+ ListBase threads;
+ LampRen *lar;
+ int a, totthread= 0;
+ int (*test_break)(void);
+
+ /* count number of threads to use */
+ if(G.rendering) {
+ for(lar=re->lampren.first; lar; lar= lar->next)
+ if(lar->shb)
+ totthread++;
+
+ totthread= MIN2(totthread, re->r.threads);
+ }
+ else
+ totthread= 1; /* preview render */
+
+ if(totthread <= 1) {
+ for(lar=re->lampren.first; lar; lar= lar->next) {
+ if(re->test_break()) break;
+ if(lar->shb) {
+ /* if type is irregular, this only sets the perspective matrix and autoclips */
+ makeshadowbuf(re, lar);
+ }
+ }
+ }
+ else {
+ /* swap test break function */
+ test_break= re->test_break;
+ re->test_break= thread_break;
+
+ for(lar=re->lampren.first; lar; lar= lar->next) {
+ lar->thread_assigned= 0;
+ lar->thread_ready= 0;
+ }
+
+ BLI_init_threads(&threads, do_shadow_thread, totthread);
+
+ for(a=0; a<totthread; a++)
+ BLI_insert_thread(&threads, re);
+
+ /* keep rendering as long as there are shadow buffers not ready */
+ do {
+ if((g_break=test_break()))
+ break;
+
+ PIL_sleep_ms(50);
+
+ BLI_lock_thread(LOCK_CUSTOM1);
+ for(lar=re->lampren.first; lar; lar= lar->next)
+ if(lar->shb && !lar->thread_ready)
+ break;
+ BLI_unlock_thread(LOCK_CUSTOM1);
+ } while(lar);
+
+ BLI_end_threads(&threads);
+
+ /* unset threadsafety */
+ re->test_break= test_break;
+ g_break= 0;
+ }
+}
+
void freeshadowbuf(LampRen *lar)
{
if(lar->shb) {
@@ -545,11 +652,11 @@ static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int
/* the externally called shadow testing (reading) function */
/* return 1.0: no shadow at all */
-float testshadowbuf(ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp)
+float testshadowbuf(ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp, float mat_bias)
{
ShadSampleBuf *shsample;
float fac, co[4], dx[3], dy[3], shadfac=0.0f;
- float xs1,ys1, siz, *jit, *weight, xres, yres;
+ float xs1,ys1, siz, *jit, *weight, xres, yres, biasf;
int xs, ys, zs, bias, *rz;
short a, num;
@@ -586,10 +693,12 @@ float testshadowbuf(ShadBuf *shb, float *rco, float *dxco, float *dyco, float in
num= shb->samp*shb->samp;
fac= shb->soft;
+ if(mat_bias!=0.0f) biasf= shb->bias*mat_bias;
+ else biasf= shb->bias;
/* with inp==1.0, bias is half the size. correction value was 1.1, giving errors
on cube edges, with one side being almost frontal lighted (ton) */
- bias= (1.5f-inp*inp)*shb->bias;
-
+ bias= (1.5f-inp*inp)*biasf;
+
if(num==1) {
for(shsample= shb->buffers.first; shsample; shsample= shsample->next)
shadfac += readshadowbuf(shb, shsample, bias, (int)xs1, (int)ys1, zs);
@@ -884,6 +993,7 @@ typedef struct ISBBranch {
typedef struct BSPFace {
Boxf box;
float *v1, *v2, *v3, *v4;
+ int obi; /* object for face lookup */
int facenr; /* index to retrieve VlakRen */
int type; /* only for strand now */
short shad_alpha, is_full;
@@ -1063,7 +1173,7 @@ static int isb_bsp_insert(ISBBranch *root, MemArena *memarena, ISBSample *sample
/* insert */
bspn->samples[bspn->totsamp]= sample;
bspn->totsamp++;
-
+
/* split if allowed and needed */
if(bspn->totsamp==BSPMAX_SAMPLE) {
if(i==BSPMAX_DEPTH) {
@@ -1262,7 +1372,7 @@ static void isb_bsp_face_inside(ISBBranch *bspn, BSPFace *face)
for(a=bspn->totsamp-1; a>=0; a--) {
ISBSample *samp= bspn->samples[a];
- if(samp->facenr!=face->facenr && samp->shadfac) {
+ if((samp->facenr!=face->facenr || samp->obi!=face->obi) && samp->shadfac) {
if(face->box.zmin < samp->zco[2]) {
if(BLI_in_rctf((rctf *)&face->box, samp->zco[0], samp->zco[1])) {
int inshadow= 0;
@@ -1308,7 +1418,7 @@ static void isb_bsp_recalc_box(ISBBranch *root)
}
/* callback function for zbuf clip */
-static void isb_bsp_test_strand(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
+static void isb_bsp_test_strand(ZSpan *zspan, int obi, int zvlnr, float *v1, float *v2, float *v3, float *v4)
{
BSPFace face;
@@ -1316,6 +1426,7 @@ static void isb_bsp_test_strand(ZSpan *zspan, int zvlnr, float *v1, float *v2, f
face.v2= v2;
face.v3= v3;
face.v4= v4;
+ face.obi= obi;
face.facenr= zvlnr & ~RE_QUAD_OFFS;
face.type= R_STRAND;
if(R.osa)
@@ -1341,7 +1452,7 @@ static void isb_bsp_test_strand(ZSpan *zspan, int zvlnr, float *v1, float *v2, f
}
/* callback function for zbuf clip */
-static void isb_bsp_test_face(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
+static void isb_bsp_test_face(ZSpan *zspan, int obi, int zvlnr, float *v1, float *v2, float *v3, float *v4)
{
BSPFace face;
@@ -1349,6 +1460,7 @@ static void isb_bsp_test_face(ZSpan *zspan, int zvlnr, float *v1, float *v2, flo
face.v2= v2;
face.v3= v3;
face.v4= v4;
+ face.obi= obi;
face.facenr= zvlnr & ~RE_QUAD_OFFS;
face.type= 0;
if(R.osa)
@@ -1386,13 +1498,15 @@ static int testclip_minmax(float *ho, float *minmax)
/* main loop going over all faces and check in bsp overlaps, fill in shadfac values */
static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
{
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
ShadBuf *shb= lar->shb;
ZSpan zspan, zspanstrand;
VlakRen *vlr= NULL;
Material *ma= NULL;
- float minmaxf[4];
+ float minmaxf[4], winmat[4][4];
int size= shb->size;
- int a, ok=1, lay= -1;
+ int i, a, ok=1, lay= -1;
/* further optimize, also sets minz maxz */
isb_bsp_recalc_box(root);
@@ -1406,7 +1520,7 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
if(lar->mode & LA_LAYER) lay= lar->lay;
/* (ab)use zspan, since we use zbuffer clipping code */
- zbuf_alloc_span(&zspan, size, size);
+ zbuf_alloc_span(&zspan, size, size, re->clipcrop);
zspan.zmulx= ((float)size)/2.0f;
zspan.zmuly= ((float)size)/2.0f;
@@ -1422,74 +1536,90 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
zspan.zbuffunc= isb_bsp_test_face;
zspanstrand.zbuffunc= isb_bsp_test_strand;
- for(a=0; a<re->totvlak; a++) {
-
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak;
- else vlr++;
-
- /* note, these conditions are copied in shadowbuf_autoclip() */
- if(vlr->mat!= ma) {
- ma= vlr->mat;
- ok= 1;
- if((ma->mode & MA_SHADBUF)==0) ok= 0;
- if(ma->mode & MA_WIRE) ok= 0;
- zspanstrand.shad_alpha= zspan.shad_alpha= ma->shad_alpha;
- }
-
- if(ok && (vlr->lay & lay)) {
- float hoco[4][4];
- int c1, c2, c3, c4=0;
- int d1, d2, d3, d4=0;
- int partclip;
+ for(i=0, obi=re->instancetable.first; obi; i++, obi=obi->next) {
+ obr= obi->obr;
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulMat4(winmat, obi->mat, shb->persmat);
+ else
+ Mat4CpyMat4(winmat, shb->persmat);
+
+ for(a=0; a<obr->totvlak; a++) {
- /* create hocos per face, it is while render */
- projectvert(vlr->v1->co, shb->persmat, hoco[0]); d1= testclip_minmax(hoco[0], minmaxf);
- projectvert(vlr->v2->co, shb->persmat, hoco[1]); d2= testclip_minmax(hoco[1], minmaxf);
- projectvert(vlr->v3->co, shb->persmat, hoco[2]); d3= testclip_minmax(hoco[2], minmaxf);
- if(vlr->v4) {
- projectvert(vlr->v4->co, shb->persmat, hoco[3]); d4= testclip_minmax(hoco[3], minmaxf);
- }
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
- /* minmax clipping */
- if(vlr->v4) partclip= d1 & d2 & d3 & d4;
- else partclip= d1 & d2 & d3;
+ /* note, these conditions are copied in shadowbuf_autoclip() */
+ if(vlr->mat!= ma) {
+ ma= vlr->mat;
+ ok= 1;
+ if((ma->mode & MA_SHADBUF)==0) ok= 0;
+ if(ma->mode & MA_WIRE) ok= 0;
+ zspanstrand.shad_alpha= zspan.shad_alpha= ma->shad_alpha;
+ }
- if(partclip==0) {
+ if(ok && (obr->lay & lay)) {
+ float hoco[4][4];
+ int c1, c2, c3, c4=0;
+ int d1, d2, d3, d4=0;
+ int partclip;
- /* window clipping */
- c1= testclip(hoco[0]);
- c2= testclip(hoco[1]);
- c3= testclip(hoco[2]);
- if(vlr->v4)
- c4= testclip(hoco[3]);
+ /* create hocos per face, it is while render */
+ projectvert(vlr->v1->co, winmat, hoco[0]); d1= testclip_minmax(hoco[0], minmaxf);
+ projectvert(vlr->v2->co, winmat, hoco[1]); d2= testclip_minmax(hoco[1], minmaxf);
+ projectvert(vlr->v3->co, winmat, hoco[2]); d3= testclip_minmax(hoco[2], minmaxf);
+ if(vlr->v4) {
+ projectvert(vlr->v4->co, winmat, hoco[3]); d4= testclip_minmax(hoco[3], minmaxf);
+ }
+
+ /* minmax clipping */
+ if(vlr->v4) partclip= d1 & d2 & d3 & d4;
+ else partclip= d1 & d2 & d3;
- /* ***** NO WIRE YET */
- if(ma->mode & MA_WIRE)
- zbufclipwire(&zspan, a+1, vlr);
- else if(vlr->v4) {
- if(vlr->flag & R_STRAND)
- zbufclip4(&zspanstrand, a+1, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
+ if(partclip==0) {
+
+ /* window clipping */
+ c1= testclip(hoco[0]);
+ c2= testclip(hoco[1]);
+ c3= testclip(hoco[2]);
+ if(vlr->v4)
+ c4= testclip(hoco[3]);
+
+ /* ***** NO WIRE YET */
+ if(ma->mode & MA_WIRE) {
+ if(vlr->v4)
+ zbufclipwire(&zspan, i, a+1, vlr->ec, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
+ else
+ zbufclipwire(&zspan, i, a+1, vlr->ec, hoco[0], hoco[1], hoco[2], 0, c1, c2, c3, 0);
+ }
+ else if(vlr->v4) {
+ if(vlr->flag & R_STRAND)
+ zbufclip4(&zspanstrand, i, a+1, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
+ else
+ zbufclip4(&zspan, i, a+1, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
+ }
else
- zbufclip4(&zspan, a+1, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
+ zbufclip(&zspan, i, a+1, hoco[0], hoco[1], hoco[2], c1, c2, c3);
+
}
- else
- zbufclip(&zspan, a+1, hoco[0], hoco[1], hoco[2], c1, c2, c3);
-
}
}
}
zbuf_free_span(&zspan);
-
}
-
/* returns 1 when the viewpixel is visible in lampbuffer */
-static int viewpixel_to_lampbuf(ShadBuf *shb, VlakRen *vlr, float x, float y, float *co)
+static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *vlr, float x, float y, float *co)
{
- float hoco[4], *v1= vlr->v1->co, *nor= vlr->n;
+ float hoco[4], v1[3], nor[3];
float dface, fac, siz;
+ RE_vlakren_get_normal(&R, obi, vlr, nor);
+ VECCOPY(v1, vlr->v1->co);
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulVecfl(obi->mat, v1);
+
/* from shadepixel() */
dface= v1[0]*nor[0] + v1[1]*nor[1] + v1[2]*nor[2];
hoco[3]= 1.0f;
@@ -1550,7 +1680,7 @@ static int viewpixel_to_lampbuf(ShadBuf *shb, VlakRen *vlr, float x, float y, fl
}
/* storage of shadow results, solid osa and transp case */
-static void isb_add_shadfac(ISBShadfacA **isbsapp, MemArena *mem, int facenr, short shadfac, short samples)
+static void isb_add_shadfac(ISBShadfacA **isbsapp, MemArena *mem, int obi, int facenr, short shadfac, short samples)
{
ISBShadfacA *new;
float shadfacf;
@@ -1562,6 +1692,7 @@ static void isb_add_shadfac(ISBShadfacA **isbsapp, MemArena *mem, int facenr, sh
shadfacf= ((float)shadfac)/(4096.0);
new= BLI_memarena_alloc(mem, sizeof(ISBShadfacA));
+ new->obi= obi;
new->facenr= facenr & ~RE_QUAD_OFFS;
new->shadfac= shadfacf;
if(*isbsapp)
@@ -1619,7 +1750,7 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
ISBBranch root;
MemArena *memarena;
long *rd;
- int *rectp, x, y, sindex, sample, bsp_err=0;
+ int *recto, *rectp, x, y, sindex, sample, bsp_err=0;
/* storage for shadow, per thread */
isbdata= shb->isb_result[pa->thread];
@@ -1669,11 +1800,14 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
ps= ps->next;
}
if(ps && ps->facenr>0) {
- VlakRen *vlr= RE_findOrAddVlak(&R, (ps->facenr-1) & RE_QUAD_MASK);
+ ObjectInstanceRen *obi= &R.objectinstance[ps->obi];
+ ObjectRen *obr= obi->obr;
+ VlakRen *vlr= RE_findOrAddVlak(obr, (ps->facenr-1) & RE_QUAD_MASK);
samp= samplebuf[sample] + sindex;
/* convert image plane pixel location to lamp buffer space */
- if(viewpixel_to_lampbuf(shb, vlr, xs + R.jit[sample][0], ys + R.jit[sample][1], samp->zco)) {
+ if(viewpixel_to_lampbuf(shb, obi, vlr, xs + R.jit[sample][0], ys + R.jit[sample][1], samp->zco)) {
+ samp->obi= ps->obi;
samp->facenr= ps->facenr & ~RE_QUAD_OFFS;
ps->shadfac= 0;
samp->shadfac= &ps->shadfac;
@@ -1685,14 +1819,18 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
}
else {
rectp= pa->rectp + sindex;
+ recto= pa->recto + sindex;
if(*rectp>0) {
- VlakRen *vlr= RE_findOrAddVlak(&R, (*rectp-1) & RE_QUAD_MASK);
+ ObjectInstanceRen *obi= &R.objectinstance[*recto];
+ ObjectRen *obr= obi->obr;
+ VlakRen *vlr= RE_findOrAddVlak(obr, (*rectp-1) & RE_QUAD_MASK);
float xs= (float)(x + pa->disprect.xmin);
float ys= (float)(y + pa->disprect.ymin);
samp= samplebuf[0] + sindex;
/* convert image plane pixel location to lamp buffer space */
- if(viewpixel_to_lampbuf(shb, vlr, xs, ys, samp->zco)) {
+ if(viewpixel_to_lampbuf(shb, obi, vlr, xs, ys, samp->zco)) {
+ samp->obi= *recto;
samp->facenr= *rectp & ~RE_QUAD_OFFS;
samp->shadfac= isbdata->shadfacs + sindex;
bound_rectf((rctf *)&root.box, samp->zco);
@@ -1729,7 +1867,7 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
PixStr *ps= (PixStr *)(*rd);
while(ps) {
if(ps->shadfac)
- isb_add_shadfac(isbsa, isbdata->memarena, ps->facenr, ps->shadfac, count_mask(ps->mask));
+ isb_add_shadfac(isbsa, isbdata->memarena, ps->obi, ps->facenr, ps->shadfac, count_mask(ps->mask));
ps= ps->next;
}
}
@@ -1857,7 +1995,9 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
int a;
for(a=0; a<4; a++) {
if(apn->p[a]) {
- VlakRen *vlr= RE_findOrAddVlak(&R, (apn->p[a]-1) & RE_QUAD_MASK);
+ ObjectInstanceRen *obi= &R.objectinstance[apn->obi[a]];
+ ObjectRen *obr= obi->obr;
+ VlakRen *vlr= RE_findOrAddVlak(obr, (apn->p[a]-1) & RE_QUAD_MASK);
float zco[3];
/* here we store shadfac, easier to create the end storage buffer. needs zero'ed, multiple shadowbufs use it */
@@ -1870,8 +2010,9 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
if(apn->mask[a] & mask) {
/* convert image plane pixel location to lamp buffer space */
- if(viewpixel_to_lampbuf(shb, vlr, xs + R.jit[sample][0], ys + R.jit[sample][1], zco)) {
+ if(viewpixel_to_lampbuf(shb, obi, vlr, xs + R.jit[sample][0], ys + R.jit[sample][1], zco)) {
samp= isb_alloc_sample_transp(samplebuf[sample] + sindex, memarena);
+ samp->obi= apn->obi[a];
samp->facenr= apn->p[a] & ~RE_QUAD_OFFS;
samp->shadfac= &apn->shadfac[a];
@@ -1884,9 +2025,10 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
else {
/* convert image plane pixel location to lamp buffer space */
- if(viewpixel_to_lampbuf(shb, vlr, xs, ys, zco)) {
+ if(viewpixel_to_lampbuf(shb, obi, vlr, xs, ys, zco)) {
samp= isb_alloc_sample_transp(samplebuf[0] + sindex, memarena);
+ samp->obi= apn->obi[a];
samp->facenr= apn->p[a] & ~RE_QUAD_OFFS;
samp->shadfac= &apn->shadfac[a];
@@ -1930,9 +2072,9 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
for(a=0; a<4; a++) {
if(apn->p[a] && apn->shadfac[a]) {
if(R.osa)
- isb_add_shadfac(isbsa, isbdata->memarena, apn->p[a], apn->shadfac[a], count_mask(apn->mask[a]));
+ isb_add_shadfac(isbsa, isbdata->memarena, apn->obi[a], apn->p[a], apn->shadfac[a], count_mask(apn->mask[a]));
else
- isb_add_shadfac(isbsa, isbdata->memarena, apn->p[a], apn->shadfac[a], 0);
+ isb_add_shadfac(isbsa, isbdata->memarena, apn->obi[a], apn->p[a], apn->shadfac[a], 0);
}
}
}
@@ -1977,10 +2119,11 @@ float ISB_getshadow(ShadeInput *shi, ShadBuf *shb)
}
else {
int sindex= y*isbdata->rectx + x;
+ int obi= shi->obi - R.objectinstance;
ISBShadfacA *isbsa= *(isbdata->shadfaca + sindex);
while(isbsa) {
- if(isbsa->facenr==shi->facenr+1)
+ if(isbsa->facenr==shi->facenr+1 && isbsa->obi==obi)
return isbsa->shadfac>=1.0f?0.0f:1.0f - isbsa->shadfac;
isbsa= isbsa->next;
}
@@ -2044,7 +2187,3 @@ void ISB_free(RenderPart *pa)
}
}
-
-
-
-
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index ca661469b36..57fda17fc48 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -31,6 +31,7 @@
#include "MTC_matrixops.h"
#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
#include "DNA_curve_types.h"
#include "DNA_group_types.h"
@@ -48,7 +49,9 @@
#include "rendercore.h"
#include "shadbuf.h"
#include "shading.h"
+#include "strand.h"
#include "texture.h"
+#include "zbuf.h"
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
@@ -121,7 +124,6 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
if(shi->depth==0) {
if(R.r.mode & R_RAYTRACE) {
if(shi->ray_mirror!=0.0f || ((shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) {
-
/* ray trace works on combined, but gives pass info */
ray_trace(shi, shr);
}
@@ -160,11 +162,16 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
}
/* MIST */
- if((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST)==0 ) {
+ if((shi->passflag & SCE_PASS_MIST) || ((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST)==0)) {
if(R.r.mode & R_ORTHO)
- alpha= mistfactor(-shi->co[2], shi->co);
+ shr->mist= mistfactor(-shi->co[2], shi->co);
else
- alpha= mistfactor(VecLength(shi->co), shi->co);
+ shr->mist= mistfactor(VecLength(shi->co), shi->co);
+ }
+ else shr->mist= 0.0f;
+
+ if((R.wrld.mode & WO_MIST) && (shi->mat->mode & MA_NOMIST)==0 ) {
+ alpha= shr->mist;
}
else alpha= 1.0f;
@@ -179,6 +186,8 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
}
else shr->combined[3]= 1.0f;
+ /* add z */
+ shr->z= -shi->co[2];
}
/* **************************************************************************** */
@@ -208,14 +217,28 @@ void vlr_set_uv_indices(VlakRen *vlr, int *i1, int *i2, int *i3)
}
}
+static void normal_transform(float imat[][3], float *nor)
+{
+ float xn, yn, zn;
+
+ xn= nor[0];
+ yn= nor[1];
+ zn= nor[2];
+
+ nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
+ nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
+ nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+}
/* copy data from face to ShadeInput, general case */
-/* indices 0 1 2 3 only. shi->puno should be set! */
-void shade_input_set_triangle_i(ShadeInput *shi, VlakRen *vlr, short i1, short i2, short i3)
+/* indices 0 1 2 3 only */
+void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen *vlr, short i1, short i2, short i3)
{
VertRen **vpp= &vlr->v1;
shi->vlr= vlr;
+ shi->obi= obi;
+ shi->obr= obi->obr;
shi->v1= vpp[i1];
shi->v2= vpp[i2];
@@ -230,40 +253,45 @@ void shade_input_set_triangle_i(ShadeInput *shi, VlakRen *vlr, short i1, short i
shi->osatex= (shi->mat->texco & TEXCO_OSA);
shi->mode= shi->mat->mode_l; /* or-ed result for all nodes */
+
+ /* facenormal copy, can get flipped */
+ shi->flippednor= RE_vlakren_get_normal(&R, obi, vlr, shi->facenor);
+
+ /* copy of original pre-flipped normal, for geometry->front/back node output */
+ VECCOPY(shi->orignor, shi->facenor);
+ if(shi->flippednor)
+ VECMUL(shi->orignor, -1.0f);
/* calculate vertexnormals */
if(vlr->flag & R_SMOOTH) {
- float *n1= shi->v1->n, *n2= shi->v2->n, *n3= shi->v3->n;
- char p1, p2, p3;
-
- p1= 1<<i1;
- p2= 1<<i2;
- p3= 1<<i3;
-
- if(shi->puno & p1) {
- shi->n1[0]= -n1[0]; shi->n1[1]= -n1[1]; shi->n1[2]= -n1[2];
- } else {
- VECCOPY(shi->n1, n1);
- }
- if(shi->puno & p2) {
- shi->n2[0]= -n2[0]; shi->n2[1]= -n2[1]; shi->n2[2]= -n2[2];
- } else {
- VECCOPY(shi->n2, n2);
+ VECCOPY(shi->n1, shi->v1->n);
+ VECCOPY(shi->n2, shi->v2->n);
+ VECCOPY(shi->n3, shi->v3->n);
+
+ if(obi->flag & R_TRANSFORMED) {
+ normal_transform(obi->imat, shi->n1);
+ normal_transform(obi->imat, shi->n2);
+ normal_transform(obi->imat, shi->n3);
}
- if(shi->puno & p3) {
- shi->n3[0]= -n3[0]; shi->n3[1]= -n3[1]; shi->n3[2]= -n3[2];
- } else {
- VECCOPY(shi->n3, n3);
+
+ if(!(vlr->flag & (R_NOPUNOFLIP|R_TANGENT))) {
+ if(INPR(shi->facenor, shi->n1) < 0.0f) {
+ shi->n1[0]= -shi->n1[0];
+ shi->n1[1]= -shi->n1[1];
+ shi->n1[2]= -shi->n1[2];
+ }
+ if(INPR(shi->facenor, shi->n2) < 0.0f) {
+ shi->n2[0]= -shi->n2[0];
+ shi->n2[1]= -shi->n2[1];
+ shi->n2[2]= -shi->n2[2];
+ }
+ if(INPR(shi->facenor, shi->n3) < 0.0f) {
+ shi->n3[0]= -shi->n3[0];
+ shi->n3[1]= -shi->n3[1];
+ shi->n3[2]= -shi->n3[2];
+ }
}
}
- /* facenormal copy, can get flipped */
- VECCOPY(shi->facenor, vlr->n);
-
- /* copy of original pre-flipped normal, for geometry->front/back node output */
- VECCOPY(shi->orignor, vlr->n);
- if (vlr->noflag & R_FLIPPED_NO) {
- VECMUL(shi->orignor, -1.0f);
- }
}
/* note, facenr declared volatile due to over-eager -O2 optimizations
@@ -271,26 +299,25 @@ void shade_input_set_triangle_i(ShadeInput *shi, VlakRen *vlr, short i1, short i
*/
/* copy data from face to ShadeInput, scanline case */
-void shade_input_set_triangle(ShadeInput *shi, volatile int facenr, int normal_flip)
+void shade_input_set_triangle(ShadeInput *shi, volatile int obi, volatile int facenr, int normal_flip)
{
if(facenr>0) {
+ shi->obi= &R.objectinstance[obi];
+ shi->obr= shi->obi->obr;
shi->facenr= (facenr-1) & RE_QUAD_MASK;
- if( shi->facenr < R.totvlak ) {
- VlakRen *vlr= RE_findOrAddVlak(&R, shi->facenr);
-
- shi->puno= normal_flip?vlr->puno:0;
+ if( shi->facenr < shi->obr->totvlak ) {
+ VlakRen *vlr= RE_findOrAddVlak(shi->obr, shi->facenr);
if(facenr & RE_QUAD_OFFS)
- shade_input_set_triangle_i(shi, vlr, 0, 2, 3);
+ shade_input_set_triangle_i(shi, shi->obi, vlr, 0, 2, 3);
else
- shade_input_set_triangle_i(shi, vlr, 0, 1, 2);
+ shade_input_set_triangle_i(shi, shi->obi, vlr, 0, 1, 2);
}
else
shi->vlr= NULL; /* general signal we got sky */
}
else
shi->vlr= NULL; /* general signal we got sky */
-
}
/* full osa case: copy static info */
@@ -300,6 +327,251 @@ void shade_input_copy_triangle(ShadeInput *shi, ShadeInput *from)
memcpy(shi, from, sizeof(struct ShadeInputCopy));
}
+/* copy data from strand to shadeinput */
+void shade_input_set_strand(ShadeInput *shi, StrandRen *strand, StrandPoint *spoint)
+{
+ /* note, shi->mat is set in node shaders */
+ shi->mat= shi->mat_override? shi->mat_override: strand->buffer->ma;
+
+ shi->osatex= (shi->mat->texco & TEXCO_OSA);
+ shi->mode= shi->mat->mode_l; /* or-ed result for all nodes */
+
+ /* shade_input_set_viewco equivalent */
+ VECCOPY(shi->co, spoint->co);
+ VECCOPY(shi->view, shi->co);
+ Normalize(shi->view);
+
+ shi->xs= (int)spoint->x;
+ shi->ys= (int)spoint->y;
+
+ if(shi->osatex || (R.r.mode & R_SHADOW)) {
+ VECCOPY(shi->dxco, spoint->dtco);
+ VECCOPY(shi->dyco, spoint->dsco);
+ }
+
+ /* dxview, dyview, not supported */
+
+ /* facenormal, simply viewco flipped */
+ VECCOPY(shi->facenor, spoint->nor);
+ VECCOPY(shi->orignor, shi->facenor);
+
+ /* shade_input_set_normals equivalent */
+ if(shi->mat->mode & MA_TANGENT_STR)
+ VECCOPY(shi->vn, spoint->tan)
+ else
+ VECCOPY(shi->vn, spoint->nor)
+
+ VECCOPY(shi->vno, shi->vn);
+}
+
+void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert *svert, StrandPoint *spoint)
+{
+ StrandBuffer *strandbuf= strand->buffer;
+ ObjectRen *obr= strandbuf->obr;
+ StrandVert *sv;
+ int mode= shi->mode; /* or-ed result for all nodes */
+ short texco= shi->mat->texco;
+
+ if((shi->mat->texco & TEXCO_REFL)) {
+ /* shi->dxview, shi->dyview, not supported */
+ }
+
+ if(shi->osatex && (texco & (TEXCO_NORM|TEXCO_REFL))) {
+ /* not supported */
+ }
+
+ if(mode & (MA_TANGENT_V|MA_NORMAP_TANG)) {
+ VECCOPY(shi->tang, spoint->tan);
+ }
+
+ if(mode & MA_STR_SURFDIFF) {
+ float *surfnor= RE_strandren_get_surfnor(obr, strand, 0);
+
+ if(surfnor)
+ VECCOPY(shi->surfnor, surfnor)
+ else
+ VECCOPY(shi->surfnor, shi->vn)
+
+ if(shi->mat->strand_surfnor > 0.0f) {
+ shi->surfdist= 0.0f;
+ for(sv=strand->vert; sv!=svert; sv++)
+ shi->surfdist+=VecLenf(sv->co, (sv+1)->co);
+ shi->surfdist += 0.5f*(spoint->strandco+1.0f)*VecLenf(sv->co, (sv+1)->co);
+ }
+ }
+
+ if(R.r.mode & R_SPEED) {
+ float *speed;
+
+ speed= RE_strandren_get_winspeed(shi->obi, strand, 0);
+ if(speed)
+ QUATCOPY(shi->winspeed, speed)
+ else
+ shi->winspeed[0]= shi->winspeed[1]= shi->winspeed[2]= shi->winspeed[3]= 0.0f;
+ }
+
+ /* shade_input_set_shade_texco equivalent */
+ if(texco & NEED_UV) {
+ if(texco & TEXCO_ORCO) {
+ VECCOPY(shi->lo, strand->orco);
+ /* no shi->osatex, orco derivatives are zero */
+ }
+
+ if(texco & TEXCO_GLOB) {
+ VECCOPY(shi->gl, shi->co);
+ MTC_Mat4MulVecfl(R.viewinv, shi->gl);
+
+ if(shi->osatex) {
+ VECCOPY(shi->dxgl, shi->dxco);
+ MTC_Mat3MulVecfl(R.imat, shi->dxco);
+ VECCOPY(shi->dygl, shi->dyco);
+ MTC_Mat3MulVecfl(R.imat, shi->dyco);
+ }
+ }
+
+ if(texco & TEXCO_STRAND) {
+ shi->strandco= spoint->strandco;
+
+ if(shi->osatex) {
+ shi->dxstrand= spoint->dtstrandco;
+ shi->dystrand= 0.0f;
+ }
+ }
+
+ if((texco & TEXCO_UV) || (mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE))) {
+ MCol *mcol;
+ float *uv;
+ char *name;
+ int i;
+
+ shi->totuv= 0;
+ shi->totcol= 0;
+
+ if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP)) {
+ for (i=0; (mcol=RE_strandren_get_mcol(obr, strand, i, &name, 0)); i++) {
+ ShadeInputCol *scol= &shi->col[i];
+ char *cp= (char*)mcol;
+
+ shi->totcol++;
+ scol->name= name;
+
+ scol->col[0]= cp[0]/255.0f;
+ scol->col[1]= cp[1]/255.0f;
+ scol->col[2]= cp[2]/255.0f;
+ }
+
+ if(shi->totcol) {
+ shi->vcol[0]= shi->col[0].col[0];
+ shi->vcol[1]= shi->col[0].col[1];
+ shi->vcol[2]= shi->col[0].col[2];
+ }
+ else {
+ shi->vcol[0]= 0.0f;
+ shi->vcol[1]= 0.0f;
+ shi->vcol[2]= 0.0f;
+ }
+ }
+
+ for (i=0; (uv=RE_strandren_get_uv(obr, strand, i, &name, 0)); i++) {
+ ShadeInputUV *suv= &shi->uv[i];
+
+ shi->totuv++;
+ suv->name= name;
+
+ if(strandbuf->overrideuv == i) {
+ suv->uv[0]= -1.0f;
+ suv->uv[1]= spoint->strandco;
+ suv->uv[2]= 0.0f;
+ }
+ else {
+ suv->uv[0]= -1.0f + 2.0f*uv[0];
+ suv->uv[1]= -1.0f + 2.0f*uv[1];
+ suv->uv[2]= 0.0f; /* texture.c assumes there are 3 coords */
+ }
+
+ if(shi->osatex) {
+ suv->dxuv[0]= 0.0f;
+ suv->dxuv[1]= 0.0f;
+ suv->dyuv[0]= 0.0f;
+ suv->dyuv[1]= 0.0f;
+ }
+
+ if((mode & MA_FACETEXTURE) && i==0) {
+ if((mode & (MA_VERTEXCOL|MA_VERTEXCOLP))==0) {
+ shi->vcol[0]= 1.0f;
+ shi->vcol[1]= 1.0f;
+ shi->vcol[2]= 1.0f;
+ }
+ }
+ }
+
+ if(shi->totuv == 0) {
+ ShadeInputUV *suv= &shi->uv[0];
+
+ suv->uv[0]= 0.0f;
+ suv->uv[1]= spoint->strandco;
+ suv->uv[2]= 0.0f; /* texture.c assumes there are 3 coords */
+
+ if(mode & MA_FACETEXTURE) {
+ /* no tface? set at 1.0f */
+ shi->vcol[0]= 1.0f;
+ shi->vcol[1]= 1.0f;
+ shi->vcol[2]= 1.0f;
+ }
+ }
+
+ }
+
+ if(texco & TEXCO_NORM) {
+ shi->orn[0]= -shi->vn[0];
+ shi->orn[1]= -shi->vn[1];
+ shi->orn[2]= -shi->vn[2];
+ }
+
+ if(mode & MA_RADIO) {
+ /* not supported */
+ }
+
+ if(texco & TEXCO_REFL) {
+ /* mirror reflection color textures (and envmap) */
+ calc_R_ref(shi); /* wrong location for normal maps! XXXXXXXXXXXXXX */
+ }
+
+ if(texco & TEXCO_STRESS) {
+ /* not supported */
+ }
+
+ if(texco & TEXCO_TANGENT) {
+ if((mode & MA_TANGENT_V)==0) {
+ /* just prevent surprises */
+ shi->tang[0]= shi->tang[1]= shi->tang[2]= 0.0f;
+ }
+ }
+ }
+
+ shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
+
+ /* this only avalailable for scanline renders */
+ if(shi->depth==0) {
+ if(texco & TEXCO_WINDOW) {
+ shi->winco[0]= -1.0f + 2.0f*spoint->x/(float)R.winx;
+ shi->winco[1]= -1.0f + 2.0f*spoint->y/(float)R.winy;
+ shi->winco[2]= 0.0f;
+
+ /* not supported */
+ if(shi->osatex) {
+ shi->dxwin[0]= 0.0f;
+ shi->dywin[1]= 0.0f;
+ shi->dxwin[0]= 0.0f;
+ shi->dywin[1]= 0.0f;
+ }
+ }
+
+ if(texco & TEXCO_STICKY) {
+ /* not supported */
+ }
+ }
+}
/* scanline pixel coordinates */
/* requires set_triangle */
@@ -322,7 +594,12 @@ void shade_input_set_viewco(ShadeInput *shi, float x, float y, float z)
calc_renderco_zbuf(shi->co, shi->view, z);
}
else {
- float dface, *v1= shi->v1->co;
+ float dface, v1[3];
+
+ VECCOPY(v1, shi->v1->co);
+
+ if(shi->obi->flag & R_TRANSFORMED)
+ Mat4MulVecfl(shi->obi->mat, v1);
dface= v1[0]*shi->facenor[0]+v1[1]*shi->facenor[1]+v1[2]*shi->facenor[2];
@@ -405,9 +682,19 @@ void shade_input_set_uv(ShadeInput *shi)
{
VlakRen *vlr= shi->vlr;
- if( (vlr->flag & R_SMOOTH) || (shi->mat->texco & NEED_UV) || (shi->passflag & SCE_PASS_UV)) {
- float *v1= shi->v1->co, *v2= shi->v2->co, *v3= shi->v3->co;
-
+ if((vlr->flag & R_SMOOTH) || (shi->mat->texco & NEED_UV) || (shi->passflag & SCE_PASS_UV)) {
+ float v1[3], v2[3], v3[3];
+
+ VECCOPY(v1, shi->v1->co);
+ VECCOPY(v2, shi->v2->co);
+ VECCOPY(v3, shi->v3->co);
+
+ if(shi->obi->flag & R_TRANSFORMED) {
+ Mat4MulVecfl(shi->obi->mat, v1);
+ Mat4MulVecfl(shi->obi->mat, v2);
+ Mat4MulVecfl(shi->obi->mat, v3);
+ }
+
/* exception case for wire render of edge */
if(vlr->v2==vlr->v3) {
float lend, lenc;
@@ -432,55 +719,35 @@ void shade_input_set_uv(ShadeInput *shi)
}
else {
/* most of this could become re-used for faces */
- float detsh, t00, t10, t01, t11;
-
- if(vlr->noflag & R_SNPROJ_X) {
- t00= v3[0]-v1[0]; t01= v3[1]-v1[1];
- t10= v3[0]-v2[0]; t11= v3[1]-v2[1];
- }
- else if(vlr->noflag & R_SNPROJ_Y) {
- t00= v3[0]-v1[0]; t01= v3[2]-v1[2];
- t10= v3[0]-v2[0]; t11= v3[2]-v2[2];
- }
- else {
- t00= v3[1]-v1[1]; t01= v3[2]-v1[2];
- t10= v3[1]-v2[1]; t11= v3[2]-v2[2];
- }
-
+ float detsh, t00, t10, t01, t11, xn, yn, zn;
+ int axis1, axis2;
+
+ /* find most stable axis to project */
+ xn= fabs(shi->facenor[0]);
+ yn= fabs(shi->facenor[1]);
+ zn= fabs(shi->facenor[2]);
+
+ if(zn>=xn && zn>=yn) { axis1= 0; axis2= 1; }
+ else if(yn>=xn && yn>=zn) { axis1= 0; axis2= 2; }
+ else { axis1= 1; axis2= 2; }
+
+ /* compute u,v and derivatives */
+ t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2];
+ t10= v3[axis1]-v2[axis1]; t11= v3[axis2]-v2[axis2];
+
detsh= 1.0f/(t00*t11-t10*t01);
t00*= detsh; t01*=detsh;
t10*=detsh; t11*=detsh;
-
- if(vlr->noflag & R_SNPROJ_X) {
- shi->u= (shi->co[0]-v3[0])*t11-(shi->co[1]-v3[1])*t10;
- shi->v= (shi->co[1]-v3[1])*t00-(shi->co[0]-v3[0])*t01;
- if(shi->osatex) {
- shi->dx_u= shi->dxco[0]*t11- shi->dxco[1]*t10;
- shi->dx_v= shi->dxco[1]*t00- shi->dxco[0]*t01;
- shi->dy_u= shi->dyco[0]*t11- shi->dyco[1]*t10;
- shi->dy_v= shi->dyco[1]*t00- shi->dyco[0]*t01;
- }
- }
- else if(vlr->noflag & R_SNPROJ_Y) {
- shi->u= (shi->co[0]-v3[0])*t11-(shi->co[2]-v3[2])*t10;
- shi->v= (shi->co[2]-v3[2])*t00-(shi->co[0]-v3[0])*t01;
- if(shi->osatex) {
- shi->dx_u= shi->dxco[0]*t11- shi->dxco[2]*t10;
- shi->dx_v= shi->dxco[2]*t00- shi->dxco[0]*t01;
- shi->dy_u= shi->dyco[0]*t11- shi->dyco[2]*t10;
- shi->dy_v= shi->dyco[2]*t00- shi->dyco[0]*t01;
- }
- }
- else {
- shi->u= (shi->co[1]-v3[1])*t11-(shi->co[2]-v3[2])*t10;
- shi->v= (shi->co[2]-v3[2])*t00-(shi->co[1]-v3[1])*t01;
- if(shi->osatex) {
- shi->dx_u= shi->dxco[1]*t11- shi->dxco[2]*t10;
- shi->dx_v= shi->dxco[2]*t00- shi->dxco[1]*t01;
- shi->dy_u= shi->dyco[1]*t11- shi->dyco[2]*t10;
- shi->dy_v= shi->dyco[2]*t00- shi->dyco[1]*t01;
- }
+
+ shi->u= (shi->co[axis1]-v3[axis1])*t11-(shi->co[axis2]-v3[axis2])*t10;
+ shi->v= (shi->co[axis2]-v3[axis2])*t00-(shi->co[axis1]-v3[axis1])*t01;
+ if(shi->osatex) {
+ shi->dx_u= shi->dxco[axis1]*t11- shi->dxco[axis2]*t10;
+ shi->dx_v= shi->dxco[axis2]*t00- shi->dxco[axis1]*t01;
+ shi->dy_u= shi->dyco[axis1]*t11- shi->dyco[axis2]*t10;
+ shi->dy_v= shi->dyco[axis2]*t00- shi->dyco[axis1]*t01;
}
+
/* u and v are in range -1 to 0, we allow a little bit extra but not too much, screws up speedvectors */
CLAMP(shi->u, -2.0f, 1.0f);
CLAMP(shi->v, -2.0f, 1.0f);
@@ -503,17 +770,36 @@ void shade_input_set_normals(ShadeInput *shi)
Normalize(shi->vn);
}
- else {
+ else
VECCOPY(shi->vn, shi->facenor);
- }
/* used in nodes */
VECCOPY(shi->vno, shi->vn);
}
+/* use by raytrace, sss, bake to flip into the right direction */
+void shade_input_flip_normals(ShadeInput *shi)
+{
+ shi->facenor[0]= -shi->facenor[0];
+ shi->facenor[1]= -shi->facenor[1];
+ shi->facenor[2]= -shi->facenor[2];
+
+ shi->vn[0]= -shi->vn[0];
+ shi->vn[1]= -shi->vn[1];
+ shi->vn[2]= -shi->vn[2];
+
+ shi->vno[0]= -shi->vno[0];
+ shi->vno[1]= -shi->vno[1];
+ shi->vno[2]= -shi->vno[2];
+
+ shi->flippednor= !shi->flippednor;
+}
+
void shade_input_set_shade_texco(ShadeInput *shi)
{
+ ObjectInstanceRen *obi= shi->obi;
+ ObjectRen *obr= shi->obr;
VertRen *v1= shi->v1, *v2= shi->v2, *v3= shi->v3;
float u= shi->u, v= shi->v;
float l= 1.0f+u+v, dl;
@@ -538,16 +824,20 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
/* qdn: normalmap tangent space */
- if (mode & (MA_TANGENT_V|MA_NORMAP_TANG)) {
+ if (mode & (MA_TANGENT_V|MA_NORMAP_TANG) || R.flag & R_NEED_TANGENT) {
float *s1, *s2, *s3;
-
- s1= RE_vertren_get_tangent(&R, v1, 0);
- s2= RE_vertren_get_tangent(&R, v2, 0);
- s3= RE_vertren_get_tangent(&R, v3, 0);
+
+ s1= RE_vertren_get_tangent(obr, v1, 0);
+ s2= RE_vertren_get_tangent(obr, v2, 0);
+ s3= RE_vertren_get_tangent(obr, v3, 0);
if(s1 && s2 && s3) {
shi->tang[0]= (l*s3[0] - u*s1[0] - v*s2[0]);
shi->tang[1]= (l*s3[1] - u*s1[1] - v*s2[1]);
shi->tang[2]= (l*s3[2] - u*s1[2] - v*s2[2]);
+
+ if(obi->flag & R_TRANSFORMED)
+ normal_transform(obi->imat, shi->tang);
+
/* qdn: normalize just in case */
Normalize(shi->tang);
}
@@ -556,27 +846,46 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
else {
/* qdn: normalmap tangent space */
- if (mode & (MA_TANGENT_V|MA_NORMAP_TANG)) {
+ if (mode & (MA_TANGENT_V|MA_NORMAP_TANG) || R.flag & R_NEED_TANGENT) {
/* qdn: flat faces have tangents too,
could pick either one, using average here */
- float *s1 = RE_vertren_get_tangent(&R, v1, 0);
- float *s2 = RE_vertren_get_tangent(&R, v2, 0);
- float *s3 = RE_vertren_get_tangent(&R, v3, 0);
+ float *s1 = RE_vertren_get_tangent(obr, v1, 0);
+ float *s2 = RE_vertren_get_tangent(obr, v2, 0);
+ float *s3 = RE_vertren_get_tangent(obr, v3, 0);
if (s1 && s2 && s3) {
shi->tang[0] = (s1[0] + s2[0] + s3[0]);
shi->tang[1] = (s1[1] + s2[1] + s3[1]);
shi->tang[2] = (s1[2] + s2[2] + s3[2]);
+
+ if(obi->flag & R_TRANSFORMED)
+ normal_transform(obi->imat, shi->tang);
+
Normalize(shi->tang);
}
+ else shi->tang[0]= shi->tang[1]= shi->tang[2]= 0.0f;
+ }
+ }
+
+ if(mode & MA_STR_SURFDIFF) {
+ float *surfnor= RE_vlakren_get_surfnor(obr, shi->vlr, 0);
+
+ if(surfnor) {
+ VECCOPY(shi->surfnor, surfnor)
+ if(obi->flag & R_TRANSFORMED)
+ normal_transform(obi->imat, shi->surfnor);
}
+ else
+ VECCOPY(shi->surfnor, shi->vn)
+
+ shi->surfdist= 0.0f;
}
if(R.r.mode & R_SPEED) {
float *s1, *s2, *s3;
- s1= RE_vertren_get_winspeed(&R, v1, 0);
- s2= RE_vertren_get_winspeed(&R, v2, 0);
- s3= RE_vertren_get_winspeed(&R, v3, 0);
+ s1= RE_vertren_get_winspeed(obi, v1, 0);
+ s2= RE_vertren_get_winspeed(obi, v2, 0);
+ s3= RE_vertren_get_winspeed(obi, v3, 0);
if(s1 && s2 && s3) {
shi->winspeed[0]= (l*s3[0] - u*s1[0] - v*s2[0]);
shi->winspeed[1]= (l*s3[1] - u*s1[1] - v*s2[1]);
@@ -618,6 +927,8 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->dylo[2]= dl*o3[2]-shi->dy_u*o1[2]-shi->dy_v*o2[2];
}
}
+
+ VECCOPY(shi->duplilo, obi->dupliorco);
}
if(texco & TEXCO_GLOB) {
@@ -632,7 +943,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
if(texco & TEXCO_STRAND) {
- shi->strand= (l*v3->accum - u*v1->accum - v*v2->accum);
+ shi->strandco= (l*v3->accum - u*v1->accum - v*v2->accum);
if(shi->osatex) {
dl= shi->dx_u+shi->dx_v;
shi->dxstrand= dl*v3->accum-shi->dx_u*v1->accum-shi->dx_v*v2->accum;
@@ -653,9 +964,11 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->totuv= 0;
shi->totcol= 0;
+ shi->actuv= obr->actmtface;
+ shi->actcol= obr->actmcol;
if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP)) {
- for (i=0; (mcol=RE_vlakren_get_mcol(&R, vlr, i, &name, 0)); i++) {
+ for (i=0; (mcol=RE_vlakren_get_mcol(obr, vlr, i, &name, 0)); i++) {
ShadeInputCol *scol= &shi->col[i];
char *cp1, *cp2, *cp3;
@@ -675,15 +988,17 @@ 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;
}
}
- for (i=0; (tface=RE_vlakren_get_tface(&R, vlr, i, &name, 0)); i++) {
+ for (i=0; (tface=RE_vlakren_get_tface(obr, vlr, i, &name, 0)); i++) {
ShadeInputUV *suv= &shi->uv[i];
float *uv1, *uv2, *uv3;
@@ -716,17 +1031,22 @@ void shade_input_set_shade_texco(ShadeInput *shi)
suv->dyuv[1]= 2.0f*(dl*uv3[1]-duv[0]*uv1[1]-duv[1]*uv2[1]);
}
- if((mode & MA_FACETEXTURE) && i==0) {
+ if((mode & MA_FACETEXTURE) && i==obr->actmtface) {
if((mode & (MA_VERTEXCOL|MA_VERTEXCOLP))==0) {
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);
}
}
+ shi->dupliuv[0]= -1.0f + 2.0f*obi->dupliuv[0];
+ shi->dupliuv[1]= -1.0f + 2.0f*obi->dupliuv[1];
+ shi->dupliuv[2]= 0.0f;
+
if(shi->totuv == 0) {
ShadeInputUV *suv= &shi->uv[0];
@@ -739,6 +1059,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;
}
}
}
@@ -752,22 +1073,20 @@ void shade_input_set_shade_texco(ShadeInput *shi)
if(mode & MA_RADIO) {
float *r1, *r2, *r3;
- r1= RE_vertren_get_rad(&R, v1, 0);
- r2= RE_vertren_get_rad(&R, v2, 0);
- r3= RE_vertren_get_rad(&R, v3, 0);
+ r1= RE_vertren_get_rad(obr, v1, 0);
+ r2= RE_vertren_get_rad(obr, v2, 0);
+ r3= RE_vertren_get_rad(obr, v3, 0);
if(r1 && r2 && r3) {
shi->rad[0]= (l*r3[0] - u*r1[0] - v*r2[0]);
shi->rad[1]= (l*r3[1] - u*r1[1] - v*r2[1]);
shi->rad[2]= (l*r3[2] - u*r1[2] - v*r2[2]);
}
- else {
+ else
shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
- }
}
- else {
+ else
shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
- }
if(texco & TEXCO_REFL) {
/* mirror reflection color textures (and envmap) */
@@ -777,9 +1096,9 @@ void shade_input_set_shade_texco(ShadeInput *shi)
if(texco & TEXCO_STRESS) {
float *s1, *s2, *s3;
- s1= RE_vertren_get_stress(&R, v1, 0);
- s2= RE_vertren_get_stress(&R, v2, 0);
- s3= RE_vertren_get_stress(&R, v3, 0);
+ s1= RE_vertren_get_stress(obr, v1, 0);
+ s2= RE_vertren_get_stress(obr, v2, 0);
+ s3= RE_vertren_get_stress(obr, v3, 0);
if(s1 && s2 && s3) {
shi->stress= l*s3[0] - u*s1[0] - v*s2[0];
if(shi->stress<1.0f) shi->stress-= 1.0f;
@@ -795,9 +1114,8 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
}
}
- else {
+ else
shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
- }
/* this only avalailable for scanline renders */
if(shi->depth==0) {
@@ -819,22 +1137,32 @@ void shade_input_set_shade_texco(ShadeInput *shi)
if(texco & TEXCO_STICKY) {
float *s1, *s2, *s3;
- s1= RE_vertren_get_sticky(&R, v1, 0);
- s2= RE_vertren_get_sticky(&R, v2, 0);
- s3= RE_vertren_get_sticky(&R, v3, 0);
+ s1= RE_vertren_get_sticky(obr, v1, 0);
+ s2= RE_vertren_get_sticky(obr, v2, 0);
+ s3= RE_vertren_get_sticky(obr, v3, 0);
if(s1 && s2 && s3) {
+ float winmat[4][4], ho1[4], ho2[4], ho3[4];
float Zmulx, Zmuly;
float hox, hoy, l, dl, u, v;
float s00, s01, s10, s11, detsh;
/* old globals, localized now */
Zmulx= ((float)R.winx)/2.0f; Zmuly= ((float)R.winy)/2.0f;
+
+ if(shi->obi->flag & R_TRANSFORMED)
+ zbuf_make_winmat(&R, shi->obi->mat, winmat);
+ else
+ zbuf_make_winmat(&R, NULL, winmat);
+
+ zbuf_render_project(winmat, v1->co, ho1);
+ zbuf_render_project(winmat, v2->co, ho2);
+ zbuf_render_project(winmat, v3->co, ho3);
- s00= v3->ho[0]/v3->ho[3] - v1->ho[0]/v1->ho[3];
- s01= v3->ho[1]/v3->ho[3] - v1->ho[1]/v1->ho[3];
- s10= v3->ho[0]/v3->ho[3] - v2->ho[0]/v2->ho[3];
- s11= v3->ho[1]/v3->ho[3] - v2->ho[1]/v2->ho[3];
+ s00= ho3[0]/ho3[3] - ho1[0]/ho1[3];
+ s01= ho3[1]/ho3[3] - ho1[1]/ho1[3];
+ s10= ho3[0]/ho3[3] - ho2[0]/ho2[3];
+ s11= ho3[1]/ho3[3] - ho2[1]/ho2[3];
detsh= s00*s11-s10*s01;
s00/= detsh; s01/=detsh;
@@ -843,8 +1171,8 @@ void shade_input_set_shade_texco(ShadeInput *shi)
/* recalc u and v again */
hox= x/Zmulx -1.0f;
hoy= y/Zmuly -1.0f;
- u= (hox - v3->ho[0]/v3->ho[3])*s11 - (hoy - v3->ho[1]/v3->ho[3])*s10;
- v= (hoy - v3->ho[1]/v3->ho[3])*s00 - (hox - v3->ho[0]/v3->ho[3])*s01;
+ u= (hox - ho3[0]/ho3[3])*s11 - (hoy - ho3[1]/ho3[3])*s10;
+ v= (hoy - ho3[1]/ho3[3])*s00 - (hox - ho3[0]/ho3[3])*s01;
l= 1.0f+u+v;
shi->sticky[0]= l*s3[0]-u*s1[0]-v*s2[0];
@@ -867,7 +1195,9 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
}
}
- }
+ } /* else {
+ Note! For raytracing winco is not set, important because thus means all shader input's need to have their variables set to zero else in-initialized values are used
+ */
}
/* ****************** ShadeSample ************************************** */
@@ -887,8 +1217,9 @@ void shade_input_initialize(ShadeInput *shi, RenderPart *pa, RenderLayer *rl, in
shi->combinedflag= ~rl->pass_xor;
shi->mat_override= rl->mat_override;
shi->light_override= rl->light_override;
-
+// shi->rl= rl;
/* note shi.depth==0 means first hit, not raytracing */
+
}
/* initialize per part, not per pixel! */
@@ -903,6 +1234,8 @@ void shade_sample_initialize(ShadeSample *ssamp, RenderPart *pa, RenderLayer *rl
memset(&ssamp->shr[a], 0, sizeof(ShadeResult));
}
+ get_sample_layers(pa, rl, ssamp->rlpp);
+
ssamp->samplenr= 0; /* counter, detect shadow-reuse for shaders */
}
@@ -914,7 +1247,7 @@ void shade_samples_do_AO(ShadeSample *ssamp)
if(!(R.r.mode & R_SHADOW))
return;
- if(!(R.r.mode & R_RAYTRACE))
+ if(!(R.r.mode & R_RAYTRACE) && !(R.wrld.ao_gather_method == WO_AOGATHER_APPROX))
return;
if(R.wrld.mode & WO_AMB_OCC)
@@ -926,7 +1259,7 @@ void shade_samples_do_AO(ShadeSample *ssamp)
}
-static void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
+void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
{
ShadeInput *shi;
float xs, ys;
@@ -934,7 +1267,7 @@ static void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, in
ssamp->tot= 0;
for(shi= ssamp->shi; ps; ps= ps->next) {
- shade_input_set_triangle(shi, ps->facenr, 1);
+ shade_input_set_triangle(shi, ps->obi, ps->facenr, 1);
if(shi->vlr) { /* NULL happens for env material or for 'all z' */
unsigned short curmask= ps->mask;
@@ -952,7 +1285,8 @@ static void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, in
shade_input_copy_triangle(shi, shi-1);
shi->mask= (1<<samp);
- shi->samplenr= ssamp->samplenr++;
+// shi->rl= ssamp->rlpp[samp];
+ shi->samplenr= ssamp->samplenr++; /* this counter is not being reset per pixel */
shade_input_set_viewco(shi, xs, ys, (float)ps->z);
shade_input_set_uv(shi);
shade_input_set_normals(shi);
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index f50028e4c83..8af98158981 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -26,6 +26,7 @@
*/
#include <stdio.h>
+#include <float.h>
#include <math.h>
#include <string.h>
@@ -42,6 +43,7 @@
#include "DNA_material_types.h"
/* local include */
+#include "occlusion.h"
#include "renderpipeline.h"
#include "render_types.h"
#include "pixelblending.h"
@@ -166,6 +168,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 */
@@ -195,7 +200,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 */
@@ -210,7 +215,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...
*/
@@ -350,7 +355,7 @@ void renderspothalo(ShadeInput *shi, float *col, float alpha)
if(lar->type==LA_SPOT && (lar->mode & LA_HALO) && lar->haint>0) {
if(lar->mode & LA_LAYER)
- if(shi->vlr && (lar->lay & shi->vlr->lay)==0)
+ if(shi->vlr && (lar->lay & shi->obr->lay)==0)
continue;
if((lar->lay & shi->lay)==0)
continue;
@@ -417,17 +422,21 @@ static double saacos_d(double fac)
}
/* Stoke's form factor. Need doubles here for extreme small area sizes */
-static float area_lamp_energy(float *co, float *vn, LampRen *lar)
+static float area_lamp_energy(float (*area)[3], float *co, float *vn)
{
double fac;
double vec[4][3]; /* vectors of rendered co to vertices lamp */
double cross[4][3]; /* cross products of this */
double rad[4]; /* angles between vecs */
- VECSUB(vec[0], co, lar->area[0]);
- VECSUB(vec[1], co, lar->area[1]);
- VECSUB(vec[2], co, lar->area[2]);
- VECSUB(vec[3], co, lar->area[3]);
+ /* extra test for dot */
+ if ( INPR(co, vn) <= 0.0f)
+ return 0.0f;
+
+ VECSUB(vec[0], co, area[0]);
+ VECSUB(vec[1], co, area[1]);
+ VECSUB(vec[2], co, area[2]);
+ VECSUB(vec[3], co, area[3]);
Normalize_d(vec[0]);
Normalize_d(vec[1]);
@@ -463,7 +472,35 @@ static float area_lamp_energy(float *co, float *vn, LampRen *lar)
fac+= rad[3]*(vn[0]*cross[3][0]+ vn[1]*cross[3][1]+ vn[2]*cross[3][2]);
if(fac<=0.0) return 0.0;
- return pow(fac*lar->areasize, lar->k); // corrected for buttons size and lar->dist^2
+ return fac;
+}
+
+static float area_lamp_energy_multisample(LampRen *lar, float *co, float *vn)
+{
+ /* corner vectors are moved around according lamp jitter */
+ float *jitlamp= lar->jitter, vec[3];
+ float area[4][3], intens= 0.0f;
+ int a= lar->ray_totsamp;
+
+
+ while(a--) {
+ vec[0]= jitlamp[0];
+ vec[1]= jitlamp[1];
+ vec[2]= 0.0f;
+ Mat3MulVecfl(lar->mat, vec);
+
+ VECADD(area[0], lar->area[0], vec);
+ VECADD(area[1], lar->area[1], vec);
+ VECADD(area[2], lar->area[2], vec);
+ VECADD(area[3], lar->area[3], vec);
+
+ intens+= area_lamp_energy(area, co, vn);
+
+ jitlamp+= 2;
+ }
+ intens /= (float)lar->ray_totsamp;
+
+ return pow(intens*lar->areasize, lar->k); // corrected for buttons size and lar->dist^2
}
static float spec(float inp, int hard)
@@ -825,6 +862,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)
@@ -968,8 +1007,9 @@ static void do_specular_ramp(ShadeInput *shi, float is, float t, float *spec)
/* pure AO, check for raytrace and world should have been done */
void ambient_occlusion(ShadeInput *shi)
{
-
- if((R.r.mode & R_RAYTRACE) && shi->mat->amb!=0.0f)
+ if((R.wrld.ao_gather_method == WO_AOGATHER_APPROX) && shi->mat->amb!=0.0f)
+ sample_occ(&R, shi);
+ else if((R.r.mode & R_RAYTRACE) && shi->mat->amb!=0.0f)
ray_ao(shi, shi->ao);
else
shi->ao[0]= shi->ao[1]= shi->ao[2]= 1.0f;
@@ -979,25 +1019,28 @@ void ambient_occlusion(ShadeInput *shi)
/* wrld mode was checked for */
void ambient_occlusion_to_diffuse(ShadeInput *shi, float *diff)
{
-
- if((R.r.mode & R_RAYTRACE) && shi->mat->amb!=0.0f) {
- float f= R.wrld.aoenergy*shi->mat->amb;
-
- if (R.wrld.aomix==WO_AOADDSUB) {
- diff[0] = 2.0f*shi->ao[0]-1.0f;
- diff[1] = 2.0f*shi->ao[1]-1.0f;
- diff[2] = 2.0f*shi->ao[2]-1.0f;
- }
- else if (R.wrld.aomix==WO_AOSUB) {
- diff[0] = shi->ao[0]-1.0f;
- diff[1] = shi->ao[1]-1.0f;
- diff[2] = shi->ao[2]-1.0f;
- }
- else {
- VECCOPY(diff, shi->ao);
+ if((R.r.mode & R_RAYTRACE) || R.wrld.ao_gather_method == WO_AOGATHER_APPROX) {
+ if(shi->mat->amb!=0.0f) {
+ float f= R.wrld.aoenergy*shi->mat->amb;
+
+ if (R.wrld.aomix==WO_AOADDSUB) {
+ diff[0] = 2.0f*shi->ao[0]-1.0f;
+ diff[1] = 2.0f*shi->ao[1]-1.0f;
+ diff[2] = 2.0f*shi->ao[2]-1.0f;
+ }
+ else if (R.wrld.aomix==WO_AOSUB) {
+ diff[0] = shi->ao[0]-1.0f;
+ diff[1] = shi->ao[1]-1.0f;
+ diff[2] = shi->ao[2]-1.0f;
+ }
+ else {
+ VECCOPY(diff, shi->ao);
+ }
+
+ VECMUL(diff, f);
}
-
- VECMUL(diff, f);
+ else
+ diff[0]= diff[1]= diff[2]= 0.0f;
}
else
diff[0]= diff[1]= diff[2]= 0.0f;
@@ -1016,7 +1059,7 @@ void lamp_get_shadow(LampRen *lar, ShadeInput *shi, float inp, float *shadfac, i
if(lar->buftype==LA_SHADBUF_IRREGULAR)
shadfac[3]= ISB_getshadow(shi, lar->shb);
else
- shadfac[3] = testshadowbuf(lar->shb, shi->co, shi->dxco, shi->dyco, inp);
+ shadfac[3] = testshadowbuf(lar->shb, shi->co, shi->dxco, shi->dyco, inp, shi->mat->lbias);
}
else if(lar->mode & LA_SHAD_RAY) {
ray_shadow(shi, lar, shadfac);
@@ -1051,10 +1094,10 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
/* area type has no quad or sphere option */
if(lar->type==LA_AREA) {
/* area is single sided */
- if(INPR(lv, lar->vec) > 0.0f)
- visifac= 1.0f;
- else
- visifac= 0.0f;
+ //if(INPR(lv, lar->vec) > 0.0f)
+ // visifac= 1.0f;
+ //else
+ // visifac= 0.0f;
}
else {
switch(lar->falloff_type)
@@ -1145,6 +1188,10 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
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)
@@ -1170,13 +1217,36 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
lacol[2]= lar->b;
if(lar->mode & LA_TEXTURE) do_lamp_tex(lar, lv, shi, lacol);
-
- /* tangent case; calculate fake face normal, aligned with lampvector */
- /* note, vnor==vn is used as tangent trigger for buffer shadow */
+
+ /* tangent case; calculate fake face normal, aligned with lampvector */
+ /* note, vnor==vn is used as tangent trigger for buffer shadow */
if(vlr->flag & R_TANGENT) {
- float cross[3];
- Crossf(cross, lv, vn);
- Crossf(vnor, cross, vn);
+ float cross[3], nstrand[3], blend;
+
+ if(ma->mode & MA_STR_SURFDIFF) {
+ Crossf(cross, shi->surfnor, vn);
+ Crossf(nstrand, vn, cross);
+
+ blend= INPR(nstrand, shi->surfnor);
+ blend= 1.0f - blend;
+ CLAMP(blend, 0.0f, 1.0f);
+
+ VecLerpf(vnor, nstrand, shi->surfnor, blend);
+ Normalize(vnor);
+ }
+ else {
+ Crossf(cross, lv, vn);
+ Crossf(vnor, cross, vn);
+ }
+
+ if(ma->strand_surfnor > 0.0f) {
+ if(ma->strand_surfnor > shi->surfdist) {
+ blend= (ma->strand_surfnor - shi->surfdist)/ma->strand_surfnor;
+ VecLerpf(vnor, vnor, shi->surfnor, blend);
+ Normalize(vnor);
+ }
+ }
+
vnor[0]= -vnor[0];vnor[1]= -vnor[1];vnor[2]= -vnor[2];
vn= vnor;
}
@@ -1196,9 +1266,9 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
/* this complex construction screams for a nicer implementation! (ton) */
if(R.r.mode & R_SHADOW) {
if(ma->mode & MA_SHADOW) {
- if(lar->type==LA_HEMI);
+ if(lar->type==LA_HEMI || lar->type==LA_AREA);
else if((ma->mode & MA_RAYBIAS) && (lar->mode & LA_SHAD_RAY) && (vlr->flag & R_SMOOTH)) {
- float thresh= vlr->ob->smoothresh;
+ float thresh= shi->obr->ob->smoothresh;
if(inp>thresh)
phongcorr= (inp-thresh)/(inp*(1.0f-thresh));
else
@@ -1223,7 +1293,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
else {
if(lar->type==LA_AREA)
- inp= area_lamp_energy(shi->co, vn, lar);
+ inp= area_lamp_energy_multisample(lar, shi->co, vn);
/* diffuse shaders (oren nayer gets inp from area light) */
if(ma->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff(inp, vn, lv, view, ma->roughness);
@@ -1233,7 +1303,10 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
else is= inp; // Lambert
}
- /* i is diffuse */
+ /* 'is' is diffuse */
+ if((ma->shade_flag & MA_CUBIC) && is>0.0f)
+ is= 3.0*is*is - 2.0*is*is*is; // nicer termination of shades
+
i= is*phongcorr;
if(i>0.0f) {
@@ -1387,7 +1460,7 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
/* yafray: ignore shading by photonlights, not used in Blender */
if (lar->type==LA_YF_PHOTON) continue;
- if(lar->mode & LA_LAYER) if((lar->lay & shi->vlr->lay)==0) continue;
+ if(lar->mode & LA_LAYER) if((lar->lay & shi->obr->lay)==0) continue;
if((lar->lay & shi->lay)==0) continue;
if(lar->shb || (lar->mode & LA_SHAD_RAY)) {
@@ -1447,7 +1520,6 @@ static void wrld_exposure_correct(float *diff)
void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
{
Material *ma= shi->mat;
- VlakRen *vlr= shi->vlr;
int passflag= shi->passflag;
memset(shr, 0, sizeof(ShadeResult));
@@ -1467,6 +1539,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);
@@ -1522,7 +1596,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if (lar->type==LA_YF_PHOTON) continue;
/* test for lamp layer */
- if(lar->mode & LA_LAYER) if((lar->lay & vlr->lay)==0) continue;
+ if(lar->mode & LA_LAYER) if((lar->lay & shi->obr->lay)==0) continue;
if((lar->lay & shi->lay)==0) continue;
/* accumulates in shr->diff and shr->spec and shr->shad (diffuse with shadow!) */
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index c4438a22ce5..88333265a84 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -234,11 +234,7 @@ static void approximate_Rd_rgb(ScatterSettings **ss, float rr, float *rd)
float indexf, t, idxf;
int index;
- if(rr > (RD_TABLE_RANGE_2*RD_TABLE_RANGE_2)) {
- rd[0]= Rd_rsquare(ss[0], rr);
- rd[1]= Rd_rsquare(ss[1], rr);
- rd[2]= Rd_rsquare(ss[2], rr);
- }
+ if(rr > (RD_TABLE_RANGE_2*RD_TABLE_RANGE_2));
else if(rr > RD_TABLE_RANGE) {
rr= sqrt(rr);
indexf= rr*(RD_TABLE_SIZE/RD_TABLE_RANGE_2);
@@ -246,9 +242,12 @@ static void approximate_Rd_rgb(ScatterSettings **ss, float rr, float *rd)
idxf= (float)index;
t= indexf - idxf;
- rd[0]= (ss[0]->tableRd2[index]*(1-t) + ss[0]->tableRd2[index+1]*t);
- rd[1]= (ss[1]->tableRd2[index]*(1-t) + ss[1]->tableRd2[index+1]*t);
- rd[2]= (ss[2]->tableRd2[index]*(1-t) + ss[2]->tableRd2[index+1]*t);
+ if(index >= 0 && index < RD_TABLE_SIZE) {
+ rd[0]= (ss[0]->tableRd2[index]*(1-t) + ss[0]->tableRd2[index+1]*t);
+ rd[1]= (ss[1]->tableRd2[index]*(1-t) + ss[1]->tableRd2[index+1]*t);
+ rd[2]= (ss[2]->tableRd2[index]*(1-t) + ss[2]->tableRd2[index+1]*t);
+ return;
+ }
}
else {
indexf= rr*(RD_TABLE_SIZE/RD_TABLE_RANGE);
@@ -256,10 +255,18 @@ static void approximate_Rd_rgb(ScatterSettings **ss, float rr, float *rd)
idxf= (float)index;
t= indexf - idxf;
- rd[0]= (ss[0]->tableRd[index]*(1-t) + ss[0]->tableRd[index+1]*t);
- rd[1]= (ss[1]->tableRd[index]*(1-t) + ss[1]->tableRd[index+1]*t);
- rd[2]= (ss[2]->tableRd[index]*(1-t) + ss[2]->tableRd[index+1]*t);
+ if(index >= 0 && index < RD_TABLE_SIZE) {
+ rd[0]= (ss[0]->tableRd[index]*(1-t) + ss[0]->tableRd[index+1]*t);
+ rd[1]= (ss[1]->tableRd[index]*(1-t) + ss[1]->tableRd[index+1]*t);
+ rd[2]= (ss[2]->tableRd[index]*(1-t) + ss[2]->tableRd[index+1]*t);
+ return;
+ }
}
+
+ /* fallback to slow Rd computation */
+ rd[0]= Rd_rsquare(ss[0], rr);
+ rd[1]= Rd_rsquare(ss[1], rr);
+ rd[2]= Rd_rsquare(ss[2], rr);
}
static void build_Rd_table(ScatterSettings *ss)
@@ -853,13 +860,13 @@ static void sss_create_tree_mat(Render *re, Material *mat)
setting them back, maybe we need to create our own Render? */
/* do SSS preprocessing render */
- layers= re->r.layers;
+ rr= re->result;
+ layers= rr->layers;
osa= re->osa;
osaflag= re->r.mode & R_OSA;
partsdone= re->i.partsdone;
- rr= re->result;
- re->r.layers.first= re->r.layers.last= NULL;
+ rr->layers.first= rr->layers.last= NULL;
re->osa= 0;
re->r.mode &= ~R_OSA;
re->sss_points= &points;
@@ -874,7 +881,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
re->i.partsdone= partsdone;
re->sss_mat= NULL;
re->sss_points= NULL;
- re->r.layers= layers;
+ rr->layers= layers;
re->osa= osa;
if (osaflag) re->r.mode |= R_OSA;
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
new file mode 100644
index 00000000000..85cdc844602
--- /dev/null
+++ b/source/blender/render/intern/source/strand.c
@@ -0,0 +1,1002 @@
+/**
+ * $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) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: none of this file.
+ *
+ * Contributors: Brecht Van Lommel.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_key_types.h"
+#include "DNA_material_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
+#include "BLI_memarena.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_key.h"
+#include "BKE_utildefines.h"
+
+#include "render_types.h"
+#include "initrender.h"
+#include "rendercore.h"
+#include "renderdatabase.h"
+#include "renderpipeline.h"
+#include "pixelblending.h"
+#include "shading.h"
+#include "strand.h"
+#include "zbuf.h"
+
+/* to be removed */
+void hoco_to_zco(ZSpan *zspan, float *zco, float *hoco);
+void zspan_scanconvert_strand(ZSpan *zspan, void *handle, float *v1, float *v2, float *v3, void (*func)(void *, int, int, float, float, float) );
+void zbufsinglewire(ZSpan *zspan, int obi, int zvlnr, float *ho1, float *ho2);
+
+/* *************** */
+
+static float strand_eval_width(Material *ma, float strandco)
+{
+ float fac;
+
+ strandco= 0.5f*(strandco + 1.0f);
+
+ if(ma->strand_ease!=0.0f) {
+ if(ma->strand_ease<0.0f)
+ fac= pow(strandco, 1.0+ma->strand_ease);
+ else
+ fac= pow(strandco, 1.0/(1.0f-ma->strand_ease));
+ }
+ else fac= strandco;
+
+ return ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
+}
+
+void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint)
+{
+ Material *ma;
+ StrandBuffer *strandbuf;
+ float *simplify;
+ float p[4][3], data[4], cross[3], crosslen, w, dx, dy, t;
+ int type;
+
+ strandbuf= sseg->buffer;
+ ma= sseg->buffer->ma;
+ t= spoint->t;
+ type= (strandbuf->flag & R_STRAND_BSPLINE)? KEY_BSPLINE: KEY_CARDINAL;
+
+ VECCOPY(p[0], sseg->v[0]->co);
+ VECCOPY(p[1], sseg->v[1]->co);
+ VECCOPY(p[2], sseg->v[2]->co);
+ VECCOPY(p[3], sseg->v[3]->co);
+
+ if(sseg->obi->flag & R_TRANSFORMED) {
+ Mat4MulVecfl(sseg->obi->mat, p[0]);
+ Mat4MulVecfl(sseg->obi->mat, p[1]);
+ Mat4MulVecfl(sseg->obi->mat, p[2]);
+ Mat4MulVecfl(sseg->obi->mat, p[3]);
+ }
+
+ if(t == 0.0f) {
+ VECCOPY(spoint->co, p[1]);
+ spoint->strandco= sseg->v[1]->strandco;
+
+ spoint->dtstrandco= (sseg->v[2]->strandco - sseg->v[0]->strandco);
+ if(sseg->v[0] != sseg->v[1])
+ spoint->dtstrandco *= 0.5f;
+ }
+ else if(t == 1.0f) {
+ VECCOPY(spoint->co, p[2]);
+ spoint->strandco= sseg->v[2]->strandco;
+
+ spoint->dtstrandco= (sseg->v[3]->strandco - sseg->v[1]->strandco);
+ if(sseg->v[3] != sseg->v[2])
+ spoint->dtstrandco *= 0.5f;
+ }
+ else {
+ set_four_ipo(t, data, type);
+ spoint->co[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0];
+ spoint->co[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1];
+ spoint->co[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2];
+ spoint->strandco= (1.0f-t)*sseg->v[1]->strandco + t*sseg->v[2]->strandco;
+ }
+
+ set_afgeleide_four_ipo(t, data, type);
+ spoint->dtco[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0];
+ spoint->dtco[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1];
+ spoint->dtco[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2];
+
+ VECCOPY(spoint->tan, spoint->dtco);
+ Normalize(spoint->tan);
+
+ VECCOPY(spoint->nor, spoint->co);
+ VECMUL(spoint->nor, -1.0f);
+ Normalize(spoint->nor);
+
+ spoint->width= strand_eval_width(ma, spoint->strandco);
+
+ /* simplification */
+ simplify= RE_strandren_get_simplify(strandbuf->obr, sseg->strand, 0);
+ spoint->alpha= (simplify)? simplify[1]: 1.0f;
+
+ /* outer points */
+ Crossf(cross, spoint->co, spoint->tan);
+
+ w= spoint->co[2]*strandbuf->winmat[2][3] + strandbuf->winmat[3][3];
+ dx= strandbuf->winx*cross[0]*strandbuf->winmat[0][0]/w;
+ dy= strandbuf->winy*cross[1]*strandbuf->winmat[1][1]/w;
+ w= sqrt(dx*dx + dy*dy);
+
+ if(w > 0.0f) {
+ if(strandbuf->flag & R_STRAND_B_UNITS) {
+ crosslen= VecLength(cross);
+ w= 2.0f*crosslen*strandbuf->minwidth/w;
+
+ if(spoint->width < w) {
+ spoint->alpha= spoint->width/w;
+ spoint->width= w;
+ }
+
+ if(simplify)
+ /* squared because we only change width, not length */
+ spoint->width *= simplify[0]*simplify[0];
+
+ VecMulf(cross, spoint->width*0.5f/crosslen);
+ }
+ else
+ VecMulf(cross, spoint->width/w);
+ }
+
+ VecSubf(spoint->co1, spoint->co, cross);
+ VecAddf(spoint->co2, spoint->co, cross);
+
+ VECCOPY(spoint->dsco, cross);
+}
+
+/* *************** */
+
+static void interpolate_vec1(float *v1, float *v2, float t, float negt, float *v)
+{
+ v[0]= negt*v1[0] + t*v2[0];
+}
+
+static void interpolate_vec3(float *v1, float *v2, float t, float negt, float *v)
+{
+ v[0]= negt*v1[0] + t*v2[0];
+ v[1]= negt*v1[1] + t*v2[1];
+ v[2]= negt*v1[2] + t*v2[2];
+}
+
+static void interpolate_vec4(float *v1, float *v2, float t, float negt, float *v)
+{
+ v[0]= negt*v1[0] + t*v2[0];
+ v[1]= negt*v1[1] + t*v2[1];
+ v[2]= negt*v1[2] + t*v2[2];
+ v[3]= negt*v1[3] + t*v2[3];
+}
+
+void interpolate_shade_result(ShadeResult *shr1, ShadeResult *shr2, float t, ShadeResult *shr, int addpassflag)
+{
+ float negt= 1.0f - t;
+
+ interpolate_vec4(shr1->combined, shr2->combined, t, negt, shr->combined);
+
+ if(addpassflag & SCE_PASS_VECTOR) {
+ interpolate_vec4(shr1->winspeed, shr2->winspeed, t, negt, shr->winspeed);
+ }
+ /* optim... */
+ if(addpassflag & ~(SCE_PASS_VECTOR)) {
+ if(addpassflag & SCE_PASS_Z)
+ interpolate_vec1(&shr1->z, &shr2->z, t, negt, &shr->z);
+ if(addpassflag & SCE_PASS_RGBA)
+ interpolate_vec4(shr1->col, shr2->col, t, negt, shr->col);
+ if(addpassflag & SCE_PASS_NORMAL) {
+ interpolate_vec3(shr1->nor, shr2->nor, t, negt, shr->nor);
+ Normalize(shr->nor);
+ }
+ if(addpassflag & SCE_PASS_DIFFUSE)
+ interpolate_vec3(shr1->diff, shr2->diff, t, negt, shr->diff);
+ if(addpassflag & SCE_PASS_SPEC)
+ interpolate_vec3(shr1->spec, shr2->spec, t, negt, shr->spec);
+ if(addpassflag & SCE_PASS_SHADOW)
+ interpolate_vec3(shr1->shad, shr2->shad, t, negt, shr->shad);
+ if(addpassflag & SCE_PASS_AO)
+ interpolate_vec3(shr1->ao, shr2->ao, t, negt, shr->ao);
+ if(addpassflag & SCE_PASS_REFLECT)
+ interpolate_vec3(shr1->refl, shr2->refl, t, negt, shr->refl);
+ if(addpassflag & SCE_PASS_REFRACT)
+ interpolate_vec3(shr1->refr, shr2->refr, t, negt, shr->refr);
+ if(addpassflag & SCE_PASS_RADIO)
+ interpolate_vec3(shr1->rad, shr2->rad, t, negt, shr->rad);
+ if(addpassflag & SCE_PASS_MIST)
+ interpolate_vec1(&shr1->mist, &shr2->mist, t, negt, &shr->mist);
+ }
+}
+
+void strand_apply_shaderesult_alpha(ShadeResult *shr, float alpha)
+{
+ if(alpha < 1.0f) {
+ shr->combined[0] *= alpha;
+ shr->combined[1] *= alpha;
+ shr->combined[2] *= alpha;
+ shr->combined[3] *= alpha;
+
+ shr->col[0] *= alpha;
+ shr->col[1] *= alpha;
+ shr->col[2] *= alpha;
+ shr->col[3] *= alpha;
+
+ shr->alpha *= alpha;
+ }
+}
+
+void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *sseg, StrandPoint *spoint)
+{
+ ShadeInput *shi= ssamp->shi;
+ ShadeResult *shr= ssamp->shr;
+ VlakRen vlr;
+
+ memset(&vlr, 0, sizeof(vlr));
+ vlr.flag= R_SMOOTH;
+ if(sseg->buffer->ma->mode & MA_TANGENT_STR)
+ vlr.flag |= R_TANGENT;
+
+ shi->vlr= &vlr;
+ shi->strand= sseg->strand;
+ shi->obi= sseg->obi;
+ shi->obr= sseg->obi->obr;
+
+ /* cache for shadow */
+ shi->samplenr= ssamp->samplenr++;
+
+ shade_input_set_strand(shi, sseg->strand, spoint);
+ shade_input_set_strand_texco(shi, sseg->strand, sseg->v[1], spoint);
+
+ /* init material vars */
+ // note, keep this synced with render_types.h
+ memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
+ shi->har= shi->mat->har;
+
+ /* shade */
+ shade_samples_do_AO(ssamp);
+ shade_input_do_shade(shi, shr);
+
+ /* apply simplification */
+ strand_apply_shaderesult_alpha(shr, spoint->alpha);
+
+ /* include lamphalos for strand, since halo layer was added already */
+ if(re->flag & R_LAMPHALO)
+ if(shi->layflag & SCE_LAY_HALO)
+ renderspothalo(shi, shr->combined, shr->combined[3]);
+
+ shi->strand= NULL;
+}
+
+/* *************** */
+
+struct StrandShadeCache {
+ GHash *resulthash;
+ GHash *refcounthash;
+ MemArena *memarena;
+};
+
+StrandShadeCache *strand_shade_cache_create()
+{
+ StrandShadeCache *cache;
+
+ cache= MEM_callocN(sizeof(StrandShadeCache), "StrandShadeCache");
+ cache->resulthash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ cache->refcounthash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ cache->memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+
+ return cache;
+}
+
+void strand_shade_cache_free(StrandShadeCache *cache)
+{
+ BLI_ghash_free(cache->refcounthash, NULL, NULL);
+ BLI_ghash_free(cache->resulthash, NULL, (GHashValFreeFP)MEM_freeN);
+ BLI_memarena_free(cache->memarena);
+ MEM_freeN(cache);
+}
+
+static void strand_shade_get(Render *re, StrandShadeCache *cache, ShadeSample *ssamp, StrandSegment *sseg, StrandVert *svert)
+{
+ ShadeResult *hashshr;
+ StrandPoint p;
+ int *refcount;
+
+ hashshr= BLI_ghash_lookup(cache->resulthash, svert);
+ refcount= BLI_ghash_lookup(cache->refcounthash, svert);
+
+ if(!hashshr) {
+ /* not shaded yet, shade and insert into hash */
+ p.t= (sseg->v[1] == svert)? 0.0f: 1.0f;
+ strand_eval_point(sseg, &p);
+ strand_shade_point(re, ssamp, sseg, &p);
+
+ hashshr= MEM_callocN(sizeof(ShadeResult), "HashShadeResult");
+ *hashshr= ssamp->shr[0];
+ BLI_ghash_insert(cache->resulthash, svert, hashshr);
+ }
+ else
+ /* already shaded, just copy previous result from hash */
+ ssamp->shr[0]= *hashshr;
+
+ /* lower reference count and remove if not needed anymore by any samples */
+ (*refcount)--;
+ if(*refcount == 0) {
+ BLI_ghash_remove(cache->resulthash, svert, NULL, (GHashValFreeFP)MEM_freeN);
+ BLI_ghash_remove(cache->refcounthash, svert, NULL, NULL);
+ }
+}
+
+void strand_shade_segment(Render *re, StrandShadeCache *cache, StrandSegment *sseg, ShadeSample *ssamp, float t, float s, int addpassflag)
+{
+ ShadeResult shr1, shr2;
+
+ /* get shading for two endpoints and interpolate */
+ strand_shade_get(re, cache, ssamp, sseg, sseg->v[1]);
+ shr1= ssamp->shr[0];
+ strand_shade_get(re, cache, ssamp, sseg, sseg->v[2]);
+ shr2= ssamp->shr[0];
+
+ interpolate_shade_result(&shr1, &shr2, t, ssamp->shr, addpassflag);
+
+ /* apply alpha along width */
+ if(sseg->buffer->widthfade != 0.0f) {
+ s = 1.0f - pow(fabs(s), sseg->buffer->widthfade);
+
+ strand_apply_shaderesult_alpha(ssamp->shr, s);
+ }
+}
+
+void strand_shade_unref(StrandShadeCache *cache, StrandVert *svert)
+{
+ int *refcount;
+
+ /* lower reference count and remove if not needed anymore by any samples */
+ refcount= BLI_ghash_lookup(cache->refcounthash, svert);
+
+ (*refcount)--;
+ if(*refcount == 0) {
+ BLI_ghash_remove(cache->resulthash, svert, NULL, (GHashValFreeFP)MEM_freeN);
+ BLI_ghash_remove(cache->refcounthash, svert, NULL, NULL);
+ }
+}
+
+static void strand_shade_refcount(StrandShadeCache *cache, StrandVert *svert)
+{
+ int *refcount= BLI_ghash_lookup(cache->refcounthash, svert);
+
+ if(!refcount) {
+ refcount= BLI_memarena_alloc(cache->memarena, sizeof(int));
+ *refcount= 1;
+ BLI_ghash_insert(cache->refcounthash, svert, refcount);
+ }
+ else
+ (*refcount)++;
+}
+
+/* *************** */
+
+typedef struct StrandPart {
+ Render *re;
+ ZSpan *zspan;
+
+ APixstrand *apixbuf;
+ int *totapixbuf;
+ int *rectz;
+ long *rectdaps;
+ int rectx, recty;
+ int sample;
+
+ StrandSegment *segment;
+ float t[3], s[3];
+
+ StrandShadeCache *cache;
+} StrandPart;
+
+typedef struct StrandSortSegment {
+ struct StrandSortSegment *next;
+ int obi, strand, segment;
+ float z;
+} StrandSortSegment;
+
+static int compare_strand_segment(const void *poin1, const void *poin2)
+{
+ const StrandSortSegment *seg1= (const StrandSortSegment*)poin1;
+ const StrandSortSegment *seg2= (const StrandSortSegment*)poin2;
+
+ if(seg1->z < seg2->z)
+ return -1;
+ else if(seg1->z == seg2->z)
+ return 0;
+ else
+ return 1;
+}
+
+static void do_strand_point_project(float winmat[][4], ZSpan *zspan, float *co, float *hoco, float *zco)
+{
+ projectvert(co, winmat, hoco);
+ hoco_to_zco(zspan, zco, hoco);
+}
+
+static void strand_project_point(float winmat[][4], float winx, float winy, StrandPoint *spoint)
+{
+ float div;
+
+ projectvert(spoint->co, winmat, spoint->hoco);
+
+ div= 1.0f/spoint->hoco[3];
+ spoint->x= spoint->hoco[0]*div*winx*0.5f;
+ spoint->y= spoint->hoco[1]*div*winy*0.5f;
+}
+
+static APixstrand *addpsmainAstrand(ListBase *lb)
+{
+ APixstrMain *psm;
+
+ psm= MEM_mallocN(sizeof(APixstrMain), "addpsmainA");
+ BLI_addtail(lb, psm);
+ psm->ps= MEM_callocN(4096*sizeof(APixstrand),"pixstr");
+
+ return psm->ps;
+}
+
+static APixstrand *addpsAstrand(ZSpan *zspan)
+{
+ /* make new PS */
+ if(zspan->apstrandmcounter==0) {
+ zspan->curpstrand= addpsmainAstrand(zspan->apsmbase);
+ zspan->apstrandmcounter= 4095;
+ }
+ else {
+ zspan->curpstrand++;
+ zspan->apstrandmcounter--;
+ }
+ return zspan->curpstrand;
+}
+
+#define MAX_ZROW 2000
+
+static void do_strand_fillac(void *handle, int x, int y, float u, float v, float z)
+{
+ StrandPart *spart= (StrandPart*)handle;
+ StrandShadeCache *cache= spart->cache;
+ StrandSegment *sseg= spart->segment;
+ APixstrand *apn, *apnew;
+ float t, s;
+ int offset, mask, obi, strnr, seg, zverg, bufferz;
+
+ offset = y*spart->rectx + x;
+ obi= sseg->obi - spart->re->objectinstance;
+ strnr= sseg->strand->index + 1;
+ seg= sseg->v[1] - sseg->strand->vert;
+ mask= (1<<spart->sample);
+
+ /* check against solid z-buffer */
+ zverg= (int)z;
+
+ if(spart->rectdaps) {
+ /* find the z of the sample */
+ PixStr *ps;
+ long *rd= spart->rectdaps + offset;
+
+ bufferz= 0x7FFFFFFF;
+
+ if(*rd) {
+ for(ps= (PixStr *)(*rd); ps; ps= ps->next) {
+ if(mask & ps->mask) {
+ bufferz= ps->z;
+ break;
+ }
+ }
+ }
+ }
+ else
+ bufferz= spart->rectz[offset];
+
+#define CHECK_ADD(n) \
+ if(apn->p[n]==strnr && apn->obi[n]==obi && apn->seg[n]==seg) \
+ { if(!(apn->mask[n] & mask)) { apn->mask[n] |= mask; apn->v[n] += t; apn->u[n] += s; } break; }
+#define CHECK_ASSIGN(n) \
+ if(apn->p[n]==0) \
+ {apn->obi[n]= obi; apn->p[n]= strnr; apn->z[n]= zverg; apn->mask[n]= mask; apn->v[n]= t; apn->u[n]= s; apn->seg[n]= seg; break; }
+
+ /* add to pixel list */
+ if(zverg < bufferz && (spart->totapixbuf[offset] < MAX_ZROW)) {
+ t = u*spart->t[0] + v*spart->t[1] + (1.0f-u-v)*spart->t[2];
+ s = fabs(u*spart->s[0] + v*spart->s[1] + (1.0f-u-v)*spart->s[2]);
+
+ apn= spart->apixbuf + offset;
+ while(apn) {
+ CHECK_ADD(0);
+ CHECK_ADD(1);
+ CHECK_ADD(2);
+ CHECK_ADD(3);
+ CHECK_ASSIGN(0);
+ CHECK_ASSIGN(1);
+ CHECK_ASSIGN(2);
+ CHECK_ASSIGN(3);
+
+ apnew= addpsAstrand(spart->zspan);
+ SWAP(APixstrand, *apnew, *apn);
+ apn->next= apnew;
+ CHECK_ASSIGN(0);
+ }
+
+ strand_shade_refcount(cache, sseg->v[1]);
+ strand_shade_refcount(cache, sseg->v[2]);
+ spart->totapixbuf[offset]++;
+ }
+}
+
+static int strand_test_clip(float winmat[][4], ZSpan *zspan, float *bounds, float *co, float *zcomp)
+{
+ float hoco[4];
+ int clipflag= 0;
+
+ projectvert(co, winmat, hoco);
+
+ /* we compare z without perspective division for segment sorting */
+ *zcomp= hoco[2];
+
+ if(hoco[0] > bounds[1]*hoco[3]) clipflag |= 1;
+ else if(hoco[0]< bounds[0]*hoco[3]) clipflag |= 2;
+ else if(hoco[1] > bounds[3]*hoco[3]) clipflag |= 4;
+ else if(hoco[1]< bounds[2]*hoco[3]) clipflag |= 8;
+
+ clipflag |= testclip(hoco);
+
+ return clipflag;
+}
+
+static void do_scanconvert_strand(Render *re, StrandPart *spart, ZSpan *zspan, float t, float dt, float *co1, float *co2, float *co3, float *co4, int sample)
+{
+ float jco1[3], jco2[3], jco3[3], jco4[3], jx, jy;
+
+ VECCOPY(jco1, co1);
+ VECCOPY(jco2, co2);
+ VECCOPY(jco3, co3);
+ VECCOPY(jco4, co4);
+
+ if(re->osa) {
+ jx= -re->jit[sample][0];
+ jy= -re->jit[sample][1];
+
+ jco1[0] += jx; jco1[1] += jy;
+ jco2[0] += jx; jco2[1] += jy;
+ jco3[0] += jx; jco3[1] += jy;
+ jco4[0] += jx; jco4[1] += jy;
+ }
+ else if(re->i.curblur) {
+ jx= -re->jit[re->i.curblur-1][0];
+ jy= -re->jit[re->i.curblur-1][1];
+
+ jco1[0] += jx; jco1[1] += jy;
+ jco2[0] += jx; jco2[1] += jy;
+ jco3[0] += jx; jco3[1] += jy;
+ jco4[0] += jx; jco4[1] += jy;
+ }
+
+ spart->sample= sample;
+
+ spart->t[0]= t-dt;
+ spart->s[0]= -1.0f;
+ spart->t[1]= t-dt;
+ spart->s[1]= 1.0f;
+ spart->t[2]= t;
+ spart->s[2]= 1.0f;
+ zspan_scanconvert_strand(zspan, spart, jco1, jco2, jco3, do_strand_fillac);
+ spart->t[0]= t-dt;
+ spart->s[0]= -1.0f;
+ spart->t[1]= t;
+ spart->s[1]= 1.0f;
+ spart->t[2]= t;
+ spart->s[2]= -1.0f;
+ zspan_scanconvert_strand(zspan, spart, jco1, jco3, jco4, do_strand_fillac);
+}
+
+static void strand_render(Render *re, StrandSegment *sseg, float winmat[][4], StrandPart *spart, ZSpan *zspan, int totzspan, StrandPoint *p1, StrandPoint *p2)
+{
+ if(spart) {
+ float t= p2->t;
+ float dt= p2->t - p1->t;
+ int a;
+
+ if(re->osa) {
+ for(a=0; a<re->osa; a++)
+ do_scanconvert_strand(re, spart, zspan, t, dt, p1->zco2, p1->zco1, p2->zco1, p2->zco2, a);
+ }
+ else
+ do_scanconvert_strand(re, spart, zspan, t, dt, p1->zco2, p1->zco1, p2->zco1, p2->zco2, 0);
+ }
+ else {
+ float hoco1[4], hoco2[3];
+ int a, obi, index;
+
+ obi= sseg->obi - re->objectinstance;
+ index= sseg->strand->index;
+
+ projectvert(p1->co, winmat, hoco1);
+ projectvert(p2->co, winmat, hoco2);
+
+ for(a=0; a<totzspan; a++) {
+#if 0
+ /* render both strand and single pixel wire to counter aliasing */
+ zbufclip4(re, &zspan[a], obi, index, p1->hoco2, p1->hoco1, p2->hoco1, p2->hoco2, p1->clip2, p1->clip1, p2->clip1, p2->clip2);
+#endif
+ /* only render a line for now, which makes the shadow map more
+ similiar across frames, and so reduces flicker */
+ zbufsinglewire(&zspan[a], obi, index, hoco1, hoco2);
+ }
+ }
+}
+
+static int strand_segment_recursive(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, int totzspan, StrandSegment *sseg, StrandPoint *p1, StrandPoint *p2, int depth)
+{
+ StrandPoint p;
+ StrandBuffer *buffer= sseg->buffer;
+ float dot, d1[2], d2[2], len1, len2;
+
+ if(depth == buffer->maxdepth)
+ return 0;
+
+ p.t= (p1->t + p2->t)*0.5f;
+ strand_eval_point(sseg, &p);
+ strand_project_point(buffer->winmat, buffer->winx, buffer->winy, &p);
+
+ d1[0]= (p.x - p1->x);
+ d1[1]= (p.y - p1->y);
+ len1= d1[0]*d1[0] + d1[1]*d1[1];
+
+ d2[0]= (p2->x - p.x);
+ d2[1]= (p2->y - p.y);
+ len2= d2[0]*d2[0] + d2[1]*d2[1];
+
+ if(len1 == 0.0f || len2 == 0.0f)
+ return 0;
+
+ dot= d1[0]*d2[0] + d1[1]*d2[1];
+ if(dot*dot > sseg->sqadaptcos*len1*len2)
+ return 0;
+
+ if(spart) {
+ do_strand_point_project(winmat, zspan, p.co1, p.hoco1, p.zco1);
+ do_strand_point_project(winmat, zspan, p.co2, p.hoco2, p.zco2);
+ }
+ else {
+#if 0
+ projectvert(p.co1, winmat, p.hoco1);
+ projectvert(p.co2, winmat, p.hoco2);
+ p.clip1= testclip(p.hoco1);
+ p.clip2= testclip(p.hoco2);
+#endif
+ }
+
+ if(!strand_segment_recursive(re, winmat, spart, zspan, totzspan, sseg, p1, &p, depth+1))
+ strand_render(re, sseg, winmat, spart, zspan, totzspan, p1, &p);
+ if(!strand_segment_recursive(re, winmat, spart, zspan, totzspan, sseg, &p, p2, depth+1))
+ strand_render(re, sseg, winmat, spart, zspan, totzspan, &p, p2);
+
+ return 1;
+}
+
+void render_strand_segment(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, int totzspan, StrandSegment *sseg)
+{
+ StrandBuffer *buffer= sseg->buffer;
+ StrandPoint *p1= &sseg->point1;
+ StrandPoint *p2= &sseg->point2;
+
+ p1->t= 0.0f;
+ p2->t= 1.0f;
+
+ strand_eval_point(sseg, p1);
+ strand_project_point(buffer->winmat, buffer->winx, buffer->winy, p1);
+ strand_eval_point(sseg, p2);
+ strand_project_point(buffer->winmat, buffer->winx, buffer->winy, p2);
+
+ if(spart) {
+ do_strand_point_project(winmat, zspan, p1->co1, p1->hoco1, p1->zco1);
+ do_strand_point_project(winmat, zspan, p1->co2, p1->hoco2, p1->zco2);
+ do_strand_point_project(winmat, zspan, p2->co1, p2->hoco1, p2->zco1);
+ do_strand_point_project(winmat, zspan, p2->co2, p2->hoco2, p2->zco2);
+ }
+ else {
+#if 0
+ projectvert(p1->co1, winmat, p1->hoco1);
+ projectvert(p1->co2, winmat, p1->hoco2);
+ projectvert(p2->co1, winmat, p2->hoco1);
+ projectvert(p2->co2, winmat, p2->hoco2);
+ p1->clip1= testclip(p1->hoco1);
+ p1->clip2= testclip(p1->hoco2);
+ p2->clip1= testclip(p2->hoco1);
+ p2->clip2= testclip(p2->hoco2);
+#endif
+ }
+
+ if(!strand_segment_recursive(re, winmat, spart, zspan, totzspan, sseg, p1, p2, 0))
+ strand_render(re, sseg, winmat, spart, zspan, totzspan, p1, p2);
+}
+
+/* render call to fill in strands */
+int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand *apixbuf, ListBase *apsmbase, StrandShadeCache *cache)
+{
+ ObjectRen *obr;
+ ObjectInstanceRen *obi;
+ ZSpan zspan;
+ StrandRen *strand=0;
+ StrandVert *svert;
+ StrandBound *sbound;
+ StrandPart spart;
+ StrandSegment sseg;
+ StrandSortSegment *sortsegments = NULL, *sortseg, *firstseg;
+ MemArena *memarena;
+ float z[4], bounds[4], winmat[4][4];
+ int a, b, c, i, totsegment, clip[4];
+
+ if(re->test_break())
+ return 0;
+ if(re->totstrand == 0)
+ return 0;
+
+ /* setup StrandPart */
+ memset(&spart, 0, sizeof(spart));
+
+ spart.re= re;
+ spart.rectx= pa->rectx;
+ spart.recty= pa->recty;
+ spart.apixbuf= apixbuf;
+ spart.zspan= &zspan;
+ spart.rectdaps= pa->rectdaps;
+ spart.rectz= pa->rectz;
+ spart.cache= cache;
+
+ zbuf_alloc_span(&zspan, pa->rectx, pa->recty, re->clipcrop);
+
+ /* needed for transform from hoco to zbuffer co */
+ zspan.zmulx= ((float)re->winx)/2.0;
+ zspan.zmuly= ((float)re->winy)/2.0;
+
+ zspan.zofsx= -pa->disprect.xmin;
+ zspan.zofsy= -pa->disprect.ymin;
+
+ /* to center the sample position */
+ zspan.zofsx -= 0.5f;
+ zspan.zofsy -= 0.5f;
+
+ zspan.apsmbase= apsmbase;
+
+ /* clipping setup */
+ bounds[0]= (2*pa->disprect.xmin - re->winx-1)/(float)re->winx;
+ bounds[1]= (2*pa->disprect.xmax - re->winx+1)/(float)re->winx;
+ bounds[2]= (2*pa->disprect.ymin - re->winy-1)/(float)re->winy;
+ bounds[3]= (2*pa->disprect.ymax - re->winy+1)/(float)re->winy;
+
+ memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+ firstseg= NULL;
+ sortseg= sortsegments;
+ totsegment= 0;
+
+ /* for all object instances */
+ for(obi=re->instancetable.first, i=0; obi; obi=obi->next, i++) {
+ obr= obi->obr;
+
+ if(!obr->strandbuf || !(obr->strandbuf->lay & rl->lay))
+ continue;
+
+ /* compute matrix and try clipping whole object */
+ if(obi->flag & R_TRANSFORMED)
+ zbuf_make_winmat(re, obi->mat, winmat);
+ else
+ zbuf_make_winmat(re, NULL, winmat);
+
+ if(clip_render_object(obi->obr->boundbox, bounds, winmat))
+ continue;
+
+ /* for each bounding box containing a number of strands */
+ sbound= obr->strandbuf->bound;
+ for(c=0; c<obr->strandbuf->totbound; c++, sbound++) {
+ if(clip_render_object(sbound->boundbox, bounds, winmat))
+ continue;
+
+ /* for each strand in this bounding box */
+ for(a=sbound->start; a<sbound->end; a++) {
+ strand= RE_findOrAddStrand(obr, a);
+ svert= strand->vert;
+
+ /* keep clipping and z depth for 4 control points */
+ clip[1]= strand_test_clip(winmat, &zspan, bounds, svert->co, &z[1]);
+ clip[2]= strand_test_clip(winmat, &zspan, bounds, (svert+1)->co, &z[2]);
+ clip[0]= clip[1]; z[0]= z[1];
+
+ for(b=0; b<strand->totvert-1; b++, svert++) {
+ /* compute 4th point clipping and z depth */
+ if(b < strand->totvert-2) {
+ clip[3]= strand_test_clip(winmat, &zspan, bounds, (svert+2)->co, &z[3]);
+ }
+ else {
+ clip[3]= clip[2]; z[3]= z[2];
+ }
+
+ /* check clipping and add to sortsegments buffer */
+ if(!(clip[0] & clip[1] & clip[2] & clip[3])) {
+ sortseg= BLI_memarena_alloc(memarena, sizeof(StrandSortSegment));
+ sortseg->obi= i;
+ sortseg->strand= strand->index;
+ sortseg->segment= b;
+
+ sortseg->z= 0.5f*(z[1] + z[2]);
+
+ sortseg->next= firstseg;
+ firstseg= sortseg;
+ totsegment++;
+ }
+
+ /* shift clipping and z depth */
+ clip[0]= clip[1]; z[0]= z[1];
+ clip[1]= clip[2]; z[1]= z[2];
+ clip[2]= clip[3]; z[2]= z[3];
+ }
+ }
+ }
+ }
+
+ if(!re->test_break()) {
+ /* convert list to array and sort */
+ sortsegments= MEM_mallocN(sizeof(StrandSortSegment)*totsegment, "StrandSortSegment");
+ for(a=0, sortseg=firstseg; a<totsegment; a++, sortseg=sortseg->next)
+ sortsegments[a]= *sortseg;
+ qsort(sortsegments, totsegment, sizeof(StrandSortSegment), compare_strand_segment);
+ }
+
+ BLI_memarena_free(memarena);
+
+ spart.totapixbuf= MEM_callocN(sizeof(int)*pa->rectx*pa->recty, "totapixbuf");
+
+ if(!re->test_break()) {
+ /* render segments in sorted order */
+ sortseg= sortsegments;
+ for(a=0; a<totsegment; a++, sortseg++) {
+ if(re->test_break())
+ break;
+
+ obi= &re->objectinstance[sortseg->obi];
+ obr= obi->obr;
+ zbuf_make_winmat(re, NULL, winmat);
+
+ sseg.obi= obi;
+ sseg.strand= RE_findOrAddStrand(obr, sortseg->strand);
+ sseg.buffer= sseg.strand->buffer;
+ sseg.sqadaptcos= sseg.buffer->adaptcos;
+ sseg.sqadaptcos *= sseg.sqadaptcos;
+
+ svert= sseg.strand->vert + sortseg->segment;
+ sseg.v[0]= (sortseg->segment > 0)? (svert-1): svert;
+ sseg.v[1]= svert;
+ sseg.v[2]= svert+1;
+ sseg.v[3]= (sortseg->segment < sseg.strand->totvert-2)? svert+2: svert+1;
+ sseg.shaded= 0;
+
+ spart.segment= &sseg;
+
+ render_strand_segment(re, winmat, &spart, &zspan, 1, &sseg);
+ }
+ }
+
+ if(sortsegments)
+ MEM_freeN(sortsegments);
+ MEM_freeN(spart.totapixbuf);
+
+ zbuf_free_span(&zspan);
+
+ return totsegment;
+}
+
+/* *************** */
+
+StrandSurface *cache_strand_surface(Render *re, ObjectRen *obr, DerivedMesh *dm, float mat[][4], int timeoffset)
+{
+ StrandSurface *mesh;
+ MFace *mface;
+ MVert *mvert;
+ float (*co)[3];
+ int a, totvert, totface;
+
+ totvert= dm->getNumVerts(dm);
+ totface= dm->getNumFaces(dm);
+
+ for(mesh=re->strandsurface.first; mesh; mesh=mesh->next)
+ if(mesh->obr.ob == obr->ob && mesh->obr.par == obr->par
+ && mesh->obr.index == obr->index && mesh->totvert==totvert && mesh->totface==totface)
+ break;
+
+ if(!mesh) {
+ mesh= MEM_callocN(sizeof(StrandSurface), "StrandSurface");
+ mesh->obr= *obr;
+ mesh->totvert= totvert;
+ mesh->totface= totface;
+ mesh->face= MEM_callocN(sizeof(int)*4*mesh->totface, "StrandSurfFaces");
+ mesh->col= MEM_callocN(sizeof(float)*3*mesh->totvert, "StrandSurfCol");
+ BLI_addtail(&re->strandsurface, mesh);
+ }
+
+ if(timeoffset == -1 && !mesh->prevco)
+ mesh->prevco= co= MEM_callocN(sizeof(float)*3*mesh->totvert, "StrandSurfCo");
+ else if(timeoffset == 0 && !mesh->co)
+ mesh->co= co= MEM_callocN(sizeof(float)*3*mesh->totvert, "StrandSurfCo");
+ else if(timeoffset == 1 && !mesh->nextco)
+ mesh->nextco= co= MEM_callocN(sizeof(float)*3*mesh->totvert, "StrandSurfCo");
+ else
+ return mesh;
+
+ mvert= dm->getVertArray(dm);
+ for(a=0; a<mesh->totvert; a++, mvert++) {
+ VECCOPY(co[a], mvert->co);
+ Mat4MulVecfl(mat, co[a]);
+ }
+
+ mface= dm->getFaceArray(dm);
+ for(a=0; a<mesh->totface; a++, mface++) {
+ mesh->face[a][0]= mface->v1;
+ mesh->face[a][1]= mface->v2;
+ mesh->face[a][2]= mface->v3;
+ mesh->face[a][3]= mface->v4;
+ }
+
+ return mesh;
+}
+
+void free_strand_surface(Render *re)
+{
+ StrandSurface *mesh;
+
+ for(mesh=re->strandsurface.first; mesh; mesh=mesh->next) {
+ if(mesh->co) MEM_freeN(mesh->co);
+ if(mesh->prevco) MEM_freeN(mesh->prevco);
+ if(mesh->nextco) MEM_freeN(mesh->nextco);
+ if(mesh->col) MEM_freeN(mesh->col);
+ if(mesh->face) MEM_freeN(mesh->face);
+ }
+
+ BLI_freelistN(&re->strandsurface);
+}
+
+void strand_minmax(StrandRen *strand, float *min, float *max)
+{
+ StrandVert *svert;
+ int a;
+
+ for(a=0, svert=strand->vert; a<strand->totvert; a++, svert++)
+ DO_MINMAX(svert->co, min, max)
+}
+
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c
index 8c366593034..612d7a2e0e7 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/texture.c
@@ -53,6 +53,7 @@
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_material.h"
#include "BKE_library.h"
#include "BKE_image.h"
@@ -98,7 +99,7 @@ void init_render_texture(Render *re, Tex *tex)
}
else if(tex->type==TEX_ENVMAP) {
/* just in case */
- tex->imaflag= TEX_INTERPOL | TEX_MIPMAP;
+ tex->imaflag |= TEX_INTERPOL | TEX_MIPMAP;
tex->extend= TEX_CLIP;
if(tex->env) {
@@ -755,16 +756,16 @@ static int plugintex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex
}
-static int cubemap_glob(VlakRen *vlr, float x, float y, float z, float *adr1, float *adr2)
+static int cubemap_glob(float *n, float x, float y, float z, float *adr1, float *adr2)
{
float x1, y1, z1, nor[3];
int ret;
- if(vlr==NULL) {
+ if(n==NULL) {
nor[0]= x; nor[1]= y; nor[2]= z; // use local render coord
}
else {
- VECCOPY(nor, vlr->n);
+ VECCOPY(nor, n);
}
MTC_Mat4Mul3Vecfl(R.viewinv, nor);
@@ -793,7 +794,7 @@ static int cubemap_glob(VlakRen *vlr, float x, float y, float z, float *adr1, fl
/* ------------------------------------------------------------------------- */
/* mtex argument only for projection switches */
-static int cubemap(MTex *mtex, VlakRen *vlr, float x, float y, float z, float *adr1, float *adr2)
+static int cubemap(MTex *mtex, VlakRen *vlr, float *n, float x, float y, float z, float *adr1, float *adr2)
{
int proj[4]={0, ME_PROJXY, ME_PROJXZ, ME_PROJYZ}, ret= 0;
@@ -811,7 +812,7 @@ static int cubemap(MTex *mtex, VlakRen *vlr, float x, float y, float z, float *a
else if( fabs(nor[0])<fabs(nor[1]) && fabs(nor[2])<fabs(nor[1]) ) vlr->puno |= ME_PROJXZ;
else vlr->puno |= ME_PROJYZ;
}
- else return cubemap_glob(vlr, x, y, z, adr1, adr2);
+ else return cubemap_glob(n, x, y, z, adr1, adr2);
}
if(mtex) {
@@ -843,7 +844,7 @@ static int cubemap(MTex *mtex, VlakRen *vlr, float x, float y, float z, float *a
}
}
else {
- return cubemap_glob(vlr, x, y, z, adr1, adr2);
+ return cubemap_glob(n, x, y, z, adr1, adr2);
}
return ret;
@@ -851,14 +852,14 @@ static int cubemap(MTex *mtex, VlakRen *vlr, float x, float y, float z, float *a
/* ------------------------------------------------------------------------- */
-static int cubemap_ob(Object *ob, VlakRen *vlr, float x, float y, float z, float *adr1, float *adr2)
+static int cubemap_ob(Object *ob, float *n, float x, float y, float z, float *adr1, float *adr2)
{
float x1, y1, z1, nor[3];
int ret;
- if(vlr==NULL) return 0;
+ if(n==NULL) return 0;
- VECCOPY(nor, vlr->n);
+ VECCOPY(nor, n);
if(ob) MTC_Mat4Mul3Vecfl(ob->imat, nor);
x1= fabs(nor[0]);
@@ -885,7 +886,7 @@ static int cubemap_ob(Object *ob, VlakRen *vlr, float x, float y, float z, float
/* ------------------------------------------------------------------------- */
-static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *dxt, float *dyt)
+static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *n, float *dxt, float *dyt)
{
Tex *tex;
Object *ob= NULL;
@@ -907,9 +908,9 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *dxt, float
else if(wrap==MTEX_TUBE) tubemap(t[0], t[1], t[2], &fx, &fy);
else if(wrap==MTEX_SPHERE) spheremap(t[0], t[1], t[2], &fx, &fy);
else {
- if(texco==TEXCO_OBJECT) cubemap_ob(ob, vlr, t[0], t[1], t[2], &fx, &fy);
- else if(texco==TEXCO_GLOB) cubemap_glob(vlr, t[0], t[1], t[2], &fx, &fy);
- else cubemap(mtex, vlr, t[0], t[1], t[2], &fx, &fy);
+ if(texco==TEXCO_OBJECT) cubemap_ob(ob, n, t[0], t[1], t[2], &fx, &fy);
+ else if(texco==TEXCO_GLOB) cubemap_glob(n, t[0], t[1], t[2], &fx, &fy);
+ else cubemap(mtex, vlr, n, t[0], t[1], t[2], &fx, &fy);
}
/* repeat */
@@ -998,9 +999,9 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *dxt, float
}
else {
- if(texco==TEXCO_OBJECT) proj = cubemap_ob(ob, vlr, t[0], t[1], t[2], &fx, &fy);
- else if (texco==TEXCO_GLOB) proj = cubemap_glob(vlr, t[0], t[1], t[2], &fx, &fy);
- else proj = cubemap(mtex, vlr, t[0], t[1], t[2], &fx, &fy);
+ if(texco==TEXCO_OBJECT) proj = cubemap_ob(ob, n, t[0], t[1], t[2], &fx, &fy);
+ else if (texco==TEXCO_GLOB) proj = cubemap_glob(n, t[0], t[1], t[2], &fx, &fy);
+ else proj = cubemap(mtex, vlr, n, t[0], t[1], t[2], &fx, &fy);
if(proj==1) {
SWAP(float, dxt[1], dxt[2]);
@@ -1230,7 +1231,7 @@ int multitex_ext(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, Te
dyt_l[0]= dyt_l[1]= dyt_l[2]= 0.0f;
}
- do_2d_mapping(&mtex, texvec_l, NULL, dxt_l, dyt_l);
+ do_2d_mapping(&mtex, texvec_l, NULL, NULL, dxt_l, dyt_l);
return multitex(tex, texvec_l, dxt_l, dyt_l, osatex, texres);
}
@@ -1242,7 +1243,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;
@@ -1255,7 +1256,7 @@ static void texture_rgb_blend(float *in, float *tex, float *out, float fact, flo
in[1]= (fact*tex[1] + facm*out[1]);
in[2]= (fact*tex[2] + facm*out[2]);
break;
-
+
case MTEX_MUL:
fact*= facg;
facm= 1.0-facg;
@@ -1272,6 +1273,24 @@ static void texture_rgb_blend(float *in, float *tex, float *out, float fact, flo
in[2]= 1.0 - (facm+fact*(1.0-tex[2])) * (1.0-out[2]);
break;
+ case MTEX_OVERLAY:
+ fact*= facg;
+ facm= 1.0-facg;
+
+ if(out[0] < 0.5f)
+ in[0] = out[0] * (facm + 2.0f*fact*tex[0]);
+ else
+ in[0] = 1.0f - (facm + 2.0f*fact*(1.0 - tex[0])) * (1.0 - out[0]);
+ if(out[1] < 0.5f)
+ in[1] = out[1] * (facm + 2.0f*fact*tex[1]);
+ else
+ in[1] = 1.0f - (facm + 2.0f*fact*(1.0 - tex[1])) * (1.0 - out[1]);
+ if(out[2] < 0.5f)
+ in[2] = out[2] * (facm + 2.0f*fact*tex[2]);
+ else
+ in[2] = 1.0f - (facm + 2.0f*fact*(1.0 - tex[2])) * (1.0 - out[2]);
+ break;
+
case MTEX_SUB:
fact= -fact;
case MTEX_ADD:
@@ -1325,12 +1344,31 @@ static void texture_rgb_blend(float *in, float *tex, float *out, float fact, flo
col= fact*tex[2];
if(col > out[2]) in[2]= col; else in[2]= out[2];
break;
+
+ case MTEX_BLEND_HUE:
+ fact*= facg;
+ VECCOPY(in, out);
+ ramp_blend(MA_RAMP_HUE, in, in+1, in+2, fact, tex);
+ break;
+ case MTEX_BLEND_SAT:
+ fact*= facg;
+ VECCOPY(in, out);
+ ramp_blend(MA_RAMP_SAT, in, in+1, in+2, fact, tex);
+ break;
+ case MTEX_BLEND_VAL:
+ fact*= facg;
+ VECCOPY(in, out);
+ ramp_blend(MA_RAMP_VAL, in, in+1, in+2, fact, tex);
+ break;
+ case MTEX_BLEND_COLOR:
+ fact*= facg;
+ VECCOPY(in, out);
+ ramp_blend(MA_RAMP_COLOR, in, in+1, in+2, fact, tex);
+ break;
}
-
-
}
-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;
@@ -1406,10 +1444,17 @@ 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;
+ if(mtex->texflag & MTEX_DUPLI_MAPTO) {
+ co= shi->duplilo; dx= dxt; dy= dyt;
+ dxt[0]= dxt[1]= dxt[2]= 0.0f;
+ dyt[0]= dyt[1]= dyt[2]= 0.0f;
+ }
+ else {
+ co= shi->lo; dx= shi->dxlo; dy= shi->dylo;
+ }
}
else if(mtex->texco==TEXCO_STICKY) {
co= shi->sticky; dx= shi->dxsticky; dy= shi->dysticky;
@@ -1448,28 +1493,35 @@ void do_material_tex(ShadeInput *shi)
co= shi->gl; dx= shi->dxco; dy= shi->dyco;
}
else if(mtex->texco==TEXCO_UV) {
- ShadeInputUV *suv= &shi->uv[0];
- int i;
-
- if(mtex->uvname[0] != 0) {
- for(i = 0; i < shi->totuv; i++) {
- if(strcmp(shi->uv[i].name, mtex->uvname)==0) {
- suv= &shi->uv[i];
- break;
+ if(mtex->texflag & MTEX_DUPLI_MAPTO) {
+ co= shi->dupliuv; dx= dxt; dy= dyt;
+ dxt[0]= dxt[1]= dxt[2]= 0.0f;
+ dyt[0]= dyt[1]= dyt[2]= 0.0f;
+ }
+ else {
+ ShadeInputUV *suv= &shi->uv[shi->actuv];
+ int i;
+
+ if(mtex->uvname[0] != 0) {
+ for(i = 0; i < shi->totuv; i++) {
+ if(strcmp(shi->uv[i].name, mtex->uvname)==0) {
+ suv= &shi->uv[i];
+ break;
+ }
}
}
- }
- co= suv->uv;
- dx= suv->dxuv;
- dy= suv->dyuv;
+ co= suv->uv;
+ dx= suv->dxuv;
+ dy= suv->dyuv;
+ }
}
else if(mtex->texco==TEXCO_WINDOW) {
co= shi->winco; dx= shi->dxwin; dy= shi->dywin;
}
else if(mtex->texco==TEXCO_STRAND) {
co= tempvec; dx= dxt; dy= dyt;
- co[0]= shi->strand;
+ co[0]= shi->strandco;
co[1]= co[2]= 0.0f;
dx[0]= shi->dxstrand;
dx[1]= dx[2]= 0.0f;
@@ -1486,7 +1538,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;
@@ -1531,7 +1583,7 @@ void do_material_tex(ShadeInput *shi)
else dxt[2]= dyt[2]= 0.0;
}
- do_2d_mapping(mtex, texvec, shi->vlr, dxt, dyt);
+ do_2d_mapping(mtex, texvec, shi->vlr, shi->facenor, dxt, dyt);
/* translate and scale */
texvec[0]= mtex->size[0]*(texvec[0]-0.5) +mtex->ofs[0]+0.5;
@@ -1651,10 +1703,10 @@ void do_material_tex(ShadeInput *shi)
if(mtex->texflag & MTEX_VIEWSPACE) {
// rotate to global coords
if(mtex->texco==TEXCO_ORCO || mtex->texco==TEXCO_UV) {
- if(shi->vlr && shi->vlr->ob) {
+ if(shi->vlr && shi->obr->ob) {
float len= Normalize(texres.nor);
// can be optimized... (ton)
- Mat4Mul3Vecfl(shi->vlr->ob->obmat, texres.nor);
+ Mat4Mul3Vecfl(shi->obr->ob->obmat, texres.nor);
Mat4Mul3Vecfl(R.viewmat, texres.nor);
Normalize(texres.nor);
VecMulf(texres.nor, len);
@@ -1706,7 +1758,6 @@ void do_material_tex(ShadeInput *shi)
}
if( (mtex->mapto & MAP_NORM) ) {
if(texres.nor) {
-
if(mtex->maptoneg & MAP_NORM) tex->norfac= -mtex->norfac;
else tex->norfac= mtex->norfac;
@@ -1723,7 +1774,7 @@ void do_material_tex(ShadeInput *shi)
fact = Tnor*tex->norfac;
if (fact>1.f) fact = 1.f;
facm = 1.f-fact;
- if (shi->mat->mode & MA_NORMAP_TANG) {
+ if(mtex->normapspace == MTEX_NSPACE_TANGENT) {
/* qdn: tangent space */
float B[3], tv[3];
Crossf(B, shi->vn, shi->tang); /* bitangent */
@@ -1736,10 +1787,26 @@ void do_material_tex(ShadeInput *shi)
shi->vn[2]= facm*shi->vn[2] + fact*tv[2];
}
else {
+ float nor[3];
+
+ VECCOPY(nor, texres.nor);
+
+ if(mtex->normapspace == MTEX_NSPACE_CAMERA);
+ else if(mtex->normapspace == MTEX_NSPACE_WORLD) {
+ Mat4Mul3Vecfl(R.viewmat, nor);
+ }
+ else if(mtex->normapspace == MTEX_NSPACE_OBJECT) {
+ if(shi->obr && shi->obr->ob)
+ Mat4Mul3Vecfl(shi->obr->ob->obmat, nor);
+ Mat4Mul3Vecfl(R.viewmat, nor);
+ }
+
+ Normalize(nor);
+
/* qdn: worldspace */
- shi->vn[0]= facm*shi->vn[0] + fact*texres.nor[0];
- shi->vn[1]= facm*shi->vn[1] + fact*texres.nor[1];
- shi->vn[2]= facm*shi->vn[2] + fact*texres.nor[2];
+ shi->vn[0]= facm*shi->vn[0] + fact*nor[0];
+ shi->vn[1]= facm*shi->vn[1] + fact*nor[1];
+ shi->vn[2]= facm*shi->vn[2] + fact*nor[2];
}
}
else {
@@ -1952,7 +2019,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
}
- if(mtex->tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
+ if(mtex->tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
rgb= multitex(mtex->tex, texvec, dxt, dyt, osatex, &texres);
@@ -2123,7 +2190,7 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
/* texture */
- if(mtex->tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
+ if(mtex->tex->type==TEX_IMAGE) do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
rgb= multitex(mtex->tex, texvec, dxt, dyt, R.osa, &texres);
@@ -2303,7 +2370,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf)
/* texture */
if(tex->type==TEX_IMAGE) {
- do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
+ do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
}
rgb= multitex(tex, texvec, dxt, dyt, shi->osatex, &texres);
@@ -2388,7 +2455,7 @@ int externtex(MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *t
/* texture */
if(tex->type==TEX_IMAGE) {
- do_2d_mapping(mtex, texvec, NULL, dxt, dyt);
+ do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
}
rgb= multitex(tex, texvec, dxt, dyt, 0, &texr);
@@ -2421,6 +2488,7 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
static int firsttime= 1;
Tex *tex;
float texvec[3], dx[2], dy[2];
+ ShadeInputUV *suv= &shi->uv[shi->actuv];
if(firsttime) {
firsttime= 0;
@@ -2432,14 +2500,14 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
if(shi->ys & 1) tex= &tex1; else tex= &tex2; // threadsafe
- texvec[0]= 0.5+0.5*shi->uv[0].uv[0];
- texvec[1]= 0.5+0.5*shi->uv[0].uv[1];
+ texvec[0]= 0.5+0.5*suv->uv[0];
+ texvec[1]= 0.5+0.5*suv->uv[1];
texvec[2] = 0; // initalize it because imagewrap looks at it.
if(shi->osatex) {
- dx[0]= 0.5*shi->uv[0].dxuv[0];
- dx[1]= 0.5*shi->uv[0].dxuv[1];
- dy[0]= 0.5*shi->uv[0].dyuv[0];
- dy[1]= 0.5*shi->uv[0].dyuv[1];
+ dx[0]= 0.5*suv->dxuv[0];
+ dx[1]= 0.5*suv->dxuv[1];
+ dy[0]= 0.5*suv->dyuv[0];
+ dy[1]= 0.5*suv->dyuv[1];
}
texr.nor= NULL;
@@ -2450,6 +2518,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/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 80b20a8e18e..8f4b75cfc73 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -39,8 +39,8 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
-#include "BLI_threads.h"
#include "BLI_jitter.h"
+#include "BLI_threads.h"
#include "MTC_matrixops.h"
#include "MEM_guardedalloc.h"
@@ -69,6 +69,7 @@
#include "shadbuf.h"
#include "shading.h"
#include "sss.h"
+#include "strand.h"
/* own includes */
#include "zbuf.h"
@@ -83,7 +84,7 @@ extern struct Render R;
/* ****************** Spans ******************************* */
/* each zbuffer has coordinates transformed to local rect coordinates, so we can simply clip */
-void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty)
+void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty, float clipcrop)
{
memset(zspan, 0, sizeof(ZSpan));
@@ -92,6 +93,8 @@ void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty)
zspan->span1= MEM_mallocN(recty*sizeof(float), "zspan");
zspan->span2= MEM_mallocN(recty*sizeof(float), "zspan");
+
+ zspan->clipcrop= clipcrop;
}
void zbuf_free_span(ZSpan *zspan)
@@ -193,7 +196,6 @@ static void zbuf_add_to_span(ZSpan *zspan, float *v1, float *v2)
/* Functions */
/*-----------------------------------------------------------*/
-
void fillrect(int *rect, int x, int y, int val)
{
int len, *drect;
@@ -297,7 +299,7 @@ static APixstr *addpsA(ZSpan *zspan)
return zspan->curpstr;
}
-static void zbuffillAc4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
+static void zbuffillAc4(ZSpan *zspan, int obi, int zvlnr, float *v1, float *v2, float *v3, float *v4)
{
APixstr *ap, *apofs, *apn;
double zxd, zyd, zy0, zverg;
@@ -387,16 +389,16 @@ static void zbuffillAc4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3
apn= ap;
while(apn) {
- if(apn->p[0]==0) {apn->p[0]= zvlnr; apn->z[0]= zverg; apn->mask[0]= mask; break; }
- if(apn->p[0]==zvlnr) {apn->mask[0]|= mask; break; }
- if(apn->p[1]==0) {apn->p[1]= zvlnr; apn->z[1]= zverg; apn->mask[1]= mask; break; }
- if(apn->p[1]==zvlnr) {apn->mask[1]|= mask; break; }
- if(apn->p[2]==0) {apn->p[2]= zvlnr; apn->z[2]= zverg; apn->mask[2]= mask; break; }
- if(apn->p[2]==zvlnr) {apn->mask[2]|= mask; break; }
- if(apn->p[3]==0) {apn->p[3]= zvlnr; apn->z[3]= zverg; apn->mask[3]= mask; break; }
- if(apn->p[3]==zvlnr) {apn->mask[3]|= mask; break; }
-// if(apn->p[i]==0) {apn->p[i]= zvlnr; apn->z[i]= zverg; apn->mask[i]= mask; break; }
-// if(apn->p[i]==zvlnr) {apn->mask[i]|= mask; break; }
+ if(apn->p[0]==0) {apn->obi[0]= obi; apn->p[0]= zvlnr; apn->z[0]= zverg; apn->mask[0]= mask; break; }
+ if(apn->p[0]==zvlnr && apn->obi[0]==obi) {apn->mask[0]|= mask; break; }
+ if(apn->p[1]==0) {apn->obi[1]= obi; apn->p[1]= zvlnr; apn->z[1]= zverg; apn->mask[1]= mask; break; }
+ if(apn->p[1]==zvlnr && apn->obi[1]==obi) {apn->mask[1]|= mask; break; }
+ if(apn->p[2]==0) {apn->obi[2]= obi; apn->p[2]= zvlnr; apn->z[2]= zverg; apn->mask[2]= mask; break; }
+ if(apn->p[2]==zvlnr && apn->obi[2]==obi) {apn->mask[2]|= mask; break; }
+ if(apn->p[3]==0) {apn->obi[3]= obi; apn->p[3]= zvlnr; apn->z[3]= zverg; apn->mask[3]= mask; break; }
+ if(apn->p[3]==zvlnr && apn->obi[3]==obi) {apn->mask[3]|= mask; break; }
+// if(apn->p[i]==0) {apn->obi[i]= obi; apn->p[i]= zvlnr; apn->z[i]= zverg; apn->mask[i]= mask; break; }
+// if(apn->p[i]==zvlnr && apn->obi[i]==obi) {apn->mask[i]|= mask; break; }
if(apn->next==NULL) apn->next= addpsA(zspan);
apn= apn->next;
}
@@ -416,7 +418,7 @@ static void zbuffillAc4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3
-static void zbuflineAc(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
+static void zbuflineAc(ZSpan *zspan, int obi, int zvlnr, float *vec1, float *vec2)
{
APixstr *ap, *apn;
int *rectz;
@@ -475,14 +477,14 @@ static void zbuflineAc(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
apn= ap;
while(apn) { /* loop unrolled */
- if(apn->p[0]==0) {apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
- if(apn->p[0]==zvlnr) {apn->mask[0]|= mask; break; }
- if(apn->p[1]==0) {apn->p[1]= zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
- if(apn->p[1]==zvlnr) {apn->mask[1]|= mask; break; }
- if(apn->p[2]==0) {apn->p[2]= zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
- if(apn->p[2]==zvlnr) {apn->mask[2]|= mask; break; }
- if(apn->p[3]==0) {apn->p[3]= zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
- if(apn->p[3]==zvlnr) {apn->mask[3]|= mask; break; }
+ if(apn->p[0]==0) {apn->obi[0]= obi; apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
+ if(apn->p[0]==zvlnr && apn->obi[0]==obi) {apn->mask[0]|= mask; break; }
+ if(apn->p[1]==0) {apn->obi[1]= obi; apn->p[1]= zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
+ if(apn->p[1]==zvlnr && apn->obi[1]==obi) {apn->mask[1]|= mask; break; }
+ if(apn->p[2]==0) {apn->obi[2]= obi; apn->p[2]= zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
+ if(apn->p[2]==zvlnr && apn->obi[2]==obi) {apn->mask[2]|= mask; break; }
+ if(apn->p[3]==0) {apn->obi[3]= obi; apn->p[3]= zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
+ if(apn->p[3]==zvlnr && apn->obi[3]==obi) {apn->mask[3]|= mask; break; }
if(apn->next==0) apn->next= addpsA(zspan);
apn= apn->next;
}
@@ -543,13 +545,13 @@ static void zbuflineAc(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
apn= ap;
while(apn) { /* loop unrolled */
- if(apn->p[0]==0) {apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
+ if(apn->p[0]==0) {apn->obi[0]= obi; apn->p[0]= zvlnr; apn->z[0]= vergz; apn->mask[0]= mask; break; }
if(apn->p[0]==zvlnr) {apn->mask[0]|= mask; break; }
- if(apn->p[1]==0) {apn->p[1]= zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
+ if(apn->p[1]==0) {apn->obi[1]= obi; apn->p[1]= zvlnr; apn->z[1]= vergz; apn->mask[1]= mask; break; }
if(apn->p[1]==zvlnr) {apn->mask[1]|= mask; break; }
- if(apn->p[2]==0) {apn->p[2]= zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
+ if(apn->p[2]==0) {apn->obi[2]= obi; apn->p[2]= zvlnr; apn->z[2]= vergz; apn->mask[2]= mask; break; }
if(apn->p[2]==zvlnr) {apn->mask[2]|= mask; break; }
- if(apn->p[3]==0) {apn->p[3]= zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
+ if(apn->p[3]==0) {apn->obi[3]= obi; apn->p[3]= zvlnr; apn->z[3]= vergz; apn->mask[3]= mask; break; }
if(apn->p[3]==zvlnr) {apn->mask[3]|= mask; break; }
if(apn->next==0) apn->next= addpsA(zspan);
apn= apn->next;
@@ -567,9 +569,9 @@ static void zbuflineAc(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
/* ************* NORMAL ZBUFFER ************ */
-static void zbufline(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
+static void zbufline(ZSpan *zspan, int obi, int zvlnr, float *vec1, float *vec2)
{
- int *rectz, *rectp;
+ int *rectz, *rectp, *recto;
int start, end, x, y, oldx, oldy, ofs;
int dz, vergz, maxtest= 0;
float dx, dy;
@@ -604,21 +606,24 @@ static void zbufline(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
rectz= zspan->rectz + oldy*zspan->rectx+ start;
rectp= zspan->rectp + oldy*zspan->rectx+ start;
+ recto= zspan->recto + oldy*zspan->rectx+ start;
if(dy<0) ofs= -zspan->rectx;
else ofs= zspan->rectx;
- for(x= start; x<=end; x++, rectz++, rectp++) {
+ for(x= start; x<=end; x++, rectz++, rectp++, recto++) {
y= floor(v1[1]);
if(y!=oldy) {
oldy= y;
rectz+= ofs;
rectp+= ofs;
+ recto+= ofs;
}
if(x>=0 && y>=0 && y<zspan->recty) {
if(vergz<*rectz) {
+ *recto= obi;
*rectz= vergz;
*rectp= zvlnr;
}
@@ -656,23 +661,26 @@ static void zbufline(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
rectz= zspan->rectz + start*zspan->rectx+ oldx;
rectp= zspan->rectp + start*zspan->rectx+ oldx;
+ recto= zspan->recto + start*zspan->rectx+ oldx;
if(dx<0) ofs= -1;
else ofs= 1;
- for(y= start; y<=end; y++, rectz+=zspan->rectx, rectp+=zspan->rectx) {
+ for(y= start; y<=end; y++, rectz+=zspan->rectx, rectp+=zspan->rectx, recto+=zspan->rectx) {
x= floor(v1[0]);
if(x!=oldx) {
oldx= x;
rectz+= ofs;
rectp+= ofs;
+ recto+= ofs;
}
if(x>=0 && y>=0 && x<zspan->rectx) {
if(vergz<*rectz) {
*rectz= vergz;
*rectp= zvlnr;
+ *recto= obi;
}
}
@@ -683,7 +691,7 @@ static void zbufline(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
}
}
-static void zbufline_onlyZ(ZSpan *zspan, int zvlnr, float *vec1, float *vec2)
+static void zbufline_onlyZ(ZSpan *zspan, int obi, int zvlnr, float *vec1, float *vec2)
{
int *rectz, *rectz1= NULL;
int start, end, x, y, oldx, oldy, ofs;
@@ -861,7 +869,7 @@ static int clipline(float *v1, float *v2) /* return 0: do not draw */
return 0;
}
-static void hoco_to_zco(ZSpan *zspan, float *zco, float *hoco)
+void hoco_to_zco(ZSpan *zspan, float *zco, float *hoco)
{
float div;
@@ -871,26 +879,15 @@ static void hoco_to_zco(ZSpan *zspan, float *zco, float *hoco)
zco[2]= 0x7FFFFFFF *(hoco[2]*div);
}
-void zbufclipwire(ZSpan *zspan, int zvlnr, VlakRen *vlr)
+void zbufclipwire(ZSpan *zspan, int obi, int zvlnr, int ec, float *ho1, float *ho2, float *ho3, float *ho4, int c1, int c2, int c3, int c4)
{
- float vez[20], *f1, *f2, *f3, *f4= 0;
- int c1, c2, c3, c4, ec, and, or;
+ float vez[20];
+ int and, or;
/* edgecode: 1= draw */
- ec = vlr->ec;
if(ec==0) return;
- c1= vlr->v1->clip;
- c2= vlr->v2->clip;
- c3= vlr->v3->clip;
- f1= vlr->v1->ho;
- f2= vlr->v2->ho;
- f3= vlr->v3->ho;
-
- if(vlr->v4) {
- f4= vlr->v4->ho;
- c4= vlr->v4->clip;
-
+ if(ho4) {
and= (c1 & c2 & c3 & c4);
or= (c1 | c2 | c3 | c4);
}
@@ -906,51 +903,51 @@ void zbufclipwire(ZSpan *zspan, int zvlnr, VlakRen *vlr)
else { /* clipping */
if(ec & ME_V1V2) {
- QUATCOPY(vez, f1);
- QUATCOPY(vez+4, f2);
+ QUATCOPY(vez, ho1);
+ QUATCOPY(vez+4, ho2);
if( clipline(vez, vez+4)) {
hoco_to_zco(zspan, vez, vez);
hoco_to_zco(zspan, vez+4, vez+4);
- zspan->zbuflinefunc(zspan, zvlnr, vez, vez+4);
+ zspan->zbuflinefunc(zspan, obi, zvlnr, vez, vez+4);
}
}
if(ec & ME_V2V3) {
- QUATCOPY(vez, f2);
- QUATCOPY(vez+4, f3);
+ QUATCOPY(vez, ho2);
+ QUATCOPY(vez+4, ho3);
if( clipline(vez, vez+4)) {
hoco_to_zco(zspan, vez, vez);
hoco_to_zco(zspan, vez+4, vez+4);
- zspan->zbuflinefunc(zspan, zvlnr, vez, vez+4);
+ zspan->zbuflinefunc(zspan, obi, zvlnr, vez, vez+4);
}
}
- if(vlr->v4) {
+ if(ho4) {
if(ec & ME_V3V4) {
- QUATCOPY(vez, f3);
- QUATCOPY(vez+4, f4);
+ QUATCOPY(vez, ho3);
+ QUATCOPY(vez+4, ho4);
if( clipline(vez, vez+4)) {
hoco_to_zco(zspan, vez, vez);
hoco_to_zco(zspan, vez+4, vez+4);
- zspan->zbuflinefunc(zspan, zvlnr, vez, vez+4);
+ zspan->zbuflinefunc(zspan, obi, zvlnr, vez, vez+4);
}
}
if(ec & ME_V4V1) {
- QUATCOPY(vez, f4);
- QUATCOPY(vez+4, f1);
+ QUATCOPY(vez, ho4);
+ QUATCOPY(vez+4, ho1);
if( clipline(vez, vez+4)) {
hoco_to_zco(zspan, vez, vez);
hoco_to_zco(zspan, vez+4, vez+4);
- zspan->zbuflinefunc(zspan, zvlnr, vez, vez+4);
+ zspan->zbuflinefunc(zspan, obi, zvlnr, vez, vez+4);
}
}
}
else {
if(ec & ME_V3V1) {
- QUATCOPY(vez, f3);
- QUATCOPY(vez+4, f1);
+ QUATCOPY(vez, ho3);
+ QUATCOPY(vez+4, ho1);
if( clipline(vez, vez+4)) {
hoco_to_zco(zspan, vez, vez);
hoco_to_zco(zspan, vez+4, vez+4);
- zspan->zbuflinefunc(zspan, zvlnr, vez, vez+4);
+ zspan->zbuflinefunc(zspan, obi, zvlnr, vez, vez+4);
}
}
}
@@ -959,22 +956,50 @@ void zbufclipwire(ZSpan *zspan, int zvlnr, VlakRen *vlr)
}
}
- hoco_to_zco(zspan, vez, f1);
- hoco_to_zco(zspan, vez+4, f2);
- hoco_to_zco(zspan, vez+8, f3);
- if(vlr->v4) {
- hoco_to_zco(zspan, vez+12, f4);
+ hoco_to_zco(zspan, vez, ho1);
+ hoco_to_zco(zspan, vez+4, ho2);
+ hoco_to_zco(zspan, vez+8, ho3);
+ if(ho4) {
+ hoco_to_zco(zspan, vez+12, ho4);
- if(ec & ME_V3V4) zspan->zbuflinefunc(zspan, zvlnr, vez+8, vez+12);
- if(ec & ME_V4V1) zspan->zbuflinefunc(zspan, zvlnr, vez+12, vez);
+ if(ec & ME_V3V4) zspan->zbuflinefunc(zspan, obi, zvlnr, vez+8, vez+12);
+ if(ec & ME_V4V1) zspan->zbuflinefunc(zspan, obi, zvlnr, vez+12, vez);
}
else {
- if(ec & ME_V3V1) zspan->zbuflinefunc(zspan, zvlnr, vez+8, vez);
+ if(ec & ME_V3V1) zspan->zbuflinefunc(zspan, obi, zvlnr, vez+8, vez);
}
- if(ec & ME_V1V2) zspan->zbuflinefunc(zspan, zvlnr, vez, vez+4);
- if(ec & ME_V2V3) zspan->zbuflinefunc(zspan, zvlnr, vez+4, vez+8);
+ if(ec & ME_V1V2) zspan->zbuflinefunc(zspan, obi, zvlnr, vez, vez+4);
+ if(ec & ME_V2V3) zspan->zbuflinefunc(zspan, obi, zvlnr, vez+4, vez+8);
+
+}
+
+void zbufsinglewire(ZSpan *zspan, int obi, int zvlnr, float *ho1, float *ho2)
+{
+ float f1[4], f2[4];
+ int c1, c2;
+
+ c1= testclip(ho1);
+ c2= testclip(ho2);
+
+ if(c1 | c2) { /* not in the middle */
+ if(!(c1 & c2)) { /* not out completely */
+ QUATCOPY(f1, ho1);
+ QUATCOPY(f2, ho2);
+ if(clipline(f1, f2)) {
+ hoco_to_zco(zspan, f1, f1);
+ hoco_to_zco(zspan, f2, f2);
+ zspan->zbuflinefunc(zspan, obi, zvlnr, f1, f2);
+ }
+ }
+ }
+ else {
+ hoco_to_zco(zspan, f1, ho1);
+ hoco_to_zco(zspan, f2, ho2);
+
+ zspan->zbuflinefunc(zspan, obi, zvlnr, f1, f2);
+ }
}
/**
@@ -988,12 +1013,13 @@ void zbufclipwire(ZSpan *zspan, int zvlnr, VlakRen *vlr)
* @param v2 [4 floats, world coordinates] second vertex
* @param v3 [4 floats, world coordinates] third vertex
*/
-static void zbuffillGLinv4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
+static void zbuffillGLinv4(ZSpan *zspan, int obi, int zvlnr, float *v1, float *v2, float *v3, float *v4)
{
double zxd, zyd, zy0, zverg;
float x0,y0,z0;
float x1,y1,z1,x2,y2,z2,xx1;
float *span1, *span2;
+ int *rectoofs, *ro;
int *rectpofs, *rp;
int *rz, x, y;
int sn1, sn2, rectx, *rectzofs, my0, my2;
@@ -1044,6 +1070,7 @@ static void zbuffillGLinv4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float
rectx= zspan->rectx;
rectzofs= (zspan->rectz+rectx*my2);
rectpofs= (zspan->rectp+rectx*my2);
+ rectoofs= (zspan->recto+rectx*my2);
/* correct span */
sn1= (my0 + my2)/2;
@@ -1069,16 +1096,19 @@ static void zbuffillGLinv4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float
zverg= (double)sn1*zxd + zy0;
rz= rectzofs+sn1;
rp= rectpofs+sn1;
+ ro= rectoofs+sn1;
x= sn2-sn1;
while(x>=0) {
if( (int)zverg > *rz || *rz==0x7FFFFFFF) {
+ *ro= obi;
*rz= (int)zverg;
*rp= zvlnr;
}
zverg+= zxd;
rz++;
rp++;
+ ro++;
x--;
}
}
@@ -1086,17 +1116,19 @@ static void zbuffillGLinv4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float
zy0-=zyd;
rectzofs-= rectx;
rectpofs-= rectx;
+ rectoofs-= rectx;
}
}
/* uses spanbuffers */
-static void zbuffillGL4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
+static void zbuffillGL4(ZSpan *zspan, int obi, int zvlnr, float *v1, float *v2, float *v3, float *v4)
{
double zxd, zyd, zy0, zverg;
float x0,y0,z0;
float x1,y1,z1,x2,y2,z2,xx1;
float *span1, *span2;
+ int *rectoofs, *ro;
int *rectpofs, *rp;
int *rz, x, y;
int sn1, sn2, rectx, *rectzofs, my0, my2;
@@ -1147,6 +1179,7 @@ static void zbuffillGL4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3
rectx= zspan->rectx;
rectzofs= (zspan->rectz+rectx*my2);
rectpofs= (zspan->rectp+rectx*my2);
+ rectoofs= (zspan->recto+rectx*my2);
/* correct span */
sn1= (my0 + my2)/2;
@@ -1172,16 +1205,19 @@ static void zbuffillGL4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3
zverg= (double)sn1*zxd + zy0;
rz= rectzofs+sn1;
rp= rectpofs+sn1;
+ ro= rectoofs+sn1;
x= sn2-sn1;
while(x>=0) {
if( (int)zverg < *rz) {
*rz= (int)zverg;
*rp= zvlnr;
+ *ro= obi;
}
zverg+= zxd;
rz++;
rp++;
+ ro++;
x--;
}
}
@@ -1189,6 +1225,7 @@ static void zbuffillGL4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3
zy0-=zyd;
rectzofs-= rectx;
rectpofs-= rectx;
+ rectoofs-= rectx;
}
}
@@ -1204,7 +1241,7 @@ static void zbuffillGL4(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3
*/
/* now: filling two Z values, the closest and 2nd closest */
-static void zbuffillGL_onlyZ(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
+static void zbuffillGL_onlyZ(ZSpan *zspan, int obi, int zvlnr, float *v1, float *v2, float *v3, float *v4)
{
double zxd, zyd, zy0, zverg;
float x0,y0,z0;
@@ -1312,7 +1349,105 @@ static void zbuffillGL_onlyZ(ZSpan *zspan, int zvlnr, float *v1, float *v2, floa
}
/* 2d scanconvert for tria, calls func for each x,y coordinate and gives UV barycentrics */
-/* zspan should be initialized, has rect size and span buffers */
+void zspan_scanconvert_strand(ZSpan *zspan, void *handle, float *v1, float *v2, float *v3, void (*func)(void *, int, int, float, float, float) )
+{
+ float x0, y0, x1, y1, x2, y2, z0, z1, z2, z;
+ float u, v, uxd, uyd, vxd, vyd, uy0, vy0, zxd, zyd, zy0, xx1;
+ float *span1, *span2;
+ int x, y, sn1, sn2, rectx= zspan->rectx, my0, my2;
+
+ /* init */
+ zbuf_init_span(zspan);
+
+ /* set spans */
+ zbuf_add_to_span(zspan, v1, v2);
+ zbuf_add_to_span(zspan, v2, v3);
+ zbuf_add_to_span(zspan, v3, v1);
+
+ /* clipped */
+ if(zspan->minp2==NULL || zspan->maxp2==NULL) return;
+
+ if(zspan->miny1 < zspan->miny2) my0= zspan->miny2; else my0= zspan->miny1;
+ if(zspan->maxy1 > zspan->maxy2) my2= zspan->maxy2; else my2= zspan->maxy1;
+
+ // printf("my %d %d\n", my0, my2);
+ if(my2<my0) return;
+
+ /* ZBUF DX DY, in floats still */
+ x1= v1[0]- v2[0];
+ x2= v2[0]- v3[0];
+ y1= v1[1]- v2[1];
+ y2= v2[1]- v3[1];
+ z1= v1[2]- v2[2];
+ z2= v2[2]- v3[2];
+
+ x0= y1*z2-z1*y2;
+ y0= z1*x2-x1*z2;
+ z0= x1*y2-y1*x2;
+
+ if(z0==0.0f) return;
+
+ xx1= (x0*v1[0] + y0*v1[1])/z0 + v1[2];
+ zxd= -(double)x0/(double)z0;
+ zyd= -(double)y0/(double)z0;
+ zy0= ((double)my2)*zyd + (double)xx1;
+
+ z1= 1.0f; // (u1 - u2)
+ z2= 0.0f; // (u2 - u3)
+
+ x0= y1*z2-z1*y2;
+ y0= z1*x2-x1*z2;
+
+ xx1= (x0*v1[0] + y0*v1[1])/z0 + 1.0f;
+ uxd= -(double)x0/(double)z0;
+ uyd= -(double)y0/(double)z0;
+ uy0= ((double)my2)*uyd + (double)xx1;
+
+ z1= -1.0f; // (v1 - v2)
+ z2= 1.0f; // (v2 - v3)
+
+ x0= y1*z2-z1*y2;
+ y0= z1*x2-x1*z2;
+
+ xx1= (x0*v1[0] + y0*v1[1])/z0;
+ vxd= -(double)x0/(double)z0;
+ vyd= -(double)y0/(double)z0;
+ vy0= ((double)my2)*vyd + (double)xx1;
+
+ /* correct span */
+ sn1= (my0 + my2)/2;
+ if(zspan->span1[sn1] < zspan->span2[sn1]) {
+ span1= zspan->span1+my2;
+ span2= zspan->span2+my2;
+ }
+ else {
+ span1= zspan->span2+my2;
+ span2= zspan->span1+my2;
+ }
+
+ for(y=my2; y>=my0; y--, span1--, span2--) {
+
+ sn1= floor(*span1);
+ sn2= floor(*span2);
+ sn1++;
+
+ if(sn2>=rectx) sn2= rectx-1;
+ if(sn1<0) sn1= 0;
+
+ u= (double)sn1*uxd + uy0;
+ v= (double)sn1*vxd + vy0;
+ z= (double)sn1*zxd + zy0;
+
+ for(x= sn1; x<=sn2; x++, u+=uxd, v+=vxd, z+=zxd)
+ func(handle, x, y, u, v, z);
+
+ uy0 -= uyd;
+ vy0 -= vyd;
+ zy0 -= zyd;
+ }
+}
+
+/* scanconvert for strand triangles, calls func for each x,y coordinate and gives UV barycentrics and z */
void zspan_scanconvert(ZSpan *zspan, void *handle, float *v1, float *v2, float *v3, void (*func)(void *, int, int, float, float) )
{
@@ -1416,7 +1551,7 @@ void zspan_scanconvert(ZSpan *zspan, void *handle, float *v1, float *v2, float *
* @param a index for coordinate (x, y, or z)
*/
-static void clippyra(float *labda, float *v1, float *v2, int *b2, int *b3, int a)
+static void clippyra(float *labda, float *v1, float *v2, int *b2, int *b3, int a, float clipcrop)
{
float da,dw,u1=0.0,u2=1.0;
float v13;
@@ -1432,9 +1567,8 @@ static void clippyra(float *labda, float *v1, float *v2, int *b2, int *b3, int a
v13= v1[3];
}
else {
- /* XXXXX EVIL! this is a R global, whilst this function can be called for shadow, before R was set */
- dw= R.clipcrop*(v2[3]-v1[3]);
- v13= R.clipcrop*v1[3];
+ dw= clipcrop*(v2[3]-v1[3]);
+ v13= clipcrop*v1[3];
}
/* according the original article by Liang&Barsky, for clipping of
* homogenous coordinates with viewplane, the value of "0" is used instead of "-w" .
@@ -1543,9 +1677,115 @@ void projectvert(float *v1, float winmat[][4], float *adr)
adr[3]= x*winmat[0][3]+ y*winmat[1][3]+ z*winmat[2][3]+ winmat[3][3];
}
+/* ------------------------------------------------------------------------- */
+
+#define ZBUF_PROJECT_CACHE_SIZE 256
+
+typedef struct ZbufProjectCache {
+ int index, clip;
+ float ho[4];
+} ZbufProjectCache;
+
+static void zbuf_project_cache_clear(ZbufProjectCache *cache, int size)
+{
+ int i;
+
+ if(size > ZBUF_PROJECT_CACHE_SIZE)
+ size= ZBUF_PROJECT_CACHE_SIZE;
+
+ memset(cache, 0, sizeof(ZbufProjectCache)*size);
+ for(i=0; i<size; i++)
+ cache[i].index= -1;
+}
+
+static int zbuf_shadow_project(ZbufProjectCache *cache, int index, float winmat[][4], float *co, float *ho)
+{
+ int clipflag, cindex= index & 255;
+
+ if(cache[cindex].index == index) {
+ QUATCOPY(ho, cache[cindex].ho);
+ return cache[cindex].clip;
+ }
+ else {
+ projectvert(co, winmat, ho);
+ clipflag= testclip(ho);
+
+ QUATCOPY(cache[cindex].ho, ho);
+ cache[cindex].clip= clipflag;
+ cache[cindex].index= index;
+
+ return clipflag;
+ }
+}
+
+static void zbuffer_part_bounds(Render *re, RenderPart *pa, float *bounds)
+{
+ bounds[0]= (2*pa->disprect.xmin - re->winx-1)/(float)re->winx;
+ bounds[1]= (2*pa->disprect.xmax - re->winx+1)/(float)re->winx;
+ bounds[2]= (2*pa->disprect.ymin - re->winy-1)/(float)re->winy;
+ bounds[3]= (2*pa->disprect.ymax - re->winy+1)/(float)re->winy;
+}
+
+static int zbuf_part_project(ZbufProjectCache *cache, int index, float winmat[][4], float *bounds, float *co, float *ho)
+{
+ float vec[3], wco;
+ int clipflag= 0, cindex= index & 255;
+
+ if(cache[cindex].index == index) {
+ QUATCOPY(ho, cache[cindex].ho);
+ return cache[cindex].clip;
+ }
+ else {
+ VECCOPY(vec, co)
+ projectvert(co, winmat, ho);
+
+ wco= ho[3];
+ if(ho[0] > bounds[1]*wco) clipflag |= 1;
+ else if(ho[0]< bounds[0]*wco) clipflag |= 2;
+ if(ho[1] > bounds[3]*wco) clipflag |= 4;
+ else if(ho[1]< bounds[2]*wco) clipflag |= 8;
+
+ QUATCOPY(cache[cindex].ho, ho);
+ cache[cindex].clip= clipflag;
+ cache[cindex].index= index;
+
+ return clipflag;
+ }
+}
+
+void zbuf_render_project(float winmat[][4], float *co, float *ho)
+{
+ float vec[3];
+
+ VECCOPY(vec, co)
+ projectvert(vec, winmat, ho);
+}
+
+void zbuf_make_winmat(Render *re, float duplimat[][4], float winmat[][4])
+{
+ float panomat[4][4];
+
+ if(re->r.mode & R_PANORAMA) {
+ Mat4One(panomat);
+ panomat[0][0]= re->panoco;
+ panomat[0][2]= re->panosi;
+ panomat[2][0]= -re->panosi;
+ panomat[2][2]= re->panoco;
+
+ if(duplimat)
+ Mat4MulSerie(winmat, re->winmat, panomat, duplimat, 0, 0, 0, 0, 0);
+ else
+ Mat4MulMat4(winmat, panomat, re->winmat);
+ }
+ else if(duplimat)
+ Mat4MulMat4(winmat, duplimat, re->winmat);
+ else
+ Mat4CpyMat4(winmat, re->winmat);
+}
+
/* do zbuffering and clip, f1 f2 f3 are hocos, c1 c2 c3 are clipping flags */
-void zbufclip(ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, int c1, int c2, int c3)
+void zbufclip(ZSpan *zspan, int obi, int zvlnr, float *f1, float *f2, float *f3, int c1, int c2, int c3)
{
float *vlzp[32][3], labda[3][2];
float vez[400], *trias[40];
@@ -1586,9 +1826,9 @@ void zbufclip(ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, int c1,
else if (b==1) arg= 0;
else arg= 1;
- clippyra(labda[0], vlzp[v][0],vlzp[v][1], &b2,&b3, arg);
- clippyra(labda[1], vlzp[v][1],vlzp[v][2], &b2,&b3, arg);
- clippyra(labda[2], vlzp[v][2],vlzp[v][0], &b2,&b3, arg);
+ clippyra(labda[0], vlzp[v][0],vlzp[v][1], &b2,&b3, arg, zspan->clipcrop);
+ clippyra(labda[1], vlzp[v][1],vlzp[v][2], &b2,&b3, arg, zspan->clipcrop);
+ clippyra(labda[2], vlzp[v][2],vlzp[v][0], &b2,&b3, arg, zspan->clipcrop);
if(b2==0 && b3==1) {
/* completely 'in', but we copy because of last for() loop in this section */;
@@ -1644,7 +1884,7 @@ void zbufclip(ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, int c1,
}
for(b=1;b<clvl;b++) {
if(vlzp[b][0]) {
- zspan->zbuffunc(zspan, zvlnr, vlzp[b][0],vlzp[b][1],vlzp[b][2], NULL);
+ zspan->zbuffunc(zspan, obi, zvlnr, vlzp[b][0],vlzp[b][1],vlzp[b][2], NULL);
}
}
return;
@@ -1655,10 +1895,10 @@ void zbufclip(ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, int c1,
hoco_to_zco(zspan, vez, f1);
hoco_to_zco(zspan, vez+4, f2);
hoco_to_zco(zspan, vez+8, f3);
- zspan->zbuffunc(zspan, zvlnr, vez,vez+4,vez+8, NULL);
+ zspan->zbuffunc(zspan, obi, zvlnr, vez,vez+4,vez+8, NULL);
}
-void zbufclip4(ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, float *f4, int c1, int c2, int c3, int c4)
+void zbufclip4(ZSpan *zspan, int obi, int zvlnr, float *f1, float *f2, float *f3, float *f4, int c1, int c2, int c3, int c4)
{
float vez[16];
@@ -1666,8 +1906,8 @@ void zbufclip4(ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, float *
if(c1 & c2 & c3 & c4) { /* completely out */
return;
} else { /* clipping */
- zbufclip(zspan, zvlnr, f1, f2, f3, c1, c2, c3);
- zbufclip(zspan, zvlnr, f1, f3, f4, c1, c3, c4);
+ zbufclip(zspan, obi, zvlnr, f1, f2, f3, c1, c2, c3);
+ zbufclip(zspan, obi, zvlnr, f1, f3, f4, c1, c3, c4);
}
return;
}
@@ -1678,150 +1918,281 @@ void zbufclip4(ZSpan *zspan, int zvlnr, float *f1, float *f2, float *f3, float *
hoco_to_zco(zspan, vez+8, f3);
hoco_to_zco(zspan, vez+12, f4);
- zspan->zbuffunc(zspan, zvlnr, vez, vez+4, vez+8, vez+12);
+ zspan->zbuffunc(zspan, obi, zvlnr, vez, vez+4, vez+8, vez+12);
}
+/* ************** ZMASK ******************************** */
-/* ***************** ZBUFFER MAIN ROUTINES **************** */
+#define EXTEND_PIXEL(a) if(temprectp[a]) {z+= rectz[a]; tot++;}
-void set_part_zbuf_clipflag(RenderPart *pa)
+/* changes the zbuffer to be ready for z-masking: applies an extend-filter, and then clears */
+static void zmask_rect(int *rectz, int *rectp, int xs, int ys)
{
- VertRen *ver=NULL;
- float minx, miny, maxx, maxy, wco;
- int v;
- char *clipflag;
-
- /* flags stored in part now */
- clipflag= pa->clipflag= MEM_mallocN(R.totvert+1, "part clipflags");
-
- minx= (2*pa->disprect.xmin - R.winx-1)/(float)R.winx;
- maxx= (2*pa->disprect.xmax - R.winx+1)/(float)R.winx;
- miny= (2*pa->disprect.ymin - R.winy-1)/(float)R.winy;
- maxy= (2*pa->disprect.ymax - R.winy+1)/(float)R.winy;
-
- for(v=0; v<R.totvert; v++, clipflag++) {
- if((v & 255)==0)
- ver= RE_findOrAddVert(&R, v);
- else ver++;
+ int len=0, x, y;
+ int *temprectp;
+ int row1, row2, row3, *curp, *curz;
+
+ temprectp= MEM_dupallocN(rectp);
+
+ /* extend: if pixel is not filled in, we check surrounding pixels and average z value */
+
+ for(y=1; y<=ys; y++) {
+ /* setup row indices */
+ row1= (y-2)*xs;
+ row2= row1 + xs;
+ row3= row2 + xs;
+ if(y==1)
+ row1= row2;
+ else if(y==ys)
+ row3= row2;
- wco= ver->ho[3];
-
- *clipflag= 0;
- if( ver->ho[0] > maxx*wco) *clipflag |= 1;
- else if( ver->ho[0]< minx*wco) *clipflag |= 2;
- if( ver->ho[1] > maxy*wco) *clipflag |= 4;
- else if( ver->ho[1]< miny*wco) *clipflag |= 8;
+ curp= rectp + (y-1)*xs;
+ curz= rectz + (y-1)*xs;
+
+ for(x=0; x<xs; x++, curp++, curz++) {
+ if(curp[0]==0) {
+ int tot= 0;
+ float z= 0.0f;
+
+ EXTEND_PIXEL(row1);
+ EXTEND_PIXEL(row2);
+ EXTEND_PIXEL(row3);
+ EXTEND_PIXEL(row1 + 1);
+ EXTEND_PIXEL(row3 + 1);
+ if(x!=xs-1) {
+ EXTEND_PIXEL(row1 + 2);
+ EXTEND_PIXEL(row2 + 2);
+ EXTEND_PIXEL(row3 + 2);
+ }
+ if(tot) {
+ len++;
+ curz[0]= (int)(z/(float)tot);
+ curp[0]= -1; /* env */
+ }
+ }
+
+ if(x!=0) {
+ row1++; row2++; row3++;
+ }
+ }
+ }
+ MEM_freeN(temprectp);
+
+ /* clear not filled z values */
+ for(len= xs*ys -1; len>=0; len--) {
+ if(rectp[len]==0) {
+ rectz[len] = -0x7FFFFFFF;
+ rectp[len]= -1; /* env code */
+ }
}
}
-void zbuffer_solid(RenderPart *pa, unsigned int lay, short layflag)
+
+
+
+/* ***************** ZBUFFER MAIN ROUTINES **************** */
+
+void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart*, ZSpan*, int, void*), void *data)
{
- ZSpan zspan;
+ ZbufProjectCache cache[ZBUF_PROJECT_CACHE_SIZE];
+ ZSpan zspans[16], *zspan; /* 16 = RE_MAX_OSA */
VlakRen *vlr= NULL;
VertRen *v1, *v2, *v3, *v4;
Material *ma=0;
- int v, zvlnr;
- short nofill=0, env=0, wire=0, all_z= layflag & SCE_LAY_ALL_Z;
- char *clipflag= pa->clipflag;
-
- zbuf_alloc_span(&zspan, pa->rectx, pa->recty);
-
- /* needed for transform from hoco to zbuffer co */
- zspan.zmulx= ((float)R.winx)/2.0;
- zspan.zmuly= ((float)R.winy)/2.0;
-
- if(R.osa) {
- zspan.zofsx= -pa->disprect.xmin - R.jit[pa->sample][0];
- zspan.zofsy= -pa->disprect.ymin - R.jit[pa->sample][1];
- }
- else if(R.i.curblur) {
- zspan.zofsx= -pa->disprect.xmin - R.jit[R.i.curblur-1][0];
- zspan.zofsy= -pa->disprect.ymin - R.jit[R.i.curblur-1][1];
- }
- else {
- zspan.zofsx= -pa->disprect.xmin;
- zspan.zofsy= -pa->disprect.ymin;
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
+ float winmat[4][4], bounds[4], ho1[4], ho2[4], ho3[4], ho4[4]={0};
+ unsigned int lay= rl->lay, lay_zmask= rl->lay_zmask;
+ int i, v, zvlnr, zsample, samples, c1, c2, c3, c4=0;
+ short nofill=0, env=0, wire=0, zmaskpass=0;
+ short all_z= rl->layflag & SCE_LAY_ALL_Z;
+
+ samples= (R.osa? R.osa: 1);
+ samples= MIN2(4, samples-pa->sample);
+
+ for(zsample=0; zsample<samples; zsample++) {
+ zspan= &zspans[zsample];
+
+ zbuffer_part_bounds(&R, pa, bounds);
+ zbuf_alloc_span(zspan, pa->rectx, pa->recty, R.clipcrop);
+
+ /* needed for transform from hoco to zbuffer co */
+ zspan->zmulx= ((float)R.winx)/2.0;
+ zspan->zmuly= ((float)R.winy)/2.0;
+
+ if(R.osa) {
+ zspan->zofsx= -pa->disprect.xmin - R.jit[pa->sample+zsample][0];
+ zspan->zofsy= -pa->disprect.ymin - R.jit[pa->sample+zsample][1];
+ }
+ else if(R.i.curblur) {
+ zspan->zofsx= -pa->disprect.xmin - R.jit[R.i.curblur-1][0];
+ zspan->zofsy= -pa->disprect.ymin - R.jit[R.i.curblur-1][1];
+ }
+ else {
+ zspan->zofsx= -pa->disprect.xmin;
+ zspan->zofsy= -pa->disprect.ymin;
+ }
+ /* to center the sample position */
+ zspan->zofsx -= 0.5f;
+ zspan->zofsy -= 0.5f;
+
+ /* the buffers */
+ if(zsample == samples-1) {
+ zspan->rectz= pa->rectz;
+ zspan->rectp= pa->rectp;
+ zspan->recto= pa->recto;
+ }
+ else {
+ zspan->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
+ zspan->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
+ zspan->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
+ }
+
+ fillrect(zspan->rectz, pa->rectx, pa->recty, 0x7FFFFFFF);
+ fillrect(zspan->rectp, pa->rectx, pa->recty, 0);
+ fillrect(zspan->recto, pa->rectx, pa->recty, 0);
+
+ /* filling methods */
+ zspan->zbuffunc= zbuffillGL4;
+ zspan->zbuflinefunc= zbufline;
}
- /* to center the sample position */
- zspan.zofsx -= 0.5f;
- zspan.zofsy -= 0.5f;
-
- /* the buffers */
- zspan.rectz= pa->rectz;
- zspan.rectp= pa->rectp;
- fillrect(pa->rectp, pa->rectx, pa->recty, 0);
- fillrect(pa->rectz, pa->rectx, pa->recty, 0x7FFFFFFF);
-
- /* filling methods */
- zspan.zbuffunc= zbuffillGL4;
- zspan.zbuflinefunc= zbufline;
- for(v=0; v<R.totvlak; v++) {
+ /* in case zmask we fill Z for objects in lay_zmask first, then clear Z, and then do normal zbuffering */
+ if(rl->layflag & SCE_LAY_ZMASK)
+ zmaskpass= 1;
+
+ for(; zmaskpass >=0; zmaskpass--) {
+ /* regular zbuffering loop, does all sample buffers */
+ for(i=0, obi=R.instancetable.first; obi; i++, obi=obi->next) {
+ obr= obi->obr;
- if((v & 255)==0) vlr= R.vlaknodes[v>>8].vlak;
- else vlr++;
-
- if((vlr->flag & R_VISIBLE)) {
- /* three cases, visible for render, only z values and nothing */
- if(vlr->lay & lay) {
- if(vlr->mat!=ma) {
- ma= vlr->mat;
- nofill= ma->mode & (MA_ZTRA|MA_ONLYCAST);
- env= (ma->mode & MA_ENV);
- wire= (ma->mode & MA_WIRE);
-
- if(ma->mode & MA_ZINV) zspan.zbuffunc= zbuffillGLinv4;
- else zspan.zbuffunc= zbuffillGL4;
- }
- }
- else if(all_z) {
- env= 1;
- nofill= 0;
- ma= NULL;
+ /* continue happens in 2 different ways... zmaskpass only does lay_zmask stuff */
+ if(zmaskpass) {
+ if((obr->lay & lay_zmask)==0)
+ continue;
}
else {
- nofill= 1;
- ma= NULL; /* otherwise nofill can hang */
+ if(!all_z && !(obr->lay & (lay|lay_zmask)))
+ continue;
}
- if(nofill==0) {
- unsigned short partclip;
-
- v1= vlr->v1;
- v2= vlr->v2;
- v3= vlr->v3;
- v4= vlr->v4;
-
- /* partclipping doesn't need viewplane clipping */
- partclip= clipflag[v1->index] & clipflag[v2->index] & clipflag[v3->index];
- if(v4)
- partclip &= clipflag[v4->index];
-
- if(partclip==0) {
-
- if(env) zvlnr= -1;
- else zvlnr= v+1;
-
- if(wire) zbufclipwire(&zspan, zvlnr, vlr);
- else {
- /* strands allow to be filled in as quad */
- if(v4 && (vlr->flag & R_STRAND)) {
- zbufclip4(&zspan, zvlnr, v1->ho, v2->ho, v3->ho, v4->ho, v1->clip, v2->clip, v3->clip, v4->clip);
+ if(obi->flag & R_TRANSFORMED)
+ zbuf_make_winmat(&R, obi->mat, winmat);
+ else
+ zbuf_make_winmat(&R, NULL, winmat);
+
+ if(clip_render_object(obi->obr->boundbox, bounds, winmat))
+ continue;
+
+ zbuf_project_cache_clear(cache, obr->totvert);
+
+ for(v=0; v<obr->totvlak; v++) {
+ if((v & 255)==0) vlr= obr->vlaknodes[v>>8].vlak;
+ else vlr++;
+
+ /* the cases: visible for render, only z values, zmask, nothing */
+ if(obr->lay & lay) {
+ if(vlr->mat!=ma) {
+ ma= vlr->mat;
+ nofill= ma->mode & (MA_ZTRA|MA_ONLYCAST);
+ env= (ma->mode & MA_ENV);
+ wire= (ma->mode & MA_WIRE);
+
+ for(zsample=0; zsample<samples; zsample++) {
+ if(ma->mode & MA_ZINV) zspans[zsample].zbuffunc= zbuffillGLinv4;
+ else zspans[zsample].zbuffunc= zbuffillGL4;
}
- else {
- zbufclip(&zspan, zvlnr, v1->ho, v2->ho, v3->ho, v1->clip, v2->clip, v3->clip);
- if(v4) {
- if(zvlnr>0) zvlnr+= RE_QUAD_OFFS;
- zbufclip(&zspan, zvlnr, v1->ho, v3->ho, v4->ho, v1->clip, v3->clip, v4->clip);
+ }
+ }
+ else if(all_z || (obr->lay & lay_zmask)) {
+ env= 1;
+ nofill= 0;
+ ma= NULL;
+ }
+ else {
+ nofill= 1;
+ ma= NULL; /* otherwise nofill can hang */
+ }
+
+ if(!(vlr->flag & R_HIDDEN) && nofill==0) {
+ unsigned short partclip;
+
+ v1= vlr->v1;
+ v2= vlr->v2;
+ v3= vlr->v3;
+ v4= vlr->v4;
+
+ c1= zbuf_part_project(cache, v1->index, winmat, bounds, v1->co, ho1);
+ c2= zbuf_part_project(cache, v2->index, winmat, bounds, v2->co, ho2);
+ c3= zbuf_part_project(cache, v3->index, winmat, bounds, v3->co, ho3);
+
+ /* partclipping doesn't need viewplane clipping */
+ partclip= c1 & c2 & c3;
+ if(v4) {
+ c4= zbuf_part_project(cache, v4->index, winmat, bounds, v4->co, ho4);
+ partclip &= c4;
+ }
+
+ if(partclip==0) {
+
+ if(env) zvlnr= -1;
+ else zvlnr= v+1;
+
+ c1= testclip(ho1);
+ c2= testclip(ho2);
+ c3= testclip(ho3);
+ if(v4)
+ c4= testclip(ho4);
+
+ for(zsample=0; zsample<samples; zsample++) {
+ zspan= &zspans[zsample];
+
+ if(wire) {
+ if(v4)
+ zbufclipwire(zspan, i, zvlnr, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
+ else
+ zbufclipwire(zspan, i, zvlnr, vlr->ec, ho1, ho2, ho3, 0, c1, c2, c3, 0);
+ }
+ else {
+ /* strands allow to be filled in as quad */
+ if(v4 && (vlr->flag & R_STRAND)) {
+ zbufclip4(zspan, i, zvlnr, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
+ }
+ else {
+ zbufclip(zspan, i, zvlnr, ho1, ho2, ho3, c1, c2, c3);
+ if(v4)
+ zbufclip(zspan, i, zvlnr+RE_QUAD_OFFS, ho1, ho3, ho4, c1, c3, c4);
+ }
}
}
}
}
}
}
+
+ /* clear all z to close value, so it works as mask for next passes (ztra+strand) */
+ if(zmaskpass) {
+ for(zsample=0; zsample<samples; zsample++) {
+ zspan= &zspans[zsample];
+ zmask_rect(zspan->rectz, zspan->rectp, pa->rectx, pa->recty);
+ }
+ }
+ }
+
+ for(zsample=0; zsample<samples; zsample++) {
+ zspan= &zspans[zsample];
+
+ if(fillfunc)
+ fillfunc(pa, zspan, pa->sample+zsample, data);
+
+ if(zsample != samples-1) {
+ MEM_freeN(zspan->rectz);
+ MEM_freeN(zspan->rectp);
+ MEM_freeN(zspan->recto);
+ }
+
+ zbuf_free_span(zspan);
}
-
- zbuf_free_span(&zspan);
}
typedef struct {
@@ -1869,10 +2240,8 @@ void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem, Re
/* needed for projectvert */
MTC_Mat4MulMat4(winmat, vw->viewmat, vw->winmat);
- /* for clipping... bad stuff actually */
- R.clipcrop= 1.0f;
-
- zbuf_alloc_span(&zspan, vw->rectx, vw->recty);
+ /* 1.0f for clipping in clippyra()... bad stuff actually */
+ zbuf_alloc_span(&zspan, vw->rectx, vw->recty, 1.0f);
zspan.zmulx= ((float)vw->rectx)/2.0;
zspan.zmuly= ((float)vw->recty)/2.0;
zspan.zofsx= -0.5f;
@@ -1881,6 +2250,7 @@ void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem, Re
/* the buffers */
zspan.rectz= (int *)vw->rectz;
zspan.rectp= (int *)vw->rect;
+ zspan.recto= MEM_callocN(sizeof(int)*vw->rectx*vw->recty, "radiorecto");
fillrect(zspan.rectz, vw->rectx, vw->recty, 0x7FFFFFFF);
fillrect(zspan.rectp, vw->rectx, vw->recty, 0xFFFFFF);
@@ -1909,59 +2279,75 @@ void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem, Re
}
if(rn->v4)
- zbufclip4(&zspan, zvlnr, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
+ zbufclip4(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
else
- zbufclip(&zspan, zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3);
+ zbufclip(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3);
}
}
}
else { /* radio render */
+ ObjectRen *obr;
VlakRen *vlr=NULL;
- RadFace *rf;
+ RadFace **radface, *rf;
int totface=0;
- for(a=0; a<re->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak; else vlr++;
-
- if(vlr->radface) {
- rf= vlr->radface;
- if( (rf->flag & RAD_SHOOT)==0 ) { /* no shootelement */
-
- if( rf->flag & RAD_TWOSIDED) zvlnr= totface;
- else if( rf->flag & RAD_BACKFACE) zvlnr= 0xFFFFFF; /* receives no energy, but is zbuffered */
- else zvlnr= totface;
-
- c1= hashlist_projectvert(vlr->v1->co, winmat, hoco[0]);
- c2= hashlist_projectvert(vlr->v2->co, winmat, hoco[1]);
- c3= hashlist_projectvert(vlr->v3->co, winmat, hoco[2]);
-
- if(vlr->v4) {
- c4= hashlist_projectvert(vlr->v4->co, winmat, hoco[3]);
+ /* note: radio render doesn't support duplis */
+ for(obr=re->objecttable.first; obr; obr=obr->next) {
+ hashlist_projectvert(NULL, NULL, NULL); /* clear hashlist */
+
+ for(a=0; a<obr->totvlak; a++) {
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
+
+ if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+ rf= *radface;
+ if( (rf->flag & RAD_SHOOT)==0 ) { /* no shootelement */
+
+ if( rf->flag & RAD_TWOSIDED) zvlnr= totface;
+ else if( rf->flag & RAD_BACKFACE) zvlnr= 0xFFFFFF; /* receives no energy, but is zbuffered */
+ else zvlnr= totface;
+
+ c1= hashlist_projectvert(vlr->v1->co, winmat, hoco[0]);
+ c2= hashlist_projectvert(vlr->v2->co, winmat, hoco[1]);
+ c3= hashlist_projectvert(vlr->v3->co, winmat, hoco[2]);
+
+ if(vlr->v4) {
+ c4= hashlist_projectvert(vlr->v4->co, winmat, hoco[3]);
+ }
+
+ if(vlr->v4)
+ zbufclip4(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
+ else
+ zbufclip(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3);
}
-
- if(vlr->v4)
- zbufclip4(&zspan, zvlnr, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
- else
- zbufclip(&zspan, zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3);
+ totface++;
}
- totface++;
}
}
}
+ MEM_freeN(zspan.recto);
zbuf_free_span(&zspan);
}
-void zbuffer_shadow(Render *re, LampRen *lar, int *rectz, int size, float jitx, float jity)
+void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int size, float jitx, float jity)
{
+ ZbufProjectCache cache[ZBUF_PROJECT_CACHE_SIZE];
ZSpan zspan;
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
VlakRen *vlr= NULL;
Material *ma= NULL;
- int a, ok=1, lay= -1;
+ StrandSegment sseg;
+ StrandRen *strand= NULL;
+ StrandVert *svert;
+ StrandBound *sbound;
+ float obwinmat[4][4], ho1[4], ho2[4], ho3[4], ho4[4];
+ int a, b, c, i, c1, c2, c3, c4, ok=1, lay= -1;
if(lar->mode & LA_LAYER) lay= lar->lay;
- zbuf_alloc_span(&zspan, size, size);
+ /* 1.0f for clipping in clippyra()... bad stuff actually */
+ zbuf_alloc_span(&zspan, size, size, 1.0f);
zspan.zmulx= ((float)size)/2.0;
zspan.zmuly= ((float)size)/2.0;
zspan.zofsx= jitx;
@@ -1979,28 +2365,117 @@ void zbuffer_shadow(Render *re, LampRen *lar, int *rectz, int size, float jitx,
zspan.zbuflinefunc= zbufline_onlyZ;
zspan.zbuffunc= zbuffillGL_onlyZ;
- for(a=0; a<re->totvlak; a++) {
+ for(i=0, obi=re->instancetable.first; obi; i++, obi=obi->next) {
+ obr= obi->obr;
+
+ if(obr->ob==re->excludeob)
+ continue;
+ else if(!(obr->lay & lay))
+ continue;
+
+ if(obi->flag & R_TRANSFORMED)
+ Mat4MulMat4(obwinmat, obi->mat, winmat);
+ else
+ Mat4CpyMat4(obwinmat, winmat);
+
+ if(clip_render_object(obi->obr->boundbox, NULL, obwinmat))
+ continue;
+
+ zbuf_project_cache_clear(cache, obr->totvert);
+
+ /* faces */
+ for(a=0; a<obr->totvlak; a++) {
- if((a & 255)==0) vlr= re->vlaknodes[a>>8].vlak;
- else vlr++;
+ if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
+ else vlr++;
+
+ /* note, these conditions are copied in shadowbuf_autoclip() */
+ if(vlr->mat!= ma) {
+ ma= vlr->mat;
+ ok= 1;
+ if((ma->mode & MA_SHADBUF)==0) ok= 0;
+ }
+
+ if(ok && (obr->lay & lay) && !(vlr->flag & R_HIDDEN)) {
+ c1= zbuf_shadow_project(cache, vlr->v1->index, obwinmat, vlr->v1->co, ho1);
+ c2= zbuf_shadow_project(cache, vlr->v2->index, obwinmat, vlr->v2->co, ho2);
+ c3= zbuf_shadow_project(cache, vlr->v3->index, obwinmat, vlr->v3->co, ho3);
+
+ if((ma->mode & MA_WIRE) || (vlr->flag & R_STRAND)) {
+ if(vlr->v4) {
+ c4= zbuf_shadow_project(cache, vlr->v4->index, obwinmat, vlr->v4->co, ho4);
+ zbufclipwire(&zspan, 0, a+1, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
+ }
+ else
+ zbufclipwire(&zspan, 0, a+1, vlr->ec, ho1, ho2, ho3, 0, c1, c2, c3, 0);
+ }
+ else {
+ if(vlr->v4) {
+ c4= zbuf_shadow_project(cache, vlr->v4->index, obwinmat, vlr->v4->co, ho4);
+ zbufclip4(&zspan, 0, 0, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
+ }
+ else
+ zbufclip(&zspan, 0, 0, ho1, ho2, ho3, c1, c2, c3);
+ }
+ }
- /* note, these conditions are copied in shadowbuf_autoclip() */
- if(vlr->mat!= ma) {
- ma= vlr->mat;
- ok= 1;
- if((ma->mode & MA_SHADBUF)==0) ok= 0;
+ if((a & 255)==255 && re->test_break())
+ break;
}
-
- if(ok && (vlr->flag & R_VISIBLE) && (vlr->lay & lay)) {
- if(ma->mode & MA_WIRE) zbufclipwire(&zspan, a+1, vlr);
- else if(vlr->flag & R_STRAND) zbufclipwire(&zspan, a+1, vlr);
- else {
- if(vlr->v4)
- zbufclip4(&zspan, 0, vlr->v1->ho, vlr->v2->ho, vlr->v3->ho, vlr->v4->ho, vlr->v1->clip, vlr->v2->clip, vlr->v3->clip, vlr->v4->clip);
- else
- zbufclip(&zspan, 0, vlr->v1->ho, vlr->v2->ho, vlr->v3->ho, vlr->v1->clip, vlr->v2->clip, vlr->v3->clip);
+
+ /* strands */
+ if(obr->strandbuf) {
+ /* for each bounding box containing a number of strands */
+ sbound= obr->strandbuf->bound;
+ for(c=0; c<obr->strandbuf->totbound; c++, sbound++) {
+ if(clip_render_object(sbound->boundbox, NULL, obwinmat))
+ continue;
+
+ /* for each strand in this bounding box */
+ for(a=sbound->start; a<sbound->end; a++) {
+ strand= RE_findOrAddStrand(obr, a);
+
+ sseg.obi= obi;
+ sseg.buffer= strand->buffer;
+ sseg.sqadaptcos= sseg.buffer->adaptcos;
+ sseg.sqadaptcos *= sseg.sqadaptcos;
+ sseg.strand= strand;
+ svert= strand->vert;
+
+ /* note, these conditions are copied in shadowbuf_autoclip() */
+ if(sseg.buffer->ma!= ma) {
+ ma= sseg.buffer->ma;
+ ok= 1;
+ if((ma->mode & MA_SHADBUF)==0) ok= 0;
+ }
+
+ if(ok && (sseg.buffer->lay & lay)) {
+ zbuf_project_cache_clear(cache, strand->totvert);
+
+ for(b=0; b<strand->totvert-1; b++, svert++) {
+ sseg.v[0]= (b > 0)? (svert-1): svert;
+ sseg.v[1]= svert;
+ sseg.v[2]= svert+1;
+ sseg.v[3]= (b < strand->totvert-2)? svert+2: svert+1;
+
+ c1= zbuf_shadow_project(cache, sseg.v[0]-strand->vert, obwinmat, sseg.v[0]->co, ho1);
+ c2= zbuf_shadow_project(cache, sseg.v[1]-strand->vert, obwinmat, sseg.v[1]->co, ho2);
+ c3= zbuf_shadow_project(cache, sseg.v[2]-strand->vert, obwinmat, sseg.v[2]->co, ho3);
+ c4= zbuf_shadow_project(cache, sseg.v[3]-strand->vert, obwinmat, sseg.v[3]->co, ho4);
+
+ if(!(c1 & c2 & c3 & c4))
+ render_strand_segment(re, winmat, NULL, &zspan, 1, &sseg);
+ }
+ }
+
+ if((a & 255)==255 && re->test_break())
+ break;
+ }
}
}
+
+ if(re->test_break())
+ break;
}
/* merge buffers */
@@ -2014,12 +2489,11 @@ void zbuffer_shadow(Render *re, LampRen *lar, int *rectz, int size, float jitx,
zbuf_free_span(&zspan);
}
-static void zbuffill_sss(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
+static void zbuffill_sss(ZSpan *zspan, int obi, int zvlnr, float *v1, float *v2, float *v3, float *v4)
{
double zxd, zyd, zy0, z;
float x0, y0, x1, y1, x2, y2, z0, z1, z2, xx1, *span1, *span2;
int x, y, sn1, sn2, rectx= zspan->rectx, my0, my2;
-
/* init */
zbuf_init_span(zspan);
@@ -2082,23 +2556,27 @@ static void zbuffill_sss(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v
z= (double)sn1*zxd + zy0;
for(x= sn1; x<=sn2; x++, z+=zxd)
- zspan->sss_func(zspan->sss_handle, zvlnr, x, y, z);
+ zspan->sss_func(zspan->sss_handle, obi, zvlnr, x, y, z);
zy0 -= zyd;
}
}
-void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(void *, int, int, int, int))
+void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(void*, int, int, int, int, int))
{
+ ZbufProjectCache cache[ZBUF_PROJECT_CACHE_SIZE];
ZSpan zspan;
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
VlakRen *vlr= NULL;
VertRen *v1, *v2, *v3, *v4;
Material *ma=0, *sss_ma= R.sss_mat;
+ float winmat[4][4], bounds[4], ho1[4], ho2[4], ho3[4], ho4[4]={0};
+ int i, v, zvlnr, c1, c2, c3, c4=0;
short nofill=0, env=0, wire=0;
- char *clipflag= pa->clipflag;
- int v, zvlnr;
- zbuf_alloc_span(&zspan, pa->rectx, pa->recty);
+ zbuffer_part_bounds(&R, pa, bounds);
+ zbuf_alloc_span(&zspan, pa->rectx, pa->recty, R.clipcrop);
zspan.sss_handle= handle;
zspan.sss_func= func;
@@ -2116,59 +2594,87 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo
/* fill front and back zbuffer */
if(pa->rectz) {
+ fillrect(pa->recto, pa->rectx, pa->recty, 0);
fillrect(pa->rectp, pa->rectx, pa->recty, 0);
fillrect(pa->rectz, pa->rectx, pa->recty, 0x7FFFFFFF);
}
if(pa->rectbackz) {
+ fillrect(pa->rectbacko, pa->rectx, pa->recty, 0);
fillrect(pa->rectbackp, pa->rectx, pa->recty, 0);
fillrect(pa->rectbackz, pa->rectx, pa->recty, -0x7FFFFFFF);
}
- for(v=0; v<R.totvlak; v++) {
- if((v & 255)==0) vlr= R.vlaknodes[v>>8].vlak;
- else vlr++;
-
- if((vlr->flag & R_VISIBLE) && material_in_material(vlr->mat, sss_ma)) {
- /* three cases, visible for render, only z values and nothing */
- if(vlr->lay & lay) {
- if(vlr->mat!=ma) {
- ma= vlr->mat;
- nofill= ma->mode & MA_ONLYCAST;
- env= (ma->mode & MA_ENV);
- wire= (ma->mode & MA_WIRE);
- }
- }
- else {
- nofill= 1;
- ma= NULL; /* otherwise nofill can hang */
- }
+ for(i=0, obi=R.instancetable.first; obi; i++, obi=obi->next) {
+ obr= obi->obr;
+
+ if(!(obr->lay & lay))
+ continue;
+
+ if(obi->flag & R_TRANSFORMED)
+ zbuf_make_winmat(&R, obi->mat, winmat);
+ else
+ zbuf_make_winmat(&R, NULL, winmat);
+
+ if(clip_render_object(obi->obr->boundbox, bounds, winmat))
+ continue;
+
+ zbuf_project_cache_clear(cache, obr->totvert);
+
+ for(v=0; v<obr->totvlak; v++) {
+ if((v & 255)==0) vlr= obr->vlaknodes[v>>8].vlak;
+ else vlr++;
- if(nofill==0 && wire==0 && env==0) {
- unsigned short partclip;
-
- v1= vlr->v1;
- v2= vlr->v2;
- v3= vlr->v3;
- v4= vlr->v4;
-
- /* partclipping doesn't need viewplane clipping */
- partclip= clipflag[v1->index] & clipflag[v2->index] & clipflag[v3->index];
- if(v4)
- partclip &= clipflag[v4->index];
+ if(material_in_material(vlr->mat, sss_ma)) {
+ /* three cases, visible for render, only z values and nothing */
+ if(obr->lay & lay) {
+ if(vlr->mat!=ma) {
+ ma= vlr->mat;
+ nofill= ma->mode & MA_ONLYCAST;
+ env= (ma->mode & MA_ENV);
+ wire= (ma->mode & MA_WIRE);
+ }
+ }
+ else {
+ nofill= 1;
+ ma= NULL; /* otherwise nofill can hang */
+ }
+ if(nofill==0 && wire==0 && env==0) {
+ unsigned short partclip;
+
+ v1= vlr->v1;
+ v2= vlr->v2;
+ v3= vlr->v3;
+ v4= vlr->v4;
- if(partclip==0) {
- zvlnr= v+1;
- zbufclip(&zspan, zvlnr, v1->ho, v2->ho, v3->ho, v1->clip, v2->clip, v3->clip);
+ c1= zbuf_part_project(cache, v1->index, winmat, bounds, v1->co, ho1);
+ c2= zbuf_part_project(cache, v2->index, winmat, bounds, v2->co, ho2);
+ c3= zbuf_part_project(cache, v3->index, winmat, bounds, v3->co, ho3);
+
+ /* partclipping doesn't need viewplane clipping */
+ partclip= c1 & c2 & c3;
if(v4) {
- zvlnr+= RE_QUAD_OFFS;
- zbufclip(&zspan, zvlnr, v1->ho, v3->ho, v4->ho, v1->clip, v3->clip, v4->clip);
+ c4= zbuf_part_project(cache, v4->index, winmat, bounds, v4->co, ho4);
+ partclip &= c4;
+ }
+
+ if(partclip==0) {
+ c1= testclip(ho1);
+ c2= testclip(ho2);
+ c3= testclip(ho3);
+
+ zvlnr= v+1;
+ zbufclip(&zspan, i, zvlnr, ho1, ho2, ho3, c1, c2, c3);
+ if(v4) {
+ c4= testclip(ho4);
+ zbufclip(&zspan, i, zvlnr+RE_QUAD_OFFS, ho1, ho3, ho4, c1, c3, c4);
+ }
}
}
}
}
}
-
+
zbuf_free_span(&zspan);
}
@@ -2374,6 +2880,37 @@ void antialias_tagbuf(int xsize, int ysize, char *rectmove)
}
}
+/* in: two vectors, first vector points from origin back in time, 2nd vector points to future */
+/* we make this into 3 points, center point is (0,0) */
+/* and offset the center point just enough to make curve go through midpoint */
+
+static void quad_bezier_2d(float *result, float *v1, float *v2, float *ipodata)
+{
+ float p1[2], p2[2], p3[2];
+
+ p3[0]= -v2[0];
+ p3[1]= -v2[1];
+
+ p1[0]= v1[0];
+ p1[1]= v1[1];
+
+ /* official formula 2*p2 - .5*p1 - .5*p3 */
+ p2[0]= -0.5*p1[0] - 0.5*p3[0];
+ p2[1]= -0.5*p1[1] - 0.5*p3[1];
+
+ result[0]= ipodata[0]*p1[0] + ipodata[1]*p2[0] + ipodata[2]*p3[0];
+ result[1]= ipodata[0]*p1[1] + ipodata[1]*p2[1] + ipodata[2]*p3[1];
+}
+
+static void set_quad_bezier_ipo(float fac, float *data)
+{
+ float mfac= (1.0f-fac);
+
+ data[0]= mfac*mfac;
+ data[1]= 2.0f*mfac*fac;
+ data[2]= fac*fac;
+}
+
void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect)
{
ZSpan zspan;
@@ -2387,7 +2924,7 @@ void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float *
static int firsttime= 1;
char *rectmove, *dm;
- zbuf_alloc_span(&zspan, xsize, ysize);
+ zbuf_alloc_span(&zspan, xsize, ysize, 1.0f);
zspan.zmulx= ((float)xsize)/2.0;
zspan.zmuly= ((float)ysize)/2.0;
zspan.zofsx= 0.0f;
@@ -2572,7 +3109,7 @@ void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float *
samples/= 2;
for(step= 1; step<=samples; step++) {
float speedfac= 0.5f*nbd->fac*(float)step/(float)(samples+1);
- float blendfac= 1.0f/(ABS(step)+1);
+ float blendfac= 1.0f/(ABS(step)+1), ipodata[4];
int side, z= 4;
for(side=0; side<2; side++) {
@@ -2597,23 +3134,41 @@ void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float *
dz2= rectvz + 5*(xsize + 1);
if(side) {
- dz1+= 2;
- dz2+= 2;
- z= 2;
+ if(nbd->curved==0) {
+ dz1+= 2;
+ dz2+= 2;
+ z= 2;
+ }
speedfac= -speedfac;
}
-
+
+ set_quad_bezier_ipo(0.5f + 0.5f*speedfac, ipodata);
+
for(fy= -0.5f+jit[step & 15][0], y=0; y<ysize; y++, fy+=1.0f) {
for(fx= -0.5f+jit[step & 15][1], x=0; x<xsize; x++, fx+=1.0f, dimg+=4, dz1+=5, dz2+=5, dm++) {
if(*dm>1) {
DrawBufPixel col;
/* make vertices */
- v1[0]= speedfac*dz1[0]+fx; v1[1]= speedfac*dz1[1]+fy; v1[2]= dz1[z];
- v2[0]= speedfac*dz1[5]+fx+1.0f; v2[1]= speedfac*dz1[6]+fy; v2[2]= dz1[z+5];
- v3[0]= speedfac*dz2[5]+fx+1.0f; v3[1]= speedfac*dz2[6]+fy+1.0f; v3[2]= dz2[z+5];
- v4[0]= speedfac*dz2[0]+fx; v4[1]= speedfac*dz2[1]+fy+1.0f; v4[2]= dz2[z];
-
+ if(nbd->curved) { /* curved */
+ quad_bezier_2d(v1, dz1, dz1+2, ipodata);
+ v1[0]+= fx; v1[1]+= fy; v1[2]= dz1[4];
+
+ quad_bezier_2d(v2, dz1+5, dz1+5+2, ipodata);
+ v2[0]+= fx+1.0f; v2[1]+= fy; v2[2]= dz1[4+5];
+
+ quad_bezier_2d(v3, dz2+5, dz2+5+2, ipodata);
+ v3[0]+= fx+1.0f; v3[1]+= fy+1.0f; v3[2]= dz1[4+5];
+
+ quad_bezier_2d(v4, dz2, dz2+2, ipodata);
+ v4[0]+= fx; v4[1]+= fy+1.0f; v4[2]= dz2[4];
+ }
+ else {
+ v1[0]= speedfac*dz1[0]+fx; v1[1]= speedfac*dz1[1]+fy; v1[2]= dz1[z];
+ v2[0]= speedfac*dz1[5]+fx+1.0f; v2[1]= speedfac*dz1[6]+fy; v2[2]= dz1[z+5];
+ v3[0]= speedfac*dz2[5]+fx+1.0f; v3[1]= speedfac*dz2[6]+fy+1.0f; v3[2]= dz2[z+5];
+ v4[0]= speedfac*dz2[0]+fx; v4[1]= speedfac*dz2[1]+fy+1.0f; v4[2]= dz2[z];
+ }
if(*dm==255) col.alpha= 1.0f;
else if(*dm<2) col.alpha= 0.0f;
else col.alpha= ((float)*dm)/255.0f;
@@ -2699,56 +3254,81 @@ static void copyto_abufz(RenderPart *pa, int *arectz, int sample)
static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, unsigned int lay)
{
- ZSpan zspan;
+ ZbufProjectCache cache[ZBUF_PROJECT_CACHE_SIZE];
+ ZSpan zspans[16], *zspan; /* MAX_OSA */
Material *ma=NULL;
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
VlakRen *vlr=NULL;
VertRen *v1, *v2, *v3, *v4;
float vec[3], hoco[4], mul, zval, fval;
- int v, zvlnr= 0, zsample, dofill= 0;
- char *clipflag= pa->clipflag;
-
- zbuf_alloc_span(&zspan, pa->rectx, pa->recty);
-
- /* needed for transform from hoco to zbuffer co */
- zspan.zmulx= ((float)R.winx)/2.0;
- zspan.zmuly= ((float)R.winy)/2.0;
-
- /* the buffers */
- zspan.arectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "Arectz");
- zspan.apixbuf= APixbuf;
- zspan.apsmbase= apsmbase;
-
- /* filling methods */
- zspan.zbuffunc= zbuffillAc4;
- zspan.zbuflinefunc= zbuflineAc;
-
- for(zsample=0; zsample<R.osa || R.osa==0; zsample++) {
+ float winmat[4][4], bounds[4], ho1[4], ho2[4], ho3[4], ho4[4]={0};
+ int i, v, zvlnr, c1, c2, c3, c4=0, dofill= 0;
+ int zsample, samples, polygon_offset;
+
+ zbuffer_part_bounds(&R, pa, bounds);
+ samples= (R.osa? R.osa: 1);
+
+ for(zsample=0; zsample<samples; zsample++) {
+ zspan= &zspans[zsample];
+
+ zbuf_alloc_span(zspan, pa->rectx, pa->recty, R.clipcrop);
+
+ /* needed for transform from hoco to zbuffer co */
+ zspan->zmulx= ((float)R.winx)/2.0;
+ zspan->zmuly= ((float)R.winy)/2.0;
- copyto_abufz(pa, zspan.arectz, zsample); /* init zbuffer */
- zspan.mask= 1<<zsample;
+ /* the buffers */
+ zspan->arectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "Arectz");
+ zspan->apixbuf= APixbuf;
+ zspan->apsmbase= apsmbase;
+ /* filling methods */
+ zspan->zbuffunc= zbuffillAc4;
+ zspan->zbuflinefunc= zbuflineAc;
+
+ copyto_abufz(pa, zspan->arectz, zsample); /* init zbuffer */
+ zspan->mask= 1<<zsample;
+
if(R.osa) {
- zspan.zofsx= -pa->disprect.xmin - R.jit[zsample][0];
- zspan.zofsy= -pa->disprect.ymin - R.jit[zsample][1];
+ zspan->zofsx= -pa->disprect.xmin - R.jit[zsample][0];
+ zspan->zofsy= -pa->disprect.ymin - R.jit[zsample][1];
}
else if(R.i.curblur) {
- zspan.zofsx= -pa->disprect.xmin - R.jit[R.i.curblur-1][0];
- zspan.zofsy= -pa->disprect.ymin - R.jit[R.i.curblur-1][1];
+ zspan->zofsx= -pa->disprect.xmin - R.jit[R.i.curblur-1][0];
+ zspan->zofsy= -pa->disprect.ymin - R.jit[R.i.curblur-1][1];
}
else {
- zspan.zofsx= -pa->disprect.xmin;
- zspan.zofsy= -pa->disprect.ymin;
+ zspan->zofsx= -pa->disprect.xmin;
+ zspan->zofsy= -pa->disprect.ymin;
}
/* to center the sample position */
- zspan.zofsx -= 0.5f;
- zspan.zofsy -= 0.5f;
-
- /* we use this to test if nothing was filled in */
- zvlnr= 0;
+ zspan->zofsx -= 0.5f;
+ zspan->zofsy -= 0.5f;
+ }
+
+ /* we use this to test if nothing was filled in */
+ zvlnr= 0;
- for(v=0; v<R.totvlak; v++) {
+ for(i=0, obi=R.instancetable.first; obi; i++, obi=obi->next) {
+ obr= obi->obr;
+
+ if(!(obr->lay & lay))
+ continue;
+
+ if(obi->flag & R_TRANSFORMED)
+ zbuf_make_winmat(&R, obi->mat, winmat);
+ else
+ zbuf_make_winmat(&R, NULL, winmat);
+
+ if(clip_render_object(obi->obr->boundbox, bounds, winmat))
+ continue;
+
+ zbuf_project_cache_clear(cache, obr->totvert);
+
+ for(v=0; v<obr->totvlak; v++) {
if((v & 255)==0)
- vlr= R.vlaknodes[v>>8].vlak;
+ vlr= obr->vlaknodes[v>>8].vlak;
else vlr++;
if(vlr->mat!=ma) {
@@ -2757,24 +3337,30 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, un
}
if(dofill) {
- if((vlr->flag & R_VISIBLE) && (vlr->lay & lay)) {
+ if(!(vlr->flag & R_HIDDEN) && (obr->lay & lay)) {
unsigned short partclip;
v1= vlr->v1;
v2= vlr->v2;
v3= vlr->v3;
v4= vlr->v4;
-
+
+ c1= zbuf_part_project(cache, v1->index, winmat, bounds, v1->co, ho1);
+ c2= zbuf_part_project(cache, v2->index, winmat, bounds, v2->co, ho2);
+ c3= zbuf_part_project(cache, v3->index, winmat, bounds, v3->co, ho3);
+
/* partclipping doesn't need viewplane clipping */
- partclip= clipflag[v1->index] & clipflag[v2->index] & clipflag[v3->index];
- if(v4)
- partclip &= clipflag[v4->index];
-
+ partclip= c1 & c2 & c3;
+ if(v4) {
+ c4= zbuf_part_project(cache, v4->index, winmat, bounds, v4->co, ho4);
+ partclip &= c4;
+ }
+
if(partclip==0) {
/* a little advantage for transp rendering (a z offset) */
if( ma->zoffs != 0.0) {
mul= 0x7FFFFFFF;
- zval= mul*(1.0+v1->ho[2]/v1->ho[3]);
+ zval= mul*(1.0+ho1[2]/ho1[3]);
VECCOPY(vec, v1->co);
/* z is negative, otherwise its being clipped */
@@ -2782,40 +3368,55 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, un
projectverto(vec, R.winmat, hoco);
fval= mul*(1.0+hoco[2]/hoco[3]);
- zspan.polygon_offset= (int) fabs(zval - fval );
+ polygon_offset= (int) fabs(zval - fval );
}
- else zspan.polygon_offset= 0;
+ else polygon_offset= 0;
zvlnr= v+1;
-
- if(ma->mode & (MA_WIRE)) zbufclipwire(&zspan, zvlnr, vlr);
- else {
- if(v4 && (vlr->flag & R_STRAND)) {
- zbufclip4(&zspan, zvlnr, v1->ho, v2->ho, v3->ho, v4->ho, v1->clip, v2->clip, v3->clip, v4->clip);
+
+ c1= testclip(ho1);
+ c2= testclip(ho2);
+ c3= testclip(ho3);
+ if(v4)
+ c4= testclip(ho4);
+
+ for(zsample=0; zsample<samples; zsample++) {
+ zspan= &zspans[zsample];
+ zspan->polygon_offset= polygon_offset;
+
+ if(ma->mode & (MA_WIRE)) {
+ if(v4)
+ zbufclipwire(zspan, i, zvlnr, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
+ else
+ zbufclipwire(zspan, i, zvlnr, vlr->ec, ho1, ho2, ho3, 0, c1, c2, c3, 0);
}
else {
- zbufclip(&zspan, zvlnr, v1->ho, v2->ho, v3->ho, v1->clip, v2->clip, v3->clip);
- if(v4) {
- zvlnr+= RE_QUAD_OFFS;
- zbufclip(&zspan, zvlnr, v1->ho, v3->ho, v4->ho, v1->clip, v3->clip, v4->clip);
+ if(v4 && (vlr->flag & R_STRAND)) {
+ zbufclip4(zspan, i, zvlnr, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
+ }
+ else {
+ zbufclip(zspan, i, zvlnr, ho1, ho2, ho3, c1, c2, c3);
+ if(v4)
+ zbufclip(zspan, i, zvlnr+RE_QUAD_OFFS, ho1, ho3, ho4, c1, c3, c4);
}
}
}
}
+ if((v & 255)==255)
+ if(R.test_break())
+ break;
}
- if( (v & 255)==255)
- if(R.test_break())
- break;
}
}
-
- if(R.osa==0) break;
+
if(R.test_break()) break;
- if(zvlnr==0) break;
}
- MEM_freeN(zspan.arectz);
- zbuf_free_span(&zspan);
+ for(zsample=0; zsample<samples; zsample++) {
+ zspan= &zspans[zsample];
+ MEM_freeN(zspan->arectz);
+ zbuf_free_span(zspan);
+ }
return zvlnr;
}
@@ -2824,7 +3425,7 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, un
/* speed pointer NULL = sky, we clear */
/* else if either alpha is full or no solid was filled in: copy speed */
/* else fill in minimum speed */
-static void add_transp_speed(RenderLayer *rl, int offset, float *speed, float alpha, long *rdrect)
+void add_transp_speed(RenderLayer *rl, int offset, float *speed, float alpha, long *rdrect)
{
RenderPass *rpass;
@@ -2852,23 +3453,23 @@ static void add_transp_speed(RenderLayer *rl, int offset, float *speed, float al
fp[2]= speed[2];
fp[3]= speed[3];
}
-
}
break;
}
}
}
-static void add_transp_obindex(RenderLayer *rl, int offset, int facenr)
+static void add_transp_obindex(RenderLayer *rl, int offset, int obi)
{
- VlakRen *vlr= RE_findOrAddVlak(&R, (facenr-1) & RE_QUAD_MASK);
- if(vlr && vlr->ob) {
+ ObjectRen *obr= R.objectinstance[obi].obr;
+
+ if(obr->ob) {
RenderPass *rpass;
for(rpass= rl->passes.first; rpass; rpass= rpass->next) {
if(rpass->passtype == SCE_PASS_INDEXOB) {
float *fp= rpass->rect + offset;
- *fp= (float)vlr->ob->index;
+ *fp= (float)obr->ob->index;
break;
}
}
@@ -2877,7 +3478,7 @@ static void add_transp_obindex(RenderLayer *rl, int offset, int facenr)
/* ONLY OSA! merge all shaderesult samples to one */
/* target should have been cleared */
-static void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
+void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
{
RenderPass *rpass;
float weight= 1.0f/((float)R.osa);
@@ -2916,6 +3517,10 @@ static void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
case SCE_PASS_NORMAL:
col= shr->nor;
break;
+ case SCE_PASS_MIST:
+ col= &shr->mist;
+ pixsize= 1;
+ break;
case SCE_PASS_VECTOR:
{
@@ -2961,14 +3566,20 @@ static void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
}
-static void add_transp_passes(RenderLayer *rl, int offset, ShadeResult *shr, float alpha)
+void add_transp_passes(RenderLayer *rl, int offset, ShadeResult *shr, float alpha)
{
RenderPass *rpass;
for(rpass= rl->passes.first; rpass; rpass= rpass->next) {
float *fp, *col= NULL;
+ int pixsize= 3;
switch(rpass->passtype) {
+ case SCE_PASS_Z:
+ fp= rpass->rect + offset;
+ if(shr->z < *fp)
+ *fp= shr->z;
+ break;
case SCE_PASS_RGBA:
fp= rpass->rect + 4*offset;
addAlphaOverFloat(fp, shr->col);
@@ -2997,37 +3608,99 @@ static void add_transp_passes(RenderLayer *rl, int offset, ShadeResult *shr, flo
case SCE_PASS_NORMAL:
col= shr->nor;
break;
+ case SCE_PASS_MIST:
+ col= &shr->mist;
+ pixsize= 1;
+ break;
}
if(col) {
- fp= rpass->rect + 3*offset;
- fp[0]= alpha*col[0] + (1.0f-alpha)*fp[0];
- fp[1]= alpha*col[1] + (1.0f-alpha)*fp[1];
- fp[2]= alpha*col[2] + (1.0f-alpha)*fp[2];
+ fp= rpass->rect + pixsize*offset;
+ fp[0]= col[0] + (1.0f-alpha)*fp[0];
+ if(pixsize==3) {
+ fp[1]= col[1] + (1.0f-alpha)*fp[1];
+ fp[2]= col[2] + (1.0f-alpha)*fp[2];
+ }
}
}
}
-
+typedef struct ZTranspRow {
+ int obi;
+ int z;
+ int p;
+ int mask;
+ int segment;
+ float u, v;
+} ZTranspRow;
static int vergzvlak(const void *a1, const void *a2)
{
- const int *x1=a1, *x2=a2;
+ const ZTranspRow *r1 = a1, *r2 = a2;
- if( x1[0] < x2[0] ) return 1;
- else if( x1[0] > x2[0]) return -1;
+ if(r1->z < r2->z) return 1;
+ else if(r1->z > r2->z) return -1;
return 0;
}
+static void shade_strand_samples(StrandShadeCache *cache, ShadeSample *ssamp, int x, int y, ZTranspRow *row, int addpassflag)
+{
+ StrandSegment sseg;
+ StrandVert *svert;
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
+
+ obi= R.objectinstance + row->obi;
+ obr= obi->obr;
+
+ sseg.obi= obi;
+ sseg.strand= RE_findOrAddStrand(obr, row->p-1);
+ sseg.buffer= sseg.strand->buffer;
+
+ svert= sseg.strand->vert + row->segment;
+ sseg.v[0]= (row->segment > 0)? (svert-1): svert;
+ sseg.v[1]= svert;
+ sseg.v[2]= svert+1;
+ sseg.v[3]= (row->segment < sseg.strand->totvert-2)? svert+2: svert+1;
+
+ ssamp->tot= 1;
+ strand_shade_segment(&R, cache, &sseg, ssamp, row->v, row->u, addpassflag);
+ ssamp->shi[0].mask= row->mask;
+}
-static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int facenr, int curmask)
+static void unref_strand_samples(StrandShadeCache *cache, ZTranspRow *row, int totface)
+{
+ StrandVert *svert;
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
+ StrandRen *strand;
+
+ /* remove references to samples that are not being rendered, but we still
+ * need to remove them so that the reference count of strand vertex shade
+ * samples correctly drops to zero */
+ while(totface > 0) {
+ totface--;
+
+ if(row[totface].segment != -1) {
+ obi= R.objectinstance + row[totface].obi;
+ obr= obi->obr;
+ strand= RE_findOrAddStrand(obr, row[totface].p-1);
+ svert= strand->vert + row[totface].segment;
+
+ strand_shade_unref(cache, svert);
+ strand_shade_unref(cache, svert+1);
+ }
+ }
+}
+
+static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int obi, int facenr, int curmask)
{
ShadeInput *shi= ssamp->shi;
float xs, ys;
ssamp->tot= 0;
- shade_input_set_triangle(shi, facenr, 1);
+ shade_input_set_triangle(shi, obi, facenr, 1);
/* officially should always be true... we have no sky info */
if(shi->vlr) {
@@ -3077,9 +3750,14 @@ static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int
}
}
-static int shade_tra_samples(ShadeSample *ssamp, int x, int y, int z, int facenr, int mask)
+static int shade_tra_samples(ShadeSample *ssamp, StrandShadeCache *cache, int x, int y, ZTranspRow *row, int addpassflag)
{
- shade_tra_samples_fill(ssamp, x, y, z, facenr, mask);
+ if(row->segment != -1) {
+ shade_strand_samples(cache, ssamp, x, y, row, addpassflag);
+ return 1;
+ }
+
+ shade_tra_samples_fill(ssamp, x, y, row->z, row->obi, row->p, row->mask);
if(ssamp->tot) {
ShadeInput *shi= ssamp->shi;
@@ -3115,9 +3793,9 @@ static void addvecmul(float *v1, float *v2, float fac)
static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassflag)
{
- int a, sample, retval = R.osa;
+ int a, sample, osa = (R.osa? R.osa: 1), retval = osa;
- for(a=0; a < R.osa; a++, samp_shr++) {
+ for(a=0; a < osa; a++, samp_shr++) {
ShadeInput *shi= ssamp->shi;
ShadeResult *shr= ssamp->shr;
@@ -3128,6 +3806,8 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf
addAlphaUnderFloat(samp_shr->combined, shr->combined);
+ samp_shr->z= MIN2(samp_shr->z, shr->z);
+
if(addpassflag & SCE_PASS_VECTOR) {
QUATCOPY(samp_shr->winspeed, shr->winspeed);
}
@@ -3159,7 +3839,11 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf
addvecmul(samp_shr->refr, shr->refr, fac);
if(addpassflag & SCE_PASS_RADIO)
- addvecmul(samp_shr->refr, shr->rad, fac);
+ addvecmul(samp_shr->rad, shr->rad, fac);
+
+ if(addpassflag & SCE_PASS_MIST)
+ samp_shr->mist= samp_shr->mist+fac*shr->mist;
+
}
}
}
@@ -3169,7 +3853,7 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf
return retval;
}
-static void reset_sky_speedvectors(RenderPart *pa, RenderLayer *rl)
+static void reset_sky_speedvectors(RenderPart *pa, RenderLayer *rl, float *rectf)
{
/* speed vector exception... if solid render was done, sky pixels are set to zero already */
/* for all pixels with alpha zero, we re-initialize speed again then */
@@ -3178,7 +3862,7 @@ static void reset_sky_speedvectors(RenderPart *pa, RenderLayer *rl)
fp= RE_RenderLayerGetPass(rl, SCE_PASS_VECTOR);
if(fp==NULL) return;
- col= rl->acolrect+3;
+ col= rectf+3;
for(a= 4*pa->rectx*pa->recty -4; a>=0; a-=4) {
if(col[a]==0.0f) {
@@ -3191,22 +3875,27 @@ static void reset_sky_speedvectors(RenderPart *pa, RenderLayer *rl)
}
#define MAX_ZROW 2000
-/* main render call to fill in pass the full transparent layer */
+
+/* main render call to do the z-transparent layer */
/* returns a mask, only if a) transp rendered and b) solid was rendered */
-unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pass)
+unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pass, ListBase *psmlist)
{
RenderResult *rr= pa->result;
ShadeSample ssamp;
APixstr *APixbuf; /* Zbuffer: linked list of face samples */
+ APixstrand *APixbufstrand = NULL;
APixstr *ap, *aprect, *apn;
+ APixstrand *apstrand, *aprectstrand, *apnstrand;
ListBase apsmbase={NULL, NULL};
ShadeResult samp_shr[16]; /* MAX_OSA */
- float sampalpha, *passrect= pass;
+ ZTranspRow zrow[MAX_ZROW];
+ StrandShadeCache *sscache= NULL;
+ float sampalpha, alpha, *passrect= pass;
long *rdrect;
- int x, y, crop=0, a, zrow[MAX_ZROW][3], totface;
- int addpassflag, offs= 0, od, addzbuf;
- unsigned short *ztramask= NULL;
-
+ int x, y, crop=0, a, b, totface, totsample, doztra;
+ int addpassflag, offs= 0, od, addzbuf, osa = (R.osa? R.osa: 1);
+ unsigned short *ztramask= NULL, filled;
+
/* looks nicer for calling code */
if(R.test_break())
return NULL;
@@ -3218,6 +3907,10 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
}
APixbuf= MEM_callocN(pa->rectx*pa->recty*sizeof(APixstr), "APixbuf");
+ if(R.totstrand && (rl->layflag & SCE_LAY_STRAND)) {
+ APixbufstrand= MEM_callocN(pa->rectx*pa->recty*sizeof(APixstrand), "APixbufstrand");
+ sscache= strand_shade_cache_create();
+ }
/* general shader info, passes */
shade_sample_initialize(&ssamp, pa, rl);
@@ -3230,14 +3923,25 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
sampalpha= 1.0f;
/* fill the Apixbuf */
- if(0 == zbuffer_abuf(pa, APixbuf, &apsmbase, rl->lay)) {
+ doztra= 0;
+ if(rl->layflag & SCE_LAY_ZTRA)
+ doztra+= zbuffer_abuf(pa, APixbuf, &apsmbase, rl->lay);
+ if((rl->layflag & SCE_LAY_STRAND) && APixbufstrand)
+ doztra+= zbuffer_strands_abuf(&R, pa, rl, APixbufstrand, &apsmbase, sscache);
+
+ if(doztra == 0) {
/* nothing filled in */
MEM_freeN(APixbuf);
+ if(APixbufstrand)
+ MEM_freeN(APixbufstrand);
+ if(sscache)
+ strand_shade_cache_free(sscache);
freepsA(&apsmbase);
return NULL;
}
aprect= APixbuf;
+ aprectstrand= APixbufstrand;
rdrect= pa->rectdaps;
/* irregular shadowb buffer creation */
@@ -3245,13 +3949,13 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
ISB_create(pa, APixbuf);
/* masks, to have correct alpha combine */
- if(R.osa && (rl->layflag & SCE_LAY_SOLID))
+ if(R.osa && (rl->layflag & SCE_LAY_SOLID) && pa->fullresult.first==NULL)
ztramask= MEM_callocN(pa->rectx*pa->recty*sizeof(short), "ztramask");
/* zero alpha pixels get speed vector max again */
if(addpassflag & SCE_PASS_VECTOR)
if(rl->layflag & SCE_LAY_SOLID)
- reset_sky_speedvectors(pa, rl);
+ reset_sky_speedvectors(pa, rl, rl->acolrect?rl->acolrect:rl->rectf); /* if acolrect is set we use it */
/* filtered render, for now we assume only 1 filter size */
if(pa->crop) {
@@ -3259,6 +3963,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
offs= pa->rectx + 1;
passrect+= 4*offs;
aprect+= offs;
+ aprectstrand+= offs;
}
/* init scanline updates */
@@ -3270,14 +3975,15 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
for(y=pa->disprect.ymin+crop; y<pa->disprect.ymax-crop; y++, rr->renrect.ymax++) {
pass= passrect;
ap= aprect;
+ apstrand= aprectstrand;
od= offs;
if(R.test_break())
break;
- for(x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, ap++, pass+=4, od++) {
+ for(x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, ap++, apstrand++, pass+=4, od++) {
- if(ap->p[0]==0) {
+ if(ap->p[0]==0 && (!APixbufstrand || apstrand->p[0]==0)) {
if(addpassflag & SCE_PASS_VECTOR)
add_transp_speed(rl, od, NULL, 0.0f, rdrect);
}
@@ -3288,9 +3994,11 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
while(apn) {
for(a=0; a<4; a++) {
if(apn->p[a]) {
- zrow[totface][0]= apn->z[a];
- zrow[totface][1]= apn->p[a];
- zrow[totface][2]= apn->mask[a];
+ zrow[totface].obi= apn->obi[a];
+ zrow[totface].z= apn->z[a];
+ zrow[totface].p= apn->p[a];
+ zrow[totface].mask= apn->mask[a];
+ zrow[totface].segment= -1;
totface++;
if(totface>=MAX_ZROW) totface= MAX_ZROW-1;
}
@@ -3298,83 +4006,145 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
}
apn= apn->next;
}
-
+
+ apnstrand= (APixbufstrand)? apstrand: NULL;
+ while(apnstrand) {
+ for(a=0; a<4; a++) {
+ if(apnstrand->p[a]) {
+ zrow[totface].obi= apnstrand->obi[a];
+ zrow[totface].z= apnstrand->z[a];
+ zrow[totface].p= apnstrand->p[a];
+ zrow[totface].mask= apnstrand->mask[a];
+ zrow[totface].segment= apnstrand->seg[a];
+
+ if(R.osa) {
+ totsample= 0;
+ for(b=0; b<R.osa; b++)
+ if(zrow[totface].mask & (1<<b))
+ totsample++;
+ }
+ else
+ totsample= 1;
+
+ zrow[totface].u= apnstrand->u[a]/totsample;
+ zrow[totface].v= apnstrand->v[a]/totsample;
+ totface++;
+ if(totface>=MAX_ZROW) totface= MAX_ZROW-1;
+ }
+ }
+ apnstrand= apnstrand->next;
+ }
+
if(totface==2) {
- if(zrow[0][0] < zrow[1][0]) {
- a= zrow[0][0]; zrow[0][0]= zrow[1][0]; zrow[1][0]= a;
- a= zrow[0][1]; zrow[0][1]= zrow[1][1]; zrow[1][1]= a;
- a= zrow[0][2]; zrow[0][2]= zrow[1][2]; zrow[1][2]= a;
+ if(zrow[0].z < zrow[1].z) {
+ SWAP(ZTranspRow, zrow[0], zrow[1]);
}
}
else if(totface>2) {
- qsort(zrow, totface, sizeof(int)*3, vergzvlak);
+ qsort(zrow, totface, sizeof(ZTranspRow), vergzvlak);
}
/* zbuffer and index pass for transparent, no AA or filters */
if(addzbuf)
- if(pa->rectz[od]>zrow[totface-1][0])
- pa->rectz[od]= zrow[totface-1][0];
+ if(pa->rectz[od]>zrow[totface-1].z)
+ pa->rectz[od]= zrow[totface-1].z;
if(addpassflag & SCE_PASS_INDEXOB)
- add_transp_obindex(rl, od, zrow[totface-1][1]);
-
+ add_transp_obindex(rl, od, zrow[totface-1].obi);
+ /* for each mask-sample we alpha-under colors. then in end it's added using filter */
+ memset(samp_shr, 0, sizeof(ShadeResult)*osa);
+ for(a=0; a<osa; a++)
+ samp_shr[a].z= 10e10f;
+
+ /* nice this memset, but speed vectors are not initialized OK then. it is sufficient to only clear 1 (see merge_transp_passes) */
+ if(addpassflag & SCE_PASS_VECTOR)
+ samp_shr->winspeed[0]= samp_shr->winspeed[1]= samp_shr->winspeed[2]= samp_shr->winspeed[3]= PASS_VECTOR_MAX;
+
if(R.osa==0) {
while(totface>0) {
totface--;
- if(shade_tra_samples(&ssamp, x, y, zrow[totface][0], zrow[totface][1], zrow[totface][2])) {
- if(addpassflag)
- add_transp_passes(rl, od, ssamp.shr, (1.0f-pass[3])*ssamp.shr[0].combined[3]);
-
+ if(shade_tra_samples(&ssamp, sscache, x, y, &zrow[totface], addpassflag)) {
+ filled= addtosamp_shr(samp_shr, &ssamp, addpassflag);
addAlphaUnderFloat(pass, ssamp.shr[0].combined);
- if(pass[3]>=0.999) break;
+
+ if(filled == 0) {
+ if(sscache)
+ unref_strand_samples(sscache, zrow, totface);
+ break;
+ }
}
}
- if(addpassflag & SCE_PASS_VECTOR)
- add_transp_speed(rl, od, ssamp.shr[0].winspeed, pass[3], rdrect);
+
+ alpha= samp_shr->combined[3];
+ if(alpha!=0.0f) {
+ add_transp_passes(rl, od, samp_shr, alpha);
+ if(addpassflag & SCE_PASS_VECTOR)
+ add_transp_speed(rl, od, samp_shr->winspeed, alpha, rdrect);
+ }
}
else {
- short filled, *sp= (short *)(ztramask+od);
-
- /* for each mask-sample we alpha-under colors. then in end it's added using filter */
- memset(samp_shr, 0, sizeof(ShadeResult)*R.osa);
-
- /* nice this memset, but speed vectors are not initialized OK then. it is sufficient to only clear 1 (see merge_transp_passes) */
- if(addpassflag & SCE_PASS_VECTOR)
- samp_shr->winspeed[0]= samp_shr->winspeed[1]= samp_shr->winspeed[2]= samp_shr->winspeed[3]= PASS_VECTOR_MAX;
+ short *sp= (short *)(ztramask+od);
while(totface>0) {
totface--;
- if(shade_tra_samples(&ssamp, x, y, zrow[totface][0], zrow[totface][1], zrow[totface][2])) {
+ if(shade_tra_samples(&ssamp, sscache, x, y, &zrow[totface], addpassflag)) {
filled= addtosamp_shr(samp_shr, &ssamp, addpassflag);
if(ztramask)
- *sp |= zrow[totface][2];
- if(filled==0)
+ *sp |= zrow[totface].mask;
+ if(filled==0) {
+ if(sscache)
+ unref_strand_samples(sscache, zrow, totface);
break;
+ }
}
}
- for(a=0; a<R.osa; a++) {
- add_filt_fmask(1<<a, samp_shr[a].combined, pass, rr->rectx);
+ /* multisample buffers or filtered mask filling? */
+ if(pa->fullresult.first) {
+ for(a=0; a<R.osa; a++) {
+ alpha= samp_shr[a].combined[3];
+ if(alpha!=0.0f) {
+ RenderLayer *rl= ssamp.rlpp[a];
+
+ addAlphaOverFloat(rl->rectf + 4*od, samp_shr[a].combined);
+
+ add_transp_passes(rl, od, &samp_shr[a], alpha);
+ if(addpassflag & SCE_PASS_VECTOR)
+ add_transp_speed(rl, od, samp_shr[a].winspeed, alpha, rdrect);
+ }
+ }
}
-
- if(addpassflag) {
- /* merge all in one, and then add */
- merge_transp_passes(rl, samp_shr);
- add_transp_passes(rl, od, samp_shr, pass[3]);
+ else {
+ alpha= 0.0f;
- if(addpassflag & SCE_PASS_VECTOR)
- add_transp_speed(rl, od, samp_shr[0].winspeed, pass[3], rdrect);
+ /* note; cannot use pass[3] for alpha due to filtermask */
+ for(a=0; a<R.osa; a++) {
+ add_filt_fmask(1<<a, samp_shr[a].combined, pass, rr->rectx);
+ alpha+= samp_shr[a].combined[3];
+ }
+
+ if(addpassflag) {
+ alpha*= sampalpha;
+
+ /* merge all in one, and then add */
+ merge_transp_passes(rl, samp_shr);
+ add_transp_passes(rl, od, samp_shr, alpha);
+
+ if(addpassflag & SCE_PASS_VECTOR)
+ add_transp_speed(rl, od, samp_shr[0].winspeed, alpha, rdrect);
+ }
}
}
}
}
aprect+= pa->rectx;
+ aprectstrand+= pa->rectx;
passrect+= 4*pa->rectx;
offs+= pa->rectx;
}
@@ -3383,6 +4153,10 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
rr->renlay= NULL;
MEM_freeN(APixbuf);
+ if(APixbufstrand)
+ MEM_freeN(APixbufstrand);
+ if(sscache)
+ strand_shade_cache_free(sscache);
freepsA(&apsmbase);
if(R.r.mode & R_SHADOW)
diff --git a/source/blender/src/SConscript b/source/blender/src/SConscript
index ba3e03ea1eb..f466798c40c 100644
--- a/source/blender/src/SConscript
+++ b/source/blender/src/SConscript
@@ -5,6 +5,20 @@ Import ('env')
sources = env.Glob('*.c')
+if env['BF_SPLIT_SRC'] == 1:
+ numobj = len(sources)
+ maxobj = 30
+
+ numlibs = numobj / maxobj
+ if (numobj % maxobj):
+ numlibs = numlibs + 1
+ subsources = []
+
+ if (env['OURPLATFORM'] == 'win32-mingw'):
+ for i in range(numlibs - 1):
+ subsources.append(sources[i*maxobj:(i+1)*maxobj])
+ subsources.append(sources[(numlibs-1)*maxobj:])
+
incs = ' #/intern/guardedalloc #/intern/memutil'
incs += ' ../blenlib ../makesdna ../blenkernel'
incs += ' ../include #/intern/bmfont ../imbuf ../render/extern/include'
@@ -60,5 +74,9 @@ if env['WITH_BF_VERSE']:
# TODO buildinfo
if env['BF_BUILDINFO'] == 1:
defs.append('NAN_BUILDINFO')
-
-env.BlenderLib ( libname = 'src', sources = sources, includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] )
+
+if (env['BF_SPLIT_SRC'] == 1) and (env['OURPLATFORM'] == 'win32-mingw'):
+ for i in range(numlibs):
+ env.BlenderLib ( libname = 'src%d' % (i), sources = subsources[i], includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] )
+else:
+ env.BlenderLib ( libname = 'src', sources = sources, includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] )
diff --git a/source/blender/src/blenderbuttons.c b/source/blender/src/blenderbuttons.c
index 064bd1c65dd..8525187dc24 100644
--- a/source/blender/src/blenderbuttons.c
+++ b/source/blender/src/blenderbuttons.c
@@ -1,2078 +1,2052 @@
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 66284;
+int datatoc_blenderbuttons_size= 65462;
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, 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, 9, 22, 2, 14, 23,165, 89,144, 34, 0, 0, 32, 0,
- 73, 68, 65, 84,120,218,236, 93,121,124, 19,213,218,126,206,100,239,190, 80, 10,148,165, 44,101,149,165,101,151,197, 6, 91, 20,
- 62, 5,129, 22, 68,148, 42, 92, 27, 17, 92,241,130,219,189,202, 21, 65, 54,149, 43, 10,225, 42,155, 2, 74, 11, 8,202, 34, 45,
-164,128, 80,217,177, 40, 75,161, 80, 74, 11,165, 37, 77,155, 52,219, 36,153,243,253,145,164,166,165,105,150, 6, 4,205,243, 35,
-191,102, 38, 51, 47,103,230,156,243, 62,239,114, 22,210,171, 87, 47, 10, 63,252,240,195, 15, 63,252,240,227,111, 5,198,255, 10,
-252,240,195, 15, 63,252,240,227,239,131,147,167,178, 1, 0,196, 31, 1,240,195, 15, 63,252,240,195, 15,127, 4,192, 15, 63,252,
-240,195, 15, 63,252,240, 27, 0,126,248,225,135, 31,126,248,225,135,223, 0,240,195, 15, 63,252,240,195, 15, 63,254, 18,224, 59,
- 30, 76,155, 54,141,120, 43,104,249,242,229,183,141, 37,240,203,243,203,107, 0,116,249,242,229,127, 90,249,114,114,114,104, 98,
- 98, 34,241,215,199,253, 43,239,244,233,211, 94, 55,190, 94,189,122,193, 95, 31,247,182,188, 83,167, 78,121, 45, 47, 62, 62,254,
-111, 47,207, 99, 3,224,239, 12,153, 76, 86,235, 5,202,229,114,114, 47,151,115,197,138, 21, 32,132, 16,127,205,121, 87,199, 19,
- 39, 78, 68,102,102,102,205,113, 74, 74,202, 95,226, 93,238,220,117,178, 65, 69, 48,114, 68,194, 95,186,205, 72,194,183, 66,108,
-232,128,182, 96, 81,141, 93,200,215,191,123,207,182,197,123, 85,199,248,241, 55,141, 0,220,141,198,186,115,231,206,196,109,219,
-182, 41,236,199,163, 71,143,150,142, 28, 57, 50,231, 94,120, 25,148, 90,117,231,189,202,171, 50,153,140, 22, 22, 22, 2, 0, 98,
- 99, 99, 1,224,190, 80, 34,117,141, 43,155,129,229,212, 51,119, 87,238,198,141, 27,221, 54,212,100, 50, 25,221,180,105, 83,205,
-241,214,173, 91,145,156,156, 92,115,156,153,153, 73,255, 44, 35,160,119,239,222, 20, 0, 78,156, 56, 65,124,113,221,182,239,229,
- 13, 24, 0,242, 70,215, 95, 76,219, 86, 0,128,155, 6, 3,204,122,163,245,100,165, 26, 0,144,154,154,138,164,164, 36,167,229,
- 91,153,180,146,198,221,136,243,232,255,151,254, 46,117,163, 94, 36, 8,127,241, 12, 12,219,182, 66,165, 26, 3, 21,128, 4,201,
- 34,188, 43, 57,129, 86, 98,160,220, 80,128,119,245,227, 61,250,127,179,179,179, 19, 51, 50, 50, 20,142,231, 82, 83, 83,165, 73,
- 73, 73, 57,247, 82,223,242,149, 14,184, 31,158,247, 78,160, 69, 19, 49, 9, 18,132, 18,163, 88, 72,141,149,122,166, 90,175,230,
-170, 13,236,223, 98,118,156, 75, 3, 96,231,206,157,137,246,191,141, 37,106,187, 34,153,179,105, 46,130, 90,133,162,250, 90, 21,
-222, 27,255,174, 98,219,182,109,240, 91,195,174, 33,151,203, 73,108,108, 44, 45, 44, 44, 68, 97, 97, 33,118,239,222,125,207,122,
- 18,246,186,150,203,229, 68, 46,151, 11,100, 50,153,105,225,194,133,199, 0, 96,214,172, 89,125, 27,186,119,204,152, 49, 53,223,
-205,102, 11, 88,147, 17,172,145, 5,203, 90, 63,102,179, 25,179,102,205,242,168, 44,142,228, 95, 31,146,147,147,255, 84, 35,192,
- 29,227,167,119,239,222, 46,101,140, 28,145, 64,188, 33,121,183, 17, 22,130,188,203,223, 66,130,150,176,224, 16,202,190, 60,137,
- 95, 11,148, 24,251,209,106,183,110,143,187, 17,231, 38,161, 91,161,232,166,112,169,136, 37, 35,223, 69,196,232,169, 40,121, 53,
- 1,208,171,106,206,159,212,255, 19, 39, 1, 64, 15, 12,149,164, 98,111,248, 9,132, 1,232,173,234,237,118,251,173,139,140,140,
- 12, 69, 70, 70,198, 61,161,175,236,101,244,133, 14,184, 31,158,215,215, 24,220, 51,158, 60, 29,211,150,255,114,202,100, 94,211,
- 46, 49, 12,159, 52, 37,186,170, 42, 78,140,104,203,186, 31,179, 44,147, 31, 75,182,184, 35,135, 16,114,221, 3, 39,179,133, 27,
-242,102,122, 32,111,201, 29, 53, 0,182,109,219,166,216,244,175,183, 49,254,131,121,138,145, 35, 71,146,198, 52, 48, 59,241, 3,
-192, 45,157, 18,136, 4,222,218,251, 62,212,151, 85,144, 61,127,111, 17,153,179, 14,241,103,151,209,209, 8,120,244,209, 71, 81,
- 88, 88,136,216,216,216,123,238,221, 41, 20, 86, 71, 66, 42,149, 82,185, 92,206,200,229,242, 24,153, 76, 86,178,112,225,194, 19,
-238,202, 49,155,205, 96, 89, 83, 13,241, 59,146,255,241,227,199,209,167, 79, 31,143,202, 53,126,252, 31, 30,224,196,137, 19,145,
-149,149, 85,203, 0,240, 69, 91,241,166, 30, 78,156, 56, 65,114,114,114,232,240,225,195,111,251,109,207,158, 61,216,184,113, 99,
-205,113, 67,227, 22,110, 51,222,125,152, 14,136,105,219, 10, 37,170, 42,108,121, 97, 28, 34,201, 32, 20,252,239, 13,180, 27,211,
- 14, 89, 30,144,191, 29,233,233,233, 20, 0, 86,174, 92,217,232, 54, 27,179,233, 16,116, 87,171, 81, 34,107,219,224,117,103,196,
-217,152,211,253, 38,230,159,121,167, 81,245,233, 11,210,245,165, 12, 95, 68, 2,238,244,243,250, 10,105,105,105, 1, 0, 30, 4,
- 16,228,112,186, 18, 64,222,218,181,107, 43,220,149,179,116,197, 82,134,189,101, 20,140, 24, 53, 70,172,130, 73, 44, 16,240,249,
-106,131,152, 17, 10,245, 28, 47, 36,208,204, 74, 76, 38,126,233,117,227,186,175,214, 26, 38, 79, 77,179, 16, 66, 72,125, 99, 70,
- 28, 81, 89, 89,249,161,253,123,126,126,254,173,192,192, 64, 70,171,213,114,142,215,244,235,215,239, 19, 95, 18,187, 39,134,130,
- 87, 6,192,206,157, 59, 19, 59,118,236,136,184,160, 16, 52, 38, 10,224, 72,254,183,116, 74,204,127,248,253,154,223,158,219,246,
- 34,208, 20, 24,179,112,188, 71,141,204, 25, 65,251,138,164,175, 93,187, 6, 0,104,213,170, 85,173,239,246,255,215, 85,131,184,
-147, 33, 62, 71, 35,192,100, 50, 99,197,138, 21,119,204, 11,240, 84,102, 29,242,119,188,255,186, 92, 46, 15,151,201,100, 42,183,
-201,223,100, 2,203, 26, 97,100, 89,152,234,144, 63,229, 60,139,208,141, 31, 63, 30,199,143, 31,175, 57, 94,178,100, 9, 82, 82,
- 82,106,142, 51, 51, 51, 27,109,236, 56, 24, 60,141,110,127,142,196, 63,113,226, 68,196,199,199,123, 37,199, 87,233,128,226,203,
- 69,208,110,253, 55,130,166, 44, 69, 76,219, 86,136,142,148,224,242,214,203, 86,242, 15, 11,177,166, 0, 4, 60,183,100,249,130,
-248, 1,160,227,217, 75,184,246,222, 92,232, 51,214, 52, 28, 33,144, 72, 96, 48, 24, 80, 80, 80,128, 50,195, 5,116, 68,140,211,
-107,179,179,179, 19, 27,106,251,114,185,156,216,251, 73,118,118,118,162, 39,225,113,199,168,152,189,191, 58,158,243,212, 17,112,
- 70,220,158,232,130,250,158, 55, 43, 43,139, 18, 66,144,148,148, 68, 26,243,188,118, 76,157, 58,149,126,245,213, 87,141,170,243,
-180,180,180, 80, 0, 99,246,238,221,251,111,142,227,140, 14, 36,200,231,241,120,129,105,105,105,255, 88,187,118,237, 78, 87,114,
-222,120,243, 13,190, 68, 40, 22, 11, 4,162, 64,134, 79, 66, 40, 79, 20,192,241,120,124,142, 48,224, 8,223, 66,121, 60, 35,143,
- 35, 6, 45,207,162, 11, 20, 10,200, 87,135,119, 25,196,163,154,114, 40,114, 93, 70,149, 74,165,214,233,116,102, 0,208,106,181,
-220,219,111,191, 93, 67,248,243,230,205,123,173,177,237, 61, 57, 57,249, 5,251,247,172,172,172, 21,190,232, 67,140, 43,239,127,
-238,132, 20, 24,202,203,241, 70,183,206,112,204,221,187,237,133,216, 82, 8,142,228, 63,122,244,104,169, 92, 46, 39,163, 71,143,
-150,174, 30,253,133, 53,178,216,169, 73,173,235,221,193,172,207,243, 49,235,243,124, 76, 95,124, 14,105, 31,252,134,177,111,157,
-110,244, 11, 41, 46, 46,118,203, 48,184, 91,228, 95, 88, 88,232,148,152, 99, 99, 99, 97, 98, 89,244,239,215,175,209,255,143, 61,
- 76,190,105,211, 38, 40, 20,138,154, 79, 67,134,150, 51, 50,148, 74,165,117,201,191,198, 80,118, 71, 49,153,205, 22,171,231,111,
-180,134,254,235,146,191,197, 98,129, 86,175,245,232, 25,237, 17,131,186, 81,131,204,204, 76,100,102,102,214, 50, 6, 60,122,222,
-156,218,250, 80,145,147,227,209, 59,107,136,252, 39, 78,156,136,133, 11, 23,214,144,191,128, 47,240, 72,206,200, 17, 9,196,150,
-130,169,247,227,137, 44, 61,138, 80, 61,166, 63,104,198, 27, 40,190, 92, 4, 58,166,203, 31,222, 74,198, 27,224, 55,143, 2,194,
-194,238,170, 71,168,189, 85, 0,125,198, 26, 80, 74,113,230,204, 25, 12, 29, 58, 20, 18,137,164, 22,241,135,135,135, 67,175,215,
- 67,175,215,163,164,164, 4, 79,233, 95,198,151,225,175, 58,149,105,207,129, 55,244,126,236,191,213,205,151,187, 75,220,190,114,
- 86,236,247,214, 37,127, 87, 14, 82, 67,207,155,149,149, 69, 51, 51, 51,145,145,145,129,236,236,108,218,216,231,157, 58,117, 42,
-229,243,249,152, 58,117,170,215,125, 34, 45, 45, 77, 12,224,249,236,236,236,183, 63,248,224,131, 35,132,144, 88,251, 7, 64,203,
-200,200,200,128,125,251,246, 45, 79, 75, 75, 27,218,144,156,229,242, 21, 60, 30, 17,136, 88, 51, 13, 49, 26, 77, 77, 45, 28,215,
-210,194,113,109, 45,132,180, 6,143, 23, 73, 8, 9, 3,225,133,112, 20, 17,148,229,194,212,122, 83, 96,211, 16, 51,143,233,167,
-113,171,142,116, 58,157,185,174,215,127,175,131,113,199,251,215,149,222,192,136,248, 4,143, 9,218,110, 68,204,217, 52, 23, 0,
-106,200,223, 30, 69, 24, 57,114,100,142,221, 8, 40, 86, 95, 71,194,172, 1, 30, 25, 25, 90,189, 5, 90,189, 5, 55,148, 70,148,
-148, 27,112,237,166,193, 43,226,179,119, 22, 87,228,255,103,193,153, 17, 0, 0, 6,214, 8,131,193,224,181,108, 59,105,219,115,
-228, 81, 81, 81,142,222, 44,220, 85, 38,117, 61, 97,103,161, 68,119,148, 30,107, 50, 90, 61,127, 35, 11,214, 84,155,252, 77, 38,
- 19,180, 90, 45, 52,106,205,159, 90, 39, 86,131, 41,195, 49, 32,103,255,135, 77,155, 50,188, 54, 2, 28,201,223, 78,252, 12,195,
- 64, 44, 22, 35, 48, 40,160, 81,101,222,185,235, 36,117,246,113,117,239,238,183,222, 71, 36, 6,193,156,244, 18, 0, 32, 40,247,
- 18,126, 45, 80, 90, 13,182,164,151, 96, 58, 51, 7,184,165,244,168, 60,233,233,233,212,158, 14,240, 6,129,184, 5, 0, 88,179,
-102, 13,182,109,219,134, 69,139, 22,225,232,209,163, 48, 26,141, 40, 43, 43,179,123,101, 53,215,199,196,196, 64, 15,128,135, 43,
-127, 74,123,113,214,238,235,122,243,222, 26, 20,245,165, 5, 60,149,231, 24, 9,203,200,200,104,212, 51,219,201, 31, 0,188, 53,
- 2,210,210,210,154,217,200, 63,125,237,218,181,103,223,125,247,221, 39, 54,108,216,128,142, 29, 59, 2, 0,218,180,105,131,170,
-170, 42,209,156, 57,115, 78,236,219,183,239,155,180,180,180,216,250,227,229, 0, 56, 74,192,153,197, 22,139, 57,194, 98,182,180,
- 52, 89, 76, 29,120, 12,105, 33,228, 51, 2,177,128,167,231, 7, 8, 43, 3,131,121,106,158,152,154,197, 60, 94, 32,223,204,134,
- 92, 57,121, 74,244, 76,212,167, 46,203,157,159,159,127, 75,171,213,114,245,133,249,123,246,236,121,129,101, 89,159,181,165,158,
- 61,123,250, 76, 22,191, 33,226,254, 95,250,212, 63,200,182,248, 26,222,232,214, 25,139,183,109,243,120, 44,128,221,251,183,147,
-126, 45, 47,101,228,200,156,109,219,182, 1, 0, 34,187, 55,243,168,240,213,122, 11, 52, 58, 51,212, 90, 51,170,170,205,168,212,
-152, 61,126, 1,245,141,252,119,244,242, 29,191, 95,190,124, 25,149,149,149,119, 77,105,172, 88,177, 2,177,177,177,176, 15,250,
-115,204,245,203,100, 50,186, 98,197, 10, 24,244,122,175, 13, 0,153, 76, 70, 87,175, 94,141,226,146, 18, 8,120, 60, 68, 55,107,
- 86,139,252, 31,126,248, 97,140, 31, 63,222, 45,229, 36,151,203,137, 84, 42,173,101, 4,212,141,100,184, 59, 86,129, 53,178, 96,
-141, 70,152, 76, 44,204,102, 75, 13,249, 27,141, 70,232,116, 58, 84, 87, 87, 67,163,241,220, 0,112, 76, 1,216,225,173,231,191,
- 41, 99, 19, 64,129, 91, 54,162,161,214, 70, 4, 66,169,213, 8,200,200,192,248,212, 84,143,211, 1,117,201, 95, 32, 16, 64, 36,
- 18, 65, 44, 22, 67, 44, 22,123,245,220,181,250,181,147,148,128,171,148,214,216, 21,155, 65, 71,181,197,205,129, 9,136,196, 32,
- 72,198,125, 6,243,141,114, 32, 44, 4,124,229, 70,252,248,233, 9,128,199,243,168, 44,141, 77, 5,104,121, 86,157, 50,127,254,
-124,148,151,151, 99,249,242,229,232,217,179, 39, 62,248,224, 3, 36, 36, 36, 64,175,215,215,245,208,236, 38,245, 93, 37,126,119,
- 9,218,219,116,128, 51, 67,194, 27, 57,169,169,169, 53,196,239, 77,223,168,143,252,107,200,134,207,135,217,108,246, 52, 29, 16,
-156,151,151,247,223,105,211,166, 29,232,222,189,123, 8, 0,188,255,254,251,200,207,207, 7, 0, 12, 24, 48, 0, 91,182,108,193,
-224,193,131, 3,159,122,234,169,130,156,156,156,236, 41, 83,166, 60,117,187,162, 7, 34, 34, 35,184,203,151, 11,204, 57,138,189,
-187, 58,116,136,203,105,219, 38,246, 44, 47, 88, 82,198, 35, 66, 45, 35, 18,232, 24,113,128,134,229,243, 88, 80, 19,143, 19,155,
-130, 53, 37,202,160,163,251, 78,247,107, 18, 30,189,197,165, 49,234,144,243,223,186,117,107,218,152, 49, 99,214,218,195,254,106,
-181,154, 17, 10,133,141,110, 75,190, 10,251,187,140, 0,216,189,252, 62,237,227, 96, 40, 47,135,182,216, 74,130, 67,109,222,161,
-167, 81,128,203,191, 93,186, 77,118,125,199,202, 51,165, 30, 21,190,177,228,239, 72,252,148, 82,180,106,213,170,214,111, 38,147,
-169,230, 83, 89, 89, 9,173, 86,139,138,138,138,187,166, 60,236,243,252,119,239,222, 93, 43, 18, 96, 39,255, 30, 61,122,192, 96,
-208,215, 40, 58,106,183,102,220, 84, 76,159,127,241, 57, 76, 38, 19, 90,198,196,192,100,177,212, 75,254,158, 40, 18,155, 17,112,
-155, 87, 98,159,186,216, 80, 36,227, 54, 3,128, 53,213,144,255,177,163,199,160,211,235,161,209,104, 80, 85, 85,133,202,202,202,
- 90,158,157,167,176,167, 1,188,205,251, 3,128,242,150, 18, 74,229, 45,220, 82, 86,224,150, 82, 9,165, 82, 9,229, 45,171, 71,
-218,185, 75, 23, 84,216,190,123,234,253, 3, 64,124,124,252, 31, 94,127, 96, 32,130,130,130, 17, 28, 20, 12,141, 70, 35,109, 76,
-123,106, 40, 37,224,234,222,130, 69,233, 16,140,251, 12,145, 24, 4,126,238,103, 48,109,126, 9, 8, 11,193,246, 23, 83,112,117,
-251, 21, 60,190,112, 29,192,191,203,203,138, 24,174, 66, 18, 35,129, 86,171,133,193, 96,128, 78,167, 67,110,110, 46, 62,250,232,
-163,122, 47, 15, 8,176, 71, 80, 46,121, 76,222,222,122,213,142,239,183,238,251,118,118,220, 24, 35,163,190,180,128, 39,114,146,
-146,146, 72,106,106, 42, 82, 82, 82,144,156,156,236,117,100,226,171,175,190, 34,102,115,109,157,108, 54,155,225,233, 88,128,181,
-107,215, 94, 76, 77, 77,237,185, 97,195,134,161, 7, 15, 30, 12, 78, 74, 74, 58,106, 39,127,155,163, 10,145, 72, 68,175, 94,189,
- 42,216,181,107, 87,167,240,240,240, 99,131, 6, 13, 42,168, 79,214,132,241, 19,184,184,182, 29, 53, 3, 6, 12, 72, 57,123,246,
-247, 97,106,173,166, 25, 53,155,204, 96, 96, 50, 27, 25,163,209,104,212,171, 81,170,230,140, 6, 77, 73, 81,169,249,199, 29, 59,
- 23, 52,137,140, 42, 99, 89,157, 75,247,189, 62,239, 95,165, 82,241, 1, 32, 36, 36,228,158, 77, 11, 48,206,188,255, 77,255,122,
-219,106, 53,151,222,168,245,155,167, 99, 1, 70,143, 30, 45,253,252,249,165, 0,172, 3,254,182,109,219,166,112,156, 90,184,109,
-219, 54, 69,242,215, 79, 0, 0, 78, 46,252, 5,163, 71,143,150,222,173,135,119,236, 36,197,197,197, 53,222,190,157,244, 29, 42,
- 23, 26,141, 6, 6,131,193, 65,137,220,189, 50,190,240,130,117,236,135,201,108,198,217,179,103,113,234,228, 73,244,236,209, 19,
- 6,131, 1,122,189, 1, 6,189, 30,223,124,253, 53,236,215,185,211,209,151, 44, 89,130,174, 93,186,194,100, 50,225,226,197,139,
- 48,155, 88,148, 20,151,248,244,157,218,143,109,107, 22, 32, 54, 54,214, 45,197,196,154,140, 48, 91,172, 97,255, 35, 71,126,129,
- 86,175, 69,181, 70,141,170,170, 42,168, 42, 43,161, 82, 85, 52,202, 16,179, 71, 2, 26,227,225, 28, 56,112, 0, 26,141, 6, 26,
-141,218,246, 87,131, 38,145,145,232,220,165, 11,206,159, 59,135,253, 7, 14,120, 44,211,238,253,243,249, 2, 4, 4, 4, 32, 40,
- 40, 8,193, 65, 65, 8, 10, 10, 64,133,170, 66, 10, 32,231, 78,135,250,157,225,215, 2, 37, 76,103,230, 64,137, 67, 32, 35, 23,
-131, 12,250, 55, 10, 22,165, 99,212,194,181, 16, 11, 24, 64,192,183,126,188,128,183,169,128,146,199,190, 64,196,198,199,160,211,
-233, 16, 17, 17, 1,149, 74, 5,149, 74,133,195,135, 15,227,198,141, 27, 53, 97,226,154,235, 75, 74,240, 98,184, 4, 77, 2,202,
- 27,242,128,165,142,164,234, 56, 72,206,254,221,254,155,253, 90,111,188,115,119,211, 3,238,146,191,183,158,127,125,207,155,148,
-148, 68,146,147,147, 73, 99,158,183,174, 17,224, 13,249,219,241,246,219,111,231, 61,241,196, 19, 79,205,159, 63,191,211,175,191,
-254, 58, 72, 34,145,240, 70,141, 26, 69, 68, 34, 17, 56,142, 35, 35, 71,142,204,123,229,149, 87,122, 60,240,192, 3,219,255,241,
-143,127,164, 77,157, 58,213,105, 46, 42,253,197,116,238,247,115, 23,143, 61,208,189,199,211,199,142, 30, 29,187,125,199, 15,243,
-142, 31, 61,218,236,108,254,121,241,197,146, 2,250,205,210,239, 36,243,151, 44,234,154,189, 99,199,146, 14,237, 59,252, 24, 20,
- 29,120, 96,237,218,181, 22,184, 89,242,164,164, 36, 28, 59,118,172,215,138, 21, 43,230, 24, 12, 6,193, 7, 31,124,240,241,246,
-237,219, 39,150,148,148,220, 93,226,104,108, 10, 32,242, 74, 33, 42,108,161,127, 71, 12,141,138,194, 98,156,119,223,235,176,133,
-248,207,159, 56,139,176, 78, 77,144,252,245, 19,216,246,204,247, 10,123,216,223, 78,254,118,239,223,147, 89, 6, 91,230,251,102,
- 36, 62, 33, 4,231,206,157,131,189,177,214, 13,179, 10, 4, 2, 8, 4, 2,148,151,151, 99,228,200,145,119,189,146,236,163,254,
- 87,172, 88,129,126,253,250,193, 96, 52, 66,111,208,195, 96, 27,220,164, 55, 88,211, 0,203,150, 45,115,169, 76,100, 50, 25, 93,
-184,112, 33, 44, 22, 11, 78,156, 56, 9, 1,223, 26,182,141,139,139,195,149,194, 66,148,148,148, 96,227,198,111, 49,113,226,147,
-216,187,119, 47,117,140, 4, 52,164,128,228,114,185, 16,128, 89, 38,147,113,245,121, 64,158, 76, 85,180,123,254,185,185,185,208,
- 86,235,106, 12, 48,181, 70, 13,181,186, 10,106,117,181,215,161,112,187,247,111, 91, 9,208, 43, 67, 96,226,196,137,181,142,219,
-198,198,162,115, 23,235,160,184,243,231,206,225,138, 45,226, 81,247, 58,119, 48,240,193,129, 16, 9, 69,144, 72, 36, 16,139,197,
- 16,137, 68, 40, 45, 45,117,155,252, 93,133,250,189, 93, 35, 96,236, 71,171,177, 5,192,163,243,255, 15, 52,227, 13,144,241, 75,
-240,107,129, 18, 36, 34, 28,151,138,213, 86,239,223,195, 20, 64,221, 84,128,199,211, 3,245,122,128, 87, 80, 39,188,111, 37,122,
-147,201,132, 47,191,252, 18, 67,135,254, 49, 46,108,239,179, 49, 64,153, 14,157,118,170,208, 43,170,141, 51, 5,158, 83, 39,247,
-173, 0,106,212,191,162,238,181,222, 16,118, 67,121,123,111, 61,127,111, 13,137, 59,253,188, 54, 35,160,209,179, 0,230,205,155,
-183, 81,171,213, 70,157,206,203, 27,175,215,235,123, 40, 20,251, 36, 34,177,136,207, 16, 6,251,246,237, 11,238,218,181,235,186,
-212,212,212,127,143, 25, 51,198,165,183,174,216,251, 19, 55,106,204,168,253, 61,123,198,207, 98,205,198, 71, 47,229, 95,156,199,
- 21, 22,152, 1, 80, 49, 24, 83,247, 14,157, 50,154, 54,141,218,201,227, 11,191,249,240,221, 5,172, 61,133,208, 16,250,245,235,
-247, 73, 82, 82, 18, 0,160,188,188, 28,217,217,217, 33,171, 86,173,154, 7, 0,199,142, 29,235,215,173, 91,183,221,247,133, 1,
- 96,247,206, 31,254,102, 67,195, 94,134, 7, 83, 2,237,214,111,194,172, 1,136,236,222,172,134,244, 29, 67,255, 39, 23,254,226,
-145,229,234,171, 57,169,246,178,117,233,210, 5,103,206,156,169, 69, 44,149,149,149, 5, 0,218,215,119, 79,125,107, 87,223,105,
- 35,160, 62,101,241,205,215,223,192, 96, 48,192,200, 26,193,178, 44, 22, 46, 92, 8, 87,228,111, 7,199, 89, 32,150, 4, 65,175,
- 55,224,220,217,179,224, 11, 4, 48,177, 44, 2, 2, 3,176,113,227, 70,240,120, 60,251,220,249, 6,159,117,225,194,133,187,101,
- 50, 25, 43,151,203,155,218,203, 89,103, 29, 0,143, 66,155,179,102,205,194,161, 67,135, 80, 93, 93,141,106,173, 22, 26,181,218,
- 70,254,106,104,212, 26, 84,107,170,161,117, 80,248,238,188,187, 62,125,250,208,227,199,143,215,120,255,245, 77, 3,116,119, 17,
-160,196,196,196,219,234,194, 78,250,167, 78,157,170,241,230,221,125,230,222,189,123, 83,251, 34, 63, 65, 1, 65, 16, 75,196,208,
-104, 52, 82,135, 28,182, 71,138,247, 78, 45, 6,100, 55, 2,198,204, 95, 5,186, 25,104,242,172, 28, 57,175,166, 96,240,130,245,
-128, 64,128, 64,113,227,242,156,117, 13, 1, 0, 80, 28,114, 21,108,188,137,238,187, 3, 80,250,131, 14,170,185,127,156, 53,153,
- 76, 24, 50,100, 8, 0, 32, 38, 92,130,159,229,173,176,232,163,107,248,226,164,190, 65,105,142, 30, 63, 96, 29, 8,103, 87,236,
-117, 7,197,121, 58, 45,206,113,252, 78, 99, 61,255,250,116,130, 55,178,238,228,243, 58, 26, 1,190,104,127, 75,151, 46,253,239,
-148,231,166,236,234,219,187, 79, 63,141, 90, 29, 97,182,152,141,209,209,209,229, 49, 49, 49,165,106,181,250,215, 49, 99,198,184,
-173, 20,182,111,221,206, 1,216,248,204,211,255,200, 29, 52,120,240,247, 18,137, 36,148,128,114,132, 16,112, 28,173,210,107, 85,
-138, 11,121, 69,154, 0,161,192, 45, 61,111,127,103,128,117, 32,117,221,129,122, 31,125,244,209,191,239, 11, 3, 96,228,200,145,
- 57,141, 89,240,199,157,198,106, 55, 4,236,196,239, 75, 66,111, 76,217,186,119,239,142, 99,199,142,161,188,188, 38, 68,216, 30,
- 0,148, 74,107, 68,233,153,103,158,249, 83, 43,171,238, 59,162,148,210,167,159,121, 26,203,150,125,110,203,153,155, 17, 26, 26,
- 74,220,189,223, 14,137, 68,108,151,103,245,166,180, 58,199,123, 0,212,191, 89,135, 3,186, 44, 92,184,240,162, 76, 38, 43,147,
-203,229, 60,199, 1,129,182,105,129,110, 43, 58,251,220,247, 65,131, 6,249,252,221,245,233,211,167,238, 94, 0, 53,191,123,186,
- 2,160, 92, 46, 39, 57, 57, 57,116,227,198,141,181, 22,234,177,203,246,166, 61, 39, 38, 38, 18,147,217, 4,147,198,228,211,103,
-111, 40,244,239,233,222, 0, 99, 63, 90, 13, 56, 44,252,243,208,219,127,140, 75,210,250,168,188,181, 34, 0,221, 26, 54, 62, 75,
- 6,149,160, 4, 64,194,162,112,204, 61,209, 17, 81, 0,202, 11,180,232,208,161, 3, 0,224,191,115,195,241, 72,223, 40,180,125,
- 36,223,173,255,219,147,169,110, 25, 25, 25,138,134,150, 61,118,165,111,124,161,243, 26, 43,235,110, 60,175, 47,177,106,245,170,
-139, 0, 46,250, 74,222,215,223,124, 89, 8, 31,140, 10,205,206,206,246,233,115,250, 98,145, 31,175, 12,128, 59, 77, 96, 59,119,
-238, 76,220,182,240,222,219, 11,192,222,145,250,246,237,139,157, 59,119, 26,108,164,207, 1, 8,184, 19,145, 7, 31, 53, 18, 34,
-151,203,107, 60,251,134,200,255, 78, 98,214,172, 89,142,241,212, 26,133,109,159, 70,232,137,183,115, 39,223,175,163,236,156,156,
-156, 70, 47,251,155,152,152, 72, 18, 19, 19, 27, 93, 46, 87,107,251,251, 2,141, 73, 9,204,158, 61, 27,151, 47, 95,246, 89, 89,
-220, 89,222,215, 83,156,252,167, 10, 39, 97, 29, 24, 58, 52, 85,130,159,142,116, 68,116, 64, 16,126, 63,126, 19,157,220, 36,127,
- 87,237,239, 94, 93, 14,215, 23,107, 9,220, 79,207,123,175,193,157,229,125, 61,148,183,228,110,149,253,174,239, 6,120,167, 34,
- 12,190, 52, 2, 70,142, 28, 41,190,159, 26,224,159, 29, 61, 1, 96, 95,161,198,108, 55, 0,252,202,227,222, 65, 99, 83, 2,237,
-218,181, 35,237,218,181,243,137,190,241,100, 31, 0,111,113, 32, 67,143, 3, 25,249,254, 62,235,135, 31,174,156,200, 94,189,122,
- 81,255,107,240,195, 15, 63,252,240,195,143,191, 23, 24,255, 43,240,195, 15, 63,252,240,195, 15,191, 1,224,135, 31,126,248,225,
-135, 31,126,248, 13, 0, 63,252,240,195, 15, 63,252,240,195,111, 0,248,225,135, 31,126,248,225,135, 31, 0,112, 20, 64,185,237,
-239,125,137, 90,179, 0,166, 77,155,230,245,200,212,250,230,137,251,229,221,123,242,210,211,211,189,146, 23, 31, 31,127,155,188,
- 83,167, 78,121, 93,190,250,228,221, 47,245,225,233, 59, 92,185,114,229, 93, 41,159,175,235,227,110,214,175,171,105,162,158,190,
- 63, 95,203,243,235,151,187, 47,239, 30,111,207, 71, 79,157, 58,149, 12,216, 54,152, 4, 12,247, 90,127,243,216, 0,240,227,175,
-143,149, 43, 87,250, 95,194,223, 12, 97, 97, 97, 12,172,211, 51,249, 85, 85, 85, 28,165,212,114, 47,149,207,190,239,124,118,118,
- 54,245,197, 66, 51,190, 90,105,207,143, 59,135,237,219,183, 39,142, 26, 53, 42,231, 62,126,132,126, 0,236,203, 14, 11, 60, 53,
- 0,238,201, 8,128, 31,127, 61, 80, 74,107,109,117,236,109, 4, 96,249,242,229, 46,175, 25, 62,124,120, 98, 86, 86, 86,173,149,
-197,146,147,147,165,123,246,236,241,170,163,103,102,102,214, 43, 47, 37, 37,229,158,144,119, 47,131, 16, 66,218, 68, 71,163,176,
-180,148, 86, 86, 86,218,247,103,240,104,137, 65, 71, 99,241,248,150,101,197,132, 96,186,124, 87,222, 54,217,136, 30, 95, 83, 10,
-245,202,221,121,211,103,143,237, 71,192, 80,190, 74, 99,160,125,198,189,228,241,150,156,217,217,217,137,246, 37,103,109,127,189,
- 90,110,182, 46,249,219,219,125, 99, 55,218,169,239, 94,111,101,250, 66,158, 76, 38, 3,240,199, 10,157,190,128, 76, 38,243,169,
- 60,119,200,127,231,206,157,138, 81,163, 70,221,239,198,153,189,189,223,209,231,104,209, 68, 76,130, 4,161,196, 40, 22, 82, 99,
-165,158,169,214,171,185,106, 3,235,147,233,251,183, 25, 0,190, 36, 8,111,101,121, 42,143, 16,194, 0,144, 0,208, 83, 74,185,
-123,173,124,190, 34, 88, 95, 24, 0,118,165,238, 88, 86, 66,136,145, 82, 42,106, 76,164,128, 16, 66, 1, 96,201,146, 37,181,118,
- 12,155, 57,115,166,130, 16, 2, 74, 41,241, 80, 41, 81, 0,224,190, 11,175,117,158,153,144,165,200,202,202,242,120, 33, 21, 95,
-202,187, 31,162, 40,148, 82, 42,109,223,150, 74,219,183, 5, 0,148,178,230, 73,205,132,252,245,246,223,207,171,171, 69, 55,202,
-203, 89,119,100, 29,219,252, 89, 62,199, 33,230,193,129, 77, 66, 62,126,117,240,158, 30, 61,194,174, 78, 95,208,239, 67, 0,184,
- 89,165,251, 63, 1,159,252, 0,144,179,233,233,233,221, 60,125, 55,117,151,162,109,204,114,179,142,228,239, 11, 35,192,217, 61,
-222, 26, 20,190,144,151,154,154,138,140,140, 12,183, 72, 59, 59, 59,187,214, 26,245,222, 26, 1,158,200,113,151,252, 57,142,195,
-202,149, 43,177,126,253,122, 58,105,210, 36,226,161,158, 17, 82, 74,125,178, 94,118,100,100,100,186, 82,169,244,182, 67,139,108,
-158, 63,123, 39,250,240,224,158,241,228,233,152,182,252,151, 83, 38,243,154,118,137, 97,248,164, 41,209, 85, 85,113, 98, 68, 91,
-214,253,152,101,153,252, 88,114,163, 35,121,124,119,148,155, 76, 38,139, 2,208, 7,192,113,185, 92, 94,126,143,121, 58, 33, 0,
-146, 0,140, 1,176,149, 16,146, 77, 41, 85,251, 64,238,183,148,210, 39,189, 37,216,123, 5, 12,195, 52,104,164, 16, 66,250, 1,
- 16, 18, 66,154, 82, 74,203,156, 93,215,144,129, 66, 8,161,175,188,242, 10, 90,183,110,125,219,118,161, 75,150, 44,145, 22, 21,
- 21, 41, 8, 33,212, 93, 35, 64, 38,147,209, 53, 47, 5, 98,242,224,219, 55,151,225,190, 11,199,186,159, 89, 60,235,153,215,228,
- 83,121, 85, 85, 85,137,111,190,249,166, 98,252,248,241,144, 74,173, 43,219,157, 62,125, 58,113,249,242,229,138,214,173, 91,131,
-227, 56,232,245,122, 36, 38, 38, 98,248,240,225, 46,101, 10,171,180,137,157,222,220,164,200, 74,104, 41,109,246,124,114, 14, 0,
-152, 75,205,137, 23,222, 51, 43, 44,173, 67,160,230, 2,161,210,135,160, 44,244,152,116,234,236,166, 46,189,227,246,173,154, 53,
-107, 45,148,220,120,105,250, 51,198,104,137, 80,168,174,208,147,133,171, 54,172,127,251,133,167, 17, 46,145, 80,131,201, 66,255,
-181,108,149, 17, 0,105,222,188, 9,191,180, 84,201,244,234, 85,255,206,154,125,155,238,137,187, 30, 19, 16, 54,232,193,168, 37,
-241,189, 35, 4,107,214, 92,138,141,106, 34,185,245,201,171, 71,150, 20, 94,141,183,140,120,164,121,110,254, 69, 77,209,179,147,
-219,143,180,183, 27, 79,250,128,227, 6, 57,141, 9,215,215, 37,255,186,253,211, 27,249,247, 98, 4,192,113,163, 30,153, 76,134,
-212,212,212, 90,231, 29, 73,219,113, 99, 31,111,141, 10,187,156,140,140,140, 70, 71, 9, 28,201,127,230,204,153, 56,126,252, 56,
-253,249,231,159, 49,105,210, 36, 79, 69,177,132, 16, 1,165,212,236, 3, 21, 89, 26, 25, 25, 57, 70,169, 84,110,245,226,222, 80,
- 88,199, 0,132, 3,184,145,150,150, 22, 6, 32,221,118,108,199, 77, 0, 63, 0, 40, 88,187,118,173, 91, 66,151,174, 88,202,176,
-183,140,130, 17,163,198,136, 85, 48,137, 5, 2, 62, 95,109, 16, 51, 66,161,158,227,133, 4,154, 89,137,201,196, 47,189,110, 92,
-247,213, 90,195,228,169,105, 22, 66, 8,113,214,127, 27, 29, 1, 32,132,180, 2,240, 63, 0, 37, 0, 94,145,201,100,207, 83, 74,
-175,221, 45, 15,214, 5, 73, 71, 2, 88, 7,224, 58,128,195, 0, 30, 5, 48,149, 16, 50,153, 82,170,108,164,248, 9,132,144, 73,
-174,242,165,119, 51,196,126,135, 48, 0,192, 5, 0,109, 1,148, 17, 27, 83,187,107,208, 12, 31, 62, 60, 17, 64, 45,242,159, 57,
-115,166,194, 49, 26, 96,251, 77, 49,124,248,240, 68, 87,233,128,204,204,204, 68, 0,181,200,154,153,160,130,163,247, 62,121,176,
- 16,207,126,166, 69,102,102,102,162,171,240,189,175,229, 1,192,145, 35, 71, 20, 98,177, 24,185,185,185,181,246, 59, 96, 24, 6,
-239,188,243, 14,177, 43,187, 29, 59,118, 40,134, 15, 31,238,178, 2,154, 29, 57,171,160, 98, 1,122,148, 11, 21,101, 14,225, 68,
-194, 80,244,120,135, 37, 0,139, 51, 7,174, 38, 94,223,252,152, 2, 56,218, 32, 81, 72,219,183,165,173,133, 18,188,254,226, 36,
- 99,116,144, 80,120,235,204, 33, 18,200,240,241,242,144, 56,180, 8,147,224,106,238, 65,162,103, 41,153,153,254, 12, 43,109,223,
-150,118, 14, 8,198, 13,122,139,196,199,199,215, 43,175, 73, 19,225, 67, 66, 33, 35, 62,124,248,198, 43,102,139,225,211,232,150,
-237, 76, 97, 77, 4, 68,173,190, 20,208,174,109, 64,147,136, 8, 81, 57, 71,213,198, 31,143,150,105,167, 13,249,115, 26,112,221,
-176,191, 99,223,244,212, 8,176, 95,227, 56,142,192,213,117,174,182,223,246,165, 60, 71,178,151,203, 85, 0, 84,144,201,194,235,
- 37,109,119,225,204,168,176,159,179, 25,106,141, 38,255, 29, 59,118, 40, 24,134, 1,195, 48, 24, 50,100, 8, 14, 30, 60, 88,171,
-190,220,133,197, 98,201,227,241,120, 38, 66, 8,223, 7,227, 89, 36, 74,165,242,187,200,200,200,113, 74,165,114,179,135,247,154,
- 96, 29, 91, 99, 76, 75, 75,139, 6,240,225,222,189,123,211, 56,142,227, 28, 56,138,240,120,188, 37, 82,169,244, 63,105,105,105,
-115, 92, 25, 1,111,188,249, 6, 95, 34, 20,139, 5, 2, 81, 32,195, 39, 33,148, 39, 10,224,120, 60, 62, 71, 24,112,132,111,161,
- 60,158,145,199, 17,131,150,103,209, 5, 10, 5,228,171,195,187, 12,226, 81, 77, 57, 20,221,185, 8,192,167, 0,246, 2,248, 2,
-192,139, 0, 62, 93,185,114,229, 56, 47, 9, 59, 28,192, 43, 0,250, 2, 24, 9, 96, 39,128, 99, 0,150, 82, 74, 85, 94,136, 60,
- 96, 43,215,114, 74, 41, 71, 8, 9, 4,144,102, 59,223,173, 17,134, 69,168,237,107, 32, 0,181, 39, 30,182,147, 8,138, 16,192,
-219, 0,230,201,229,114, 22,247, 22,250, 2, 56, 4,160, 25, 33,100,163,173, 78,190,174,107,208, 56, 51, 80,178,178,178, 20,142,
- 97,255,153, 51,103,214, 28, 59,126, 95,178,100,137,212,102, 24, 52,216,227,179,178,178, 20,142, 97,122,102,130, 10, 23,119, 90,
-119, 97,100, 70,126, 93, 67,218,220,119,225, 96, 38,100, 41, 92,109,232, 83,159, 60,187,130,101, 38,200,168,167,242, 40,165,137,
-135, 15, 31,198,164, 73,147,240,229,151, 95,226,228,201,147,137, 9, 9, 9, 57,117,175, 17,139,197,138,230,205,155,187, 19,171,
- 79,108,126,248, 55, 92,152,148,136,160, 47,207,128,220,208, 37,210,230, 1, 54,121,196,118, 9, 18, 5,134,214,138,136,230, 13,
-111,101, 43,109,223,150,166,255, 99, 2, 27, 29, 40, 20,152, 46, 29, 23,134, 71, 5, 19,197, 13, 53,198,245,106,133,206, 49, 97,
- 16, 86, 94,128, 66,163, 71, 43,129, 8, 97,132, 39,120,107,234, 36, 90, 45, 20,229, 75,219,183,165, 8, 9,171, 87,166,170, 82,
- 19,209,175, 95,208, 18,181,185,255,236,224,240,114,145,129, 9,228, 36, 65,172, 49,162, 73, 36, 19, 16, 38,230,171, 42,110,136,
-212, 85,102, 8,170,140,196,177,205, 52,100,208,218,242,254, 10, 87,196,153,154,154, 42,117, 53, 30,160, 62,207,191,174, 33,224,
-137, 17, 96,255,173, 33, 50,118, 60,239,138,172,235,202,163,155,194,111,215, 55,227, 85,112, 87, 94, 67,225,254,198,144,118, 93,
-163, 2, 0, 34, 34,178,125, 66,254,211,166, 77,179,166,223, 56, 14,111,188,241, 6, 62,253,244,211, 26,242, 95,190,124,185,199,
-207,203, 48, 12, 88,150, 61, 37, 20, 10,205, 62,136, 4, 84, 0,128, 82,169,220, 28, 25, 25, 41, 85, 42,149, 10, 79,138, 2, 0,
- 44,203,242, 1,172,204,206,206, 30, 49,119,238,220,235,239,190,251,110,235, 58,105, 6,186,111,223,190,119,135, 13, 27, 86,145,
-150,150,246, 89, 67, 70, 0,143, 8, 68,172,153,134,112,156, 41, 82,200,227, 53,161,132,132, 18, 62,159,240,121, 60, 45, 33,132,
- 5,225,233, 57,138, 0,202,114, 66,181,197,132,246, 33,102, 19,211, 79, 67,125,102, 0,212,201, 13,199, 0,104, 69, 41,181, 19,
-254, 34, 66,200, 81,153, 76, 22, 67, 41, 45,241,196,131, 37,132, 60, 99, 35,235,143, 1,204, 6,240, 52,128, 24, 0,169, 0,138,
- 8, 33, 47, 82, 74,191,246,128,164,255, 13,224, 18,165,244,115, 66,136,200,214,225,205,148,210, 47, 8, 33,143, 16, 66,254, 77,
- 41,253,143,151,141, 98, 40,172,243, 59, 31,178,133,111,220, 70,125, 17, 0,153, 76, 54, 5,192,123, 0, 74,211,211,211, 87,220,
- 99, 17,128,110,182,178, 37, 3, 24, 1,224,170, 43,131,198, 25, 28, 9,223,145,244,235,142, 11,112,187,119, 57,144, 63, 0, 92,
-220,249, 76, 45, 35,192, 27,121,142, 10, 86, 46,151, 19, 71, 35,192, 29,236,223,191, 31, 44,203,162,119,239,222,210,159,127,254,
- 89, 81, 88, 88,168, 72, 72,176,110,169,203,113, 28,230,207,159, 79,171,171,171, 33, 16, 8, 48,118,236, 88,151,207,109,200, 61,
- 6,134, 53,163,178,119,172, 84,240,243,117,197,165,213,251,209,254,237, 17, 86,210,226, 40,242,230, 11,105, 69,117, 48,244,130,
- 32, 36, 79,187,232,250, 61, 50,188,234,242, 51,185,161, 6,163,133, 9,149,136,104, 74,175,214, 8,145, 8, 72,177,178, 26,129,
- 12, 31,227,227, 91,211, 35,191,151,225,151, 31,118,163, 77, 96, 16,253, 85,163,190, 10,160,147, 51,113,185,167, 90, 76, 31, 16,
-127,107,127, 16,191,173, 89,104,190,217,126,232,192,241, 65, 6, 54,240, 49, 94,208, 49, 70, 93, 89, 17, 80,120,238, 88, 91, 19,
-123,174,252,114,129, 54,196,214,103, 92, 17, 21,117,215, 59,181,143, 15,112, 54, 38,192,153, 55,237,202,171,148,201,100,212,219,
-144,233,189,132,186,158,191,149,188,129,140, 12,223, 13, 18,244,133,231, 79, 41,133,217,252, 7, 71, 15, 30, 60, 24, 7, 15, 30,
-244,138,252,237,158,183, 64, 32,176,112, 28,119,152, 97, 24, 83, 35,141,128,166,246, 47, 74,165, 82, 17, 25, 25, 41, 83, 42,149,
-238, 62,180,170,178,178, 82,116,236,216,177,167,179,179,179, 71,172, 93,187, 86,153,150,150,214,122,195,134, 13,120,255,253,247,
-145,159,159,143, 54,109,218,160,180,180,148,204,153, 51,167,236,189,247,222,251,100,216,176, 97,167,210,210,210,126,118, 42,145,
- 51,139, 45, 96, 34, 8,135,150, 38,112, 45, 3, 4, 34,129,144,207,220, 18, 11,120,122,158, 68,168, 17,137,120, 70,163,133, 19,
-242, 77,252, 64,214,108,228,174,156, 60,165,127, 38,234, 83,211, 17,120,199, 31,174, 34, 0,143, 0, 56, 84,103,224,216, 33, 0,
-143,172, 92,185,155, 6, 91, 96, 0, 0, 32, 0, 73, 68, 65, 84,114,149, 7,100,253, 20,128, 87, 1,196,214, 9,205,171, 0,252,
- 70, 8,249, 47,128, 61,132, 16, 11,165,116,131, 27,242, 2,108,185,150,110, 54,235,222, 88,231,146,201, 0,126, 39,132, 44,166,
-148,234,188, 9,255, 3, 88,101,251,235,145, 1, 80,151, 48,101, 50,217,115, 0,166,219,222,229, 18, 66,136, 81, 46,151,175,190,
- 23, 20, 8, 33,164, 3,172, 91, 30,255, 8, 96, 27, 0,123, 61,193,221, 8,192,223, 13, 37, 37, 37,138,254,253,251,131, 16,146,
-211,191,127,127,124,255,253,247,120,226,137, 39, 18,155, 53,107,166, 96, 24, 6,111,189,245, 22,177, 41,147,196,141, 27, 55, 42,
-140, 70, 35,250,246,237,235, 84,209, 13,188,114, 93, 81,218,191, 11, 64, 72,206,239,209, 22,105,183,211, 17, 10, 3, 7,169, 53,
- 5, 0,244,120,139, 37,128, 18, 90,101, 85,226,190,141, 29, 20,218,224,163,210, 39,211, 66,234,245,138,139, 89,243,226,149, 43,
- 55,188, 17,213, 68, 82, 88,165,101, 67, 99,195, 3, 5,169, 61,219, 5,196,199,138,136, 65,103,129, 78,207,225, 18,209, 91,182,
- 21,150,232, 10, 74,171, 45,205,132,226, 27,165,172, 97,248, 53,163,233,227, 96,224,245,250,100,134,132,199,180,212, 87, 95,108,
-209, 53,105, 24,115,246,200,141,161, 37,231,191,191,214,161, 79,122, 83, 94,151, 94,197,167, 14,126, 87, 69,120, 33,125, 57,142,
-171,184,121, 83,239,210,138,170, 75,216,174,142,237,222,108, 70, 70,134, 83,194,118, 12,175,215,141, 4,184,115,253,253,138,164,
-164, 36,167,123,208, 59,134,240, 27, 3, 95,200,169,174,174, 86, 0, 0,159,207,199,107,175,189,134,227,199,143,227,231,159,127,
-110,172, 88, 35, 0,139,209,104, 52,151,148,148,100,197,196,196,152,224,253, 72,124,141,227,129, 82,169,148, 71, 70, 70, 62,174,
- 84, 42,221,209,251, 98,131,193, 16, 53,107,214,172, 37,211,166, 77,171,234,222,189,187, 8, 64, 13,249, 3,192,128, 1, 3,176,
-101,203, 22, 12, 30, 60, 88,244,212, 83, 79,105,114,114,114,246,117,235,214,109,112, 64, 64, 0,116,186,219,169,137,227,168, 57,
- 71,177,119, 87,135, 14,113, 57,109,219,196,158,229, 5, 75,202,120, 68,168,101, 68, 2, 29, 35, 14,208,176,124, 30, 11,106,226,
-113, 98, 83,176,166, 68, 25,116,116,223,233,126, 77,194,163,183,120,251, 34, 27,140, 0,200,100,178,225, 0,214,215,241,106,247,
- 1,152,148,158,158,190,202, 29, 15,150, 16,194,179,133,191, 71, 59,203,203, 83, 74,149,132,144,241, 0,182, 17, 66,190,115, 35,
-175,243, 20,128, 61,148,210, 42, 39,242,170, 8, 33,123,108,215,125,233, 33, 41, 14, 3, 16, 9, 96, 6,128,141,132,144, 97,148,
-210,125,222, 68, 0, 8, 33, 41, 0, 22, 1,104, 67, 41,213, 18, 66, 6, 0,184, 42,147,201, 52,148,210, 76,119, 35, 0, 50,171,
-169,239,142,210, 34,114,187, 27,224, 30, 6, 2, 56, 74, 41,165,196,234, 54, 93, 5,160, 37,132,180,178,143,243,240, 36, 2, 80,
-215,227,111,140,247, 95, 19,150, 31,249,117, 77, 20, 32,174, 17,222,255, 31, 97,254, 63,194,183, 50,153,103,222,191,201,100,162,
-199,143, 31, 71,112,112, 48,242,242,242,168,197, 98,129, 90,173,198,185,115,231, 20,145,145,145,168, 19,246,203,233,218,181,171,
-116,211,166, 77,138,190,125,251,214, 31,238, 51,153,104,171,227,103, 32, 12,142,129, 32, 79, 73,163, 45,193,208,168, 25, 88,206,
- 85, 3,145,181,119,164, 14,140, 52,231,180,238,115, 66,186,123,243, 4, 5,176,171, 94,101,119,241,218,181,127,198,181,106, 5,
-220,210,191, 1, 0,249,122, 53,118,136, 74,202,187, 62, 52, 52,170, 43,155,135,223,174,170,176,227,244, 77,126, 65,121,117, 8,
- 0,148,178,134,240,107, 70, 83,106, 65, 73,201,150, 94, 81, 81,245, 26, 0, 15, 61, 54,158, 9, 16, 14,239,110,214,254, 86,212,
-186, 75, 82,199,170,107,155,217, 75,191,101, 85,154,184,160,155,101, 69,191,148,169, 43, 2,251,130, 97, 72,133,198, 16, 42,155,
-144,208, 74,254,221,201,107,206,218,140, 92, 46, 39,142, 17, 0,199,104, 76,221,112,187,157,164, 83, 83, 83,145,148,148, 68,234,
- 91, 40,166, 49,163,241,235,147,119, 63,194,222,221,101,178,240,219, 34, 2,222, 70, 21, 50, 50, 50,124, 66,254,235,215,175,167,
- 7, 14, 28, 0,221, 20, 14, 50, 94,133, 79, 62,249, 4,148, 82, 48, 12,131, 21, 43, 86,120, 61,224, 83,165, 82, 25, 35, 34, 34,
-164, 7, 14, 28,216, 53,116,232,208, 17, 54, 93, 75, 61,157,105,100, 67,152,173,191,166, 43,149,202,149,145,145,145,207, 0,168,
-136,140,140,124, 78,169, 84,186,114,212, 12,205,154, 53,171,218,189,123,247, 20,169, 84,186,170,115,231,206,218,164,164,164,170,
-236,236,108,123, 10, 25,219,182,109,131, 72, 36,194,213,171, 87,153, 93,187,118,133,180,104,209,162,120,208,160, 65, 5,231,206,
-157,171, 87, 96, 92,219,142, 26,189,222,144,114,224,192,129, 45,145, 77, 34, 43, 66, 67, 66,174, 67, 40, 52,153,141,140,209,204,
- 51,234, 13,124,181, 54,208, 24,200,191, 94, 86, 46,217,183,123,215,146,174,221, 30, 88,196, 26,116, 94,167,149,249,117,136,134,
-200,100, 50,251, 75,108,102,251,236,183, 77,179,171,137,130, 2,152, 73, 8,105, 1,160,212,206,185,245, 89,232, 54, 82,121, 25,
-214, 1,122, 87,234,200,169,139, 43,182,235, 94, 38,132,124,218,128, 60, 2, 96, 44,128, 5, 46,228,173, 5, 48,155, 16,178,202,
- 69,249, 28, 27, 77, 44,172,227, 29,122,195,154,251,127, 7,192, 9, 66, 72,123, 0,133,142, 54,134, 27,242,158, 4, 48,213, 70,
-178,122, 91, 89,245,182,227, 21,132, 16, 33,128,111, 27,146,103,171,139,103, 0, 76,115,215, 0,144,201,100,203, 1,124,237, 76,
-158, 77,230, 98, 0,193,176,142, 98,221,110, 43,155, 24,214, 65, 45,191, 1,232, 79, 8,153, 1,224,103, 0, 59,156,149, 15,176,
-206,163,119,146,235, 71,221,177, 1,201,201,201, 46,141,129,228,228,100, 41, 51,225,143,188,189,221, 8,176,127,119, 12,231,123,
- 45,111,194,237, 83, 2,221,145,119,250,244,105,180,110,221, 26,175,189,246, 90, 77,155, 89,183,110, 29,205,205,205,197, 99,143,
- 61,118,219,245, 1, 1, 1, 10,177, 88,236, 84, 94,236,233,211,168,108,221, 28, 71, 94,155, 82, 35,239,194, 63,183, 36,182,205,
-173, 82, 48,143,137,111, 43, 75, 81, 62, 11,145,184,225,217, 79,151,138,139,103,161,101,203, 95, 0, 12,160,160, 60, 92, 41,127,
- 77,103, 54,195,108,176, 6,201,206,150,151,227,138,129, 93,199, 39, 68, 3, 66, 76,151,138,139, 51, 1,192,217, 32,192, 22,177,
-157,103, 1, 88,152,127,240,149, 66,113,244, 88, 85, 73,169,184,101,105,241, 49, 49, 4, 17, 29, 10,175, 90, 98,148,165,215, 32,
- 20, 10,154,118,139, 14,124,170, 82, 99,250, 6,192, 53, 23,158, 43, 1,144, 88,119,250,159, 19, 15, 84,234,205,154, 0,245,229,
-255,255, 14,104,236, 84, 61,199,193,128,141,149,183, 97,195,122,154,147,147, 3,146,105, 53,140,247,188, 27,140,225,115, 53, 24,
- 58,116, 40, 60,153,246, 87, 31, 34, 34, 34,164, 0,240,224,131, 15,234,108,245,219, 24,121,170,200,200,200, 73, 0,236,206,169,
- 81,169, 84,238,112,113,143,210,230, 36,114, 0,170,163,163,163,243,158,120,226,137,101,243,231,207,159,110,177, 88,136, 68, 34,
- 65,114,114, 50,126,250,233, 39,112, 28,135,145, 35, 71, 86,191,242,202, 43, 97,189,122,245, 58, 55,118,236,216,254, 0,170, 13,
-134,250,215, 13, 74,127, 49,157,147, 62,252,200,177, 7,186,247,120,250,216,209,163,235, 78,241,249, 41,237,218,180,123, 43, 36,
- 50,170, 66, 16, 37,166,251,119,237,147, 84,168,148,113, 49, 17, 81,111,117,236,216,241,199,160,232,192, 3,159,252, 71,110,113,
-214,127, 61,141, 0,240, 96,157,238, 55, 8,192, 7, 0, 94,178, 17, 79,160, 99,127,130,117,144,216, 37, 0,255,178,165, 4,142,
- 59,145,207,192, 58,200,108, 15,128, 0, 55,202,115, 24,192,112, 56,223,163,128, 1, 16, 5,160, 13,128, 19, 46,100,158,176, 93,
-215, 20,206,115,147, 12, 0, 33,172,211, 54, 38, 3,120,194, 70,220,249, 54,217,249,182,227, 13, 0,190,135,117,198,129, 10,206,
-231,125,218,229, 77,176, 69, 30, 58,219,140, 36,199,114,222, 0, 32, 3,112,222,118,237,119, 46,228,189, 10,235,236, 6,119, 82,
- 25, 1, 0,118, 3, 88,239,162, 62,198, 1,248,208,246,247,148, 67,249, 4,182,186,204, 0,240, 25,128,185,182,223,111, 56,251,
- 15,247,236,217,147, 67, 8, 65, 81, 81,145,194, 62, 19,160,174,215, 95, 84, 84,164,176, 95,235,234, 1, 82, 82, 82,114,178,178,
-178,176,238,103,182,102,228,126, 93, 47,125,221,207,108,205,181,119, 83, 94,110,110, 46,134, 12,169, 61,212, 61, 54, 54, 86,186,
-105,211, 38, 69,187,118,237,164, 28,199, 41,230,205,155, 71,237,211, 0, 9, 33,232,211,167,143, 83,163,162, 83,110, 46,190,141,
-108, 42, 13,113, 56,215,101,198,112,104, 23, 93, 3, 30,110, 10,202, 1,121,243, 4,180,154, 11, 66,133, 62, 4, 42, 18,143,158,
- 67,182, 75, 27,106,246,182, 25, 28,155, 1,108,238,208, 38,166, 19,128,215,140, 22, 14,153,121,133, 24, 18,109, 77,119, 18, 74,
- 53, 26,179,249,131,155, 55,111,222,116,163, 77, 45, 2, 16,152,127,190,226,233,202, 19,155,154,148,221,168, 64,217, 77, 13,248,
-124,101, 96,181,138,162, 82,109,161, 77,163,132, 97,124, 14, 99,244, 70,203,183,115, 95, 27, 20,214,180, 75, 90,165, 11,162,201,
-113, 53,215,191,209, 43,248, 37,109,178,254,205, 30,239,161, 7,124,103,103, 1,144,241, 42, 52, 70,158, 51,143,189,119,239,222,
-247,140, 33, 82, 51,216,209, 78,254,121,102,172, 86, 88,251, 88, 99,201,223, 78,248,124, 62, 63,138,207,231,151, 29, 62,124,248,
-171, 70,120,255, 0,208, 90,169, 84,126,110,139, 2, 76,176,205, 8,152,160, 84, 42,191,107,224,158,141,182, 8, 49,181,233,238,
-234,121,243,230,189,164,213,106, 91,156,206,203, 75,210,235,245,193, 10,197, 62, 34, 18,139,192, 16, 6,251,246,237, 19,116,237,
-218,245, 84,106,106,234, 72, 0,213, 99,198,140,193,135, 31,126,232, 84,184, 98,239, 79,220,168, 49,163,246,247,236, 25, 63,139,
- 53, 27, 31,189,148,127,113, 30, 87, 88, 96, 6, 64,197, 96, 76,221, 59,116,202,104,218, 52,106, 39,143, 47,252,230,195,119, 23,
- 52,106, 80,121,125, 6,192,107, 54, 11,231, 49, 0,231, 0, 4,213,115,223, 78,155,199,158, 2,235,146,136,147,157,200,231, 1,
-136,179,189, 48,119, 12, 0,165,237,122, 94, 3,242, 18, 1, 92,116, 83,222, 69,219,245, 91, 26,144,151, 14,224, 89, 0,103, 96,
-157,161,112,165,142,108,133,205,251,159,110,243,134,215, 0, 78, 71, 92,240,108, 30,251,100, 0,189,108, 81,132,250,202,169,182,
-253,190,194,102, 4,172,105, 64,222, 90, 91, 67,115,231,121,169,237,250,134,222,223,199,182,200,198, 30,155, 81,131, 58,178,127,
- 2,208,213, 86, 23,249, 54, 67,170,149,171, 14,105, 91,160, 67, 81,223, 66, 64,158, 90,233,114,185,156, 60, 43,147,209,103, 63,
-211,214,179,112,143,202, 99,130,240,149,188,151, 95,126,249,182,107,134, 14, 29,154, 51,116,232, 80, 2, 0,195,134, 13,243, 72,
- 9,237,124,249,101, 18, 82, 55, 77,209, 38, 40, 71,178,172, 11, 1,128,110,114, 1,177, 6,101,236, 35,179,175,186,217, 12,108,
-245, 98,161,133,224, 3,188,106,212,144,191,205, 69,190, 41, 22,139,221, 85, 28, 4,192,251, 7,179, 79, 5, 68,183,108,243, 56,
-135,128,184,226,162, 82,158,201, 80, 73,155, 53, 13, 34, 65,129, 2, 98, 54,113, 80, 85,178,102, 34, 33,146, 42,141,185, 67, 83,
-231, 14, 65,189,100, 81,247,251,159,185,124,239,157,158, 5,208, 88,121,206, 60,246,118,237,218,221, 51,228,207,125, 23,142, 61,
-121,214, 49,121,107, 20, 44,190, 61,204,130, 82,234,147,122,181,235, 17,139,197,162, 4,128,132,132,132, 70, 45, 8,100, 39,127,
- 27,110,217,254,186,234, 27, 51, 28,244,169, 9, 64, 49, 0, 44, 93,186,116,220,148,231,166, 36,247,237,221,103,140, 70,173,142,
- 50, 91,204,134,232,232,232,146,152,152,152, 2,181, 90,189,245,252,249,243,183,222,122,235, 45,183,202,181,125,235,118, 14,192,
-198,103,158,254, 71,238,160,193,131,191,151, 72, 36,161, 4,148, 35,132,128,227,104,149, 94,171, 82, 92,200, 43,210, 4, 8, 5,
-141, 10,111,213, 53, 0, 44, 0,158,107,128, 64, 28,113,204,246,177,216, 62,245,193, 2,235,136,122,158,155,229, 81, 0,200,118,
- 33,111, 27,172,131,214,220,193,211,110,148,111, 37,128,175, 92,200,249, 29,214, 41,144,112, 67,222,215,182,136,129, 43, 20,218,
- 60,123,119,202,199,243,160, 78, 87,186,144,247,176, 27,242,236,209,134, 53,182,119, 99,113,167, 99, 14, 31, 62, 60,209, 78,248,
-142, 33,120,111,150, 2,150,203,229, 36, 51, 51, 51,145,153,224,155,165,123,125, 45,239,126, 64, 65,241,117, 99, 92,171, 86,107,
-166, 45, 90,241,172,253, 28, 43, 96,214, 27,116,220,238,210,162, 34,141, 91,141,105,229, 74,122,235,196,106,178,224,187,223,102,
-237, 88, 54,108,235,145,163, 55, 94,136, 10,229, 70, 49, 17, 33, 97,148, 2,132, 80,163,209,204,149,114,192, 45,214,200,133,149,
-220,208,179,113, 30,148, 49, 53, 53, 85,234,152, 14, 72, 77, 77,149,222, 43,239,239, 94, 92, 9,240,126,193, 35,115, 53,119,244,
- 25,109,211,190,155,139,197,226, 27, 9, 9, 9, 15,251, 66,166, 82,169,220, 27, 25, 25,249,172, 82,169, 92,227,230, 45, 60, 88,
-211, 0, 53,250,116,213,234, 85, 89, 0,178,124,245,156, 95,127,243,101, 33,106,167,159,125,138,250, 12, 0,111, 54, 53,112,102,
-133,112,176,142,216,244,203,251,107,202,171, 5, 27,209,251,172,163,167,164,164,228,184,154,151,255,103,202,187, 31, 80,161,211,
- 77, 1, 2, 76, 0,162, 56,208, 18,131,129,221, 80, 90, 90,254,171, 39,211,166,154,244,126,142,110,251,100, 4,185, 25,248,100,
-110,203,193,200,205, 94,245,241,107, 17, 17,162,217,124, 30,161, 55,148,134, 11, 55, 88,243, 58,137,128, 17, 75,248, 60,158,201,
-204,137, 61, 41,159, 61,199,111, 31,120,230,237, 62, 0,183, 77,253,115, 8,253,123,179,216, 76, 93,207,220,157,243,119, 91,222,
- 29, 52,124, 26,117, 63, 51, 65, 5, 66, 8, 70,141,254, 99, 64,244,206, 93, 39,107,116,200,200, 17, 9, 62,121, 86, 74,105, 41,
-124,188, 14,191, 7,228, 15, 88,151,159,231,112,135,150, 2,190, 27,224,215,169,120,234,174,178,175,139,250, 70,177,251,229,253,
-181,229,249,113,239, 67,169, 84, 82, 88,211, 92,141,194,205,192, 49, 20, 0, 14,174, 95, 74,146,166,188,254,201,228,244,188,207,
- 94,154,120,184, 43,171, 37,109, 35, 4,252, 38, 32, 68, 23, 36,225,151, 63,208, 57, 36,223, 83,217, 73, 73, 73, 36, 35, 35,195,
-235,157, 0,239, 20,121,222, 47, 17,128,187,185,145,143,123,207,104,141, 13,253, 13,186, 87, 40,172, 27, 2,137,112,159,238, 6,
- 72,122,245,234,245,247, 24, 34,235,135, 31,126,128,207, 3, 2, 68, 4, 28,103,213,209,213,122,127,247,247,195,143,191,173, 62,
-240,191, 2, 63,252,248,251,192,108, 1,212, 58, 59,233,251,201,223, 15, 63,254,206, 96,252,175,192, 15, 63,252,240,195, 15, 63,
-252, 6,128, 31,126,248,225,135, 31,126,248,225, 55, 0,252,240,195, 15, 63,252,240,195,143,191, 34,106,141, 1,152, 54,109,154,
-215, 35, 55,235, 91, 91,187, 62,121, 63,124,247,191,196, 7,122,116, 80, 52,111, 25, 35,213,232,181,138,253,138, 92,105,202,132,
- 23,115,188,149,183,108,213,230,196, 94, 61,250, 43,110,150,148, 32, 80, 18,136,107,197, 5,210,231,167,140,246, 90,158,175,159,
-247,204,254,105,137, 3,250,183, 83, 72, 2,121,224,243, 24, 16, 49,193, 13,245, 43,196, 91,121, 39,111,246, 72,236,219,191,175,
- 34, 52,136, 7,240,129,138,211, 43,137,187,229,139,123, 36,206,235,231,189,248,211,197,219,228,245,235,215,207,107,121, 71,143,
- 30,189, 93, 94,156,247,229, 59,122,241,246,242,245,239,216,209,107,121, 71,242,243,239, 59,121,143, 52, 80,191, 11, 22,100,208,
-217,179, 83,157,254,254, 83, 61,245, 27,247,232, 35,222,183,151,221, 63,221,222,158, 31,241,190,189, 44,200, 82,210, 16,174,160,
-214,185, 38,113, 79,122, 45,239,214,197,111,111, 43,223,169,183,175,122,173, 72,227,231,181,185,237,220, 39, 77, 74,188,150,247,
-218,173, 24,252, 25,250,234, 94,146,119,234,212, 41,175,229,197,199,199,123, 37,143, 16,194,175,111,138,172,183,242,124, 93, 62,
- 79,228,121,108, 0, 56,131, 97,163, 44, 14, 64, 59, 88,215, 9, 40, 16, 79,148, 95,113,247, 63,216,252,245,130, 68, 2, 14, 81,
- 97, 17,200,221,127, 82,177,118,237, 82, 12, 74, 26, 4,179, 86,167,232,218,121, 40, 56, 14,138,223,219,174,149,198,199,247,192,
-165, 75, 87, 81, 85,169, 69,247,129,147,114,156,201, 91,249,141, 34,145,130,160, 77,135,118, 10,217,235,115,161,252,239,102,124,
-253,191, 47, 0,136,177,243,215, 98, 48, 12, 20, 75,223,127, 23,249,249, 23, 16, 27,219, 6, 34, 9, 31,215,139,243,157, 46, 46,
-114,121,203, 23, 84, 40, 20, 66, 34,145,160,160,160, 0, 45,154,134,160, 9, 63, 8, 45, 90,135, 33, 92, 18,138, 64, 98, 1,195,
- 48,160,156, 5, 58, 17, 31, 85, 55,171, 80,214,199,245, 92,242,170,130,207,105,176,164, 10, 3,251,182, 71, 80, 32, 31, 66, 9,
- 3, 62, 15, 96,132,124,116,138,249, 31, 53, 81, 30, 46, 95,159,226,118,133, 47,219,101, 72,140,137,137,193,160, 7, 91, 42,244,
- 6, 35, 24,145, 4, 48, 1,121,213, 9,137,122,157, 22,253,155, 94,200,249,179,172,200,149, 43, 87,210,244,244,244,191,213,252,
-250,123, 21,174,136,190,145,215, 7, 2,232,219, 76, 18,240, 97, 73, 73, 73,103,129, 88, 4, 46, 32,224, 35, 88, 87,198,172,190,
- 87,222, 65,193,239,187, 18,175,156,221,127,219, 94, 3, 73,169, 31,253, 85,218, 40,249,122,221,186,243, 34,161, 80,194,113, 92,
-104, 96, 80, 80,208,227,163, 70, 5,192, 58, 31,253, 94, 29,217,105,143, 54,115,141,126,120, 66, 66, 66, 67, 67,103,118,234,212,
-105,172, 72, 36,106, 89, 92, 92, 92, 92, 82, 82,114,148,101,217,121,148,210, 2, 47,228,133,133,135,135,207, 29, 54,108,216,136,
- 23, 95,124, 49,182, 95,191,126, 55,207,156, 57,115,216, 96, 48,204,161,148,158,249,219, 68, 0,156,144, 63, 47, 80,196,239,251,
-204,224,246,139, 57, 74, 13, 7, 47,220,252,239,185,141,178, 61,226,137,242,179,174,238, 77, 29,213,129,142, 26,182, 0,166,234,
- 74,240, 45, 12,126, 59,123, 1,105,105,175,252,209, 34, 24,224,151,220, 53,104,210, 58, 70,193, 85,171,193,114, 4,251,246,229,
- 74,139,245,245,203,147,201,230, 81, 8, 67, 65, 2, 66,112,242,108, 17,126, 61,251, 28, 86,125,251, 83,205,239, 28, 7, 60, 58,
-112, 32, 80, 93, 10, 32, 24, 5,103,206, 65,208, 36, 12,131, 6, 60,160,168,212, 53, 96,179, 16, 6, 32, 12,122,245, 72, 64,179,
- 64, 33, 90, 52, 17, 35, 36, 50, 2,225,162, 96,132,139,121, 16,240,120, 48, 89, 44,168, 52,115, 56,118,235,132,203,151, 90,250,
-235, 92, 26, 17, 10,132, 4, 4, 32,170, 73, 36, 66, 66, 2, 64, 25, 11,204, 92, 53, 44,176, 32, 40, 40, 0, 77,154,181, 68,187,
-184,159,105,246,254,193, 13, 42,165, 21, 89, 44, 13, 13, 14, 68,187,182, 77, 17,213, 36, 18, 90,173, 22, 66,145, 24, 2,131,117,
-113,190,182,177,109, 20, 21,170, 74,124,151, 91, 40, 45, 42,190, 14, 85,233, 85,204,123, 49,161, 65, 99, 32, 99, 65,134,219, 74,
- 34,233,217, 36,105,120,116,120, 78, 67,228,127, 55,140,128,183, 23, 45,162, 0, 48,239,159,255,244,201,255,241,214,194,133, 20,
- 0,230,207,154,229,181,188, 31, 15, 29, 74, 99, 89,118, 13, 0,140,149, 74, 25,111,148,175,124,211, 38,106, 83, 66, 53,231, 40,
-165, 32,132,212,252,181,159,179, 95,151,158,234,156,176,103,207, 78, 37,238,146,186,135,228,223, 53,208,100,222, 28, 28, 22,218,
- 25, 0,132, 18, 49, 88,189, 1,156, 86,183,240,240,129,253,239, 63, 52,110, 92, 23, 0, 69,174,132, 24,121, 66, 10,235,220,105,
-179,141, 20, 56,155, 30,170, 87, 23,245,124,104, 4,206,239,219,230, 81, 29, 93, 57,187, 95,209,225,129, 68,105,108,151, 71, 61,
- 55,138, 83, 43, 60,186,124,252,248,241,216,148,154,221,224, 53,210,236,218, 91,145,116, 13,179, 62,106,153,129,131,222,108,173,
- 87,173,237,175,188,127, 24, 58, 6, 11, 26,148,183,120,241,226,156,183, 95,125,163,233,232,177, 99,130, 12, 6, 61,150,126,242,
- 49,179,108,217, 50,195,140, 25, 51, 98, 0, 92,247,117,223,219,189,123,119,210,214,173, 91,179, 0,207,214, 44,200,205,205,165,
-133,133,133, 80, 42,149,208,104, 52, 8, 14, 14, 70,100,100, 36, 98, 99, 99, 49,112,224, 64,175,250, 29, 33,100,104, 66, 66,194,
-186,215, 95,127,253, 82,167, 78,157,214,196,199,199,159,187,121,243,102,203,220,220,220,132, 41, 83,166,236, 32,132, 44,164,148,
-122,178, 85,189,116,236,216,177, 25, 11, 22, 44,136, 52,153, 76,144, 72, 36, 8, 12, 12,108,174,213,106,199,141, 30, 61,250,113,
- 66,200, 12, 74,233,255,238, 71,114, 63,125,250,116,173,227,250, 54,116,227, 59, 33,253, 86, 0,218,195,186,196,161, 69,107, 52,
- 95,203,189, 88,246,233,192,184,166,175, 12,235,218,252,253,102,161,146, 22,138,141,178,141, 0, 46,136, 39,202,157,110, 82, 99,
-172,174, 64,179, 14, 15, 99,238, 63,199, 98,141,252,143,190,184,255,240, 10,104,117, 70,140, 76,122, 5, 15, 14,122, 22, 79,142,
- 31, 6,137, 68, 4,214, 98,134, 70,199, 42, 58, 14,232,224,164,113, 92, 5, 88, 96,236,164,229,120,254,245, 23,106,206, 62,250,
- 96, 34,196, 98, 17,190,223,247, 19,118, 30,202,197,186,213, 95,192,160, 55, 66,200,227, 35, 40, 64, 8,173,178, 88, 90, 89,140,
-122,119, 31,163,148, 2,148,179,126, 24, 14,148, 82, 24, 89, 81,205,242, 14,148,181,192,194, 3, 44,176,192,194,114, 48, 91, 26,
- 54, 96, 11,142,206,167, 45,163, 40, 66,130, 3, 17,211,178, 45, 58,119,239,128,224, 32, 9,170,170,203, 81, 90, 94, 10, 85,213,
- 77,152, 12, 4, 1, 1, 1,136,138, 26,132,113, 99,206,208,205, 91, 59,213, 31,198, 95,127,141, 90,130,131,161,231, 3, 66,177,
- 16,122,157, 16,172, 78, 8,131, 88, 4, 62, 49,131,130, 7,131,190, 26,122,157, 6, 45, 91,182, 80, 8,121,124, 84, 64,141, 79,
- 63, 61, 0,145,168,225,198,177,104,221, 34,151, 13,232,159,147,255,217,224,239, 42,149,138,214, 57,238, 29, 17, 17,145, 79, 8,
- 49, 80, 74,249,225,225,225, 1, 5, 5, 5,145, 25, 25, 25, 57,233,233,233, 45,188,109,200,194,232,232,137, 53,255, 7,144, 24,
- 14,248, 44,218,177, 50, 35,131, 78,159, 62, 93,106, 42, 43,243, 72,230,143,135, 14,201,250,245,235, 55,111,112,175, 94, 48,137,
- 68, 88,178,100, 9, 55,110,216,176,100, 74,105,182,135, 10, 13,139,223,127,191,230,120,230,123,239, 97,201,156, 57, 13, 30,187,
- 66, 93, 35, 96,193,130, 12,218,187,119,111,100,103, 95,166, 73, 73,237,186, 1,184,188, 96, 65,134,222, 67,242,207,237,222,173,
- 91,136,189,207, 4,138, 37,184, 81, 94, 6,181,170, 18, 9,253,250, 7,252,184,106,117,246, 99, 83,158,235, 6,235,218,232, 13,
-193,252,242,188,101,252,167,199, 61,206,143,139,141,229,236,158,225,123, 75, 62,171,117,209,156,153, 47, 89, 13,191, 87,103, 72,
- 39,143, 74,246,184, 94,189, 34,255, 26, 11, 57,194,131,139, 61,219, 49, 47,144, 79,240,235,156,169, 32, 33, 77, 96,185,252, 43,
-140,151,127, 71,126,133, 22,125,118,149,185,117,255, 10,185,252,224,235,178,233,109, 38,255, 99, 74, 88,198,250,111,185,216,216,
- 88,102,238,130,133, 8,126,127, 46,190,255,254,251,146, 39,158,120,194, 43, 67,212, 9,241, 39,111,221,186,117,143,253,120,204,
-152, 49,195,221,185, 79,163,209, 36,238,217,179, 71, 97, 50,153,208,190,125,123, 12, 25, 50, 4,161,161,161,168,172,172,196,245,
-235,215,113,229,202, 21, 92,191,126,157, 14, 31, 62, 92, 26, 28, 28,156,227, 65, 95, 25, 51,108,216,176,165,139, 23, 47,222, 24,
- 31, 31,191,212,110,236,180,104,209, 2,227,198,141, 35, 41, 41, 41, 65, 0,114, 9, 33,185,206,118, 47,173, 43,111,198,140, 25,
-153,211,167, 79,103, 78,156, 56, 1, 66, 8, 34, 35, 35,107, 62,187,118,237, 18, 14, 24, 48,224, 11, 66,200, 17,119,228,221,203,
-228,111, 63, 87,247, 57,248,245,144,127,100,159,182,145,147,123,181,137,152, 68, 8, 17, 80, 74, 77,156,245,195, 90, 76, 6,189,
-144,225, 90,116,111, 38,254,103,147,144,246, 29,182, 30,187,242,173, 97,163,236,160,120,162,252, 70, 3,234, 27, 93,187,116, 2,
-195,228, 32,191, 82, 9,224, 28,170, 74, 46, 66, 32, 22, 97,219,142,255, 66,119,203,130, 73,207,189, 6,142, 3, 70, 61, 62, 16,
- 22,126,144,203,135,203,207, 63, 7,142, 3, 70,246, 36, 0, 90, 0,104, 3,131,145, 69,202,163,195, 33, 14, 99,176,110,195,110,
- 48, 12,144,249,237, 26,148, 92,254, 93,250, 68, 98, 92,206,133, 83,245,203,226, 40,192,113, 28, 56,142,131,197, 98,129, 81, 64,
- 97, 34, 38,176, 44, 11, 93,128, 1,224,196, 96,168, 5, 22, 33, 69, 53,107,128, 86, 93,213, 96,217,162,130,140,224,243, 37,136,
-140,140, 68,135, 14, 29, 16,221,172, 63,192, 99, 96,177,156, 0, 67, 43, 97,208,154, 97,225,180, 40,189, 94,129,168,200, 91,136,
- 12, 27, 4,149,230,173,196,250, 54,121,145, 24,204,160,198, 91,128, 65, 4,150, 49, 65, 43,228,163, 90, 34, 0, 95, 32, 4,184,
- 64, 16, 30, 65,181, 86, 7, 85,233, 85, 20,156, 56,132,138,162, 34,112, 28, 7,134,242,188,106, 52,171,150,255, 97, 56, 79,153,
- 54,197,181,158,180,109, 27,106,111, 58, 25, 25, 25,179, 95,127,253,245, 23,138,138,138, 24, 66, 72,148, 92, 46,255, 22,214,205,
-157, 2, 26,209,150, 5,159,127,254,249,134,155, 55,111, 34, 51, 51, 19,125, 58,117,226,133,119,239,222,232, 14, 50,127,214, 44,
-162, 2, 18, 41,165,138,101,203,150, 41, 0, 64, 54,126,188,219, 94, 9,203,178, 43, 6,219, 58,147, 80, 40, 68,199,142, 29,177,
-121,223,190, 44, 91, 52,192,109, 57,119,106,171,218,217,179, 83, 73,118,246,101,122,226,132, 53, 98,229,240,247,247,135, 30,122,
-168,100,246,236,212, 80,119, 57, 43,208,100,222,220,189, 91,183, 16, 30,195,224,197,167, 39, 65,111, 48, 98,201, 87, 95, 33, 64,
- 34,129,193, 96,128, 65,175, 71,207,248, 94,113, 63,173, 95, 63,253,145, 73,147, 62,117, 21,117,156, 51,243, 37, 14, 0,115,177,
-176,144,169, 75,248,117,187,167, 55,207,222,170,243, 80,105,118,198,155, 52,121,212, 84, 41, 21,197,121,101, 8, 56,238,218, 71,
- 55,133,187, 60,239,210,130, 10,227,227,106,181, 5,251,147,163, 32,120, 69, 14,245,164,182,224,135, 55,245,136,252,247,238,221,
- 91, 26,219,188,197,245,127,188,248, 66,171, 55, 95,155,133,101,171, 87,156,237,151,144,208,110,197,103, 43, 2, 94,157,245, 6,
-214, 15,236,143, 13, 27, 54, 60,243,212, 83, 79,173,107, 36,241, 39,110,221,186,181,198, 97,146,203,229, 5,176,110,235,190,215,
-157,251,247,236,217,163,136,138,138, 66,124,124,188,153, 97, 24,190, 53, 58,203, 65, 32, 16, 32, 34, 34, 2,205,154, 53,195,149,
- 43, 87,176,103,207, 30,197,184,113,227,220,234, 43,132,144,212,199, 30,123,236,227,197,139, 23,127,214,169, 83,167,229,132, 16,
- 14,192, 23, 0, 30, 1,112, 0,192, 28, 74,105, 33, 33,228, 13, 0,115,220,145,183,120,198,140,239, 6,167,166,146,237,219,183,
-131,207,231, 67,161, 80,224,215, 95,127, 69,135, 14, 29,240,193, 7, 31,224,129, 7, 30,192, 11, 47,188,192,127,231,157,119, 22,
-223,143,228,159, 62,251,163, 63, 28,157, 5,111,214,107, 4,212, 55, 11,128,225,243, 24,190,153,163, 26,189,201,124,157, 16, 34,
- 10, 18,241,122,132, 8,209, 71,210,237,161,246,144, 62, 15,116, 30,130,230,129,116,204, 51,131,218,190, 25, 17, 18,144,108,216,
- 40,107, 64,153,112,224,241,236,132, 20, 2,160, 37, 66, 99, 30,131,222, 98,192,114,249,106,124,189, 33, 19,195,165,131, 0, 0,
- 58, 29,192,227, 59, 23, 37, 9,232, 4, 0,176, 88, 28,247,166, 41, 5,144, 11,134, 39,194,228,180,169, 72, 25, 63, 30, 63,238,
-176, 18, 89, 64, 32,160,173,190,209,224,203, 50,129, 87, 67,254, 38,179, 5, 70,181, 9,186, 74, 29, 42, 77, 44, 42,116, 44, 84,
- 70, 13, 42, 53,213, 80,149,105, 80, 81,105, 64, 69,181,243, 37,212,127, 85, 44,160,132, 16,240,120, 4,132, 17,193, 98,161, 48,
-235,138,160,173,188,136,146,210, 42, 84,168,170, 81,165,177,160, 66,101, 64,113,113, 41,206,158, 63,141,202,170,211,232,159,208,
-219,233,222,232, 60, 0,140,198, 0,253,165,235, 80,254,118, 14,202,162,171, 80, 87, 85, 64, 93, 85,129,171,103, 79,224,112,198,
- 42,228,110, 90,135,242, 75,151, 96, 97, 57,235,194,216,188,187,147, 6, 76, 79, 79, 39,182,176, 63,155,146,146,210,101,238,220,
-185,175, 55,111,222, 92,155,153,153,217, 35, 35, 35,227, 7, 0,241,182, 74,247,122,193, 41, 97,116,244, 76, 0, 24,240,192, 3,
-152, 62,125,122,217,177,243,231,179, 79,157, 57,147,232,139,242,135, 3, 57,178,241,227,201,140, 25, 51,164, 0, 32,104,218,212,
- 35,185, 38, 91,152,101,243,230,205,104,218,180, 41,222,156, 49, 3, 51,103,206,196, 22,133,226,158,200,195,218, 73, 95, 46,151,
-215,124, 0, 96,255,254,253, 49, 0, 30,119, 83, 76,223,176,240,240,206, 60,134,193,115, 41, 41,168,172, 82,163,248,198,117, 8,
- 4,124,240,249,214,143, 64, 32,128, 72, 18,128,246,177,177,159, 92, 58,126,194,173,205,124, 46, 22, 22,226,155,205, 63,212,124,
-236,120,111,201,103,120,111,201,103,216,169,216,239,197, 19,107, 18, 1,160, 83,247,145, 57, 73,163,166, 74,179,182,127,165,200,
-206,120,243,158,168,139,188,181,159,162,236,249, 4, 60,148, 85,142,174, 97,124,240, 66, 34, 96, 86,149,161,207,174, 50, 4,242,
-173, 28,200,115, 49, 39,235,202,165, 75,202,149,242,255,117, 90,251,191,181,248,239, 87, 95, 92,253, 98,241,199,239,189,254,210,
-203,143,207,157, 55, 23,146,224, 64, 12, 25, 48, 8,199,142, 30, 91,123,240,208, 65,175,159,185, 46,249,111,223,190, 29,125,251,
-246,109, 15, 96,146,187, 97,127,147,201,132,132,132, 4,206, 98,177,240,171,170,170, 96, 52, 26, 97, 52, 26,113,254,252,121, 40,
- 20, 10, 28, 58,116, 8,205,155, 55,135,201,100, 66,110,110,174,203,178, 18, 66, 38,142, 31, 63,254,211,177, 99,199,134, 44, 95,
-190, 60,132, 16, 34, 4,176, 31, 64, 21,128, 4, 0, 63, 0,176, 27,158,123, 1, 60,224, 74,222,214,215, 95,255,238,241,158, 61,
-201,250,148, 20,148,156, 58,133,143, 63,254,152,251,241,199, 31,255,115,237,218,181,166, 10,133,226,249,217,179,103,195,100, 50,
- 97,208,160, 65, 8, 12, 12, 28,136,251, 28,142,198, 64, 45,178,175,123, 66, 60, 81, 94,254,203,165,242, 21,107, 14, 92,122,237,
-124, 73,213, 30, 6,148, 15, 80,224,177, 15,240, 75,239,143,241,161, 42, 5,251,186, 45, 4, 30,121, 11,193, 2, 46,254,209, 94,
-177,147,108,233,130,219,176,125, 95, 5, 1,212, 24,157,246, 10, 56, 14, 0, 42, 0, 4, 3, 48,161, 77,167, 4,136, 69,124, 88,
-204, 70, 80,214, 74,170,193,193,193, 80, 86,168,156, 62,196,167,159,188, 78, 0,224,236, 47, 95,129, 97,106, 59, 9,156,254,119,
- 24,140, 38,240, 4, 98, 16,161, 53,135,166, 81,171, 49,112, 96,195,117,199,231, 88,112, 28, 7,179,217, 12,163,209,136,106,206,
-140, 42,214, 4,245, 13, 53,170,174, 87, 65, 93, 90,129, 10,117, 37, 74, 13, 58,168,181,149,168, 52, 58, 31,235, 20, 28,164,133,
-217,204,193,200, 90, 80, 89,165, 70,254,165, 34, 28, 61,145,135, 95,142,230,225,220,249, 2, 20, 95,187,133,106, 45, 11, 77,181,
- 17, 55, 74,170,112,230,247, 43,200,205, 61,133,226, 27,165, 78,101, 58,154, 58,230, 42, 45,138, 79,159,195,111,187,246, 33,107,
-245, 39,216,183,113, 53,138, 11, 46,129,163, 38,112,132,212, 16,191, 39,201, 53, 87, 97,126, 87,224,243,249, 0,112, 19,192,205,
-240,240,240,226,224,224, 96,227,236,217,179,143,193, 58, 96,140,129,117,141,236,124,111,229,127,254,249,231,243, 83, 82, 82, 0,
- 0,109,163,162,154,218,114,226, 60, 95,118, 14,123,248,223, 30, 9,112, 35,252,159, 4, 0, 75,150, 44,193,197, 27, 55, 48,118,
-248,112,216,163, 1,121,121,121, 0, 96, 55, 2,220,170,138,153,239,189,135, 55,222,127,191, 38,188,111,255,110, 63,182,127,119,
- 39,252,111, 71,118,246,101,251,214,186,181,206,219,143,179,179, 47,127,227,142,156, 48, 62,255, 67, 3,107, 4,143,199,195,249,
-203, 5,184, 92,124, 13, 71, 78,255, 10,150, 53,129, 1, 1,159,207, 7, 33, 4,156,197, 2,189, 86,135,188,253, 57,251,220, 16,
-203, 56,146,254,211,227, 30,191,205,227, 63,114, 50, 15,142, 17, 2,247,224, 16, 78, 22,197,229,216, 7,253,101,103,188, 73, 5,
-230,139,137,127,170, 6,174,184, 1, 97,235,142, 40,155,254, 32,242,214,126, 10,126,147,230, 53, 63,149, 77,127, 16, 77,196, 12,
- 66,248, 13, 55,151, 78,113,157, 90, 4, 4, 4, 6,252,247,203,207, 13,210,135, 30, 18,246, 31, 56, 96,253,149, 75, 87,184,243,
-151,242, 1,142, 66, 44, 18, 97, 80,239, 65,216,177,125, 7,182,110,221,234,145, 17,176,123,247,238, 68,153, 76, 70,237,228,191,
-103,207, 30,172, 88,177,130, 5,128,163, 71,143,178, 50,153,236, 41,119, 82, 11,133,133,133,246,173,137,153,194,194, 66,100,101,
-101, 33, 47, 47, 15, 90,173, 22, 42,149, 10,199,143, 31, 71, 81, 81, 17,174, 93,187,134, 54,109,218,160,176,176,176, 65,121, 60,
- 30,111,242,147, 79, 62,185, 40, 49, 49, 49,232,216,177, 99, 33, 58,157,238, 31, 18,137, 36, 7,192,103,148,210,183, 40,165, 85,
- 54, 3,160, 47, 33, 68, 72, 41, 53,161,129,233,237, 66,161,112,242,247, 51,103,174, 31,212,180, 41, 49,207,154,133,129, 44,139,
- 99,219,183,211,146,146,146,169,148,210,247, 40,165,229, 0,214,156, 61,123,214,108, 54,155, 17, 20, 20,132,152,152,152, 32,147,
-201,132,191, 34,234, 75, 1, 68, 3,104, 63,166, 79,235, 23, 91, 69, 6, 78,130, 73, 15,116, 74,198,201,168, 49, 24, 54, 99, 21,
-244,183, 42,193, 11, 9,134, 98,233,100, 12,233,250, 11, 34,242,178,134, 2,104,237,236, 63,232, 16,210, 18,191,229,109,113,176,
- 55,180,176,166, 9, 77,128,201, 8, 62,199, 3, 99,235,247, 91,191,183,166,155, 6,141, 24,239,188,161,158,161,120, 52,222,209,
-192, 35,182,199, 16, 0, 2, 49,204,196, 2,155, 31,140, 9,147, 94, 6, 0,197,213,195, 43,157,246, 44, 11, 71, 97,230, 24, 48,
-102, 51, 24,214, 8,157,205,178,208,243,120, 8, 52,235,161,214, 83, 16, 1,129,197, 98,129,206, 2,148,105, 89, 56, 75,102,155,
- 89, 14, 6, 1, 15,156,206, 12, 51, 87, 5, 77,181, 9, 60, 34,128,209,108, 2, 75, 89,152, 77, 44, 32,228,192, 16,128,136, 56,
- 84,233, 45, 40, 45,215, 65,107, 52,215,235, 36, 51,196, 82, 99, 0, 16,242, 7,159,152, 12,122, 84, 85, 84,128, 33, 60,240,249,
- 20,160,124,240,136,247,137,191, 11, 87, 47,176,157,218,116, 18,186, 19,246,175, 99, 73, 67, 34,145, 0,128, 30, 0,203,231,243,
-113,249,242,101, 44, 88,176,224,113, 0,215,102,207,158, 29, 31, 26, 26, 26, 86, 85, 85,117,181,178,178,210,227,112,183, 48, 58,
-122, 10, 0, 52,107,214,172,230,220,140, 25, 51, 42, 63,251,236,179,108, 0, 73,241,221,187,239,245, 85, 71,152, 49, 99,134,212,
- 29, 3,224,199, 67,135, 18,251,245,235, 23, 51,184, 87, 47,144,224, 96, 44, 88,176, 0,179,102,205,130, 64, 32,128, 73,165, 66,
-104,104, 40,222,156, 49,163,102, 92,128, 59,131, 3,235,230,248, 93,141, 9,112,134, 5, 30, 12,238, 60,113,226, 4, 78,156, 56,
- 81,115,189,179, 28,167,170,162,162,115, 80,112, 48,110,169, 84, 80, 28, 57, 2, 62,195,131,209,100,130, 78,175, 7,199,113, 53,
-131, 21,205, 38, 22,172,209,232, 78, 29,115, 0, 24, 91, 26,128,115,104,248, 6,219,121,188,183,228, 51, 33, 0,196,197,198,150,
- 93, 57,251, 91,163,234, 53, 41,245, 35,114,254,100,102,226,174,173, 95, 41,124, 49, 11,192,147,176,127,173,176,236,166,255,161,
- 87,218,107, 16,181,237, 97,213, 21,183,110, 32,191, 66,107,181, 85, 6, 62,134, 34,139, 25, 1,203,142, 52, 40, 67,173, 86,135,
-137, 36, 98,116,104,219, 86,124,165,248, 90,115,101,185, 18, 19,158,158,164,216,185, 55, 11, 75, 63, 90,146,185,117,231,246,148,
-184,182,113,152, 60,238, 25,228,158, 60,132,173,155, 55,211, 49,110,132,216, 29,189,254, 61,123,246, 32, 57, 57,217,110, 44, 10,
-175, 95,191,142, 23, 94,120, 65,104,127,124, 87,178,148, 74, 37,167,125, 17,183, 0, 0, 32, 0, 73, 68, 65, 84,134, 12, 25, 2,
-139,197,130,194,194, 66, 28, 58,116, 8, 93,187,118, 69,104,104, 40, 90,181,106,133, 94,189,122,129, 97, 24, 48, 12,131,230,205,
-155,215, 68,169,156,232,151,174, 61,122,244,248,116,224,192,129,188,188,188,188, 16,139,197, 82,186,121,243,102,181, 94,175, 95,
- 64, 41,117, 52, 96, 95, 28, 49, 98, 68,209,206,157, 59,219, 18, 66,110,192,201,198, 60,132,144,248, 25, 82,233,154,254,124, 62,
- 41,159, 55, 15,212,100,130,130,199,227,114,117,186,103, 41,165, 95, 59, 92, 58,237,221,119,223,229, 51, 12,131,138,138, 10, 92,
-190,124,185,236,129, 7, 30,104,250,151, 55, 0, 12, 27,101,113,209,161,146,193, 35,122,198,188, 16, 34, 17,244, 51, 91, 56, 21,
-159, 90, 66, 16,214,156,119,163,210, 0,253,173, 42, 64,200,135,165, 82,131, 98, 21, 11, 68,182, 6,195,177,226,134, 66,188,151,
-212,106,116, 12, 11,129,217, 8, 92,202,249, 6, 29, 18, 31,169,113,224, 76,172, 9, 2, 48,168, 54, 88,119,168,125, 52, 49, 1,
-146,200,152, 6, 11,252,104,119,130,157,191, 82, 8,196,128,176,245, 35, 96,139, 14,214, 56, 14, 2,161, 8, 38, 24, 16, 36,177,
-238, 72,186,125,231, 70,252,118, 52, 71, 58,105,120,111,231,218,136,227, 32,100,245, 48, 65, 8,134, 49, 3, 6,171, 98, 51,153,
- 76, 48, 26, 4,224,241, 5,128, 1,160,156, 53, 69,208, 38,182,173, 83, 89, 58, 3, 7, 30,143,192,100, 54,193, 96,228,160,214,
- 88,219,161,137,163, 96,141, 28,192, 7,120, 2, 30,248, 98,128,232, 45,224,136, 25, 28,244,208,232,109, 1,105, 23,176, 0, 96,
- 56,128, 18,128, 97, 56, 16,194, 3, 71, 9, 24,198, 54,150,138, 99,192, 49, 12, 8,231,158,131,236,224,253, 11,189,109, 64, 1,
- 1, 1,176,121,251, 81,151, 47, 95, 46, 91,176, 96,129, 20,192, 19,179,103,207, 30,222,174, 93, 59,173, 70,163, 81,154,205,230,
- 26,162,240,132,255, 63,255,252,243,175, 82, 82, 82, 16,219,164, 73,205,201,216, 38, 77,194,108, 81,128,168, 63,163,195,176, 44,
-171,176,123,251, 84,163,193,191,254,245, 47, 24,149,202,154,145,111, 29,108,198,138,192,104,196,227,143, 63, 94, 86, 82, 86,246,
- 84, 76, 64,192,250,187, 81, 54,199, 65,125,142,249,255,250,208,187,119,111, 36, 37,181,171,185,190,190,117, 0, 0,192,108,100,
- 81,201, 86,192, 96, 48, 32, 44, 52, 20, 98,161, 8, 38,139, 25,148, 82, 88, 44, 22,176, 44, 11,147,201, 4,206,108,113,183,126,
-185,139,133,133, 76, 92,108,172,221, 35,224, 46, 22, 22, 50,223,108,254, 65,236, 24, 17,136,139,141,173,132,143, 6,179,117, 78,
- 72,201, 41, 46, 56,238,147,119,236,237, 24,128,135,178,202, 81, 22,155, 9, 97,235,142, 32,109,123,160,205,234, 83,184,101,224,
- 16,200, 39, 96,127,254, 30, 23, 46, 95,113,185,127,158,222,204,226, 68,238, 81,124,186,248, 19, 60,152, 56, 24,239,254,231,125,
-252,180,235, 39,172, 95,247, 53, 6, 14, 29,156,210, 42,182, 53,248, 1, 2,236, 61,184, 23, 27,214,126,141, 45,223,111,198,142,
- 29, 59,232,255,253,223,255, 57,149, 44,147,201,104, 93,226,183,163,178,178,210,243, 36,140, 70,131,208,208,208, 35, 0,250,199,
-198,198,162,119,239,222,224,241,172,105,214, 54,109,218, 64, 36, 18,161,170,170, 10,177,177,177, 8, 14, 14,190,170,209,104,218,
- 56, 53,182, 40, 61, 75, 8,153,191,101,203,150,145,113,113,113,157, 55,111,222, 92,173, 82,169,230, 80, 74, 55, 56,144,250,152,
-135, 30,122,232,245,213,171, 87,111, 2, 80, 6, 32, 21,192, 47, 0,122,214, 35,239, 20, 33,100,126,216,241,227,111, 63,105, 54,
-227, 19,128,251,170,186,250,153, 58,242,158,120,249,229,151, 63, 73, 79, 79,199,149, 43, 87,176, 99,199, 14,152,205,230,125, 0,
-158,188, 95, 72,189, 87,175, 94, 56,125,250,116, 77,222,191,193, 80, 92,157,227,118, 99,250,180,158, 27, 34, 17,244, 43, 87, 27,
-126, 58,124,177,124, 1,120, 34,224,194, 65, 60, 28, 75,241,214, 75,143,163,119,183, 88,188, 44, 27,129, 81,237, 89,224,204, 30,
- 80,129,196,140, 6, 7,235, 84, 34,191,178, 8,124, 17,240,232,168,215,176,225,191, 31, 1, 96, 1,157, 17, 22, 61,240,189,226,
- 52,178,143, 89,103, 20,182,108,221, 22, 12,223, 53,121,141,236, 73, 96, 50, 0,219,119,236, 70,159,225, 47, 89,189,127, 8,192,
-147, 0,227, 31, 75,197,200,161,163, 1, 0,197, 87, 11, 96, 54, 52,188, 85, 51,165, 20,102, 98, 37,120, 35,107, 29,252,103, 52,
-232,161,211,233, 80, 93, 93, 13,141,186, 10, 26,141, 6,106, 77, 53, 12,213,213,208,235,245,206, 27,127, 53,129,222, 96,129,222,
- 96,129, 86,103,130,166,218, 8,149,198,136, 74, 53,139, 42,141, 9,149,149,214,191, 21, 74, 51, 42, 84,102, 84, 84,153,113,171,
-130,197,205, 91,206,203,200, 80, 10, 11, 0, 98, 33, 32, 12, 7, 74, 40, 64, 41, 40,229,193,194,253, 81,125,156, 77,123,120, 26,
- 27,239, 50,176, 11, 14,237, 60,132,159,246,253, 84, 99, 20, 92,184,122,193,173,123,121, 60, 30,248,214,250,138, 1,208,126,225,
-194,133,191, 2, 88,246,230,155,111,190,218,174, 93, 59,179,181, 63, 89, 11,230, 33,249, 19, 97,116,244, 86, 0,136,142,142,190,
-237,199,233,211,167,155,143, 95,184,176,209, 87, 99, 1,236,225,127,119,247,141, 55, 57, 76,177,248,238,187,239,112,169,212,154,
-194,249, 49, 39,167,214,111, 23, 46, 92,104, 26, 21, 21,165,250, 51,148, 64, 82, 82, 59,198,166,224,235, 42,252, 90,191,187, 52,
-240, 66,130,207,115, 22, 11,212, 21, 42,220,186,117, 11,202, 74, 21,180, 58, 29,180, 58, 29, 52,213,213,208, 86,169,161,169,172,
-132, 65,175, 3,107, 48,128, 51, 91, 92,234,156,184,216, 88,187,206,224, 0,176,142,233, 0, 0,248,102,243, 15,120,111,201,103,
- 97, 0,162, 61,125,238,115, 39, 51, 19,235,230,253, 11,126,223,149,248,103, 43,229, 27, 19, 98,209,102,245, 41,144,182, 61, 96,
-220,159,137,171,207,197, 35,144, 79,112, 48, 57, 10,230,170,114,244,217, 93, 6, 23, 25, 0,164,164,164,144,231, 95,153,134, 75,
- 23, 46, 32, 55,231, 32, 66,131, 67, 49,113,194, 68,132, 69, 70,224,228,209,227, 8, 18,138, 17, 24, 24,136,230,177, 45,176,241,
-219,141,120,243,157,183, 81,237, 5,137,219,145,144,144,224,241, 61,193,193,193,168,170,170,234,207, 48, 12,219,170, 85, 43,244,
-235,215, 15,221,186,117, 67,147, 38, 77, 32, 22,139, 17, 27, 27,139,158, 61,123, 34, 44, 44, 12, 26,141,166, 77,112,112,176, 43,
-253,188,104,255,254,253, 89,235,214,173, 19,168, 84,170,119,235,144,117,234,144, 33, 67, 62, 93,189,122,245,170,232,232,232,121,
-132,144, 32, 0,111, 2,120,175, 1,121,239,204,213,104, 22, 77, 53,155, 45, 95,233,245, 79,213,145,151,242,164,236,223, 91, 94,
-122,117, 38,239,194,133, 11, 56,114,228, 8, 86,175, 94, 93, 13,224,173,251,205,179,175, 27,209,115, 22,225,171,235,185,139,120,
- 12, 9, 46, 82,106,215,127,127,188,104, 9,128,176,190,237, 34, 47, 73,110, 93,233, 36,222,242, 34,230, 13,123, 25,243,146,251,
- 1,213,215,128,239,231, 0, 21,197,168, 70,192, 25,155,229,229, 4, 65,248,127,246,174, 60,174,169, 43,251,127,239,203, 66, 0,
-149,197,125, 87,172,184, 87, 17,171,160, 85, 18,141, 74,181,180,181, 21,181, 50,181, 12, 90,130,157,182, 90,107,199,182,182,181,
-155,109,157, 41,106,167,139,128,173, 63,237,140,142, 10,118,113,171, 75, 48,161, 46, 32, 69,187,169, 85, 81, 84, 20, 23,148,132,
- 45, 9,217,222,253,253,145,188, 24, 48, 36, 47, 1,171,118,242,253,124,162,121, 11, 39,247,189,119,223,253,158,115,238,185,231,
-112, 57, 66,126,249,117, 27, 6, 15, 73,192,155,175,127,133,239,190, 94,142, 61,170,223, 33,139, 29, 0,161, 48, 0,123,247, 31,
- 5, 21, 8, 97,178, 90,121, 95,100,124, 84, 95,236, 58,114, 18, 72,255, 16, 83, 19, 38,225,225,135, 19,176,123,223, 55,176,152,
-235, 48,121,226,147, 96,172,102, 4,136,220,143,115,148,181,194,106, 91,237, 8,161,197, 10, 51, 21, 58, 98, 2, 24,198,150, 31,
-128, 33, 54, 79, 1,231, 49,104,212,253,101,104, 9, 70,160,133, 56,128,177, 89,188, 86, 10, 43, 75,192, 82, 22,102, 51,133,201,
- 8, 48, 18, 10, 34, 32, 32, 2, 2, 43, 67, 96,180, 82, 84,234,168, 7, 87,123,253,233,100,238,108,161,128,130, 33, 12, 88, 42,
-168,103, 61, 80,226,153,108, 95,158,245, 50,250,197,246,115,108, 43,215, 42,161, 92,107, 91,193,118,112,231, 65, 96, 18,206, 1,
-232,233,209,156, 99,109,191,149,147,147,115,192, 62, 72, 13,239,217,179,103, 91, 0,181, 44,203, 6,152,205,230, 32,139,197, 98,
-161,148, 86,187,114, 5, 55,226,250, 95,242,217,103,159, 77,154, 58,117, 42,122,182,109,203,107,234,170, 41,224,130,255,134,245,
-237,235, 49,128,173,119,135, 14,178,244,244,116, 85, 66, 66, 66,245,169, 83,167, 90,157, 62,125, 26,143,201,109, 75,193,250,244,
-233,131,244,244,116, 36, 36, 36,152, 78,157, 58, 37,190,112,225, 2,104,117,181, 97, 80,191,126,110,101,190,180,100, 73, 61, 15,
-201,194,183,222,170,167, 48,121, 51,247,239,220,181,227,226,226,158,205,203,203,251, 92,161, 80, 32, 51, 51,211, 65,254,209,209,
-209,188,220,185, 0, 80,124,242,108, 81,219, 54,161, 35, 77, 38, 35,234,174,233, 33,150, 72, 32, 20, 10, 29, 30, 0, 67,109, 45,
-140, 58,157, 45,126,166,178, 18, 81,114,185,167,123,104,225, 92,252,111,191,244,188, 6,128,100,196,208,251,113,248,232,175,245,
- 78,114,138, 11,224,141, 19, 71,115,164,151,207, 22,169, 6, 15,191,217,134,115,103, 14, 73, 43,175,151,168,154,210, 63, 56,171,
-223, 87,247, 63, 0,156,214,232, 80, 58,231, 1,208,115,191,162,221,234,163,208, 89, 40,170,147,122, 34,100,195, 57, 84,255,181,
- 53,132, 4, 96,120, 40,160,127,123,238, 57,242,198,135,239,209,118,173,219,192,204, 90, 81,124,177, 4, 73, 79,206,196, 87,255,
-249, 15,190,251,118, 43,102, 38,205,132,177,206,136,253, 69,135, 96, 48,212, 34, 53, 57, 57, 47,215, 77,160, 93,102,102, 38,217,
-181,107,151,116,194,132, 9, 42, 87,158,128,138,138, 10,188,252,242,203,248,231, 63,255,201,235, 58, 91,183,110,141,203,151, 47,
- 35, 44, 44, 76,152,145,145,129, 7, 30,120, 0, 81, 81, 81, 16,139,197, 96, 24, 6, 5, 5, 5,136,137,137, 1, 0, 92,190,124,
- 25,173, 91,183,246,220,145, 41,125,159, 16,242, 45,165,244,132, 19, 89, 63, 57,122,244,232,101,115,230,204, 9,205,200,200,144,
-252,227, 31,255, 96, 0,124, 3, 96, 33,165,244, 90, 84, 84,148, 59,121,127, 39,132,108,160,148,254,236, 44,111,198,162,175,215,
- 63, 49,105, 20,153, 52,119, 37, 20,143,244,195, 23,159,164,179,213,213,213, 41,148,210,243,238,228,221, 43, 74, 0,159,129,244,
-236,127, 15,157,123, 78,163, 51, 30,129, 45,112,171, 99,126,241,245,172, 49,125,219, 47, 22,158, 59, 28,142,255,123, 10, 8, 8,
- 6,140, 58,128, 82,152, 5,146,107,251,143, 95,249, 18, 64,163,217,151, 54,172,255, 92, 54, 51,105,150, 10, 0,116,172, 25,103,
- 42, 75, 1, 88,113, 95,171,158,144,201,238, 71,251, 54, 29, 80, 81,101,227,134, 74,147, 5, 87, 42,117,112, 55, 92,118,233, 22,
-139, 75,165,249,246,167, 38, 68,252, 96, 91, 12,192,174,223,204,216,189, 61, 7,215,110, 92, 70,235, 80,219, 74,130, 80,177, 8,
-247, 15,115,127, 19, 76, 16, 66,204, 90, 96,133, 0, 44, 33, 96,172, 44, 96,182,192, 42, 18, 58,200, 31,176, 45, 23, 4,117,191,
- 42,233,177, 25,175,144,111,255,189,144, 6,137, 41,132, 34, 39, 15,131, 25,176, 80,160,206, 4, 88,141, 86, 16, 66, 64,196, 4,
- 22, 43,160, 51, 2,179,147,255, 65, 92,165,194,180, 58, 49, 36,203,176, 32,118,247,191,189,195,194,202, 50, 96, 4,246,149, 2,
- 0,168,128, 2,148,159, 23,192,153,252, 93,109, 31,220,121,208, 35,249, 91,173, 86, 24,141, 70, 76,157, 58,117, 64, 78, 78,206,
- 10, 0, 67,114,114,114,118,229,228,228,236,159, 58,117,234,115,189,122,245, 50, 19, 66, 90,127,252,241,199,123, 94,121,229,149,
- 36,141, 70,147,231,198,251,228,232,147, 11, 23, 46, 92,178,112,225, 66,236,218,181, 11,186,107,215,110, 57,161,103,219,182, 56,
-119,238, 28, 0,168,248, 36, 6,106, 44,233,143,168, 93, 59,233,103,159,125,166,162,148, 98, 88,159, 62,178,161,131, 6,169, 61,
-201, 26,212,175,159,154, 48,204,196,147, 63,254,216, 3, 64, 0,128,127,153, 3, 2, 32, 50, 26,209,187, 99, 71, 44, 88,176, 0,
- 7, 15, 30, 92, 22, 25, 25,153, 55,176,115,103,143, 49, 10,174,242, 0,248, 26, 3,224, 12, 46, 15, 64, 76, 76,226,143, 5, 5,
-229, 7, 21, 10,133,216, 62, 77, 48, 18, 64, 62,223, 36, 64, 61, 6,247,127,205,112,229,234, 4,214, 98,237,171,171,170, 66,213,
-141,235, 32,132, 1,165, 44,234,234,234, 64, 41, 5,165, 20,231, 78,252, 14,179,201,136,251,134, 69,171,189, 24,115, 66, 1, 48,
-147,100,113,236, 36, 89, 92,189,160, 63,251, 20, 1,111,156,252,249,107,233,229,179, 69, 42, 0,232,209,189, 59,190,107,224, 5,
-104,219,109,168,236, 78, 14,198,195,190, 47, 71,209, 67,192,144,104, 57,202,255, 54, 18, 29, 62, 63,132,211, 26, 29,194,196, 4,
- 21, 26, 45,132,132,120,244, 0,112,152, 53,107, 86,189, 51,183,109,219, 70, 39, 77,126, 8,219,183,110,199,230,205,155,241,214,
-226, 55,176, 71,157, 11,129, 80,128,206, 93, 58,199, 85, 85,185, 95,186, 28, 31, 31,175,142,143,143,119,169, 8,236,221,187, 23,
-103,206,156,169,203,204,204,236,200,167,109, 61,122,244, 64, 73, 73, 9,250,247,239,111,153, 63,127,190,120,227,198,141, 8, 9,
- 9,193,201,147, 39,111,241,188,150,148,148,160, 7,207,231,220,128,252,159,122,224,129, 7,222,121,242,201, 39, 67,138,138,138,
- 90,214,213,213,253, 53, 48, 48,240, 97,131,193,240, 17,165,244, 59,158,242,156,201,255,169,135,159,223,184,238,193,113, 83,200,
- 63,148, 0,233,244, 8,222, 95,249, 26,213, 20,159, 76,161,148,102,227, 79,140,122, 10,128,228,201,204,227,154,255, 42, 78, 75,
-158,204,228,166, 52, 75,143,253, 87,241,125, 77,157, 69, 55,226,190, 54,147,194,131, 4, 15, 8,140,117,193, 22,202,212, 84,212,
-152, 10,242,207, 92,221, 93,166,209,231, 73,158,204,188,130, 85,171, 92,254, 64,173,174,173, 58,237,111,115,101, 0, 84,172,128,
-155,230, 19,224, 76,245, 21,188,249, 92, 10,244,122, 35,170, 13,182, 24, 0, 19, 19,128,177,241,238,211,236,190,177, 56,153,236,
-218, 49,204,246,114, 91, 57,215,185, 5,241,131, 8,102, 60,187, 28, 65, 65, 1,104, 21, 40,145, 1, 80, 21, 31, 59, 42,139, 29,
-232, 62, 33,136,144, 90, 96, 34, 54, 37, 0,132,192, 74,169, 77, 17,176,216,151,251, 17, 6, 66,150,133,133, 91,118,224, 65, 9,
-168, 52,132,194, 96,172,128, 88,200, 56,210,156, 89, 88,192,108,166, 48, 91, 40,106, 13,172,205,250, 7,129,153,189,233,186,119,
- 73,176, 44, 3,134, 88, 65,172, 4,148,161, 14,247, 63,105,100,198,133,147,244,194,139, 50,178,106,213, 73,183, 22,222,239,249,
-191, 55,181,239,152, 40,165, 48, 24, 12, 24, 52,104,208,149,136,136,136, 41,231,207,159,239,189,121,243,230, 66, 0,143,230,228,
-228, 60,234,124,242,135, 31,126,168,126,229,149, 87,100, 26,141,198, 19, 65, 56,110, 72, 90, 90, 90,163, 39, 61,241,244,211, 0,
-188, 75, 12,196,101,221,107,136,225,253,250,201,162,120,144, 63,135,129,125,250,236,113,246,100,164,167,167,127,154,144,144, 96,
- 57,117,234,148,240,194,133, 11,232,209,186,117,126,231,160,160, 92,158, 3, 81,179,191,212, 13,200,253, 90, 94, 94,158,115,140,
-199,111,118, 69,128,111,198, 64, 93, 96,199, 14, 79,156,204,221,151, 31, 26, 28,220,170, 90, 91, 9,139,197, 2,106,127, 15,180,
-215,202, 81,173,213,130, 82,202,199,250,183,189,172, 55, 99, 78, 24,251,114, 64,102,196,208,251, 49, 73, 22,231,240, 10, 21,159,
- 63,207, 95, 9,208,255, 34,189, 84, 92,232,176,242,191,203,254, 82, 5, 0,109, 35, 70,201, 6, 71, 39,168,239,220,240, 74,111,
- 85, 2,176, 26, 67,210,222,196, 85,150,197,224,181,133, 40,140,111,143, 1,219,175, 65, 72,128,150, 34,223,106,179, 37, 36, 36,
-144,125,234,125,116,236,248,113,216,186,229, 91,188,187,236, 67, 44,170,170, 2,101, 89,108,218,180, 5,101,101,101, 15, 3,216,
-238,209,163,234, 66, 17, 0,128, 41, 83,166,252, 12,160,134, 79, 91, 98, 99, 99,201,229,203,151,233,209,163, 71,197, 67,135, 14,
-197,184,113,227,160, 82,169,208,173, 91, 55, 24,141, 70,196,197,197,129, 82,202, 30, 61,122,148, 17,137, 68, 94,103, 4, 36,132,
-244, 15, 9, 9, 89, 49,125,250,116,209,137, 19, 39, 90, 25,141,198,198, 2, 3,249,202,139,234, 60,100,218,186, 33, 99,166,147,
- 47,243,128,106, 3, 96, 58,183,139,213, 20,171, 26, 6, 6,222, 51,224,242, 0, 56,123, 0, 92,237,115,233, 74,117, 34,127,110,
-251,247, 11,255, 85,148, 94,184, 81,155, 15,160,163,253,229, 53, 2, 40, 3, 80, 34,121, 50,211,224,113, 46,105,240, 35,234,227,
-191,150,202,172,180,133,202,249,229,168,213, 85,219,214,253, 51, 65,248,251, 71,252, 83, 76,198, 79, 30, 72,222,155,251,176, 20,
-140, 94,229,204,133, 45, 90,132,192,106,214, 2, 84,135, 11,135,178,200,172, 25,241, 30,101,153, 33, 0, 40,181, 17, 53, 4, 16,
- 83,187, 34, 96, 39,127, 91, 14, 64, 0, 60,167, 38,146, 83, 95, 39, 89,159,188, 69, 45,102, 13,132,246,133,189,148, 82, 88, 45,
- 20,117,102,160,186,198, 2, 51, 40, 44,148,129, 80, 68,176,244,157, 79, 27,189,238, 57,115,108, 65, 90,235,214,158,161,196,108,
-179,254, 41, 0, 74, 9, 64,237, 22, 3, 21,128, 8, 88,176,172, 16, 47, 45,156,192,235, 30,206,121,119,142,236,252,217,243,238,
- 8, 88, 4,219, 82, 13,119,236,196, 2,128,209,104,132, 86,171,213,134,132,132, 32, 58, 58,250,151,225,195,135, 7, 92,191,126,
- 29,103,207,158,181, 45, 15, 99, 89,233,150, 45, 91, 84,118, 37, 64,197, 67, 9, 48, 39,198,199, 39,246, 24, 52,200,250, 64,223,
-190, 58,123, 31, 53,162,254,138, 72, 36,198,219,158,109, 15, 30, 73,129, 94,126,249,101, 25, 0, 12,235,211,231,150, 99,209,131,
- 7, 55,137, 32, 6,245,235,247, 57,195, 48,214,147, 63,254, 24,220,190,125,251, 27, 3, 71,142, 92,119, 39, 95,126, 23,164,174,
-139,142,142,118,142,182,118,172, 99,245, 66, 9, 56, 17, 53,110,236,136,173, 95,124,185, 37,162,103,143,254, 70, 99, 29,172,102,
- 11, 88,150, 69,203,176, 48, 84,105, 52,136,146,203,101, 60,172,127, 0,168,124,251,165,231,219, 1, 48, 21,159, 63, 47,230,230,
-255, 15, 31,253, 21,147,100,113,236,146,244, 79, 60, 37, 7,114, 32,178,163,150,158, 60,117, 82,182,111,247,119,245, 92,252, 99,
- 39, 62, 42, 99, 90,197, 54,233,185, 54,230,238,119,189,159, 63,135, 13,251,190, 28,248,254, 57,199,246,125,223,221, 92, 2, 92,
-101,182,250,220,222,177,210,177,228,171,210,175, 30,154, 48, 57,126,231, 51, 79,205, 62,112,255,224, 65, 15,110,253,110, 27,242,
-127, 62,130,212,212,212, 29,171, 26, 49,208, 60, 40, 2,179,191,249,230,155, 47,190,249,230,155,152,248,248,120,222,141,155, 48,
- 97,194,216, 61,123,246,236,219,190,125, 59, 34, 34, 34, 48,126,252,120,132,132,132,156,174,170,170,138, 60,126,252, 56, 74, 74,
- 74, 24,145, 72,132, 9, 19, 38,200,189,126, 46,182,192,192,101,219,182,109,107, 52, 48,208, 75,121, 63, 17, 66, 62,248, 54,231,
-145,215, 12,157,147, 96,248,241,117,246,242,254,165, 79,249, 42,239,110, 84, 4,188,153, 2,112, 9,201,147,153, 58, 0,191,218,
- 63, 62,225,169,167,158, 83,167,165,189, 34,203,200,124, 87,213,185,123,111, 0, 70,136, 2, 36,184,116,165, 26,113, 9,179,136,
-247,242, 30, 81,223,215, 55, 18,107,215,124, 13,176, 23, 0, 8, 97,169, 51,160,115,199, 16, 89,183, 86, 22,254, 47,191,149,133,
-144, 97, 97, 38, 66,136,168,229,166, 34, 0, 11, 64,173,224, 27, 24,230,140,212,231,223, 34, 0,176,228,213,185, 84, 36,180, 89,
-251, 22,214,230, 50,175,172,161,176, 90, 0,129,144,197,231,159,241, 83,122,158, 78,182,165, 70, 94,243,229, 41, 10, 46, 39, 60,
- 3,176,196,230,238, 95,176,240, 97,175, 26, 89, 85, 91,165, 14,107, 31,214,212,254,197, 0,182,152, 8,131,193, 0,171,213,138,
-234,234,106, 8, 4, 2, 88,173, 86,116,232,208, 1,102,179, 25,153,153,153,170, 6,158, 0,149,167,154, 1, 81,131, 6,229, 0,
- 64,115,100,252, 3,128,112, 66,212, 0, 16, 62,120,240,109, 49,243, 6,244,233,147,209, 20, 1,205, 25, 3,224,130,204,117,238,
- 86, 3,120,145, 14,248,228, 35,115,102, 15, 4, 32, 56,153,151,103,174,211, 27,192, 90,173,232, 23, 29, 45,235, 24,217, 31, 61,
- 6,247,231,247,206, 81, 50,125,247,247, 59, 28,155, 35,251, 71, 56,190,239,254,126,199, 45,219,238, 66,227, 79, 95, 9, 35, 76,
-171, 88,140,155, 72,100, 39, 78,158,197,149, 11,191,169, 0, 96,223,238,239, 84,237,187,157,149, 13, 26,241, 23,175,149,128,105,
-211,166,193,219,244,190, 86,226, 62,239,118,233,148, 14,248,254,114,221,109, 31,240,103,205,154,245, 61, 0,166,168,168,136,205,
- 45,200, 67,235, 54,173,209,148,250, 28,241,241,241, 95,198,199,199,127, 5,207,233,157,235,161,101,203,150,170, 39,158,120,130,
-228,231,231,211,179,103,207,162,176,176, 16, 53, 53, 53,145,205, 81, 11,192, 78,218,255, 36,132,136,242,243,243, 7,153, 76,166,
-215, 41,165,155,154,244, 2, 83,186,152, 16, 34, 10,233,245,213,130,170,179,123,146,154, 42,239, 78,131, 91, 5,224,106,191, 79,
- 10,128,183, 83, 9,141,186,170, 30,127, 90,189, 99,247, 25,242,216,228, 32,218,174,115, 87,104,106, 44,136,155,252,148,207, 29,
- 33,246,129,190, 36,246,129,215,160, 80,188, 73,129,107, 8,107, 41, 68,183,112,214,171,151,126,216, 95, 23,222,182, 2, 54,111,
-127,176,138, 0,192,188,249,207, 81,147,193, 12, 22,182,101,115, 43, 62, 91,225,211,111,166,204,182,213, 12, 88,243,197, 73,202,
- 82, 1, 94,125,229,209, 59, 89,221, 76,236,236,198, 54, 26,141, 48,153, 76, 14, 34,227, 8,204, 95, 37,208, 61,188, 73, 63,236,
- 35, 76,139, 22, 37, 6,216, 61, 40,214, 38,202,162, 0, 44,125,227,226,234,181,185, 71,199, 14,188, 5, 4,176, 70,245,211, 9,
- 94, 27,126,104, 88, 10,184,158,253,221, 42, 70, 61, 96,120, 12, 6, 12, 71,147,239,165,167,194, 62, 13,117, 96, 11, 9,128,129,
-113,191, 34,245,108,141, 5,145, 45,249, 12,145,205,210, 21,232,176, 97,195,154,179, 79,249,156, 1, 39, 54, 54,150,120, 74,196,
-214, 4,210,190, 37, 48,176,137,242,110, 9, 12,188,215,149, 0, 62, 32, 67,134, 12,161,240,195,143, 38,162,119,239,222, 40, 46,
- 46,246,223, 8, 63,252,240,195,143,123, 4,140,255, 22,248,209, 28,240,147,191, 31,126,248,225,135, 95, 1,240,195, 15, 63,252,
-240,195, 15, 63,252, 10,128, 31,126,248,225,135, 31,126,248,225, 87, 0,252,240,195, 15, 63,252,240,195,143, 59,142,122,161,169,
-115,231,206,245, 57,122,212, 85, 38, 59,191, 60,191, 60,191,188,187, 67,158, 66,161,160,153,153,141, 47, 59,245,223, 63,191,188,
-187, 77,222, 79, 63,253,228,179,188,168,168,168,255,121,121, 94, 43, 0,220, 64,225,173, 16,119, 3, 75,115,203,243,227,238,132,
- 39,130,241,227,238,124, 14, 94,158, 31, 12,224,129, 3, 7, 14, 44, 21, 8, 4, 35, 3, 2, 2,160,215,235, 15, 61,248,224,131,
-139, 1, 20, 2,208,223, 13,247, 64,169, 84, 74,179,179,179, 85,127,198,113,229,216,177, 99, 40, 44, 44,244,120, 94, 65, 65, 1,
- 61,118,236, 24,178,178,178,200,192,129, 3,155, 44,143,195,240,225,195,225, 78,158, 31,247,176, 7,128,131, 55,233, 73,249, 36,
-202,113, 37,175,177,242,176,190, 36,222,249,179, 15,232,124,207,157, 56,113,162,236,241,199, 31, 87,243,149,217,185,243,173,165,
-151,203,202,202,234,109, 39, 38, 38, 66, 46,151, 19, 62,242,110,167, 18, 48,113,226, 68, 10, 0,187,119,239, 38,119,131, 60,157,
- 78, 55,110,203,150, 45,202,211,167, 79, 3, 0, 34, 34, 34, 30, 73, 73, 73,217,230,235,243,117,238,247,148, 82,199,251,193,237,
-231,222, 21, 66, 8, 50, 50, 50,136, 59,229,153,239,115,240,242,121,245, 63,118,236,216,150,234,234,234,190,221,187,119,199,141,
- 27, 55, 80, 87, 87, 7, 0, 35,183,108,217,162, 10, 14, 14, 62, 25, 31, 31,255, 24, 0,183,165, 36, 71,141, 26,229,149, 65,112,
-240,224, 65, 25,120,166,122,230,144,157,157,173, 74, 76, 76,148,201,229,114,181,183,207, 35, 53, 53,213,171,246, 77,155, 54,141,
-247,251,193,161,123,119, 91, 5,220,154,154, 26, 24,141, 70,174, 63,241,122,223, 10, 11, 11,241,239,127,187,207, 80,107, 52, 26,
-233,200,145, 35,209,175, 95, 63,172, 95,191,190,220,104, 52,118,107,108, 93,120, 97, 97, 33,146,146,146,120, 93,235,181,107,215,
-176,116,233, 82,100,102,102,250, 7,230,123, 0, 13,147, 1,221,206, 68, 64,126, 43,246, 54,226,187, 12,207, 41,141, 31,155,187,
-203, 43,153, 42,213, 77, 3,233,244,233,211, 8, 14, 14,118, 12, 66, 78,247,131,143,181, 69, 27,110, 55, 28,192,148, 74, 37,205,
-206,206,246,217, 2,219,176, 97,131,116,226,196,137,141,202,111, 10,210,210,210,232,152, 49, 99,100, 51,103,206,244,138, 44,182,
-108,217,162,108,215,174, 29,102,205,154, 5,173, 86,203,166,167,167,111,213,106,181, 51,194,194,194,188,202, 34, 70, 8,193,247,
-223,127,239,216,142,143,143,199,174, 93,187,220,110,123, 66, 67, 37, 64,161, 80,208,232,232,104,100,101,101, 81, 46, 49,147,183,
-228, 95, 85, 85,149,223,171, 87,175, 86, 0, 32,145, 72, 16, 24, 24,136,242,242,114, 84, 86, 86, 34, 36, 36, 4,229,229,229,125,
-119,237,218, 85, 24, 31, 31,223, 7,192, 85,119,194, 6, 14, 28,136,196,196, 68, 68, 68,220,204,250,183,108,217,178,122,231, 44,
- 90,180,136,179,100, 85, 51,103,206,244,250,121,251, 66,254, 28, 86,174, 92,217,216,161, 70, 43, 88,242, 69,112,112, 48, 78,156,
- 56, 1,145, 72, 4,147,201,132, 93,187,118,161,184,184, 24,175,190,234, 93,197,217,107, 13,138,100, 61,242,200, 35, 2, 0,242,
- 31,126,248, 97, 87, 92, 92,220,181,199, 30,123,172,189, 82,169,132, 64, 32,104, 27, 26, 26, 42,240, 70, 86, 99, 56,127,254,188,
-159, 36,238, 81,242,231,246,121,172, 5,112,175, 98,205,154, 53,210,148,148, 20,117, 83,229,220, 43,174,236,206,195,222,187,105,
-181, 23,189,238,147, 12,173, 86, 11,189, 94,239,176, 64,178,178,178,156, 45, 33,190,214,214, 45,219,114,185, 28,123,247,238,165,
-132,144, 91,142,251,130, 31,126,248, 65,245,242,203, 47, 35, 39, 39, 7, 83,167, 78,109,150,251,183,123,247,110,146,155,155, 75,
- 41,165,200,203,203, 83,229,229,229,121,165,160,156, 62,125, 26,179,102,205, 98, 1, 48, 98,177,152,137,140,140, 68,122,122,250,
- 70, 0, 27, 35, 34, 34, 38,167,164,164,236,228, 35,231,118, 20, 3,226,148,128,172,172, 44,202,165, 1,230,254, 87, 40, 20, 52,
- 49, 49,209,155,107, 13,214,106,181, 91, 36, 18, 73, 43, 0,248,219,223,254,134,186,186, 58,100,100,100, 32, 48, 48, 16,117,117,
-117, 48, 24, 12, 16, 8, 4,168,170,170,106, 5, 32, 29,192, 95,220, 9,228,200,189,164,164,228,150,125,205,129,196,196, 68,153,
-253, 58,101,190, 42, 2, 47,190,248,162,227,251,138, 21, 43,184,175, 76,131,253,188, 21, 2,206,107,242,250,235,175, 35, 56, 56,
- 24, 57, 57, 57,136,139,139,243,137,252, 27, 98,244,232,209,128, 45, 75,227, 95,159,122,234, 41,244,238,221,187,253,174, 93,187,
- 80, 81, 81,193,149,220, 53,121,120, 23,154,187,251, 73, 39, 79,158,172,218,177, 99,135, 43,239,141,116,236,216,177, 42, 66, 8,
-114,115,115,253,238,222,219, 76,254,169,139, 62, 4, 0,100, 45,123,197,165, 18,240,135, 40, 0, 89, 89, 89,174, 30, 52,109,108,
-191, 47,191,113,248,240, 97, 21, 0, 89, 83,149,128,164,164,164,255,153,249,108,189, 94,127,139,213,239, 11,209,112,196, 50,117,
-234, 84,140, 31, 63,158, 0, 64, 78, 78, 78,179,180,113,195,134, 13, 82,187, 69, 71,202,203,203,165,217,217,217,170,242,242,114,
-169,183, 22,187, 43,140, 27, 55,142,140, 27, 55, 14, 27, 54,108,144,230,229,229,169, 54,108,216,224,149, 92,173, 86,107, 9, 11,
- 11, 19,111,217,178, 5,118,111, 64,157, 86,171,101,210,211,211,119,104,181,218, 9, 97, 97, 97,123,239,228,243,229, 72,223,185,
- 47, 43, 20, 10,202, 41,105, 60,241, 64,113,113,113,223, 65,131, 6, 97,246,236,217,168,170,170, 66, 69, 69, 5, 68, 34, 17,132,
- 66, 33,132, 66, 33, 68, 34, 17, 2, 3, 3,161,209,104,160, 84, 42,103,202,229,242,231, 61, 9, 45, 41, 41,169,167, 28,114, 10,
- 0,231, 9,136,142,142,246,166,141,174,172,127, 89,118,118,182,170, 41,158, 39, 39, 88, 26, 25, 43,121,123, 3,206,159, 63,143,
-188,188, 60, 76,158, 60, 25,221,187,119, 71,155, 54,109,144,151,151,135, 87, 95,125,213,225,125, 19, 8, 4, 94, 55,108,244,232,
-209, 88,188,120, 49,150, 46, 93,218, 49, 37, 37,101,250,147, 79, 62,137,241,227,199, 3, 0, 4, 2,193,172,214,173, 91,111,203,
-204,204, 52,187, 43, 6,180, 97,195, 6, 94, 94,128,178,178, 50,204,152, 49,131,159,129,210,185, 51, 82, 83, 83, 85, 37, 37, 37,
- 80, 42,149,220,253,151,166,166,166,170, 56, 5,218,143,219, 11,142,252,185,239,156, 18,240,135,123, 0, 26,155,199,246, 37, 64,
-240,118, 43, 1,147, 38, 77,106,178, 39,192,155,235,242,230, 55,158,120,110, 55,182,124, 58,177, 89,238, 21,247, 2, 42, 20, 10,
-151,115,122,135, 14, 29,106,178, 98,208, 28,207,247,135, 31,126, 80,113, 86,255,204,153, 51,213, 63,252,240, 3,218,181,107,167,
- 66, 51, 37, 78,231,228,230,229,229, 33, 47, 47,207,163,187, 89,167,211, 77,218,178,101,203, 14, 0, 72, 79, 79, 23, 71, 68, 68,
- 32, 37, 37,133, 59, 44,249,245, 87, 91,189,172,244,244,244, 61, 17, 17, 17,143,165,164,164,120,172, 79, 30, 31, 31, 95, 47, 38,
-230,161,135, 30,170,231, 25,224,227,246,119,161,116, 83, 87,253,139,123, 46,206,211, 1,238,176,107,215,174,165,145,145,145, 0,
-128, 51,103,206,128, 82,138, 83,167, 78, 57,234, 62, 8,133, 66, 16, 66, 96,181, 90,161,215,235,241,205, 55,223, 64, 46,151,123,
-172,186,228, 76,254,137,137,137, 46,149, 23,231, 41, 2, 95,148, 0,185, 92, 78, 20, 10, 5,109,170, 55,160, 57,198, 73,179,217,
-140,161, 67,135, 66,173, 86, 99,216,176, 97,208,233,116,142,169, 29,181, 90,141,137, 19, 39,194,194,149, 32,247,206,242,199,210,
-165, 75, 59,165,164,164, 92,250,242,203, 47, 29,199, 58,117,234,132,229,203,151,255,155, 47, 97, 55, 51,212, 71,142, 28, 65,116,
-116, 52, 34, 34, 34, 48,116,232, 80,122,244,232, 81, 25, 71,254, 37, 37, 37, 80,171,213,126,235,255, 46,192, 31,162, 0,252,145,
- 65,128,205,161, 4,244,232,209,163, 73,158, 0,110,144, 93,191,126,189,203,227, 59,119,238,196,250,245,235,125,178, 76, 10,206,
-245, 71, 76,207, 19, 62,187,253, 57, 56,207,249, 43,149, 74,200,229,114,135,219,255,208,161, 67,232,218,181,107,179, 40,125, 77,
-177,190, 56,235,255,198,141, 27,142, 58,243, 82,169, 84,214,156, 94, 0, 14,113,113,113,178,188,188, 60,149,167,243,182,108,217,
-178,131,155,251,215,233,116, 88,182,108, 25,106,107,107, 33, 18,137, 16, 16, 16,128,115,231,206,225,189,247,222,131, 86,171, 69,
-122,122,250,183, 90,173,118,108, 88, 88,152,202, 3,201,214, 35,123, 79, 49, 1,205,161,120, 30, 57,114,164,222,249,141, 5,137,
-133,135,135,143, 52, 26,141,176, 88, 44, 56,116,232, 16, 4, 2, 1, 76, 38, 19, 12, 6, 3, 88,150,117,188,199,102,179, 25, 70,
-163,145,123,167, 61,134,137, 55,230,242, 95,180,104,145,195, 11, 16, 17, 17,129,242,242,242, 38, 43,162,220,170, 0, 47, 98, 71,
- 52, 0,194, 93, 29,112,154, 14,240, 10,233,233,233,120,249,229,151, 17, 21, 21,229,240,128,112,233,179,163,162,162,112,234,212,
- 41,180,107,215,206, 43,153,251,247,239,199,232,209,163,187,167,164,164,156,231,200,223, 62,126,118,222,180,105,211,229,134, 1,
-189,124, 21,138,198,126,203, 75,239, 19, 57,114,228,136, 52, 53, 53, 85, 53,108,216, 48, 12, 27, 54, 76, 5, 0,167, 78,157, 66,
- 94, 94,158,159,252,111, 35,184,106,128, 89,203, 94,185,101, 10,224, 79, 27, 3,112, 55, 42, 1, 73, 73, 73,116,241,226,197,183,
-184, 2,125, 33,255, 39,158,107,222,121, 58,157, 78,119, 75,144, 31,103,245,139, 68, 34, 92,189,122,245,142,146,191,179,245,239,
-108,185,205,152, 49, 67,173, 86,171,155,221, 11,224,141,231,100,214,172, 89,122, 0, 65,193,193,193,120,227,141, 55, 32, 18,137,
- 28,199,147,147,147, 1, 0, 97, 97, 97, 72, 72, 72,192,129, 3, 7,246, 37, 36, 36,252, 33,237,116,190,223,206,243,255,174, 16,
- 29, 29, 93,175, 82,163,171,117,216, 0, 96, 50,153,160,209,104, 80, 87, 87,135,144,144, 16, 4, 4, 4,192, 98,177,128, 82, 10,
-171,213, 10,147,201, 4,179,217, 12,171,213,234,172,208,223,112,215,206,146,146,146,122,214,125,195,233,128,134, 1,130, 77,133,
- 92, 46, 87,123, 25,139, 34,105,236, 64, 35,177, 1, 30,241,222,123,239, 97,242,228,201,232,209,163, 7,130,130,130, 32,149, 74,
-161,209,104, 16, 28, 28, 12,173, 86,139,181,107,215,130, 97,188,139, 47, 28, 61,122,116,151,148,148,148,243,243,231,207,199,214,
-173, 91,241,232,163,143, 2, 64,135,253,251,247, 95,243,229, 62,217, 21, 10,112, 99, 22, 55, 86,121, 75,254,206,158,128, 77,155,
- 54,201,166, 79,159,174, 2,128, 77,155, 54,201,170,170,170,212,240,227, 15,131, 43,183,191, 51,254,148,153, 0, 71,140, 24, 33,
-107,142,128, 64, 95,173,116,231, 1,121,233,210,165, 77, 38,127, 14, 67,163,134, 32,119,159, 10, 27,246, 5, 57,148,130,130,115,
-253,155,116,141,209,209,209, 40, 41, 41, 65, 78, 78, 14,186,118,237,138,117,235,214,249, 96,117, 81, 41,247, 45, 45, 45,173, 89,
-200,159,179,254,203,203,203,101, 13,143,141, 25, 51, 70,150,147,147,227, 56,167, 57,144,151,151,167,226,235,125,210,106,181,191,
-195, 54, 47,204,110,218,180, 9,107,215,174, 5, 0,108,220,184, 17, 90,173,150, 59,205,114,234,212, 41,180,109,219,246,142,188,
- 3,206,209,254,174,148, 51,190,101,154, 75, 74, 74, 14, 89,173, 86,104,181, 90,220,184,113,195, 17, 56,170,215,235, 81, 91, 91,
-139,234,234,106, 84, 85, 85,193, 96, 48,192,104, 52,194,106,181, 2, 64,190, 59,153, 13,201,221, 85, 32,105,195, 85, 1,124,161,
- 84, 42,165, 13,175, 89,169, 84,122,219, 79,130,154,251,121,172, 91,183, 14, 82,169, 20, 65, 65, 65, 56,113,226, 4,212,106, 53,
-130,131,131,241,230,155,111,226,192,129, 3,120,245,213, 87,189, 82, 0, 70,143, 30,221, 33, 37, 37,229,226,140, 25, 51,240,245,
-215, 95,115,228,223, 9,192, 53,119,150, 60, 31, 37, 96,233,210,165,205, 65,254, 0, 32,229,200, 31, 0,166, 79,159,174,138,139,
-139,243, 87,159,253, 35,199,129, 69, 31,214,139, 5,104,136, 63, 77, 16, 96,115,147,191,125,189,107,147, 45, 55,110, 58, 32, 41,
- 41,201,103,242,127,226,185,221, 24, 26,117,211,117,179,229,235,111,176,229,107,219,247,220,125, 42, 96,172, 12,128,119,203, 0,
- 21, 10, 5,162,163,163, 1,216,130, 1,143, 28, 57,130,189,123,109, 49,107,191,253,246, 27,226,226,226,188,144, 70,212,192,205,
-192,191,166, 70,234,111,216,176, 65,234,202,250,111,136,230,242, 2,112,138,132, 84, 42,149,121, 58, 55, 34, 34, 98, 66,122,122,
-250,158,132,132, 4,156, 58,117, 10,167, 79,159,198,123,239,189,103, 1, 32,212,235,245, 72, 79, 79,135,253,152,240,194,133, 11,
-120,234,169,167, 60,202,188, 29, 49, 0,156, 37,157,157,157,237,240, 98,113,196,200, 61,119, 62,136,140,140, 44,210,235,245, 35,
- 77, 38, 19,174, 95,191,142,128,128, 0, 8,133, 66,135, 7, 64,167,211, 65,175,215,195,104, 52,162,170,170,138,155,207,191,228,
- 78, 38, 71,238,220, 52, 64,116,116, 52, 26,122, 43, 92,197, 5,240, 33,127, 46, 7, 64,195,125, 77,233, 31,156,213,239,194,226,
-183,240, 29, 67,139,139,139,113,234,212, 41,232,245,122,196,198,198, 66,175,215, 35, 59, 59, 27,211,167, 79,199,214,173, 91, 33,
- 16, 8,120, 43, 0,145,145,145, 93, 56,242, 47, 44, 44,196, 91,111,189, 5, 0,221,146,146,146,174,172, 95,191,158,236,223,191,
-191, 73, 99, 40,231, 9,104, 10,249, 71, 71, 71, 83,174,159, 29, 61,122, 20, 69, 69, 69,178,212,212, 84, 85,159,220, 12, 96, 18,
- 0, 0, 32, 0, 73, 68, 65, 84, 62,125, 32, 18,137,168, 83, 96,160, 31,205, 12,110, 21,128,171, 32,192, 59,178, 10,224,143, 10,
- 2,188,219,200,191,161, 18,208, 20,203,223,221,118,238, 62,149, 47, 47,232, 77,115, 39, 40, 8,253,250,245,171,119,252,240,225,
-195, 94,201,155, 58,117,170, 67, 1,200,201,201, 65, 78, 78, 78,189, 85, 1,222, 92,255,186,117,235, 84, 0,176,107,215, 46,151,
-228, 57,115,230, 76,245,186,117,235, 0,240, 91,194,212, 88,210, 31, 78,209,160,148, 34, 46, 46, 78, 54, 99,198, 12,143,125, 39,
- 37, 37,101,175, 70,163, 25,119,240,224,193,220,200,200, 72,156, 62,125, 26, 90,173, 86, 24, 22, 22,134,148,148, 20,104, 52,154,
- 11, 7, 15, 30,236, 30, 25, 25,137, 89,179,102,121,188, 94, 87,121, 0,124,141, 1,104,248,110,101,102,102, 18,185, 92, 14,165,
- 82, 73, 27, 78,203,240,125, 30, 49, 49, 49,175,169,213,234, 23,172, 86, 43,170,171,171, 97, 54,155, 29,202, 74, 93, 93, 29, 40,
-165,245, 2, 3,229,114,249,147,118, 98,228, 13,185, 92, 14,185, 92, 94,111, 89,160,183, 83, 0,206, 68, 47,151,203,213, 13,199,
- 22,103,165,160, 25,193,123,252,228,150,250,189,244,210, 75, 80,171,213,144,201,100, 40, 46, 46, 70,139, 22, 45, 80, 90, 90,202,
- 91, 1, 56,124,248, 48, 73, 73, 73,185,248,212, 83, 79, 97,255,254,253,120,243,205, 55, 1,160,115, 82, 82,210,229,230, 32,127,
-103, 37,160, 41,150, 63, 55,190,148,148,148,160,168,168,136,216, 13, 65, 89,106,106,170, 42, 34, 34, 2, 82,169,148,250, 3, 1,
-239, 60,132,141, 13, 74,205, 9, 87, 1, 63,203,150, 45,107,116,255,157, 36,255,164,164,164,219,146, 50,180, 41, 50, 47, 94,242,
- 60, 31, 31, 24,232,157,215,210,221,252,176, 47,144,203,229,178,241,227,199,171,115,115,115,233,230,205,155,235, 41, 2, 13, 73,
-137,175,204,180,180,180, 70, 53, 27, 46, 41,137, 55,137,129, 26, 83, 56,101, 50, 25, 47,242,231, 16, 30, 30,238,152,215, 63,113,
-226,196, 95,210,211,211,255,205,121, 4, 46, 92,184,208,253,245,215, 95,151, 17, 66,120,201,187, 29,121, 0, 26,222,103, 87,243,
-223, 94, 40,165,186,184,184,184, 37, 59,119,238,124,219, 98,177,160,178,178,210, 17, 3, 0, 0,215,175, 95, 71,101,101, 37, 40,
-165,156,213,238,213,100, 59, 55,255,223,112,217, 95,195, 56, 1,190,228,239,252,156,239,182,165,188,156, 18,240,202, 43,175, 32,
- 47, 47, 15, 9, 9, 9,248,224,131, 15,176,112,225, 66, 8,133, 66, 72, 36, 18, 79,207,149, 80, 74,217,217,179,103,227,223,255,
-254, 55,214,172, 89, 3, 0, 93,247,239,223,127,217,110,177,251,212,153,156,166,173,154, 13,101,101,101,112,145, 7, 64,157,149,
-149, 37, 27, 59,118,172,202,151, 37,143,126,120, 7, 87, 65,128,188, 20, 0,111,146,114,248, 74,216,205,141,230, 32,255,187,113,
-208,152, 55,111,158,236,228,201,147,205, 42,211,110, 13,169,154, 83, 38, 71,120,220,218,122, 0,142,100, 64, 44,203, 98,203,150,
- 45,188,149,128,151, 95,126,153,107,231, 45, 49, 0, 12,195,128,101, 89,252,253,239,127, 87,241, 37, 79,119,242,154,186,146, 32,
- 37, 37,229, 63, 26,141,230,250,193,131, 7,119,241,181,250,111,183,183,173,225,253,117,229, 98,247, 70, 9, 32,132,188, 51,121,
-242,228,156,245,235,215, 31, 23,139,197,224, 86, 5,176, 44,139,208,208, 80,104,181, 90, 46,133,109, 16, 0, 43, 95,131,192, 57,
-248,239,200,145, 35,144,203,229,245,198, 19, 79,227, 80, 73, 73, 9, 45, 41, 41,145, 53,116,241, 55,113,201, 31,128, 70,221,253,
-150, 21, 43, 86, 72, 0,152, 96,139,159,226, 62, 94, 41, 1,206,137,127,158,125,246, 89,199,247,234,234,106,143,175, 89, 76, 76,
- 12, 25, 48, 96, 0,253,234,171,175, 30,219,184,113,227,119, 28,217,110,220,184, 17,222, 70,253,115,184,124,249,178, 35, 37,113,
- 51, 65,189, 99,199,142,198,250,148,122,223,190,125,126,203,255, 54,130, 91, 5,224,138,248,121,173, 2,104,110, 82,111, 76,222,
-221,162, 60,220,173,228, 15, 0,253,251,247, 87,247,239,223,191, 89,101,218, 7,199,219,126,173,206,238,255,134, 36,213,216,178,
- 51,123,251,248,180,141,120,113,189,183,245, 90,195,195,195,119, 55, 37,210,191, 57, 99, 0, 92,245, 97,119,222, 30, 47,250,252,
-137,164,164,164, 22,123,246,236,121,191,180,180,244, 5,131,193, 0,171,213,138, 33, 67,134, 96,216,176, 97,233,114,185,124, 17,
- 31,242, 7,128,130,130, 2,199,119,231, 88,147,130,130,130, 91,182,221, 33, 34, 34,130,216,189, 4, 50, 0, 42, 78,153,112,154,
- 10,240,250,153, 76,155, 54,173,177, 67, 66,167,241, 82,124, 39,198,149,204,204, 76,246,216,177, 99,248,228,147, 79, 8, 0, 94,
- 73,121,158,127,222,125, 78,166,225,195,135, 99,202,148, 41,188,219,224, 73,158, 31,119,159, 18,208, 24,249,187, 84, 0,154,155,
- 4,253, 21,226,252,112,213, 7, 26, 91,118,230,191, 55,119,245,111,232, 38, 76,152, 48, 15,192, 60, 95, 5, 28, 60,120,144,204,
-156, 57,243,182, 40,180,190,102, 14,252, 35,149,197,166, 98,224,192,129,205, 90,140,167,185,229,249,113,119, 41, 1, 30,173,168,
- 33, 67,134,248, 7, 98, 63,252,240,195, 15, 63,252,248, 31, 3,227,191, 5,126,248,225,135, 31,126,248,225, 87, 0,252,240,195,
- 15, 63,252,240,195, 15,191, 2,224,135, 31,126,248,225,199, 61, 8, 11, 0,214,127, 27,252,112, 7,161,255, 22,248,225,135, 31,
-126,248,199,118, 63,254,199, 59,201,220,185,115,125,142,128,117, 21,213,237, 78,158,167,245,199,222,202,107,238,246,249,229,249,
-229,253,175,203,251,233,181, 11, 62, 15, 44, 81,239,119,199,237,150,119,228, 85,223,229, 69,127,112,171,188,180,180, 52, 2, 0,
-132, 16,169,217,108,198,185,115,231, 84, 38,147, 9, 66,161, 16,151, 46, 93,194,147, 33, 61,176,187,168, 8,134,251,187, 34, 38,
- 38, 70, 38, 16, 8, 64, 41, 85, 3, 64, 70, 70,198,109,127, 30, 92,251,156, 65, 8,233, 15,160,221,241,227,199,119,116,234,212,
-137,209,104, 52,146, 78,157, 58,189, 23, 24, 24,184, 10,192,101,251,114, 82, 38, 35, 35,195,234, 70, 94, 75,187,183, 64, 79, 8,
-161, 0,112,241,216,127, 86, 43, 70,151,166,108, 40,138, 60, 39,108, 55, 33,166, 69,203, 86,181, 0, 40,165, 84, 8, 32, 44, 35,
- 35,227,226,109,239,127, 63,253,228,179,188,168,168,168,255,121,121,183, 85, 75,228,155,109,203,219,236,111,190,164,204,173, 92,
-251,181, 84, 24, 30,162, 58,123,250,140,236,190,128, 22, 8,126, 62, 73,125, 55,105, 89,141,229, 35,247, 47,145,188,243,216,186,
-117,171,116,231,206,157,170,244,215,108,219,223,238, 31,141,164,164, 36, 94,207,101,127,254, 33, 41, 67,136,234,212,201,147,208,
-106,181,232,222,189, 59, 90,180,108,137,248,241, 19,120, 63,215,189,123,247,214,123,113,115,114,114,220,214, 82,200,201,201,241,
-185,223,112,133,154, 50, 50, 50,154,214,239, 18, 53,246, 47, 20, 0, 1,178,195,125,151, 21,189, 2,136,120,218,246,189,100, 45,
-112,100, 65,211, 31,234,212, 27,245,219,151,211,134,215,159, 17, 66,168, 78,167,147,237,217,179, 71, 85, 82, 82,130, 68, 81,107,
-116,232,218, 22,117, 58, 3, 2,245, 22,140, 90,248, 12,198, 36, 76,199,246, 47, 51,176, 45, 55, 87, 53, 97,194, 4,217, 93,208,
-133, 79, 91,173,214,142, 37, 37, 37,236,224,193,131,197,145,145,145, 56,122,244,232,107,117,117,117,147,123,247,238, 45, 39,132,
-104, 40,165,158,166, 2,106,156, 55, 44, 22, 11,243, 75,209, 79,189,187,204,142,194,223,135, 15,104, 91,176,231,163,205, 91,126,
-147,254,220,123,224,216, 15,236,242, 46,217, 21, 6,214,239,105,248, 31,115, 19,121,155,191,223,155, 60,248,222,146,191,117,195,
- 14,105,108,219, 46, 42,210, 57, 2,197,181,149,232,216,169,135,202,204, 90,113,242,211,117, 40,239,222, 86, 54, 60, 97, 18, 47,
- 69,224,136, 74, 65,251,246,226,182, 4,248,102, 15,139,253, 63, 82,164,206, 0,250,246, 2, 22, 44,109, 26,113,115, 5, 74,154,
-154,157,204,149, 50,209, 92,114,155,130,212,212, 84,138, 37, 4,228,157,198,207,161,148, 2, 75, 8,166,253,158,120,215,172,181,
-190, 73,254,212, 78,254, 99,112,224,192, 1, 36, 37, 37,121,252,219,251, 7,239,161,253,251, 15, 67,118,246, 21, 28,206,183, 37,
-172, 57,125,242, 20, 0, 96,206, 95,191,166,167,206, 76,149, 5, 75,248, 61,151,241,227,199,179,123,247,238,101,114,114,114,176,
-111,223, 62,183,133,152,124, 77,161,218,216,123,155,166, 80,208, 12, 31, 20, 10, 46, 93,120,147, 83, 25, 71, 60, 93,191,216, 78,
-115, 40, 0, 78,247,201, 94,157,144, 23,206,158, 61, 11,245,230,205,170,119,228,211, 48, 36,233, 89,136,219,135, 1, 66,123,178,
- 63,150, 2,172, 8,172,145, 98,210,211,169, 40,253,215,135, 56,116,232,144,106,228,200,145, 50,206, 11,112,135, 96,101, 24,166,
- 93,155, 54,109,160, 86,171,133,131, 7, 15,198,240,225,195,153,171, 87,175, 70,253,242,203, 47,199,238,191,255,254,161,132,144,
-171,118,178,102,120,222,187, 22,227,198,142,143,248, 96,249, 86,102, 81,242,111,173, 98,226,231,202, 98, 70, 40, 71, 47,252,228,
-210,195,145, 15,204,138, 38,132,212,192, 22, 99,192, 52,214,207,156, 19, 91,121,234, 71, 77, 86, 72,253,168,135,134, 9,128, 26,
-194,167, 98, 64,206, 3,200,144, 89,131, 48,119,212,115, 12,120, 86,238,107,168, 4, 40, 20, 10, 26, 29, 29,141,172,172, 44,234,
- 92,182,212, 43, 98,205, 59, 34,157, 25, 21,171, 18, 91, 89, 88, 65, 17, 88, 25,132,171,215,175,227,106, 77, 21,122, 6,180,128,
-177,248,178,234,240,182,157,178, 17, 60,148,128,190,189,128,147,103, 25, 80, 42,129,149, 4,224,177,241,102, 76,153, 96,192,205,
- 24,154,166,167, 74,104, 42, 73,115,196,191,104,209, 34, 20, 21, 21, 1, 0,118,156, 20,161,206,108, 86, 41,254, 58,204, 43, 69,
-192, 27, 37,206,158,226,213,253,115, 89, 98, 59, 28, 29, 29,221,120,254,246, 37,190,189,227,219, 63,191, 34,221,246,203, 91, 14,
-133,103,242,160, 37,178, 71,158,235,212,228, 1,119,235,214,173,210, 29, 59,118,168, 24,134,193, 75,239,195, 81,253,140, 79, 29,
-140,176,176, 31,164, 49, 35,210, 0,108,195,232,209,255,170,119,108,230, 76, 96,210, 36, 96, 18,114, 84, 43,254, 5, 94, 74, 0,
- 71,254,106,181,237,212,233,211,167, 59, 10, 43,121, 67, 96,238, 44,127, 46, 37,179,243,245,165,165,249, 70,254,205,134,232,229,
- 0,128,149, 43, 87,222, 84, 0,134,166, 3, 71, 95,186, 35,205,217,183,111, 31, 86, 77, 73, 69,207,177,227, 1,129, 17, 68,196,
-128, 8, 25, 16,129, 8,148, 18,176, 58, 11,168,213, 10,106,178,226,153,167,159,197,179,111,206,195,217,246,237, 85,189,122,245,
-186,147,158, 0, 82, 84, 84, 20,219,181,107, 87,113, 73, 73, 9,242,242,242,112,242,228, 73,140, 31, 63, 30,177,177,177, 29,215,
-172, 89,243,238,180,105,211,158,241, 66, 1, 16, 28,200,253,239,255, 61, 62, 68,223,254, 72,141, 0, 51,151,212,226,193,168,143,
-241,220,252,233,194,143, 22, 85,246, 92,244,209,250,153, 17, 81, 51, 51,209, 72, 26,100,103, 66,119, 30,211,211,210,210,168,171,
-253,205, 93, 16,206,143,219,224, 1,112,126, 72, 27,118,173,175,236,117, 95,175, 80,197, 59,207,176,115, 71, 61,199,123,240,200,
-204,204, 36, 89, 89, 89,148, 75, 75,202,253,175, 80, 40,104, 98, 98,162,119, 86,245,174, 67,210,137,145, 3, 84,226, 58, 11, 2,
- 63,122, 25, 22,189, 9,146,151,150, 34, 68, 44, 65,157,200, 0, 93,157, 1,129, 32, 48, 94, 44, 87, 85, 85, 85,201, 66, 66, 66,
-220, 14,194, 39,207, 2, 89, 27, 89, 0,122,251, 7, 24,253, 0,131, 41, 19, 8,156, 3,105, 83,103, 0, 89, 27,125,240,152, 38,
- 38,202,236,215,233,147,181,206,145, 63, 71,252, 0,144,121,192, 12,131, 73, 7, 0, 24,183,104, 47,178,151,141, 87, 1,224, 45,
-255,236,135,103, 33, 34,197, 55, 59, 2, 41, 3,105,211,215,105,187, 28,109,255,202, 47, 69, 40,121,199, 70,254,238,106,204, 19,
- 69, 54,181,157,195,207,250, 63,186,195, 44,205,218,250,188,138,130,226,131,249,223, 98,132, 52, 18, 27, 62,223,143, 47,246,164,
-169,118, 40, 40,230,254,229, 45,217,144,209, 29,125, 82, 4,106, 47, 40,232,216,193, 64,246, 87,199, 65, 41, 69,203,118,247, 59,
-200,127,213,170, 85,110,219,167,171, 83, 74, 83, 19, 59,170,128,207, 0,124,139,195,135,129, 17, 35,110, 30,127,247,221,155,223,
- 95,124, 33, 71,149,241, 69, 31, 25,195,118,117,219, 78,142,252,227,226,226,192,178, 44, 62,253,244,211,102,123,193, 21, 10,133,
-131,252,235, 43, 5, 10,154,145,225,254,157, 99,166,105,235,169,191,196,254, 15,155,232,226, 60, 98, 63,145,216,190, 12, 30,124,
-235, 28, 59, 51, 93,235,240,202, 3, 0,203, 38, 99,254,252,249,142,227,243,231,207,199,202,149, 43,193,244,158,125,243, 87,237,
-231,187,146, 39,156,238,186,125, 22,139,139,243,120,180,175,174,174, 14, 29,186,247, 0, 88, 19,152, 0,128, 8, 5,176,212, 84,
-161,174,228, 28,174, 95, 42, 67,151,145, 82, 16,113, 40,136,217, 4, 8, 24, 44,155,187, 16,227,179,222,194,130, 5, 11,154,117,
- 80,246,148, 42,219,137,108, 9,165, 52,212, 96, 48,140, 12, 15, 15,199,169, 83,167,192,178, 44,206,157, 59,135,181,107,215,162,
- 95,191,126,232,220,185,243, 44, 0,207, 52, 32,107,182, 49,242,166,148,182,233,206, 28,150,118,236, 22, 47,174,204,251, 13, 85,
-218, 0,252,123,187, 5, 59, 11,254,131, 23, 18, 3,133, 66, 61, 27, 13,204,108,180, 14,194,237, 40,110,229,135,119,104,172,239,
-184,242, 12, 8,249, 18, 63,165, 20,178,215,226,144,149,151, 25,154, 10, 5,126,254,234, 55, 96,148,227,181,226, 5,142,244,245,
-250,245, 0, 8,234,234,214, 32, 60, 92,137,236,236,108,120,147,198,115,120, 64, 43, 85,187, 58, 43, 36, 75,158,133,245,134, 6,
-150,203, 55, 32, 20,139, 16, 68, 4, 8, 38, 2, 4, 11,132, 8, 23, 73,160,173,169,196,149,125,135, 84, 33, 83, 30,114, 59,208,
-185, 34,245,253, 63,178,118, 5, 0, 88,190,152,128, 18,192, 22, 30,227,125, 7,183,147,178, 44, 59, 59, 91,149,157,157,237,211,
- 20,130, 51,249, 67, 40, 64,201, 21,219,224, 87,122,173, 14,221,218, 75,208, 59,121, 27,178,215, 38,168,248,186,215, 69,164, 24,
- 66, 82, 6, 1,185, 1, 43,109,131,128,118, 4,193, 51, 46,131,101, 53,168,171,203,134,181,232,239,222,121,114,121, 84,110,243,
-166,196,107,230,214,231, 84,177,225,175,227,211,111,103,163, 5,211, 13, 0,240,236,243,125, 48,120,120, 4,214,127,150,135, 85,
-255,121, 91,149, 57,218, 55,215, 33, 33,128,226,197, 99,142, 65,239,193, 7, 31,196,254,253,251, 61,146, 63, 0, 36,205, 16,169,
-128,125, 0,142,161,242, 90, 11,244,238, 6,172, 94, 93, 11,149, 10,232,221, 27,136,136,176,137,168,188,214,194,246, 50, 14,250,
- 93,245,235, 47, 93,137, 59,242,223,183,111, 31, 88,150,117,144,244,166, 77,155,154, 76, 32,206,219, 13,201, 31, 0, 60,145, 63,
- 0,100,100,102, 18, 10, 72, 9,160, 78, 77, 77,109,180,227,179, 78,131,126,102, 86,150,140, 16, 96,213,231,171,110,137,121, 89,
-149,145,233,236, 95,145, 82, 74, 85, 31,127,252,177, 99,199,199, 31,127,140,149, 43, 87, 34, 35, 35,163,126, 21, 57, 2,169, 43,
-121, 25,182, 20,182, 50, 74,169,250,153,103,158,105,180,125, 22, 39, 47, 74,214,234,213, 50, 66,128,140, 85, 25, 42, 87,228, 37,
-108,217, 18, 16, 9, 96,213, 87,226,247,157,185, 88,191, 57, 7,159, 95, 62, 7, 0, 40,124,187, 21,122,143,153, 4, 99,233, 69,
- 28,255,229, 8,126, 59,119, 26, 85, 87,175,226,216,177, 99,205, 86, 88,107,237,218,181, 82,126,125,152,132, 80, 74,251, 22, 21,
- 21,125,244,198, 27,111, 12,248,232,163,143,196, 38,147, 9, 2,129, 0, 45, 91,182,132, 78,167, 67, 97, 97, 33, 34, 34, 34,184,
-186, 5,238,172,255, 96, 66, 8, 75, 41, 13,175,188,116,240,199,183,255,175, 52,252,203,249,157,160,209,137, 33, 22, 50,232, 18,
- 38,193,213, 27, 38, 40,254, 97,193,224, 97,209,193,221, 60,120, 18,210,210,210, 40,167, 8, 56,247,197,198,190,251,113,251,193,
-145,127, 67,229,128,241, 52,136,112,245,190,235,185, 57,227,147,188,110, 64, 86, 86, 22,181,145,255, 6, 7,249, 75,126, 60, 15,
-253,238,251,234, 29,247,104,185,102,110,144,134,104,106,192,138,133, 48, 29, 57, 14,227,239, 37,168,219,179, 31, 48, 24, 33,166,
- 20, 65, 16, 64, 8, 2, 35,107,129,198, 88,135,207,247,110,247, 40,115,249, 98,155,117,239, 12,219, 54,103,174, 80,156, 58, 67,
-177, 96,169,239,125, 86, 46,151,171,157,221, 94, 74,165,146,215,139,174, 84, 42, 29,181,181, 57, 60,185,242, 18,114,143,104, 81,
-122,173,206,161, 4, 20, 95, 50, 0,242,205, 80, 42,149,188,220,145, 66, 98,171, 28, 38,170,249, 13,193,193,103, 16, 32,169, 1,
-203,106, 96, 54, 31,129, 64, 16, 1,147,174,226,142,117,214,220,111,142, 73, 1, 82,143,252,175,156,162, 24,154, 32,192,243,239,
-141,199,131,227, 7, 0,160,246,243,188,195,134, 13, 27,232, 75,239, 19,180,104, 59, 8, 20, 64,252,148,185, 56,112,224, 0,175,
-191,101,153,139,180, 93,187, 95, 29,228, 95, 83, 97, 43,193, 60,120,176,141,252,185, 66,128,182, 99,129,168,169, 8, 68,120,208,
- 21,183, 50,167, 78,157, 10,153, 76,134,177, 99,199, 98,250,244,233, 16, 8, 4,183,124,156,247,243,133,171,247,214, 39,101,201,
-137,136, 9, 33,142, 79, 99,251, 8,160, 6,133,186, 17, 89, 55,223,175,212, 84,149, 43,203,121,254,252,249, 72, 77, 77,173, 79,
-168,141,200,251, 54, 51, 19,199,142, 29, 83, 17, 66,164, 0,234,221, 51,135, 63,187,193, 62,119,237, 19, 83, 10, 38, 40, 0,230,
-171, 23,144,249,250,235, 88,171,171,132, 54, 46,198,113,252,203,255,172,197, 91, 11,231, 32,114,193,147,120,231,183,125,216,172,
- 61,135,241,143, 60,130,136,136, 8,175,167, 0,214,174, 93, 43, 85, 40, 20,116,205,154, 53,245,250,112, 65, 65,129,202,221, 52,
- 20, 33, 68, 68, 8, 25,246,219,111,191,149,230,229,229,169, 95,122,233,165,152, 79, 63,253, 84, 82, 91, 91,235, 40,211, 92, 87,
- 87,135, 22, 45, 90, 20, 79,155, 54,173,207,168, 81,163,186,121, 80, 36, 24, 66, 72,247,223,242,183,148,159,222,189,224,252,130,
- 87,211, 59,110, 91,210, 9,191,151, 9, 81, 85, 43, 0, 75,128,138, 90, 19,104,235, 94,117, 47,190,182,116,192,195,143,253,197,
-227,116, 66, 70, 70, 6,225,198,186,204,204, 76,143,223,253,184, 51,228,239,210, 3,224, 76,252,124,198, 25,111, 44,145,155,174,
-182, 53, 46,189, 3,245,226, 12, 26,113, 99, 12,104,211, 94,165,161,102,136, 43, 52,144,124,187, 15, 68,200, 0,117, 38,208, 26,
- 29,136,197, 2, 17, 0, 43,101, 81,103,181,160,198, 98, 2, 88,207,115,168, 92,144,223,242,197,141, 15,131,182, 32,193,166, 15,
-168,153,153,153,132,115,233,243,177,214,111,177,254, 1,252,247,185,142,245,182,135,189, 82, 2, 17,189, 1, 51,105,131,236,236,
-236,125,124,189, 0,146, 90, 21,194,223,249, 15,174,191,148,134, 27,154, 64,116, 50, 31,135,213, 90, 2, 0,184,240,115,135, 59,
-214, 97, 55,239,250, 68, 53,103, 66,102, 61,242,231, 16, 19,246, 58, 70, 14,152,138,216,240,227,216,188,235, 61,213,184, 41,252,
- 7,145,245,235,215,211, 31,126,248, 1, 21, 21,227,208,186,117, 46, 90,180, 25, 8, 74, 41, 24,134,225, 21,136, 84, 90, 10,148,
-148, 28,227, 38, 18, 0, 73, 45, 52, 58, 96,248,112,219,158,226, 98,224,179,207,128,154,106, 64, 87, 11,212,234,128,224,176,106,
- 94,109,107,108,174,255,236,217,179, 0,128,247,223,127, 31, 0, 16, 25, 25,217,108,110,102,231, 62,201,231,111,230,205,155, 7,
-103,139,189, 33,113,123, 1, 41,112,115,238,223, 25,156, 23,192,126,142,218,157,144,217,157, 35,113,250,248, 9,148,133,133,169,
- 24,134,193, 11, 47,188,128,127,253,235, 95, 62,183,111,180, 49, 20,148,173,197,156,247, 23, 99,208,212,169,200,124,255,125, 48,
-204, 77,158,203, 44, 62,118,211, 67,184,127, 63,246,238,221,139,115,231,206,121, 29, 4,184,118,237, 90,105,126,126,190, 10, 0,
- 10, 11, 11, 85, 12,195,200,146,147,147,213,107,214,172,145, 82, 74, 17, 27, 27, 43, 51, 24, 12,170, 70, 20, 59,115, 65, 65,193,
-160,164,164,164, 86, 61,123,246,196,206,157, 59,245, 85, 85, 85, 66,131,193, 96,243,118,216,231, 63, 38, 78,156, 24, 73, 8, 9,
-164,148, 26, 92,136, 97,156,228, 49, 37,167,126, 94,249,214,223, 83, 90,180,238,157,141,159,178,159,198,175, 23, 9, 74,175, 9,
- 1,202,192,104, 50, 67, 67, 91,151,253,109,246,179, 49,132,144, 50,218, 12, 90, 37,159, 56, 27, 63,254, 24, 52, 58, 5,144,151,
-151,119,203,190,202, 50,173,215,100,231,236, 1,176, 77, 1,216,250,143,228,199,243, 8, 56, 86, 6,107,168,205,138,106, 56,135,
-220, 88,181,184, 19,151, 74,161, 15, 8, 68,132,197,130, 46,129, 45, 16, 36, 18,131,152,205, 0, 75, 97,177, 90, 81, 99, 53, 65,
-111,181,192, 72,173,176,130,130,122,209,217, 22, 44,189,169, 4,216,226, 2,110,146,254,242,197, 2,164, 47, 38,120,105,169,165,
-201, 55, 93, 46,151,171,185,210,165,124,176, 40,219,118,223,151, 37,134, 57, 8,223,225,202,167, 55, 32, 2, 32,164, 90,124, 53,
- 39,204,242,164,146, 95, 92,135,232,218,143,176,194,230,166,254, 72, 24,130, 39,175, 93, 64,209, 63,186, 32,184, 67, 63, 84,149,
-149,225,234,249,203,119,180, 99, 14, 30, 30, 1,157,189,187,233, 3, 79, 32,200,208, 31, 95,191,109,118, 28, 31, 37, 31,128,252,
-205,222, 89,254, 83,198,252,128,111,191,149, 35, 52, 95,137, 21,139,129, 23,151, 82,140, 25, 51,134,247,178,191, 30, 93,186,146,
- 94,189,234,107,129,219,183,219, 2,255, 54,108, 0,122,247,166, 88,185,146,224,157,119,106,109, 10, 2,128,222,125,194,240,210,
-139,252,218,200, 89,169, 83,167, 78,197,166, 77,155,234, 89,178,241,241,241,141,146,155,175,138,168,151, 30, 60,217,202,149, 43,
- 85,141, 41, 0,203,151, 47, 71, 86, 86, 22, 47, 75,248,153,103,158, 81,113,145,255,174,240,226,139, 47, 98,197,138, 21,170,172,
-172, 44,183,109,252,225, 68, 41, 94,123,103, 33,102, 47,249, 59, 94, 53,153,240,241,199, 31, 55,122,143,150, 47, 95, 14,165, 82,
- 9, 66,136,180, 49,194, 30,211,191, 27,214,124,249, 25,162,103,206,196,219,111,191,237, 86,105,152, 63,127, 62,150, 47, 95,142,
-213,171, 87,171,189,189,247,249,249,249, 42, 46, 88, 78,161, 80,208,130,130, 2, 85,114,114, 50, 57,124,248,176,138, 16,130,228,
-228,100,245,170, 85,171, 26,253,123,189, 94, 31,186,125,251,118,140, 27, 55, 14,197,197,197, 65, 58,157, 14,102,179, 25, 12,195,
-192,100, 50, 33, 49, 49,145,216,201,221,192,199,177,101, 52, 26,197, 71,182,204,196,152,199,223,193,238,188,179, 56,119, 69,128,
-106, 29, 3,129, 16, 40,211, 5,226,133, 87, 22,199, 2,184,196,151,251,185,184, 19,128,223,116,128, 31,119,198,250,135, 43, 55,
- 14,231,154,145, 74,165,144, 74,165,248,229,151, 95, 28,159,146, 31, 47,160,202, 80,133,214,195,189, 95,247,203,145,123, 80, 80,
- 18, 36, 63,158,135,232, 66, 5, 40, 33, 16,207,174,168,119,220, 35,113,137, 5,176, 82,224,146,174, 18,165, 85, 26, 92,175,214,
-162,170,174, 14, 90,147, 1,215,141, 6, 92,169,211,163,172,174, 22, 26,179, 17, 90,214, 12, 19,235, 57, 27,230,232, 7, 92, 12,
-120, 78,113, 1,115,166,183, 0,133, 24,212,187, 50,224, 14, 23,126,195,206,206,215,253,239,176, 60,175,213, 33,247,136,182, 30,
-241,115,228, 31,192, 94, 64, 0,123, 1,111, 77, 20,162,180,180,212,196, 87,230,150,115, 44,218,166,103, 56,182,207,233,172,184,
-116,182, 12,167, 14, 30,199,213,243,149,119,188,227,110,248,220,166,128, 86,151, 83, 4, 25,250, 67, 58, 91,136,199,151,136, 28,
-159,244,205, 51, 65, 64,120, 15, 72,143, 62,152,135,167, 23,200, 17, 86,144, 11, 66, 8,190, 59,104,123, 4,124,201,159, 67,100,
-223, 62, 13, 20, 11,224,211, 79,129, 51,103,108,158,128,183,223,166, 14,247, 59,165, 20, 97, 97, 97,158, 71, 96,123, 31,181, 90,
-173,176, 90,173,120,255,253,247,113,246,236, 89,156, 62,125, 26,167, 79,159,134, 82,169,196,194,133, 11, 81, 90, 90,122, 39, 31,
-137,186, 49, 75,122,222,188,121,156, 85,199,139, 12, 9, 33, 46,173,127, 14,238,142, 57, 99,127, 64, 37, 8,211, 2, 95,188,182,
- 20, 45,182, 43,145,154,154, 10,231, 82,195,138,222, 3, 49, 47,122, 36,130,130,130, 48,102,204, 24,188,241,198, 27, 80, 42,149,
- 42,173, 86,235,242,253,251,178,236, 52,174, 12,232,143,206,157, 59,203, 88,150,109,212,219,193,121, 42,124,245,188, 56, 71,202,
-199,198,198,202, 56,162, 4,128,152,152, 24,153,135,123, 55,118,204,152, 49,173, 74, 75, 75,177,127,255,126,220,119,223,125, 16,
- 10,133, 14,101,177,115,231,206,124,167, 35, 88,187, 60,210,171,111,212,162,172, 61,161,248,117,231, 18,140,142,237,135, 96, 9,
-131,224, 32, 43, 2, 3,140,120,232,209,105, 44, 0, 77, 67, 93,213,147,114,201, 93, 31,159,233, 0, 63,238, 28, 24,119, 15, 49,
- 51, 51,179,229,188,121,243, 48,111,222, 60, 0, 48,189,155,246, 46,204,229, 22, 4, 6, 74,124, 74, 70,146,152,104, 11, 31, 14,
-154,120, 6, 84,192,224,141,175,245, 14,235,159, 47,130, 58,119,150, 89, 90, 4, 65, 75,173, 56,161,211,226, 88, 85, 5,142, 87,
-223,192,241,106, 13, 78,232, 52, 56,163,215,162,194, 88,135, 90,139, 5,151,245, 58,199,111,186,195,148, 9, 4,203, 23, 11,176,
-124,177, 0, 20, 2, 80,194, 32,117, 6,193, 51, 51,196,152, 61,189, 45,122,245,106, 15, 22, 34, 0,222, 93, 50,231,234, 79, 76,
- 76,148, 53,220,231,197, 61,147, 21, 95,178, 41,242, 69, 31,218,130,232,118,191, 28, 98,115,223, 80, 45, 4, 84, 7, 35, 99,139,
-104,214,104, 52, 65,137,137,137, 94, 21, 69,143,142,142,134, 82,169,196,134, 90, 29, 12, 38, 6, 79,111,252, 2,229,146, 64, 24,
- 76,119,174, 76, 68,194,224,183,100,249,154,165,216,240,239,155, 38,254,215,111,155, 17, 19,246,250, 77,133,242,225,207,100, 25,
-153, 25,188,114, 75,172,120, 29, 72, 94, 48, 14,161, 5, 74,200,254, 17, 7,102, 50,160, 86,171,125,234,195,221,187,215,143, 30,
- 31, 59, 22, 8, 13, 5, 34, 34,128, 17,131, 91, 66, 34, 22, 64,192,220, 20, 43, 9, 12,244, 56, 32, 51, 12,227,152,235, 63,123,
-246, 44, 34, 35, 35,235,125,222,121,231, 29,188,243,206, 59,184,124,153,191, 87,198,213,124,189, 51,210,210,188,183,192,178,178,
-178,100, 43, 86,172,112, 73,216,124,173,127, 39,215,243, 45,113, 10,220, 54,203,242, 75, 97,111, 34, 4,172,222, 8, 81,135,238,
- 80,188,247, 30,146,131, 67, 17,170,206,119, 28,159,253,151,100,188,245,209, 23, 40, 94,254, 95,188, 57,104, 44,166,133,245,196,
-222,173, 91, 81, 82, 82,226,242,253,123, 44, 77,129, 1, 3, 7,202,184,160, 70, 78, 33,115,158,158,113,181,207,141,245, 69,211,
-210,210, 40, 23,216,199,205,247, 59,147,124,114,114,178, 58, 38, 38, 70,198,185,254,147,147,147,213, 30,238, 91,158, 72, 36,186,
-239,177,199, 30, 59, 91, 85, 85, 5,173, 86,139,192,192, 64,180,109,219, 22,161,161,161, 8, 13, 13,245,116,243,216, 6,242,172,
- 1, 1, 1,250, 39,210,254, 37, 91,251,227, 48,156,191, 88,141,246, 33, 2,196,246, 33,184,191, 39, 69,112,171, 86,149, 0,172,
-110,120,195, 95,111,224, 30,181,254, 1,207,203, 0,107, 51, 51, 51, 3, 0, 4, 43, 20, 10,135, 22,216, 37,174,147, 79,154,111,
-102,102, 38,145,203,229, 80, 42,149, 84, 60, 59,187,158, 43,146,111, 30,128,214,143,140, 83, 87,100,239,132,222, 98, 68,181, 78,
-143,179,102, 51, 68,172,205, 81, 95,101,174, 3, 75, 41, 40,128,157,215,206, 65,103, 49, 3, 0,143,129,137, 96,193,210,250,125,
-220, 54, 21,192,194, 10, 35,126, 63, 83,131, 53,155,170,189,186, 94,103,162,151,203,229,234,134, 94, 0,103,165,192, 29,228,114,
-185, 58, 91, 49, 13,162,113,159, 3,136, 64, 69,197,205,224, 60, 49,123, 5, 38,166, 35,254, 54,232, 52,174, 92,177, 13,196,153,
-153,153,185,124,228,166,125,157, 85, 79,241,202,206,206, 6, 55, 41,177,241,183, 67, 94,173,202,104,110, 60,252,108, 71,245, 54,
- 5,197, 65,229,113, 0,192,200, 1,182,204,120,127,159,191, 4,135,142, 15,192, 71,155,103, 34,115,251,179,170,204, 4,126, 4,
-254,244, 2, 57,194,195,149,206,134, 44, 52, 26, 57, 40,205,182,187, 42, 41,178,179, 19,121,201,154,250,248, 19,100,239,238, 61,
- 20,176,185,254,101, 50,130, 27, 23, 67,160,211, 74, 96,168, 22, 99,227, 58,130,121,243, 40, 46,148,215, 96, 68,108, 12,102, 78,
-159,193,203, 42,182, 90,173,142,249,126,165,210,214, 86,103,194, 47, 47, 47, 71,121,121,185,215,238,125,133, 66, 65, 25,134,185,
-133, 84, 51, 50, 50,137, 15, 73,128,212,148,210,122,177, 0, 78, 30, 1,222,174,112,103,215,126,195,232,125, 79,110,255,134, 74,
-142,165,166, 6,162, 54,225, 16, 4,181,192,128, 39,166,226,157, 9,227,241, 26,183,108, 47,106, 40,172,134, 58,136, 90,183,199,
-160, 24, 41,122,116,233,137,127,253,158,143,129, 3, 7,202,126,252,241,199, 91,148,128, 52,133, 2, 0, 81, 1,192,179,105,105,
-142,165,131,150, 6,100, 47, 20, 10, 0,122,115,161, 34, 1, 48,216,197, 32, 59,100,200, 16, 66, 41,117,184,248, 11, 11, 11, 29,
- 46,126,231,243,236,219, 30,201,223,110,176,191, 30, 26, 26, 58, 32, 38, 38,166,215,201,147, 39,113,244,232, 81, 88,173, 86, 4,
- 7, 7, 67,175,215,151,135,135,135,159,247,198,232, 35,132, 48,237,219,183,223,251,232,163,143,182, 47, 56, 80,136,149,217,123,
-209,138,136,209,167,189, 17,103,110, 4,227,193, 62,230,115, 0,204,156,130,102, 87, 40,173,238,158,137,243, 88,231,159, 2,184,
-187,193,103,190,216, 4,192,228, 76,212,151,242, 46, 3, 51,189, 39,127,103,178,113, 53,104,241, 85, 2,170, 53, 90,153, 57, 72,
-162,170, 98, 88, 92,173,171, 5,204,102, 88, 41, 5, 1,240,123,109, 37,202,244,213,160,148,114, 73,108,120, 12, 76, 20,169, 51,
- 8,178, 54,222,236,147, 39,207, 2,125,123, 89, 32,128,174, 73,228,239,220,217,125,117,121, 37, 38, 38,202,178,179,159, 85, 1,
- 69,208,104, 52,166,210,210, 82,225,178,241, 96, 22,237, 29,131,249, 3, 15, 57,172, 48,190, 74,133, 43,175, 75,195,109,142,132,
-248, 90,115, 88, 66, 48, 44,171,132, 2,174,151,251, 57, 50, 1, 42, 65,249, 4, 41,166, 37,124, 46,203,220,246, 55, 85,254,102,
-138,216,240,227, 24, 37, 31,128, 3,123,143,163, 64,251, 30, 8, 8, 20, 9,159,241,190,214,240,112, 37, 8, 33,152, 50,101, 10,
- 86,175,174, 6,103, 20,219,254,167,246,123,156, 93,111, 64,114, 51, 5,139,184,177, 50, 89,222, 62,149,106,236, 88,192,116,181,
- 43, 46, 86, 6,128,181,207,182,118,212,181,199,203,169, 53,216, 91,208, 7, 45,187,244,225,213, 70,142,248, 47, 93,186, 4, 0,
-184,122,245,170,195, 51,112,237,218, 53,199,192,234, 11, 50, 51, 51, 9,151, 8,168,225, 28,110, 70,102, 38,225,147, 15,192, 25,
-171, 87,175,174, 23, 11,176, 98,197, 10,175,173,255,134,132,225, 43, 36, 18, 9,174, 94, 56,143,158,189,122,131,181, 24, 65, 44,
- 86, 8, 91,182, 66,203,161,195,208, 34,234, 1,176, 58, 11,172,122, 35,168,197, 10, 88, 89, 44, 90,245, 17,166,207,156, 14,137,
- 68,226, 82,158,101, 99, 24,175,223,117,117, 94,244, 7,174,207,141,141,141,149, 21, 20, 20,168,184, 49, 96,212,168, 81, 46,239,
- 21, 15,242, 7, 33,132, 5,176,171, 79,159, 62, 81,159,124,242,137,233,250,245,235,117,227,199,143,127,180,168,168,232, 77,189,
- 94, 95,209,166, 77, 27, 69,255,254,253, 53, 94,220,123, 17,128,110, 49, 35, 70,180, 77,155,157,134,115,151,206,105,158,154,157,
- 54,250,240,222,117,233, 87,106, 52, 35,135,197,141,103,219,119,137,124,220,133,215,128,117, 55, 22, 56,115, 69, 99,201,127,252,
-137,128,238, 29, 5,160, 81,235,194, 23,242,231,200,134,203, 9,224,139, 18,208, 83,145,164, 6, 64,202, 50,215, 82, 4, 74,160,
-165, 22,152, 44, 22,176,148, 69,235,144, 16, 92,210, 85,241,203, 96,103,135,171,229,125, 55, 99, 0,188,203,196,230,202,197,223,
-212,116,189,246,191, 77, 24, 54,108,216,182, 69,139, 22,137,195,195,195,217, 43, 87,174, 96,254,192, 43,245,200,223,155,223,112,
-117,255,125,134, 61,203, 95,195, 36, 79,174,206,225,139,168,135, 5,234,140,135, 51,200,214, 79, 47, 75,119,252,246,182, 42,127,
- 51, 64, 64,144, 48,248, 45,217,195,207,242, 79, 0,196,245, 37, 27,193, 87,219, 7, 41,192, 21,239,172, 77,183, 57, 79,130,187,
-101, 16, 96, 85,163, 3,211,204,233, 51,212, 51,167,207, 32, 21,218, 79,164,214,154, 26, 21, 17, 0,250,186, 64,144, 26, 11,132,
-140, 16,122, 70, 34,155, 48,109, 14,132,148,120,108,231,248,241,227,201,125,247,221, 71,111,215,251,103,179,246, 51, 72, 90, 90,
- 26,117,142,104,119,246, 4,120, 41, 78,205, 89,254, 78, 10,133,250, 78, 12, 94, 99,199,142,197,223, 54,103,225,157,154, 74, 12,
-137,123, 16, 76,251, 48, 91,155,204,212,150,186, 23, 34, 16,129, 16, 68, 44,192,234,140,229,104, 53,110, 24,122,245,234,245,135,
-166,238,229,172,251,252,252,124,213,136, 17, 35,100,179,102,205,106,210,111,159, 61,123, 86,158,155,155,123, 65, 32, 16,108, 29,
- 61,122,244,187, 12,195, 92,143,137,137,201,115, 88, 50, 78, 30, 37, 66, 8, 92, 61,115, 39, 79,128,242,232,209,163,195,191, 90,
-187,142, 17, 11, 2, 46, 78,125,114,234, 96,134, 97,180, 15, 78,154, 51, 25, 64,136,157,248,107, 0, 80,139,197,226,144,215, 64,
-105,243,151,148,191, 11,193,199,253,239,147, 2,208, 28, 10,131, 59,242,241,102,128,147, 41,146,137,114,175, 82,202,158, 42, 86,
-233,140, 38, 88,172, 86,244, 26, 62, 20,145,150, 17, 94,145, 97,115, 6,163,112, 73,127, 0,168, 56, 79,135,211, 84, 0,105,130,
-220,237,114,185, 92,168, 84, 42, 23, 44, 91,182,236, 31, 78,202,197,216,204,204, 76,175, 18,145,216, 61, 5,205,150,188,100,218,
-239,137,246,251,216,248,245, 77, 83, 42,125,210,244, 31,121,174,147,250, 17, 52,253,249,216,200,157,224,233, 5, 99, 29,121,202,
-185,113,108,109,122, 46,130,187,101,144,224,110,137, 94,201, 12,109,245,188,250,224, 5, 16,150,185, 40, 53,232,109,117, 0,130,
- 37,114,117, 72,103,120,181, 98,212,169,255,137,236, 26,103,179,207,171,114, 74, 64,115,200,178,199, 2,168,184,239, 77,149,231,
-235,202,178, 94,189,122,161,195, 11, 47,200, 86,238,217,163, 42,121,247, 91, 36,138, 90, 35,212, 94,188,199,160,183, 96,222,194,
- 87, 33, 8, 10,199,206,117,153,248,165, 13,193,132, 38,228,237,183, 90, 45,240, 54, 6,168,161, 18,192,199,202,247,112,159,200,
-233,211,167,175, 83, 74,211,251,246,237,251,127, 21, 21, 21, 58,161, 80, 8,139,197, 66, 91,183,110,237,240,168,232,116, 58,136,
-197, 98,135, 23,201,141,188, 49,133,133,133, 96, 45, 4, 35, 71, 13,126,235,210,165, 75, 90,141, 70,131,240,240,112,182, 75,151,
- 46, 90,238,217, 84, 85, 85, 65, 34,145,128, 16,130,128,128, 0, 94, 70, 31,167, 36, 52,252,222,208, 43,234,199, 61,230, 1,184,
- 93, 74,129,207,196, 56, 94,174,198,120,249, 93, 21, 77,106, 87, 2,200,109,152, 71,183,202,229,242,127,202,229,242,127, 54, 71,
-251,154,241,122, 73,115,156,115, 59, 97,179,234, 1,123,138,253, 6,199, 18,155, 36,155, 97,187,170,131, 37, 93,155,163,153,230,
-219,121, 15,154,177,232,138,218,155,185,122, 15,202,132,207,114, 40,165, 36, 40, 40, 8, 83,166, 76,129,189,124, 47, 74,157,202,
-247, 30,204,221,235, 40,223, 59, 46,102, 28,236, 74,111,163,191,183, 90,251, 1,121, 38,236,213, 91,137,137,103, 53, 65, 30, 74,
- 64,147,241,192, 3, 15, 24, 45, 22, 75, 30, 0, 29,203,178,212,100,178, 45,252,185,126,253, 58, 0,160, 69, 11,219,210, 94,110,
-191, 72, 36,114,123,255, 30,126,248, 97, 78,198, 30,150,101, 17, 26, 26, 10,150,101, 29, 43, 78,236,171, 88, 72, 93, 93, 29, 5,
- 0,177, 88, 12, 66, 8,243, 71,140,237,126,248, 14, 62,169,164, 1,128, 12, 25, 50,196,175,137,249,225,135, 31,126,220, 59,176,
- 0,168, 3, 32,105,102, 35,206, 83,193, 32,222, 21, 5,253,184, 55,224,127,152,126,248,225,135, 31,247, 22,132, 0, 90,240, 32,
-127, 61,108, 65,220,205,197, 7, 44,252,203,254,254,116, 29,201, 15, 63,252,240,195,143, 63, 31,130,252,124,225,135,223, 3,224,
-135, 31,126,248,225,135, 31,126,109,242,131,254, 0, 0, 32, 0, 73, 68, 65, 84,248, 21, 0, 63,252,240,195, 15, 63,252,248, 95,
- 71, 61,151,206,220,185,115,125,142,224,116, 85,188,231,110,151, 23, 49, 52, 0,129, 1, 87, 33, 18, 87,130,101,109,203,194, 4,
- 2, 6, 12, 17,216,254,103, 8, 8, 97, 64,137,208,182, 6, 22, 22,108,219, 33, 2,165, 20,225, 76,107,120,217,190, 0, 0,109,
- 96, 11,224,169,129,109,185,151, 25,246, 57,181,123,241,254,249,229,249,229,249,229,249,229,221, 46,121, 63,253,244,147,207,242,
-162,162,162,254,231,229,121,173, 0,252,175,225,135, 3,103, 48,124,152, 25, 97,161,128, 70, 75,240,211, 47, 18, 8, 25, 33, 38,
- 77,180, 98,175,170, 45, 8, 97, 64, 24, 6,146,150,192,216,225,149, 0,132,120, 48,150,162,176, 72,104,163,113, 30, 80, 29, 58,
- 64, 1, 64, 68,205, 24, 49,122,236,133,211,191,254,104, 44,175,174,139,180,234,235, 32,151,203, 67, 1, 84,249,245,208,123, 27,
- 57, 95,255, 91,218,187, 87, 79,213,245,235,117, 77, 74,248,116, 15, 65,154,154,154,234,156, 7,160, 73,215,156,154,154,234,115,
- 58, 96, 63,252,240,163,153, 60, 0, 28,214,125,245, 37,111,109,226,233, 89,179, 61,190,172,205, 45,175, 57, 81, 88, 36, 66,252,
-120, 43,126,249, 53, 16, 98,145, 16, 66,129, 16, 34, 17, 69,128,192, 12, 8, 91, 66, 8, 3,134, 15,176, 64, 34, 14, 0, 5,208,
-177, 61,240,200, 36, 22,185, 91,249,145,255,153,223, 79,227,190,254,189,208,169,115, 40, 46, 93, 56,217, 61,164, 67, 79,180,233,
-100,197,247,223,125, 7,165, 82, 89,121,167,215,199, 43,149,202, 73,217,217,217, 59,184,237,196,196,196,135,229,114,249, 14,255,
-171,225, 25,191,254,162,164,150,186,227,178, 25,143,244, 82,177,108, 5,170, 58, 25, 84, 39,143,109, 70,173,177, 35,134, 69,143,
-254,211,146, 88,106,106,170,106,254,252,249, 32,132,240, 42,219,203, 7, 92,178,152,102, 40, 55,239, 71, 19, 21, 48,183,160, 20,
- 89,171, 87, 55,250,188,185, 4, 63,206,217, 2,185, 26, 2, 78,181, 4, 28,207,217,185, 50,162, 31,205, 11, 46, 27, 32, 7, 87,
-185, 1,238, 42, 15, 0,131, 63,182, 31, 76,154, 96, 6,133, 0, 66,129, 8, 35, 71, 16,180,107,203, 64, 40,100, 16, 32, 18,160,
-111, 36,131, 11, 23, 45, 24, 30,205,160,117,184, 4,223,239,107, 5, 0, 16, 80, 3,108,169,176,173, 30,201,255,215,162, 34,244,
-232,212, 5,191,230, 23,224,176,201, 12,237, 13, 45,196, 1, 45,209, 47,106, 20, 6,143,154, 0,213,182,108, 0,252,114,227,223,
- 6,226, 31,155,157,157,157,187,104,209, 34, 20, 21, 21,113, 29,166, 18,192, 11,115,230,204,217,158,152,152, 40,151,203,229,185,
-127,186,151,226, 39, 37, 13, 16,106, 32,100, 76,168,171,179,162, 74, 23,136, 7,199, 76,243,234,254,111,206,249, 74,218, 42, 80,
-131,191, 76, 31,138, 30,221, 31, 81,181,106, 21, 2,179,197,130,235,215,111,160,125,233, 69, 20,159, 45,193,161,131, 26, 58,114,
-212,163, 62, 61,215,172,172, 44,234, 52, 56,223,109,131,163, 20,184, 89, 14,215, 94, 29, 80,138, 59,148, 14,248, 15,124, 95,232,
-150, 45, 91,110,173,167,112,199,200,139, 74, 9, 8,104, 51,220,119, 90,250, 53,200,225, 57,206, 28,111,207,146,105,175,134,228,
-132, 57, 25, 58, 12,159,254,137, 91, 69,238,251,239,191,119,108,199,199,199, 99,215,174, 93,110,183,253,184,253,228,239,188,207,
- 89, 17,112,171, 0, 28, 60,112, 24,163, 30, 28,241,135, 53,154,245, 34,127,170,115, 42, 73, 95,179, 79, 49, 66, 1,180, 26, 33,
- 58,180, 19,161, 67, 59, 49,106,107, 69,144,136,132,176, 10, 3, 48,116, 16,193,144,251, 5, 96,136,200,150, 2, 83, 36,134,136,
- 49,130, 72,196,176,232, 1, 11,116,110,201,255,192,190, 92,244,236,216, 22,199,126, 57,134,197,239,190, 85,175,125, 75,223,126,
-159, 50, 2,130,161,209, 67,241,253,174, 92,175, 42,239,177, 44, 43, 45, 42, 42, 82,157, 57,115, 6,129,129,129, 8, 12, 12,148,
-197,199,199,171,189, 28,204,100,217,217,217,185, 28,241, 59,117,142, 80, 0, 19,190,248,226,139, 27,115,230,204, 81, 2, 24, 47,
-151,203,149,119, 99, 7, 95,179,102,141, 52, 37, 37,133,247,117,255,119,211, 58,233,192,200,150,170,238, 29,235, 16,210, 42, 0,
- 12, 19, 4,131,193,130, 10,141, 1,121,202,149, 84,210,106, 40, 70, 12, 31,195,171, 31,137,112, 21, 83, 30,190, 95, 53, 96, 64,
- 63, 92,185,170,197,145,159,142,162,182, 86,135,144,144,150,136,136,232, 14, 70, 32,130,213, 90,138,159,126, 62, 64,163,134, 60,
-248,167,178,110, 82, 83, 83, 85, 47,190,248,162, 99,123,254,252,249, 88,177, 98,133,106,181, 27,171,208, 43, 50,186, 75, 61, 0,
-118, 37,157,230,228,228,192, 85, 97,165, 63, 18,206, 86,118,102,102,134,140,210,166, 41, 1, 76,247, 39, 28,228, 93,248, 65, 11,
-151,102, 88,135, 80, 6,157,195,153,123,246,249,253,175,194,153,236, 93, 41, 5, 30, 61, 0, 7, 15, 28, 6,128, 38, 43, 2, 7,
- 94, 40,118,123,252,193,127,245,246,121,176, 32,132,248, 84,109, 79,169,110, 7,145, 80,132,174,157,106, 81, 83, 35,194,145, 99,
- 93, 33, 16, 8, 32, 32, 2,136, 69, 22, 12,232,173, 71,159,222, 2, 16, 48, 16,139, 2, 32, 22, 16, 68,223,111, 66,120, 24,139,
- 13,255,231, 94,118,191,158,237,113,225,108,249, 45,228, 15, 0,139,151,188, 70,222,127,247, 31,180, 99,236,253, 8, 11,109,201,
-187,189, 6,131, 65,186, 98,197, 10,213,133, 11, 23,234,233, 27, 70,163, 17,143, 62,202,223,218,204,206,206,222,231, 76,254, 46,
-208, 38, 61, 61,189,242,165,151, 94,218,123,167,167, 40, 26, 35,255,195,135, 15,171, 82, 82, 82,120,183, 45, 50, 34, 92,213,185,
-125, 53,218,180, 14, 70,151,206, 29, 16, 20, 28,132, 11, 23,202, 96,181,178,232,220,169, 37,142,255,158,143,181,167,138,165,201,
- 79,205,118, 59,152,254,246,219, 1,250,120, 66, 63,116,235,214, 5, 39,126,191,128, 35, 71,126,199,245, 27, 53,160, 20, 8, 11,
- 11,132, 94, 95,139,168,168, 1,168,172,172, 66,217,145,159,240,213,127, 78, 75,103,253,133,191,162,114,151, 67, 10,216,138, 79,
-113,248,248,227,143,185,109,175,188, 0,169,169,169,212,217, 37,236,108, 65, 58,187,164,155, 99,122,225,221,119,223,165, 93,187,
-118,109,114, 46,126,185, 92, 78, 8, 33,116,243,230,205,110,115,236,115, 72, 75, 75,163,174, 60, 4,107,215,174,149,114,197,129,
- 92, 41,177, 10,133,130, 54,150,202,213,185,158, 3,165, 20, 10, 69,154,170, 41, 94,136,134,242,134,191, 90,139, 31, 63,104, 81,
-143,248,253,184, 55,173,255,134,125,168, 73, 83, 0, 77, 85, 4, 30,252, 87,239, 70,149, 0, 95,200,159, 67, 94, 94, 30,202,202,
-202, 0, 0,157, 59,119,166,222, 40, 1, 2,106,128,144, 88, 33, 22,137,240,211,177,182, 16, 8,133,104, 41,210,217,226, 0, 90,
- 48, 40, 43,107,137,251, 7,176, 32,132, 32,241, 17, 11, 40,203, 0, 36,192,230,120, 67, 77,163,114,245,149, 23,113, 85, 83,139,
-151,222,124,179,209,182, 84, 86,105,160,189,126,213, 46,139, 55,113, 55, 36,127, 0,192,206,157, 59, 97,181, 90,165,143, 63,254,
-184,199, 1, 78,169, 84,142,109, 88,250,151,235, 48, 85, 85,245,226, 17, 67,151, 44, 89, 2,165, 82, 57,238,110,154, 10,224,200,
-223,155,191,249,239,166,117,210,251, 35,141, 8, 12, 12,133, 36, 64,140,158, 61,123,160,107,143, 30,168,174, 86, 67,163,169,133,
- 88, 44, 64,120,152, 4,194,192, 80,183,185,226, 1, 64, 72,203,208,178, 69,107,232, 13, 22, 28, 59, 86,140,203, 87,171,112,229,
-106, 45, 12, 70, 9,186,117,182, 64, 18, 32, 64,241,233, 18,220,215,171, 23, 46, 95,169,134,193,210,202,163, 76, 59,209, 81, 79,
-251,189,157, 14,104, 76,166, 47,178, 56,235,127,254,252,249,183,236,127,241,197, 23,125,138, 5,112, 69,162, 13,231,142,155,203,
-171,144,159,159,175, 66, 19, 11,242,228,230,230,210,236,236,108, 36, 38, 38,194,213,116, 0, 31, 79, 21, 71,254, 0, 80, 88, 88,
-168, 98, 24,166, 94,155,214,174, 93, 43,229, 99,244,196,198,198,202, 56, 57,205,225,113,217,252, 98, 48,166,173,208,185, 36,254,
-206,225,140,125,148,226,247,120,227,227,227,235,121, 73, 30,122,232,161,122,247,202,239,246,191,123,224,117, 12, 64,115,121, 4,
-154, 19,197,197, 54,197,162,172,172,204, 43, 37, 64, 40, 20, 66, 36, 16, 65, 36, 34, 24, 51, 10,208,235,140, 56,119, 86, 12,145,
- 80, 4,161, 85,136,152, 17, 20, 98,145, 8, 2, 1, 3, 80, 2,141, 22,248,241,168, 16, 44,203, 2,184,222,168,220,163, 63,157,
- 69,109,109,227, 25, 56, 63, 92,178,132, 6, 4, 72, 96, 48, 84,193,202, 90,120, 95,231,209,163, 71, 27, 87, 58,244,122, 94, 68,
-211,208,245,239, 74, 51,220,182,109,155,243,249,202, 59,225, 5,112,229,226,119, 38,255,216,216, 88,222, 85,232,186,116,110,175,
- 98,152,139,176, 88, 89,152,204, 22, 92,191,161,129, 72, 44,129,209,104,134,217, 98,133,197,194,194, 98,165,168,212,222,240, 40,
- 75, 44,210, 65, 18,216, 5, 21, 21, 85,168,174,209, 67,163, 53,160, 85,235,193, 24,121,255,253, 40, 60,184, 11,157, 76, 22, 84,
- 85, 87,161, 79,159, 94, 8, 16, 11,161,171,209,252, 89,198, 10, 41,165,212, 49,247,239,140,149, 43, 87,250, 20, 11, 48,127,254,
-252,122,222,132,134,199,248, 42, 0,182, 82,207,156, 69, 27,142,113,227,198,213,235,175,156,129, 80, 90, 90,170, 82, 42,149, 62,
- 21,166, 82, 42,149, 14,242,231,166, 3,182,108,217,226,145, 92, 27,122,170,242,243,243, 85, 92,224,155, 66,161,160, 5, 5, 5,
-170,228,228,100,199,241,130,130, 2, 21, 33,238,155, 23, 27, 27, 43,115, 46, 51,156,150,150, 70,221,221, 43, 79,227, 97, 98, 98,
- 34,166,198, 42,177, 9,192,244, 21, 58, 60,240,106,173,219,123, 63,124,186,251,123,213,112,142,223, 83, 76,128, 31,183,223, 27,
-208,152, 7,224, 15,245,239,184,178,244,155, 98,253, 55,176, 88, 81, 92, 92,140,149, 43, 87,242, 46, 53, 41, 16, 8, 17, 51,156,
-133,128, 17,226,199, 34, 9, 78, 21, 75, 48,121, 34,240,240, 67, 64, 66, 60, 65,199,246, 98, 72,196, 1,144,136, 3, 16, 40, 9,
- 64,231,142, 1,144,136, 37,144,136,221,151,196,124, 99,241,235,100,217, 7,239,144,198, 6,146, 94, 61,187, 35, 36, 52, 24, 18,
-214,132, 90,189,249, 15,239, 20, 7, 14, 28,200, 61,112,224, 64, 61,194,119,254, 0, 64, 69, 69, 5, 18, 18, 18,238,152,149, 95,
- 88, 88,168,114,182,134,184,125, 0, 48, 98,196, 8,175, 44, 57,171, 21,208,233,205,208,233, 76,168,174, 54,226,218, 53, 45, 46,
- 95,190,129,154, 26, 35,106,107,205,168,173, 53, 65,167, 51,163,170,210,243,138, 76,163,209,130,186, 58, 43,204,102, 19, 90,182,
- 20,163,107,231, 86, 8, 10, 14, 6, 0, 68,244,234,129, 46,157, 90, 33,164,149, 4,148, 90, 97,182,176, 48, 26,117,127,138,129,
- 36, 53, 53, 85,181, 96,193, 2,183,100,206, 45, 13,228,233,157,144,217,149, 6,151, 88,177, 98, 5, 86,175, 94,237,117,169, 97,
-155, 91, 92, 65,157, 63, 28,161,150,149,149, 33, 59, 59,219,235, 82,180,185,185,185, 52, 39, 39,199,153,252, 33,151,203,201,212,
-169, 83,221,254,221,220,185,115, 65, 8,113, 88,245,107,214,172,145, 2, 64, 76, 76,140,204, 89,137,117, 62, 78, 41,117, 28,231,
-113,181,245,172,120, 87,138,131, 39,101, 2, 0,218,180,105, 3,226,100, 61, 52, 85,158, 31,119, 31,249,187,218,246,201, 3,112,
- 55, 89,254, 55, 7,120, 43, 4, 2,129,215,127, 55,106, 56,139,118,109, 3, 80, 93, 45, 68,128,208,130, 0,177, 0,234,195, 98,
- 76,150,137, 32, 22,137, 80, 93, 45,194,193,162, 96,180,146, 16, 48, 12,131,120,185, 9,143, 78,166, 96, 24,138,247,126,246,190,
-157, 74,165,146, 10,130, 36,208,136,218, 32,200,124, 9,103,202, 40,198, 74,199,240,254,251,168,168, 40, 28, 58,116,200,229,177,
-160,160, 32,222,131,165, 86,171, 29,103, 31,120,144,156,156,236,216, 95, 81, 81,225,248,158,156,156,140,242,242,242, 59,242, 60,
- 83, 82, 82,212,133,133,133,200,207,207, 87,177, 44, 43, 99, 24, 6,156,229,223,216,188,169, 59,148, 94,188, 44,107,219, 74,175,
- 10, 16, 11, 96, 50,179,168, 51, 94,194,197, 75, 21,208,104,171,161,209,232, 81,161, 49,160, 66, 99, 64,104,120, 15,143,178,174,
-221,160,184,122,237, 6,250,245,235,133, 74,173, 22, 34, 33,131,234,154, 75,208, 85,178,232,127,159, 14,237,219,182, 69, 80, 80,
- 16, 2, 2, 2,113,229,106, 13,136, 32,140, 47,193, 18, 39,114,108,150, 85, 0,205,189,130,160, 49,107, 29,168, 23, 11,192, 23,
-106, 0,152, 55,111,222, 45, 94, 5,167,105, 6,181, 47,237,156, 54,109, 90, 61, 11, 54, 59, 59,219, 65, 94, 79, 60,241, 4,198,
-143, 31, 79, 92, 37,158,225,105,249, 59,208,208,211,208, 16, 67,134, 12, 33,148, 82,135,149, 95, 88, 88,168, 34,132, 56, 74, 3,
- 39, 39, 39,171,243,243,243,145,159,159,175, 74, 78, 78, 38,135, 15, 31,118, 28, 95,181,106, 85,163,114,243,243,243, 85, 12, 67,
-100, 5, 5,182,119, 98,238,220,185,248,249,231,159,100, 28,133, 23, 20, 20,168,184,235,231,163, 76,172, 90,181, 10,159,201,194,
- 48,125,165, 30,128,109, 58,192, 25,211, 87,234, 29,247, 51, 69, 38,242, 51,235,189,162,180, 47,250,176,190,210,189,236, 21,252,
-252,243,207,252, 87, 1,220, 14,226,119,142, 5,104,138,245, 95,223,146,175, 79,254,241,241,241, 80, 40, 20, 30,167, 2,218,180,
- 17,128, 33, 2,180,109, 35, 64,239, 94, 20,151, 47, 11,193, 8, 8, 68, 66, 33, 68, 66, 17,126,253, 45, 24,225,193, 34, 8, 4,
- 2,140, 26, 97, 69, 96, 96, 0, 88,150, 2,212,234, 19,249,183,104,223, 21,215,106, 41,116,103,212, 16, 18, 1, 94, 94,178,152,
-120, 57,176,201, 46, 94,188,168,186,120,241,226, 45,215, 59,101,202, 20, 94,131,101, 98, 98,226,248,138,138,138,189, 28,201, 3,
- 64, 66, 66, 2,214,174, 93,235, 56,167,186,186, 26,229,229,229,216,190,125, 59, 18, 19, 19,199,222,137,206, 27, 19, 19, 35,203,
-207,207, 87, 21, 22, 22,170,184, 96,177,152,152, 24,159,230,112,103,253, 37, 69,189,241,191, 89,160,101,213,208, 27,204,208, 6,
-212,129, 66,139,186, 58, 11,170,171,141, 40,191,161,199,229, 43,181, 24, 45,235,238, 81,150,193,212, 6, 37,231,174, 35,162,103,
- 55,244,236,217, 5, 21, 21, 55, 16, 22,106, 69,239,222, 33,104,215, 54, 2,146,192, 64, 84, 86,214,226,200,209,147,184, 84, 86,
-141, 14, 93, 6,220,179, 3, 8, 5, 40, 33,144,113, 92,234, 76,170,238,214,237, 83,123,176,224,173,230, 35,234,173, 42,203,202,
-202,146,173, 92,185, 82,213, 80, 1, 88,190,124, 57,151, 96,200,173, 60, 74, 41, 37,132, 16,133, 34,204,169, 77,244, 22, 98,206,
-206,182, 77, 17, 76,157, 58,149,151,251,191,254,148, 66,174, 75,242,231,139,216,216, 88, 89, 65, 65,129,138,243, 58,140, 26, 53,
- 74,230,234, 56, 23,140,231,137,176,185,185,245,131, 7, 15,169, 8, 33, 32,132, 96,200,144,193,178, 33, 67,134,168,157, 20, 4,
-251,185,128,167,247,133,147,199, 76,211,130,147,151, 56,182, 71,189, 7, 53,109,197, 9,135, 60, 62,240,199, 0,220, 59,240,168,
- 0,220,141, 22, 63,135, 25, 51,102, 52,233,239, 25,134,129, 64, 96,251,244,139,100, 16, 53,200,138, 0,177,196,166, 0,136, 68,
- 24, 57, 2, 8, 8, 0, 68,130, 0,180,105, 35,129, 64,160,131,213,202,130,101,189,119,219,235, 53, 87, 33,233,210, 23,231,148,
-255, 65, 91, 33,131,167, 22,191,230,245,128, 18, 24, 24,168,126,237,181,215,100, 77, 89, 6, 40,151,203,149, 10,133, 2,207, 61,
-247,156, 99, 31,103,233, 87, 87, 87, 67,175,215, 35, 37, 37, 5, 0,240,249,231,159, 35, 51, 51, 83,117, 39,158,109,114,114,178,
-154,101, 89, 25,103,249, 15, 31, 62,188, 73, 1, 92, 93,186,247, 65, 81,193,110,180,107, 19,132,160, 32, 91,183, 55, 26,173,168,
-174, 49, 65,163, 53,160,107,207, 1,120,112,100,156,199,103, 50,105,210, 19,100,207,247,255, 71, 11, 10,143, 99,244,168,193,232,
-222,189, 59,204,166, 58, 68, 13,185, 31,193, 33, 33,184, 80, 82,138,178,203,149, 56,152,255, 59,180, 53, 33,152, 18, 27,119,207,
-250, 76,231,166, 41, 0, 64, 5, 16,204, 85, 40, 28, 4,206, 54, 32,125,134, 33, 54,109,193,206,203, 4,192, 96, 23,243,141,105,
- 10, 5, 5,133, 83,164, 10, 65,106,106,106, 61, 47,192,188,121,243, 64, 8, 65, 90,154, 66,197,177, 63, 8, 48,120,240, 16, 87,
-228,229,112,199,123, 34, 57,190,228,223, 16, 83,167, 78,197,184,113,227,100, 77,233,199,176,207,213,143, 24, 49, 66, 54,107,214,
- 44,117, 99,199,157,230,246, 27, 5, 23, 59,192, 41, 95,182,105, 4,162,110,168, 84,240,109, 95, 67,121,155, 95,108, 97,187,233,
-146,246,142,115, 54,191, 88,234, 80, 8,118,255,226,126,236,115,149, 7,192, 31, 3,112,143, 42, 0, 35, 71, 13,191, 45,115, 62,
-205,101,249, 59,119, 36, 95,160,209, 18,116,108,207, 56, 82,254,238,201,181,205,239, 7, 4, 72, 16, 32, 14, 64,194, 67, 4,146,
- 0, 49, 2, 37, 4,154, 10, 1, 10,143,180,132,149,181,162,107, 23,239,230,117,149, 74, 37,173,212, 27,160, 45,218,137,222, 93,
- 69, 56,246,255,236,125,121,124, 19,213,250,254, 51,147,189, 43,109, 41, 45,123,161, 80, 65,182, 2, 5, 17, 89, 18, 40,160, 44,
-149,173,200,166, 95,228,122, 27,112,187, 44, 42,138,222,159,222,235, 5,197,171,130, 87,174, 80,184, 42, 42, 84,108, 43, 75,193,
- 66,161,144,176,136, 90, 40,149, 85, 40, 80,150,210, 2, 45,109,154, 54,205,158, 57,191, 63,210, 9,105, 72,155, 73, 26, 86,231,
-249,124,242, 73,114,102,242,102,230,204, 57,231,121,223,247,188,231, 61, 37,190,207, 11,211, 52,173,238,223,191, 63,213,191,127,
-127,159,101, 36, 39, 39, 43, 86,174, 92,169, 98,221,252, 21, 21, 21,207, 60,246,216, 99,186,221,187,119,255,244,244,211, 79,143,
-172,168,168,160,158,125,246,217,156,228,228,100,197,189,108,156,117,174,126,133,211,103,223,219,156,157,220, 73,225,153,211, 40,
- 45,186, 12,154,166, 96,179, 17, 72,101,225,136,235,218, 29, 19,198, 39,115,110,232,165,229,140,162,178,162, 84,101, 52, 90,209,
-163,123, 71,180,110,213, 28, 87,138,111, 64,115,226, 2,206, 22, 94,193,158,189,199,113,185,132,224,133,191,190,226, 83,231,185,
- 95,146,255, 48, 63,132,249,124, 94,239,165, 28,229, 93,248, 26, 43, 86,172,112, 40, 0, 43, 86,172, 0,138,214,221,118,174, 59,
-121, 13,120, 5,110, 27,179,154,154,172,135,162,168, 38,181, 61,150,228, 27, 34,119, 79,199,221,121, 21, 92,126,235, 78, 30,247,
-231,124,249, 71,100,174,120,206, 62, 54, 12,107, 87,143,252, 1, 32,121,116, 63,251, 7,205,239, 30, 21, 0, 62, 15,192,253,131,
- 53,203,222,188,109, 26,192, 43, 5,224,126, 14,248,240, 53,249,143, 51,142, 28,149, 64, 42, 22, 99,220,104, 10, 52, 69,161,127,
-130, 21, 39, 78,202, 64, 83,246, 57,255,170, 42, 26,173,162, 5,160, 41, 49,142,157, 16, 67, 42, 1,204, 22, 51, 46, 95,145,121,
- 69,254, 23, 10, 11,240,216,240,177, 16, 54,127, 12, 23, 10,243, 32,188,158,137, 55, 94,127,139,124,244,239, 15,238, 73, 5,215,
-229,171, 87, 36, 36, 36,168, 22, 45, 90,132,238,221,187,151,105, 52, 26, 36, 36, 36, 40, 52, 26, 13, 94,125,245, 85, 85,114,114,
-242,125,145,215,190,169,196,239,170, 4, 12, 26, 56, 20,235,190,251, 82,222, 50,186,165, 42, 48, 48,144,147,213,127,219, 0,251,
-220, 95,212, 0,168, 13,235, 83,201,233,179,191,161,101, 84, 16,164, 82, 17,116, 58, 51, 74,174, 85,131, 18,182,197, 11,127,125,
-142,143,150,226,130,163, 11,129,216,231, 81,111,121, 97,254,130,166,144,117,147, 47,105,206,156,112, 39, 69,194, 63,132,230,137,
-148,189, 33,237,166,230, 51,112, 87,103,201,143, 75,236,247,106,184,102,127,241,120, 96, 17, 31, 31,239, 8,248, 91,179,236,205,
-219,142,121, 84, 0,252,157,143,255,110,231,247,247,170,241,131,130, 70, 67, 33, 32,154, 66, 68, 56,133,132, 62, 22, 72,197, 2,
- 72,196, 22, 68,132, 75,235, 6, 1, 10, 3, 18,108,200, 59, 42,178,123, 11, 56, 14, 50,185,185,185,164,219, 35, 33, 88,248,183,
-127,194, 32,110,131, 77,185, 37,136,141,179, 91,238, 65,135,183, 99,225,107,111,145, 79, 62,190,119, 74, 64, 98, 98, 34,149,155,
-155, 43, 95,182,108,153,202,217, 59,224, 15,229,234,126, 70, 93,178,159, 38,223,227,140,153, 74,234,224,161,125,164,188,162, 28,
-134,235,122, 72,165, 17,104,211,161,167, 79, 74,197,131, 6,123, 58,108, 63,221,102,209, 58, 56, 86, 4, 20,125,115,207,239,205,
- 83,112,223,195,134,145, 99,159,241,202,114,247,228,123,228, 99, 0,238, 47, 37,160, 33,242,247,232, 1,248, 51,128,192, 30,213,
- 79,209, 4, 4, 4,225,205, 8,246, 29, 20, 66, 42, 22, 65, 34, 22, 34,105, 52, 1, 33, 12,194, 34,172,176,218, 40, 48,140,173,
-110,240,243,140,158, 49, 58,140,153,148, 12,157,176, 51, 90, 4, 5, 98,250,132,112,164,109, 62,225, 80, 2, 44,182, 77,247,252,
-254, 89, 69,128,239, 50,190,123, 21, 30,214,123, 91,163,249,144, 74, 9,123,243,118,102,200, 8,247, 85, 30, 82,194,222,188,253,
- 64,254,130, 38, 89,253, 60,154,134,201, 47,173,244, 91, 27,126,216,141,135, 7, 77, 9,240,104, 0,199,199,199,243,147, 54, 60,
-120,240,224,193,131,199,159, 12,124,162,103, 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,224, 21, 0, 30, 60,120,240,224,193,131,199,195,129,122,171, 0,230,206,157,235,115, 4,167,187,220,218,
-254,150, 55, 99,246, 28,143,191,171,173,188,238,248, 28, 24, 30,237,248,188,225,171,213,183,157, 27,169,120,193,163,188,221,203,
-111,101,204, 27, 49,127,165,227,115,185,234,127,240,229,250, 26,130,175,215,215, 16,220, 93,223,248,103,149, 30,127,119, 68,245,
- 19, 98, 98, 98,112,233,210, 37, 36, 40,198, 56,202,183,124,151,122,199,235,239,133,107,215, 26,109, 47, 38,161, 80,190,176,164,
-196,177,100,113,101, 84,148,227,252,255,181,108,121,199,219,159,171,188,172,172, 44,121,118,118,118,189, 76,137,163, 71,143, 86,
- 36, 37, 37,169,239, 69,255, 40, 40, 40,240, 89, 94,239,222,189,239,244,245, 81,115,231,206,197,253, 60,190,220, 11,121,105,105,
-105,211,122,244,232,145,118,226,196,137, 73,211,167, 79,223,212, 84,121,206, 27, 29, 57, 71,228, 63,136,245,231,239,246,252,103,
-147,231,181, 2,224, 10,171,213, 42, 55, 26,141,160, 4, 34, 80, 20, 5,155,213, 2,177, 72, 8,137, 68,162,110,170,230, 97,181,
- 90,229, 0, 32, 20, 10,155, 36,171,182,242, 58, 2,195,163, 29,196, 31,221, 54, 6, 0,112,189,248,146, 79,242,118, 47,127, 25,
- 35,230,175,116, 16,215,127,179,242, 0, 0, 47, 37,245,199,195,136, 35,170,159,144,160, 24,131, 35,170,159, 0, 0, 99, 38,207,
- 0, 0, 92,186,116,239,235,239, 63, 55,110,200, 11, 1, 85, 28,160, 40, 4,236,123,168, 47,122, 3, 0,208,127,217, 71,247,180,
-222,212,106, 53,201,206,206,134,209,104,172, 87, 46,149, 74, 85, 33, 33, 33,144,203,229,247,229,114, 40,138,162, 6, 61,210,161,
-245, 55,196,102,211, 23, 94,185,254, 22, 33,100, 59,111, 7, 53,162,116,154, 76,195, 10, 10, 10, 66, 74, 75, 75,163,195,195,195,
-155,245,237,219,183, 36, 56, 56,248, 59, 95,229,165,165,165, 13,159, 62,125,250,190,180,180,180, 23, 0,132, 78,125,126,206,108,
- 0,204,137, 19, 39,158, 3,176, 5, 0,227,141, 60,118,207, 19,150,248,155,210,223, 92,119, 73,244,215,146,190,134,148, 18, 30,
-247,153, 7,192, 25,213, 53, 58,121,203,184,126,170,161, 61,186, 32, 64, 34, 2, 33, 4, 54, 27,193,201,115,151,113,241,248, 1,
-133, 76, 34,130, 64, 32,240,137,188,131,164,151,228,221, 58, 23,169, 78, 22,118, 84,212,154, 98,124, 38,126, 0,144,133, 70,160,
-182,242,186,131,248, 27,243, 8,112,177, 84,251,207,120, 19,187,151,191,236,232, 72, 13,157,215,216, 26, 75,215,255, 20,139,197,
- 0,236,105, 50, 25,198,222,191,109, 54,155,227,250,105,129,136,179, 21, 13, 0, 45, 91,216, 83,117,154,171,171, 96,178, 90, 1,
- 0, 58,171, 93, 94,135,145,127, 65,167,110,189, 57, 17, 63, 0,244, 26, 56, 28, 71, 84, 63, 57,136,191,161,243,238,102,253, 1,
-192,203, 55,110, 16, 0, 24, 21, 24,136,156,218, 90, 21, 75,252, 0,112,118,215,238,219,206,139,111,217,146,211,117,106, 3,111,
-202,243,111, 30, 70,201,149, 99,232,220,126, 0, 6, 72,229, 94,183,225,172,172,172,167,119,236,216,193,146,191, 21,128, 17, 64,
- 0, 0,198,104, 52, 10,101, 50, 25,170,171,171,229,238, 60, 1,247,152,252,163,250,197,247,216,145,243,253,234,160,218,146, 63,
- 48, 40,121,110, 26, 69, 81,207, 17, 66,182,220,111, 3, 83,110,110, 46,105, 74,126, 10, 46,155,129, 53, 6,139,197, 34,207,203,
-203, 83,157, 58,117,202, 81,118,243,230, 77, 20, 22, 22,162,101,203,150,223,202,229,114, 69,112,112, 48,215,231, 75,167,165,165,
-253, 3,192,227,131, 70,141,151,165,165,165, 69, 77,125,126, 78, 48, 0, 27, 0,182,225, 62, 82,119,222, 16,174,247,199,246, 55,
-165, 82, 73, 26,234,111,236,121,158,250,155, 82,169, 36,251,127,201,131, 64, 32,132,205,102,133,182, 70,135,233,147,158, 38, 31,
-127,252,113,147, 8,219, 85,169,104,234,115,225,225, 25,238,182,253,101,193, 41, 19, 96,173,193, 44, 31,158, 52, 93,213,182, 69,
- 40, 2,164, 66, 48, 12, 3, 27, 3, 8, 5, 20,194, 67,187,160, 91,231,118,170,220,156,159, 20, 54, 75,173,220, 91, 37,192,108,
- 54,203,187,118,187,168,234,213,229, 34, 4,180, 77,165, 62,210, 90, 33, 22,137,188,146, 81, 91,121, 29,178,208, 8,132,134, 4,
- 3,128,227,221,221,121,209,109, 99, 60,122, 3,118, 47,127, 25,253,103,188,137,255,123,102, 34, 0, 56,222,221,157,247,223,172,
- 60,175,180,107,129, 64,128, 54,109,218, 64, 32, 16,192,108, 54,163,182,182, 22, 54,155, 13, 26,141,198,167,135, 27, 36, 20,224,
-171, 21,155, 33, 9, 5,110, 92, 2, 14,235, 74, 80,126,253, 60,190, 91,254,150, 87, 86,127,175,129,195,209,166,149,125,138,164,
-141, 27,242,143,137,137,113, 76, 7, 0,192,213,171, 87,253, 82,127, 92,146,171,190,124,227, 6, 25, 21, 24,136,247, 95,126, 9,
- 0,240,190, 19,241,175, 47, 44,172, 79,254, 94,100,107,221,119,105,189,188,253,243, 66,213,155,237,102,194,196, 36, 66,194, 16,
-252,113,115, 15,190,254,119,186, 98,114,207, 84,174,109, 80,152,157,157,189,197, 96, 48, 96,221,186,117,198, 89,179,102, 73, 1,
- 4, 1, 96,214,173, 91,103,158, 53,107,150,208, 96, 48, 64, 42,149,170,146,146,146,154, 52,208,109,218,180, 73,190,107,215, 46,
- 85, 83,115,217, 59,218,142,152,254,127,159,191,255,134,172,217,233,239, 33, 59,187, 23,239, 13, 11, 11,126,117, 91,249, 63,235,
- 44,207,251,138,252,211,211,211,161,209,140, 32, 25, 25,201, 94,223,251, 87, 95,125, 37,111, 10,217,212,214,214,202,179,178,178,
- 84, 53, 53, 53,110,143, 95,187,118, 13,153,153,153,170,174, 93,187, 42, 6, 12, 24,224,169,221, 80,105,105,105,223, 13, 26, 53,
-126, 74, 97,193, 33, 97,155, 86,209,214,169,207,207,169, 55,238,238,253,105, 19,122,244,232,209, 37, 45, 45,237,169, 30, 61,122,
-100, 1,192,193,131, 7, 27, 37, 85, 46,253, 77,169, 84, 18, 80, 20,224, 33,203,223,234,213,171,201,245,178,155, 40, 56,121,218,
- 81,102, 52,154,240,209,231,107,116,202, 89,211,120,194,126,136,113, 91, 16, 96, 77, 77,141,124,208,200, 9,170, 46,237, 34, 32,
- 17,209, 96, 24, 6,215,175, 95,199,137, 99, 5, 48, 91, 25, 48, 12, 65, 68,104, 0, 70, 62, 53, 86,101, 48, 89,189,254, 67,137,
-168, 12,177,237,174, 3, 2, 10,143,118, 46,134, 68,120,195,107,203,223,153,252,111,179,240,170,107,112,189,248, 18,100,161, 17,
- 13,122, 5, 26, 35, 47, 87,124,243,195, 38,188,148,212, 31,253,103,188,217,160, 85,235, 14, 98,177, 24, 2,129, 0, 33, 33, 33,
- 40, 42, 42,130, 70,163,177, 43, 82, 62,146,127,203, 22, 81, 8, 18, 10, 48,225,149,127,225,169,233, 3,177,253,100, 9,174, 27,
-208,100,242,119,197,213,210,235, 56,117,228,103, 68,134,133,216,201, 95, 40,240, 75,253, 61, 57,233,255, 0, 0, 97, 66,145, 87,
-228, 15, 0,127, 95,249, 95,252,125,229,127, 29,228,159, 83, 91,139,215, 71,142,181, 31,140, 20,115,186,239,111, 46,127, 40,255,
-235,194,199, 85,207,183,127, 17, 34, 58, 8,129, 8, 0, 13, 1, 90, 71, 61,129,151,223, 95,160, 42,106,181,156,147, 26,161, 86,
-171, 45, 0,240,205, 55,223,232, 1, 72,217,109,148,215,173, 91,199, 0, 8,112,222, 86, 89,173, 86,251, 52, 47,167,215,235,229,
-222,148,115,176,252, 7,245,235, 19,175,207,216,180, 89,217,187,123,156,160,246,244, 30, 92, 42,171,193,181, 42, 61, 24, 66,124,
- 10, 4, 78, 73, 73, 33,201,201, 25,100,195,134, 13,126, 77, 36,230, 68,254, 8, 15,207,245, 73, 70, 94, 94,158, 42, 53, 53,149,
-162, 40,202,161, 12,120,121, 13,183,145,255,145, 35, 71, 48,125,250,116,103, 15, 1,206,156, 57,163,210,235,245,141,110,152,149,
-150,150,246,242,160, 81,227,199, 46, 89, 60, 95,152,145,145,129,255,125,254,177,176,206, 99,228, 32,255,140,140, 12,172, 92,185,
- 18, 61,122,244,200,242,212,223, 92,201,191,161,254,246,212, 19,117, 94,192,224, 64,143,242, 62,249,124,149,131,252,203,110, 86,
-160,236,102, 5,180, 53, 58,136, 68,194,160, 85,235,190, 55,186, 90,241, 60, 30, 12,196,199,199,223,246,106, 84, 1,176,217,108,
- 36, 34,166, 39, 98,162,155,193,104,177,129,162,128,156,156,157,248,246,155,117, 56,126,236, 24, 94, 95, 48, 15, 2, 1, 13,198,
-198, 32, 36, 64,130,152,158,131, 84, 6,131,129,115, 7,179, 88, 44,242,110,157, 47,171, 66,130,244,248,234,155, 50,208, 20, 65,
-255, 30,103, 85, 22,139,197,171, 78,234,142,252, 89,226, 55,104, 43,234, 41, 8,218,234, 26,143,242,220,117, 38,182, 35,229,109,
-248,176, 30,193,125,243, 3,183,244,189,177,177,177,136,136,136, 64,117,117, 53,196, 98, 49,104,154,134,193, 96,128, 70,163,129,
- 64, 32, 96, 7,102,206,247,252,227,150,205,152,183, 98, 23, 54,127,254, 14, 90,182,136, 66, 64, 96, 56,138,109, 37,248,110,249,
- 91, 8,170, 27, 52, 4, 28,229,185, 35,127,150,248,181,165, 23,208,165, 77, 11,212,232,141,144, 4, 72, 0,155,205, 99, 60,128,
-167,250,123,107,237,118,156, 58,250, 11,186,119,124, 20, 90,155,103,165,145, 37,255,179,187,118,227,239, 43,255,235, 40,207,169,
-173, 69, 78,109, 45,138,148,255,192,174,211,199,209,173,127, 71,160,194,243,214,204,105,231,150,201,231,190, 58, 92, 21, 25,216,
- 21, 6, 82, 3,152,202, 32, 54, 85,194,100,171,129,145, 49,128, 17, 7,161,245,224, 4,100,254,190,212,211, 64, 71,109,220,184,
- 17, 70,163, 17, 74,165, 50, 64,169, 84, 2,246, 41, 0, 40,149, 74,212,125,175,179,160,140,216,184,113,163,215,157,246,204,153,
- 51,242, 5, 11, 22,168, 62,251,236, 51, 66, 81,148, 10, 0, 14, 28, 56, 64,150, 46, 93, 74,222,121,231, 29,159,182,102, 14,150,
-208,235,254,251,230,243,178, 81,173, 77,130, 67,103,174, 99,251, 37, 26,111,238,184, 97,250,135, 90,167,173,181,224,255,124,145,
-169,209,140,184,147,150, 63,194,195,115, 49, 99,198, 12,175,119,163,116, 38,252,213,171, 87, 83,236,118,210, 92,113,232,208, 33,
-249,141, 27,220,140, 18,179,217,140, 19, 39, 78,236,109,172,189, 0,144,183,105, 21, 45, 78, 78, 78, 6, 0,228,231,231, 99,239,
- 79,155,164, 87, 75,175, 51, 44,249, 3, 64,114,114,178,163,191,157, 56,113, 98,121, 83,250,219, 71,179,198,226,228,133, 98, 68,
-119,108, 9,212,234, 57,223,123,217,205, 10, 88, 44,214,186,177,218, 10,139,197,138,226,203,151,164, 77,121,166,174,222, 3,222,
-155,112,127,161,158, 43,202,100, 50,161,119,151, 46,170, 0,153, 8, 12, 67, 96, 99,128,159, 15, 28,196, 63,222,255, 23, 24, 2,
-156, 59,127, 30,199,143,253,142,238,221,123, 65, 32,160,240, 72,199, 54, 40, 58,106,133,140,227,230,120, 98, 97, 25,226, 98, 74,
- 1, 33,133,226,107, 22, 64, 72,161,103,151,203,200, 59, 81, 6,130,214, 62,221,128,179,123,223,157,103,192,160,173,168,183, 26,
-192, 19,156,221,251,238, 52,237,188, 13, 31, 98,196,252,149,110,163,216,157, 97,181, 90, 17, 16, 16, 0,154,166, 17, 22, 22, 6,
-189, 94,143,218, 90,251, 54,192,145,145,145,168,168,168,240,106, 3, 14,163, 6,232, 47,147,225,245,207, 15, 96, 68, 47,224,114,
- 1,112,184,238,216,235,159, 31,192,127,230, 43, 96, 99,108, 94,215,223,169, 35, 63, 59, 62, 15,239,219, 5,194, 96, 26, 57,234,
-211,232,221,165, 45, 66,130, 36,248, 38, 51, 23, 9,138, 49,184,234,102, 21,128,167,250,203, 58, 77,128,107, 64,210,112, 10,107,
-183, 23, 33, 34,172, 3, 38, 62, 65,113,170, 63,214,221,159, 83,123,107,235,100,242,222,114,160,181, 22,212, 95,223, 5,249,199,
-251, 0,109, 0,149,183, 20, 43,163,162,168,255, 53, 50, 17, 16, 59, 41, 72,213,190, 89, 95, 84,219,116, 48,105,206,227,187, 43,
-105, 56,152,164,193,163, 47, 40, 48,242,149, 32,200,194, 30,129, 84, 24, 6, 97,146, 22,135, 55, 29, 38,253, 18,250, 53, 52, 72,
- 57,254,131,166,105, 16, 66,204,117, 74,180,145,166,105, 61, 33, 36, 28,246, 32, 46,159,151,215,118,233,210, 69, 61,114,228, 72,
- 69, 69, 69,133, 42, 39, 39,199,174,248,228,228,160,107,215,174,232,210,165,139, 79,219, 51,215,152,152, 87,103,255,253, 63,219,
-254, 61, 38,154, 38, 70, 45,254,186,161,208, 98,181, 88, 86,154,108, 88, 74, 8,169,244, 69,230,248,241,230, 59, 78,254, 67,134,
- 12, 81,123, 43, 39, 47, 47,175,222,148, 9,235, 5,224,186,171,164,205,102,243, 74, 97,184,120,241, 34, 30,123,236,177,134,218,
-139, 20,192,163, 0,132,195,198, 76,172, 42, 42, 42,106,150,159,159,143,140,140, 12,244, 45, 42,162,243,243,243, 1, 0,125,251,
-246,197,147, 67, 19, 16, 18, 36,193,202,175, 55,151, 77,159, 62,125,241,170, 85,171,230,123,219,223,174,109,249, 16,193,221,164,
- 8,234, 60, 15,233, 31,190,128, 94,221,163,241,200,216,127, 33, 53, 53,149,114, 23,101,239,108, 60, 73,165, 18, 0,128, 72, 36,
-132, 94,111,244,235,179,229, 73,255,222,192,235,205,128, 24,134, 65,128, 68, 12,179,149,128,166, 0,154, 2,222,253,231,191, 96,
- 99,128,218, 90, 29,174, 95,191,134,168,168,104, 16,194,192,106, 5,164, 34, 33, 4, 34,110, 46, 88,171,213, 42,127, 52,246,170,
-170,121, 88, 53, 64, 81,118,221,152, 2, 40,138,160, 79,183,115,170,223,142, 71, 41,188, 93, 17,192, 90,247, 13, 77, 9,112,177,
-254, 93,181,232,134,136,223, 27,235, 31,176, 7, 12,181,104,209, 2, 18,137,196,225, 50,100, 3,255, 66, 67, 67, 33, 18,137, 80,
- 92, 92, 12, 17, 71,121, 95,231,238,195, 11, 99,135,130, 53,111, 10,173,118,247, 63, 0,200,227,128,144,127,169, 48,255,181,129,
- 8,243,226,126,175,150,218,131, 21,219,181, 8,135,198,100,130, 48, 68, 0, 99,185, 30,160,105,180,108,223, 6,187,246, 30,246,
-169,254,254,111,225, 18, 92,252,121, 15,132,215,129,170, 40, 32,128,166, 49, 32,166, 3,134, 13,141,226, 36,199,117,174,127,253,
- 51, 47,224, 71,211, 89,160,147, 17,248, 77, 8, 4, 9,129,113,125,209,102, 28, 55,227, 53,182,117, 56,204,230, 74,136,172, 22,
-124,119, 37, 13,191,204, 10,197,144, 9, 79,163, 75,139,174,138,147,187,212,170,222,201,181, 16,153,107, 97,237,194,160,252, 6,
-183,160,209, 58,229,205, 56,107,214,172, 32, 0, 26, 66,136, 8, 0,102,205,154,213,228,220, 26, 19, 39, 78, 84, 31, 60,120, 80,
-241,199, 31,127,168, 2, 2, 2, 16, 16, 16,128, 25, 51,102,248, 52,136, 82, 20, 21, 61,118,236,216,181,175,189,246, 26,253,250,
-252, 87,153,238,204,121,218,100,182,212,154,109,228, 53,111,228,164,164,164, 16,141,102, 4,198,143, 55, 99,198,140, 25,148,175,
-215,115, 39,201,223,157,187,127,245,234,213,148, 82,169, 36,179,103,207,230,116,189, 58,157,174,158,219,223, 25, 11, 22, 44,192,
-130, 5,246, 77,139, 18, 18, 18,156,207,151, 52, 32,174, 21,128,152, 58,165, 48,224,201, 73, 51,141, 29, 59,118,148,102,100,100,
-128, 37,255,228,228,100, 68,181,108,233,220,223,182,195,105,138,128, 75,127, 75, 25, 55, 4,191,150,150, 33,184, 87, 48, 74,114,
- 46, 0, 82, 9, 38,189,242, 28,194,219,140,229, 56, 54,219, 80,114,237,134, 85, 36, 18, 10, 89, 15, 0, 0, 20, 95,190,212,164,
-231,218,208,212, 1,175, 16,220, 59,133,192, 85, 9,160,221,153, 56,132, 16, 48, 60,100, 20,197, 0, 0, 32, 0, 73, 68, 65, 84,
- 4,176, 49,118, 37,128,162,128, 77, 63,102, 98,194,196,201,104, 30,217,194, 49, 0, 18, 47,246,202, 22,208,101,232,214,169,216,
-241,189,103,247, 0,135,147,172,207,163, 69, 16,208,101, 94,223,144,171,187,223,221,113,111,172,127, 87,119,191,187,227,206,107,
-217, 27, 67,117,117, 53,106,106,106, 96, 50,153,192, 48, 12,202,203,203, 29,238,127,189, 94, 15,157, 78,231,213, 20,192,230,207,
-223,129,250, 36,160,189, 4, 88, 12,192,127, 22, 41, 28,238,255,163, 5,192,239,215,126,134,192,203,250,211,150, 94, 64,120,104,
- 32, 34,194, 3,241, 72, 92, 87, 20, 93, 44, 71, 97, 73, 5,218, 69,132,194,116,163, 12,231,207,157,175,151, 11,128, 75,253, 13,
-148, 63,141, 65,138,105,216,188, 45, 29,170,253,233, 72,251,116, 33, 38, 45, 92,138,227, 22,160,188,162,140, 83,253, 57,207,245,
- 63, 63,240, 49,204,120,180, 61,210, 55,239,197,241,227,151,240,233,137,124,108, 28,241, 28,240,229, 33,148,148,148,215,203, 5,
-208, 16,218, 24, 37,176,153,111,194,108,214, 2, 0,162, 90,183, 69,151,174, 93, 21,213, 50,123, 44,134,129,209,131, 54,213, 66,
- 86, 43,192,141,107,215, 61, 17,170,221, 35, 99, 52,194,104, 52, 74, 1,152, 1, 4, 27,141,198, 16,215, 37,129,190, 66,175,215,
-203,247,239,223,175,234,218,181, 43,102,206,156,169,184,121,243, 38,114,114,114, 56,119, 54,138,162, 6, 73, 36, 18, 93,112,112,
-176,117,196,136, 17,215, 22, 45, 90,212,106,241,226,197, 69,135, 11,142,143,222,120,202,116,198,194,192,235,253, 88,239,132,203,
-223,159,228,239,106,253,179, 49, 10,206, 94, 0, 46, 50, 68,162, 91, 42,249,167,159,126,234,120,185,251, 14, 56, 86,248, 52,244,
-108,196,117, 47, 26,128, 80, 91,122,193,173, 59,157,237,111, 5, 71, 11, 46, 78,159, 62, 61,197,155,254, 54,184,223, 35, 72,124,
- 34, 14, 75,254,249, 49, 62, 89,145,141,255,183,126, 47,230, 12, 75,192,245,173,217,208,106,170, 61,146,109,106,106, 42,149,156,
-244, 36, 44, 22,107,129,197, 98,181, 58, 43, 0, 0,176,244,221,183,124, 38,108,158,232,239, 45,220,205,253,187,122, 5,234, 41,
- 0, 52, 77, 67,171,211, 67, 64, 83,176, 90,109, 96, 8,129,149,177, 7,145, 30,251,189, 0,195,134,143,178,187,201, 8,129,128,
- 22,160, 70,111,134,213,108,242,172, 97,218,108,242, 14,173,175,169, 34,195,181, 14, 45, 99, 96,255, 32,123,183,161, 40, 80, 20,
- 65,239,174,231, 85, 86,155, 77,206,245,230, 88,235,190,177, 96, 64,159,172,215, 70,130,107,188, 65, 88, 88, 24,202,203,203, 33,
-145, 72, 80, 83, 83,131,200,200, 72, 71, 80,160,209,104, 68, 85, 85,149, 87, 10, 64,202,146,141,248,207, 34, 5, 66, 99, 0,245,
- 73,224,213,101, 42, 4, 9, 5,152,248,183, 15,112,149,185,142, 13,159,190, 1, 1,205, 93, 30,107,253,247,237, 27,135,200,142,
- 49,104, 17,217, 28, 98,154,130,149, 34, 40,175, 53, 64, 83, 99,244,169,254, 62,249,112, 11,198,119,237,128,144,144, 8, 4, 68,
-182,130,165, 82,131,130,237,223,163,170,242,138, 79,141,248,171, 15, 95, 6,230, 39, 66,104, 53, 35,166, 22, 40, 19, 84,227, 63,
-215, 14, 3,226, 16,206, 50,142,110,251, 85,113,147, 54,224,138, 88,143,132, 78, 10, 60,250, 92, 16,138,194,212,170,200,200, 2,
- 85,219, 1, 69,208,210, 53, 48, 17, 3,244,235, 25, 72,131,130,185, 88,254,206, 3, 60,187, 10, 64,236,175,142,187,115,231, 78,
- 0,192,140, 25, 51, 20, 93,186,116, 81, 79,152, 48,193, 97, 49,114, 33,255,200,200,200, 29,107,215,174, 13, 76, 77, 77, 21,204,
-159, 63, 31,243,230,205, 35,135, 14, 29, 26, 64, 8,201,209, 91, 72, 87, 66,200,111,222, 91,115, 97, 13,186,253,125, 13, 8,244,
- 39,249,187, 18,188,179,194,178,122,245,106, 42, 47, 47,143,147,107,255,234,213,171,135,216,207,105,105,105,142,151,107, 25,139,
-240,240,112, 0,104,104, 16,188, 10,160, 10, 0,125,181,244, 58,126,249,229, 23,199,156,127,223,190,125, 1, 0, 25, 25, 25,248,
- 33, 43, 27,154, 26,163, 30,192, 82,216,151, 6,114,238,111, 91, 55,191,135, 81,139, 94,193,232,209,195,209, 92, 34, 64, 13, 69,
-144, 83, 88,140, 95, 78,150,120, 69,212,115,103, 77,235, 87,116,254,188,176,248,242, 37,176,175,165,239,190,213,168, 37,207,227,
-254, 38,126,215, 50,119,168, 55, 5, 32,145, 72,112,238,244,113, 69, 76,171,112,149, 76, 36,132,205,198,128,162, 40, 80, 20,144,
-162,124, 9,132, 48,176,213,229, 3,208, 27,141,248,163,176, 8, 98,177,103, 39,182,213, 82,137,222,143, 94,116, 30, 69,241,226,
-252,139,248,113,125,103,135,238,156,208,253, 2,126, 61,214, 21, 66, 65,164, 87,214,191, 59,226, 55,104, 43, 0,192, 39,235,223,
- 93, 71,203,219,240, 33, 0,112,182,254, 1,251, 58,255,232,232,104,152, 76, 38,220,184,113, 3, 54,155, 13,205,155, 55, 71, 69,
- 69, 5,154, 55,111, 94, 87,175,220, 9,187,252,250,121,188,243, 47, 21,180,151,128,127, 47, 28, 12,157,213,134, 5,203, 50,240,
-217,162,100, 44,252,116, 59,132, 20, 5, 47,248, 31,218,210, 11,104,217,188, 25, 68, 16,193, 6, 10,215, 46,158,194,229, 50, 45,
- 98, 35,195,177,245,232, 33,252,113, 26, 94, 91,255,147,102, 47,128, 40, 28,160, 5,192,186,236,139,248,241,139,215, 49,251,195,
- 84, 44, 24,215, 11, 47, 13,111,239, 85,253,229,212,214,226,147,164, 41, 64,149, 20,160, 68,192, 39, 31, 99,242,225, 3,216, 53,
-124, 46,168, 15, 94, 1,245,235, 27,156,172,127, 0,248,253, 90, 4, 30, 51,104,161,147, 9,160,151, 74, 17, 59, 73, 4, 19, 49,
- 64, 75,139, 96, 69, 28,136, 77, 15,203,205,107,248,249,115, 45,102, 76,143,189, 39,157, 54, 63, 63,159,212, 17, 3, 53,113,226,
- 68,181,221, 55,102,199,224,193,131,169,193,131, 7,115, 33,255, 39, 90,181,106,181,243,131, 15, 62, 8, 60,119,238, 28, 68, 34,
- 17, 66, 66, 66,112,252,248,113, 11, 33,164,188, 41,215,215,216,154,124, 95,188, 3,254, 36,127, 87,235,223, 78,172,183, 47, 31,
-228, 18, 11,144,156,156,124,238,135, 31,126, 24,104,181,114, 91,225, 36,149, 74,103, 55,114,184, 6,192, 69, 0,125, 11, 11, 14,
-193,121,206,255,197,217, 83,176,179, 99, 71,176,211, 1, 59, 58,118, 12,152, 62,125,250,215,222,244,183,103, 18, 31, 67, 40, 19,
- 6, 61, 68,248,113,249, 43,248, 98,251,239,120,253,201, 65,152,245,105, 26, 38, 47,253,206, 43, 11,220, 57,153,144,187, 50,126,
-253,254,195,137,122, 30, 0,129, 64, 64, 85, 93, 59,143, 11,197, 21, 16,138, 4,176,218, 24, 88,172, 54, 28, 61,154,143,111,191,
-253, 26,102, 27,129,197,198, 64, 44,164, 81,166,209,161,228,143, 95, 20, 50,153, 76,237,129, 8,229, 93, 99, 47,223,178,254,237,
- 67, 21,126, 92, 31,103, 31,227,104, 2,208, 4, 52,205, 96, 64,175, 63, 84, 54, 14, 94, 0,119,214,191,243, 42,128,192,240,104,
-175,200,223,157,245,239, 28, 85, 59, 98,254, 74,175,200,203, 62, 40,106,160,211,233, 32, 18,137, 28,214, 63,195, 48,142,119,111,
- 21,128,239,150,191,133,163, 37,251, 16, 20,109, 15,250, 11, 22, 10, 80,126,253, 60, 66, 36, 34, 84, 85, 94,133,128,166, 32,164,
-185, 77, 63,179,214,127,219,240, 96,156, 46,186, 8,171,217, 12,137, 80, 12,157,206,136,173,170, 67, 72, 80,140,241,138,252,217,
-250,123,250,229,247,177,225, 63,159, 65,207, 0,109, 99,219,224,228,169, 95,177, 96, 92, 47,159,234, 15, 0, 22,196, 38, 96,219,
-185,189,128,214, 10, 72,155, 99,119,222,105, 80, 31,188,130,149, 81, 81, 20, 87,242, 7,128,233,157, 23,169,127,222,157, 7,152,
-107,160,163,106,160,161,117,208, 10, 45,176,216,170, 33, 49,234, 33, 45,189,136,141,139,207, 33, 38, 62, 14,141, 4, 0,214,131,
-204, 41,242, 85, 42,149, 66, 42,149,186, 61,198, 21,107,215,174,197,218,181,107,155,212,153,131,131,131, 95, 61,127,254,124, 96,
- 72, 72, 8,100, 50, 25,194,195,195, 81, 94, 94, 14,138,162,244,254, 28, 52, 88,139, 63, 55, 55,151, 0,246,128, 64,111,130, 2,
-253, 77,254, 95,125,245,149,156,120, 94,235,206,105, 69, 64, 96, 96, 96,138, 80, 40,188,224, 90,254,233,167,159,214,179,252, 1,
-160,125,251,246, 72, 76, 76, 92,231,201,254,185, 90,122,189, 94,180,255, 59,127,159, 15,137, 80,140,168,168, 40,176,171, 3,234,
-142, 7,122,211,223, 94,144,247,196,188,143, 63, 67,205,141, 50, 68,134,180,192,169,211, 87, 48,235,211, 52,164,166,166, 82,190,
-144, 53,251, 59,231,223, 59,203,225, 61, 1, 15, 6,126,255,253,247, 70,147, 1, 53,232, 1,168, 27, 68,212,249,234, 45, 10, 66,
-146, 84, 49,173, 34, 16, 28, 32,193,163,221,227,241,104,183, 94, 16,210,128,206, 96,195,149,107,149,200, 83,255,164, 8, 10, 12,
-240,248, 7,181,122, 61,226,218, 95,131,209, 36, 5, 97,141, 26, 2,200,164, 70, 16, 2, 84, 86, 73, 0, 10, 8, 14,180,162, 71,
-220, 37, 28, 56,210, 27,193,193,193,156,173,127,103,139, 95, 22, 26, 1, 17,177, 0,214, 91,227,157, 77,232,249, 26,157,173,127,
-103,139,159, 45, 59,127,170,192,113, 46,151, 44,123,206, 74, 0, 0, 68, 71,219,149,145,202,202, 74,132,132,132, 56,220,255,222,
- 40, 0,172, 18, 0,124,128,185,201, 67,129,255, 28,192, 23,111,143,193,228,133,159, 33,237,195,151, 32,164, 40,136, 37,220, 86,
-236,176,214,255,233, 43,101,232,212,182, 57,190,252,223, 70,196,196,196, 32,180, 85, 44,122,181,138,133,197,116,203,253, 47,226,
- 32,147,181,254,255, 53,123, 56, 94,125,119, 29,218,118,164,154, 84,127,172,245, 63,114,243, 87,216, 53, 99, 26,168, 54, 3, 0,
-216,179, 2, 2,246, 20,193,236,185,175, 70, 69,113, 34,142,158,166, 55,168,180,143,151,201, 99, 39,214,168, 98, 58,119, 71,181,
- 12,184,136,203,168,185, 84,142,242,165, 54,232, 52,109, 48,255,185,133,156, 31,200,170, 85,171, 40,153, 76, 70, 12, 6, 3,156,
- 44, 79, 34,147,201,176,106,213, 42, 47,210, 19,249, 15, 53, 53, 53,255,126,233,165,151,146,214,174, 93, 43, 13, 13, 13,133, 74,
-165,194,138, 21, 43,170,205,102,243,147,254,252, 31,214,226,103,151,203,121, 27, 16,152,152,152, 72,105, 52, 35,136, 63,200, 31,
- 0, 88, 98,231, 66, 80, 28, 50, 12,154,159,123,238,185, 1,233,233,233,199,107,107,107, 91, 90, 44,246,101,166,174,228,255,232,
-163,143, 98,192,128, 1, 99, 57, 60,103,161,182,244, 2,150,188,247, 14, 54,109,219,129, 81,131,250, 96, 79,238,175,118, 3,166,
- 85, 44, 66, 91,197,162,111, 81, 17,158,156, 52,243,230,149, 10,253,200,118, 17, 1,153, 92,173,255,121,107,182, 97,241, 95, 70,
-162, 85,180,220,161, 92,176,247,200,197,115,227,139,119,128,247, 4, 60,184, 74, 1, 39, 5, 0, 0, 66,130,131,212, 71,213, 91,
- 20, 23,219, 60,130,142,157,187,170, 66, 2,101, 96, 8, 96, 48,153, 81, 84, 84,132,242,162,223, 21,193, 65,129,160,105,218, 99,
-199,149, 73,165, 72,223, 57, 84,193, 70,192, 55,234,142,160,105, 4, 6,114,183,158,216, 37,128,129,225,209, 96,108, 22, 59,249,
-215,193, 66,137, 60,166,216,117, 5,187,164,102,196,252,149,245, 72,203, 23,242,119, 86, 2,156, 19,255, 84, 86, 86,122,126, 0,
- 30,148,128,239,156, 86, 9,175, 93,250,226,173, 47, 22, 29,130, 56,202,105, 27, 30,140,244, 35,191,227,228,153,179, 72, 80,140,
-169, 71,250,222,144, 63,139,167, 95,126, 31, 63,246, 9,196,203, 19,186,248,165,254, 22,196, 38, 96, 97, 86, 58,168, 37,239, 98,
- 71,212, 99, 88,161, 59, 89,239,248,196,208,102,104, 35,245,110, 79,138,233,157, 23,169,119,100,101,226,170,230, 2,202, 43,174,
-225, 70, 97, 16, 4,182, 16, 60,209,115, 48, 20,207, 41,238,233,160,230,143,108,127,132,144, 35, 20, 69,141,160, 40,106,247,103,
-159,125, 38, 29, 63,126,124,181, 94,175, 31,233,203,156,127, 99,240,199, 18, 64,165, 50,204, 47,228,239,106,165,250, 9, 55,167,
- 76,153, 18, 91, 83, 83,179, 36, 63, 63,127,126, 73, 73, 9,106,107,107, 33, 22,139,209,178,101, 75, 68, 70, 70,142,239,211,167,
-207, 86,142,178,254, 0,208,183,109,120, 48, 30,127,252,113,252,126,174, 4,205, 59,116,171,215,223,158,156, 52, 83, 15,224,115,
- 46,228,207,226, 5,121, 79,140,200,253, 13, 51,222,253, 22, 67,134, 12, 65, 84, 84,148, 91, 69,203, 95, 21,194, 42, 1,222,212,
-117, 67, 10, 25,175, 68,220, 59,210,231,148, 10, 24, 0, 66, 66, 66,212,166,202, 98,249, 81,117,161, 2,176, 71,210, 18, 66, 32,
-145, 72, 16, 26,194, 57, 7, 54, 68, 34,145, 58, 84, 36,242,251,205,177,174,126,129, 85, 15, 88,245,142, 8,120,150,248,189, 93,
-139,197,186,250,207,159, 42,192,249, 83, 5,136,140,140, 68,121,121,185, 79,196, 31, 26,217, 10,102, 14,193,145, 92, 49,227,253,
-239,112,232,128,218,111,242, 46, 93,186,228,216,237,207, 98, 50,222, 70,254,222, 16, 63,139,231,250, 4,250,173,254, 0,128, 90,
-254,134,131,248, 89,242,191, 88, 91,171,152, 24,218, 12,227, 56, 90,253,238,240, 84,135,201, 20, 58,212,125,241, 33,176,125,245,
-234,213, 20,155,237,111,213,170, 85,148,115,230,191,117,235,214, 81,171, 86,173,114,124, 94,189,122,245, 93,239,244,132,144,131,
- 20, 69, 13,201,204,204, 92, 80, 93, 93,189,156, 16,146,231,239,255,240,199, 18, 64,127,146,211, 29,130, 33, 56, 56,120,129, 92,
- 46, 95,208, 68, 57, 7, 79,156, 56,241, 4,128, 14,205, 59,116,211, 91, 76,198,128,186,254, 86, 13, 64, 11,224,143,118, 17, 1,
-207,192, 30, 44,200, 25, 35,222, 89,123, 87,136,191, 41,138, 22, 79,242,247, 6,241,241,241,156,200,223,163, 1, 42, 20, 10,213,
-158,220,241,119, 27,236,220, 62, 75,252,104, 34,241,179,115,211,218,178,171,208,150, 93, 69,100,100,100,147, 44,126, 0,176,218,
- 24,175,189, 15,141,161,172, 82,235,243,181,184,130,157,219,247, 23,241,251,187,254,216,185,253,109, 58, 29,113,182,250,123, 11,
- 69, 77, 34,254, 63, 19, 8, 33,135, 1, 76,227,107,226,222, 99,250,244,233,169, 0,190,189, 82,161,215, 91, 76, 70,231,249,200,
-144,118, 17, 1, 97,240,114,247, 63,150, 84,157,221,252, 15,144, 82,197,227, 46, 42, 1,156, 12,173,248,248,120, 62,176,131, 7,
- 15, 30, 60,120,240,248,147,129,230,171,128, 7, 15, 30, 60,120,240,224, 21, 0, 30, 60,120,240,224,193,131, 7,175, 0,240,224,
-193,131, 7, 15, 30, 60,120, 5,128, 7, 15, 30, 60,120,240,224,241, 80,160,222, 42,128,185,115,231,250, 28, 69,234,110,187,201,
-251, 93, 94, 65, 65,129,207,242,122,247,238,125,199,229,249,251,126,155, 55,143,247, 89,222,205,155,191,223,235,231, 75,213, 41,
-172, 12,220, 36, 95,121, 16,219,223,221,146, 87,151,152,136,174,171, 67, 2,128,204,157, 59,151,225,235,143,151,199,143,207, 15,
-175, 60,175, 21,128,135, 1, 77, 77, 50, 49,101,202, 20, 57, 0,231,148,161,138,244,244,116, 53,175, 43,222, 27,104,181,218,103,
- 79,156, 56,209, 75, 32, 16, 44,148, 72, 36,208,235,245,111, 12, 26, 52,232, 99,248, 33,211, 30, 33,196,235,108,140, 15, 34,230,
-206,157, 75,192,113,147, 25, 30,247, 14, 89, 89, 89,242,164,164, 36,181,143,191, 85,100,103,103,239,245, 71, 66,169, 58,121,207,
-100,103,103,111, 92,189,122,117, 56,236,123, 26,216,112, 15,178, 91,242,184,139, 30,128, 7, 29,185,185,185,242,166,252,126,202,
-148, 41,242,244,244,116,213,148, 41, 83,156,139, 85, 83,166, 76,241, 89, 9, 96, 21,138,140,140, 12, 54, 85,167, 87,178, 82, 82,
- 82,136,151,255,215,232,122,224,221,187,191,246, 86,158, 66,163, 9,188, 23, 10, 16,117,242,228,201,127, 87, 87, 87,255,165,125,
-251,246,205,110,222,188,137,186,237,118, 63,250,241,199, 31, 63, 10, 12, 12, 28,246,228,147, 79,170,154,244, 7, 62,144,191, 82,
- 57,215,235, 65, 48, 53,117, 21,117,247,228, 53,158, 14,183,161, 77, 95,184,246,175,244,244,116, 21,222,165, 64,253,211,189, 66,
-133,119, 41, 76,249, 35,217,235,122, 29, 53,106, 20, 1,128,156,156, 28,191, 16, 24,187, 21,176, 82, 25,230,247,245,241, 89, 89,
- 89,242,236,236,108,149, 55,100,251,215,191,166, 16, 66,236, 91,171,187,195,184,113, 99, 21,217,217,217,170,164,164, 36,202,135,
-118, 60,108,199,142, 29,123,134, 14, 29,138, 57,115,230,144,180,180,180, 17,213,213,213,185,222, 92,155, 27,165, 17, 83, 7,138,
-161,156,163,172,124, 99,253,162,173, 31, 78,251,240,105,246,216,218,181,107, 26,189,198,153, 51,103, 18, 0, 8, 12,108,120,107,
-131,218,218, 90, 0,192,172, 89,179,248,252, 5,119, 9,108,114, 32,231, 28, 1, 66, 15, 29,222,109,222,108, 14,249,180,239, 21,
-154, 68, 8,206,228,159,158,158, 78, 77,153, 50,133, 56,201,245,250,126, 89,133,130, 37,154,186, 13, 63,188, 87, 40, 50,194,189,
-248,215, 68,143,103,212,142,123,145,187, 56, 47,247,181,105,136,128,188,244,202, 80, 90,173,246,135,238,221,187, 79, 2, 64, 19,
- 66, 32,147,201, 80, 86, 86,134,170,170, 42,132,134,134,162,172,172,108,239,206,157, 59, 21, 79, 62,249,164, 87,202, 73,110,110,
- 46, 97, 55,102,161, 40, 10,147, 38, 77, 66, 98, 98,162,130,162, 40,206,114,178,178,182, 56, 62, 39, 37,141,247,248,221, 19, 12,
-135, 94,190, 85,221, 3, 87,214,251,238, 90, 38, 27,232,121, 83, 37,118, 59, 97,103,236,223,191, 31, 75,151, 46,189,237, 89,172,
- 95,191,158,112,172, 55,121, 70, 70,134, 10,239, 82,117, 4,155,124,251,192,253, 46,213,100, 11,241, 62, 30, 91,234, 89,218,169,
-169,169, 10, 66, 8, 54,108,216, 64, 14, 30, 60,136,158, 61,123,122,252,237,161, 6,114, 50,110,206, 88,136,236,236,108, 21,195,
- 48, 88,179,102, 13, 60,109,171, 76, 81,148,156, 16,226,104,175, 91,183,110, 13,160, 40, 10,211,166, 77,187, 1, 32,106,250,244,
-233,187, 87,175, 94, 77,123, 99,177,127,188,251, 99,199,231,235, 57,215, 64, 81, 20,210,254, 22, 0,128,194,191,103,126,244,116,
-243,230,205, 1, 0,223,127,147,134, 57, 67,231,112,146,217,183,111, 95,116,236,216,145,103,222,251,136,252, 93, 65, 55, 54,144,
-103,100,100, 96,205,154, 53,196,221, 0,234,203,206, 80, 77,181,208, 61,201,115,178,178,125, 54, 10,211,211,211,169,244,244,116,
-138, 85, 2, 0, 40,154,162, 80, 80, 20,133,228,228,100, 16, 66, 40,167,107,243, 90, 81,161,166,104, 28, 47, 46,229,158, 16,180,
-125,149,227,197,165,220, 27,242, 39,132,128,221,157,205,211, 46,109,238,218,164, 70,163,249, 54, 52, 52,116, 18, 0,122,246,236,
-217,152, 49, 99, 6,196, 98, 49,100, 50, 25,164, 82, 41, 40,138,130, 64, 32,128, 86,171,229, 92,143,153,153,153,114,165, 82, 73,
- 50, 51, 51,225,244, 76,240,227,143, 63, 98,206,156, 57,170,204,204, 76,249,253,216,113,221, 41, 4,247,194,179,150,145,145,161,
- 74, 77, 77,165,158, 57, 51,197,173,133,175, 84, 42,201,148, 63,146, 21,238, 60, 3,158, 48,103,206, 28,242,250,235,175,163, 67,
-135, 14,126,185,222, 57,115,230, 16,165, 50, 12, 17, 17,123,252, 90, 15, 91,182,108, 25,158,155,155,187,183, 87,175, 94,212, 23,
- 95,124,161,102,201,191, 41,216,156,177, 16,203,151, 47, 7,195, 48, 88,184,112, 33,184,200,116, 38,127, 0,216,177, 99,199,182,
- 33, 67,134, 0, 64,216,180,105,211,172, 67,135, 14,133, 82,169,100,184, 26, 45,174,125,116,197,138, 21,120,230,113,187,109,152,
-246, 55, 25,166, 14, 20,227,141, 81,175,115,190,167,192,192, 64, 12, 25, 50, 4, 41, 41, 41, 84, 98, 98,162,219, 23,123, 14,111,
-253,223, 59,242,111, 84, 1, 96,201, 42, 63, 63,223,145,118,210,217,122,242,150,104, 29, 22,132,159, 7, 37, 55,202,128,194,159,
-149,151,158,158,174,242,131, 12,135, 66,145,156,156,172, 96,235,240, 97,130, 51,249, 3, 64, 73, 73,137,227,216,213,171, 87, 57,
- 43,140, 90,173,246, 3,189, 94, 63,147,166,105,122,250,244,233,208,106,181, 40, 45, 45,133, 72, 36,130, 80, 40,132, 80, 40,132,
- 72, 36,130, 76, 38,131,193, 96,112,155, 18,213,205, 0, 39,223,189,123,183,138,162, 40, 76,158, 60, 25,171, 87,175,166, 18, 19,
- 19,169,212,212, 84,106,242,228,201,108,251, 81,241, 67, 69,227,228, 95, 87,151, 10,118, 16,119,126,246,201,201,201,138,196,196,
- 68, 53,224, 91, 74,218,196,196, 68,106,245,234,213, 84, 70, 70, 6, 8, 33,126, 81,198,222,122,235, 45,100,100,100,112,106, 35,
-158,176,105,211,166, 17, 71,142, 28,201,141,137,137,129, 78,167, 35,129,129,129,228,192,129, 3, 0, 28, 65,150, 62,145,255,167,
-159,126, 10,138,162, 64,211, 52,142, 28, 57, 2, 86,166, 23, 30,137,167, 41,138,194,212,169, 83,173,117, 69,230,105,211,166, 85,
-203,229,114,204,153, 51,135,217,186,117,171,199,123,119,158, 10,187,158,115, 13,160,128, 13,175,222,202, 90,156,246,183, 0, 76,
-123, 66,130, 69, 79,190,193,249,186,184, 88,254,188,119,224,238,145,127,202,162, 15,221, 30, 23, 54,214, 33,139,138,138, 72,126,
-126, 62, 50, 50, 50,192,126,102, 93, 59,222,116,242, 59, 77,254,206, 86, 53, 59, 8,221,175,112,158, 18,120,216, 64, 8, 65, 73,
- 73, 9,174, 95,191,238, 40,115,253,238, 1,130, 95,126,249,101,116, 92, 92, 28, 4, 2, 1,206,159, 63, 15, 66, 8,206,158, 61,
- 11,179,217, 12,138,162, 32, 20, 10, 65, 81, 20,108, 54, 27,244,122, 61, 54,111,222,140,196,196,198,167, 61,246,236,217,163, 2,
-128,201,147, 39,223,214,110,235,190, 19,150, 40,184,180,107, 87,183,190,167,239, 92,172,124, 22, 13, 77, 7,112,113,253,187, 98,
-255,254,253,168,179, 12,155,166, 0,191, 75,129,114, 82,224, 88, 5,150,157,243,207,117, 34,127, 95,172,117, 86, 9, 99,201,104,
-207,158, 61, 42, 95, 45, 67, 86, 94,231,206,157,111, 35, 55, 95,176,106,213, 42,252,241,199, 31, 36, 50, 50, 18,173, 91,183,118,
-108,251,124,233,210, 37, 8, 4, 2,252,247,191,255,245,233, 15,134, 62, 97,223,190,140, 97, 24,188,246,218,107, 88,177, 98, 5,
- 14, 28, 56, 0,138,162, 48, 46,233,175,184,124,137,219, 6,142, 59,118,236,216, 82,247,140,141,176,175,144, 97, 0, 96,218,180,
-105, 85, 0,154,101,103,103,131,162, 40,206, 10,149,221,250,191,125, 31, 19,251,116, 0,240,125, 90, 1,178,180, 89,114,240,120,
-224,201,191, 81, 5, 0, 0, 82, 82, 82, 40,214,234,103,201,223,237,220,159, 23,100,221,152, 37,200,101,158,216,147, 60,215,227,
-247,106, 71,170, 41, 83,166, 56,207, 53, 19,119,199, 89,207, 64,147, 72, 55, 61,204,175,215,173, 27, 59,215, 39,203,191,161,193,
-182, 77,155, 54,183,157,219,200, 51,105, 22, 30, 30,222,221,100, 50,161,178,178, 18,135, 14, 29,130, 64, 32,128,217,108,134,193,
- 96, 0,195, 48,142, 93, 41, 45, 22, 11, 76, 38, 19,167, 41, 6,246, 57, 52,212,110, 19, 19, 19,169,204,204, 76,146,145,145,225,
- 81,153,176, 91, 93,119, 38, 6, 64, 54,112,229,109, 68,207,126,247, 69, 17, 24, 50,100, 72,211,149, 0,151, 57,255,220,220, 92,
-185,131,236,111,205,249,251, 20, 35,227,162,132, 1,176,239,182,168, 84, 42, 9,151,231,192,213, 11, 80, 23,251,224,117,108, 1,
-187,179, 99,235,214,173, 17, 18, 18, 66,185, 42,187,221,187,119,247,217,242, 39,132,192,106,181, 58,202, 6, 13, 26,132, 3, 7,
- 14, 96,223,207, 54,124,188,140,219, 28,123, 86, 86,214,168,186,185,255,211, 0,154, 3,112,222,108,168, 20, 64, 51, 0,200,206,
-206, 86,245,234,213,203,163,188,250,115,255,110, 60, 5,117,239, 92,229,241,184,255, 33,228,210, 57, 89,235,223, 91,203,191,168,
-168,136,248,211,221,237, 73, 94,221,180,132,223, 60, 13,107,214,172,161, 82, 82, 82,124,250,173,235,117,166,166,166,234,148, 74,
-101, 80, 67,199,125,133,243,220,191, 63,148, 1,231,185,127,174,202,192,140, 25, 51, 16, 24, 24,136,160,160, 32, 4, 7, 7, 35,
- 52, 52,148, 9, 11, 11,163,179,179,179,241,236,179,207, 58,206,147, 74,165, 24, 57,114, 36,148, 74, 37,105, 96,183,170, 8,179,
-217,140,202,202, 74, 24,141, 70,132,134,134, 66, 34,145,192,106,181,130, 16, 2,155,205, 6,179,217, 12,139,197, 2,155,205,230,
- 85,124,129,167, 41,171,201,147, 39,227,126,152,154,241, 20, 16,232, 45, 88, 37,192,231,246,245,207,134,235,110,202, 31,201,117,
-113, 55,190,201,118,181,254,157, 21, 73, 95,130, 1, 93,173,255,198, 20, 83,174,228, 47, 16, 8, 72, 72, 72, 8, 96, 15,168,163,
- 0, 16,139,197, 2,173, 86,139, 22, 45, 90,248,116,223,172, 49, 37, 20, 10, 49,127,254,124, 28, 57,114, 4,183,230,253,185,183,
-233,157, 59,119,238, 28, 60,120, 48, 0, 4,195, 62,157,171, 7,128,141, 27, 55,182,216,183,111, 95, 8, 33,196,161,108,187, 91,
-103,127,155,245,255,217, 10, 76, 29,112,187,245, 63,227, 63,122,108, 60,100, 1, 33, 4,189,167,247,198,156,161,115, 40, 46,242,
-120,220,223,214, 63,192, 33, 19, 96,110,110,174,195,245,239, 28, 15,192, 5, 29, 59,118,164,146,147,147,253, 54, 39,207, 65,158,
-207,243,235, 83,166, 76, 33,174,175,220,220, 92,134, 93, 21,224,180, 34,192, 39,164,164,164, 4, 61,204, 13,110,205,154, 53,248,
-244,211, 79,235,181, 43,150,252,147,146,146,144,148,148, 4, 0,216,183,111, 95, 99, 98,194,139,138,138,140, 54,155, 13, 26,141,
- 6, 55,111,222,132, 70,163,129, 94,175,135, 94,175,135, 78,167, 67,117,117, 53,180, 90, 45, 12, 6, 3, 76, 38, 19,108, 54,207,
-203,219, 41,138, 66,102,102,166, 87, 10,219,131,140,253,251,247,215,123, 57,227,204,153, 51,114,231,239, 92,230,156, 93,231,252,
- 93, 45,247,166, 4,114,185,251,237,234,213,171,169,204,204, 76,191,198, 2,100,102,102,114, 30,187, 88,242,167,105,154,212,181,
- 47,135,235,159, 97, 24,220,184,113, 3,157, 59,119,166,230,206,157,235,245,181,188,189,104, 40,246,237,219, 7,230,135,102, 32,
-132, 96,249,242,229,142,103,180,255, 16,231,184, 61,100,101,101,141, 7,128,105,211,166,149,212, 41, 0,166,239,191,223,208, 98,
-238,220,185, 45,246,237,219,135,167,158,122,106,132, 55,203, 20,175,231, 92, 3, 5, 10, 27,156,172,255,233,159,233, 33,152,170,
-197,247,135,204,152, 55,111, 30,150,237,252,136,103,214,135,136,252, 61,122, 0,214,172, 89, 83,111,222,223, 57, 30, 32, 37, 37,
-133,226,216,193,213,117,196,172,170,179,132,155,228,246,118, 39,143,117,251, 39, 38, 38,170,253, 21, 85,154,152,152,120, 50, 55,
- 55,183,251,253,248,128, 89,171,223, 95,238,127,214,234,247,214,253,207, 98,195,134, 13,142,207,255,248,199, 63,240,245,215, 95,
- 3,128, 25,128,152, 37,126, 0, 24, 57,114,164, 39, 5,192, 16, 23, 23, 7,189, 94, 15,179,217,140,242,242,114, 72, 36, 18, 8,
-133, 66,135, 7,160,182,182, 22,122,189, 30, 38,147, 9, 90,173, 22,147, 38, 77,242,168, 96,178,214,125, 99,203, 90,217,243,184,
-224, 78,198, 0,248,114,220, 21,236,114, 63,119, 88,190,124,185,106,254,252,249,138, 46, 93,186,168,239,101, 27,110,200,250,119,
-134, 55,177, 0, 13, 89,255,190, 90,254, 52, 77, 19,134, 97, 40, 0,239,177, 77,219,102,179,189, 27, 24, 24,136, 54,109,218,248,
- 52,198,188,243,230, 80,168,213,106, 80,153, 17, 0,128, 93,239, 4, 99,228,191,106, 48,100,200, 16, 44, 89,182,207,171,196, 84,
- 59,118,236,216, 60,116,232, 80, 0, 40,223,184, 49,173,245,190,125, 7,154, 17,138, 96,244, 83,163,147,146,146,146,182,121, 51,
-156, 0,246,185,255,169, 3, 69,245, 45,126, 16,204,159, 55, 31, 81, 35,163,255, 20, 9,179, 30, 58,163,108,217,155, 13, 42, 8,
-172, 7, 86,200,197,242,239,219,183,239,109,241, 0,222,184,232, 92, 73,219, 15,228,236, 42,207,239, 17,220, 41, 41, 41,221,115,
-115,115,253, 38,239, 97,237, 64,108, 98, 25,214, 77,156,145,145,129,231,159,127, 30, 0,196,236, 57,206,199,234, 6,173,134,112,
-106,192,128, 1,207,170,213,234, 12,155,205,134,234,234,106, 88, 44, 22,199,188,191,209,104,116, 44, 49,100, 3, 3, 71,142, 28,
-169,230,208, 94,168,140,140, 12, 82,231, 5,168,215,110,115,115,115,217,114, 36, 38, 38,114,242, 86,221,237, 24, 0,215,105, 1,
- 79,207,163,177,227, 74,165,146, 44, 95,190, 92,245,204, 51,207,224,135, 31,126,240,233,153,187, 46,191,101,191,167,167,167,171,
- 82, 74,148,152,226,193,210, 30, 53,106, 20,185,120,241, 34,118,238,220,217, 96,125, 95,188,120, 17, 0,144,147,147,227,241,122,
-146,147, 51, 72,114,242,112,140, 24, 81,132,162,162, 34,183,209,229, 21, 21,195, 1,104,160, 84, 54, 60,110,177,228,111, 54,155,
-137, 88, 44,102,207,121,175, 78, 33,120,247,242,229,203,104,223,190,189, 79,150, 63, 77, 83,118,133,157, 37,255,227, 86,124,173,
- 50, 3, 0,150, 44,219,231,245, 24,193,246,137,185,115,231,198, 19, 66, 48,102,236,152, 73,227,198,142,219,228,203,208, 52,126,
-194,211,167, 41,138,122,148, 16, 64, 48, 85, 11, 66, 8,230, 47,152,143,232,145, 45,111, 77,124,248, 14,214,203, 76,192,103, 18,
-188,239,208,160, 2,224,188,220,207,197,213, 71, 50, 50, 50,192, 53, 96,202,149,180,253,117,225,206,242,252,176,254,159, 71, 19,
-225,236, 66,119, 38, 33, 54,159,132,235,177, 6,230, 16,173, 0,126, 28, 58,116,232, 43,217,217,217,159, 91,173, 86, 84, 85, 85,
- 57, 98, 0, 0,160,188,188, 28, 85, 85, 85, 32,132,192,155,233,165, 17, 35, 70, 40,118,239,222,173,202,200,200, 64,102,102, 38,
-113,157,243, 31, 49, 98,132, 87,201,128,238, 4, 12,135, 94,246,154,240,221, 17,124, 99, 74, 64,106,106, 42, 53,103,206, 28,226,
- 11,249,215, 11, 0,116,122,238, 78, 65,129,222,122, 1, 26, 84,220, 47, 93,186,228, 80,208,184, 26, 26,206, 83,149,183,223, 55,
-183,177, 74,171,213,146,208,208, 80,103,242,127,215,100, 50,161,180,180, 20, 29, 58,116,240,137,252,149, 74, 37, 97,126, 8,195,
-174,227,246,160,191,117, 42, 51, 54, 30, 50,131, 16,130, 3,191,248,206,137,251,247,239,199, 83, 79, 61,165,240, 53,125, 48, 75,
-208, 12,195,136, 0,224,135, 95, 44,152, 55,111, 30,162, 71,181,116,241, 15,120, 7, 54,203,223,144, 33, 67, 8,224,126,185,159,
- 83, 38, 64,194,231, 2,240, 47, 26,136,175,242, 46, 19, 96,106,106, 42,181,102,205, 26,226,110,217,148, 55, 83, 0,110, 72,219,
-111,112,145,231,215,245,255, 46,233,128,189, 70,114,114, 50, 56, 4, 44,114, 70, 67,238,126, 95,167, 1, 26,114,247,251, 50, 13,
-224,156, 94,214,149,124, 26, 59,214,208,173, 82, 20,181,114,204,152, 49,171, 55,108,216, 96, 17,139,197, 48,153, 76,176, 90,173,
- 96, 24, 6,205,154, 53,131, 70,163, 65,178,151, 75,207, 38, 79,158,172,158, 60,121, 50,181,123,247,110,146,153,153,137,140,140,
- 12,176,121, 1,254, 76, 3,208,222,189,123,201,152, 49, 99,176,125,251,246, 38,147,191, 43,201,229,218, 21, 50,143,222,184,215,
- 95,127,253, 54,227,194, 21,111,188,241, 6,225, 26,228,169, 84,134,121,148,167, 84,114,155,255,151,201, 28,169, 47, 9, 33, 4,
-122,189, 30,165,165,165, 62,207,249,215,243,124,252,171,166,222,247,166,144,255, 23, 95,124,225,175, 54,203,100,109,221,214,217,
- 57, 19,160,191,208,152, 66,182,110,221, 58,158,169,239,103, 15, 0, 96, 95, 6,232, 77,249,189,196,253,182,254,223, 31, 75,252,
-110, 41, 34,137,126,187,174, 41, 83,166, 40,188, 77,239,235,129, 24,136,179, 66,227, 46,208,202,245, 24, 71,194,181,206,152, 49,
-131,218,181,107,151,252,202,149, 43, 42,131,193, 0,155,205,134, 71, 31,125, 84,145,144,144,224,243,243, 30, 49, 98, 4, 53, 98,
-196, 8,118,132,247,105,106,230, 78,199, 0,120,250,206,197,226,172,139, 14,175, 79, 56, 94, 38,153, 97,235, 8,239, 82, 36, 23,
-201,183,217,131, 41, 41, 41, 36,165, 68, 9,170,126, 34, 32, 10, 0,206,157, 59, 71, 26,233,171, 30, 43,125,248,240,225,148, 23,
-125,159,242,199, 57, 0, 80, 89, 89, 9,153, 76, 70, 40,138, 66,251,246,237, 65, 81, 20,213,185,115,103, 52,149,252,233,103, 52,
-160, 40, 10, 73, 79,219, 87, 21, 81, 20,229, 88,238,199,186,243,239, 17,152,190, 51,251,248, 85,224,172, 89,179, 88,229, 63, 8,
-118,175,158, 21,118,247, 63,227,116, 14, 63, 29,112,191, 43, 0, 15, 10,252,177,214,223, 95,132,125, 7, 20, 27,191, 94,151,191,
- 55,246,185,211,214,115,221, 28,191,219,255, 48,155,205, 16, 8, 4, 16, 8, 4,119,177,173,173,162,238,111,121, 13,247,133,153,
- 51,103,122, 47,240,221, 91,251, 88,100,100,100,212, 27,180, 83, 74,148,206,150,183,250, 97, 24, 75,162,163,163,169, 91,125,197,
- 30,108,219, 84,242,183, 63,147,198,182, 2,186, 29,171, 86,253,118,215, 8,114,206,208, 57,212,221, 30, 19,120,183,255,221,135,
-187,169, 1, 42, 62, 62,158,215,196,120,240,224,193,131, 7,143, 63, 25,104,190, 10,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, 15, 5,234,173, 2,
-152, 59,119,174,207,145,153,238, 18,187,240,242,120,121,188,188,187, 39,111,241,226,197,245,181,123,154,118, 44,115,116, 94,106,
-198,102, 83,116, 94,122,230, 46,125,112, 80, 80, 16,164, 82,169,227,247, 52, 77, 59, 86, 92, 56,203, 99, 55,102, 98, 24,251, 42,
- 47,118,179, 28,254,249,122, 35,143,146, 11,132, 18, 16,198, 10,134,177,170,125,145, 71, 8, 81, 28, 59,118, 76, 24, 31, 31,159,
- 11,151,172,123, 62,202,147, 31, 59,118, 12,241,241,241,234,123, 81,127, 5, 5, 5, 62,203,235,221,187,247,159, 94,158,215, 10,
-192,159, 17,111,191,157, 87,175,226,150, 44,233, 79,221, 87,242,242,222, 38, 0,176,164,255, 18,202,249,179,175,242,216, 76,113,
- 74,165, 18,169,169,169,141,157,215,232,113,103,121,112, 90,166,199,254,198,249,247, 74,165,210,113,140,171,220, 63, 35,104,115,
-173,188,252,228, 33, 12, 9, 43, 87,181,182, 22,163,144,116,192,145,218,112, 69, 72,220, 99, 16, 7, 6,171, 61,253,254,224,193,
-131, 24, 52,104,144,131,248, 89,194,166, 40,234, 54,194,102, 24,198,241,186,124,249,178, 91,121, 71,143, 30, 69,223,190,125, 33,
-147,201, 32, 20, 10, 33, 16, 8,234,201,100, 73,223,102,179, 57, 94, 38,147, 9,249,249,249,232,212,169,211,195,248,136, 40, 59,
- 47, 18,249,217,179,103,113,238,220, 57, 85,179,102,205, 48,120,240,224, 38,245,113,138,162,229, 18,105, 56,154,133, 61,162,170,
-213,149, 40,116, 53,197,114,111,101, 48, 12, 35,207,204,204,220, 91, 88, 88,136,237,219,183, 67, 38,147, 97,225,194,133, 2, 56,
-173,189,247, 65,158,170,232,194,121,236,222,149, 3,177, 68,130,121,243,230, 15, 35,132,168,248,158,250,144,122, 0, 30, 36,100,
-102,102,122,212,120, 38, 79,158,236,177, 99,178, 4,237, 74,220,190,194,223,242,252, 13,167,204,124,156, 6, 45, 46,169,101,185,
-202,171, 83, 4,154,148, 93,156,205, 42,232,252,255, 15,124, 47, 36, 68,126,250,224, 46,132, 92,252, 69,165,215,155, 96,121,140,
-134,172, 13,133,206, 87,142,163, 95, 48, 81,105,202, 15,227,247,128,231, 20, 55,169,214,141, 42, 1,167, 79,159,134, 64, 32,192,
-224,193,131, 33, 20, 10, 29, 47, 86, 33, 96,173,126,171,213, 10,155,205, 6,139,197,130,203,151, 47, 99,239,222,189,110,229,233,
-245,122, 20, 20, 20, 96,192,128, 1, 16,139,197, 16,137, 68,245,100, 50, 12, 3,171,213, 10,171,213, 10,139,197, 2,131,193,128,
-130,130, 2,232,116,186,251, 66,159,170,107,103, 52,110, 37,162,241,153,163, 23, 47, 94,204,184,140, 45,168,169,169, 65, 68, 68,
-132, 79, 25, 72, 23, 47, 94, 92,239,122,190, 75,203,135, 76,214, 2, 2,129, 88,165,171, 41,246, 90,102, 94, 94, 30,116, 58, 29,
- 6, 12, 24,112, 57, 49, 49,177,101, 69, 69, 5,118,237,218,101, 11, 15, 15, 71, 66, 66, 66,163,125,100,214,168,225,183,213,205,
-137, 51,103,160, 14, 14,192,130,229,255, 44,238,221,167,123,219,107, 87,203,176, 43, 91,189, 55,166,123,239,196,234,106,237, 30,
-158, 58,239,127,176,169,127,157,225,154, 11, 64,216,216, 32,203, 14,174,158,190,223, 11,242,127,241,197, 23, 27, 61, 71,163,209,
-224,251,239,191, 39, 92,148, 0,150,172,155,106,173,223, 9,121,206,150,127, 83,173,127, 39, 18,166, 0, 16,165, 82,233,113,227,
- 24,142,100, 77,177,196,206, 90,251,206,150,191, 51,213,113,109, 51, 78,158, 10,226,156, 78, 24, 0, 42, 43,237,153, 17,195,195,
-115, 31,138,142,122,233,183, 92,116, 42, 86,169,138,245, 12, 38,118, 18,224,145, 72, 43,152,112, 2, 81,184, 0, 53, 21, 98,200,
-106, 12,232,122,108,165, 42, 63,110,142, 66, 31,208, 94,221,176, 37, 73,225,143, 63,254,128, 88, 44,198,176, 97,195, 28,164, 45,
-219,142, 30,155, 0, 0, 32, 0, 73, 68, 65, 84, 18,137, 64,211, 52, 8, 33,176, 88, 44,176, 90,173, 48,153, 76, 40, 46, 46,134,
- 74,165,106,112, 75,101,154,166, 97,177, 88,112,236,216, 49, 12, 30, 60, 24, 50,153, 12, 18,137,196, 33,143, 85, 0, 76, 38, 19,
-116, 58, 29, 78,156, 56, 1,163,209,232, 85, 98, 38,181, 90, 45, 23, 8, 4,170,154,154, 26,136,197, 98,148,149,149,189, 60,113,
-226,196, 26,169, 84,250,157, 47,164,173, 86,171,167, 8, 4,130, 31,156,228, 21, 78,156, 56,241,172, 84, 42,157, 12,251, 14,149,
- 94, 91,194,239,188,243,142,106,233,210,165,101, 0, 90,212,145, 55, 78,159, 62,141, 22, 45, 90, 52,152,119,221, 19,249,127, 53,
-123, 54, 70,247,238, 13, 0,136,126,229, 21,200, 2,162,160,171,190,130,106,237, 5, 5, 33, 54,181,183, 50,123,246,236,137,178,
-178, 50, 28, 60,120,176, 61, 77,211, 56,113,226, 4,194,195,195,177,127,255,126,152,205,102,143,245, 88,241,193,130,122,223,131,
-204, 22,180,178, 26, 49,239,245,119,219, 46,255,248, 31,248,247,199, 95,160, 53,109,195, 23, 31,127,154, 59,108,234,116,158, 93,
- 31, 64,242,103,203, 57,237, 5, 0,220,158,255,219,211,247,187, 9,127,238,212,247, 32,192, 89, 9,104,162, 7,128, 37, 88, 10,
- 0,249,122,194,183,110, 9,249,249,205,207,113, 38,235, 58,215, 62,229,102,192,118,254,189, 67, 65,224, 50, 5,192,254,183,235,
-187,171, 7,224, 65,135,177,234,166,124,136,169, 64, 85, 38,176,161, 83, 40,208,190, 29,129,160,167, 24,194,142, 29, 33, 54, 25,
- 97,250,185, 24, 38,173, 16, 2, 70, 4, 99,238,119, 42,122,244,223, 20,140,208,253,116, 0,235,158, 63,127,254, 60,194,194,194,
-160, 80, 40, 32,149, 74, 33, 22,139, 33, 20, 10, 29, 86,191,209,104, 68,105,105, 41,246,237,219, 7,154,166, 65,211, 52, 26,147,
-103,179,217,112,234,212, 41, 12, 26, 52, 8, 33, 33, 33,144, 74,165, 16, 8, 4,176, 90,173, 48,155,205,168,174,174,198,225,195,
-135, 97, 50,153, 32, 20, 10, 29,177, 0,158,176,126,253,122,185, 78,167, 83, 93,188,120, 17,213,213,213, 16,139,197,136,142,142,
- 94,121,224,192, 1, 12, 28, 56, 80, 24, 24, 24,248,181, 55, 74,192,250,245,235, 39,232,116,186, 31, 92,228,197, 29, 56,112, 32,
-110,224,192,129,223, 7, 6, 6, 78,230, 42,143, 97, 24,185,217,108, 70,101,101,165,202,201,163, 0, 0, 88,186,116,105,201,226,
-197,139, 91, 79,158, 60,121,152, 84, 42,245,106,252,163, 5, 98,185,107,217,245,207, 63, 71,244,248, 54,248,247,191, 63, 83, 88,
- 44,181, 62,141,167, 7, 15, 30, 84,253,246,219,111,120,243,205, 55,171, 5, 2, 65,136, 84, 42,197,192,129, 3,161, 82,169,144,
-157,157,141,214,173, 91,123,225,239,160,176,254,252, 53,252,120,174, 4, 89, 91,191,129, 64, 64, 97,193, 43,207, 50,189,162,155,
-211,107,230,189,139,181,222,202,227,113, 79,200,223, 85, 57,117,167, 20,248,188, 10,224, 94,111,111,219,177, 99, 71,133,167,215,
-221,182,214,239,132, 60,127, 88,253, 13,225,235, 9,223, 82,207,111,126,142,184, 35,127,112,159, 34,168,103,233, 87, 86, 38, 58,
- 44,116,220,218, 2,212,107,183,127, 99, 68, 31, 30,158,235,147,245,111,181, 90,229,135, 15, 31, 38, 13,149,185, 30,107, 8,206,
-231, 91,173, 86,185,235, 49,215,178,198, 80,121,234,168,170,180,164, 26, 45,130,133,232, 24, 76, 32,108,206, 64,248,248,147, 8,
-236,245, 29,100,125, 62,129, 36, 84, 6,177,206, 0,189,222,134,118, 2, 61,246,111,104, 88,121,162,105, 26, 66,161, 16, 34,145,
- 8,231,206,157,195,137, 19, 39, 16, 18, 18,130,136,136, 8, 68, 68, 68,160,121,243,230,104,214,172, 25,180, 90, 45,246,239,223,
- 15,129, 64,224,152,219,119, 7,246,184, 88, 44,134,205,102, 67, 97, 97, 33, 2, 2, 2,208,188,121,115,180,104,209, 2,145,145,
-145, 8, 10, 10, 66, 97, 97, 33, 44, 22,139, 99,138,160, 33,133,194,213,242,191,113,227,134,234,194,133, 11,232,208,161, 3, 70,
-141, 26,133,254,253,251, 67,175,215, 99,239,222,189, 56,118,236,216,151, 70,163,145,115,238, 98,181, 90,173,184, 81, 86,190,169,
-232,154, 22,193,157, 6, 32,110,212, 95,208,186,127, 18, 52, 38, 26,187,115,247,224,216,177, 99, 19,141, 70,227, 95,185,146,127,
-117,117, 53,142, 31, 63,174, 58,120,240, 32,122,246,236,137,197,139, 23, 55, 71,221,124,250,226,197,139, 91, 3,128, 55,228, 79,
- 11,196,242,192,160, 86,242,240,136,238,170, 13, 27,143, 99,246, 87, 95, 33,187,160, 0,217, 5, 5,136,126,229, 21, 0,128,197,
- 82,187,207,151,126,156,157,157, 77,178,178,178, 48,105,210,164,203,193,193,193,116, 64, 64, 64,126, 94, 94, 30, 14, 30, 60,136,
-155, 55,111, 34, 46, 46,206, 43,121,159, 21,156,195,199,191,158,196,218,143,223, 58, 46, 20, 24, 64,219,106,240,209,138,175,232,
- 31,246,231,163,148, 22,226,145, 71, 30,225, 89,246, 33, 1,237, 43,193,223,195,205, 43,238,140,133,253,118, 30,241,231,188,189,
-191,229,221, 73, 69,224,249,205,207, 17,231, 87, 67, 94, 1, 79, 94,133,219,200,173,190, 50,224,173,167,130,106,168,220,213, 43,
-192, 5, 53, 53, 53,242, 61,123,246,168,242,242,242, 26, 44,115, 62,214, 24,156,207,223,179,103,143,170,166,166, 70,238,124,204,
-181,172, 49,132, 24, 43,144,125,197,136, 29, 23, 25, 20,107, 40,220, 40, 7,104, 97, 40,104, 42, 2,148, 81,130,218, 27, 20,142,
- 95, 97,112,226,138, 17, 21, 53, 22,244, 8,151,168,184, 40, 0, 18,137, 4, 23, 46, 92,192,153, 51,103, 16, 30, 30,142,176,176,
- 48,132,133,133, 65,175,215,227,224,193,131, 16,137, 68, 16,139,197,141,238,165,192,122, 7, 88, 37,128, 16,130,162,162, 34,132,
-135,135,163, 77,155, 54,136,140,140, 68, 81, 81, 17,108, 54, 27, 36, 18, 9,196, 98,113,189,149, 7,238,134, 21,246, 67,121,121,
-185,234,234,213,171,232,214,173, 27,158,124,242, 73,140, 29, 59, 86, 49,118,236, 88,197,224,193,131, 97,179,217,240,203, 47,191,
-160,168,168,104, 0, 0, 78,243, 9,229,229,229,123,111, 84,106, 17, 30,219, 11,113,137,179,208,109,204, 92,116, 29, 51, 7,237,
- 31,159, 0, 51, 17,176,242, 56, 61,223,186,216, 7,213,185,115,231,216,123, 85,212, 17, 63,189,120,241, 98, 44, 93,186, 20, 75,
-151, 46, 61,227, 26, 23,208, 16, 4, 66,169, 60, 44,188,171, 42,186,245, 32, 85, 88, 68, 87, 80,180, 16, 95,126,173,194,236,175,
-190,194,236,175,190,194,210,165, 75, 81, 94, 94, 14,174,242, 92, 44,127,178,109,219, 54, 12, 28, 56, 16,125,250,244,105, 15, 64,
-186,103,207,158,190,151, 46, 93,194,169, 83,167, 96, 48, 24, 48,102,204,152, 97, 92,229,165,157, 45,198, 39,135,207, 96,245,146,
-215, 43,219, 60,210,190,167, 94,167, 65,218,166, 61, 56,126,226, 44,246,255,180, 27,218,235, 55, 48,102,204,232, 68,240,184,111,
- 17, 31, 31,223,160,245,207, 41, 6, 32, 53, 53,149,202,205,205,149,115,253,254, 32,195,159,150,250,157,144, 7,248,207,253,223,
-160, 21,234, 52,167,238, 45,249,179, 94, 0,103,235,220, 31,240, 20,124,232, 13,212,106,181,188,180,180, 84,197,110,238,210, 80,
-153, 47, 56,127,254, 60, 42, 42, 42, 84,173, 90,181, 82,200,229,114,117, 67,101, 13, 18,215,205, 98, 28,186,102,192,152,128, 0,
- 28, 40,102,208,170,143, 4, 29, 76,249,208,156,126, 17,155, 63, 58, 14,230,146, 22, 58, 51, 65, 73,141, 13, 50, 33, 13,171,246,
- 58, 66, 27, 81,218,157,149, 0,169, 84,138,203,151, 47,227,204,153, 51,232,214,173, 27, 52, 26, 13,126,253,245, 87,199, 92,190,
-167,249,122,138,162, 28, 94, 0, 86, 30, 33, 4,197,197,197,232,209,163, 7,114,115,115,193, 48, 12,164, 82, 41, 68, 34,145, 99,
-149, 0, 23, 15,192,149, 43, 87, 96, 52, 26,209,183,111, 95,180,105,211, 70, 33, 16, 8, 16, 18, 18,130,199, 30,123, 76,241,235,
-175,191,170,174, 92,185,130,234,234,234, 19,224,232,178,191,114,229, 10, 24, 90,140,214,241,137,104,214, 38, 14,180, 64, 4, 89,
- 72, 36,218, 61, 54, 6,151,127,205, 66,157,188, 75,158,228, 16, 66,228, 85, 85, 85,170,146,146, 18,180,107,215, 14, 79, 60,241,
-132, 66, 32, 16,168, 7, 13, 26, 68, 45, 94,188,152, 12, 24, 48,192, 90, 55,110,198,133,134,134,162, 78, 65,177, 53, 38, 83, 42,
-141, 64, 68,100, 47,152, 77, 90,220,172, 40,128,201,164, 25,110,177,232,250, 3,248, 96,192,128, 1, 0,128, 27,215,175,163, 78,
-158, 8,128,133,203, 61, 31, 61,122,116,242,134, 13, 27, 48, 99,198, 12, 12, 26, 52, 8, 0,152, 93,187,118, 9,179,179,179, 49,
-123,246,236,145, 61,123,246,220,237, 77, 91, 46,172,214, 99,209,190,223,241,225,107, 74, 12, 30,155, 24, 94,171,187,137,244, 77,
-251,144,250,229,143,216,177, 96, 22, 58,150, 93,197,178,234,235, 8, 15,143,224,131, 0, 31, 16, 56,187,253,221,197,171, 52, 24,
- 3,224, 58,183,239,233,251,195, 8,127, 47,193,243, 21,255,234,247, 47, 5, 69, 81,247,101,125,187, 44,245,171, 23, 7,224,170,
- 12,248,115,249, 31, 87,229, 32, 43, 43, 75,126,227,198, 13,149,217,108,110,180,172, 41,208,104, 52,168,173,173, 85, 85, 87, 87,
- 43,220,149, 37, 37, 37, 53,248,236,142, 85, 26,160, 53, 51, 56, 86,110, 69,105,149, 21, 81,191, 10,209, 51,253, 60, 46, 95, 58,
-133,179,191,153, 97, 21, 10, 96,102, 0,163,153, 64, 67, 24, 68,134,145, 70, 9,219,121,249, 31, 27,177,127,227,198, 13,180,111,
-223, 30,151, 46, 93,114,184,252,133, 66,161,227,124,111,167,243,156,115, 8,176,239,119,104, 74,176, 10, 77,139,222,191,205, 24,
-247,116, 2,195, 48,168,173,173,181, 15,142, 66,161, 66, 32, 16,168, 93, 60, 73,194,172,172, 44, 36, 37, 37,209,139, 22, 45,186,
-177,108,217, 50,235,162, 69,139, 26,189,121,138,178, 43, 68, 6,253, 13,232,106,138, 21, 54,155, 81, 13, 96, 63,128, 15,106,106,
-106,144,149,149,229, 80, 38, 59,117,234,100,246, 36,175,174,125, 37,101,102,102,102,140, 25, 51,198, 65,254, 63,255,252, 51,189,
-101,203, 22,200,229,242,177,222,146,255, 53,189, 9,207,102,255,138,121, 83,198, 96,242,179,147,160, 55, 86, 99,115,150, 26, 43,
-190, 72,195,183, 35,251,161, 99,217, 85,158, 77, 31, 2,101,192, 85, 9,184, 43,153, 0,149, 74, 37,113,158,211,245,244,157,199,
-109, 3,251, 29, 37,127, 95,231,212, 89,226,119,141,246,119,113,253, 83,117, 47,183,231, 54,212, 94, 60,181, 11,174,237, 37, 41,
- 41, 73,221,185,115,103, 69, 88, 88, 88,163,101, 77, 65, 88, 88, 24, 58,119,238, 92,143,232,221,149,185,131,193, 22, 2, 11, 5,
- 28,185,105, 66,153,205,134, 61, 69, 70,164,103, 24,177,247,106, 36,206,139, 67,113, 85,107, 65,113, 13,131, 90, 43,160,183, 18,
- 72, 34,162, 61, 18, 51,187,190,223,102,179,193,106,181, 34, 34, 34, 2, 65, 65, 65,104,223,190, 61, 44, 22,139,163,220, 93, 66,
- 32, 87,121,236,250,126,171,213, 10,131,193, 0, 66, 8,218,182,109,139,146,146, 18,180,108,217, 18, 66,161, 16, 38,147, 9,102,
-179,217,241,191, 92,166, 7,219,181,107, 7,169, 84,138,252,252,124, 92,189,122, 85,101,179,217, 80, 93, 93, 77,253,246,219,111,
- 42,157, 78,135,118,237,218, 33, 36, 36,228, 73,174, 99, 84,187,118,237, 64, 51,102,148, 20,228,162,234,106, 33, 24,155, 5,134,
-234,114, 92,249,237, 39,152,107, 53,172,188, 24, 46,202, 13,139,136,136, 8, 21,195, 48, 14, 79,231,210,165, 75,169, 83,167, 78,
-161,142,180, 25, 0, 81,238, 18, 30,185,194,106, 53,192,106,209, 65, 22, 24, 13,169, 44, 28, 0, 37, 7, 96, 93,186,116,105,132,
-147, 60,172, 93,187,150, 77,160,228,246,158, 43, 42, 42,200,183,223,126, 75, 82, 83, 83,201, 63,255,249,207,173, 73, 73, 73, 24,
- 59,118, 44,235, 13,168,222,182,109, 27, 38, 79,158,156, 52,101,202,148,159,184,212, 89, 69, 69, 5,249,238,187,239,200,212, 23,
- 95,198,176,204,125,120,237,185,137,120,245,141,185, 48,154,117,184,120,161, 24,169,169,233,216, 50,110, 32,228,109, 91,248,220,
- 55,182,108,217,194,143,235,247, 16,174,211, 1,174,129,128,119, 53, 21,176,235,180,129,167,239,119,205,210,111, 96,174,222,213,
-218,231,106,253, 55, 36, 47,239,237,183, 73,222,219,183,220,249,174,223, 61,121, 34,252, 37,207, 25,172,203,255,235, 9,223, 82,
-190,184,255, 83, 83, 83, 29,150,125, 67,243,253,108,185,243,185,158,224, 41,126,192,155,233, 1,185, 92,174, 30, 55,110,156,194,
- 57, 57,141,187, 50, 95,208,169, 83, 39,140, 27, 55,174,158,171,223, 93, 89,131,191,239,220, 9,157, 3, 5, 8,166, 0, 11, 33,
-248, 67, 99,198,134,243, 38,124,127,168, 20,135, 47, 84,162,212, 0, 84, 24,109,184,160, 35,184,102, 34,208,153, 45,138,198,200,
-139, 93,154,103, 54,155, 97, 48, 24,208,178,101, 75,116,239,222,189, 78,209, 11, 71,255,254,253, 29,132,205,146,118, 67,132,205,
- 18,186,197, 98,129,217,108, 6, 69, 81,136,141,141, 69, 85, 85, 21,138,139,139, 81, 89, 89,137,152,152, 24,208, 52, 13,179,217,
- 12,147,201,228,248,141, 39, 68, 70, 70, 42,218,180,105,131, 83,167, 78, 97,231,206,157,216,190,125,187,106,251,246,237,123, 15,
- 28, 56, 0,129, 64,128,199, 31,127, 28, 29, 59,118, 52,128, 99, 34,155,200,200,200,164,168,240, 80, 84, 20,253,142,179,187,191,
-198,169,159, 86,225,143,159, 82,113,249,151, 45,144,208, 12, 43,175,196,147, 28,161, 80,168,142,138,138, 82,132,132,132,224,216,
-177, 99,184,122,245,170, 74,175,215,203,157, 21,129, 58, 79, 0,189, 97,195, 6,116,235,214,205,227,181,153, 77, 90,104,171,206,
- 67, 36, 10, 68,179,240, 46,170,192,160,214, 16,137, 2,229, 20, 69, 15, 96,207, 9,174,202,133,234,219, 87, 49,162,139,142, 85,
-154,111,195, 79, 63,253, 4,153, 76,134,110,221,186, 33, 38, 38, 6,117,211, 7, 86,141, 70,163,203,204,204,108, 22, 31, 31,159,
- 52,108,216,176,109, 92,219,110,118,246, 79, 8, 9, 9,194,144,161,143,233,227,251,244,196,132, 23,103, 67, 79, 89, 81, 94, 86,
-137, 57,175,188,143,101, 9,157,208,167,133,239, 74,242,150, 45, 91,200, 71, 31,125,196, 43, 1,247,137, 34,224, 14,247,205, 94,
- 0,247,122, 85,129, 47, 4,236, 45,250, 47,177, 43, 16,206, 68,205,150,221, 45,121,206, 86,248,243,155,159,195,243,155,159,171,
-247,217,185,140,171,197,238,236, 73,112,231, 81,104,106, 92,128,179, 39,192,245,157, 43,130,131,131,213,195,135, 15, 87,244,239,
-223,191,193, 50,231, 99,141,214,187,211,249,195,135, 15, 87, 4, 7,223, 90,150,231,174,172, 81,235, 80, 18,168,232,209,178, 57,
-158,136,144,160, 95,152, 24,173,164, 52, 36,132, 64,106,178,162, 93,144, 16, 26, 66,112, 82,103, 69, 97,173, 21,173, 91, 68, 32,
-166,223,208, 6,101,177, 86, 63,187,212,175, 93,187,118,232,213,171, 23, 52, 26, 13,170,170,170, 80, 85, 85,133,224,224, 96, 12,
- 24, 48, 0,102,179,217,145, 19,160, 33,194,102,149, 9,139,197, 2,138,162, 16, 23, 23, 7,131,193,128,242,242,114,148,149,149,
-161,188,188, 28,181,181,181,136,139,139,131, 80, 40,116,200,107, 40,175,128,171, 82, 22, 21, 21,165,136,141,141,197,197,139, 23,
-145,147,147,131,188,188, 60, 4, 4, 4, 96,216,176, 97,232,213,171,215, 79, 82,169,116, 1, 56, 78, 1,200,229,242,109, 81, 45,
- 34,103,198,182,108, 6,221,133,223, 80,152,243, 37, 74,242,182, 34, 76, 98, 67,226,240, 97,232,213,171,215, 44,169, 84,154,197,
- 69, 86, 72, 72, 8,250,244,233, 3, 66, 8, 14, 29, 58,132,252,252,124, 85, 73, 73,137,170,178,178, 82,190,120,241, 98, 5,155,
- 57, 49, 33, 33, 1,251,247,239,247, 40,143, 97, 44,106,173,230,188,162,178,252, 4, 36,210,112, 68,183,122, 92, 21, 25,221, 95,
- 21, 28, 18,243,211,191, 63,254,207, 56, 86,222,247,127, 11,192,198,159, 77,104, 72,233, 41, 44, 44, 68,243,230,205, 49,104,208,
- 32,166, 95,191,126,208,235,245,168,173,173,197,202,149, 43,131,186,116,233, 50,126,234,212,169,219,188,233, 19,103,207, 22,162,
-125,187, 54,152, 58, 53, 41,224,157,183,231,161,162, 70,139,155, 21, 55,145,242,234,251,120,127,194,112, 12,111, 23,213, 36,242,
- 95,177, 98, 5,186,119,239,142,207, 63,255,156, 87, 2,238, 34,126,255,253,247, 6,243, 0,220,166,240,222, 47, 4,239,205,170,
-130,201,147, 39, 83,254,202, 4,232, 9,174,137,120,252,161, 4,248,131,252,125,149,215, 80,170, 94, 87,203,220,155,148,189, 46,
- 74,130, 35, 41, 80, 83,238,203, 89,105,112,182,246,125, 89, 1,224,108,221,245,235,215,143,106,168,204,245, 88, 67,104,236,124,
-174, 50, 88, 60, 46, 31,166, 46, 18, 18, 88,243,178,113, 73, 11, 4, 81, 34,180, 15,162, 81, 98,163, 32,144, 8,177,191,204, 6,
- 35, 3, 68, 74, 4,136, 77, 24, 2,105,231, 4,117, 99, 10,128,197, 98,129, 64, 32, 64,135, 14, 29,208,167, 79, 31, 84, 87, 87,
-195,104, 52, 58,214,231,155,205,102,132,135,135, 99,208,160, 65,216,182,109,155, 99, 74,192, 29,108, 54,155, 35,170,191,107,215,
-174,168,115,211,195,104, 52, 58,250, 51,235, 73,232,218,181, 43, 42, 43, 43,161,211,233, 26,235,203,245, 14,204,156, 57, 83,173,
- 86,171,135,117,235,214,109,175, 83,226,158,170,193,131, 7,239,149, 74,165, 51, 0, 24,189,169,203,153, 51,103,110, 80,171,213,
-213,221,186,117,203,114,146,119,115,240,224,193, 43,165, 82,233, 55, 92,229,208, 52,173,110,213,170,149, 98,212,168, 81,184,120,
-241,162,234,204,153, 51,184,114,229, 10,130,131,131, 85,205,154, 53,195,136, 17, 35,240,191,255,253, 15, 9, 9, 9,156,175,205,
-106,213,171,171, 52,103, 21, 70, 99, 37,154,133,197,169,130,130,219, 34, 56,164, 29,106,107, 74,182,125,184,236, 75, 76,155,154,
-136,239,255, 22,224,182,158, 88,140, 30, 61, 26,217,217,217,184,122,245, 42, 93, 89, 89, 9,163,209,136,253,251,247, 11,235,148,
-206,106,111,251,195,152, 49,163,177,121,243, 54, 84, 87, 85,224,106,233, 53,252,237,165,231,204,175,191,185, 84, 60, 97,216, 64,
- 12, 50, 85, 3, 34,223,232, 97,203,150, 45,228,189,247,222,115,164,131,142,141,141,197, 71, 31,125,132, 55,222,120,131,140, 31,
- 63,254,193,207,220,249,128, 42, 5,247, 76, 1,184, 19,171, 10,252, 65,238, 44,110,222,252, 18,111,231,109,109, 52,219,158, 55,
-193,127, 55,111,126,137,188,183,111,201,115, 38,102, 87,151, 61, 23,210,190,249,229, 77,228,109,125,219,111,242,252, 9, 46, 30,
- 2,118, 15, 0,111,218,203,159,169,115,198, 12, 84, 40,142,155,172,170,242,189,123, 32,178, 26,112,188,134, 32,183,198, 10, 49,
- 69, 33,130, 16, 40, 90, 54, 67, 88,116,164,162,205, 99,114, 15,150,166,221, 3, 16, 19, 19,131,254,253,251,195, 96, 48,192, 98,
-177, 64, 44, 22, 59, 8,155,181,210, 35, 35, 35,241,196, 19, 79, 32, 39, 39,167, 81, 15,128, 80, 40, 68,175, 94,189, 64, 81, 20,
-244,122,189,195,187,192, 42,237,108,118, 65,134, 97,208,163, 71, 15,252,250,235,175,240, 38,184, 82, 46,151,171,112, 43, 78, 36,
- 8,246,108,123, 87,192, 49, 18,222,157, 39,192, 73, 86, 56,128, 74, 0, 94,231, 38,166,105, 90,221,172, 89, 51,244,232,209, 67,
- 33, 18,137,216,229,143, 42, 0, 40, 41, 41,193, 83, 79, 61,133, 79, 63,253,212, 43,153, 54,155, 73, 93,171, 43,145,155,205, 90,
-133,172,250,146, 42,164, 89, 44, 2,130, 90, 33, 32,168, 21,118,237,185, 1,106,120,227, 22,247,192,129, 3, 41,177, 88, 76, 42,
- 43, 43, 49,122,244,104,115, 68, 68,132,152, 97, 24, 92,185,114, 5,240, 33, 88,242,241,199, 7, 82, 18,137,132,132,156,206,199,
- 75, 47,253, 5,109,226, 58,139, 63,154,247, 23,102,221, 23,223,208, 43, 5, 70,159,218,242,150, 45, 91,200,162, 69,139,208,172,
- 89, 51,148,150,150, 66, 38,147,129, 97, 24, 4, 6, 6, 98,201,146, 37,120,251,237,183,121, 37,224, 14, 35, 62, 62,190, 65, 47,
- 0,167,101,128,119, 2,247,243,170,130,198, 8,199, 23,235,191, 33,121,174,150, 58,235,186,247, 68,218,254,150,231,236, 9,240,
-245,120, 99, 94, 5,215,205,127,188,149,247,103, 3, 77,211,234,248,225,163,168,202, 90,131, 60,212,106, 82, 9, 46, 23,161,147,
-229, 26,130, 35,162, 48,176, 71, 23, 68,180,110,174, 8,141, 31,234,177,127, 16, 66,208,161, 67, 7, 12, 26, 52,200, 49, 31, 47,
- 16, 8, 96, 50,153, 28,169,123,157,167, 9,218,182,109,139, 39,158,120, 2,106,181,123,209, 50,153, 12,241,241,241, 16, 10,133,
- 48,155,205,142,223, 57, 47, 29,116,222, 8,136,166,105,244,238,221, 27,249,249,249,190, 84, 3, 1, 80, 83,247,242, 7,116,190,
- 16,191, 59,175, 81,247,238,221,217, 56, 10,138, 97, 24,185, 94,175,135,201,100, 66,151, 46, 93,176,124,249,114, 47, 55,199, 33,
-106,139,185, 6, 22,179, 78, 97, 48,148, 67, 34, 9,131, 72, 28,172,162,105, 33,214,111,248, 73, 49,115,198,152, 70,229,213,229,
-245,167, 62,249,228, 19,198, 96, 48, 0, 0,226,226,226,188, 74,191,236,140, 62,125,250, 82,130,126,253,158,154,253,222, 39,217,
-118,121,132,142,139,123, 4,113,227,199,207, 20, 10,133, 27,124,145,185,108,217, 50,190, 83,223, 39, 74, 64, 99,228,127, 87, 21,
-128, 7, 21,254, 92,246,231, 74,204, 77,181,214,253, 37,175, 41, 22,183, 51,177,179,159, 93, 92,246,124, 35,226,136, 97, 73,227,
-213,117,214, 43,134,248,240,251,228,228,100,132,133,133, 57, 34,252, 25,134,113,184,240, 89, 15, 0, 27,244,199,238, 8, 24, 27,
- 27, 11,138,162,176,113,227,198,219,228,173, 88,177, 2, 25, 25, 25,142,115,109, 54,155,199,237,128,197, 98, 49, 18, 18, 18,192,
- 37, 58,254, 65, 85,214,130,130,130, 16, 20, 20,132,136,136,136, 38,244, 29, 86, 17,168, 1, 77, 11, 97, 15,199, 98, 84, 28,229,
-145,133, 11, 23, 82,117,207,147,208, 52,221,164,113,196,102, 99,118,204,159, 63,159, 2, 64, 51, 12, 99,163,105, 90, 6, 47,167,
- 95, 88,240,214,253,253,165, 4,120, 2, 21, 31, 31,207, 7,103,240,224,193,131, 7, 15, 30,127, 50,208,124, 21,240,224,193,131,
- 7, 15, 30,188, 2,192,131, 7, 15, 30, 60,120,240,224, 21, 0, 30, 60,120,240,224,193,131, 7,175, 0,240,224,193,131, 7, 15,
- 30, 60, 30, 10,212, 91, 5, 48,119,238, 92,159, 35, 56, 87,173, 90,117, 91, 48, 33, 47,143,151,199,203,123,248,228, 41,149, 74,
-242,244,120, 37,182,110, 73, 69,106,106, 42, 13, 55,107,208,249,250,227,229, 45, 89,178,196,113,206,219,111,191, 77,121, 43,175,
-160,160,192,231,235,235,221,187,247,159, 94,158,215, 10, 0,219,185, 27, 58,217,151, 37, 47, 15,178, 60, 95,100,222,239,247,235,
- 6, 98, 0, 33, 0, 2,234,218, 3, 3,224, 38,252,176,134,218,159, 96,235,193, 31,247,236,174, 78,239, 85,242,161,154,154, 26,
-249,161, 67,135, 84,251,246,237, 3, 0, 12, 29, 58, 20, 3, 7, 14,228,156, 74,248, 94, 60,135,167,199, 43, 49,250,169, 62, 86,
- 64, 41, 84, 42,149,204,159, 45,113, 19, 15,207, 88,178,100, 9, 25, 55, 46,182,222,119, 79, 74, 0,143,123,236, 1, 96, 65,210,
-111,223, 0,130,154,226,251,190,233,238, 6,136,166,236,254,231,111,121,238,238,183, 41,247,124,191,223, 47, 75,252,167,142, 31,
-248,250,212,169, 99,195,163, 91,199, 70,105,181, 22,132,134,138,112,189,228, 2,211,173, 91,175,202,110, 61, 7,247, 7,112,209,
- 27,129, 71,127,249,130, 20, 93, 40,196,133, 75, 70, 20, 95, 35,104,219,146, 66,108,140, 20, 29, 99,227,208,231,241, 23,239,139,
-206,239, 78,145, 96,247, 26,184, 23, 68,118,226,196, 9, 85,124,252, 78,172, 94,173,135, 90, 13,188,251,238, 46, 20, 23, 23,171,
-162,163,163, 33,149, 74, 81, 90, 90,170,152, 48, 97, 2,252,161, 16, 28, 56,112,128,104,181, 90,197,136, 17, 35, 32,145, 72,124,
-145, 71, 3,192,232,167,250, 48, 41, 41, 41, 66, 96, 13,182,110,177,119, 21,248,119,219, 94, 30, 15, 1,204,230, 69,200,201, 73,
-193,168, 81,107, 48,110,220, 50,135, 71,128, 87, 4,238, 14,248, 68, 64, 94,192,153,236, 41, 10, 96,126, 8,123,104,239,213, 98,
-174,125, 54,103,231, 15,139, 59,117,234,220,101,226,248,161,104,219, 58, 4,205, 66, 37,208, 84, 25, 81,114,173, 45,125,174, 72,
-211,124,123,214, 87,170, 81, 79, 62,243,137, 72, 28,248,185, 39,121,167, 79,236,147, 95, 44,220,174, 18,160, 26,207,140, 1,158,
-232, 11,196,182, 7,206, 95, 34, 56,120,196,128,108,213, 49,252,244,227,235,164, 67,220, 88,197,163, 61, 60,103,180,187, 83,222,
-142,134,188, 8,169,169,169,212,189, 82, 2, 42, 43, 43,241,234,171,122, 68, 70, 2,201,201,192,135, 31,234, 80, 80, 80, 0,171,
-213, 10,169, 84,138, 22, 45, 90,168,182,111,223,142,206,157, 59, 43, 18, 18, 18,212, 94, 14, 0,242,147, 39, 79, 34, 42, 42, 74,
- 53, 98,196, 8,106,253,250,245, 0,160,202,205,205,197,244,233,211,209,191,127,127,111,239, 85, 12, 0,217, 59,142,210,192, 26,
-198,254,110,215,161,249, 17,132,135,179,181, 15, 0,147, 38,253,136,156, 28,251,123, 74,202, 5,176, 30, 1,222, 27,112,119,137,
-223,185,252,158,165, 2,190,223, 65,210,195, 28, 74,192,195, 76,254, 0,132,187,115,210,223, 81, 12,233, 19,215,175,119, 75, 80,
-148, 61,171, 27,195, 16,132, 4, 73, 16, 24, 43, 70, 76,219, 80,180,142, 14,106,191, 59, 39,253,157,209,227,158,207, 0,112,189,
- 49,129, 23, 11,183,171, 6,247,173,198,188,231, 1,129,192,174, 64, 89,172, 64, 96, 0,208,181, 19, 48, 32, 30,216,174,170,198,
-175,199,182,171, 30,237, 49,212,167,142,239,175, 41,128,134,126,207, 42, 1,119,251, 97,132,135,135, 99,251,118, 25,218,182, 53,
- 64,173, 6, 52, 26, 33, 58,117,234,132, 78,157, 58, 65,167,211,161,168,168, 8,106,181, 26,213,213,213,170, 71, 30,121,132,243,
-212,192,166, 77,155,228, 6,131, 65, 37, 22,139,161,209,212,247,100, 25, 12, 6,124,249,229,151, 40, 42, 42, 34, 83,167, 78,245,
-166, 62, 25, 0,216,186, 37, 21,128,146,182,191,251,142,195,135, 15, 59,234,155,221, 68,201, 93, 25,151,118,225,252,108,185,150,
-121, 52, 10, 8,145,227,236, 89,244,215,233, 84, 17, 37, 37,184,218,162, 5,142,134,132, 40, 68,143, 62, 10, 66, 81,106, 95,239,
-217,219, 13,163,184,200,224, 90,118,167,229, 57,187,254, 83, 82,114, 48,110, 92,172,227,157,197,184,113,177,188, 18,112, 23,224,
- 74,246,236,254, 0,206,229,252, 42, 0,215, 78,255,144,223,223,169,227, 7, 62,236,212,169, 83, 92,255, 62, 45,235,149,211, 52,
- 5,177, 88, 0,153, 84, 8,145,136, 70,108,135, 48,196,198,118,106,113,234,248,129,237,141, 41,138, 71,127,249,130, 8, 80,141,
-249,179, 1,163, 9,184, 88, 12,104,180, 64, 85, 53,144,150, 5,188,242, 30,176,248, 99, 96, 96, 31,128, 38,213, 56,250,203, 23,
-188,181,232,132, 30, 61,122, 40,182,110,237,138, 22, 45,128,233,211,133,136,142,238,135,161, 67,135, 42,198,141, 27, 71,141, 29,
- 59, 86, 49,106,212, 40, 68, 69, 69,225,232,209,163,248,225,135, 31, 84,187,118,237,146,155, 76, 38,121, 99, 50,215,175, 95, 47,
- 55,153, 76, 42,145, 72,212,232,127,171, 84, 42,164,167,167,203,185,144,236,254,253,251, 9, 0,115,106,106,170,248,150, 18,112,
-139, 76,247,239,223, 79,188, 85,160,242,242,242, 28,175,198,202,124, 81,234,184,150, 53, 70,254, 29,207,156, 81, 77,248,253,119,
- 85,219,194,243, 16, 87, 87,163,101,225, 25,200,127,253, 69, 21,121,236,152, 10,132,200,125,121,222,121,121,121, 56,124,248, 48,
- 57,121,242,164,220,215, 54,195,202,224, 82,198, 85,158, 43,209,115, 41,243, 4,150,244,217,119,243,184, 78,124,135,191, 75,196,
-207, 37, 13,240, 3,235, 1,184,147,150, 26,185,131,215,231, 47, 23, 51, 43,191,161,255,105,236, 63, 78,157, 62,246,212,148,137,
- 10, 7,233,187,131, 84, 34, 68,149,214,132,255,223,222,181,199, 53,113,166,235,103,146, 16, 2,130, 32,226, 13, 47, 85, 64, 91,
-196, 42,104, 85,212, 21,137, 69,173, 8,106,181,209,158,109,247,172,181, 93, 98,183,199, 95,247, 20, 43,110,217,238,177, 61,181,
- 21, 79,109,187,235,233,110, 73,247,168,237, 46,187,219, 70, 43,138, 90,217,166, 6,109,171,182,138,183,122,169,114,241, 86, 65,
-169,200,157,132,100, 50,223,249, 35, 12, 14, 33,151,153,201, 32,216,206,243,251,241, 35,249, 50,121, 51,215,239,121,222,247,251,
-222,247, 27, 21, 19, 1,227, 14,115, 76,252,216,233, 97,158,236, 85,148, 95,196,210,121,206,215,251, 14, 2,239,254, 21,152, 61,
- 29, 72, 75, 1,190, 43, 3, 78,156, 37, 8,210, 80, 72,140, 7,230,204, 0, 62, 41,186,136,241, 83,164,243,220,197,156,187, 46,
-154, 83, 33, 10,161,161,161,197, 77, 77,206,249,150, 63,255,249,207, 49,109,218, 52,138,251,217,237,219,183,181,113,113, 42,243,
-252,249, 0, 69, 29, 67,117,117,139,249,251,239, 99,188,133,255, 82, 40,138, 50,243, 93, 28,166,186,186,218,236, 75,247, 62,241,
-196, 19,200,207,207, 71,126,126, 62,121,226,137, 39, 58, 92,139,131, 7, 15,146,252,252,252,246,237,122, 74,127,192,183,205, 19,
- 90,207,156,193,136,146, 18,216, 20, 10, 4, 80, 0,205, 16, 48,118, 7, 24,154, 70,191, 47, 14,162,140, 16,244, 78, 76, 20, 77,
-224,193,193,193,230, 99,199,142,105,151, 45, 91, 86, 44,214, 6,128, 14, 30,185,187, 54, 49,209, 5,127,201,223, 19,209, 23,185,
- 68, 2,100,116, 63,220, 10, 0, 79,147,223,196, 16,142, 47, 66, 20,106,239,110,143,209,138,153, 49,238,109, 82,161, 24,123,238,
-190, 35,114,226,162,106, 96, 84,204,232,168,129, 33, 32, 4,248,226,240, 53,180, 88,156,171,174,142, 31, 55, 16,253,250, 6,225,
-218,245, 70,166,236, 82,173, 66,165, 82, 96,100,116, 31, 68, 69,197,134,195,185, 68,171, 91,148, 95,182, 98,218, 4,160,213, 14,
-124,122, 0, 48, 31, 38,136, 26, 64, 33,122, 24,240,240,207,128, 7, 98, 40,168,148,206,165,197,147, 18,128,255,201,179,242, 58,
-223,220,144, 60,159,215,124, 20, 47,119,172,159,123,222,165,204, 48, 16,131,182,229, 92, 49,118,236, 88,173,235,103, 74,165,210,
- 60,122,116, 53, 94,122,201, 41, 79, 95,127,253, 34, 46, 95,142,247,104,203,106,181,250,244,252,185,184,124,249,178,207,109,146,
-147,147,169,228,228,228,118,178,207,207,207, 39,174, 2, 33, 57, 57,185, 91,206, 93, 87,120,255, 0, 48,242, 86,141,217,102,183,
- 67,161, 80,128, 40,149, 96, 24, 6,118,134, 1,227,112,192,225, 96, 48,164,170,202,220,144,152, 40,250,152, 91, 90, 90, 0,192,
-124,244,232, 81, 80, 20, 37,120,126, 71, 87,136, 0,169, 60,255,162,204, 34,204, 49,204,193,226,237, 64,102,145,243,117, 81,102,
- 81,187, 56, 80, 23,150,201,204,123, 23,193,157, 19,192,107, 14,128,167, 44, 0,177,217, 1,158, 60, 46, 49,158,152, 55,209, 32,
- 86,160,120, 59,110,215,239,242,245, 34, 60, 77, 42, 20, 99,207,219,119,216,223,161, 0, 48, 31,251,156,187,192, 56,103,251, 7,
- 2, 0,174, 85, 54,192, 98,161, 1, 0,177,209,125,208,175,111, 16, 78,157,173, 86, 92, 40,189, 13,141, 70,137,152, 17,225,168,
-173,183, 1,128, 71,195,215,170, 8, 98,238,115,254,254, 35,201, 64,194,104, 10,129,106,128,166,157,145,128,240, 80,160,226, 42,
- 48, 39, 25,184,111,136,115,251,238, 4,151,244,197,140, 11,247,116, 84, 87, 87,119, 89, 20,165,141,228,219, 61,254,238, 38,127,
- 46,114,115,115, 73,118,118, 54, 37,246,115, 87, 4,148,151,161,213,110, 3,165, 84,193, 65, 8, 40, 0,180,131,129,157,102, 64,
- 28, 14, 80,165, 23, 0,164,249,189,223,103,206,156, 65,100,100,164,185,190,190, 94, 27, 22, 22, 38, 90, 4,248,106,187, 91,228,
-159,147,147, 67,173, 91,183,142, 44,222,222, 81, 16, 0,192, 28,195, 28,168, 11,203, 80, 88, 88,222,158, 9,192, 78, 24,140,136,
-136,144,153,250, 46,147,191, 71, 1,208,211,225,141, 16,197, 16,172, 63, 41,142, 94,237,118,113, 54, 1,181,164, 86,232,111, 80,
- 97, 97, 1,168,173,179, 34, 50, 34, 24,186,249, 15,128,118, 48, 8, 12, 84, 66,169, 80,128, 16,130,244,217, 49,152, 55, 43, 6,
- 20, 5,212,212, 90, 16, 22, 22, 0, 0,183, 61, 25, 28, 58,136, 66,249, 21,130, 7, 98,128,153, 83,156,189,206,119,101,192,216,
- 7,128, 62,189,129,185, 41, 0,195, 0, 42, 37,112,241,146,115,123,190,215, 86,200,107,119,133, 68,132, 70,122,186, 67, 4, 48,
- 12,147, 50,120,240, 96,148,151,151,227,224,193,131,230,233,211,167,107, 67, 66, 66,160, 80, 40,138, 1,192,225,112,104,207,157,
-235,111,126,229,149,235,160, 40, 10,213,213,163, 48,106,212,112, 92,188,120,209,147, 61,183,237, 31,127,252,113,231, 40, 18, 33,
- 88,186,116,169,160, 99,230,138,128,158, 68,254, 82,136, 4, 46,110, 15, 25, 12,245,119, 23, 64, 2, 0, 53, 67,156, 19, 91, 29,
- 52,108,196,129, 22,154,134, 37,246, 1, 73,246,125,204,152, 49,160, 40, 74, 20,249, 3,192,164, 73,147, 48,113,226, 68,234,155,
-111,190, 33,222,218,124,161, 45, 98,208,129,240,221,181, 9, 65,102,209, 29,226, 7,208,201,243,103, 39, 12, 22, 22,150,203, 76,
-221, 13,228,127,207, 10,128,174, 22, 20, 82, 17, 2, 33,128, 98,105,109,151,137, 0, 54,115, 65,177,164,150,143,247, 15, 0,170,
- 27,215,203,111, 93,187, 62, 36, 50, 50, 34, 24,111,253,249, 40,146,167, 14,197,248,177, 3, 64, 5, 80,237, 25, 1,109, 75,199,
-227,218,245, 70,220,184, 94,126, 9,128, 71,183, 50,102,184, 6, 95,149, 88,240, 64, 12, 16, 57, 1, 88,243, 44,240,252, 50, 32,
- 44,212, 25,246,127,229,143,192,218,231,157,219,126, 85,226,220, 94, 44, 65, 75,229,169,247,164, 90, 0,231,206,157,131, 70,227,
- 60, 39,123,246,236,193,213,171, 87,205,247,223,127,191,118,230,204,153,104,108,108, 76,137,136,136, 48,127,249, 37,141,226, 98,
- 96,226,196,135, 48,108,216, 48,237,144, 33, 67, 0,192,236,206, 94,175, 94,189, 96,179,217,120,253, 54, 77,211,247,252,179,203,
- 37,127, 62, 66,128,175, 8, 40,239,215, 95, 27,120,250,180,153, 33, 4,189, 20, 42, 40,149, 20,104,226, 64,139,221,142, 70,155,
- 13,149, 81, 81,218, 72, 63,246, 59, 56, 56, 24, 20, 69,105, 39, 78,156, 88, 44,214, 6, 75,244,190,218,238,182, 8,200,201,201,
-161, 50,219, 60,123, 87,242,231,122,255, 50,186,151,252,101, 1,112, 55, 60,188, 46, 78, 41,108, 23, 1,252,132, 6, 29, 31, 63,
-174,178,236, 82,109,228,184,248,254, 88,243,124, 18,182,254,227, 91, 4,105, 84, 72, 24,211, 31, 20, 69,113, 60, 73,130,178, 75,
-181,136,143, 31,119, 6, 64,163, 39,131,209, 49,163,176,103,255, 41, 44, 91, 12,144, 10, 32,105, 17, 16, 61, 20,200,223,201,217,
-232,121,192,225, 0,246,236,119,110,223, 93,240, 22, 41,234,174, 52,192,219,183,111,155,227,226, 46, 97,203, 22, 0,112,224,213,
- 87, 79,227,196,137, 22,115, 75, 75, 11, 26, 27, 27, 81, 81, 81,129,155, 55,111, 98,252,248,241, 88,186,116,169,207, 52, 64, 66,
-136,150, 97, 24,179, 66,225, 59,193,135, 21, 30, 66,193, 14, 1,228,231,231, 35, 57, 57,185, 91,159,175,236,236,108,138, 37,126,
- 95, 67, 0,190,182,225,162, 79, 98, 34,106,108, 54, 56,204,197,176,169, 3, 16, 66, 84,176, 50, 12,234,109, 54, 52,206,124, 24,
-145, 19, 38,136,140, 10, 82,152, 56,113,162,232,113,127,174, 13, 46,209,187,107,243, 71, 4, 28, 61,122,212,107, 27, 31,184, 35,
-127,214,243, 7, 32, 79, 8,236,102,242,151, 5,192, 61,142,246,241,127,254,195, 0,142,248,177,211,103,238,222,181,249,203,175,
- 75, 66, 31,152, 60, 33, 10,115, 83,163,177,239,243, 10,236,249,151,243,225,252, 93,214, 84, 48, 12,193,215, 37,149, 40, 47, 47,
-187,146, 62,127,249,127, 0,176,123, 50, 56,126,202,175,169, 61,219, 95, 36,111,111,118,166, 2,190,247,154, 51,245, 47,117,154,
- 51, 21,240,237,151,157,228,255,246,102,192,129,222,162, 43, 2,250,235,153,251,138, 32,116, 87, 22, 64,115,115, 51, 18, 19,173,
-152, 56,209,249,254,161,135, 8,246,237,171,192,197,139, 23,217, 66, 64, 72, 73, 73,193,200,145, 35,121,213, 0,152, 61,123,118,
-113, 65, 65,129,207, 40, 0, 77,211, 8, 15, 15,215, 10,221,223,182,116,192,246,204,128,131, 7, 15, 18,177,195, 0,147, 38, 77,
-226,213, 38, 68, 4,248,218,142,183, 81,133,162,216, 54,121,178,246,124, 64, 0,134, 86, 85,153, 67,174, 94,133,117,196, 8, 92,
-238,223, 95, 27, 49,126, 60,208, 54, 68, 35,130, 96,165, 32,233, 78, 54,220,181,241, 61,151,174,219,177,132,239,171, 77, 12, 92,
- 73,159,141, 8,248, 59,132, 39,163, 51,248, 76,140,150, 5, 64, 23,122,230, 61,244, 55,106,230, 60,178,244,157,162,125, 31,189,
-248,125, 85, 99, 76,236,136, 62,152, 55, 59, 6,237, 98,190, 3, 0, 0, 32, 0, 73, 68, 65, 84,125,194, 53,168,173,179,226,196,
-183, 55, 81,118,169, 22,229,229,101,135,230, 60,178,244, 19, 0,215,124, 25, 28, 49, 42, 93,251, 69,201,110,243,161,146, 6,204,
-155, 9,188,255,134,179, 18, 96,249, 21,224,255, 62,118,122,254, 14,244,198,136, 81,233, 90,177,199,234,207, 16, 0, 95,242,239,
-142, 57, 0, 85, 85, 85,218, 62,125, 34,205,199,142,253, 0, 0,184,120,177, 55, 38, 78, 28,141,190,125,251, 66,163,209,160,170,
-170, 74,155,158,158, 46,168, 20,240,240,225,195,181, 23, 46, 92, 48,115, 35, 58,174,228, 31, 27, 27,139, 73,147, 38, 9, 34, 49,
- 54, 11,128, 51,246,207, 78, 8, 20, 37, 2,220, 17,161, 88,114,244, 69,238,130,200,159, 35, 2,250, 62,244, 16, 90, 0,170,165,
-173,201,223,169,106,254,146,191,144,243,198,247,183,164,182,199,151,252,109, 25,177,128, 60,254,127, 87, 34, 1,158,132,129,160,
- 52, 64,177,147,229,132,166, 1,138,181, 39,214,166,212,251,231,237, 60, 73,181,127,254, 76, 92, 12, 80,247,202, 75,159,191,252,
-159,103, 79,127,241,167, 29, 59, 15, 68, 15, 28, 28,147,196, 89, 11,224, 72,124,252,184,111,210,231, 47,127, 9, 64, 51, 31,123,
-163, 31,156, 81, 60,250,193, 25,212,241,195,127, 34, 31,237,185,136,215,223,237,121,107, 1,244, 68,242, 7,128,199, 31,127, 28,
-167, 78,157,194, 83, 79, 29,107,139, 0, 60,132, 37, 75,198,105,131,131,131,139,197,218, 76, 72, 72, 40, 78, 72, 72,160,118,237,
-218,149,210,216,216,104, 86, 42,149, 80, 40, 20,160,105, 26,106,181, 26, 33, 33, 33, 90, 9,200, 95, 18, 17, 32,227,199,137,156,
-156, 28,106, 93,230, 58, 18,181, 50, 74,139,225,238,183,169,204, 44, 50,203,243, 1,186, 23, 42,190, 29,165,212, 29,111, 87,216,
- 19,243, 91,247,242,241,250,137,250,248,177,211,159,140, 31, 59,157,173, 24, 19, 2, 32, 18, 64, 21, 0, 11,218,202,190, 10,193,
-248, 41,191,166,196, 20,249,233,234,243,208,147,234, 74,184, 34, 56, 56,184,120,202,148, 41,212,148, 41,210,159,184,249,243,231,
- 23, 67,162,226,150,236,184,191, 43,201, 39, 39, 39, 83,249,249,249,164, 39,204, 7,144,209,243, 68,128,247, 13, 32,147,127, 23,
-128,111, 21, 64, 0,160, 18, 18, 18,228,177, 23, 25, 50,100,200,144, 33,227, 39, 6,121, 45, 0, 25, 50,100,200,144, 33, 67, 22,
- 0, 50,100,200,144, 33, 67,134, 12, 89, 0,200,144, 33, 67,134, 12, 25, 50,100, 1, 32, 67,134, 12, 25, 50,100,200,248,113,160,
- 67, 22,192,179,207, 62, 43,122, 86,166,187, 66, 14,178,189,174,177,199,103, 17,155,238,180,103, 50,153, 82, 0,152,141, 70,163,
- 36,246,246,239,223,159,194, 48,140,100,246,228,251,175,219,236, 45, 5,240,113, 23,239, 95, 0, 0, 13,156, 69,107,172,112,102,
-179, 16,184, 20,177,145,175, 71,207,183,119,226,196, 9,209,246, 18, 19, 19,127,242,246, 4, 11, 0, 95,228,224, 9, 66, 82,169,
-164,182,119, 55,145,169,171, 39, 80,171, 97,200, 15,226,181,127, 38,147, 41,197,104, 52,154,165, 58, 94,174,189,141, 27, 55,106,
-179,178,178,204, 98,150, 23,118,103,239,204,187,189, 49,230,185, 6,248, 99,143,197,194,137,123,205,167, 46, 56, 0, 0, 6,131,
-129,100,102,102,250,117, 61, 71, 13,248, 8, 22, 58, 2, 65, 65, 65, 48, 26,141, 68,167,211,117,219,253, 33,166,142,131,183,243,
-215,211,237,249,250, 29,129,223, 61,220, 85,215,133,162,168, 52,133, 66, 49, 90,161, 80,164, 80, 20, 53, 10, 64,176,205,102, 43,
- 82, 42,149,225, 12,195, 84, 19, 66, 94, 6, 80, 3, 9,170,217,201,144,241,163,140, 0,184,123,200, 9, 33,222, 30, 58,193, 29,
-134, 84,246,132,122,176, 82,226,179,207, 62,243,217,137,176,228,154,157,157,141,254,253,251,187,173,128,151,149,149,101,230,251,
-155,172, 61,150,248,143, 28, 57,210, 46, 4,252,177,199,156,251, 61, 20,163, 95,197,135,251,157,165, 99,153,115,191,111,223, 70,
- 49,250, 85, 65,231,165,119,195, 11,132, 33,192, 63,247, 57,109,205,157, 17,128,248,216,179, 48, 24, 12, 4, 0,132, 10,129,122,
-250,159, 41,117,151,107, 96,161,102,152,155, 91,123, 97,238,156, 58, 12, 30, 72,225,216,177, 67,164,161,193,138,153, 51,103,246,
-152, 53,232,123,146,128,246,246,140, 73,245,204,137,132,141,123,255,109,219,182,205,188,104,209, 34,237,236,217,179,139,253, 49,
-170, 84, 42,231,170, 84,170,100,149, 74,245,184, 82,169,236,163, 80, 40, 66,114,115,115, 21, 47,190,248,226,114,135,195, 1,218,
-137,199, 29, 14, 71, 6,128,175,218, 68,128,173,173,255,235,242, 97,208, 61,123,246, 16,190,231, 62, 45, 45, 77,208, 5,217,187,
-119, 47,241,231,251, 50,126,252, 96, 43, 2, 10, 90, 14,152, 15,249, 79,152, 48, 1, 37, 37, 37,130, 58, 44,111, 29, 14, 31,123,
-238,236,103,103,103,163,162,162, 2, 70,163, 81,210,101, 93, 51, 51, 12, 4, 65,163, 96,248, 56,133, 2, 0,131, 49,140, 18, 66,
-254, 27, 55,110,212, 86, 87, 87,155, 61,145,127,118,118, 54,114,115,115, 5,145, 63, 0,232,116, 58, 36, 37, 37,105,147,146,146,
-252,178,199,146, 61,251,127,253,127,163, 3,249,175, 94,172,193,134,237, 86, 94,231, 42,204,146, 69,198,140, 82,162,217, 66,240,
-194, 47, 52, 56,114,150,134,165,153,160,197, 6,104, 19,206,226,236, 69,135,160,104, 64,197,181,183, 73,221,141, 94, 8,237,173,
-198,192, 65, 33,232, 55, 32, 22, 87,202,109, 24, 62,218,142, 0, 77, 53, 76, 59,110, 97,199,142, 29,228,209, 71, 31,149, 59,188,
-123, 7,237,203, 15, 26,141, 70,115, 70, 70, 6,182,111,223,110,158, 61,123,118,167,107, 56,126,252,120,242,202, 43,175, 32, 35,
- 35,195,235,245, 85,169, 84, 51,213,106,245, 24,181, 90,189, 82,173, 86, 7, 95,187,118, 13, 35, 71,142,132, 82,169, 68,104,104,
- 40,202,202,202, 16, 18, 18,162, 58,122,244,104,248,225,195,135,191,120,238,185,231,134, 3,184, 2, 64, 13, 15,197,174, 50, 51,
- 51, 59, 57, 43,220,126,139,109,167, 40, 10, 6,131,193,231,253,183,107,215, 46,143, 54,184,237,132, 16,164,165,165, 9, 58,161,
- 59,119,238,244,235,251, 93, 76, 60, 41, 9, 9, 9,197,242,109,223,125,164, 47, 42, 2,192,151,252,249, 34, 59, 59,219,231, 54,
-124,136,203, 19,249,175, 95,191, 30,107,214,172,233,208, 46, 86, 4,100, 78, 48, 16,244, 29, 5,195,191, 82, 40,174,199, 63,107,
-214, 44, 10, 0,216,255,101,101,101,132, 15, 89,123, 35,255,182,200,128, 79,175,157, 13,211,115, 61,124,215,161, 5, 49,246,188,
-121,248,171, 23,243, 95, 41, 46,210,242, 2, 25,121,159, 18, 65,129, 20,238,139, 82,226, 86, 45, 3, 59,173, 68, 77, 29, 65,125,
- 19, 65,217,247, 12,160, 0, 34,131, 79,195,100, 50,165,164,166,166,122,237, 20,174, 92,125, 43, 37, 46, 54, 6,135,111,220,196,
-136, 97,253, 48,102,108, 52,148,129, 17,184,111, 68, 45,106, 45, 86, 84,223,112,224,251,155, 86, 4,171, 42, 96, 50,133,250,180,
-215,213,240,228,149,139,189, 7,165,178,231, 73,108, 11,137, 16, 72, 12,134,125, 70, 40,138,130, 70,163,209, 2, 48,187,222, 19,
- 19, 38, 76,224, 69,254, 0, 16, 16, 16, 16,174,209,104,150,221,186,117, 43,120,212,168, 81, 72, 76, 76,132, 74,165,194, 31,255,
-248, 71, 56, 28, 14, 60,248,224,131,248,228,147, 79,112,244,232, 81,156, 62,125, 26, 74,165,242, 79, 14,135, 99,129, 55,155, 11,
- 22, 44,104, 63,127,190,250, 65, 62,132,155,151,151,167, 29, 56,112,160,153, 16,226,213, 1,186,113,227,134,224,181, 50, 88,219,
- 98,191,207, 18,245,249,243,231,189,246, 27,113,113,113, 90,161,100,126,254,252,121,115,125,125, 61,194,194,194,180,178, 16,232,
-153, 80,121,234,124,124,121,234, 61, 5, 21, 21, 21, 88,179,102,141, 40, 1,225, 13, 78, 79, 63,147,250,236,179,207,136,209, 48,
- 9, 80, 91, 8,159,177,127,119,100,237, 74,202,222,134, 5, 60,129, 43, 40,142, 28, 57, 98, 78, 74, 74,234, 16,250, 23,106,239,
-239, 47,134,120,236,220,158,120,179,153,183, 29,134, 97, 82, 2,131, 41, 40, 20, 64,112, 16, 80,215,192,160,149, 16,244, 10,162,
- 96,101, 0, 75, 43,193,144,126, 10, 48, 52, 80,122,205,129,138,138, 10, 51,188,148,167, 61,119,118, 91,202,152, 49, 15,152,213,
-106,130, 95, 45,155, 12,135,131,224, 70,181, 13, 87,175,215, 1, 1,215, 16,212,167, 21, 85,213,151,161, 80,215,227,220,185, 58,
-132,245,241,110,239,110,193,149,156,245,122, 61,241,103,133, 65,215,133,158,168, 37,181,162,198,247,111,223, 78,237,240, 62, 34,
-194,228,147,216,132,136, 18,215,118, 31, 34,197,193, 62, 35,233,233,233, 72, 77, 77, 45, 54, 26,141,176, 88, 44,237,215,144,245,
-252,211,211,211,121, 93,211,192,192,192,169,205,205,205, 15,196,197,197, 65,171,213, 34, 43, 43, 11, 79, 63,253, 52, 0,192,110,
-183, 99,235,214,173, 40, 41, 41,193,241,227,199,241,209, 71, 31,193, 98,177,196, 50, 12, 51,215,155,205,121,243,230, 73,122, 63,
-237,217,179,135,215,208, 28, 69, 81,102,161, 33,124,174,109, 49,223, 7,156,107, 71,212,215,215,163,178,178,210,237,231, 81, 81,
- 81, 16, 75,224,149,149,149,168,172,172,148,133,192, 93, 6, 55,220,239, 45, 26,160, 18,234,177, 75, 77,180,254,194,104, 52,250,
-245,253, 76,131,158, 96, 16, 96,200,112,118, 92,134,146,204, 14, 97,126,167,199, 95, 79, 92, 35, 1,124,201,186,186,186,186, 3,
- 57,139, 33,107,190, 96, 69,135, 94,175, 39,190,234, 65,243, 33, 0, 54,252,239,201, 30, 33,132,220, 58,247, 2, 6,181,133,254,
- 89, 88, 28, 4, 86, 27, 96,111,107,179,211, 4, 68,225,124,253,237,233, 18, 54, 75,192, 45, 66, 67,235,205,205, 22, 5, 34, 35,
-194, 81,119,187, 5,117,245,117, 56,114,236, 6,174,223, 36, 80,247,106,193,224,216, 38, 88, 90,110, 97,228, 88, 59,134,199,181,
-226,163,247, 75,176,111,223,190, 20,249,145,191, 55,192,122,255, 20, 69,161,176,176,144,164,167,167, 99,247,238,221, 8, 10, 10,
- 74,201,206,206, 54, 11, 33,127, 0,129,117,117,117,191,180,219,237,138,224,224, 96, 36, 39, 39,227,205, 55,223, 68, 64, 64, 0,
-244,122, 61, 62,248,224, 3,148,148,148,224,200,145, 35,248,252,243,207,241,237,183,223, 34, 50, 50, 50,146,166,233,251,224, 99,
-173,139,204,204, 76,226,107, 8,224,253,247,223,231,181,159, 93, 57, 4,176,107,215, 46, 73,134, 0,194,194,194,180,149,149,149,
-102, 79,159,249,123,221,101, 33,112,143, 68, 0,238, 37,228,229,229, 81, 82,204, 90,103,201,221,184,230, 18,160, 84, 35,115,246,
-112, 32,124, 56, 12,109, 9, 75,124,199,254,165, 6,247,216,216, 73,127, 92,207,223, 21,236,220, 0, 79,147, 1,197,120,144,249,
-171,122,121,140, 8,132, 54,100,225,178,141,224,198, 45, 6,128, 2, 33,193,206, 16,167,157, 38,176,182, 2, 86, 27, 96,109, 5,
-108,118,192,106, 1,108,173,119,162, 36,238, 4, 69, 8,253, 2,185,126,117, 24,134,142, 8, 1, 9, 80,225,150,197, 2,243,129,
-107, 56, 87,118, 29,183,111, 55, 33,126,130, 3,205, 86, 26,214, 86, 7, 44, 45, 12,110, 92, 5, 44,205,192,142, 29, 59,204, 66,
- 22,192,144, 33, 77,132, 67,196,179, 70, 88,239, 95,163,209,104, 83, 83, 83,139,217,148, 81,139,197, 98, 46, 41, 41,161,210,211,
-211,249,218,162, 1,196, 2, 96, 18, 18, 18, 24,141, 70,163,248,224,131, 15,176,124,249,114,188,241,198, 27, 32,132,224,235,175,
-191,198,129, 3, 7,112,250,244,105,212,215,215, 99,228,200,145,104,104,104, 8, 86, 40, 20,253,125, 25, 95,184,112,161, 71,145,
-204, 70, 80,230,205,155,199,247,220,245,232, 33, 0,111, 81, 0,127,188,127, 89, 8,200, 2,160, 75, 72, 81,167,211,105,217, 49,
- 67, 87, 17,192,237,144,216,241,120,177, 99,177, 44,233,207,154, 53,139,114, 14, 3,168, 97,200,191,187,199,203,206,250, 79, 77,
- 77,165, 76, 38, 19,241, 21, 13,241,149,118,232,141,208,221,193,219,182,191,252,109, 51,162, 6, 40,240,243, 12, 53,172,173, 64,
- 88, 40, 5, 5,213,230,245,131,192,218, 2, 52,219, 8,154, 45, 4,205, 86, 2,134, 0, 10, 47,115,174,127,249,124, 51, 30, 28,
- 87,129,129, 15,220,198,103,159, 86,227,246,109, 43, 18,166, 52, 96,108, 68, 19, 16,208, 10,107, 11,131,234,235, 4,205,205, 20,
-104,154, 66, 68, 36, 5, 80,140,252, 20,223, 59,104,191,127,217,231,151, 29, 6, 96,177,123,247,238, 78,243,143,220,204, 5, 96,
- 47,122, 44,128,147,171, 87,175,158,170, 82,169, 66, 62,252,240, 67,108,217,178, 5, 79, 61,245, 20,214,175, 95, 15,138,162,112,
-249,242,101, 88, 44, 22,100,103,103,131,166,105,172, 88,177,130,161, 40,202,231, 3, 32,229,108,250,158, 62, 4,224, 45, 10, 32,
-133,247, 47, 67, 22, 0,146,194,117, 28,217, 19,193,183,109,199, 27,134, 18,231, 12,117, 39,241,151,194,248,199, 75,112,102, 1,
-116, 20, 5,124,134, 1,164, 2,235,205,155, 76, 38,194,245,254,217,136, 0,247,189, 78,167, 3, 91, 44,199, 93, 97, 13, 95,132,
-238, 10, 54, 11,192,147, 61,218, 1, 52,183, 16,180,218,156,147,253, 90,109, 4,170,192, 59,159, 89, 91, 0,139,157,160,230, 54,
-193, 15,181, 4,199,207,209, 96, 24, 64,167,211,105, 75, 75, 75, 59, 93, 27,154, 6, 42,175,217,112,173,188, 22, 95, 30,174, 5,
- 33, 20,206,125,199, 32,253,231, 52,212, 42,130, 31,110, 2, 95,254, 11,104,104, 32, 32, 12,240,179,153, 20, 52, 26, 96,238,220,
- 5,184,114,229, 10,175, 99, 42,216,170, 39, 11,151, 73,159, 42,234,207,120,191, 91, 50, 88, 82, 43,137,157,136, 8, 83,143,142,
- 36,176,109,227,199,143, 39,199,143, 31, 71, 97, 97, 97,167,239,100,100,100,184, 51,165, 0,112, 6,192,201,141, 27, 55,142, 11,
- 15, 15, 15, 1,156, 97,240,205,155, 55, 99,249,242,229,216,178,101, 75,187, 23,191,113,227, 70,212,213,213,161,161,161,161,169,
-165,165,165,162, 45,130,160,246,182,175,191,250,213,175, 58,204,135, 98, 61,120, 66, 8,239,240, 63,112,111, 12, 1,184,139, 2,
- 72,237,253,179, 54,101,207, 95, 22, 0,126,161,164,164,196,231,108,114,147,201,148,194, 59,165, 48,176, 23,140,195, 15, 2,116,
- 9,193,136, 94,200, 92, 55, 2,134,226,116, 10, 48,144, 59,130, 96,150,232, 97, 0,215, 84, 64, 79,169,129,158, 58, 75,189, 94,
-223, 78,254,174, 19, 0,219, 60,255,246, 54,111, 17, 0,174, 61,169, 58,243,189,123,247,166, 92,175,250,212,204,244, 99,160, 80,
- 1, 1, 10,103,103,100,103, 8,104, 26,104,108, 36,176,217, 1,218,238, 20, 5, 11, 22, 58,163, 55,165,165,165, 30,237,181,222,
-218,107,142,143,103,240,197, 1, 7, 40, 5,240,195, 13, 10,154, 32,224,192, 62,192,102,161, 64, 17, 96,236,248, 0, 84, 94,101,
- 48, 99,198, 60,164,165,165,121, 20, 60,174,228,191,225, 57, 96,245,187,210,138, 0, 79, 67, 81,221,109,207, 87,200,185, 27,224,
-118,103,216, 89,255,233,233,233,237,247, 40, 27,189, 91,188,120,177, 55, 15,180, 9,192,165, 19, 39, 78, 52, 77,159, 62,189, 31,
- 56, 57,253,155, 55,111,110, 39, 89,187,221, 14,135,195,129,210,210, 82,244,235,215,239, 22,195, 48,188,212,226,194,133, 11, 61,
-121,234,130,136,246, 94, 24, 2,112, 23, 5,144,210,251,151,137,255, 71, 40, 0, 74, 74, 74,238,122,213, 62,214,203,101,137, 46,
- 53, 53,149,114, 67,254,132, 13, 43,234,116, 58, 81,191,195,205, 2, 96,219,132,122,254,174, 19, 0,219,208,222,150,149,149,101,
-214,233,116,188, 31, 50, 46,249,187,155, 19, 32,212,158, 47,108,216,110,133, 47,123,105,105,105,197, 47,101,239,194,195, 73, 1,
- 96, 0,216,109, 12, 2,213,206,211,212,216, 76,208,106, 39,160, 29, 64,201, 25, 7, 28, 12,129,175,148,189,180,180,180,226,223,
-255,110, 23,102,164, 40,241,232, 19, 74, 52, 53, 18, 52,214, 3,205,141, 20, 70,140, 36,112,216, 41,168, 20, 26,212,221,102, 80,
-249,189, 13,171,254,147,223,132,177,130,173,122,242,206,243,192,168, 97,192,166, 23,128,149,111, 73, 47, 2,164,140, 12, 72,101,
-175,171, 82,254, 68, 62,247,140, 59,242, 95,187,118,109,167, 48,255,182,109,219,204, 25, 25, 25,240, 80, 36,136, 37,122, 27,128,
-147,247,223,127,127,185,213,106, 29,172, 84, 42, 53,193,193,193, 0,128,237,219,183, 99,241,226,197,176, 88, 44,176, 90,173,104,
-109,109, 69, 72, 72,136,213,225,112,236, 36,132,220,224,179,179, 82,101, 3,220, 43, 67, 0,220, 40, 0,251, 90, 38,126, 89, 0,
-220, 53,242,231, 99, 51, 53, 53,149, 50, 26,141,164,205,219,133,209,104, 36,220,180, 68, 87,175,223,157, 64,232, 4, 37, 5,168,
- 21, 64,144, 18, 8, 81, 1,173,141, 48,190, 17, 0, 4,125, 67, 50, 31, 27, 1, 4, 69,192,240, 87,225, 94,191,183,217,254, 44,
- 89,243,205, 97,119, 37,127,215, 57, 1, 66,237,241, 37,127, 62,246, 94,207,125,143,122,225,249, 21, 68,163, 1, 24, 6,120,240,
-126,229,157,235,241,173, 3,118, 7,129,131, 81, 98,209,162, 69,188,196,201,171,175,189, 71,173, 90,181,130,208, 52, 96,179, 19,
- 56,104, 64, 65, 1, 41,243,128,198, 58, 10,223,157,178,192, 98, 85, 96,126,198, 34, 94,199, 82,176, 85, 79,214, 62, 13,196, 14,
-113,190,143, 25, 12,116, 69, 36, 64,134, 48,120, 42,246,163,215,235, 73,122,122, 58,159,108, 0,101,120,120,248, 73,139,197,242,
-183,138,138,138,225,227,198,141,139,166,105, 90, 21, 16, 16,128,157, 59,119, 98,214,172, 89,176, 90,173,104,105,105, 65,105,105,
-105, 67,159, 62,125,246, 91, 44,150, 15, 25,134,105, 6,207, 10,128,108, 81, 32, 86, 76, 9, 9,253,179,184, 87,134, 0,184, 81,
- 0, 41,174,175,152,218, 1, 50,238, 1, 1,208, 29,158,191,171,247,193,245,132, 60,133,250,165,220, 71, 33, 99,255, 82,147, 63,
- 71,236,112, 11, 1,177, 34,200,220, 22,233, 16,100,207,215, 92, 0,161,246,222,250,195,123,148, 94,175, 39, 10, 5,240,101,137,
-115,172,159,157,240,231, 28,247, 95, 36,200,222,155,111,190, 71,173,120,182,173, 38,133,194,105,227,155,131, 64,115, 19, 3,194,
- 0,243,231,207,195,156, 57,115,124, 94,143,130,173,122,146,253, 36, 16, 30, 2, 84,222, 2,130, 2, 1,134, 0,189, 52,192, 58,
- 61,144,147, 39,139, 0,190,240, 21,125, 16,250,188,185, 35,255, 21, 43, 86, 16, 54, 19,160,176,176,144, 80, 20,229, 77, 8,132,
-216,108,182, 38,133, 66, 97,138,138,138, 26,210,216,216,248,220,177, 99,199, 6, 37, 38, 38, 50, 52, 77,183,212,215,215,223, 60,
-117,234,212,229, 17, 35, 70,148,247,237,219,183,194, 98,177,108,167,105,250, 38, 33,132,183, 0, 96,139, 2,113,162, 2, 98,250,
- 43,109, 23,246,133,146,219,150,138,180,101,242,191, 71, 5,128,175, 92,127,161, 15, 58,223,218, 1, 66,236,230,229,229, 81,158,
- 22,219, 17, 66, 94,134,204, 60,103,152,255, 34,128,139,174,159,214,183,253, 93,130,136,227, 53, 75, 69,174,220,243,162,215,235,
- 9, 91,103, 32, 43, 43, 75, 84,134,131,171,189,252, 85,189,218, 69,129, 63,162,201,245,154,176, 19,254,196, 70, 37,222,251,115,
- 71,123, 77, 13,206, 14,120,254,252,249,194,238,191,191,221, 93, 34,236,110,123, 61,108,220,191,131,199,206,125,227, 74,254, 38,
-147, 41,133, 16,130,221,187,119,115,183,241,102,239,170,205,102, 11, 36,132, 52, 50, 12,147,103,179,217,190, 30, 54,108, 88,100,
- 93, 93, 29,245,242,203, 47, 55,212,215,215,215, 12, 30, 60,184,177,169,169,169,217,102,179, 53,216,237,246, 86,135,195, 97, 17,
-178,195, 18, 13, 3,116, 37, 17,202, 36, 43, 67, 58, 1, 32,181,103,223,149,145,130,212,212,212, 98, 94, 33,126, 31,144,114, 86,
-255,221,136,140, 8, 89,244, 71,138,104,128,208,107,194, 77,235,242,119, 72,194,213,158, 80,242,151,218,187,239,233,207, 71, 87,
-222,127, 18,216,166,218, 4, 10, 81, 40, 20, 96,255, 88,193, 50,111,222, 60,204,157, 59, 23, 12,195,128, 97, 24, 16, 66,124,253,
- 30, 69,211,116, 48, 33,196,193, 48, 76,171,221,110, 63,168, 84, 42, 41,133, 66, 17, 8, 32,144, 97, 24, 56, 28, 14, 37, 77,211,
-106,154,166, 7, 57, 28,142,243,156,239,118,249, 34, 64, 50,100,244, 4,120,171,145, 66, 37, 36, 36,200,203, 99,202,144, 33,227,
- 94, 69, 11,135,208, 25,142, 99,163,226,180, 87, 1, 8, 3,160,145,137, 95,134, 12, 47, 17, 0, 25, 50,100,200,184,135,160,105,
- 19, 1, 12,135,248, 21,184,179,242,160, 10,192,160,182,215,114,213, 40, 25, 50,100, 1, 32, 67,134,140, 31, 9, 20, 0, 66, 56,
-239, 89,226, 87,115, 72,159,105,219, 78,246,254,101,200,144, 5,128, 12, 25, 50,126, 34,125,154, 76,250, 50,100,120, 81,207, 50,
-100,200,144, 33, 67,134,140,159,178, 90,126,246,217,103,185, 11,233, 16,238, 12,123,189, 94, 79, 92, 22,218,185,154,154,154, 58,
-140,125,239,174, 20, 43,215,158, 80,252, 24,237,185,166, 45,114,207,167,124,254,228,235,209,211,237,173, 91,183,174,125,155,156,
-156, 28, 74,132, 61,192, 67, 57, 96,249,126,246,109,243,167,118,255,157, 56,113, 66,180,189,196,196,196,159,188, 61,193, 2, 64,
- 32,250,241,217,136, 93,189, 79, 42,197,226,154, 51,237,110, 53, 64,119,219,116,135,186, 98, 9, 70,167,211,105, 89,162, 97, 43,
-128,245,148, 92,237,221,187,119,167, 20, 22, 22,182,147,224,188,121,243,180,243,231,207, 47,254, 49,170, 93,119,215,227,252,121,
-103,102, 88, 92, 92, 92,183,238,155, 94,175, 39, 11, 22,234,177,179, 32,207,237, 61,187,247,211,227,100,103, 65,158,215,123,121,
-239,167,199,189,118, 2,105,115,199,139,190,233,214,173, 91, 71, 50, 50, 98, 58,188,247, 37, 2,124,161,177,169, 49,101,215,191,
-118, 33, 58, 62,218, 12, 10, 56,127,226,156,118, 74,194, 84,196,221, 31, 39,232,254, 59,116,232, 80,167,227,158, 58,117,170, 92,
-220, 73,134,140, 46, 20, 0,106,190, 27, 38, 37, 37, 9, 54,238,110,177, 24, 22,238, 72,212,117,161, 13,190, 68, 43,166, 8, 11,
- 31, 65,193,218,205,206,206, 70,110,110,174,217, 83, 77,118,118, 59,111,185,154,174,251, 56,120,196, 80, 0,192, 77,171, 21,180,
-165,213,217, 88,215, 0,192,185,246,129,144,218, 8, 92,242, 7,156,181,197,133,228,218,235,245,122,162,160,156,213,245,216,255,
-128,247,215,127,126,239,238, 11, 50,215,235,193, 18,191,216,235, 33,165,168,100,201, 63,109,238,120, 43,160,215,236, 44,200, 19,
-253, 27,172,128,112, 47, 0,242,252,218, 79,155, 45, 27, 69, 69,153,152, 51,199,128,140,140,220,246,136,128, 24, 33,240,229,217,
- 47,201,125,137, 67,241,118,222,155,232, 19,220, 7, 12,237,128,149,180,154,247,125,253,175, 57,251, 15,124, 78,166, 70, 79,211,
-106, 52, 26,159, 66,224,208,161, 67,164, 45,178,208,201,163,148, 69,128,140,159, 50, 78,158, 60,217,225,189,187, 62,205, 31, 1,
- 32,104,254,128,187, 85,236,164, 0, 1, 82,252,182, 33, 96,193, 20, 62,158,187, 94,175, 39,217,217,217, 88,191,126, 61, 0,180,
-255,119,183,157,224, 21,219,194,123,227,116,197, 63, 17,132, 33,112,224, 43, 84,255,229, 56, 78,149,215, 96,209,250, 45,221,118,
-163,157,254,246, 12,198, 62, 56, 6, 12, 1,206,156,113,190, 6,238,188,230,182, 51, 60, 79, 53,183, 6,187, 55, 24, 12, 6,138,
-239,245, 88,182,108, 25, 0,180,255,119, 75,254, 20, 5,120,185, 31,244,122, 61,121,248,225, 79,161,215,207,149, 84, 4,164,205,
- 29,223,146,153,153, 25, 12, 24,176,179, 64, 24,177,115, 61,124,127, 73,222,147,247, 15, 0,139, 23,111, 71, 81,145,243,127,102,
-102, 57,216,136,128,144,104, 0, 33, 36,197,124, 97,191,249,185,255,120, 22, 15,245, 75, 68, 80, 88, 24,136,141, 6, 67, 28, 80,
-170,212,136, 77,141, 45,250,110,194, 5,172, 55,228,154, 39, 71, 38,105,131,131,131,125,138,128, 91,183,110,117,120, 63,111,122,
- 47, 76,126,254, 43, 60,158,107,237,112, 33,103,206,156, 41,250,122, 21, 20, 20,144,133, 11, 23, 74,118,189,165,182,215,197, 68,
-146,226,111, 89,223,147, 39, 79,166,180,145,144,104, 59, 20, 69,245, 5, 48, 28,192,108, 0, 3, 0,196, 1, 56, 9,231,162, 80,
- 0,144, 79, 8,249, 78,166,254,206,228,207,182,185,138,128, 14, 2,160,162,162,130, 84, 84, 84, 0, 0,162,163,163,193, 93,108,
- 6, 64,135,247,238, 62,247,132,234,234,106,179,209,104,228, 29, 9,112, 93,235,222, 27, 9, 83,109,165, 48, 93, 73, 84,104,136,
-221, 96, 48,248,220,198,100,242,189,182,122,219,144,135, 71,210, 95,179,102, 13,114,115,115,193, 21, 8,124, 48,120,196, 80, 92,
-175,173,199, 39, 43, 22,163, 47, 53, 13,229,239,175, 66,244,163,209,248,172,155,201, 31, 64, 59,225, 3,192,152, 49, 99, 58,180,
-179,145, 1,110,187,212,158,189, 55, 34,102,175,135, 39,210,223,186,117, 43,114,115,115, 49,119, 90, 34, 62,253,234, 4, 16,218,
- 11,104,104,186,235,231,112,239,167,199,131, 1, 3,246,126,122, 92, 18,123, 11, 27, 94,242,250,108, 22,244,126,157,215, 3,194,
- 13,253,103,102, 22, 33, 35, 35,166,253, 63,139,140,140, 24,222, 34,224,253,127,188,143, 55,222,125, 13,211, 71,166,192,209,218,
- 10,218, 65,131, 82, 81, 0,148, 32, 96,112,243,135, 74,196,245,123, 0, 47,173,120, 9,175,109,120,205,252,240, 24,223,209, 44,
-215,206,110, 94,212, 86,183,132,191,127,255,126, 34, 70, 4, 20, 20, 20,144,189, 47,127,138,180,255,134, 36,164, 93, 80, 80, 64,
- 54,108,216,128,213,171, 87,247,104, 17,112,242,228,201,148,250,250,122,115,101,101, 37, 18, 18, 18,252,218,207,250,250,122,243,
-157, 46, 91, 20,249,135, 0,248, 55, 0, 39, 0,124, 8, 96, 22,128, 71, 0,252,154, 35, 0,110,201,212,239,226, 72,101, 59, 57,
-198,144,187,198,237,231, 29, 4, 64,116,116, 52, 21, 29, 29,221, 78,246,220, 80,178,209,104,236,240,222,245,243,210,210, 82,143,
- 29, 14, 43, 42,178,178,178,204,217,217,217,112, 93, 40,199,117,241, 28,163,209,232, 49, 4,235,174,179,119,109,235,206,133,138,
- 0,224,227,143, 63,246, 72,252, 0, 58,144,255,154, 53,107,120,217,252,190,226, 42,154,119,252, 30, 33,203,255,128,193, 35,134,
- 98, 64,223, 32, 84,236,168,112,146,127,120,111,231, 16, 64,128, 82,240,190,102,100,100,104,185,195, 0, 25, 25, 25,130,163, 52,
- 12, 1,134,245, 2,254,247, 73,224,153,173, 64,191, 96,224,124,157,251,246,179,181,130, 31,124,191,163, 54,175,190,250,170, 71,
-226, 7,128, 13,203,210,177,105,223, 17, 12,140, 30,132, 27, 87,110,250,244,254, 1,128, 79, 20, 64, 72, 24,223,233,225,235,221,
-122,250,236,216,190,208,251,122,195,223, 61,159,163, 81, 43, 32,226, 94,137,233,240,223,150, 17, 11,117, 97, 25,239,239,183, 88,
- 90, 48,109,233, 84,115,210,160,201,104,109,110,134, 42, 48, 16, 42,213,157, 46,168,162,172, 12,187,118,238,188,190,252,169,101,
-131,135, 7, 14, 67,226,140,132,212,175,139,190, 78,153,252,208,100, 65, 94,227,186,189,203,112,224,192, 1, 60,246, 88,199,246,
-153, 51,103, 82, 66, 69, 0, 75,254, 24,254, 54,246,190,252,159,126,139,128,130,130, 2,242,206, 59,239, 96,212,168, 81,216,180,
-105, 19, 86,174, 92,217,227, 68, 0,151,248,165,178,199,218,242, 35,154,160, 5, 48, 3,192, 86, 66, 72, 19, 69, 81, 3, 1, 92,
- 0,112,133, 16, 66,203, 84,223, 89, 16,179,228,207,190, 54,228,174,233, 20, 5,184, 43,117, 0,140, 70, 35, 59,246,138,138,138,
- 10,244,239,223,191,147, 64, 96,219,170,171,171,121,213,185,247, 53, 25, 80, 72,135,185,100,201,146, 46, 59,118, 46,129,185,243,
-250,115,115,115,145,151,151, 71,185,155, 5,203,133, 5, 87,209,244,232,100,144,208, 85, 64,234,203,104,194, 63,128,191, 56,189,
- 69, 98, 92,133,128,127,223, 4,154, 22, 94,232, 44, 61, 61,189,152,199,178,171,222, 35, 60,155,129, 87,222, 3,134, 14, 1,110,
-238, 86,227,131,255,179, 97,217, 63, 61,183, 11,129,212,235,217,115, 39,251, 85, 21,172, 71,104,188, 6, 33, 35,127,131,143,215,
- 63,131,113, 99, 6,226,254,244,215,120, 93, 15, 62,247, 39,223,161, 2,246,222,229,146,127, 94, 94, 30,197, 78,252, 19, 69, 52,
-189, 95,167,196,144,188, 59,216, 50, 98,221,182, 23,185, 68, 2,124,161,170,186, 10,179,117,179, 17,218,187, 15, 28, 20,141, 47,
- 14, 28, 68, 99, 83, 19, 50,230,207,199, 15,213,213,216,182,253, 19, 60,253,212,178,193,129,154, 64, 40, 72, 0,230,140,159, 99,
-186, 96,222, 36,202,107,172,173,173,245,251,184,185,228, 15,192,111, 17, 80, 80, 80, 64,214,174, 93,139,216, 88,231,249,140,137,
-137, 65, 79,138, 4, 72, 77,252,110,188,127,246,181,152, 99, 29, 13,128, 0, 8,160, 40, 42, 24, 64, 60,128,115, 0, 6, 83, 20,
-213, 0,160,142, 72,221, 89,252, 4,112,215, 10, 1,245,239,223, 95,171,211,233, 58, 13, 5, 28, 57,114,196,220,182,216,139,224,
- 57, 2,158, 38, 3,122,243, 28, 61, 9,148,174, 0,235,221,123, 10,247,243,245,254, 1, 96,223,111,215, 34,227,141,183, 64,167,
- 78,131, 10, 64,200,225, 50,124, 86, 94, 3, 0,160, 83, 87,194,254,109, 36,168,126,191, 22, 76, 82,124,163, 44,222, 80,179,240,
- 31, 88,249,212, 53, 92, 92,177, 26,205,159,219, 48, 48,210,123,187, 20, 17, 0, 49,226, 96,235,214,173, 78, 53,156,145,140, 35,
-149,213, 8, 29, 23,138,235, 69,229,128, 38, 16,139, 87,254, 59, 34,134,164,119,219,131,232,105,214,191, 84, 81, 45,111, 25, 2,
-190,178, 3,138, 50,139, 48,199, 48, 7,139,183, 3,153, 69,206,215, 69,153, 69,130,163, 0, 77,214, 70, 68, 6,245, 5,109,109,
- 1, 81, 16, 76,156, 52, 9, 59,118,236,176,190,243,214, 91, 26,134, 16, 60,241,228, 19,136,232, 27,129,150,166, 38,208, 14, 26,
-161, 1,189, 97, 87,216, 69, 29,111, 93, 93, 93,135,236, 0,161, 19, 2, 59,145, 63, 11,145, 34,160,160,160,128,100,103,103, 99,
-210,164, 73, 29,218,199,140, 25,131,117,235,214, 33, 39, 39,167,219, 68, 64, 87, 17,191,171,247, 15, 0,149,149,149, 98,163, 0,
- 95,195, 57,222,223, 0,103,232,127, 54,128, 82, 0, 99, 1,236, 4,176, 5,128, 29, 50,196, 11, 0, 87, 66, 96,215,156,231,243,
-185,183, 89,211, 44,216,225, 5,118, 66, 32, 59, 55,128,141, 14, 68, 71, 71,155,217,225,130,238,234,120,165,132,175,177,126,214,
-251,231, 99,107,209,123,219, 65,230,143,192,205, 41,227,209, 23,211, 16,180,120, 19,232,170, 31,128,240,222, 80,213,252, 3,187,
-223, 41, 1,148, 74,193,199, 46,197, 82,180,167, 94,248, 55, 60,148, 0, 68,175, 60,131,248,144,167,112,225, 62, 29,240,191,171,
- 61,182,119, 87, 4, 32, 55, 55, 23,211, 39,222,143,212,105,163,144,241,224,106,108,124,231,207, 56, 87,114, 29, 43,102, 62,132,
- 27, 59,247,162,190,182, 65,146,251,193,221, 80,129,175,231,195,155,183, 47,213, 61,234,201,190,183,137,131, 57, 57, 57,212,186,
-117,235,200,226,237, 29, 5, 1, 0,204, 49,204,129,186,176, 12,133,133,229,237,153, 0,236,132,193,136,136, 8,119,114, 14, 12,
-195,192,193, 0,132,161, 17, 24,164,193,147,191,248,133,230,149,255,250, 47, 12, 24, 48,128, 25, 60,112,160,194,218,220, 4, 7,
- 1, 8,227, 0,195,248,142,104, 77,157, 58,149,218,182,109, 27,169,169,169, 65, 67, 67, 67, 7,225,200,205, 14, 16,146, 21, 80,
- 80, 80, 64, 54, 62,115, 22,208,196, 2, 55,222,237,188,129, 38, 22, 27,159, 57,139,172,191,240, 19, 1, 5, 5, 5,100,193,130,
- 5,218, 49, 99,198,152,107,106,106, 58,125, 62,108,216, 48, 44, 88,176, 64,123, 47, 77, 12, 20,227,253,251, 19, 5, 32,132, 20,
-115,174,237, 32, 0,167, 0, 60, 74, 8,105,134, 12,105, 4,128, 75,161, 31, 95,133,128, 58,124,238, 45,100,170,211,233,220, 70,
- 1, 88,178,239,223,191,191, 54, 59, 59,219,204,142,201,234,116, 58,175,105,128,222,188, 67,161,147,255,186, 42, 13,144,245,238,
-189, 77, 6, 20,130,242,255,201, 68,192,226, 77,176, 84, 94,132,234,240, 38,216,183,175, 4,149,246, 38,118,253,250, 49, 92,217,
-117, 9, 25, 27, 62, 4, 84,221, 83,217,121,181, 17, 40,218,176, 3,241, 87,230, 0,183,154,241,226,172,213, 94,219,165,136, 0,
-136,245,254,119,238, 88, 11,229,224,209, 8,193, 40, 92, 61, 96, 64, 35, 69,240,205,197,107, 72, 61,115,157,231,117,191,218,254,
-126,201,146,188, 14,100, 15, 0,159,127, 62,215,237,118,222,158, 15, 95,161,126, 41,210, 14,165,200, 16,200, 44,186, 67,252, 0,
- 58,121,254,236,132,193,194,194,114,183,223, 15, 13, 10, 69,101,125, 37, 38, 13,159, 12, 75,171, 21,176, 88, 65,219,236,120, 41,
- 59, 27,148, 2,138,150,230, 38, 48,140, 3,180,131, 32, 80, 21,128, 31,154,126, 64,128,195,119,182,241, 99,143, 61,214,126,110,
- 14, 29, 58, 68,216,254,134,155, 29, 80, 85, 85,197,251, 56, 23, 46, 92, 72,101,253, 5,100,227, 51,103, 17, 55,162,243,239,159,
-191,100, 67,214, 95,226,193,151,172, 23, 46, 92, 72, 21, 20, 20,144, 73,147, 38, 97,216,176, 97,157, 62, 63,115,230, 12,118,238,
-220,105,238, 46,242,111,243,198,169,174, 28,251,231,194,143, 40, 0,139,217,112, 78,254,110,149, 41, 92, 66, 1,208, 85, 96, 61,
-127, 0, 72, 74, 74,210, 26,141, 70, 51, 27,250,247, 32, 14,180,165,165,165,102,161, 36, 44,182,147,148, 58, 13,144,235,253,187,
- 35,126, 86,232, 8,217,223, 83,229, 53,176,127,251, 10,110,226, 43, 12, 76,123, 19,168,111, 64,185, 97, 21, 98,158,125, 27, 55,
-182,172, 2, 2, 84,128,162,123, 42, 59, 95,109, 6,226,250, 63,202,187,189, 59, 34, 0,185,185,185, 77, 75, 83, 39, 87,133, 49,
-125,134,182, 32, 64,179,253,237,149,248,211,238,147,120,241,145,159, 97,217, 91,127,199, 99,175,255,181, 91, 38,143,178, 2,180,
-173, 14, 0,229,175, 56,245, 39,212,239, 45, 10,144,217,230,217,187,146, 63,215,251,247,133,168,254, 81,216,247, 69, 17,166, 14,
-157,138,224, 94, 33, 96, 24, 2, 5,161,193, 80, 20, 8, 33,112, 16,128,102, 8,104,154,134,165,190, 25,123,142,238,129,218,161,
- 22, 60, 41,213, 53, 43, 32,103,229, 52,204,139,170,128,225, 40,127, 27,158, 68,128, 80,242,231,218,203,201,201, 33, 27, 54,108,
-192,160, 65,131,238, 8,251,242,114,228,230,230,162, 39,120,254, 82, 11, 1,119,222,191, 63, 81,128,182,254, 55, 5,192,125, 0,
-126, 39, 79,254,187, 71, 4,128,235,172,127,157, 78,215, 62,238,206, 21, 7,220,215,254,120,240, 98, 58,114,169,210, 0, 61,121,
-255, 98,137,159,197,162,245, 91,240, 9,128, 71,222,152, 7, 98, 92, 5,106,201, 70,156, 42,175, 1, 21,209, 7,101,223, 55, 56,
-189,127,165,178, 91,110, 34, 79,249,254,254,212, 1,224, 35,184,248,138,131,173, 91,183,218, 0, 52, 62,147, 50,182,225, 55,111,
-254,193,246,219,151,178,173,253,122,247,175, 57,123,238,234,128,101,231,254, 30,210,221, 89, 35,158,200,153, 59, 68, 35, 60,163,
-192,221,111,248, 23, 1,112, 71,254,172,231, 15,192,231,132, 64,141, 70, 67,157,219,117,126,190,121, 90,241, 78,221,131,143,161,
-193,218, 0, 74, 1, 56, 75,138, 48,112, 56, 8, 24,154, 70,175,192, 80, 28,170, 63,129,210,195,101,152, 53,126, 86,177,223, 39,
-183,252, 87, 0,132,167, 1,118, 16, 1,131,174,226,124,213, 48, 81,228,207,181,183,122,245,106,178,105,211, 38,132,135,135,163,
-166,166, 6,107,215,174, 69, 79, 11,251, 75, 33, 4, 60,121,255, 98,162, 0, 20, 69, 13, 0, 48,176,237, 70, 73, 4,144, 5,160,
- 92,166,111,137, 5, 64, 87,213, 1,240, 20, 17,216,184,113,163,214, 85, 40,232,116, 58,179, 80,123, 92, 34,232, 9, 37,118,185,
-222,191,107,250, 95, 69, 69, 69,135,243, 38,164,106, 31, 43, 2, 30,125, 99, 51,200,118, 32,114, 89, 30,138,127,243, 24,126,150,
-155, 15, 4, 4,160,151, 70,221, 45,199,203,205,241,119,247, 90,100, 29, 0, 26,128,162,237,218, 42,252,188, 30, 55,151,166, 78,
-174,252,141,161,112,196, 75, 79,207,238, 29, 53, 48,197, 6,224,180, 78,167, 11, 3, 16, 34,246,122,220, 33,233,185,228,225,135,
- 63,229,132,255,133,125,223,155, 7,207, 45, 15,204, 87, 72,116, 69, 49, 32, 79,112, 37,125, 54, 34,224,105,200,227,151, 75,126,
-185,171,240,239,133,112, 44,165, 79,207, 24, 58, 99,108,223,208,190,176,218,173, 32,132, 64,173, 82,163,206,210,130, 35,223,127,
-142,173,127,251, 0,218,209, 90, 73, 10,135,173,219,187, 12, 31,124,240, 1, 86,173, 18, 94, 3,224,142, 8,128, 95,228,207,181,
-183,114,229, 74,182, 14, 0,122,242,152, 63, 87, 8,136,249,174,191,181, 3,184,143, 1,156,249,254, 86, 0, 47, 0, 56, 74, 8,
-113,200,244,237,241,220,227,228,201,147, 48,228,174,233, 84, 7,192,107, 33,160,174,170, 3,224, 46, 34,224,137,232,197, 68, 1,
-252, 69, 87,165, 1,178, 98, 36, 47, 47, 15, 38,147,137,169,168,168,224, 18,153, 54, 53, 53, 85,204,219, 75, 87, 0, 0, 2, 12,
- 73, 68, 65, 84,176,119,179,104,253, 22,128, 83,248,103,198, 75,239,181,191,238,142,217, 48, 93,229, 61, 83, 20,245, 14,128,219,
-112,166,255, 60,233,167,185, 27,207,164,140,109,157,101,250,186,247, 19,255,245, 33,242,242,242,212, 38,147,105, 16, 58,150,179,
- 22,117, 61,186, 58, 18,224,171,190,191, 47,116,197,144,128, 39,242,183,101,196, 2,133,190, 29, 51,237,216,153,212,129,109, 95,
-144,195,195,142, 96,218,228,105, 24, 28, 58, 24, 96, 8,126,176,214,224,208,241, 67,184,113,246, 6,102,198,205,212, 6, 6, 6,
-118,251,245,224,138, 0,169,200,154,141, 4,220, 43, 19,254,252,173, 2,232, 47, 8, 33, 6, 0, 6,200, 16, 12, 79, 5,128,220,
- 10,128,174, 66, 86, 86,150, 91,178,231,174,196,230, 2, 51,159,172, 2,169,188,254,174, 72, 3,108,155,225, 79,155, 76, 38, 85,
-219,208, 1, 75,254, 51, 83, 83, 83, 5, 69, 57,218, 22, 83, 50, 75,189,143,158,198,152,165,174,117, 47, 16,129, 0, 84,121,121,
-121, 47,183,189,119, 0,248,133,191, 54,103,253,238,253,146,188,188,188,100,147,201, 4,147,201,100, 5,160,105,251,243,155,248,
-217, 40,128,216,115,230,139,228, 23, 44,212,119,216, 78, 40,113, 75, 49, 36,144,147,147, 67,173,203, 92, 71,162, 86, 70,105, 49,
-220,253, 54,149,153, 69,102,190,243, 1, 38,197, 79,162, 90, 90, 90, 82,182,188,177, 5,195, 98,239, 51, 3,192,133, 51,223,105,
-211,103,101, 32, 46, 33, 78,244,245,152, 58,117, 42,181,125,251,246, 78, 89, 1,118,187,127, 25, 98, 82,147,245,143,109,182,191,
-140,158, 25, 5,112,109,227, 45, 0,124,121,226,124, 61,117,177,157, 34,223, 66, 44,254, 18,149,212, 68,199,218, 51,153, 76,196,
-100, 50,169,184,231, 43, 58, 58, 90,212,111,181, 17,148,228, 29, 70, 79, 24,251,118,131, 80, 0, 77,206,130,252, 20, 5, 32, 8,
-126,228,247,114,174,199,101,147,201,196,230,149, 53, 68, 71, 71,247,139,142,142, 14,236, 9,231,210, 95, 79,220,151,109,169,134,
- 4,124,146,123,142,176,123, 52, 56, 56,184,120,201,130,165, 96,239,237,164,248, 36, 73,246,115,241,226,197, 50,185,202,144, 69,
- 0, 15, 39,154, 74, 72, 72,144,171, 39,201,144, 33, 67,134, 12, 25, 63, 49, 40,228, 83, 32, 67,134, 12, 25, 50,100,200, 2, 64,
-134, 12, 25, 50,100,200,144,241, 19,192,255, 3,117,205,212, 3,120, 27, 16, 76, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 0, 0, 0,
+ 1, 0, 8, 6, 0, 0, 0,197,144,206,103, 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, 12, 29, 10, 35,
+ 1, 96, 85, 38, 85, 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,251,246,248, 38,170,
+244,253,103,146, 52, 77, 75, 10, 45,229, 90,180,210,114, 19, 65, 46, 22,177,138,151, 70,185, 24, 74,185, 54,226, 34, 46,136,216,
+202, 42,160, 22, 72,101, 23, 69, 87,191, 82, 22,148,149,245,146, 42,151,250,219, 85, 48, 45, 88, 10,212, 98,217,212, 21, 1, 23,
+170,128, 92, 86, 75,139, 20, 41, 80, 40,244,146, 52,105, 50,153,243,251, 35,153, 50, 77,115,153, 73, 82, 90,116,158,207, 39,159,
+ 38,103,102,158,206,204,153, 57,207,251,190,231, 61,231, 92,171,181,224,135, 31, 47,225,244,153,107, 40, 47, 63,189,127,194,163,
+ 51,183, 1, 56,231,139, 51,110,224, 36,213, 55,165, 59, 13,251, 75,235,145,252, 48,240,209, 91,142,153, 0,203,207, 2, 27, 62,
+119,120,254,118,116, 70,220,192, 73, 42,236,249, 52, 24, 2, 30,236, 99,219,109, 20,192,133, 11, 23, 84, 81, 81,221, 12,135, 15,
+ 95, 6, 0,252,252,115,103,220,125,247, 29,136,142,142,134, 66,161,192,133, 11, 23, 84,147, 38, 77, 18, 52, 21,112,223,190,125,
+ 85, 63,253,244,147,193,147,199, 70,211, 52,250,247,239,143, 13, 27, 54, 8, 18, 33,215,190,127,206,111,226, 79, 46,128, 59,111,
+213, 95, 15,214,151,184, 11, 17,127,174, 17,208,226,185, 56,118, 44,224,250, 14,212, 67, 23,114,223,248,254,175, 96,243,121, 19,
+127, 46,172, 41,253, 1,177,255,255,134, 68, 2, 60, 25, 6,130,134, 1, 6,144, 44, 23,236,177,215,196,207,109, 55,228,252,124,
+220,167,160,156, 95, 32,137,139,207, 47,124, 73,167,211,233,182,156, 56,246,205,251,219,243,191,142,239,213,167, 95, 34,103, 45,
+128,131, 67,134, 12,255,239,164,201,243,150,167,167,167,155,248,240, 57,167,247,165,210,231, 14, 39, 91,119,253,140,255,123,207,
+195, 90, 0,254,139,127, 80, 2, 38, 29, 77,252, 1,224,241,199, 31,199,209,163, 71,241,212, 83,135, 1, 0,163, 70,141,194, 99,
+143, 13, 87,189,248,226,139,205,226,252,237,183,223, 10,226,252,224,131, 15, 74, 0, 80,201,201,201, 73, 13, 13, 13, 6,169, 84,
+ 10,137, 68, 2,154,166, 33,151,203,161, 84, 42, 85,129,138, 63,128,160, 24, 1, 34,126,155,168,172,172,164,138,210,138, 72,204,
+194, 24, 21,250,186,223,167, 42,173,200, 32,122,255,237, 11,153,128,134, 50,216, 13,111, 91,240, 81, 29,252,252, 58, 2, 31, 27,
+ 9,168,211,233,116,179,135, 12,123,128,157, 49, 70, 9,160, 27,128, 11, 0,204,206, 85,222, 4,193, 53,188, 95,113,142,160,226,
+156, 25,248,230,104,123,223,135,142, 52,175, 68, 11, 56,133,190,249, 28,142, 31, 63, 30, 52,238, 93,187,118,149, 4,235,250, 56,
+253,254,148, 75, 57, 5,231, 68, 64, 34, 68,184, 26, 1,149, 75, 43,209, 81,223,189,223, 42,248,206, 2, 8, 0,148,191,235, 8,
+139, 16, 33, 66,132, 8, 17, 34,110, 94,136, 73,128, 34, 68,136, 16, 33, 66,132,104, 0,136, 16, 33, 66,132, 8, 17, 34, 68, 3,
+ 64,132, 8, 17, 34, 68,136, 16, 33, 26, 0, 34, 68,136, 16, 33, 66,132,136,223, 6, 90,140, 2, 56,114,228,136,223, 89,153,238,
+146, 9, 69,190, 54,227,243,185,136, 77,123,242,105, 52,154, 36, 0, 6,189, 94, 31, 20,190,153, 51,103, 38, 49, 12, 19, 52, 62,
+241,249,115,203, 87, 5,160,119, 91,158,223,130, 5, 11,102,166,167,167,127,222,150,215,171,211,233, 66, 0, 40,156,207,180, 5,
+ 0, 3,128,164,167,167, 19,241,121, 17,249,126, 79,124,193,138, 0, 16, 30, 31, 33, 8, 54,223, 13, 3,185,186,154, 16,227, 58,
+222,231,231, 20,194,160, 93, 47,135, 15,107,215,174, 85,121,185,159,130,249,142,191,215, 25,129,242,177,152,122,247,110, 67, 92,
+231, 2, 0, 64, 66, 66, 66,192,245, 57,176,231, 86,220,214,125, 47,194,194,194, 48,118,236,216,142,244,124,116,167, 58, 41,191,
+ 4,208, 61, 0,142, 8, 56,134, 96,118, 1, 16, 43, 9, 13, 47,242,194, 23, 2,223, 67,167,216,181,128,187, 43, 20,225,236,185,
+ 73,121, 28,119,193,207,247, 88, 8, 14,180, 85, 69,100,103,103, 79,252,248,227,143,151,132,132,132,108,151,203,229,165,114,185,
+252,127, 0,116, 82,169, 84, 79, 81,212,251, 58,157,174,155, 78,167, 19,135,157,137, 16,225, 41, 2,224,238, 37, 39,196,243, 59,
+ 46,112,110,104,226, 36, 12, 22,159, 32, 15, 54,152, 72, 77, 77, 37,167, 79,159,246, 41,174,122,189,222,160,213,106,209,163, 71,
+ 15,183, 83,174,102,100,100, 24,132,136,181, 94,175, 55,172, 93,187, 86,149,145,145, 97, 56,120,240,160,193,197, 16,240,139,143,
+ 57,249, 10, 36,119,188,142, 79,254,109, 5, 0, 48, 39, 95,185,110, 29,222,241,186,160,251,242,217,223, 58, 17,134, 0, 91,190,
+116,112,169, 31, 10,193,144,254, 39, 0, 56,140,128,210,210, 82, 65,117,179,250, 61, 85, 82,237, 47, 53, 48, 90,163, 12,166,166,
+ 78, 80, 79,168, 69,159, 94, 20,226,226,230,144,250,122, 11,182,110,221,218,174, 13,186, 68,161, 88, 68,108,214,241, 18,133, 98,
+ 17, 99,177,172,240,147, 70,201,138,175, 68,174, 88, 66,236,244, 56,137, 92,177,136,177,186,229,179,241,224,179, 17, 66,168,208,
+208,176, 69, 52,109, 27, 47,151, 43, 22, 89,221,112, 17, 66, 36, 20, 69, 49, 55,248,150, 89,185,207, 95,110,110,174, 97,250,244,
+233,170,188,188,188,146, 64, 72, 63,254,248, 99,181, 76, 38,123, 80, 38,147, 61, 46,149, 74,163, 36, 18,137, 50, 43, 43, 75,178,
+116,233,210,121,118,187, 29,180, 3,143,219,237,246, 20,157, 78,247,173, 51, 26, 96,117,182,127,109,222, 13, 58,121,242,100,194,
+183,189,203,207,207, 23,244, 76, 79,153, 50,133, 4,114,188,136,223, 62,216, 25, 1,133, 46, 7,236, 83,252, 19, 18, 18, 80, 90,
+ 90, 42, 68,156,189,138, 60, 79,190, 86,252, 90,173, 22, 21, 21, 21,112,134,136,131,182,172, 43,169, 74, 32, 8, 27, 8, 42,234,
+ 51, 10, 0,168,174,203,168,212,212, 84,159, 94, 15, 87,172,171,171,171, 13,158,196, 95,171,213, 34, 43, 43, 75,144,248, 59,127,
+ 35, 49, 49, 81,149,152,152, 24, 16, 31, 43,246,236,223, 85,127, 69, 11,241, 95, 54, 67,129,213,121, 22, 94,247,106,203, 58, 37,
+ 25, 26, 39,129,201, 76,240,210,147, 10, 28, 60, 65,195,108, 34,104,180, 2,170, 17, 39,112,226,103, 59, 18, 18, 18, 8, 95, 35,
+ 64,251,151,219, 73,249, 15,245,136,232, 44, 71,175,222, 74,116,239,217, 31,103,203,173,232,123,135, 13, 33,138,106, 20,111,191,
+130, 71, 31,125,148,124,249,229,151,237,213,224,133,118,141,142, 94,252,207,131,255,165,212,131, 6, 44, 2,240, 6,128,166, 64,
+248,162,187, 70, 47,222,242,239,131,212,184, 17,131, 2,226,163, 40, 74,222,171, 87,239,197,123, 12,223, 80,163,134, 15,113,203,
+213, 14,226, 15, 0,205,203, 15,234,245,122, 67, 74, 74, 10,242,242,242, 12,238,222,215, 67,135, 14,145,215, 94,123, 13, 59,119,
+238,244, 90,191, 27, 54,108,120, 88, 46,151, 15,149,203,229, 11,229,114,121,248,185,115,231, 48, 96,192, 0, 72,165, 82, 68, 68,
+ 68,224,244,233,211, 80, 42,149,178, 67,135, 14, 69, 30, 56,112,224,155,231,158,123,174, 47,128,179, 0,228,112,116, 15,120,108,
+248,184,237, 31,183,221, 98,203, 41,138, 2,197,195,107,217,177, 99,135, 71, 14,110,185,183,246,214, 19,242,243,243, 3, 58,190,
+ 45,177, 96,193,130, 36,231,172,148, 34,218, 73,244,253,141, 0,240, 18,127,190,208,106,181, 62,247,225, 35, 92,158,196,127,213,
+170, 85,200,204,204,116, 53, 58,252, 18, 6,114, 56,129, 32,122, 32,168,184,207, 40,174,199,159,155,155, 75, 1, 0,251,215, 83,
+159,139,171, 88,123, 19,127,103,100,192,167,215,174,215,235, 13,174, 30, 62, 91,198,189,199, 66,249,188,121,248,203,102,240, 95,
+ 41, 46,111, 93, 39, 50,224, 54, 9,194, 66, 41,220, 22, 35,197,149,107, 12,108,180, 20, 53,181, 4,117, 70,130,211,191, 50,128,
+ 4,232, 22,126,140,189, 63, 94, 27,133,229,127, 30,148, 52,176, 95, 60, 14, 92,188,132,184,216,238, 24, 58, 44, 30,210,208,174,
+184, 45,238, 26,174,153, 45,168,190,104,199,175,151, 44, 8,151, 85,240,226,107, 35, 60,241,228,210,165,242,138,222, 49, 8, 77,
+ 24, 37,177,124,243,159, 39, 0,108,244,131,231, 18,203, 55,103,209, 18,249,175,242, 94, 80, 14,188, 75, 82,127,124,159,191,124,
+ 0,240,196,115,139, 95,148, 35, 52, 2,113,131,134, 72,126,250,241,251, 64,184,130, 86,165,131,118, 0, 0, 30,239, 73, 68, 65,
+ 84, 9,134,227,253, 67,161, 80,168, 0, 24, 92,235,240,240,225,195,188,196, 31, 0, 66, 66, 66, 34, 21, 10,197,220, 43, 87,174,
+132, 15, 28, 56, 16, 35, 71,142,132, 76, 38,195,187,239,190, 11,187,221,142, 59,239,188, 19,219,182,109,195,161, 67,135,112,236,
+216, 49, 72,165,210,247,117, 58,221,148, 15, 62,248,192,155, 87,221,220,206, 5, 35, 98,169,211,233, 84,189,122,245, 50, 16, 66,
+188, 30,115,241,226, 69, 85,122,122,186,160, 27,202,114,251,123, 60, 43,212,167, 78,157,242,218,110, 12, 30, 60, 88, 37, 84,204,
+ 79,157, 58,101,152, 53,107, 22,186,116,233,162, 18, 13,129,142, 9,153, 39,143,221,151,167,222, 81, 80, 81, 81,129,204,204, 76,
+127, 13, 8,143, 72, 77, 77, 37, 84, 76, 46,149,154, 26, 71,244,217,163,129,205,247, 19, 74,249,130,207, 55,222,157, 88,187,138,
+178,183,110, 1, 79,224, 26, 20, 7, 15, 30, 52, 36, 38, 38,182, 8,253, 11,229,251,116,169,210, 99,227,246,196, 26, 19,111,158,
+ 15, 62,248, 32, 41, 84,186, 20, 18, 9, 16, 30, 6,212,214, 51,104, 34, 4,157,194, 40, 88, 24,192,220, 68,112, 75,119, 9, 24,
+ 26, 40, 59,103, 71, 69, 69,133,193,155,113,182,120,209,184,164,184,219,194, 13,114, 57,193, 51,115,239,129,221, 78,112,177,218,
+138,202,243,181, 64,200, 57,132, 69, 53,225, 66,245, 47,144,200,235,112,242,100, 45,186, 68,121,231,107, 59,247,191,235, 43,143,
+255,241,143,161,127, 97,128,168,204, 63, 43, 47, 29, 61,178,130,169,175,247, 71,100, 9, 0, 40,186,116,125,229, 15,179,255, 24,
+186,230,140, 29,183,204,212, 42,127,170, 56,182,194,222,216,138,143, 2,143,126,247,206, 93, 34, 95,121, 98,246,147,161,199, 42,
+175, 97,242,172, 52,229, 63,254,154,177,194,220,104,242,117,110,189,133, 68,242,188,148,123,171, 11, 59,251,142, 76,154, 52, 9,
+172,232,155,205,230,230, 58,100, 61,255,130,130, 2, 94,117, 26, 26, 26,122,159,201,100,186,125,240,224,193, 80,169, 84,200,200,
+200,192,211, 79, 63, 13, 0,176,217,108,216,188,121, 51, 74, 75, 75,241,253,247,223, 99,235,214,173, 48,155,205,253, 25,134, 81,
+251,240,216,131,250, 60,237,218,181,139, 87,215, 28, 69, 81,130,159,101, 46,183, 63,199, 59,223,225,146, 89,179,102,161,170,170,
+202,237,246,152,152, 24,248, 43,224, 85, 85, 85,168,170,170, 18, 13,129, 27, 12,110,184,223, 91, 52, 64, 38,212, 99, 15,182,208,
+ 6, 10,103,216,223,111,144, 4, 16,244, 6,168,157,142, 23,135, 26, 85, 74,165,166,198, 53, 55,106,185,185,185, 20,178, 71, 19,
+215, 72, 0, 95,177,174,174,174,110, 33,206,254,136, 53, 95,112,140, 14,159, 34,193, 39, 92,200, 9,255,187,221,249,195, 15, 63,
+ 36,151, 79,188,136,222, 3,165, 48,153,175,239, 98,182, 19, 88,172,128,205, 89,102,163, 9,136,196,241,253,199, 99,165,208,104,
+ 52, 73,101,101,101,110,255,103, 68, 68,157,193,100,150,160, 91,215, 72,212, 94,109, 68,109, 93, 45, 14, 30,190,136,243,151, 8,
+228,157, 26,209,167,191, 17,230,198, 43, 24, 48,204,134,190,131,155,176,245,163, 82, 76,155, 54, 45,233,204,153, 51, 55,234,145,
+147, 0, 24, 59,105, 70,106,207,170, 46, 81, 40,167,129,176,177,227, 33,137,138,238,198,212,215,143, 7,176,135, 35,132, 33,224,
+244,123,123,106,247, 1,140, 75,153, 54,163,231,101, 73, 23,156, 53,218, 16,121,215, 88,200, 34,162,186,217, 27, 91,240,241,170,
+ 87, 0, 19,166, 78,155,222,147, 72, 67, 81,103,106,194,208,132,123,161,236,220,165,155,185,209,228,202, 37,212, 0, 8, 10, 88,
+239,159,162, 40, 76,154, 52,137, 0,192,206,157, 59,161,209,104,146,180, 90,173, 65,136,248,235,116,186,208,218,218,218, 57, 54,
+155, 77, 18, 30, 30,142, 7, 31,124, 16,107,214,172, 65, 72, 72, 8,210,211,211,145,147,147,131,210,210, 82, 28, 60,120, 16,123,
+247,238,197,143, 63,254,136,110,221,186,117,163,105,250, 54,120, 8,255,115, 67,160,190,186, 0, 36, 18, 9,175,243,108,203, 46,
+128, 29, 59,118, 4,165, 11,160, 75,151, 46,170,170,170, 42,131,167,109,129,214,187,104, 8,220, 60, 17,128,155, 9,158, 60, 34,
+193, 86,112,106,106, 42,209,103,158, 1,164,114, 32, 50, 4,136,236, 11, 42,215, 73,198,179,239,191, 13, 64,184, 94, 63, 0,112,
+ 61,127, 55,141, 43, 18, 19, 19, 85, 94,146, 1, 5, 95,195,191,150,116,242, 24, 17,136,168,207,192, 47, 86,130,139, 87, 24, 0,
+ 18, 40,195, 29, 33, 78, 27, 77, 96,105, 2, 44, 86,192,210, 4, 88,109,128,197, 12, 88,155,174, 71, 73,220, 37,164,252,235,189,
+ 78,164,248, 96, 3,110,141, 83,130,132,200,112,197,108,134,225,235,115, 56,121,250, 60,174, 94, 53, 98, 72,130, 29, 38, 11, 13,
+ 75,147, 29,230, 70, 6, 23, 43, 1,179, 9,216,190,125,187, 65,200, 2, 24, 1,130,145, 70, 70,190,242,212,203, 47, 43,182,114,
+ 36, 36,234,229, 63, 43,175,102, 46, 89, 97,175,173,221,195,185,215, 86, 62,117, 44, 83, 70,190,242,244,139,153,138,194,243,246,
+230,194, 91, 30,207, 84,158,221,240,242, 10,218, 88,187, 71, 72, 20, 32, 92, 25,177, 98,209, 75, 75, 20,229, 85,215, 87,139, 76,
+153,149,166,220,146,189,118, 69,163,177, 97, 79,128,239,154,187,103, 73,200,187, 70, 88,239, 95,161, 80,168,244,122,125, 9, 59,
+100,212,108, 54, 27, 70,141, 26, 37,132,139, 6,208, 31, 0, 51, 98,196, 8, 70,161, 80, 72,114,114,114, 48,111,222, 60,188,245,
+214, 91, 32,132,224,187,239,190,195,215, 95,127,141, 99,199,142,161,174,174, 14, 3, 6, 12, 64,125,125,125,184, 68, 34,233,225,
+139,124,234,212,169, 30, 5,213, 87,215,128, 27, 67,165, 67,119, 1,120,139, 2, 4,226,253,139,134,128,104, 0,180,137, 40,106,
+ 52, 26, 21,167,207,208,181, 65,164,184,222,134, 51, 36,239, 87, 72,143, 21,253,220,220, 92, 74,159, 61, 26,144,203, 65,229,230,
+222,208,139,101,179,254,245,122, 61,165,209,104,136,175,104,136,107,110,128, 16, 65,119, 7,111,251,206,121,217,132,152,158, 18,
+204, 74,145,195,210, 4,116,137,160, 32,161,156, 94, 63, 8, 44,141,128,201, 74, 96, 50, 19,152, 44, 4, 12, 1, 36, 94,114,174,
+231, 44, 54,225,206,225, 21,232,117,251, 85,124, 85, 88,141,171, 87, 45, 24,113,111, 61,134,117, 53, 2, 33, 77,176, 52, 50,168,
+ 62, 79, 96, 50, 81,160,105, 10, 93,187, 81,192,141,207,101, 27, 50,114,248,240, 81, 81,177,177,216,127, 93,175,161,156, 53, 27,
+ 87,181, 25, 9, 0,238, 0,112, 82, 0,223,224,145,195,135,143,138,142,137,197,225,255, 54,231,200,161,187,234, 15, 56,251, 81,
+166, 59,190, 48, 0,141, 30,184,238, 24, 57,124,196,168,152,152, 91,112,242,251,235, 17,145, 49,143, 36,227, 51,221, 26,127,206,
+173,205, 12, 90,246,253,117,205,223, 72, 73, 73,105,149,127,228, 38, 23,128,173,244,254, 0,142, 44, 91,182,236, 62,153, 76,166,
+252,228,147, 79,176,105,211, 38, 60,245,212, 83, 88,181,106, 21, 40,138,194, 47,191,252, 2,179,217, 12,173, 86, 11,154,166,241,
+236,179,207, 50, 20, 69,249,124, 1,130,153, 77,223,209,187, 0,188, 69, 1,130,225,253,139, 16, 13,128,160,194, 77, 63, 50,229,
+101, 63,254, 46,206, 40, 71,134,122,106,106, 31, 2,148, 65,255,238, 25, 32,108, 96,115, 36,128, 53, 10,248,116, 3, 4, 11,172,
+ 55,175,209,104, 8,215,251,103, 35, 2,220,223, 26,141, 6,156,201,114,136, 80, 65,119, 5,103, 20,128, 91, 62,218, 14,152, 26,
+ 9,154,172,142,100,191, 38, 43,129, 44,244,250, 54, 75, 35, 96,182, 17,212, 92, 37,184,124,141,224,251,147, 52, 24, 6,208,104,
+ 52,170,178,178,178, 86,117, 67,211, 64,213, 57, 43,206,149, 95,195,190, 3,215, 64, 8,133,147,255, 99, 48,105, 22, 13,185,140,
+224,242, 37, 96,223, 30,160,190,158,128, 48,192,253, 15, 83, 80, 40, 0,181,122, 10,206,158, 61,203,235,154,212,247,130, 20, 30,
+240,191,145,148, 40, 59,191,252,204,170,172,144,124, 34,105,113, 67,186,133,134, 34,228,249,197, 33,191,172, 95,183,220, 90, 95,
+ 63,155, 47,159, 52, 76,185,124,193,138, 85, 33,123,170, 72, 11,190,232, 78,161, 24, 58,243,185,144,147,159,191,187,220,106, 50,
+114,249,204,158,184, 20, 97,157,150,103,190,178, 50,228,204,197,186, 22, 92,157, 35, 58, 97,218,172,167, 66,242, 63,221,184,220,
+100, 50,205,110,231,215,151,218,185,115,103,171,178, 87, 95,125,149,236,220,185, 19, 5, 5, 5,188,171, 2,192,113, 0, 71,214,
+174, 93, 59, 60, 50, 50, 82, 9, 56,194,224, 27, 55,110,196,188,121,243,176,105,211,166,102, 79,125,237,218,181,168,173,173, 69,
+125,125,189,177,177,177,177,194, 25, 65,144,123, 13,245, 48, 76,139,124, 40,214,131, 39,132,240, 14,255, 3, 55, 71, 23,128,187,
+ 40, 64,176,189,127,150, 83,244,252, 69, 3, 32, 32,148,150,150,250,204,254,118,110,231, 71, 24,218, 9,250,190,255, 1,222,139,
+ 35,136,235, 4,244,107, 2, 53,168,128,194,187, 9,205,125,255,129,116, 3,184, 14, 5,244, 52, 52,208, 93, 99,201,182, 23,172,
+248,187, 38, 0, 58,189,168,230, 50, 31, 17, 0,202,213, 19, 11,180, 49,191,255,161,201, 73,231, 47, 20, 26,152,238, 12, 36, 50,
+ 32,196,217, 46,218, 24, 2,154, 6, 26, 26, 8,172, 54,128,182, 57,140,130, 41, 83, 29,209, 27, 15, 33,123, 42,241,222,201, 73,
+ 77, 87,118, 27,134, 12, 97,240,205,215,118, 80, 18,224,242, 69, 10,138, 48,224,235, 47, 1,171,153, 2, 69,128, 97,119,133,160,
+170,146,193, 67, 15, 37, 35, 63, 63,159,215,178,214,234,123, 65, 86, 63,231,184,126,127,141, 0,194,216, 39,216,163,187, 73, 10,
+153,235, 42,212, 19, 64, 47, 10, 48, 39, 36,200,206,208,246, 9,130,248, 8, 51, 1, 17, 93, 37,134,139,246,102,190,238, 10,160,
+155,130, 66,248,157, 9,178, 19, 91,152, 9,158,188,104,119, 92,157, 34, 34, 37,103, 47,213, 58,133, 5,136, 8, 11, 69, 68,184,
+ 28,119,141, 24, 41,219,254, 79, 50,161,157, 95, 93,183,247,156,205,250,231,238,195, 70,239,102,204,152,161,202,203,203,243,196,
+103, 4,112,230,135, 31,126, 48, 62,240,192, 3,221,193, 25,211,191,113,227,198,102, 65,180,217,108,176,219,237, 40, 43, 43, 67,
+247,238,221,175, 48, 12,195,203, 90,156, 58,117,170, 39, 79, 93,208, 69,223, 12, 93, 0,238,162, 0,193,244,254, 69,225,255, 13,
+ 26, 0,206, 49,251, 55, 52, 3,155,245,114,245,122, 61,235,241, 82,110,246, 33,172,248,115,188, 98, 65,224,142, 2, 96,203,132,
+122,254,174, 9,128, 78, 52,151,101,100,100, 24,156,221, 25,188,248,184,226,239, 46, 39, 64, 40,159, 47,172,206,179,192, 23, 95,
+126,126,126, 73,116, 36,133, 71, 18, 67,192, 0,176, 89, 25,132,202, 29,183,169,193, 68,208,100, 35,160,237, 64,233,113, 59,236,
+ 12,129,175, 33,123,249,249,249, 37, 61,187, 83,120, 40, 73,138,105, 79, 72, 97,108, 32,104,168, 3, 76, 13, 20,226, 6, 16,216,
+109, 20,100, 18, 5,106,175, 50,168,250,213,138,178,255,241, 75, 24, 83,223, 11,178,110, 49, 48, 48, 22, 88,255, 18,176,240,109,
+255,140, 0,210,104,154,254,124,194,200,221,189,242,119, 43,163,198,220,143,158, 0,122, 82,128,125,255, 62, 20,207,153,109,180,
+ 53,154,166, 9,225, 99, 44,141,211,158, 25, 59,170,112,240,107, 95, 40,123, 12,187, 15,221, 66, 41,116, 87, 80, 48,159,250, 22,
+ 59,254, 50,215,104, 51, 55,242,230,107,178,152,167, 77,124,228,129,194,140, 55,223, 87,222, 49, 60, 1, 17,225,114, 68,132,133,
+162,252,228, 17,188,162, 93,100, 52, 11,224,242, 87,204,125, 93,174, 59,241, 95,185,114,101,171, 48,127,110,110, 46, 59, 79, 64,
+137, 7,239, 31,112,228, 88, 28, 25, 52,104, 80,185,197, 98,233, 35,149, 74, 21,225,225,225, 0,128,188,188, 60,204,152, 49, 3,
+102,179, 25, 22,139, 5, 77, 77, 77, 80, 42,149, 22,187,221,158, 79, 8,185,200,211,187, 14, 74,219,118,179,116, 1,112,163, 0,
+236,119, 81,248, 69, 3,224,134,137, 63, 31, 78,167,224, 19,231,119, 0, 32,220, 97,137,165,165,165, 45, 4,223,157,129,208, 10,
+ 82, 10,144, 75,128, 48, 41,160,148, 1, 77, 13,208,191, 21, 2,172,123,154, 32,172, 43, 16,214, 85,112,223,191, 7,241,135, 27,
+177,230,245, 98,184,138,191,107, 78,128, 80, 62, 1,226,239,147,175,166,150, 80,187, 74,108, 68,161, 0, 24, 6,184,115,144,244,
+122,125,252,104,135,205, 78, 96,103,164,152, 62,125, 58, 47,227,228,210,101, 66, 21,126,105, 39, 52, 13, 88,109, 4,118, 26,144,
+ 80, 64, 82, 50,208, 80, 75,225,127, 71,205, 48, 91, 36,152,156, 50, 29,219,182,109,227, 37,254, 43,159, 6,250,223,226,248,221,
+175, 15, 16, 64, 36,224, 32,211,208,160,190, 56,101, 98, 97,236,142,221,202,216, 49,247,195,182,127, 31,182,165, 76, 52, 90, 27,
+ 26,212, 0,246, 9,228,219,103, 55, 55,168, 79,189, 58,181, 48,230,111,249,202, 62,119,143,129,233,212,126,252,235,249, 41,198,
+166, 70,193,124,251, 44,230, 70,245,218, 63,255,169,240,175,127,223,160, 76,188,247, 62,156, 62,113, 4,139,210,102, 27, 27,141,
+ 70,127,206,173, 77,225,101,178, 31,146,156,156,204,103, 52,128, 52, 50, 50,242,136,217,108,254,103, 69, 69, 69,223,225,195,135,
+199,211, 52, 45, 11, 9, 9, 65,126,126, 62,198,141, 27, 7,139,197,130,198,198, 70,148,149,149,213, 71, 69, 69,253,219,108, 54,
+127,194, 48,140, 9, 60,103, 0,228, 38, 36, 8, 13,253,115, 12,137, 86,145,131,142,216, 5,192,141, 2, 4,131,199,159,185, 3,
+ 68,220, 4, 6, 64,123,120,254,110,188, 15,226,114, 62,193,242, 82, 60, 70, 4,248, 70, 0,130, 45,254,172,177,227, 18,222, 39,
+220, 50,161,124,190,114, 1,132,242,153, 44,132, 50, 89, 64, 36, 18, 96, 95,169,163,175,159, 77,248,115,244,251, 79, 23,196,215,
+208, 64, 40,202,217,205, 78, 73, 28, 28,255,253, 15, 96, 50, 50, 32, 12, 48,121,114, 50,182,109,219,230,179, 62,212,247,130,104,
+103, 3,145, 74,160,234, 10, 16, 22, 10, 48, 4,232,164, 0,222, 76,247,219, 8,216,199, 52, 52,168, 75, 39, 79, 44,236,178,242,
+117,101,201,202, 87,140, 77,254,137,127, 11, 35,160,100,217,148,194,176,231, 95, 85, 22,253,227, 53,127,196,191,153,139,182, 89,
+ 39,190,242,194, 51,187, 23,102,104,149,239,191,147,101,108, 52, 26,213,132,144,163, 46, 2, 36,163, 40,138, 22, 26, 0, 9,102,
+ 84,192,157,248, 83, 20, 69,146,147,147, 1, 0,147, 38, 77, 34, 20, 69,121, 51, 4,148, 86,171,213, 40,145, 72,138, 99, 98, 98,
+110,105,104,104,120,238,240,225,195,189, 71,142, 28,201,208, 52,221, 88, 87, 87,119,233,232,209,163,191,196,197,197,149, 71, 71,
+ 71, 87,152,205,230, 60,154,166, 47,165,165,165,153, 70,140, 24,193,203, 0, 96, 39, 5, 10, 4, 58,157,142,183,160,250,211, 5,
+ 16,200,241,158,162, 0,193,104, 51, 69,241,191, 73, 13, 0, 30, 99,253, 5,189,232, 2,230, 14, 16,194, 75,113,178,252,253, 22,
+ 47,170, 20, 84,106,220,163, 4, 63, 3,248,217,117,107,157,243, 35,108,140,185,243,122, 13,193, 18, 87,151,251, 66,216,121, 6,
+156, 9,130, 20, 39, 26,226, 23,223,191,150,116,226, 26, 5,254,240, 53,243,206,152,113,189, 78,216,132, 63,189, 94, 95,226, 15,
+ 31, 97, 90,214,177,177, 30, 72, 78, 78,198,174, 93,187, 40,214,171,226, 85, 31,255, 12,234, 59,211, 5,192, 21, 0,251,108, 13,
+ 13,234,175, 87,190,154,211,212,208, 48,199, 41,214,131, 0,252,228,175, 17, 96,109,108, 80,239,121,255,181, 28, 75, 99,195, 92,
+ 0,251,225, 88, 39,192, 40,148,136,166,233,111,104,218,168,126,127,221,234, 28,163,209, 56, 7,192, 62,215,190,103, 63,196, 63,
+ 24,144,114,127,184,138, 63,155,183,195, 77, 18, 76, 73, 73,241,198, 87,105,181, 90, 67, 9, 33, 13, 12,195,232,172, 86,235,119,
+177,177,177,221,106,107,107,169, 21, 43, 86,212,215,213,213,213,244,233,211,167,193,104, 52,154,172, 86,107,189,205,102,107,154,
+ 63,127,190, 89,160,135, 29,176, 19,145,158,158,222,102, 66,216,150,220, 34,126,159, 6, 64,176, 61,251, 54,139, 20, 56, 69,148,
+114,231, 45, 11, 65,144,179,250,249,204, 22, 24,208, 63, 16,178,232, 79, 48,162, 1,126,212,137,199,223,129,242,237,218,181, 75,
+ 80, 93, 5,146,241,239, 1, 87,184,162,109,105,168,239,199,249,253, 83,128,220,251,204,198, 6, 46,159, 49, 16, 46, 99, 67, 11,
+174,142,240, 46, 83, 0,144,157,157, 77, 36, 18, 9,216, 15, 55,132,173, 86,171,193, 48, 12, 24,134, 65, 90, 90, 26,229, 99, 84,
+ 0, 69,211,116, 56, 33,196,206, 48, 76,147,205,102,251,143, 84, 42,165, 36, 18, 73, 40,128, 80,134, 97, 96,183,219,165, 52, 77,
+203,105,154,238, 61,127,254,252, 83,156, 99,219,124, 17, 32, 17, 34, 58, 2,188,205,145, 66,249,187,142,176, 8, 17, 34, 68,116,
+ 0, 52,114, 4,157,225, 56, 54, 50, 78,249, 5, 56, 34, 55, 10, 81,248, 69,136,240, 30, 1, 16, 33, 66,132,136,155, 5, 10,167,
+ 17,192,112,132, 95,130,235, 43, 15,202,112,125,154, 99, 70,188, 93, 34, 68,136, 6,128, 8, 17, 34,126, 27,144,192,145, 43,193,
+130, 21,126, 57, 71,244, 25,231,126,162,247, 47, 66,132,104, 0,136, 16, 33,226,119,210,166,137,162, 47, 66,132, 23,235, 89,132,
+ 8, 17, 34, 68,136, 16,241,123,182,150,143, 28, 57,194, 93, 72,135,184, 76,162, 67,208,114,161,157, 74,189, 94, 31,203,254,118,
+151, 76,200,229, 19,138,223, 34,159,155, 97,139,148,120,255,196,250,184, 89,248, 98, 99, 99,155,247,169,172,172,164,132,242, 45,
+ 88,176, 0,233,233,233,148,248,252,249,199, 41,190,191, 34,159, 16, 62,193, 6,128, 64,116,231,185, 31,209,104, 52,130,103,150,
+242,180, 94, 60, 90, 79, 70,226,110, 53, 64,119,251,220,112,176, 2,227, 28, 11,111,208,235,245,205,179,117, 9,157, 79,188,173,
+144,146,146,146, 84, 80, 80,208, 44,130,201,201,201,170, 93,187,118,149,252, 22,173, 93,119,245,113,234,148, 99,100,216,224,193,
+131,219,251,244,200,148,169,233,200,255, 66,231,246,153,157, 50, 53,157, 56,183,121,124,112,166, 76, 77,247,218, 8,228,127,161,
+243,251,161,139,141,141, 37, 41, 41,215, 71, 21, 22, 20,128,248, 50, 2,124, 97,205,218, 53, 73, 59,246,236, 64,252,144,120, 3,
+ 40,224,212, 15, 39, 85,247,142,184, 15,235,222, 94, 39,232,249,155, 51,103, 78,171,235,206,201,201,161, 32, 66,132,136, 54, 51,
+ 0,228,124,119, 76, 76, 76, 20, 76,238,197, 0,112, 43,162,174, 11,109, 8, 16, 90,127, 44, 39, 62,141, 11,209,235,245,208,106,
+181,200,202,202, 50,120,153,166,147,207,255,111,177, 79,159,184, 91, 1, 0,151, 44, 22,208,230, 38, 71, 97,109, 61, 43,114,252,
+166, 63,110,110,200, 11, 90,204, 41,224,156, 91, 92,208, 26,239, 18,202, 49,187, 30,251, 23,240,249,189, 61, 26,231, 22,245,193,
+ 10,127, 0,245, 17,204,107, 32, 83,166,166, 99,162,250, 46, 11,144,174,112, 10,189, 95,255,131, 99, 64, 4, 29, 86,171, 22, 69,
+ 69,105,152, 48, 33, 27, 41, 41, 89, 40, 40,112,220, 43,127, 12,129, 39, 23, 61, 73,106,187, 94,197, 59,186, 53,136, 10,143, 2,
+ 67,219, 97, 33, 77,134, 47,191,219, 51, 97,166,253, 49,114, 95,252, 24,213,226,197,139,125, 26, 2,115,230,204, 33, 11, 22, 44,
+112,123, 79, 69, 35, 64,196,239, 25, 71,142, 28,113,141, 18,180,218, 39,144, 28, 0, 65,199,186, 46, 95, 27, 44,124,168,211, 37,
+ 5,220,250, 18,194,251,195,151, 82,171,213,130, 16,130, 85,171, 86,121, 59,142, 8,158,191, 59,178, 51,142, 85,108, 65, 89,197,
+ 62, 92,171,250, 59,202,255,150,134,109,207,206,104,215, 7,237,216,143,199,155, 69,254,248,113,199,119,224,250,119,110, 57, 67,
+120,215, 9, 47, 8,169,143, 83,167, 78, 97,238,220,185,240, 42,254, 60, 12,198, 71, 30, 41,244,215,112,244,136,137,234,187, 26,
+211,210,210, 20, 19,213,119,249, 45,236, 78, 15,223,219,199,111,239, 31, 0,102,204,112,172,202, 55, 99, 70, 30, 10, 10,202,145,
+146,210, 15, 41, 41,253, 90,116, 13,248,124, 95, 63,252, 48,105,230,139,143,145,103,158,159,135,229, 83,151,225,174,216,187,209,
+183,115, 95,244,141,234,139, 33, 61,238,196,243, 99,255, 84,244,242, 75,153, 56, 80,189,223,240,206, 59,239,240,122,183,175, 92,
+185,210,226,115,207, 96, 51, 54, 47,254, 22, 51,103,206, 36,220, 79, 32,245,163, 86,171,131, 90,223,193,230,107, 75, 44, 88,176,
+ 32, 41, 24, 28, 65,224,137, 6,144, 0,224,101, 0,235, 0, 20, 1,200, 2,240, 87,231,231,118, 81,246,221,139,191,167,178, 22,
+ 17, 0,173, 86, 75, 42, 42, 42, 0, 0,241,241,241,224, 46, 54,163,215,235, 91,252,118,221,238,205, 99,175,174,174, 54,232,245,
+122,222,145, 0, 95,198, 2,215,171,127,214, 57, 21,166,155,169, 78, 5,221,176,236,236,108,159,251, 20, 23, 23,243, 18, 27,141,
+ 70,131, 85,171, 86,185,221,152,153,153,137,172,172, 44,104,181, 90,143,251,184, 67,159,184, 91,113,254, 90, 29,182, 61, 59, 3,
+209,212, 24,148,127,180, 4,241,211,226,241, 85,121, 13,166,175,218,212,174, 15,219,176, 59,135, 54,127, 31, 58,116,104,139,114,
+ 54, 50,192, 45, 15,182,103,239, 67,220,136, 70,163,193,220,185,115,221,110,220,188,121, 51,178,178,178,160, 30, 51, 18,133,223,
+254, 0, 68,116, 2,234,141, 55,252, 30,238, 46,252, 62, 28,200,198,238,194,239,131,194,119,233,111,209, 94, 5,166,231,210, 26,
+ 94, 47, 8, 55,244,159,150, 86,132,148,148,126,205,127, 89,164,164,244,227,221, 37,240,209,103, 31,225,173,247,222,192, 3, 3,
+146, 96,111,106, 2,109,167, 65,201, 40, 0, 82, 16, 48,184,116,185, 10,131,187,223,142,229,207, 46,199, 27,171,223,224, 21,141,
+114,109,216,146, 99, 54, 3, 0,182,110,221,218,226,216,153, 51,103, 18,215, 50,190, 98,189,123, 69, 33, 38, 66, 77, 10, 11, 11,
+ 3,142, 42,168,213,106,178,122,245,106, 0, 8, 10, 95, 91, 10,127, 93, 93, 29, 27, 45, 11,232, 60,235,234,234,216, 54,221, 95,
+ 30, 37,128, 63, 0,248, 1,192, 39, 0,198, 1,120, 20,192,159,224, 88, 21, 18,104, 57, 75,167, 8, 0,105, 90,135,198,100,103,
+101,250,246,226,179,178,178, 40,189, 94, 79,233,245,122,170,162,162, 2,236,119, 54,164,204,253,237,110,187, 39,176, 70, 69, 70,
+ 70,134,161,186,186,218,224,206, 64,224,254,246, 49, 85,174, 59,175,198,219,239, 27,254,130,125,254,249,231,110,133,159,162,168,
+ 86,226,159,153,153,201,139,243,215,138, 74, 24, 55, 46,198,244, 15,243,208, 39,238, 86,244,140, 14, 67,197,246, 10,135,248, 71,
+118,118,236, 20, 34, 21,124,174, 41, 41, 41, 42,111,191,249,128, 33,192, 45,225,192,142,116,160, 71, 40, 48, 36,234,122,216, 63,
+182, 19,240, 69,218,245,114,161,160, 40,202,237, 71, 8, 94,127,253,117,183,194, 63,120,240, 96,100,101,101, 97,245,220, 73, 56,
+ 94,126, 14,189,226,123, 3,166, 70, 62,222, 63,120, 70, 1,120,123,121,249, 95,232,176,187,240,123,183,158, 62,167,111, 95,208,
+133,175,254,148,120,252,248, 3, 86,244,217,191,214,148,254,130,142,111, 52, 55, 98,204,204,251, 12,137,189,239, 65,147,201, 4,
+ 72,165,144,201,100,144, 74,165,144, 74,101, 56,115,230, 12,182,109,207, 63,111,177, 53,162,111,104, 44, 70, 62, 52, 98,236,188,
+103,230, 9,246, 26,223,220, 61, 23,227,181,113,173,202,183,110,221, 74, 9,141, 4,176,226,143,190,239, 96,247,138,194,128, 61,
+119,181, 90, 77,214,173, 91,135,161, 67,135, 98,253,250,245, 29, 50, 18,176, 96,193,130,164, 89,179,102,145, 83,167, 78, 25,170,
+170,170,130,194, 87, 85, 85,133,170,170,170, 64,162, 9, 42, 0, 15, 1, 56, 10,224, 60,128, 94,112, 76,189,125, 22,192, 57,231,
+199, 12, 17,205, 6, 49, 43,254,220,239,174,198,242, 13,153, 7,128,211,247,138,138,138, 10,244,232,209,163,149,129,192,150,185,
+ 51, 16,120, 54,174,126, 39,255, 61,246,216, 99,109,118,237, 92,177,114,231,245, 59, 23, 14,162,124,137,133, 25,149, 48, 78,187,
+ 7, 36, 98, 9, 48,118, 5,140,248, 12,248,216,225, 45, 18,253, 18,132,252,113, 61,104, 90,248, 68,103, 5, 5, 5, 37,220,251,
+228, 99,238,117,247, 17,158,141,192,107, 31, 2,183,222, 2, 92,218, 41, 71,206, 6, 43,230,110,241, 92, 46,200,189, 39,193,109,
+ 31,185,201,126, 23,190, 88,133,136, 33, 10, 40, 7,188,128,207, 87,205,199,240,161,189, 48,104,210, 27,188,234,131,207,169, 63,
+242, 72, 33,246,238, 85,243,233,203,167, 0, 16, 23,241,167,216,196, 63,127,250,245,249,122,248,124,224, 73,232,139, 92, 34, 1,
+190,112,161,250, 2,198,107,198, 35,162,115, 20,236, 20,141,111,190,254, 15, 26,140, 70,164, 76,158,140,203,213,213,200,205,219,
+134,167,159,154,219, 39, 84, 17, 10, 9, 9,193,132,187, 38, 20,255,100, 88,239,151,215,120,237,218,181,128,175,155, 43,254, 0,
+156, 70,192,139,126, 71, 2,212,106, 53, 89,185,114, 37,250,247,119,220,207,126,253,250,161, 35, 69, 2, 92, 60,254,160,129,227,
+253,179,223,253,185,214, 59,156,239,100, 8,128,112, 0, 67, 0,156, 4,208, 7, 64, 61,128, 90, 4,185, 91,238,247,128, 27, 54,
+ 17, 80,143, 30, 61, 84, 26,141,166, 85, 87,128,115,109,123, 0,104, 94,239, 94,168, 56,248,153,252,199, 55,226,224, 55, 88,239,
+222, 83,184,159,175,247, 15, 0, 95,190,188, 18, 41,111,189, 13,122,236, 24,200, 0, 40, 15,156,198, 87,229, 53, 0, 0,122,236,
+ 66,216,126,236, 6,170,251,159, 4,139,148, 23, 65,226,141,154,169,159, 97,225, 83,231,240,243,179,203, 96,218,107, 69,175,110,
+222,203,253, 53,160, 2, 53, 14, 54,111,222,236,176,134, 83, 30,196,193,170,106, 68, 12,143,192,249,162,114, 64, 17,138, 25, 11,
+255,136,174,183, 76,106,207,119,209, 83,214,191, 95,117,226, 37,138,224, 46,250,224,149,187, 40,173, 8, 19,178, 39, 96, 70, 30,
+144, 86,228,248, 94,148, 86,212,108, 28,200, 11, 78,243, 58, 7,163,165, 1,221,194,162, 65, 91, 26, 65, 36, 4,119,143, 30,141,
+237,219,183, 91,214,189,253,182,130, 33, 4, 79,204,126, 2, 93,163,187,162,209,104, 4,109,167, 17, 17,210, 25, 54,137,205,175,
+235,173,173,173,109, 49, 58, 64,104, 66, 96, 43,241,103,225,167, 17,160, 86,171,137, 86,171,197,232,209,163, 91,148, 15, 29, 58,
+ 20,111,190,249,102,187, 26, 1,109, 37,252, 44, 55,151,151,141, 2,248,177, 84,240,119, 0,142, 56,197,254, 81, 0,227, 1,148,
+ 1, 24, 6, 32, 31,192, 38, 0, 54,136, 8,200, 0, 32, 46,162, 72, 4,110,247,138,248,248,248,102,209, 79, 76, 76, 84,177,185,
+ 1,108,116, 32, 62, 62,222,192,118, 23,180, 87,195, 27, 76,248,234,235,231,120,255, 62, 49,253,195, 60,144,201,113,184,116,239,
+ 93,136,198, 24,132,205, 88, 15,250,194,101, 32,178, 51,100, 53,159, 97,231,186, 82, 64, 42,245,231,218, 3,182,154,143,190,244,
+ 7,140, 26, 1,196, 47, 60,142, 33,202,167,240,211,109, 26,224, 31,203, 60,150,183, 87, 4, 32, 43, 43, 11, 15,220, 61, 8, 99,
+199, 12, 68,202,157,203,176,118,221, 7, 56, 89,122, 30,207, 62, 60, 10, 23,243,119,163,238, 90,125,176,158,135, 22, 93, 5,206,
+ 40,128, 79,129,230, 10,126, 48,197,223, 3, 39, 47, 84, 86, 86, 82,177,177,177,196,153,255,215,108, 16, 0,192,132,236, 9,144,
+ 23,156, 70, 65, 65,121,243, 72, 0,239, 9,129, 20, 24,134,129,157, 1, 8, 67, 35, 52, 76,129,217, 79, 62,169,120,237,213, 87,
+209,179,103, 79,166, 79,175, 94, 18,139,201, 8, 59, 1, 8, 99, 7,195,248,142,104,229,228,228, 80,227,198,141, 35, 53, 53, 53,
+168,175,175,111, 97, 56,186,140, 14,224, 61, 42, 64,173, 86,147,181,243, 79, 0,138,254,192,197,247, 90,239,160,232,143,181,243,
+ 79, 0, 60,141, 0,181, 90, 77,166, 76,153,162, 26, 58,116,168,161,166,166,166,213,246,216,216, 88, 76,153, 50, 69,133, 14,158,
+ 19, 16,168,247, 31, 96, 20,128,107, 48,244,134,163, 43, 96, 26, 0, 19, 68, 4,205, 0, 16, 50, 17,144,187,237,110,161,209,104,
+220, 70, 1, 88,177,239,209,163,135, 74,171,213, 26,156,130, 8,141, 70,227, 53,169,208,155,119,232,199,248,250, 54, 25, 6,200,
+122,247,222,146, 1,133,160,252,111,105, 8,153,177, 30,230,170,159, 33, 59,176, 30,182,188,133,160, 38,174,193,142, 63,165,226,
+236,142, 51, 72, 89,253, 9, 32,107,159,153,157,151,233,129,162,213,219, 49,228,236, 4,224,138, 9, 75,199, 45,243, 90, 30,140,
+ 8,128,191,222,127,254,246,149,144,246,185, 3, 74, 12, 68,229,215,217,104,160, 8,254,251,243, 57,140, 61,126,158,215,233,236,
+221,171,246, 40,246, 0,224,220,238,118, 63,190,226,239,225, 25, 13, 72, 24, 2,153, 3,128, 69, 90,209,117,225, 7,208,202,243,
+103, 19, 6, 11, 10,202,221, 30, 31, 17, 22,129,170,186, 42,140,238,123, 15,204, 77, 22,192,108, 1,109,181, 97,185, 86, 11, 74,
+ 2, 73,163,201, 8,134,177,131,182, 19,132,202, 66,112,217,120, 25, 33,118,223,163,141,191,250,234,171,230,107,155, 51,103, 14,
+ 97,219,155, 43, 87,174,231,132, 93,184,112,129,247,117, 58, 68,216, 97, 4, 12,142,107,253,255, 79,157,177, 34,227,227, 33,224,
+ 43,214,206,253,200,232,209,163, 17, 27, 27,219,106,251,241,227,199,145,159,159,111,104, 47,241,119,122,227, 20, 27, 9, 8, 70,
+191,191, 59,239, 63, 8, 81, 0, 22,227,157, 6, 65,147, 40,225,193, 53, 0,218, 4,172,231, 15, 0,137,137,137, 42,189, 94,111,
+ 96, 67,255, 30,140, 3, 85, 89, 89,153,175, 92, 0, 42, 88,222,188, 16, 49,225,107, 96,176,222,191, 59,225,103, 13, 29, 33,231,
+123,180,188, 6,182, 31, 95,195, 37,124,139, 94, 19,215, 0,117,245, 40,207, 94,130,126, 11,222,193,197, 77, 75,128, 16, 25, 32,
+105,159,153,157, 43, 77,192,224, 30,211,120,151,183, 71, 4, 32, 43, 43,203, 56,115,236, 61, 23,186, 48, 81,183, 54, 34, 68,145,
+247,206, 66,188,191,243, 8,150, 62,122, 63,230,190,253, 41, 82,255,239,255,181,105, 52,200,219, 37,230,127,161,131,115, 18, 32,
+ 42, 80,227, 52,144, 80,191,183, 40, 64, 90, 81, 17,113, 39,254, 92,239,223, 23, 98,122,196,224,203,111,138,112,223,173,247, 33,
+188,147, 18, 12, 67, 32, 33, 52, 24,138, 2, 33, 4,118, 2,208, 12, 1, 77,211, 48,215,153,176,235,208, 46,200,237,114,193, 73,
+169,174,137, 78,127, 94, 56, 6,201, 49, 21,160,246,240,231,240,100, 4, 8, 21,127, 87, 35, 96,245,234,213,232,221,187,247,117,
+195,190,188, 28, 89, 89, 89,232, 8,158,127,176, 13, 1,119,222,127,128, 81, 0, 0, 72, 2,112, 27,128,191,224,250,194, 79, 34,
+ 58,178, 1,208,163, 71, 15,149,107, 68,128,237,119,231, 26, 7,220,239, 1,122,240,130, 31,172, 32, 14, 3,116,235,253,251, 43,
+252, 44,166,175,218,132,109, 0, 30,125, 43, 25, 68,191, 4,212, 99,107,113,180,188, 6, 84,215, 40,156,254,181,222,225,253, 11,
+239, 2, 8, 10,142, 31, 63,222, 60,228,143,207,247, 96, 68, 0,132, 24, 7,155, 55,111,182, 2,104,152,159, 52,172,254,133, 53,
+127,183,190,188, 92,107,233,222,185, 71,205,137,147,149, 61,231,158,252, 84,217, 78,194,207, 71,156,185, 93, 52,188,163, 0,109,
+ 53, 25,144, 59,241,103, 61,127, 0, 62, 19, 2, 23, 47, 94, 76,221,247,200,125,147, 13, 99, 74,242, 53,119,166,162,222, 82, 15,
+ 74, 2, 56, 6, 35, 49,176,219, 9, 24,154, 70,167,208, 8,236,175,251, 1,101, 7, 78, 35, 87,151, 91, 18,240,137,151, 63, 3,
+ 64,248, 48,192, 22, 70, 64,239, 74,156,186, 16,235,151,248,187, 26, 1,235,215,175, 71,100,100, 36,106,106,106,176,114,229, 74,
+116,180,176,127, 48, 12, 1, 79,222,191,159, 81,128,158,112,100,253, 75, 0,140, 4,144, 1,160, 92,148,239, 32, 27, 0,109, 53,
+ 15,128,167,136,192,218,181,107, 85,174,134,130, 70,163, 17, 60, 97, 16, 87, 8, 58,194, 20,187, 92,239,159, 43,252, 90,173,150,
+237,246,224,222, 87,222, 39,204, 26, 1,211,222,218, 8,146, 7,116,155,171, 67,201, 11,169,184, 63,235, 95, 64, 72, 8, 58, 41,
+228,237,114,189,220, 49,254,238,190,251, 57, 15, 0, 13, 64,226,172, 91, 73,128,245,113,105,230,216,123,170, 94,200, 46,136, 91,
+254,244,248,206, 49,189,146,172, 0,142,105, 52,154, 46,112,140, 47,246,171, 62,216, 71,110,239, 94, 53,155,241,239,143,113, 71,
+249,242,224,133, 8,122, 48, 66,253, 66,224, 42,250,108, 68,160,107,215,174,110,173,179,253,123,247,239,136,189,253, 86,216,103,
+210,199, 30,186,245,161, 97,209, 17,209,176,216, 44, 32,132, 64, 46,147,163,214,220,136,131,191,238,197,230,127,230, 64,117,135,
+ 74,149,139,220,128,207,241,205,221,115,145,147,147,131,178, 50,225,115, 0, 92, 55, 2, 16,144,248,115,249, 22, 46, 92, 72, 86,
+175, 94,141,101,203,150,161, 35,247,249,115, 13,129,146,146, 18,191,142,245,182,143, 0,206, 41,112,140,247,183, 0,120, 9,192,
+ 33, 0,118, 81,190,221, 99,196,136, 17, 56,114,228, 8,178,179, 50, 91,205, 3,224, 58, 27,160,204,165,161,244,218,199,207,253,
+237,186, 93,200, 98, 4,222,132,222,207, 40, 64, 64,104,171, 97,128,172, 49,162,211,233, 80, 92, 92,204, 84, 84, 84,112,133, 76,
+165,215,235, 5,123, 55,211, 87,109, 2, 56, 19,255, 60,180,252,195,230,239,237,148, 13,227,179, 1, 99,136, 95,247,110, 29,128,
+171,112, 12,255,153, 29,224, 57, 94,156,159, 52,172,105, 92,241,119,157,159,120,245, 19,232,116, 58,121,113,113,113,111,180,156,
+206,218,175,250,104,235, 72,128,175,249,253,125,182,156,109,208, 37,224, 73,252,173, 41,253,129, 2,223,142,217,150,247,182, 82,
+157,164, 74,114, 32,246, 32,198,220, 51, 6,125, 34,250, 0, 12,193,101, 75, 13,246,127,191, 31, 23, 79, 92,196,195,131, 31, 86,
+ 45, 90,180,168,221,235,131,107, 4, 4, 75,172,217, 72,192,205,146,240, 23, 64, 95,125,176,144,237,252,136, 16,122,227,178, 50,
+249, 71, 0,218, 10, 25, 25, 25,110,197,222,101, 37, 54, 46, 12,238,230, 45,246, 37,180,254,162, 45,134, 1,102,101,101, 65,167,
+211,209,197,197,197, 50,103,215, 1, 43,254, 15,123,185,110,183,112, 46,166,212, 22, 83, 41, 19, 47,229,237,210, 56,233,116,186,
+ 80,231,115,185,194, 89,100, 79, 79, 79,127, 50, 64,218,208,113,127,249,168, 84,167,211, 61, 88, 92, 92,140,226,226, 98, 11, 0,
+133,243, 19, 12,225,167,120,142,247, 23, 44,210,206,237, 45,234, 75,168,112, 7,163, 75,160,178,178,146, 42, 74, 43, 34, 49, 11,
+ 99, 84,232,235,126,159,170,180, 34, 3,223,124,128, 13,239,110,160,222,121,231,157,164, 77,111,109, 66,108,255,219, 12, 0,240,
+211,241,255,169, 38,141, 75,193,186, 15,214,149,108,193, 22,191,206, 51, 39, 39,135, 26, 63,126,124,171, 81, 1, 54, 91, 96, 35,
+196,130, 45,214,191,181,108,127, 17, 29, 51, 10,224, 90,198,219, 0,240,229,137, 11,240,212,253,125,208, 73, 27,243, 7,235,120,
+183,124, 26,141,134, 20, 23, 23,203,184,247,139, 27, 97, 17,104,160,148,180,145, 32,119,196, 70, 40, 2,128, 17, 32, 4,142,137,
+249,195, 16,216,248, 94,182, 62,126, 41, 46, 46,102,199,149,213,199,199,199,119,207,202,202, 10,237, 8,247,178, 45,195,246,193,
+228,174,172,172,164, 42,151, 86, 6,237, 30,188,248,226,139, 37,174,199,237,255,247,129,128,207,115,207,158, 61,162,184,138, 16,
+141, 0, 30, 78, 52,229,239, 58,194, 34, 68,136, 16, 33, 66,132,136,155, 23, 18,241, 22,136, 16, 33, 66,132, 8, 17,162, 1, 32,
+ 66,132, 8, 17, 34, 68,136,248, 29,224,255, 3,225,148, 76, 97,126,153, 60, 69, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
};
diff --git a/source/blender/src/butspace.c b/source/blender/src/butspace.c
index f694c9aa862..e8062422e2a 100644
--- a/source/blender/src/butspace.c
+++ b/source/blender/src/butspace.c
@@ -572,6 +572,9 @@ void do_butspace(unsigned short event)
else if(event<=B_RENDERBUTS) {
do_render_panels(event); // buttons_scene.c
}
+ else if(event<=B_SEQUENCERBUTS) {
+ do_sequencer_panels(event);
+ }
else if(event<=B_COMMONEDITBUTS) {
do_common_editbuts(event);
}
@@ -725,6 +728,8 @@ void drawbutspace(ScrArea *sa, void *spacedata)
if(tab== TAB_SCENE_RENDER)
render_panels();
+ else if(tab == TAB_SCENE_SEQUENCER)
+ sequencer_panels();
else if(tab == TAB_SCENE_ANIM)
anim_panels();
else if(tab == TAB_SCENE_SOUND)
@@ -738,6 +743,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 86d518f5467..23463f9bb8d 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -33,6 +33,7 @@
#include <time.h>
#include <math.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#ifdef WIN32
@@ -50,6 +51,7 @@
#include "DNA_armature_types.h"
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_color_types.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
@@ -66,6 +68,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"
@@ -77,6 +80,7 @@
#include "BKE_blender.h"
#include "BKE_brush.h"
+#include "BKE_cloth.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
#include "BKE_colortools.h"
@@ -86,8 +90,11 @@
#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_multires.h"
#include "BKE_packedFile.h"
+#include "BKE_particle.h"
#include "BKE_scene.h"
#include "BLI_blenlib.h"
@@ -99,16 +106,19 @@
#include "BSE_filesel.h"
#include "BIF_gl.h"
+#include "BIF_editaction.h"
#include "BIF_editarmature.h"
#include "BIF_editconstraint.h"
#include "BIF_editdeform.h"
#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"
+#include "BIF_poselib.h"
#include "BIF_poseobject.h"
#include "BIF_renderwin.h"
#include "BIF_resources.h"
@@ -137,6 +147,7 @@
#include "BKE_DerivedMesh.h"
#include "BKE_effect.h"
#include "BKE_font.h"
+#include "BKE_icons.h"
#include "BKE_image.h"
#include "BKE_ipo.h"
#include "BKE_lattice.h"
@@ -384,6 +395,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
EditFace *efa;
Base *base;
Object *ob= OBACT;
+ Material *ma;
Nurb *nu;
Curve *cu;
BezTriple *bezt;
@@ -396,8 +408,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
case B_MATWICH:
if(G.obedit && G.obedit->actcol>0) {
if(G.obedit->type == OB_MESH) {
- efa= em->faces.first;
- while(efa) {
+ for(efa= em->faces.first; efa; efa= efa->next) {
if(efa->f & SELECT) {
if(index== -1) index= efa->mat_nr;
else if(index!=efa->mat_nr) {
@@ -405,7 +416,6 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
return;
}
}
- efa= efa->next;
}
}
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
@@ -472,6 +482,30 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
BIF_undo_push("Assign material index");
}
break;
+ case B_MATASS_BROWSE:
+ /* if slot available, make that index active, and assign */
+ /* else, make new slot, and assign */
+ ma= BLI_findlink(&G.main->mat, G.buts->menunr-1);
+ if(ma) {
+ ob->actcol= find_material_index(ob, ma);
+ if(ob->actcol==0) {
+ assign_material(ob, ma, ob->totcol+1);
+ ob->actcol= ob->totcol;
+ }
+ }
+ else {
+ do_common_editbuts(B_MATNEW);
+ }
+ do_common_editbuts(B_MATASS);
+ break;
+
+ case B_MATCOL2:
+ ma= give_current_material(ob, ob->actcol);
+ BKE_icon_changed(BKE_icon_getid((ID *)ma));
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ break;
+
case B_MATSEL:
case B_MATDESEL:
if(G.obedit) {
@@ -493,14 +527,14 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
while(a--) {
if(bezt->hide==0) {
if(event==B_MATSEL) {
- bezt->f1 |= 1;
- bezt->f2 |= 1;
- bezt->f3 |= 1;
+ bezt->f1 |= SELECT;
+ bezt->f2 |= SELECT;
+ bezt->f3 |= SELECT;
}
else {
- bezt->f1 &= ~1;
- bezt->f2 &= ~1;
- bezt->f3 &= ~1;
+ bezt->f1 &= ~SELECT;
+ bezt->f2 &= ~SELECT;
+ bezt->f3 &= ~SELECT;
}
}
bezt++;
@@ -511,8 +545,8 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
bp= nu->bp;
while(a--) {
if(bp->hide==0) {
- if(event==B_MATSEL) bp->f1 |= 1;
- else bp->f1 &= ~1;
+ if(event==B_MATSEL) bp->f1 |= SELECT;
+ else bp->f1 &= ~SELECT;
}
bp++;
}
@@ -708,6 +742,8 @@ static void delete_customdata_layer(void *data1, void *data2)
from the data stored in multires */
if(me && me->mr) {
multires_delete_layer(me, &me->mr->fdata, type, layer - &data->layers[index]);
+ multires_level_to_editmesh(OBACT, me, 0);
+ multires_finish_mesh_update(OBACT);
}
else if(G.obedit) {
EM_free_data_layer(data, type);
@@ -950,7 +986,9 @@ 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(ELEM(i, eModifierType_Cloth, eModifierType_Collision)) continue;
if((mti->flags&eModifierTypeFlag_AcceptsCVs) ||
(ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
@@ -990,6 +1028,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);
@@ -1201,7 +1245,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;
@@ -1233,7 +1363,7 @@ static void modifiers_applyModifier(void *obv, void *mdv)
return;
}
- sculptmode_pmv_off(me);
+ mesh_pmv_off(ob, me);
dm = mesh_create_derived_for_modifier(ob, md);
if (!dm) {
@@ -1465,6 +1595,60 @@ 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);
+ }
+ else if(ob->type==OB_MBALL) {
+ makeDispListMBall(ob);
+ }
+ else if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+ makeDispListCurveTypes(ob, 0);
+ }
+
+ 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);
@@ -1483,7 +1667,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiBlockSetCol(block, TH_AUTO);
/* open/close icon */
- if (!isVirtual) {
+ if (!isVirtual && md->type!=eModifierType_Collision) {
uiBlockSetEmboss(block, UI_EMBOSSN);
uiDefIconButBitI(block, ICONTOG, eModifierMode_Expanded, B_MODIFIER_REDRAW, VICON_DISCLOSURE_TRI_RIGHT, x-10, y-2, 20, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Modifier");
}
@@ -1500,10 +1684,10 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiBlockBeginAlign(block);
uiDefBut(block, TEX, B_MODIFIER_REDRAW, "", x+10, y-1, buttonWidth-60, 19, md->name, 0.0, sizeof(md->name)-1, 0.0, 0.0, "Modifier name");
- /* Softbody not allowed in this situation, enforce! */
- if (md->type!=eModifierType_Softbody || !(ob->pd && ob->pd->deflect)) {
+ /* Softbody not allowed in this situation, enforce! */
+ if ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) {
uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+10+buttonWidth-60, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
- uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+10+buttonWidth-40, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
+ but= uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+10+buttonWidth-40, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
uiDefIconButBitI(block, TOG, eModifierMode_Editmode, B_MODIFIER_RECALC, VICON_EDIT, x+10+buttonWidth-20, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
}
@@ -1540,9 +1724,13 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiButSetFunc(but, modifiers_moveDown, ob, md);
uiBlockSetEmboss(block, UI_EMBOSSN);
-
- but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_X, x+width-70+40, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Delete modifier");
- uiButSetFunc(but, modifiers_del, ob, md);
+
+ // deletion over the deflection panel
+ if(md->type!=eModifierType_Collision)
+ {
+ but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_X, x+width-70+40, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Delete modifier");
+ uiButSetFunc(but, modifiers_del, ob, md);
+ }
uiBlockSetCol(block, TH_AUTO);
}
@@ -1563,7 +1751,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;
@@ -1591,7 +1779,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 = 86;
+ height = 105;
} else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
height = 86;
@@ -1600,23 +1788,42 @@ 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_Cloth) {
+ height = 31;
+ } else if (md->type==eModifierType_Collision) {
+ height = 19;
} 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, "");
y -= 18;
- if (!isVirtual) {
+ if (!isVirtual && (md->type!=eModifierType_Collision)) {
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 && (md->type!=eModifierType_Cloth)) {
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);
}
@@ -1684,6 +1891,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,
@@ -1720,7 +1932,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
"Material value that gives no displacement");
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Strength:",
lx, (cy -= 19), buttonWidth, 19, &dmd->strength,
- -1000, 1000, 10, 10,
+ -1000, 1000, 10, 0.1,
"Strength of displacement");
sprintf(str, "Direction%%t|Normal%%x%d|RGB -> XYZ%%x%d|"
"Z%%x%d|Y%%x%d|X%%x%d",
@@ -1908,12 +2120,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 +2301,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 +2376,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 +2415,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 +2425,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);
@@ -2195,14 +2469,17 @@ static void editing_panel_shapes(Object *ob)
uiBlockBeginAlign(block);
if(ob->shapeflag & OB_SHAPE_LOCK) icon= ICON_PIN_HLT; else icon= ICON_PIN_DEHLT;
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");
+ if(kb->flag & KEYBLOCK_MUTE) icon= ICON_MUTE_IPO_ON; else icon = ICON_MUTE_IPO_OFF;
+ uiDefIconButBitS(block, TOG, KEYBLOCK_MUTE, B_MODIFIER_RECALC, icon, 35,150,20,20, &kb->flag, 0, 0, 0, 0, "Mute the current Shape");
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");
+ uiDefIconBut(block, BUT, B_PREVKEY, ICON_TRIA_LEFT, 55,150,20,20, NULL, 0, 0, 0, 0, "Previous Shape Key");
+ strp= make_key_menu(key, 1);
+ uiDefButS(block, MENU, B_SETKEY, strp, 75,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");
+
+ uiDefIconBut(block, BUT, B_NEXTKEY, ICON_TRIA_RIGHT, 95,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");
+ uiDefBut(block, TEX, B_NAMEKEY, "", 115, 150, 170, 20, kb->name, 0.0, 31.0, 0, 0, "Current Shape Key name");
uiDefIconBut(block, BUT, B_DELKEY, ICON_X, 285,150,25,20, 0, 0, 0, 0, 0, "Deletes current Shape Key");
uiBlockEndAlign(block);
@@ -2213,9 +2490,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");
@@ -2862,6 +3144,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;
}
}
@@ -2943,13 +3259,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);
@@ -3309,6 +3628,10 @@ void do_latticebuts(unsigned short event)
if(ob==G.obedit) resizelattice(editLatt, lt->opntsu, lt->opntsv, lt->opntsw, NULL);
else resizelattice(ob->data, lt->opntsu, lt->opntsv, lt->opntsw, NULL);
ob->softflag |= OB_SB_REDO;
+ if(modifiers_isClothEnabled(ob)) {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
}
@@ -3317,6 +3640,10 @@ void do_latticebuts(unsigned short event)
lt = ob->data;
resizelattice(ob->data, lt->opntsu, lt->opntsv, lt->opntsw, ob);
ob->softflag |= OB_SB_REDO;
+ if(modifiers_isClothEnabled(ob)) {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
}
@@ -3388,6 +3715,7 @@ static void editing_panel_lattice_type(Object *ob, Lattice *lt)
void do_armbuts(unsigned short event)
{
Object *ob= OBACT;
+ bAction *act;
switch(event) {
case B_ARM_RECALCDATA:
@@ -3425,6 +3753,138 @@ void do_armbuts(unsigned short event)
if (ob && ob->pose)
pose_clear_paths(ob);
break;
+
+ case B_POSELIB_ADDPOSE:
+ if (ob && ob->pose)
+ poselib_add_current_pose(ob, 1);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ break;
+ case B_POSELIB_REPLACEP:
+ if (ob && ob->pose)
+ poselib_add_current_pose(ob, 2);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ break;
+ case B_POSELIB_REMOVEP:
+ if (ob && ob->pose) {
+ bAction *act= ob->poselib;
+ TimeMarker *marker= poselib_get_active_pose(act);
+
+ poselib_remove_pose(ob, marker);
+ }
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ break;
+ case B_POSELIB_VALIDATE:
+ if (ob && ob->pose)
+ poselib_validate_act(ob->poselib);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ break;
+ case B_POSELIB_APPLYP:
+ if (ob && ob->pose)
+ poselib_preview_poses(ob, 1);
+ allqueue(REDRAWBUTSEDIT, 0);
+ break;
+
+ /* note: copied from headerbuttons.c */
+ case B_POSELIB_ALONE: //B_ACTALONE
+ if (ob && ob->id.lib==0) {
+ act= ob->poselib;
+
+ if (act->id.us > 1) {
+ if (okee("Single user")) {
+ ob->poselib= copy_action(act);
+ act->id.us--;
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ }
+ }
+ }
+ break;
+ case B_POSELIB_DELETE: //B_ACTIONDELETE
+ act= ob->poselib;
+
+ if (act)
+ act->id.us--;
+ ob->poselib=NULL;
+
+ BIF_undo_push("Unlink PoseLib");
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ break;
+ case B_POSELIB_BROWSE: //B_ACTIONBROWSE:
+ {
+ ID *id, *idtest;
+ int nr= 1;
+
+ if (ob == NULL)
+ break;
+ act= ob->poselib;
+ id= (ID *)act;
+
+ if (G.buts->menunr == -2) {
+ activate_databrowse((ID *)ob->poselib, ID_AC, 0, B_POSELIB_BROWSE, &G.buts->menunr, do_armbuts);
+ return;
+ }
+ if (G.buts->menunr < 0) break;
+
+ /* See if we have selected a valid action */
+ for (idtest= G.main->action.first; idtest; idtest= idtest->next) {
+ if (nr == G.buts->menunr) {
+ break;
+ }
+ nr++;
+ }
+
+ /* Store current action */
+ 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 {
+ /* a plain action */
+ idtest=(ID *)add_empty_action("PoseLib");
+ }
+ idtest->us--;
+ }
+
+ if ((idtest != id) && (ob)) {
+ act= (bAction *)idtest;
+
+ ob->poselib= act;
+ id_us_plus(idtest);
+
+ if (id) id->us--;
+
+ /* Update everything */
+ BIF_undo_push("Browse PoseLibs");
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWHEADERS, 0);
+ }
+ }
+ break;
+
+ case B_POSEGRP_RECALC:
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ break;
+ case B_POSEGRP_ADD:
+ if (ob && ob->pose)
+ pose_add_posegroup();
+ break;
+ case B_POSEGRP_REMOVE:
+ if (ob && ob->pose)
+ pose_remove_posegroup();
+ break;
}
}
@@ -3493,9 +3953,10 @@ static void build_bonestring (char *string, EditBone *bone)
int skip=0;
int index, numbones, i;
char (*qsort_ptr)[32] = NULL;
+ char *s = string;
/* That space is there for a reason - for no parent */
- sprintf (string, "Parent%%t| %%x%d", -1);
+ s += sprintf (string, "Parent%%t| %%x%d", -1);
numbones = BLI_countlist(&G.edbo);
@@ -3536,7 +3997,7 @@ static void build_bonestring (char *string, EditBone *bone)
( int (*)(const void *, const void *) ) strcmp);
for (i=0; i < numbones; ++i) {
- sprintf (string, "%s%s", string, qsort_ptr[i]);
+ strcat(s, qsort_ptr[i]);
}
if (qsort_ptr)
@@ -3610,13 +4071,13 @@ static void editing_panel_armature_type(Object *ob, bArmature *arm)
uiBlockBeginAlign(block);
for(a=0; a<8; a++) {
short dx= 18;
- but= uiDefButBitS(block, BUT_TOGDUAL, 1<<a, REDRAWVIEW3D, "", 10+a*dx, 115, dx, 15, &arm->layer, 0, 0, 0, 0, "");
+ but= uiDefButBitS(block, BUT_TOGDUAL, 1<<a, REDRAWVIEW3D, "", 10+a*dx, 115, dx, 15, &arm->layer, 0, 0, 0, 0, "Armature layer (Hold Ctrl for locking in a proxy instance)");
uiButSetFunc(but, armature_layer_cb, &arm->layer, (void *)(1<<a));
}
uiBlockBeginAlign(block);
for(a=8; a<16; a++) {
short dx= 18;
- but= uiDefButBitS(block, BUT_TOGDUAL, 1<<a, REDRAWVIEW3D, "", 18+a*dx, 115, dx, 15, &arm->layer, 0, 0, 0, 0, "");
+ but= uiDefButBitS(block, BUT_TOGDUAL, 1<<a, REDRAWVIEW3D, "", 18+a*dx, 115, dx, 15, &arm->layer, 0, 0, 0, 0, "Armature layer (Hold Ctrl for locking in a proxy instance)");
uiButSetFunc(but, armature_layer_cb, &arm->layer, (void *)(1<<a));
}
/* quite bad here, but I don't know a better place for copy... */
@@ -3629,9 +4090,10 @@ static void editing_panel_armature_type(Object *ob, bArmature *arm)
uiDefButI(block, ROW, REDRAWVIEW3D, "B-Bone", 155, 87,70,20, &arm->drawtype, 0, ARM_B_BONE, 0, 0, "Draw bones as boxes, showing subdivision and b-splines");
uiDefButI(block, ROW, REDRAWVIEW3D, "Envelope", 225, 87,85,20, &arm->drawtype, 0, ARM_ENVELOPE, 0, 0, "Draw bones as extruded spheres, showing deformation influence volume");
- uiDefButBitI(block, TOG, ARM_DRAWAXES, REDRAWVIEW3D, "Draw Axes", 10, 67,100,20, &arm->flag, 0, 0, 0, 0, "Draw bone axes");
- uiDefButBitI(block, TOG, ARM_DRAWNAMES, REDRAWVIEW3D, "Draw Names", 110,67,100,20, &arm->flag, 0, 0, 0, 0, "Draw bone names");
- uiDefButBitI(block, TOGN, ARM_NO_CUSTOM, REDRAWVIEW3D, "Draw Shapes", 210,67,100,20, &arm->flag, 0, 0, 0, 0, "Draw custom bone shapes");
+ uiDefButBitI(block, TOG, ARM_DRAWAXES, REDRAWVIEW3D, "Axes", 10, 67,75,20, &arm->flag, 0, 0, 0, 0, "Draw bone axes");
+ uiDefButBitI(block, TOG, ARM_DRAWNAMES, REDRAWVIEW3D, "Names", 85,67,75,20, &arm->flag, 0, 0, 0, 0, "Draw bone names");
+ uiDefButBitI(block, TOGN, ARM_NO_CUSTOM, REDRAWVIEW3D, "Shapes", 160,67,75,20, &arm->flag, 0, 0, 0, 0, "Draw custom bone shapes");
+ uiDefButBitI(block, TOG, ARM_COL_CUSTOM, REDRAWVIEW3D, "Colors", 235,67,75,20, &arm->flag, 0, 0, 0, 0, "Draw custom bone colors (colors are set per Bone Group)");
uiBlockEndAlign(block);
@@ -3663,15 +4125,23 @@ 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, "");
uiBlockBeginAlign(block);
- uiDefButS(block, MENU, REDRAWVIEW3D, "Ghosts %t|Around Current Frame %x0|In Range %x1",
- 10, 160, 150, 20, &arm->ghosttype, 0, 0, 0, 0, "Choose range of Ghosts to draw for current Action");
-
- uiDefButS(block, NUM, REDRAWVIEW3D, "GStep: ", 10,140,150,20, &arm->ghostsize, 1.0f, 20.0f, 0, 0, "How many frames between Ghost instances");
+ uiDefButS(block, MENU, REDRAWVIEW3D, "Ghosts %t|Around Current Frame %x0|In Range %x1|On Keyframes %x2",
+ 10, 160, 150, 20, &arm->ghosttype, 0, 0, 0, 0, "Choose range of Ghosts to draw for current Action");
+
+ if (arm->ghosttype != ARM_GHOST_KEYS)
+ uiDefButS(block, NUM, REDRAWVIEW3D, "GStep: ", 10,140,120,20, &arm->ghostsize, 1.0f, 20.0f, 0, 0, "How many frames between Ghost instances");
+ else
+ uiDefBut(block, LABEL, REDRAWVIEW3D, "GStep: N/A", 10,140,120,20, NULL, 0.0f, 0.0f, 0, 0, "How many frames between Ghost instances");
+ uiDefButBitI(block, TOG, ARM_GHOST_ONLYSEL, REDRAWVIEW3D, "Sel", 130, 140, 30, 20, &arm->flag, 0, 0, 0, 0, "Only show Ghosts for selected bones");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -3679,7 +4149,7 @@ static void editing_panel_armature_visuals(Object *ob, bArmature *arm)
/* range is around current frame */
uiDefButS(block, NUM, REDRAWVIEW3D, "Ghost: ", 10,110,150,20, &arm->ghostep, 0.0f, 30.0f, 0, 0, "Draw Ghosts around current frame, for current Action");
}
- else if (arm->ghosttype == ARM_GHOST_RANGE) {
+ else if (ELEM(arm->ghosttype, ARM_GHOST_RANGE, ARM_GHOST_KEYS)) {
/* range is defined by start+end frame below */
uiDefButI(block, NUM,REDRAWVIEW3D,"GSta:",10,110,150,20, &arm->ghostsf,1.0,MAXFRAMEF, 0, 0, "The start frame for Ghost display range");
uiDefButI(block, NUM,REDRAWVIEW3D,"GEnd:",10,90,150,20, &arm->ghostef,arm->ghostsf,MAXFRAMEF, 0, 0, "The end frame for Ghost display range");
@@ -3687,23 +4157,38 @@ static void editing_panel_armature_visuals(Object *ob, bArmature *arm)
uiBlockEndAlign(block);
/* Bone Path Drawing Options */
- uiDefBut(block, LABEL, 0, "Bone Paths", 165,180,150,20, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "Bone Paths Drawing:", 165,180,170,20, 0, 0, 0, 0, 0, "");
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, REDRAWVIEW3D, "PStep:",170,160,80,20, &arm->pathsize,1,100, 10, 50, "Frames between highlighted points on bone path");
+ uiDefButBitS(block, TOG, ARM_PATH_FNUMS, REDRAWVIEW3D, "Frame Nums", 250, 160, 80, 20, &arm->pathflag, 0, 0, 0, 0, "Show frame numbers on path");
+
+ uiDefButBitS(block, TOG, ARM_PATH_KFRAS, REDRAWVIEW3D, "Show Keys", 170, 140, 80, 20, &arm->pathflag, 0, 0, 0, 0, "Show key frames on path");
+ uiDefButBitS(block, TOG, ARM_PATH_KFNOS, REDRAWVIEW3D, "Keyframe Nums", 250, 140, 80, 20, &arm->pathflag, 0, 0, 0, 0, "Show frame numbers of key frames on path");
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, ARM_PATH_FNUMS, REDRAWVIEW3D, "Frame Nums", 170, 160, 80, 20, &arm->pathflag, 0, 0, 0, 0, "Show frame numbers on path");
- uiDefButS(block, NUM, REDRAWVIEW3D, "PStep:",250,160,80,20, &arm->pathsize,1,100, 10, 50, "Frames between highlighted points on bone path");
- uiDefButBitS(block, TOG, ARM_PATH_KFRAS, REDRAWVIEW3D, "Show Keys", 170, 140, 160, 20, &arm->pathflag, 0, 0, 0, 0, "Show key frames on path");
+ uiDefButBitS(block, TOG, ARM_PATH_ACFRA, REDRAWVIEW3D, "Around Current Frame", 170, 110, 160, 20, &arm->pathflag, 0, 0, 0, 0, "Only show Bone Path around the current frame");
+
+ /* only show extra ranges when needed */
+ if (arm->pathflag & ARM_PATH_ACFRA) {
+ uiDefButI(block, NUM, REDRAWVIEW3D,"PPre:",170,90,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,90,80,20, &arm->pathac, 1.0, MAXFRAMEF/2, 0, 0, "The number of frames after current frame for Bone Path display range");
+ }
uiBlockEndAlign(block);
+ /* Bone Path Calculation Options */
+ uiDefBut(block, LABEL, 0, "Bone Paths Calc.", 10,50,170,20, 0, 0, 0, 0, 0, "");
+
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");
+ uiDefBut(block, BUT, B_ARM_CALCPATHS, "Calculate Paths", 10,30,155,20, 0, 0, 0, 0, 0, "(Re)calculates the paths of the selected bones");
+ uiDefBut(block, BUT, B_ARM_CLEARPATHS, "Clear Paths", 10,10,155,20, 0, 0, 0, 0, 0, "Clears bone paths of the selected bones");
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");
+ uiDefButBitS(block, TOG, ARM_PATH_HEADS, REDRAWVIEW3D, "Bone-Head Path", 170, 30, 160, 20, &arm->pathflag, 0, 0, 0, 0, "Calculate the Path travelled by the Bone's Head instead of Tail");
+ uiDefButI(block, NUM,REDRAWVIEW3D,"PSta:",170,10,80,20, &arm->pathsf, 1.0, MAXFRAMEF, 0, 0, "The start frame for Bone Path display range");
+ uiDefButI(block, NUM,REDRAWVIEW3D,"PEnd:",250,10,80,20, &arm->pathef, arm->pathsf, MAXFRAMEF, 0, 0, "The end frame for Bone Path display range");
uiBlockEndAlign(block);
}
@@ -3779,10 +4264,11 @@ 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);
@@ -3838,6 +4324,7 @@ static void editing_panel_pose_bones(Object *ob, bArmature *arm)
Bone *curBone;
int by, a;
int index, zerodof, zerolimit;
+ char *menustr;
/* Draw the bone name block */
block= uiNewBlock(&curarea->uiblocks, "editing_panel_pose_bones", UI_EMBOSS, UI_HELV, curarea->win);
@@ -3853,19 +4340,25 @@ static void editing_panel_pose_bones(Object *ob, bArmature *arm)
for (pchan=ob->pose->chanbase.first, index=0; pchan; pchan=pchan->next, index++){
curBone= pchan->bone;
if ((curBone->flag & BONE_SELECTED) && (curBone->layer & arm->layer)) {
-
if(ob_arm_bone_pchan_lock(ob, arm, curBone, pchan))
uiDefBut(block, LABEL, 0, "Proxy Locked", 160, 180,150,18, NULL, 1, 0, 0, 0, "");
- /* Bone naming button */
+ /* Bone naming button */
uiBlockBeginAlign(block);
but=uiDefBut(block, TEX, REDRAWVIEW3D, "BO:", -10,by,117,19, curBone->name, 0, 24, 0, 0, "Change the bone name");
uiButSetFunc(but, validate_posebonebutton_cb, curBone, NULL);
uiButSetCompleteFunc(but, autocomplete_bone, (void *)ob);
- /* Dist and weight buttons */
- uiDefButF(block, NUM,B_ARM_RECALCDATA, "Dist:", 107, by, 105, 19, &curBone->dist, 0.0, 1000.0, 10.0, 0.0, "Bone deformation distance");
- uiDefButF(block, NUM,B_ARM_RECALCDATA, "Weight:", 220, by, 110, 19, &curBone->weight, 0.0F, 1000.0F, 10.0F, 0.0F, "Bone deformation weight");
+ /* Bone custom drawing */
+ menustr= build_posegroups_menustr(ob->pose, 0);
+ uiDefButS(block, MENU,REDRAWVIEW3D, menustr, 107,by,105,19, &pchan->agrp_index, 0, 0.0, 0.0, 0.0, "Change the Pose Group this Bone belongs to");
+ MEM_freeN(menustr);
+
+ ob_arm_bone_pchan_lock(ob, arm, curBone, pchan);
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "OB:", 220,by,90,19, &pchan->custom, "Object that defines custom draw type for this Bone");
+ ob_arm_bone_pchan_lock(ob, arm, curBone, NULL);
+
+ uiDefButBitI(block, TOG, BONE_DRAWWIRE, B_ARM_RECALCDATA, "W", 309,by,21,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Custom shape of this Bone should always be drawn as a wireframe");
/* Segment, ease in/out buttons */
uiBlockBeginAlign(block);
@@ -3874,12 +4367,11 @@ 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");
- 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");
- ob_arm_bone_pchan_lock(ob, arm, curBone, NULL);
+ 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");
+ uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Hide", 250,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Toggles display of this bone in Edit Mode");
/* layers */
uiBlockBeginAlign(block);
@@ -4140,6 +4632,8 @@ void do_meshbuts(unsigned short event)
if(me && me->mr) {
multires_add_layer(me, &me->mr->fdata, CD_MTFACE, layernum);
+ multires_level_to_editmesh(ob, me, 0);
+ multires_finish_mesh_update(ob);
}
else if(G.obedit) {
EM_add_data_layer(&em->fdata, CD_MTFACE);
@@ -4226,7 +4720,7 @@ void do_meshbuts(unsigned short event)
G.f -= G_DISABLE_OK;
break;
case B_REMDOUB:
- count= removedoublesflag(1, 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 ();
@@ -4282,6 +4776,9 @@ void do_meshbuts(unsigned short event)
case B_JOINTRIA:
join_triangles();
break;
+ case B_GEN_SKELETON:
+ generateSkeleton();
+ break;
}
/* WATCH IT: previous events only in editmode! */
@@ -4332,6 +4829,7 @@ static void editing_panel_mesh_tools(Object *ob, Mesh *me)
uiDefButS(block, NUM, B_DIFF, "Turns:", 210,55,115,19, &G.scene->toolsettings->turn,1.0,360.0, 0, 0, "Specifies the number of revolutions the screw turns");
uiDefButBitS(block, TOG, B_KEEPORIG, B_DIFF, "Keep Original",10,35,200,19, &G.scene->toolsettings->editbutflag, 0, 0, 0, 0, "Keeps a copy of the original vertices and faces after executing tools");
uiDefButBitS(block, TOG, B_CLOCKWISE, B_DIFF, "Clockwise", 210,35,115,19, &G.scene->toolsettings->editbutflag, 0, 0, 0, 0, "Specifies the direction for 'Screw' and 'Spin'");
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefBut(block, BUT,B_EXTREP, "Extrude Dup", 10,10,150,19, 0, 0, 0, 0, 0, "Creates copies of the selected vertices in a straight line away from the current viewport");
@@ -4355,7 +4853,81 @@ static void verify_vertexgroup_name_func(void *datav, void *data2_unused)
unique_vertexgroup_name((bDeformGroup*)datav, OBACT);
}
+static void skgen_reorder(void *option, void *arg2)
+{
+ char tmp;
+ switch ((int)option)
+ {
+ case 0:
+ tmp = G.scene->toolsettings->skgen_subdivisions[0];
+ G.scene->toolsettings->skgen_subdivisions[0] = G.scene->toolsettings->skgen_subdivisions[1];
+ G.scene->toolsettings->skgen_subdivisions[1] = tmp;
+ break;
+ case 1:
+ tmp = G.scene->toolsettings->skgen_subdivisions[2];
+ G.scene->toolsettings->skgen_subdivisions[2] = G.scene->toolsettings->skgen_subdivisions[1];
+ G.scene->toolsettings->skgen_subdivisions[1] = tmp;
+ break;
+ case 2:
+ tmp = G.scene->toolsettings->skgen_subdivisions[0];
+ G.scene->toolsettings->skgen_subdivisions[0] = G.scene->toolsettings->skgen_subdivisions[2];
+ G.scene->toolsettings->skgen_subdivisions[2] = G.scene->toolsettings->skgen_subdivisions[1];
+ G.scene->toolsettings->skgen_subdivisions[1] = tmp;
+ break;
+ }
+}
+
+static void editing_panel_mesh_skgen(Object *ob, Mesh *me)
+{
+ uiBlock *block;
+ uiBut *but;
+ int i;
+ block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_skgen", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Skeleton Generator", "Editing", 960, 0, 318, 204)==0) return;
+
+ uiDefBut(block, BUT, B_GEN_SKELETON, "Generate Skeleton", 1025,170,250,19, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_DIFF, "Resolution:", 1025,150,250,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0, "Specifies the resolution of the graph's embedding");
+ uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In", 1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Filter internal small arcs from graph");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0, "Specify the threshold ratio for filtering internal arcs");
+ uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex", 1025,110, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Filter external small arcs from graph");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0, "Specify the threshold ratio for filtering external arcs");
+
+ for(i = 0; i < SKGEN_SUB_TOTAL; i++)
+ {
+ int y = 90 - 20 * i;
+
+ but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_MOVE_DOWN, 1025, y, 16, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Change the order the subdivisions algorithm are applied");
+ uiButSetFunc(but, skgen_reorder, (void *)i, NULL);
+
+ switch(G.scene->toolsettings->skgen_subdivisions[i])
+ {
+ case SKGEN_SUB_LENGTH:
+ uiDefButBitS(block, TOG, SKGEN_CUT_LENGTH, B_DIFF, "Length", 1041, y, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Subdivide arcs in bones of equal length");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1111, y, 82,19, &G.scene->toolsettings->skgen_length_ratio,1.0, 4.0, 10, 0, "Specify the ratio limit between straight arc and embeddings to trigger equal subdivisions");
+ uiDefButF(block, NUM, B_DIFF, "L:", 1193, y, 82,19, &G.scene->toolsettings->skgen_length_limit,0.1,50.0, 10, 0, "Maximum length of the bones when subdividing");
+ break;
+ case SKGEN_SUB_ANGLE:
+ uiDefButBitS(block, TOG, SKGEN_CUT_ANGLE, B_DIFF, "Angle", 1041, y, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Subdivide arcs based on angle");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1111, y,164,19, &G.scene->toolsettings->skgen_angle_limit,0.0, 90.0, 10, 0, "Specify the threshold angle in degrees for subdivision");
+ break;
+ case SKGEN_SUB_CORRELATION:
+ uiDefButBitS(block, TOG, SKGEN_CUT_CORRELATION, B_DIFF, "Correlation", 1041, y, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Subdivide arcs based on correlation");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1111, y,164,19, &G.scene->toolsettings->skgen_correlation_limit,0.0, 1.0, 0.01, 0, "Specify the threshold correlation for subdivision");
+ break;
+ }
+ }
+
+ uiDefButBitS(block, TOG, SKGEN_SYMMETRY, B_DIFF, "Symmetry", 1025, 30,125,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Restore symmetries based on topology");
+ uiDefButF(block, NUM, B_DIFF, "T:", 1150, 30,125,19, &G.scene->toolsettings->skgen_symmetry_limit,0.0, 1.0, 10, 0, "Specify the threshold distance for considering potential symmetric arcs");
+ uiDefButC(block, NUM, B_DIFF, "P:", 1025, 10, 62,19, &G.scene->toolsettings->skgen_postpro_passes, 0, 10, 10, 0, "Specify the number of processing passes on the embeddings");
+ uiDefButC(block, ROW, B_DIFF, "Smooth", 1087, 10, 63,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_SMOOTH, 0, 0, "Smooth embeddings");
+ uiDefButC(block, ROW, B_DIFF, "Average", 1150, 10, 62,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_AVERAGE, 0, 0, "Average embeddings");
+ uiDefButC(block, ROW, B_DIFF, "Sharpen", 1212, 10, 63,19, &G.scene->toolsettings->skgen_postpro, 5.0, (float)SKGEN_SHARPEN, 0, 0, "Sharpen embeddings");
+ uiBlockEndAlign(block);
+}
static void editing_panel_mesh_tools1(Object *ob, Mesh *me)
{
@@ -4378,7 +4950,7 @@ static void editing_panel_mesh_tools1(Object *ob, Mesh *me)
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, G_DRAWFACES, REDRAWVIEW3D|REDRAWIMAGE, "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");
@@ -4407,7 +4979,7 @@ char *get_vertexgroup_menustr(Object *ob)
{
bDeformGroup *dg;
int defCount, min, index;
- char (*qsort_ptr)[sizeof(dg->name)+5] = NULL; // +5 for "%x99|"
+ char (*qsort_ptr)[sizeof(dg->name)+6] = NULL; // +6 for "%x999|" max 999 groups selectable
char *s, *menustr;
int printed;
@@ -4425,7 +4997,7 @@ char *get_vertexgroup_menustr(Object *ob)
"qsort_ptr");
for (index = 1, dg = ob->defbase.first; dg; index++, dg=dg->next) {
printed = snprintf (qsort_ptr[index - 1], sizeof (dg->name), dg->name);
- snprintf (qsort_ptr[index - 1]+printed, 5+1, "%%x%d|", index); // +1 to move the \0
+ snprintf (qsort_ptr[index - 1]+printed, 6+1, "%%x%d|", index); // +1 to move the \0 see above 999 max here too
}
qsort (qsort_ptr, defCount, sizeof (qsort_ptr[0]),
@@ -4447,6 +5019,22 @@ char *get_vertexgroup_menustr(Object *ob)
return menustr;
}
+static void verify_poselib_posename(void *arg1, void *arg2)
+{
+ bAction *act= (bAction *)arg1;
+ TimeMarker *marker= (TimeMarker *)arg2;
+
+ BLI_uniquename(&act->markers, marker, "Pose", offsetof(TimeMarker, name), 64);
+}
+
+static void verify_posegroup_groupname(void *arg1, void *arg2)
+{
+ bPose *pose= (bPose *)arg1;
+ bActionGroup *grp= (bActionGroup *)arg2;
+
+ BLI_uniquename(&pose->agroups, grp, "Group", offsetof(bActionGroup, name), 32);
+}
+
static void editing_panel_links(Object *ob)
{
uiBlock *block;
@@ -4521,7 +5109,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|Circle%x3|Cube%x5",
+ uiDefButC(block, MENU, REDRAWVIEW3D, "Empty Drawtype%t|Arrows%x1|Single Arrow%x4|Plain Axes%x2|Circle%x3|Cube%x5|Sphere%x6|Cone%x7",
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");
@@ -4529,6 +5117,98 @@ static void editing_panel_links(Object *ob)
return;
}
+ /* poselib for armatures */
+ if (ob->type==OB_ARMATURE) {
+ if ((ob->pose) && (ob->flag & OB_POSEMODE) && (G.obedit != ob)) {
+ bAction *act= ob->poselib;
+ bPose *pose= ob->pose;
+ int count;
+ char *menustr;
+
+ /* PoseLib settings for armature reside on the left */
+ xco= 143;
+
+ uiDefBut(block, LABEL,0, "Pose Library:", xco, 154, 200, 20, 0, 0, 0, 0, 0, "");
+
+ /* PoseLib Action */
+ uiBlockSetCol(block, TH_BUT_SETTING2);
+ std_libbuttons(block, 143, 130, 0, NULL, B_POSELIB_BROWSE, ID_AC, 0, (ID *)act, (ID *)ob, &(G.buts->menunr), B_POSELIB_ALONE, 0, B_POSELIB_DELETE, 0, 0);
+ uiBlockSetCol(block, TH_AUTO);
+
+ uiDefBut(block, BUT, B_POSELIB_VALIDATE, "Auto-Sync PoseLib", xco,110,160,20, 0, 0, 0, 0, 0, "Syncs the current PoseLib with the poses available");
+
+ /* PoseLib - Pose editing controls */
+ if (act) {
+ uiBlockBeginAlign(block);
+ /* currently 'active' pose */
+ if (act->markers.first) {
+ count= BLI_countlist(&act->markers);
+ menustr= poselib_build_poses_menu(act, "PoseLib Poses");
+ uiDefButI(block, MENU, B_POSELIB_APPLYP, menustr, xco, 85,18,20, &act->active_marker, 1, count, 0, 0, "Browses Poses in Pose Library. Applies chosen pose.");
+ MEM_freeN(menustr);
+
+ if (act->active_marker) {
+ TimeMarker *marker= poselib_get_active_pose(act);
+
+ but= uiDefBut(block, TEX, REDRAWBUTSEDIT,"", xco+18,85,160-18-20,20, marker->name, 0, 63, 0, 0, "Displays current Pose Library Pose name. Click to change.");
+ uiButSetFunc(but, verify_poselib_posename, act, marker);
+ uiDefIconBut(block, BUT, B_POSELIB_REMOVEP, VICON_X, xco+160-20, 85, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Remove this Pose Library Pose from Pose Library.");
+ }
+ }
+
+ /* add new poses */
+ uiDefBut(block, BUT, B_POSELIB_ADDPOSE, "Add Pose", xco,65,80,20, 0, 0, 0, 0, 0, "Add current pose to PoseLib");
+ uiDefBut(block, BUT, B_POSELIB_REPLACEP, "Replace Pose", xco+80,65,80,20, 0, 0, 0, 0, 0, "Replace existing PoseLib Pose with current pose");
+ uiBlockEndAlign(block);
+ }
+
+
+ /* Action Groups settings for armature reside on the right */
+ xco= 315;
+
+ uiDefBut(block, LABEL,0, "Bone Groups:", xco, 154, 140, 20, 0, 0, 0, 0, 0, "");
+
+ /* add new group */
+ uiDefBut(block, BUT, B_POSEGRP_ADD, "Add Group", xco,130,140,20, 0, 0, 0, 0, 0, "Add a new Pose Group for the Pose");
+
+ if (pose->agroups.first) {
+ uiBlockBeginAlign(block);
+ /* currently 'active' group - browse groups */
+ count= BLI_countlist(&pose->agroups);
+ menustr= build_posegroups_menustr(pose, 0);
+ uiDefButI(block, MENU, B_POSEGRP_RECALC, menustr, xco, 85,18,20, &pose->active_group, 1, count, 0, 0, "Browses Pose Groups available for Armature. Click to change.");
+ MEM_freeN(menustr);
+
+
+ if (pose->active_group) {
+ bActionGroup *grp= (bActionGroup *)BLI_findlink(&pose->agroups, pose->active_group-1);
+
+ /* active group */
+ but= uiDefBut(block, TEX, REDRAWBUTSEDIT,"", xco+18,85,140-18-20,20, grp->name, 0, 31, 0, 0, "Displays current Pose Group name. Click to change.");
+ uiButSetFunc(but, verify_posegroup_groupname, pose, grp);
+ uiDefIconBut(block, BUT, B_POSEGRP_REMOVE, VICON_X, xco+140-20, 85, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Remove this Pose Group");
+
+ /* set custom color set */
+ uiDefButI(block, NUM,B_POSEGRP_RECALC, "GroupColor: ", xco,65,110,19, &grp->customCol, 0, 20, 0.0, 0.0, "Index of set of Custom Colors to shade Group's bones with. 0 = Use Default Color Scheme");
+ if (grp->customCol) {
+ bTheme *btheme= U.themes.first;
+ ThemeWireColor *col_set= &btheme->tarm[(grp->customCol - 1)];
+
+ uiSetButLock(1, "To change these colors, see Themes -> Bone Color Sets");
+
+ uiDefButC(block, COL, B_POSEGRP_RECALC, "", xco+110, 65, 10, 19, col_set->solid, 0, 0, 0, 0, "Color to use for surface of bones. See current theme in Info Window.");
+ uiDefButC(block, COL, B_POSEGRP_RECALC, "", xco+120, 65, 10, 19, col_set->select, 0, 0, 0, 0, "Color to use for 'selected' bones. See current theme in Info Window.");
+ uiDefButC(block, COL, B_POSEGRP_RECALC, "", xco+130, 65, 10, 19, col_set->active, 0, 0, 0, 0, "Color to use for 'active' bones. See current theme in Info Window.");
+
+ uiClearButLock();
+ }
+ }
+ uiBlockEndAlign(block);
+ }
+ }
+ return;
+ }
+
/* vertex group... partially editmode... */
if(ob->type==OB_MESH || ob->type==OB_LATTICE) {
bDeformGroup *defGroup;
@@ -4603,23 +5283,30 @@ static void editing_panel_links(Object *ob)
if(ob->totcol) min= 1.0; else min= 0.0;
ma= give_current_material(ob, ob->actcol);
- if(ma) uiDefBut(block, LABEL, 0, ma->id.name+2, 318,153, 103, 20, 0, 0, 0, 0, 0, "");
+ if(G.obedit) {
+ char *str= NULL;
+ IDnames_to_pupstring(&str, NULL, "ADD NEW %x 32767", &G.main->mat, NULL, NULL);
+ uiDefButS(block, MENU, B_MATASS_BROWSE, str, 292,150,20,20, &G.buts->menunr, 0, 0, 0, 0, "Browses existing choices and assign");
+ MEM_freeN(str);
+ }
+
+ if(ma) uiDefBut(block, LABEL, 0, ma->id.name+2, 318,150, 103, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- if(ma) uiDefButF(block, COL, B_REDR, "", 292,123,31,30, &(ma->r), 0, 0, 0, 0, "");
- uiDefButC(block, NUM, B_ACTCOL, str, 324,123,100,30, &ob->actcol, min, (float)(ob->totcol), 0, 0, "Displays total number of material indices and the current index");
- uiDefBut(block, BUT,B_MATWICH, "?", 424,123,30,30, 0, 0, 0, 0, 0, "In EditMode, sets the active material index from selected faces");
+ if(ma) uiDefButF(block, COL, B_MATCOL2, "", 292,113,31,30, &(ma->r), 0, 0, 0, 0, "");
+ uiDefButC(block, NUM, B_ACTCOL, str, 324,113,100,30, &ob->actcol, min, (float)(ob->totcol), 0, 0, "Displays total number of material indices and the current index");
+ uiDefBut(block, BUT,B_MATWICH, "?", 424,113,30,30, 0, 0, 0, 0, 0, "In EditMode, sets the active material index from selected faces");
uiBlockBeginAlign(block);
- uiDefBut(block, BUT,B_MATNEW, "New", 292,98,80,20, 0, 0, 0, 0, 0, "Adds a new Material index");
- uiDefBut(block, BUT,B_MATDEL, "Delete", 374,98,80,20, 0, 0, 0, 0, 0, "Deletes this Material index");
- uiDefBut(block, BUT,B_MATSEL, "Select", 292,76,80,20, 0, 0, 0, 0, 0, "In EditMode, selects faces that have the active index");
- uiDefBut(block, BUT,B_MATDESEL, "Deselect", 374,76,80,20, 0, 0, 0, 0, 0, "Deselects everything with current indexnumber");
- uiDefBut(block, BUT,B_MATASS, "Assign", 292,47,162,26, 0, 0, 0, 0, 0, "In EditMode, assigns the active index to selected faces");
+ uiDefBut(block, BUT,B_MATNEW, "New", 292,90,80,20, 0, 0, 0, 0, 0, "Adds a new Material index");
+ uiDefBut(block, BUT,B_MATDEL, "Delete", 372,90,80,20, 0, 0, 0, 0, 0, "Deletes this Material index");
+ uiDefBut(block, BUT,B_MATSEL, "Select", 292,70,80,20, 0, 0, 0, 0, 0, "In EditMode, selects faces that have the active index");
+ uiDefBut(block, BUT,B_MATDESEL, "Deselect", 372,70,80,20, 0, 0, 0, 0, 0, "Deselects everything with current indexnumber");
+ uiDefBut(block, BUT,B_MATASS, "Assign", 292,50,160,20, 0, 0, 0, 0, 0, "In EditMode, assigns the active index to selected faces");
uiBlockBeginAlign(block);
- uiDefBut(block, BUT,B_SETSMOOTH,"Set Smooth", 291,15,80,20, 0, 0, 0, 0, 0, "In EditMode, sets 'smooth' rendering of selected faces");
- uiDefBut(block, BUT,B_SETSOLID, "Set Solid", 373,15,80,20, 0, 0, 0, 0, 0, "In EditMode, sets 'solid' rendering of selected faces");
+ uiDefBut(block, BUT,B_SETSMOOTH,"Set Smooth", 292,15,80,20, 0, 0, 0, 0, 0, "In EditMode, sets 'smooth' rendering of selected faces");
+ uiDefBut(block, BUT,B_SETSOLID, "Set Solid", 372,15,80,20, 0, 0, 0, 0, 0, "In EditMode, sets 'solid' rendering of selected faces");
uiBlockEndAlign(block);
@@ -4634,22 +5321,29 @@ void editing_panel_sculpting_tools()
sculptmode_draw_interface_tools(block,0,200);
}
-void editing_panel_sculpting_textures()
+void editing_panel_sculpting_brush()
{
- uiBlock *block= uiNewBlock(&curarea->uiblocks, "editing_panel_sculpting_textures", UI_EMBOSS, UI_HELV, curarea->win);
+ uiBlock *block= uiNewBlock(&curarea->uiblocks, "editing_panel_sculpting_brush", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Brush", "Editing", 300, 0, 318, 204)==0) return;
+ sculptmode_draw_interface_brush(block,0,200);
+}
+
+void editing_panel_sculpting_textures()
+{
+ uiBlock *block= uiNewBlock(&curarea->uiblocks, "editing_panel_sculpting_texture", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Texture", "Editing", 300, 0, 318, 204)==0) return;
+
sculptmode_draw_interface_textures(block,0,200);
}
void sculptmode_draw_interface_tools(uiBlock *block, unsigned short cx, unsigned short cy)
{
SculptData *sd;
- uiBut *but;
if(!G.scene) return;
sd= &G.scene->sculptdata;
-
+
uiBlockBeginAlign(block);
uiDefBut(block,LABEL,B_NOP,"Brush",cx,cy,90,19,NULL,0,0,0,0,"");
@@ -4676,9 +5370,9 @@ void sculptmode_draw_interface_tools(uiBlock *block, unsigned short cx, unsigned
uiDefButC(block,ROW,B_NOP,"Sub",cx+89,cy,89,19,&sculptmode_brush()->dir,15.0,2.0,0, 0,"Subtract depth from model [Shift]");
}
if(sd->brush_type!=GRAB_BRUSH)
- uiDefButC(block,TOG,B_NOP,"Airbrush",cx+178,cy,89,19,&sculptmode_brush()->airbrush,0,0,0,0,"Brush makes changes without waiting for the mouse to move");
+ uiDefButBitC(block, TOG, SCULPT_BRUSH_AIRBRUSH, 0, "Airbrush", cx+178,cy,89,19, &sculptmode_brush()->flag,0,0,0,0, "Brush makes changes without waiting for the mouse to move");
cy-= 20;
- but= uiDefButS(block,NUMSLI,B_NOP,"Size: ",cx,cy,268,19,&sculptmode_brush()->size,1.0,200.0,0,0,"Set brush radius in pixels");
+ uiDefButS(block,NUMSLI,B_NOP,"Size: ",cx,cy,268,19,&sculptmode_brush()->size,1.0,200.0,0,0,"Set brush radius in pixels");
cy-= 20;
if(sd->brush_type!=GRAB_BRUSH)
uiDefButC(block,NUMSLI,B_NOP,"Strength: ",cx,cy,268,19,&sculptmode_brush()->strength,1.0,100.0,0,0,"Set brush strength");
@@ -4697,34 +5391,59 @@ void sculptmode_draw_interface_tools(uiBlock *block, unsigned short cx, unsigned
cx+= 210;
}
-void sculptmode_draw_interface_textures(uiBlock *block, unsigned short cx, unsigned short cy)
+static void sculptmode_curves_reset(void *sd_v, void *j)
+{
+ SculptData *sd = sd_v;
+ sculpt_reset_curve(sd);
+ curvemapping_changed(sd->cumap, 0);
+}
+
+void sculptmode_draw_interface_brush(uiBlock *block, unsigned short cx, unsigned short cy)
{
SculptData *sd= sculpt_data();
- MTex *mtex;
- int i;
- int orig_y= cy;
- char *strp;
+ int orig_y = cy;
+ rctf rect;
uiBut *but;
uiBlockBeginAlign(block);
- uiDefBut(block,LABEL,B_NOP,"Common",cx,cy,80,20,0,0,0,0,0,"");
cy-= 20;
-
- uiBlockBeginAlign(block);
- uiDefButC(block,TOG,B_NOP, "Fade", cx,cy,80,19, &sd->texfade, 0,0,0,0,"Smooth the edges of the texture");
+ uiDefButC(block,TOG,REDRAWBUTSEDIT, "Curve", cx,cy,80,19, &sd->texfade, 0,0,0,0,"Use curve control for radial brush intensity");
cy-= 20;
+ but= uiDefBut(block, BUT, REDRAWBUTSEDIT, "Reset",cx,cy,80,19, NULL, 0,0,0,0, "Default curve preset");
+ uiButSetFunc(but, sculptmode_curves_reset, sd, NULL);
+ cy-= 25;
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
uiDefButS(block,NUM,B_NOP, "Space", cx,cy,80,19, &sd->spacing, 0,500,20,0,"Non-zero inserts N pixels between dots");
cy-= 20;
if(sd->brush_type == DRAW_BRUSH)
uiDefButC(block,NUM,B_NOP, "View", cx,cy,80,19, &sculptmode_brush()->view, 0,10,20,0,"Pulls brush direction towards view");
+ cy-= 20;
+ uiDefButBitC(block, TOG, SCULPT_BRUSH_ANCHORED, 0, "Anchored", cx,cy,80,19, &sculptmode_brush()->flag, 0,0,0,0, "Keep the brush center anchored to the initial location");
uiBlockEndAlign(block);
-
- cy= orig_y;
- cx+= 85;
+
+ /* Draw curve */
+ cx += 90;
+ cy = orig_y;
+ rect.xmin= cx; rect.xmax= cx + 178;
+ rect.ymin= cy - 160; rect.ymax= cy + 20;
uiBlockBeginAlign(block);
- uiDefBut(block,LABEL,B_NOP,"Texture",cx,cy,80,20,0,0,0,0,0,"");
- cy-= 20;
+ curvemap_buttons(block, sd->cumap, (char)0, B_NOP, 0, &rect);
+ uiBlockEndAlign(block);
+}
+
+void sculptmode_draw_interface_textures(uiBlock *block, unsigned short cx, unsigned short cy)
+{
+ SculptData *sd= sculpt_data();
+ MTex *mtex;
+ int i;
+ int orig_y= cy;
+ char *strp;
+ uiBut *but;
+ uiBlockBeginAlign(block);
+ cy-= 20;
/* TEX CHANNELS */
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_NEUTRAL);
@@ -4778,9 +5497,16 @@ void sculptmode_draw_interface_textures(uiBlock *block, unsigned short cx, unsig
if(sd->texrept != SCULPTREPT_3D) {
uiBlockBeginAlign(block);
uiDefButF(block,NUM,0, "Angle", cx,cy,115,19, &mtex->warpfac, 0,360,100,0, "Rotate texture counterclockwise");
+ /*Moved inside, so that following buttons aren't made bigger for no reason*/
+ cy-= 20;
}
- cy-= 20;
-
+
+ /* Added Rake button. Needs to be turned off if 3D is on / disappear*/
+ if(sd->texrept != SCULPTREPT_3D){
+ uiDefButC(block,TOG,B_NOP, "Rake", cx,cy,115,19, &sd->rake, 0,0,0,0,"Rotate the brush in the direction of motion");
+ cy-=20;
+ }
+
if(sd->texrept != SCULPTREPT_DRAG) {
uiBlockBeginAlign(block);
but= uiDefIconButC(block, TOG, REDRAWBUTSEDIT, sd->texsep ? ICON_UNLOCKED : ICON_LOCKED, cx,cy,20,19, &sd->texsep,0,0,0,0, "Locks the texture sizes together");
@@ -4824,6 +5550,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;
@@ -5098,6 +5825,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;
}
}
@@ -5135,7 +5876,7 @@ void weight_paint_buttons(uiBlock *block)
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, "Filter", 250, 98,60,17, &Gwp.mode, 1.0, 4.0, 0, 0, "Mix the colors with an alpha factor");
+ 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);
@@ -5200,7 +5941,7 @@ static void editing_panel_mesh_paint(void)
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, "Filter", 1212, 98,63,17, &Gvp.mode, 1.0, 4.0, 0, 0, "Mix the colors with an alpha factor");
+ 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);
@@ -5287,7 +6028,6 @@ static void editing_panel_mesh_paint(void)
static void editing_panel_mesh_texface(void)
{
- extern VPaint Gvp; /* from vpaint */
uiBlock *block;
MTFace *tf;
@@ -5318,9 +6058,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");
+ 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");
}
}
@@ -5402,7 +6142,7 @@ void editing_panel_mesh_multires()
uiBlockBeginAlign(block);
but= uiDefBut(block,BUT,B_NOP,"Add Level", cx,cy,134,19,0,0,0,0,0,"Add a new level of subdivision at the end of the chain");
- uiButSetFunc(but,multires_add_level,ob,me);
+ uiButSetFunc(but, multires_subdivide, ob, me);
uiDefButC(block, MENU, B_NOP, subsurfmenu, cx + 134, cy, 134, 19, &G.scene->toolsettings->multires_subdiv_type, 0, 0, 0, 0, "Selects type of subdivision algorithm.");
cy-= 20;
@@ -5418,7 +6158,7 @@ void editing_panel_mesh_multires()
cy-= 20;
but= uiDefButC(block,NUM,B_NOP,"Edges: ",cx,cy,268,19,(char *)&me->mr->edgelvl,1.0,me->mr->level_count,0,0,"Set level of edges to display");
- uiButSetFunc(but,multires_edge_level_update,ob,me);
+ uiButSetFunc(but,multires_edge_level_update_cb,ob,me);
cy-= 20;
uiBlockEndAlign(block);
@@ -5444,6 +6184,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()
@@ -5470,6 +6331,8 @@ void editing_panels()
if(G.obedit) {
editing_panel_mesh_tools(ob, ob->data);
editing_panel_mesh_tools1(ob, ob->data);
+ uiNewPanelTabbed("Mesh Tools 1", "Editing");
+ editing_panel_mesh_skgen(ob, ob->data);
editing_panel_mesh_uvautocalculation();
if (EM_texFaceCheck())
editing_panel_mesh_texface();
@@ -5478,6 +6341,8 @@ void editing_panels()
uiNewPanelTabbed("Multires", "Editing");
editing_panel_sculpting_tools();
uiNewPanelTabbed("Multires", "Editing");
+ editing_panel_sculpting_brush();
+ uiNewPanelTabbed("Multires", "Editing");
editing_panel_sculpting_textures();
} else {
if(G.f & (G_VERTEXPAINT | G_TEXTUREPAINT | G_WEIGHTPAINT) ) {
diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c
index 55b36ce43db..be81f0139f3 100644
--- a/source/blender/src/buttons_object.c
+++ b/source/blender/src/buttons_object.c
@@ -47,11 +47,13 @@
#include "DNA_scene_types.h"
#include "BKE_action.h"
+#include "BKE_cloth.h"
#include "BKE_global.h"
#include "BKE_main.h"
#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 +63,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 +76,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"
@@ -86,6 +90,7 @@
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_camera_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
#include "DNA_effect_types.h"
@@ -101,6 +106,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"
@@ -129,6 +135,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"
@@ -139,6 +146,7 @@
#include "BIF_editconstraint.h"
#include "BIF_editdeform.h"
+#include "BIF_editparticle.h"
#include "BSE_editipo.h"
#include "BSE_edit.h"
@@ -184,27 +192,29 @@ static void constraint_active_func(void *ob_v, void *con_v)
static void add_constraint_to_active(Object *ob, bConstraint *con)
{
- ListBase *list;
+ ListBase *list= get_active_constraints(ob);
+ bPoseChannel *pchan= get_active_posechannel(ob);
- list = get_active_constraints(ob);
if (list) {
unique_constraint_name(con, list);
BLI_addtail(list, con);
+ if (proxylocked_constraints_owner(ob, pchan))
+ con->flag |= CONSTRAINT_PROXY_LOCAL;
+
con->flag |= CONSTRAINT_ACTIVE;
- for(con= con->prev; con; con= con->prev)
+ for (con= con->prev; con; con= con->prev)
con->flag &= ~CONSTRAINT_ACTIVE;
}
}
/* returns base ID for Ipo, sets actname to channel if appropriate */
/* should not make action... */
-void get_constraint_ipo_context(void *ob_v, char *actname)
+static void get_constraint_ipo_context(void *ob_v, char *actname)
{
Object *ob= ob_v;
- /* todo; check object if it has ob-level action ipo */
-
+ /* todo: check object if it has ob-level action ipo */
if (ob->flag & OB_POSEMODE) {
bPoseChannel *pchan;
@@ -231,8 +241,11 @@ static void enable_constraint_ipo_func (void *ob_v, void *con_v)
get_constraint_ipo_context(ob, actname);
/* adds ipo & channels & curve if needed */
- verify_ipo((ID *)ob, ID_CO, actname, con->name);
-
+ if(con->flag & CONSTRAINT_OWN_IPO)
+ verify_ipo((ID *)ob, ID_CO, NULL, con->name, actname);
+ else
+ verify_ipo((ID *)ob, ID_CO, actname, con->name, NULL);
+
/* make sure ipowin shows it */
ob->ipowin= ID_CO;
allqueue(REDRAWIPO, ID_CO);
@@ -255,8 +268,11 @@ static void add_influence_key_to_constraint_func (void *ob_v, void *con_v)
get_constraint_ipo_context(ob, actname);
/* adds ipo & channels & curve if needed */
- icu= verify_ipocurve((ID *)ob, ID_CO, actname, con->name, CO_ENFORCE);
-
+ if(con->flag & CONSTRAINT_OWN_IPO)
+ icu= verify_ipocurve((ID *)ob, ID_CO, NULL, con->name, actname, CO_ENFORCE);
+ else
+ icu= verify_ipocurve((ID *)ob, ID_CO, actname, con->name, NULL, CO_ENFORCE);
+
if (!icu) {
error("Cannot get a curve from this IPO, may be dealing with linked data");
return;
@@ -325,74 +341,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_PYTHON:
- strcpy(str, "Script");
- return;
- 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;
- case CONSTRAINT_TYPE_TRANSFORM:
- strcpy(str, "Transformation");
- break;
- default:
- strcpy (str, "Unknown");
- return;
- }
-}
-
void const_moveUp(void *ob_v, void *con_v)
{
bConstraint *con, *constr= con_v;
@@ -478,6 +426,29 @@ void autocomplete_vgroup(char *str, void *arg_v)
}
}
+/* pole angle callback */
+void con_kinematic_set_pole_angle(void *ob_v, void *con_v)
+{
+ 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;
+ }
+ }
+}
+
+/* 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
@@ -492,7 +463,6 @@ static void draw_constraint_spaceselect (uiBlock *block, bConstraint *con, short
bwidth = 125;
tarx = 120;
ownx = 0;
-
}
else if (target == -1) {
bwidth = 125;
@@ -536,45 +506,50 @@ static void draw_constraint_spaceselect (uiBlock *block, bConstraint *con, short
/* draw panel showing settings for a constraint */
static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, short *xco, short *yco)
{
- Object *ob= OBACT, *target;
+ Object *ob= OBACT;
+ bPoseChannel *pchan= get_active_posechannel(ob);
+ bConstraintTypeInfo *cti;
uiBut *but;
- char typestr[64], *subtarget;
+ char typestr[32];
short height, width = 265;
- short is_armature_target, is_geom_target, is_armature_owner;
+ short proxy_protected;
int rb_col;
- target= get_constraint_target(con, &subtarget);
- is_armature_target= (target && target->type==OB_ARMATURE);
- is_armature_owner= ((ob->type == OB_ARMATURE) && (ob->flag & OB_POSEMODE));
- is_geom_target= (target && (ELEM(target->type, OB_MESH, OB_LATTICE)) );
-
+ /* get constraint typeinfo */
+ 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);
+
+ /* determine whether constraint is proxy protected or not */
+ if (proxylocked_constraints_owner(ob, pchan)) {
+ proxy_protected= (con->flag & CONSTRAINT_PROXY_LOCAL) ? 0 : 1;
+ }
+ else
+ proxy_protected= 0;
+
/* unless button has own callback, it adds this callback to button */
uiBlockSetFunc(block, constraint_active_func, ob, con);
-
- get_constraint_typestring(typestr, con);
/* Draw constraint header */
uiBlockSetEmboss(block, UI_EMBOSSN);
/* rounded header */
- rb_col= (con->flag & CONSTRAINT_ACTIVE)?40:20;
+ rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-1, width+40, 22, NULL, 5.0, 0.0,
(con->flag & CONSTRAINT_EXPAND)?3:15 , rb_col-20, "");
/* 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 */
- 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 constraint up in constraint stack");
- uiButSetFunc(but, constraint_moveUp, ob, con);
-
- 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) {
+ /* name */
+ if ((con->flag & CONSTRAINT_EXPAND) && (proxy_protected==0)) {
if (con->flag & CONSTRAINT_DISABLE)
uiBlockSetCol(block, TH_REDALERT);
@@ -598,14 +573,69 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
uiBlockSetCol(block, TH_AUTO);
- uiBlockSetEmboss(block, UI_EMBOSSN);
+ /* proxy-protected constraints cannot be edited, so hide up/down + close buttons */
+ if (proxy_protected) {
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ /* draw a ghost icon (for proxy) and also a lock beside it, to show that constraint is "proxy locked" */
+ uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, ICON_GHOST, *xco+244, *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Proxy Protected");
+ uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, ICON_LOCKED, *xco+262, *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Proxy Protected");
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+ else {
+ short prev_proxylock, show_upbut, show_downbut;
+
+ /* Up/Down buttons:
+ * Proxy-constraints are not allowed to occur after local (non-proxy) constraints
+ * as that poses problems when restoring them, so disable the "up" button where
+ * it may cause this situation.
+ *
+ * Up/Down buttons should only be shown (or not greyed - todo) if they serve some purpose.
+ */
+ if (proxylocked_constraints_owner(ob, pchan)) {
+ if (con->prev) {
+ prev_proxylock= (con->prev->flag & CONSTRAINT_PROXY_LOCAL) ? 0 : 1;
+ }
+ else
+ prev_proxylock= 0;
+ }
+ else
+ prev_proxylock= 0;
+
+ show_upbut= ((prev_proxylock == 0) && (con->prev));
+ show_downbut= (con->next) ? 1 : 0;
+
+ if (show_upbut || show_downbut) {
+ uiBlockBeginAlign(block);
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+ if (show_upbut) {
+ 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);
+ }
+
+ if (show_downbut) {
+ 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);
+ }
+
+
+ /* Close 'button' - emboss calls here disable drawing of 'button' behind X */
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ but = uiDefIconBut(block, BUT, B_CONSTRAINT_CHANGETARGET, ICON_X, *xco+262, *yco, 19, 19, list, 0.0, 0.0, 0.0, 0.0, "Delete constraint");
+ uiButSetFunc(but, del_constraint_func, ob, con);
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+
+ /* Set but-locks for protected settings (magic numbers are used here!) */
+ if (proxy_protected)
+ uiSetButLock(1, "Cannot edit Proxy-Protected Constraint");
- but = uiDefIconBut(block, BUT, B_CONSTRAINT_CHANGETARGET, ICON_X, *xco+262, *yco, 19, 19, list, 0.0, 0.0, 0.0, 0.0, "Delete constraint");
- uiButSetFunc(but, del_constraint_func, ob, con);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
-
/* Draw constraint data */
if ((con->flag & CONSTRAINT_EXPAND) == 0) {
(*yco) -= 21;
@@ -615,11 +645,14 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
case CONSTRAINT_TYPE_PYTHON:
{
bPythonConstraint *data = con->data;
+ bConstraintTarget *ct;
uiBut *but2;
+ int tarnum, theight;
static int pyconindex=0;
char *menustr;
- height = 110;
+ 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, "");
@@ -632,42 +665,62 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
uiButSetFunc(but2, validate_pyconstraint_cb, data, &pyconindex);
MEM_freeN(menustr);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+60, *yco-48, 55, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ /* draw target(s) */
if (data->flag & PYCON_USETARGETS) {
/* Draw target parameters */
- uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-48, 150, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-66,150,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else if (is_geom_target) {
- 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, "");
+ 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), 80, 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);
}
-
- 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-88, (width/2),18, NULL, 0, 24, 0, 0, "Change some of the constraint's settings.");
- uiButSetFunc(but, BPY_pyconstraint_settings, data, NULL);
-
- uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Refresh", *xco+((width/2)+10), *yco-88, (width/2),18, NULL, 0, 24, 0, 0, "Force constraint to refresh it's settings");
+ 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 */
- if ((data->flag & PYCON_USETARGETS)==0) is_armature_target = -1;
- draw_constraint_spaceselect(block, con, *xco, *yco-109, is_armature_owner, is_armature_target);
+ draw_constraint_spaceselect(block, con, *xco, *yco-(73+theight), is_armature_owner(ob), -1);
}
break;
case CONSTRAINT_TYPE_ACTION:
@@ -682,48 +735,50 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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/type buttons */
uiBlockBeginAlign(block);
- 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");
+ 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");
+ 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");
+ 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);
+ draw_constraint_spaceselect(block, con, *xco, *yco-104, -1, is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_CHILDOF:
@@ -735,53 +790,52 @@ 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, "Parent:", *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) {
- 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) {
- 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, "");
- }
-
+ 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");
+ 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");
+ 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");
+ 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);
- 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);
+ 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, con, 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, con, NULL);
uiBlockEndAlign(block);
}
break;
@@ -796,40 +850,39 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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 if (is_geom_target) {
- 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, "");
- }
-
+ 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, *yco-89, (width/2), 18, &data->flag, 0, 24, 0, 0, "Add original location onto copied location");
- if (is_armature_target) {
- uiDefButBitI(block, TOG, LOCLIKE_TIP, B_CONSTRAINT_TEST, "Target Bone Tail", *xco+(width/2), *yco-89, (width/2), 18, &data->flag, 0, 24, 0, 0, "Copy Location of Target Bone's Tail");
+ 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, is_armature_target);
+ draw_constraint_spaceselect(block, con, *xco, *yco-109, is_armature_owner(ob), is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_ROTLIKE:
@@ -840,37 +893,39 @@ 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 if (is_geom_target) {
- 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, "");
- }
-
+ 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, 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, is_armature_target);
+ draw_constraint_spaceselect(block, con, *xco, *yco-94, is_armature_owner(ob), is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_SIZELIKE:
@@ -885,173 +940,228 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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 if (is_geom_target) {
- 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, "");
- }
-
+ 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, 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, is_armature_target);
+ 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, "");
+ /* 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 */
- 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");
-
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) {
- 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");
+ 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 Tail", *xco, *yco-64, 137, 19, &data->flag, 0, 0, 0, 0, "Include Bone's tail as 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");
+ uiDefButS(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 = 96;
+ 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 if (is_geom_target) {
- 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, "");
- }
-
+ 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);
- /* constraint space settings */
- draw_constraint_spaceselect(block, con, *xco, *yco-94, is_armature_owner, is_armature_target);
+ 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 if (is_geom_target) {
- 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, "");
- }
-
+ 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, MINMAX_STICKY, B_CONSTRAINT_TEST, "Sticky", *xco, *yco-24, 44, 18, &data->flag, 0, 24, 0, 0, "Immobilize object while constrained");
+ uiDefButBitI(block, TOG, MINMAX_USEROT, 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:
@@ -1064,39 +1174,38 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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 if (is_geom_target) {
- 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, "");
- }
-
+ 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;
@@ -1113,28 +1222,28 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
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;
@@ -1146,46 +1255,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 if (is_geom_target) {
- 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, "");
- }
-
+ 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;
@@ -1196,42 +1309,45 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
int togButWidth = 50;
int textButWidth = ((width/2)-togButWidth);
- height = 106;
+ height = 136;
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), -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);
+ /* special option(s) */
+ uiDefButBitS(block, TOG, LIMIT_TRANSFORM, B_CONSTRAINT_TEST, "For Transform", *xco+(width/4), *yco-100, (width/2), 18, &data->flag2, 0, 24, 0, 0, "Transforms are affected by this constraint as well");
+
/* constraint space settings */
- draw_constraint_spaceselect(block, con, *xco, *yco-100, is_armature_owner, -1);
+ draw_constraint_spaceselect(block, con, *xco, *yco-130, is_armature_owner(ob), -1);
}
break;
case CONSTRAINT_TYPE_ROTLIMIT:
@@ -1239,31 +1355,34 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
bRotLimitConstraint *data = con->data;
int normButWidth = (width/3);
- height = 106;
+ height = 136;
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);
+ /* special option(s) */
+ uiDefButBitS(block, TOG, LIMIT_TRANSFORM, B_CONSTRAINT_TEST, "For Transform", *xco+(width/4), *yco-100, (width/2), 18, &data->flag2, 0, 24, 0, 0, "Transforms are affected by this constraint as well");
+
/* constraint space settings */
- draw_constraint_spaceselect(block, con, *xco, *yco-100, is_armature_owner, -1);
+ draw_constraint_spaceselect(block, con, *xco, *yco-130, is_armature_owner(ob), -1);
}
break;
case CONSTRAINT_TYPE_SIZELIMIT:
@@ -1273,45 +1392,96 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
int togButWidth = 50;
int textButWidth = ((width/2)-togButWidth);
- height = 106;
+ height = 136;
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);
+ /* special option(s) */
+ uiDefButBitS(block, TOG, LIMIT_TRANSFORM, B_CONSTRAINT_TEST, "For Transform", *xco+(width/4), *yco-100, (width/2), 18, &data->flag2, 0, 24, 0, 0, "Transforms are affected by this constraint as well");
+
/* constraint space settings */
- draw_constraint_spaceselect(block, con, *xco, *yco-100, is_armature_owner, -1);
+ draw_constraint_spaceselect(block, con, *xco, *yco-130, is_armature_owner(ob), -1);
+ }
+ break;
+ case CONSTRAINT_TYPE_DISTLIMIT:
+ {
+ bDistLimitConstraint *data = con->data;
+
+ height = 105;
+ 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(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);
+ if (is_armature_target(data->tar)) {
+ uiDefButF(block, BUT, B_CONSTRAINT_TEST, "R", *xco, *yco-60, 20, 18, &data->dist, 0, 0, 0, 0, "Recalculate distance");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Distance:", *xco+18, *yco-60,139,18, &data->dist, 0.0, 100, 0.5, 0.5, "Radius of limiting sphere");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Head/Tail:", *xco+155, *yco-60,100,18, &con->headtail, 0.0, 1, 0.1, 0.1, "Target along length of bone: Head=0, Tail=1");
+ }
+ else {
+ uiDefButF(block, BUT, B_CONSTRAINT_TEST, "R", *xco, *yco-60, 20, 18, &data->dist, 0, 0, 0, 0, "Recalculate distance");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Distance:", *xco+18, *yco-60, 237, 18, &data->dist, 0.0, 100, 0.5, 0.5, "Radius of limiting sphere");
+ }
+
+ /* disabled soft-distance controls... currently it doesn't work yet. It was intended to be used for soft-ik (see xsi-blog for details) */
+#if 0
+ uiDefButBitS(block, TOG, LIMITDIST_USESOFT, B_CONSTRAINT_TEST, "Soft", *xco, *yco-82, 50, 18, &data->flag, 0, 24, 0, 0, "Enables soft-distance");
+ if (data->flag & LIMITDIST_USESOFT)
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Soft-Distance:", *xco+50, *yco-82, 187, 18, &data->soft, 0.0, 100, 0.5, 0.5, "Distance surrounding radius when transforms should get 'delayed'");
+#endif
+ uiBlockEndAlign(block);
+
+ uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Limit Mode%t|Inside %x0|Outside %x1|Surface %x2", *xco+((width/2)-50), *yco-104, 100, 18, &data->mode, 0, 24, 0, 0, "Distances in relation to sphere of influence to allow");
}
break;
case CONSTRAINT_TYPE_RIGIDBODYJOINT:
@@ -1324,7 +1494,7 @@ 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|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;
@@ -1334,10 +1504,10 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
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");
@@ -1349,58 +1519,69 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
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);
}
}
@@ -1419,18 +1600,18 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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-86, 90, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
- uiDefButBitI(block, TOG, CLAMPTO_CYCLIC, B_CONSTRAINT_TEST, "Cyclic", *xco+((width/2)), *yco-86,60,19, &data->flag2, 0, 0, 0, 0, "Treat curve as cyclic curve (no clamping to curve bounding box)");
- uiBlockEndAlign(block);
+ //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:
@@ -1446,20 +1627,19 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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) {
- 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) {
- 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, "");
- }
-
+ 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? */
@@ -1470,9 +1650,9 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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");
+ 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*/
@@ -1490,21 +1670,21 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
}
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");
+ 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");
+ 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");
+ 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);
@@ -1513,9 +1693,9 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* 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");
+ 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*/
@@ -1533,25 +1713,25 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
}
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");
+ 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");
+ 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");
+ 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, is_armature_target);
+ draw_constraint_spaceselect(block, con, *xco, *yco-170, is_armature_owner(ob), is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_NULL:
@@ -1564,11 +1744,11 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
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");
@@ -1583,6 +1763,9 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
else {
(*yco)-=3;
}
+
+ /* clear any locks set up for proxies/lib-linking */
+ uiClearButLock();
}
static uiBlock *add_constraintmenu(void *arg_unused)
@@ -1610,6 +1793,7 @@ static uiBlock *add_constraintmenu(void *arg_unused)
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_DISTLIMIT, "Limit Distance", 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, "");
@@ -1625,13 +1809,13 @@ static uiBlock *add_constraintmenu(void *arg_unused)
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_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_PYTHON, "Script", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
@@ -1669,7 +1853,7 @@ void do_constraintbuts(unsigned short event)
{
con = add_new_constraint(CONSTRAINT_TYPE_NULL);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
@@ -1842,6 +2026,14 @@ void do_constraintbuts(unsigned short event)
BIF_undo_push("Add constraint");
}
break;
+ case B_CONSTRAINT_ADD_DISTLIMIT:
+ {
+ con = add_new_constraint(CONSTRAINT_TYPE_DISTLIMIT);
+ add_constraint_to_active(ob, con);
+
+ BIF_undo_push("Add constraint");
+ }
+ break;
default:
break;
@@ -2030,7 +2222,7 @@ void do_object_panels(unsigned short event)
case B_DUPLI_VERTS:
ob->transflag &= ~(OB_DUPLIFRAMES|OB_DUPLIFACES|OB_DUPLIGROUP);
DAG_scene_sort(G.scene);
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA|OB_RECALC_OB);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSOBJECT, 0);
break;
@@ -2081,9 +2273,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) {
@@ -2146,11 +2345,86 @@ 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;
+ case B_CLOTH_CLEARCACHEALL:
+ {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ if(clmd)
+ {
+ // do nothing in editmode
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_EDITMODE)
+ break;
+
+ /* force freeing because user wants */
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+
+ /*user wants to free all, so free whole cloth, this helps to start sim at later frame */
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+
+ CFRA= 1;
+ update_for_newframe_muted();
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ cloth_clear_cache(ob, clmd, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ break;
+ case B_CLOTH_CLEARCACHEFRAME:
+ {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ if(clmd)
+ {
+ // do nothing in editmode
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_EDITMODE)
+ break;
+
+ /* force freeing because user wants */
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+
+ cloth_clear_cache(ob, clmd, MAX2(0.0,G.scene->r.cfra));
+ // MAX2(1.0,G.scene->r.cfra + 1.0)
+ allqueue(REDRAWBUTSOBJECT, 0);
+ }
+ }
+ break;
+ case B_CLOTH_CHANGEPREROLL:
+ {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ if(clmd)
+ {
+ // do nothing in editmode
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_EDITMODE)
+ break;
+
+ CFRA= 1;
+ update_for_newframe_muted();
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ break;
+ case B_CLOTH_RENEW:
+ {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+
+ if(clmd)
+ {
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ break;
default:
if(event>=B_SELEFFECT && event<B_SELEFFECT+MAX_EFFECT) {
@@ -2218,8 +2492,7 @@ static void group_ob_rem(void *gr_v, void *ob_v)
{
Object *ob= OBACT;
- rem_from_group(gr_v, ob);
- if(find_group(ob)==NULL) {
+ if(rem_from_group(gr_v, ob) && find_group(ob, NULL)==NULL) {
ob->flag &= ~OB_FROMGROUP;
BASACT->flag &= ~OB_FROMGROUP;
}
@@ -2246,23 +2519,26 @@ static void object_panel_object(Object *ob)
Group *group;
int a, xco, yco=0;
short dx= 33, dy= 30;
-
+ int is_libdata = object_is_libdata(ob);
block= uiNewBlock(&curarea->uiblocks, "object_panel_object", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Object and Links", "Object", 0, 0, 318, 204)==0) return;
- uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+
/* object name */
uiBlockSetCol(block, TH_BUT_SETTING2);
+ uiSetButLock(is_libdata, ERROR_LIBDATA_MESSAGE);
xco= std_libbuttons(block, 10, 180, 0, NULL, 0, ID_OB, 0, &ob->id, NULL, &(G.buts->menunr), B_OBALONE, B_OBLOCAL, 0, 0, B_KEEPDATA);
uiBlockSetCol(block, TH_AUTO);
/* parent */
+ uiSetButLock(is_libdata, ERROR_LIBDATA_MESSAGE);
uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_OBJECTPANELPARENT, "Par:", xco+5, 180, 305-xco, 20, &ob->parent, "Parent Object");
- /* TODO, check for ob->id.lib */
+ uiSetButLock(is_libdata, ERROR_LIBDATA_MESSAGE);
but = uiDefButS(block, NUM, B_NOP, "PassIndex:", xco+5, 150, 305-xco, 20, &ob->index, 0.0, 1000.0, 0, 0, "Index # for the IndexOB render pass.");
-
+
+ uiSetButLock(1, NULL);
uiDefBlockBut(block, add_groupmenu, NULL, "Add to Group", 10,150,150,20, "Add Object to a new Group");
/* all groups */
@@ -2309,15 +2585,22 @@ static void object_panel_object(Object *ob)
uiNewPanelHeight(block, 204 - (120-yco));
}
+static void object_panel_anim_timeoffset_callback( void *data, void *timeoffset_ui) {
+ Object *ob = (Object *)data;
+ ob->sf = (*(float *)timeoffset_ui) - (give_timeoffset(ob) - ob->sf);
+}
+
static void object_panel_anim(Object *ob)
{
uiBlock *block;
+ uiBut *but;
+ static float timeoffset_ui;
char str[32];
block= uiNewBlock(&curarea->uiblocks, "object_panel_anim", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Anim settings", "Object", 320, 0, 318, 204)==0) return;
- uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+ uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
uiBlockBeginAlign(block);
uiDefButS(block, ROW,B_TRACKBUTS,"TrackX", 24,180,59,19, &ob->trackflag, 12.0, 0.0, 0, 0, "Specify the axis that points to another object");
@@ -2342,15 +2625,17 @@ static void object_panel_anim(Object *ob)
uiDefButBitS(block, TOG, OB_DUPLIVERTS, B_DUPLI_VERTS, "DupliVerts", 119,130,95,20, &ob->transflag, 0, 0, 0, 0, "Duplicate child objects on all vertices");
uiDefButBitS(block, TOG, OB_DUPLIFACES, B_DUPLI_FACES, "DupliFaces", 214,130,102,20, &ob->transflag, 0, 0, 0, 0, "Duplicate child objects on all faces");
uiDefButBitS(block, TOG, OB_DUPLIGROUP, B_DUPLI_GROUP, "DupliGroup", 24,110,150,20, &ob->transflag, 0, 0, 0, 0, "Enable group instancing");
- if(ob->transflag & OB_DUPLIFRAMES)
+ if(ob->transflag & OB_DUPLIFRAMES) {
uiDefButBitS(block, TOG, OB_DUPLINOSPEED, REDRAWVIEW3D, "No Speed", 174,110,142,20, &ob->transflag, 0, 0, 0, 0, "Set dupliframes to still, regardless of frame");
- else if(ob->transflag & OB_DUPLIVERTS)
+ } else if(ob->transflag & OB_DUPLIVERTS) {
uiDefButBitS(block, TOG, OB_DUPLIROT, REDRAWVIEW3D, "Rot", 174,110,142,20, &ob->transflag, 0, 0, 0, 0, "Rotate dupli according to vertex normal");
- else if(ob->transflag & OB_DUPLIFACES)
- uiDefButBitS(block, TOG, OB_DUPLIFACES_SCALE, REDRAWVIEW3D, "Scale", 174,110,142,20, &ob->transflag, 0, 0, 0, 0, "Scale dupli based on face size");
- else
+ } else if(ob->transflag & OB_DUPLIFACES) {
+ uiDefButBitS(block, TOG, OB_DUPLIFACES_SCALE, REDRAWVIEW3D, "Scale", 174,110,80,20, &ob->transflag, 0, 0, 0, 0, "Scale dupli based on face size");
+ uiDefButF(block, NUM, REDRAWVIEW3D, "", 254,110,62,20, &ob->dupfacesca, 0.001, 10000.0, 0, 0, "Scale the DupliFace objects");
+ } else {
uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_GROUP_RELINK, "GR:", 174,110,142,20, &ob->dup_group, "Instance an existing group");
-
+ }
+
uiBlockBeginAlign(block);
/* DupSta and DupEnd are both shorts, so the maxframe is greater then their range
just limit the buttons to the max short */
@@ -2358,19 +2643,29 @@ static void object_panel_anim(Object *ob)
uiDefButI(block, NUM, REDRAWVIEW3D, "DupOn:", 170,85,146,19, &ob->dupon, 1.0, 1500.0, 0, 0, "Specify the number of frames to use between DupOff frames");
uiDefButI(block, NUM, REDRAWVIEW3D, "DupEnd", 24,65,140,19, &ob->dupend, 1.0, 32767, 0, 0, "Specify endframe for Dupliframes");
uiDefButI(block, NUM, REDRAWVIEW3D, "DupOff", 171,65,145,19, &ob->dupoff, 0.0, 1500.0, 0, 0, "Specify recurring frames to exclude from the Dupliframes");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, OB_OFFS_OB, REDRAWALL, "Offs Ob", 24,35,56,20, &ob->ipoflag, 0, 0, 0, 0, "Not functional at the moment!");
- uiDefButBitS(block, TOG, OB_OFFS_PARENT, REDRAWALL, "Offs Par", 82,35,56,20 , &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on the parent");
- uiDefButBitS(block, TOG, OB_OFFS_PARTICLE, REDRAWALL, "Offs Particle", 140,35,103,20, &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on the particle effect");
+
+ timeoffset_ui = give_timeoffset(ob);
+ but = uiDefButF(block, NUM, REDRAWALL, "TimeOffset:", 24,35,115,20, &timeoffset_ui, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Animation offset in frames for ipo's and dupligroup instances");
+ uiButSetFunc(but, object_panel_anim_timeoffset_callback, ob, &timeoffset_ui);
+
+ uiDefBut(block, BUT, B_AUTOTIMEOFS, "Auto", 139,35,34,20, 0, 0, 0, 0, 0, "Assign selected objects a timeoffset within a range, starting from the active object");
+ uiDefBut(block, BUT, B_OFSTIMEOFS, "Ofs", 173,35,34,20, 0, 0, 0, 0, 0, "Offset selected objects timeoffset");
+ uiDefBut(block, BUT, B_RANDTIMEOFS, "Rand", 207,35,34,20, 0, 0, 0, 0, 0, "Randomize selected objects timeoffset");
+ uiDefBut(block, BUT, B_PRINTSPEED, "PrSpeed", 250,35,65,20, 0, 0, 0, 0, 0, "Print objectspeed");
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, REDRAWALL, "TimeOffset:", 24,10,115,20, &ob->sf, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify an offset in frames");
- uiDefBut(block, BUT, B_AUTOTIMEOFS, "Automatic Time", 139,10,104,20, 0, 0, 0, 0, 0, "Generate automatic timeoffset values for all selected frames");
- uiDefBut(block, BUT, B_PRINTSPEED, "PrSpeed", 248,10,67,20, 0, 0, 0, 0, 0, "Print objectspeed");
+ uiDefButBitS(block, TOG, OB_OFFS_OB, REDRAWALL, "OfsEdit", 24,10,56,20, &ob->ipoflag, 0, 0, 0, 0, "Use timeoffset when inserting keys and display timeoffset for ipo and action views");
+ uiDefButBitS(block, TOG, OB_OFFS_PARENT, REDRAWALL, "OfsParent", 82,10,56,20 , &ob->ipoflag, 0, 0, 0, 0, "Apply the timeoffset to this objects parent relationship");
+ uiDefButBitS(block, TOG, OB_OFFS_PARTICLE, REDRAWALL, "OfsParticle", 140,10,56,20, &ob->ipoflag, 0, 0, 0, 0, "Let the timeoffset work on the particle effect");
+ uiDefButBitS(block, TOG, OB_OFFS_PARENTADD, REDRAWALL, "AddParent", 196,10,56,20, &ob->ipoflag, 0, 0, 0, 0, "Add the parents timeoffset value");
uiBlockEndAlign(block);
sprintf(str, "%.4f", prspeed);
- uiDefBut(block, LABEL, 0, str, 247,35,63,31, NULL, 1.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, str, 260,10,63,31, NULL, 1.0, 0, 0, 0, "");
}
@@ -2382,7 +2677,7 @@ static void object_panel_draw(Object *ob)
block= uiNewBlock(&curarea->uiblocks, "object_panel_draw", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Draw", "Object", 640, 0, 318, 204)==0) return;
- uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+ uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
/* LAYERS */
xco= 120;
@@ -2444,7 +2739,7 @@ void object_panel_constraint(char *context)
block= uiNewBlock(&curarea->uiblocks, "object_panel_constraint", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Constraints", context, 960, 0, 318, 204)==0) return;
- uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+ uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
/* this is a variable height panel, newpanel doesnt force new size on existing panels */
/* so first we make it default height */
@@ -2495,14 +2790,28 @@ 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:
auto_timeoffs();
break;
+ case B_OFSTIMEOFS:
+ ofs_timeoffs();
+ break;
+ case B_RANDTIMEOFS:
+ rand_timeoffs();
+ break;
case B_FRAMEMAP:
G.scene->r.framelen= G.scene->r.framapto;
G.scene->r.framelen/= G.scene->r.images;
@@ -2616,6 +2925,244 @@ 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_ENABLE:
+ if(psys) {
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWBUTSEDIT, 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_DEPS:
+ if(event == B_PART_REDRAW_DEPS)
+ DAG_scene_sort(G.scene);
+ /* 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) {
@@ -2635,6 +3182,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;
@@ -2679,13 +3230,102 @@ 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;
+}
+
+/* Panel for collision */
+static void object_collision__enabletoggle ( void *ob_v, void *arg2 )
+{
+ Object *ob = ob_v;
+ ModifierData *md = modifiers_findByType ( ob, eModifierType_Collision );
+
+ if ( !md )
+ {
+ md = modifier_new ( eModifierType_Collision );
+ BLI_addhead ( &ob->modifiers, md );
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ else
+ {
+ BLI_remlink ( &ob->modifiers, md );
+ modifier_free ( md );
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+}
+
+/* Panels for particle interaction settings */
+static void object_panel_deflection(Object *ob)
+{
+ uiBlock *block;
+ uiBut *but;
+
+ 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;
+
+ but = uiDefButBitS(block, TOG, 1, B_REDR, "Deflection",160,160,150,20, &pd->deflect, 0, 0, 0, 0, "Deflects particles based on collision");
+ uiButSetFunc(but, object_collision__enabletoggle, ob, NULL);
+
+ 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 / Cloth", 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);
@@ -2703,67 +3343,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)
{
@@ -2785,10 +3513,14 @@ static void object_softbodies__enable(void *ob_v, void *arg2)
if (!ob->soft) {
ob->soft= sbNew();
ob->softflag |= OB_SB_GOAL|OB_SB_EDGES;
+ softbody_clear_cache(ob, CFRA);
}
}
+ /* 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)
@@ -2802,10 +3534,45 @@ static int _can_softbodies_at_all(Object *ob)
// else deny
return 0;
}
-static void object_softbodies_II(Object *ob)
+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;
+ clear_particles_from_cache(ob, psys, CFRA);
+ }
+ psys->softflag |= OB_SB_ENABLE;
+ }
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+
+ allqueue(REDRAWBUTSEDIT, 0);
+}
+
+
+#ifdef _work_on_sb_solver
+static char sbsolvers[] = "Solver %t|RKP almost SOFT not usable but for some german teachers %x1|STU ip semi implicit euler%x3|SI1 (half step)adaptive semi implict euler %x2|SI2 (use dv)adaptive semi implict euler %x4|SOFT step size controlled midpoint(1rst choice for real softbodies)%x0";
+/* SIF would have been candidate .. well lack of time .. brecht is busy .. better make a stable version for peach now :) */
+static char sbsolvers[] = "SIF semi implicit euler with fixed step size (worth a try with real stiff egdes)%x3|SOFT step size controlled midpoint(1rst choice for real softbodies)%x0";
+#else
+static char sbsolvers[] = "RKCP correct physics (harder to get stable but usefull for education :)%x1|SOFT step size controlled midpoint(1rst choice for real softbodies)%x0";
+#endif
+
+static void object_softbodies_collision(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){
@@ -2814,18 +3581,43 @@ static void object_softbodies_II(Object *ob)
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");
+ block= uiNewBlock(&curarea->uiblocks, "object_softbodies_collision", UI_EMBOSS, UI_HELV, curarea->win);
+ // uiNewPanelTabbed("Soft Body", "Physics"); /*don't really want it tabbed first */
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);
@@ -2840,19 +3632,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");
}
@@ -2864,20 +3655,14 @@ static void object_softbodies_II(Object *ob)
uiBlockEndAlign(block);
/*SOLVER SETTINGS*/
- uiDefButF(block, NUM, B_DIFF, "Error Lim:", 10,100,130,20, &sb->rklimit , 0.001, 10.0, 10, 0, "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed");
- uiDefButBitS(block, TOG, SBSO_OLDERR, B_DIFF,"O", 140,100,20,20, &sb->solverflags, 0, 0, 0, 0, "Old Error Calculation");
- uiDefButS(block, NUM, B_DIFF, "Fuzzy:", 160,100,130,20, &sb->fuzzyness, 1.00, 100.0, 10, 0, "Fuzzyness while on collision, high values make collsion handling faster but less stable");
- uiDefButBitS(block, TOG, SBSO_MONITOR, B_DIFF,"M", 290,100,20,20, &sb->solverflags, 0, 0, 0, 0, "Turn on SB diagnose console prints");
- uiDefButS(block, NUM, B_DIFF, "MinS:", 10,80,100,20, &sb->minloops, 0.00, 30000.0, 10, 0, "Minimal # solver steps/frame ");
- uiDefButS(block, NUM, B_DIFF, "MaxS:", 110,80,100,20, &sb->maxloops, 0.00, 30000.0, 10, 0, "Maximal # solver steps/frame ");
- uiDefButS(block, NUM, B_DIFF, "Choke:", 210,80,100,20, &sb->choke, 0.00, 100.0, 10, 0, "'Viscosity' inside collision target ");
+ /* done in another panel now*/
}
/* OTHER OBJECTS COLLISION STUFF */
if (ob->type==OB_MESH){
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");
}
@@ -2886,62 +3671,212 @@ static void object_softbodies_II(Object *ob)
}
uiBlockEndAlign(block);
}
+static void object_softbodies_solver(Object *ob)
+{
+ SoftBody *sb=ob->soft;
+ uiBlock *block;
+ static int val;
+ short *softflag=&ob->softflag, psys_cur=0, adaptive_mode=0;
+ int ob_has_hair=psys_ob_has_hair(ob);
+ if(!_can_softbodies_at_all(ob)) return;
+ block= uiNewBlock(&curarea->uiblocks, "object_softbodies_solver", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Soft Body Solver", "Physics", 651, 0, 318, 204)==0) return;
+
+ uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+ /* doubt that is really needed here but for now */
+ 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*/
+ if(psys_cur){
+ uiDefBut(block, LABEL, 0, "Hair is not a softbody",10,190,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, "");
+ }
+ }
+ else{
+ if ((ob->type==OB_MESH)||(ob->type==OB_CURVE) ) {
+ /*SOLVER SETTINGS*/
+ uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, 0, "Solver select",10,200,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefButS(block, MENU, B_SOFTBODY_CHANGE, sbsolvers,10,180,300,20, &sb->solver_ID, 14.0, 0.0, 0, 0, "Select Solver");
+ uiBlockEndAlign(block);
+
+ /*some have adapive step size - some not*/
+ switch (sb->solver_ID) {
+ case 0:
+ case 1:
+ {adaptive_mode = 1; break;}
+ case 3:
+ {adaptive_mode = 0; break;}
+ default: printf("SB_solver?\n"); // should never happen
+ }
+ if(adaptive_mode){
+ uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, 0, "Step size controls",10,160,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefButF(block, NUM, B_DIFF, "Error Lim:", 10,140,280,20, &sb->rklimit , 0.001, 10.0, 10, 0, "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed");
+ uiDefButBitS(block, TOG, SBSO_OLDERR, B_DIFF,"V", 290,140,20,20, &sb->solverflags, 0, 0, 0, 0, "Use velocities for automagic step sizes");
+ uiDefButS(block, NUM, B_DIFF, "MinS:", 10,120,150,20, &sb->minloops, 0.00, 30000.0, 10, 0, "Minimal # solver steps/frame ");
+ uiDefButS(block, NUM, B_DIFF, "MaxS:", 160,120,150,20, &sb->maxloops, 0.00, 30000.0, 10, 0, "Maximal # solver steps/frame ");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, 0, "Collision helpers",10,100,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefButS(block, NUM, B_DIFF, "Choke:", 10,80,150,20, &sb->choke, 0.00, 100.0, 10, 0, "'Viscosity' inside collision target ");
+ uiDefButS(block, NUM, B_DIFF, "Fuzzy:", 160,80,150,20, &sb->fuzzyness, 1.00, 100.0, 10, 0, "Fuzzyness while on collision, high values make collsion handling faster but less stable");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, 0, "Diagnosis",10,60,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefButBitS(block, TOG, SBSO_MONITOR, B_DIFF,"Print Performance to Console", 10,40,300,20, &sb->solverflags, 0, 0, 0, 0, "Turn on SB diagnose console prints");
+ uiBlockEndAlign(block);
+ }
+ else{
+ uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_DIFF, "Fuzzy:", 210,100,90,20, &sb->fuzzyness, 1.00, 100.0, 10, 0, "Fuzzyness while on collision, high values make collsion handling faster but less stable");
+ uiDefButBitS(block, TOG, SBSO_MONITOR, B_DIFF,"M", 290,100,20,20, &sb->solverflags, 0, 0, 0, 0, "Turn on SB diagnose console prints");
+ uiBlockEndAlign(block);
+ uiDefButS(block, NUM, B_DIFF, "Steps:", 10,80,100,20, &sb->minloops, 1.00, 30000.0, 10, 0, "Solver steps/frame ");
+ uiDefButS(block, NUM, B_DIFF, "Choke:", 210,80,100,20, &sb->choke, 0.00, 100.0, 10, 0, "'Viscosity' inside collision target ");
+ }
+
+ uiBlockEndAlign(block);
+
+ }
+ }
+ 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=NULL;
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 && psys){
+ 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);
}
@@ -2951,14 +3886,14 @@ static void object_softbodies(Object *ob)
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_DIFF, "Friction:", 10, 170,150,20, &sb->mediafrict, 0.0, 50.0, 10, 0, "General media friction for point movements");
uiDefButF(block, NUM, B_DIFF, "Mass:", 160, 170,150,20, &sb->nodemass , 0.001, 50000.0, 10, 0, str);
- uiDefButF(block, NUM, B_DIFF, "Grav:", 10,150,150,20, &sb->grav , 0.0, 10.0, 10, 0, "Apply gravitation to point movement");
+ uiDefButF(block, NUM, B_DIFF, "Grav:", 10,150,150,20, &sb->grav , -10.0, 10.0, 10, 0, "Apply gravitation to point movement");
uiDefButF(block, NUM, B_DIFF, "Speed:", 160,150,150,20, &sb->physics_speed , 0.01, 100.0, 10, 0, "Tweak timing for physics to control frequency and speed");
uiBlockEndAlign(block);
/* 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);
@@ -2992,179 +3927,822 @@ 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 ");
- 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'");
+ 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 Pull:", 10,30,100,20, &sb->inspring, 0.0, 0.999, 10, 0, "Edge spring stiffness when longer than rest length");
+ uiDefButF(block, NUM, B_DIFF, "E Push:", 110,30,100,20, &sb->inpush, 0.0, 0.999, 10, 0, "Edge spring stiffness when shorter than rest length");
+ uiDefButF(block, NUM, B_DIFF, "E Damp:", 210,30,100,20, &sb->infrict, 0.0, 50.0, 10, 0, "Edge spring friction");
+
+ uiDefButBitS(block, TOG,OB_SB_AERO_ANGLE,B_SOFTBODY_CHANGE, "N",10,10,20,20, softflag, 0, 0, 0, 0, "New aero(uses angle and length)");
+ uiDefButS(block, NUM, B_DIFF, "Aero:", 30,10,60,20, &sb->aeroedge, 0.00, 30000.0, 10, 0, "Make edges 'sail'");
+ uiDefButS(block, NUM, B_SOFTBODY_CHANGE, "Plas:", 90,10,60,20, &sb->plastic, 0.0, 100.0, 10, 0, "Permanent deform");
if(ob->type==OB_MESH) {
- uiDefButF(block, NUM, B_SOFTBODY_CHANGE, "Rigidity:", 160,10,150,20, &sb->secondspring, 0.0, 10.0, 10, 0, "Strenght of Springs over 2 Edges");
+ uiDefButF(block, NUM, B_SOFTBODY_CHANGE, "Be:", 150,10,80,20, &sb->secondspring, 0.0, 10.0, 10, 0, "Bendig Stiffness");
+ if (*softflag & OB_SB_QUADS){
+ uiDefButF(block, NUM, B_SOFTBODY_CHANGE, "Sh:", 230,10,80,20, &sb->shearstiff, 0.0, 1.0, 10, 0, "Shear Stiffness");
+ }
}
else sb->secondspring = 0;
uiDefBut(block, LABEL, 0, "",10,10,1,0, NULL, 0.0, 0, 0, 0, ""); /* tell UI we go to 10,10*/
}
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);
+ if(uiNewPanel(curarea, block, "Children", "Particle", 1300, 0, 318, 204)==0) return;
+ uiNewPanelTabbed("Extras", "Particle");
+
+ uiDefButS(block, MENU, B_PART_ALLOC_CHILD, "Children from:%t|Faces%x2|Particles%x1|None%x0", butx,buty,butw,buth, &part->childtype, 14.0, 0.0, 0, 0, "Create child particles");
+
+ 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);
+
+ buty -= buth/2;
+
+ uiDefButI(block, NUM, B_PART_ALLOC_CHILD, "Amount:", butx,(buty-=buth),butw,buth, &part->child_nbr, 0.0, MAX_PART_CHILDREN, 0, 0, "Amount of children/parent");
+ uiDefButI(block, NUM, B_DIFF, "Render Amount:", butx,(buty-=buth),butw,buth, &part->ren_child_nbr, 0.0, MAX_PART_CHILDREN, 0, 0, "Amount of children/parent for rendering");
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES) {
+ 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 {
+ 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);
+
+ buty -= buth/2;
+
+ /* 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);
+
+ buty -= buth/2;
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_PART_REDRAW, "Size:", butx,(buty-=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) {
+ buty -= buth/2;
+
+ /* 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 */
+ buty -= buth/2;
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Rough1:", butx,(buty-=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);
+ buty -= buth/2;
+ 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);
+ buty -= buth/2;
+ 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);
-static void object_panel_particles_motion(Object *ob)
+ if(vgnum==PSYS_VG_DENSITY)
+ psys->recalc|=PSYS_DISTR;
+ else if(vgnum!=PSYS_VG_SIZE)
+ psys->recalc|=PSYS_INIT;
+
+ 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;
+
+ 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 starting speed 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|Effector%x11|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 *)ob, (void *)(&vgnum));
+
+ butx+=butw;
+
+ but= 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");
+ if(part->type == PART_HAIR && psys->flag & PSYS_EDITED)
+ uiDefButF(block, NUM, B_PART_RECALC, "Stiff:", butx,(buty-=buth),butw,buth, &part->eff_hair, 0.0, 1.0, 0, 0, "Hair stiffness for effectors");
+ else
+ buty-=buth;
+
+ /* size changes must create a recalc event always so that sizes are updated properly */
+ uiDefButF(block, NUM, B_PART_RECALC, "Size:", butx,(buty-=buth),butw,buth, &part->size, 0.01, 100, 10, 1, "The size of the particles");
+ uiDefButF(block, NUM, B_PART_RECALC, "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_RECALC, "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_DEPS, "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_DEPS, "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_STRAND, B_PART_REDRAW, "Strand render", butx,buty-=buth,butw,buth, &part->draw, 0, 0, 0, 0, "Use the strand primitive for rendering");
+ if(part->draw & PART_DRAW_REN_STRAND) {
+ 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");
+ }
+ else {
+ 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/2,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+butw/2,buty,(butw+1)/2,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 object_panel_particle_simplification(Object *ob)
+{
+ uiBlock *block;
+ ParticleSystem *psys=psys_get_current(ob);
+ ParticleSettings *part;
+ short butx=0, buty=160, butw=150, buth=20;
+
+ if (psys==NULL) return;
+ part=psys->part;
+ if(part==NULL) return;
+
+ if(part->draw_as!=PART_DRAW_PATH || !(part->draw & PART_DRAW_REN_STRAND))
+ return;
+ if(part->childtype!=PART_CHILD_FACES)
+ return;
+ block= uiNewBlock(&curarea->uiblocks, "object_panel_particle_simplification", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Visualization", "Particle");
+ if(uiNewPanel(curarea, block, "Simplification", "Particle", 640, 0, 318, 204)==0) return;
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PART_SIMPLIFY_ENABLE, B_PART_REDRAW, "Child Simplification", butx,buty-=buth,butw,buth, &part->simplify_flag, 0, 0, 0, 0, "Remove child strands as the object becomes smaller on the screen");
+ uiBlockEndAlign(block);
+ if(part->simplify_flag & PART_SIMPLIFY_ENABLE) {
+ buty -= 10;
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_NOP, "Reference Size:", butx,(buty-=buth),butw,buth, &part->simplify_refsize, 1.0, 32768.0, 0, 0, "Reference size size in pixels, after which simplification begins");
+ uiDefButF(block, NUM, B_NOP, "Rate:", butx,(buty-=buth),butw,buth, &part->simplify_rate, 0.0, 1.0, 0, 0, "Speed of simplification");
+ uiDefButF(block, NUM, B_NOP, "Transition:", butx,(buty-=buth),butw,buth, &part->simplify_transition, 0.0, 1.0, 0, 0, "Transition period for fading out strands");
+ uiBlockEndAlign(block);
+
+ buty -= 10;
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PART_SIMPLIFY_VIEWPORT, B_PART_REDRAW, "Viewport", butx,buty-=buth,butw,buth, &part->simplify_flag, 0, 0, 0, 0, "Remove child strands as the object goes outside the viewport");
+ uiDefButF(block, NUM, B_NOP, "Rate:", butx,(buty-=buth),butw,buth, &part->simplify_viewport, 0.0, 0.999, 0, 0, "Speed of simplification");
+ uiBlockEndAlign(block);
+ }
+ 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;
+
+ 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;
-static void object_panel_particles(Object *ob)
+ 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->id.lib) uiSetButLock(1, "Can't edit library data");
- if (ob->type == OB_MESH) {
+ 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, 1000000.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 away from the target particles location 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|Object Z%x8|Object Y%x7|Object X%x6|Global Z%x5|Global Y%x4|Global X%x3|Velocity%x2|Normal%x1|None%x0", butx+butw/2,buty,butw/2,buth*4/5, &part->rotmode, 14.0, 0.0, 0, 0, "Particles initial rotation");
+ uiBlockSetCol(block, TH_BUT_SETTING2);
+ uiDefButF(block, NUM, B_PART_RECALC, "Random:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->randrotfac, 0.0, 1.0, 1, 3, "Randomize rotation");
+ uiDefButF(block, NUM, B_PART_RECALC, "Phase:", butx,(buty-=buth*4/5),butw/2,buth*4/5, &part->phasefac, -1.0, 1.0, 1, 3, "Initial rotation phase");
+ uiDefButF(block, NUM, B_PART_RECALC, "Rand:", butx+butw/2,buty,butw/2,buth*4/5, &part->randphasefac, 0.0, 1.0, 1, 3, "Randomize 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);
+ if(ELEM(part->avemode,PART_AVE_RAND,PART_AVE_SPIN))
+ 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, 10, 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, 10, 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, 10, 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, lock;
+
+ 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 */
+ 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);
- 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);
+ uiBlockSetCol(block, TH_AUTO);
- /* 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");
+ 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;
+
+ uiDefButBitI(block, TOG, PSYS_ENABLED, B_PART_ENABLE, "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);
- uiDefBut(block, LABEL, 0, "Display:", 160,150,75,20, NULL, 0.0, 0, 0, 0, "");
+ uiBlockEndAlign(block);
+ }
+
+ lock= (psys->flag & PSYS_EDITED || psys->flag & PSYS_PROTECT_CACHE);
+ if(lock)
+ 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");
+
+ 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");
+
+ if(lock) uiClearButLock();
+ 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(lock) uiSetButLock(1, "Hair is edited or cache is protected!");
+
+ 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)) {
+ if(lock) uiClearButLock();
+ 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");
+ if(lock) uiSetButLock(1, "Hair is edited or cache is protected!");
+ 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=30;
+
+ 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 */
@@ -3488,6 +5066,345 @@ errMessage:
#endif // DISABLE_ELBEEM
}
+/* Panel for cloth */
+static void object_cloth__enabletoggle(void *ob_v, void *arg2)
+{
+ Object *ob = ob_v;
+ ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
+
+ if (!md) {
+ md = modifier_new(eModifierType_Cloth);
+ BLI_addhead(&ob->modifiers, md);
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ else {
+ Object *ob = ob_v;
+ ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
+
+ if (!md)
+ return;
+
+ BLI_remlink(&ob->modifiers, md);
+
+ modifier_free(md);
+
+ BIF_undo_push("Del modifier");
+
+ ob->softflag |= OB_SB_RESET;
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWIMAGE, 0);
+ allqueue(REDRAWOOPS, 0);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ object_handle_update(ob);
+ countall();
+ }
+}
+
+static int _can_cloth_at_all(Object *ob)
+{
+ // list of Yes
+ if ((ob->type==OB_MESH)) return 1;
+ // else deny
+ return 0;
+}
+
+static void object_panel_cloth(Object *ob)
+{
+ uiBlock *block=NULL;
+ uiBut *but=NULL;
+ static int val, val2;
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+
+ block= uiNewBlock(&curarea->uiblocks, "object_cloth", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Cloth ", "Physics", 640, 0, 318, 204)==0) return;
+ uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+
+ val = (clmd ? 1:0);
+
+ if(!_can_cloth_at_all(ob))
+ {
+ uiDefBut(block, LABEL, 0, "Cloth can be activated on mesh only.", 10,200,300,20, NULL, 0.0, 0, 0, 0, "");
+ }
+ else
+ {
+ but = uiDefButI(block, TOG, REDRAWBUTSOBJECT, "Cloth", 10,200,130,20, &val, 0, 0, 0, 0, "Sets object to become cloth");
+ }
+
+ uiButSetFunc(but, object_cloth__enabletoggle, ob, NULL);
+ uiDefBut(block, LABEL, 0, "",10,10,300,0, NULL, 0.0, 0, 0, 0, ""); /* tell UI we go to 10,10*/
+
+ if(clmd)
+ {
+ int defCount;
+ char *clvg1, *clvg2;
+ char clmvg [] = "Vertex Groups%t|";
+
+ val2=0;
+
+ /* GENERAL STUFF */
+ uiClearButLock();
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT) uiSetButLock(1, "Cache is protected");
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "StructStiff:", 10,170,150,20, &clmd->sim_parms->structural, 1.0, 10000.0, 100, 0, "Overall stiffness of structure");
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "BendStiff:", 160,170,150,20, &clmd->sim_parms->bending, 0.0, 10000.0, 1000, 0, "Wrinkle coefficient (higher = less smaller but more big wrinkles)");
+ uiDefButI(block, NUM, B_CLOTH_RENEW, "Quality:", 10,150,150,20, &clmd->sim_parms->stepsPerFrame, 4.0, 100.0, 5, 0, "Quality of the simulation (higher=better=slower)");
+
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "Spring Damp:", 160,150,150,20, &clmd->sim_parms->Cdis, 0.0, 10.0, 10, 0, "Spring damping");
+ uiDefButF(block, NUM, B_DIFF, "Air Damp:", 10,130,150,20, &clmd->sim_parms->Cvi, 0.0, 10.0, 10, 0, "Air has normaly some thickness which slows falling things down");
+
+ uiDefBut(block, LABEL, 0, "Gravity:", 10,100,60,20, NULL, 0.0, 0, 0, 0, "");
+
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "X:", 70,100,80,20, &clmd->sim_parms->gravity[0], -100.0, 100.0, 10, 0, "Apply gravitation to point movement");
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "Y:", 150,100,80,20, &clmd->sim_parms->gravity[1], -100.0, 100.0, 10, 0, "Apply gravitation to point movement");
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "Z:", 230,100,80,20, &clmd->sim_parms->gravity[2], -100.0, 100.0, 10, 0, "Apply gravitation to point movement");
+ uiBlockEndAlign(block);
+
+ /* GOAL STUFF */
+ uiBlockBeginAlign(block);
+
+
+ uiDefButBitI(block, TOG, CLOTH_SIMSETTINGS_FLAG_GOAL, B_CLOTH_RENEW, "Pinning of cloth", 10,70,150,20, &clmd->sim_parms->flags, 0, 0, 0, 0, "Define forces for vertices to stick to animated position");
+
+ if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (BLI_countlist (&ob->defbase) > 0))
+ {
+ if(ob->type==OB_MESH)
+ {
+
+ defCount = sizeof (clmvg);
+ clvg1 = get_vertexgroup_menustr (ob);
+ clvg2 = MEM_callocN (strlen (clvg1) + 1 + defCount, "clothVgMS");
+ if (! clvg2) {
+ printf ("draw_modifier: error allocating memory for cloth vertex group menu string.\n");
+ return;
+ }
+ defCount = BLI_countlist (&ob->defbase);
+ if (defCount == 0)
+ {
+ clmd->sim_parms->vgroup_mass = 0;
+ }
+ else
+ {
+ if(!clmd->sim_parms->vgroup_mass)
+ clmd->sim_parms->vgroup_mass = 1;
+ else if(clmd->sim_parms->vgroup_mass > defCount)
+ clmd->sim_parms->vgroup_mass = defCount;
+ }
+
+ sprintf (clvg2, "%s%s", clmvg, clvg1);
+
+ uiDefButS(block, MENU, B_CLOTH_RENEW, clvg2, 160,70,150,20, &clmd->sim_parms->vgroup_mass, 0, defCount, 0, 0, "Browses available vertex groups");
+ MEM_freeN (clvg1);
+ MEM_freeN (clvg2);
+ }
+
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "Pin Stiff:", 10,50,150,20, &clmd->sim_parms->goalspring, 0.0, 500.0, 10, 0, "Pin (vertex target position) spring stiffness");
+ uiDefBut(block, LABEL, 0, " ", 160,50,150,20, NULL, 0.0, 0, 0, 0, "");
+ /*
+ // nobody is changing these ones anyway
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "G Damp:", 160,50,150,20, &clmd->sim_parms->goalfrict , 0.0, 50.0, 10, 0, "Goal (vertex target position) friction");
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "G Min:", 10,30,150,20, &clmd->sim_parms->mingoal, 0.0, 1.0, 10, 0, "Goal minimum, vertex group weights are scaled to match this range");
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "G Max:", 160,30,150,20, &clmd->sim_parms->maxgoal, 0.0, 1.0, 10, 0, "Goal maximum, vertex group weights are scaled to match this range");
+ */
+ }
+ else if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL)
+ {
+ uiDefBut(block, LABEL, 0, " ", 160,70,150,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "No vertex group for pinning available.", 10,50,300,20, NULL, 0.0, 0, 0, 0, "");
+ }
+
+ uiBlockEndAlign(block);
+
+ /*
+ // no tearing supported anymore since modifier stack restrictions
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, CSIMSETT_FLAG_TEARING_ENABLED, B_EFFECT_DEP, "Tearing", 10,0,150,20, &clmd->sim_parms->flags, 0, 0, 0, 0, "Sets object to become a cloth collision object");
+
+ if (clmd->sim_parms->flags & CSIMSETT_FLAG_TEARING_ENABLED)
+ {
+ uiDefButI(block, NUM, B_DIFF, "Max extent:", 160,0,150,20, &clmd->sim_parms->maxspringlen, 1.0, 1000.0, 10, 0, "Maximum extension before spring gets cut");
+ }
+
+ uiBlockEndAlign(block);
+ */
+ }
+
+ uiBlockEndAlign(block);
+
+ uiBlockEndAlign(block);
+}
+
+static void object_panel_cloth_II(Object *ob)
+{
+ uiBlock *block;
+ ClothModifierData *clmd = NULL;
+
+ block= uiNewBlock(&curarea->uiblocks, "object_cloth_II", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Cloth ", "Physics");
+ if(uiNewPanel(curarea, block, "Cloth Cache/Collisions", "Physics", 651, 0, 318, 204)==0) return;
+
+ uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+
+ clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+
+ if(clmd)
+ {
+ uiClearButLock();
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT) uiSetButLock(1, "Cache is protected");
+
+ uiDefButI(block, NUM, B_CLOTH_RENEW, "First Frame:",10,160,150,20, &clmd->sim_parms->firstframe, 0, MAXFRAME, 1, 0, "Frame on which the simulation starts");
+ uiDefButI(block, NUM, B_CLOTH_RENEW, "Last Frame:",160,160,150,20, &clmd->sim_parms->lastframe, 0, MAXFRAME, 1, 0, "Frame on which the simulation stops");
+
+ uiDefBut(block, LABEL, 0, "",10,140,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiClearButLock();
+ if (!G.relbase_valid)
+ {
+ uiDefBut(block, LABEL, 0, "Cache deactivated until file is saved.", 10,120,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, " ", 10,100,300,40, NULL, 0.0, 0, 0, 0, "");
+ }
+ else
+ {
+ uiDefButBitI(block, TOG, CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT, REDRAWVIEW3D, "Protect Cache & Enable Cache Editing", 10,120,300,20, &clmd->sim_parms->flags, 0, 0, 0, 0, "Protect cache from automatic freeing when scene changed. This also enabled the cache beeing edited in editmode.");
+
+ uiDefBut(block, LABEL, 0, "Clear cache:", 10,100,90,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_CLOTH_CLEARCACHEALL, "All", 100, 100,100,20, NULL, 0.0, 0.0, 10, 0, "Free ALL cloth cache without preroll");
+ uiDefBut(block, BUT, B_CLOTH_CLEARCACHEFRAME, "From next frame", 200, 100,110,20, NULL, 0.0, 0.0, 10, 0, "Free cloth cache starting from next frame");
+ uiDefBut(block, LABEL, 0, " ", 10,80,300,20, NULL, 0.0, 0, 0, 0, "");
+ }
+
+ uiClearButLock();
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT) uiSetButLock(1, "Cache is protected");
+
+ /*
+ TODO: implement this again in cloth!
+ if(length>1) // B_CLOTH_CHANGEPREROLL
+ uiDefButI(block, NUM, B_CLOTH_CHANGEPREROLL, "Preroll:", 10,80,145,20, &clmd->sim_parms->preroll, 0, length-1, 1, 0, "Simulation starts on this frame");
+ else
+ uiDefBut(block, LABEL, 0, " ", 10,80,145,20, NULL, 0.0, 0, 0, 0, "");
+ */
+#if WITH_BULLET == 1
+ uiDefButBitI(block, TOG, CLOTH_COLLSETTINGS_FLAG_ENABLED, B_CLOTH_RENEW, "Enable collisions", 10,60,150,20, &clmd->coll_parms->flags, 0, 0, 0, 0, "Enable collisions with this object");
+ if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED)
+ {
+ uiDefButF(block, NUM, REDRAWBUTSOBJECT, "Min Distance:", 160,60,150,20, &clmd->coll_parms->epsilon, 0.001f, 1.0, 0.01f, 0, "Minimum distance between collision objects before collision response takes in, can be changed for each frame");
+ uiDefButS(block, NUM, REDRAWBUTSOBJECT, "Collision Quality:", 10,40,150,20, &clmd->coll_parms->loop_count, 1.0, 100.0, 1.0, 0, "How many collision iterations should be done. (higher = better = slower), can be changed for each frame");
+ uiDefButF(block, NUM, REDRAWBUTSOBJECT, "Friction:", 160,40,150,20, &clmd->coll_parms->friction, 1.0, 100.0, 1.0, 0, "Friction force if a collision happened (high=slower movement when collided)");
+ }
+ else
+ uiDefBut(block, LABEL, 0, "",160,60,150,20, NULL, 0.0, 0, 0, 0, "");
+#else
+ uiDefBut(block, LABEL, 0, "No collisions available (compile with bullet).",10,60,300,20, NULL, 0.0, 0, 0, 0, "");
+#endif
+ }
+
+ uiBlockEndAlign(block);
+
+}
+
+static void object_panel_cloth_III(Object *ob)
+{
+ uiBlock *block;
+ ClothModifierData *clmd = NULL;
+
+ block= uiNewBlock(&curarea->uiblocks, "object_cloth_III", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Cloth ", "Physics");
+ if(uiNewPanel(curarea, block, "Cloth Advanced", "Physics", 651, 0, 318, 204)==0) return;
+
+ uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+
+ clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+
+ if(clmd)
+ {
+ int defCount;
+ char *clvg1, *clvg2;
+ char clmvg [] = "Vertex Groups%t|None%x0|";
+ char clmvg2 [] = "Vertex Groups%t|None%x0|";
+
+ uiClearButLock();
+ if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT) uiSetButLock(1, "Cache is protected");
+
+
+ uiDefButI(block, NUM, B_DIFF, "Autoprotect Cache From:",10,160,300,20, &clmd->sim_parms->autoprotect, 0.0, MAXFRAME + 1, 1, 0, "Frame on which the simulation gets cache protection enabled automatically (To prevent accidently cleaning it).");
+
+ uiDefButBitI(block, TOG, CLOTH_SIMSETTINGS_FLAG_SCALING, B_CLOTH_RENEW, "Enable stiffness scaling",10,130,300,20, &clmd->sim_parms->flags, 0, 0, 0, 0, "If enabled, stiffness can be scaled along a weight painted vertex group.");
+
+ if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING)&& (BLI_countlist (&ob->defbase) > 0))
+ {
+ uiDefBut(block, LABEL, 0, "StructStiff VGroup:",10,110,150,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "BendStiff VGroup:",160,110,150,20, NULL, 0.0, 0, 0, 0, "");
+
+ defCount = sizeof (clmvg);
+ clvg1 = get_vertexgroup_menustr (ob);
+ clvg2 = MEM_callocN (strlen (clvg1) + 1 + defCount, "clothVgST");
+ if (! clvg2) {
+ printf ("draw_modifier: error allocating memory for cloth vertex group menu string.\n");
+ return;
+ }
+ defCount = BLI_countlist (&ob->defbase);
+ if (defCount == 0)
+ {
+ clmd->sim_parms->vgroup_struct = 0;
+ }
+ else
+ {
+ if(clmd->sim_parms->vgroup_struct > defCount)
+ clmd->sim_parms->vgroup_struct = 0;
+ }
+
+ sprintf (clvg2, "%s%s", clmvg, clvg1);
+
+ uiDefButS(block, MENU, B_CLOTH_RENEW, clvg2, 10,90,150,20, &clmd->sim_parms->vgroup_struct, 0, defCount, 0, 0, "Browses available vertex groups");
+ MEM_freeN (clvg1);
+ MEM_freeN (clvg2);
+
+ defCount = sizeof (clmvg);
+ clvg1 = get_vertexgroup_menustr (ob);
+ clvg2 = MEM_callocN (strlen (clvg1) + 1 + defCount, "clothVgBD");
+ if (! clvg2) {
+ printf ("draw_modifier: error allocating memory for cloth vertex group menu string.\n");
+ return;
+ }
+ defCount = BLI_countlist (&ob->defbase);
+ if (defCount == 0)
+ {
+ clmd->sim_parms->vgroup_bend = 0;
+ }
+ else
+ {
+ if(clmd->sim_parms->vgroup_bend > defCount)
+ clmd->sim_parms->vgroup_bend = 0;
+ }
+
+ sprintf (clvg2, "%s%s", clmvg2, clvg1);
+
+ uiDefButS(block, MENU, B_CLOTH_RENEW, clvg2, 160,90,150,20, &clmd->sim_parms->vgroup_bend, 0, defCount, 0, 0, "Browses available vertex groups");
+ MEM_freeN (clvg1);
+ MEM_freeN (clvg2);
+
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "StructStiff Max:",10,70,150,20, &clmd->sim_parms->max_struct, clmd->sim_parms->structural, 10000.0, 0.01f, 0, "Maximum structural stiffness value");
+
+ uiDefButF(block, NUM, B_CLOTH_RENEW, "BendStiff Max:",160,70,150,20, &clmd->sim_parms->max_bend, clmd->sim_parms->bending, 10000.0, 0.01f, 0, "Maximum bending stiffness value");
+
+ }
+ else if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING)
+ {
+ uiDefBut(block, LABEL, 0, " ", 10,110,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "No vertex group for pinning available.", 10,90,300,20, NULL, 0.0, 0, 0, 0, "");
+ }
+
+
+
+ }
+
+ uiBlockEndAlign(block);
+
+}
+
void object_panels()
{
Object *ob;
@@ -3511,11 +5428,36 @@ 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_softbodies_collision(ob);
+ object_softbodies_solver(ob);
+ object_panel_cloth(ob);
+ object_panel_cloth_II(ob);
+ object_panel_cloth_III(ob);
object_panel_fluidsim(ob);
}
}
+void particle_panels()
+{
+ Object *ob;
+ ParticleSystem *psys;
+
+ ob=OBACT;
+
+ if(ob && ob->type==OB_MESH) {
+ 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_simplification(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 30bac4ea74c..4c85c11b147 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -41,6 +41,7 @@
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_sound_types.h"
+#include "DNA_sequence_types.h"
#include "DNA_userdef_types.h"
#include "DNA_packedFile_types.h"
@@ -71,6 +72,7 @@
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_toolbox.h"
+#include "BIF_editseq.h"
#include "BIF_butspace.h"
@@ -84,6 +86,7 @@
#include "BKE_writeavi.h"
#include "BKE_writeffmpeg.h"
#include "BKE_image.h"
+#include "BKE_plugin_types.h"
#include "BLI_threads.h"
@@ -91,8 +94,11 @@
#include "BIF_writeimage.h"
#include "BIF_writeavicodec.h"
-#include "BSE_seqaudio.h"
#include "BSE_headerbuttons.h"
+#include "BSE_sequence.h"
+#include "BSE_seqeffects.h"
+#include "BSE_seqscopes.h"
+#include "BSE_seqaudio.h"
#include "RE_pipeline.h"
@@ -466,6 +472,838 @@ static void sound_panel_sound(bSound *sound)
}
}
+/* ************************* Sequencer *********************** */
+
+#define SEQ_PANEL_EDITING 1
+#define SEQ_PANEL_INPUT 2
+#define SEQ_PANEL_FILTER 4
+#define SEQ_PANEL_EFFECT 8
+#define SEQ_PANEL_PROXY 16
+
+static char* seq_panel_blend_modes()
+{
+ static char string[2048];
+
+ Sequence *last_seq = get_last_seq();
+
+ sprintf(string, "Blend mode: %%t|%s %%x%d",
+ "Replace", SEQ_BLEND_REPLACE);
+
+ /*
+ Blending can only work without effect strips.
+ Otherwise, one would have
+ to decide, what the effect strips IPO should do:
+ - drive the effect _or_
+ - drive the blend mode ?
+
+ Also: effectdata is used by these implicit effects,
+ so that would collide also.
+ */
+
+ if (!(last_seq->type & SEQ_EFFECT)) {
+ int i;
+
+ for (i = SEQ_EFFECT; i <= SEQ_EFFECT_MAX; i++) {
+ if (get_sequence_effect_num_inputs(i) == 2) {
+ sprintf(string + strlen(string),
+ "|%s %%x%d",
+ give_seqname_by_type(i), i);
+ }
+ }
+ }
+ return string;
+}
+
+static char* seq_panel_scenes()
+{
+ static char rstr[8192];
+ char * str;
+
+ IDnames_to_pupstring(&str, NULL, NULL,
+ &G.main->scene, (ID *)G.scene, NULL);
+
+ strncpy(rstr, str, 8192);
+ MEM_freeN(str);
+
+ return rstr;
+}
+
+static void seq_update_scenenr(Sequence * seq)
+{
+ Scene * sce;
+ int nr;
+ if (seq->type != SEQ_SCENE) {
+ return;
+ }
+
+ seq->scenenr = 0;
+
+ sce = G.main->scene.first;
+ nr = 1;
+ while(sce) {
+ if (sce == seq->scene) {
+ seq->scenenr = nr;
+ break;
+ }
+ nr++;
+ sce = sce->id.next;
+ }
+}
+
+
+static void seq_panel_editing()
+{
+ Sequence *last_seq = get_last_seq();
+ uiBlock *block;
+ static char strdata[1024];
+ char * str = strdata;
+ char * p;
+ int yco;
+
+ block = uiNewBlock(&curarea->uiblocks, "seq_panel_editing",
+ UI_EMBOSS, UI_HELV, curarea->win);
+
+ if(uiNewPanel(curarea, block, "Edit", "Sequencer",
+ 10, 230, 318, 204) == 0) return;
+
+ uiDefBut(block, LABEL,
+ 0, give_seqname(last_seq),
+ 10,140,60,19, 0,
+ 0, 0, 0, 0, "");
+
+ uiDefBut(block, TEX,
+ B_NOP, "Name: ",
+ 70,140,180,19, last_seq->name+2,
+ 0.0, 21.0, 100, 0, "");
+
+ uiDefButI(block, MENU, B_SEQ_BUT_RELOAD, seq_panel_blend_modes(),
+ 10, 120, 120, 19, &last_seq->blend_mode,
+ 0,0,0,0, "Strip Blend Mode");
+
+ uiDefButF(block, NUM, B_SEQ_BUT_RELOAD, "Blend:",
+ 130, 120, 120, 19, &last_seq->blend_opacity,
+ 0.0, 100.0, 100.0, 0,
+ "Blend opacity");
+
+ uiDefButBitI(block, TOG, SEQ_MUTE,
+ B_SEQ_BUT_RELOAD_ALL, "Mute",
+ 10,100,60,19, &last_seq->flag,
+ 0.0, 1.0, 0, 0,
+ "Mute the current strip.");
+
+ uiDefButBitI(block, TOG, SEQ_LOCK,
+ B_NOP, "Lock",
+ 70,100,60,19, &last_seq->flag,
+ 0.0, 1.0, 0, 0,
+ "Lock strip, so that it can't be transformed.");
+
+ uiDefButBitI(block, TOG, SEQ_IPO_FRAME_LOCKED,
+ B_SEQ_BUT_RELOAD_ALL, "IPO Frame locked",
+ 130,100,120,19, &last_seq->flag,
+ 0.0, 1.0, 0, 0,
+ "Lock the IPO coordinates to the "
+ "global frame counter.");
+
+ if (!(last_seq->flag & SEQ_LOCK)) {
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "Start",
+ 10, 80, 120, 20, &last_seq->start,
+ 0.0, MAXFRAMEF, 0.0, 0.0, "Start of strip");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "Chan",
+ 130, 80, 120, 20, &last_seq->machine,
+ 0.0, MAXSEQ, 0.0, 0.0, "Channel used (Y position)");
+
+ if (check_single_seq(last_seq)) {
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "End-Still",
+ 130, 60, 120, 19, &last_seq->endstill,
+ 0.0, MAXFRAMEF, 0.0, 0.0, "End still");
+ } else {
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "Start-Still",
+ 10, 60, 120, 20, &last_seq->startstill,
+ 0.0, MAXFRAMEF, 0.0, 0.0, "Start still");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "End-Still",
+ 130, 60, 120, 19, &last_seq->endstill,
+ 0.0, MAXFRAMEF, 0.0, 0.0, "End still");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "Start-Ofs",
+ 10, 40, 120, 20, &last_seq->startofs,
+ 0.0, last_seq->len - last_seq->endofs,
+ 0.0, 0.0, "Start offset");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_TRANSFORM, "End-Ofs",
+ 130, 40, 120, 19, &last_seq->endofs,
+ 0.0, last_seq->len - last_seq->startofs,
+ 0.0, 0.0, "End offset");
+ }
+ }
+
+
+ if(last_seq->type & SEQ_EFFECT)
+ sprintf(str, "Len: %d\nFrom %d - %d\n", last_seq->len, last_seq->startdisp, last_seq->enddisp-1);
+ else
+ sprintf(str, "Len: %d(%d)\n", last_seq->enddisp-last_seq->startdisp, last_seq->len);
+
+ str += strlen(str);
+
+ if(last_seq->type==SEQ_IMAGE) {
+ if (last_seq->len > 1) {
+ /* CURRENT */
+ StripElem * se= give_stripelem(last_seq, CFRA);
+ StripElem * last;
+
+ /* 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\nLast: %s at %d\n", se->name, last_seq->startdisp, last->name, last_seq->enddisp-1);
+ }
+ } else { /* single image */
+ if (last_seq->strip) {
+ sprintf(str, "Len: %d\n", last_seq->enddisp-last_seq->startdisp);
+ }
+ }
+
+ str += strlen(str);
+
+ /* orig size */
+ if(last_seq->strip) {
+ sprintf(str, "OrigSize: %d x %d\n", last_seq->strip->orx, last_seq->strip->ory);
+ }
+ }
+ else if(last_seq->type==SEQ_MOVIE) {
+ int sta= last_seq->startofs;
+ int end= last_seq->len-1-last_seq->endofs;
+
+ sprintf(str, "First: %d at %d\nLast: %d at %d\nCur: %d\n",
+ sta, last_seq->startdisp, end, last_seq->enddisp-1,
+ (G.scene->r.cfra)-last_seq->startdisp);
+
+ str += strlen(str);
+ /* orig size */
+ if(last_seq->strip) {
+ sprintf(str, "OrigSize: %d x %d\n",
+ last_seq->strip->orx, last_seq->strip->ory);
+ }
+ }
+ else if(last_seq->type==SEQ_SCENE) {
+ TStripElem * se= give_tstripelem(last_seq, (G.scene->r.cfra));
+ if(se && last_seq->scene) {
+ sprintf(str, "First: %d\nLast: %d\nCur: %d\n", last_seq->sfra+se->nr, last_seq->sfra, last_seq->sfra+last_seq->len-1);
+ }
+ str += strlen(str);
+ /* orig size */
+ if(last_seq->strip) {
+ sprintf(str, "OrigSize: %d x %d\n",
+ last_seq->strip->orx, last_seq->strip->ory);
+ }
+ }
+ else if(last_seq->type==SEQ_RAM_SOUND
+ || last_seq->type == SEQ_HD_SOUND) {
+
+ int sta= last_seq->startofs;
+ int end= last_seq->len-1-last_seq->endofs;
+
+ sprintf(str, "First: %d at %d\nLast: %d at %d\nCur: %d\n",
+ sta, last_seq->startdisp, end, last_seq->enddisp-1,
+ (G.scene->r.cfra)-last_seq->startdisp);
+ }
+ else if(last_seq->type == SEQ_SPEED) {
+ SpeedControlVars * vars =
+ (SpeedControlVars*) last_seq->effectdata;
+
+ if (vars) {
+ sprintf(str, "Last mapped frame: %d at %d\n",
+ vars->lastValidFrame,
+ vars->lastValidFrame
+ + last_seq->startdisp);
+ }
+ }
+
+ str = strdata;
+ yco = 20;
+
+ while ((p = strchr(str, '\n'))) {
+ *p = 0;
+ uiDefBut(block, LABEL, 0, str, 10,yco,240,17, 0,
+ 0, 0, 0, 0, "");
+ str = p+1;
+ yco -= 18;
+ }
+}
+
+static void seq_panel_input()
+{
+ Sequence *last_seq = get_last_seq();
+ uiBlock *block;
+
+ block = uiNewBlock(&curarea->uiblocks, "seq_panel_input",
+ UI_EMBOSS, UI_HELV, curarea->win);
+
+ if(uiNewPanel(curarea, block, "Input", "Sequencer",
+ 10, 230, 318, 204) == 0) return;
+
+ if (last_seq->type == SEQ_MOVIE
+ || last_seq->type == SEQ_IMAGE) {
+ uiDefBut(block, TEX,
+ B_SEQ_BUT_RELOAD_FILE, "Dir: ",
+ 10,140,240,19, last_seq->strip->dir,
+ 0.0, 160.0, 100, 0, "");
+ }
+
+ if (last_seq->type == SEQ_IMAGE) {
+ StripElem * se = give_stripelem(last_seq, CFRA);
+
+ if (se) {
+ uiDefBut(block, TEX,
+ B_SEQ_BUT_RELOAD_FILE, "File: ",
+ 10, 120, 190,19, se->name,
+ 0.0, 80.0, 100, 0, "");
+ }
+
+ } else if (last_seq->type == SEQ_MOVIE ||
+ last_seq->type == SEQ_HD_SOUND ||
+ last_seq->type == SEQ_RAM_SOUND) {
+ uiDefBut(block, TEX,
+ B_SEQ_BUT_RELOAD_FILE, "File: ",
+ 10,120,190,19, last_seq->strip->stripdata->name,
+ 0.0, 80.0, 100, 0, "");
+ } else if (last_seq->type == SEQ_SCENE) {
+ seq_update_scenenr(last_seq);
+ uiDefButI(block, MENU, B_SEQ_BUT_RELOAD_FILE,
+ seq_panel_scenes(),
+ 10, 120, 190, 19, &last_seq->scenenr,
+ 0,0,0,0, "Linked Scene");
+ }
+
+ uiDefBut(block, BUT, B_SEQ_BUT_RELOAD_FILE,
+ "Reload",
+ 200,120,50,19, 0, 0, 0, 0, 0,
+ "Reload files/scenes from disk and update strip length.");
+
+ if (last_seq->type == SEQ_MOVIE
+ || last_seq->type == SEQ_IMAGE
+ || last_seq->type == SEQ_SCENE) {
+ uiDefButBitI(block, TOG, SEQ_USE_CROP,
+ B_SEQ_BUT_RELOAD, "Use Crop",
+ 10,100,240,19, &last_seq->flag,
+ 0.0, 1.0, 0, 0,
+ "Crop image before processing.");
+
+ if (last_seq->flag & SEQ_USE_CROP) {
+ if (!last_seq->strip->crop) {
+ last_seq->strip->crop =
+ MEM_callocN(sizeof(struct StripCrop),
+ "StripCrop");
+ }
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD, "Top",
+ 10, 80, 120, 20,
+ &last_seq->strip->crop->top,
+ 0.0, 4096, 0.0, 0.0, "Top of source image");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD, "Bottom",
+ 130, 80, 120, 20,
+ &last_seq->strip->crop->bottom,
+ 0.0, 4096, 0.0, 0.0,
+ "Bottom of source image");
+
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD, "Left",
+ 10, 60, 120, 20,
+ &last_seq->strip->crop->left,
+ 0.0, 4096, 0.0, 0.0, "Left");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD, "Right",
+ 130, 60, 120, 19,
+ &last_seq->strip->crop->right,
+ 0.0, 4096, 0.0, 0.0, "Right");
+ }
+
+ uiDefButBitI(block, TOG, SEQ_USE_TRANSFORM,
+ B_SEQ_BUT_RELOAD, "Use Translate",
+ 10,40,240,19, &last_seq->flag,
+ 0.0, 1.0, 0, 0,
+ "Translate image before processing.");
+
+ if (last_seq->flag & SEQ_USE_TRANSFORM) {
+ if (!last_seq->strip->transform) {
+ last_seq->strip->transform =
+ MEM_callocN(
+ sizeof(struct StripTransform),
+ "StripTransform");
+ }
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD, "X-Ofs",
+ 10, 20, 120, 20,
+ &last_seq->strip->transform->xofs,
+ 0.0, 4096, 0.0, 0.0, "X Offset");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD, "Y-Ofs",
+ 130, 20, 120, 20,
+ &last_seq->strip->transform->yofs,
+ 0.0, 4096, 0.0, 0.0, "Y Offset");
+ }
+ }
+
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD_FILE, "A-Start",
+ 10, 0, 120, 20, &last_seq->anim_startofs,
+ 0.0, last_seq->len + last_seq->anim_startofs, 0.0, 0.0,
+ "Animation start offset in file");
+ uiDefButI(block, NUM,
+ B_SEQ_BUT_RELOAD_FILE, "A-End",
+ 130, 0, 120, 20, &last_seq->anim_endofs,
+ 0.0, last_seq->len + last_seq->anim_endofs, 0.0, 0.0,
+ "Animation end offset in file");
+
+
+ if (last_seq->type == SEQ_MOVIE) {
+ uiDefButI(block, NUM, B_SEQ_BUT_RELOAD, "MPEG-Preseek:",
+ 10, -20, 240,19, &last_seq->anim_preseek,
+ 0.0, 50.0, 100,0,
+ "On MPEG-seeking preseek this many frames");
+ }
+
+}
+
+static void seq_panel_filter_video()
+{
+ Sequence *last_seq = get_last_seq();
+ uiBlock *block;
+ block = uiNewBlock(&curarea->uiblocks, "seq_panel_filter",
+ UI_EMBOSS, UI_HELV, curarea->win);
+
+ if(uiNewPanel(curarea, block, "Filter", "Sequencer",
+ 10, 230, 318, 204) == 0) return;
+
+
+ uiBlockBeginAlign(block);
+
+
+ uiDefButBitI(block, TOG, SEQ_MAKE_PREMUL,
+ B_SEQ_BUT_RELOAD, "Premul",
+ 10,110,80,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Converts RGB values to become premultiplied with Alpha");
+
+ uiDefButBitI(block, TOG, SEQ_MAKE_FLOAT,
+ B_SEQ_BUT_RELOAD, "Float",
+ 90,110,80,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Convert input to float data");
+
+ uiDefButBitI(block, TOG, SEQ_FILTERY,
+ B_SEQ_BUT_RELOAD, "FilterY",
+ 170,110,80,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "For video movies to remove fields");
+
+ uiDefButBitI(block, TOG, SEQ_FLIPX,
+ B_SEQ_BUT_RELOAD, "FlipX",
+ 10,90,80,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Flip on the X axis");
+ uiDefButBitI(block, TOG, SEQ_FLIPY,
+ B_SEQ_BUT_RELOAD, "FlipY",
+ 90,90,80,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Flip on the Y axis");
+
+ uiDefButBitI(block, TOG, SEQ_REVERSE_FRAMES,
+ B_SEQ_BUT_RELOAD, "Flip Time",
+ 170,90,80,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Reverse frame order");
+
+ uiDefButF(block, NUM, B_SEQ_BUT_RELOAD, "Mul:",
+ 10,70,120,19, &last_seq->mul,
+ 0.001, 5.0, 0.1, 0,
+ "Multiply colors");
+
+ uiDefButF(block, NUM, B_SEQ_BUT_RELOAD, "Strobe:",
+ 130,70,120,19, &last_seq->strobe,
+ 1.0, 30.0, 100, 0,
+ "Only display every nth frame");
+
+ uiDefButBitI(block, TOG, SEQ_USE_COLOR_BALANCE,
+ B_SEQ_BUT_RELOAD, "Use Color Balance",
+ 10,50,240,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Activate Color Balance "
+ "(3-Way color correction) on input");
+
+
+ if (last_seq->flag & SEQ_USE_COLOR_BALANCE) {
+ if (!last_seq->strip->color_balance) {
+ int c;
+ StripColorBalance * cb
+ = last_seq->strip->color_balance
+ = MEM_callocN(
+ sizeof(struct StripColorBalance),
+ "StripColorBalance");
+ for (c = 0; c < 3; c++) {
+ cb->lift[c] = 1.0;
+ cb->gamma[c] = 1.0;
+ cb->gain[c] = 1.0;
+ }
+ }
+
+ uiDefBut(block, LABEL, 0, "Lift",
+ 10,30,80,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "Gamma",
+ 90,30,80,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "Gain",
+ 170,30,80,19, 0, 0, 0, 0, 0, "");
+
+ uiDefButF(block, COL, B_SEQ_BUT_RELOAD, "Lift",
+ 10,10,80,19, last_seq->strip->color_balance->lift,
+ 0, 0, 0, 0, "Lift (shadows)");
+
+ uiDefButF(block, COL, B_SEQ_BUT_RELOAD, "Gamma",
+ 90,10,80,19, last_seq->strip->color_balance->gamma,
+ 0, 0, 0, 0, "Gamma (midtones)");
+
+ uiDefButF(block, COL, B_SEQ_BUT_RELOAD, "Gain",
+ 170,10,80,19, last_seq->strip->color_balance->gain,
+ 0, 0, 0, 0, "Gain (highlights)");
+
+ uiDefButBitI(block, TOG, SEQ_COLOR_BALANCE_INVERSE_LIFT,
+ B_SEQ_BUT_RELOAD, "Inv Lift",
+ 10,-10,80,19,
+ &last_seq->strip->color_balance->flag,
+ 0.0, 21.0, 100, 0,
+ "Inverse Lift");
+ uiDefButBitI(block, TOG, SEQ_COLOR_BALANCE_INVERSE_GAMMA,
+ B_SEQ_BUT_RELOAD, "Inv Gamma",
+ 90,-10,80,19,
+ &last_seq->strip->color_balance->flag,
+ 0.0, 21.0, 100, 0,
+ "Inverse Gamma");
+ uiDefButBitI(block, TOG, SEQ_COLOR_BALANCE_INVERSE_GAIN,
+ B_SEQ_BUT_RELOAD, "Inv Gain",
+ 170,-10,80,19,
+ &last_seq->strip->color_balance->flag,
+ 0.0, 21.0, 100, 0,
+ "Inverse Gain");
+ }
+
+
+ uiBlockEndAlign(block);
+
+}
+
+
+static void seq_panel_filter_audio()
+{
+ Sequence *last_seq = get_last_seq();
+ uiBlock *block;
+ block = uiNewBlock(&curarea->uiblocks, "seq_panel_filter",
+ UI_EMBOSS, UI_HELV, curarea->win);
+
+ if(uiNewPanel(curarea, block, "Filter", "Sequencer",
+ 10, 230, 318, 204) == 0) return;
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_SEQ_BUT_RELOAD, "Gain (dB):", 10,50,150,19, &last_seq->level, -96.0, 6.0, 100, 0, "");
+ uiDefButF(block, NUM, B_SEQ_BUT_RELOAD, "Pan:", 10,30,150,19, &last_seq->pan, -1.0, 1.0, 100, 0, "");
+ uiBlockEndAlign(block);
+}
+
+static void seq_panel_effect()
+{
+ Sequence *last_seq = get_last_seq();
+ uiBlock *block;
+ block = uiNewBlock(&curarea->uiblocks, "seq_panel_effect",
+ UI_EMBOSS, UI_HELV, curarea->win);
+
+ if(uiNewPanel(curarea, block, "Effect", "Sequencer",
+ 10, 230, 318, 204) == 0) return;
+
+ if(last_seq->type == SEQ_PLUGIN) {
+ PluginSeq *pis;
+ VarStruct *varstr;
+ int a, xco, yco;
+
+ get_sequence_effect(last_seq);/* make sure, plugin is loaded */
+
+ pis= last_seq->plugin;
+ if(pis->vars==0) return;
+
+ varstr= pis->varstr;
+ if(varstr) {
+ for(a=0; a<pis->vars; a++, varstr++) {
+ xco= 150*(a/6)+10;
+ yco= 125 - 20*(a % 6)+1;
+ uiDefBut(block, varstr->type, B_SEQ_BUT_PLUGIN, varstr->name, xco,yco,150,19, &(pis->data[a]), varstr->min, varstr->max, 100, 0, varstr->tip);
+
+ }
+ }
+ return;
+ }
+
+ uiBlockBeginAlign(block);
+
+ if(last_seq->type==SEQ_WIPE){
+ WipeVars *wipe = (WipeVars *)last_seq->effectdata;
+ char formatstring[256];
+
+ strncpy(formatstring, "Transition Type %t|Single Wipe%x0|Double Wipe %x1|Iris Wipe %x4|Clock Wipe %x5", 255);
+ uiDefButS(block, MENU,B_SEQ_BUT_EFFECT, formatstring, 10,65,220,22, &wipe->wipetype, 0, 0, 0, 0, "What type of wipe should be performed");
+ uiDefButF(block, NUM,B_SEQ_BUT_EFFECT,"Blur:", 10,40,220,22, &wipe->edgeWidth,0.0,1.0, 1, 2, "The percent width of the blur edge");
+ switch(wipe->wipetype){ /*Skip Types that do not require angle*/
+ case DO_IRIS_WIPE:
+ case DO_CLOCK_WIPE:
+ break;
+
+ default:
+ uiDefButF(block, NUM,B_SEQ_BUT_EFFECT,"Angle:", 10,15,220,22, &wipe->angle,-90.0,90.0, 1, 2, "The Angle of the Edge");
+ }
+ uiDefButS(block, TOG,B_SEQ_BUT_EFFECT,"Wipe In", 10,-10,220,22, &wipe->forward,0,0, 0, 0, "Controls Primary Direction of Wipe");
+ } else if(last_seq->type==SEQ_GLOW){
+ GlowVars *glow = (GlowVars *)last_seq->effectdata;
+
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "Threshold:", 10,70,150,19, &glow->fMini, 0.0, 1.0, 0, 0, "Trigger Intensity");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "Clamp:", 10,50,150,19, &glow->fClamp, 0.0, 1.0, 0, 0, "Brightness limit of intensity");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "Boost factor:", 10,30,150,19, &glow->fBoost, 0.0, 10.0, 0, 0, "Brightness multiplier");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "Blur distance:", 10,10,150,19, &glow->dDist, 0.5, 20.0, 0, 0, "Radius of glow effect");
+ uiDefButI(block, NUM, B_NOP, "Quality:", 10,-5,150,19, &glow->dQuality, 1.0, 5.0, 0, 0, "Accuracy of the blur effect");
+ uiDefButI(block, TOG, B_NOP, "Only boost", 10,-25,150,19, &glow->bNoComp, 0.0, 0.0, 0, 0, "Show the glow buffer only");
+ }
+ else if(last_seq->type==SEQ_TRANSFORM){
+ TransformVars *transform = (TransformVars *)last_seq->effectdata;
+
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "xScale Start:", 10,70,150,19, &transform->ScalexIni, 0.0, 10.0, 0, 0, "X Scale Start");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "xScale End:", 160,70,150,19, &transform->ScalexFin, 0.0, 10.0, 0, 0, "X Scale End");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "yScale Start:", 10,50,150,19, &transform->ScaleyIni, 0.0, 10.0, 0, 0, "Y Scale Start");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "yScale End:", 160,50,150,19, &transform->ScaleyFin, 0.0, 10.0, 0, 0, "Y Scale End");
+
+ uiDefButI(block, ROW, B_SEQ_BUT_EFFECT, "Percent", 10, 30, 150, 19, &transform->percent, 0.0, 1.0, 0.0, 0.0, "Percent Translate");
+ uiDefButI(block, ROW, B_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, B_SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -500.0, 500.0, 0, 0, "X Position Start");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -500.0, 500.0, 0, 0, "X Position End");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "y Start:", 10,-10,150,19, &transform->yIni, -500.0, 500.0, 0, 0, "Y Position Start");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "y End:", 160,-10,150,19, &transform->yFin, -500.0, 500.0, 0, 0, "Y Position End");
+ } else {
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -10000.0, 10000.0, 0, 0, "X Position Start");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -10000.0, 10000.0, 0, 0, "X Position End");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "y Start:", 10,-10,150,19, &transform->yIni, -10000.0, 10000.0, 0, 0, "Y Position Start");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "y End:", 160,-10,150,19, &transform->yFin, -10000.0, 10000.0, 0, 0, "Y Position End");
+
+ }
+
+
+
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "rot Start:",10,-30,150,19, &transform->rotIni, 0.0, 360.0, 0, 0, "Rotation Start");
+ uiDefButF(block, NUM, B_SEQ_BUT_EFFECT, "rot End:",160,-30,150,19, &transform->rotFin, 0.0, 360.0, 0, 0, "Rotation End");
+
+ uiDefButI(block, ROW, B_SEQ_BUT_EFFECT, "No Interpolat", 10, -50, 100, 19, &transform->interpolation, 0.0, 0.0, 0.0, 0.0, "No interpolation");
+ uiDefButI(block, ROW, B_SEQ_BUT_EFFECT, "Bilinear", 101, -50, 100, 19, &transform->interpolation, 0.0, 1.0, 0.0, 0.0, "Bilinear interpolation");
+ uiDefButI(block, ROW, B_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, B_SEQ_BUT_RELOAD, "",10,90,150,19, colvars->col, 0, 0, 0, 0, "");
+ } else if(last_seq->type==SEQ_SPEED){
+ SpeedControlVars *sp =
+ (SpeedControlVars *)last_seq->effectdata;
+
+ uiDefButF(block, NUM, B_SEQ_BUT_RELOAD, "Global Speed:", 10,70,150,19, &sp->globalSpeed, 0.0, 100.0, 0, 0, "Global Speed");
+
+ uiDefButBitI(block, TOG, SEQ_SPEED_INTEGRATE,
+ B_SEQ_BUT_RELOAD,
+ "IPO is velocity",
+ 10,50,150,19, &sp->flags,
+ 0.0, 1.0, 0, 0,
+ "Interpret the IPO value as a "
+ "velocity instead of a frame number");
+
+ uiDefButBitI(block, TOG, SEQ_SPEED_BLEND,
+ B_SEQ_BUT_RELOAD,
+ "Enable frame blending",
+ 10,30,150,19, &sp->flags,
+ 0.0, 1.0, 0, 0,
+ "Blend two frames into the "
+ "target for a smoother result");
+
+ uiDefButBitI(block, TOG, SEQ_SPEED_COMPRESS_IPO_Y,
+ B_SEQ_BUT_RELOAD,
+ "IPO value runs from [0..1]",
+ 10,10,150,19, &sp->flags,
+ 0.0, 1.0, 0, 0,
+ "Scale IPO value to get the "
+ "target frame number.");
+ }
+
+ uiBlockEndAlign(block);
+}
+
+static void seq_panel_proxy()
+{
+ Sequence *last_seq = get_last_seq();
+ uiBlock *block;
+ block = uiNewBlock(&curarea->uiblocks, "seq_panel_proxy",
+ UI_EMBOSS, UI_HELV, curarea->win);
+
+ if(uiNewPanel(curarea, block, "Proxy", "Sequencer",
+ 10, 230, 318, 204) == 0) return;
+
+ uiBlockBeginAlign(block);
+
+ uiDefButBitI(block, TOG, SEQ_USE_PROXY,
+ B_SEQ_BUT_RELOAD, "Use Proxy",
+ 10,140,120,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Use a preview proxy for this strip");
+
+ if (last_seq->flag & SEQ_USE_PROXY) {
+ if (!last_seq->strip->proxy) {
+ last_seq->strip->proxy =
+ MEM_callocN(sizeof(struct StripProxy),
+ "StripProxy");
+ }
+
+ uiDefButBitI(block, TOG, SEQ_USE_PROXY_CUSTOM_DIR,
+ B_SEQ_BUT_RELOAD, "Custom Dir",
+ 130,140,120,19, &last_seq->flag,
+ 0.0, 21.0, 100, 0,
+ "Use a custom directory to store data");
+ }
+
+ if (last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) {
+ uiDefBut(block, TEX,
+ B_SEQ_BUT_RELOAD, "Dir: ",
+ 10,120,240,19, last_seq->strip->proxy->dir,
+ 0.0, 160.0, 100, 0, "");
+ }
+
+ if (last_seq->flag & SEQ_USE_PROXY) {
+ if (G.scene->r.size == 100) {
+ uiDefBut(block, LABEL, 0,
+ "Full render size selected, ",
+ 10,100,240,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0,
+ "so no proxy enabled!",
+ 10,80,240,19, 0, 0, 0, 0, 0, "");
+ } else if (last_seq->type != SEQ_MOVIE
+ && last_seq->type != SEQ_IMAGE
+ && !(last_seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)) {
+ uiDefBut(block, LABEL, 0,
+ "Cannot proxy this strip without ",
+ 10,100,240,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0,
+ "custom directory selection!",
+ 10,80,240,19, 0, 0, 0, 0, 0, "");
+
+ } else {
+ uiDefBut(block, BUT, B_SEQ_BUT_REBUILD_PROXY,
+ "Rebuild proxy",
+ 10,100,240,19, 0, 0, 0, 0, 0,
+ "Rebuild proxy for the "
+ "currently selected strip.");
+ }
+ }
+
+ uiBlockEndAlign(block);
+}
+
+
+void sequencer_panels()
+{
+ Sequence *last_seq = get_last_seq();
+ int panels = 0;
+ int type;
+
+ if(last_seq == NULL) {
+ return;
+ }
+
+ type = last_seq->type;
+
+ panels = SEQ_PANEL_EDITING;
+
+ if (type == SEQ_MOVIE || type == SEQ_IMAGE || type == SEQ_SCENE) {
+ panels |= SEQ_PANEL_INPUT | SEQ_PANEL_FILTER | SEQ_PANEL_PROXY;
+ }
+
+ if (type == SEQ_RAM_SOUND) {
+ panels |= SEQ_PANEL_FILTER;
+ }
+
+ if (type == SEQ_PLUGIN || type >= SEQ_EFFECT) {
+ panels |= SEQ_PANEL_EFFECT | SEQ_PANEL_PROXY;
+ }
+
+ if (panels & SEQ_PANEL_EDITING) {
+ seq_panel_editing();
+ }
+
+ if (panels & SEQ_PANEL_INPUT) {
+ seq_panel_input();
+ }
+
+ if (panels & SEQ_PANEL_FILTER) {
+ if (type == SEQ_RAM_SOUND || type == SEQ_HD_SOUND) {
+ seq_panel_filter_audio();
+ } else {
+ seq_panel_filter_video();
+ }
+ }
+
+ if (panels & SEQ_PANEL_EFFECT) {
+ seq_panel_effect();
+ }
+
+ if (panels & SEQ_PANEL_PROXY) {
+ seq_panel_proxy();
+ }
+}
+
+
+void do_sequencer_panels(unsigned short event)
+{
+ Sequence *last_seq = get_last_seq();
+
+ switch(event) {
+ case B_SEQ_BUT_PLUGIN:
+ case B_SEQ_BUT_EFFECT:
+ update_changed_seq_and_deps(last_seq, 0, 1);
+ break;
+ case B_SEQ_BUT_RELOAD_FILE:
+ reload_sequence_new_file(last_seq);
+ break;
+ case B_SEQ_BUT_REBUILD_PROXY:
+ seq_proxy_rebuild(last_seq);
+ break;
+ case B_SEQ_BUT_RELOAD:
+ case B_SEQ_BUT_RELOAD_ALL:
+ update_seq_ipo_rect(last_seq);
+ update_seq_icu_rects(last_seq);
+
+ free_imbuf_seq(); // frees all
+
+ break;
+ case B_SEQ_BUT_TRANSFORM:
+ calc_sequence(last_seq);
+ if (test_overlap_seq(last_seq))
+ shuffle_seq(last_seq);
+ break;
+ }
+
+ if (event == B_SEQ_BUT_RELOAD_ALL) {
+ allqueue(REDRAWALL, 0);
+ } else {
+ allqueue(REDRAWSEQ, 0);
+ }
+}
+
/* ************************* SCENE *********************** */
@@ -491,12 +1329,6 @@ static void backbuf_pic(char *name)
BIF_undo_push("Change background picture");
}
-static void ftype_pic(char *name)
-{
- strcpy(G.scene->r.ftype, name);
- allqueue(REDRAWBUTSSCENE, 0);
-}
-
static void run_playanim(char *file)
{
extern char bprogname[]; /* usiblender.c */
@@ -507,9 +1339,9 @@ static void run_playanim(char *file)
calc_renderwin_rectangle((G.scene->r.xsch*G.scene->r.size)/100,
(G.scene->r.ysch*G.scene->r.size)/100, G.winpos, pos, size);
#ifdef WIN32
- sprintf(str, "%s -a -p %d %d \"%s\"", bprogname, pos[0], pos[1], file);
+ sprintf(str, "%s -a -p %d %d -f %d %g \"%s\"", bprogname, pos[0], pos[1], G.scene->r.frs_sec, G.scene->r.frs_sec_base, file);
#else
- sprintf(str, "\"%s\" -a -p %d %d \"%s\"", bprogname, pos[0], pos[1], file);
+ sprintf(str, "\"%s\" -a -p %d %d -f %d %g \"%s\"", bprogname, pos[0], pos[1], G.scene->r.frs_sec, G.scene->r.frs_sec_base, file);
#endif
system(str);
}
@@ -595,15 +1427,6 @@ void do_render_panels(unsigned short event)
else
activate_fileselect(FILE_SPECIAL, "SELECT BACKBUF PICTURE", G.scene->r.backbuf, backbuf_pic);
break;
-
- case B_FS_FTYPE:
- sa= closest_bigger_area();
- areawinset(sa->win);
- if(G.qual == LR_CTRLKEY)
- activate_imageselect(FILE_SPECIAL, "SELECT FTYPE", G.scene->r.ftype, ftype_pic);
- else
- activate_fileselect(FILE_SPECIAL, "SELECT FTYPE", G.scene->r.ftype, ftype_pic);
- break;
case B_PR_PAL:
G.scene->r.xsch= 720;
@@ -612,6 +1435,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
@@ -718,6 +1542,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
@@ -780,6 +1605,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
@@ -1164,7 +1990,6 @@ static void render_panel_output(void)
uiBlock *block;
char *strp;
-
block= uiNewBlock(&curarea->uiblocks, "render_panel_output", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Output", "Render", 0, 0, 318, 204)==0) return;
@@ -1173,57 +1998,61 @@ static void render_panel_output(void)
uiDefBut(block, TEX,0,"", 31, 190, 279, 20,G.scene->r.pic, 0.0,79.0, 0, 0, "Directory/name to save rendered Pics to");
uiDefIconBut(block, BUT,B_FS_BACKBUF, ICON_FILESEL, 10, 168, 20, 20, 0, 0, 0, 0, 0, "Open Fileselect to get Backbuf image");
uiDefBut(block, TEX,0,"", 31, 168, 279, 20,G.scene->r.backbuf, 0.0,79.0, 0, 0, "Image to use as background for rendering");
- uiDefIconBut(block, BUT,B_FS_FTYPE, ICON_FILESEL, 10, 146, 20, 20, 0, 0, 0, 0, 0, "Open Fileselect to get Ftype image");
- uiDefBut(block, TEX,0,"", 31, 146, 279, 20,G.scene->r.ftype,0.0,79.0, 0, 0, "Image to use with FTYPE Image type");
uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, R_TOUCH, B_NOP, "Touch", 10, 142, 50, 20, &G.scene->r.mode, 0.0, 0.0, 0, 0, "Create an empty file before rendering each frame, remove if cancelled (and empty)");
+ uiDefButBitI(block, TOG, R_NO_OVERWRITE, B_NOP, "No Overwrite", 60, 142, 90, 20, &G.scene->r.mode, 0.0, 0.0, 0, 0, "Skip rendering frames when the file exists (image output only)");
+ uiBlockEndAlign(block);
+ uiDefButBitS(block, TOG, R_BACKBUF, B_NOP,"Backbuf", 160, 142, 80, 20, &G.scene->r.bufflag, 0, 0, 0, 0, "Enable/Disable use of Backbuf image");
/* SET BUTTON */
uiBlockBeginAlign(block);
id= (ID *)G.scene->set;
IDnames_to_pupstring(&strp, NULL, NULL, &(G.main->scene), id, &(G.buts->menunr));
if(strp[0])
- uiDefButS(block, MENU, B_SETBROWSE, strp, 10, 120, 20, 20, &(G.buts->menunr), 0, 0, 0, 0, "Scene to link as a Set");
+ uiDefButS(block, MENU, B_SETBROWSE, strp, 10, 114, 20, 20, &(G.buts->menunr), 0, 0, 0, 0, "Scene to link as a Set");
MEM_freeN(strp);
if(G.scene->set) {
uiSetButLock(1, NULL);
- uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, B_NOP, "", 31, 120, 100, 20, &(G.scene->set), "Name of the Set");
+ uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, B_NOP, "", 31, 114, 100, 20, &(G.scene->set), "Name of the Set");
uiClearButLock();
- uiDefIconBut(block, BUT, B_CLEARSET, ICON_X, 132, 120, 20, 20, 0, 0, 0, 0, 0, "Remove Set link");
+ uiDefIconBut(block, BUT, B_CLEARSET, ICON_X, 132, 114, 20, 20, 0, 0, 0, 0, 0, "Remove Set link");
}
uiBlockEndAlign(block);
- uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButBitS(block, TOG, R_BACKBUF, B_NOP,"Backbuf", 10, 94, 80, 20, &G.scene->r.bufflag, 0, 0, 0, 0, "Enable/Disable use of Backbuf image");
- uiDefButS(block, NUM, B_NOP, "Threads:", 10, 68, 100, 20, &G.scene->r.threads, 1, BLENDER_MAX_THREADS, 0, 0, "Amount of threads for render");
+ uiDefButS(block, NUM, B_NOP, "Threads:", 10, 63, 100, 20, &G.scene->r.threads, 1, BLENDER_MAX_THREADS, 0, 0, "Amount of threads for render (takes advantage of multi-core and multi-processor computers)");
uiBlockSetCol(block, TH_AUTO);
uiBlockBeginAlign(block);
for(b=2; b>=0; b--)
for(a=0; a<3; a++)
uiDefButBitS(block, TOG, 1<<(3*b+a), 800,"", (short)(10+18*a),(short)(10+14*b),16,12, &G.winpos, 0, 0, 0, 0, "Render window placement on screen");
- uiBlockEndAlign(block);
- uiDefButBitS(block, TOG, R_EXR_TILE_FILE, B_NOP, "Save Buffers", 72, 31, 120, 19, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Save the tiles for all RenderLayers and used SceneNodes to files, to save memory");
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, R_EXR_TILE_FILE, B_REDR, "Save Buffers", 72, 31, 120, 19, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Save the tiles for all RenderLayers and used SceneNodes to files, to save memory");
+ if(G.scene->r.scemode & R_EXR_TILE_FILE)
+ uiDefButBitS(block, TOG, R_FULL_SAMPLE, B_REDR, "FullSample", 192, 31, 118, 19, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Saves for every OSA sample the entire RenderLayer results");
+ uiBlockEndAlign(block);
uiDefButS(block, MENU, B_REDR, "Render Display %t|Render Window %x1|Image Editor %x0|Full Screen %x2",
72, 10, 120, 19, &G.displaymode, 0.0, (float)R_DISPLAYWIN, 0, 0, "Sets render output display");
- uiDefButBitS(block, TOG, R_EXTENSION, B_NOP, "Extensions", 205, 10, 105, 19, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Adds extensions to the output when rendering animations");
-
+ uiDefButBitS(block, TOG, R_EXTENSION, B_NOP, "Extensions", 205, 10, 105, 19, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Adds filetype extensions to the filename when rendering animations");
+
/* Dither control */
- uiDefButF(block, NUM,B_DIFF, "Dither:", 205,31,105,19, &G.scene->r.dither_intensity, 0.0, 2.0, 0, 0, "The amount of dithering noise present in the output image (0.0 = no dithering)");
+ uiDefButF(block, NUM,B_DIFF, "Dither:", 10,89,100,19, &G.scene->r.dither_intensity, 0.0, 2.0, 0, 0, "The amount of dithering noise present in the output image (0.0 = no dithering)");
/* Toon shading buttons */
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, R_EDGE, B_NOP,"Edge", 100, 94, 70, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Toon Edge-enhance");
- uiDefBlockBut(block, edge_render_menu, NULL, "Edge Settings", 170, 94, 140, 20, "Display Edge settings");
+ uiDefButBitI(block, TOG, R_EDGE, B_NOP,"Edge", 115, 89, 60, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Toon Edge-enhance");
+ uiDefBlockBut(block, edge_render_menu, NULL, "Edge Settings", 175, 89, 135, 20, "Display Edge settings");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, R_NO_TEX, B_NOP, "Disable Tex", 115, 68, 70, 20, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Disables Textures for render");
- uiDefButBitS(block, TOG, R_FREE_IMAGE, B_NOP, "Free Tex Images", 205, 68, 100, 20, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Frees all Images used by Textures after each render");
+ uiDefButBitS(block, TOG, R_NO_TEX, B_NOP, "Disable Tex", 115, 63, 70, 20, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Disables Textures for render");
+ uiDefButBitS(block, TOG, R_FREE_IMAGE, B_NOP, "Free Tex Images", 205, 63, 100, 20, &G.scene->r.scemode, 0.0, 0.0, 0, 0, "Frees all Images used by Textures after each render");
uiBlockEndAlign(block);
}
@@ -1243,6 +2072,16 @@ static void render_panel_bake(void)
but= uiDefBut(block, BUT, B_NOP, "BAKE", 10, 150, 190,40, 0, 0, 0, 0, 0, "Start the bake render for selected Objects");
uiButSetFunc(but, do_bake_func, NULL, NULL);
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, R_BAKE_TO_ACTIVE, B_DIFF, "Selected to Active", 10,120,190,20,&G.scene->r.bake_flag, 0.0, 0, 0, 0, "Bake shading on the surface of selected objects to the active object");
+ uiDefButF(block, NUM, B_DIFF, "Dist:", 10,100,(G.scene->r.bake_mode == RE_BAKE_NORMALS)? 95: 190,20,&G.scene->r.bake_maxdist, 0.0, 10.0, 1, 0, "Maximum distance from active object to other object");
+
+ if(G.scene->r.bake_mode == RE_BAKE_NORMALS)
+ uiDefButS(block, MENU, B_DIFF, "Normal Space %t|Camera %x0|World %x1|Object %x2|Tangent %x3",
+ 105,100,95,20, &G.scene->r.bake_normal_space, 0, 0, 0, 0, "Choose normal space for baking");
+ uiBlockEndAlign(block);
+
#if 0
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, R_BAKE_OSA, B_DIFF, "OSA", 10,120,190,20, &G.scene->r.bake_flag, 0, 0, 0, 0, "Enables Oversampling (Anti-aliasing)");
@@ -1252,15 +2091,16 @@ static void render_panel_bake(void)
uiDefButS(block, ROW,B_DIFF,"16", 150,100,50,20,&G.scene->r.bake_osa,2.0,16.0, 0, 0, "Sets oversample level to 16");
#endif
uiBlockBeginAlign(block);
- uiDefButS(block, ROW,B_DIFF,"Full Render", 210,170,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_ALL, 0, 0, "");
- uiDefButS(block, ROW,B_DIFF,"Ambient Occlusion",210,150,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_AO, 0, 0, "");
- uiDefButS(block, ROW,B_DIFF,"Normals", 210,130,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_NORMALS, 0, 0, "");
- uiDefButS(block, ROW,B_DIFF,"Textures", 210,110,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_TEXTURE, 0, 0, "");
+ uiDefButS(block, ROW,B_REDR,"Full Render", 210,170,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_ALL, 0, 0, "");
+ uiDefButS(block, ROW,B_REDR,"Ambient Occlusion",210,150,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_AO, 0, 0, "");
+ uiDefButS(block, ROW,B_REDR,"Normals", 210,130,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_NORMALS, 0, 0, "");
+ uiDefButS(block, ROW,B_REDR,"Textures", 210,110,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_TEXTURE, 0, 0, "");
+ uiDefButS(block, ROW,B_REDR,"Displacement", 210,90,120,20,&G.scene->r.bake_mode, 1.0, RE_BAKE_DISPLACEMENT, 0, 0, "");
uiBlockEndAlign(block);
- uiDefButBitS(block, TOG, R_BAKE_CLEAR, B_DIFF, "Clear", 210,80,120,20,&G.scene->r.bake_flag, 0.0, 0, 0, 0, "Clear Images before baking");
+ uiDefButBitS(block, TOG, R_BAKE_CLEAR, B_DIFF, "Clear", 210,60,120,20,&G.scene->r.bake_flag, 0.0, 0, 0, 0, "Clear Images before baking");
- uiDefButS(block, NUM, B_DIFF,"Margin:", 210,50,120,20,&G.scene->r.bake_filter, 0.0, 32.0, 0, 0, "Amount of pixels to extend the baked result with, as post process filter");
+ uiDefButS(block, NUM, B_DIFF,"Margin:", 210,30,120,20,&G.scene->r.bake_filter, 0.0, 32.0, 0, 0, "Amount of pixels to extend the baked result with, as post process filter");
}
static void render_panel_render(void)
@@ -1272,7 +2112,7 @@ static void render_panel_render(void)
if(uiNewPanel(curarea, block, "Render", "Render", 320, 0, 318, 204)==0) return;
uiBlockBeginAlign(block);
- uiDefBut(block, BUT,B_DORENDER,"RENDER", 369, 164, 191,37, 0, 0, 0, 0, 0, "Start the rendering");
+ uiDefBut(block, BUT,B_DORENDER,"RENDER", 369, 164, 191,37, 0, 0, 0, 0, 0, "Render the current frame (F12)");
#ifndef DISABLE_YAFRAY
/* yafray: on request, render engine menu is back again, and moved to Render panel */
uiDefButS(block, MENU, B_SWITCHRENDER, "Rendering Engine %t|Blender Internal %x0|YafRay %x1",
@@ -1283,11 +2123,14 @@ static void render_panel_render(void)
#endif /* disable yafray */
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, R_OSA, B_DIFF, "OSA", 369,109,122,20,&G.scene->r.mode, 0, 0, 0, 0, "Enables Oversampling (Anti-aliasing)");
- uiDefButS(block, ROW,B_DIFF,"5", 369,88,29,20,&G.scene->r.osa,2.0,5.0, 0, 0, "Sets oversample level to 5");
- uiDefButS(block, ROW,B_DIFF,"8", 400,88,29,20,&G.scene->r.osa,2.0,8.0, 0, 0, "Sets oversample level to 8 (Recommended)");
- uiDefButS(block, ROW,B_DIFF,"11", 431,88,29,20,&G.scene->r.osa,2.0,11.0, 0, 0, "Sets oversample level to 11");
- uiDefButS(block, ROW,B_DIFF,"16", 462,88,29,20,&G.scene->r.osa,2.0,16.0, 0, 0, "Sets oversample level to 16");
+ if((G.scene->r.scemode & R_FULL_SAMPLE) && (G.scene->r.scemode & R_EXR_TILE_FILE))
+ uiDefButBitI(block, TOG, R_OSA, B_DIFF, "FSA", 369,109,122,20,&G.scene->r.mode, 0, 0, 0, 0, "Saves all samples, then composites, and then merges (for best Anti-aliasing)");
+ else
+ uiDefButBitI(block, TOG, R_OSA, B_DIFF, "OSA", 369,109,122,20,&G.scene->r.mode, 0, 0, 0, 0, "Enables Oversampling (Anti-aliasing)");
+ uiDefButS(block, ROW,B_DIFF,"5", 369,88,29,20,&G.scene->r.osa,2.0,5.0, 0, 0, "Render 5 samples per pixel for smooth edges (Fast)");
+ uiDefButS(block, ROW,B_DIFF,"8", 400,88,29,20,&G.scene->r.osa,2.0,8.0, 0, 0, "Render 8 samples per pixel for smooth edges (Recommended)");
+ uiDefButS(block, ROW,B_DIFF,"11", 431,88,29,20,&G.scene->r.osa,2.0,11.0, 0, 0, "Render 11 samples per pixel for smooth edges (High Quality)");
+ uiDefButS(block, ROW,B_DIFF,"16", 462,88,29,20,&G.scene->r.osa,2.0,16.0, 0, 0, "Render 16 samples per pixel for smooth edges (Highest Quality)");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -1333,7 +2176,7 @@ static void render_panel_render(void)
uiDefButS(block, MENU, B_DIFF,str, 565,34,60,20, &G.scene->r.filtertype, 0, 0, 0, 0, "Set sampling filter for antialiasing");
uiDefButF(block, NUM,B_DIFF,"", 627,34,60,20,&G.scene->r.gauss,0.5, 1.5, 10, 2, "Sets the filter size");
- uiDefButBitI(block, TOG, R_BORDER, REDRAWVIEWCAM, "Border", 565,13,122,20, &G.scene->r.mode, 0, 0, 0, 0, "Render a small cut-out of the image");
+ uiDefButBitI(block, TOG, R_BORDER, REDRAWVIEWCAM, "Border", 565,13,122,20, &G.scene->r.mode, 0, 0, 0, 0, "Render a small cut-out of the image (Shift+B to set in the camera view)");
uiBlockEndAlign(block);
}
@@ -1347,7 +2190,7 @@ static void render_panel_anim(void)
if(uiNewPanel(curarea, block, "Anim", "Render", 640, 0, 318, 204)==0) return;
- uiDefBut(block, BUT,B_DOANIM,"ANIM", 692,142,192,47, 0, 0, 0, 0, 0, "Start rendering a sequence");
+ uiDefBut(block, BUT,B_DOANIM,"ANIM", 692,142,192,47, 0, 0, 0, 0, 0, "Render the animation to disk (start to end frame)");
uiBlockSetCol(block, TH_BUT_SETTING1);
uiBlockBeginAlign(block);
@@ -1356,12 +2199,12 @@ static void render_panel_anim(void)
uiBlockEndAlign(block);
uiBlockSetCol(block, TH_AUTO);
- uiDefBut(block, BUT,B_PLAYANIM, "PLAY",692,40,94,33, 0, 0, 0, 0, 0, "Play animation of rendered images/avi (searches Pics: field)");
+ uiDefBut(block, BUT,B_PLAYANIM, "PLAY",692,40,94,33, 0, 0, 0, 0, 0, "Play rendered images/avi animation (Ctrl+F11), (Play Hotkeys: A-Noskip, P-PingPong)");
uiDefButS(block, NUM, B_RTCHANGED, "rt:",789,40,95,33, &G.rt, -1000.0, 1000.0, 0, 0, "General testing/debug button");
uiBlockBeginAlign(block);
- uiDefButI(block, NUM,REDRAWSEQ,"Sta:",692,10,94,24, &G.scene->r.sfra,1.0,MAXFRAMEF, 0, 0, "The start frame of the animation");
- uiDefButI(block, NUM,REDRAWSEQ,"End:",789,10,95,24, &G.scene->r.efra,SFRA,MAXFRAMEF, 0, 0, "The end frame of the animation");
+ uiDefButI(block, NUM,REDRAWSEQ,"Sta:",692,10,94,24, &G.scene->r.sfra,1.0,MAXFRAMEF, 0, 0, "The start frame of the animation (inclusive)");
+ uiDefButI(block, NUM,REDRAWSEQ,"End:",789,10,95,24, &G.scene->r.efra,SFRA,MAXFRAMEF, 0, 0, "The end frame of the animation (inclusive)");
uiBlockEndAlign(block);
}
@@ -1537,52 +2380,55 @@ static void render_panel_stamp(void)
if (G.scene->r.scemode & R_STAMP_INFO) {
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, R_STAMP_NOTE, B_REDR, "Note", xofs, yofs, 100, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp user data");
- uiDefBut(block, TEX, B_NOP, "", xofs+100, yofs, 200, 19, &G.scene->r.stamp_udata, 0.0, 128.0, 100, 0, "User Note");
+ 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 += 100;
- // Order is important for alligning ... grr
+ yofs += 80;
+ /* Order is important for alligning ... grr */
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, R_STAMP_SCENE, B_REDR, "Scene", xofs, yofs, 100, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp scene name");
+ 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_CAMERA, B_REDR, "Camera", xofs, yofs, 100, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp camera name");
+ 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_DATE, B_REDR, "Date", xofs, yofs, 100, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp date");
+ 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_TIME, B_REDR, "Time", xofs, yofs, 100, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp time (HH:MM:SS)");
+ 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_FRAME, B_REDR, "Frame", xofs, yofs, 100, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp frame number");
- yofs -= 20;
- uiDefButBitI(block, TOG, R_STAMP_MARKER, B_REDR, "Marker", xofs, yofs, 100, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp the last marker");
+ 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 += 100;
+ 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+110, yofs, 190, 19, &G.scene->r.stamp_font_id, 0, 0, 0, 0, "Choose stamp text size");
+ 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, 0, "Text Color", xofs+110, yofs, 80, 19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, LABEL, 0, "Background", xofs+205, yofs, 80, 19, 0, 0, 0, 0, 0, "");
+ 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+110, yofs, 90, 19, G.scene->r.fg_stamp, 0, 0, 0, 0, "Foreground text color");
- uiDefButF(block, COL, B_NOP, "", xofs+210, yofs, 90, 19, G.scene->r.bg_stamp, 0, 0, 0, 0, "Background color");
- yofs += 75;
+ 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, 100, 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+110, yofs, 190, 20, &G.scene->r.stamp, 0, 0, 0, 0, "Draw the stamp info into each frame");
+ 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, 100, 20, &G.scene->r.scemode, 0, 0, 0, 0, "Enable stamp info to image metadata");
+ 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, "");
}
@@ -1627,11 +2473,7 @@ static void render_panel_format(void)
if(G.scene->r.quality==0) G.scene->r.quality= 90;
-#ifdef WITH_QUICKTIME
if (G.scene->r.imtype == R_AVICODEC || G.scene->r.imtype == R_QUICKTIME) {
-#else /* WITH_QUICKTIME */
- if (0) {
-#endif
if(G.scene->r.imtype == R_QUICKTIME) {
#ifdef WITH_QUICKTIME
#if defined (_WIN32) || defined (__APPLE__)
@@ -1641,7 +2483,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 {
@@ -1653,7 +2495,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
}
@@ -1668,15 +2510,16 @@ static void render_panel_format(void)
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);
@@ -1807,7 +2650,7 @@ static void layer_copy_func(void *lay_v, void *lay_p)
unsigned int *lay= lay_p;
int laybit= (int)lay_v;
- if(G.qual & LR_SHIFTKEY) {
+ if(G.qual & (LR_SHIFTKEY|LR_CTRLKEY)) {
if(*lay==0) *lay= 1<<laybit;
}
else
@@ -1878,29 +2721,29 @@ static char *scene_layer_menu(void)
return str;
}
-static void draw_3d_layer_buttons(uiBlock *block, unsigned int *poin, short xco, short yco, short dx, short dy)
+static void draw_3d_layer_buttons(uiBlock *block, int type, unsigned int *poin, short xco, short yco, short dx, short dy, char *tip)
{
uiBut *bt;
long a;
uiBlockBeginAlign(block);
for(a=0; a<5; a++) {
- bt= uiDefButBitI(block, TOG, 1<<a, B_NOP, "", (short)(xco+a*(dx/2)), yco+dy/2, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, "");
+ bt= uiDefButBitI(block, type, 1<<a, B_NOP, "", (short)(xco+a*(dx/2)), yco+dy/2, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, tip);
uiButSetFunc(bt, layer_copy_func, (void *)a, poin);
}
for(a=0; a<5; a++) {
- bt=uiDefButBitI(block, TOG, 1<<(a+10), B_NOP, "", (short)(xco+a*(dx/2)), yco, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, "");
+ bt=uiDefButBitI(block, type, 1<<(a+10), B_NOP, "", (short)(xco+a*(dx/2)), yco, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, tip);
uiButSetFunc(bt, layer_copy_func, (void *)(a+10), poin);
}
xco+= 7;
uiBlockBeginAlign(block);
for(a=5; a<10; a++) {
- bt=uiDefButBitI(block, TOG, 1<<a, B_NOP, "", (short)(xco+a*(dx/2)), yco+dy/2, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, "");
+ bt=uiDefButBitI(block, type, 1<<a, B_NOP, "", (short)(xco+a*(dx/2)), yco+dy/2, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, tip);
uiButSetFunc(bt, layer_copy_func, (void *)a, poin);
}
for(a=5; a<10; a++) {
- bt=uiDefButBitI(block, TOG, 1<<(a+10), B_NOP, "", (short)(xco+a*(dx/2)), yco, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, "");
+ bt=uiDefButBitI(block, type, 1<<(a+10), B_NOP, "", (short)(xco+a*(dx/2)), yco, (short)(dx/2), (short)(dy/2), (int *)poin, 0, 0, 0, 0, tip);
uiButSetFunc(bt, layer_copy_func, (void *)(a+10), poin);
}
@@ -1925,7 +2768,7 @@ static void render_panel_layers(void)
/* first, as reminder, the scene layers */
uiDefBut(block, LABEL, 0, "Scene:", 10,170,100,20, NULL, 0, 0, 0, 0, "");
- draw_3d_layer_buttons(block, &G.scene->lay, 130, 170, 35, 30);
+ draw_3d_layer_buttons(block, TOG, &G.scene->lay, 130, 170, 35, 30, "Scene layers to render");
/* layer disable, menu, name, delete button */
uiBlockBeginAlign(block);
@@ -1945,19 +2788,21 @@ static void render_panel_layers(void)
/* RenderLayer visible-layers */
uiDefBut(block, LABEL, 0, "Layer:", 10,110,100,20, NULL, 0, 0, 0, 0, "");
- draw_3d_layer_buttons(block, &srl->lay, 130,110, 35, 30);
+ draw_3d_layer_buttons(block, BUT_TOGDUAL, &srl->lay, 130,110, 35, 30, "Scene-layers included in this render-layer (Hold CTRL for Z-mask)");
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, SCE_LAY_ALL_Z, B_NOP,"AllZ", 10, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Fill in Z values for all not-rendered faces, for masking");
+ uiDefButBitI(block, TOG, SCE_LAY_ALL_Z, B_NOP,"AllZ", 10, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Fill in Z values for solid faces in invisible layers, for masking");
+ uiDefButBitI(block, TOG, SCE_LAY_ZMASK, B_NOP,"Zmask", 10, 65, 40, 20, &srl->layflag, 0, 0, 0, 0, "Only render what's in front of the solid z values");
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, SCE_LAY_SOLID, B_NOP,"Solid", 50, 85, 60, 20, &srl->layflag, 0, 0, 0, 0, "Render Solid faces in this Layer");
- uiDefButBitI(block, TOG, SCE_LAY_HALO, B_NOP,"Halo", 110, 85, 55, 20, &srl->layflag, 0, 0, 0, 0, "Render Halos in this Layer (on top of Solid)");
- uiDefButBitI(block, TOG, SCE_LAY_ZTRA, B_NOP,"Ztra", 165, 85, 55, 20, &srl->layflag, 0, 0, 0, 0, "Render Z-Transparent faces in this Layer (On top of Solid and Halos)");
- uiDefButBitI(block, TOG, SCE_LAY_SKY, B_NOP,"Sky", 220, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Sky or backbuffer in this Layer");
- uiDefButBitI(block, TOG, SCE_LAY_EDGE, B_NOP,"Edge", 260, 85, 50, 20, &srl->layflag, 0, 0, 0, 0, "Render Edge-enhance in this Layer (only works for Solid faces)");
-
- uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_SET_PASS, "Light:", 10, 65, 150, 20, &(srl->light_override), "Name of Group to use as Lamps instead");
- uiDefIDPoinBut(block, test_matpoin_but, ID_MA, B_SET_PASS, "Mat:", 160, 65, 150, 20, &(srl->mat_override), "Name of Material to use as Materials instead");
+ uiDefButBitI(block, TOG, SCE_LAY_SOLID, B_NOP,"Solid", 50, 85, 45, 20, &srl->layflag, 0, 0, 0, 0, "Render Solid faces in this Layer");
+ uiDefButBitI(block, TOG, SCE_LAY_HALO, B_NOP,"Halo", 95, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Halos in this Layer (on top of Solid)");
+ uiDefButBitI(block, TOG, SCE_LAY_ZTRA, B_NOP,"Ztra", 135, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Z-Transparent faces in this Layer (On top of Solid and Halos)");
+ uiDefButBitI(block, TOG, SCE_LAY_SKY, B_NOP,"Sky", 175, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Sky or backbuffer in this Layer");
+ uiDefButBitI(block, TOG, SCE_LAY_EDGE, B_NOP,"Edge", 215, 85, 45, 20, &srl->layflag, 0, 0, 0, 0, "Render Edge-enhance in this Layer (only works for Solid faces)");
+ uiDefButBitI(block, TOG, SCE_LAY_STRAND, B_NOP,"Strand",260, 85, 50, 20, &srl->layflag, 0, 0, 0, 0, "Render Strands in this Layer");
+
+ uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_SET_PASS, "Light:", 50, 65, 130, 20, &(srl->light_override), "Name of Group to use as Lamps instead");
+ uiDefIDPoinBut(block, test_matpoin_but, ID_MA, B_SET_PASS, "Mat:", 180, 65, 130, 20, &(srl->mat_override), "Name of Material to use as Materials instead");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -1966,16 +2811,17 @@ static void render_panel_layers(void)
uiDefButBitI(block, TOG, SCE_PASS_VECTOR, B_SET_PASS,"Vec", 120, 30, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Speed Vector pass");
uiDefButBitI(block, TOG, SCE_PASS_NORMAL, B_SET_PASS,"Nor", 160, 30, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Normal pass");
uiDefButBitI(block, TOG, SCE_PASS_UV, B_SET_PASS,"UV", 200, 30, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Texture UV pass");
- uiDefButBitI(block, TOG, SCE_PASS_INDEXOB, B_SET_PASS,"IndexOb",240, 30, 70, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Object Index pass");
+ uiDefButBitI(block, TOG, SCE_PASS_MIST, B_SET_PASS,"Mist", 240, 30, 35, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Mist factor pass (0-1)");
+ uiDefButBitI(block, TOG, SCE_PASS_INDEXOB, B_SET_PASS,"Index", 275, 30, 35, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Object Index pass");
uiDefButBitI(block, TOG, SCE_PASS_RGBA, B_SET_PASS,"Col", 10, 10, 35, 20, &srl->passflag, 0, 0, 0, 0, "Deliver shade-less Color pass");
uiDefButBitI(block, TOG, SCE_PASS_DIFFUSE, B_SET_PASS,"Diff", 45, 10, 35, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Diffuse pass");
- uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_SPEC, B_SET_PASS,"Spec", 80, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Specular pass");
- uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_SHADOW, B_SET_PASS,"Shad", 120, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Shadow pass");
- uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_AO, B_SET_PASS,"AO", 160, 10, 30, 20, &srl->passflag, 0, 0, 0, 0, "Deliver AO pass");
- uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_REFLECT, B_SET_PASS,"Refl", 190, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Reflection pass");
- uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_REFRACT, B_SET_PASS,"Refr", 230, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Refraction pass");
- uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_RADIO, B_SET_PASS,"Rad", 270, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Radiosity pass");
+ uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_SPEC, B_SET_PASS,"Spec", 80, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Specular pass (Hold Ctrl to exclude from combined)");
+ uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_SHADOW, B_SET_PASS,"Shad", 120, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Shadow pass (Hold Ctrl to exclude from combined)");
+ uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_AO, B_SET_PASS,"AO", 160, 10, 30, 20, &srl->passflag, 0, 0, 0, 0, "Deliver AO pass (Hold Ctrl to exclude from combined)");
+ uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_REFLECT, B_SET_PASS,"Refl", 190, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Reflection pass (Hold Ctrl to exclude from combined)");
+ uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_REFRACT, B_SET_PASS,"Refr", 230, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Raytraced Refraction pass (Hold Ctrl to exclude from combined)");
+ uiDefButBitI(block, BUT_TOGDUAL, SCE_PASS_RADIO, B_SET_PASS,"Rad", 270, 10, 40, 20, &srl->passflag, 0, 0, 0, 0, "Deliver Radiosity pass (Hold Ctrl to exclude from combined)");
}
void render_panels()
@@ -2027,7 +2873,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 56c8d60bf5b..76a4f024f26 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"
@@ -62,6 +63,7 @@
#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"
@@ -69,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"
@@ -139,6 +142,11 @@ static char *mapto_blendtype_pup(void)
str += sprintf(str, formatstr, "Darken", MTEX_DARK);
str += sprintf(str, formatstr, "Lighten", MTEX_LIGHT);
+ str += sprintf(str, formatstr, "Hue", MTEX_BLEND_HUE);
+ str += sprintf(str, formatstr, "Saturation", MTEX_BLEND_SAT);
+ str += sprintf(str, formatstr, "Value", MTEX_BLEND_VAL);
+ str += sprintf(str, formatstr, "Color", MTEX_BLEND_COLOR);
+
return string;
}
@@ -740,8 +748,7 @@ static char *layer_menu(RenderResult *rr, short *curlay)
a+= sprintf(str+a, "|%s %%x%d", rl->name, nr);
}
- if(*curlay >= nr)
- *curlay= 0;
+ /* no curlay clip here, on render (redraws) the amount of layers can be 1 fir single-layer render */
return str;
}
@@ -1168,33 +1175,35 @@ void uiblock_image_panel(uiBlock *block, Image **ima_pp, ImageUser *iuser,
/* fields */
uiBlockBeginAlign(block);
- 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");
+ but= uiDefButBitS(block, TOG, IMA_FIELDS, imagechanged, "Fields", 10, 70, 65, 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, 70, 100, 20, &ima->flag, 0, 0, 0, 0, "Standard Field Toggle");
- uiBlockEndAlign(block);
+ uiDefButBitS(block, TOG, IMA_STD_FIELD, B_NOP, "Odd", 75, 70, 45, 20, &ima->flag, 0, 0, 0, 0, "Standard Field Toggle");
- 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");
+ uiBlockSetFunc(block, image_reload_cb, ima, iuser);
+ uiDefButBitS(block, TOG, IMA_ANTIALI, B_NOP, "Anti", 10, 50, 45, 20, &ima->flag, 0, 0, 0, 0, "Toggles Image anti-aliasing, only works with solid colors");
+ uiDefButBitS(block, TOG, IMA_DO_PREMUL, imagechanged, "Premul", 55, 50, 65, 20, &ima->flag, 0, 0, 0, 0, "Toggles premultiplying alpha");
+ uiBlockEndAlign(block);
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, 90, 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, 70, 190, 20, &iuser->flag, 0, 0, 0, 0, "Always refresh Image on frame changes");
if(ima->anim) {
- 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");
+ 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");
uiButSetFunc(but, set_frames_cb, ima, iuser);
}
else
- 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, 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, "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, "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, "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");
+ 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");
uiBlockSetFunc(block, NULL, iuser, NULL);
}
@@ -1202,9 +1211,9 @@ 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,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, "");
+ 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, "");
uiBlockSetFunc(block, NULL, NULL, NULL);
}
}
@@ -1221,7 +1230,7 @@ static void texture_panel_image(Image **ima, ImageUser *iuser)
uiblock_image_panel(block, ima, iuser, B_REDR, B_IMAGECHANGED);
}
-static void texture_panel_image_map(Tex *tex)
+static void texture_panel_image_map(Tex *tex, MTex *mtex)
{
uiBlock *block;
@@ -1239,12 +1248,18 @@ static void texture_panel_image_map(Tex *tex)
uiDefButBitS(block, TOG, TEX_USEALPHA, B_TEXPRV, "UseAlpha", 10, 160, 100, 20, &tex->imaflag, 0, 0, 0, 0, "Click to use Image's alpha channel");
uiDefButBitS(block, TOG, TEX_CALCALPHA, B_TEXPRV, "CalcAlpha", 110, 160, 100, 20, &tex->imaflag, 0, 0, 0, 0, "Click to calculate an alpha channel based on Image RGB values");
uiDefButBitS(block, TOG, TEX_NEGALPHA, B_TEXPRV, "NegAlpha", 210, 160, 100, 20, &tex->flag, 0, 0, 0, 0, "Click to invert the alpha values");
- uiBlockEndAlign(block);
- uiDefButF(block, NUM, B_TEXPRV, "Filter :", 10,120,150,20, &tex->filtersize, 0.1, 25.0, 10, 3, "Sets the filter size used by mipmap and interpol");
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, TEX_FILTER_MIN, B_TEXPRV, "Min", 10, 120, 30, 20, &tex->imaflag, 0, 0, 0, 0, "Use Filtersize as a minimal filter value in pixels");
+ uiDefButF(block, NUM, B_TEXPRV, "Filter: ", 40,120,120,20, &tex->filtersize, 0.1, 50.0, 10, 3, "Multiplies the filter size used by mipmap and interpol");
- uiDefButBitS(block, TOG, TEX_NORMALMAP, B_NOP, "Normal Map", 160,120,150,20, &tex->imaflag,
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, TEX_NORMALMAP, B_NOP, "Normal Map", 160,120,(mtex)? 75: 150,20, &tex->imaflag,
0, 0, 0, 0, "Use image RGB values for normal mapping");
+ if(mtex)
+ uiDefButS(block, MENU, B_DIFF, "Normal Space %t|Camera %x0|World %x1|Object %x2|Tangent %x3",
+ 235,120,75,20, &mtex->normapspace, 0, 0, 0, 0, "Sets space of normal map image");
+ uiBlockEndAlign(block);
/* crop extend clip */
@@ -1358,7 +1373,8 @@ static void texture_panel_envmap(Tex *tex)
uiDefButS(block, NUM, B_ENV_FREE, "CubeRes", 160,90,150,20, &env->cuberes, 50, 4096.0, 0, 0, "Sets the pixel resolution of the rendered environment map");
uiBlockBeginAlign(block);
- 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"),
+ uiDefButBitS(block, TOG, TEX_FILTER_MIN, B_TEXPRV, "Min", 10, 65, 30, 20, &tex->imaflag, 0, 0, 0, 0, "Use Filtersize as a minimal filter value in pixels");
+ uiDefButF(block, NUM, B_TEXPRV, "Filter :", 40,65,120,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, 20000.0, 1000, 0, "Sets end value for clipping beyond which objects are not visible to map");
@@ -1923,8 +1939,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;
@@ -1953,7 +1969,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);
@@ -1964,7 +1980,7 @@ static void world_panel_mapto(World *wrld)
uiDefButF(block, NUMSLI, B_WORLDPRV, "G ", 10,60,135,19, &(mtex->g), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB");
uiDefButF(block, NUMSLI, B_WORLDPRV, "B ", 10,40,135,19, &(mtex->b), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB");
uiBlockEndAlign(block);
- uiDefButF(block, NUMSLI, B_WORLDPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "The default value for textures to mix with values (not RGB)");
+ uiDefButF(block, NUMSLI, B_WORLDPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard");
/* MAP TO */
uiBlockBeginAlign(block);
@@ -2098,13 +2114,13 @@ static void world_panel_mistaph(World *wrld)
uiBlockSetCol(block, TH_AUTO);
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_WORLDPRV2, "Qua", 10, 90, 40, 19, &wrld->mistype, 1.0, 0.0, 0, 0, "Mist uses 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,B_WORLDPRV2, "Sta:",10,70,140,19, &wrld->miststa, 0.0, 10000.0, 10, 0, "Specifies the starting distance of the mist");
- uiDefButF(block, NUM,B_WORLDPRV2, "Di:",10,50,140,19, &wrld->mistdist, 0.0,10000.0, 10, 00, "Specifies the depth of the mist");
- uiDefButF(block, NUM,B_WORLDPRV2,"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, 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);
@@ -2124,54 +2140,112 @@ 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;
- if(wrld->mode & WO_AMB_OCC) {
+ yco -= YSPACE;
- /* aolight: samples */
- uiDefButS(block, MENU, B_REDR, "Constant QMC %x2|Adaptive QMC %x1|Constant Jittered %x0",
- 10, 120, 145, 19, &wrld->ao_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Constant QMC: best quality, Adaptive QMC: fast in high contrast areas");
+ if(wrld->ao_gather_method == WO_AOGATHER_RAYTRACE) {
uiDefButS(block, NUM, B_REDR, "Samples:",
- 165, 120, 145, 19, &wrld->aosamp, 1.0, 32.0, 100, 0, "Sets the number of samples used for AO (actual number: squared)");
+ 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;
- if (wrld->ao_samp_method == WO_AOSAMP_HALTON) {
- uiDefButF(block, NUM, B_REDR, "Threshold:",
- 10, 95, 145, 19, &wrld->ao_adapt_thresh, 0.0, 1.0, 100, 0, "Samples below this threshold will be considered fully shadowed/unshadowed and skipped");
- }
- uiDefButF(block, NUM, B_REDR, "Dist:",
- 165, 95, 145, 19, &wrld->aodist, 0.001, 5000.0, 100, 0, "Sets length of AO rays, defines how far away other faces give occlusion effect");
+ 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");
+ }
+ else {
+ uiDefButS(block, NUM, B_REDR, "Passes:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->ao_approx_passes, 0.0, 10.0, 0, 0, "Sets the number of preprocessing passes to reduce overocclusion");
- 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 -= YSPACE;
+
+ uiDefButF(block, NUM, B_REDR, "Correction:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->ao_approx_correction, 0.0, 1.0, 0, 0, "Ad-hoc correction for over-occlusion due to the approximation.");
+ }
+
+ 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, "Gather Method%t|Raytrace %x0|Approximate %x1",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &wrld->ao_gather_method, 0, 0, 0, 0, "Method for occlusion gathering: Raytrace: slow when noise free results are required, but accurate, Approximate: faster and without noise, but inaccurate");
- /* 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");
+ yco -= YSPACE;
- /* 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");
+ if(wrld->ao_gather_method == WO_AOGATHER_RAYTRACE) {
+ 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);
+ 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)");
+ }
+ }
+ else {
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");
- if (wrld->ao_samp_method == WO_AOSAMP_CONSTANT)
- 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)");
+ uiDefButF(block, NUM, B_REDR, "Error:",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &wrld->ao_approx_error, 0.0001, 10.0, 0, 0, "Error tolerance (low values are slower and higher quality)");
+
+ uiDefButBitS(block, TOG, WO_AOCACHE, B_REDR, "Pixel Cache",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &wrld->aomode, 0, 0, 0, 0, "Cache AO results in pixels and interpolate over neighbouring pixels for speedup.");
+ uiBlockEndAlign(block);
}
+ yco = PANEL_YMAX - (5*BUTH+4*YSPACE);
+
+ /* 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");
+ uiBlockEndAlign(block);
+
+ 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)
@@ -2189,28 +2263,28 @@ static void world_panel_world(World *wrld)
uiSetButLock(wrld->id.lib!=0, ERROR_LIBDATA_MESSAGE);
uiBlockSetCol(block, TH_AUTO);
- uiDefButF(block, COL, B_WORLDPRV, "", 10,150,145,19, &wrld->horr, 0, 0, 0, B_COLHOR, "");
- uiDefButF(block, COL, B_WORLDPRV, "", 160,150,145,19, &wrld->zenr, 0, 0, 0, B_COLZEN, "");
-
uiBlockBeginAlign(block);
+ uiDefButF(block, COL, B_WORLDPRV, "", 10,150,145,19, &wrld->horr, 0, 0, 0, B_COLHOR, "");
uiDefButF(block, NUMSLI,B_WORLDPRV,"HoR ", 10,130,145,19, &(wrld->horr), 0.0, 1.0, B_COLHOR,0, "Sets the amount of red color at the horizon");
uiDefButF(block, NUMSLI,B_WORLDPRV,"HoG ", 10,110,145,19, &(wrld->horg), 0.0, 1.0, B_COLHOR,0, "Sets the amount of green color at the horizon");
uiDefButF(block, NUMSLI,B_WORLDPRV,"HoB ", 10,90,145,19, &(wrld->horb), 0.0, 1.0, B_COLHOR,0, "Sets the amount of blue color at the horizon");
uiBlockBeginAlign(block);
+ uiDefButF(block, COL, B_WORLDPRV, "", 160,150,145,19, &wrld->zenr, 0, 0, 0, B_COLZEN, "");
uiDefButF(block, NUMSLI,B_WORLDPRV,"ZeR ", 160,130,145,19, &(wrld->zenr), 0.0, 1.0, B_COLZEN,0, "Sets the amount of red color at the zenith");
uiDefButF(block, NUMSLI,B_WORLDPRV,"ZeG ", 160,110,145,19, &(wrld->zeng), 0.0, 1.0, B_COLZEN,0, "Sets the amount of green color at the zenith");
uiDefButF(block, NUMSLI,B_WORLDPRV,"ZeB ", 160,90,145,19, &(wrld->zenb), 0.0, 1.0, B_COLZEN,0, "Sets the amount of blue color at the zenith");
uiBlockBeginAlign(block);
+ uiDefButF(block, COL, B_WORLDPRV, "", 10,70,145,19, &wrld->ambr, 0, 0, 0, 0, "");
uiDefButF(block, NUMSLI,B_WORLDPRV,"AmbR ", 10,50,145,19, &(wrld->ambr), 0.0, 1.0 ,0,0, "Sets the amount of red ambient color");
uiDefButF(block, NUMSLI,B_WORLDPRV,"AmbG ", 10,30,145,19, &(wrld->ambg), 0.0, 1.0 ,0,0, "Sets the amount of green ambient color");
uiDefButF(block, NUMSLI,B_WORLDPRV,"AmbB ", 10,10,145,19, &(wrld->ambb), 0.0, 1.0 ,0,0, "Sets the amount of blue ambient color");
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButF(block, NUMSLI,B_WORLDPRV, "Exp ", 160,30,145,19, &(wrld->exp), 0.0, 1.0, 0, 2, "Sets amount of exponential color correction for light");
- uiDefButF(block, NUMSLI,B_WORLDPRV, "Range ", 160,10,145,19, &(wrld->range), 0.2, 5.0, 0, 2, "Sets the color amount that will be mapped on color 1.0");
+ uiDefButF(block, NUMSLI,B_WORLDPRV2, "Exp ", 160,30,145,19, &(wrld->exp), 0.0, 1.0, 0, 2, "Sets amount of exponential color correction for light");
+ uiDefButF(block, NUMSLI,B_WORLDPRV2, "Range ", 160,10,145,19, &(wrld->range), 0.2, 5.0, 0, 2, "Sets the color amount that will be mapped on color 1.0");
}
@@ -2350,7 +2424,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);
@@ -2361,7 +2435,7 @@ static void lamp_panel_mapto(Object *ob, Lamp *la)
uiDefButF(block, NUMSLI, B_LAMPPRV, "G ", 10,60,135,19, &(mtex->g), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB");
uiDefButF(block, NUMSLI, B_LAMPPRV, "B ", 10,40,135,19, &(mtex->b), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB");
uiBlockEndAlign(block);
- uiDefButF(block, NUMSLI, B_LAMPPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "The default value the textures uses to mix with");
+ uiDefButF(block, NUMSLI, B_LAMPPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard");
/* MAP TO */
uiDefButBitS(block, TOG, MAP_COL, B_LAMPPRV, "Col", 10,180,135,19, &(mtex->mapto), 0, 0, 0, 0, "Lets the texture affect the basic color of the lamp");
@@ -2894,7 +2968,7 @@ void do_matbuts(unsigned short event)
allqueue(REDRAWBUTSSHADING, 0);
break;
case B_WORLDPRV2:
- BIF_preview_changed(ID_WO);
+ BIF_preview_changed(ID_TE);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWVIEW3D, 0);
break;
@@ -3006,16 +3080,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");
@@ -3031,7 +3154,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);
@@ -3053,36 +3176,86 @@ static void material_panel_map_to(Material *ma, int from_nodes)
}
uiBlockEndAlign(block);
- uiDefButF(block, NUMSLI, B_MATPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "The default value the texture uses to mix with (not RGB)");
+ uiDefButF(block, NUMSLI, B_MATPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard");
/* 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_ROUGH, B_MAT_PARTICLE, "Rough", 250,180,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the roughness of child 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);
@@ -3154,7 +3327,7 @@ static void material_panel_map_input(Object *ob, Material *ma)
uiBlockBeginAlign(block);
uiDefButS(block, ROW, B_MATPRV, "Glob", 630,180,45,18, &(mtex->texco), 4.0, (float)TEXCO_GLOB, 0, 0, "Uses global coordinates for the texture coordinates");
uiDefButS(block, ROW, B_MATPRV, "Object", 675,180,75,18, &(mtex->texco), 4.0, (float)TEXCO_OBJECT, 0, 0, "Uses linked object's coordinates for texture coordinates");
- if(mtex->texco == TEXCO_UV) {
+ if(mtex->texco == TEXCO_UV && !(mtex->texflag & MTEX_DUPLI_MAPTO)) {
if(!verify_valid_uv_name(mtex->uvname))
uiBlockSetCol(block, TH_REDALERT);
but=uiDefBut(block, TEX, B_MATPRV, "UV:", 750,180,158,18, mtex->uvname, 0, 31, 0, 0, "Set name of UV layer to use, default is active UV layer");
@@ -3166,7 +3339,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");
@@ -3176,6 +3349,10 @@ static void material_panel_map_input(Object *ob, Material *ma)
uiDefButS(block, ROW, B_MATPRV, "Stress", 630,140,70,18, &(mtex->texco), 4.0, (float)TEXCO_STRESS, 0, 0, "Uses the difference of edge lengths compared to original coordinates of the mesh");
uiDefButS(block, ROW, B_MATPRV, "Tangent", 700,140,70,18, &(mtex->texco), 4.0, (float)TEXCO_TANGENT, 0, 0, "Uses the optional tangent vector as texture coordinates");
+ uiBlockEndAlign(block);
+
+ if(ELEM(mtex->texco, TEXCO_UV, TEXCO_ORCO))
+ uiDefButBitS(block, TOG, MTEX_DUPLI_MAPTO, B_MATPRV, "From Dupli", 820,140,88,18, &(mtex->texflag), 0, 0, 0, 0, "If object is duplicated by vertices, faces or particles, inherit texture coordinate from parent object");
/* COORDS */
uiBlockBeginAlign(block);
@@ -3210,12 +3387,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;
@@ -3223,6 +3402,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);
@@ -3244,7 +3428,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);
@@ -3551,7 +3738,7 @@ static void material_panel_shading(Material *ma)
uiBlock *block;
block= uiNewBlock(&curarea->uiblocks, "material_panel_shading", UI_EMBOSS, UI_HELV, curarea->win);
- if(uiNewPanel(curarea, block, "Shaders", "Material", 640, 0, 318, 204)==0) return;
+ if(uiNewPanel(curarea, block, "Shaders", "Material", 640, 0, 318, 224)==0) return;
uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE);
@@ -3629,23 +3816,24 @@ static void material_panel_shading(Material *ma)
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, 2.0, 0, 0, "Sets the amount of light the material emits");
+ uiDefButF(block, NUMSLI, B_MATPRV, "LBias ", 9,-10,300,19, &(ma->lbias), 0.0, 10.0, 100, 2, "Factor to multiply shadowbuffer bias with (0 is ignore)");
uiBlockEndAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1);
uiDefButBitI(block, TOG, MA_TANGENT_V, B_MATPRV, "Tangent V", 245,180,65,19, &(ma->mode), 0, 0, 0, 0, "Use the tangent vector in V direction for shading");
- /* qdn: normalmap tangents separated from shading */
- uiDefButBitI(block, TOG, MA_NORMAP_TANG, B_MATPRV, "NMap TS", 245,160,65,19, &(ma->mode), 0, 0, 0, 0, "Enable Tangent Space normal mapping");
-
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, MA_SHADOW, B_MATPRV, "Shadow", 245,140,65,19, &(ma->mode), 0, 0, 0, 0, "Makes material receive shadows");
uiDefButBitI(block, TOG, MA_SHADOW_TRA, B_MATPRV, "TraShadow", 245,120,65,19, &(ma->mode), 0, 0, 0, 0, "Receives transparent shadows based at material color and alpha");
uiDefButBitI(block, TOG, MA_ONLYSHADOW, B_MATPRV, "OnlyShad", 245,100,65,20, &(ma->mode), 0, 0, 0, 0, "Renders shadows on material as Alpha value");
- uiDefButBitI(block, TOG, MA_RAYBIAS, B_MATPRV, "Bias", 245,80,65,19, &(ma->mode), 0, 0, 0, 0, "Prevents ray traced shadow errors with phong interpolated normals (terminator problem)");
+ uiDefButBitS(block, TOG, MA_CUBIC, B_MATPRV, "Cubic", 245,80,65,19, &(ma->shade_flag), 0, 0, 0, 0, "Use Cubic interpolation of diffuse values, for smoother transitions)");
+ uiDefButBitI(block, TOG, MA_RAYBIAS, B_MATPRV, "Bias", 245,60,65,19, &(ma->mode), 0, 0, 0, 0, "Prevents ray traced shadow errors with phong interpolated normals (terminator problem)");
uiBlockBeginAlign(block);
uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_MATPRV, "GR:", 9, 55, 150, 19, &ma->group, "Limit Lighting to Lamps in this Group");
- uiDefButBitI(block, TOG, MA_GROUP_NOLAY, B_MATPRV, "Exclusive", 159,55, 85,20, &(ma->mode), 0, 0, 0, 0, "The material exclusively uses Lamps in this Group");
+ uiDefButBitI(block, TOG, MA_GROUP_NOLAY, B_MATPRV, "Exclusive", 159,55, 85,20, &(ma->mode), 0, 0, 0, 0, "Material uses Lights in this group exclusively, they get excluded from the Scene lighting");
+
+
}
}
@@ -3702,18 +3890,38 @@ static uiBlock *strand_menu(void *mat_v)
{
Material *ma= mat_v;
uiBlock *block;
-
+ int buth=20, butw=230, butx=10, buty=180;
+
block= uiNewBlock(&curarea->uiblocks, "strand menu", UI_EMBOSS, UI_HELV, curarea->win);
-
+
+ if(ma->mode & MA_STR_B_UNITS)
+ buty += buth;
+
/* 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, butw+20, buty+10, NULL, 0, 0, 0, 0, "");
+ /* event return 0, to prevent menu to close */
+
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, MA_TANGENT_STR, 0, "Use Tangent Shading", butx,buty-=buth,butw,buth, &(ma->mode), 0, 0, 0, 0, "Uses direction of strands as normal for tangent-shading");
+ uiDefButBitI(block, TOG, MA_STR_SURFDIFF, 0, "Surface Diffuse", butx,buty-=buth,butw/2,buth, &(ma->mode), 0, 0, 0, 0, "Make diffuse shading more similar to shading the surface");
+ uiDefButF(block, NUM, 0, "Dist", butx+butw/2,buty,butw/2,buth, &ma->strand_surfnor, 0.0f, 10.0f, 2, 0, "Distance in Blender units over which to blend in the surface normal");
+
+ buty -= 5;
+
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_STR_B_UNITS, 0, "Use Blender Units", butx,buty-=buth,butw,buth, &(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 ", butx,buty-=buth, butw,buth, &ma->strand_sta, 0.0001, 2.0, 2, 0, "Start size of strands in Blender units");
+ uiDefButF(block, NUMSLI, 0, "End ", butx,buty-=buth, butw,buth, &ma->strand_end, 0.0001, 1.0, 2, 0, "End size of strands in Blender units");
+ uiDefButF(block, NUMSLI, 0, "Minimum ", butx,buty-=buth, butw,buth, &ma->strand_min, 0.001, 10.0, 0, 0, "Minimum size of strands in pixels");
+ }
+ else{
+ uiDefButF(block, NUMSLI, 0, "Start ", butx,buty-=buth, butw,buth, &ma->strand_sta, 0.25, 20.0, 2, 0, "Start size of strands in pixels");
+ uiDefButF(block, NUMSLI, 0, "End ", butx,buty-=buth, butw,buth, &ma->strand_end, 0.25, 10.0, 2, 0, "End size of strands in pixels");
+ }
+ uiDefButF(block, NUMSLI, 0, "Shape ", butx,buty-=buth, butw,buth, &ma->strand_ease, -0.9, 0.9, 2, 0, "Shape of strands, positive value makes it rounder, negative makes it spiky");
+ uiDefButF(block, NUMSLI, 0, "Width Fade ", butx,buty-=buth, butw,buth, &ma->strand_widthfade, 0.0, 2.0, 2, 0, "Transparency along the width of the strand");
+ uiDefBut(block, TEX, B_MATPRV, "UV:", butx,buty-=buth,butw,buth, ma->strand_uvname, 0, 31, 0, 0, "Set name of UV layer to override");
uiBlockSetDirection(block, UI_TOP);
BIF_preview_changed(ID_MA);
@@ -3751,8 +3959,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)");
@@ -3796,7 +4005,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);
@@ -4009,12 +4219,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);
}
}
}
@@ -4134,7 +4344,7 @@ void texture_panels()
switch(tex->type) {
case TEX_IMAGE:
texture_panel_image(&tex->ima, &tex->iuser);
- texture_panel_image_map(tex);
+ texture_panel_image_map(tex, mtex);
break;
case TEX_ENVMAP:
texture_panel_envmap(tex);
diff --git a/source/blender/src/drawaction.c b/source/blender/src/drawaction.c
index 183558b65bc..4c79dce48c6 100644
--- a/source/blender/src/drawaction.c
+++ b/source/blender/src/drawaction.c
@@ -64,6 +64,7 @@
#include "BKE_depsgraph.h"
#include "BKE_ipo.h"
#include "BKE_key.h"
+#include "BKE_object.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -94,6 +95,7 @@
/* 'old' stuff": defines and types, and own include -------------------- */
#include "blendef.h"
+#include "interface.h"
#include "mydevice.h"
/********************************** Slider Stuff **************************** */
@@ -362,7 +364,7 @@ void draw_cfra_action (void)
vec[0]*= G.scene->r.framelen;
vec[1]= G.v2d->cur.ymin;
- glColor3ub(0x60, 0xc0, 0x40);
+ BIF_ThemeColor(TH_CFRAME);
glLineWidth(2.0);
glBegin(GL_LINE_STRIP);
@@ -373,10 +375,10 @@ void draw_cfra_action (void)
/* 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;
+ if ((ob) && (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0)) {
+ vec[0]-= give_timeoffset(ob); /* could avoid calling twice */
- glColor3ub(0x10, 0x60, 0);
+ BIF_ThemeColorShade(TH_CFRAME, -30);
glBegin(GL_LINE_STRIP);
glVertex2fv(vec);
@@ -406,7 +408,7 @@ static void draw_channel_names(void)
if (data == NULL) return;
/* Clip to the scrollable area */
- if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
+ if (curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
if(G.v2d->scroll) {
ofsx= curarea->winrct.xmin;
ofsy= curarea->winrct.ymin;
@@ -428,177 +430,227 @@ static void draw_channel_names(void)
/* 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];
+ const float yminc= y-CHANNELHEIGHT/2;
+ const float ymaxc= y+CHANNELHEIGHT/2;
- /* 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;
+ /* check if visible */
+ if ( IN_RANGE(yminc, G.v2d->cur.ymin, G.v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, G.v2d->cur.ymin, G.v2d->cur.ymax) )
+ {
+ short indent= 0, offset= 0, sel= 0, group=0;
+ int expand= -1, protect = -1, special= -1, mute = -1;
+ char name[32];
+
+ /* determine what needs to be drawn */
+ switch (ale->type) {
+ case ACTTYPE_GROUP: /* action group */
+ {
+ bActionGroup *agrp= (bActionGroup *)ale->data;
- if (EDITABLE_ACHAN(achan))
- protect = ICON_UNLOCKED;
- else
- protect = ICON_LOCKED;
+ group= 2;
+ indent= 0;
+ special= -1;
- if (achan->ipo) {
- if (achan->ipo->muteipo)
- mute = ICON_MUTE_IPO_ON;
+ if (EXPANDED_AGRP(agrp))
+ expand = ICON_TRIA_DOWN;
else
- mute = ICON_MUTE_IPO_OFF;
+ expand = ICON_TRIA_RIGHT;
+
+ if (EDITABLE_AGRP(agrp))
+ protect = ICON_UNLOCKED;
+ else
+ protect = ICON_LOCKED;
+
+ sel = SEL_AGRP(agrp);
+ sprintf(name, agrp->name);
}
-
- 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;
+ break;
+ case ACTTYPE_ACHAN: /* action channel */
+ {
+ bActionChannel *achan= (bActionChannel *)ale->data;
- if (conchan->ipo) {
- if (conchan->ipo->muteipo)
- mute = ICON_MUTE_IPO_ON;
+ group= (ale->grp) ? 1 : 0;
+ 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;
+ }
+
+ sel = SEL_ACHAN(achan);
+ sprintf(name, achan->name);
+ }
+ break;
+ case ACTTYPE_CONCHAN: /* constraint channel */
+ {
+ bConstraintChannel *conchan = (bConstraintChannel *)ale->data;
+
+ indent = 2;
+ group= (ale->grp) ? 1 : 0;
+
+ 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
+ group= (ale->grp) ? 1 : 0;
+
+ 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);
+ group= (ale->grp) ? 1 : 0;
+
+ 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;
+ group= (ale->grp) ? 1 : 0;
+
+ 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 */
+ if (group == 2) {
+ /* only for group-channels */
+ if (ale->flag & AGRP_ACTIVE)
+ BIF_ThemeColorShade(TH_GROUP_ACTIVE, 10);
+ else
+ BIF_ThemeColorShade(TH_GROUP, 20);
+ uiSetRoundBox((expand == ICON_TRIA_DOWN)? (1):(1|8));
+ gl_round_box(GL_POLYGON, x, yminc, (float)NAMEWIDTH, ymaxc, 8);
- sel = SEL_CONCHAN(conchan);
- sprintf(name, conchan->name);
+ offset = 0;
}
- 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));
+ else {
+ /* for normal channels */
+ BIF_ThemeColorShade(TH_HEADER, ((indent==0)?20: (indent==1)?-20: -40));
+ indent += group;
+ offset = 7 * indent;
+ glRectf(x+offset, yminc, (float)NAMEWIDTH, ymaxc);
}
- 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);
+
+ /* draw expand/collapse triangle */
+ if (expand > 0) {
+ BIF_icon_draw(x+offset, yminc, expand);
+ offset += 17;
}
- 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");
+
+ /* draw special icon indicating type of ipo-blocktype?
+ * only for expand widgets for Ipo and Constraint Channels
+ */
+ if (special > 0) {
+ offset = (group) ? 29 : 24;
+ BIF_icon_draw(x+offset, yminc, special);
+ offset += 17;
}
- 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");
+ /* 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, yminc, protect);
}
- 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);
+ /* draw mute 'eye' */
+ if (mute > 0) {
+ offset += 16;
+ BIF_icon_draw(NAMEWIDTH-offset, yminc, mute);
+ }
}
/* adjust y-position for next one */
@@ -617,12 +669,12 @@ void check_action_context(SpaceAction *saction)
{
bActionChannel *achan;
- if(saction->action==NULL) return;
+ if (saction->action==NULL) return;
for (achan=saction->action->chanbase.first; achan; achan=achan->next)
achan->flag &= ~ACHAN_HIDDEN;
- if (G.saction->pin==0 && OBACT) {
+ if ((saction->pin==0) && ((saction->flag & SACTION_NOHIDE)==0) && (OBACT)) {
Object *ob= OBACT;
bPoseChannel *pchan;
bArmature *arm= ob->data;
@@ -652,9 +704,12 @@ static void draw_channel_strips(void)
float y, sta, end;
int act_start, act_end, dummy;
char col1[3], col2[3];
+ char col1a[3], col2a[3];
BIF_GetThemeColor3ubv(TH_SHADE2, col2);
BIF_GetThemeColor3ubv(TH_HILITE, col1);
+ BIF_GetThemeColor3ubv(TH_GROUP, col2a);
+ BIF_GetThemeColor3ubv(TH_GROUP_ACTIVE, col1a);
/* get editor data */
data= get_action_context(&datatype);
@@ -694,6 +749,12 @@ static void draw_channel_strips(void)
if (ale->datatype != ALE_NONE) {
/* determine if channel is selected */
switch (ale->type) {
+ case ACTTYPE_GROUP:
+ {
+ bActionGroup *agrp = (bActionGroup *)ale->data;
+ sel = SEL_AGRP(agrp);
+ }
+ break;
case ACTTYPE_ACHAN:
{
bActionChannel *achan = (bActionChannel *)ale->data;
@@ -717,12 +778,24 @@ static void draw_channel_strips(void)
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);
+ if (ale->datatype == ALE_GROUP) {
+ if (sel) glColor4ub(col1a[0], col1a[1], col1a[2], 0x22);
+ else glColor4ub(col2a[0], col2a[1], col2a[2], 0x22);
+ }
+ else {
+ 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);
+ if (ale->datatype == ALE_GROUP) {
+ if (sel) glColor4ub(col1a[0], col1a[1], col1a[2], 0x22);
+ else glColor4ub(col2a[0], col2a[1], col2a[2], 0x22);
+ }
+ else {
+ 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) {
@@ -748,16 +821,31 @@ static void draw_channel_strips(void)
if (NLA_ACTION_SCALED)
map_active_strip(di, OBACT, 0);
- /* draw keyframes */
+ /* Draw keyframes
+ * 1) Only channels that are visible in the Action Editor get drawn/evaluated.
+ * This is to try to optimise this for heavier data sets
+ * 2) Keyframes which are out of view horizontally are disregarded
+ */
y = 0.0;
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;
+ const float yminc= y-CHANNELHEIGHT/2;
+ const float ymaxc= y+CHANNELHEIGHT/2;
+
+ /* check if visible */
+ if ( IN_RANGE(yminc, G.v2d->cur.ymin, G.v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, G.v2d->cur.ymin, G.v2d->cur.ymax) )
+ {
+ switch (ale->datatype) {
+ case ALE_GROUP:
+ draw_agroup_channel(di, ale->data, y);
+ break;
+ 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;
@@ -883,7 +971,7 @@ void drawactionspace(ScrArea *sa, void *spacedata)
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
- if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
+ if (curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
if(G.v2d->scroll) {
ofsx= curarea->winrct.xmin;
ofsy= curarea->winrct.ymin;
@@ -927,8 +1015,10 @@ void drawactionspace(ScrArea *sa, void *spacedata)
/* Draw current frame */
draw_cfra_action();
- /* Draw markers */
- draw_markers_timespace(0);
+ /* Draw markers (local behind scene ones, as local obscure scene markers) */
+ if (act)
+ draw_markers_timespace(&act->markers, DRAW_MARKERS_LOCAL);
+ draw_markers_timespace(SCE_MARKERS, 0);
/* Draw 'curtains' for preview */
draw_anim_preview_timespace();
@@ -1045,11 +1135,14 @@ static void add_bezt_to_keyblockslist(ListBase *blocks, IpoCurve *icu, int index
}
}
- /* check if block needed - same value? */
- if ((!prev) || (!beztn))
- return;
- if (beztn->vec[1][1] != prev->vec[1][1])
- return;
+ /* check if block needed - same value(s)?
+ * -> firstly, handles must have same central value as each other
+ * -> secondly, handles which control that section of the curve must be constant
+ */
+ if ((!prev) || (!beztn)) return;
+ if (IS_EQ(beztn->vec[1][1], prev->vec[1][1])==0) return;
+ if (IS_EQ(beztn->vec[1][1], beztn->vec[0][1])==0) return;
+ if (IS_EQ(prev->vec[1][1], prev->vec[2][1])==0) return;
/* try to find a keyblock that starts on the previous beztriple */
for (ab= blocks->first; ab; ab= ab->next) {
@@ -1155,12 +1248,36 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
glDisable(GL_BLEND);
}
+
+static ActKeysInc *init_aki_data()
+{
+ static ActKeysInc aki;
+
+ /* init data of static struct here */
+ if ((curarea->spacetype == SPACE_ACTION) && NLA_ACTION_SCALED)
+ aki.ob= OBACT;
+ else if (curarea->spacetype == SPACE_NLA)
+ aki.ob= NULL; // FIXME
+ else
+ aki.ob= NULL;
+
+ aki.start= G.v2d->cur.xmin - 10;
+ aki.end= G.v2d->cur.xmax + 10;
+
+ /* only pass pointer for Action Editor if enabled (for now) */
+ if ((curarea->spacetype == SPACE_ACTION) && (G.saction->flag & SACTION_HORIZOPTIMISEON))
+ return &aki;
+ else
+ return NULL;
+}
+
void draw_object_channel(gla2DDrawInfo *di, Object *ob, float ypos)
{
ListBase keys = {0, 0};
ListBase blocks = {0, 0};
+ ActKeysInc *aki = init_aki_data();
- ob_to_keylist(ob, &keys, &blocks);
+ ob_to_keylist(ob, &keys, &blocks, aki);
draw_keylist(di, &keys, &blocks, ypos);
BLI_freelistN(&keys);
@@ -1171,8 +1288,9 @@ void draw_ipo_channel(gla2DDrawInfo *di, Ipo *ipo, float ypos)
{
ListBase keys = {0, 0};
ListBase blocks = {0, 0};
+ ActKeysInc *aki = init_aki_data();
- ipo_to_keylist(ipo, &keys, &blocks);
+ ipo_to_keylist(ipo, &keys, &blocks, aki);
draw_keylist(di, &keys, &blocks, ypos);
BLI_freelistN(&keys);
@@ -1183,38 +1301,52 @@ void draw_icu_channel(gla2DDrawInfo *di, IpoCurve *icu, float ypos)
{
ListBase keys = {0, 0};
ListBase blocks = {0, 0};
+ ActKeysInc *aki = init_aki_data();
- icu_to_keylist(icu, &keys, &blocks);
+ icu_to_keylist(icu, &keys, &blocks, aki);
draw_keylist(di, &keys, &blocks, ypos);
BLI_freelistN(&keys);
BLI_freelistN(&blocks);
}
+void draw_agroup_channel(gla2DDrawInfo *di, bActionGroup *agrp, float ypos)
+{
+ ListBase keys = {0, 0};
+ ListBase blocks = {0, 0};
+ ActKeysInc *aki = init_aki_data();
+
+ agroup_to_keylist(agrp, &keys, &blocks, aki);
+ draw_keylist(di, &keys, &blocks, ypos);
+ BLI_freelistN(&keys);
+ BLI_freelistN(&blocks);
+}
+
void draw_action_channel(gla2DDrawInfo *di, bAction *act, float ypos)
{
ListBase keys = {0, 0};
+ ActKeysInc *aki = init_aki_data();
- action_to_keylist(act, &keys, NULL);
+ action_to_keylist(act, &keys, NULL, aki);
draw_keylist(di, &keys, NULL, ypos);
BLI_freelistN(&keys);
}
/* --------------- Conversion: data -> keyframe list ------------------ */
-void ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks)
+void ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
{
bConstraintChannel *conchan;
if (ob) {
/* Add object keyframes */
if (ob->ipo)
- ipo_to_keylist(ob->ipo, keys, blocks);
+ ipo_to_keylist(ob->ipo, keys, blocks, aki);
/* Add constraint keyframes */
- for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next){
+ for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next) {
if(conchan->ipo)
- ipo_to_keylist(conchan->ipo, keys, blocks);
+ ipo_to_keylist(conchan->ipo, keys, blocks, aki);
}
/* Add object data keyframes */
@@ -1222,7 +1354,24 @@ void ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks)
}
}
-void icu_to_keylist(IpoCurve *icu, ListBase *keys, ListBase *blocks)
+static short bezt_in_aki_range (ActKeysInc *aki, BezTriple *bezt)
+{
+ /* when aki == NULL, we don't care about range */
+ if (aki == NULL)
+ return 1;
+
+ /* if nla-scaling is in effect, apply appropriate scaling adjustments */
+ if (aki->ob) {
+ float frame= get_action_frame_inv(aki->ob, bezt->vec[1][0]);
+ return IN_RANGE(frame, aki->start, aki->end);
+ }
+ else {
+ /* check if in range */
+ return IN_RANGE(bezt->vec[1][0], aki->start, aki->end);
+ }
+}
+
+void icu_to_keylist(IpoCurve *icu, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
{
BezTriple *bezt;
ActKeyColumn *ak;
@@ -1234,8 +1383,11 @@ void icu_to_keylist(IpoCurve *icu, ListBase *keys, ListBase *blocks)
bezt= icu->bezt;
for (v=0; v<icu->totvert; v++, bezt++) {
- add_bezt_to_keycolumnslist(keys, bezt);
- if (blocks) add_bezt_to_keyblockslist(blocks, icu, v);
+ /* only if keyframe is in range (optimisation) */
+ if (bezt_in_aki_range(aki, bezt)) {
+ add_bezt_to_keycolumnslist(keys, bezt);
+ if (blocks) add_bezt_to_keyblockslist(blocks, icu, v);
+ }
}
/* update the number of curves that elements have appeared in */
@@ -1258,17 +1410,38 @@ void icu_to_keylist(IpoCurve *icu, ListBase *keys, ListBase *blocks)
}
}
-void ipo_to_keylist(Ipo *ipo, ListBase *keys, ListBase *blocks)
+void ipo_to_keylist(Ipo *ipo, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
{
IpoCurve *icu;
if (ipo) {
for (icu= ipo->curve.first; icu; icu= icu->next)
- icu_to_keylist(icu, keys, blocks);
+ icu_to_keylist(icu, keys, blocks, aki);
+ }
+}
+
+void agroup_to_keylist(bActionGroup *agrp, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
+{
+ bActionChannel *achan;
+ bConstraintChannel *conchan;
+
+ if (agrp) {
+ /* loop through action channels */
+ for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
+ /* firstly, add keys from action channel's ipo block */
+ if (achan->ipo)
+ ipo_to_keylist(achan->ipo, keys, blocks, aki);
+
+ /* then, add keys from constraint channels */
+ for (conchan= achan->constraintChannels.first; conchan; conchan= conchan->next) {
+ if (conchan->ipo)
+ ipo_to_keylist(conchan->ipo, keys, blocks, aki);
+ }
+ }
}
}
-void action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks)
+void action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
{
bActionChannel *achan;
bConstraintChannel *conchan;
@@ -1278,12 +1451,12 @@ void action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks)
for (achan= act->chanbase.first; achan; achan= achan->next) {
/* firstly, add keys from action channel's ipo block */
if (achan->ipo)
- ipo_to_keylist(achan->ipo, keys, blocks);
+ ipo_to_keylist(achan->ipo, keys, blocks, aki);
/* then, add keys from constraint channels */
for (conchan= achan->constraintChannels.first; conchan; conchan= conchan->next) {
if (conchan->ipo)
- ipo_to_keylist(achan->ipo, keys, blocks);
+ ipo_to_keylist(conchan->ipo, keys, blocks, aki);
}
}
}
diff --git a/source/blender/src/drawarmature.c b/source/blender/src/drawarmature.c
index 601a3fdf589..67c598f993f 100644
--- a/source/blender/src/drawarmature.c
+++ b/source/blender/src/drawarmature.c
@@ -49,6 +49,7 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
@@ -86,6 +87,222 @@
#include "blendef.h"
#include "nla.h"
+
+/* *************** Armature Drawing - Coloring API ***************************** */
+
+/* global here is reset before drawing each bone */
+static ThemeWireColor *bcolor= NULL;
+
+/* values of colCode for set_pchan_glcolor */
+enum {
+ PCHAN_COLOR_NORMAL = 0, /* normal drawing */
+ PCHAN_COLOR_SOLID, /* specific case where "solid" colour is needed */
+ PCHAN_COLOR_CONSTS, /* "constraint" colors (which may/may-not be suppressed) */
+
+ PCHAN_COLOR_SPHEREBONE_BASE, /* for the 'stick' of sphere (envelope) bones */
+ PCHAN_COLOR_SPHEREBONE_END, /* for the ends of sphere (envelope) bones */
+ PCHAN_COLOR_LINEBONE /* for the middle of line-bones */
+};
+
+/* This function sets the color-set for coloring a certain bone */
+static void set_pchan_colorset (Object *ob, bPoseChannel *pchan)
+{
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bArmature *arm= (ob) ? ob->data : NULL;
+ short color_index= 0;
+
+ /* sanity check */
+ if (ELEM4(NULL, ob, arm, pose, pchan)) {
+ bcolor= NULL;
+ return;
+ }
+
+ /* only try to set custom color if enabled for armature */
+ if (arm->flag & ARM_COL_CUSTOM) {
+ /* currently, a bone can only use a custom color set if it's group (if it has one),
+ * has been set to use one
+ */
+ if (pchan->agrp_index) {
+ bActionGroup *grp= (bActionGroup *)BLI_findlink(&pose->agroups, (pchan->agrp_index - 1));
+ if (grp)
+ color_index= grp->customCol;
+ }
+ }
+
+ /* bcolor is a pointer to the color set to use. If NULL, then the default
+ * color set (based on the theme colors for 3d-view) is used.
+ */
+ if (color_index) {
+ bTheme *btheme= U.themes.first;
+ bcolor= &btheme->tarm[(color_index - 1)];
+ }
+ else
+ bcolor= NULL;
+}
+
+/* This function is for brightening/darkening a given color (like BIF_ThemeColorShade()) */
+static void cp_shade_color3ub (char cp[], int offset)
+{
+ int r, g, b;
+
+ r= offset + (int) cp[0];
+ CLAMP(r, 0, 255);
+ g= offset + (int) cp[1];
+ CLAMP(g, 0, 255);
+ b= offset + (int) cp[2];
+ CLAMP(b, 0, 255);
+
+ cp[0]= r;
+ cp[1]= g;
+ cp[2]= b;
+}
+
+/* This function sets the gl-color for coloring a certain bone (based on bcolor) */
+static short set_pchan_glColor (short colCode, int armflag, int boneflag, int constflag)
+{
+ switch (colCode) {
+ case PCHAN_COLOR_NORMAL:
+ {
+ if (bcolor) {
+ char cp[3];
+
+ if (boneflag & BONE_ACTIVE) {
+ VECCOPY(cp, bcolor->active);
+ }
+ else if (boneflag & BONE_SELECTED) {
+ VECCOPY(cp, bcolor->select);
+ }
+ else {
+ /* a bit darker than solid */
+ VECCOPY(cp, bcolor->solid);
+ cp_shade_color3ub(cp, -50);
+ }
+
+ glColor3ub(cp[0], cp[1], cp[2]);
+ }
+ else {
+ if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
+ else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
+ else BIF_ThemeColor(TH_WIRE);
+ }
+
+ return 1;
+ }
+ break;
+
+ case PCHAN_COLOR_SOLID:
+ {
+ if (bcolor) {
+ char *cp= bcolor->solid;
+ glColor3ub(cp[0], cp[1], cp[2]);
+ }
+ else
+ BIF_ThemeColor(TH_BONE_SOLID);
+
+ return 1;
+ }
+ break;
+
+ case PCHAN_COLOR_CONSTS:
+ {
+ if ( (bcolor == NULL) || (bcolor->flag & TH_WIRECOLOR_CONSTCOLS) ) {
+ if (constflag & PCHAN_HAS_STRIDE) glColor4ub(0, 0, 200, 80);
+ else if (constflag & PCHAN_HAS_TARGET) glColor4ub(255, 150, 0, 80);
+ else if (constflag & PCHAN_HAS_IK) glColor4ub(255, 255, 0, 80);
+ else if (constflag & PCHAN_HAS_CONST) glColor4ub(0, 255, 120, 80);
+ else if (constflag) BIF_ThemeColor4(TH_BONE_POSE); // PCHAN_HAS_ACTION
+
+ return 1;
+ }
+ else
+ return 0;
+ }
+ break;
+
+ case PCHAN_COLOR_SPHEREBONE_BASE:
+ {
+ if (bcolor) {
+ char cp[3];
+
+ if (boneflag & BONE_ACTIVE) {
+ VECCOPY(cp, bcolor->active);
+ }
+ else if (boneflag & BONE_SELECTED) {
+ VECCOPY(cp, bcolor->select);
+ }
+ else {
+ VECCOPY(cp, bcolor->solid);
+ }
+
+ glColor3ub(cp[0], cp[1], cp[2]);
+ }
+ else {
+ if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
+ else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
+ else BIF_ThemeColor(TH_BONE_SOLID);
+ }
+
+ return 1;
+ }
+ break;
+ case PCHAN_COLOR_SPHEREBONE_END:
+ {
+ if (bcolor) {
+ char cp[3];
+
+ if (boneflag & BONE_ACTIVE) {
+ VECCOPY(cp, bcolor->active);
+ cp_shade_color3ub(cp, 10);
+ }
+ else if (boneflag & BONE_SELECTED) {
+ VECCOPY(cp, bcolor->select);
+ cp_shade_color3ub(cp, -30);
+ }
+ else {
+ VECCOPY(cp, bcolor->solid);
+ cp_shade_color3ub(cp, -30);
+ }
+
+ glColor3ub(cp[0], cp[1], cp[2]);
+ }
+ else {
+ if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 10);
+ else if (boneflag & BONE_SELECTED) BIF_ThemeColorShade(TH_BONE_POSE, -30);
+ else BIF_ThemeColorShade(TH_BONE_SOLID, -30);
+ }
+ }
+ break;
+
+ case PCHAN_COLOR_LINEBONE:
+ {
+ /* inner part in background color or constraint */
+ if ( (constflag) && ((bcolor==NULL) || (bcolor->flag & TH_WIRECOLOR_CONSTCOLS)) ) {
+ if (constflag & PCHAN_HAS_STRIDE) glColor3ub(0, 0, 200);
+ else if (constflag & PCHAN_HAS_TARGET) glColor3ub(255, 150, 0);
+ else if (constflag & PCHAN_HAS_IK) glColor3ub(255, 255, 0);
+ else if (constflag & PCHAN_HAS_CONST) glColor3ub(0, 255, 120);
+ else if (constflag) BIF_ThemeColor(TH_BONE_POSE); /* PCHAN_HAS_ACTION */
+ }
+ else {
+ if (bcolor) {
+ char *cp= bcolor->solid;
+ glColor4ub(cp[0], cp[1], cp[2], 0.8);
+ }
+ else
+ BIF_ThemeColorShade(TH_BACK, -30);
+ }
+
+ return 1;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+
+/* *************** Armature drawing, helper calls for parts ******************* */
+
/* half the cube, in Y */
static float cube[8][3] = {
{-1.0, 0.0, -1.0},
@@ -98,9 +315,6 @@ static float cube[8][3] = {
{ 1.0, 1.0, -1.0},
};
-
-/* *************** Armature drawing, helper calls for parts ******************* */
-
static void drawsolidcube_size(float xsize, float ysize, float zsize)
{
static GLuint displist=0;
@@ -152,10 +366,10 @@ static void drawcube_size(float xsize, float ysize, float zsize)
glScalef(xsize, ysize, zsize);
- if(displist==0) {
+ 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]);
@@ -167,7 +381,7 @@ static void drawcube_size(float xsize, float ysize, float zsize)
glVertex3fv(cube[2]); glVertex3fv(cube[6]);
glVertex3fv(cube[3]); glVertex3fv(cube[7]);
glEnd();
-
+
glEndList();
}
else glCallList(displist);
@@ -179,37 +393,38 @@ static void draw_bonevert(void)
{
static GLuint displist=0;
- if(displist==0) {
+ if (displist == 0) {
GLUquadricObj *qobj;
displist= glGenLists(1);
glNewList(displist, GL_COMPILE_AND_EXECUTE);
-
+
glPushMatrix();
qobj = gluNewQuadric();
gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
- gluDisk( qobj, 0.0, 0.05, 16, 1);
+ gluDisk(qobj, 0.0, 0.05, 16, 1);
- glRotatef (90, 0, 1, 0);
- gluDisk( qobj, 0.0, 0.05, 16, 1);
+ glRotatef(90, 0, 1, 0);
+ gluDisk(qobj, 0.0, 0.05, 16, 1);
- glRotatef (90, 1, 0, 0);
- gluDisk( qobj, 0.0, 0.05, 16, 1);
+ glRotatef(90, 1, 0, 0);
+ gluDisk(qobj, 0.0, 0.05, 16, 1);
gluDeleteQuadric(qobj);
glPopMatrix();
glEndList();
}
- else glCallList(displist);
+ else
+ glCallList(displist);
}
static void draw_bonevert_solid(void)
{
static GLuint displist=0;
- if(displist==0) {
+ if (displist == 0) {
GLUquadricObj *qobj;
displist= glGenLists(1);
@@ -224,19 +439,20 @@ static void draw_bonevert_solid(void)
glEndList();
}
- else glCallList(displist);
+ else
+ glCallList(displist);
}
static void draw_bone_octahedral()
{
static GLuint displist=0;
- if(displist==0) {
+ if (displist == 0) {
float vec[6][3];
displist= glGenLists(1);
glNewList(displist, GL_COMPILE_AND_EXECUTE);
-
+
vec[0][0]= vec[0][1]= vec[0][2]= 0.0;
vec[5][0]= vec[5][2]= 0.0; vec[5][1]= 1.0;
@@ -267,14 +483,15 @@ static void draw_bone_octahedral()
glEndList();
}
- else glCallList(displist);
+ else
+ glCallList(displist);
}
static void draw_bone_solid_octahedral(void)
{
static GLuint displist=0;
- if(displist==0) {
+ if (displist == 0) {
float vec[6][3], nor[3];
displist= glGenLists(1);
@@ -328,7 +545,8 @@ static void draw_bone_solid_octahedral(void)
glEndList();
}
- else glCallList(displist);
+ else
+ glCallList(displist);
}
/* *************** Armature drawing, bones ******************* */
@@ -337,40 +555,51 @@ static void draw_bone_solid_octahedral(void)
static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id)
{
/* Draw root point if we are not connected */
- if (!(boneflag & BONE_CONNECTED)){
+ if ((boneflag & BONE_CONNECTED)==0) {
if (id != -1)
- glLoadName (id | BONESEL_ROOT);
+ glLoadName(id | BONESEL_ROOT);
- if(dt<=OB_WIRE) {
- if(armflag & ARM_EDITMODE) {
+ if(dt <= OB_WIRE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_ROOTSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColor(TH_VERTEX);
}
}
- else
- BIF_ThemeColor(TH_BONE_SOLID);
+ else {
+ if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, 0);
+ else
+ BIF_ThemeColor(TH_BONE_SOLID);
+ }
- if(dt>OB_WIRE) draw_bonevert_solid();
- else draw_bonevert();
+ if (dt > OB_WIRE)
+ draw_bonevert_solid();
+ else
+ draw_bonevert();
}
/* Draw tip point */
if (id != -1)
- glLoadName (id | BONESEL_TIP);
+ glLoadName(id | BONESEL_TIP);
- if(dt<=OB_WIRE) {
- if(armflag & ARM_EDITMODE) {
+ if (dt <= OB_WIRE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_TIPSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColor(TH_VERTEX);
}
}
else {
- BIF_ThemeColor(TH_BONE_SOLID);
+ if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, 0);
+ else
+ BIF_ThemeColor(TH_BONE_SOLID);
}
glTranslatef(0.0, 1.0, 0.0);
- if(dt>OB_WIRE) draw_bonevert_solid();
- else draw_bonevert();
+ if (dt > OB_WIRE)
+ draw_bonevert_solid();
+ else
+ draw_bonevert();
glTranslatef(0.0, -1.0, 0.0);
}
@@ -409,7 +638,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
float *headvec, *tailvec, dirvec[3];
/* figure out the sizes of spheres */
- if(ebone) {
+ if (ebone) {
/* this routine doesn't call set_matrix_editbone() that calculates it */
ebone->length = VecLenf(ebone->head, ebone->tail);
@@ -445,7 +674,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
/* move vector back */
Mat4Mul3Vecfl(imat, dirvec);
- if(0.0f != Normalize(dirvec)) {
+ if (0.0f != Normalize(dirvec)) {
float norvec[3], vec1[3], vec2[3], vec[3];
int a;
@@ -453,8 +682,8 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
Crossf(norvec, dirvec, imat[2]);
glBegin(GL_QUAD_STRIP);
-
- for(a=0; a<16; a++) {
+
+ for (a=0; a<16; a++) {
vec[0]= - *(si+a) * dirvec[0] + *(co+a) * norvec[0];
vec[1]= - *(si+a) * dirvec[1] + *(co+a) * norvec[1];
vec[2]= - *(si+a) * dirvec[2] + *(co+a) * norvec[2];
@@ -472,7 +701,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
glVertex3fv(vec2);
}
- for(a=15; a>=0; a--) {
+ for (a=15; a>=0; a--) {
vec[0]= *(si+a) * dirvec[0] + *(co+a) * norvec[0];
vec[1]= *(si+a) * dirvec[1] + *(co+a) * norvec[1];
vec[2]= *(si+a) * dirvec[2] + *(co+a) * norvec[2];
@@ -519,10 +748,10 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
float *headvec, *tailvec, dirvec[3];
/* figure out the sizes of spheres */
- if(ebone) {
+ if (ebone) {
/* this routine doesn't call set_matrix_editbone() that calculates it */
ebone->length = VecLenf(ebone->head, ebone->tail);
-
+
length= ebone->length;
tail= ebone->rad_tail;
if (ebone->parent && (boneflag & BONE_CONNECTED))
@@ -535,7 +764,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
else {
length= pchan->bone->length;
tail= pchan->bone->rad_tail;
- if (pchan->parent && (boneflag & BONE_CONNECTED))
+ if ((pchan->parent) && (boneflag & BONE_CONNECTED))
head= pchan->parent->bone->rad_tail;
else
head= pchan->bone->rad_head;
@@ -544,38 +773,34 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
}
/* sphere root color */
- if(armflag & ARM_EDITMODE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_ROOTSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColor(TH_VERTEX);
}
- else if(armflag & ARM_POSEMODE) {
- /* in black or selection color */
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_WIRE);
- }
+ else if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
/* Draw root point if we are not connected */
- if (!(boneflag & BONE_CONNECTED)){
+ if ((boneflag & BONE_CONNECTED)==0) {
if (id != -1)
- glLoadName (id | BONESEL_ROOT);
+ glLoadName(id | BONESEL_ROOT);
drawcircball(GL_LINE_LOOP, headvec, head, imat);
}
/* Draw tip point */
- if(armflag & ARM_EDITMODE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_TIPSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColor(TH_VERTEX);
}
if (id != -1)
- glLoadName (id | BONESEL_TIP);
+ glLoadName(id | BONESEL_TIP);
drawcircball(GL_LINE_LOOP, tailvec, tail, imat);
/* base */
- if(armflag & ARM_EDITMODE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_SELECT);
else BIF_ThemeColor(TH_WIRE);
}
@@ -589,7 +814,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
/* move vector back */
Mat4Mul3Vecfl(imat, dirvec);
- if(0.0f != Normalize(dirvec)) {
+ if (0.0f != Normalize(dirvec)) {
float norvech[3], norvect[3], vec[3];
VECCOPY(vec, dirvec);
@@ -601,8 +826,8 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
Crossf(norvect, vec, imat[2]);
if (id != -1)
- glLoadName (id | BONESEL_BONE);
-
+ glLoadName(id | BONESEL_BONE);
+
glBegin(GL_LINES);
vec[0]= headvec[0] + norvech[0];
vec[1]= headvec[1] + norvech[1];
@@ -636,7 +861,7 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
qobj = gluNewQuadric();
/* figure out the sizes of spheres */
- if(ebone) {
+ if (ebone) {
length= ebone->length;
tail= ebone->rad_tail;
if (ebone->parent && (boneflag & BONE_CONNECTED))
@@ -654,9 +879,9 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
}
/* move to z-axis space */
- glRotatef (-90.0f, 1.0f, 0.0f, 0.0f);
+ glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
- if(dt==OB_SOLID) {
+ if (dt==OB_SOLID) {
/* set up solid drawing */
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
@@ -669,57 +894,49 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
}
/* sphere root color */
- if(armflag & ARM_EDITMODE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_ROOTSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColorShade(TH_BONE_SOLID, -30);
}
- else if(armflag & ARM_POSEMODE) {
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 10);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColorShade(TH_BONE_POSE, -30);
- else BIF_ThemeColorShade(TH_BONE_SOLID, -30);
-
- }
- else if(dt==OB_SOLID)
+ else if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_END, armflag, boneflag, constflag);
+ else if (dt==OB_SOLID)
BIF_ThemeColorShade(TH_BONE_SOLID, -30);
/* Draw root point if we are not connected */
- if (!(boneflag & BONE_CONNECTED)){
+ if ((boneflag & BONE_CONNECTED)==0) {
if (id != -1)
- glLoadName (id | BONESEL_ROOT);
- gluSphere( qobj, head, 16, 10);
+ glLoadName(id | BONESEL_ROOT);
+ gluSphere(qobj, head, 16, 10);
}
/* Draw tip point */
- if(armflag & ARM_EDITMODE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_TIPSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColorShade(TH_BONE_SOLID, -30);
}
if (id != -1)
- glLoadName (id | BONESEL_TIP);
+ glLoadName(id | BONESEL_TIP);
glTranslatef(0.0, 0.0, length);
- gluSphere( qobj, tail, 16, 10);
+ gluSphere(qobj, tail, 16, 10);
glTranslatef(0.0, 0.0, -length);
/* base */
- if(armflag & ARM_EDITMODE) {
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_SELECT);
else BIF_ThemeColor(TH_BONE_SOLID);
}
- else if(armflag & ARM_POSEMODE) {
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_BONE_SOLID);
-
- }
- else if(dt==OB_SOLID)
+ else if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_BASE, armflag, boneflag, constflag);
+ else if (dt == OB_SOLID)
BIF_ThemeColor(TH_BONE_SOLID);
fac1= (length-head)/length;
fac2= (length-tail)/length;
- if(length > head+tail) {
+ if (length > (head+tail)) {
if (id != -1)
glLoadName (id | BONESEL_BONE);
@@ -729,25 +946,25 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
glTranslatef(0.0f, 0.0f, head);
gluCylinder(qobj, fac1*head + (1.0f-fac1)*tail, fac2*tail + (1.0f-fac2)*head, length-head-tail, 16, 1);
glTranslatef(0.0f, 0.0f, -head);
-
+
glDisable(GL_POLYGON_OFFSET_FILL);
/* draw sphere on extrema */
glTranslatef(0.0f, 0.0f, length-tail);
- gluSphere( qobj, fac2*tail + (1.0f-fac2)*head, 16, 10);
+ gluSphere(qobj, fac2*tail + (1.0f-fac2)*head, 16, 10);
glTranslatef(0.0f, 0.0f, -length+tail);
-
+
glTranslatef(0.0f, 0.0f, head);
- gluSphere( qobj, fac1*head + (1.0f-fac1)*tail, 16, 10);
+ gluSphere(qobj, fac1*head + (1.0f-fac1)*tail, 16, 10);
}
else {
/* 1 sphere in center */
glTranslatef(0.0f, 0.0f, (head + length-tail)/2.0);
- gluSphere( qobj, fac1*head + (1.0f-fac1)*tail, 16, 10);
+ gluSphere(qobj, fac1*head + (1.0f-fac1)*tail, 16, 10);
}
/* restore */
- if(dt==OB_SOLID) {
+ if (dt==OB_SOLID) {
glShadeModel(GL_FLAT);
glDisable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL);
@@ -770,7 +987,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- if(pchan)
+ if (pchan)
length= pchan->bone->length;
else
length= ebone->length;
@@ -779,20 +996,16 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
glScalef(length, length, length);
/* this chunk not in object mode */
- if(armflag & (ARM_EDITMODE|ARM_POSEMODE)) {
+ if (armflag & (ARM_EDITMODE|ARM_POSEMODE)) {
glLineWidth(4.0);
- if(armflag & ARM_POSEMODE) {
- /* outline in black or selection color */
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_WIRE);
- }
+ if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
else if (armflag & ARM_EDITMODE) {
BIF_ThemeColor(TH_WIRE);
}
/* Draw root point if we are not connected */
- if (!(boneflag & BONE_CONNECTED)){
+ if ((boneflag & BONE_CONNECTED)==0) {
if (G.f & G_PICKSEL) { // no bitmap in selection mode, crashes 3d cards...
glLoadName (id | BONESEL_ROOT);
glBegin(GL_POINTS);
@@ -806,7 +1019,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
}
if (id != -1)
- glLoadName ((GLuint) id|BONESEL_BONE);
+ glLoadName((GLuint) id|BONESEL_BONE);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
@@ -814,8 +1027,9 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
glEnd();
/* tip */
- if (G.f & G_PICKSEL) { // no bitmap in selection mode, crashes 3d cards...
- glLoadName (id | BONESEL_TIP);
+ if (G.f & G_PICKSEL) {
+ /* no bitmap in selection mode, crashes 3d cards... */
+ glLoadName(id | BONESEL_TIP);
glBegin(GL_POINTS);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
@@ -827,27 +1041,19 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
/* further we send no names */
if (id != -1)
- glLoadName (id & 0xFFFF); // object tag, for bordersel optim
-
- if(armflag & ARM_POSEMODE) {
- /* inner part in background color or constraint */
- if(constflag) {
- if(constflag & PCHAN_HAS_STRIDE) glColor3ub(0, 0, 200);
- else if(constflag & PCHAN_HAS_TARGET) glColor3ub(255, 150, 0);
- else if(constflag & PCHAN_HAS_IK) glColor3ub(255, 255, 0);
- else if(constflag & PCHAN_HAS_CONST) glColor3ub(0, 255, 120);
- else BIF_ThemeColor(TH_BONE_POSE); // PCHAN_HAS_ACTION
- }
- else BIF_ThemeColorShade(TH_BACK, -30);
- }
+ glLoadName(id & 0xFFFF); /* object tag, for bordersel optim */
+
+ if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_LINEBONE, armflag, boneflag, constflag);
}
glLineWidth(2.0);
- /* Draw root point if we are not connected */
- if (!(boneflag & BONE_CONNECTED)){
- if ((G.f & G_PICKSEL)==0) { // no bitmap in selection mode, crashes 3d cards...
- if(armflag & ARM_EDITMODE) {
+ /*Draw root point if we are not connected */
+ if ((boneflag & BONE_CONNECTED)==0) {
+ if ((G.f & G_PICKSEL)==0) {
+ /* no bitmap in selection mode, crashes 3d cards... */
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_ROOTSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColor(TH_VERTEX);
}
@@ -856,18 +1062,19 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
}
}
- if(armflag & ARM_EDITMODE) {
- if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_EDGE_SELECT);
- else BIF_ThemeColorShade(TH_BACK, -30);
- }
+ if (armflag & ARM_EDITMODE) {
+ if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_EDGE_SELECT);
+ else BIF_ThemeColorShade(TH_BACK, -30);
+ }
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
/* tip */
- if ((G.f & G_PICKSEL)==0) { // no bitmap in selection mode, crashes 3d cards...
- if(armflag & ARM_EDITMODE) {
+ if ((G.f & G_PICKSEL)==0) {
+ /* no bitmap in selection mode, crashes 3d cards... */
+ if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_TIPSEL) BIF_ThemeColor(TH_VERTEX_SELECT);
else BIF_ThemeColor(TH_VERTEX);
}
@@ -884,24 +1091,25 @@ static void draw_b_bone_boxes(int dt, bPoseChannel *pchan, float xwidth, float l
{
int segments= 0;
- if(pchan) segments= pchan->bone->segments;
+ if (pchan)
+ segments= pchan->bone->segments;
- if(segments>1 && pchan) {
+ if ((segments > 1) && (pchan)) {
float dlen= length/(float)segments;
Mat4 *bbone= b_bone_spline_setup(pchan, 0);
int a;
- for(a=0; a<segments; a++, bbone++) {
+ for (a=0; a<segments; a++, bbone++) {
glPushMatrix();
glMultMatrixf(bbone->mat);
- if(dt==OB_SOLID) drawsolidcube_size(xwidth, dlen, zwidth);
+ if (dt==OB_SOLID) drawsolidcube_size(xwidth, dlen, zwidth);
else drawcube_size(xwidth, dlen, zwidth);
glPopMatrix();
}
}
else {
glPushMatrix();
- if(dt==OB_SOLID) drawsolidcube_size(xwidth, length, zwidth);
+ if (dt==OB_SOLID) drawsolidcube_size(xwidth, length, zwidth);
else drawcube_size(xwidth, length, zwidth);
glPopMatrix();
}
@@ -911,7 +1119,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
{
float xwidth, length, zwidth;
- if(pchan) {
+ if (pchan) {
xwidth= pchan->bone->xwidth;
length= pchan->bone->length;
zwidth= pchan->bone->zwidth;
@@ -923,7 +1131,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
}
/* draw points only if... */
- if(armflag & ARM_EDITMODE) {
+ if (armflag & ARM_EDITMODE) {
/* move to unitspace */
glPushMatrix();
glScalef(length, length, length);
@@ -934,16 +1142,13 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
/* colors for modes */
if (armflag & ARM_POSEMODE) {
- if(dt==OB_WIRE) {
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_WIRE);
- }
+ if (dt <= OB_WIRE)
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
else
- BIF_ThemeColor(TH_BONE_SOLID);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
}
else if (armflag & ARM_EDITMODE) {
- if(dt==OB_WIRE) {
+ if (dt==OB_WIRE) {
if (boneflag & BONE_ACTIVE) BIF_ThemeColor(TH_EDGE_SELECT);
else if (boneflag & BONE_SELECTED) BIF_ThemeColorShade(TH_EDGE_SELECT, -20);
else BIF_ThemeColor(TH_WIRE);
@@ -957,10 +1162,14 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
}
/* set up solid drawing */
- if(dt > OB_WIRE) {
+ if (dt > OB_WIRE) {
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
- BIF_ThemeColor(TH_BONE_SOLID);
+
+ if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ else
+ BIF_ThemeColor(TH_BONE_SOLID);
draw_b_bone_boxes(OB_SOLID, pchan, xwidth, length, zwidth);
@@ -968,25 +1177,21 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
}
- else { // wire
- if (armflag & ARM_POSEMODE){
- if(constflag) {
- glEnable(GL_BLEND);
-
- if(constflag & PCHAN_HAS_STRIDE) glColor4ub(0, 0, 200, 80);
- else if(constflag & PCHAN_HAS_TARGET) glColor4ub(255, 150, 0, 80);
- else if(constflag & PCHAN_HAS_IK) glColor4ub(255, 255, 0, 80);
- else if(constflag & PCHAN_HAS_CONST) glColor4ub(0, 255, 120, 80);
- else BIF_ThemeColor4(TH_BONE_POSE); // PCHAN_HAS_ACTION
-
- draw_b_bone_boxes(OB_SOLID, pchan, xwidth, length, zwidth);
-
- glDisable(GL_BLEND);
+ else {
+ /* wire */
+ if (armflag & ARM_POSEMODE) {
+ if (constflag) {
+ /* set constraint colours */
+ if (set_pchan_glColor(PCHAN_COLOR_CONSTS, armflag, boneflag, constflag)) {
+ glEnable(GL_BLEND);
+
+ draw_b_bone_boxes(OB_SOLID, pchan, xwidth, length, zwidth);
+
+ glDisable(GL_BLEND);
+ }
/* restore colors */
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_WIRE);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
}
}
@@ -1003,7 +1208,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
glScalef(length, length, length);
/* set up solid drawing */
- if(dt > OB_WIRE) {
+ if (dt > OB_WIRE) {
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
BIF_ThemeColor(TH_BONE_SOLID);
@@ -1011,61 +1216,56 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
/* colors for posemode */
if (armflag & ARM_POSEMODE) {
- if(dt==OB_WIRE) {
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_WIRE);
- }
+ if (dt <= OB_WIRE)
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
else
- BIF_ThemeColor(TH_BONE_SOLID);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
}
draw_bone_points(dt, armflag, boneflag, id);
/* now draw the bone itself */
-
if (id != -1) {
- glLoadName ((GLuint) id|BONESEL_BONE);
+ glLoadName((GLuint) id|BONESEL_BONE);
}
/* wire? */
- if(dt <= OB_WIRE) {
+ if (dt <= OB_WIRE) {
/* colors */
if (armflag & ARM_EDITMODE) {
if (boneflag & BONE_ACTIVE) BIF_ThemeColor(TH_EDGE_SELECT);
else if (boneflag & BONE_SELECTED) BIF_ThemeColorShade(TH_EDGE_SELECT, -20);
else BIF_ThemeColor(TH_WIRE);
}
- else if (armflag & ARM_POSEMODE){
- if(constflag) {
- glEnable(GL_BLEND);
-
- if(constflag & PCHAN_HAS_STRIDE) glColor4ub(0, 0, 200, 80);
- else if(constflag & PCHAN_HAS_TARGET) glColor4ub(255, 150, 0, 80);
- else if(constflag & PCHAN_HAS_IK) glColor4ub(255, 255, 0, 80);
- else if(constflag & PCHAN_HAS_CONST) glColor4ub(0, 255, 120, 80);
- else BIF_ThemeColor4(TH_BONE_POSE); // PCHAN_HAS_ACTION
+ else if (armflag & ARM_POSEMODE) {
+ if (constflag) {
+ /* draw constraint colors */
+ if (set_pchan_glColor(PCHAN_COLOR_CONSTS, armflag, boneflag, constflag)) {
+ glEnable(GL_BLEND);
- draw_bone_solid_octahedral();
- glDisable(GL_BLEND);
-
+ draw_bone_solid_octahedral();
+
+ glDisable(GL_BLEND);
+ }
+
/* restore colors */
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_WIRE);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
}
}
draw_bone_octahedral();
}
- else { /* solid */
-
- BIF_ThemeColor(TH_BONE_SOLID);
+ else {
+ /* solid */
+ if (armflag & ARM_POSEMODE)
+ set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ else
+ BIF_ThemeColor(TH_BONE_SOLID);
draw_bone_solid_octahedral();
}
/* disable solid drawing */
- if(dt>OB_WIRE) {
+ if (dt > OB_WIRE) {
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
}
@@ -1073,41 +1273,42 @@ 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) return;
glScalef(length, length, length);
/* colors for posemode */
if (armflag & ARM_POSEMODE) {
- if (boneflag & BONE_ACTIVE) BIF_ThemeColorShade(TH_BONE_POSE, 40);
- else if (boneflag & BONE_SELECTED) BIF_ThemeColor(TH_BONE_POSE);
- else BIF_ThemeColor(TH_WIRE);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, 0);
}
if (id != -1) {
- glLoadName ((GLuint) id|BONESEL_BONE);
+ glLoadName((GLuint) id|BONESEL_BONE);
}
draw_object_instance(ob, dt, armflag & ARM_POSEMODE);
}
-static void pchan_draw_IK_root_lines(bPoseChannel *pchan)
+static void pchan_draw_IK_root_lines(bPoseChannel *pchan, short only_temp)
{
bConstraint *con;
bPoseChannel *parchan;
- for(con= pchan->constraints.first; con; con= con->next) {
- if(con->type == CONSTRAINT_TYPE_KINEMATIC) {
+ for (con= pchan->constraints.first; con; con= con->next) {
+ if (con->type == CONSTRAINT_TYPE_KINEMATIC) {
bKinematicConstraint *data = (bKinematicConstraint*)con->data;
int segcount= 0;
+ /* if only_temp, only draw if it is a temporary ik-chain */
+ if ((only_temp) && !(data->flag & CONSTRAINT_IK_TEMP))
+ continue;
+
setlinestyle(3);
glBegin(GL_LINES);
/* exclude tip from chain? */
- if(!(data->flag & CONSTRAINT_IK_TIP))
+ if ((data->flag & CONSTRAINT_IK_TIP)==0)
parchan= pchan->parent;
else
parchan= pchan;
@@ -1115,12 +1316,12 @@ static void pchan_draw_IK_root_lines(bPoseChannel *pchan)
glVertex3fv(parchan->pose_tail);
/* Find the chain's root */
- while (parchan->parent){
+ while (parchan->parent) {
segcount++;
if(segcount==data->rootbone || segcount>255) break; // 255 is weak
parchan= parchan->parent;
}
- if(parchan)
+ if (parchan)
glVertex3fv(parchan->pose_head);
glEnd();
@@ -1198,7 +1399,7 @@ static void draw_dof_ellipse(float ax, float az)
glColor3ub(0, 0, 0);
glBegin(GL_LINE_STRIP);
- for(i=0; i<n; i++)
+ for (i=0; i<n; i++)
bgl_sphere_project(staticSine[n-i-1]*ax, staticSine[i]*az);
glEnd();
}
@@ -1209,40 +1410,41 @@ static void draw_pose_dofs(Object *ob)
bPoseChannel *pchan;
Bone *bone;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
- if(bone && !(bone->flag & BONE_HIDDEN_P)) {
- if(bone->flag & BONE_SELECTED) {
- if(bone->layer & arm->layer) {
- if(pchan->ikflag & (BONE_IK_XLIMIT|BONE_IK_ZLIMIT)) {
- if(pose_channel_in_IK_chain(ob, pchan)) {
+
+ if ( (bone) && !(bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG))) {
+ if (bone->flag & BONE_SELECTED) {
+ if (bone->layer & arm->layer) {
+ if (pchan->ikflag & (BONE_IK_XLIMIT|BONE_IK_ZLIMIT)) {
+ if (pose_channel_in_IK_chain(ob, pchan)) {
float corner[4][3], posetrans[3], mat[4][4];
float phi=0.0f, theta=0.0f, scale;
int a, i;
-
+
/* in parent-bone pose, but own restspace */
glPushMatrix();
-
+
VECCOPY(posetrans, pchan->pose_mat[3]);
glTranslatef(posetrans[0], posetrans[1], posetrans[2]);
-
- if(pchan->parent) {
+
+ if (pchan->parent) {
Mat4CpyMat4(mat, pchan->parent->pose_mat);
mat[3][0]= mat[3][1]= mat[3][2]= 0.0f;
glMultMatrixf(mat);
}
-
+
Mat4CpyMat3(mat, pchan->bone->bone_mat);
glMultMatrixf(mat);
-
+
scale= bone->length*pchan->size[1];
glScalef(scale, scale, scale);
-
- if(pchan->ikflag & BONE_IK_XLIMIT) {
- if(pchan->ikflag & BONE_IK_ZLIMIT) {
+
+ if (pchan->ikflag & BONE_IK_XLIMIT) {
+ if (pchan->ikflag & BONE_IK_ZLIMIT) {
float amin[3], amax[3];
-
- for(i=0; i<3; i++) {
+
+ for (i=0; i<3; i++) {
amin[i]= sin(pchan->limitmin[i]*M_PI/360.0);
amax[i]= sin(pchan->limitmax[i]*M_PI/360.0);
}
@@ -1261,49 +1463,50 @@ static void draw_pose_dofs(Object *ob)
}
/* arcs */
- if(pchan->ikflag & BONE_IK_ZLIMIT) {
+ if (pchan->ikflag & BONE_IK_ZLIMIT) {
theta= 0.5*(pchan->limitmin[2]+pchan->limitmax[2]);
glRotatef(theta, 0.0f, 0.0f, 1.0f);
-
+
glColor3ub(50, 50, 255); // blue, Z axis limit
glBegin(GL_LINE_STRIP);
- for(a=-16; a<=16; a++) {
+ for (a=-16; a<=16; a++) {
float fac= ((float)a)/16.0f;
phi= fac*(M_PI/360.0f)*(pchan->limitmax[2]-pchan->limitmin[2]);
- if(a==-16) i= 0; else i= 1;
+ i= (a == -16) ? 0 : 1;
corner[i][0]= sin(phi);
corner[i][1]= cos(phi);
corner[i][2]= 0.0f;
glVertex3fv(corner[i]);
}
glEnd();
-
+
glRotatef(-theta, 0.0f, 0.0f, 1.0f);
}
-
- if(pchan->ikflag & BONE_IK_XLIMIT) {
- theta= 0.5*( pchan->limitmin[0]+pchan->limitmax[0]);
+
+ if (pchan->ikflag & BONE_IK_XLIMIT) {
+ theta= 0.5*(pchan->limitmin[0]+pchan->limitmax[0]);
glRotatef(theta, 1.0f, 0.0f, 0.0f);
-
+
glColor3ub(255, 50, 50); // Red, X axis limit
glBegin(GL_LINE_STRIP);
- for(a=-16; a<=16; a++) {
+ for (a=-16; a<=16; a++) {
float fac= ((float)a)/16.0f;
phi= 0.5f*M_PI + fac*(M_PI/360.0f)*(pchan->limitmax[0]-pchan->limitmin[0]);
-
- if(a==-16) i= 2; else i= 3;
+
+ i= (a == -16) ? 2 : 3;
corner[i][0]= 0.0f;
corner[i][1]= sin(phi);
corner[i][2]= cos(phi);
glVertex3fv(corner[i]);
}
glEnd();
-
+
glRotatef(-theta, 1.0f, 0.0f, 0.0f);
}
-
- glPopMatrix(); // out of cone, out of bone
+
+ /* out of cone, out of bone */
+ glPopMatrix();
}
}
}
@@ -1322,38 +1525,39 @@ static void draw_pose_channels(Base *base, int dt)
GLfloat tmp;
float smat[4][4], imat[4][4];
int index= -1;
- int do_dashed= 1;
+ int do_dashed= 3;
short flag, constflag;
/* hacky... prevent outline select from drawing dashed helplines */
glGetFloatv(GL_LINE_WIDTH, &tmp);
- if(tmp > 1.1) do_dashed= 0;
- if (G.vd->flag & V3D_HIDE_HELPLINES) do_dashed= 0;
+ if (tmp > 1.1) do_dashed &= ~1;
+ if (G.vd->flag & V3D_HIDE_HELPLINES) do_dashed &= ~2;
/* precalc inverse matrix for drawing screen aligned */
- if(arm->drawtype==ARM_ENVELOPE) {
+ if (arm->drawtype==ARM_ENVELOPE) {
/* precalc inverse matrix for drawing screen aligned */
mygetmatrix(smat);
Mat4MulFloat3(smat[0], 1.0f/VecLength(ob->obmat[0]));
Mat4Invert(imat, smat);
/* and draw blended distances */
- if(arm->flag & ARM_POSEMODE) {
+ if (arm->flag & ARM_POSEMODE) {
glEnable(GL_BLEND);
//glShadeModel(GL_SMOOTH);
- if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
- if(bone && !(bone->flag & (BONE_HIDDEN_P|BONE_NO_DEFORM))) {
- if(bone->flag & (BONE_SELECTED))
- if(bone->layer & arm->layer)
+ if (bone && !(bone->flag & (BONE_HIDDEN_P|BONE_NO_DEFORM|BONE_HIDDEN_PG))) {
+ if (bone->flag & (BONE_SELECTED)) {
+ if (bone->layer & arm->layer)
draw_sphere_bone_dist(smat, imat, bone->flag, pchan, NULL);
+ }
}
}
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
//glShadeModel(GL_FLAT);
}
@@ -1364,67 +1568,87 @@ static void draw_pose_channels(Base *base, int dt)
glEnable(GL_CULL_FACE);
/* if solid we draw that first, with selection codes, but without names, axes etc */
- if(dt>OB_WIRE) {
- if(arm->flag & ARM_POSEMODE) index= base->selcol;
+ if (dt > OB_WIRE) {
+ if (arm->flag & ARM_POSEMODE)
+ index= base->selcol;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
- if(bone && !(bone->flag & BONE_HIDDEN_P)) {
- if(bone->layer & arm->layer) {
+
+ if ( (bone) && !(bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG)) ) {
+ if (bone->layer & arm->layer) {
glPushMatrix();
glMultMatrixf(pchan->pose_mat);
/* catch exception for bone with hidden parent */
flag= bone->flag;
- if(bone->parent && (bone->parent->flag & BONE_HIDDEN_P))
+ if ( (bone->parent) && (bone->parent->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG)) )
flag &= ~BONE_CONNECTED;
+
+ /* set color-set to use */
+ set_pchan_colorset(ob, pchan);
- if(pchan->custom && !(arm->flag & ARM_NO_CUSTOM))
- draw_custom_bone(pchan->custom, OB_SOLID, arm->flag, flag, index, bone->length);
- else if(arm->drawtype==ARM_LINE)
+ if ((pchan->custom) && !(arm->flag & ARM_NO_CUSTOM)) {
+ /* BONE_DRAWWIRE case is here too, as sometimes wire overlay won't be done */
+ if (pchan->bone->flag & BONE_DRAWWIRE)
+ draw_custom_bone(pchan->custom, OB_WIRE, arm->flag, flag, index, bone->length);
+ else
+ draw_custom_bone(pchan->custom, OB_SOLID, arm->flag, flag, index, bone->length);
+ }
+ else if (arm->drawtype==ARM_LINE)
; /* nothing in solid */
- else if(arm->drawtype==ARM_ENVELOPE)
+ else if (arm->drawtype==ARM_ENVELOPE)
draw_sphere_bone(OB_SOLID, arm->flag, flag, 0, index, pchan, NULL);
- else if(arm->drawtype==ARM_B_BONE)
+ else if (arm->drawtype==ARM_B_BONE)
draw_b_bone(OB_SOLID, arm->flag, flag, 0, index, pchan, NULL);
- else {
+ else
draw_bone(OB_SOLID, arm->flag, flag, 0, index, bone->length);
- }
+
glPopMatrix();
}
}
- if (index!= -1) index+= 0x10000; // pose bones count in higher 2 bytes only
+
+ if (index!= -1)
+ index+= 0x10000; // pose bones count in higher 2 bytes only
}
- /* very very confusing... but in object mode, solid draw, we cannot do glLoadName yet, stick bones are dawn in next loop */
- if(arm->drawtype!=ARM_LINE) {
- glLoadName (index & 0xFFFF); // object tag, for bordersel optim
+
+ /* very very confusing... but in object mode, solid draw, we cannot do glLoadName yet, stick bones are drawn in next loop */
+ if (arm->drawtype != ARM_LINE) {
+ /* object tag, for bordersel optim */
+ glLoadName(index & 0xFFFF);
index= -1;
}
}
/* wire draw over solid only in posemode */
- if( dt<=OB_WIRE || (arm->flag & ARM_POSEMODE) || arm->drawtype==ARM_LINE) {
-
+ if ((dt <= OB_WIRE) || (arm->flag & ARM_POSEMODE) || (arm->drawtype==ARM_LINE)) {
/* draw line check first. we do selection indices */
if (arm->drawtype==ARM_LINE) {
- if (arm->flag & ARM_POSEMODE) index= base->selcol;
+ if (arm->flag & ARM_POSEMODE)
+ index= base->selcol;
}
/* if solid && posemode, we draw again with polygonoffset */
- else if (dt>OB_WIRE && (arm->flag & ARM_POSEMODE))
+ else if ((dt > OB_WIRE) && (arm->flag & ARM_POSEMODE)) {
bglPolygonOffset(1.0);
- else
+ }
+ else {
/* and we use selection indices if not done yet */
- if (arm->flag & ARM_POSEMODE) index= base->selcol;
+ if (arm->flag & ARM_POSEMODE)
+ index= base->selcol;
+ }
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
- if(bone && !(bone->flag & BONE_HIDDEN_P)) {
- if(bone->layer & arm->layer) {
- if (do_dashed && bone->parent) {
- /* Draw a line from our root to the parent's tip */
- if(!(bone->flag & BONE_CONNECTED) ){
+
+ if ((bone) && !(bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG))) {
+ if (bone->layer & arm->layer) {
+ if ((do_dashed & 1) && (bone->parent)) {
+ /* Draw a line from our root to the parent's tip
+ * - only if V3D_HIDE_HELPLINES is enabled...
+ */
+ if ( (do_dashed & 2) && ((bone->flag & BONE_CONNECTED)==0) ) {
if (arm->flag & ARM_POSEMODE) {
- glLoadName (index & 0xFFFF); // object tag, for bordersel optim
+ glLoadName(index & 0xFFFF); // object tag, for bordersel optim
BIF_ThemeColor(TH_WIRE);
}
setlinestyle(3);
@@ -1434,64 +1658,68 @@ static void draw_pose_channels(Base *base, int dt)
glEnd();
setlinestyle(0);
}
- // Draw a line to IK root bone
- if(arm->flag & ARM_POSEMODE) {
- if(pchan->constflag & PCHAN_HAS_IK) {
- if(bone->flag & BONE_SELECTED) {
-
- if(pchan->constflag & PCHAN_HAS_TARGET) glColor3ub(200, 120, 0);
+
+ /* Draw a line to IK root bone
+ * - only if temporary chain (i.e. "autoik")
+ */
+ if (arm->flag & ARM_POSEMODE) {
+ if (pchan->constflag & PCHAN_HAS_IK) {
+ if (bone->flag & BONE_SELECTED) {
+ if (pchan->constflag & PCHAN_HAS_TARGET) glColor3ub(200, 120, 0);
else glColor3ub(200, 200, 50); // add theme!
-
- glLoadName (index & 0xFFFF);
- pchan_draw_IK_root_lines(pchan);
+
+ glLoadName(index & 0xFFFF);
+ pchan_draw_IK_root_lines(pchan, !(do_dashed & 2));
}
}
}
}
- if(arm->drawtype!=ARM_ENVELOPE) {
- glPushMatrix();
+ glPushMatrix();
+ if (arm->drawtype != ARM_ENVELOPE)
glMultMatrixf(pchan->pose_mat);
- }
/* catch exception for bone with hidden parent */
flag= bone->flag;
- if(bone->parent && (bone->parent->flag & BONE_HIDDEN_P))
+ if ((bone->parent) && (bone->parent->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG)))
flag &= ~BONE_CONNECTED;
/* extra draw service for pose mode */
constflag= pchan->constflag;
- if(pchan->flag & (POSE_ROT|POSE_LOC|POSE_SIZE))
+ if (pchan->flag & (POSE_ROT|POSE_LOC|POSE_SIZE))
constflag |= PCHAN_HAS_ACTION;
- if(pchan->flag & POSE_STRIDE)
+ if (pchan->flag & POSE_STRIDE)
constflag |= PCHAN_HAS_STRIDE;
+
+ /* set color-set to use */
+ set_pchan_colorset(ob, pchan);
- if(pchan->custom && !(arm->flag & ARM_NO_CUSTOM)) {
- if(dt<OB_SOLID)
+ if ((pchan->custom) && !(arm->flag & ARM_NO_CUSTOM)) {
+ if ((dt < OB_SOLID) || (pchan->bone->flag & BONE_DRAWWIRE))
draw_custom_bone(pchan->custom, OB_WIRE, arm->flag, flag, index, bone->length);
}
- else if(arm->drawtype==ARM_ENVELOPE) {
- if(dt<OB_SOLID)
+ else if (arm->drawtype==ARM_ENVELOPE) {
+ if (dt < OB_SOLID)
draw_sphere_bone_wire(smat, imat, arm->flag, flag, constflag, index, pchan, NULL);
}
- else if(arm->drawtype==ARM_LINE)
+ else if (arm->drawtype==ARM_LINE)
draw_line_bone(arm->flag, flag, constflag, index, pchan, NULL);
- else if(arm->drawtype==ARM_B_BONE)
+ else if (arm->drawtype==ARM_B_BONE)
draw_b_bone(OB_WIRE, arm->flag, flag, constflag, index, pchan, NULL);
- else {
+ else
draw_bone(OB_WIRE, arm->flag, flag, constflag, index, bone->length);
- }
- if(arm->drawtype!=ARM_ENVELOPE)
- glPopMatrix();
+ glPopMatrix();
}
}
- if (index!= -1) index+= 0x10000; // pose bones count in higher 2 bytes only
+
+ /* pose bones count in higher 2 bytes only */
+ if (index != -1)
+ index+= 0x10000;
}
/* restore things */
- if (arm->drawtype!=ARM_LINE && dt>OB_WIRE && (arm->flag & ARM_POSEMODE))
+ if ((arm->drawtype!=ARM_LINE) && (dt>OB_WIRE) && (arm->flag & ARM_POSEMODE))
bglPolygonOffset(0.0);
-
}
/* restore */
@@ -1502,31 +1730,35 @@ static void draw_pose_channels(Base *base, int dt)
draw_pose_dofs(ob);
/* finally names and axes */
- if(arm->flag & (ARM_DRAWNAMES|ARM_DRAWAXES)) {
- // patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing
- if((G.f & G_PICKSEL) == 0) {
+ if (arm->flag & (ARM_DRAWNAMES|ARM_DRAWAXES)) {
+ /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
+ if ((G.f & G_PICKSEL) == 0) {
float vec[3];
- if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if((pchan->bone->flag & BONE_HIDDEN_P)==0) {
- if(pchan->bone->layer & arm->layer) {
+ for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ if ((pchan->bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG))==0) {
+ if (pchan->bone->layer & arm->layer) {
if (arm->flag & (ARM_EDITMODE|ARM_POSEMODE)) {
bone= pchan->bone;
- if(bone->flag & BONE_SELECTED) BIF_ThemeColor(TH_TEXT_HI);
+
+ if (bone->flag & BONE_SELECTED) BIF_ThemeColor(TH_TEXT_HI);
else BIF_ThemeColor(TH_TEXT);
}
- else if(dt > OB_WIRE) BIF_ThemeColor(TH_TEXT);
+ else if (dt > OB_WIRE)
+ BIF_ThemeColor(TH_TEXT);
- if (arm->flag & ARM_DRAWNAMES){
+ /* Draw names of bone */
+ if (arm->flag & ARM_DRAWNAMES) {
VecMidf(vec, pchan->pose_head, pchan->pose_tail);
glRasterPos3fv(vec);
BMF_DrawString(G.font, " ");
BMF_DrawString(G.font, pchan->name);
- }
- /* Draw additional axes */
- if( (arm->flag & ARM_DRAWAXES) && (arm->flag & ARM_POSEMODE) ){
+ }
+
+ /* Draw additional axes on the bone tail */
+ if ( (arm->flag & ARM_DRAWAXES) && (arm->flag & ARM_POSEMODE) ) {
glPushMatrix();
glMultMatrixf(pchan->pose_mat);
glTranslatef(0.0f, pchan->bone->length, 0.0f);
@@ -1537,10 +1769,9 @@ static void draw_pose_channels(Base *base, int dt)
}
}
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
}
}
-
}
/* in editmode, we don't store the bone matrix... */
@@ -1549,10 +1780,10 @@ static void set_matrix_editbone(EditBone *eBone)
float delta[3],offset[3];
float mat[3][3], bmat[4][4];
- /* Compose the parent transforms (i.e. their translations) */
- VECCOPY (offset, eBone->head);
+ /* Compose the parent transforms (i.e. their translations) */
+ VECCOPY(offset, eBone->head);
- glTranslatef (offset[0],offset[1],offset[2]);
+ glTranslatef(offset[0],offset[1],offset[2]);
VecSubf(delta, eBone->tail, eBone->head);
@@ -1560,8 +1791,8 @@ static void set_matrix_editbone(EditBone *eBone)
vec_roll_to_mat3(delta, eBone->roll, mat);
Mat4CpyMat3(bmat, mat);
-
- glMultMatrixf (bmat);
+
+ glMultMatrixf(bmat);
}
@@ -1584,35 +1815,37 @@ static void draw_ebones(Object *ob, int dt)
glEnable(GL_BLEND);
//glShadeModel(GL_SMOOTH);
- if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
- for (eBone=G.edbo.first, index=0; eBone; eBone=eBone->next, index++){
- if(eBone->layer & arm->layer)
- if(!(eBone->flag & (BONE_HIDDEN_A|BONE_NO_DEFORM)))
- if(eBone->flag & (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL))
+ for (eBone=G.edbo.first, index=0; eBone; eBone=eBone->next, index++) {
+ if (eBone->layer & arm->layer) {
+ if ((eBone->flag & (BONE_HIDDEN_A|BONE_NO_DEFORM))==0) {
+ if (eBone->flag & (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL))
draw_sphere_bone_dist(smat, imat, eBone->flag, NULL, eBone);
+ }
+ }
}
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
//glShadeModel(GL_FLAT);
}
/* if solid we draw it first */
- if(dt>OB_WIRE && arm->drawtype!=ARM_LINE) {
+ if ((dt > OB_WIRE) && (arm->drawtype!=ARM_LINE)) {
index= 0;
- for (eBone=G.edbo.first, index=0; eBone; eBone=eBone->next, index++){
- if(eBone->layer & arm->layer) {
- if(!(eBone->flag & BONE_HIDDEN_A)) {
+ for (eBone=G.edbo.first, index=0; eBone; eBone=eBone->next, index++) {
+ if (eBone->layer & arm->layer) {
+ if ((eBone->flag & BONE_HIDDEN_A)==0) {
glPushMatrix();
set_matrix_editbone(eBone);
/* catch exception for bone with hidden parent */
flag= eBone->flag;
- if(eBone->parent && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
+ if ( (eBone->parent) && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
flag &= ~BONE_CONNECTED;
- if(arm->drawtype==ARM_ENVELOPE)
+ if (arm->drawtype==ARM_ENVELOPE)
draw_sphere_bone(OB_SOLID, arm->flag, flag, 0, index, NULL, eBone);
else if(arm->drawtype==ARM_B_BONE)
draw_b_bone(OB_SOLID, arm->flag, flag, 0, index, NULL, eBone);
@@ -1629,42 +1862,42 @@ static void draw_ebones(Object *ob, int dt)
/* if wire over solid, set offset */
index= -1;
glLoadName(-1);
- if(arm->drawtype==ARM_LINE) {
+ if (arm->drawtype==ARM_LINE) {
if(G.f & G_PICKSEL)
index= 0;
}
- else if (dt>OB_WIRE)
+ else if (dt > OB_WIRE)
bglPolygonOffset(1.0);
- else if(arm->flag & ARM_EDITMODE)
- index= 0; // do selection codes
+ else if (arm->flag & ARM_EDITMODE)
+ index= 0; /* do selection codes */
- for (eBone=G.edbo.first; eBone; eBone=eBone->next){
- if(eBone->layer & arm->layer) {
- if(!(eBone->flag & BONE_HIDDEN_A)) {
+ for (eBone=G.edbo.first; eBone; eBone=eBone->next) {
+ if (eBone->layer & arm->layer) {
+ if ((eBone->flag & BONE_HIDDEN_A)==0) {
/* catch exception for bone with hidden parent */
flag= eBone->flag;
- if(eBone->parent && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
+ if ( (eBone->parent) && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
flag &= ~BONE_CONNECTED;
- if(arm->drawtype==ARM_ENVELOPE) {
- if(dt<OB_SOLID)
+ if (arm->drawtype == ARM_ENVELOPE) {
+ if (dt < OB_SOLID)
draw_sphere_bone_wire(smat, imat, arm->flag, flag, 0, index, NULL, eBone);
}
else {
glPushMatrix();
set_matrix_editbone(eBone);
- if(arm->drawtype==ARM_LINE)
+ if (arm->drawtype == ARM_LINE)
draw_line_bone(arm->flag, flag, 0, index, NULL, eBone);
- else if(arm->drawtype==ARM_B_BONE)
+ else if (arm->drawtype == ARM_B_BONE)
draw_b_bone(OB_WIRE, arm->flag, flag, 0, index, NULL, eBone);
else
draw_bone(OB_WIRE, arm->flag, flag, 0, index, eBone->length);
-
+
glPopMatrix();
}
-
+
/* offset to parent */
if (eBone->parent) {
BIF_ThemeColor(TH_WIRE);
@@ -1684,33 +1917,33 @@ static void draw_ebones(Object *ob, int dt)
}
/* restore */
- if(arm->drawtype==ARM_LINE);
+ if (arm->drawtype==ARM_LINE);
else if (dt>OB_WIRE) bglPolygonOffset(0.0);
/* finally names and axes */
- if(arm->flag & (ARM_DRAWNAMES|ARM_DRAWAXES)) {
+ if (arm->flag & (ARM_DRAWNAMES|ARM_DRAWAXES)) {
// patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing
- if((G.f & G_PICKSEL) == 0) {
+ if ((G.f & G_PICKSEL) == 0) {
float vec[3];
- if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
- for (eBone=G.edbo.first, index=0; eBone; eBone=eBone->next, index++){
+ for (eBone=G.edbo.first, index=0; eBone; eBone=eBone->next, index++) {
if(eBone->layer & arm->layer) {
- if(!(eBone->flag & BONE_HIDDEN_A)) {
+ if ((eBone->flag & BONE_HIDDEN_A)==0) {
- if(eBone->flag & BONE_SELECTED) BIF_ThemeColor(TH_TEXT_HI);
+ if (eBone->flag & BONE_SELECTED) BIF_ThemeColor(TH_TEXT_HI);
else BIF_ThemeColor(TH_TEXT);
/* Draw name */
- if(arm->flag & ARM_DRAWNAMES){
+ if (arm->flag & ARM_DRAWNAMES) {
VecMidf(vec, eBone->head, eBone->tail);
glRasterPos3fv(vec);
BMF_DrawString(G.font, " ");
BMF_DrawString(G.font, eBone->name);
}
/* Draw additional axes */
- if(arm->flag & ARM_DRAWAXES){
+ if (arm->flag & ARM_DRAWAXES) {
glPushMatrix();
set_matrix_editbone(eBone);
glTranslatef(0.0f, eBone->length, 0.0f);
@@ -1722,25 +1955,31 @@ static void draw_ebones(Object *ob, int dt)
}
}
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
}
}
}
-/* in view space */
+/* ****************************** Armature Visualisation ******************************** */
+
+/* ---------- Paths --------- */
+
+/* draw bone paths
+ * - in view space
+ */
static void draw_pose_paths(Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
bAction *act;
bActionChannel *achan;
- CfraElem *ce;
- ListBase ak;
- float *fp;
- int a;
- int stepsize, sfra;
+ ActKeyColumn *ak;
+ ListBase keys;
+ float *fp, *fp_start;
+ int a, stepsize;
+ int sfra, efra, len;
- if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
glPushMatrix();
glLoadMatrixf(G.vd->viewmat);
@@ -1749,22 +1988,94 @@ 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;
}
- sfra= pchan->pathsf;
+
+ /* get frame ranges */
+ if (arm->pathflag & ARM_PATH_ACFRA) {
+ int sind;
+
+ /* With "Around Current", we only choose frames from around
+ * the current frame to draw. However, this range is still
+ * restricted by the limits of the original path.
+ */
+ sfra= CFRA - arm->pathbc;
+ efra= CFRA + arm->pathac;
+ if (sfra < pchan->pathsf) sfra= pchan->pathsf;
+ if (efra > pchan->pathef) efra= pchan->pathef;
+
+ len= efra - sfra;
+
+ sind= sfra - pchan->pathsf;
+ fp_start= (pchan->path + (3*sind));
+ }
+ else {
+ sfra= pchan->pathsf;
+ efra = sfra + pchan->pathlen;
+ len = pchan->pathlen;
+ fp_start = pchan->path;
+ }
/* 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)
+ glShadeModel(GL_SMOOTH);
+
+ glBegin(GL_LINE_STRIP);
+ for (a=0, fp=fp_start; a<len; a++, fp+=3) {
+ float intensity; /* how faint */
+
+ /* set colour
+ * - more intense for active/selected bones, less intense for unselected bones
+ * - black for before current frame, green for current frame, blue for after current frame
+ * - intensity decreases as distance from current frame increases
+ */
+ #define SET_INTENSITY(A, B, C, min, max) (((1.0f - ((C - B) / (C - A))) * (max-min)) + min)
+ if ((a+sfra) < CFRA) {
+ /* black - before cfra */
+ if (pchan->bone->flag & BONE_SELECTED) {
+ // intensity= 0.5;
+ intensity = SET_INTENSITY(sfra, a, CFRA, 0.25f, 0.75f);
+ }
+ else {
+ //intensity= 0.8;
+ intensity = SET_INTENSITY(sfra, a, CFRA, 0.68f, 0.92f);
+ }
+ BIF_ThemeColorBlend(TH_WIRE, TH_BACK, intensity);
+ }
+ else if ((a+sfra) > CFRA) {
+ /* blue - after cfra */
+ if (pchan->bone->flag & BONE_SELECTED) {
+ //intensity = 0.5;
+ intensity = SET_INTENSITY(CFRA, a, efra, 0.25f, 0.75f);
+ }
+ else {
+ //intensity = 0.8;
+ intensity = SET_INTENSITY(CFRA, a, efra, 0.68f, 0.92f);
+ }
+ BIF_ThemeColorBlend(TH_BONE_POSE, TH_BACK, intensity);
+ }
+ else {
+ /* green - on cfra */
+ if (pchan->bone->flag & BONE_SELECTED) {
+ intensity= 0.5;
+ }
+ else {
+ intensity= 0.99;
+ }
+ BIF_ThemeColorBlendShade(TH_CFRAME, TH_BACK, intensity, 10);
+ }
+
+ /* draw a vertex with this colour */
glVertex3fv(fp);
+ }
+
glEnd();
+ glShadeModel(GL_FLAT);
glPointSize(1.0);
@@ -1772,29 +2083,29 @@ static void draw_pose_paths(Object *ob)
* NOTE: this is not really visible/noticable
*/
glBegin(GL_POINTS);
- for(a=0, fp= pchan->path; a<pchan->pathlen; a++, fp+=3)
+ for (a=0, fp=fp_start; a<len; a++, fp+=3)
glVertex3fv(fp);
glEnd();
/* 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=fp_start; a<len; a+=stepsize, fp+=(stepsize*3))
glVertex3fv(fp);
glEnd();
/* Draw frame numbers at each framestep value */
if (arm->pathflag & ARM_PATH_FNUMS) {
- for(a=0, fp= pchan->path; a<pchan->pathlen; a+=stepsize, fp+=(stepsize*3)) {
+ for (a=0, fp=fp_start; a<len; 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));
BMF_DrawString(G.font, str);
}
- else if ((a > stepsize) && (a < pchan->pathlen-stepsize)) {
+ else if ((a > stepsize) && (a < len-stepsize)) {
if ((VecEqual(fp, fp-(stepsize*3))==0) || (VecEqual(fp, fp+(stepsize*3))==0)) {
glRasterPos3fv(fp);
sprintf(str, " %d\n", (a+sfra));
@@ -1807,30 +2118,34 @@ static void draw_pose_paths(Object *ob)
/* Keyframes - dots and numbers */
if (arm->pathflag & ARM_PATH_KFRAS) {
/* build list of all keyframes in active action for pchan */
- ak.first = ak.last = NULL;
+ keys.first = keys.last = NULL;
act= ob_get_action(ob);
if (act) {
achan= get_action_channel(act, pchan->name);
if (achan)
- ipo_to_keylist(achan->ipo, &ak, NULL);
+ ipo_to_keylist(achan->ipo, &keys, NULL, NULL);
}
- /* Draw little yellow dots at each keyframe */
+ /* Draw slightly-larger yellow dots at each keyframe */
BIF_ThemeColor(TH_VERTEX_SELECT);
+ glPointSize(5.0);
+
glBegin(GL_POINTS);
- for(a=0, fp= pchan->path; a<pchan->pathlen; a++, fp+=3) {
- for (ce= ak.first; ce; ce= ce->next) {
- if (ce->cfra == (a+sfra))
+ for (a=0, fp=fp_start; a<len; a++, fp+=3) {
+ for (ak= keys.first; ak; ak= ak->next) {
+ if (ak->cfra == (a+sfra))
glVertex3fv(fp);
}
}
glEnd();
+ glPointSize(1.0);
+
/* Draw frame numbers of keyframes */
- if (arm->pathflag & ARM_PATH_FNUMS) {
- for(a=0, fp= pchan->path; a<pchan->pathlen; a++, fp+=3) {
- for (ce= ak.first; ce; ce= ce->next) {
- if (ce->cfra == (a+sfra)) {
+ if ((arm->pathflag & ARM_PATH_FNUMS) || (arm->pathflag & ARM_PATH_KFNOS)) {
+ for(a=0, fp=fp_start; a<len; a++, fp+=3) {
+ for (ak= keys.first; ak; ak= ak->next) {
+ if (ak->cfra == (a+sfra)) {
char str[32];
glRasterPos3fv(fp);
@@ -1841,18 +2156,51 @@ static void draw_pose_paths(Object *ob)
}
}
- BLI_freelistN(&ak);
+ BLI_freelistN(&keys);
}
}
}
}
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
glPopMatrix();
}
+
+/* ---------- Ghosts --------- */
+
+/* helper function for ghost drawing - sets/removes flags for temporarily
+ * hiding unselected bones while drawing ghosts
+ */
+static void ghost_poses_tag_unselected(Object *ob, short unset)
+{
+ bArmature *arm= ob->data;
+ bPose *pose= ob->pose;
+ bPoseChannel *pchan;
+
+ /* don't do anything if no hiding any bones */
+ if ((arm->flag & ARM_GHOST_ONLYSEL)==0)
+ return;
+
+ /* loop over all pchans, adding/removing tags as appropriate */
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
+ if (unset) {
+ /* remove tags from all pchans if cleaning up */
+ pchan->bone->flag &= ~BONE_HIDDEN_PG;
+ }
+ else {
+ /* set tags on unselected pchans only */
+ if ((pchan->bone->flag & BONE_SELECTED)==0)
+ pchan->bone->flag |= BONE_HIDDEN_PG;
+ }
+ }
+ }
+}
+
/* draw ghosts that occur within a frame range
- * note: object should be in posemode */
+ * note: object should be in posemode
+ */
static void draw_ghost_poses_range(Base *base)
{
Object *ob= base->object;
@@ -1863,7 +2211,7 @@ static void draw_ghost_poses_range(Base *base)
start = arm->ghostsf;
end = arm->ghostef;
- if (end<=start)
+ if (end <= start)
return;
stepsize= (float)(arm->ghostsize);
@@ -1882,12 +2230,13 @@ static void draw_ghost_poses_range(Base *base)
copy_pose(&posen, ob->pose, 1);
ob->pose= posen;
armature_rebuild_pose(ob, ob->data); /* child pointers for IK */
+ ghost_poses_tag_unselected(ob, 0); /* hide unselected bones if need be */
glEnable(GL_BLEND);
- if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
/* draw from first frame of range to last */
- for(CFRA= start; CFRA<end; CFRA+=stepsize) {
+ for (CFRA= start; CFRA<end; CFRA+=stepsize) {
colfac = (end-CFRA)/range;
BIF_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0f*sqrt(colfac)));
@@ -1896,10 +2245,10 @@ static void draw_ghost_poses_range(Base *base)
draw_pose_channels(base, OB_WIRE);
}
glDisable(GL_BLEND);
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
- free_pose_channels(posen);
- MEM_freeN(posen);
+ ghost_poses_tag_unselected(ob, 1); /* unhide unselected bones if need be */
+ free_pose(posen);
/* restore */
CFRA= cfrao;
@@ -1908,10 +2257,89 @@ static void draw_ghost_poses_range(Base *base)
armature_rebuild_pose(ob, ob->data);
ob->flag |= OB_POSEMODE;
ob->ipoflag= ipoflago;
+}
+/* draw ghosts on keyframes in action within range
+ * - object should be in posemode
+ */
+static void draw_ghost_poses_keys(Base *base)
+{
+ Object *ob= base->object;
+ bAction *act= ob_get_action(ob);
+ bArmature *arm= ob->data;
+ bPose *posen, *poseo;
+ ListBase keys= {NULL, NULL};
+ ActKeysInc aki = {0, 0, 0};
+ ActKeyColumn *ak, *akn;
+ float start, end, range, colfac, i;
+ int cfrao, flago, ipoflago;
+
+ aki.start= start = arm->ghostsf;
+ aki.end= end = arm->ghostef;
+ if (end <= start)
+ return;
+
+ /* get keyframes - then clip to only within range */
+ action_to_keylist(act, &keys, NULL, &aki);
+ range= 0;
+ for (ak= keys.first; ak; ak= akn) {
+ akn= ak->next;
+
+ if ((ak->cfra < start) || (ak->cfra > end))
+ BLI_freelinkN(&keys, ak);
+ else
+ range++;
+ }
+ if (range == 0) return;
+
+ /* store values */
+ ob->flag &= ~OB_POSEMODE;
+ cfrao= CFRA;
+ flago= arm->flag;
+ arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
+ ipoflago= ob->ipoflag;
+ ob->ipoflag |= OB_DISABLE_PATH;
+
+ /* copy the pose */
+ poseo= ob->pose;
+ copy_pose(&posen, ob->pose, 1);
+ ob->pose= posen;
+ armature_rebuild_pose(ob, ob->data); /* child pointers for IK */
+ ghost_poses_tag_unselected(ob, 0); /* hide unselected bones if need be */
+
+ glEnable(GL_BLEND);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+
+ /* draw from first frame of range to last */
+ for (ak=keys.first, i=0; ak; ak=ak->next, i++) {
+ colfac = i/range;
+ BIF_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0f*sqrt(colfac)));
+
+ CFRA= (int)ak->cfra;
+
+ do_all_pose_actions(ob);
+ where_is_pose(ob);
+ draw_pose_channels(base, OB_WIRE);
+ }
+ glDisable(GL_BLEND);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+
+ ghost_poses_tag_unselected(ob, 1); /* unhide unselected bones if need be */
+ BLI_freelistN(&keys);
+ free_pose(posen);
+
+ /* restore */
+ CFRA= cfrao;
+ ob->pose= poseo;
+ arm->flag= flago;
+ armature_rebuild_pose(ob, ob->data);
+ ob->flag |= OB_POSEMODE;
+ ob->ipoflag= ipoflago;
}
-/* object is supposed to be armature in posemode */
+/* draw ghosts around current frame
+ * - object is supposed to be armature in posemode
+ */
static void draw_ghost_poses(Base *base)
{
Object *ob= base->object;
@@ -1922,11 +2350,11 @@ static void draw_ghost_poses(Base *base)
int cfrao, maptime, flago, ipoflago;
/* pre conditions, get an action with sufficient frames */
- if(ob->action==NULL)
+ if (ob->action==NULL)
return;
calc_action_range(ob->action, &start, &end, 0);
- if(start==end)
+ if (start == end)
return;
stepsize= (float)(arm->ghostsize);
@@ -1934,7 +2362,7 @@ static void draw_ghost_poses(Base *base)
/* we only map time for armature when an active strip exists */
for (strip=ob->nlastrips.first; strip; strip=strip->next)
- if(strip->flag & ACTSTRIP_ACTIVE)
+ if (strip->flag & ACTSTRIP_ACTIVE)
break;
maptime= (strip!=NULL);
@@ -1942,7 +2370,7 @@ static void draw_ghost_poses(Base *base)
/* store values */
ob->flag &= ~OB_POSEMODE;
cfrao= CFRA;
- if(maptime) actframe= get_action_frame(ob, (float)CFRA);
+ if (maptime) actframe= get_action_frame(ob, (float)CFRA);
else actframe= CFRA;
flago= arm->flag;
arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
@@ -1954,24 +2382,23 @@ static void draw_ghost_poses(Base *base)
copy_pose(&posen, ob->pose, 1);
ob->pose= posen;
armature_rebuild_pose(ob, ob->data); /* child pointers for IK */
+ ghost_poses_tag_unselected(ob, 0); /* hide unselected bones if need be */
glEnable(GL_BLEND);
- if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glDisable(GL_DEPTH_TEST);
/* draw from darkest blend to lowest */
for(cur= stepsize; cur<range; cur+=stepsize) {
-
ctime= cur - fmod((float)cfrao, stepsize); /* ensures consistant stepping */
colfac= ctime/range;
BIF_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0f*sqrt(colfac)));
/* only within action range */
- if(actframe+ctime >= start && actframe+ctime <= end) {
-
- if(maptime) CFRA= (int)get_action_frame_inv(ob, actframe+ctime);
+ if (actframe+ctime >= start && actframe+ctime <= end) {
+ if (maptime) CFRA= (int)get_action_frame_inv(ob, actframe+ctime);
else CFRA= (int)floor(actframe+ctime);
- if(CFRA!=cfrao) {
+ if (CFRA!=cfrao) {
do_all_pose_actions(ob);
where_is_pose(ob);
draw_pose_channels(base, OB_WIRE);
@@ -1983,12 +2410,11 @@ static void draw_ghost_poses(Base *base)
BIF_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0f*sqrt(colfac)));
/* only within action range */
- if(actframe-ctime >= start && actframe-ctime <= end) {
-
- if(maptime) CFRA= (int)get_action_frame_inv(ob, actframe-ctime);
+ if ((actframe-ctime >= start) && (actframe-ctime <= end)) {
+ if (maptime) CFRA= (int)get_action_frame_inv(ob, actframe-ctime);
else CFRA= (int)floor(actframe-ctime);
-
- if(CFRA!=cfrao) {
+
+ if (CFRA != cfrao) {
do_all_pose_actions(ob);
where_is_pose(ob);
draw_pose_channels(base, OB_WIRE);
@@ -1996,10 +2422,10 @@ static void draw_ghost_poses(Base *base)
}
}
glDisable(GL_BLEND);
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (G.vd->zbuf) glEnable(GL_DEPTH_TEST);
- free_pose_channels(posen);
- MEM_freeN(posen);
+ ghost_poses_tag_unselected(ob, 1); /* unhide unselected bones if need be */
+ free_pose(posen);
/* restore */
CFRA= cfrao;
@@ -2008,9 +2434,10 @@ static void draw_ghost_poses(Base *base)
armature_rebuild_pose(ob, ob->data);
ob->flag |= OB_POSEMODE;
ob->ipoflag= ipoflago;
-
}
+/* ********************************** Armature Drawing - Main ************************* */
+
/* called from drawobject.c, return 1 if nothing was drawn */
int draw_armature(Base *base, int dt)
{
@@ -2046,10 +2473,13 @@ int draw_armature(Base *base, int dt)
arm->flag |= ARM_POSEMODE;
}
else if(ob->flag & OB_POSEMODE) {
- if (arm->ghosttype == ARM_GHOST_RANGE){
+ if (arm->ghosttype == ARM_GHOST_RANGE) {
draw_ghost_poses_range(base);
}
- else {
+ else if (arm->ghosttype == ARM_GHOST_KEYS) {
+ draw_ghost_poses_keys(base);
+ }
+ else if (arm->ghosttype == ARM_GHOST_CUR) {
if (arm->ghostep)
draw_ghost_poses(base);
}
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index c9d6b8a649b..65ee3077adb 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -96,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"
@@ -243,31 +244,33 @@ void calc_image_view(SpaceImage *sima, char mode)
void what_image(SpaceImage *sima)
{
MTFace *activetf;
-
+
if( (sima->mode!=SI_TEXTURE) ||
(sima->image && sima->image->source==IMA_SRC_VIEWER) ||
- (G.obedit != OBACT)
+ (G.obedit != OBACT) ||
+ (sima->pin)
) {
return;
}
- /* viewer overrides faceselect */
- if (!sima->pin)
+ /* viewer overrides uv editmode */
+ if (EM_texFaceCheck()) {
sima->image= NULL;
-
- activetf = get_active_mtface(NULL, NULL, 1); /* partially selected face is ok */
-
- if(activetf && activetf->mode & TF_TEX) {
- if (!sima->pin)
- sima->image= activetf->tpage;
- if(sima->flag & SI_EDITTILE);
- else sima->curtile= activetf->tile;
+ activetf = get_active_mtface(NULL, NULL, 1); /* partially selected face is ok */
- if(sima->image) {
- if(activetf->mode & TF_TILES)
- sima->image->tpageflag |= IMA_TILES;
- else sima->image->tpageflag &= ~IMA_TILES;
+ if(activetf && activetf->mode & TF_TEX) {
+ if (!sima->pin)
+ 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;
+ }
}
}
}
@@ -293,40 +296,71 @@ void image_changed(SpaceImage *sima, Image *image)
MTFace *tface;
EditMesh *em = G.editMesh;
EditFace *efa;
-
- if(image==NULL)
+ 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 || !EM_texFaceCheck())
+ if(sima->mode!=SI_TEXTURE)
return;
-
+
/* skip assigning these procedural images... */
- if(image && (image->type==IMA_TYPE_R_RESULT || image->type==IMA_TYPE_COMPOSITE))
+ if(image && (image->type==IMA_TYPE_R_RESULT || 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 (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);
- } else {
- tface->tpage= NULL;
- tface->mode &= ~TF_TEX;
+ } else if ((G.obedit) &&
+ (G.obedit->type == OB_MESH) &&
+ (G.editMesh) &&
+ (G.editMesh->faces.first)
+ ) {
+
+ /* 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 */
+
+ /* 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;
}
}
}
- /* change the space image after because SIMA_FACEDRAW_CHECK uses the space image
+ /* 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;
- object_uvs_changed(OBACT);
+ if (change)
+ object_uvs_changed(OBACT);
+
allqueue(REDRAWBUTSEDIT, 0);
}
/*
@@ -406,7 +440,7 @@ static void drawcursor_sima(float xuser_asp, float yuser_asp)
int wi, hi;
float w, h;
- if (!G.obedit) return;
+ 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;
@@ -512,7 +546,7 @@ void draw_uvs_sima(void)
) {
/* we can use the existing final mesh */
glColor3ub(112, 112, 112);
- G.editMesh->derivedFinal->drawUVEdges(G.editMesh->derivedFinal);
+ em->derivedFinal->drawUVEdges(em->derivedFinal);
} else {
DerivedMesh *finalDM, *cageDM;
@@ -547,10 +581,10 @@ void draw_uvs_sima(void)
for (efa= em->faces.first; efa; efa= efa->next) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ if (simaFaceDraw_Check(efa, tface)) {
efa->tmp.p = tface;
if (tface==activetface) continue; /* important the temp pointer is set above */
- if( SIMA_FACESEL_CHECK(efa, tface) )
+ if( simaFaceSel_Check(efa, tface) )
glColor4ubv((GLubyte *)col2);
else
glColor4ubv((GLubyte *)col1);
@@ -572,7 +606,7 @@ void draw_uvs_sima(void)
/* 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 (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ if (simaFaceDraw_Check(efa, tface)) {
efa->tmp.p = tface;
} else {
if (tface == activetface)
@@ -611,7 +645,7 @@ void draw_uvs_sima(void)
case SI_UVDT_DASH:
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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)) {
@@ -651,7 +685,7 @@ void draw_uvs_sima(void)
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 (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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)) {
@@ -671,7 +705,7 @@ void draw_uvs_sima(void)
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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)) {
@@ -689,7 +723,7 @@ void draw_uvs_sima(void)
cpack(0xFFFFFF);
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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)) {
@@ -725,11 +759,11 @@ void draw_uvs_sima(void)
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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( ! SIMA_FACESEL_CHECK(efa, tface) ) {
+ if( ! simaFaceSel_Check(efa, tface) ) {
tface_center(tface, cent, (void *)efa->v4);
bglVertex2fv(cent);
}
@@ -742,11 +776,11 @@ void draw_uvs_sima(void)
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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( SIMA_FACESEL_CHECK(efa, tface) ) {
+ if( simaFaceSel_Check(efa, tface) ) {
tface_center(tface, cent, (void *)efa->v4);
bglVertex2fv(cent);
}
@@ -765,16 +799,16 @@ void draw_uvs_sima(void)
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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(SIMA_UVSEL_CHECK(efa, tface, 0)); else bglVertex2fv(tface->uv[0]);
- if(SIMA_UVSEL_CHECK(efa, tface, 1)); else bglVertex2fv(tface->uv[1]);
- if(SIMA_UVSEL_CHECK(efa, tface, 2)); else bglVertex2fv(tface->uv[2]);
+ 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(SIMA_UVSEL_CHECK(efa, tface, 3)); else bglVertex2fv(tface->uv[3]);
+ if(simaUVSel_Check(efa, tface, 3)); else bglVertex2fv(tface->uv[3]);
}
}
}
@@ -788,7 +822,7 @@ void draw_uvs_sima(void)
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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)) {
@@ -810,16 +844,16 @@ void draw_uvs_sima(void)
bglBegin(GL_POINTS);
for (efa= em->faces.first; efa; efa= efa->next) {
// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-// if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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(!SIMA_UVSEL_CHECK(efa, tface, 0)); else bglVertex2fv(tface->uv[0]);
- if(!SIMA_UVSEL_CHECK(efa, tface, 1)); else bglVertex2fv(tface->uv[1]);
- if(!SIMA_UVSEL_CHECK(efa, tface, 2)); else bglVertex2fv(tface->uv[2]);
+ 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(!SIMA_UVSEL_CHECK(efa, tface, 3)); else bglVertex2fv(tface->uv[3]);
+ if(!simaUVSel_Check(efa, tface, 3)); else bglVertex2fv(tface->uv[3]);
}
}
}
@@ -972,24 +1006,24 @@ void image_editvertex_buts(uiBlock *block)
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
+ if (simaFaceDraw_Check(efa, tf)) {
- if (SIMA_UVSEL_CHECK(efa, tf, 0)) {
+ if (simaUVSel_Check(efa, tf, 0)) {
cent[0]+= tf->uv[0][0];
cent[1]+= tf->uv[0][1];
nactive++;
}
- if (SIMA_UVSEL_CHECK(efa, tf, 1)) {
+ if (simaUVSel_Check(efa, tf, 1)) {
cent[0]+= tf->uv[1][0];
cent[1]+= tf->uv[1][1];
nactive++;
}
- if (SIMA_UVSEL_CHECK(efa, tf, 2)) {
+ if (simaUVSel_Check(efa, tf, 2)) {
cent[0]+= tf->uv[2][0];
cent[1]+= tf->uv[2][1];
nactive++;
}
- if (efa->v4 && SIMA_UVSEL_CHECK(efa, tf, 3)) {
+ if (efa->v4 && simaUVSel_Check(efa, tf, 3)) {
cent[0]+= tf->uv[3][0];
cent[1]+= tf->uv[3][1];
nactive++;
@@ -1036,20 +1070,20 @@ void image_editvertex_buts(uiBlock *block)
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
- if (SIMA_UVSEL_CHECK(efa, tf, 0)) {
+ if (simaFaceDraw_Check(efa, tf)) {
+ if (simaUVSel_Check(efa, tf, 0)) {
tf->uv[0][0]+= delta[0];
tf->uv[0][1]+= delta[1];
}
- if (SIMA_UVSEL_CHECK(efa, tf, 1)) {
+ if (simaUVSel_Check(efa, tf, 1)) {
tf->uv[1][0]+= delta[0];
tf->uv[1][1]+= delta[1];
}
- if (SIMA_UVSEL_CHECK(efa, tf, 2)) {
+ if (simaUVSel_Check(efa, tf, 2)) {
tf->uv[2][0]+= delta[0];
tf->uv[2][1]+= delta[1];
}
- if (efa->v4 && SIMA_UVSEL_CHECK(efa, tf, 3)) {
+ if (efa->v4 && simaUVSel_Check(efa, tf, 3)) {
tf->uv[3][0]+= delta[0];
tf->uv[3][1]+= delta[1];
}
@@ -1688,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)
@@ -2592,7 +2610,9 @@ static void imagewindow_init_display_cb(RenderResult *rr)
drawimagespace(image_area, sima);
if(image_area->headertype) scrarea_do_headdraw(image_area);
- screen_swapbuffers();
+
+ /* no screen_swapbuffers, prevent any other window to draw */
+ myswapbuffers();
allqueue(REDRAWIMAGE, 0); /* redraw in end */
}
diff --git a/source/blender/src/drawimasel.c b/source/blender/src/drawimasel.c
index 257c5831813..88b6beb54c5 100644
--- a/source/blender/src/drawimasel.c
+++ b/source/blender/src/drawimasel.c
@@ -51,10 +51,11 @@
#include "DNA_material_types.h"
#include "BLI_blenlib.h"
+#include "BLI_storage_types.h"
#ifdef WIN32
#include "BLI_winstuff.h"
#endif
-#include "BLI_storage_types.h"
+
#include "BKE_global.h"
#include "BKE_library.h"
diff --git a/source/blender/src/drawipo.c b/source/blender/src/drawipo.c
index ee4c2cc3659..c94df84c7f7 100644
--- a/source/blender/src/drawipo.c
+++ b/source/blender/src/drawipo.c
@@ -65,6 +65,7 @@
#include "BKE_global.h"
#include "BKE_ipo.h"
#include "BKE_key.h"
+#include "BKE_object.h"
#include "BKE_utildefines.h"
#include "BIF_cursors.h"
@@ -210,7 +211,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;
}
@@ -218,7 +219,7 @@ 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;
}
@@ -226,7 +227,7 @@ void calc_ipogrid()
SpaceAction *saction = curarea->spacedata.first;
if (saction->flag & SACTION_DRAWTIME) {
secondgrid = 1;
- secondiv = 0.01 * (float)G.scene->r.frs_sec;
+ secondiv = 0.01 * FPS;
}
break;
}
@@ -234,7 +235,7 @@ void calc_ipogrid()
SpaceNla *snla = curarea->spacedata.first;
if (snla->flag & SNLA_DRAWTIME) {
secondgrid = 1;
- secondiv = 0.01 * (float)G.scene->r.frs_sec;
+ secondiv = 0.01 * FPS;
}
break;
}
@@ -520,6 +521,10 @@ void view2d_zoom(View2D *v2d, float factor, int winx, int winy)
view2d_do_locks(curarea, V2D_LOCK_COPY);
}
+void view2d_getscale(View2D *v2d, float *x, float *y) {
+ if (x) *x = (G.v2d->mask.xmax-G.v2d->mask.xmin)/(G.v2d->cur.xmax-G.v2d->cur.xmin);
+ if (y) *y = (G.v2d->mask.ymax-G.v2d->mask.ymin)/(G.v2d->cur.ymax-G.v2d->cur.ymin);
+}
void test_view2d(View2D *v2d, int winx, int winy)
{
@@ -863,7 +868,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);
}
@@ -934,10 +939,10 @@ void drawscroll(int disptype)
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) {
@@ -948,7 +953,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);
}
}
@@ -960,7 +965,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);
}
}
@@ -983,7 +988,7 @@ void drawscroll(int disptype)
SpaceAction *saction= curarea->spacedata.first;
if (saction->flag & SACTION_DRAWTIME) {
- fac2= val/(float)G.scene->r.frs_sec;
+ fac2= val/FPS;
scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype);
}
else {
@@ -995,7 +1000,7 @@ void drawscroll(int disptype)
SpaceNla *snla= curarea->spacedata.first;
if (snla->flag & SNLA_DRAWTIME) {
- fac2= val/(float)G.scene->r.frs_sec;
+ fac2= val/FPS;
scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype);
}
else {
@@ -1190,7 +1195,7 @@ static void draw_ipovertices(int sel)
ok= 0;
if(ei->flag & IPO_EDIT) {
- if( (bezt->f2 & 1) == sel ) ok= 1;
+ if( (bezt->f2 & SELECT) == sel ) ok= 1;
}
else ok= 1;
@@ -1212,15 +1217,15 @@ static void draw_ipovertices(int sel)
if(ei->flag & IPO_EDIT) {
if(ei->icu->ipo==IPO_BEZ) {
/* Draw the editmode hendels for a bezier curve */
- if( (bezt->f1 & 1) == sel)/* && G.v2d->cur.xmin < bezt->vec[0][0] < G.v2d->cur.xmax)*/
+ if( (bezt->f1 & SELECT) == sel)/* && G.v2d->cur.xmin < bezt->vec[0][0] < G.v2d->cur.xmax)*/
bglVertex3fv(bezt->vec[0]);
- if( (bezt->f3 & 1) == sel)/* && G.v2d->cur.xmin < bezt->vec[2][0] < G.v2d->cur.xmax)*/
+ if( (bezt->f3 & SELECT) == sel)/* && G.v2d->cur.xmin < bezt->vec[2][0] < G.v2d->cur.xmax)*/
bglVertex3fv(bezt->vec[2]);
}
- if( (bezt->f2 & 1) == sel) /* && G.v2d->cur.xmin < bezt->vec[1][0] < G.v2d->cur.xmax)*/
+ if( (bezt->f2 & SELECT) == sel) /* && G.v2d->cur.xmin < bezt->vec[1][0] < G.v2d->cur.xmax)*/
bglVertex3fv(bezt->vec[1]);
}
@@ -1261,7 +1266,7 @@ static void draw_ipohandles(int sel)
b= ei->icu->totvert;
while(b--) {
- if( (bezt->f2 & 1)==sel) {
+ if( (bezt->f2 & SELECT)==sel) {
fp= bezt->vec[0];
cpack(col[bezt->h1]);
@@ -1282,7 +1287,7 @@ static void draw_ipohandles(int sel)
glVertex2fv(fp); glVertex2fv(fp+3);
glEnd();
}
- else if( (bezt->f3 & 1)==sel) {
+ else if( (bezt->f3 & SELECT)==sel) {
fp= bezt->vec[1];
cpack(col[bezt->h2]);
@@ -1560,7 +1565,7 @@ static void draw_cfra(SpaceIpo *sipo)
vec[0]*= G.scene->r.framelen;
vec[1]= v2d->cur.ymin;
- glColor3ub(0x60, 0xc0, 0x40); // no theme, should be global color once...
+ BIF_ThemeColor(TH_CFRAME);
glLineWidth(2.0);
glBegin(GL_LINE_STRIP);
@@ -1571,8 +1576,8 @@ static void draw_cfra(SpaceIpo *sipo)
if(sipo->blocktype==ID_OB) {
ob= (G.scene->basact) ? (G.scene->basact->object) : 0;
- if(ob && ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
- vec[0]-= ob->sf;
+ if (ob && (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0)) {
+ vec[0]-= give_timeoffset(ob);
BIF_ThemeColorShade(TH_HILITE, -30);
@@ -1730,16 +1735,16 @@ static void ipo_editvertex_buts(uiBlock *block, SpaceIpo *si, float min, float m
b= ei->icu->totvert;
while(b--) {
// all three selected
- if(bezt->f2 & 1) {
+ if(bezt->f2 & SELECT) {
VecAddf(median, median, bezt->vec[1]);
tot++;
}
else {
- if(bezt->f1 & 1) {
+ if(bezt->f1 & SELECT) {
VecAddf(median, median, bezt->vec[0]);
tot++;
}
- if(bezt->f3 & 1) {
+ if(bezt->f3 & SELECT) {
VecAddf(median, median, bezt->vec[2]);
tot++;
}
@@ -1824,16 +1829,16 @@ static void ipo_editvertex_buts(uiBlock *block, SpaceIpo *si, float min, float m
b= ei->icu->totvert;
while(b--) {
// all three selected
- if(bezt->f2 & 1) {
+ if(bezt->f2 & SELECT) {
VecAddf(bezt->vec[0], bezt->vec[0], median);
VecAddf(bezt->vec[1], bezt->vec[1], median);
VecAddf(bezt->vec[2], bezt->vec[2], median);
}
else {
- if(bezt->f1 & 1) {
+ if(bezt->f1 & SELECT) {
VecAddf(bezt->vec[0], bezt->vec[0], median);
}
- if(bezt->f3 & 1) {
+ if(bezt->f3 & SELECT) {
VecAddf(bezt->vec[2], bezt->vec[2], median);
}
}
@@ -1899,7 +1904,7 @@ void do_ipobuts(unsigned short event)
ei= get_active_editipo();
if(ei) {
if(ei->icu==NULL) {
- ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
+ ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, G.sipo->bonename, ei->adrcode);
if (!ei->icu) {
error("Could not add a driver to this curve, may be linked data!");
break;
@@ -1966,7 +1971,7 @@ void do_ipobuts(unsigned short event)
}
else {
if(driver->ob) {
- if(ob==driver->ob) {
+ if(ob==driver->ob && G.sipo->bonename[0]==0) {
error("Cannot assign a Driver to own Object");
driver->ob= NULL;
}
@@ -2014,7 +2019,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;
@@ -2031,6 +2036,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 Difference %%x%d", OB_ROT_DIFF);
return (string);
}
@@ -2081,6 +2088,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 */
@@ -2089,7 +2100,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);
}
@@ -2106,7 +2118,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, "");
@@ -2240,7 +2252,7 @@ void drawipospace(ScrArea *sa, void *spacedata)
draw_anim_preview_timespace();
/* draw markers */
- draw_markers_timespace(0);
+ draw_markers_timespace(SCE_MARKERS, 0);
/* restore viewport */
mywinset(sa->win);
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index 36bad20d9f9..df5334dd27d 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -222,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;
@@ -241,9 +241,13 @@ int set_tpage(MTFace *tface)
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 );
+ /*if U.glalphaclip == 1.0, some cards go bonkers... turn off alpha test in this case*/
+ if(U.glalphaclip == 1.0) glDisable(GL_ALPHA_TEST);
+ else{
+ glEnable ( GL_ALPHA_TEST );
+ glAlphaFunc ( GL_GREATER, U.glalphaclip );
+ }
/* glBlendEquationEXT(GL_FUNC_ADD_EXT); */
}
@@ -744,7 +748,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);
@@ -960,7 +964,6 @@ static void draw_textured_begin(Object *ob)
Gtexdraw.istex = istex;
memcpy(Gtexdraw.obcol, obcol, sizeof(obcol));
set_draw_settings_cached(1, 0, 0, Gtexdraw.islit, 0, 0, 0);
- glDisable ( GL_ALPHA_TEST );
glShadeModel(GL_SMOOTH);
}
@@ -1208,8 +1211,6 @@ void draw_mesh_textured(Object *ob, DerivedMesh *dm, int faceselect)
/* 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);
}
void init_realtime_GL(void)
diff --git a/source/blender/src/drawnla.c b/source/blender/src/drawnla.c
index 0394fcce80b..a0b4c7f01b3 100644
--- a/source/blender/src/drawnla.c
+++ b/source/blender/src/drawnla.c
@@ -446,11 +446,13 @@ static void draw_nla_strips_keys(SpaceNla *snla)
#define B_NLA_PANEL 121
#define B_NLA_LOCK 122
-#define B_NLA_MOD_ADD 123
-#define B_NLA_MOD_NEXT 124
-#define B_NLA_MOD_PREV 125
-#define B_NLA_MOD_DEL 126
-#define B_NLA_MOD_DEPS 127
+#define B_NLA_SCALE 123
+#define B_NLA_SCALE2 124
+#define B_NLA_MOD_ADD 125
+#define B_NLA_MOD_NEXT 126
+#define B_NLA_MOD_PREV 127
+#define B_NLA_MOD_DEL 128
+#define B_NLA_MOD_DEPS 129
/* For now just returns the first selected strip */
bActionStrip *get_active_nlastrip(Object **obpp)
@@ -491,9 +493,37 @@ void do_nlabuts(unsigned short event)
allqueue (REDRAWNLA, 0);
allqueue (REDRAWVIEW3D, 0);
break;
+ case B_NLA_SCALE:
+ {
+ float actlen= strip->actend - strip->actstart;
+ float mapping= strip->scale * strip->repeat;
+
+ strip->end = (actlen * mapping) + strip->start;
+
+ allqueue (REDRAWNLA, 0);
+ allqueue (REDRAWIPO, 0);
+ allqueue (REDRAWACTION, 0);
+ allqueue (REDRAWVIEW3D, 0);
+ }
+ break;
+ case B_NLA_SCALE2:
+ {
+ float actlen= strip->actend - strip->actstart;
+ float len= strip->end - strip->start;
+
+ strip->scale= len / (actlen * strip->repeat);
+
+ allqueue (REDRAWNLA, 0);
+ allqueue (REDRAWIPO, 0);
+ allqueue (REDRAWACTION, 0);
+ allqueue (REDRAWVIEW3D, 0);
+ }
+ break;
case B_NLA_LOCK:
synchronize_action_strips();
+
allqueue (REDRAWNLA, 0);
+ allqueue (REDRAWIPO, 0);
allqueue (REDRAWACTION, 0);
allqueue (REDRAWVIEW3D, 0);
break;
@@ -576,7 +606,7 @@ static void nla_panel_properties(short cntrl) // NLA_HANDLER_PROPERTIES
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_NLA_PANEL, "Strip Start:", 10,160,150,19, &strip->start, -1000.0, strip->end-1, 100, 0, "First frame in the timeline");
- uiDefButF(block, NUM, B_NLA_PANEL, "Strip End:", 160,160,150,19, &strip->end, strip->start+1, MAXFRAMEF, 100, 0, "Last frame in the timeline");
+ uiDefButF(block, NUM, B_NLA_SCALE2, "Strip End:", 160,160,150,19, &strip->end, strip->start+1, MAXFRAMEF, 100, 0, "Last frame in the timeline");
uiDefIconButBitS(block, ICONTOG, ACTSTRIP_LOCK_ACTION, B_NLA_LOCK, ICON_UNLOCKED, 10,140,20,19, &(strip->flag), 0, 0, 0, 0, "Toggles Action end/start to be automatic mapped to strip duration");
if(strip->flag & ACTSTRIP_LOCK_ACTION) {
@@ -607,7 +637,15 @@ static void nla_panel_properties(short cntrl) // NLA_HANDLER_PROPERTIES
uiDefButBitS(block, TOG, ACTSTRIP_MUTE, B_NLA_PANEL, "Mute", 10,60,145,19, &strip->flag, 0, 0, 0, 0, "Toggles whether the strip contributes to the NLA solution");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NLA_PANEL, "Repeat:", 160,100,150,19, &strip->repeat, 0.001, 1000.0f, 100, 0, "Number of times the action should repeat");
+ // FIXME: repeat and scale are too cramped!
+ uiDefButF(block, NUM, B_NLA_SCALE, "Repeat:", 160,100,75,19, &strip->repeat, 0.001, 1000.0f, 100, 0, "Number of times the action should repeat");
+ if ((strip->actend - strip->actstart) < 1.0f) {
+ uiBlockSetCol(block, TH_REDALERT);
+ uiDefButF(block, NUM, B_NLA_SCALE, "Scale:", 235,100,75,19, &strip->scale, 0.001, 1000.0f, 100, 0, "Please run Alt-S to fix up this error");
+ uiBlockSetCol(block, TH_AUTO);
+ }
+ else
+ uiDefButF(block, NUM, B_NLA_SCALE, "Scale:", 235,100,75,19, &strip->scale, 0.001, 1000.0f, 100, 0, "Amount the action should be scaled by");
but= uiDefButC(block, TEX, B_NLA_PANEL, "OffsBone:", 160,80,150,19, strip->offs_bone, 0, 31.0f, 0, 0, "Name of Bone that defines offset for repeat");
uiButSetCompleteFunc(but, autocomplete_bone, (void *)ob);
uiDefButBitS(block, TOG, ACTSTRIP_HOLDLASTFRAME, B_NLA_PANEL, "Hold", 160,60,75,19, &strip->flag, 0, 0, 0, 0, "Toggles whether to continue displaying the last frame past the end of the strip");
@@ -754,7 +792,7 @@ void drawnlaspace(ScrArea *sa, void *spacedata)
draw_cfra_action();
/* draw markers */
- draw_markers_timespace(0);
+ draw_markers_timespace(SCE_MARKERS, 0);
/* Draw preview 'curtains' */
draw_anim_preview_timespace();
diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c
index 30d70ba3c43..9d72d4578e8 100644
--- a/source/blender/src/drawnode.c
+++ b/source/blender/src/drawnode.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): David Millan Escriva, Juho Vepsäläinen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -269,7 +269,7 @@ static int node_buts_group(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *
sprintf(str1, "%d", node->id->us);
bt= uiDefBut(block, BUT, B_NOP, str1,
butr->xmax-19, butr->ymin, 19, 19,
- NULL, 0, 0, 0, 0, "Displays number of users. Click to make a single-user copy.");
+ NULL, 0, 0, 0, 0, "Displays number of users.");
//uiButSetFunc(bt, node_mat_alone_cb, node, NULL);
}
@@ -348,7 +348,7 @@ static int node_buts_time(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *b
if(cumap) cumap->flag |= CUMA_DRAW_CFRA;
if(node->custom1<node->custom2)
- cumap->black[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1);
+ cumap->sample[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1);
uiBlockBeginAlign(block);
uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Sta:",
@@ -380,9 +380,23 @@ static int node_buts_curvevec(uiBlock *block, bNodeTree *ntree, bNode *node, rct
return (int)(node->width-NODE_DY);
}
+static float *_sample_col= NULL; // bad bad, 2.5 will do better?
+void node_curvemap_sample(float *col)
+{
+ _sample_col= col;
+}
+
static int node_buts_curvecol(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
+ CurveMapping *cumap= node->storage;
+ if(_sample_col) {
+ cumap->flag |= CUMA_DRAW_SAMPLE;
+ VECCOPY(cumap->sample, _sample_col);
+ }
+ else
+ cumap->flag &= ~CUMA_DRAW_SAMPLE;
+
curvemap_buttons(block, node->storage, 'c', B_NODE_EXEC+node->nr, B_REDR, butr);
}
return (int)(node->width-NODE_DY);
@@ -680,13 +694,13 @@ static int node_shader_buts_geometry(uiBlock *block, bNodeTree *ntree, bNode *no
NodeGeometry *ngeo= (NodeGeometry*)node->storage;
if(!verify_valid_uv_name(ngeo->uvname))
- uiBlockSetCol(block, TH_REDALERT);
+ 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);
+ 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);
@@ -1047,35 +1061,168 @@ static int node_composit_buts_renderlayers(uiBlock *block, bNodeTree *ntree, bNo
return 19;
}
+static void node_blur_relative_cb(void *node, void *poin2)
+{
+ bNode *nodev= node;
+ NodeBlurData *nbd= nodev->storage;
+ if(nbd->image_in_width != 0){
+ if(nbd->relative){ /* convert absolute values to relative */
+ nbd->percentx= (float)(nbd->sizex)/nbd->image_in_width;
+ nbd->percenty= (float)(nbd->sizey)/nbd->image_in_height;
+ }else{ /* convert relative values to absolute */
+ nbd->sizex= (int)(nbd->percentx*nbd->image_in_width);
+ nbd->sizey= (int)(nbd->percenty*nbd->image_in_height);
+ }
+ }
+ allqueue(REDRAWNODE, 0);
+}
+static void node_blur_update_sizex_cb(void *node, void *poin2)
+{
+ bNode *nodev= node;
+ NodeBlurData *nbd= nodev->storage;
+
+ nbd->sizex= (int)(nbd->percentx*nbd->image_in_width);
+}
+static void node_blur_update_sizey_cb(void *node, void *poin2)
+{
+ bNode *nodev= node;
+ NodeBlurData *nbd= nodev->storage;
+
+ nbd->sizey= (int)(nbd->percenty*nbd->image_in_height);
+}
static int node_composit_buts_blur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
NodeBlurData *nbd= node->storage;
uiBut *bt;
- short dy= butr->ymin+38;
+ short dy= butr->ymin+58;
short dx= (butr->xmax-butr->xmin)/2;
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, TOG, B_NOP, "Relative",
+ butr->xmin, dy, dx*2, 19,
+ &nbd->relative, 0, 0, 0, 0, "Use relative (percent) values to define blur radius");
+ uiButSetFunc(bt, node_blur_relative_cb, node, NULL);
+
+ dy-=19;
+ if(nbd->relative) {
+ bt= uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "X:",
+ butr->xmin, dy, dx, 19,
+ &nbd->percentx, 0.0f, 1.0f, 0, 0, "");
+ uiButSetFunc(bt, node_blur_update_sizex_cb, node, NULL);
+ bt= uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Y:",
+ butr->xmin+dx, dy, dx, 19,
+ &nbd->percenty, 0.0f, 1.0f, 0, 0, "");
+ uiButSetFunc(bt, node_blur_update_sizey_cb, node, NULL);
+ }
+ else {
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X:",
+ butr->xmin, dy, dx, 19,
+ &nbd->sizex, 0, 256, 0, 0, "");
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Y:",
+ butr->xmin+dx, dy, dx, 19,
+ &nbd->sizey, 0, 256, 0, 0, "");
+ }
+ uiBlockEndAlign(block);
+ }
+ return 77;
+}
+
+static int node_composit_buts_dblur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+{
+ if(block) {
+ NodeDBlurData *ndbd = node->storage;
+ short dy = butr->ymin + 171;
+ short dx = butr->xmax - butr->xmin;
+ short halfdx= (short)dx/2;
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Iterations:",
+ butr->xmin, dy, dx, 19,
+ &ndbd->iter, 1, 32, 10, 0, "Amount of iterations");
+ uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Wrap",
+ butr->xmin, dy-= 19, dx, 19,
+ &ndbd->wrap, 0, 0, 0, 0, "Wrap blur");
+ uiBlockEndAlign(block);
+
+ dy-= 9;
+
+ uiDefBut(block, LABEL, B_NOP, "Center", butr->xmin, dy-= 19, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "X:",
+ butr->xmin, dy-= 19, halfdx, 19,
+ &ndbd->center_x, 0.0f, 1.0f, 10, 0, "X center in percents");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Y:",
+ butr->xmin+halfdx, dy, halfdx, 19,
+ &ndbd->center_y, 0.0f, 1.0f, 10, 0, "Y center in percents");
+ uiBlockEndAlign(block);
+
+ dy-= 9;
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Distance:",
+ butr->xmin, dy-= 19, dx, 19,
+ &ndbd->distance, -1.0f, 1.0f, 10, 0, "Amount of which the image moves");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Angle:",
+ butr->xmin, dy-= 19, dx, 19,
+ &ndbd->angle, 0.0f, 360.0f, 1000, 0, "Angle in which the image will be moved");
+ uiBlockEndAlign(block);
+
+ dy-= 9;
+
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Spin:",
+ butr->xmin, dy-= 19, dx, 19,
+ &ndbd->spin, -360.0f, 360.0f, 1000, 0, "Angle that is used to spin the image");
+
+ dy-= 9;
+
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Zoom:",
+ butr->xmin, dy-= 19, dx, 19,
+ &ndbd->zoom, 0.0f, 100.0f, 100, 0, "Amount of which the image is zoomed");
+
+ }
+ return 190;
+}
+
+static int node_composit_buts_bilateralblur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+{
+ if(block) {
+ NodeBilateralBlurData *nbbd= node->storage;
+ short dy= butr->ymin+38;
+ short dx= (butr->xmax-butr->xmin);
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Iterations:",
+ butr->xmin, dy, dx, 19,
+ &nbbd->iter, 1, 128, 0, 0, "Amount of iterations");
dy-=19;
- bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X:",
- butr->xmin, dy, dx, 19,
- &nbd->sizex, 0, 256, 0, 0, "");
- bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Y:",
- butr->xmin+dx, dy, dx, 19,
- &nbd->sizey, 0, 256, 0, 0, "");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Color Sigma:",
+ butr->xmin, dy, dx, 19,
+ &nbbd->sigma_color,0.01, 3, 10, 0, "Sigma value used to modify color");
+ dy-=19;
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Space Sigma:",
+ butr->xmin, dy, dx, 19,
+ &nbbd->sigma_space ,0.01, 30, 10, 0, "Sigma value used to modify space");
+
}
return 57;
}
@@ -1134,6 +1281,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) {
@@ -1143,19 +1429,23 @@ static int node_composit_buts_vecblur(uiBlock *block, bNodeTree *ntree, bNode *n
uiBlockBeginAlign(block);
uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Samples:",
- butr->xmin, dy+57, dx, 19,
+ butr->xmin, dy+76, dx, 19,
&nbd->samples, 1, 256, 0, 0, "Amount of samples");
uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "MinSpeed:",
- butr->xmin, dy+38, dx, 19,
+ butr->xmin, dy+57, dx, 19,
&nbd->minspeed, 0, 1024, 0, 0, "Minimum speed for a pixel to be blurred, used to separate background from foreground");
uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "MaxSpeed:",
- butr->xmin, dy+19, dx, 19,
+ butr->xmin, dy+38, dx, 19,
&nbd->maxspeed, 0, 1024, 0, 0, "If not zero, maximum speed in pixels");
uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "BlurFac:",
- butr->xmin, dy, dx, 19,
+ butr->xmin, dy+19, dx, 19,
&nbd->fac, 0.0f, 2.0f, 10, 2, "Scaling factor for motion vectors, actually 'shutter speed' in frames");
+ uiDefButS(block, TOG, B_NODE_EXEC+node->nr, "Curved",
+ butr->xmin, dy, dx, 19,
+ &nbd->curved, 0.0f, 2.0f, 10, 2, "Interpolate between frames in a bezier curve, rather than linearly");
+ uiBlockEndAlign(block);
}
- return 76;
+ return 95;
}
static int node_composit_buts_filter(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
@@ -1186,6 +1476,49 @@ 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;
+ 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 */
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X1:",
+ butr->xmin, dy, dx, elementheight,
+ &ntxy->x1, xymin, xymax, 0, 0, "");
+ /* y1 */
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Y1:",
+ butr->xmin+dx, dy, dx, elementheight,
+ &ntxy->y1, xymin, xymax, 0, 0, "");
+
+ dy-=elementheight;
+
+ /* x2 */
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X2:",
+ butr->xmin, dy, dx, elementheight,
+ &ntxy->x2, xymin, xymax, 0, 0, "");
+ /* y2 */
+ 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) {
@@ -1334,7 +1667,7 @@ static int node_composit_buts_color_spill(uiBlock *block, bNodeTree *ntree, bNod
uiBlockEndAlign(block);
}
return 60;
- }
+}
static int node_composit_buts_chroma_matte(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
@@ -1538,7 +1871,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)
@@ -1552,9 +1885,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;
@@ -1614,13 +1947,34 @@ 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 */
+ case CMP_NODE_DBLUR:
+ ntype->butfunc= node_composit_buts_dblur;
+ break;
+ case CMP_NODE_BILATERALBLUR:
+ ntype->butfunc= node_composit_buts_bilateralblur;
+ break;
+ /* 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;
@@ -1707,6 +2061,45 @@ void init_node_butfuncs(void)
/* ************** Generic drawing ************** */
+void node_rename_but(char *s)
+{
+ uiBlock *block;
+ ListBase listb={0, 0};
+ int dy, x1, y1, sizex=80, sizey=30;
+ short pivot[2], mval[2], ret=0;
+
+ getmouseco_sc(mval);
+
+ pivot[0]= CLAMPIS(mval[0], (sizex+10), G.curscreen->sizex-30);
+ pivot[1]= CLAMPIS(mval[1], (sizey/2)+10, G.curscreen->sizey-(sizey/2)-10);
+
+ if (pivot[0]!=mval[0] || pivot[1]!=mval[1])
+ warp_pointer(pivot[0], pivot[1]);
+
+ mywinset(G.curscreen->mainwin);
+
+ x1= pivot[0]-sizex+10;
+ y1= pivot[1]-sizey/2;
+ dy= sizey/2;
+
+ block= uiNewBlock(&listb, "button", UI_EMBOSS, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT|UI_BLOCK_ENTER_OK);
+
+ /* buttons have 0 as return event, to prevent menu to close on hotkeys */
+ uiBlockBeginAlign(block);
+
+ uiDefBut(block, TEX, B_NOP, "Name: ", (short)(x1),(short)(y1+dy), 150, 19, s, 0.0, 19.0, 0, 0, "Node user name");
+
+ uiBlockEndAlign(block);
+
+ uiDefBut(block, BUT, 32767, "OK", (short)(x1+150), (short)(y1+dy), 29, 19, NULL, 0, 0, 0, 0, "");
+
+ uiBoundsBlock(block, 2);
+
+ ret= uiDoBlocks(&listb, 0, 0);
+}
+
+
static void draw_nodespace_grid(SpaceNode *snode)
{
float start, step= 25.0f;
@@ -1737,9 +2130,9 @@ static void draw_nodespace_grid(SpaceNode *snode)
glEnd();
}
-static void draw_nodespace_back(ScrArea *sa, SpaceNode *snode)
+static void draw_nodespace_back_pix(ScrArea *sa, SpaceNode *snode)
{
-
+
draw_nodespace_grid(snode);
if(snode->flag & SNODE_BACKDRAW) {
@@ -1752,10 +2145,10 @@ static void draw_nodespace_back(ScrArea *sa, SpaceNode *snode)
glaDefine2DArea(&sa->winrct);
/* ortho at pixel level curarea */
myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
-
+
x = (sa->winx-ibuf->x)/2 + snode->xof;
y = (sa->winx-ibuf->y)/2 + snode->yof;
-
+
if(ibuf->rect)
glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
else if(ibuf->channels==4)
@@ -1769,8 +2162,59 @@ static void draw_nodespace_back(ScrArea *sa, SpaceNode *snode)
}
}
+#if 0
+/* note: needs to be userpref or opengl profile option */
+static void draw_nodespace_back_tex(ScrArea *sa, SpaceNode *snode)
+{
+
+ draw_nodespace_grid(snode);
+
+ if(snode->flag & SNODE_BACKDRAW) {
+ Image *ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
+ ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
+ if(ibuf) {
+ int x, y;
+ float zoom = 1.0;
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+
+ glaDefine2DArea(&sa->winrct);
+
+ if(ibuf->x > sa->winx || ibuf->y > sa->winy) {
+ float zoomx, zoomy;
+ zoomx= (float)sa->winx/ibuf->x;
+ zoomy= (float)sa->winy/ibuf->y;
+ zoom = MIN2(zoomx, zoomy);
+ }
+
+ x = (sa->winx-zoom*ibuf->x)/2 + snode->xof;
+ y = (sa->winy-zoom*ibuf->y)/2 + snode->yof;
+
+ glPixelZoom(zoom, zoom);
+
+ glColor4f(1.0, 1.0, 1.0, 1.0);
+ if(ibuf->rect)
+ glaDrawPixelsTex(x, y, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect);
+ else if(ibuf->channels==4)
+ glaDrawPixelsTex(x, y, ibuf->x, ibuf->y, GL_FLOAT, ibuf->rect_float);
+
+ glPixelZoom(1.0, 1.0);
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+ }
+ }
+}
+#endif
+
/* nice AA filled circle */
-static void socket_circle_draw(float x, float y, float size, int type, int select)
+/* this might have some more generic use */
+static void circle_draw(float x, float y, float size, int type, int col[3])
{
/* 16 values of sin function */
static float si[16] = {
@@ -1788,28 +2232,7 @@ static void socket_circle_draw(float x, float y, float size, int type, int selec
};
int a;
- if(select==0) {
- if(type==-1)
- glColor3ub(0, 0, 0);
- else if(type==SOCK_VALUE)
- glColor3ub(160, 160, 160);
- else if(type==SOCK_VECTOR)
- glColor3ub(100, 100, 200);
- else if(type==SOCK_RGBA)
- glColor3ub(200, 200, 40);
- else
- glColor3ub(100, 200, 100);
- }
- else {
- if(type==SOCK_VALUE)
- glColor3ub(200, 200, 200);
- else if(type==SOCK_VECTOR)
- glColor3ub(140, 140, 240);
- else if(type==SOCK_RGBA)
- glColor3ub(240, 240, 100);
- else
- glColor3ub(140, 240, 140);
- }
+ glColor3ub(col[0], col[1], col[2]);
glBegin(GL_POLYGON);
for(a=0; a<16; a++)
@@ -1827,6 +2250,41 @@ static void socket_circle_draw(float x, float y, float size, int type, int selec
glDisable(GL_BLEND);
}
+static void socket_circle_draw(bNodeSocket *sock, float size)
+{
+ int col[3];
+
+ /* choose color based on sock flags */
+ if(sock->flag & SELECT) {
+ if(sock->flag & SOCK_SEL) {
+ col[0]= 240; col[1]= 200; col[2]= 40;}
+ else if(sock->type==SOCK_VALUE) {
+ col[0]= 200; col[1]= 200; col[2]= 200;}
+ else if(sock->type==SOCK_VECTOR) {
+ col[0]= 140; col[1]= 140; col[2]= 240;}
+ else if(sock->type==SOCK_RGBA) {
+ col[0]= 240; col[1]= 240; col[2]= 100;}
+ else {
+ col[0]= 140; col[1]= 240; col[2]= 140;}
+ }
+ else if(sock->flag & SOCK_SEL) {
+ col[0]= 200; col[1]= 160; col[2]= 0;}
+ else {
+ if(sock->type==-1) {
+ col[0]= 0; col[1]= 0; col[2]= 0;}
+ else if(sock->type==SOCK_VALUE) {
+ col[0]= 160; col[1]= 160; col[2]= 160;}
+ else if(sock->type==SOCK_VECTOR) {
+ col[0]= 100; col[1]= 100; col[2]= 200;}
+ else if(sock->type==SOCK_RGBA) {
+ col[0]= 200; col[1]= 200; col[2]= 40;}
+ else {
+ col[0]= 100; col[1]= 200; col[2]= 100;}
+ }
+
+ circle_draw(sock->locx, sock->locy, size, sock->type, col);
+}
+
/* not a callback */
static void node_draw_preview(bNodePreview *preview, rctf *prv)
{
@@ -1976,8 +2434,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;
@@ -1989,6 +2451,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) {
@@ -2112,6 +2578,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
rctf *rct= &node->totr;
float slen, iconofs;
int ofs, color_id= node_get_colorid(node);
+ char showname[128];
uiSetRoundBox(15-4);
ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
@@ -2141,8 +2608,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);
@@ -2192,8 +2657,18 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
BIF_ThemeColor(TH_TEXT);
ui_rasterpos_safe(rct->xmin+19.0f, rct->ymax-NODE_DY+5.0f, snode->aspect);
- snode_drawstring(snode, node->name, (int)(iconofs - rct->xmin-18.0f));
-
+
+ if(node->username[0]) {
+ strcpy(showname,"(");
+ strcat(showname, node->username);
+ strcat(showname,") ");
+ strcat(showname, node->name);
+ }
+ else
+ strcpy(showname, node->name);
+
+ snode_drawstring(snode, showname, (int)(iconofs - rct->xmin-18.0f));
+
/* body */
BIF_ThemeColor4(TH_NODE);
glEnable(GL_BLEND);
@@ -2235,7 +2710,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
/* socket inputs, buttons */
for(sock= node->inputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+ socket_circle_draw(sock, NODE_SOCKSIZE);
if(block && sock->link==NULL) {
float *butpoin= sock->ns.vec;
@@ -2277,7 +2752,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
/* socket outputs */
for(sock= node->outputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+ socket_circle_draw(sock, NODE_SOCKSIZE);
BIF_ThemeColor(TH_TEXT);
ofs= 0;
@@ -2308,13 +2783,14 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
}
-void node_draw_hidden(SpaceNode *snode, bNode *node)
+static void node_draw_hidden(SpaceNode *snode, bNode *node)
{
bNodeSocket *sock;
rctf *rct= &node->totr;
float dx, centy= 0.5f*(rct->ymax+rct->ymin);
float hiddenrad= 0.5f*(rct->ymax-rct->ymin);
int color_id= node_get_colorid(node);
+ char showname[128];
/* shadow */
uiSetRoundBox(15);
@@ -2348,7 +2824,17 @@ void node_draw_hidden(SpaceNode *snode, bNode *node)
if(node->miniwidth>0.0f) {
ui_rasterpos_safe(rct->xmin+21.0f, centy-4.0f, snode->aspect);
- snode_drawstring(snode, node->name, (int)(rct->xmax - rct->xmin-18.0f -12.0f));
+
+ if(node->username[0]) {
+ strcpy(showname,"(");
+ strcat(showname, node->username);
+ strcat(showname,") ");
+ strcat(showname, node->name);
+ }
+ else
+ strcpy(showname, node->name);
+
+ snode_drawstring(snode, showname, (int)(rct->xmax - rct->xmin-18.0f -12.0f));
}
/* scale widget thing */
@@ -2365,12 +2851,12 @@ void node_draw_hidden(SpaceNode *snode, bNode *node)
/* sockets */
for(sock= node->inputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+ socket_circle_draw(sock, NODE_SOCKSIZE);
}
for(sock= node->outputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+ socket_circle_draw(sock, NODE_SOCKSIZE);
}
}
@@ -2550,6 +3036,7 @@ static void node_draw_group(ScrArea *sa, SpaceNode *snode, bNode *gnode)
bNodeTree *ngroup= (bNodeTree *)gnode->id;
bNodeSocket *sock;
rctf rect= gnode->totr;
+ char showname[128];
/* backdrop header */
glEnable(GL_BLEND);
@@ -2573,7 +3060,17 @@ static void node_draw_group(ScrArea *sa, SpaceNode *snode, bNode *gnode)
/* backdrop title */
BIF_ThemeColor(TH_TEXT_HI);
ui_rasterpos_safe(rect.xmin+8.0f, rect.ymax+5.0f, snode->aspect);
- BIF_DrawString(snode->curfont, ngroup->id.name+2, 0);
+
+ if(gnode->username[0]) {
+ strcpy(showname,"(");
+ strcat(showname, gnode->username);
+ strcat(showname,") ");
+ strcat(showname, ngroup->id.name+2);
+ }
+ else
+ strcpy(showname, ngroup->id.name+2);
+
+ BIF_DrawString(snode->curfont, showname, 0);
/* links from groupsockets to the internal nodes */
node_draw_group_links(snode, gnode);
@@ -2581,10 +3078,10 @@ static void node_draw_group(ScrArea *sa, SpaceNode *snode, bNode *gnode)
/* group sockets */
for(sock= gnode->inputs.first; sock; sock= sock->next)
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+ socket_circle_draw(sock, NODE_SOCKSIZE);
for(sock= gnode->outputs.first; sock; sock= sock->next)
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
+ socket_circle_draw(sock, NODE_SOCKSIZE);
/* and finally the whole tree */
node_draw_nodetree(sa, snode, ngroup);
@@ -2618,7 +3115,7 @@ void drawnodespace(ScrArea *sa, void *spacedata)
snode->curfont= uiSetCurFont_ext(snode->aspect);
/* backdrop */
- draw_nodespace_back(sa, snode);
+ draw_nodespace_back_pix(sa, snode);
/* nodes */
snode_set_context(snode);
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index f637734fa34..e0bfa8d90d6 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"
@@ -137,6 +143,8 @@ static void draw_bounding_volume(Object *ob);
static void drawcube_size(float size);
static void drawcircle_size(float size);
+static void draw_empty_sphere(float size);
+static void draw_empty_cone(float size);
/* ************* Setting OpenGL Material ************ */
@@ -406,6 +414,14 @@ void drawaxes(float size, int flag, char drawtype)
drawcircle_size(size);
break;
+ case OB_EMPTY_SPHERE:
+ draw_empty_sphere(size);
+ break;
+
+ case OB_EMPTY_CONE:
+ draw_empty_cone(size);
+ break;
+
case OB_ARROWS:
default:
for (axis=0; axis<3; axis++) {
@@ -1126,7 +1142,7 @@ static void lattice_draw_verts(Lattice *lt, DispList *dl, short sel)
int uxt = (u==0 || u==lt->pntsu-1);
if(!(lt->flag & LT_OUTSIDE) || uxt || vxt || wxt) {
if(bp->hide==0) {
- if((bp->f1 & 1)==sel) {
+ if((bp->f1 & SELECT)==sel) {
bglVertex3fv(dl?co:bp->vec);
}
}
@@ -1357,12 +1373,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]);
+ }
}
}
}
@@ -1461,7 +1486,7 @@ static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *
bglEnd();
- glPointSize(size+3);
+ glPointSize(size);
bglBegin(GL_POINTS);
bglVertex3fv(co);
bglEnd();
@@ -1683,9 +1708,7 @@ static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM, EditVert *eve
draw_dm_verts(cageDM, sel, eve_act);
}
- if( (G.scene->selectmode & SCE_SELECT_FACE) &&
- (G.vd->drawtype<=OB_SOLID)
- ) {
+ if( CHECK_OB_DRAWFACEDOT(G.scene, G.vd, G.obedit->dt) ) {
glPointSize(fsize);
glColor4ubv((GLubyte *)fcol);
draw_dm_face_centers(cageDM, sel);
@@ -2021,9 +2044,7 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
EM_init_index_arrays(1, 1, 1);
if(dt>OB_WIRE) {
- if( (G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID) ||
- (G.vd->drawtype==OB_SOLID && G.vd->flag2 & V3D_SOLID_TEX)
- ) {
+ if( CHECK_OB_DRAWTEXTURE(G.vd, dt) ) {
draw_mesh_textured(ob, finalDM, 0);
} else {
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED);
@@ -2061,6 +2082,10 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
glEnable(GL_BLEND);
glDepthMask(0); // disable write in zbuffer, needed for nice transp
+ /* 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);
@@ -2084,10 +2109,7 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
}
/* here starts all fancy draw-extra over */
- if( (G.f & G_DRAWEDGES)==0 &&
- ((G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID) ||
- (G.vd->drawtype==OB_SOLID && G.vd->flag2 & V3D_SOLID_TEX))
- ) {
+ 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 */
@@ -2237,8 +2259,7 @@ static void draw_mesh_fancy(Base *base, int dt, int flag)
draw_wire = 1;
}
else if( (ob==OBACT && (G.f & G_TEXTUREPAINT || FACESEL_PAINT_TEST)) ||
- (G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID) ||
- (G.vd->drawtype==OB_SOLID && G.vd->flag2 & V3D_SOLID_TEX))
+ CHECK_OB_DRAWTEXTURE(G.vd, dt))
{
int faceselect= (ob==OBACT && FACESEL_PAINT_TEST);
@@ -2410,14 +2431,8 @@ 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);
- /* TODO, not 100% sure this is correct,
- * however I could not make it crash or leak ram with different
- * linked-dup/modifier configurtions,
- * should double check whats going on before release - Campbell */
- if (cageDM != finalDM) {
- cageDM->release(cageDM);
+ if (G.obedit!=ob && finalDM)
finalDM->release(finalDM);
- }
}
else if(!G.obedit && (G.f & G_SCULPTMODE) &&(G.scene->sculptdata.flags & SCULPT_DRAW_FAST) &&
OBACT==ob && !sculpt_modifiers_active(ob)) {
@@ -2425,8 +2440,7 @@ static int draw_mesh_object(Base *base, int dt, int flag)
}
else {
/* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */
-
- if(me->totface<=4 || boundbox_clip(ob->obmat, me->bb)) {
+ if(me->totface<=4 || boundbox_clip(ob->obmat, (ob->bb)? ob->bb: me->bb)) {
if(dt==OB_SOLID) has_alpha= init_gl_materials(ob, (base->flag & OB_FROMDUPLI)==0);
draw_mesh_fancy(base, dt, flag);
@@ -2843,7 +2857,7 @@ static void draw_particle_system(Base *base, PartEff *paf)
mymultmatrix(mat);
}
- if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
+ if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= give_timeoffset(ob);
else ptime= 0.0;
ctime= bsystem_time(ob, (float)(G.scene->r.cfra), ptime);
@@ -2953,6 +2967,758 @@ 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_check_enabled(ob, psys))
+ 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->type==PART_HAIR && !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{
+ ChildParticle *cpa= &psys->child[a-totpart];
+
+ pa_time=psys_get_child_time(psys,cpa,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,cpa,cfra,0);
+
+ r_tilt=2.0f*cpa->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);
+ glDisableClientState(GL_NORMAL_ARRAY);
+
+ if(draw_as != PART_DRAW_CIRC){
+ 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(part->draw&PART_DRAW_MAT_COL) {
+ glEnableClientState(GL_COLOR_ARRAY);
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ }
+
+ 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);
+ if(part->draw&PART_DRAW_MAT_COL)
+ glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
+ 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);
+ if(part->draw&PART_DRAW_MAT_COL)
+ glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
+ glDrawArrays(GL_LINE_STRIP, 0, path->steps + 1);
+ }
+
+ if(part->draw&PART_DRAW_MAT_COL) {
+ glDisable(GL_COLOR_ARRAY);
+ glDisable(GL_COLOR_MATERIAL);
+ }
+
+ 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);
+#if 0 /* If this is needed, it cant be enabled in wire mode, since it messes up the view - Campbell */
+ glEnable(GL_DEPTH_TEST);
+#endif
+
+ 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();
+ 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(!(pset->flag & PE_SHOW_CHILD) && 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);
+ }
+
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+
+ for(i=0, pa=psys->particles, path = psys->pathcache; i<totpart; i++, pa++, 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);
+ }
+
+ glEnable(GL_LIGHTING);
+ if(psys->part->draw_as == PART_DRAW_PATH) {
+ 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);
+ }
+ }
+
+ glDisable(GL_COLOR_MATERIAL);
+
+ /* 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 };
@@ -2962,8 +3728,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);
@@ -2975,7 +3741,7 @@ static void tekenhandlesN(Nurb *nu, short sel)
a= nu->pntsu;
while(a--) {
if(bezt->hide==0) {
- if( (bezt->f2 & 1)==sel) {
+ if( (bezt->f2 & SELECT)==sel) {
fp= bezt->vec[0];
cpack(col[bezt->h1]);
@@ -2986,14 +3752,14 @@ static void tekenhandlesN(Nurb *nu, short sel)
glVertex3fv(fp+3);
glVertex3fv(fp+6);
}
- else if( (bezt->f1 & 1)==sel) {
+ else if( (bezt->f1 & SELECT)==sel) {
fp= bezt->vec[0];
cpack(col[bezt->h1]);
glVertex3fv(fp);
glVertex3fv(fp+3);
}
- else if( (bezt->f3 & 1)==sel) {
+ else if( (bezt->f3 & SELECT)==sel) {
fp= bezt->vec[1];
cpack(col[bezt->h2]);
@@ -3030,9 +3796,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 & SELECT)==sel) bglVertex3fv(bezt->vec[1]);
+ } else {
+ if((bezt->f1 & SELECT)==sel) bglVertex3fv(bezt->vec[0]);
+ if((bezt->f2 & SELECT)==sel) bglVertex3fv(bezt->vec[1]);
+ if((bezt->f3 & SELECT)==sel) bglVertex3fv(bezt->vec[2]);
+ }
}
bezt++;
}
@@ -3042,7 +3812,7 @@ static void tekenvertsN(Nurb *nu, short sel)
a= nu->pntsu*nu->pntsv;
while(a--) {
if(bp->hide==0) {
- if((bp->f1 & 1)==sel) bglVertex3fv(bp->vec);
+ if((bp->f1 & SELECT)==sel) bglVertex3fv(bp->vec);
}
bp++;
}
@@ -3085,7 +3855,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
for(a=nu->pntsu-1; a>0; a--, bp++) {
if(bp->hide==0 && bp1->hide==0) {
if(sel) {
- if( (bp->f1 & 1) && ( bp1->f1 & 1) ) {
+ if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT ) ) {
cpack(nurbcol[5]);
glBegin(GL_LINE_STRIP);
@@ -3095,7 +3865,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
}
}
else {
- if( (bp->f1 & 1) && ( bp1->f1 & 1) );
+ if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) );
else {
cpack(nurbcol[1]);
@@ -3118,7 +3888,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
for(a=nu->pntsv-1; a>0; a--, bp+=ofs) {
if(bp->hide==0 && bp1->hide==0) {
if(sel) {
- if( (bp->f1 & 1) && ( bp1->f1 & 1) ) {
+ if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) ) {
cpack(nurbcol[7]);
glBegin(GL_LINE_STRIP);
@@ -3128,7 +3898,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
}
}
else {
- if( (bp->f1 & 1) && ( bp1->f1 & 1) );
+ if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) );
else {
cpack(nurbcol[3]);
@@ -3182,8 +3952,9 @@ static void drawnurb(Base *base, Nurb *nurb, int dt)
if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
- /* direction vectors for 3d curve paths */
- if(cu->flag & CU_3D) {
+ /* direction vectors for 3d curve paths
+ when at its lowest, dont render normals */
+ if(cu->flag & CU_3D && G.scene->editbutsize > 0.0015) {
BIF_ThemeColor(TH_WIRE);
for (bl=cu->bev.first,nu=nurb; nu && bl; bl=bl->next,nu=nu->next) {
BevPoint *bevp= (BevPoint *)(bl+1);
@@ -3191,7 +3962,7 @@ static void drawnurb(Base *base, Nurb *nurb, int dt)
int skip= nu->resolu/16;
float fac;
- while (nr-->0) {
+ while (nr-->0) { /* accounts for empty bevel lists */
float ox,oy,oz; // Offset perpendicular to the curve
float dx,dy,dz; // Delta along the curve
@@ -3226,6 +3997,45 @@ static void drawnurb(Base *base, Nurb *nurb, int dt)
if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
}
+/* draw a sphere for use as an empty drawtype */
+static void draw_empty_sphere (float size)
+{
+ float cent=0;
+ GLUquadricObj *qobj = gluNewQuadric();
+ gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
+
+ glPushMatrix();
+ glTranslatef(cent, cent, cent);
+ glScalef(size, size, size);
+ gluSphere(qobj, 1.0, 8, 5);
+
+ glPopMatrix();
+
+ gluDeleteQuadric(qobj);
+}
+
+/* draw a cone for use as an empty drawtype */
+static void draw_empty_cone (float size)
+{
+ float cent=0;
+ float radius;
+ GLUquadricObj *qobj = gluNewQuadric();
+ gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
+
+
+ glPushMatrix();
+
+ radius = size;
+ glTranslatef(cent,cent, cent);
+ glScalef(radius, 2.0*size, radius);
+ glRotatef(-90., 1.0, 0.0, 0.0);
+ gluCylinder(qobj, 1.0, 0.0, 1.0, 8, 1);
+
+ glPopMatrix();
+
+ gluDeleteQuadric(qobj);
+}
+
/* draw points on curve speed handles */
static void curve_draw_speed(Object *ob)
{
@@ -3362,7 +4172,49 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4])
}
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)
{
@@ -3492,7 +4344,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
@@ -3505,12 +4357,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) {
@@ -3538,14 +4390,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])
@@ -3629,7 +4533,7 @@ static void draw_bounding_volume(Object *ob)
BoundBox *bb=0;
if(ob->type==OB_MESH) {
- bb= mesh_get_bb(ob->data);
+ bb= mesh_get_bb(ob);
}
else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
bb= ( (Curve *)ob->data )->bb;
@@ -3855,10 +4759,13 @@ void draw_object(Base *base, int flag)
/* xray delay? */
if((flag & DRAW_PICKING)==0 && (base->flag & OB_FROMDUPLI)==0) {
- /* xray and transp are set when it is drawing the 2nd/3rd pass */
- if(!G.vd->xray && !G.vd->transp && (ob->dtx & OB_DRAWXRAY)) {
- add_view3d_after(G.vd, base, V3D_XRAY);
- return;
+ /* don't do xray in particle mode, need the z-buffer */
+ if(!(G.f & G_PARTICLEEDIT)) {
+ /* xray and transp are set when it is drawing the 2nd/3rd pass */
+ if(!G.vd->xray && !G.vd->transp && (ob->dtx & OB_DRAWXRAY)) {
+ add_view3d_after(G.vd, base, V3D_XRAY);
+ return;
+ }
}
}
@@ -4195,6 +5102,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 && ob!=G.obedit){
+ 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)
@@ -4285,10 +5212,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);
@@ -4301,29 +5228,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 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, bsystem_time(ob, (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), give_timeoffset(ob)));
+ 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);
}
}
@@ -4438,9 +5382,7 @@ 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) &&
- (G.vd->drawtype<=OB_SOLID)
- ) {
+ if( CHECK_OB_DRAWFACEDOT(G.scene, G.vd, G.obedit->dt) ) {
glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE));
bglBegin(GL_POINTS);
@@ -4614,4 +5556,3 @@ void draw_object_instance(Object *ob, int dt, int outline)
break;
}
}
-
diff --git a/source/blender/src/drawscene.c b/source/blender/src/drawscene.c
index 297dfcb7fb2..557083d2b97 100644
--- a/source/blender/src/drawscene.c
+++ b/source/blender/src/drawscene.c
@@ -74,14 +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_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/drawseq.c b/source/blender/src/drawseq.c
index 37f5126b27c..ab77294abea 100644
--- a/source/blender/src/drawseq.c
+++ b/source/blender/src/drawseq.c
@@ -92,43 +92,33 @@
#define SEQ_STRIP_OFSBOTTOM 0.2
#define SEQ_STRIP_OFSTOP 0.8
+static GLubyte halftone[] = {
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55};
+
+/* Note, Dont use WHILE_SEQ while drawing! - it messes up transform, - Campbell */
+
int no_rightbox=0, no_leftbox= 0;
-static void draw_seq_handle(Sequence *seq, SpaceSeq *sseq, short direction);
+static void draw_seq_handle(Sequence *seq, SpaceSeq *sseq, float pixelx, short direction);
static void draw_seq_extensions(Sequence *seq, SpaceSeq *sseq);
static void draw_seq_text(Sequence *seq, float x1, float x2, float y1, float y2);
static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float x2, float y2);
-static void draw_seq_strip(struct Sequence *seq, struct ScrArea *sa, struct SpaceSeq *sseq);
+static void draw_seq_strip(struct Sequence *seq, struct ScrArea *sa, struct SpaceSeq *sseq, int outline_tint, float pixelx);
-static char *give_seqname(Sequence *seq)
-{
- if(seq->type==SEQ_META) return "Meta";
- else if(seq->type==SEQ_IMAGE) return "Image";
- else if(seq->type==SEQ_SCENE) return "Scene";
- else if(seq->type==SEQ_MOVIE) return "Movie";
- else if(seq->type==SEQ_RAM_SOUND) return "Audio (RAM)";
- else if(seq->type==SEQ_HD_SOUND) return "Audio (HD)";
- else if(seq->type<SEQ_EFFECT) return seq->strip->dir;
- else if(seq->type==SEQ_CROSS) return "Cross";
- else if(seq->type==SEQ_GAMCROSS) return "Gamma Cross";
- else if(seq->type==SEQ_ADD) return "Add";
- else if(seq->type==SEQ_SUB) return "Sub";
- else if(seq->type==SEQ_MUL) return "Mul";
- else if(seq->type==SEQ_ALPHAOVER) return "Alpha Over";
- else if(seq->type==SEQ_ALPHAUNDER) return "Alpha Under";
- else if(seq->type==SEQ_OVERDROP) return "Over Drop";
- else if(seq->type==SEQ_WIPE) return "Wipe";
- else if(seq->type==SEQ_GLOW) return "Glow";
- else if(seq->type==SEQ_TRANSFORM) return "Transform";
- else if(seq->type==SEQ_COLOR) return "Color";
- else if(seq->type==SEQ_SPEED) return "Speed";
- else if(seq->type==SEQ_PLUGIN) {
- if(!(seq->flag & SEQ_EFFECT_NOT_LOADED) &&
- seq->plugin && seq->plugin->doit) return seq->plugin->pname;
- return "Plugin";
- }
- else return "Effect";
-
-}
static void draw_cfra_seq(void)
{
glColor3ub(0x30, 0x90, 0x50);
@@ -237,20 +227,26 @@ static void get_seq_color3ubv(Sequence *seq, char *col)
static void drawmeta_contents(Sequence *seqm, float x1, float y1, float x2, float y2)
{
+ /* Note, this used to use WHILE_SEQ, but it messes up the seq->depth value, (needed by transform when doing overlap checks)
+ * so for now, just use the meta's immediate children, could be fixed but its only drawing - Campbell */
Sequence *seq;
float dx;
int nr;
char col[3];
- nr= 0;
- WHILE_SEQ(&seqm->seqbase) {
- nr++;
- }
- END_SEQ
+ nr= BLI_countlist(&seqm->seqbase);
dx= (x2-x1)/nr;
- WHILE_SEQ(&seqm->seqbase) {
+ if (seqm->flag & SEQ_MUTE) {
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(halftone);
+
+ glEnable(GL_LINE_STIPPLE);
+ glLineStipple(1, 0x8888);
+ }
+
+ for (seq= seqm->seqbase.first; seq; seq= seq->next) {
get_seq_color3ubv(seq, col);
glColor3ubv((GLubyte *)col);
@@ -264,7 +260,11 @@ static void drawmeta_contents(Sequence *seqm, float x1, float y1, float x2, floa
x1+= dx;
}
- END_SEQ
+
+ if (seqm->flag & SEQ_MUTE) {
+ glDisable(GL_POLYGON_STIPPLE);
+ glDisable(GL_LINE_STIPPLE);
+ }
}
static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, int winx)
@@ -308,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;
@@ -370,11 +370,10 @@ static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, i
}
/* draw a handle, for each end of a sequence strip */
-static void draw_seq_handle(Sequence *seq, SpaceSeq *sseq, short direction)
+static void draw_seq_handle(Sequence *seq, SpaceSeq *sseq, float pixelx, short direction)
{
float v1[2], v2[2], v3[2], rx1=0, rx2=0; //for triangles and rect
float x1, x2, y1, y2;
- float pixelx;
float handsize;
float minhandle, maxhandle;
char str[120];
@@ -388,7 +387,6 @@ static void draw_seq_handle(Sequence *seq, SpaceSeq *sseq, short direction)
y2= seq->machine+SEQ_STRIP_OFSTOP;
v2d = &sseq->v2d;
- pixelx = (v2d->cur.xmax - v2d->cur.xmin)/(v2d->mask.xmax - v2d->mask.xmin);
/* clamp handles to defined size in pixel space */
handsize = seq->handsize;
@@ -636,6 +634,11 @@ static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float
{
float ymid1, ymid2;
+ if (seq->flag & SEQ_MUTE) {
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(halftone);
+ }
+
ymid1 = (y2-y1)*0.25 + y1;
ymid2 = (y2-y1)*0.65 + y1;
@@ -677,6 +680,9 @@ static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float
glEnd();
+ if (seq->flag & SEQ_MUTE) {
+ glDisable(GL_POLYGON_STIPPLE);
+ }
}
/*
@@ -684,14 +690,13 @@ Draw a sequence strip, bounds check alredy made
ScrArea is currently only used to get the windows width in pixels
so wave file sample drawing precission is zoom adjusted
*/
-static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq)
+static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq, int outline_tint, float pixelx)
{
float x1, x2, y1, y2;
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_image_seq(seq);
+ /* we need to know if this is a single image/color or not for drawing */
+ is_single_image = (char)check_single_seq(seq);
/* body */
if(seq->startstill) x1= seq->start;
@@ -718,8 +723,8 @@ static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq)
if (!is_single_image)
draw_seq_extensions(seq, sseq);
- draw_seq_handle(seq, sseq, SEQ_LEFTHANDLE);
- draw_seq_handle(seq, sseq, SEQ_RIGHTHANDLE);
+ draw_seq_handle(seq, sseq, pixelx, SEQ_LEFTHANDLE);
+ draw_seq_handle(seq, sseq, pixelx, SEQ_RIGHTHANDLE);
/* draw the strip outline */
x1= seq->startdisp;
@@ -731,13 +736,21 @@ static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq)
col[0]= 255; col[1]= col[2]= 40;
} else BIF_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 120);
}
- else if (seq == last_seq) BIF_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 120);
- else if (seq->flag & SELECT) BIF_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -150);
- else BIF_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -60);
+ BIF_GetColorPtrBlendShade3ubv(col, col, col, 0.0, outline_tint);
+
glColor3ubv((GLubyte *)col);
+
+ if (seq->flag & SEQ_MUTE) {
+ glEnable(GL_LINE_STIPPLE);
+ glLineStipple(1, 0x8888);
+ }
+
gl_round_box_shade(GL_LINE_LOOP, x1, y1, x2, y2, 0.0, 0.1, 0.0);
-
+
+ if (seq->flag & SEQ_MUTE) {
+ glDisable(GL_LINE_STIPPLE);
+ }
/* calculate if seq is long enough to print a name */
x1= seq->startdisp+seq->handsize;
@@ -753,7 +766,7 @@ static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq)
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) {
+ if( (x2-x1) / pixelx > 32) {
draw_seq_text(seq, x1, x2, y1, y2);
}
}
@@ -775,12 +788,12 @@ 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;
static int recursive= 0;
float zoom;
+ float zoomx, zoomy;
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
@@ -800,10 +813,18 @@ static void draw_image_seq(ScrArea *sa)
return;
else {
recursive= 1;
- if (!U.prefetchframes || (G.f & G_PLAYANIM) == 0) {
- 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_threaded(rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+ ibuf= (ImBuf *)give_ibuf_seq_threaded(
+ rectx, recty, (G.scene->r.cfra),
+ sseq->chanshown);
}
recursive= 0;
@@ -815,31 +836,40 @@ 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)
- IMB_rect_from_float(ibuf);
- if(ibuf->rect==NULL)
+
+ if(ibuf->rect==NULL && ibuf->rect_float == NULL)
return;
- if (sseq->mainb == SEQ_DRAW_IMG_WAVEFORM) {
- ibuf = make_waveform_view_from_ibuf(ibuf);
+ switch(sseq->mainb) {
+ case SEQ_DRAW_IMG_IMBUF:
+ if (sseq->zebra != 0) {
+ ibuf = make_zebra_view_from_ibuf(ibuf, sseq->zebra);
+ free_ibuf = 1;
+ }
+ break;
+ case SEQ_DRAW_IMG_WAVEFORM:
+ if ((sseq->flag & SEQ_DRAW_COLOR_SEPERATED) != 0) {
+ ibuf = make_sep_waveform_view_from_ibuf(ibuf);
+ } else {
+ ibuf = make_waveform_view_from_ibuf(ibuf);
+ }
free_ibuf = 1;
- } else if (sseq->mainb == SEQ_DRAW_IMG_VECTORSCOPE) {
+ break;
+ case SEQ_DRAW_IMG_VECTORSCOPE:
ibuf = make_vectorscope_view_from_ibuf(ibuf);
free_ibuf = 1;
+ break;
+ case SEQ_DRAW_IMG_HISTOGRAM:
+ ibuf = make_histogram_view_from_ibuf(ibuf);
+ free_ibuf = 1;
+ break;
}
+ if(ibuf->rect_float && ibuf->rect==NULL)
+ IMB_rect_from_float(ibuf);
+
if (sseq->zoom > 0) {
zoom = sseq->zoom;
} else if (sseq->zoom == 0) {
@@ -854,139 +884,49 @@ static void draw_image_seq(ScrArea *sa)
/* needed for gla draw */
glaDefine2DArea(&curarea->winrct);
- glPixelZoom(zoom, zoom);
+ zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp);
+ zoomy = zoom;
+
+ glPixelZoom(zoomx, zoomy);
+
glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
glPixelZoom(1.0, 1.0);
- if (free_ibuf) {
- IMB_freeImBuf(ibuf);
- }
-
- sa->win_swap= WIN_BACK_OK;
-}
-
-static void draw_extra_seqinfo(void)
-{
- Sequence *last_seq = get_last_seq();
- StripElem *se, *last;
- float xco, xfac, yco, yfac;
- int sta, end;
- char str[256];
-
- if(last_seq==0) return;
-
- /* 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+10*xfac;
-
- 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, yco, 0.0);
- strncpy(str, give_seqname(last_seq), 255);
- BMF_DrawString(G.font, str);
- xco += xfac*BMF_GetStringWidth(G.font, str) +10.0*xfac;
-
- if(last_seq->type==SEQ_SCENE && last_seq->scene) {
- 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, dont bother with single images */
- if (check_single_image_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);
+ /* safety border */
+ if (sseq->mainb == SEQ_DRAW_IMG_IMBUF &&
+ (sseq->flag & SEQ_DRAW_SAFE_MARGINS) != 0) {
+ float fac= 0.1;
+ float x2 = x1 + ibuf->x * zoomx;
+ float y2 = y1 + ibuf->y * zoomy;
- glRasterPos3f(xco, yco, 0.0);
-
- BMF_DrawString(G.font, str);
- xco += xfac*BMF_GetStringWidth(G.font, str) +10.0*xfac;
- }
-
-
- if(last_seq->type==SEQ_IMAGE) {
- if (last_seq->len > 1) {
- /* CURRENT */
- se= (StripElem *)give_stripelem(last_seq, (G.scene->r.cfra));
- if(se) {
- sprintf(str, "Cur: %s", 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;
+ float a= fac*(x2-x1);
+ x1+= a;
+ x2-= a;
- 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;
+ a= fac*(y2-y1);
+ y1+= a;
+ y2-= a;
- /* orig size */
- sprintf(str, "OrigSize: %d x %d", last_seq->strip->orx, last_seq->strip->ory);
- 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 len: %d", 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;
- }
- }
- }
- else if(last_seq->type==SEQ_MOVIE) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ setlinestyle(3);
- sta= last_seq->startofs;
- end= last_seq->len-1-last_seq->endofs;
-
- sprintf(str, "%s %s%s First: %d at %d Last: %d at %d Cur: %d",
- 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);
+ BIF_ThemeColorBlendShade(TH_WIRE, TH_BACK, 1.0, 0);
+
+ uiSetRoundBox(15);
+ gl_round_box(GL_LINE_LOOP, x1, y1, x2, y2, 12.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));
- 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, yco, 0.0);
- BMF_DrawString(G.font, str);
- }
+ setlinestyle(0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
- else if(last_seq->type==SEQ_RAM_SOUND
- || last_seq->type == SEQ_HD_SOUND) {
- sta= last_seq->startofs;
- end= last_seq->len-1-last_seq->endofs;
- sprintf(str, "%s %s%s First: %d at %d Last: %d at %d Cur: %d Gain: %.2f dB Pan: %.2f",
- 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,
- last_seq->level, last_seq->pan);
+ if (free_ibuf) {
+ IMB_freeImBuf(ibuf);
+ }
- glRasterPos3f(xco, yco, 0.0);
- BMF_DrawString(G.font, str);
- }
+ sa->win_swap= WIN_BACK_OK;
}
void seq_reset_imageofs(SpaceSeq *sseq)
@@ -1043,251 +983,7 @@ void seq_viewmove(SpaceSeq *sseq)
window_set_cursor(win, oldcursor);
}
-#define SEQ_BUT_PLUGIN 1
-#define SEQ_BUT_RELOAD 2
-#define SEQ_BUT_EFFECT 3
-#define SEQ_BUT_RELOAD_ALL 4
-
-void do_seqbuttons(short val)
-{
- Sequence *last_seq = get_last_seq();
-
- switch(val) {
- case SEQ_BUT_PLUGIN:
- case SEQ_BUT_EFFECT:
- update_changed_seq_and_deps(last_seq, 0, 1);
- break;
-
- case SEQ_BUT_RELOAD:
- case SEQ_BUT_RELOAD_ALL:
- update_seq_ipo_rect(last_seq);
- update_seq_icu_rects(last_seq);
-
- free_imbuf_seq(); // frees all
-
- break;
- }
-
- if (val == SEQ_BUT_RELOAD_ALL) {
- allqueue(REDRAWALL, 0);
- } else {
- allqueue(REDRAWSEQ, 0);
- }
-}
-
-static void seq_panel_properties(short cntrl) // SEQ_HANDLER_PROPERTIES
-{
- Sequence *last_seq = get_last_seq();
- uiBlock *block;
-
- block= uiNewBlock(&curarea->uiblocks, "seq_panel_properties", UI_EMBOSS, UI_HELV, curarea->win);
- uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
- uiSetPanelHandler(SEQ_HANDLER_PROPERTIES); // for close and esc
- if(uiNewPanel(curarea, block, "Strip Properties", "Seq", 10, 230, 318, 204)==0) return;
-
- if(last_seq==NULL) return;
-
- if(last_seq->type==SEQ_PLUGIN) {
- PluginSeq *pis;
- VarStruct *varstr;
- int a, xco, yco;
-
- get_sequence_effect(last_seq);/* make sure, plugin is loaded */
-
- uiDefBut(block, LABEL, 0, "Type: Plugin", 10,50,70,20, 0, 0, 0, 0, 0, "");
-
- pis= last_seq->plugin;
- if(pis->vars==0) return;
-
- varstr= pis->varstr;
- if(varstr) {
- for(a=0; a<pis->vars; a++, varstr++) {
- xco= 150*(a/6)+10;
- yco= 125 - 20*(a % 6)+1;
- uiDefBut(block, varstr->type, SEQ_BUT_PLUGIN, varstr->name, xco,yco,150,19, &(pis->data[a]), varstr->min, varstr->max, 100, 0, varstr->tip);
-
- }
- }
- uiDefButBitS(block, TOG, SEQ_IPO_FRAME_LOCKED,
- SEQ_BUT_RELOAD_ALL, "IPO Frame locked",
- 10,-40,150,19, &last_seq->flag,
- 0.0, 1.0, 0, 0,
- "Lock the IPO coordinates to the "
- "global frame counter.");
-
- }
- else if(last_seq->type==SEQ_IMAGE) {
-
- 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,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");
- uiBlockEndAlign(block);
- }
- else if(last_seq->type==SEQ_META) {
-
- uiDefBut(block, LABEL, 0, "Type: Meta", 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, "");
-
- }
- else if(last_seq->type==SEQ_SCENE) {
-
- uiDefBut(block, LABEL, 0, "Type: Scene", 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, "");
- uiDefButS(block, TOG|BIT|7, SEQ_BUT_RELOAD, "Reverse Frames", 10,90,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Reverse frame order");
- }
- else if(last_seq->type==SEQ_MOVIE) {
-
- if(last_seq->mul==0.0) last_seq->mul= 1.0;
-
- uiDefBut(block, LABEL, 0, "Type: Movie", 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, "");
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, SEQ_MAKE_PREMUL, SEQ_BUT_RELOAD, "Make Premul Alpha ", 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");
- 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");
- uiDefButI(block, NUM, SEQ_BUT_RELOAD, "Preseek:", 10,-10,150,19, &last_seq->anim_preseek, 0.0, 50.0, 100, 0, "On MPEG-seeking preseek this many frames");
- uiBlockEndAlign(block);
- }
- else if(last_seq->type==SEQ_RAM_SOUND ||
- last_seq->type==SEQ_HD_SOUND) {
-
- uiDefBut(block, LABEL, 0, "Type: Audio", 10,140,150,20, 0, 0, 0, 0, 0, "");
- uiDefBut(block, TEX, 0, "Name: ", 10,120,150,19, last_seq->name+2, 0.0, 21.0, 100, 0, "");
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, SEQ_IPO_FRAME_LOCKED,
- SEQ_BUT_RELOAD_ALL, "IPO Frame locked",
- 10,90,150,19, &last_seq->flag,
- 0.0, 1.0, 0, 0,
- "Lock the IPO coordinates to the "
- "global frame counter.");
-
- uiDefButBitS(block, TOG, SEQ_MUTE, B_NOP, "Mute", 10,70,120,19, &last_seq->flag, 0.0, 21.0, 100, 0, "");
- uiDefButF(block, NUM, SEQ_BUT_RELOAD, "Gain (dB):", 10,50,150,19, &last_seq->level, -96.0, 6.0, 100, 0, "");
- uiDefButF(block, NUM, SEQ_BUT_RELOAD, "Pan:", 10,30,150,19, &last_seq->pan, -1.0, 1.0, 100, 0, "");
- uiBlockEndAlign(block);
- }
- else if(last_seq->type>=SEQ_EFFECT) {
- uiDefBut(block, LABEL, 0, "Type: Effect", 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, "");
-
- uiDefButBitS(block, TOG, SEQ_IPO_FRAME_LOCKED,
- SEQ_BUT_RELOAD_ALL, "IPO Frame locked",
- 10,90,150,19, &last_seq->flag,
- 0.0, 1.0, 0, 0,
- "Lock the IPO coordinates to the "
- "global frame counter.");
-
- uiBlockBeginAlign(block);
- if(last_seq->type==SEQ_WIPE){
- WipeVars *wipe = (WipeVars *)last_seq->effectdata;
- char formatstring[256];
-
- strncpy(formatstring, "Transition Type %t|Single Wipe%x0|Double Wipe %x1|Iris Wipe %x4|Clock Wipe %x5", 255);
- uiDefButS(block, MENU,SEQ_BUT_EFFECT, formatstring, 10,65,220,22, &wipe->wipetype, 0, 0, 0, 0, "What type of wipe should be performed");
- uiDefButF(block, NUM,SEQ_BUT_EFFECT,"Blur:", 10,40,220,22, &wipe->edgeWidth,0.0,1.0, 1, 2, "The percent width of the blur edge");
- switch(wipe->wipetype){ /*Skip Types that do not require angle*/
- case DO_IRIS_WIPE:
- case DO_CLOCK_WIPE:
- break;
-
- default:
- uiDefButF(block, NUM,SEQ_BUT_EFFECT,"Angle:", 10,15,220,22, &wipe->angle,-90.0,90.0, 1, 2, "The Angle of the Edge");
- }
- uiDefButS(block, TOG,SEQ_BUT_EFFECT,"Wipe In", 10,-10,220,22, &wipe->forward,0,0, 0, 0, "Controls Primary Direction of Wipe");
- }
- else if(last_seq->type==SEQ_GLOW){
- GlowVars *glow = (GlowVars *)last_seq->effectdata;
-
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "Threshold:", 10,70,150,19, &glow->fMini, 0.0, 1.0, 0, 0, "Trigger Intensity");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "Clamp:", 10,50,150,19, &glow->fClamp, 0.0, 1.0, 0, 0, "Brightness limit of intensity");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "Boost factor:", 10,30,150,19, &glow->fBoost, 0.0, 10.0, 0, 0, "Brightness multiplier");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "Blur distance:", 10,10,150,19, &glow->dDist, 0.5, 20.0, 0, 0, "Radius of glow effect");
- uiDefButI(block, NUM, B_NOP, "Quality:", 10,-5,150,19, &glow->dQuality, 1.0, 5.0, 0, 0, "Accuracy of the blur effect");
- uiDefButI(block, TOG, B_NOP, "Only boost", 10,-25,150,19, &glow->bNoComp, 0.0, 0.0, 0, 0, "Show the glow buffer only");
- }
- else if(last_seq->type==SEQ_TRANSFORM){
- TransformVars *transform = (TransformVars *)last_seq->effectdata;
-
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "xScale Start:", 10,70,150,19, &transform->ScalexIni, 0.0, 10.0, 0, 0, "X Scale Start");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "xScale End:", 160,70,150,19, &transform->ScalexFin, 0.0, 10.0, 0, 0, "X Scale End");
- 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");
-
- 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, "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");
-
- 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, "");
- } else if(last_seq->type==SEQ_SPEED){
- SpeedControlVars *sp =
- (SpeedControlVars *)last_seq->effectdata;
-
- uiDefButF(block, NUM, SEQ_BUT_RELOAD, "Global Speed:", 10,70,150,19, &sp->globalSpeed, 0.0, 100.0, 0, 0, "Global Speed");
-
- uiDefButBitI(block, TOG, SEQ_SPEED_INTEGRATE,
- SEQ_BUT_RELOAD,
- "IPO is velocity",
- 10,50,150,19, &sp->flags,
- 0.0, 1.0, 0, 0,
- "Interpret the IPO value as a "
- "velocity instead of a frame number");
-
- uiDefButBitI(block, TOG, SEQ_SPEED_BLEND,
- SEQ_BUT_RELOAD,
- "Enable frame blending",
- 10,30,150,19, &sp->flags,
- 0.0, 1.0, 0, 0,
- "Blend two frames into the "
- "target for a smoother result");
-
- uiDefButBitI(block, TOG, SEQ_SPEED_COMPRESS_IPO_Y,
- SEQ_BUT_RELOAD,
- "IPO value runs from [0..1]",
- 10,10,150,19, &sp->flags,
- 0.0, 1.0, 0, 0,
- "Scale IPO value to get the "
- "target frame number.");
- }
-
- uiBlockEndAlign(block);
- }
-}
static void seq_blockhandlers(ScrArea *sa)
{
@@ -1298,13 +994,6 @@ static void seq_blockhandlers(ScrArea *sa)
uiFreeBlocksWin(&sa->uiblocks, sa->win);
for(a=0; a<SPACE_MAXHANDLER; a+=2) {
- switch(sseq->blockhandler[a]) {
-
- case SEQ_HANDLER_PROPERTIES:
- seq_panel_properties(sseq->blockhandler[a+1]);
- break;
-
- }
/* clear action value for event */
sseq->blockhandler[a+1]= 0;
}
@@ -1373,6 +1062,7 @@ void drawseqspace(ScrArea *sa, void *spacedata)
boundbox_seq();
calc_ipogrid();
+ /* Alternating horizontal stripes */
i= MAX2(1, ((int)G.v2d->cur.ymin)-1);
glBegin(GL_QUADS);
@@ -1409,43 +1099,40 @@ void drawseqspace(ScrArea *sa, void *spacedata)
/* sequences: first deselect */
if(ed) {
- seq= ed->seqbasep->first;
- while(seq) { /* bound box test, dont draw outside the view */
- if (seq->flag & SELECT ||
- MIN2(seq->startdisp, seq->start) > v2d->cur.xmax ||
- MAX2(seq->enddisp, seq->start+seq->len) < v2d->cur.xmin ||
- seq->machine+1.0 < v2d->cur.ymin ||
- seq->machine > v2d->cur.ymax)
- {
- /* dont draw */
- } else {
- draw_seq_strip(seq, sa, sseq);
+ Sequence *last_seq = get_last_seq();
+ int sel = 0, j;
+ int outline_tint;
+ float pixelx = (v2d->cur.xmax - v2d->cur.xmin)/(v2d->mask.xmax - v2d->mask.xmin);
+ /* loop through twice, first unselected, then selected */
+ for (j=0; j<2; j++) {
+ seq= ed->seqbasep->first;
+ if (j==0) outline_tint = -150;
+ else outline_tint = -60;
+
+ while(seq) { /* bound box test, dont draw outside the view */
+ if ( ((seq->flag & SELECT) == sel) ||
+ seq == last_seq ||
+ MIN2(seq->startdisp, seq->start) > v2d->cur.xmax ||
+ MAX2(seq->enddisp, seq->start+seq->len) < v2d->cur.xmin ||
+ seq->machine+1.0 < v2d->cur.ymin ||
+ seq->machine > v2d->cur.ymax)
+ {
+ /* dont draw */
+ } else {
+ draw_seq_strip(seq, sa, sseq, outline_tint, pixelx);
+ }
+ seq= seq->next;
}
- seq= seq->next;
+ sel= SELECT; /* draw selected next time round */
}
- }
- ed= G.scene->ed;
- if(ed) {
- seq= ed->seqbasep->first;
- while(seq) { /* bound box test, dont draw outside the view */
- if (!(seq->flag & SELECT) ||
- MIN2(seq->startdisp, seq->start) > v2d->cur.xmax ||
- MAX2(seq->enddisp, seq->start+seq->len) < v2d->cur.xmin ||
- seq->machine+1.0 < v2d->cur.ymin ||
- seq->machine > v2d->cur.ymax)
- {
- /* dont draw */
- } else {
- draw_seq_strip(seq, sa, sseq);
- }
- seq= seq->next;
+ /* draw the last selected last, removes some overlapping error */
+ if (last_seq) {
+ draw_seq_strip(last_seq, sa, sseq, 120, pixelx);
}
}
- draw_extra_seqinfo();
-
/* Draw markers */
- draw_markers_timespace(1);
+ draw_markers_timespace(SCE_MARKERS, DRAW_MARKERS_LINES);
/* restore viewport */
mywinset(sa->win);
diff --git a/source/blender/src/drawsound.c b/source/blender/src/drawsound.c
index e5b1026e72a..4fff327c5bb 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);
@@ -174,8 +176,8 @@ static void draw_cfra_sound(SpaceSound *ssound)
vec[0]*= G.scene->r.framelen;
vec[1]= G.v2d->cur.ymin;
- glColor3ub(0x20, 0x90, 0x20);
- glLineWidth(4.0);
+ BIF_ThemeColor(TH_CFRAME);
+ glLineWidth(2.0);
glBegin(GL_LINE_STRIP);
glVertex2fv(vec);
@@ -184,7 +186,6 @@ static void draw_cfra_sound(SpaceSound *ssound)
glEnd();
glLineWidth(1.0);
-
}
void drawsoundspace(ScrArea *sa, void *spacedata)
@@ -219,7 +220,7 @@ void drawsoundspace(ScrArea *sa, void *spacedata)
}
draw_cfra_sound(spacedata);
- draw_markers_timespace(0);
+ draw_markers_timespace(SCE_MARKERS, 0);
/* restore viewport */
mywinset(curarea->win);
diff --git a/source/blender/src/drawtext.c b/source/blender/src/drawtext.c
index 1ea29886850..b4026746a35 100644
--- a/source/blender/src/drawtext.c
+++ b/source/blender/src/drawtext.c
@@ -167,15 +167,13 @@ void free_txt_data(void) {
if (temp_char_accum) MEM_freeN(temp_char_accum);
}
-static int render_string (char *in) {
- SpaceText *st= curarea->spacedata.first;
+static int render_string (SpaceText *st, char *in) {
int r = 0, i = 0;
while(*in) {
if (*in=='\t') {
if (temp_char_pos && *(in-1)=='\t') i= st->tabnumber;
else if (st->tabnumber > 0) i= st->tabnumber - (temp_char_pos%st->tabnumber);
-
while(i--) temp_char_write(' ', r);
} else temp_char_write(*in, r);
@@ -188,9 +186,8 @@ static int render_string (char *in) {
return r;
}
-void get_format_string(void)
+void get_format_string(SpaceText *st)
{
- SpaceText *st = curarea->spacedata.first;
Text *text = st->text;
TextLine *tmp;
char *in_line;
@@ -538,7 +535,7 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
char *in;
int *acc;
- w= render_string(str);
+ w= render_string(st, str);
if(w<cshift ) return 0; /* String is shorter than shift */
in= temp_char_buf+cshift;
@@ -630,7 +627,7 @@ static void set_cursor_to_pos (SpaceText *st, int x, int y, int sel)
if (x<0) x= 0;
x = (x/spacetext_get_fontwidth(st)) + st->left;
- w= render_string((*linep)->line);
+ w= render_string(st, (*linep)->line);
if(x<w) *charp= temp_char_accum[x];
else *charp= (*linep)->len;
@@ -725,45 +722,100 @@ static void draw_cursor(SpaceText *st) {
static void calc_text_rcts(SpaceText *st)
{
- short barheight, barstart;
- int lbarstart, lbarh, ltexth;
-
- lbarstart= st->top;
- lbarh= st->viewlines;
- ltexth= txt_get_span(st->text->lines.first, st->text->lines.last)+1;
-
- barheight= (lbarh*(curarea->winy-4))/ltexth;
- if (barheight<20) barheight=20;
+ int lhlstart, lhlend, ltexth;
+ short barheight, barstart, hlstart, hlend, blank_lines;
+ short pix_available, pix_top_margin, pix_bottom_margin, pix_bardiff;
+
+ pix_top_margin = 8;
+ pix_bottom_margin = 4;
+ pix_available = curarea->winy - pix_top_margin - pix_bottom_margin;
+ ltexth= txt_get_span(st->text->lines.first, st->text->lines.last);
+ blank_lines = st->viewlines / 2;
+
+ /* when resizing a vieport with the bar at the bottom to a greater height more blank lines will be added */
+ if (ltexth + blank_lines < st->top + st->viewlines) {
+ blank_lines = st->top + st->viewlines - ltexth;
+ }
- barstart= (lbarstart*(curarea->winy-4))/ltexth + 8;
+ ltexth += blank_lines;
+
+ barheight = (st->viewlines*pix_available) / ltexth;
+ pix_bardiff = 0;
+ if (barheight < 20) {
+ pix_bardiff = 20 - barheight; /* take into account the now non-linear sizing of the bar */
+ barheight = 20;
+ }
+ barstart = ((pix_available - pix_bardiff) * st->top) / ltexth;
- st->txtbar.xmin= 5;
- st->txtbar.xmax= 17;
- st->txtbar.ymax= curarea->winy - barstart;
- st->txtbar.ymin= st->txtbar.ymax - barheight;
+ st->txtbar.xmin = 5;
+ st->txtbar.xmax = 17;
+ st->txtbar.ymax = curarea->winy - pix_top_margin - barstart;
+ st->txtbar.ymin = st->txtbar.ymax - barheight;
- CLAMP(st->txtbar.ymin, 2, curarea->winy-2);
- CLAMP(st->txtbar.ymax, 2, curarea->winy-2);
+ CLAMP(st->txtbar.ymin, pix_bottom_margin, curarea->winy - pix_top_margin);
+ CLAMP(st->txtbar.ymax, pix_bottom_margin, curarea->winy - pix_top_margin);
- st->pix_per_line= (float) ltexth/curarea->winy;
+ st->pix_per_line= (float) ltexth/pix_available;
if (st->pix_per_line<.1) st->pix_per_line=.1f;
- lbarstart= MIN2(txt_get_span(st->text->lines.first, st->text->curl),
+ lhlstart = MIN2(txt_get_span(st->text->lines.first, st->text->curl),
txt_get_span(st->text->lines.first, st->text->sell));
- lbarh= abs(txt_get_span(st->text->lines.first, st->text->curl)-txt_get_span(st->text->lines.first, st->text->sell));
-
- barheight= (lbarh*(curarea->winy-4))/ltexth;
- if (barheight<2) barheight=2;
-
- barstart= (lbarstart*(curarea->winy-4))/ltexth + 8;
+ lhlend = MAX2(txt_get_span(st->text->lines.first, st->text->curl),
+ txt_get_span(st->text->lines.first, st->text->sell));
+
+ hlstart = (lhlstart * pix_available) / ltexth;
+ hlend = (lhlend * pix_available) / ltexth;
+
+ /* the scrollbar is non-linear sized */
+ if (pix_bardiff > 0) {
+ /* the start of the highlight is in the current viewport */
+ if (lhlstart >= st->top && lhlstart <= st->top + st->viewlines) {
+ /* speed the progresion of the start of the highlight through the scrollbar */
+ hlstart = ( ( (pix_available - pix_bardiff) * lhlstart) / ltexth) + (pix_bardiff * (lhlstart - st->top) / st->viewlines);
+ }
+ else if (lhlstart > st->top + st->viewlines && hlstart < barstart + barheight && hlstart > barstart) {
+ /* push hl start down */
+ hlstart = barstart + barheight;
+ }
+ else if (lhlend > st->top && lhlstart < st->top && hlstart > barstart) {
+ /*fill out start */
+ hlstart = barstart;
+ }
+
+ if (hlend <= hlstart) {
+ hlend = hlstart + 2;
+ }
+
+ /* the end of the highlight is in the current viewport */
+ if (lhlend >= st->top && lhlend <= st->top + st->viewlines) {
+ /* speed the progresion of the end of the highlight through the scrollbar */
+ hlend = (((pix_available - pix_bardiff )*lhlend)/ltexth) + (pix_bardiff * (lhlend - st->top)/st->viewlines);
+ }
+ else if (lhlend < st->top && hlend >= barstart - 2 && hlend < barstart + barheight) {
+ /* push hl end up */
+ hlend = barstart;
+ }
+ else if (lhlend > st->top + st->viewlines && lhlstart < st->top + st->viewlines && hlend < barstart + barheight) {
+ /* fill out end */
+ hlend = barstart + barheight;
+ }
+
+ if (hlend <= hlstart) {
+ hlstart = hlend - 2;
+ }
+ }
+
+ if (hlend - hlstart < 2) {
+ hlend = hlstart + 2;
+ }
st->txtscroll.xmin= 5;
st->txtscroll.xmax= 17;
- st->txtscroll.ymax= curarea->winy-barstart;
- st->txtscroll.ymin= st->txtscroll.ymax - barheight;
+ st->txtscroll.ymax= curarea->winy - pix_top_margin - hlstart;
+ st->txtscroll.ymin= curarea->winy - pix_top_margin - hlend;
- CLAMP(st->txtscroll.ymin, 2, curarea->winy-2);
- CLAMP(st->txtscroll.ymax, 2, curarea->winy-2);
+ CLAMP(st->txtscroll.ymin, pix_bottom_margin, curarea->winy - pix_top_margin);
+ CLAMP(st->txtscroll.ymax, pix_bottom_margin, curarea->winy - pix_top_margin);
}
static void draw_textscroll(SpaceText *st)
@@ -941,6 +993,8 @@ void drawtextspace(ScrArea *sa, void *spacedata)
float col[3];
int linecount = 0;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
BIF_GetThemeColor3fv(TH_BACK, col);
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
@@ -975,7 +1029,7 @@ void drawtextspace(ScrArea *sa, void *spacedata)
if(st->showsyntax) {
if (tmp && !tmp->format) {
- get_format_string();
+ get_format_string(st);
}
}
@@ -1025,13 +1079,12 @@ void pop_space_text (SpaceText *st)
if (st->left <0) st->left= 0;
}
-void add_text_fs(char *file)
+void add_text_fs(char *file) /* bad but cant pass an as arg here */
{
SpaceText *st= curarea->spacedata.first;
Text *text;
- if (!st) return;
- if (st->spacetype != SPACE_TEXT) return;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
text= add_text(file);
@@ -1039,7 +1092,7 @@ void add_text_fs(char *file)
st->top= 0;
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
allqueue(REDRAWTEXT, 0);
allqueue(REDRAWHEADERS, 0);
}
@@ -1411,9 +1464,11 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
short val= evt->val;
char ascii= evt->ascii;
SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ Text *text;
int do_draw=0, p;
-
+
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
/* smartass code to prevent the CTRL/ALT events below from not working! */
if(G.qual & (LR_ALTKEY|LR_CTRLKEY))
if(!ispunct(ascii))
@@ -1525,7 +1580,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
} else if (ascii) {
if (txt_add_char(text, ascii)) {
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
pop_space_text(st);
do_draw= 1;
}
@@ -1557,11 +1612,11 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
txt_order_cursors(text);
uncomment(text);
do_draw = 1;
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
break;
} else if (G.qual == LR_CTRLKEY) {
txt_delete_char(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
pop_space_text(st);
}
@@ -1579,7 +1634,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case 2:
txt_paste(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
break;
case 3:
@@ -1667,7 +1722,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if (okee("Reopen text")) {
if (!reopen_text(text))
error("Could not reopen file");
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
}
do_draw= 1;
}
@@ -1711,7 +1766,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
if (G.qual == LR_ALTKEY) {
txt_do_undo(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
}
break; /* BREAK U */
@@ -1745,7 +1800,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
txt_paste_clipboard(text);
else
txt_paste(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
pop_space_text(st);
}
@@ -1753,7 +1808,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case XKEY:
if (G.qual == LR_ALTKEY || G.qual == LR_CTRLKEY) {
txt_cut_sel(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
pop_space_text(st);
}
@@ -1765,7 +1820,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
} else {
txt_do_undo(text);
}
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
}
break;
@@ -1784,7 +1839,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
txt_add_char(text, '\t');
}
}
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
pop_space_text(st);
do_draw= 1;
st->currtab_set = setcurr_tab(text);
@@ -1803,20 +1858,20 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
}
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
pop_space_text(st);
break;
case BACKSPACEKEY:
txt_backspace_char(text);
set_tabs(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
pop_space_text(st);
break;
case DELKEY:
txt_delete_char(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
do_draw= 1;
pop_space_text(st);
st->currtab_set = setcurr_tab(text);
@@ -2083,18 +2138,18 @@ void convert_tabs (struct SpaceText *st, int tab)
//first convert to all space, this make it alot easier to convert to tabs because there is no mixtures of ' ' && '\t'
while(tmp) {
check_line = tmp->line;
- new_line = MEM_mallocN(render_string(check_line)+1, "Converted_Line");
- format = MEM_mallocN(render_string(check_line)+1, "Converted_Syntax_format");
+ new_line = MEM_mallocN(render_string(st, check_line)+1, "Converted_Line");
+ format = MEM_mallocN(render_string(st, check_line)+1, "Converted_Syntax_format");
j = 0;
for (a=0; a < strlen(check_line); a++) { //foreach char in line
if(check_line[a] == '\t') { //checking for tabs
//get the number of spaces this tabs is showing
//i dont like doing it this way but will look into it later
new_line[j] = '\0';
- number = render_string(new_line);
+ number = render_string(st, new_line);
new_line[j] = '\t';
new_line[j+1] = '\0';
- number = render_string(new_line)-number;
+ number = render_string(st, new_line)-number;
for(extra = 0; extra < number; extra++) {
new_line[j] = ' ';
j++;
diff --git a/source/blender/src/drawtime.c b/source/blender/src/drawtime.c
index 9ad24b54ad8..039184a0e43 100644
--- a/source/blender/src/drawtime.c
+++ b/source/blender/src/drawtime.c
@@ -39,6 +39,7 @@
#include "BLI_arithb.h"
#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
#include "DNA_ipo_types.h"
#include "DNA_object_types.h"
#include "DNA_material_types.h"
@@ -64,15 +65,28 @@
#include "BIF_language.h"
#include "BSE_drawipo.h"
+#include "BSE_time.h"
#include "BSE_view.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 *);
-
+/* draws a current frame indicator for the TimeLine */
static void draw_cfra_time(SpaceTime *stime)
{
float vec[2];
@@ -81,7 +95,7 @@ static void draw_cfra_time(SpaceTime *stime)
vec[0]*= G.scene->r.framelen;
vec[1]= G.v2d->cur.ymin;
- glColor3ub(0x60, 0xc0, 0x40); // no theme, should be global color once...
+ BIF_ThemeColor(TH_CFRAME); // no theme, should be global color once...
glLineWidth(3.0);
glBegin(GL_LINES);
@@ -112,45 +126,45 @@ static void draw_cfra_time(SpaceTime *stime)
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
if(stime->flag & TIME_DRAWFRAMES)
- sprintf(str, " %d", (G.scene->r.cfra));
- else sprintf(str, " %.2f", (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);
- 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);
+ view2d_getscale(G.v2d, &xscale, &yscale);
/* 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);
- printf("%f -- %f\n", xscale, yscale);
glScalef(xscale, yscale, 1.0);
}
-
}
-static void draw_marker(TimeMarker *marker, int lines)
+/* ---------- */
+
+/* function to draw markers */
+static void draw_marker(TimeMarker *marker, int flag)
{
float xpos, ypixels, xscale, yscale;
+ int icon_id= 0;
xpos = marker->frame;
/* no time correction for framelen! space is drawn with old values */
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);
-
+ view2d_getscale(G.v2d, &xscale, &yscale);
+
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) {
+ if (flag & DRAW_MARKERS_LINES) {
setlinestyle(3);
if(marker->flag & SELECT)
glColor4ub(255,255,255, 96);
@@ -165,14 +179,20 @@ static void draw_marker(TimeMarker *marker, int lines)
}
/* 5 px to offset icon to align properly, space / pixels corrects for zoom */
- if(marker->flag & SELECT)
- BIF_icon_draw(xpos*xscale-5.0, 12.0, ICON_MARKER_HLT);
- else
- BIF_icon_draw(xpos*xscale-5.0, 12.0, ICON_MARKER);
+ if (flag & DRAW_MARKERS_LOCAL) {
+ icon_id= (marker->flag & ACTIVE) ? ICON_PMARKER_ACT :
+ (marker->flag & SELECT) ? ICON_PMARKER_SEL :
+ ICON_PMARKER;
+ }
+ else {
+ icon_id= (marker->flag & SELECT) ? ICON_MARKER_HLT :
+ ICON_MARKER;
+ }
+ BIF_icon_draw(xpos*xscale-5.0, 12.0, icon_id);
glBlendFunc(GL_ONE, GL_ZERO);
glDisable(GL_BLEND);
-
+
/* and the marker name too, shifted slightly to the top-right */
if(marker->name && marker->name[0]) {
if(marker->flag & SELECT) {
@@ -191,24 +211,27 @@ static void draw_marker(TimeMarker *marker, int lines)
glScalef(xscale, yscale, 1.0);
}
-static void draw_markers_time(int lines)
+/* Draw Scene-Markers for the TimeLine */
+static void draw_markers_time(int flag)
{
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, lines);
+ for (marker= G.scene->markers.first; marker; marker= marker->next) {
+ if (!(marker->flag & SELECT)) draw_marker(marker, flag);
}
/* 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, lines);
+ * (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, flag);
}
}
-void draw_markers_timespace(int lines)
+/* Draw specified set of markers for Animation Editors */
+void draw_markers_timespace(ListBase *markers, int flag)
{
TimeMarker *marker;
float yspace, ypixels;
@@ -222,21 +245,21 @@ void draw_markers_timespace(int lines)
glTranslatef(0.0f, -11.0*yspace/ypixels, 0.0f);
/* 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, lines);
+ for (marker= markers->first; marker; marker= marker->next) {
+ if (!(marker->flag & SELECT)) draw_marker(marker, flag);
}
/* 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, lines);
+ for (marker= markers->first; marker; marker= marker->next) {
+ if (marker->flag & SELECT) draw_marker(marker, flag);
}
glTranslatef(0.0f, -G.v2d->cur.ymin, 0.0f);
glTranslatef(0.0f, 11.0*yspace/ypixels, 0.0f);
-
}
+
void draw_anim_preview_timespace()
{
/* only draw this if preview range is set */
@@ -277,23 +300,95 @@ static void draw_sfra_efra()
glDisable(GL_BLEND);
}
-/*draw all the keys in a list (elems) as lines */
-static void draw_key_list(ListBase elems, char col[3])
+static void draw_mapoldnew()
{
- CfraElem *ce;
- float drawframe;
+ 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);
- ce= elems.first;
- while(ce) {
- drawframe = ce->cfra; //not correct for G.scene->r.framelen;
- glColor3ub(col[0], col[1], col[2]);
+ glDisable(GL_POLYGON_STIPPLE);
+}
- fdrawline(drawframe, G.v2d->cur.ymin, drawframe, G.v2d->cur.ymax);
-
- ce= ce->next;
+
+static void draw_ipo_keys(Ipo *ipo, char col[3])
+{
+ IpoCurve *icu;
+ int nvert;
+ int i;
+ int lbound, ubound;
+ int idx;
+ int diff;
+ float t;
+ float drawnext; /* next time to begin drawing new keyframes */
+
+ float space = G.v2d->cur.xmax - G.v2d->cur.xmin;
+ float pixels = G.v2d->mask.xmax-G.v2d->mask.xmin;
+ float spaceperpix = 1; /* amount of time occupied per pixel */
+
+ if (pixels > 0)
+ spaceperpix = space / pixels;
+
+ glColor3ub(col[0], col[1], col[2]);
+ glBegin(GL_LINES);
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ if (icu->flag & IPO_VISIBLE) {
+ if (icu->bezt) {
+ nvert= icu->totvert;
+
+ if (nvert > 0)
+ drawnext = icu->bezt[0].vec[1][0];
+ else
+ continue;
+
+ /* binary search for beginning of the visible keys */
+ lbound = 0;
+ ubound = nvert;
+ while (ubound - lbound > 1) {
+ diff = (ubound - lbound) / 2;
+ idx = lbound + diff;
+ t= icu->bezt[idx].vec[1][0];
+ if (t < G.v2d->cur.xmin)
+ lbound += diff;
+ else
+ ubound = lbound + diff;
+ }
+
+ for (i = lbound; i < nvert; i++) {
+ t= icu->bezt[i].vec[1][0];
+
+ /* dont do anymore draw tests after we draw the last visible key */
+ if (t > G.v2d->cur.xmax)
+ break;
+ /* avoid repeatedly drawing lines on the same pixel */
+ if (t < drawnext)
+ continue;
+
+ glVertex2f(t, G.v2d->cur.ymin);
+ glVertex2f(t, G.v2d->cur.ymax);
+
+ drawnext = t + spaceperpix;
+ }
+ }
+ }
}
+
+ glEnd();
}
+
/* 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.
@@ -302,7 +397,6 @@ static void draw_ob_keys()
{
/* mostly copied from drawobject.c, draw_object() */
SpaceTime *stime= curarea->spacedata.first;
- ListBase elems= {0, 0};
Object *ob= OBACT;
short filter, ok;
@@ -312,15 +406,9 @@ static void draw_ob_keys()
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);
+ draw_ipo_keys(ob->ipo, col);
}
/* Object's Action block - may be filtered in some cases */
@@ -342,13 +430,8 @@ static void draw_ob_keys()
/* convert the ipo to a list of 'current frame elements' */
if (achan->ipo && ok) {
- 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);
+ draw_ipo_keys(achan->ipo, col);
}
}
}
@@ -365,13 +448,8 @@ static void draw_ob_keys()
else ok= 1;
if (ma && ma->ipo && ok) {
- 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);
+ draw_ipo_keys(ma->ipo, col);
}
}
}
@@ -394,6 +472,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();
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index 9777415fc0a..344fda5eef9 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -70,7 +70,10 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_force.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"
@@ -100,8 +103,12 @@
#include "BKE_key.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
+#include "BKE_pointcache.h"
#include "BKE_scene.h"
+#include "BKE_sculpt.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -110,6 +117,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"
@@ -117,6 +125,7 @@
#include "BIF_mywindow.h"
#include "BIF_poseobject.h"
#include "BIF_previewrender.h"
+#include "BIF_radialcontrol.h"
#include "BIF_resources.h"
#include "BIF_retopo.h"
#include "BIF_screen.h"
@@ -1400,6 +1409,11 @@ static void draw_view_axis(void)
float dx, dy;
float h, s, v;
+ /* thickness of lines is proportional to k */
+ /* (log(k)-1) gives a more suitable thickness, but fps decreased by about 3 fps */
+ glLineWidth(k / 10);
+ //glLineWidth(log(k)-1); // a bit slow
+
BIF_GetThemeColor3ubv(TH_GRID, (char *)gridcol);
/* X */
@@ -1464,6 +1478,9 @@ static void draw_view_axis(void)
glRasterPos2i(start + dx + 2, start + dy + ydisp + 2);
BMF_DrawString(G.fonts, "z");
}
+
+ /* restore line-width */
+ glLineWidth(1.0);
}
@@ -1509,8 +1526,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";
@@ -1574,7 +1591,7 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
if(ob->type==OB_MESH) {
eve= em->verts.first;
while(eve) {
- if(eve->f & 1) {
+ if(eve->f & SELECT) {
evedef= eve;
tot++;
VecAddf(median, median, eve->co);
@@ -1630,18 +1647,18 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if(bezt->f2 & 1) {
+ if(bezt->f2 & SELECT) {
VecAddf(median, median, bezt->vec[1]);
tot++;
median[4]+= bezt->weight;
totweight++;
}
else {
- if(bezt->f1 & 1) {
+ if(bezt->f1 & SELECT) {
VecAddf(median, median, bezt->vec[0]);
tot++;
}
- if(bezt->f3 & 1) {
+ if(bezt->f3 & SELECT) {
VecAddf(median, median, bezt->vec[2]);
tot++;
}
@@ -1653,7 +1670,7 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- if(bp->f1 & 1) {
+ if(bp->f1 & SELECT) {
VecAddf(median, median, bp->vec);
median[3]+= bp->vec[3];
totw++;
@@ -1697,17 +1714,15 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
Mat4MulVecfl(ob->obmat, median);
if(block) { // buttons
-
+ int but_y;
+ if((ob->parent) && (ob->partype == PARBONE)) but_y = 135;
+ else but_y = 150;
+
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");
- uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Local", 230, 135, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays local values");
- }
- else {
- uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Global", 160, 150, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays global values");
- uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Local", 230, 150, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays local values");
- }
-
+ uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Global", 160, but_y, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays global values");
+ uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Local", 230, but_y, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays local values");
+ uiBlockEndAlign(block);
+
memcpy(tfp->ve_median, median, sizeof(tfp->ve_median));
uiBlockBeginAlign(block);
@@ -1742,6 +1757,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)
@@ -1763,7 +1787,7 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
eve= em->verts.first;
while(eve) {
- if(eve->f & 1) {
+ if(eve->f & SELECT) {
VecAddf(eve->co, eve->co, median);
}
eve= eve->next;
@@ -1796,17 +1820,17 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if(bezt->f2 & 1) {
+ if(bezt->f2 & SELECT) {
VecAddf(bezt->vec[0], bezt->vec[0], median);
VecAddf(bezt->vec[1], bezt->vec[1], median);
VecAddf(bezt->vec[2], bezt->vec[2], median);
bezt->weight+= median[4];
}
else {
- if(bezt->f1 & 1) {
+ if(bezt->f1 & SELECT) {
VecAddf(bezt->vec[0], bezt->vec[0], median);
}
- if(bezt->f3 & 1) {
+ if(bezt->f3 & SELECT) {
VecAddf(bezt->vec[2], bezt->vec[2], median);
}
}
@@ -1817,7 +1841,7 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- if(bp->f1 & 1) {
+ if(bp->f1 & SELECT) {
VecAddf(bp->vec, bp->vec, median);
bp->vec[3]+= median[3];
bp->weight+= median[4];
@@ -2213,9 +2237,83 @@ void do_viewbuts(unsigned short event)
allqueue(REDRAWVIEW3D, 1);
}
break;
+ case B_TRANSFORMSPACEADD:
+ BIF_manageTransformOrientation(1, 0);
+ allqueue(REDRAWVIEW3D, 1);
+ break;
+ case B_TRANSFORMSPACECLEAR:
+ BIF_clearTransformOrientation();
+ allqueue(REDRAWVIEW3D, 1);
}
}
+void removeTransformOrientation_func(void *target, void *unused)
+{
+ BIF_removeTransformOrientation((TransformOrientation *) target);
+}
+
+void selectTransformOrientation_func(void *target, void *unused)
+{
+ BIF_selectTransformOrientation((TransformOrientation *) target);
+}
+
+static void view3d_panel_transform_spaces(short cntrl)
+{
+ ListBase *transform_spaces = &G.scene->transform_spaces;
+ TransformOrientation *ts = transform_spaces->first;
+ uiBlock *block;
+ uiBut *but;
+ int xco = 20, yco = 70, height = 140;
+ int index;
+
+ block= uiNewBlock(&curarea->uiblocks, "view3d_panel_transform", UI_EMBOSS, UI_HELV, curarea->win);
+ uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
+ uiSetPanelHandler(VIEW3D_HANDLER_TRANSFORM); // for close and esc
+
+ if(uiNewPanel(curarea, block, "Transform Orientations", "View3d", 10, 230, 318, height)==0) return;
+
+ uiNewPanelHeight(block, height);
+
+ uiBlockBeginAlign(block);
+
+ if (G.obedit)
+ uiDefBut(block, BUT, B_TRANSFORMSPACEADD, "Add", xco,120,80,20, 0, 0, 0, 0, 0, "Add the selected element as a Transform Orientation");
+ else
+ uiDefBut(block, BUT, B_TRANSFORMSPACEADD, "Add", xco,120,80,20, 0, 0, 0, 0, 0, "Add the active object as a Transform Orientation");
+
+ uiDefBut(block, BUT, B_TRANSFORMSPACECLEAR, "Clear", xco + 80,120,80,20, 0, 0, 0, 0, 0, "Removal all Transform Orientations");
+
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+
+ uiDefButS(block, ROW, REDRAWHEADERS, "Global", xco, 90, 40,20, &G.vd->twmode, 5.0, (float)V3D_MANIP_GLOBAL,0, 0, "Global Transform Orientation");
+ uiDefButS(block, ROW, REDRAWHEADERS, "Local", xco + 40, 90, 40,20, &G.vd->twmode, 5.0, (float)V3D_MANIP_LOCAL, 0, 0, "Local Transform Orientation");
+ uiDefButS(block, ROW, REDRAWHEADERS, "Normal", xco + 80, 90, 40,20, &G.vd->twmode, 5.0, (float)V3D_MANIP_NORMAL,0, 0, "Normal Transform Orientation");
+ uiDefButS(block, ROW, REDRAWHEADERS, "View", xco + 120, 90, 40,20, &G.vd->twmode, 5.0, (float)V3D_MANIP_VIEW, 0, 0, "View Transform Orientation");
+
+ for (index = V3D_MANIP_CUSTOM, ts = transform_spaces->first ; ts ; ts = ts->next, index++) {
+
+ BIF_ThemeColor(TH_BUT_ACTION);
+ if (G.vd->twmode == index) {
+ but = uiDefIconButS(block,ROW, REDRAWHEADERS, ICON_CHECKBOX_HLT, xco,yco,XIC,YIC, &G.vd->twmode, 5.0, (float)index, 0, 0, "Use this Custom Transform Orientation");
+ }
+ else {
+ but = uiDefIconButS(block,ROW, REDRAWHEADERS, ICON_CHECKBOX_DEHLT, xco,yco,XIC,YIC, &G.vd->twmode, 5.0, (float)index, 0, 0, "Use this Custom Transform Orientation");
+ }
+ uiButSetFunc(but, selectTransformOrientation_func, ts, NULL);
+ uiDefBut(block, TEX, 0, "", xco+=XIC, yco,100+XIC,20, &ts->name, 0, 30, 0, 0, "Edits the name of this Transform Orientation");
+ but = uiDefIconBut(block, BUT, REDRAWVIEW3D, ICON_X, xco+=100+XIC,yco,XIC,YIC, 0, 0, 0, 0, 0, "Deletes this Transform Orientation");
+ uiButSetFunc(but, removeTransformOrientation_func, ts, NULL);
+
+ xco = 20;
+ yco -= 25;
+ }
+ uiBlockEndAlign(block);
+
+ if(yco < 0) uiNewPanelHeight(block, height-yco);
+}
+
static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
{
@@ -2237,10 +2335,18 @@ 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, 318, 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);
+ uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) {
uiBlockSetFlag(block, UI_BLOCK_FRONTBUFFER); // force old style frontbuffer draw
@@ -2254,16 +2360,18 @@ static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
uiButSetFunc(bt, test_idbutton_cb, ob->id.name, NULL);
#endif
- 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, "");
+ 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);
}
- uiBlockEndAlign(block);
}
lim= 10000.0f*MAX2(1.0, G.vd->grid);
@@ -2297,6 +2405,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;
@@ -2538,6 +2649,9 @@ static void view3d_blockhandlers(ScrArea *sa)
case VIEW3D_HANDLER_PREVIEW:
view3d_panel_preview(sa, v3d->blockhandler[a+1]);
break;
+ case VIEW3D_HANDLER_TRANSFORM:
+ view3d_panel_transform_spaces(v3d->blockhandler[a+1]);
+ break;
}
/* clear action value for event */
v3d->blockhandler[a+1]= 0;
@@ -2630,10 +2744,6 @@ static void draw_dupli_objects_color(View3D *v3d, Base *base, int color)
if (base->object->restrictflag & OB_RESTRICT_VIEW) return;
- /* test if we can do a displist */
- if(base->object->transflag & OB_DUPLIGROUP)
- use_displist= 0;
-
tbase.flag= OB_FROMDUPLI|base->flag;
lb= object_duplilist(G.scene, base->object);
@@ -2662,7 +2772,7 @@ static void draw_dupli_objects_color(View3D *v3d, Base *base, int color)
if(use_displist == -1) {
/* lamp drawing messes with matrices, could be handled smarter... but this works */
- if(dob->ob->type==OB_LAMP)
+ if(dob->ob->type==OB_LAMP || dob->type==OB_DUPLIGROUP)
use_displist= 0;
else {
/* disable boundbox check for list creation */
@@ -2747,6 +2857,40 @@ void view3d_update_depths(View3D *v3d)
}
}
+/* Enable sculpting in wireframe mode by drawing sculpt object only to the depth buffer */
+static void draw_sculpt_depths(View3D *v3d)
+{
+ Object *ob = OBACT;
+
+ int dt= MIN2(v3d->drawtype, ob->dt);
+ if(v3d->zbuf==0 && dt>OB_WIRE)
+ dt= OB_WIRE;
+ if(dt == OB_WIRE) {
+ GLboolean depth_on;
+ int orig_vdt = v3d->drawtype;
+ int orig_zbuf = v3d->zbuf;
+ int orig_odt = ob->dt;
+
+ glGetBooleanv(GL_DEPTH_TEST, &depth_on);
+ v3d->drawtype = ob->dt = OB_SOLID;
+ v3d->zbuf = 1;
+
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glEnable(GL_DEPTH_TEST);
+ draw_object(BASACT, 0);
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ if(!depth_on)
+ glDisable(GL_DEPTH_TEST);
+
+ v3d->drawtype = orig_vdt;
+ v3d->zbuf = orig_zbuf;
+ ob->dt = orig_odt;
+ }
+}
+
+static void draw_viewport_fps(ScrArea *sa);
+
+
void drawview3dspace(ScrArea *sa, void *spacedata)
{
View3D *v3d= spacedata;
@@ -2763,6 +2907,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
@@ -2893,12 +3038,15 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
}
}
- if(!retopo && sculpt && !(obact && (obact->dtx & OB_DRAWXRAY)))
+ if(!retopo && sculpt && !(obact && (obact->dtx & OB_DRAWXRAY))) {
+ draw_sculpt_depths(v3d);
view3d_update_depths(v3d);
+ }
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();
}
@@ -2907,9 +3055,11 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
/* Transp and X-ray afterdraw stuff */
view3d_draw_xray(v3d, 0); // clears zbuffer if it is used!
view3d_draw_transp(v3d, 0);
-
- if(!retopo && sculpt && (obact && (OBACT->dtx & OB_DRAWXRAY)))
+
+ if(!retopo && sculpt && (obact && (OBACT->dtx & OB_DRAWXRAY))) {
+ draw_sculpt_depths(v3d);
view3d_update_depths(v3d);
+ }
if(v3d->flag & V3D_CLIPPING)
view3d_clr_clipping();
@@ -2925,68 +3075,13 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
/* Draw Sculpt Mode brush */
if(!G.obedit && (G.f & G_SCULPTMODE) && area_is_active_area(v3d->area) && sculpt_session()) {
- PropsetData *pd= sculpt_session()->propset;
- short r1=100, r2=100, r3=100;
- short mouse[2];
+ RadialControl *rc= sculpt_session()->radialcontrol;
if(sculpt_data()->flags & SCULPT_INPUT_SMOOTH)
sculpt_stroke_draw();
- if(pd) {
- if(pd->mode == PropsetSize) {
- r1= sculptmode_brush()->size;
- r2= pd->origsize;
- r3= r1;
- } else if(pd->mode == PropsetStrength) {
- r1= 200 - sculptmode_brush()->strength * 2;
- r2= 200;
- r3= 200;
- } else if(pd->mode == PropsetTexRot) {
- r1= r2= 200;
- r3= 200;
- }
-
- /* Draw brush with texture */
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glBindTexture(GL_TEXTURE_2D, pd->tex);
-
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- glPushMatrix();
- glTranslatef(pd->origloc[0], pd->origloc[1], 0);
- glRotatef(tex_angle(), 0, 0, 1);
-
- glEnable(GL_TEXTURE_2D);
- glBegin(GL_QUADS);
- glColor4f(0,0,0,1);
- glTexCoord2f(0,0);
- glVertex2f(-r3, -r3);
- glTexCoord2f(1,0);
- glVertex2f(r3, -r3);
- glTexCoord2f(1,1);
- glVertex2f(r3, r3);
- glTexCoord2f(0,1);
- glVertex2f(-r3, r3);
- glEnd();
- glDisable(GL_TEXTURE_2D);
-
- glPopMatrix();
-
- if(r1 != r2)
- fdrawXORcirc(pd->origloc[0], pd->origloc[1], r1);
- fdrawXORcirc(pd->origloc[0], pd->origloc[1], r2);
-
- if(pd->mode == PropsetTexRot) {
- const float ang= pd->origtexrot * (M_PI/180.0f);
- getmouseco_areawin(mouse);
- sdrawXORline(pd->origloc[0], pd->origloc[1],
- pd->origloc[0]+200*cos(ang), pd->origloc[1]+200*sin(ang));
- sdrawXORline(pd->origloc[0], pd->origloc[1], mouse[0], mouse[1]);
- }
- }
+ if(rc)
+ radialcontrol_draw(rc);
else if(sculpt_data()->flags & SCULPT_DRAW_BRUSH) {
short csc[2], car[2];
getmouseco_sc(csc);
@@ -2998,8 +3093,23 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
fdrawXORcirc((float)car[0], (float)car[1], sculptmode_brush()->size);
}
}
+
+ retopo_paint_view_update(v3d);
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(*PE_radialcontrol())
+ radialcontrol_draw(*PE_radialcontrol());
+ else 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);
@@ -3007,8 +3117,12 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
draw_view_axis();
else
draw_view_icon();
- if(U.uiflag & USER_SHOW_VIEWPORTNAME)
+
+ if(U.uiflag & USER_SHOW_FPS && G.f & G_PLAYANIM) {
+ draw_viewport_fps(sa);
+ } else if(U.uiflag & USER_SHOW_VIEWPORTNAME) {
draw_viewport_name(sa);
+ }
ob= OBACT;
if(ob && (U.uiflag & USER_DRAWVIEWINFO))
@@ -3050,22 +3164,26 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
}
-void drawview3d_render(struct View3D *v3d, int winx, int winy)
+void drawview3d_render(struct View3D *v3d, int winx, int winy, float winmat[][4])
{
Base *base;
Scene *sce;
- float winmat[4][4];
+ float v3dwinmat[4][4];
- update_for_newframe_muted(); /* first, since camera can be animated */
+ if(!winmat)
+ setwinmatrixview3d(winx, winy, NULL);
- setwinmatrixview3d(winx, winy, NULL);
-
setviewmatrixview3d();
myloadmatrix(v3d->viewmat);
+
+ /* when winmat is not NULL, it overrides the regular window matrix */
glMatrixMode(GL_PROJECTION);
- mygetmatrix(winmat);
+ if(winmat)
+ myloadmatrix(winmat);
+ mygetmatrix(v3dwinmat);
glMatrixMode(GL_MODELVIEW);
- Mat4MulMat4(v3d->persmat, v3d->viewmat, winmat);
+
+ Mat4MulMat4(v3d->persmat, v3d->viewmat, v3dwinmat);
Mat4Invert(v3d->persinv, v3d->persmat);
Mat4Invert(v3d->viewinv, v3d->viewmat);
@@ -3177,13 +3295,16 @@ static ScrArea *oldsa;
static double swaptime;
static int curmode;
+/* used for fps display */
+static double redrawtime;
+static double lredrawtime;
+
int update_time(void)
{
static double ltime;
double time;
- if ((U.mixbufsize)
- && (audiostream_pos() != CFRA)
+ if ((audiostream_pos() != CFRA)
&& (G.scene->audio.flag & AUDIO_SYNC)) {
return 0;
}
@@ -3195,6 +3316,31 @@ int update_time(void)
return (tottime < 0.0);
}
+static void draw_viewport_fps(ScrArea *sa)
+{
+ float fps;
+ char printable[16];
+
+
+ if (lredrawtime == redrawtime)
+ return;
+
+ printable[0] = '\0';
+ fps = (float)(1.0/(lredrawtime-redrawtime));
+
+ /* is this more then half a frame behind? */
+ if (fps+0.5 < FPS) {
+ BIF_ThemeColor(TH_REDALERT);
+ sprintf(printable, "fps: %.2f", (float)fps);
+ } else {
+ BIF_ThemeColor(TH_TEXT_HI);
+ sprintf(printable, "fps: %i", (int)(fps+0.5));
+ }
+
+ glRasterPos2i(10, sa->winy-20);
+ BMF_DrawString(G.fonts, printable);
+}
+
static void inner_play_prefetch_frame(int mode, int cfra)
{
ScrArea *sa;
@@ -3256,19 +3402,62 @@ static void inner_play_prefetch_shutdown(int mode)
seq_stop_threads();
}
+static int cached_dynamics(int sfra, int efra)
+{
+ Base *base = G.scene->base.first;
+ Object *ob;
+ ModifierData *md;
+ ParticleSystem *psys;
+ int i, stack_index=-1, cached=1;
+
+ while(base && cached) {
+ ob = base->object;
+ if(ob->softflag & OB_SB_ENABLE && ob->soft) {
+ for(i=0, md=ob->modifiers.first; md; i++, md=md->next) {
+ if(md->type == eModifierType_Softbody) {
+ stack_index = i;
+ break;
+ }
+ }
+ for(i=sfra; i<=efra && cached; i++)
+ cached &= BKE_ptcache_id_exist(&ob->id,i,stack_index);
+ }
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ stack_index = modifiers_indexInObject(ob,(ModifierData*)psys_get_modifier(ob,psys));
+ if(psys->part->type==PART_HAIR) {
+ if(psys->softflag & OB_SB_ENABLE && psys->soft);
+ else
+ stack_index = -1;
+ }
+
+ if(stack_index >= 0)
+ for(i=sfra; i<=efra && cached; i++)
+ cached &= BKE_ptcache_id_exist(&ob->id,i,stack_index);
+ }
+
+ base = base->next;
+ }
+
+ return cached;
+}
void inner_play_anim_loop(int init, int mode)
{
ScrArea *sa;
static int last_cfra = -1;
+ static int cached = 0;
/* init */
if(init) {
oldsa= curarea;
- swaptime= 1.0/(float)G.scene->r.frs_sec;
+ swaptime= 1.0/FPS;
tottime= 0.0;
curmode= mode;
last_cfra = -1;
-
+ cached = cached_dynamics(PSFRA,PEFRA);
+
+ redrawtime = 1.0/FPS;
+ lredrawtime = 0.0;
return;
}
@@ -3344,8 +3533,9 @@ void inner_play_anim_loop(int init, int mode)
CFRA = PSFRA;
audiostream_stop();
audiostream_start( CFRA );
+ cached = cached_dynamics(PSFRA,PEFRA);
} else {
- if (U.mixbufsize
+ if (cached
&& (G.scene->audio.flag & AUDIO_SYNC)) {
CFRA = audiostream_pos();
} else {
@@ -3370,7 +3560,7 @@ int play_anim(int mode)
ScrArea *sa, *oldsa;
int cfraont;
unsigned short event=0;
- short val;
+ short val = 0; /* its possible qtest() wont run and val must be initialized */
/* patch for very very old scenes */
if(SFRA==0) SFRA= 1;
@@ -3400,11 +3590,13 @@ int play_anim(int mode)
/* forces all buffers to be OK for current frame (otherwise other windows get redrawn with CFRA+1) */
curarea->win_swap= WIN_BACK_OK;
screen_swapbuffers();
-
- while(TRUE) {
+ while(TRUE) {
+
+ if (U.uiflag & USER_SHOW_FPS)
+ lredrawtime = PIL_check_seconds_timer();
+
while(qtest()) {
-
/* we test events first because of MKEY event */
event= extern_qread(&val);
@@ -3425,11 +3617,16 @@ int play_anim(int mode)
if(val) add_marker(CFRA-1);
}
}
- if(ELEM3(event, ESCKEY, SPACEKEY, RIGHTMOUSE)) break;
+ if(val && ELEM3(event, ESCKEY, SPACEKEY, RIGHTMOUSE)) break;
inner_play_anim_loop(0, 0);
+
+
screen_swapbuffers();
-
+
+ if (U.uiflag & USER_SHOW_FPS)
+ redrawtime = lredrawtime;
+
if((mode & 2) && CFRA==PEFRA) break; /* no replay */
}
diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c
index 7d784dcecfd..11837cc3433 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"
@@ -425,6 +429,9 @@ int get_border(rcti *rect, short flag)
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
@@ -477,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;
@@ -495,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) {
@@ -723,7 +728,7 @@ void countall()
a= nu->pntsu*nu->pntsv;
while(a--) {
G.totvert++;
- if(bp->f1 & 1) G.totvertsel++;
+ if(bp->f1 & SELECT) G.totvertsel++;
bp++;
}
}
@@ -747,7 +752,7 @@ void countall()
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
while(a--) {
G.totvert++;
- if(bp->f1 & 1) G.totvertsel++;
+ if(bp->f1 & SELECT) G.totvertsel++;
bp++;
}
}
@@ -787,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);
@@ -908,7 +952,7 @@ static void make_trans_verts(float *min, float *max, int mode)
/* I skip it for editmesh now (ton) */
if(G.obedit->type!=OB_MESH) {
countall();
- if(mode) tottrans= G.totvert;
+ if(mode) tottrans= G.totvert;
else tottrans= G.totvertsel;
if(G.totvertsel==0) {
@@ -1033,26 +1077,26 @@ 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 & SELECT)) {
VECCOPY(tv->oldloc, bezt->vec[0]);
tv->loc= bezt->vec[0];
- tv->flag= bezt->f1 & 1;
+ tv->flag= bezt->f1 & SELECT;
tv++;
tottrans++;
}
- if((mode & 1) || (bezt->f2 & 1)) {
+ if((mode & 1) || (bezt->f2 & SELECT)) {
VECCOPY(tv->oldloc, bezt->vec[1]);
tv->loc= bezt->vec[1];
tv->val= &(bezt->alfa);
tv->oldval= bezt->alfa;
- tv->flag= bezt->f2 & 1;
+ tv->flag= bezt->f2 & SELECT;
tv++;
tottrans++;
}
- if((mode & 1) || (bezt->f3 & 1)) {
+ if((mode & 1) || (bezt->f3 & SELECT)) {
VECCOPY(tv->oldloc, bezt->vec[2]);
tv->loc= bezt->vec[2];
- tv->flag= bezt->f3 & 1;
+ tv->flag= bezt->f3 & SELECT;
tv++;
tottrans++;
}
@@ -1065,12 +1109,12 @@ 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 & SELECT)) {
VECCOPY(tv->oldloc, bp->vec);
tv->loc= bp->vec;
tv->val= &(bp->alfa);
tv->oldval= bp->alfa;
- tv->flag= bp->f1 & 1;
+ tv->flag= bp->f1 & SELECT;
tv++;
tottrans++;
}
@@ -1103,11 +1147,11 @@ 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 & SELECT)) {
if(bp->hide==0) {
VECCOPY(tv->oldloc, bp->vec);
tv->loc= bp->vec;
- tv->flag= bp->f1 & 1;
+ tv->flag= bp->f1 & SELECT;
tv++;
tottrans++;
}
@@ -1221,7 +1265,7 @@ void snap_sel_to_grid()
}
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- /* autokeyframing */
+ /* auto-keyframing */
autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
@@ -1231,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];
@@ -1334,7 +1378,7 @@ void snap_sel_to_curs()
}
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- /* autokeyframing */
+ /* auto-keyframing */
autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
@@ -1474,6 +1518,58 @@ void snap_curs_to_sel()
allqueue(REDRAWVIEW3D, 0);
}
+void snap_curs_to_active()
+{
+ float *curs;
+ curs = give_cursor();
+
+ if (G.obedit)
+ {
+ if (G.obedit->type == OB_MESH)
+ {
+ /* check active */
+ if (G.editMesh->selected.last) {
+ EditSelection *ese = G.editMesh->selected.last;
+ if ( ese->type == EDITVERT ) {
+ EditVert *eve = (EditVert *)ese->data;
+ VECCOPY(curs, eve->co);
+ }
+ else if ( ese->type == EDITEDGE ) {
+ EditEdge *eed = (EditEdge *)ese->data;
+ VecAddf(curs, eed->v1->co, eed->v2->co);
+ VecMulf(curs, 0.5f);
+ }
+ else if ( ese->type == EDITFACE ) {
+ EditFace *efa = (EditFace *)ese->data;
+
+ if (efa->v4)
+ {
+ VecAddf(curs, efa->v1->co, efa->v2->co);
+ VecAddf(curs, curs, efa->v3->co);
+ VecAddf(curs, curs, efa->v4->co);
+ VecMulf(curs, 0.25f);
+ }
+ else
+ {
+ VecAddf(curs, efa->v1->co, efa->v2->co);
+ VecAddf(curs, curs, efa->v3->co);
+ VecMulf(curs, 1/3.0f);
+ }
+ }
+ }
+ Mat4MulVecfl(G.obedit->obmat, curs);
+ }
+ }
+ else
+ {
+ if (BASACT)
+ {
+ VECCOPY(curs, BASACT->object->obmat[3]);
+ }
+ }
+ allqueue(REDRAWVIEW3D, 0);
+}
+
void snap_curs_to_firstsel()
{
TransVert *tv;
@@ -1686,7 +1782,7 @@ void snap_to_center()
}
}
- /* autokeyframing */
+ /* 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);
@@ -1732,7 +1828,7 @@ void snapmenu()
{
short event;
- event = pupmenu("Snap %t|Selection -> Grid%x1|Selection -> Cursor%x2|Cursor-> Grid%x3|Cursor-> Selection%x4|Selection-> Center%x5");
+ event = pupmenu("Snap %t|Selection -> Grid%x1|Selection -> Cursor%x2|Cursor-> Grid%x3|Cursor-> Selection%x4|Selection-> Center%x5|Cursor-> Active%x6");
switch (event) {
case 1: /*Selection to grid*/
@@ -1753,6 +1849,10 @@ void snapmenu()
snap_to_center();
BIF_undo_push("Snap selection to center");
break;
+ case 6: /*Cursor to Active*/
+ snap_curs_to_active();
+ BIF_undo_push("Snap selection to center");
+ break;
}
}
@@ -1818,6 +1918,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);
}
@@ -1829,9 +1932,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)
@@ -1868,7 +1971,7 @@ int minmax_verts(float *min, float *max)
tottrans=0;
if ELEM5(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE)
- make_trans_verts(bmat[0], bmat[1], 0);
+ make_trans_verts(bmat[0], bmat[1], 2);
if(tottrans==0) return 0;
Mat3CpyMat4(bmat, G.obedit->obmat);
diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c
index 3957b107814..38be3ccde91 100644
--- a/source/blender/src/editaction.c
+++ b/source/blender/src/editaction.c
@@ -31,6 +31,7 @@
*/
#include <string.h>
+#include <stddef.h>
#include <math.h>
#include "MEM_guardedalloc.h"
@@ -136,7 +137,7 @@ bActionChannel *get_hilighted_action_channel (bAction *action)
return NULL;
for (achan= action->chanbase.first; achan; achan= achan->next) {
- if(VISIBLE_ACHAN(achan)) {
+ if (VISIBLE_ACHAN(achan)) {
if (SEL_ACHAN(achan) && (achan->flag & ACHAN_HILIGHTED))
return achan;
}
@@ -160,9 +161,9 @@ void remake_action_ipos (bAction *act)
testhandles_ipocurve(icu);
}
}
- for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
if (conchan->ipo) {
- for (icu = conchan->ipo->curve.first; icu; icu=icu->next){
+ for (icu = conchan->ipo->curve.first; icu; icu=icu->next) {
sort_time_ipocurve(icu);
testhandles_ipocurve(icu);
}
@@ -198,8 +199,25 @@ bActListElem *make_new_actlistelem (void *data, short datatype, void *owner, sho
ale->owner= owner;
ale->ownertype= ownertype;
+ if ((owner) && (ownertype == ACTTYPE_ACHAN)) {
+ bActionChannel *ochan= (bActionChannel *)owner;
+ ale->grp= ochan->grp;
+ }
+ else
+ ale->grp= NULL;
+
/* do specifics */
switch (datatype) {
+ case ACTTYPE_GROUP:
+ {
+ bActionGroup *agrp= (bActionGroup *)data;
+
+ ale->flag= agrp->flag;
+
+ ale->key_data= NULL;
+ ale->datatype= ALE_GROUP;
+ }
+ break;
case ACTTYPE_ACHAN:
{
bActionChannel *achan= (bActionChannel *)data;
@@ -217,22 +235,36 @@ bActListElem *make_new_actlistelem (void *data, short datatype, void *owner, sho
}
break;
case ACTTYPE_CONCHAN:
+ case ACTTYPE_CONCHAN2:
{
bConstraintChannel *conchan= (bConstraintChannel *)data;
ale->flag= conchan->flag;
- if (conchan->ipo && conchan->ipo->curve.first) {
- /* we assume that constraint ipo blocks only have 1 curve:
- * INFLUENCE, so we pretend that a constraint channel is
- * really just a Ipo-Curve channel instead.
- */
- ale->key_data= conchan->ipo->curve.first;
- ale->datatype= ALE_ICU;
+ if (datatype == ACTTYPE_CONCHAN2) {
+ /* CONCHAN2 is a hack so that constraint-channels keyframes can be edited */
+ if (conchan->ipo) {
+ ale->key_data= conchan->ipo;
+ ale->datatype= ALE_IPO;
+ }
+ else {
+ ale->key_data= NULL;
+ ale->datatype= ALE_NONE;
+ }
}
else {
- ale->key_data= NULL;
- ale->datatype= ALE_NONE;
+ if (conchan->ipo && conchan->ipo->curve.first) {
+ /* we assume that constraint ipo blocks only have 1 curve:
+ * INFLUENCE, so we pretend that a constraint channel is
+ * really just a Ipo-Curve channel instead.
+ */
+ ale->key_data= conchan->ipo->curve.first;
+ ale->datatype= ALE_ICU;
+ }
+ else {
+ ale->key_data= NULL;
+ ale->datatype= ALE_NONE;
+ }
}
}
break;
@@ -275,83 +307,124 @@ bActListElem *make_new_actlistelem (void *data, short datatype, void *owner, sho
}
/* ----------------------------------------- */
-
-static void actdata_filter_action (ListBase *act_data, bAction *act, int filter_mode)
+
+static void actdata_filter_actionchannel (ListBase *act_data, bActionChannel *achan, int filter_mode)
{
bActListElem *ale;
- bActionChannel *achan;
bConstraintChannel *conchan;
IpoCurve *icu;
- /* loop over action channels, performing the necessary checks */
- for (achan= act->chanbase.first; achan; achan= achan->next) {
- /* only work with this channel and its subchannels if it is visible */
- if (!(filter_mode & ACTFILTER_VISIBLE) || VISIBLE_ACHAN(achan)) {
- /* only work with this channel and its subchannels if it is editable */
- if (!(filter_mode & ACTFILTER_FOREDIT) || EDITABLE_ACHAN(achan)) {
- /* check if this achan should only be included if it is selected */
- if (!(filter_mode & ACTFILTER_SEL) || SEL_ACHAN(achan)) {
- /* are we only interested in the ipo-curves? */
- if ((filter_mode & ACTFILTER_ONLYICU)==0) {
- ale= make_new_actlistelem(achan, ACTTYPE_ACHAN, achan, ACTTYPE_ACHAN);
- if (ale) BLI_addtail(act_data, ale);
- }
+ /* only work with this channel and its subchannels if it is visible */
+ if (!(filter_mode & ACTFILTER_VISIBLE) || VISIBLE_ACHAN(achan)) {
+ /* only work with this channel and its subchannels if it is editable */
+ if (!(filter_mode & ACTFILTER_FOREDIT) || EDITABLE_ACHAN(achan)) {
+ /* check if this achan should only be included if it is selected */
+ if (!(filter_mode & ACTFILTER_SEL) || SEL_ACHAN(achan)) {
+ /* are we only interested in the ipo-curves? */
+ if ((filter_mode & ACTFILTER_ONLYICU)==0) {
+ ale= make_new_actlistelem(achan, ACTTYPE_ACHAN, achan, ACTTYPE_ACHAN);
+ if (ale) BLI_addtail(act_data, ale);
}
- else {
- /* only consider selected channels - achan not selected */
- continue;
- }
+ }
+ else {
+ /* for insert key... this check could be improved */
+ return;
+ }
+
+ /* check if expanded - if not, continue on to next action channel */
+ if (EXPANDED_ACHAN(achan) == 0 && (filter_mode & ACTFILTER_ONLYICU)==0)
+ return;
- /* check if expanded - if not, continue on to next action channel */
- if (EXPANDED_ACHAN(achan) == 0 && (filter_mode & ACTFILTER_ONLYICU)==0)
- continue;
-
- /* ipo channels */
- if (achan->ipo) {
- /* include ipo-expand widget? */
- if ((filter_mode & ACTFILTER_CHANNELS) && (filter_mode & ACTFILTER_ONLYICU)==0) {
- ale= make_new_actlistelem(achan, ACTTYPE_FILLIPO, achan, ACTTYPE_ACHAN);
- if (ale) BLI_addtail(act_data, ale);
- }
-
- /* add ipo-curve channels? */
- if (FILTER_IPO_ACHAN(achan) || (filter_mode & ACTFILTER_ONLYICU)) {
- /* loop through ipo-curve channels, adding them */
- for (icu= achan->ipo->curve.first; icu; icu=icu->next) {
- ale= make_new_actlistelem(icu, ACTTYPE_ICU, achan, ACTTYPE_ACHAN);
- if (ale) BLI_addtail(act_data, ale);
- }
- }
+ /* ipo channels */
+ if ((achan->ipo) && (filter_mode & ACTFILTER_IPOKEYS)==0) {
+ /* include ipo-expand widget? */
+ if ((filter_mode & ACTFILTER_CHANNELS) && (filter_mode & ACTFILTER_ONLYICU)==0) {
+ ale= make_new_actlistelem(achan, ACTTYPE_FILLIPO, achan, ACTTYPE_ACHAN);
+ if (ale) BLI_addtail(act_data, ale);
}
- /* constraint channels */
- if (achan->constraintChannels.first) {
- /* include constraint-expand widget? */
- if ((filter_mode & ACTFILTER_CHANNELS) && (filter_mode & ACTFILTER_ONLYICU)==0) {
- ale= make_new_actlistelem(achan, ACTTYPE_FILLCON, achan, ACTTYPE_ACHAN);
- if (ale) BLI_addtail(act_data, ale);
+ /* add ipo-curve channels? */
+ if (FILTER_IPO_ACHAN(achan) || (filter_mode & ACTFILTER_ONLYICU)) {
+ /* loop through ipo-curve channels, adding them */
+ for (icu= achan->ipo->curve.first; icu; icu=icu->next) {
+ ale= make_new_actlistelem(icu, ACTTYPE_ICU, achan, ACTTYPE_ACHAN);
+ if (ale) BLI_addtail(act_data, ale);
}
-
- /* add constaint channels? */
- if (FILTER_CON_ACHAN(achan)) {
- /* loop through constraint channels, checking and adding them */
- for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
- /* only work with this channel and its subchannels if it is editable */
- if (!(filter_mode & ACTFILTER_FOREDIT) || EDITABLE_CONCHAN(conchan)) {
- /* check if this conchan should only be included if it is selected */
- if (!(filter_mode & ACTFILTER_SEL) || SEL_CONCHAN(conchan)) {
- if ((filter_mode & ACTFILTER_ONLYICU)==0) {
- ale= make_new_actlistelem(conchan, ACTTYPE_CONCHAN, achan, ACTTYPE_ACHAN);
- if (ale) BLI_addtail(act_data, ale);
- }
+ }
+ }
+
+ /* constraint channels */
+ if (achan->constraintChannels.first) {
+ /* include constraint-expand widget? */
+ if ( (filter_mode & ACTFILTER_CHANNELS) && !(filter_mode & ACTFILTER_ONLYICU)
+ && !(filter_mode & ACTFILTER_IPOKEYS) )
+ {
+ ale= make_new_actlistelem(achan, ACTTYPE_FILLCON, achan, ACTTYPE_ACHAN);
+ if (ale) BLI_addtail(act_data, ale);
+ }
+
+ /* add constraint channels? */
+ if (FILTER_CON_ACHAN(achan) || (filter_mode & ACTFILTER_ONLYICU)) {
+ /* loop through constraint channels, checking and adding them */
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
+ /* only work with this channel and its subchannels if it is editable */
+ if (!(filter_mode & ACTFILTER_FOREDIT) || EDITABLE_CONCHAN(conchan)) {
+ /* check if this conchan should only be included if it is selected */
+ if (!(filter_mode & ACTFILTER_SEL) || SEL_CONCHAN(conchan)) {
+ if (filter_mode & ACTFILTER_IPOKEYS) {
+ ale= make_new_actlistelem(conchan, ACTTYPE_CONCHAN2, achan, ACTTYPE_ACHAN);
+ if (ale) BLI_addtail(act_data, ale);
+ }
+ else {
+ ale= make_new_actlistelem(conchan, ACTTYPE_CONCHAN, achan, ACTTYPE_ACHAN);
+ if (ale) BLI_addtail(act_data, ale);
}
}
}
}
}
- }
+ }
+ }
+ }
+}
+
+static void actdata_filter_action (ListBase *act_data, bAction *act, int filter_mode)
+{
+ bActListElem *ale;
+ bActionGroup *agrp;
+ bActionChannel *achan, *lastchan=NULL;
+
+ /* loop over groups */
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ /* add this group as a channel first */
+ if (!(filter_mode & ACTFILTER_ONLYICU) && !(filter_mode & ACTFILTER_IPOKEYS)) {
+ ale= make_new_actlistelem(agrp, ACTTYPE_GROUP, NULL, ACTTYPE_NONE);
+ if (ale) BLI_addtail(act_data, ale);
+ }
+
+ /* store reference to last channel of group */
+ if (agrp->channels.last)
+ lastchan= agrp->channels.last;
+
+ /* filters here are a bit convulted...
+ * - groups show a "summary" of keyframes beside their name which must accessable for tools which handle keyframes
+ * - groups can be collapsed (and those tools which are only interested in channels rely on knowing that group is closed)
+ */
+ if (!(filter_mode & ACTFILTER_VISIBLE) || EXPANDED_AGRP(agrp) ||
+ (filter_mode & (ACTFILTER_IPOKEYS|ACTFILTER_ONLYICU)))
+ {
+ if (!(filter_mode & ACTFILTER_FOREDIT) || EDITABLE_AGRP(agrp)) {
+ for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
+ actdata_filter_actionchannel(act_data, achan, filter_mode);
+ }
+ }
}
}
+
+ /* loop over action channels */
+ for (achan=(lastchan)?lastchan->next:act->chanbase.first; achan; achan=achan->next) {
+ actdata_filter_actionchannel(act_data, achan, filter_mode);
+ }
}
static void actdata_filter_shapekey (ListBase *act_data, Key *key, int filter_mode)
@@ -450,7 +523,6 @@ void actdata_filter (ListBase *act_data, int filter_mode, void *data, short data
/* **************************************************** */
/* GENERAL ACTION TOOLS */
-
/* gets the key data from the currently selected
* mesh/lattice. If a mesh is not selected, or does not have
* key data, then we return NULL (currently only
@@ -630,17 +702,21 @@ static void *get_nearest_action_key (float *selx, short *sel, short *ret_type, b
case ALE_IPO:
{
Ipo *ipo= (Ipo *)ale->key_data;
- ipo_to_keylist(ipo, &act_keys, NULL);
+ ipo_to_keylist(ipo, &act_keys, NULL, NULL);
}
break;
case ALE_ICU:
{
IpoCurve *icu= (IpoCurve *)ale->key_data;
- icu_to_keylist(icu, &act_keys, NULL);
+ icu_to_keylist(icu, &act_keys, NULL, NULL);
}
break;
}
}
+ else if (ale->type == ACTTYPE_GROUP) {
+ bActionGroup *agrp= (bActionGroup *)ale->data;
+ agroup_to_keylist(agrp, &act_keys, NULL, NULL);
+ }
/* loop through keyframes, finding one that was clicked on */
for (ak= act_keys.first; ak; ak= ak->next) {
@@ -708,6 +784,334 @@ void *get_action_context (short *datatype)
}
/* **************************************************** */
+/* ACTION CHANNEL GROUPS */
+
+/* Get the active action-group for an Action */
+bActionGroup *get_active_actiongroup (bAction *act)
+{
+ bActionGroup *agrp= NULL;
+
+ if (act && act->groups.first) {
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ if (agrp->flag & AGRP_ACTIVE)
+ break;
+ }
+ }
+
+ return agrp;
+}
+
+/* Make the given Action-Group the active one */
+void set_active_actiongroup (bAction *act, bActionGroup *agrp, short select)
+{
+ bActionGroup *grp;
+
+ /* sanity checks */
+ if (act == NULL)
+ return;
+
+ /* Deactive all others */
+ for (grp= act->groups.first; grp; grp= grp->next) {
+ if ((grp==agrp) && (select))
+ grp->flag |= AGRP_ACTIVE;
+ else
+ grp->flag &= ~AGRP_ACTIVE;
+ }
+}
+
+/* Add given channel into (active) group
+ * - assumes that channel is not linked to anything anymore
+ * - always adds at the end of the group
+ */
+static void action_groups_addachan (bAction *act, bActionGroup *agrp, bActionChannel *achan)
+{
+ bActionChannel *chan;
+ short done=0;
+
+ /* sanity checks */
+ if (ELEM3(NULL, act, agrp, achan))
+ return;
+
+ /* if no channels, just add to two lists at the same time */
+ if (act->chanbase.first == NULL) {
+ achan->next = achan->prev = NULL;
+
+ agrp->channels.first = agrp->channels.last = achan;
+ act->chanbase.first = act->chanbase.last = achan;
+
+ achan->grp= agrp;
+ return;
+ }
+
+ /* try to find a channel to slot this in before/after */
+ for (chan= act->chanbase.first; chan; chan= chan->next) {
+ /* if channel has no group, then we have ungrouped channels, which should always occur after groups */
+ if (chan->grp == NULL) {
+ BLI_insertlinkbefore(&act->chanbase, chan, achan);
+
+ if (agrp->channels.first == NULL)
+ agrp->channels.first= achan;
+ agrp->channels.last= achan;
+
+ done= 1;
+ break;
+ }
+
+ /* if channel has group after current, we can now insert (otherwise we have gone too far) */
+ else if (chan->grp == agrp->next) {
+ BLI_insertlinkbefore(&act->chanbase, chan, achan);
+
+ if (agrp->channels.first == NULL)
+ agrp->channels.first= achan;
+ agrp->channels.last= achan;
+
+ done= 1;
+ break;
+ }
+
+ /* if channel has group we're targeting, check whether it is the last one of these */
+ else if (chan->grp == agrp) {
+ if ((chan->next) && (chan->next->grp != agrp)) {
+ BLI_insertlinkafter(&act->chanbase, chan, achan);
+ agrp->channels.last= achan;
+ done= 1;
+ break;
+ }
+ else if (chan->next == NULL) {
+ BLI_addtail(&act->chanbase, achan);
+ agrp->channels.last= achan;
+ done= 1;
+ break;
+ }
+ }
+
+ /* if channel has group before target, check whether the next one is something after target */
+ else if (chan->grp == agrp->prev) {
+ if (chan->next) {
+ if ((chan->next->grp != chan->grp) && (chan->next->grp != agrp)) {
+ BLI_insertlinkafter(&act->chanbase, chan, achan);
+
+ agrp->channels.first= achan;
+ agrp->channels.last= achan;
+
+ done= 1;
+ break;
+ }
+ }
+ else {
+ BLI_insertlinkafter(&act->chanbase, chan, achan);
+
+ agrp->channels.first= achan;
+ agrp->channels.last= achan;
+
+ done= 1;
+ break;
+ }
+ }
+ }
+
+ /* only if added, set channel as belonging to this group */
+ if (done) {
+ achan->grp= agrp;
+ }
+ else
+ printf("Error: ActionChannel: '%s' couldn't be added to Group: '%s' \n", achan->name, agrp->name);
+}
+
+/* Remove the given channel from all groups */
+static void action_groups_removeachan (bAction *act, bActionChannel *achan)
+{
+ /* sanity checks */
+ if (ELEM(NULL, act, achan))
+ return;
+
+ /* check if any group used this directly */
+ if (achan->grp) {
+ bActionGroup *agrp= achan->grp;
+
+ if (agrp->channels.first == agrp->channels.last) {
+ if (agrp->channels.first == achan) {
+ agrp->channels.first= NULL;
+ agrp->channels.last= NULL;
+ }
+ }
+ else if (agrp->channels.first == achan) {
+ if ((achan->next) && (achan->next->grp==agrp))
+ agrp->channels.first= achan->next;
+ else
+ agrp->channels.first= NULL;
+ }
+ else if (agrp->channels.last == achan) {
+ if ((achan->prev) && (achan->prev->grp==agrp))
+ agrp->channels.last= achan->prev;
+ else
+ agrp->channels.last= NULL;
+ }
+
+ achan->grp= NULL;
+ }
+
+ /* now just remove from list */
+ BLI_remlink(&act->chanbase, achan);
+}
+
+/* Add a new Action-Group or add channels to active one */
+void action_groups_group (short add_group)
+{
+ bAction *act;
+ bActionChannel *achan, *anext;
+ bActionGroup *agrp;
+ void *data;
+ short datatype;
+
+ /* validate type of data we are working on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+ if (datatype != ACTCONT_ACTION) return;
+ act= (bAction *)data;
+
+ /* get active group */
+ if ((act->groups.first==NULL) || (add_group)) {
+ /* Add a new group, and make it active */
+ agrp= MEM_callocN(sizeof(bActionGroup), "bActionGroup");
+
+ agrp->flag |= (AGRP_ACTIVE|AGRP_SELECTED|AGRP_EXPANDED);
+ sprintf(agrp->name, "Group");
+
+ BLI_addtail(&act->groups, agrp);
+ BLI_uniquename(&act->groups, agrp, "Group", offsetof(bActionGroup, name), 32);
+
+ set_active_actiongroup(act, agrp, 1);
+
+ add_group= 1;
+ }
+ else {
+ agrp= get_active_actiongroup(act);
+
+ if (agrp == NULL) {
+ error("No Active Action Group");
+ return;
+ }
+ }
+
+ /* loop through action-channels, finding those that are selected + visible to move */
+ // FIXME: this should be done with action api instead
+ for (achan= act->chanbase.first; achan; achan= anext) {
+ anext= achan->next;
+
+ /* make sure not already in new-group */
+ if (achan->grp != agrp) {
+ if ((achan->grp==NULL) || (EXPANDED_AGRP(achan->grp))) {
+ if (VISIBLE_ACHAN(achan) && SEL_ACHAN(achan)) {
+ /* unlink from everything else */
+ action_groups_removeachan(act, achan);
+
+ /* add to end of group's channels */
+ action_groups_addachan(act, agrp, achan);
+ }
+ }
+ }
+ }
+
+ /* updates and undo */
+ if (add_group)
+ BIF_undo_push("Add Action Group");
+ else
+ BIF_undo_push("Add to Action Group");
+
+ allqueue(REDRAWACTION, 0);
+}
+
+/* Remove selected channels from their groups */
+void action_groups_ungroup (void)
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ bAction *act;
+ void *data;
+ short datatype;
+ short filter;
+
+ /* validate type of data we are working on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+ if (datatype != ACTCONT_ACTION) return;
+ act= (bAction *)data;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE|ACTFILTER_SEL);
+ actdata_filter(&act_data, filter, act, ACTCONT_ACTION);
+
+ /* Only ungroup selected action-channels */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ if (ale->type == ACTTYPE_ACHAN) {
+ action_groups_removeachan(act, ale->data);
+ BLI_addtail(&act->chanbase, ale->data);
+ }
+ }
+
+ BLI_freelistN(&act_data);
+
+ /* updates and undo */
+ BIF_undo_push("Remove From Action Groups");
+
+ allqueue(REDRAWACTION, 0);
+}
+
+/* This function is used when inserting keyframes for pose-channels. It assigns the
+ * action-channel with the nominated name to a group with the same name as that of
+ * the pose-channel with the nominated name.
+ *
+ * Note: this function calls validate_action_channel if action channel doesn't exist
+ */
+void verify_pchan2achan_grouping (bAction *act, bPose *pose, char name[])
+{
+ bActionChannel *achan;
+ bPoseChannel *pchan;
+
+ /* sanity checks */
+ if (ELEM3(NULL, act, pose, name))
+ return;
+ if (name[0] == 0)
+ return;
+
+ /* try to get the channels */
+ pchan= get_pose_channel(pose, name);
+ if (pchan == NULL) return;
+ achan= verify_action_channel(act, name);
+
+ /* check if pchan has a group */
+ if ((pchan->agrp_index) && (achan->grp == NULL)) {
+ bActionGroup *agrp, *grp=NULL;
+
+ /* get group to try to be like */
+ agrp= (bActionGroup *)BLI_findlink(&pose->agroups, (pchan->agrp_index - 1));
+ if (agrp == NULL) {
+ error("PoseChannel has invalid group!");
+ return;
+ }
+
+ /* try to find a group which is similar to the one we want (or add one) */
+ for (grp= act->groups.first; grp; grp= grp->next) {
+ if (!strcmp(grp->name, agrp->name))
+ break;
+ }
+ if (grp == NULL) {
+ grp= MEM_callocN(sizeof(bActionGroup), "bActionGroup");
+
+ grp->flag |= (AGRP_ACTIVE|AGRP_SELECTED|AGRP_EXPANDED);
+ sprintf(grp->name, agrp->name);
+
+ BLI_addtail(&act->groups, grp);
+ }
+
+ /* make sure this channel is definitely not connected to anything before adding to group */
+ action_groups_removeachan(act, achan);
+ action_groups_addachan(act, grp, achan);
+ }
+}
+
+/* **************************************************** */
/* TRANSFORM TOOLS */
/* main call to start transforming keyframes */
@@ -739,8 +1143,14 @@ void transform_action_keys (int mode, int dummy)
Transform();
}
break;
+ case 'e':
+ {
+ initTransform(TFM_TIME_EXTEND, CTX_NONE);
+ Transform();
+ }
+ break;
}
-}
+}
/* ----------------------------------------- */
@@ -770,9 +1180,49 @@ void duplicate_action_keys (void)
BLI_freelistN(&act_data);
/* now, go into transform-grab mode, to move keys */
+ BIF_TransformSetUndo("Add Duplicate");
transform_action_keys('g', 0);
}
+/* this function is responsible for snapping the current frame to selected data */
+void snap_cfra_action()
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
+ /* get data */
+ data= get_action_context(&datatype);
+ if (data == NULL) return;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_IPOKEYS);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* snap current frame to selected data */
+ snap_cfra_ipo_keys(NULL, -1);
+
+ for (ale= act_data.first; ale; ale= ale->next) {
+ if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
+ actstrip_map_ipo_keys(OBACT, ale->key_data, 0, 1);
+ snap_cfra_ipo_keys(ale->key_data, 0);
+ actstrip_map_ipo_keys(OBACT, ale->key_data, 1, 1);
+ }
+ else
+ snap_cfra_ipo_keys(ale->key_data, 0);
+ }
+ BLI_freelistN(&act_data);
+
+ snap_cfra_ipo_keys(NULL, 1);
+
+ BIF_undo_push("Snap Current Frame to Keys");
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWNLA, 0);
+}
+
/* this function is responsible for snapping keyframes to frame-times */
void snap_action_keys(short mode)
{
@@ -917,7 +1367,7 @@ void insertkey_action(void)
ListBase act_data = {NULL, NULL};
bActListElem *ale;
int filter;
-
+
/* ask user what to keyframe */
mode = pupmenu("Insert Key%t|All Channels%x1|Only Selected Channels%x2");
if (mode <= 0) return;
@@ -1002,7 +1452,7 @@ void delete_action_keys (void)
allqueue(REDRAWNLA, 0);
}
-/* delete selected keyframes */
+/* delete selected action-channels (only achans and conchans are considered) */
void delete_action_channels (void)
{
ListBase act_data = {NULL, NULL};
@@ -1018,6 +1468,32 @@ void delete_action_channels (void)
if (datatype != ACTCONT_ACTION) return;
act= (bAction *)data;
+ /* deal with groups first */
+ if (act->groups.first) {
+ bActionGroup *agrp, *grp;
+ bActionChannel *chan, *nchan;
+
+ /* unlink achan's that belonged to this group (and make sure they're not selected if they weren't visible) */
+ for (agrp= act->groups.first; agrp; agrp= grp) {
+ grp= agrp->next;
+
+ /* remove if group is selected */
+ if (SEL_AGRP(agrp)) {
+ for (chan= agrp->channels.first; chan && chan->grp==agrp; chan= nchan) {
+ nchan= chan->next;
+
+ action_groups_removeachan(act, chan);
+ BLI_addtail(&act->chanbase, chan);
+
+ if (EXPANDED_AGRP(agrp) == 0)
+ chan->flag &= ~(ACHAN_SELECTED|ACHAN_HILIGHTED);
+ }
+
+ BLI_freelinkN(&act->groups, agrp);
+ }
+ }
+ }
+
/* filter data */
filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_CHANNELS | ACTFILTER_SEL);
actdata_filter(&act_data, filter, data, datatype);
@@ -1097,30 +1573,148 @@ void clean_action (void)
allqueue(REDRAWNLA, 0);
}
+
+/* little cache for values... */
+typedef struct tempFrameValCache {
+ float frame, val;
+} tempFrameValCache;
+
+/* Evaluates the curves between each selected keyframe on each frame, and keys the value */
+void sample_action_keys (void)
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
+ /* sanity checks */
+ data= get_action_context(&datatype);
+ if (data == NULL) return;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_ONLYICU);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* loop through filtered data and add keys between selected keyframes on every frame */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ IpoCurve *icu= (IpoCurve *)ale->key_data;
+ BezTriple *bezt, *start=NULL, *end=NULL;
+ tempFrameValCache *value_cache, *fp;
+ int sfra, range;
+ int i, n;
+
+ /* find selected keyframes... once pair has been found, add keyframes */
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ /* check if selected, and which end this is */
+ if (BEZSELECTED(bezt)) {
+ if (start) {
+ /* set end */
+ end= bezt;
+
+ /* cache values then add keyframes using these values, as adding
+ * keyframes while sampling will affect the outcome...
+ */
+ range= (int)( ceil(end->vec[1][0] - start->vec[1][0]) );
+ sfra= (int)( floor(start->vec[1][0]) );
+
+ if (range) {
+ value_cache= MEM_callocN(sizeof(tempFrameValCache)*range, "IcuFrameValCache");
+
+ /* sample values */
+ for (n=0, fp=value_cache; n<range && fp; n++, fp++) {
+ fp->frame= (float)(sfra + n);
+ fp->val= eval_icu(icu, fp->frame);
+ }
+
+ /* add keyframes with these */
+ for (n=0, fp=value_cache; n<range && fp; n++, fp++) {
+ insert_vert_icu(icu, fp->frame, fp->val, 1);
+ }
+
+ /* free temp cache */
+ MEM_freeN(value_cache);
+ }
+
+ /* as we added keyframes, we need to compensate so that bezt is at the right place */
+ bezt = icu->bezt + i + range - 1;
+ i += (range - 1);
+
+ /* bezt was selected, so it now marks the start of a whole new chain to search */
+ start= bezt;
+ end= NULL;
+ }
+ else {
+ /* just set start keyframe */
+ start= bezt;
+ end= NULL;
+ }
+ }
+ }
+
+ /* recalculate channel's handles? */
+ calchandles_ipocurve(icu);
+ }
+
+ /* admin and redraws */
+ BLI_freelistN(&act_data);
+
+ BIF_undo_push("Sample Action Keys");
+ allqueue(REMAKEIPO, 0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+}
+
/* **************************************************** */
/* 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.
+/* - The copy/paste buffer currently stores a set of Action Channels, with temporary
+ * IPO-blocks, and also temporary IpoCurves which only contain the selected keyframes.
+ * - Only pastes between compatable data is possible (i.e. same achan->name, ipo-curve type, etc.)
+ * Unless there is only one element in the buffer, names are also tested to check for compatability.
+ * - All pasted frames are offset by the same amount. This is calculated as the difference in the times of
+ * the current frame and the 'first keyframe' (i.e. the earliest one in all channels).
+ * - The earliest frame is calculated per copy operation.
*/
/* globals for copy/paste data (like for other copy/paste buffers) */
ListBase actcopybuf = {NULL, NULL};
+static float actcopy_firstframe= 999999999.0f;
/* This function frees any MEM_calloc'ed copy/paste buffer data */
void free_actcopybuf ()
{
- IpoCurve *icu;
+ bActionChannel *achan, *anext;
+ bConstraintChannel *conchan, *cnext;
- while( (icu= actcopybuf.first) ) {
- BLI_remlink(&actcopybuf, icu);
- free_ipo_curve(icu);
+ for (achan= actcopybuf.first; achan; achan= anext) {
+ anext= achan->next;
+
+ if (achan->ipo) {
+ free_ipo(achan->ipo);
+ MEM_freeN(achan->ipo);
+ }
+
+ for (conchan=achan->constraintChannels.first; conchan; conchan=cnext) {
+ cnext= conchan->next;
+
+ if (conchan->ipo) {
+ free_ipo(conchan->ipo);
+ MEM_freeN(conchan->ipo);
+ }
+
+ BLI_freelinkN(&achan->constraintChannels, conchan);
+ }
+
+ BLI_freelinkN(&actcopybuf, achan);
}
+
+ actcopybuf.first= actcopybuf.last= NULL;
+ actcopy_firstframe= 999999999.0f;
}
/* This function adds data to the copy/paste buffer, freeing existing data first
- * Only the active action channel gets its selected keyframes copied.
+ * Only the selected action channels gets their selected keyframes copied.
*/
void copy_actdata ()
{
@@ -1138,45 +1732,72 @@ void copy_actdata ()
if (data == NULL) return;
/* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_ONLYICU);
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_IPOKEYS);
actdata_filter(&act_data, filter, data, datatype);
- /* each of these entries should be an ipo curve */
+ /* assume that each of these is an ipo-block */
for (ale= act_data.first; ale; ale= ale->next) {
- IpoCurve *icu= ale->key_data;
- IpoCurve *icn;
+ bActionChannel *achan;
+ Ipo *ipo= ale->key_data;
+ Ipo *ipn;
+ IpoCurve *icu, *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;
- }
+ /* coerce an action-channel out of owner */
+ if (ale->ownertype == ACTTYPE_ACHAN) {
+ bActionChannel *achanO= ale->owner;
+ achan= MEM_callocN(sizeof(bActionChannel), "ActCopyPasteAchan");
+ strcpy(achan->name, achanO->name);
+ }
+ else if (ale->ownertype == ACTTYPE_SHAPEKEY) {
+ achan= MEM_callocN(sizeof(bActionChannel), "ActCopyPasteAchan");
+ strcpy(achan->name, "#ACP_ShapeKey");
}
- /* allocate memory for a new curve if a valid one wasn't found */
- if (nin_buffer) {
- icn= MEM_callocN(sizeof(IpoCurve), "actcopybuf");
+ else
+ continue;
+ BLI_addtail(&actcopybuf, achan);
+
+ /* add constraint channel if needed, then add new ipo-block */
+ if (ale->type == ACTTYPE_CONCHAN) {
+ bConstraintChannel *conchanO= ale->data;
+ bConstraintChannel *conchan;
- *icn= *icu;
- icn->totvert= 0;
- icn->bezt = NULL;
- icn->driver = NULL;
+ conchan= MEM_callocN(sizeof(bConstraintChannel), "ActCopyPasteConchan");
+ strcpy(conchan->name, conchanO->name);
+ BLI_addtail(&achan->constraintChannels, conchan);
- BLI_addtail(&actcopybuf, icn);
+ conchan->ipo= ipn= MEM_callocN(sizeof(Ipo), "ActCopyPasteIpo");
}
+ else {
+ achan->ipo= ipn= MEM_callocN(sizeof(Ipo), "ActCopyPasteIpo");
+ }
+ ipn->blocktype = ipo->blocktype;
- /* 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);
+ /* now loop through curves, and only copy selected keyframes */
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ /* allocate a new curve */
+ icn= MEM_callocN(sizeof(IpoCurve), "ActCopyPasteIcu");
+ icn->blocktype = icu->blocktype;
+ icn->adrcode = icu->adrcode;
+ BLI_addtail(&ipn->curve, icn);
+
+ /* find selected BezTriples to add to the buffer (and set first frame) */
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ if (BEZSELECTED(bezt)) {
+ /* add to buffer ipo-curve */
+ insert_bezt_icu(icn, bezt);
+
+ /* check if this is the earliest frame encountered so far */
+ if (bezt->vec[1][0] < actcopy_firstframe)
+ actcopy_firstframe= bezt->vec[1][0];
+ }
+ }
}
}
/* check if anything ended up in the buffer */
- if (actcopybuf.first==NULL || actcopybuf.last==NULL)
+ if (ELEM(NULL, actcopybuf.first, actcopybuf.last))
error("Nothing copied to buffer");
/* free temp memory */
@@ -1191,59 +1812,101 @@ void paste_actdata ()
void *data;
short datatype;
+ short no_name= 0;
+ float offset = CFRA - actcopy_firstframe;
+
/* check if buffer is empty */
- if (actcopybuf.first==NULL || actcopybuf.last==NULL) {
+ if (ELEM(NULL, actcopybuf.first, actcopybuf.last)) {
error("No data in buffer to paste");
return;
}
+ /* check if single channel in buffer (disregard names if so) */
+ if (actcopybuf.first == actcopybuf.last)
+ no_name= 1;
/* get data */
data= get_action_context(&datatype);
if (data == NULL) return;
/* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_FOREDIT | ACTFILTER_ONLYICU);
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
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;
+ Ipo *ipo_src=NULL, *ipo_dst=ale->key_data;
+ bActionChannel *achan;
+ IpoCurve *ico, *icu;
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;
+
+ /* find matching ipo-block */
+ for (achan= actcopybuf.first; achan; achan= achan->next) {
+ /* try to match data */
+ if (ale->ownertype == ACTTYPE_ACHAN) {
+ bActionChannel *achant= ale->owner;
+
+ /* check if we have a corresponding action channel */
+ if ((no_name) || (strcmp(achan->name, achant->name)==0)) {
+ /* check if this is a constraint channel */
+ if (ale->type == ACTTYPE_CONCHAN) {
+ bConstraintChannel *conchant= ale->data;
+ bConstraintChannel *conchan;
+
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
+ if (strcmp(conchan->name, conchant->name)==0) {
+ ipo_src= conchan->ipo;
+ break;
+ }
+ }
+ if (ipo_src) break;
+ }
+ else {
+ ipo_src= achan->ipo;
+ break;
+ }
+ }
+ }
+ else if (ale->ownertype == ACTTYPE_SHAPEKEY) {
+ /* check if this action channel is "#ACP_ShapeKey" */
+ if ((no_name) || (strcmp(achan->name, "#ACP_ShapeKey")==0)) {
+ ipo_src= achan->ipo;
+ break;
+ }
+ }
+ }
+
+ /* this shouldn't happen, but it might */
+ if (ELEM(NULL, ipo_src, ipo_dst))
+ continue;
+
+ /* loop over curves, pasting keyframes */
+ for (icu= ipo_dst->curve.first; icu; icu= icu->next) {
+ for (ico= ipo_src->curve.first; ico; ico= ico->next) {
+ /* only paste if compatable blocktype + adrcode */
+ 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++) {
+ /* 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;
}
- /* 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);
+ /* recalculate channel's handles? */
+ calchandles_ipocurve(icu);
- /* un-apply offset from src beztriple after copying */
- bezt->vec[0][0] -= offset;
- bezt->vec[1][0] -= offset;
- bezt->vec[2][0] -= offset;
+ /* done for this channel */
+ break;
}
-
- /* recalculate channel's handles? */
- calchandles_ipocurve(icu);
-
- /* done for this channel */
- break;
}
}
}
@@ -1408,6 +2071,7 @@ static void numbuts_action ()
void *act_channel;
short chantype;
+ bActionGroup *agrp= NULL;
bActionChannel *achan= NULL;
bConstraintChannel *conchan= NULL;
IpoCurve *icu= NULL;
@@ -1427,7 +2091,7 @@ static void numbuts_action ()
/* figure out what is under cursor */
getmouseco_areawin(mval);
- if (mval[0] < NAMEWIDTH)
+ if (mval[0] > NAMEWIDTH)
return;
act_channel= get_nearest_act_channel(mval, &chantype);
@@ -1513,6 +2177,18 @@ static void numbuts_action ()
add_numbut(but++, NUM|FLO, "Slider Max:",
kb->slidermin, 10000, &kb->slidermax, 0);
}
+ else if (chantype == ACTTYPE_GROUP) {
+ /* Action Group */
+ agrp= (bActionGroup *)act_channel;
+
+ strcpy(str, agrp->name);
+ protect= (agrp->flag & AGRP_PROTECTED);
+ expand = (agrp->flag & AGRP_EXPANDED);
+
+ add_numbut(but++, TEX, "ActGroup: ", 0, 31, str, "Name of Action Group");
+ add_numbut(but++, TOG|SHO, "Expanded", 0, 24, &expand, "Action Group is Expanded");
+ add_numbut(but++, TOG|SHO, "Protected", 0, 24, &protect, "Group is Protected");
+ }
else {
/* nothing under-cursor */
return;
@@ -1551,6 +2227,16 @@ static void numbuts_action ()
if (achan->ipo)
achan->ipo->muteipo = mute;
}
+ else if (agrp) {
+ strcpy(agrp->name, str);
+ BLI_uniquename(&( ((bAction *)data)->groups ), agrp, "Group", offsetof(bActionGroup, name), 32);
+
+ if (expand) agrp->flag |= AGRP_EXPANDED;
+ else agrp->flag &= ~AGRP_EXPANDED;
+
+ if (protect) agrp->flag |= AGRP_PROTECTED;
+ else agrp->flag &= ~AGRP_PROTECTED;
+ }
allqueue(REDRAWACTION, 0);
allspace(REMAKEIPO, 0);
@@ -1564,6 +2250,32 @@ static void numbuts_action ()
/* **************************************************** */
/* CHANNEL SELECTION */
+/* select_mode = SELECT_REPLACE
+ * = SELECT_ADD
+ * = SELECT_SUBTRACT
+ * = SELECT_INVERT
+ */
+static void select_action_group (bAction *act, bActionGroup *agrp, int selectmode)
+{
+ /* Select the channel based on the selection mode */
+ short select;
+
+ switch (selectmode) {
+ case SELECT_ADD:
+ agrp->flag |= AGRP_SELECTED;
+ break;
+ case SELECT_SUBTRACT:
+ agrp->flag &= ~AGRP_SELECTED;
+ break;
+ case SELECT_INVERT:
+ agrp->flag ^= AGRP_SELECTED;
+ break;
+ }
+ select = (agrp->flag & AGRP_SELECTED) ? 1 : 0;
+
+ set_active_actiongroup(act, agrp, select);
+}
+
static void hilight_channel(bAction *act, bActionChannel *achan, short select)
{
bActionChannel *curchan;
@@ -1724,6 +2436,10 @@ void deselect_actionchannels (bAction *act, short test)
break;
switch (ale->type) {
+ case ACTTYPE_GROUP:
+ if (ale->flag & AGRP_SELECTED)
+ sel= 0;
+ break;
case ACTTYPE_ACHAN:
if (ale->flag & ACHAN_SELECTED)
sel= 0;
@@ -1745,6 +2461,16 @@ void deselect_actionchannels (bAction *act, short test)
/* Now set the flags */
for (ale= act_data.first; ale; ale= ale->next) {
switch (ale->type) {
+ case ACTTYPE_GROUP:
+ {
+ bActionGroup *agrp= (bActionGroup *)ale->data;
+
+ if (sel)
+ agrp->flag |= AGRP_SELECTED;
+ else
+ agrp->flag &= ~AGRP_SELECTED;
+ }
+ break;
case ACTTYPE_ACHAN:
{
bActionChannel *achan= (bActionChannel *)ale->data;
@@ -1862,6 +2588,20 @@ void selectall_action_keys (short mval[], short mode, short select_mode)
/* get channel, and act according to type */
act_channel= get_nearest_act_channel(mval, &chantype);
switch (chantype) {
+ case ACTTYPE_GROUP:
+ {
+ bActionGroup *agrp= (bActionGroup *)act_channel;
+ bActionChannel *achan;
+ bConstraintChannel *conchan;
+
+ for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
+ select_ipo_bezier_keys(achan->ipo, select_mode);
+
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next)
+ select_ipo_bezier_keys(conchan->ipo, select_mode);
+ }
+ }
+ break;
case ACTTYPE_ACHAN:
{
bActionChannel *achan= (bActionChannel *)act_channel;
@@ -1923,6 +2663,7 @@ void selectall_action_keys (short mval[], short mode, short select_mode)
allqueue(REDRAWIPO, 0);
}
+/* Selects all visible keyframes between the specified markers */
void markers_selectkeys_between (void)
{
ListBase act_data = {NULL, NULL};
@@ -1962,18 +2703,145 @@ void markers_selectkeys_between (void)
BLI_freelistN(&act_data);
}
+/* Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */
+void selectkeys_leftright (short leftright, short select_mode)
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+ float min, max;
+
+ if (select_mode==SELECT_REPLACE) {
+ select_mode=SELECT_ADD;
+ deselect_action_keys(0, 0);
+ }
+
+ /* determine what type of data we are operating on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+
+ if (leftright == 1) {
+ min = -MAXFRAMEF;
+ max = (float)(CFRA + 0.1f);
+ }
+ else {
+ min = (float)(CFRA - 0.1f);
+ max = MAXFRAMEF;
+ }
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_IPOKEYS);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* select keys on the side where most data occurs */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ 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);
+ }
+ else {
+ borderselect_ipo_key(ale->key_data, min, max, SELECT_ADD);
+ }
+ }
+
+ /* Cleanup */
+ BLI_freelistN(&act_data);
+
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWIPO, 0);
+}
+
+/* ----------------------------------------- */
+
+/* Jumps to the frame where the next/previous keyframe (that is visible) occurs
+ * dir: indicates direction
+ */
+void nextprev_action_keyframe (short dir)
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
+ ListBase elems= {NULL, NULL};
+ CfraElem *ce, *nearest=NULL;
+ float dist, min_dist= 1000000;
+
+
+ /* determine what type of data we are operating on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+
+ /* abort if no direction */
+ if (dir == 0)
+ return;
+
+ /* get list of keyframes that can be used (in global-time) */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_IPOKEYS);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ for (ale= act_data.first; ale; ale= ale->next) {
+ if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
+ actstrip_map_ipo_keys(OBACT, ale->key_data, 0, 1);
+ make_cfra_list(ale->key_data, &elems);
+ actstrip_map_ipo_keys(OBACT, ale->key_data, 1, 1);
+ }
+ else
+ make_cfra_list(ale->key_data, &elems);
+ }
+
+ BLI_freelistN(&act_data);
+
+ /* find nearest keyframe to current frame */
+ for (ce= elems.first; ce; ce= ce->next) {
+ dist= ABS(ce->cfra - CFRA);
+
+ if (dist < min_dist) {
+ min_dist= dist;
+ nearest= ce;
+ }
+ }
+
+ /* if a nearest keyframe was found, use the one either side */
+ if (nearest) {
+ short changed= 0;
+
+ if ((dir > 0) && (nearest->next)) {
+ CFRA= nearest->next->cfra;
+ changed= 1;
+ }
+ else if ((dir < 0) && (nearest->prev)) {
+ CFRA= nearest->prev->cfra;
+ changed= 1;
+ }
+
+ if (changed) {
+ update_for_newframe();
+ allqueue(REDRAWALL, 0);
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&elems);
+}
+
/* ----------------------------------------- */
/* This function makes a list of the selected keyframes
* in the ipo curves it has been passed
*/
-static void make_sel_cfra_list(Ipo *ipo, ListBase *elems)
+static void make_sel_cfra_list (Ipo *ipo, ListBase *elems)
{
IpoCurve *icu;
if (ipo == NULL) return;
- for(icu= ipo->curve.first; icu; icu= icu->next) {
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
BezTriple *bezt;
int a= 0;
@@ -1987,7 +2855,7 @@ static void make_sel_cfra_list(Ipo *ipo, ListBase *elems)
/* This function selects all key frames in the same column(s) as a already selected key(s)
* or marker(s), or all the keyframes on a particular frame (triggered by a RMB on x-scrollbar)
*/
-void column_select_action_keys(int mode)
+void column_select_action_keys (int mode)
{
ListBase elems= {NULL, NULL};
CfraElem *ce;
@@ -2031,7 +2899,7 @@ void column_select_action_keys(int mode)
actdata_filter(&act_data, filter, data, datatype);
for (ale= act_data.first; ale; ale= ale->next) {
- for(ce= elems.first; ce; ce= ce->next) {
+ for (ce= elems.first; ce; ce= ce->next) {
for (icu= ale->key_data; icu; icu= icu->next) {
BezTriple *bezt;
int verts = 0;
@@ -2050,10 +2918,13 @@ 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
+enum {
+ ACTEDIT_BORDERSEL_ALL = 0,
+ ACTEDIT_BORDERSEL_FRA,
+ ACTEDIT_BORDERSEL_CHA
+};
/* borderselect: for keyframes only */
void borderselect_action (void)
@@ -2127,6 +2998,18 @@ void borderselect_action (void)
else if (ale->datatype == ALE_ICU)
borderselect_icu_key(ale->key_data, rectf.xmin, rectf.xmax, select_function);
}
+ else if (ale->type == ACTTYPE_GROUP) {
+ bActionGroup *agrp= ale->data;
+ bActionChannel *achan;
+ bConstraintChannel *conchan;
+
+ for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
+ borderselect_ipo_key(achan->ipo, rectf.xmin, rectf.xmax, selectmode);
+
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next)
+ borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax, selectmode);
+ }
+ }
break;
case ACTEDIT_BORDERSEL_CHA: /* all in channel(s) */
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
@@ -2136,6 +3019,18 @@ void borderselect_action (void)
else if (ale->datatype == ALE_ICU)
select_icu_bezier_keys(ale->key_data, selectmode);
}
+ else if (ale->type == ACTTYPE_GROUP) {
+ bActionGroup *agrp= ale->data;
+ bActionChannel *achan;
+ bConstraintChannel *conchan;
+
+ for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
+ select_ipo_bezier_keys(achan->ipo, selectmode);
+
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next)
+ select_ipo_bezier_keys(conchan->ipo, selectmode);
+ }
+ }
}
break;
default: /* any keyframe inside region defined by region */
@@ -2146,6 +3041,18 @@ void borderselect_action (void)
else if (ale->datatype == ALE_ICU)
borderselect_icu_key(ale->key_data, rectf.xmin, rectf.xmax, select_function);
}
+ else if (ale->type == ACTTYPE_GROUP) {
+ bActionGroup *agrp= ale->data;
+ bActionChannel *achan;
+ bConstraintChannel *conchan;
+
+ for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
+ borderselect_ipo_key(achan->ipo, rectf.xmin, rectf.xmax, selectmode);
+
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next)
+ borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax, selectmode);
+ }
+ }
}
}
@@ -2172,14 +3079,15 @@ static void mouse_action (int selectmode)
short datatype;
bAction *act= NULL;
+ bActionGroup *agrp= NULL;
bActionChannel *achan= NULL;
bConstraintChannel *conchan= NULL;
IpoCurve *icu= NULL;
- TimeMarker *marker;
+ TimeMarker *marker, *pmarker;
void *act_channel;
- short sel, act_type;
- float selx;
+ short sel, act_type = 0;
+ float selx = 0.0;
/* determine what type of data we are operating on */
data = get_action_context(&datatype);
@@ -2187,9 +3095,63 @@ static void mouse_action (int selectmode)
if (datatype == ACTCONT_ACTION) act= (bAction *)data;
act_channel= get_nearest_action_key(&selx, &sel, &act_type, &achan);
- marker=find_nearest_marker(1);
+ marker= find_nearest_marker(SCE_MARKERS, 1);
+ pmarker= (act) ? find_nearest_marker(&act->markers, 1) : NULL;
+
+ if (marker) {
+ /* what about scene's markers? */
+ if (selectmode == SELECT_REPLACE) {
+ deselect_markers(0, 0);
+ marker->flag |= SELECT;
+ }
+ else if (selectmode == SELECT_INVERT) {
+ if (marker->flag & SELECT)
+ marker->flag &= ~SELECT;
+ else
+ marker->flag |= SELECT;
+ }
+ else if (selectmode == SELECT_ADD)
+ marker->flag |= SELECT;
+ else if (selectmode == SELECT_SUBTRACT)
+ marker->flag &= ~SELECT;
+
+ std_rmouse_transform(transform_markers);
+
+ allqueue(REDRAWMARKER, 0);
+ }
+ else if (pmarker) {
+ /* action's markers are drawn behind scene markers */
+ if (selectmode == SELECT_REPLACE) {
+ action_set_activemarker(act, pmarker, 1);
+ pmarker->flag |= SELECT;
+ }
+ else if (selectmode == SELECT_INVERT) {
+ if (pmarker->flag & SELECT) {
+ pmarker->flag &= ~SELECT;
+ action_set_activemarker(act, NULL, 0);
+ }
+ else {
+ pmarker->flag |= SELECT;
+ action_set_activemarker(act, pmarker, 0);
+ }
+ }
+ else if (selectmode == SELECT_ADD) {
+ pmarker->flag |= SELECT;
+ action_set_activemarker(act, pmarker, 0);
+ }
+ else if (selectmode == SELECT_SUBTRACT) {
+ pmarker->flag &= ~SELECT;
+ action_set_activemarker(act, NULL, 0);
+ }
- if (act_channel) {
+ // TODO: local-markers cannot be moved atm...
+ //std_rmouse_transform(transform_markers);
+
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ else if (act_channel) {
+ /* must have been a channel */
switch (act_type) {
case ACTTYPE_ICU:
icu= (IpoCurve *)act_channel;
@@ -2200,6 +3162,9 @@ static void mouse_action (int selectmode)
case ACTTYPE_ACHAN:
achan= (bActionChannel *)act_channel;
break;
+ case ACTTYPE_GROUP:
+ agrp= (bActionGroup *)act_channel;
+ break;
default:
return;
}
@@ -2212,9 +3177,16 @@ static void mouse_action (int selectmode)
if (datatype == ACTCONT_ACTION) {
deselect_action_channels(0);
- achan->flag |= ACHAN_SELECTED;
- hilight_channel(act, achan, 1);
- select_poseelement_by_name(achan->name, 2); /* 2 is activate */
+ /* Highlight either an Action-Channel or Action-Group */
+ if (achan) {
+ achan->flag |= ACHAN_SELECTED;
+ hilight_channel(act, achan, 1);
+ select_poseelement_by_name(achan->name, 2); /* 2 is activate */
+ }
+ else if (agrp) {
+ agrp->flag |= AGRP_SELECTED;
+ set_active_actiongroup(act, agrp, 1);
+ }
}
}
@@ -2222,8 +3194,16 @@ static void mouse_action (int selectmode)
select_icu_key(icu, selx, selectmode);
else if (conchan)
select_ipo_key(conchan->ipo, selx, selectmode);
- else
+ else if (achan)
select_ipo_key(achan->ipo, selx, selectmode);
+ else if (agrp) {
+ for (achan= agrp->channels.first; achan && achan->grp==agrp; achan= achan->next) {
+ select_ipo_key(achan->ipo, selx, selectmode);
+
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next)
+ select_ipo_key(conchan->ipo, selx, selectmode);
+ }
+ }
std_rmouse_transform(transform_action_keys);
@@ -2234,27 +3214,6 @@ static void mouse_action (int selectmode)
allqueue(REDRAWOOPS, 0);
allqueue(REDRAWBUTSALL, 0);
}
- else if (marker) {
- /* not channel, so maybe marker */
- if (selectmode == SELECT_REPLACE) {
- deselect_markers(0, 0);
- marker->flag |= SELECT;
- }
- else if (selectmode == SELECT_INVERT) {
- if (marker->flag & SELECT)
- marker->flag &= ~SELECT;
- else
- marker->flag |= SELECT;
- }
- else if (selectmode == SELECT_ADD)
- marker->flag |= SELECT;
- else if (selectmode == SELECT_SUBTRACT)
- marker->flag &= ~SELECT;
-
- std_rmouse_transform(transform_markers);
-
- allqueue(REDRAWMARKER, 0);
- }
}
/* lefthand side - mouse-click */
@@ -2273,6 +3232,30 @@ static void mouse_actionchannels (short mval[])
/* action to take depends on what channel we've got */
switch (chantype) {
+ case ACTTYPE_GROUP:
+ {
+ bActionGroup *agrp= (bActionGroup *)act_channel;
+
+ if (mval[0] < 16) {
+ /* toggle expand */
+ agrp->flag ^= AGRP_EXPANDED;
+ }
+ else if (mval[0] >= (NAMEWIDTH-16)) {
+ /* toggle protection/locking */
+ agrp->flag ^= AGRP_PROTECTED;
+ }
+ else {
+ /* select/deselect group */
+ if (G.qual & LR_SHIFTKEY) {
+ select_action_group(act, agrp, SELECT_INVERT);
+ }
+ else {
+ deselect_actionchannels(act, 0);
+ select_action_group(act, agrp, SELECT_ADD);
+ }
+ }
+ }
+ break;
case ACTTYPE_ACHAN:
{
bActionChannel *achan= (bActionChannel *)act_channel;
@@ -2390,158 +3373,528 @@ static void mouse_actionchannels (short mval[])
/* **************************************************** */
/* ACTION CHANNEL RE-ORDERING */
-void top_sel_action ()
+/* make sure all action-channels belong to a group (and clear action's list) */
+static void split_groups_action_temp (bAction *act, bActionGroup *tgrp)
{
- bAction *act;
bActionChannel *achan;
+ bActionGroup *agrp;
- /* Get the selected action, exit if none are selected */
- act = G.saction->action;
- if (!act) return;
+ /* Separate action-channels into lists per group */
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ if (agrp->channels.first) {
+ achan= agrp->channels.last;
+ act->chanbase.first= achan->next;
+
+ achan= agrp->channels.first;
+ achan->prev= NULL;
+
+ achan= agrp->channels.last;
+ achan->next= NULL;
+ }
+ }
- for (achan= act->chanbase.first; achan; achan= achan->next){
- if (VISIBLE_ACHAN(achan)) {
- if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)){
- /* take it out off the chain keep data */
- BLI_remlink (&act->chanbase, achan);
- /* make it first element */
- BLI_insertlinkbefore(&act->chanbase, act->chanbase.first, achan);
- achan->flag |= ACHAN_MOVED;
- /* restart with rest of list */
- achan= achan->next;
- }
+ /* Initialise memory for temp-group */
+ memset(tgrp, 0, sizeof(bActionGroup));
+ tgrp->flag |= (AGRP_EXPANDED|AGRP_TEMP);
+ strcpy(tgrp->name, "#TempGroup");
+
+ /* Move any action-channels not already moved, to the temp group */
+ if (act->chanbase.first) {
+ /* start of list */
+ achan= act->chanbase.first;
+ achan->prev= NULL;
+ tgrp->channels.first= achan;
+ act->chanbase.first= NULL;
+
+ /* end of list */
+ achan= act->chanbase.last;
+ achan->next= NULL;
+ tgrp->channels.last= achan;
+ act->chanbase.last= NULL;
+ }
+
+ /* Add temp-group to list */
+ BLI_addtail(&act->groups, tgrp);
+}
+
+/* link lists of channels that groups have */
+static void join_groups_action_temp (bAction *act)
+{
+ bActionGroup *agrp;
+ bActionChannel *achan;
+
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ ListBase tempGroup;
+
+ /* add list of channels to action's channels */
+ tempGroup= agrp->channels;
+ addlisttolist(&act->chanbase, &agrp->channels);
+ agrp->channels= tempGroup;
+
+ /* clear moved flag */
+ agrp->flag &= ~AGRP_MOVED;
+
+ /* if temp-group... remove from list (but don't free as it's on the stack!) */
+ if (agrp->flag & AGRP_TEMP) {
+ BLI_remlink(&act->groups, agrp);
+ break;
}
}
- /* clear temp flags */
- for (achan= act->chanbase.first; achan; achan= achan->next){
- achan->flag = achan->flag & ~ACHAN_MOVED;
+
+ /* clear "moved" flag from all achans */
+ for (achan= act->chanbase.first; achan; achan= achan->next)
+ achan->flag &= ~ACHAN_MOVED;
+}
+
+
+static short rearrange_actchannel_is_ok (Link *channel, short type)
+{
+ if (type == ACTTYPE_GROUP) {
+ bActionGroup *agrp= (bActionGroup *)channel;
+
+ if (SEL_AGRP(agrp) && !(agrp->flag & AGRP_MOVED))
+ return 1;
+ }
+ else if (type == ACTTYPE_ACHAN) {
+ bActionChannel *achan= (bActionChannel *)channel;
+
+ if (VISIBLE_ACHAN(achan) && SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED))
+ return 1;
}
- /* Clean up and redraw stuff */
- remake_action_ipos (act);
- BIF_undo_push("Top Action channel");
- allspace(REMAKEIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWNLA, 0);
+ return 0;
}
-void up_sel_action ()
+static short rearrange_actchannel_after_ok (Link *channel, short type)
+{
+ if (type == ACTTYPE_GROUP) {
+ bActionGroup *agrp= (bActionGroup *)channel;
+
+ if (agrp->flag & AGRP_TEMP)
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static short rearrange_actchannel_top (ListBase *list, Link *channel, short type)
+{
+ if (rearrange_actchannel_is_ok(channel, type)) {
+ /* take it out off the chain keep data */
+ BLI_remlink(list, channel);
+
+ /* make it first element */
+ BLI_insertlinkbefore(list, list->first, channel);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+static short rearrange_actchannel_up (ListBase *list, Link *channel, short type)
+{
+ if (rearrange_actchannel_is_ok(channel, type)) {
+ Link *prev= channel->prev;
+
+ if (prev) {
+ /* take it out off the chain keep data */
+ BLI_remlink(list, channel);
+
+ /* push it up */
+ BLI_insertlinkbefore(list, prev, channel);
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static short rearrange_actchannel_down (ListBase *list, Link *channel, short type)
+{
+ if (rearrange_actchannel_is_ok(channel, type)) {
+ Link *next = (channel->next) ? channel->next->next : NULL;
+
+ if (next) {
+ /* take it out off the chain keep data */
+ BLI_remlink(list, channel);
+
+ /* move it down */
+ BLI_insertlinkbefore(list, next, channel);
+
+ return 1;
+ }
+ else if (rearrange_actchannel_after_ok(list->last, type)) {
+ /* take it out off the chain keep data */
+ BLI_remlink(list, channel);
+
+ /* add at end */
+ BLI_addtail(list, channel);
+
+ return 1;
+ }
+ else {
+ /* take it out off the chain keep data */
+ BLI_remlink(list, channel);
+
+ /* add just before end */
+ BLI_insertlinkbefore(list, list->last, channel);
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static short rearrange_actchannel_bottom (ListBase *list, Link *channel, short type)
+{
+ if (rearrange_actchannel_is_ok(channel, type)) {
+ if (rearrange_actchannel_after_ok(list->last, type)) {
+ /* take it out off the chain keep data */
+ BLI_remlink(list, channel);
+
+ /* add at end */
+ BLI_addtail(list, channel);
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+/* Change the order of action-channels
+ * mode: REARRANGE_ACTCHAN_*
+ */
+void rearrange_action_channels (short mode)
{
bAction *act;
- bActionChannel *achan, *prev;
+ bActionChannel *achan, *chan;
+ bActionGroup *agrp, *grp;
+ bActionGroup tgrp;
- /* Get the selected action, exit if none are selected */
- act = G.saction->action;
- if (!act) return;
+ void *data;
+ short datatype;
- for (achan=act->chanbase.first; achan; achan= achan->next) {
- if (VISIBLE_ACHAN(achan)) {
- if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)){
- prev = achan->prev;
- if (prev) {
- /* take it out off the chain keep data */
- BLI_remlink (&act->chanbase, achan);
- /* push it up */
- BLI_insertlinkbefore(&act->chanbase, prev, achan);
- achan->flag |= ACHAN_MOVED;
- /* restart with rest of list */
- achan= achan->next;
+ short (*rearrange_func)(ListBase *, Link *, short);
+ short do_channels = 1;
+ char undostr[60];
+
+ /* Get the active action, exit if none are selected */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+ if (datatype != ACTCONT_ACTION) return;
+ act= (bAction *)data;
+
+ /* exit if invalid mode */
+ switch (mode) {
+ case REARRANGE_ACTCHAN_TOP:
+ strcpy(undostr, "Channel(s) to Top");
+ rearrange_func= rearrange_actchannel_top;
+ break;
+ case REARRANGE_ACTCHAN_UP:
+ strcpy(undostr, "Channel(s) Move Up");
+ rearrange_func= rearrange_actchannel_up;
+ break;
+ case REARRANGE_ACTCHAN_DOWN:
+ strcpy(undostr, "Channel(s) Move Down");
+ rearrange_func= rearrange_actchannel_down;
+ break;
+ case REARRANGE_ACTCHAN_BOTTOM:
+ strcpy(undostr, "Channel(s) to Bottom");
+ rearrange_func= rearrange_actchannel_bottom;
+ break;
+ default:
+ return;
+ }
+
+ /* make sure we're only operating with groups */
+ split_groups_action_temp(act, &tgrp);
+
+ /* rearrange groups first (and then, only consider channels if the groups weren't moved) */
+ #define GET_FIRST(list) ((mode > 0) ? (list.first) : (list.last))
+ #define GET_NEXT(item) ((mode > 0) ? (item->next) : (item->prev))
+
+ for (agrp= GET_FIRST(act->groups); agrp; agrp= grp) {
+ /* Get next group to consider */
+ grp= GET_NEXT(agrp);
+
+ /* try to do group first */
+ if (rearrange_func(&act->groups, (Link *)agrp, ACTTYPE_GROUP)) {
+ do_channels= 0;
+ agrp->flag |= AGRP_MOVED;
+ }
+ }
+
+ if (do_channels) {
+ for (agrp= GET_FIRST(act->groups); agrp; agrp= grp) {
+ /* Get next group to consider */
+ grp= GET_NEXT(agrp);
+
+ /* only consider action-channels if they're visible (group expanded) */
+ if (EXPANDED_AGRP(agrp)) {
+ for (achan= GET_FIRST(agrp->channels); achan; achan= chan) {
+ /* Get next channel to consider */
+ chan= GET_NEXT(achan);
+
+ /* Try to do channel */
+ if (rearrange_func(&agrp->channels, (Link *)achan, ACTTYPE_ACHAN))
+ achan->flag |= ACHAN_MOVED;
}
}
}
}
- /* clear temp flags */
- for (achan=act->chanbase.first; achan; achan= achan->next){
- achan->flag = achan->flag & ~ACHAN_MOVED;
- }
+ #undef GET_FIRST
+ #undef GET_NEXT
- /* Clean up and redraw stuff */
- remake_action_ipos (act);
- BIF_undo_push("Up Action channel");
- allspace(REMAKEIPO, 0);
+ /* assemble lists into one list (and clear moved tags) */
+ join_groups_action_temp(act);
+
+ /* Undo + redraw */
+ BIF_undo_push(undostr);
allqueue(REDRAWACTION, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWNLA, 0);
}
-void down_sel_action ()
+/* ******************************************************************* */
+/* CHANNEL VISIBILITY/FOLDING */
+
+/* Expand all channels to show full hierachy */
+void expand_all_action (void)
{
bAction *act;
- bActionChannel *achan, *next;
+ bActionChannel *achan;
+ bActionGroup *agrp;
+ short mode= 1;
/* Get the selected action, exit if none are selected */
+ // TODO: really this should be done with the "action editor api" stuff, but this will suffice for now
act = G.saction->action;
- if (!act) return;
+ if (act == NULL) return;
- for (achan= act->chanbase.last; achan; achan= achan->prev) {
- if (VISIBLE_ACHAN(achan)) {
- if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)){
- next = achan->next;
- if (next) next = next->next;
- if (next) {
- /* take it out off the chain keep data */
- BLI_remlink (&act->chanbase, achan);
- /* move it down */
- BLI_insertlinkbefore(&act->chanbase, next, achan);
- achan->flag |= ACHAN_MOVED;
- }
- else {
- /* take it out off the chain keep data */
- BLI_remlink (&act->chanbase, achan);
- /* add at end */
- BLI_addtail(&act->chanbase, achan);
- achan->flag |= ACHAN_MOVED;
+ /* check if expand all, or close all */
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ if (EXPANDED_AGRP(agrp)) {
+ mode= 0;
+ break;
+ }
+ }
+
+ if (mode == 0) {
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ if (VISIBLE_ACHAN(achan)) {
+ if (EXPANDED_ACHAN(achan)) {
+ mode= 0;
+ break;
}
}
}
}
- /* clear temp flags */
- for (achan= act->chanbase.first; achan; achan= achan->next){
- achan->flag = achan->flag & ~ACHAN_MOVED;
+
+ /* expand/collapse depending on mode */
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ if (mode == 1)
+ agrp->flag |= AGRP_EXPANDED;
+ else
+ agrp->flag &= ~AGRP_EXPANDED;
}
- /* Clean up and redraw stuff */
- remake_action_ipos (act);
- BIF_undo_push("Down Action channel");
- allspace(REMAKEIPO, 0);
+ for (achan=act->chanbase.first; achan; achan= achan->next) {
+ if (VISIBLE_ACHAN(achan)) {
+ if (mode == 1)
+ achan->flag |= (ACHAN_EXPANDED|ACHAN_SHOWIPO|ACHAN_SHOWCONS);
+ else
+ achan->flag &= ~(ACHAN_EXPANDED|ACHAN_SHOWIPO|ACHAN_SHOWCONS);
+ }
+ }
+
+ /* Cleanup and do redraws */
+ BIF_undo_push("Expand Action Hierachy");
allqueue(REDRAWACTION, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWNLA, 0);
}
-void bottom_sel_action ()
+/* For visible channels, expand/collapse one level */
+void openclose_level_action (short mode)
{
bAction *act;
bActionChannel *achan;
/* Get the selected action, exit if none are selected */
+ // TODO: really this should be done with the "action editor api" stuff, but this will suffice for now
act = G.saction->action;
- if (!act) return;
+ if (act == NULL) return;
- for (achan=act->chanbase.last; achan; achan= achan->prev) {
- if (VISIBLE_ACHAN(achan)) {
- if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)) {
- /* take it out off the chain keep data */
- BLI_remlink (&act->chanbase, achan);
- /* add at end */
- BLI_addtail(&act->chanbase, achan);
- achan->flag |= ACHAN_MOVED;
+ /* Abort if no operation required */
+ if (mode == 0) return;
+
+ /* Only affect selected channels */
+ // FIXME: check for action-groups
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ if (VISIBLE_ACHAN(achan) && SEL_ACHAN(achan)) {
+ if (EXPANDED_ACHAN(achan)) {
+ if (FILTER_IPO_ACHAN(achan) || FILTER_CON_ACHAN(achan)) {
+ if (mode < 0)
+ achan->flag &= ~(ACHAN_SHOWIPO|ACHAN_SHOWCONS);
+ }
+ else {
+ if (mode > 0)
+ achan->flag |= (ACHAN_SHOWIPO|ACHAN_SHOWCONS);
+ else
+ achan->flag &= ~ACHAN_EXPANDED;
+ }
}
- }
+ else {
+ if (mode > 0)
+ achan->flag |= ACHAN_EXPANDED;
+ }
+ }
}
- /* clear temp flags */
- for (achan=act->chanbase.first; achan; achan= achan->next) {
- achan->flag = achan->flag & ~ACHAN_MOVED;
+
+ /* Cleanup and do redraws */
+ BIF_undo_push("Expand/Collapse Action Level");
+ allqueue(REDRAWACTION, 0);
+}
+
+/* **************************************************** */
+/* ACTION MARKERS (PoseLib features) */
+/* NOTE: yes, these duplicate code from edittime.c a bit, but these do a bit more...
+ * These could get merged with those someday if need be... (Aligorith, 20071230)
+ */
+
+/* Makes the given marker the active one
+ * - deselect indicates whether unactive ones should be deselected too
+ */
+void action_set_activemarker (bAction *act, TimeMarker *active, short deselect)
+{
+ TimeMarker *marker;
+ int index= 0;
+
+ /* sanity checks */
+ if (act == NULL)
+ return;
+ act->active_marker= 0;
+
+ /* set appropriate flags for all markers */
+ for (marker=act->markers.first; marker; marker=marker->next, index++) {
+ /* only active may be active */
+ if (marker == active) {
+ act->active_marker= index + 1;
+ marker->flag |= (SELECT|ACTIVE);
+ }
+ else {
+ if (deselect)
+ marker->flag &= ~(SELECT|ACTIVE);
+ else
+ marker->flag &= ~ACTIVE;
+ }
+ }
+}
+
+/* Adds a local marker to the active action */
+void action_add_localmarker (bAction *act, int frame)
+{
+ TimeMarker *marker;
+ char name[64];
+
+ /* sanity checks */
+ if (act == NULL)
+ return;
+
+ /* get name of marker */
+ sprintf(name, "Pose");
+ if (sbutton(name, 0, sizeof(name)-1, "Name: ") == 0)
+ return;
+
+ /* add marker to action - replaces any existing marker there */
+ for (marker= act->markers.first; marker; marker= marker->next) {
+ if (marker->frame == frame) {
+ BLI_strncpy(marker->name, name, sizeof(marker->name));
+ break;
+ }
+ }
+ if (marker == NULL) {
+ marker= MEM_callocN(sizeof(TimeMarker), "ActionMarker");
+
+ BLI_strncpy(marker->name, name, sizeof(marker->name));
+ marker->frame= frame;
+
+ BLI_addtail(&act->markers, marker);
}
- /* Clean up and redraw stuff */
- remake_action_ipos (act);
- BIF_undo_push("Bottom Action channel");
- allspace(REMAKEIPO, 0);
+ /* validate the name */
+ BLI_uniquename(&act->markers, marker, "Pose", offsetof(TimeMarker, name), 64);
+
+ /* sets the newly added marker as the active one */
+ action_set_activemarker(act, marker, 1);
+
+ BIF_undo_push("Action Add Marker");
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+}
+
+/* Renames the active local marker to the active action */
+void action_rename_localmarker (bAction *act)
+{
+ TimeMarker *marker;
+ char name[64];
+ int val;
+
+ /* sanity checks */
+ if (act == NULL)
+ return;
+
+ /* get active marker to rename */
+ if (act->active_marker == 0)
+ return;
+ else
+ val= act->active_marker;
+
+ if (val <= 0) return;
+ marker= BLI_findlink(&act->markers, val-1);
+ if (marker == NULL) return;
+
+ /* get name of marker */
+ sprintf(name, marker->name);
+ if (sbutton(name, 0, sizeof(name)-1, "Name: ") == 0)
+ return;
+
+ /* copy then validate name */
+ BLI_strncpy(marker->name, name, sizeof(marker->name));
+ BLI_uniquename(&act->markers, marker, "Pose", offsetof(TimeMarker, name), 64);
+
+ /* undo and update */
+ BIF_undo_push("Action Rename Marker");
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+}
+
+/* Deletes all selected markers, and adjusts things as appropriate */
+void action_remove_localmarkers (bAction *act)
+{
+ TimeMarker *marker, *next;
+
+ /* sanity checks */
+ if (act == NULL)
+ return;
+
+ /* remove selected markers */
+ for (marker= act->markers.first; marker; marker= next) {
+ next= marker->next;
+
+ if (marker->flag & SELECT)
+ BLI_freelinkN(&act->markers, marker);
+ }
+
+ /* clear active just in case */
+ act->active_marker= 0;
+
+ /* undo and update */
+ BIF_undo_push("Action Remove Marker(s)");
+ allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWACTION, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWNLA, 0);
}
/* **************************************************** */
@@ -2570,7 +3923,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
data= get_action_context(&datatype);
if (val) {
- if ( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if ( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
@@ -2593,18 +3946,18 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case HOMEKEY:
do_action_buttons(B_ACTHOME); // header
break;
-
+
case AKEY:
if (mval[0]<NAMEWIDTH) {
- deselect_action_channels (1);
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWACTION, 0);
+ deselect_action_channels(1);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
- allqueue (REDRAWIPO, 0);
+ allqueue(REDRAWIPO, 0);
}
- else if (mval[0]>ACTWIDTH) {
+ else if (mval[0] > ACTWIDTH) {
if (G.qual == LR_CTRLKEY) {
- deselect_markers (1, 0);
+ deselect_markers(1, 0);
allqueue(REDRAWTIME, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWACTION, 0);
@@ -2612,14 +3965,14 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
allqueue(REDRAWSOUND, 0);
}
else {
- deselect_action_keys (1, 1);
- allqueue (REDRAWACTION, 0);
+ deselect_action_keys(1, 1);
+ allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
- allqueue (REDRAWIPO, 0);
+ allqueue(REDRAWIPO, 0);
}
}
break;
-
+
case BKEY:
if (G.qual & LR_CTRLKEY) {
borderselect_markers();
@@ -2629,30 +3982,64 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
borderselect_action();
}
break;
-
+
case CKEY:
/* scroll the window so the current
* frame is in the center.
*/
center_currframe();
break;
-
+
case DKEY:
- if (mval[0]>ACTWIDTH) {
+ if (mval[0] > ACTWIDTH) {
if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
duplicate_marker();
else if (G.qual == LR_SHIFTKEY)
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);
+ /* Action Channel Groups */
+ if (G.qual == LR_SHIFTKEY)
+ action_groups_group(0);
+ else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+ action_groups_group(1);
+ else if (G.qual == LR_ALTKEY)
+ action_groups_ungroup();
+
+ else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY|LR_ALTKEY)) {
+ /* WARNING: this is a debug tool which should be removed once everything is stable... */
+ bAction *act= G.saction->action;
+ bActionGroup *agrp;
+ bActionChannel *achan;
+
+ printf("Debug Action Grouping: \n");
+
+ printf("\tGroups: \n");
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ printf("\t\tGroup \"%s\" : %p... start={%p} end={%p} \n", agrp->name, agrp, agrp->channels.first, agrp->channels.last);
+ }
+
+ printf("\tAction Channels: \n");
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ printf("\t\tAchan \"%s\" : %p... group={%p} \n", achan->name, achan, achan->grp);
+ }
}
+
+ /* Transforms */
else {
- if (mval[0]>=ACTWIDTH)
- transform_action_keys('g', 0);
+ if (mval[0] >= ACTWIDTH) {
+ if (G.qual == LR_CTRLKEY)
+ transform_markers('g', 0);
+ else
+ transform_action_keys('g', 0);
+ }
}
break;
@@ -2679,6 +4066,18 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
allqueue(REDRAWMARKER, 0);
break;
+ case LKEY:
+ /* poselib manipulation - only for actions */
+ if (datatype == ACTCONT_ACTION) {
+ if (G.qual == LR_SHIFTKEY)
+ action_add_localmarker(data, CFRA);
+ else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+ action_rename_localmarker(data);
+ else if (G.qual == LR_ALTKEY)
+ action_remove_localmarkers(data);
+ }
+ break;
+
case MKEY:
if (G.qual & LR_SHIFTKEY) {
/* mirror keyframes */
@@ -2704,7 +4103,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case NKEY:
- if(G.qual==0) {
+ if (G.qual==0) {
numbuts_action();
/* no panel (yet). current numbuts are not easy to put in panel... */
@@ -2714,7 +4113,10 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case OKEY:
- clean_action();
+ if (G.qual & LR_ALTKEY)
+ sample_action_keys();
+ else
+ clean_action();
break;
case PKEY:
@@ -2729,7 +4131,12 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case SKEY:
if (mval[0]>=ACTWIDTH) {
- if (G.qual & LR_SHIFTKEY) {
+ if (G.qual == (LR_SHIFTKEY|LR_CTRLKEY)) {
+ if (data) {
+ snap_cfra_action();
+ }
+ }
+ else 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");
@@ -2769,30 +4176,40 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case PAGEUPKEY:
if (datatype == ACTCONT_ACTION) {
- if(G.qual & LR_SHIFTKEY)
- top_sel_action();
- else if (G.qual & LR_CTRLKEY)
- up_sel_action();
+ if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+ rearrange_action_channels(REARRANGE_ACTCHAN_TOP);
+ else if (G.qual == LR_SHIFTKEY)
+ rearrange_action_channels(REARRANGE_ACTCHAN_UP);
+ else if (G.qual == LR_CTRLKEY)
+ nextprev_action_keyframe(1);
else
nextprev_marker(1);
}
else if (datatype == ACTCONT_SHAPEKEY) {
/* only jump to markers possible (key channels can't be moved yet) */
- nextprev_marker(1);
+ if (G.qual == LR_CTRLKEY)
+ nextprev_action_keyframe(1);
+ else
+ nextprev_marker(1);
}
break;
case PAGEDOWNKEY:
if (datatype == ACTCONT_ACTION) {
- if(G.qual & LR_SHIFTKEY)
- bottom_sel_action();
- else if (G.qual & LR_CTRLKEY)
- down_sel_action();
+ if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+ rearrange_action_channels(REARRANGE_ACTCHAN_BOTTOM);
+ else if (G.qual == LR_SHIFTKEY)
+ rearrange_action_channels(REARRANGE_ACTCHAN_DOWN);
+ else if (G.qual == LR_CTRLKEY)
+ nextprev_action_keyframe(-1);
else
nextprev_marker(-1);
}
else if (datatype == ACTCONT_SHAPEKEY) {
/* only jump to markers possible (key channels can't be moved yet) */
- nextprev_marker(-1);
+ if (G.qual == LR_CTRLKEY)
+ nextprev_action_keyframe(-1);
+ else
+ nextprev_marker(-1);
}
break;
@@ -2807,11 +4224,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if (mval[0] >= NAMEWIDTH)
remove_marker();
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
break;
@@ -2819,18 +4232,18 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
* based on user preference USER_LMOUSESELECT
*/
case LEFTMOUSE:
- if(view2dmove(LEFTMOUSE)) // only checks for sliders
+ if (view2dmove(LEFTMOUSE)) /* only checks for sliders */
break;
else if ((G.v2d->mask.xmin==0) || (mval[0]>ACTWIDTH)) {
+ /* moving time-marker / current frame */
do {
getmouseco_areawin(mval);
-
areamouseco_to_ipoco(G.v2d, mval, &dx, &dy);
cfra= (int)dx;
- if(cfra< 1) cfra= 1;
+ if (cfra < 1) cfra= 1;
- if( cfra!=CFRA ) {
+ if (cfra != CFRA) {
CFRA= cfra;
update_for_newframe();
force_draw_all(0);
@@ -2872,24 +4285,49 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
/* Clicking in the main area of the action window
* selects keys and markers
*/
+ else if (G.qual & LR_ALTKEY) {
+ areamouseco_to_ipoco(G.v2d, mval, &dx, &dy);
+
+ /* sends a 1 for left and 0 for right */
+ selectkeys_leftright((dx < (float)CFRA), select_mode);
+ }
else
mouse_action(select_mode);
}
break;
+
+ case ACCENTGRAVEKEY:
+ if (datatype == ACTCONT_ACTION)
+ expand_all_action();
+ break;
+
case PADPLUSKEY:
- 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;
+ if (G.qual == LR_CTRLKEY) {
+ if (datatype == ACTCONT_ACTION)
+ openclose_level_action(1);
+ }
+ else {
+ 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:
- view2d_zoom(G.v2d, -0.15, sa->winx, sa->winy);
- test_view2d(G.v2d, sa->winx, sa->winy);
- view2d_do_locks(curarea, V2D_LOCK_COPY);
+ if (G.qual == LR_CTRLKEY) {
+ if (datatype == ACTCONT_ACTION)
+ openclose_level_action(-1);
+ }
+ else {
+ view2d_zoom(G.v2d, -0.15, sa->winx, sa->winy);
+ test_view2d(G.v2d, sa->winx, sa->winy);
+ view2d_do_locks(curarea, V2D_LOCK_COPY);
+
+ doredraw= 1;
+ }
+ break;
- doredraw= 1;
- break;
case MIDDLEMOUSE:
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
@@ -2898,8 +4336,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
- if(doredraw) addqueue(curarea->win, REDRAW, 1);
-
+ if (doredraw) addqueue(curarea->win, REDRAW, 1);
}
/* **************************************************** */
diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c
index 81467b95297..a2f784f996e 100644
--- a/source/blender/src/editarmature.c
+++ b/source/blender/src/editarmature.c
@@ -55,12 +55,14 @@
#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"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_editVert.h"
+#include "BLI_ghash.h"
#include "BKE_action.h"
#include "BKE_armature.h"
@@ -102,6 +104,8 @@
#include "PIL_time.h"
+#include "reeb.h" // FIX ME
+
#include "mydevice.h"
#include "blendef.h"
#include "nla.h"
@@ -249,7 +253,7 @@ void editbones_to_armature (ListBase *list, Object *ob)
for (eBone=list->first; eBone; eBone= neBone) {
float len= VecLenf(eBone->head, eBone->tail);
neBone= eBone->next;
- if(len <= FLT_EPSILON) {
+ if (len <= FLT_EPSILON) {
EditBone *fBone;
/* Find any bones that refer to this bone */
@@ -257,13 +261,13 @@ void editbones_to_armature (ListBase *list, Object *ob)
if (fBone->parent==eBone)
fBone->parent= eBone->parent;
}
- printf("Warning; removed zero sized bone: %s\n", eBone->name);
+ printf("Warning: removed zero sized bone: %s\n", eBone->name);
BLI_freelinkN (list, eBone);
}
}
/* Copy the bones from the editData into the armature */
- for (eBone=list->first; eBone; eBone=eBone->next){
+ for (eBone=list->first; eBone; eBone=eBone->next) {
newBone= MEM_callocN (sizeof(Bone), "bone");
eBone->temp= newBone; /* Associate the real Bones with the EditBones */
@@ -271,7 +275,8 @@ void editbones_to_armature (ListBase *list, Object *ob)
memcpy (newBone->head, eBone->head, sizeof(float)*3);
memcpy (newBone->tail, eBone->tail, sizeof(float)*3);
newBone->flag= eBone->flag;
- if(eBone->flag & BONE_ACTIVE) newBone->flag |= BONE_SELECTED; /* important, editbones can be active with only 1 point selected */
+ if (eBone->flag & BONE_ACTIVE)
+ newBone->flag |= BONE_SELECTED; /* important, editbones can be active with only 1 point selected */
newBone->roll = 0.0f;
newBone->weight = eBone->weight;
@@ -285,16 +290,15 @@ void editbones_to_armature (ListBase *list, Object *ob)
newBone->rad_tail= eBone->rad_tail;
newBone->segments= eBone->segments;
newBone->layer = eBone->layer;
-
}
/* Fix parenting in a separate pass to ensure ebone->bone connections
are valid at this point */
for (eBone=list->first;eBone;eBone=eBone->next) {
- newBone= (Bone*) eBone->temp;
- if (eBone->parent){
- newBone->parent=(Bone*) eBone->parent->temp;
- BLI_addtail (&newBone->parent->childbase,newBone);
+ newBone= (Bone *)eBone->temp;
+ if (eBone->parent) {
+ newBone->parent=(Bone *)eBone->parent->temp;
+ BLI_addtail(&newBone->parent->childbase,newBone);
{
float M_boneRest[3][3];
@@ -316,14 +320,14 @@ void editbones_to_armature (ListBase *list, Object *ob)
/* Get the new head and tail */
VecSubf (newBone->head, eBone->head, eBone->parent->tail);
VecSubf (newBone->tail, eBone->tail, eBone->parent->tail);
-
+
Mat3MulVecfl(iM_parentRest, newBone->head);
Mat3MulVecfl(iM_parentRest, newBone->tail);
}
}
/* ...otherwise add this bone to the armature's bonebase */
else
- BLI_addtail (&arm->bonebase,newBone);
+ BLI_addtail(&arm->bonebase,newBone);
}
/* Make a pass through the new armature to fix rolling */
@@ -331,7 +335,7 @@ void editbones_to_armature (ListBase *list, Object *ob)
fix_bonelist_roll (&arm->bonebase, list);
/* so all users of this armature should get rebuilt */
- for(obt= G.main->object.first; obt; obt= obt->id.next) {
+ for (obt= G.main->object.first; obt; obt= obt->id.next) {
if(obt->data==arm)
armature_rebuild_pose(obt, arm);
}
@@ -451,16 +455,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? */
@@ -486,15 +502,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);
}
}
}
@@ -1049,10 +1078,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;
@@ -1063,14 +1105,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);
}
}
}
@@ -1078,9 +1134,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);
}
@@ -1281,13 +1337,19 @@ void auto_align_armature(short mode)
{
bArmature *arm= G.obedit->data;
EditBone *ebone;
+ EditBone *flipbone = NULL;
float delta[3];
float curmat[3][3];
float *cursor= give_cursor();
for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
- if(arm->layer & ebone->layer) {
- if (ebone->flag & BONE_SELECTED) {
+ 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 */
@@ -1346,7 +1408,7 @@ void auto_align_armature(short mode)
Mat3MulMat3(diffmat, imat, curmat);
ebone->roll = atan2(diffmat[2][0], diffmat[2][2]);
- }
+ }
}
}
}
@@ -1426,7 +1488,7 @@ static EditBone *add_editbone(char *name)
EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
- BLI_strncpy (bone->name, name, 32);
+ BLI_strncpy(bone->name, name, 32);
unique_editbone_name(&G.edbo, bone->name);
BLI_addtail(&G.edbo, bone);
@@ -1446,7 +1508,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;
@@ -1457,7 +1519,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);
@@ -1468,12 +1532,18 @@ 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 */
@@ -1495,13 +1565,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");
}
@@ -1588,6 +1663,19 @@ void addvert_armature(void)
while(get_mbut()&R_MOUSE);
}
+/* adds an EditBone between the nominated locations (should be in the right space) */
+static EditBone *add_points_bone (float head[], float tail[])
+{
+ EditBone *ebo;
+
+ ebo= add_editbone("Bone");
+
+ VECCOPY(ebo->head, head);
+ VECCOPY(ebo->tail, tail);
+
+ return ebo;
+}
+
static EditBone *get_named_editbone(char *name)
{
@@ -1612,28 +1700,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);
+ }
}
-
+ }
+ }
}
@@ -1645,11 +1748,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;
@@ -1755,6 +1871,375 @@ void adduplicate_armature(void)
/* *************** END Adding stuff in editmode *************** */
+/* ************** Add/Remove stuff in editmode **************** */
+
+/* temporary data-structure for merge/fill bones */
+typedef struct EditBonePoint {
+ struct EditBonePoint *next, *prev;
+
+ EditBone *head_owner; /* EditBone which uses this point as a 'head' point */
+ EditBone *tail_owner; /* EditBone which uses this point as a 'tail' point */
+
+ float vec[3]; /* the actual location of the point in local/EditMode space */
+} EditBonePoint;
+
+/* find chain-tips (i.e. bones without children) */
+static void chains_find_tips (ListBase *list)
+{
+ EditBone *curBone, *ebo;
+ LinkData *ld;
+
+ /* note: this is potentially very slow ... there's got to be a better way */
+ for (curBone= G.edbo.first; curBone; curBone= curBone->next) {
+ short stop= 0;
+
+ /* is this bone contained within any existing chain? (skip if so) */
+ for (ld= list->first; ld; ld= ld->next) {
+ for (ebo= ld->data; ebo; ebo= ebo->parent) {
+ if (ebo == curBone) {
+ stop= 1;
+ break;
+ }
+ }
+
+ if (stop) break;
+ }
+ /* skip current bone if it is part of an existing chain */
+ if (stop) continue;
+
+ /* is any existing chain part of the chain formed by this bone? */
+ stop= 0;
+ for (ebo= curBone->parent; ebo; ebo= ebo->parent) {
+ for (ld= list->first; ld; ld= ld->next) {
+ if (ld->data == ebo) {
+ ld->data= curBone;
+ stop= 1;
+ break;
+ }
+ }
+
+ if (stop) break;
+ }
+ /* current bone has already been added to a chain? */
+ if (stop) continue;
+
+ /* add current bone to a new chain */
+ ld= MEM_callocN(sizeof(LinkData), "BoneChain");
+ ld->data= curBone;
+ BLI_addtail(list, ld);
+ }
+}
+
+
+static void fill_add_joint (EditBone *ebo, short eb_tail, ListBase *points)
+{
+ EditBonePoint *ebp;
+ float vec[3];
+ short found= 0;
+
+ if (eb_tail) {
+ VECCOPY(vec, ebo->tail);
+ }
+ else {
+ VECCOPY(vec, ebo->head);
+ }
+
+ // FIXME: this algorithm sucks... it misses things it shouldn't
+ for (ebp= points->first; ebp; ebp= ebp->next) {
+ if (VecEqual(ebp->vec, vec)) {
+ if (eb_tail) {
+ if ((ebp->head_owner) && (ebp->head_owner->parent == ebo)) {
+ /* so this bone's tail owner is this bone*/
+ ebp->tail_owner= ebo;
+ found= 1;
+ break;
+ }
+ }
+ else {
+ if ((ebp->tail_owner) && (ebo->parent == ebp->tail_owner)) {
+ /* so this bone's head owner is this bone */
+ ebp->head_owner= ebo;
+ found = 1;
+ break;
+ }
+ }
+ }
+ }
+
+ /* allocate a new point if no existing point was related */
+ if (found == 0) {
+ ebp= MEM_callocN(sizeof(EditBonePoint), "EditBonePoint");
+
+ if (eb_tail) {
+ VECCOPY(ebp->vec, ebo->tail);
+ ebp->tail_owner= ebo;
+ }
+ else {
+ VECCOPY(ebp->vec, ebo->head);
+ ebp->head_owner= ebo;
+ }
+
+ BLI_addtail(points, ebp);
+ }
+}
+
+/* bone adding between selected joints */
+void fill_bones_armature(void)
+{
+ bArmature *arm= G.obedit->data;
+ EditBone *ebo, *newbone=NULL;
+ ListBase points = {NULL, NULL};
+ int count;
+
+ /* loop over all bones, and only consider if visible */
+ for (ebo= G.edbo.first; ebo; ebo= ebo->next) {
+ if ((arm->layer & ebo->layer) && !(ebo->flag & BONE_HIDDEN_A)) {
+ if (!(ebo->flag & BONE_CONNECTED) && (ebo->flag & BONE_ROOTSEL))
+ fill_add_joint(ebo, 0, &points);
+ if (ebo->flag & BONE_TIPSEL)
+ fill_add_joint(ebo, 1, &points);
+ }
+ }
+
+ /* the number of joints determines how we fill:
+ * 1) between joint and cursor (joint=head, cursor=tail)
+ * 2) between the two joints (order is dependent on active-bone/hierachy)
+ * 3+) error (a smarter method involving finding chains needs to be worked out
+ */
+ count= BLI_countlist(&points);
+
+ if (count == 0) {
+ error("No joints selected");
+ return;
+ }
+ else if (count == 1) {
+ EditBonePoint *ebp;
+ float curs[3];
+
+ /* Get Points - selected joint */
+ ebp= (EditBonePoint *)points.first;
+
+ /* Get points - cursor (tail) */
+ VECCOPY (curs, give_cursor());
+
+ Mat4Invert(G.obedit->imat, G.obedit->obmat);
+ Mat4MulVecfl(G.obedit->imat, curs);
+
+ /* Create a bone */
+ newbone= add_points_bone(ebp->vec, curs);
+ }
+ else if (count == 2) {
+ EditBonePoint *ebp, *ebp2;
+ float head[3], tail[3];
+
+ /* check that the points don't belong to the same bone */
+ ebp= (EditBonePoint *)points.first;
+ ebp2= ebp->next;
+
+ if ((ebp->head_owner==ebp2->tail_owner) && (ebp->head_owner!=NULL)) {
+ error("Same bone selected...");
+ BLI_freelistN(&points);
+ return;
+ }
+ if ((ebp->tail_owner==ebp2->head_owner) && (ebp->tail_owner!=NULL)) {
+ error("Same bone selected...");
+ BLI_freelistN(&points);
+ return;
+ }
+
+ /* find which one should be the 'head' */
+ if ((ebp->head_owner && ebp2->head_owner) || (ebp->tail_owner && ebp2->tail_owner)) {
+ /* rule: whichever one is closer to 3d-cursor */
+ float curs[3];
+ float vecA[3], vecB[3];
+ float distA, distB;
+
+ /* get cursor location */
+ VECCOPY (curs, give_cursor());
+
+ Mat4Invert(G.obedit->imat, G.obedit->obmat);
+ Mat4MulVecfl(G.obedit->imat, curs);
+
+ /* get distances */
+ VecSubf(vecA, ebp->vec, curs);
+ VecSubf(vecB, ebp2->vec, curs);
+ distA= VecLength(vecA);
+ distB= VecLength(vecB);
+
+ /* compare distances - closer one therefore acts as direction for bone to go */
+ if (distA < distB) {
+ VECCOPY(head, ebp2->vec);
+ VECCOPY(tail, ebp->vec);
+ }
+ else {
+ VECCOPY(head, ebp->vec);
+ VECCOPY(tail, ebp2->vec);
+ }
+ }
+ else if (ebp->head_owner) {
+ VECCOPY(head, ebp->vec);
+ VECCOPY(tail, ebp2->vec);
+ }
+ else if (ebp2->head_owner) {
+ VECCOPY(head, ebp2->vec);
+ VECCOPY(tail, ebp->vec);
+ }
+
+ /* add new bone */
+ newbone= add_points_bone(head, tail);
+ }
+ else {
+ // FIXME.. figure out a method for multiple bones
+ error("Too many points selected");
+ printf("Points selected: %d \n", count);
+ BLI_freelistN(&points);
+ return;
+ }
+
+ /* free points */
+ BLI_freelistN(&points);
+
+ /* undo + updates */
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ BIF_undo_push("Fill Bones");
+}
+
+/* this function merges between two bones, removes them and those in-between,
+ * and adjusts the parent relationships for those in-between
+ */
+static void bones_merge(EditBone *start, EditBone *end, ListBase *chains)
+{
+ EditBone *ebo, *ebone, *newbone;
+ LinkData *chain;
+ float head[3], tail[3];
+
+ /* check if same bone */
+ if (start == end) {
+ printf("Error: same bone! \n");
+ printf("\tstart = %s, end = %s \n", start->name, end->name);
+ }
+
+ /* step 1: add a new bone
+ * - head = head/tail of start (default head)
+ * - tail = head/tail of end (default tail)
+ * - parent = parent of start
+ */
+ if ((start->flag & BONE_TIPSEL) && !(start->flag & (BONE_SELECTED|BONE_ACTIVE))) {
+ VECCOPY(head, start->tail);
+ }
+ else {
+ VECCOPY(head, start->head);
+ }
+ if ((end->flag & BONE_ROOTSEL) && !(end->flag & (BONE_SELECTED|BONE_ACTIVE))) {
+ VECCOPY(tail, end->head);
+ }
+ else {
+ VECCOPY(tail, end->tail);
+ }
+ newbone= add_points_bone(head, tail);
+ newbone->parent = start->parent;
+
+ /* step 2: parent children of in-between bones to newbone */
+ for (chain= chains->first; chain; chain= chain->next) {
+ /* ick: we need to check if parent of each bone in chain is */
+ for (ebo= chain->data; ebo; ebo= ebo->parent) {
+ short found= 0;
+
+ /* try to find which bone from the list to be removed, is the parent */
+ for (ebone= end; ebone; ebone= ebone->parent) {
+ if (ebo->parent == ebone) {
+ found= 1;
+ break;
+ }
+ }
+
+ /* adjust this bone's parent to newbone then */
+ if (found) {
+ ebo->parent= newbone;
+ break;
+ }
+ }
+ }
+
+ /* step 3: delete all bones between and including start and end */
+ for (ebo= end; ebo; ebo= ebone) {
+ ebone= (ebo == start) ? (NULL) : (ebo->parent);
+ BLI_freelinkN(&G.edbo, ebo);
+ }
+}
+
+/* bone merging - has a menu! */
+void merge_armature(void)
+{
+ bArmature *arm= G.obedit->data;
+ short val= 0;
+
+ /* process a menu to determine how to merge */
+ // TODO: there's room for more modes of merging stuff...
+ val= pupmenu("Merge Selected Bones%t|Within Chains%x1");
+ if (val <= 0) return;
+
+ if (val == 1) {
+ /* go down chains, merging bones */
+ ListBase chains = {NULL, NULL};
+ LinkData *chain, *nchain;
+ EditBone *ebo;
+
+ /* get chains (ends on chains) */
+ chains_find_tips(&chains);
+ if (chains.first == NULL) return;
+
+ /* each 'chain' is the last bone in the chain (with no children) */
+ for (chain= chains.first; chain; chain= nchain) {
+ EditBone *bstart= NULL, *bend= NULL;
+
+ /* temporarily remove chain from list of chains */
+ nchain= chain->next;
+ BLI_remlink(&chains, chain);
+
+ /* only consider bones that are visible and selected */
+ for (ebo= chain->data; ebo; ebo= ebo->parent) {
+ /* check if visible + selected */
+ if ( (arm->layer & ebo->layer) && !(ebo->flag & BONE_HIDDEN_A) &&
+ ((ebo->flag & BONE_CONNECTED) || (ebo->parent==NULL)) &&
+ (ebo->flag & (BONE_SELECTED|BONE_ACTIVE)) )
+ {
+ /* set either end or start (end gets priority, unless it is already set) */
+ if (bend == NULL)
+ bend= ebo;
+ else
+ bstart= ebo;
+ }
+ else {
+ /* chain is broken... merge any continous segments then clear */
+ if (bstart && bend)
+ bones_merge(bstart, bend, &chains);
+
+ bstart = NULL;
+ bend = NULL;
+ }
+ }
+
+ /* merge from bstart to bend if something not merged */
+ if (bstart && bend)
+ bones_merge(bstart, bend, &chains);
+
+ /* put back link */
+ BLI_insertlinkbefore(&chains, nchain, chain);
+ }
+
+ BLI_freelistN(&chains);
+ }
+
+ /* undo + updates */
+ countall();
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ BIF_undo_push("Merge Bones");
+}
+
+/* ************** END Add/Remove stuff in editmode ************ */
/* *************** Tools in editmode *********** */
@@ -1816,12 +2301,68 @@ void show_all_armature_bones(void)
BIF_undo_push("Reveal Bones");
}
+/* 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)
+{
+ EditBone *ebone;
+ float offset[3];
+
+ if ((selbone->parent) && (selbone->flag & BONE_CONNECTED))
+ selbone->parent->flag &= ~(BONE_TIPSEL);
+
+ /* make actbone the parent of selbone */
+ 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 (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;
+
+ 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;
+ }
+ }
+ }
+ }
+ 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;
- float offset[3];
short val;
/* find active bone to parent to */
@@ -1863,59 +2404,40 @@ void make_bone_parent(void)
/* When only the active bone is selected, and it has a parent,
* connect it to the parent, as that is the only possible outcome.
*/
- actbone->flag |= BONE_CONNECTED;
- VECCOPY(actbone->head, actbone->parent->tail);
- actbone->rad_head= actbone->parent->rad_tail;
+ 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)) {
- /* if selbone had a parent we clear parent tip */
- if (selbone->parent && (selbone->flag & BONE_CONNECTED))
- selbone->parent->flag &= ~(BONE_TIPSEL);
-
- /* make actbone the parent of selbone */
- selbone->parent= actbone;
+ /* parent selbone to actbone */
+ bone_connect_to_new_parent(selbone, actbone, val);
- /* 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: 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;
-
- VecAddf(selbone->tail, selbone->tail, offset);
+ 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);
- /* 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;
- }
- }
+ if (flipbone) {
+ if (flippar)
+ bone_connect_to_new_parent(flipbone, flippar, val);
+ else
+ bone_connect_to_new_parent(flipbone, actbone, val);
}
}
- else {
- /* Offset: Child bones will retain their distance from the parent tip */
- selbone->flag &= ~BONE_CONNECTED;
- }
}
-
}
}
}
@@ -1929,10 +2451,22 @@ void make_bone_parent(void)
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");
@@ -1941,13 +2475,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);
}
}
}
@@ -2266,6 +2800,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);
@@ -2276,9 +2812,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 {
@@ -2287,7 +2821,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);
@@ -2404,7 +2937,7 @@ int bone_looper(Object *ob, Bone *bone, void *data,
}
-static int bone_skinnable(Object *ob, Bone *bone, void *data)
+static int bone_skinnable(Object *ob, Bone *bone, void *datap)
{
/* Bones that are deforming
* are regarded to be "skinnable" and are eligible for
@@ -2428,16 +2961,26 @@ static int bone_skinnable(Object *ob, Bone *bone, void *data)
* pointers to bones that point to all
* skinnable bones.
*/
- Bone ***hbone;
+ Bone ***hbone;
+ int a, segments;
+ struct { Object *armob; void *list; int heat; } *data = datap;
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;
+ if(data->heat && data->armob->pose && get_pose_channel(data->armob->pose, bone->name))
+ segments = bone->segments;
+ else
+ segments = 1;
+
+ if (data->list != NULL) {
+ hbone = (Bone ***) &data->list;
+
+ for(a=0; a<segments; a++) {
+ **hbone = bone;
+ ++*hbone;
+ }
}
- return 1;
+ return segments;
}
}
return 0;
@@ -2458,7 +3001,7 @@ static int add_defgroup_unique_bone(Object *ob, Bone *bone, void *data)
return 0;
}
-static int dgroup_skinnable(Object *ob, Bone *bone, void *data)
+static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
{
/* Bones that are deforming
* are regarded to be "skinnable" and are eligible for
@@ -2484,19 +3027,28 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *data)
* of skinnable bones.
*/
bDeformGroup ***hgroup, *defgroup;
+ int a, segments;
+ struct { Object *armob; void *list; int heat; } *data= datap;
if(!(G.f & G_WEIGHTPAINT) || !(bone->flag & BONE_HIDDEN_P)) {
if (!(bone->flag & BONE_NO_DEFORM)) {
- if ( !(defgroup = get_named_vertexgroup(ob, bone->name)) ) {
+ if(data->heat && data->armob->pose && get_pose_channel(data->armob->pose, bone->name))
+ segments = bone->segments;
+ else
+ segments = 1;
+
+ if(!(defgroup = get_named_vertexgroup(ob, bone->name)))
defgroup = add_defgroup_name(ob, bone->name);
- }
- if (data != NULL) {
- hgroup = (bDeformGroup ***) data;
- **hgroup = defgroup;
- ++*hgroup;
+ if (data->list != NULL) {
+ hgroup = (bDeformGroup ***) &data->list;
+
+ for(a=0; a<segments; a++) {
+ **hgroup = defgroup;
+ ++*hgroup;
+ }
}
- return 1;
+ return segments;
}
}
return 0;
@@ -2534,7 +3086,7 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
/* 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);
@@ -2565,59 +3117,95 @@ void add_verts_to_dgroups(Object *ob, Object *par, int heat, int mirror)
* 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, **dgroupflip, **dgrouphandle;
+ bArmature *arm;
+ Bone **bonelist, *bone;
+ bDeformGroup **dgrouplist, **dgroupflip;
bDeformGroup *dgroup, *curdg;
- Mesh *mesh;
- float (*root)[3], (*tip)[3], (*verts)[3];
+ bPoseChannel *pchan;
+ Mesh *mesh;
+ Mat4 *bbone = NULL;
+ float (*root)[3], (*tip)[3], (*verts)[3];
int *selected;
- int numbones, vertsfilled = 0, i, j;
+ int numbones, vertsfilled = 0, i, j, segments = 0;
int wpmode = (G.f & G_WEIGHTPAINT);
+ struct { Object *armob; void *list; int heat; } looper_data;
- /* If the parent object is not an armature exit */
- arm = get_armature(par);
- if (!arm)
- return;
+ /* If the parent object is not an armature exit */
+ arm = get_armature(par);
+ if (!arm)
+ return;
+
+ looper_data.armob = par;
+ looper_data.heat= heat;
+ looper_data.list= NULL;
- /* count the number of skinnable bones */
- numbones = bone_looper(ob, arm->bonebase.first, NULL, bone_skinnable);
+ /* count the number of skinnable bones */
+ numbones = bone_looper(ob, arm->bonebase.first, &looper_data, 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_callocN(numbones*sizeof(Bone *), "bonelist");
- bonehandle = bonelist;
- bone_looper(ob, arm->bonebase.first, &bonehandle, bone_skinnable);
+ /* create an array of pointer to bones that are skinnable
+ * and fill it with all of the skinnable bones */
+ bonelist = MEM_callocN(numbones*sizeof(Bone *), "bonelist");
+ looper_data.list= bonelist;
+ bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable);
- /* create an array of pointers to the deform groups that
- * coorespond to the skinnable bones (creating them
- * as necessary. */
- dgrouplist = MEM_callocN(numbones*sizeof(bDeformGroup *), "dgrouplist");
- dgroupflip = MEM_callocN(numbones*sizeof(bDeformGroup *), "dgroupflip");
+ /* create an array of pointers to the deform groups that
+ * coorespond to the skinnable bones (creating them
+ * 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);
+ looper_data.list= dgrouplist;
+ bone_looper(ob, arm->bonebase.first, &looper_data, dgroup_skinnable);
- /* create an array of root and tip positions transformed into
+ /* 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");
+ root = MEM_callocN(numbones*sizeof(float)*3, "root");
+ tip = MEM_callocN(numbones*sizeof(float)*3, "tip");
selected = MEM_callocN(numbones*sizeof(int), "selected");
for (j=0; j < numbones; ++j) {
bone = bonelist[j];
dgroup = dgrouplist[j];
+ /* handle bbone */
+ if(heat) {
+ if(segments == 0) {
+ segments = 1;
+ bbone = NULL;
+
+ if(par->pose && (pchan=get_pose_channel(par->pose, bone->name))) {
+ if(bone->segments > 1) {
+ segments = bone->segments;
+ bbone = b_bone_spline_setup(pchan, 1);
+ }
+ }
+ }
+
+ segments--;
+ }
+
/* compute root and tip */
- VECCOPY(root[j], bone->arm_head);
- Mat4MulVecfl(par->obmat, root[j]);
+ if(bbone) {
+ VECCOPY(root[j], bbone[segments].mat[3]);
+ Mat4MulVecfl(bone->arm_mat, root[j]);
+ if(segments+1 < bone->segments) {
+ VECCOPY(tip[j], bbone[segments+1].mat[3])
+ Mat4MulVecfl(bone->arm_mat, tip[j]);
+ }
+ else
+ VECCOPY(tip[j], bone->arm_tail)
+ }
+ else {
+ VECCOPY(root[j], bone->arm_head);
+ VECCOPY(tip[j], bone->arm_tail);
+ }
- VECCOPY(tip[j], bone->arm_tail);
+ Mat4MulVecfl(par->obmat, root[j]);
Mat4MulVecfl(par->obmat, tip[j]);
/* set selected */
@@ -2744,7 +3332,7 @@ static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
if(arm->layer & bone->layer) {
if (bone->flag & BONE_SELECTED) {
bone->flag |= BONE_HIDDEN_P;
- bone->flag &= ~BONE_SELECTED;
+ bone->flag &= ~(BONE_SELECTED|BONE_ACTIVE);
}
}
return 0;
@@ -2774,6 +3362,7 @@ static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
if(arm->layer & bone->layer) {
if (~bone->flag & BONE_SELECTED) {
bone->flag |= BONE_HIDDEN_P;
+ bone->flag &= ~BONE_ACTIVE;
}
}
return 0;
@@ -2864,13 +3453,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);
+ }
}
}
@@ -3002,13 +3603,37 @@ void armature_flip_names(void)
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWBUTSOBJECT, 0);
- allqueue (REDRAWACTION, 0);
+ allqueue(REDRAWACTION, 0);
allqueue(REDRAWOOPS, 0);
BIF_undo_push("Flip names");
+}
+
+/* context: edtimode armature */
+void armature_autoside_names(short axis)
+{
+ bArmature *arm= G.obedit->data;
+ EditBone *ebone;
+ char newname[32];
+ for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
+ if (arm->layer & ebone->layer) {
+ if (ebone->flag & BONE_SELECTED) {
+ BLI_strncpy(newname, ebone->name, sizeof(newname));
+ bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis]);
+ armature_bone_rename(G.obedit->data, ebone->name, newname);
+ }
+ }
+ }
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWOOPS, 0);
+ BIF_undo_push("Auto-side name");
}
-/* context; editmode armature */
+/* context: editmode armature */
EditBone *armature_bone_get_mirrored(EditBone *ebo)
{
EditBone *eboflip= NULL;
@@ -3062,3 +3687,1108 @@ void transform_armature_mirror_update(void)
}
+/*****************************************************************************************************/
+/*************************************** SKELETON GENERATOR ******************************************/
+/*****************************************************************************************************/
+
+/**************************************** SYMMETRY HANDLING ******************************************/
+
+void markdownSymmetryArc(ReebArc *arc, ReebNode *node, int level);
+
+void mirrorAlongAxis(float v[3], float center[3], float axis[3])
+{
+ float dv[3], pv[3];
+
+ VecSubf(dv, v, center);
+ Projf(pv, dv, axis);
+ VecMulf(pv, -2);
+ VecAddf(v, v, pv);
+}
+
+/* Helper structure for radial symmetry */
+typedef struct RadialArc
+{
+ ReebArc *arc;
+ float n[3]; /* normalized vector joining the nodes of the arc */
+} RadialArc;
+
+void reestablishRadialSymmetry(ReebNode *node, int depth, float axis[3])
+{
+ RadialArc *ring = NULL;
+ RadialArc *unit;
+ float limit = G.scene->toolsettings->skgen_symmetry_limit;
+ int symmetric = 1;
+ int count = 0;
+ int i;
+
+ /* count the number of arcs in the symmetry ring */
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ ReebArc *connectedArc = node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->flags == -depth)
+ {
+ count++;
+ }
+ }
+
+ ring = MEM_callocN(sizeof(RadialArc) * count, "radial symmetry ring");
+ unit = ring;
+
+ /* fill in the ring */
+ for (unit = ring, i = 0; node->arcs[i] != NULL; i++)
+ {
+ ReebArc *connectedArc = node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->flags == -depth)
+ {
+ ReebNode *otherNode = OTHER_NODE(connectedArc, node);
+ float vec[3];
+
+ unit->arc = connectedArc;
+
+ /* project the node to node vector on the symmetry plane */
+ VecSubf(unit->n, otherNode->p, node->p);
+ Projf(vec, unit->n, axis);
+ VecSubf(unit->n, unit->n, vec);
+
+ Normalize(unit->n);
+
+ unit++;
+ }
+ }
+
+ /* sort ring */
+ for (i = 0; i < count - 1; i++)
+ {
+ float minAngle = 3; /* arbitrary high value, higher than 2, at least */
+ int minIndex = -1;
+ int j;
+
+ for (j = i + 1; j < count; j++)
+ {
+ float angle = Inpf(ring[i].n, ring[j].n);
+
+ /* map negative values to 1..2 */
+ if (angle < 0)
+ {
+ angle = 1 - angle;
+ }
+
+ if (angle < minAngle)
+ {
+ minIndex = j;
+ minAngle = angle;
+ }
+ }
+
+ /* swap if needed */
+ if (minIndex != i + 1)
+ {
+ RadialArc tmp;
+ tmp = ring[i + 1];
+ ring[i + 1] = ring[minIndex];
+ ring[minIndex] = tmp;
+ }
+ }
+
+ for (i = 0; i < count && symmetric; i++)
+ {
+ ReebNode *node1, *node2;
+ float tangent[3];
+ float normal[3];
+ float p[3];
+ int j = (i + 1) % count; /* next arc in the circular list */
+
+ VecAddf(tangent, ring[i].n, ring[j].n);
+ Crossf(normal, tangent, axis);
+
+ node1 = OTHER_NODE(ring[i].arc, node);
+ node2 = OTHER_NODE(ring[j].arc, node);
+
+ VECCOPY(p, node2->p);
+ mirrorAlongAxis(p, node->p, normal);
+
+ /* check if it's within limit before continuing */
+ if (VecLenf(node1->p, p) > limit)
+ {
+ symmetric = 0;
+ }
+
+ }
+
+ if (symmetric)
+ {
+ /* first pass, merge incrementally */
+ for (i = 0; i < count - 1; i++)
+ {
+ ReebNode *node1, *node2;
+ float tangent[3];
+ float normal[3];
+ int j = i + 1;
+
+ VecAddf(tangent, ring[i].n, ring[j].n);
+ Crossf(normal, tangent, axis);
+
+ node1 = OTHER_NODE(ring[i].arc, node);
+ node2 = OTHER_NODE(ring[j].arc, node);
+
+ /* mirror first node and mix with the second */
+ mirrorAlongAxis(node1->p, node->p, normal);
+ VecLerpf(node2->p, node2->p, node1->p, 1.0f / (j + 1));
+
+ /* Merge buckets
+ * there shouldn't be any null arcs here, but just to be safe
+ * */
+ if (ring[i].arc->bcount > 0 && ring[j].arc->bcount > 0)
+ {
+ ReebArcIterator iter1, iter2;
+ EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
+
+ initArcIterator(&iter1, ring[i].arc, node);
+ initArcIterator(&iter2, ring[j].arc, node);
+
+ bucket1 = nextBucket(&iter1);
+ bucket2 = nextBucket(&iter2);
+
+ /* Make sure they both start at the same value */
+ while(bucket1 && bucket1->val < bucket2->val)
+ {
+ bucket1 = nextBucket(&iter1);
+ }
+
+ while(bucket2 && bucket2->val < bucket1->val)
+ {
+ bucket2 = nextBucket(&iter2);
+ }
+
+
+ for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
+ {
+ bucket2->nv += bucket1->nv; /* add counts */
+
+ /* mirror on axis */
+ mirrorAlongAxis(bucket1->p, node->p, normal);
+ /* add bucket2 in bucket1 */
+ VecLerpf(bucket2->p, bucket2->p, bucket1->p, (float)bucket1->nv / (float)(bucket2->nv));
+ }
+ }
+ }
+
+ /* second pass, mirror back on previous arcs */
+ for (i = count - 1; i > 0; i--)
+ {
+ ReebNode *node1, *node2;
+ float tangent[3];
+ float normal[3];
+ int j = i - 1;
+
+ VecAddf(tangent, ring[i].n, ring[j].n);
+ Crossf(normal, tangent, axis);
+
+ node1 = OTHER_NODE(ring[i].arc, node);
+ node2 = OTHER_NODE(ring[j].arc, node);
+
+ /* copy first node than mirror */
+ VECCOPY(node2->p, node1->p);
+ mirrorAlongAxis(node2->p, node->p, normal);
+
+ /* Copy buckets
+ * there shouldn't be any null arcs here, but just to be safe
+ * */
+ if (ring[i].arc->bcount > 0 && ring[j].arc->bcount > 0)
+ {
+ ReebArcIterator iter1, iter2;
+ EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
+
+ initArcIterator(&iter1, ring[i].arc, node);
+ initArcIterator(&iter2, ring[j].arc, node);
+
+ bucket1 = nextBucket(&iter1);
+ bucket2 = nextBucket(&iter2);
+
+ /* Make sure they both start at the same value */
+ while(bucket1 && bucket1->val < bucket2->val)
+ {
+ bucket1 = nextBucket(&iter1);
+ }
+
+ while(bucket2 && bucket2->val < bucket1->val)
+ {
+ bucket2 = nextBucket(&iter2);
+ }
+
+
+ for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
+ {
+ /* copy and mirror back to bucket2 */
+ bucket2->nv = bucket1->nv;
+ VECCOPY(bucket2->p, bucket1->p);
+ mirrorAlongAxis(bucket2->p, node->p, normal);
+ }
+ }
+ }
+ }
+
+ MEM_freeN(ring);
+}
+
+void reestablishAxialSymmetry(ReebNode *node, int depth, float axis[3])
+{
+ ReebArc *arc1 = NULL;
+ ReebArc *arc2 = NULL;
+ ReebNode *node1 = NULL, *node2 = NULL;
+ float limit = G.scene->toolsettings->skgen_symmetry_limit;
+ float nor[3], vec[3], p[3];
+ int i;
+
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ ReebArc *connectedArc = node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->flags == -depth)
+ {
+ if (arc1 == NULL)
+ {
+ arc1 = connectedArc;
+ node1 = OTHER_NODE(arc1, node);
+ }
+ else
+ {
+ arc2 = connectedArc;
+ node2 = OTHER_NODE(arc2, node);
+ break; /* Can stop now, the two arcs have been found */
+ }
+ }
+ }
+
+ /* shouldn't happen, but just to be sure */
+ if (node1 == NULL || node2 == NULL)
+ {
+ return;
+ }
+
+ VecSubf(p, node1->p, node->p);
+ Crossf(vec, p, axis);
+ Crossf(nor, vec, axis);
+
+ /* mirror node2 along axis */
+ VECCOPY(p, node2->p);
+ mirrorAlongAxis(p, node->p, nor);
+
+ /* check if it's within limit before continuing */
+ if (VecLenf(node1->p, p) <= limit)
+ {
+
+ /* average with node1 */
+ VecAddf(node1->p, node1->p, p);
+ VecMulf(node1->p, 0.5f);
+
+ /* mirror back on node2 */
+ VECCOPY(node2->p, node1->p);
+ mirrorAlongAxis(node2->p, node->p, nor);
+
+ /* Merge buckets
+ * there shouldn't be any null arcs here, but just to be safe
+ * */
+ if (arc1->bcount > 0 && arc2->bcount > 0)
+ {
+ ReebArcIterator iter1, iter2;
+ EmbedBucket *bucket1 = NULL, *bucket2 = NULL;
+
+ initArcIterator(&iter1, arc1, node);
+ initArcIterator(&iter2, arc2, node);
+
+ bucket1 = nextBucket(&iter1);
+ bucket2 = nextBucket(&iter2);
+
+ /* Make sure they both start at the same value */
+ while(bucket1 && bucket1->val < bucket2->val)
+ {
+ bucket1 = nextBucket(&iter1);
+ }
+
+ while(bucket2 && bucket2->val < bucket1->val)
+ {
+ bucket2 = nextBucket(&iter2);
+ }
+
+
+ for ( ;bucket1 && bucket2; bucket1 = nextBucket(&iter1), bucket2 = nextBucket(&iter2))
+ {
+ bucket1->nv += bucket2->nv; /* add counts */
+
+ /* mirror on axis */
+ mirrorAlongAxis(bucket2->p, node->p, nor);
+ /* add bucket2 in bucket1 */
+ VecLerpf(bucket1->p, bucket1->p, bucket2->p, (float)bucket2->nv / (float)(bucket1->nv));
+
+ /* copy and mirror back to bucket2 */
+ bucket2->nv = bucket1->nv;
+ VECCOPY(bucket2->p, bucket1->p);
+ mirrorAlongAxis(bucket2->p, node->p, nor);
+ }
+ }
+ }
+}
+
+void markdownSecondarySymmetry(ReebNode *node, int depth, int level)
+{
+ float axis[3] = {0, 0, 0};
+ int count = 0;
+ int i;
+
+ /* Only reestablish spatial symmetry if needed */
+ if (G.scene->toolsettings->skgen_options & SKGEN_SYMMETRY)
+ {
+ /* count the number of branches in this symmetry group
+ * and determinte the axis of symmetry
+ * */
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ ReebArc *connectedArc = node->arcs[i];
+
+ /* depth is store as a negative in flag. symmetry level is positive */
+ if (connectedArc->flags == -depth)
+ {
+ count++;
+ }
+ /* If arc is on the axis */
+ else if (connectedArc->flags == level)
+ {
+ VecAddf(axis, axis, connectedArc->v1->p);
+ VecSubf(axis, axis, connectedArc->v2->p);
+ }
+ }
+
+ Normalize(axis);
+
+ /* Split between axial and radial symmetry */
+ if (count == 2)
+ {
+ reestablishAxialSymmetry(node, depth, axis);
+ }
+ else
+ {
+ reestablishRadialSymmetry(node, depth, axis);
+ }
+ }
+
+ /* markdown secondary symetries */
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ ReebArc *connectedArc = node->arcs[i];
+
+ if (connectedArc->flags == -depth)
+ {
+ /* markdown symmetry for branches corresponding to the depth */
+ markdownSymmetryArc(connectedArc, node, level + 1);
+ }
+ }
+}
+
+void markdownSymmetryArc(ReebArc *arc, ReebNode *node, int level)
+{
+ int i;
+ arc->flags = level;
+
+ node = OTHER_NODE(arc, node);
+
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ ReebArc *connectedArc = node->arcs[i];
+
+ if (connectedArc != arc)
+ {
+ ReebNode *connectedNode = OTHER_NODE(connectedArc, node);
+
+ /* symmetry level is positive value, negative values is subtree depth */
+ connectedArc->flags = -subtreeDepth(connectedNode, connectedArc);
+ }
+ }
+
+ arc = NULL;
+
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ int issymmetryAxis = 0;
+ ReebArc *connectedArc = node->arcs[i];
+
+ /* only arcs not already marked as symetric */
+ if (connectedArc->flags < 0)
+ {
+ int j;
+
+ /* true by default */
+ issymmetryAxis = 1;
+
+ for (j = 0; node->arcs[j] != NULL && issymmetryAxis == 1; j++)
+ {
+ ReebArc *otherArc = node->arcs[j];
+
+ /* different arc, same depth */
+ if (otherArc != connectedArc && otherArc->flags == connectedArc->flags)
+ {
+ /* not on the symmetry axis */
+ issymmetryAxis = 0;
+ }
+ }
+ }
+
+ /* arc could be on the symmetry axis */
+ if (issymmetryAxis == 1)
+ {
+ /* no arc as been marked previously, keep this one */
+ if (arc == NULL)
+ {
+ arc = connectedArc;
+ }
+ else
+ {
+ /* there can't be more than one symmetry arc */
+ arc = NULL;
+ break;
+ }
+ }
+ }
+
+ /* go down the arc continuing the symmetry axis */
+ if (arc)
+ {
+ markdownSymmetryArc(arc, node, level);
+ }
+
+
+ /* secondary symmetry */
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ ReebArc *connectedArc = node->arcs[i];
+
+ /* only arcs not already marked as symetric and is not the next arc on the symmetry axis */
+ if (connectedArc->flags < 0)
+ {
+ /* subtree depth is store as a negative value in the flag */
+ markdownSecondarySymmetry(node, -connectedArc->flags, level);
+ }
+ }
+}
+
+void markdownSymmetry(ReebGraph *rg)
+{
+ ReebNode *node;
+ ReebArc *arc;
+ /* only for Acyclic graphs */
+ int cyclic = isGraphCyclic(rg);
+
+ /* mark down all arcs as non-symetric */
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ arc->flags = 0;
+ }
+
+ /* mark down all nodes as not on the symmetry axis */
+ for (node = rg->nodes.first; node; node = node->next)
+ {
+ node->flags = 0;
+ }
+
+ /* node list is sorted, so lowest node is always the head (by design) */
+ node = rg->nodes.first;
+
+ /* only work on acyclic graphs and if only one arc is incident on the first node */
+ if (cyclic == 0 && countConnectedArcs(rg, node) == 1)
+ {
+ arc = node->arcs[0];
+
+ markdownSymmetryArc(arc, node, 1);
+
+ /* mark down non-symetric arcs */
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->flags < 0)
+ {
+ arc->flags = 0;
+ }
+ else
+ {
+ /* mark down nodes with the lowest level symmetry axis */
+ if (arc->v1->flags == 0 || arc->v1->flags > arc->flags)
+ {
+ arc->v1->flags = arc->flags;
+ }
+ if (arc->v2->flags == 0 || arc->v2->flags > arc->flags)
+ {
+ arc->v2->flags = arc->flags;
+ }
+ }
+ }
+ }
+}
+
+/**************************************** SUBDIVISION ALGOS ******************************************/
+
+EditBone * subdivideByAngle(ReebArc *arc, ReebNode *head, ReebNode *tail)
+{
+ EditBone *lastBone = NULL;
+ if (G.scene->toolsettings->skgen_options & SKGEN_CUT_ANGLE)
+ {
+ ReebArcIterator iter;
+ EmbedBucket *current = NULL;
+ EmbedBucket *previous = NULL;
+ EditBone *child = NULL;
+ EditBone *parent = NULL;
+ EditBone *root = NULL;
+ float angleLimit = (float)cos(G.scene->toolsettings->skgen_angle_limit * M_PI / 180.0f);
+
+ parent = add_editbone("Bone");
+ parent->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+ VECCOPY(parent->head, head->p);
+
+ root = parent;
+
+ for (initArcIterator(&iter, arc, head), previous = nextBucket(&iter), current = nextBucket(&iter);
+ current;
+ previous = current, current = nextBucket(&iter))
+ {
+ float vec1[3], vec2[3];
+ float len1, len2;
+
+ VecSubf(vec1, previous->p, parent->head);
+ VecSubf(vec2, current->p, previous->p);
+
+ len1 = Normalize(vec1);
+ len2 = Normalize(vec2);
+
+ if (len1 > 0.0f && len2 > 0.0f && Inpf(vec1, vec2) < angleLimit)
+ {
+ VECCOPY(parent->tail, previous->p);
+
+ child = add_editbone("Bone");
+ VECCOPY(child->head, parent->tail);
+ child->parent = parent;
+ child->flag |= BONE_CONNECTED|BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+
+ parent = child; /* new child is next parent */
+ }
+ }
+ VECCOPY(parent->tail, tail->p);
+
+ /* If the bone wasn't subdivided, delete it and return NULL
+ * to let subsequent subdivision methods do their thing.
+ * */
+ if (parent == root)
+ {
+ delete_bone(parent);
+ parent = NULL;
+ }
+
+ lastBone = parent; /* set last bone in the chain */
+ }
+
+ return lastBone;
+}
+
+float calcCorrelation(ReebArc *arc, int start, int end, float v0[3], float n[3])
+{
+ int len = 2 + abs(end - start);
+
+ if (len > 2)
+ {
+ ReebArcIterator iter;
+ EmbedBucket *bucket = NULL;
+ float avg_t = 0.0f;
+ float s_t = 0.0f;
+ float s_xyz = 0.0f;
+
+ /* First pass, calculate average */
+ for (initArcIterator2(&iter, arc, start, end), bucket = nextBucket(&iter);
+ bucket;
+ bucket = nextBucket(&iter))
+ {
+ float v[3];
+
+ VecSubf(v, bucket->p, v0);
+ avg_t += Inpf(v, n);
+ }
+
+ avg_t /= Inpf(n, n);
+ avg_t += 1.0f; /* adding start (0) and end (1) values */
+ avg_t /= len;
+
+ /* Second pass, calculate s_xyz and s_t */
+ for (initArcIterator2(&iter, arc, start, end), bucket = nextBucket(&iter);
+ bucket;
+ bucket = nextBucket(&iter))
+ {
+ float v[3], d[3];
+ float dt;
+
+ VecSubf(v, bucket->p, v0);
+ Projf(d, v, n);
+ VecSubf(v, v, d);
+
+ dt = VecLength(d) - avg_t;
+
+ s_t += dt * dt;
+ s_xyz += Inpf(v, v);
+ }
+
+ /* adding start(0) and end(1) values to s_t */
+ s_t += (avg_t * avg_t) + (1 - avg_t) * (1 - avg_t);
+
+ return 1.0f - s_xyz / s_t;
+ }
+ else
+ {
+ return 1.0f;
+ }
+}
+
+EditBone * subdivideByCorrelation(ReebArc *arc, ReebNode *head, ReebNode *tail)
+{
+ ReebArcIterator iter;
+ float n[3];
+ float CORRELATION_THRESHOLD = G.scene->toolsettings->skgen_correlation_limit;
+ EditBone *lastBone = NULL;
+
+ /* init iterator to get start and end from head */
+ initArcIterator(&iter, arc, head);
+
+ /* Calculate overall */
+ VecSubf(n, arc->buckets[iter.end].p, head->p);
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION &&
+ calcCorrelation(arc, iter.start, iter.end, head->p, n) < CORRELATION_THRESHOLD)
+ {
+ EmbedBucket *bucket = NULL;
+ EmbedBucket *previous = NULL;
+ EditBone *child = NULL;
+ EditBone *parent = NULL;
+ int boneStart = iter.start;
+
+ parent = add_editbone("Bone");
+ parent->flag = BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+ VECCOPY(parent->head, head->p);
+
+ for (previous = nextBucket(&iter), bucket = nextBucket(&iter);
+ bucket;
+ previous = bucket, bucket = nextBucket(&iter))
+ {
+ /* Calculate normal */
+ VecSubf(n, bucket->p, parent->head);
+
+ if (calcCorrelation(arc, boneStart, iter.index, parent->head, n) < CORRELATION_THRESHOLD)
+ {
+ VECCOPY(parent->tail, previous->p);
+
+ child = add_editbone("Bone");
+ VECCOPY(child->head, parent->tail);
+ child->parent = parent;
+ child->flag |= BONE_CONNECTED|BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+
+ parent = child; // new child is next parent
+ boneStart = iter.index; // start from end
+ }
+ }
+
+ VECCOPY(parent->tail, tail->p);
+
+ lastBone = parent; /* set last bone in the chain */
+ }
+
+ return lastBone;
+}
+
+float arcLengthRatio(ReebArc *arc)
+{
+ float arcLength = 0.0f;
+ float embedLength = 0.0f;
+ int i;
+
+ arcLength = VecLenf(arc->v1->p, arc->v2->p);
+
+ if (arc->bcount > 0)
+ {
+ /* Add the embedding */
+ for ( i = 1; i < arc->bcount; i++)
+ {
+ embedLength += VecLenf(arc->buckets[i - 1].p, arc->buckets[i].p);
+ }
+ /* Add head and tail -> embedding vectors */
+ embedLength += VecLenf(arc->v1->p, arc->buckets[0].p);
+ embedLength += VecLenf(arc->v2->p, arc->buckets[arc->bcount - 1].p);
+ }
+ else
+ {
+ embedLength = arcLength;
+ }
+
+ return embedLength / arcLength;
+}
+
+EditBone * subdivideByLength(ReebArc *arc, ReebNode *head, ReebNode *tail)
+{
+ EditBone *lastBone = NULL;
+ if ((G.scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH) &&
+ arcLengthRatio(arc) >= G.scene->toolsettings->skgen_length_ratio)
+ {
+ ReebArcIterator iter;
+ EmbedBucket *bucket = NULL;
+ EmbedBucket *previous = NULL;
+ EditBone *child = NULL;
+ EditBone *parent = NULL;
+ float lengthLimit = G.scene->toolsettings->skgen_length_limit;
+ int same = 0;
+
+ parent = add_editbone("Bone");
+ parent->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+ VECCOPY(parent->head, head->p);
+
+ initArcIterator(&iter, arc, head);
+
+ bucket = nextBucket(&iter);
+
+ while (bucket != NULL)
+ {
+ float *vec0 = NULL;
+ float *vec1 = bucket->p;
+
+ /* first bucket. Previous is head */
+ if (previous == NULL)
+ {
+ vec0 = head->p;
+ }
+ /* Previous is a valid bucket */
+ else
+ {
+ vec0 = previous->p;
+ }
+
+ /* If lengthLimit hits the current segment */
+ if (VecLenf(vec1, parent->head) > lengthLimit)
+ {
+ if (same == 0)
+ {
+ float dv[3], off[3];
+ float a, b, c, f;
+
+ /* Solve quadratic distance equation */
+ VecSubf(dv, vec1, vec0);
+ a = Inpf(dv, dv);
+
+ VecSubf(off, vec0, parent->head);
+ b = 2 * Inpf(dv, off);
+
+ c = Inpf(off, off) - (lengthLimit * lengthLimit);
+
+ f = (-b + (float)sqrt(b * b - 4 * a * c)) / (2 * a);
+
+ //printf("a %f, b %f, c %f, f %f\n", a, b, c, f);
+
+ if (isnan(f) == 0 && f < 1.0f)
+ {
+ VECCOPY(parent->tail, dv);
+ VecMulf(parent->tail, f);
+ VecAddf(parent->tail, parent->tail, vec0);
+ }
+ else
+ {
+ VECCOPY(parent->tail, vec1);
+ }
+ }
+ else
+ {
+ float dv[3];
+
+ VecSubf(dv, vec1, vec0);
+ Normalize(dv);
+
+ VECCOPY(parent->tail, dv);
+ VecMulf(parent->tail, lengthLimit);
+ VecAddf(parent->tail, parent->tail, parent->head);
+ }
+
+ child = add_editbone("Bone");
+ VECCOPY(child->head, parent->tail);
+ child->parent = parent;
+ child->flag |= BONE_CONNECTED|BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+
+ parent = child; // new child is next parent
+
+ same = 1; // mark as same
+ }
+ else
+ {
+ previous = bucket;
+ bucket = nextBucket(&iter);
+ same = 0; // Reset same
+ }
+ }
+ VECCOPY(parent->tail, tail->p);
+
+ lastBone = parent; /* set last bone in the chain */
+ }
+
+ return lastBone;
+}
+
+/***************************************** MAIN ALGORITHM ********************************************/
+
+void generateSkeletonFromReebGraph(ReebGraph *rg)
+{
+ GHash *arcBoneMap = NULL;
+ ReebArc *arc = NULL;
+ ReebNode *node = NULL;
+ Object *src = NULL;
+ Object *dst = NULL;
+
+ src = BASACT->object;
+
+ if (G.obedit != NULL)
+ {
+ exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); // freedata, and undo
+ }
+
+ setcursor_space(SPACE_VIEW3D, CURSOR_WAIT);
+
+ dst = add_object(OB_ARMATURE);
+ base_init_from_view3d(BASACT, G.vd);
+ G.obedit= BASACT->object;
+
+ /* Copy orientation from source */
+ VECCOPY(dst->loc, src->obmat[3]);
+ Mat4ToEul(src->obmat, dst->rot);
+ Mat4ToSize(src->obmat, dst->size);
+
+ where_is_object(G.obedit);
+
+ make_editArmature();
+
+ arcBoneMap = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+
+ markdownSymmetry(rg);
+
+ for (arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ EditBone *lastBone = NULL;
+ ReebNode *head, *tail;
+ int i;
+
+ /* Find out the direction of the arc through simple heuristics (in order of priority) :
+ *
+ * 1- Arcs on primary symmetry axis (flags == 1) point up (head: high weight -> tail: low weight)
+ * 2- Arcs starting on a primary axis point away from it (head: node on primary axis)
+ * 3- Arcs point down (head: low weight -> tail: high weight)
+ *
+ * Finally, the arc direction is stored in its flags: 1 (low -> high), -1 (high -> low)
+ */
+
+ /* if arc is a symmetry axis, internal bones go up the tree */
+ if (arc->flags == 1 && arc->v2->degree != 1)
+ {
+ head = arc->v2;
+ tail = arc->v1;
+
+ arc->flags = -1; /* mark arc direction */
+ }
+ /* Bones point AWAY from the symmetry axis */
+ else if (arc->v1->flags == 1)
+ {
+ head = arc->v1;
+ tail = arc->v2;
+
+ arc->flags = 1; /* mark arc direction */
+ }
+ else if (arc->v2->flags == 1)
+ {
+ head = arc->v2;
+ tail = arc->v1;
+
+ arc->flags = -1; /* mark arc direction */
+ }
+ /* otherwise, always go from low weight to high weight */
+ else
+ {
+ head = arc->v1;
+ tail = arc->v2;
+
+ arc->flags = 1; /* mark arc direction */
+ }
+
+ /* Loop over subdivision methods */
+ for (i = 0; lastBone == NULL && i < SKGEN_SUB_TOTAL; i++)
+ {
+ switch(G.scene->toolsettings->skgen_subdivisions[i])
+ {
+ case SKGEN_SUB_LENGTH:
+ lastBone = subdivideByLength(arc, head, tail);
+ break;
+ case SKGEN_SUB_ANGLE:
+ lastBone = subdivideByAngle(arc, head, tail);
+ break;
+ case SKGEN_SUB_CORRELATION:
+ lastBone = subdivideByCorrelation(arc, head, tail);
+ break;
+ }
+ }
+
+ if (lastBone == NULL)
+ {
+ EditBone *bone;
+ bone = add_editbone("Bone");
+ bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+
+ VECCOPY(bone->head, head->p);
+ VECCOPY(bone->tail, tail->p);
+
+ /* set first and last bone, since there's only one */
+ lastBone = bone;
+ }
+
+ BLI_ghash_insert(arcBoneMap, arc, lastBone);
+ }
+
+ /* Second pass, setup parent relationship between arcs */
+ for (node = rg->nodes.first; node; node = node->next)
+ {
+ ReebArc *incomingArc = NULL;
+ int i;
+
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ arc = node->arcs[i];
+
+ /* if arc is incoming into the node */
+ if ((arc->v1 == node && arc->flags == -1) || (arc->v2 == node && arc->flags == 1))
+ {
+ if (incomingArc == NULL)
+ {
+ incomingArc = arc;
+ /* loop further to make sure there's only one incoming arc */
+ }
+ else
+ {
+ /* skip this node if more than one incomingArc */
+ incomingArc = NULL;
+ break; /* No need to look further, we are skipping already */
+ }
+ }
+ }
+
+ if (incomingArc != NULL)
+ {
+ EditBone *parentBone = BLI_ghash_lookup(arcBoneMap, incomingArc);
+
+ /* Look for outgoing arcs and parent their bones */
+ for (i = 0; node->arcs[i] != NULL; i++)
+ {
+ arc = node->arcs[i];
+
+ /* if arc is outgoing from the node */
+ if ((arc->v1 == node && arc->flags == 1) || (arc->v2 == node && arc->flags == -1))
+ {
+ EditBone *childBone = BLI_ghash_lookup(arcBoneMap, arc);
+
+ /* find the root bone */
+ while(childBone->parent != NULL)
+ {
+ childBone = childBone->parent;
+ }
+
+ childBone->parent = parentBone;
+ childBone->flag |= BONE_CONNECTED;
+ }
+ }
+ }
+ }
+
+ BLI_ghash_free(arcBoneMap, NULL, NULL);
+
+ setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
+
+ BIF_undo_push("Generate Skeleton");
+}
+
+void generateSkeleton(void)
+{
+ EditMesh *em = G.editMesh;
+ ReebGraph *rg = NULL;
+ int i;
+
+ if (em == NULL)
+ return;
+
+ setcursor_space(SPACE_VIEW3D, CURSOR_WAIT);
+
+ if (weightFromDistance(em) == 0)
+ {
+ error("No selected vertex\n");
+ return;
+ }
+
+ renormalizeWeight(em, 1.0f);
+
+ weightToHarmonic(em);
+
+#ifdef DEBUG_REEB
+ weightToVCol(em);
+#endif
+
+ rg = generateReebGraph(em, G.scene->toolsettings->skgen_resolution);
+
+ verifyBuckets(rg);
+
+ /* Remove arcs without embedding */
+ filterNullReebGraph(rg);
+
+ verifyBuckets(rg);
+
+
+ i = 1;
+ /* filter until there's nothing more to do */
+ while (i == 1)
+ {
+ i = 0; /* no work done yet */
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_FILTER_EXTERNAL)
+ {
+ i |= filterExternalReebGraph(rg, G.scene->toolsettings->skgen_threshold_external * G.scene->toolsettings->skgen_resolution);
+ }
+
+ verifyBuckets(rg);
+
+ if (G.scene->toolsettings->skgen_options & SKGEN_FILTER_INTERNAL)
+ {
+ i |= filterInternalReebGraph(rg, G.scene->toolsettings->skgen_threshold_internal * G.scene->toolsettings->skgen_resolution);
+ }
+ }
+
+ verifyBuckets(rg);
+
+ repositionNodes(rg);
+
+ verifyBuckets(rg);
+
+ /* Filtering might have created degree 2 nodes, so remove them */
+ removeNormalNodes(rg);
+
+ verifyBuckets(rg);
+
+ for(i = 0; i < G.scene->toolsettings->skgen_postpro_passes; i++)
+ {
+ postprocessGraph(rg, G.scene->toolsettings->skgen_postpro);
+ }
+
+ buildAdjacencyList(rg);
+
+ sortNodes(rg);
+
+ sortArcs(rg);
+
+ generateSkeletonFromReebGraph(rg);
+
+ freeGraph(rg);
+}
diff --git a/source/blender/src/editconstraint.c b/source/blender/src/editconstraint.c
index 5da083ee9a2..ba73767387e 100644
--- a/source/blender/src/editconstraint.c
+++ b/source/blender/src/editconstraint.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 *****
*/
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
+#include "BLI_dynstr.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
@@ -73,55 +74,56 @@
#include "nla.h"
#include "mydevice.h"
+/* -------------- Get Active Constraint Data ---------------------- */
ListBase *get_active_constraint_channels (Object *ob, int forcevalid)
{
char ipstr[64];
- if (!ob)
+ if (ob == NULL)
return NULL;
/* See if we are a bone constraint */
if (ob->flag & OB_POSEMODE) {
bActionChannel *achan;
bPoseChannel *pchan;
-
+
pchan = get_active_posechannel(ob);
if (pchan) {
-
/* Make sure we have an action */
- if (!ob->action){
- if (!forcevalid)
+ if (ob->action == NULL) {
+ if (forcevalid == 0)
return NULL;
- ob->action=add_empty_action("Action");
+ ob->action= add_empty_action("Action");
}
/* Make sure we have an actionchannel */
achan = get_action_channel(ob->action, pchan->name);
- if (!achan){
- if (!forcevalid)
+ if (achan == NULL) {
+ if (forcevalid == 0)
return NULL;
- achan = MEM_callocN (sizeof(bActionChannel), "actionChannel");
-
- strcpy (achan->name, pchan->name);
- sprintf (ipstr, "%s.%s", ob->action->id.name+2, achan->name);
+ achan = MEM_callocN (sizeof(bActionChannel), "ActionChannel");
+
+ strcpy(achan->name, pchan->name);
+ sprintf(ipstr, "%s.%s", ob->action->id.name+2, achan->name);
ipstr[23]=0;
achan->ipo= add_ipo(ipstr, ID_AC);
- BLI_addtail (&ob->action->chanbase, achan);
+ BLI_addtail(&ob->action->chanbase, achan);
}
return &achan->constraintChannels;
}
- else return NULL;
+ else
+ return NULL;
}
/* else we return object constraints */
else {
- if(ob->ipoflag & OB_ACTION_OB) {
+ if (ob->ipoflag & OB_ACTION_OB) {
bActionChannel *achan = get_action_channel(ob->action, "Object");
- if(achan)
+ if (achan)
return &achan->constraintChannels;
else
return NULL;
@@ -133,14 +135,14 @@ ListBase *get_active_constraint_channels (Object *ob, int forcevalid)
/* if object in posemode, active bone constraints, else object constraints */
-ListBase *get_active_constraints(Object *ob)
+ListBase *get_active_constraints (Object *ob)
{
- if (!ob)
+ if (ob == NULL)
return NULL;
if (ob->flag & OB_POSEMODE) {
bPoseChannel *pchan;
-
+
pchan = get_active_posechannel(ob);
if (pchan)
return &pchan->constraints;
@@ -152,40 +154,46 @@ ListBase *get_active_constraints(Object *ob)
}
/* single constraint */
-bConstraint *get_active_constraint(Object *ob)
+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;
}
/* single channel, for ipo */
-bConstraintChannel *get_active_constraint_channel(Object *ob)
+bConstraintChannel *get_active_constraint_channel (Object *ob)
{
bConstraint *con;
bConstraintChannel *chan;
if (ob->flag & OB_POSEMODE) {
- if(ob->action) {
+ if (ob->action) {
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;
}
}
@@ -193,16 +201,20 @@ bConstraintChannel *get_active_constraint_channel(Object *ob)
}
}
else {
- for(con= ob->constraints.first; con; con= con->next)
- if(con->flag & CONSTRAINT_ACTIVE)
+ for (con= ob->constraints.first; con; con= con->next) {
+ if (con->flag & CONSTRAINT_ACTIVE)
break;
- if(con) {
+ }
+
+ if (con) {
ListBase *lb= get_active_constraint_channels(ob, 0);
-
- if(lb) {
- for(chan= lb->first; chan; chan= chan->next)
- if(!strcmp(chan->name, con->name))
+
+ if (lb) {
+ for (chan= lb->first; chan; chan= chan->next) {
+ if (!strcmp(chan->name, con->name))
break;
+ }
+
return chan;
}
}
@@ -211,24 +223,37 @@ bConstraintChannel *get_active_constraint_channel(Object *ob)
return NULL;
}
+/* -------------- Constraint Management (Add New, Remove, Rename) -------------------- */
-bConstraint *add_new_constraint(short type)
+/* Creates a new constraint, initialises its data, and returns it */
+bConstraint *add_new_constraint (short type)
{
bConstraint *con;
+ bConstraintTypeInfo *cti;
- con = MEM_callocN(sizeof(bConstraint), "constraint");
-
+ 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;
}
-void add_constraint_to_object(bConstraint *con, Object *ob)
+/* Adds the given constraint to the Object-level set of constraints for the given Object */
+void add_constraint_to_object (bConstraint *con, Object *ob)
{
ListBase *list;
list = &ob->constraints;
@@ -237,401 +262,52 @@ void add_constraint_to_object(bConstraint *con, Object *ob)
unique_constraint_name(con, list);
BLI_addtail(list, con);
+ if (proxylocked_constraints_owner(ob, NULL))
+ con->flag |= CONSTRAINT_PROXY_LOCAL;
+
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)
+/* 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)
{
- /*
- * If the target for this constraint is target, return a pointer
- * to the name for this constraints subtarget ... NULL otherwise
- */
-
- if (constraint_has_target(con)) {
- Object *tar;
- char *subtarget;
+ 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);
- tar = get_constraint_target(con, &subtarget);
- if (tar==target) return subtarget;
- }
-
- 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)
-{
-
- bConstraint *curcon;
- ListBase *conlist= NULL;
- int type;
-
- if (owner==NULL) return;
-
- /* Check parents */
- /* Get the constraint list for this object */
-
- if (strlen (substring)) {
- switch (owner->type) {
- case OB_ARMATURE:
- type = TARGET_BONE;
- break;
- default:
- type = TARGET_OBJECT;
- break;
+ if (index < 0) {
+ if (abs(index) < num_targets)
+ index= num_targets - abs(index);
+ else
+ index= num_targets - 1;
}
- }
- else
- type = TARGET_OBJECT;
-
-
- switch (type) {
- case TARGET_OBJECT:
- conlist = &owner->constraints;
- break;
- case TARGET_BONE:
- {
- Bone *bone;
- bPoseChannel *chan;
-
- bone = get_named_bone(((bArmature*)owner->data), substring);
- chan = get_pose_channel (owner->pose, substring);
- if (bone && chan){
- conlist = &chan->constraints;
- }
- }
- break;
- }
-
- /* Check all constraints - is constraint valid? */
- if (conlist) {
- for (curcon = conlist->first; curcon; curcon=curcon->next) {
- curcon->flag &= ~CONSTRAINT_DISABLE;
-
- switch (curcon->type) {
- case CONSTRAINT_TYPE_PYTHON:
- {
- bPythonConstraint *data = curcon->data;
- float dummy_matrix[4][4];
-
- /* 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;
- }
- data->flag &= ~PYCON_SCRIPTERROR;
-
- /* does the constraint require target input? */
- if (BPY_pyconstraint_targets(data, dummy_matrix))
- data->flag |= PYCON_USETARGETS;
- else
- data->flag &= ~PYCON_USETARGETS;
-
- /* check whether we have a valid target */
- if (data->flag & PYCON_USETARGETS) {
- /* validate target */
- 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;
- }
- }
- else {
- /* don't hold onto target */
- data->tar = NULL;
- BLI_strncpy(data->subtarget, "", 32);
- }
- }
- break;
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *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;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *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;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *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;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *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;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *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;
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *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;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *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;
- }
- if (data->reserved2==data->reserved1){
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- if (data->reserved2+3==data->reserved1){
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *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;
- }
-
- if (data->lockflag==data->trackflag){
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- if (data->lockflag+3==data->trackflag){
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- }
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *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;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data = curcon->data;
-
- if (!exist_object(data->tar)){
- data->tar = NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- if (data->tar->type != OB_CURVE){
- data->tar = NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- if (data->upflag==data->trackflag){
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- if (data->upflag+3==data->trackflag){
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data = curcon->data;
-
- if (!exist_object(data->tar)){
- data->tar = NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
-
- if (data->tar->type != OB_CURVE){
- data->tar = NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- break;
- }
- else {
- Curve *cu= data->tar->data;
-
- /* auto-set 'Path' setting on curve so this works */
- cu->flag |= CU_PATH;
- }
- }
- 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;
+ 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;
}
}
- }
-}
-
-static void test_bonelist_constraints (Object *owner, ListBase *list)
-{
- Bone *bone;
-
- for (bone = list->first; bone; bone=bone->next) {
- test_constraints(owner, bone->name);
- test_bonelist_constraints (owner, &bone->childbase);
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
}
}
-void object_test_constraints (Object *owner)
-{
- test_constraints(owner, "");
-
- if(owner->type==OB_ARMATURE) {
- bArmature *arm;
- arm = get_armature(owner);
- if (arm)
- test_bonelist_constraints (owner, &arm->bonebase);
- }
-
-}
-
/* context: active object in posemode, active channel, optional selected channel */
-void add_constraint(int only_IK)
+void add_constraint (short only_IK)
{
Object *ob= OBACT, *obsel=NULL;
bPoseChannel *pchanact=NULL, *pchansel=NULL;
@@ -640,95 +316,94 @@ void add_constraint(int only_IK)
short nr;
/* paranoia checks */
- if(ob==NULL || ob==G.obedit) return;
+ if ((ob==NULL) || (ob==G.obedit))
+ return;
- if(ob->pose && (ob->flag & OB_POSEMODE)) {
+ if ((ob->pose) && (ob->flag & OB_POSEMODE)) {
bArmature *arm= ob->data;
/* find active channel */
pchanact= get_active_posechannel(ob);
- if(pchanact==NULL) return;
-
- /* check protection */
- if(ob->proxy && (pchanact->bone->layer & arm->layer_protected)) {
- error("Bone is Proxy protected");
+ if (pchanact==NULL)
return;
- }
/* find selected bone */
- for(pchansel= ob->pose->chanbase.first; pchansel; pchansel= pchansel->next) {
- if(pchansel!=pchanact)
- if(pchansel->bone->flag & BONE_SELECTED)
- if(pchansel->bone->layer & arm->layer)
+ for (pchansel=ob->pose->chanbase.first; pchansel; pchansel=pchansel->next) {
+ if (pchansel != pchanact) {
+ if (pchansel->bone->flag & BONE_SELECTED) {
+ if (pchansel->bone->layer & arm->layer)
break;
+ }
+ }
}
}
/* find selected object */
- for(base= FIRSTBASE; base; base= base->next)
- if( TESTBASE(base) && base->object!=ob )
+ for (base= FIRSTBASE; base; base= base->next) {
+ if ((TESTBASE(base)) && (base->object!=ob))
obsel= base->object;
+ }
/* the only_IK caller has checked for posemode! */
- if(only_IK) {
- for(con= pchanact->constraints.first; con; con= con->next) {
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) break;
+ if (only_IK) {
+ for (con= pchanact->constraints.first; con; con= con->next) {
+ if (con->type==CONSTRAINT_TYPE_KINEMATIC) break;
}
- if(con) {
+ if (con) {
error("Pose Channel already has IK");
return;
}
- if(pchansel)
+ if (pchansel)
nr= pupmenu("Add IK Constraint%t|To Active Bone%x10");
- else if(obsel)
+ else if (obsel)
nr= pupmenu("Add IK Constraint%t|To Active Object%x10");
else
nr= pupmenu("Add IK Constraint%t|To New Empty Object%x10|Without Target%x11");
}
else {
- if(pchanact) {
- if(pchansel)
- 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|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|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");
+ if (pchanact) {
+ if (pchansel)
+ 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|Limit Distance%x21|%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|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|Limit Distance%x21|%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|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|Limit Distance%x21|%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|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|Script%x18");
+ 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|Limit Distance%x21|%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|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|Script%x18");
- else if(obsel)
- 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|Script%x18");
+ if ((obsel) && (obsel->type==OB_CURVE))
+ 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|Limit Distance%x21|%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|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|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|%l|Action%x16|Script%x18");
else
- 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|Script%x18");
+ 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|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|%l|Action%x16|Script%x18");
}
}
- if(nr<1) return;
+ if (nr < 1) return;
/* handle IK separate */
- if(nr==10 || nr==11) {
-
- /* prevent weird chains... */
- if(pchansel) {
+ if (nr==10 || nr==11) {
+ /* ik - prevent weird chains... */
+ if (pchansel) {
bPoseChannel *pchan= pchanact;
- while(pchan) {
- if(pchan==pchansel) break;
+ while (pchan) {
+ if (pchan==pchansel) break;
pchan= pchan->parent;
}
- if(pchan) {
+ if (pchan) {
error("IK root cannot be linked to IK tip");
return;
}
+
pchan= pchansel;
- while(pchan) {
- if(pchan==pchanact) break;
+ while (pchan) {
+ if (pchan==pchanact) break;
pchan= pchan->parent;
}
- if(pchan) {
+ if (pchan) {
error("IK tip cannot be linked to IK root");
return;
}
@@ -737,11 +412,14 @@ void add_constraint(int only_IK)
con = add_new_constraint(CONSTRAINT_TYPE_KINEMATIC);
BLI_addtail(&pchanact->constraints, con);
unique_constraint_name(con, &pchanact->constraints);
- pchanact->constflag |= PCHAN_HAS_IK; // for draw, but also for detecting while pose solving
- if(nr==11) pchanact->constflag |= PCHAN_HAS_TARGET;
+ pchanact->constflag |= PCHAN_HAS_IK; /* for draw, but also for detecting while pose solving */
+ if (nr==11)
+ pchanact->constflag |= PCHAN_HAS_TARGET;
+ if (proxylocked_constraints_owner(ob, pchanact))
+ con->flag |= CONSTRAINT_PROXY_LOCAL;
}
else {
-
+ /* normal constraints - add data */
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);
@@ -768,11 +446,10 @@ void add_constraint(int only_IK)
}
else if (nr==18) {
char *menustr;
- int scriptint= 0, dummy_int=0;
- float dummy_matrix[4][4];
+ int scriptint= 0;
/* popup a list of usable scripts */
- menustr = buildmenu_pyconstraints(NULL, &dummy_int);
+ menustr = buildmenu_pyconstraints(NULL, &scriptint);
scriptint = pupmenu(menustr);
MEM_freeN(menustr);
@@ -783,11 +460,7 @@ void add_constraint(int only_IK)
validate_pyconstraint_cb(con->data, &scriptint);
/* make sure target allowance is set correctly */
- dummy_int = BPY_pyconstraint_targets(con->data, dummy_matrix);
- if (dummy_int) {
- bPythonConstraint *pycon= (bPythonConstraint *)con->data;
- pycon->flag |= PYCON_USETARGETS;
- }
+ BPY_pyconstraint_update(ob, con);
}
}
else if (nr==19) {
@@ -802,6 +475,7 @@ void add_constraint(int only_IK)
}
}
else if (nr==20) con = add_new_constraint(CONSTRAINT_TYPE_TRANSFORM);
+ else if (nr==21) con = add_new_constraint(CONSTRAINT_TYPE_DISTLIMIT);
if (con==NULL) return; /* paranoia */
@@ -809,19 +483,23 @@ void add_constraint(int only_IK)
BLI_addtail(&pchanact->constraints, con);
unique_constraint_name(con, &pchanact->constraints);
pchanact->constflag |= PCHAN_HAS_CONST; /* for draw */
+ if (proxylocked_constraints_owner(ob, pchanact))
+ con->flag |= CONSTRAINT_PROXY_LOCAL;
}
else {
BLI_addtail(&ob->constraints, con);
unique_constraint_name(con, &ob->constraints);
+ if (proxylocked_constraints_owner(ob, NULL))
+ con->flag |= CONSTRAINT_PROXY_LOCAL;
}
}
/* set the target */
if (pchansel) {
- set_constraint_target(con, ob, pchansel->name);
+ set_constraint_nth_target(con, ob, pchansel->name, 0);
}
- else if(obsel) {
- set_constraint_target(con, obsel, NULL);
+ else if (obsel) {
+ set_constraint_nth_target(con, obsel, "", 0);
}
else if (ELEM4(nr, 11, 13, 14, 15)==0) { /* add new empty as target */
Base *base= BASACT, *newbase;
@@ -835,7 +513,7 @@ void add_constraint(int only_IK)
/* transform cent to global coords for loc */
if (pchanact) {
- if(only_IK)
+ if (only_IK)
VecMat4MulVecfl(obt->loc, ob->obmat, pchanact->pose_tail);
else
VecMat4MulVecfl(obt->loc, ob->obmat, pchanact->pose_head);
@@ -843,7 +521,7 @@ 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;
@@ -852,7 +530,7 @@ void add_constraint(int only_IK)
/* active flag */
con->flag |= CONSTRAINT_ACTIVE;
- for(con= con->prev; con; con= con->prev)
+ for (con= con->prev; con; con= con->prev)
con->flag &= ~CONSTRAINT_ACTIVE;
DAG_scene_sort(G.scene); // sort order of objects
@@ -864,9 +542,9 @@ void add_constraint(int only_IK)
else
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB); // and all its relations
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWBUTSOBJECT, 0);
- allqueue (REDRAWOOPS, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
if (only_IK)
BIF_undo_push("Add IK Constraint");
@@ -875,30 +553,36 @@ void add_constraint(int only_IK)
}
-void ob_clear_constraints(void)
+/* Remove all constraints from the active object */
+void ob_clear_constraints (void)
{
Object *ob= OBACT;
/* paranoia checks */
- if(!ob) return;
- if(ob==G.obedit || (ob->flag & OB_POSEMODE)) return;
+ if ((ob==NULL) || (ob==G.obedit) || (ob->flag & OB_POSEMODE))
+ return;
- if(okee("Clear Constraints")==0) return;
+ /* get user permission */
+ if (okee("Clear Constraints")==0)
+ return;
+ /* do freeing */
free_constraints(&ob->constraints);
+ /* do updates */
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWBUTSOBJECT, 0);
- allqueue (REDRAWOOPS, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
BIF_undo_push("Clear Constraint(s)");
-
}
-/* con already has the new name */
-void rename_constraint(Object *ob, bConstraint *con, char *oldname)
+/* Rename the given constraint
+ * - con already has the new name
+ */
+void rename_constraint (Object *ob, bConstraint *con, char *oldname)
{
bConstraint *tcon;
bConstraintChannel *conchan;
@@ -907,33 +591,35 @@ void rename_constraint(Object *ob, bConstraint *con, char *oldname)
char *channame="";
/* get context by searching for con (primitive...) */
- for(tcon= ob->constraints.first; tcon; tcon= tcon->next)
- if(tcon==con)
+ for (tcon= ob->constraints.first; tcon; tcon= tcon->next) {
+ if (tcon==con)
break;
+ }
- if(tcon) {
+ if (tcon) {
conlist= &ob->constraints;
channame= "Object";
from_object= 1;
}
- else if(ob->pose) {
+ else if (ob->pose) {
bPoseChannel *pchan;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- for(tcon= pchan->constraints.first; tcon; tcon= tcon->next) {
- if(tcon==con)
+ for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ for (tcon= pchan->constraints.first; tcon; tcon= tcon->next) {
+ if (tcon==con)
break;
}
- if(tcon)
+ if (tcon)
break;
}
- if(tcon) {
+
+ if (tcon) {
conlist= &pchan->constraints;
channame= pchan->name;
}
}
- if(conlist==NULL) {
+ if (conlist==NULL) {
printf("rename constraint failed\n"); /* should not happen in UI */
return;
}
@@ -942,29 +628,235 @@ void rename_constraint(Object *ob, bConstraint *con, char *oldname)
unique_constraint_name (con, conlist);
/* own channels */
- if(from_object) {
- for(conchan= ob->constraintChannels.first; conchan; conchan= conchan->next) {
- if( strcmp(oldname, conchan->name)==0 )
+ if (from_object) {
+ for (conchan= ob->constraintChannels.first; conchan; conchan= conchan->next) {
+ if ( strcmp(oldname, conchan->name)==0 )
BLI_strncpy(conchan->name, con->name, sizeof(conchan->name));
}
}
+
/* own action */
- if(ob->action) {
+ if (ob->action) {
bActionChannel *achan= get_action_channel(ob->action, channame);
- if(achan) {
+ if (achan) {
conchan= get_constraint_channel(&achan->constraintChannels, oldname);
- if(conchan)
+ if (conchan)
BLI_strncpy(conchan->name, con->name, sizeof(conchan->name));
}
}
+}
+
+
+/* ------------- Constraint Sanity Testing ------------------- */
+
+/* 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[])
+{
+ bConstraint *curcon;
+ ListBase *conlist= NULL;
+ int type;
+
+ if (owner==NULL) return;
+
+ /* Check parents */
+ if (strlen (substring)) {
+ switch (owner->type) {
+ case OB_ARMATURE:
+ type = CONSTRAINT_OBTYPE_BONE;
+ break;
+ default:
+ type = CONSTRAINT_OBTYPE_OBJECT;
+ break;
+ }
+ }
+ else
+ type = CONSTRAINT_OBTYPE_OBJECT;
+
+ /* Get the constraint list for this object */
+ switch (type) {
+ case CONSTRAINT_OBTYPE_OBJECT:
+ conlist = &owner->constraints;
+ break;
+ 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) {
+ conlist = &chan->constraints;
+ }
+ }
+ break;
+ }
+ /* Check all constraints - is constraint valid? */
+ if (conlist) {
+ for (curcon = conlist->first; curcon; curcon=curcon->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(curcon);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ /* clear disabled-flag first */
+ curcon->flag &= ~CONSTRAINT_DISABLE;
+
+ /* Check specialised data (settings) for constraints that need this */
+ if (curcon->type == CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data = curcon->data;
+
+ /* is there are valid script? */
+ if (data->text == NULL) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (BPY_is_pyconstraint(data->text)==0) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else {
+ /* does the constraint require target input... also validates targets */
+ BPY_pyconstraint_update(owner, curcon);
+ }
+
+ /* targets have already been checked for this */
+ continue;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_KINEMATIC) {
+ bKinematicConstraint *data = curcon->data;
+
+ /* bad: we need a separate set of checks here as poletarget is
+ * optional... otherwise poletarget must exist too or else
+ * the constraint is deemed invalid
+ */
+ if (exist_object(data->tar) == 0) {
+ data->tar = NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (data->tar == owner) {
+ if (!get_named_bone(get_armature(owner), data->subtarget)) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+
+ if (data->poletar) {
+ if (exist_object(data->poletar) == 0) {
+ data->poletar = NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (data->poletar == owner) {
+ if (!get_named_bone(get_armature(owner), data->polesubtarget)) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+ }
+
+ /* targets have already been checked for this */
+ continue;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_ACTION) {
+ bActionConstraint *data = curcon->data;
+
+ /* validate action */
+ if (data->act == NULL)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_FOLLOWPATH) {
+ bFollowPathConstraint *data = curcon->data;
+
+ /* don't allow track/up axes to be the same */
+ if (data->upflag==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ if (data->upflag+3==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_TRACKTO) {
+ bTrackToConstraint *data = curcon->data;
+
+ /* don't allow track/up axes to be the same */
+ if (data->reserved2==data->reserved1)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ if (data->reserved2+3==data->reserved1)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_LOCKTRACK) {
+ bLockTrackConstraint *data = curcon->data;
+
+ if (data->lockflag==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ if (data->lockflag+3==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+
+ /* Check targets for constraints */
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(curcon, &targets);
+
+ /* disable and clear constraints targets that are incorrect */
+ for (ct= targets.first; ct; ct= ct->next) {
+ /* general validity checks (for those constraints that need this) */
+ if (exist_object(ct->tar) == 0) {
+ ct->tar = NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (ct->tar == owner) {
+ if (!get_named_bone(get_armature(owner), ct->subtarget)) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+
+ /* target checks for specific constraints */
+ if (ELEM(curcon->type, CONSTRAINT_TYPE_FOLLOWPATH, CONSTRAINT_TYPE_CLAMPTO)) {
+ if (ct->tar) {
+ if (ct->tar->type != OB_CURVE) {
+ ct->tar= NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else {
+ Curve *cu= ct->tar->data;
+
+ /* auto-set 'Path' setting on curve so this works */
+ cu->flag |= CU_PATH;
+ }
+ }
+ }
+ }
+
+ /* free any temporary targets */
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(curcon, &targets, 0);
+ }
+ }
+ }
+}
+
+static void test_bonelist_constraints (Object *owner, ListBase *list)
+{
+ Bone *bone;
+
+ for (bone = list->first; bone; bone=bone->next) {
+ test_constraints(owner, bone->name);
+ test_bonelist_constraints (owner, &bone->childbase);
+ }
+}
+
+void object_test_constraints (Object *owner)
+{
+ test_constraints(owner, "");
+
+ if (owner->type==OB_ARMATURE) {
+ bArmature *arm= get_armature(owner);
+
+ if (arm)
+ test_bonelist_constraints (owner, &arm->bonebase);
+ }
}
/* ********************** 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)
+void validate_pyconstraint_cb (void *arg1, void *arg2)
{
bPythonConstraint *data = arg1;
Text *text;
@@ -977,38 +869,50 @@ void validate_pyconstraint_cb(void *arg1, void *arg2)
}
/* this returns a string for the list of usable pyconstraint script names */
-char *buildmenu_pyconstraints(Text *con_text, int *pyconindex)
+char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
{
+ DynStr *pupds= BLI_dynstr_new();
Text *text;
- char *menustr = MEM_callocN(128, "menustr pyconstraints");
- char *name, stmp[128];
- int buf = 128;
- int used = strlen("Scripts: %t") + 1;
+ char *str;
+ char buf[64];
int i;
-
- sprintf(menustr, "%s", "Scripts: %t");
+ /* add title first */
+ sprintf(buf, "Scripts: %%t|");
+ BLI_dynstr_append(pupds, buf);
+
+ /* loop through markers, adding them */
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.*/
+ /* only include valid pyconstraint scripts */
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;
+ BLI_dynstr_append(pupds, text->id.name+2);
+
+ sprintf(buf, "%%x%d", i);
+ BLI_dynstr_append(pupds, buf);
+
+ if (text->id.next)
+ BLI_dynstr_append(pupds, "|");
}
}
- return menustr;
+ /* convert to normal MEM_malloc'd string */
+ str= BLI_dynstr_get_cstring(pupds);
+ BLI_dynstr_free(pupds);
+
+ return str;
+}
+
+/* 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 ------------------ */
@@ -1016,7 +920,8 @@ char *buildmenu_pyconstraints(Text *con_text, int *pyconindex)
/* ChildOf Constraint - set inverse callback */
void childof_const_setinv (void *conv, void *unused)
{
- bChildOfConstraint *data= (bChildOfConstraint *)conv;
+ bConstraint *con= (bConstraint *)conv;
+ bChildOfConstraint *data= (bChildOfConstraint *)con->data;
Object *ob= OBACT;
bPoseChannel *pchan= NULL;
@@ -1026,48 +931,30 @@ void childof_const_setinv (void *conv, void *unused)
/* 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};
+ float pmat[4][4], cinf;
+ float imat[4][4], tmat[4][4];
- /* make copies of pchan's original matrices (to be restored later) */
+ /* make copy of pchan's original pose-mat (for use 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, TARGET_BONE);
- solve_constraints(&pchan->constraints, cob, ctime);
- constraints_clear_evalob(cob);
+ /* disable constraint for pose to be solved without it */
+ cinf= con->enforce;
+ con->enforce= 0.0f;
+ /* solve pose without constraint */
+ where_is_pose(ob);
- /* 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.
+ /* determine effect of constraint by removing the newly calculated
+ * pchan->pose_mat from the original pchan->pose_mat, thus determining
+ * the effect of the constraint
*/
- Mat4CpyMat4(pchan->constinv, pchan->pose_mat);
-
- constraint_mat_convertspace(ob, pchan, pchan->constinv,
- CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL);
-
- Mat4Invert(data->invmat, pchan->constinv);
-
+ Mat4Invert(imat, pchan->pose_mat);
+ Mat4MulMat4(tmat, imat, pmat);
+ Mat4Invert(data->invmat, tmat);
- /* restore original matrices of pchan */
- Mat4CpyMat4(pchan->pose_mat, pmat);
- Mat4CpyMat4(pchan->chan_mat, chmat);
- Mat4CpyMat4(pchan->constinv, cimat);
+ /* recalculate pose with new inv-mat */
+ con->enforce= cinf;
+ where_is_pose(ob);
}
else if (ob) {
/* use what_does_parent to find inverse - just like for normal parenting.
@@ -1083,7 +970,8 @@ void childof_const_setinv (void *conv, void *unused)
/* ChildOf Constraint - clear inverse callback */
void childof_const_clearinv (void *conv, void *unused)
{
- bChildOfConstraint *data= (bChildOfConstraint *)conv;
+ bConstraint *con= (bConstraint *)conv;
+ bChildOfConstraint *data= (bChildOfConstraint *)con->data;
/* simply clear the matrix */
Mat4One(data->invmat);
diff --git a/source/blender/src/editcurve.c b/source/blender/src/editcurve.c
index 489cfba37ea..8d845c4ba14 100644
--- a/source/blender/src/editcurve.c
+++ b/source/blender/src/editcurve.c
@@ -158,7 +158,7 @@ static short select_bpoint(BPoint *bp, short selstatus, short flag, short hidden
static short swap_selection_beztriple(BezTriple *bezt)
{
- if(bezt->f2 & 1)
+ if(bezt->f2 & SELECT)
return select_beztriple(bezt, DESELECT, 1, VISIBLE);
else
return select_beztriple(bezt, SELECT, 1, VISIBLE);
@@ -166,7 +166,7 @@ static short swap_selection_beztriple(BezTriple *bezt)
static short swap_selection_bpoint(BPoint *bp)
{
- if(bp->f1 & 1)
+ if(bp->f1 & SELECT)
return select_bpoint(bp, DESELECT, 1, VISIBLE);
else
return select_bpoint(bp, SELECT, 1, VISIBLE);
@@ -182,7 +182,7 @@ short isNurbsel(Nurb *nu)
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if( (bezt->f1 & 1) || (bezt->f2 & 1) || (bezt->f3 & 1) ) return 1;
+ if( (bezt->f1 & SELECT) || (bezt->f2 & SELECT) || (bezt->f3 & SELECT) ) return 1;
bezt++;
}
}
@@ -190,7 +190,7 @@ short isNurbsel(Nurb *nu)
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- if( (bp->f1 & 1) ) return 1;
+ if( (bp->f1 & SELECT) ) return 1;
bp++;
}
}
@@ -207,7 +207,7 @@ int isNurbsel_count(Nurb *nu)
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if( (bezt->f1 & 1) || (bezt->f2 & 1) || (bezt->f3 & 1) ) sel++;
+ if (BEZSELECTED_HIDDENHANDLES(bezt)) sel++;
bezt++;
}
}
@@ -215,7 +215,7 @@ int isNurbsel_count(Nurb *nu)
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- if( (bp->f1 & 1) ) sel++;
+ if( (bp->f1 & SELECT) ) sel++;
bp++;
}
}
@@ -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 */
@@ -1106,9 +1319,9 @@ static void select_adjacent_cp(short next, short cont, short selstatus)
while(a--) {
if(a-abs(next) < 0) break;
sel= 0;
- if((lastsel==0) && (bezt->hide==0) && ((bezt->f2 & 1) || (selstatus==0))) {
+ if((lastsel==0) && (bezt->hide==0) && ((bezt->f2 & SELECT) || (selstatus==0))) {
bezt+=next;
- if(!(bezt->f2 & 1) || (selstatus==0)) {
+ if(!(bezt->f2 & SELECT) || (selstatus==0)) {
sel= select_beztriple(bezt, selstatus, 1, VISIBLE);
if((sel==1) && (cont==0)) lastsel= 1;
}
@@ -1128,9 +1341,9 @@ static void select_adjacent_cp(short next, short cont, short selstatus)
while(a--) {
if(a-abs(next) < 0) break;
sel=0;
- if((lastsel==0) && (bp->hide==0) && ((bp->f1 & 1) || (selstatus==0))) {
+ if((lastsel==0) && (bp->hide==0) && ((bp->f1 & SELECT) || (selstatus==0))) {
bp+=next;
- if(!(bp->f1 & 1) || (selstatus==0)) {
+ if(!(bp->f1 & SELECT) || (selstatus==0)) {
sel= select_bpoint(bp, selstatus, 1, VISIBLE);
if((sel==1) && (cont==0)) lastsel= 1;
}
@@ -1159,9 +1372,9 @@ static short nurb_has_selected_cps()
bezt= nu->bezt;
while(a--) {
if(bezt->hide==0) {
- if((bezt->f1 & 1)
- || (bezt->f2 & 1)
- || (bezt->f3 & 1)) return 1;
+ if((bezt->f1 & SELECT)
+ || (bezt->f2 & SELECT)
+ || (bezt->f3 & SELECT)) return 1;
}
bezt++;
}
@@ -1170,7 +1383,7 @@ static short nurb_has_selected_cps()
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a--) {
- if((bp->hide==0) && (bp->f1 & 1)) return 1;
+ if((bp->hide==0) && (bp->f1 & SELECT)) return 1;
bp++;
}
}
@@ -1215,7 +1428,7 @@ void hideNurb(int swap)
a= nu->pntsu;
sel= 0;
while(a--) {
- if(BEZSELECTED(bezt)) {
+ if(BEZSELECTED_HIDDENHANDLES(bezt)) {
select_beztriple(bezt, DESELECT, 1, HIDDEN);
bezt->hide= 1;
}
@@ -1229,11 +1442,11 @@ void hideNurb(int swap)
a= nu->pntsu*nu->pntsv;
sel= 0;
while(a--) {
- if(swap==0 && (bp->f1 & 1)) {
+ if(swap==0 && (bp->f1 & SELECT)) {
select_bpoint(bp, DESELECT, 1, HIDDEN);
bp->hide= 1;
}
- else if(swap && (bp->f1 & 1)==0) {
+ else if(swap && (bp->f1 & SELECT)==0) {
select_bpoint(bp, DESELECT, 1, HIDDEN);
bp->hide= 1;
}
@@ -1307,12 +1520,11 @@ void selectswapNurb()
a= nu->pntsu;
while(a--) {
if(bezt->hide==0) {
- if(bezt->f1 & 1) bezt->f1 &= ~1;
- else bezt->f1 |= 1;
- if(bezt->f2 & 1) bezt->f2 &= ~1;
- else bezt->f2 |= 1;
- if(bezt->f3 & 1) bezt->f3 &= ~1;
- else bezt->f3 |= 1;
+ bezt->f2 ^= SELECT; /* always do the center point */
+ if ((G.f & G_HIDDENHANDLES)==0) {
+ bezt->f1 ^= SELECT;
+ bezt->f3 ^= SELECT;
+ }
}
bezt++;
}
@@ -1371,7 +1583,7 @@ void subdivideNurb()
bezt= prevbezt+1;
}
while(a--) {
- if( BEZSELECTED(prevbezt) && BEZSELECTED(bezt) ) amount++;
+ if( BEZSELECTED_HIDDENHANDLES(prevbezt) && BEZSELECTED_HIDDENHANDLES(bezt) ) amount++;
prevbezt= bezt;
bezt++;
}
@@ -1395,7 +1607,7 @@ void subdivideNurb()
memcpy(beztn, prevbezt, sizeof(BezTriple));
beztn++;
- if( BEZSELECTED(prevbezt) && BEZSELECTED(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(prevbezt) && BEZSELECTED_HIDDENHANDLES(bezt) ) {
memcpy(beztn, bezt, sizeof(BezTriple));
/* midpoint subdividing */
@@ -1454,7 +1666,7 @@ void subdivideNurb()
bp= prevbp+1;
}
while(a--) {
- if( (bp->f1 & 1) && (prevbp->f1 & 1) ) amount++;
+ if( (bp->f1 & SELECT) && (prevbp->f1 & SELECT) ) amount++;
prevbp= bp;
bp++;
}
@@ -1479,7 +1691,7 @@ void subdivideNurb()
memcpy(bpn, prevbp, sizeof(BPoint));
bpn++;
- if( (bp->f1 & 1) && (prevbp->f1 & 1) ) {
+ if( (bp->f1 & SELECT) && (prevbp->f1 & SELECT) ) {
// printf("*** subdivideNurb: insert 'linear' point\n");
memcpy(bpn, bp, sizeof(BPoint));
bpn->vec[0]= (prevbp->vec[0]+bp->vec[0])/2.0;
@@ -1555,7 +1767,7 @@ void subdivideNurb()
bp= nu->bp;
for(a=0; a<nu->pntsv; a++) {
for(b=0; b<nu->pntsu; b++) {
- if(bp->f1 & 1) {
+ if(bp->f1 & SELECT) {
usel[b]++;
vsel[a]++;
sel++;
@@ -1787,7 +1999,7 @@ static void findselectedNurbvert(Nurb **nu, BezTriple **bezt, BPoint **bp)
bezt1= nu1->bezt;
a= nu1->pntsu;
while(a--) {
- if( (bezt1->f1 & 1) || (bezt1->f2 & 1) || (bezt1->f3 & 1) ) {
+ if( (bezt1->f1 & SELECT) || (bezt1->f2 & SELECT) || (bezt1->f3 & SELECT) ) {
if(*nu!=0 && *nu!= nu1) {
*nu= 0;
*bp= 0;
@@ -2025,7 +2237,7 @@ int is_u_selected(Nurb *nu, int u)
/* what about resolu == 2? */
bp= nu->bp+u;
for(v=0; v<nu->pntsv-1; v++, bp+=nu->pntsu) {
- if(v) if(bp->f1 & 1) return 1;
+ if(v) if(bp->f1 & SELECT) return 1;
}
return 0;
@@ -2304,7 +2516,7 @@ void addsegment_nurb()
if(isNurbsel_count(nu)==1) {
/* only 1 selected, not first or last, a little complex, but intuitive */
if(nu->pntsv==1) {
- if( (nu->bp->f1 & 1) || ((nu->bp+nu->pntsu-1)->f1 & 1));
+ if( (nu->bp->f1 & SELECT) || ((nu->bp+nu->pntsu-1)->f1 & SELECT));
else break;
}
}
@@ -2322,23 +2534,23 @@ void addsegment_nurb()
if( (nu->type & 7)==CU_BEZIER ) {
bezt= nu->bezt;
if(nu1==0) {
- if( BEZSELECTED(bezt) ) nu1= nu;
+ if( BEZSELECTED_HIDDENHANDLES(bezt) ) nu1= nu;
else {
bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
nu1= nu;
switchdirectionNurb(nu);
}
}
}
else if(nu2==0) {
- if( BEZSELECTED(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
nu2= nu;
switchdirectionNurb(nu);
}
else {
bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
nu2= nu;
}
}
@@ -2348,23 +2560,23 @@ void addsegment_nurb()
else if(nu->pntsv==1) {
bp= nu->bp;
if(nu1==0) {
- if( bp->f1 & 1) nu1= nu;
+ if( bp->f1 & SELECT) nu1= nu;
else {
bp= bp+(nu->pntsu-1);
- if( bp->f1 & 1 ) {
+ if( bp->f1 & SELECT ) {
nu1= nu;
switchdirectionNurb(nu);
}
}
}
else if(nu2==0) {
- if( bp->f1 & 1) {
+ if( bp->f1 & SELECT ) {
nu2= nu;
switchdirectionNurb(nu);
}
else {
bp= bp+(nu->pntsu-1);
- if( bp->f1 & 1 ) {
+ if( bp->f1 & SELECT ) {
nu2= nu;
}
}
@@ -2457,8 +2669,8 @@ void mouse_nurb()
if(bezt) {
if(hand==1) select_beztriple(bezt, SELECT, 1, HIDDEN);
- else if(hand==0) bezt->f1|= 1;
- else bezt->f3|= 1;
+ else if(hand==0) bezt->f1|= SELECT;
+ else bezt->f3|= SELECT;
}
else {
lastselbp= bp;
@@ -2470,28 +2682,16 @@ void mouse_nurb()
else {
if(bezt) {
if(hand==1) {
- if(bezt->f2 & 1) select_beztriple(bezt, DESELECT, 1, HIDDEN);
+ if(bezt->f2 & SELECT) select_beztriple(bezt, DESELECT, 1, HIDDEN);
else select_beztriple(bezt, SELECT, 1, HIDDEN);
- }
- else if(hand==0) {
- if(bezt->f1 & 1) {
- bezt->f1 &= ~1;
- }
- else {
- bezt->f1 |= 1;
- }
- }
- else {
- if(bezt->f3 & 1) {
- bezt->f3 &= ~1;
- }
- else {
- bezt->f3 |= 1;
- }
+ } else if(hand==0) {
+ bezt->f1 ^= SELECT;
+ } else {
+ bezt->f3 ^= SELECT;
}
}
else {
- if(bp->f1 & 1) select_bpoint(bp, DESELECT, 1, HIDDEN);
+ if(bp->f1 & SELECT) select_bpoint(bp, DESELECT, 1, HIDDEN);
else {
select_bpoint(bp, SELECT, 1, HIDDEN);
lastselbp= bp;
@@ -2514,6 +2714,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 +2729,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 +2742,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 +2783,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 +2791,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);
@@ -2645,7 +2850,7 @@ void addvert_Nurb(int mode)
(BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb");
memcpy(newbezt+1, bezt, nu->pntsu*sizeof(BezTriple));
*newbezt= *bezt;
- newbezt->f1= newbezt->f2= newbezt->f3= 1;
+ newbezt->f1= newbezt->f2= newbezt->f3= SELECT;
if(newbezt->h1 >= 0) newbezt->h2= newbezt->h1;
else newbezt->h2= newbezt->h1= HD_ALIGN; /* does this ever happen? */
VECCOPY(temp, bezt->vec[1]);
@@ -2663,7 +2868,7 @@ void addvert_Nurb(int mode)
MEM_freeN(nu->bezt);
nu->bezt= newbezt;
newbezt+= nu->pntsu;
- newbezt->f1= newbezt->f2= newbezt->f3= 1;
+ newbezt->f1= newbezt->f2= newbezt->f3= SELECT;
if(newbezt->h1 >= 0) newbezt->h2= newbezt->h1;
else newbezt->h2= newbezt->h1= HD_ALIGN; /* does this ever happen? */
bezt= nu->bezt+nu->pntsu-1;
@@ -2773,10 +2978,7 @@ void extrude_nurb()
}
if(nu) {
addvert_Nurb('e');
- }
- else {
-
-
+ } else {
ok= extrudeflagNurb(1); /* '1'= flag */
if(ok) {
@@ -2806,7 +3008,7 @@ void makecyclicNurb()
a= nu->pntsu;
bp= nu->bp;
while(a--) {
- if( bp->f1 & 1 ) {
+ if( bp->f1 & SELECT ) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
else nu->flagu++;
break;
@@ -2818,7 +3020,7 @@ void makecyclicNurb()
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
- if( BEZSELECTED(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
else nu->flagu++;
break;
@@ -2831,7 +3033,7 @@ void makecyclicNurb()
a= nu->pntsu;
bp= nu->bp;
while(a--) {
- if( bp->f1 & 1 ) {
+ if( bp->f1 & SELECT ) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
else {
nu->flagu++;
@@ -2859,7 +3061,7 @@ void makecyclicNurb()
bp= nu->bp;
while(a--) {
- if( bp->f1 & 1) {
+ if( bp->f1 & SELECT) {
if(cyclmode==1 && nu->pntsu>1) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
else {
@@ -2949,7 +3151,7 @@ void selectrow_nurb()
for(v=0; v<nu->pntsv; v++) {
for(u=0; u<nu->pntsu; u++, bp++) {
if(bp==lastselbp) {
- if(bp->f1 & 1) {
+ if(bp->f1 & SELECT) {
ok= 1;
break;
}
@@ -3087,18 +3289,18 @@ void select_more_nurb()
bp= nu->bp;
selbpoints= MEM_callocN(sizeof(short)*a-nu->pntsu, "selectlist");
while(a > 0) {
- if((selbpoints[a]!=1) && (bp->hide==0) && (bp->f1 & 1)) {
+ if((selbpoints[a]!=1) && (bp->hide==0) && (bp->f1 & SELECT)) {
/* upper control point */
if(a%nu->pntsu != 0) {
tempbp= bp-1;
- if(!(tempbp->f1 & 1)) select_bpoint(tempbp, SELECT, 1, VISIBLE);
+ if(!(tempbp->f1 & SELECT)) select_bpoint(tempbp, SELECT, 1, VISIBLE);
}
/* left control point. select only if it is not selected already */
if(a-nu->pntsu > 0) {
sel= 0;
tempbp= bp+nu->pntsu;
- if(!(tempbp->f1 & 1)) sel= select_bpoint(tempbp, SELECT, 1, VISIBLE);
+ if(!(tempbp->f1 & SELECT)) sel= select_bpoint(tempbp, SELECT, 1, VISIBLE);
/* make sure selected bpoint is discarded */
if(sel == 1) selbpoints[a-nu->pntsu]= 1;
}
@@ -3106,7 +3308,7 @@ void select_more_nurb()
/* right control point */
if(a+nu->pntsu < nu->pntsu*nu->pntsv) {
tempbp= bp-nu->pntsu;
- if(!(tempbp->f1 & 1)) select_bpoint(tempbp, SELECT, 1, VISIBLE);
+ if(!(tempbp->f1 & SELECT)) select_bpoint(tempbp, SELECT, 1, VISIBLE);
}
/* lower control point. skip next bp in case selection was made */
@@ -3156,7 +3358,7 @@ void select_less_nurb()
bp= nu->bp;
selbpoints= MEM_callocN(sizeof(short)*a, "selectlist");
while(a--) {
- if((bp->hide==0) && (bp->f1 & 1)) {
+ if((bp->hide==0) && (bp->f1 & SELECT)) {
sel= 0;
/* check if neighbours have been selected */
@@ -3164,28 +3366,28 @@ void select_less_nurb()
if((a+1)%nu->pntsu==0) sel++;
else {
bp--;
- if((selbpoints[a+1]==1) || ((bp->hide==0) && (bp->f1 & 1))) sel++;
+ if((selbpoints[a+1]==1) || ((bp->hide==0) && (bp->f1 & SELECT))) sel++;
bp++;
}
if((a+1)%nu->pntsu==1) sel++;
else {
bp++;
- if((bp->hide==0) && (bp->f1 & 1)) sel++;
+ if((bp->hide==0) && (bp->f1 & SELECT)) sel++;
bp--;
}
if(a+1 > nu->pntsu*nu->pntsv-nu->pntsu) sel++;
else {
bp-=nu->pntsu;
- if((selbpoints[a+nu->pntsu]==1) || ((bp->hide==0) && (bp->f1 & 1))) sel++;
+ if((selbpoints[a+nu->pntsu]==1) || ((bp->hide==0) && (bp->f1 & SELECT))) sel++;
bp+=nu->pntsu;
}
if(a < nu->pntsu) sel++;
else {
bp+=nu->pntsu;
- if((bp->hide==0) && (bp->f1 & 1)) sel++;
+ if((bp->hide==0) && (bp->f1 & SELECT)) sel++;
bp-=nu->pntsu;
}
@@ -3210,7 +3412,7 @@ void select_less_nurb()
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
- if((bezt->hide==0) && (bezt->f2 & 1)) {
+ if((bezt->hide==0) && (bezt->f2 & SELECT)) {
if(lastsel==1) sel= 1;
else sel= 0;
@@ -3219,22 +3421,22 @@ void select_less_nurb()
if(a==nu->pntsu-1) sel++;
else {
bezt--;
- if((bezt->hide==0) && (bezt->f2 & 1)) sel++;
+ if((bezt->hide==0) && (bezt->f2 & SELECT)) sel++;
bezt++;
}
if(a==0) sel++;
else {
bezt++;
- if((bezt->hide==0) && (bezt->f2 & 1)) sel++;
+ if((bezt->hide==0) && (bezt->f2 & SELECT)) sel++;
bezt--;
}
-
+
if(sel!=2) {
select_beztriple(bezt, DESELECT, 1, VISIBLE);
- lastsel= 1;
- }
- else lastsel= 0;
+ lastsel= 1;
+ }
+ else lastsel= 0;
}
else lastsel= 0;
@@ -3245,7 +3447,7 @@ void select_less_nurb()
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a--) {
- if((lastsel==0) && (bp->hide==0) && (bp->f1 & 1)) {
+ if((lastsel==0) && (bp->hide==0) && (bp->f1 & SELECT)) {
if(lastsel!=0) sel= 1;
else sel= 0;
@@ -3253,14 +3455,14 @@ void select_less_nurb()
if(a==nu->pntsu*nu->pntsv-1) sel++;
else {
bp--;
- if((bp->hide==0) && (bp->f1 & 1)) sel++;
+ if((bp->hide==0) && (bp->f1 & SELECT)) sel++;
bp++;
}
if(a==0) sel++;
else {
bp++;
- if((bp->hide==0) && (bp->f1 & 1)) sel++;
+ if((bp->hide==0) && (bp->f1 & SELECT)) sel++;
bp--;
}
@@ -3432,7 +3634,7 @@ void delNurb()
a= nu->pntsu;
if(a) {
while(a) {
- if( BEZSELECTED(bezt) );
+ if( BEZSELECTED_HIDDENHANDLES(bezt) );
else break;
a--;
bezt++;
@@ -3448,7 +3650,7 @@ void delNurb()
a= nu->pntsu*nu->pntsv;
if(a) {
while(a) {
- if(bp->f1 & 1 );
+ if(bp->f1 & SELECT);
else break;
a--;
bp++;
@@ -3469,7 +3671,7 @@ void delNurb()
if( (nu->type & 7)==CU_BEZIER ) {
bezt= nu->bezt;
for(a=0;a<nu->pntsu;a++) {
- if( BEZSELECTED(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
memcpy(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple));
nu->pntsu--;
a--;
@@ -3490,7 +3692,7 @@ void delNurb()
bp= nu->bp;
for(a=0;a<nu->pntsu;a++) {
- if( bp->f1 & 1 ) {
+ if( bp->f1 & SELECT ) {
memcpy(bp, bp+1, (nu->pntsu-a-1)*sizeof(BPoint));
nu->pntsu--;
a--;
@@ -3522,14 +3724,14 @@ void delNurb()
if( (nu->type & 7)==CU_BEZIER ) {
bezt= nu->bezt;
for(a=0; a<nu->pntsu-1; a++) {
- if( BEZSELECTED(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
bezt1= bezt;
bezt2= bezt+1;
- if( (bezt2->f1 & 1) || (bezt2->f2 & 1) || (bezt2->f3 & 1) ) ;
+ if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) ;
else { /* maybe do not make cyclic */
if(a==0 && (nu->flagu & 1) ) {
bezt2= bezt+(nu->pntsu-1);
- if( (bezt2->f1 & 1) || (bezt2->f2 & 1) || (bezt2->f3 & 1) ) {
+ if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) {
nu->flagu--;
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
@@ -3549,7 +3751,7 @@ void delNurb()
else if(nu->pntsv==1) {
bp= nu->bp;
for(a=0; a<nu->pntsu-1; a++) {
- if( bp->f1 & 1 ) {
+ if( bp->f1 & SELECT ) {
bp1= bp;
bp2= bp+1;
if( bp2->f1 & 1 ) ;
@@ -3806,7 +4008,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);
@@ -3837,7 +4040,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
(BezTriple*)MEM_callocN(2 * sizeof(BezTriple), "addNurbprim1");
bezt= nu->bezt;
bezt->h1= bezt->h2= HD_ALIGN;
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
bezt->radius = 1.0;
for(a=0;a<3;a++) {
@@ -3852,7 +4055,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
bezt++;
bezt->h1= bezt->h2= HD_ALIGN;
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
bezt->radius = bezt->weight = 1.0;
for(a=0;a<3;a++) {
@@ -3874,7 +4077,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
for(a=0;a<4;a++, bp++) {
VECCOPY(bp->vec, cent);
bp->vec[3]= 1.0;
- bp->f1= 1;
+ bp->f1= SELECT;
bp->radius = bp->weight = 1.0;
}
@@ -3911,7 +4114,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
for(a=0;a<5;a++, bp++) {
VECCOPY(bp->vec, cent);
bp->vec[3]= 1.0;
- bp->f1= 1;
+ bp->f1= SELECT;
bp->radius = bp->weight = 1.0;
}
@@ -3948,7 +4151,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
VECCOPY(bezt->vec[a], cent);
}
bezt->h1= bezt->h2= HD_AUTO;
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
bezt->vec[1][0]+= -grid;
for(a=0;a<3;a++) Mat3MulVecfl(imat,bezt->vec[a]);
bezt->radius = bezt->weight = 1.0;
@@ -3958,7 +4161,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
VECCOPY(bezt->vec[a], cent);
}
bezt->h1= bezt->h2= HD_AUTO;
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
bezt->vec[1][1]+= grid;
for(a=0;a<3;a++) Mat3MulVecfl(imat,bezt->vec[a]);
bezt->radius = bezt->weight = 1.0;
@@ -3968,7 +4171,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
VECCOPY(bezt->vec[a], cent);
}
bezt->h1= bezt->h2= HD_AUTO;
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
bezt->vec[1][0]+= grid;
for(a=0;a<3;a++) Mat3MulVecfl(imat,bezt->vec[a]);
bezt->radius = bezt->weight = 1.0;
@@ -3978,7 +4181,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
VECCOPY(bezt->vec[a], cent);
}
bezt->h1= bezt->h2= HD_AUTO;
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
bezt->vec[1][1]+= -grid;
for(a=0;a<3;a++) Mat3MulVecfl(imat,bezt->vec[a]);
bezt->radius = bezt->weight = 1.0;
@@ -3994,7 +4197,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
bp= nu->bp;
for(a=0; a<8; a++) {
- bp->f1= 1;
+ bp->f1= SELECT;
VECCOPY(bp->vec, cent);
if(xzproj==0) {
@@ -4036,7 +4239,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
for(a=0; a<4; a++) {
for(b=0; b<4; b++) {
VECCOPY(bp->vec, cent);
- bp->f1= 1;
+ bp->f1= SELECT;
fac= (float)a -1.5;
bp->vec[0]+= fac*grid;
fac= (float)b -1.5;
@@ -4061,7 +4264,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 */
@@ -4080,7 +4283,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a-- >0) {
- bp->f1 |= 1;
+ bp->f1 |= SELECT;
bp++;
}
}
@@ -4103,7 +4306,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
bp= nu->bp;
for(a=0; a<5; a++) {
- bp->f1= 1;
+ bp->f1= SELECT;
VECCOPY(bp->vec, cent);
bp->vec[0]+= nurbcircle[a][0]*grid;
bp->vec[2]+= nurbcircle[a][1]*grid;
@@ -4116,14 +4319,15 @@ 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);
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a-- >0) {
- bp->f1 |= 1;
+ bp->f1 |= SELECT;
bp++;
}
BLI_remlink(&editNurb, nu);
@@ -4137,20 +4341,21 @@ 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);
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a-- >0) {
- bp->f1 |= 1;
+ bp->f1 |= SELECT;
bp++;
}
@@ -4256,11 +4461,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)
@@ -4291,11 +4502,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");
}
@@ -4314,7 +4530,7 @@ void clear_tilt()
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if(BEZSELECTED(bezt)) bezt->alfa= 0.0;
+ if(BEZSELECTED_HIDDENHANDLES(bezt)) bezt->alfa= 0.0;
bezt++;
}
}
@@ -4322,7 +4538,7 @@ void clear_tilt()
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- if(bp->f1 & 1) bp->alfa= 0.0;
+ if(bp->f1 & SELECT) bp->alfa= 0.0;
bp++;
}
}
@@ -4350,9 +4566,9 @@ int bezt_compare (const void *e1, const void *e2)
/* Check selected flags : Ensures that selected keys will be listed first */
- if ((b1->f2 & 1) && !(b2->f2 & 1))
+ if ((b1->f2 & SELECT) && !(b2->f2 & SELECT))
return -1;
- if (!(b1->f2 & 1) && (b2->f2 & 1))
+ if (!(b1->f2 & SELECT) && (b2->f2 & SELECT))
return 1;
return 0;
diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c
index 6d0c34f2bf8..6ab3d5c17c6 100644
--- a/source/blender/src/editdeform.c
+++ b/source/blender/src/editdeform.c
@@ -704,6 +704,53 @@ void remove_vert_defgroup (Object *ob, bDeformGroup *dg, int vertnum)
remove_vert_def_nr (ob, def_nr, vertnum);
}
+/* for mesh in object mode lattice can be in editmode */
+static float get_vert_def_nr (Object *ob, int def_nr, int vertnum)
+{
+ MDeformVert *dvert= NULL;
+ int i;
+
+ /* get the deform vertices corresponding to the
+ * vertnum
+ */
+ if(ob->type==OB_MESH) {
+ if( ((Mesh*)ob->data)->dvert )
+ dvert = ((Mesh*)ob->data)->dvert + vertnum;
+ }
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= ob->data;
+
+ if(ob==G.obedit)
+ lt= editLatt;
+
+ if(lt->dvert)
+ dvert = lt->dvert + vertnum;
+ }
+
+ if(dvert==NULL)
+ return 0.0f;
+
+ for(i=dvert->totweight-1 ; i>=0 ; i--)
+ if(dvert->dw[i].def_nr == def_nr)
+ return dvert->dw[i].weight;
+
+ return 0.0f;
+}
+
+/* mesh object mode, lattice can be in editmode */
+float get_vert_defgroup (Object *ob, bDeformGroup *dg, int vertnum)
+{
+ int def_nr;
+
+ if(!ob)
+ return 0.0f;
+
+ def_nr = get_defgroup_num(ob, dg);
+ if(def_nr < 0) return 0.0f;
+
+ return get_vert_def_nr (ob, def_nr, vertnum);
+}
+
/* Only available in editmode */
/* removes from active defgroup, if allverts==0 only selected vertices */
void remove_verts_defgroup (int allverts)
@@ -732,7 +779,7 @@ void remove_verts_defgroup (int allverts)
case OB_MESH:
for (eve=G.editMesh->verts.first; eve; eve=eve->next){
dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
-
+
if (dvert && dvert->dw && ((eve->f & 1) || allverts)){
for (i=0; i<dvert->totweight; i++){
/* Find group */
@@ -778,6 +825,36 @@ void remove_verts_defgroup (int allverts)
}
}
+/* Only available in editmode */
+/* removes from all defgroup, if allverts==0 only selected vertices */
+void remove_verts_defgroups(int allverts)
+{
+ Object *ob;
+ int actdef, defCount;
+
+ if (multires_level1_test()) return;
+
+ ob= G.obedit;
+ if (ob == NULL) return;
+
+ actdef= ob->actdef;
+ defCount= BLI_countlist(&ob->defbase);
+
+ if (defCount == 0) {
+ error("Object has no vertex groups");
+ return;
+ }
+
+ /* To prevent code redundancy, we just use remove_verts_defgroup, but that
+ * only operates on the active vgroup. So we iterate through all groups, by changing
+ * active group index
+ */
+ for (ob->actdef= 1; ob->actdef <= defCount; ob->actdef++)
+ remove_verts_defgroup(allverts);
+
+ ob->actdef= actdef;
+}
+
void vertexgroup_select_by_name(Object *ob, char *name)
{
bDeformGroup *curdef;
@@ -812,7 +889,7 @@ void vgroup_assign_with_menu(void)
/* give user choices of adding to current/new or removing from current */
if (defCount && ob->actdef)
- mode = pupmenu("Vertex Groups %t|Add Selected to New Group %x1|Add Selected to Active Group %x2|Remove Selected from Active Group %x3");
+ mode = pupmenu("Vertex Groups %t|Add Selected to New Group %x1|Add Selected to Active Group %x2|Remove Selected from Active Group %x3|Remove Selected from All Groups %x4");
else
mode= pupmenu("Vertex Groups %t|Add Selected to New Group %x1");
@@ -834,6 +911,11 @@ void vgroup_assign_with_menu(void)
allqueue(REDRAWVIEW3D, 1);
BIF_undo_push("Remove from vertex group");
break;
+ case 4: /* remove from all groups */
+ remove_verts_defgroups(0);
+ allqueue(REDRAWVIEW3D, 1);
+ BIF_undo_push("Remove from all vertex groups");
+ break;
}
}
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index d3af5cc47e8..33b9a60104f 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -63,6 +63,7 @@
#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
+#include "BKE_multires.h"
#include "BKE_object.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -93,7 +94,6 @@
#include "mydevice.h"
#include "blendef.h"
#include "butspace.h"
-#include "multires.h"
#include "BSE_trans_types.h"
@@ -370,7 +370,7 @@ void calculate_uv_map(unsigned short mapmode)
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);
- SIMA_FACESEL_SET(efa, tf);
+ simaFaceSel_Set(efa, tf);
}
}
}
diff --git a/source/blender/src/editfont.c b/source/blender/src/editfont.c
index a3de5d03283..70365c9b234 100644
--- a/source/blender/src/editfont.c
+++ b/source/blender/src/editfont.c
@@ -58,6 +58,7 @@
#include "DNA_scene_types.h"
#include "DNA_text_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_depsgraph.h"
#include "BKE_font.h"
@@ -1186,7 +1187,8 @@ void add_primitiveFont(int dummy_argument)
cu->tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "textbox");
cu->tb[0].w = cu->tb[0].h = 0.0;
- enter_editmode(EM_WAITCURSOR);
+ if (U.flag & USER_ADD_EDITMODE)
+ enter_editmode(EM_WAITCURSOR);
allqueue(REDRAWALL, 0);
}
diff --git a/source/blender/src/editgroup.c b/source/blender/src/editgroup.c
index b17e6efee1b..9fd80d7eb41 100644
--- a/source/blender/src/editgroup.c
+++ b/source/blender/src/editgroup.c
@@ -112,15 +112,15 @@ void add_selected_to_act_ob_groups(void)
}
-void rem_selected_from_group(void)
+void rem_selected_from_all_groups(void)
{
Base *base;
Group *group;
for(base=FIRSTBASE; base; base= base->next) {
if TESTBASE(base) {
-
- while( (group = find_group(base->object)) ) {
+ group = NULL;
+ while( (group = find_group(base->object, group)) ) {
rem_from_group(group, base->object);
}
base->object->flag &= ~OB_FROMGROUP;
@@ -134,6 +134,77 @@ void rem_selected_from_group(void)
BIF_undo_push("Remove from Group");
}
+
+void rem_selected_from_group(void)
+{
+ char menutext[30+(22*22)], *menupt;
+ int i=0;
+ short ret;
+ Group *group= NULL;
+ Object *ob;
+ Base *base;
+ Group *group_array[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};
+
+ /* UnSet Tags for Objects and Groups */
+ for(group= G.main->group.first; group; group= group->id.next) {
+ if(group->id.lib==NULL) {
+ group->id.flag &= ~LIB_DOIT;
+ }
+ }
+ for(ob=G.main->object.first; ob; ob= ob->id.next) {
+ ob->id.flag &= ~LIB_DOIT;
+ }
+
+ /* Not tag selected objects */
+ for(base=FIRSTBASE; base; base= base->next) {
+ if TESTBASELIB(base) {
+ base->object->id.flag |= LIB_DOIT;
+ }
+ }
+
+ menupt = menutext;
+ /* Build a list of groups that contain selected objects */
+ for(group= G.main->group.first; group && i<24; group= group->id.next) {
+ if(group->id.lib==NULL) {
+ GroupObject *go;
+ for(go= group->gobject.first; go; go= go->next) {
+ if(go->ob->id.flag & LIB_DOIT) {
+ group_array[i] = group;
+ menupt += sprintf(menupt, "|%s", group->id.name+2);
+ i++;
+ break; /* Only want to know if this group should go in the list*/
+ }
+ }
+ }
+ }
+
+ /* do we have any groups? */
+ if (group_array[0] == NULL) {
+ error("Object selection contains no groups");
+ } else {
+ ret = pupmenu(menutext);
+ if (ret==-1) {
+ return;
+ } else {
+ group = group_array[ret-1];
+ for(base=FIRSTBASE; base; base= base->next) {
+ if TESTBASELIB(base) {
+ /* if we are removed and are not in any group, set our flag */
+ if(rem_from_group(group, base->object) && find_group(base->object, NULL)==NULL) {
+ base->object->flag &= ~OB_FROMGROUP;
+ base->flag &= ~OB_FROMGROUP;
+ }
+ }
+ }
+ }
+ }
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ DAG_scene_sort(G.scene);
+ BIF_undo_push("Remove from Group");
+}
+
void group_operation_with_menu(void)
{
Group *group= NULL;
@@ -145,7 +216,7 @@ void group_operation_with_menu(void)
break;
if(group)
- mode= pupmenu("Groups %t|Add to Existing Group %x3|Add to Active Objects Groups %x4|Add to New Group %x1|Remove from All Groups %x2");
+ mode= pupmenu("Groups %t|Add to Existing Group %x3|Add to Active Objects Groups %x4|Add to New Group %x1|Remove from Group %x5|Remove from All Groups %x2");
else
mode= pupmenu("Groups %t|Add to New Group %x1|Remove from All Groups %x2");
@@ -181,6 +252,7 @@ void group_operation(int mode)
if(mode==4) add_selected_to_act_ob_groups();
else if(mode==1 || mode==3) add_selected_to_group(group);
- else if(mode==2) rem_selected_from_group();
+ else if(mode==2) rem_selected_from_all_groups();
+ else if(mode==5) rem_selected_from_group();
}
}
diff --git a/source/blender/src/editimasel.c b/source/blender/src/editimasel.c
index ed5465e938f..ed630af2088 100644
--- a/source/blender/src/editimasel.c
+++ b/source/blender/src/editimasel.c
@@ -117,16 +117,37 @@ static int imasel_has_func(SpaceImaSel *simasel)
return 0;
}
-/* ugly, needs to be moved to platform specific files - elubie */
-#if defined WIN32 || defined __BeOS
+#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 */
@@ -174,8 +195,10 @@ static void activate_imageselect_(int type, char *title, char *file, short *menu
simasel->files = BIF_filelist_new();
}
- if(BLI_convertstringcode(name, G.sce, G.scene->r.cfra)) simasel->flag |= FILE_STRINGCODE;
- else simasel->flag &= ~FILE_STRINGCODE;
+ if(G.relbase_valid && U.flag & USER_RELPATHS && type != FILE_BLENDER)
+ simasel->flag |= FILE_STRINGCODE;
+ else
+ simasel->flag &= ~FILE_STRINGCODE;
if (U.uiflag & USER_HIDE_DOT)
simasel->flag |= FILE_HIDE_DOT;
@@ -200,28 +223,23 @@ static void activate_imageselect_(int type, char *title, char *file, short *menu
}
}
else if(type==FILE_LOADLIB) {
- BLI_strncpy(simasel->dir, name, sizeof(simasel->dir));
- BIF_filelist_setdir(simasel->files, simasel->dir);
+
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 {
- BLI_split_dirfile(file, temp, name);
- BLI_strncpy(simasel->dir, temp, sizeof(simasel->dir));
- BIF_filelist_setdir(simasel->files, simasel->dir);
- BIF_filelist_free(simasel->files);
+ imasel_split_file(simasel, name);
BIF_filelist_freelib(simasel->files);
BIF_filelist_settype(simasel->files, type);
}
}
else { /* FILE_BLENDER */
- BLI_split_dirfile(file, temp, name);
- BIF_filelist_free(simasel->files);
- BIF_filelist_setdir(simasel->files, temp);
+ imasel_split_file(simasel, name);
BIF_filelist_settype(simasel->files, type);
BLI_cleanup_dir(G.sce, simasel->dir);
@@ -530,15 +548,18 @@ static void imasel_execute(SpaceImaSel *simasel)
strcat(name, simasel->file);
if(simasel->flag & FILE_STRINGCODE) {
- if (!G.relbase_valid) {
- /* skip save */
- if(strncmp(simasel->title, "Save", 4)) {
- okee("You have to save the .blend file before using relative paths! Using absolute path instead.");
- simasel->flag &= ~FILE_STRINGCODE;
- }
- }
- else {
+ /* 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)
@@ -838,7 +859,7 @@ void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val) {
if( event!=RETKEY && event!=PADENTER)
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
switch(event) {
@@ -922,18 +943,16 @@ void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
file = BIF_filelist_file(simasel->files, simasel->active_file);
if(file && S_ISDIR(file->type)) {
-
- BIF_filelist_appenddir(simasel->files, file->relname);
- BLI_strncpy(simasel->dir, BIF_filelist_dir(simasel->files), FILE_MAXDIR);
+ 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;
-
+ do_headdraw = 1;
}
else if (file)
{
diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c
index 2e35fd1581f..af762c037d9 100644
--- a/source/blender/src/editipo.c
+++ b/source/blender/src/editipo.c
@@ -62,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"
@@ -82,8 +83,10 @@
#include "BKE_ipo.h"
#include "BKE_key.h"
#include "BKE_material.h"
+#include "BKE_particle.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
+#include "BKE_object.h"
#include "BIF_butspace.h"
#include "BIF_editaction.h"
@@ -131,6 +134,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
@@ -344,6 +348,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();
@@ -436,6 +456,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
{
@@ -913,6 +976,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;
@@ -945,7 +1014,8 @@ static void make_editipo(void)
/* evaluates context in the current UI */
/* blocktype is type of ipo */
/* from is the base pointer to find data to change (ob in case of action or pose) */
-static void get_ipo_context(short blocktype, ID **from, Ipo **ipo, char *actname, char *constname)
+/* bonename is for local bone ipos (constraint only now) */
+static void get_ipo_context(short blocktype, ID **from, Ipo **ipo, char *actname, char *constname, char *bonename)
{
Object *ob= OBACT;
@@ -958,25 +1028,48 @@ static void get_ipo_context(short blocktype, ID **from, Ipo **ipo, char *actname
bConstraint *con= get_active_constraint(ob);
if(con) {
- BLI_strncpy(constname, con->name, 32);
-
- chan= get_active_constraint_channel(ob);
- if(chan) {
- *ipo= chan->ipo;
- BLI_strncpy(constname, con->name, 32);
- }
-
*from= &ob->id;
- /* set actname if in posemode */
- if(ob->action) {
+ BLI_strncpy(constname, con->name, 32);
+
+ /* a bit hackish, but we want con->ipo to work */
+ if(con->flag & CONSTRAINT_OWN_IPO) {
if(ob->flag & OB_POSEMODE) {
bPoseChannel *pchan= get_active_posechannel(ob);
- if(pchan)
- BLI_strncpy(actname, pchan->name, 32);
+ if(pchan) {
+ BLI_strncpy(bonename, pchan->name, 32);
+ *ipo= con->ipo;
+ }
+ }
+ }
+ else {
+ chan= get_active_constraint_channel(ob);
+ if(chan) {
+ *ipo= chan->ipo;
+ BLI_strncpy(constname, con->name, 32);
+ }
+
+ /* set actname if in posemode */
+ if (ob->action) {
+ if (ob->flag & OB_POSEMODE) {
+ bPoseChannel *pchan= get_active_posechannel(ob);
+ if (pchan) {
+ BLI_strncpy(actname, pchan->name, 32);
+ BLI_strncpy(bonename, pchan->name, 32);
+ }
+ }
+ else if (ob->ipoflag & OB_ACTION_OB)
+ strcpy(actname, "Object");
+ }
+ else {
+ if (ob->flag & OB_POSEMODE) {
+ bPoseChannel *pchan= get_active_posechannel(ob);
+ if (pchan) {
+ BLI_strncpy(actname, pchan->name, 32);
+ BLI_strncpy(bonename, pchan->name, 32);
+ }
+ }
}
- else if(ob->ipoflag & OB_ACTION_OB)
- strcpy(actname, "Object");
}
}
}
@@ -1018,7 +1111,7 @@ static void get_ipo_context(short blocktype, ID **from, Ipo **ipo, char *actname
else if(blocktype==ID_SEQ) {
Sequence *last_seq = get_last_seq();
- if(last_seq && ((last_seq->type & SEQ_EFFECT)||(last_seq->type == SEQ_HD_SOUND)||(last_seq->type == SEQ_RAM_SOUND))) {
+ if(last_seq) {
*from= (ID *)last_seq;
*ipo= last_seq->ipo;
}
@@ -1097,6 +1190,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 */
@@ -1107,13 +1207,15 @@ void test_editipo(int doit)
if(G.sipo->pin==0) {
Ipo *ipo;
ID *from;
- char actname[32]="", constname[32]="";
+ char actname[32]="", constname[32]="", bonename[32]="";
- get_ipo_context(G.sipo->blocktype, &from, &ipo, actname, constname);
+ get_ipo_context(G.sipo->blocktype, &from, &ipo, actname, constname, bonename);
if(G.sipo->ipo != ipo) {
G.sipo->ipo= ipo;
- if(ipo) G.v2d->cur= ipo->cur;
+ /* if lock we don't copy from ipo, this makes the UI jump around confusingly */
+ if(G.v2d->flag & V2D_VIEWLOCK);
+ else if(ipo) G.v2d->cur= ipo->cur;
doit= 1;
}
if(G.sipo->from != from) {
@@ -1128,6 +1230,12 @@ void test_editipo(int doit)
BLI_strncpy(G.sipo->constname, constname, 32);
doit= 1;
}
+ if( strcmp(G.sipo->bonename, bonename)) {
+ BLI_strncpy(G.sipo->bonename, bonename, 32);
+ /* urmf; if bonename, then no action */
+ if(bonename[0]) G.sipo->actname[0]= 0;
+ doit= 1;
+ }
if(G.sipo->ipo)
G.sipo->ipo->cur = G.v2d->cur;
@@ -1179,11 +1287,11 @@ void get_status_editipo(void)
b= ei->icu->totvert;
while(b--) {
if(ei->icu->ipo==IPO_BEZ) {
- if(bezt->f1 & 1) totipo_vertsel++;
- if(bezt->f3 & 1) totipo_vertsel++;
+ if(bezt->f1 & SELECT) totipo_vertsel++;
+ if(bezt->f3 & SELECT) totipo_vertsel++;
totipo_vert+= 2;
}
- if(bezt->f2 & 1) totipo_vertsel++;
+ if(bezt->f2 & SELECT) totipo_vertsel++;
totipo_vert++;
bezt++;
@@ -1224,14 +1332,14 @@ void update_editipo_flags(void)
for(a=0; a<G.sipo->totipo; a++) {
if(ik->data[a]) {
if(ik->flag & 1) {
- ik->data[a]->f1 |= 1;
- ik->data[a]->f2 |= 1;
- ik->data[a]->f3 |= 1;
+ ik->data[a]->f1 |= SELECT;
+ ik->data[a]->f2 |= SELECT;
+ ik->data[a]->f3 |= SELECT;
}
else {
- ik->data[a]->f1 &= ~1;
- ik->data[a]->f2 &= ~1;
- ik->data[a]->f3 &= ~1;
+ ik->data[a]->f1 &= ~SELECT;
+ ik->data[a]->f2 &= ~SELECT;
+ ik->data[a]->f3 &= ~SELECT;
}
}
}
@@ -1318,7 +1426,7 @@ static short findnearest_ipovert(IpoCurve **icu, BezTriple **bezt)
}
else temp= abs(mval[0]- sco[1][0])+ abs(mval[1]- sco[1][1]);
- if( bezt1->f2 & 1) temp+=5;
+ if( bezt1->f2 & SELECT) temp+=5;
if(temp<dist) {
hpoint= 1;
*bezt= bezt1;
@@ -1371,7 +1479,7 @@ void mouse_select_ipo(void)
if(G.sipo->editipo==0) return;
get_status_editipo();
- marker=find_nearest_marker(1);
+ marker=find_nearest_marker(SCE_MARKERS, 1);
/* map ipo-points for editing if scaled ipo */
if (NLA_IPO_SCALED) {
@@ -1379,15 +1487,18 @@ void mouse_select_ipo(void)
}
if(G.sipo->showkey) {
- getmouseco_areawin(mval);
+ float pixelwidth;
+
+ view2d_getscale(G.v2d, &pixelwidth, NULL);
+ getmouseco_areawin(mval);
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
actik= 0;
mindist= 1000.0;
ik= G.sipo->ipokey.first;
while(ik) {
dist= (float)(fabs(ik->val-x));
- if(ik->flag & 1) dist+= 1.0;
+ if(ik->flag & SELECT) dist+= pixelwidth;
if(dist < mindist) {
actik= ik;
mindist= dist;
@@ -1420,16 +1531,16 @@ void mouse_select_ipo(void)
bezt->f1= bezt->f2= bezt->f3= 0;
}
else {
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
}
}
else if(hand==0) {
- if(bezt->f1 & 1) bezt->f1= 0;
- else bezt->f1= 1;
+ if(bezt->f1 & SELECT) bezt->f1= 0;
+ else bezt->f1= SELECT;
}
else {
- if(bezt->f3 & 1) bezt->f3= 0;
- else bezt->f3= 1;
+ if(bezt->f3 & SELECT) bezt->f3= 0;
+ else bezt->f3= SELECT;
}
}
}
@@ -1438,10 +1549,10 @@ void mouse_select_ipo(void)
if(bezt) {
if(hand==1) {
- bezt->f1|= 1; bezt->f2|= 1; bezt->f3|= 1;
+ bezt->f1|= SELECT; bezt->f2|= SELECT; bezt->f3|= SELECT;
}
- else if(hand==0) bezt->f1|= 1;
- else bezt->f3|= 1;
+ else if(hand==0) bezt->f1 |= SELECT;
+ else bezt->f3 |= SELECT;
}
}
}
@@ -1558,7 +1669,7 @@ void mouse_select_ipo(void)
xo= mval[0];
yo= mval[1];
- while(get_mbut()&R_MOUSE) {
+ while (get_mbut() & ((U.flag & USER_LMOUSESELECT)?L_MOUSE:R_MOUSE)) {
getmouseco_areawin(mval);
if(abs(mval[0]-xo)+abs(mval[1]-yo) > 4) {
@@ -1676,11 +1787,12 @@ void do_ipo_selectbuttons(void)
/* arguments define full context;
- *from has to be set always, to Object in case of Actions
- blocktype defines available channels of Ipo struct (blocktype ID_OB can be in action too)
- - if actname, use this to locate action, and optional constname to find the channel
+ - if actname, use this to locate actionchannel, and optional constname
+ - if bonename, the constname is the ipo to the constraint
*/
/* note; check header_ipo.c, spaceipo_assign_ipo() too */
-Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname)
+Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname, char *bonename)
{
if(from==NULL || from->lib) return NULL;
@@ -1701,6 +1813,10 @@ Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname)
achan= verify_action_channel(ob->action, actname);
if(achan) {
+ /* automatically assign achan to act-group based on pchan's grouping */
+ if (blocktype == ID_PO)
+ verify_pchan2achan_grouping(ob->action, ob->pose, actname);
+
/* constraint exception */
if(blocktype==ID_CO) {
bConstraintChannel *conchan= verify_constraint_channel(&achan->constraintChannels, constname);
@@ -1724,13 +1840,30 @@ Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname)
case ID_OB:
{
Object *ob= (Object *)from;
+
/* constraint exception */
if(blocktype==ID_CO) {
- bConstraintChannel *conchan= verify_constraint_channel(&ob->constraintChannels, constname);
- if(conchan->ipo==NULL) {
- conchan->ipo= add_ipo("CoIpo", ID_CO);
+ /* check the local constraint ipo */
+ if(bonename && bonename[0] && ob->pose) {
+ bPoseChannel *pchan= get_pose_channel(ob->pose, bonename);
+ bConstraint *con;
+ for(con= pchan->constraints.first; con; con= con->next)
+ if(strcmp(con->name, constname)==0)
+ break;
+ if(con) {
+ if(con->ipo==NULL) {
+ con->ipo= add_ipo("CoIpo", ID_CO);
+ }
+ return con->ipo;
+ }
+ }
+ else { /* the actionchannel */
+ bConstraintChannel *conchan= verify_constraint_channel(&ob->constraintChannels, constname);
+ if(conchan->ipo==NULL) {
+ conchan->ipo= add_ipo("CoIpo", ID_CO);
+ }
+ return conchan->ipo;
}
- return conchan->ipo;
}
else if(blocktype==ID_OB) {
if(ob->ipo==NULL) {
@@ -1760,6 +1893,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:
@@ -1786,15 +1929,11 @@ Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname)
{
Sequence *seq= (Sequence *)from; /* note, sequence is mimicing Id */
- if((seq->type & SEQ_EFFECT)||
- (seq->type == SEQ_RAM_SOUND)||
- (seq->type == SEQ_HD_SOUND)) {
- if(seq->ipo==NULL) {
- seq->ipo= add_ipo("SeqIpo", ID_SEQ);
- }
- update_seq_ipo_rect(seq);
- return seq->ipo;
+ if(seq->ipo==NULL) {
+ seq->ipo= add_ipo("SeqIpo", ID_SEQ);
}
+ update_seq_ipo_rect(seq);
+ return seq->ipo;
}
break;
case ID_CU:
@@ -1855,14 +1994,14 @@ Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname)
/* returns and creates
* Make sure functions check for NULL or they will crash!
* */
-IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constname, int adrcode)
+IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constname, char *bonename, int adrcode)
{
Ipo *ipo;
IpoCurve *icu= NULL;
/* return 0 if lib */
/* creates ipo too */
- ipo= verify_ipo(from, blocktype, actname, constname);
+ ipo= verify_ipo(from, blocktype, actname, constname, bonename);
if(ipo && ipo->id.lib==NULL && from->lib==NULL) {
@@ -1873,6 +2012,8 @@ IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constn
icu= MEM_callocN(sizeof(IpoCurve), "ipocurve");
icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ;
+ if(ipo->curve.first==NULL) icu->flag |= IPO_ACTIVE; /* first one added active */
+
icu->blocktype= blocktype;
icu->adrcode= adrcode;
@@ -2026,7 +2167,7 @@ void add_vert_ipo(void)
if(ei->icu==NULL) {
if(G.sipo->from) {
- ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
+ ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, G.sipo->bonename, ei->adrcode);
if (ei->icu)
ei->flag |= ei->icu->flag & IPO_AUTO_HORIZ; /* new curve could have been added, weak... */
else
@@ -2196,7 +2337,7 @@ static void insertkey_nonrecurs(ID *id, int blocktype, char *actname, char *cons
int matset=0;
if (matset==0) {
- icu= verify_ipocurve(id, blocktype, actname, constname, adrcode);
+ icu= verify_ipocurve(id, blocktype, actname, constname, NULL, adrcode);
if(icu) {
@@ -2213,9 +2354,9 @@ static void insertkey_nonrecurs(ID *id, int blocktype, char *actname, char *cons
if( GS(id->name)==ID_OB ) {
ob= (Object *)id;
- if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
+ if((ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0) ) {
/* actually frametofloat calc again! */
- cfra-= ob->sf*G.scene->r.framelen;
+ cfra-= give_timeoffset(ob)*G.scene->r.framelen;
}
}
@@ -2289,6 +2430,8 @@ int insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int a
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;
@@ -2303,21 +2446,18 @@ int insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int a
matindex=3;
break;
}
- if (!(pchan->bone->parent)||((pchan->bone->parent)&&!(pchan->bone->flag&BONE_HINGE))) { /* don't use for non-hinged child bones */
- float delta_mat[4][4],trimat[3][3];
- float localQuat[4];
- armature_mat_pose_to_delta(delta_mat, pchan->pose_mat, pchan->bone->arm_mat);
- /* Fixed this bit up from the old "hacky" version, as it was called.
- Not sure of the origin of Mat3ToQuat_is_ok or why its in there. In most cases, this
- produces the same result of the "hacky" version, and in some
- cases the results seem to be better. But whatever the case, this is unideal, as
- we're decomposing a 3x3 rotation matrix into a quat, which is
- not a discrete operation. */
- Mat3CpyMat4(trimat, delta_mat);
- Mat3ToQuat_is_ok(trimat, localQuat);
- insertfloatkey(id, ID_PO, pchan->name, NULL, adrcode, localQuat[matindex]);
- return 1;
- }
+
+ /* 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;
}
}
}
@@ -2384,7 +2524,7 @@ static int match_adr_constraint(ID * id, int blocktype, char *actname, int adrco
case CONSTRAINT_TYPE_LOCKTRACK:
if (searchtype==2) foundmatch=1;
break;
- case CONSTRAINT_TYPE_DISTANCELIMIT:
+ case CONSTRAINT_TYPE_DISTLIMIT:
if (searchtype==1) foundmatch=1;
break;
case CONSTRAINT_TYPE_MINMAX:
@@ -2414,11 +2554,11 @@ void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcod
int vartype;
int matset=0;
- if ((G.flags&G_AUTOMATKEYS)&&(match_adr_constraint(id, blocktype, actname, adrcode))) {
+ if ((IS_AUTOKEY_FLAG(AUTOMATKEY))&&(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);
+ icu= verify_ipocurve(id, blocktype, actname, constname, NULL, adrcode);
if(icu) {
@@ -2435,9 +2575,9 @@ void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcod
if( GS(id->name)==ID_OB ) {
ob= (Object *)id;
- if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
+ if((ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0) ) {
/* actually frametofloat calc again! */
- cfra-= ob->sf*G.scene->r.framelen;
+ cfra-= give_timeoffset(ob)*G.scene->r.framelen;
}
}
@@ -2460,7 +2600,7 @@ void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, in
int vartype;
int insert_mode;
- icu= verify_ipocurve(id, blocktype, actname, constname, adrcode);
+ icu= verify_ipocurve(id, blocktype, actname, constname, NULL, adrcode);
if(icu) {
@@ -2477,9 +2617,9 @@ void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, in
if( GS(id->name)==ID_OB ) {
ob= (Object *)id;
- if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
+ if((ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0) ) {
/* actually frametofloat calc again! */
- cfra-= ob->sf*G.scene->r.framelen;
+ cfra-= give_timeoffset(ob)*G.scene->r.framelen;
}
}
@@ -2493,10 +2633,10 @@ void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, in
/* delete keyframe immediately before/after newly added */
switch (insert_mode) {
case KEYNEEDED_DELPREV:
- delete_icu_key(icu, icu->totvert-2);
+ delete_icu_key(icu, icu->totvert-2, 1);
break;
case KEYNEEDED_DELNEXT:
- delete_icu_key(icu, 1);
+ delete_icu_key(icu, 1, 1);
break;
}
}
@@ -2512,7 +2652,7 @@ void insertfloatkey(ID *id, int blocktype, char *actname, char *constname, int a
float cfra;
int vartype;
- icu= verify_ipocurve(id, blocktype, actname, constname, adrcode);
+ icu= verify_ipocurve(id, blocktype, actname, constname, NULL, adrcode);
if(icu) {
@@ -2528,9 +2668,9 @@ void insertfloatkey(ID *id, int blocktype, char *actname, char *constname, int a
if( GS(id->name)==ID_OB ) {
ob= (Object *)id;
- if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
+ if((ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0) ) {
/* actually frametofloat calc again! */
- cfra-= ob->sf*G.scene->r.framelen;
+ cfra-= give_timeoffset(ob)*G.scene->r.framelen;
}
}
@@ -2610,8 +2750,8 @@ void insertkey_editipo(void)
id= G.sipo->from;
if(id && GS(id->name)==ID_OB ) {
Object *ob= (Object *)id;
- if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
- cfra-= ob->sf*G.scene->r.framelen;
+ if((ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0) ) {
+ cfra-= give_timeoffset(ob)*G.scene->r.framelen;
}
}
else if(id && GS(id->name)==ID_SEQ) {
@@ -2943,7 +3083,9 @@ void common_insertkey(void)
if(event==4) {
insertkey(id, ID_OB, NULL, NULL, OB_PD_FFALL, 0);
}
-
+ if(event==5) {
+ insertkey(id, ID_OB, NULL, NULL, OB_PD_FMAXD, 0);
+ }
}
}
}
@@ -3051,12 +3193,13 @@ 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) {
@@ -3090,23 +3233,33 @@ void common_insertkey(void)
}
}
if(event==11 || event==13) {
- 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);
+ 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) {
- int matsuccess=0;
+ 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. */
- matsuccess=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);
- if (matsuccess==0) {
+ 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);
+
+ 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);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
}
}
if (event==15 && ob->action) {
@@ -3125,11 +3278,23 @@ void common_insertkey(void)
/* 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_recalculate_paths(ob);
+
+
allqueue(REDRAWIPO, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
@@ -3261,7 +3426,7 @@ void add_duplicate_editipo(void)
b= icu->totvert;
bezt= icu->bezt;
while(b--) {
- if(bezt->f2 & 1) tot++;
+ if(bezt->f2 & SELECT) tot++;
bezt++;
}
@@ -3272,7 +3437,7 @@ void add_duplicate_editipo(void)
b= icu->totvert-tot;
while(b--) {
*beztn= *bezt;
- if(bezt->f2 & 1) {
+ if(bezt->f2 & SELECT) {
beztn->f1= beztn->f2= beztn->f3= 0;
beztn++;
*beztn= *bezt;
@@ -3326,7 +3491,7 @@ void remove_doubles_ipo(void)
while(b--) {
/* can we remove? */
- if(mode==2 || (bezt->f2 & 1)) {
+ if(mode==2 || (bezt->f2 & SELECT)) {
/* are the points different? */
if( fabs( bezt->vec[1][0]-newb->vec[1][0] ) > 0.9 ) {
@@ -3640,7 +3805,7 @@ void join_ipo(int mode)
b= icu->totvert;
bezt= icu->bezt;
while(b--) {
- if(bezt->f2 & 1) tot++;
+ if(bezt->f2 & SELECT) tot++;
bezt++;
}
@@ -3657,7 +3822,7 @@ void join_ipo(int mode)
b= icu->totvert+tot+1;
while(b--) {
- if(bezt->f2 & 1) {
+ if(bezt->f2 & SELECT) {
if(tot==0) *newb= *bezt;
else {
VecAddf(newb->vec[0], newb->vec[0], bezt->vec[0]);
@@ -3775,7 +3940,7 @@ void ipo_snap(short event)
while(a--) {
ok= 0;
if(totipo_vert) {
- if(bezt->f2 & 1) ok= 1;
+ if(bezt->f2 & SELECT) ok= 1;
}
else ok= 1;
@@ -3885,7 +4050,7 @@ void ipo_mirror(short mode)
while(a--) {
ok= 0;
if(totipo_vert) {
- if(bezt->f2 & 1) ok= 1;
+ if(bezt->f2 & SELECT) ok= 1;
}
else ok= 1;
@@ -4161,7 +4326,7 @@ void paste_editipo(void)
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);
+ ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, G.sipo->bonename, ei->adrcode);
if (ei->icu == NULL) return;
/* Copy selected beztriples from source icu onto this edit-icu,
@@ -4198,10 +4363,11 @@ void paste_editipo(void)
icu= icu->next;
}
- /* otherwise paste entire curve data if selected */
- else if (ei->flag & IPO_SELECT) {
+ /* otherwise paste entire curve data */
+ else {
+
/* 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);
+ ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, G.sipo->bonename, ei->adrcode);
if (ei->icu==NULL) return;
/* clear exisiting dynamic memory (keyframes, driver) */
@@ -4372,7 +4538,7 @@ void add_to_ipokey(ListBase *lb, BezTriple *bezt, int nr, int len)
if( ik->val==bezt->vec[1][0] ) {
if(ik->data[nr]==0) { /* double points! */
ik->data[nr]= bezt;
- if(bezt->f2 & 1) ik->flag= 1;
+ if(bezt->f2 & SELECT) ik->flag= 1;
return;
}
}
@@ -4389,7 +4555,7 @@ void add_to_ipokey(ListBase *lb, BezTriple *bezt, int nr, int len)
ikn->data[nr]= bezt;
ikn->val= bezt->vec[1][0];
- if(bezt->f2 & 1) ikn->flag= 1;
+ if(bezt->f2 & SELECT) ikn->flag= 1;
}
void make_ipokey(void)
@@ -4427,7 +4593,7 @@ void make_ipokey(void)
for(a=0; a<G.sipo->totipo; a++) {
if(ik->data[a]) {
bezt= ik->data[a];
- if(bezt->f2 & 1) sel++;
+ if(bezt->f2 & SELECT) sel++;
else desel++;
}
}
@@ -4436,14 +4602,14 @@ void make_ipokey(void)
if(ik->data[a]) {
bezt= ik->data[a];
if(sel) {
- bezt->f1 |= 1;
- bezt->f2 |= 1;
- bezt->f3 |= 1;
+ bezt->f1 |= SELECT;
+ bezt->f2 |= SELECT;
+ bezt->f3 |= SELECT;
}
else {
- bezt->f1 &= ~1;
- bezt->f2 &= ~1;
- bezt->f3 &= ~1;
+ bezt->f1 &= ~SELECT;
+ bezt->f2 &= ~SELECT;
+ bezt->f3 &= ~SELECT;
}
}
}
@@ -4541,7 +4707,7 @@ void make_ipokey_transform(Object *ob, ListBase *lb, int sel)
bezt= icu->bezt;
a= icu->totvert;
while(a--) {
- if(sel==0 || (bezt->f2 & 1)) {
+ if(sel==0 || (bezt->f2 & SELECT)) {
add_to_ipokey(lb, bezt, adrcode, OB_TOTIPO);
}
bezt++;
@@ -4896,14 +5062,14 @@ void make_ipo_transdata (TransInfo *t)
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)
+ if (bezt->f1 & SELECT)
bezt_to_transdata(td++, td2d++, bezt->vec[0], bezt->vec[1], 1, onlytime);
- if (bezt->f3 & 1)
+ if (bezt->f3 & SELECT)
bezt_to_transdata(td++, td2d++, bezt->vec[2], bezt->vec[1], 1, onlytime);
}
/* only include main vert if selected */
- if (bezt->f2 & 1) {
+ if (bezt->f2 & SELECT) {
bezt_to_transdata(td++, td2d++, bezt->vec[1], bezt->vec[1], 1, onlytime);
}
}
@@ -4944,8 +5110,9 @@ void make_ipo_transdata (TransInfo *t)
/* struct for use in re-sorting BezTriples during IPO transform */
typedef struct BeztMap {
BezTriple *bezt;
- int oldIndex;
- int newIndex;
+ 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;
@@ -4988,7 +5155,7 @@ static void sort_time_beztmaps (BeztMap *bezms, int 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]) {
+ if (bezm->bezt->vec[1][0] > (bezm+1)->bezt->vec[1][0]) {
bezm->newIndex++;
(bezm+1)->newIndex--;
@@ -4998,6 +5165,22 @@ static void sort_time_beztmaps (BeztMap *bezms, int totvert)
}
}
+ /* 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;
+ }
+ }
+
bezm++;
}
}
@@ -5010,48 +5193,84 @@ static void beztmap_to_data (TransInfo *t, EditIpo *ei, BeztMap *bezms, int totv
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 */
+ /* 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])
- td->loc2d= (bezts + bezm->newIndex)->vec[0];
+ if (bezm->bezt->f1 & SELECT) {
+ if (td->loc2d == bezm->bezt->vec[0]) {
+ if (bezm->swapHs == 1)
+ td->loc2d= (bezts + bezm->newIndex)->vec[2];
+ else
+ td->loc2d= (bezts + bezm->newIndex)->vec[0];
+ adjusted[j] = 1;
+ }
}
- if (bezm->bezt->f3 & 1) {
- if (td->loc2d == bezm->bezt->vec[2])
- td->loc2d= (bezts + bezm->newIndex)->vec[2];
+ if (bezm->bezt->f3 & SELECT) {
+ if (td->loc2d == bezm->bezt->vec[2]) {
+ if (bezm->swapHs == 1)
+ td->loc2d= (bezts + bezm->newIndex)->vec[0];
+ else
+ td->loc2d= (bezts + bezm->newIndex)->vec[2];
+ adjusted[j] = 1;
+ }
}
}
- if (bezm->bezt->f2 & 1) {
- if (td->loc2d == bezm->bezt->vec[1])
+ if (bezm->bezt->f2 & SELECT) {
+ if (td->loc2d == bezm->bezt->vec[1]) {
td->loc2d= (bezts + bezm->newIndex)->vec[1];
+ adjusted[j] = 1;
+ }
}
}
else {
/* whole curve */
if (ei->icu->ipo==IPO_BEZ) {
if (td->loc2d == bezm->bezt->vec[0]) {
- td->loc2d= (bezts + bezm->newIndex)->vec[0];
+ if (bezm->swapHs == 1)
+ td->loc2d= (bezts + bezm->newIndex)->vec[2];
+ else
+ td->loc2d= (bezts + bezm->newIndex)->vec[0];
+ adjusted[j] = 1;
}
if (td->loc2d == bezm->bezt->vec[2]) {
- td->loc2d= (bezts + bezm->newIndex)->vec[2];
+ if (bezm->swapHs == 1)
+ td->loc2d= (bezts + bezm->newIndex)->vec[0];
+ else
+ td->loc2d= (bezts + bezm->newIndex)->vec[2];
+ adjusted[j] = 1;
}
}
if (td->loc2d == bezm->bezt->vec[1]) {
td->loc2d= (bezts + bezm->newIndex)->vec[1];
+ adjusted[j] = 1;
}
}
}
}
+
+ /* free temp memory used for 'adjusted' array */
+ MEM_freeN(adjusted);
}
/* This function is called by recalcData during the Transform loop to recalculate
@@ -5243,7 +5462,7 @@ void ipo_record(void)
/* make curves ready, start values */
if(ei1->icu==NULL)
- ei1->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei1->adrcode);
+ ei1->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, G.sipo->bonename, ei1->adrcode);
if(ei1->icu==NULL) return;
poin= get_ipo_poin(G.sipo->from, ei1->icu, &type);
@@ -5253,7 +5472,7 @@ void ipo_record(void)
if(ei2) {
if(ei2->icu==NULL)
- ei2->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei2->adrcode);
+ ei2->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, G.sipo->bonename, ei2->adrcode);
if(ei2->icu==NULL) return;
poin= get_ipo_poin(G.sipo->from, ei2->icu, &type);
@@ -5290,7 +5509,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;
@@ -5432,22 +5651,25 @@ void remake_object_ipos(Object *ob)
/* Only delete the nominated keyframe from provided ipo-curve.
* Not recommended to be used many times successively. For that
- * there is delete_ipo_keys(). */
-void delete_icu_key(IpoCurve *icu, int index)
+ * there is delete_ipo_keys().
+ */
+void delete_icu_key(IpoCurve *icu, int index, short do_recalc)
{
/* firstly check that index is valid */
if (index < 0)
index *= -1;
+ if (icu == NULL)
+ return;
if (index >= icu->totvert)
return;
- if (!icu) return;
/* Delete this key */
- memcpy (&icu->bezt[index], &icu->bezt[index+1], sizeof (BezTriple)*(icu->totvert-index-1));
+ memcpy(&icu->bezt[index], &icu->bezt[index+1], sizeof(BezTriple)*(icu->totvert-index-1));
icu->totvert--;
- /* recalc handles */
- calchandles_ipocurve(icu);
+ /* recalc handles - only if it won't cause problems */
+ if (do_recalc)
+ calchandles_ipocurve(icu);
}
void delete_ipo_keys(Ipo *ipo)
@@ -5455,22 +5677,24 @@ void delete_ipo_keys(Ipo *ipo)
IpoCurve *icu, *next;
int i;
- if (!ipo)
+ if (ipo == NULL)
return;
- for (icu=ipo->curve.first; icu; icu=next){
+ for (icu= ipo->curve.first; icu; icu= next) {
next = icu->next;
- for (i=0; i<icu->totvert; i++){
- if (icu->bezt[i].f2 & 1){
- // Delete the item
- memcpy (&icu->bezt[i], &icu->bezt[i+1], sizeof (BezTriple)*(icu->totvert-i-1));
+
+ /* Delete selected BezTriples */
+ for (i=0; i<icu->totvert; i++) {
+ if (icu->bezt[i].f2 & SELECT) {
+ memcpy(&icu->bezt[i], &icu->bezt[i+1], sizeof(BezTriple)*(icu->totvert-i-1));
icu->totvert--;
i--;
}
}
- if (!icu->totvert){
- /* Delete the curve */
- BLI_remlink( &(ipo->curve), icu);
+
+ /* Only delete if there isn't an ipo-driver still hanging around on an empty curve */
+ if (icu->totvert==0 && icu->driver==NULL) {
+ BLI_remlink(&ipo->curve, icu);
free_ipo_curve(icu);
}
}
@@ -5567,8 +5791,8 @@ void move_to_frame(void)
id= G.sipo->from;
if(id && GS(id->name)==ID_OB ) {
Object *ob= (Object *)id;
- if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
- cfra+= ob->sf/G.scene->r.framelen;
+ if((ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0) ) {
+ cfra+= give_timeoffset(ob)/G.scene->r.framelen;
}
}
CFRA= (int)floor(cfra+0.5);
diff --git a/source/blender/src/editipo_lib.c b/source/blender/src/editipo_lib.c
index f10e100df7d..41044ad13d7 100644
--- a/source/blender/src/editipo_lib.c
+++ b/source/blender/src/editipo_lib.c
@@ -59,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" };
@@ -101,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)
@@ -191,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];
@@ -198,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];
}
@@ -273,6 +277,11 @@ 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, int selectedonly)
@@ -290,7 +299,7 @@ void boundbox_ipocurve(IpoCurve *icu, int selectedonly)
bezt= icu->bezt;
while(a--) {
if(icu->vartype & IPO_BITS) {
- if((bezt->f2 & 1) || !selectedonly) {
+ if((bezt->f2 & SELECT) || !selectedonly) {
vec[0]= bezt->vec[1][0];
vec[1]= 0.0;
DO_MINMAX(vec, min, max);
@@ -300,13 +309,13 @@ void boundbox_ipocurve(IpoCurve *icu, int selectedonly)
}
}
else {
- if((bezt->f1 & 1) || !selectedonly) {
+ if((bezt->f1 & SELECT) || !selectedonly) {
if(icu->ipo==IPO_BEZ && a!=icu->totvert-1)
DO_MINMAX(bezt->vec[0], min, max);
}
- if((bezt->f2 & 1) || !selectedonly)
+ if((bezt->f2 & SELECT) || !selectedonly)
DO_MINMAX(bezt->vec[1], min, max);
- if((bezt->f3 & 1) || !selectedonly) {
+ if((bezt->f3 & SELECT) || !selectedonly) {
if(icu->ipo==IPO_BEZ && a!=0)
DO_MINMAX(bezt->vec[2], min, max);
}
@@ -388,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 1f12f3863fe..ae283ce8c0b 100644
--- a/source/blender/src/editipo_mods.c
+++ b/source/blender/src/editipo_mods.c
@@ -139,7 +139,7 @@ void swap_selectall_editipo(void)
bezt->f1= bezt->f2= bezt->f3= 0;
}
else {
- bezt->f1= bezt->f2= bezt->f3= 1;
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
}
bezt++;
}
@@ -375,32 +375,32 @@ static int selected_bezier_loop(int (*looptest)(EditIpo *),
int select_bezier_add(BezTriple *bezt)
{
/* Select the bezier triple */
- bezt->f1 |= 1;
- bezt->f2 |= 1;
- bezt->f3 |= 1;
+ bezt->f1 |= SELECT;
+ bezt->f2 |= SELECT;
+ bezt->f3 |= SELECT;
return 0;
}
int select_bezier_subtract(BezTriple *bezt)
{
/* Deselect the bezier triple */
- bezt->f1 &= ~1;
- bezt->f2 &= ~1;
- bezt->f3 &= ~1;
+ bezt->f1 &= ~SELECT;
+ bezt->f2 &= ~SELECT;
+ bezt->f3 &= ~SELECT;
return 0;
}
int select_bezier_invert(BezTriple *bezt)
{
/* Invert the selection for the bezier triple */
- bezt->f2 ^= 1;
- if ( bezt->f2 & 1 ) {
- bezt->f1 |= 1;
- bezt->f3 |= 1;
+ bezt->f2 ^= SELECT;
+ if ( bezt->f2 & SELECT ) {
+ bezt->f1 |= SELECT;
+ bezt->f3 |= SELECT;
}
else {
- bezt->f1 &= ~1;
- bezt->f3 &= ~1;
+ bezt->f1 &= ~SELECT;
+ bezt->f3 &= ~SELECT;
}
return 0;
}
@@ -577,7 +577,7 @@ static int snap_bezier_nearest(BezTriple *bezt)
static int snap_bezier_nearestsec(BezTriple *bezt)
{
- float secf = (float)(G.scene->r.frs_sec);
+ float secf = FPS;
if(bezt->f2 & SELECT)
bezt->vec[1][0]= (float)(floor(bezt->vec[1][0]/secf + 0.5f) * secf);
return 0;
@@ -723,6 +723,53 @@ void mirror_ipo_keys(Ipo *ipo, short mirror_type)
}
}
+/* This function is called to calculate the average location of the
+ * selected keyframes, and place the current frame at that location.
+ *
+ * It must be called like so:
+ * snap_cfra_ipo_keys(NULL, -1); // initialise the static vars first
+ * for (ipo...) snap_cfra_ipo_keys(ipo, 0); // sum up keyframe times
+ * snap_cfra_ipo_keys(NULL, 1); // set current frame after taking average
+ */
+void snap_cfra_ipo_keys(Ipo *ipo, short mode)
+{
+ static int cfra;
+ static int tot;
+
+ IpoCurve *icu;
+ BezTriple *bezt;
+ int a;
+
+
+ if (mode == -1) {
+ /* initialise a new snap-operation */
+ cfra= 0;
+ tot= 0;
+ }
+ else if (mode == 1) {
+ /* set current frame - using average frame */
+ if (tot != 0)
+ CFRA = cfra / tot;
+ }
+ else {
+ /* loop through keys in ipo, summing the frame
+ * numbers of those that are selected
+ */
+ if (ipo == NULL)
+ return;
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ for (a=0, bezt=icu->bezt; a < icu->totvert; a++, bezt++) {
+ if (BEZSELECTED(bezt)) {
+ cfra += bezt->vec[1][0];
+ tot++;
+ }
+ }
+ }
+ }
+}
+
+
/* currently only used by some action editor tools, but may soon get used by ipo editor */
/* restore = whether to map points back to ipo-time
* only_keys = whether to only adjust the location of the center point of beztriples
@@ -976,11 +1023,11 @@ void borderselect_ipo(void)
int bit= (val==LEFTMOUSE);
if(BLI_in_rctf(&rectf, bezt->vec[0][0], bezt->vec[0][1]))
- bezt->f1 = (bezt->f1&~1) | bit;
+ bezt->f1 = (bezt->f1&~SELECT) | bit;
if(BLI_in_rctf(&rectf, bezt->vec[1][0], bezt->vec[1][1]))
- bezt->f2 = (bezt->f2&~1) | bit;
+ bezt->f2 = (bezt->f2&~SELECT) | bit;
if(BLI_in_rctf(&rectf, bezt->vec[2][0], bezt->vec[2][1]))
- bezt->f3 = (bezt->f3&~1) | bit;
+ bezt->f3 = (bezt->f3&~SELECT) | bit;
bezt++;
}
diff --git a/source/blender/src/editkey.c b/source/blender/src/editkey.c
index 671889d6431..5cc193f8844 100644
--- a/source/blender/src/editkey.c
+++ b/source/blender/src/editkey.c
@@ -171,9 +171,9 @@ static void rvk_slider_func(void *voidob, void *voidkeynum)
/* ipo on action or ob? */
if(ob->ipoflag & OB_ACTION_KEY)
- icu = verify_ipocurve(&ob->id, ID_KE, "Shape", NULL, keynum);
+ icu = verify_ipocurve(&ob->id, ID_KE, "Shape", NULL, NULL, keynum);
else
- icu = verify_ipocurve(&ob->id, ID_KE, NULL, NULL, keynum);
+ icu = verify_ipocurve(&ob->id, ID_KE, NULL, NULL, NULL, keynum);
if (icu) {
/* if the ipocurve exists, try to get a bezier
@@ -625,7 +625,7 @@ void insert_shapekey(Object *ob)
void delete_key(Object *ob)
{
- KeyBlock *kb;
+ KeyBlock *kb, *rkb;
Key *key;
IpoCurve *icu;
@@ -635,6 +635,10 @@ void delete_key(Object *ob)
kb= BLI_findlink(&key->block, ob->shapenr-1);
if(kb) {
+ for(rkb= key->block.first; rkb; rkb= rkb->next)
+ if(rkb->relative == ob->shapenr-1)
+ rkb->relative= 0;
+
BLI_remlink(&key->block, kb);
key->totkey--;
if(key->refkey== kb) key->refkey= key->block.first;
diff --git a/source/blender/src/editlattice.c b/source/blender/src/editlattice.c
index 9aa363a654f..f3073cf886a 100644
--- a/source/blender/src/editlattice.c
+++ b/source/blender/src/editlattice.c
@@ -240,7 +240,7 @@ static void findnearestLattvert__doClosest(void *userData, BPoint *bp, int x, in
struct { BPoint *bp; short dist, select, mval[2]; } *data = userData;
float temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
- if ((bp->f1&1)==data->select) temp += 5;
+ if ((bp->f1 & SELECT)==data->select) temp += 5;
if (temp<data->dist) {
data->dist = temp;
@@ -274,17 +274,13 @@ void mouse_lattice(void)
if((G.qual & LR_SHIFTKEY)==0) {
setflagsLatt(0);
- bp->f1 |= 1;
+ bp->f1 |= SELECT;
allqueue(REDRAWVIEW3D, 0);
}
else {
-
- if(bp->f1 & 1) bp->f1 &= ~1;
- else bp->f1 |= 1;
-
+ bp->f1 ^= SELECT; /* swap */
allqueue(REDRAWVIEW3D, 0);
-
}
countall();
diff --git a/source/blender/src/editmball.c b/source/blender/src/editmball.c
index 06b2e8b5dd7..71fbf834c17 100644
--- a/source/blender/src/editmball.c
+++ b/source/blender/src/editmball.c
@@ -49,6 +49,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_utildefines.h"
#include "BKE_depsgraph.h"
@@ -132,6 +133,7 @@ void add_primitiveMball(int dummy_argument)
{
MetaElem *ml;
float *curs, mat[3][3], cent[3], imat[3][3], cmat[3][3];
+ short newob= 0;
if(G.scene->id.lib) return;
@@ -150,6 +152,7 @@ void add_primitiveMball(int dummy_argument)
make_editMball();
setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
+ newob= 1;
}
/* deselect */
@@ -222,7 +225,15 @@ void add_primitiveMball(int dummy_argument)
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); // added ball can influence others
- countall();
+ countall();
+
+ /* if a new object was created, it stores it in Mball, for reload original data and undo */
+ if ( !(newob) || (U.flag & USER_ADD_EDITMODE)) {
+ if(newob) load_editMball();
+ } else {
+ exit_editmode(2);
+ }
+
allqueue(REDRAWALL, 0);
BIF_undo_push("Add MetaElem");
}
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c
index 15f4e652490..7f9391238dd 100644
--- a/source/blender/src/editmesh.c
+++ b/source/blender/src/editmesh.c
@@ -65,6 +65,7 @@
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
+#include "BKE_cloth.h"
#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_key.h"
@@ -72,7 +73,10 @@
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_multires.h"
#include "BKE_object.h"
+#include "BKE_pointcache.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -801,7 +805,10 @@ void make_editMesh()
EditFace *efa;
EditEdge *eed;
EditSelection *ese;
- int tot, a, eekadoodle= 0;
+ int tot, a, eekadoodle= 0, cloth_enabled = 0;
+ ClothModifierData *clmd = NULL;
+ Cloth *cloth = NULL;
+ float temp[3];
#ifdef WITH_VERSE
if(me->vnode){
@@ -836,10 +843,48 @@ void make_editMesh()
/* make editverts */
CustomData_copy(&me->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
mvert= me->mvert;
+
+ /* lots of checks to be sure if we have nice cloth object */
+ if(modifiers_isClothEnabled(G.obedit))
+ {
+ clmd = (ClothModifierData *) modifiers_findByType(G.obedit, eModifierType_Cloth);
+ cloth = clmd->clothObject;
+
+ /* just to be sure also check vertcount */
+ /* also check if we have a protected cache */
+ if(cloth && (tot == cloth->numverts) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT))
+ {
+ /* check if we have cache for this frame */
+ int stack_index = modifiers_indexInObject(G.obedit, (ModifierData *)clmd);
+
+ if(BKE_ptcache_id_exist((ID *)G.obedit, G.scene->r.cfra, stack_index))
+ {
+ cloth_enabled = 1;
+
+ clmd->sim_parms->editedframe = G.scene->r.cfra;
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_EDITMODE;
+
+ /* inverse matrix is not uptodate... */
+ Mat4Invert ( G.obedit->imat, G.obedit->obmat );
+ if(G.rt > 0)
+ printf("make_editmesh --> cloth_enabled\n");
+ }
+ }
+ }
evlist= (EditVert **)MEM_mallocN(tot*sizeof(void *),"evlist");
for(a=0; a<tot; a++, mvert++) {
- eve= addvertlist(mvert->co, NULL);
+
+ if(cloth_enabled)
+ {
+ VECCOPY(temp, cloth->verts[a].x);
+ Mat4MulVecfl ( G.obedit->imat, temp );
+ eve= addvertlist(temp, NULL);
+
+ /* TODO: what about normals? */
+ }
+ else
+ eve= addvertlist(mvert->co, NULL);
evlist[a]= eve;
// face select sets selection in next loop
@@ -968,8 +1013,11 @@ void load_editMesh(void)
EditEdge *eed;
EditSelection *ese;
float *fp, *newkey, *oldkey, nor[3];
- int i, a, ototvert, totedge=0;
-
+ int i, a, ototvert, totedge=0, cloth_enabled = 0;
+ ClothModifierData *clmd = NULL;
+ Cloth *cloth = NULL;
+ float temp[3], dt = 0.0;
+
#ifdef WITH_VERSE
if(em->vnode) {
struct VNode *vnode = (VNode*)em->vnode;
@@ -1035,9 +1083,60 @@ void load_editMesh(void)
/* the vertices, use ->tmp.l as counter */
eve= em->verts.first;
a= 0;
-
+
+ /* lots of checks to be sure if we have nice cloth object */
+ if(modifiers_isClothEnabled(G.obedit))
+ {
+ clmd = (ClothModifierData *) modifiers_findByType(G.obedit, eModifierType_Cloth);
+ cloth = clmd->clothObject;
+
+ /* just to be sure also check vertcount */
+ /* also check if we have a protected cache */
+ if(cloth && (G.totvert == cloth->numverts) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_CCACHE_PROTECT))
+ {
+ /* check if we have cache for this frame */
+ int stack_index = modifiers_indexInObject(G.obedit, (ModifierData *)clmd);
+
+ if(BKE_ptcache_id_exist((ID *)G.obedit, clmd->sim_parms->editedframe, stack_index))
+ {
+ cloth_enabled = 1;
+
+ /* inverse matrix is not uptodate... */
+ Mat4Invert ( G.obedit->imat, G.obedit->obmat );
+ dt = 1.0f / clmd->sim_parms->stepsPerFrame;
+ }
+ if(G.rt > 0)
+ printf("loadmesh --> tot: %d, num: %d\n", G.totvert, cloth->numverts);
+ }
+ }
+
+ i=0;
while(eve) {
- VECCOPY(mvert->co, eve->co);
+
+ if(cloth_enabled)
+ {
+ if(G.rt > 0)
+ printf("loadmesh --> cloth_enabled\n");
+
+ VECCOPY(temp, cloth->verts[i].x);
+ VECCOPY(cloth->verts[i].x, eve->co);
+ Mat4MulVecfl ( G.obedit->obmat, cloth->verts[i].x );
+
+ /*
+ // not physical correct but gives nicer results when commented
+ VECSUB(temp, cloth->verts[i].x, temp);
+ VecMulf(temp, 1.0f / dt);
+ VECADD(cloth->verts[i].v, cloth->verts[i].v, temp);
+ */
+ if(oldverts) {
+ VECCOPY(mvert->co, oldverts[i].co);
+ if(G.rt > 0)
+ printf("loadmesh --> cloth_enabled oldverts\n");
+ }
+ i++;
+ }
+ else
+ VECCOPY(mvert->co, eve->co);
mvert->mat_nr= 255; /* what was this for, halos? */
/* vertex normal */
@@ -1065,6 +1164,33 @@ void load_editMesh(void)
eve= eve->next;
mvert++;
}
+
+ /* burn changes to cache */
+ if(cloth_enabled)
+ {
+ if(G.rt > 0)
+ printf("loadmesh --> cloth_enabled cloth_write_cache\n");
+ cloth_write_cache(G.obedit, clmd, clmd->sim_parms->editedframe);
+
+ /* in this case we have to get the data for the requested frame */
+ if(clmd->sim_parms->editedframe != G.scene->r.cfra)
+ {
+ cloth_read_cache(G.obedit, clmd, G.scene->r.cfra);
+ }
+ clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_EDITMODE;
+ }
+ else
+ {
+ if(modifiers_isClothEnabled(G.obedit)) {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(G.obedit, eModifierType_Cloth);
+ if(G.rt > 0)
+ printf("loadmesh --> CLOTH_SIMSETTINGS_FLAG_RESET\n");
+ /* only reset cloth when no cache was used */
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_CCACHE_FFREE;
+ clmd->sim_parms->flags &= ~CLOTH_SIMSETTINGS_FLAG_EDITMODE;
+ }
+ }
/* the edges */
a= 0;
diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c
index ccd8b58c47e..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"
@@ -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;
@@ -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 c85efa609b1..d9b8fa93eb9 100644
--- a/source/blender/src/editmesh_lib.c
+++ b/source/blender/src/editmesh_lib.c
@@ -1142,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;
}
}
}
@@ -1411,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];
- 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;
+ VecCopyf(co1, eed->v1->co);
+ VecCopyf(co2, eed->v2->co);
+
+ 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;
}
}
}
diff --git a/source/blender/src/editmesh_loop.c b/source/blender/src/editmesh_loop.c
index c44a0607464..b99710f782f 100644
--- a/source/blender/src/editmesh_loop.c
+++ b/source/blender/src/editmesh_loop.c
@@ -488,7 +488,7 @@ static CutCurve *get_mouse_trail(int *len, char mode, char cutmode, struct GHash
{
CutCurve *curve,*temp;
EditVert *snapvert;
- float *scr, mval[2], lastx=0, lasty=0;
+ float *scr, mval[2]={0.0,0.0}, lastx=0, lasty=0;
int i=0, j, blocks=1, lasti=0;
int dist, tolerance;
short event, val, qual, vsnap=0, ldown=0, restart=0, rubberband=0;
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index a0c864de016..b165a141daa 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -82,6 +82,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BIF_interface.h"
#include "BIF_meshtools.h"
#include "BIF_mywindow.h"
+#include "BIF_previewrender.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_space.h"
@@ -132,9 +133,12 @@ void EM_select_mirrored(void)
}
void EM_automerge(int update) {
+ int len;
if (G.scene->automerge) {
if (G.obedit && G.obedit->type==OB_MESH) {
- if (removedoublesflag(1, 1, G.scene->toolsettings->doublimit)) {
+ 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);
}
@@ -710,7 +714,7 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
}
}
- if(G.scene->selectmode & SCE_SELECT_FACE && (G.vd->drawtype!=OB_TEXTURE)) {
+ if( CHECK_OB_DRAWFACEDOT(G.scene, G.vd, G.obedit->dt) ) {
if(efa->fgonf==0) {
glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE));
BIF_ThemeColor((efa->f & SELECT)?TH_FACE_DOT:TH_WIRE);
@@ -2123,6 +2127,12 @@ void mouse_mesh(void)
allqueue(REDRAWIMAGE, 0);
allqueue(REDRAWBUTSEDIT, 0); /* for the texture face panel */
}
+ if (efa && efa->mat_nr != G.obedit->actcol-1) {
+ G.obedit->actcol= efa->mat_nr+1;
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWBUTSSHADING, 0);
+ BIF_preview_changed(ID_MA);
+ }
}
rightmouse_transform();
@@ -3437,6 +3447,7 @@ void Face_Menu() {
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();
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index a68fca3b294..9fc6f1896ea 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -51,6 +51,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -679,15 +680,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();
}
@@ -1283,6 +1284,19 @@ static EditVert *subdivide_edge_addvert(EditEdge *edge, float rad, int beauty, f
/* offset for smooth or sphere or fractal */
alter_co(co, edge, rad, beauty, percent);
+ /* clip if needed by mirror modifier */
+ if (edge->v1->f2) {
+ if ( edge->v1->f2 & edge->v2->f2 & 1) {
+ co[0]= 0.0f;
+ }
+ if ( edge->v1->f2 & edge->v2->f2 & 2) {
+ co[1]= 0.0f;
+ }
+ if ( edge->v1->f2 & edge->v2->f2 & 4) {
+ co[2]= 0.0f;
+ }
+ }
+
ev = addvertlist(co, NULL);
/* vert data (vgroups, ..) */
@@ -2403,12 +2417,39 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
EditMesh *em = G.editMesh;
EditFace *ef;
EditEdge *eed, *cedge, *sort[4];
- EditVert **templist;
+ EditVert *eve, **templist;
struct GHash *gh;
float length[4], v1mat[3], v2mat[3], v3mat[3], v4mat[3];
int i, j, edgecount, touchcount, facetype,hold;
+ ModifierData *md= G.obedit->modifiers.first;
if(multires_test()) return;
+
+ for (; md; md=md->next) {
+ if (md->type==eModifierType_Mirror) {
+ MirrorModifierData *mmd = (MirrorModifierData*) md;
+
+ if(mmd->flag & MOD_MIR_CLIPPING) {
+ for (eve= em->verts.first; eve; eve= eve->next) {
+ eve->f2= 0;
+ switch(mmd->axis){
+ case 0:
+ if (fabs(eve->co[0]) < mmd->tolerance)
+ eve->f2 |= 1;
+ break;
+ case 1:
+ if (fabs(eve->co[1]) < mmd->tolerance)
+ eve->f2 |= 2;
+ break;
+ case 2:
+ if (fabs(eve->co[2]) < mmd->tolerance)
+ eve->f2 |= 4;
+ break;
+ }
+ }
+ }
+ }
+ }
//Set faces f1 to 0 cause we need it later
for(ef=em->faces.first;ef;ef = ef->next) {
diff --git a/source/blender/src/editnla.c b/source/blender/src/editnla.c
index 0361d5395c2..05e030bf80b 100644
--- a/source/blender/src/editnla.c
+++ b/source/blender/src/editnla.c
@@ -198,11 +198,12 @@ void synchronize_action_strips(void)
calc_action_range(strip->act, &actstart, &actend, 1);
- if(strip->actstart!=actstart || strip->actend!=actend) {
- float mapping= (strip->end - strip->start)/(strip->actend - strip->actstart);
+ if ((strip->actstart!=actstart) || (strip->actend!=actend)) {
+ float offset = strip->scale * (actstart - strip->actstart);
+ float actlen = actend - actstart;
- strip->start+= mapping*(actstart - strip->actstart);
- strip->end+= mapping*(actend - strip->actend);
+ strip->start += offset;
+ strip->end = (strip->scale * strip->repeat * actlen) + strip->start;
strip->actstart= actstart;
strip->actend= actend;
@@ -371,15 +372,41 @@ void reset_action_strips(int val)
for (strip = base->object->nlastrips.last; strip; strip=strip->prev) {
if (strip->flag & ACTSTRIP_SELECT) {
- if(val==2) {
- calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
- }
- else if(val==1) {
- float mapping= (strip->actend - strip->actstart)/(strip->end - strip->start);
-
- strip->end= strip->start + mapping*(strip->end - strip->start);
+ switch (val) {
+ case 1:
+ {
+ /* clear scaling - reset to 1.0 without touching keys */
+ float actlen= (strip->actend - strip->actstart);
+
+ strip->scale= 1.0f;
+ strip->end= (strip->repeat * actlen) + strip->start;
+ }
+ break;
+ case 2:
+ {
+ /* reset action-range */
+ calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
+ }
+ break;
+ case 3:
+ {
+ /* apply scale to keys - scale is reset to 1.0f, but keys stay at the same times */
+ bActionChannel *achan;
+
+ if (strip->act) {
+ for (achan= strip->act->chanbase.first; achan; achan= achan->next) {
+ actstrip_map_ipo_keys(base->object, achan->ipo, 0, 0);
+ }
+
+ /* now we can reset scale */
+ calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
+ strip->scale= 1.0f;
+ strip->end = (strip->repeat * (strip->actend - strip->actstart)) + strip->start;
+ }
+ }
+ break;
}
- base->object->ctime= -1234567.0f; // eveil!
+ base->object->ctime= -1234567.0f; // evil!
DAG_object_flush_update(G.scene, base->object, OB_RECALC_OB|OB_RECALC_DATA);
}
}
@@ -429,7 +456,7 @@ void snap_action_strips(int snap_mode)
}
else if (snap_mode==3) {
/* nearest second */
- float secf = (float)(G.scene->r.frs_sec);
+ float secf = FPS;
strip->start= (float)(floor(strip->start/secf + 0.5f) * secf);
strip->end= (float)(floor(strip->end/secf + 0.5f) * secf);
}
@@ -554,7 +581,7 @@ static void add_nla_block(short event)
/* simple prevention of zero strips */
if(strip->start>strip->end-2)
strip->end= strip->start+100;
- strip->repeat = 1.0;
+ strip->repeat = strip->scale= 1.0f;
strip->flag = ACTSTRIP_SELECT|ACTSTRIP_LOCK_ACTION;
@@ -593,6 +620,7 @@ static void add_nla_block_by_name(char name[32], Object *ob, short hold, short a
/* Initialize the new action block */
strip = MEM_callocN(sizeof(bActionStrip), "bActionStrip");
+ strip->scale= 1.0f;
deselect_nlachannel_keys(0);
@@ -995,6 +1023,12 @@ void transform_nlachannel_keys(int mode, int dummy)
Transform();
}
break;
+ case 'e':
+ {
+ initTransform(TFM_TIME_EXTEND, CTX_NONE);
+ Transform();
+ }
+ break;
}
}
@@ -1224,7 +1258,7 @@ static void mouse_nla(int selectmode)
/* Try object ipo or ob-constraint ipo selection */
base= get_nearest_nlachannel_ob_key(&selx, &sel);
- marker=find_nearest_marker(1);
+ marker=find_nearest_marker(SCE_MARKERS, 1);
if (base) {
isdone= 1;
@@ -1684,7 +1718,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if (!snla) return;
if(val) {
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
@@ -1791,6 +1825,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) {
@@ -1836,14 +1877,12 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case SKEY:
- if(G.qual==LR_ALTKEY) {
- val= pupmenu("Action Strip Scale%t|Clear Strip Scale%x1|Remap Start/End%x2");
- if(val==1)
- reset_action_strips(1);
- else if(val==2)
- reset_action_strips(2);
+ if (G.qual==LR_ALTKEY) {
+ val= pupmenu("Action Strip Scale%t|Reset Strip Scale%x1|Remap Action Start/End%x2|Apply Scale%x3");
+ if (val > 0)
+ reset_action_strips(val);
}
- else if(G.qual & LR_SHIFTKEY) {
+ else if (G.qual & LR_SHIFTKEY) {
if (snla->flag & SNLA_DRAWTIME)
val= pupmenu("Snap To%t|Nearest Second%x3|Current Time%x2");
else
diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c
index e5e83152ae2..8fc11c68891 100644
--- a/source/blender/src/editnode.c
+++ b/source/blender/src/editnode.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): David Millan Escriva, Juho Vepsäläinen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -300,8 +300,12 @@ static void composit_node_event(SpaceNode *snode, short event)
/* not the best implementation of the world... but we need it to work now :) */
if(node->type==CMP_NODE_R_LAYERS && node->custom2) {
+ /* add event for this window (after render curarea can be changed) */
+ addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
+
composite_node_render(snode, node);
- /* new event, a render can go fullscreen and open new window */
+
+ /* add another event, a render can go fullscreen and open new window */
addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
}
else {
@@ -830,6 +834,23 @@ static void snode_bg_viewmove(SpaceNode *snode)
window_set_cursor(win, oldcursor);
}
+static void reset_sel_socket(SpaceNode *snode, int in_out)
+{
+ bNode *node;
+ bNodeSocket *sock;
+
+ for(node= snode->edittree->nodes.first; node; node= node->next) {
+ if(in_out & SOCK_IN) {
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ if(sock->flag & SOCK_SEL) sock->flag&= ~SOCK_SEL;
+ }
+ if(in_out & SOCK_OUT) {
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ if(sock->flag & SOCK_SEL) sock->flag&= ~SOCK_SEL;
+ }
+ }
+}
+
/* checks mouse position, and returns found node/socket */
/* type is SOCK_IN and/or SOCK_OUT */
static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket **sockp, int in_out)
@@ -1066,7 +1087,29 @@ static void scale_node(SpaceNode *snode, bNode *node)
allqueue(REDRAWNODE, 1);
}
+/* ******************** rename ******************* */
+void node_rename(SpaceNode *snode)
+{
+ bNode *node, *rename_node;
+ short found_node= 0;
+
+ /* check if a node is selected */
+ for(node= snode->edittree->nodes.first; node; node= node->next) {
+ if(node->flag & SELECT) {
+ found_node= 1;
+ break;
+ }
+ }
+
+ if(found_node) {
+ rename_node= nodeGetActive(snode->edittree);
+ node_rename_but((char *)rename_node->username);
+ BIF_undo_push("Rename Node");
+
+ allqueue(REDRAWNODE, 1);
+ }
+}
/* ********************** select ******************** */
@@ -1427,7 +1470,7 @@ void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag)
bNode *node, *nodefrom[8];
int totsock= 0, socktype=0;
- if(node_to->inputs.first==NULL)
+ if(node_to==NULL || node_to->inputs.first==NULL)
return;
/* no inputs for node allowed (code it) */
@@ -1568,6 +1611,33 @@ static void node_insert_convertor(SpaceNode *snode, bNodeLink *link)
#endif
+static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeLink *link)
+{
+ bNodeLink *tlink;
+ bNodeSocket *sock;
+
+ if(tsock && nodeCountSocketLinks(snode->edittree, link->tosock) > tsock->limit) {
+
+ for(tlink= snode->edittree->links.first; tlink; tlink= tlink->next) {
+ if(link!=tlink && tlink->tosock==link->tosock)
+ break;
+ }
+ if(tlink) {
+ /* is there a free input socket with same type? */
+ for(sock= tlink->tonode->inputs.first; sock; sock= sock->next) {
+ if(sock->type==tlink->fromsock->type)
+ if(nodeCountSocketLinks(snode->edittree, sock) < sock->limit)
+ break;
+ }
+ if(sock)
+ tlink->tosock= sock;
+ else {
+ nodeRemLink(snode->edittree, tlink);
+ }
+ }
+ }
+}
+
/* loop that adds a nodelink, called by function below */
/* in_out = starting socket */
static int node_add_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, int in_out)
@@ -1638,35 +1708,12 @@ static int node_add_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock,
nodeRemLink(snode->edittree, link);
}
else {
- bNodeLink *tlink;
-
/* send changed events for original tonode and new */
if(link->tonode)
NodeTagChanged(snode->edittree, link->tonode);
/* we might need to remove a link */
- if(in_out==SOCK_OUT) {
- if(tsock && nodeCountSocketLinks(snode->edittree, link->tosock) > tsock->limit) {
-
- for(tlink= snode->edittree->links.first; tlink; tlink= tlink->next) {
- if(link!=tlink && tlink->tosock==link->tosock)
- break;
- }
- if(tlink) {
- /* is there a free input socket with same type? */
- for(tsock= tlink->tonode->inputs.first; tsock; tsock= tsock->next) {
- if(tsock->type==tlink->fromsock->type)
- if(nodeCountSocketLinks(snode->edittree, tsock) < tsock->limit)
- break;
- }
- if(tsock)
- tlink->tosock= tsock;
- else {
- nodeRemLink(snode->edittree, tlink);
- }
- }
- }
- }
+ if(in_out==SOCK_OUT) node_remove_extra_links(snode, tsock, link);
}
ntreeSolveOrder(snode->edittree);
@@ -1733,10 +1780,18 @@ static int node_add_link(SpaceNode *snode)
void node_delete(SpaceNode *snode)
{
bNode *node, *next;
+ bNodeSocket *sock;
for(node= snode->edittree->nodes.first; node; node= next) {
next= node->next;
if(node->flag & SELECT) {
+ /* set selin and selout NULL if the sockets belong to a node to be deleted */
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ if(snode->edittree->selin == sock) snode->edittree->selin= NULL;
+
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ if(snode->edittree->selout == sock) snode->edittree->selout= NULL;
+
/* check id user here, nodeFreeNode is called for free dbase too */
if(node->id)
node->id->us--;
@@ -1826,6 +1881,33 @@ void node_select_linked(SpaceNode *snode, int out)
allqueue(REDRAWNODE, 1);
}
+/* makes a link between selected output and input sockets */
+void node_make_link(SpaceNode *snode)
+{
+ bNode *fromnode, *tonode;
+ bNodeLink *link;
+ bNodeSocket *outsock= snode->edittree->selout;
+ bNodeSocket *insock= snode->edittree->selin;
+
+ if(!insock || !outsock) return;
+ if(nodeFindLink(snode->edittree, outsock, insock)) return;
+
+ if(nodeFindNode(snode->edittree, outsock, &fromnode, NULL) &&
+ nodeFindNode(snode->edittree, insock, &tonode, NULL)) {
+ link= nodeAddLink(snode->edittree, fromnode, outsock, tonode, insock);
+ NodeTagChanged(snode->edittree, tonode);
+ node_remove_extra_links(snode, insock, link);
+ }
+ else return;
+
+ ntreeSolveOrder(snode->edittree);
+ snode_verify_groups(snode);
+ snode_handle_recalc(snode);
+
+ allqueue(REDRAWNODE, 0);
+ BIF_undo_push("Make Link Between Sockets");
+}
+
static void node_border_link_delete(SpaceNode *snode)
{
rcti rect;
@@ -1923,9 +2005,29 @@ void node_read_renderlayers(SpaceNode *snode)
}
}
+ /* own render result should be read/allocated */
+ if(G.scene->id.flag & LIB_DOIT)
+ RE_ReadRenderResult(G.scene, G.scene);
+
snode_handle_recalc(snode);
}
+void node_read_fullsamplelayers(SpaceNode *snode)
+{
+ Render *re= RE_NewRender(G.scene->id.name);
+
+ waitcursor(1);
+
+ BIF_init_render_callbacks(re, 1);
+ RE_MergeFullSample(re, G.scene, snode->nodetree);
+ BIF_end_render_callbacks();
+
+ allqueue(REDRAWNODE, 1);
+ allqueue(REDRAWIMAGE, 1);
+
+ waitcursor(0);
+}
+
/* 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
@@ -2073,7 +2175,7 @@ static int node_uiDoBlocks(ScrArea *sa, short event)
((struct Link *)block)->next= NULL;
lb->first= lb->last= block;
- retval= uiDoBlocks(lb, event);
+ retval= uiDoBlocks(lb, event, 1);
((struct Link *)block)->prev= prev;
((struct Link *)block)->next= next;
@@ -2091,6 +2193,8 @@ static int node_uiDoBlocks(ScrArea *sa, short event)
void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
SpaceNode *snode= spacedata;
+ bNode *actnode;
+ bNodeSocket *actsock;
unsigned short event= evt->event;
short val= evt->val, doredraw=0, fromlib= 0;
@@ -2118,7 +2222,29 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case RIGHTMOUSE:
- if(!node_mouse_select(snode, event))
+ if(find_indicated_socket(snode, &actnode, &actsock, SOCK_IN)) {
+ if(actsock->flag & SOCK_SEL) {
+ snode->edittree->selin= NULL;
+ actsock->flag&= ~SOCK_SEL;
+ }
+ else {
+ snode->edittree->selin= actsock;
+ reset_sel_socket(snode, SOCK_IN);
+ actsock->flag|= SOCK_SEL;
+ }
+ }
+ else if(find_indicated_socket(snode, &actnode, &actsock, SOCK_OUT)) {
+ if(actsock->flag & SOCK_SEL) {
+ snode->edittree->selout= NULL;
+ actsock->flag&= ~SOCK_SEL;
+ }
+ else {
+ snode->edittree->selout= actsock;
+ reset_sel_socket(snode, SOCK_OUT);
+ actsock->flag|= SOCK_SEL;
+ }
+ }
+ else if(!node_mouse_select(snode, event))
toolbox_n();
break;
@@ -2194,6 +2320,9 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case EKEY:
snode_handle_recalc(snode);
break;
+ case FKEY:
+ node_make_link(snode);
+ break;
case GKEY:
if(fromlib) fromlib= -1;
else {
@@ -2222,8 +2351,17 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
node_select_linked(snode, G.qual==LR_SHIFTKEY);
break;
case RKEY:
- if(okee("Read saved Render Layers"))
- node_read_renderlayers(snode);
+ if(G.qual==LR_CTRLKEY) {
+ node_rename(snode);
+ }
+ else if(G.qual==LR_SHIFTKEY) {
+ if(okee("Read saved Full Sample Layers"))
+ node_read_fullsamplelayers(snode);
+ }
+ else {
+ if(okee("Read saved Render Layers"))
+ node_read_renderlayers(snode);
+ }
break;
case DELKEY:
case XKEY:
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 593d9ecdcdc..62b9b4a9978 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -80,6 +80,7 @@
#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"
@@ -91,6 +92,7 @@
#include "BLI_arithb.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
+#include "BLI_rand.h"
#include "BKE_action.h"
#include "BKE_anim.h"
@@ -99,6 +101,7 @@
#include "BKE_customdata.h"
#include "BKE_blender.h"
#include "BKE_booleanops.h"
+#include "BKE_cloth.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
#include "BKE_depsgraph.h"
@@ -116,8 +119,10 @@
#include "BKE_material.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
+#include "BKE_multires.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"
@@ -134,6 +139,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"
@@ -175,7 +181,6 @@
#include "blendef.h"
#include "butspace.h"
-#include "multires.h"
#include "BIF_transform.h"
#include "BIF_poseobject.h"
@@ -183,11 +188,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_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE);
+ exit_paint_modes();
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
if ELEM3(curarea->spacetype, SPACE_VIEW3D, SPACE_BUTS, SPACE_INFO) {
@@ -262,8 +278,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;
@@ -280,6 +294,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);
@@ -307,7 +323,6 @@ void delete_obj(int ok)
}
countall();
- G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT);
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
if(islamp) reshadeall_displist(); /* only frees displist */
@@ -1147,7 +1162,7 @@ void make_vertex_parent(void)
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if(BEZSELECTED(bezt)) {
+ if(BEZSELECTED_HIDDENHANDLES(bezt)) {
if(v1==0) v1= nr;
else if(v2==0) v2= nr;
else if(v3==0) v3= nr;
@@ -1378,9 +1393,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;
@@ -1402,24 +1414,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];
-
+
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, G.scene->r.cfra - base->object->sf);
+
+ get_constraint_target_matrix(con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, G.scene->r.cfra - give_timeoffset(base->object));
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];
@@ -1609,7 +1623,7 @@ void enter_editmode(int wc)
if(ob->type==OB_MESH) {
me= get_mesh(ob);
if( me==0 ) return;
- if(me->pv) sculptmode_pmv_off(me);
+ if(me->pv) mesh_pmv_off(ob, me);
ok= 1;
G.obedit= ob;
make_editMesh();
@@ -1746,6 +1760,11 @@ void exit_editmode(int flag) /* freedata==0 at render, 1= freedata, 2= do undo b
sbObjectToSoftbody(ob);
}
+ if(modifiers_isClothEnabled(ob)) {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
+
if(ob->type==OB_MESH && get_mesh(ob)->mr)
multires_edge_level_update(ob, get_mesh(ob));
@@ -2276,6 +2295,42 @@ void special_editmenu(void)
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|Remove Doubles%x5");
+ else
+ nr= pupmenu("Specials%t|Rekey%x1|Remove Doubles%x5");
+
+ 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;
+ case 5:
+ PE_remove_doubles();
+ break;
+ }
+
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+
+ if(nr>0) waitcursor(0);
+ }
else {
Base *base, *base_select= NULL;
@@ -2477,7 +2532,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:
@@ -2487,71 +2542,19 @@ 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|Subdivide Multi%x2|Flip Left-Right Names%x3");
+ nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Flip Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName Top-Bottom%x6");
if(nr==1)
subdivide_armature(1);
if(nr==2) {
@@ -2561,6 +2564,9 @@ void special_editmenu(void)
}
else if(nr==3)
armature_flip_names();
+ else if(ELEM3(nr, 4, 5, 6)) {
+ armature_autoside_names(nr-4);
+ }
}
else if(G.obedit->type==OB_LATTICE) {
static float weight= 1.0f;
@@ -2825,48 +2831,88 @@ void convertmenu(void)
DAG_scene_sort(G.scene);
}
- /* Change subdivision properties of mesh object ob, if
- * level==-1 then toggle subsurf, else set to level.
- * *set allows to toggle multiple selections
- */
-static void object_flip_subdivison(Object *ob, int *set, int level, int mode)
+/* Change subdivision or particle properties of mesh object ob, if level==-1
+ * then toggle subsurf, else set to level set allows to toggle multiple
+ * selections */
+
+static void object_has_subdivision_particles(Object *ob, int *havesubdiv, int *havepart, int depth)
+{
+ if(ob->type==OB_MESH) {
+ if(modifiers_findByType(ob, eModifierType_Subsurf))
+ *havesubdiv= 1;
+ if(modifiers_findByType(ob, eModifierType_ParticleSystem))
+ *havepart= 1;
+ }
+
+ if(ob->dup_group && depth <= 4) {
+ GroupObject *go;
+
+ for(go= ob->dup_group->gobject.first; go; go= go->next)
+ object_has_subdivision_particles(go->ob, havesubdiv, havepart, depth+1);
+ }
+}
+
+static void object_flip_subdivison_particles(Object *ob, int *set, int level, int mode, int particles, int depth)
{
ModifierData *md;
- if(ob->type!=OB_MESH)
- return;
-
- md = modifiers_findByType(ob, eModifierType_Subsurf);
-
- if (md) {
- SubsurfModifierData *smd = (SubsurfModifierData*) md;
+ if(ob->type==OB_MESH) {
+ if(particles) {
+ for(md=ob->modifiers.first; md; md=md->next) {
+ if(md->type == eModifierType_ParticleSystem) {
+ ParticleSystemModifierData *psmd = (ParticleSystemModifierData*)md;
- if (level == -1) {
- if(*set == -1)
- *set= smd->modifier.mode&(mode);
-
- if (*set) {
- smd->modifier.mode &= ~(mode);
- } else {
- smd->modifier.mode |= (mode);
+ if(*set == -1)
+ *set= psmd->modifier.mode&(mode);
+
+ if (*set)
+ psmd->modifier.mode &= ~(mode);
+ else
+ psmd->modifier.mode |= (mode);
+ }
}
- } else {
- smd->levels = level;
}
- }
- else if(*set != 0) {
- SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
+ else {
+ md = modifiers_findByType(ob, eModifierType_Subsurf);
- BLI_addtail(&ob->modifiers, smd);
+ if (md) {
+ SubsurfModifierData *smd = (SubsurfModifierData*) md;
- if (level!=-1) {
- smd->levels = level;
+ if (level == -1) {
+ if(*set == -1)
+ *set= smd->modifier.mode&(mode);
+
+ if (*set)
+ smd->modifier.mode &= ~(mode);
+ else
+ smd->modifier.mode |= (mode);
+ } else {
+ smd->levels = level;
+ }
+ }
+ else if(depth == 0 && *set != 0) {
+ SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
+
+ BLI_addtail(&ob->modifiers, smd);
+
+ if (level!=-1) {
+ smd->levels = level;
+ }
+
+ if(*set == -1)
+ *set= 1;
+ }
}
-
- if(*set == -1)
- *set= 1;
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+
+ if(ob->dup_group && depth<=4) {
+ GroupObject *go;
+
+ for(go= ob->dup_group->gobject.first; go; go= go->next)
+ object_flip_subdivison_particles(go->ob, set, level, mode, particles, depth+1);
}
- ob->recalc |= OB_RECALC_DATA;
}
/* Change subdivision properties of mesh object ob, if
@@ -2877,23 +2923,34 @@ void flip_subdivison(int level)
{
Base *base;
int set= -1;
- int mode;
+ int mode, pupmode, particles= 0, havesubdiv= 0, havepart= 0;
if(G.qual & LR_ALTKEY)
mode= eModifierMode_Realtime;
else
mode= eModifierMode_Render|eModifierMode_Realtime;
- for(base= G.scene->base.first; base; base= base->next) {
- if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base))) {
- object_flip_subdivison(base->object, &set, level, mode);
- if(base->object->dup_group) {
- GroupObject *go;
- for(go= base->object->dup_group->gobject.first; go; go= go->next)
- object_flip_subdivison(go->ob, &set, level, mode);
- }
- }
+ if(level == -1) {
+ for(base= G.scene->base.first; base; base= base->next)
+ if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base)))
+ object_has_subdivision_particles(base->object, &havesubdiv, &havepart, 0);
+ }
+ else
+ havesubdiv= 1;
+
+ if(havesubdiv && havepart) {
+ pupmode= pupmenu("Switch%t|Subsurf %x1|Particle Systems %x2");
+ if(pupmode <= 0)
+ return;
+ else if(pupmode == 2)
+ particles= 1;
}
+ else if(havepart)
+ particles= 1;
+
+ for(base= G.scene->base.first; base; base= base->next)
+ if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base)))
+ object_flip_subdivison_particles(base->object, &set, level, mode, particles, 0);
countall();
allqueue(REDRAWVIEW3D, 0);
@@ -2902,7 +2959,10 @@ void flip_subdivison(int level)
allqueue(REDRAWBUTSOBJECT, 0);
DAG_scene_flush_update(G.scene, screen_view3d_layers());
- BIF_undo_push("Switch subsurf on/off");
+ if(particles)
+ BIF_undo_push("Switch particles on/off");
+ else
+ BIF_undo_push("Switch subsurf on/off");
}
static void copymenu_properties(Object *ob)
@@ -3646,10 +3706,11 @@ void make_links(short event)
BIF_undo_push("Create links");
}
-void apply_object()
+void apply_objects_locrot( void )
{
Base *base, *basact;
Object *ob;
+ bArmature *arm;
Mesh *me;
Curve *cu;
Nurb *nu;
@@ -3657,49 +3718,59 @@ void apply_object()
BezTriple *bezt;
MVert *mvert;
float mat[3][3];
- int a;
-
- if(G.scene->id.lib) return;
- if(G.obedit) return;
- basact= BASACT;
+ int a, change = 0;
- if(G.qual & LR_SHIFTKEY) {
- ob= OBACT;
- if(ob==0) return;
-
- if(ob->transflag & OB_DUPLI) {
- make_duplilist_real();
- }
- else {
- if(okee("Apply deformation")) {
- object_apply_deform(ob);
- BIF_undo_push("Apply deformation");
- }
- }
- allqueue(REDRAWVIEW3D, 0);
-
- return;
- }
-
- if(okee("Apply scale and rotation")==0) return;
-
- base= FIRSTBASE;
- while(base) {
+ /* first check if we can execute */
+ for (base= FIRSTBASE; base; base= base->next) {
if TESTBASELIB(base) {
ob= base->object;
-
if(ob->type==OB_MESH) {
- object_to_mat3(ob, mat);
me= ob->data;
if(me->id.us>1) {
- error("Can't apply to a multi user mesh");
+ error("Can't apply to a multi user mesh, doing nothing.");
return;
}
if(me->key) {
- error("Can't apply to a mesh with vertex keys");
+ error("Can't apply to a mesh with vertex keys, doing nothing.");
+ return;
+ }
+ }
+ else if (ob->type==OB_ARMATURE) {
+ arm= ob->data;
+
+ if(arm->id.us>1) {
+ error("Can't apply to a multi user armature, doing nothing.");
return;
}
+ }
+ else if ELEM(ob->type, OB_CURVE, OB_SURF) {
+ cu= ob->data;
+
+ if(cu->id.us>1) {
+ error("Can't apply to a multi user curve, doing nothing.");
+ return;
+ }
+ if(cu->key) {
+ error("Can't apply to a curve with vertex keys, doing nothing.");
+ return;
+ }
+ }
+ }
+ }
+
+ /* now execute */
+ basact= BASACT;
+ base= FIRSTBASE;
+ for (base= FIRSTBASE; base; base= base->next) {
+ if TESTBASELIB(base) {
+ ob= base->object;
+
+ if(ob->type==OB_MESH) {
+ object_to_mat3(ob, mat);
+ me= ob->data;
+
+ /* see checks above */
mvert= me->mvert;
for(a=0; a<me->totvert; a++, mvert++) {
@@ -3716,26 +3787,25 @@ void apply_object()
enter_editmode(EM_WAITCURSOR);
BIF_undo_push("Applied object"); /* editmode undo itself */
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
- BASACT= basact;
+ BASACT= basact;
+ change = 1;
}
- else if (ob->type==OB_ARMATURE){
- bArmature *arm;
-
+ else if (ob->type==OB_ARMATURE) {
object_to_mat3(ob, mat);
arm= ob->data;
- if(arm->id.us>1) {
- error("Can't apply to a multi user armature");
- return;
- }
-
- apply_rot_armature (ob, mat);
+
+ /* see checks above */
+ apply_rot_armature(ob, mat);
+
/* Reset the object's transforms */
ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
QuatOne(ob->quat);
where_is_object(ob);
+
+ change = 1;
}
else if ELEM(ob->type, OB_CURVE, OB_SURF) {
float scale;
@@ -3743,14 +3813,7 @@ void apply_object()
scale = Mat3ToScalef(mat);
cu= ob->data;
- if(cu->id.us>1) {
- error("Can't apply to a multi user curve");
- return;
- }
- if(cu->key) {
- error("Can't apply to a curve with vertex keys");
- return;
- }
+ /* see checks above */
nu= cu->nurb.first;
while(nu) {
@@ -3788,13 +3851,75 @@ void apply_object()
BIF_undo_push("Applied object"); /* editmode undo itself */
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
BASACT= basact;
+
+ change = 1;
}
}
- base= base->next;
}
+ if (change) {
+ allqueue(REDRAWVIEW3D, 0);
+ BIF_undo_push("Apply Objects Scale & Rotation");
+ }
+}
+
+void apply_objects_visual_tx( void )
+{
+ Base *base;
+ Object *ob;
+ int change = 0;
- allqueue(REDRAWVIEW3D, 0);
- BIF_undo_push("Apply object");
+ for (base= FIRSTBASE; base; base= base->next) {
+ if TESTBASELIB(base) {
+ ob= base->object;
+ where_is_object(ob);
+ VECCOPY(ob->loc, ob->obmat[3]);
+ Mat4ToSize(ob->obmat, ob->size);
+ Mat4ToEul(ob->obmat, ob->rot);
+
+ where_is_object(ob);
+
+ change = 1;
+ }
+ }
+ if (change) {
+ allqueue(REDRAWVIEW3D, 0);
+ BIF_undo_push("Apply Objects Visual Transform");
+ }
+}
+
+void apply_object( void )
+{
+ Object *ob;
+ int evt;
+ if(G.scene->id.lib) return;
+ if(G.obedit) return;
+
+ if(G.qual & LR_SHIFTKEY) {
+ ob= OBACT;
+ if(ob==0) return;
+
+ if(ob->transflag & OB_DUPLI) {
+ make_duplilist_real();
+ }
+ else {
+ if(okee("Apply deformation")) {
+ object_apply_deform(ob);
+ BIF_undo_push("Apply deformation");
+ }
+ }
+ allqueue(REDRAWVIEW3D, 0);
+
+ } else {
+
+ evt = pupmenu("Apply Object%t|Scale and Rotation to ObData|Visual Transform to Objects Loc/Scale/Rot");
+ if (evt==-1) return;
+
+ if (evt==1) {
+ apply_objects_locrot();
+ } else if (evt==2) {
+ apply_objects_visual_tx();
+ }
+ }
}
@@ -4212,6 +4337,29 @@ void single_obdata_users(int flag)
}
}
+void single_ipo_users(int flag)
+{
+ Object *ob;
+ Base *base;
+ Ipo *ma, *man;
+ ID *id;
+
+ base= FIRSTBASE;
+ while(base) {
+ ob= base->object;
+ if(ob->id.lib==NULL && (flag==0 || (base->flag & SELECT)) ) {
+ ob->recalc= OB_RECALC_DATA;
+
+ id= (ID *)ob->ipo;
+ if(id && id->us>1 && id->lib==NULL) {
+ ob->ipo= copy_ipo(ob->ipo);
+ id->us--;
+ ipo_idnew(ob->ipo); /* drivers */
+ }
+ }
+ base= base->next;
+ }
+}
void single_mat_users(int flag)
{
@@ -4392,7 +4540,7 @@ void single_user(void)
clear_id_newpoins();
- nr= pupmenu("Make Single User%t|Object|Object & ObData|Object & ObData & Materials+Tex|Materials+Tex");
+ nr= pupmenu("Make Single User%t|Object|Object & ObData|Object & ObData & Materials+Tex|Materials+Tex|Ipos");
if(nr>0) {
if(nr==1) single_object_users(1);
@@ -4410,6 +4558,10 @@ void single_user(void)
else if(nr==4) {
single_mat_users(1);
}
+ else if(nr==5) {
+ single_ipo_users(1);
+ }
+
clear_id_newpoins();
@@ -5026,7 +5178,7 @@ void selectlinks_menu(void)
/* If you modify this menu, please remember to update view3d_select_linksmenu
* in header_view3d.c and the menu in toolbox.c
*/
- nr= pupmenu("Select Linked%t|Object Ipo%x1|ObData%x2|Material%x3|Texture%x4|DupliGroup%x5");
+ nr= pupmenu("Select Linked%t|Object Ipo%x1|ObData%x2|Material%x3|Texture%x4|DupliGroup%x5|ParticleSystem%x6");
if (nr <= 0) return;
@@ -5049,6 +5201,7 @@ void selectlinks(int nr)
* Current Material: 3
* Current Texture: 4
* DupliGroup: 5
+ * PSys: 6
*/
@@ -5074,6 +5227,9 @@ void selectlinks(int nr)
else if(nr==5) {
if(ob->dup_group==NULL) return;
}
+ else if(nr==6) {
+ if(ob->particlesystem.first==NULL) return;
+ }
else return;
base= FIRSTBASE;
@@ -5102,6 +5258,7 @@ void selectlinks(int nr)
if(tex==mat1->mtex[b]->tex) {
base->flag |= SELECT;
changed = 1;
+ break;
}
}
}
@@ -5114,6 +5271,25 @@ void selectlinks(int nr)
changed = 1;
}
}
+ else if(nr==6) {
+ /* loop through other, then actives particles*/
+ ParticleSystem *psys;
+ ParticleSystem *psys_act;
+
+ for(psys=base->object->particlesystem.first; psys; psys=psys->next) {
+ for(psys_act=ob->particlesystem.first; psys_act; psys_act=psys_act->next) {
+ if (psys->part == psys_act->part) {
+ base->flag |= SELECT;
+ changed = 1;
+ break;
+ }
+ }
+
+ if (base->flag & SELECT) {
+ break;
+ }
+ }
+ }
base->object->flag= base->flag;
}
base= base->next;
@@ -5347,6 +5523,57 @@ void auto_timeoffs(void)
allqueue(REDRAWBUTSOBJECT, 0);
}
+void ofs_timeoffs(void)
+{
+ Base *base;
+ float offset=0.0f;
+
+ if(BASACT==0 || G.vd==NULL) return;
+
+ if(fbutton(&offset, -10000.0f, 10000.0f, 10, 10, "Offset")==0) return;
+
+ /* make array of all bases, xco yco (screen) */
+ base= FIRSTBASE;
+ while(base) {
+ if(TESTBASELIB(base)) {
+ base->object->sf += offset;
+ if (base->object->sf < -MAXFRAMEF) base->object->sf = -MAXFRAMEF;
+ else if (base->object->sf > MAXFRAMEF) base->object->sf = MAXFRAMEF;
+ }
+ base= base->next;
+ }
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+}
+
+
+void rand_timeoffs(void)
+{
+ Base *base;
+ float rand=0.0f;
+
+ if(BASACT==0 || G.vd==NULL) return;
+
+ if(fbutton(&rand, 0.0f, 10000.0f, 10, 10, "Randomize")==0) return;
+
+ rand *= 2;
+
+ base= FIRSTBASE;
+ while(base) {
+ if(TESTBASELIB(base)) {
+ base->object->sf += (BLI_drand()-0.5) * rand;
+ if (base->object->sf < -MAXFRAMEF) base->object->sf = -MAXFRAMEF;
+ else if (base->object->sf > MAXFRAMEF) base->object->sf = MAXFRAMEF;
+ }
+ base= base->next;
+ }
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+}
+
+
void texspace_edit(void)
{
Base *base;
@@ -5401,20 +5628,12 @@ void texspace_edit(void)
void mirrormenu(void)
{
- short mode = 0;
-
-
- if (G.obedit==0) {
- mode=pupmenu("Mirror Axis %t|X Local%x4|Y Local%x5|Z Local%x6|");
-
- if (mode==-1) return; /* return */
- Mirror(mode); /* separating functionality from interface | call*/
+ if(G.f & G_PARTICLEEDIT) {
+ PE_mirror_x(0);
}
else {
- mode=pupmenu("Mirror Axis %t|X Global%x1|Y Global%x2|Z Global%x3|%l|X Local%x4|Y Local%x5|Z Local%x6|%l|X View%x7|Y View%x8|Z View%x9|");
-
- if (mode==-1) return; /* return */
- Mirror(mode); /* separating functionality from interface | call*/
+ initTransform(TFM_MIRROR, CTX_NO_PET);
+ Transform();
}
}
@@ -5489,6 +5708,18 @@ void hookmenu(void)
}
/*
+ * Returns true if the Object is a from an external blend file (libdata)
+ */
+int object_is_libdata(Object *ob)
+{
+ if (!ob) return 0;
+ if (ob->proxy) return 0;
+ if (ob->id.lib) return 1;
+ return 0;
+}
+
+
+/*
* Returns true if the Object data is a from an external blend file (libdata)
*/
int object_data_is_libdata(Object *ob)
diff --git a/source/blender/src/editparticle.c b/source/blender/src/editparticle.c
new file mode 100644
index 00000000000..d70b8620ae8
--- /dev/null
+++ b/source/blender/src/editparticle.c
@@ -0,0 +1,3193 @@
+/* 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_mesh.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_radialcontrol.h"
+#include "BIF_resources.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+#include "BIF_toolbox.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 */
+/************************************************/
+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(psys_check_enabled(ob, psys)) {
+ 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 && psys_check_enabled(ob, 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);
+
+ if (vertco[0]==IS_CLIPPED)
+ return 0;
+
+ 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]==IS_CLIPPED)
+ return 0;
+
+ 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);
+
+ if (wco[0]==IS_CLIPPED)
+ return 0;
+
+ 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_orco(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_orco(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_orco(ob, dm, psys->part->from, pa, mat);
+ psys_mat_hair_to_orco(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, int useflag)
+{
+ ParticleSystem *psys= PE_get_current(ob);
+ ParticleEdit *edit= psys->edit;
+ ParticleEditSettings *pset= PE_settings();
+ ParticleSettings *part= psys->part;
+ ParticleData *pa;
+ HairKey *hkey;
+ ParticleEditKey *key;
+ float cfra= CFRA;
+ int i, k, totpart;
+
+ totpart= psys->totpart;
+
+ /* flag all particles to be updated if not using flag */
+ if(!useflag)
+ LOOP_PARTICLES(i,pa)
+ pa->flag |= PARS_EDIT_RECALC;
+
+ /* 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, 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;
+}
+
+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_check_enabled(ob, psys)) {
+ 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;
+ ParticleData *pa = psys->particles + pa_index;
+ ParticleEditKey *key = psys->edit->keys[pa_index] + key_index;
+
+ if(data->select)
+ key->flag|=PEK_SELECT;
+ else
+ key->flag&=~PEK_SELECT;
+
+ pa->flag |= PARS_EDIT_RECALC;
+}
+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;
+ }
+
+ pa->flag |= PARS_EDIT_RECALC;
+}
+static void toggle_key_select(ParticleSystem *psys, int pa_index, int key_index, void *userData)
+{
+ ParticleData *pa = psys->particles + pa_index;
+
+ 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;
+
+ pa->flag |= PARS_EDIT_RECALC;
+}
+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;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ }
+ }
+
+ if(sel==0){
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+ LOOP_KEYS(k,key){
+ if(!(key->flag & PEK_SELECT)) {
+ key->flag |= PEK_SELECT;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ }
+ }
+ }
+
+ PE_update_selection(ob, 1);
+
+ 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){
+ if(key->flag & PEK_SELECT) {
+ key->flag &= ~PEK_SELECT;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ }
+ }
+
+ 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, 1);
+
+ 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, 1);
+
+ 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, 1);
+
+ 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((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])){
+ if(select && !(key->flag & PEK_SELECT)) {
+ key->flag|=PEK_SELECT;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ else if(key->flag & PEK_SELECT) {
+ key->flag&=~PEK_SELECT;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ }
+ }
+ }
+ 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((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])){
+ if(select && !(key->flag & PEK_SELECT)) {
+ key->flag|=PEK_SELECT;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ else if(key->flag & PEK_SELECT) {
+ key->flag&=~PEK_SELECT;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ }
+ }
+ }
+
+ PE_update_selection(ob, 1);
+
+ 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 int 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, removed = 0;
+
+ 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--;
+ removed++;
+ }
+ }
+
+ 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++;
+ }
+ }
+
+ if(psys->particles) MEM_freeN(psys->particles);
+ psys->particles = new_pars;
+
+ if(edit->keys) 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);
+ }
+
+ return removed;
+}
+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)");
+}
+void PE_remove_doubles(void)
+{
+ Object *ob=OBACT;
+ ParticleSystem *psys=PE_get_current(ob);
+ ParticleEditSettings *pset=PE_settings();
+ ParticleData *pa;
+ ParticleEdit *edit;
+ ParticleSystemModifierData *psmd;
+ KDTree *tree;
+ KDTreeNearest nearest[10];
+ float mat[4][4], co[3];
+ int i, n, totn, removed, totpart, flag, totremoved;
+
+ if(!PE_can_edit(psys)) return;
+
+ edit= psys->edit;
+ psmd= psys_get_modifier(ob, psys);
+ totremoved= 0;
+
+ do {
+ removed= 0;
+
+ totpart= psys->totpart;
+ tree=BLI_kdtree_new(totpart);
+
+ /* insert particles into kd tree */
+ LOOP_PARTICLES(i,pa) {
+ if(particle_is_selected(psys, 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);
+
+ /* tag particles to be removed */
+ LOOP_PARTICLES(i,pa) {
+ if(particle_is_selected(psys, pa)) {
+ psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
+ VECCOPY(co, pa->hair[0].co);
+ Mat4MulVecfl(mat, co);
+
+ totn= BLI_kdtree_find_n_nearest(tree,10,co,NULL,nearest);
+
+ for(n=0; n<totn; n++) {
+ /* this needs a custom threshold still */
+ if(nearest[n].index > i && nearest[n].dist < 0.0002f) {
+ if(!(pa->flag & PARS_TAG)) {
+ pa->flag |= PARS_TAG;
+ removed++;
+ }
+ }
+ }
+ }
+ }
+
+ BLI_kdtree_free(tree);
+
+ /* remove tagged particles - don't do mirror here! */
+ flag= pset->flag;
+ pset->flag &= ~PE_X_MIRROR;
+ remove_tagged_elements(ob, psys);
+ pset->flag= flag;
+ totremoved += removed;
+ } while(removed);
+
+ if(totremoved)
+ notice("Removed: %d", totremoved);
+
+ PE_recalc_world_cos(ob, psys);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 1);
+ BIF_undo_push("Remove double particles");
+}
+
+static void PE_radialcontrol_callback(const int mode, const int val)
+{
+ ParticleEditSettings *pset = PE_settings();
+
+ if(pset->brushtype>=0) {
+ ParticleBrushData *brush= &pset->brush[pset->brushtype];
+
+ if(mode == RADIALCONTROL_SIZE)
+ brush->size = val;
+ else if(mode == RADIALCONTROL_STRENGTH)
+ brush->strength = val;
+ }
+
+ (*PE_radialcontrol()) = NULL;
+}
+
+RadialControl **PE_radialcontrol()
+{
+ static RadialControl *rc = NULL;
+ return &rc;
+}
+
+void PE_radialcontrol_start(const int mode)
+{
+ ParticleEditSettings *pset = PE_settings();
+ int orig= 1;
+
+ if(pset->brushtype>=0) {
+ ParticleBrushData *brush= &pset->brush[pset->brushtype];
+
+ if(mode == RADIALCONTROL_SIZE)
+ orig = brush->size;
+ else if(mode == RADIALCONTROL_STRENGTH)
+ orig = brush->strength;
+
+ if(mode != RADIALCONTROL_NONE)
+ (*PE_radialcontrol())= radialcontrol_start(mode, PE_radialcontrol_callback, orig, 100, 0);
+ }
+}
+
+/************************************************/
+/* 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_noclip(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_noclip(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];
+ 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){
+ vec[0]= (2.0f*(mx+dmx)/curarea->winx);
+ vec[1]= (2.0f*(my+dmy)/curarea->winy);
+ vec[2]= -1.0f;
+ vec[3]= 1.0f;
+
+ Mat4MulVec4fl(G.vd->persinv, vec);
+ VecMulf(vec, 1.0f/vec[3]);
+
+ VECCOPY(co1, G.vd->viewinv[3]);
+ VECSUB(vec, vec, co1);
+ Normalize(vec);
+
+ VECADDFAC(co1, G.vd->viewinv[3], vec, G.vd->near);
+ VECADDFAC(co2, G.vd->viewinv[3], vec, G.vd->far);
+ }
+ 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,psmd->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 */
+ if(psys->particles) MEM_freeN(psys->particles);
+ psys->particles = new_pars;
+
+ if(edit->keys) MEM_freeN(edit->keys);
+ edit->keys = new_keys;
+
+ if(edit->mirror_cache) {
+ MEM_freeN(edit->mirror_cache);
+ edit->mirror_cache = NULL;
+ }
+
+ /* 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,0,0);
+ BLI_kdtree_insert(tree, i, cur_co, NULL);
+ }
+
+ BLI_kdtree_balance(tree);
+ }
+
+ psys->totpart = newtotpart;
+
+ /* 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;
+ }
+
+ pa->size= 1.0f;
+ 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,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;
+ int selected = 0, flip, removed = 0;
+
+ if(!PE_can_edit(psys)) return 0;
+
+ edit = psys->edit;
+ psmd= psys_get_modifier(ob, psys);
+
+ 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() & L_MOUSE){
+ 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);
+
+ removed= 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 || removed) {
+ if(pset->brushtype == PE_BRUSH_ADD && (pset->flag & PE_X_MIRROR))
+ PE_mirror_x(1);
+ PE_recalc_world_cos(ob,psys);
+ psys_free_path_cache(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*));
+
+ if(psys->particles) MEM_freeN(psys->particles);
+ psys->particles= new_pars;
+
+ if(edit->keys) 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");
+ }
+}
+
+void PE_selectbrush_menu(void)
+{
+ ParticleEditSettings *pset= PE_settings();
+ int val;
+
+ pupmenu_set_active(pset->brushtype);
+
+ val= pupmenu("Select Brush%t|None %x0|Comb %x1|Smooth %x7|Weight %x6|Add %x5|Length %x3|Puff %x4|Cut %x2");
+
+ if(val>=0) {
+ pset->brushtype= val-1;
+ allqueue(REDRAWVIEW3D, 1);
+ }
+}
+
+/************************************************/
+/* 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 ff70ff74d70..2d6cc99b1ce 100644
--- a/source/blender/src/editscreen.c
+++ b/source/blender/src/editscreen.c
@@ -178,6 +178,7 @@ static int choose_cursor(ScrArea *sa)
return CURSOR_VPAINT;
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) {
@@ -490,6 +491,8 @@ static void addqueue_ext(short win, unsigned short event, short val, char ascii)
}
else {
BWinEvent evt;
+
+ memset(&evt, 0, sizeof(evt));
evt.event= event;
evt.val= val;
evt.ascii= ascii;
@@ -528,7 +531,7 @@ static void scrarea_dispatch_header_events(ScrArea *sa)
while(bwin_qread(sa->headwin, &evt)) {
if(evt.val) {
- if( uiDoBlocks(&curarea->uiblocks, evt.event)!=UI_NOTHING ) evt.event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, evt.event, 1)!=UI_NOTHING ) evt.event= 0;
switch(evt.event) {
case UI_BUT_EVENT:
@@ -1083,7 +1086,7 @@ int has_screenhandler(bScreen *sc, short eventcode)
static void animated_screen(bScreen *sc, short val)
{
- if (U.mixbufsize && (val & TIME_WITH_SEQ_AUDIO)) {
+ if ((val & TIME_WITH_SEQ_AUDIO)) {
if(CFRA>=PEFRA) {
CFRA= PSFRA;
audiostream_stop();
@@ -1138,7 +1141,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) {
@@ -1394,9 +1397,14 @@ void screenmain(void)
towin= 0;
}
else if (event==QKEY) {
- if((G.obedit && G.obedit->type==OB_FONT && g_activearea->spacetype==SPACE_VIEW3D)||g_activearea->spacetype==SPACE_TEXT||g_activearea->spacetype==SPACE_SCRIPT);
+ /* Temp place to print mem debugging info ctrl+alt+shift + qkey */
+ if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
+ MEM_printmemlist_pydict();
+ }
+
+ else if((G.obedit && G.obedit->type==OB_FONT && g_activearea->spacetype==SPACE_VIEW3D)||g_activearea->spacetype==SPACE_TEXT||g_activearea->spacetype==SPACE_SCRIPT);
else {
- if(val && (G.qual & LR_CTRLKEY)) {
+ if(val && (G.qual == LR_CTRLKEY)) {
if(okee("Quit Blender")) exit_usiblender();
}
towin= 0;
@@ -2440,9 +2448,6 @@ void area_fullscreen(void) /* with curarea */
wich_cursor(newa);
}
- if(curarea->full)
- retopo_force_update();
-
/* there's also events in queue for this, but we call fullscreen for render output
now, and that doesn't go back to queue. Bad code, but doesn't hurt... (ton) */
for(sa= G.curscreen->areabase.first; sa; sa= sa->next) {
@@ -2452,8 +2457,7 @@ void area_fullscreen(void) /* with curarea */
/* bad code #2: setscreen() ends with first area active. fullscreen render assumes this too */
curarea= sc->areabase.first;
- if(!curarea->full)
- retopo_force_update();
+ retopo_force_update();
}
static void area_autoplayscreen(void)
diff --git a/source/blender/src/editseq.c b/source/blender/src/editseq.c
index 9a3359d66eb..4995e106a30 100644
--- a/source/blender/src/editseq.c
+++ b/source/blender/src/editseq.c
@@ -111,8 +111,14 @@ char last_sounddir[FILE_MAXDIR+FILE_MAXFILE]= "";
#define SEQ_DESEL ~(SELECT+SEQ_LEFTSEL+SEQ_RIGHTSEL)
-static int test_overlap_seq(Sequence *);
-static void shuffle_seq(Sequence *);
+typedef struct TransSeq {
+ int start, machine;
+ int startstill, endstill;
+ int startdisp, enddisp;
+ int startofs, endofs;
+ int final_left, final_right;
+ int len;
+} TransSeq;
Sequence *get_last_seq()
{
@@ -145,6 +151,27 @@ void clear_last_seq(Sequence *seq)
_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.
@@ -220,9 +247,9 @@ int seq_tx_check_right(Sequence *seq)
/* 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_image_seq(Sequence *seq)
+int check_single_seq(Sequence *seq)
{
- if (seq->type == SEQ_IMAGE && seq->len == 1 )
+ if ( seq->len==1 && (seq->type == SEQ_IMAGE || seq->type == SEQ_COLOR))
return 1;
else
return 0;
@@ -231,7 +258,7 @@ int check_single_image_seq(Sequence *seq)
static void fix_single_image_seq(Sequence *seq)
{
int left, start, offset;
- if (!check_single_image_seq(seq))
+ if (!check_single_seq(seq))
return;
/* make sure the image is always at the start since there is only one,
@@ -304,6 +331,16 @@ int sequence_is_free_transformable(Sequence * seq)
|| (get_sequence_effect_num_inputs(seq->type) == 0);
}
+char mouse_cfra_side( int frame ) {
+ short mval[2];
+ float xmouse, ymouse;
+ getmouseco_areawin(mval);
+
+ /* choose the side based on which side of the playhead the mouse is on */
+ areamouseco_to_ipoco(G.v2d, mval, &xmouse, &ymouse);
+ return (xmouse > frame) ? 'R' : 'L';
+}
+
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*/
@@ -398,7 +435,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;
@@ -413,22 +450,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;
}
@@ -486,7 +534,7 @@ void update_seq_icu_rects(Sequence * seq)
}
}
-static int test_overlap_seq(Sequence *test)
+int test_overlap_seq(Sequence *test)
{
Sequence *seq;
Editing *ed;
@@ -509,7 +557,7 @@ static int test_overlap_seq(Sequence *test)
return 0;
}
-static void shuffle_seq(Sequence *test)
+void shuffle_seq(Sequence *test)
{
Editing *ed;
Sequence *seq;
@@ -740,12 +788,12 @@ void mouse_select_seq(void)
int hand,seldir;
TimeMarker *marker;
- marker=find_nearest_marker(1);
+ marker=find_nearest_marker(SCE_MARKERS, 1);
if (marker) {
int oldflag;
/* select timeline marker */
- if ((G.qual & LR_SHIFTKEY)==0) {
+ if (G.qual & LR_SHIFTKEY) {
oldflag= marker->flag;
deselect_markers(0, 0);
@@ -848,6 +896,7 @@ void mouse_select_seq(void)
recurs_sel_seq(seq);
}
+ allqueue(REDRAWBUTSSCENE, 0);
force_draw(0);
if(get_last_seq()) allqueue(REDRAWIPO, 0);
@@ -894,6 +943,7 @@ Sequence *alloc_sequence(ListBase *lb, int cfra, int machine)
seq->start= cfra;
seq->machine= machine;
seq->mul= 1.0;
+ seq->blend_opacity = 100.0;
return seq;
}
@@ -904,7 +954,7 @@ static Sequence *sfile_to_sequence(SpaceFile *sfile, int cfra, int machine, int
Strip *strip;
StripElem *se;
int totsel, a;
- char name[160], rel[160];
+ char name[160];
/* are there selected files? */
totsel= 0;
@@ -936,8 +986,7 @@ static Sequence *sfile_to_sequence(SpaceFile *sfile, int cfra, int machine, int
if(sfile->flag & FILE_STRINGCODE) {
strcpy(name, sfile->dir);
- strcpy(rel, G.sce);
- BLI_makestringcode(rel, name);
+ BLI_makestringcode(G.sce, name);
} else {
strcpy(name, sfile->dir);
}
@@ -953,7 +1002,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++;
}
}
@@ -961,7 +1009,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 */
@@ -978,8 +1025,8 @@ static int sfile_to_mv_sequence_load(SpaceFile *sfile, int cfra,
struct anim *anim;
Strip *strip;
StripElem *se;
- int totframe, a;
- char name[160], rel[160];
+ int totframe;
+ char name[160];
char str[FILE_MAXDIR+FILE_MAXFILE];
totframe= 0;
@@ -1011,8 +1058,7 @@ static int sfile_to_mv_sequence_load(SpaceFile *sfile, int cfra,
if(sfile->flag & FILE_STRINGCODE) {
strcpy(name, sfile->dir);
- strcpy(rel, G.sce);
- BLI_makestringcode(rel, name);
+ BLI_makestringcode(G.sce, name);
} else {
strcpy(name, sfile->dir);
}
@@ -1022,7 +1068,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)
@@ -1030,11 +1076,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);
@@ -1079,8 +1120,7 @@ static Sequence *sfile_to_ramsnd_sequence(SpaceFile *sfile,
Strip *strip;
StripElem *se;
double totframe;
- int a;
- char name[160], rel[160];
+ char name[160];
char str[256];
totframe= 0.0;
@@ -1101,7 +1141,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);
@@ -1113,8 +1154,7 @@ static Sequence *sfile_to_ramsnd_sequence(SpaceFile *sfile,
if(sfile->flag & FILE_STRINGCODE) {
strcpy(name, sfile->dir);
- strcpy(rel, G.sce);
- BLI_makestringcode(rel, name);
+ BLI_makestringcode(G.sce, name);
} else {
strcpy(name, sfile->dir);
}
@@ -1124,17 +1164,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);
@@ -1148,8 +1182,8 @@ static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
struct hdaudio *hdaudio;
Strip *strip;
StripElem *se;
- int totframe, a;
- char name[160], rel[160];
+ int totframe;
+ char name[160];
char str[FILE_MAXDIR+FILE_MAXFILE];
totframe= 0;
@@ -1168,7 +1202,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);
@@ -1180,8 +1214,7 @@ static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
if(sfile->flag & FILE_STRINGCODE) {
strcpy(name, sfile->dir);
- strcpy(rel, G.sce);
- BLI_makestringcode(rel, name);
+ BLI_makestringcode(G.sce, name);
} else {
strcpy(name, sfile->dir);
}
@@ -1191,7 +1224,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)
@@ -1199,12 +1232,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);
@@ -1431,6 +1458,50 @@ static void add_sound_strip_hd(char *name)
transform_seq_nomarker('g', 0);
}
+static void add_scene_strip(short event)
+{
+ Sequence *seq;
+ Strip *strip;
+ float x, y;
+ int cfra, machine;
+ short mval[2];
+
+ if(event> -1) {
+ int nr= 1;
+ Scene * sce= G.main->scene.first;
+ while(sce) {
+ if( event==nr) break;
+ nr++;
+ sce= sce->id.next;
+ }
+ if(sce) {
+
+ deselect_all_seq();
+
+ /* where ? */
+ getmouseco_areawin(mval);
+ areamouseco_to_ipoco(G.v2d, mval, &x, &y);
+ cfra= (int)(x+0.5);
+ machine= (int)(y+0.5);
+
+ seq= alloc_sequence(((Editing *)G.scene->ed)->seqbasep, cfra, machine);
+ seq->type= SEQ_SCENE;
+ seq->scene= sce;
+ seq->sfra= sce->r.sfra;
+ seq->len= sce->r.efra - sce->r.sfra + 1;
+
+ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
+ strncpy(seq->name + 2, sce->id.name + 2,
+ sizeof(seq->name) - 2);
+ strip->len= seq->len;
+ strip->us= 1;
+
+ BIF_undo_push("Add Scene Strip, Sequencer");
+ transform_seq_nomarker('g', 0);
+ }
+ }
+}
+
#if 0
static void reload_sound_strip(char *name)
{
@@ -1686,12 +1757,7 @@ static void load_plugin_seq(char *str) /* called from fileselect */
void add_sequence(int type)
{
Editing *ed;
- Sequence *seq;
- Strip *strip;
- Scene *sce;
- float x, y;
- int cfra, machine;
- short nr, event, mval[2];
+ short event;
char *str;
if (type >= 0){
@@ -1817,43 +1883,8 @@ void add_sequence(int type)
/* new menu: */
IDnames_to_pupstring(&str, NULL, NULL, &G.main->scene, (ID *)G.scene, NULL);
- event= pupmenu_col(str, 20);
+ add_scene_strip(pupmenu_col(str, 20));
- if(event> -1) {
- nr= 1;
- sce= G.main->scene.first;
- while(sce) {
- if( event==nr) break;
- nr++;
- sce= sce->id.next;
- }
- if(sce) {
-
- deselect_all_seq();
-
- /* where ? */
- getmouseco_areawin(mval);
- areamouseco_to_ipoco(G.v2d, mval, &x, &y);
- cfra= (int)(x+0.5);
- machine= (int)(y+0.5);
-
- seq= alloc_sequence(((Editing *)G.scene->ed)->seqbasep, cfra, machine);
- seq->type= SEQ_SCENE;
- seq->scene= sce;
- seq->sfra= sce->r.sfra;
- seq->len= sce->r.efra - sce->r.sfra + 1;
-
- seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
- strncpy(seq->name + 2, sce->id.name + 2,
- sizeof(seq->name) - 2);
- strip->len= seq->len;
- 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_nomarker('g', 0);
- }
- }
MEM_freeN(str);
break;
@@ -1978,6 +2009,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);
@@ -1986,6 +2021,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;
@@ -2117,161 +2165,256 @@ void del_seq(void)
allqueue(REDRAWSEQ, 0);
}
-static void recurs_dupli_seq(ListBase *old, ListBase *new)
+static Sequence *dupli_seq(Sequence *seq)
{
- Sequence *seq, *seqn;
- Sequence *last_seq = get_last_seq();
- StripElem *se;
- int a;
+ Sequence *seqn = MEM_dupallocN(seq);
- seq= old->first;
+ seq->tmp = seqn;
+
+ seqn->strip= MEM_dupallocN(seq->strip);
- while(seq) {
- seq->tmp= NULL;
- if(seq->flag & SELECT) {
+ if(seqn->ipo) seqn->ipo->id.us++;
- if(seq->type==SEQ_META) {
- seqn= MEM_dupallocN(seq);
- seq->tmp= seqn;
- BLI_addtail(new, seqn);
+ seqn->strip->tstripdata = 0;
+ seqn->strip->tstripdata_startstill = 0;
+ seqn->strip->tstripdata_endstill = 0;
- seqn->strip= MEM_dupallocN(seq->strip);
+ if (seq->strip->crop) {
+ seqn->strip->crop = MEM_dupallocN(seq->strip->crop);
+ }
- if(seq->len>0) seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ if (seq->strip->transform) {
+ seqn->strip->transform = MEM_dupallocN(seq->strip->transform);
+ }
- seq->flag &= SEQ_DESEL;
- seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
+ if (seq->strip->proxy) {
+ seqn->strip->proxy = MEM_dupallocN(seq->strip->proxy);
+ }
- seqn->seqbase.first= seqn->seqbase.last= 0;
- recurs_dupli_seq(&seq->seqbase,&seqn->seqbase);
+ if (seq->strip->color_balance) {
+ seqn->strip->color_balance
+ = MEM_dupallocN(seq->strip->color_balance);
+ }
+
+ if(seq->type==SEQ_META) {
+ seqn->strip->stripdata = 0;
- }
- else if(seq->type == SEQ_SCENE) {
- seqn= MEM_dupallocN(seq);
- seq->tmp= seqn;
- BLI_addtail(new, seqn);
+ seqn->seqbase.first= seqn->seqbase.last= 0;
+ /* WATCH OUT!!! - This metastrip is not recursively duplicated here - do this after!!! */
+ /* - recurs_dupli_seq(&seq->seqbase,&seqn->seqbase);*/
+ } else if(seq->type == SEQ_SCENE) {
+ seqn->strip->stripdata = 0;
+ } else if(seq->type == SEQ_MOVIE) {
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ seqn->anim= 0;
+ } else if(seq->type == SEQ_RAM_SOUND) {
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ seqn->sound->id.us++;
+ } else if(seq->type == SEQ_HD_SOUND) {
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ seqn->hdaudio = 0;
+ } else if(seq->type == SEQ_IMAGE) {
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ } else if(seq->type >= SEQ_EFFECT) {
+ 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;
- seqn->strip= MEM_dupallocN(seq->strip);
+ if (seq->type & SEQ_EFFECT) {
+ struct SeqEffectHandle sh;
+ sh = get_sequence_effect(seq);
+ if(sh.copy)
+ sh.copy(seq, seqn);
+ }
- if(seq->len>0) seqn->strip->stripdata = MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ seqn->strip->stripdata = 0;
+
+ } else {
+ fprintf(stderr, "Aiiiiekkk! sequence type not "
+ "handled in duplicate!\nExpect a crash"
+ " now...\n");
+ }
+
+ return seqn;
+}
+
+static void recurs_dupli_seq(ListBase *old, ListBase *new)
+{
+ Sequence *seq;
+ Sequence *seqn = 0;
+ Sequence *last_seq = get_last_seq();
+ for(seq= old->first; seq; seq= seq->next) {
+ seq->tmp= NULL;
+ if(seq->flag & SELECT) {
+ seqn = dupli_seq(seq);
+ if (seqn) { /*should never fail */
seq->flag &= SEQ_DESEL;
- seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
- }
- else if(seq->type == SEQ_MOVIE) {
- seqn= MEM_dupallocN(seq);
- seq->tmp= seqn;
- BLI_addtail(new, seqn);
+ seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL+SEQ_LOCK);
- seqn->strip= MEM_dupallocN(seq->strip);
- 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++;
- }
+ BLI_addtail(new, seqn);
+ if(seq->type==SEQ_META)
+ recurs_dupli_seq(&seq->seqbase,&seqn->seqbase);
+
+ if (seq == last_seq) {
+ set_last_seq(seqn);
}
-
- seq->flag &= SEQ_DESEL;
- seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
}
- else if(seq->type == SEQ_RAM_SOUND) {
- seqn= MEM_dupallocN(seq);
- seq->tmp= seqn;
- BLI_addtail(new, seqn);
+ }
+ }
+}
+
+/* like duplicate, but only duplicate and cut overlapping strips,
+ * strips to the left of the cutframe are ignored and strips to the right are moved into the new list */
+static void recurs_cut_seq(ListBase *old, ListBase *new, int cutframe)
+{
+ Sequence *seq, *seq_next;
+ Sequence *seqn = 0;
+
+ TransSeq ts;
- seqn->strip= MEM_dupallocN(seq->strip);
- 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= old->first;
+
+ while(seq) {
+ seq_next = seq->next; /* we need this because we may remove seq */
+
+ seq->tmp= NULL;
+ if(seq->flag & SELECT) {
+ if(cutframe > seq->startdisp && cutframe < seq->enddisp) {
+
+ /* backup values */
+ ts.start= seq->start;
+ ts.machine= seq->machine;
+ ts.startstill= seq->startstill;
+ ts.endstill= seq->endstill;
+ ts.startdisp= seq->startdisp;
+ ts.enddisp= seq->enddisp;
+ ts.startofs= seq->startofs;
+ ts.endofs= seq->endofs;
+ ts.len= seq->len;
+
+ /* First Strip! */
+ /* strips with extended stillfames before */
+ if(seq->type!=SEQ_META) {
+
+ if ((seq->startstill) && (cutframe <seq->start)) {
+ seq->start= cutframe -1;
+ seq->startstill= cutframe -seq->startdisp -1;
+ seq->len= 1;
+ seq->endstill= 0;
+ }
+
+ /* normal strip */
+ else if ((cutframe >=seq->start)&&(cutframe <=(seq->start+seq->len))) {
+ seq->endofs = (seq->start+seq->len) - cutframe;
}
+
+ /* strips with extended stillframes after */
+ else if (((seq->start+seq->len) < cutframe) && (seq->endstill)) {
+ seq->endstill -= seq->enddisp - cutframe;
+ }
+
+ calc_sequence(seq);
}
-
- seq->flag &= SEQ_DESEL;
- seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
- }
- else if(seq->type == SEQ_HD_SOUND) {
- seqn= MEM_dupallocN(seq);
- seq->tmp= seqn;
- BLI_addtail(new, seqn);
-
- seqn->strip= MEM_dupallocN(seq->strip);
- 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++;
+
+ /* Duplicate AFTER the first change */
+ seqn = dupli_seq(seq);
+
+ if (seqn) { /* should never fail */
+ seqn->flag |= SELECT;
+
+
+ BLI_addtail(new, seqn);
+
+ /* dont transform meta's - just do their children then recalc */
+ if(seq->type==SEQ_META) {
+ recurs_cut_seq(&seq->seqbase,&seqn->seqbase, cutframe);
+ } else {
+ /* Second Strip! */
+ /* strips with extended stillframes before */
+ if ((seqn->startstill) && (cutframe == seqn->start + 1)) {
+ seqn->start = ts.start;
+ seqn->startstill= ts.start- cutframe;
+ seqn->len = ts.len;
+ seqn->endstill = ts.endstill;
+ }
+
+ /* normal strip */
+ else if ((cutframe>=seqn->start)&&(cutframe<=(seqn->start+seqn->len))) {
+ seqn->startstill = 0;
+ seqn->startofs = cutframe - ts.start;
+ seqn->endofs = ts.endofs;
+ seqn->endstill = ts.endstill;
+ }
+
+ /* strips with extended stillframes after */
+ else if (((seqn->start+seqn->len) < cutframe) && (seqn->endstill)) {
+ seqn->start = cutframe - ts.len +1;
+ seqn->startofs = ts.len-1;
+ seqn->endstill = ts.enddisp - cutframe -1;
+ seqn->startstill = 0;
+ }
}
+
+ if(seq->type==SEQ_META) /* account for strips within changing */
+ calc_sequence(seq);
+
+ calc_sequence(seqn);
}
-
- seq->flag &= SEQ_DESEL;
- seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
+ } else if (seq->enddisp <= cutframe) {
+ /* do nothing */
+ } else if (seq->startdisp >= cutframe) {
+ /* move into new list */
+ BLI_remlink(old, seq);
+ BLI_addtail(new, seq);
}
- else if(seq->type < SEQ_EFFECT) {
- seqn= MEM_dupallocN(seq);
- seq->tmp= seqn;
- BLI_addtail(new, seqn);
-
- seqn->strip->us++;
- seq->flag &= SEQ_DESEL;
-
- seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
- }
- else {
- seqn= MEM_dupallocN(seq);
- seq->tmp= seqn;
- BLI_addtail(new, seqn);
-
- 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++;
+ }
+ seq = seq_next;
+ }
+}
- if (seq->type & SEQ_EFFECT) {
- struct SeqEffectHandle sh;
- sh = get_sequence_effect(seq);
- if(sh.copy)
- sh.copy(seq, seqn);
+void seq_cut(int cutframe)
+{
+ Editing *ed;
+ ListBase newlist;
+ char side;
+ ed= G.scene->ed;
+ if(ed==0) return;
+
+ newlist.first= newlist.last= NULL;
+
+ recurs_cut_seq(ed->seqbasep, &newlist, cutframe);
+
+ if (newlist.first) { /* simple check to see if anything was done */
+ Sequence *seq;
+ addlisttolist(ed->seqbasep, &newlist);
+
+
+ /* change the selection, not strictly needed but nice */
+ side = mouse_cfra_side(cutframe);
+
+ WHILE_SEQ(ed->seqbasep) {
+ if (side=='L') {
+ if ( seq->startdisp >= cutframe ) {
+ seq->flag &= ~SELECT;
+ }
+ } else {
+ if ( seq->enddisp <= cutframe ) {
+ seq->flag &= ~SELECT;
}
-
- seqn->strip= MEM_dupallocN(seq->strip);
-
- if(seq->len>0) seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
-
- seq->flag &= SEQ_DESEL;
-
- seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
- }
- if (seq == last_seq) {
- set_last_seq(seqn);
}
}
- seq= seq->next;
+ END_SEQ;
+
+ /* as last: */
+ sort_seq();
+
+ allqueue(REDRAWSEQ, 0);
+ BIF_undo_push("Cut Strips, Sequencer");
}
}
@@ -2461,7 +2604,7 @@ void make_meta(void)
}
seq= seq->next;
}
- if(tot < 2) return;
+ if(tot < 1) return;
if(okee("Make Meta Strip")==0) return;
@@ -2514,9 +2657,11 @@ 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);
+ set_meta_stripdata(seqm);
+
+ if( test_overlap_seq(seqm) ) shuffle_seq(seqm);
+
BIF_undo_push("Make Meta Strip, Sequencer");
allqueue(REDRAWSEQ, 0);
}
@@ -2603,7 +2748,7 @@ void exit_meta(void)
set_last_seq(ms->parseq);
- ms->parseq->flag= SELECT;
+ ms->parseq->flag |= SELECT;
recurs_sel_seq(ms->parseq);
MEM_freeN(ms);
@@ -2655,15 +2800,6 @@ static int seq_get_snaplimit(void)
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)
{
@@ -2672,7 +2808,7 @@ static void transform_grab_xlimits(Sequence *seq, int leftflag, int rightflag)
seq_tx_set_final_left(seq, seq_tx_get_final_right(seq)-1);
}
- if (check_single_image_seq(seq)==0) {
+ 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);
}
@@ -2694,7 +2830,7 @@ static void transform_grab_xlimits(Sequence *seq, int leftflag, int rightflag)
seq_tx_set_final_right(seq, seq_tx_get_final_left(seq)+1);
}
- if (check_single_image_seq(seq)==0) {
+ 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);
}
@@ -2708,6 +2844,21 @@ static void transform_grab_xlimits(Sequence *seq, int leftflag, int rightflag)
}
}
+static int can_transform_seq_test_func(Sequence * seq)
+{
+ if((seq->flag & SELECT) && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
+ return BUILD_SEQAR_COUNT_CURRENT | BUILD_SEQAR_COUNT_CHILDREN;
+ }
+ if ((seq->depth==0 && seq->flag & SEQ_LOCK) && !(seq->type & SEQ_EFFECT)) {
+ if (seq->type != SEQ_META) {
+ return BUILD_SEQAR_COUNT_NOTHING;
+ } else {
+ return BUILD_SEQAR_COUNT_CURRENT;
+ }
+ }
+ return BUILD_SEQAR_COUNT_CURRENT | BUILD_SEQAR_COUNT_CHILDREN;
+}
+
void transform_seq(int mode, int context)
{
SpaceSeq *sseq= curarea->spacedata.first;
@@ -2721,13 +2872,13 @@ void transform_seq(int mode, int context)
unsigned short event = 0;
short mval[2], val, xo, yo, xn, yn;
char str[32];
- char side; /* for extend mode only - use to know which side to extend on */
-
+ 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;
+ 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)
@@ -2741,6 +2892,9 @@ void transform_seq(int mode, int context)
int *oldframe = NULL, totmark=0, a;
TimeMarker *marker;
+ /* looping on sequences, WHILE_SEQ macro allocates memory each time */
+ int totseq_index, seq_index;
+ Sequence **seqar = 0;
if(mode!='g' && mode!='e') return; /* from gesture */
@@ -2748,28 +2902,36 @@ void transform_seq(int mode, int context)
ed= G.scene->ed;
if(ed==0) return;
- WHILE_SEQ(ed->seqbasep) {
- if(seq->flag & SELECT) totstrip++;
+ /* Build the sequence array once, be sure to free it */
+ build_seqar_cb( ed->seqbasep, &seqar, &totseq_index,
+ can_transform_seq_test_func );
+
+ if (seqar) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
+ if((seq->flag & SELECT) && !(seq->depth==0 && seq->flag & SEQ_LOCK))
+ totstrip++;
+ }
}
- END_SEQ
-
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;
+ if(totstrip==0 && totmark==0) {
+ if(seqar) MEM_freeN(seqar);
+ return;
+ }
+
G.moving= 1;
last_seq = get_last_seq();
ts=transmain= MEM_callocN(totstrip*sizeof(TransSeq), "transseq");
- WHILE_SEQ(ed->seqbasep) {
-
- if(seq->flag & SELECT) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
+ if((seq->flag & SELECT) && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
ts->start= seq->start;
ts->machine= seq->machine;
ts->startstill= seq->startstill;
@@ -2785,16 +2947,12 @@ void transform_seq(int mode, int context)
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';
- }
+ if (mode=='e')
+ side = mouse_cfra_side(cfra);
/* Markers */
if (sseq->flag & SEQ_MARKER_TRANS && totmark) {
@@ -2862,7 +3020,7 @@ void transform_seq(int mode, int context)
snapskip = 0;
} else {
int dist;
- int snap_ofs;
+ int snap_ofs= 0;
int snap_dist= snapdist_max;
/* Get sequence points to snap to the markers */
@@ -2879,7 +3037,7 @@ void transform_seq(int mode, int context)
int bounds_left = MAXFRAME*2;
int bounds_right = -(MAXFRAME*2);
- WHILE_SEQ(ed->seqbasep) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
if(seq->flag & SELECT) {
if(seq_tx_check_left(seq))
bounds_left = MIN2(bounds_left, seq_tx_get_final_left(seq));
@@ -2887,7 +3045,6 @@ void transform_seq(int mode, int context)
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)
@@ -2931,13 +3088,13 @@ void transform_seq(int mode, int context)
}
/* check seq's next to the active also - nice for quick snapping */
- if (snap_dist && seq_tx_check_left(last_seq)) {
+ 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 && seq_tx_check_right(last_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));
@@ -2959,8 +3116,8 @@ void transform_seq(int mode, int context)
if (mode=='g' && !snapskip) {
/* Grab */
- WHILE_SEQ(ed->seqbasep) {
- if(seq->flag & SELECT) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
+ if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
int myofs;
// SEQ_DEBUG_INFO(seq);
@@ -2988,13 +3145,13 @@ void transform_seq(int mode, int context)
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) {
marker->frame= oldframe[a] + ix;
+ marker_moved=1;
a++;
}
}
@@ -3011,8 +3168,8 @@ void transform_seq(int mode, int context)
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) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
+ if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
/* only move the contents of the metastrip otherwise the transformation is applied twice */
if (sequence_is_free_transformable(seq) && seq->type != SEQ_META) {
@@ -3091,7 +3248,6 @@ void transform_seq(int mode, int context)
ts++;
}
}
- END_SEQ
/* markers */
if (sseq->flag & SEQ_MARKER_TRANS) {
@@ -3099,6 +3255,7 @@ void transform_seq(int mode, int context)
if (marker->flag & SELECT) {
if(oldframe[a] != MAXFRAME+1) {
marker->frame= oldframe[a] + ix;
+ marker_moved=1;
}
a++;
}
@@ -3123,8 +3280,8 @@ void transform_seq(int mode, int context)
yo= mval[1];
/* test for effect and overlap */
- WHILE_SEQ(ed->seqbasep) {
- if(seq->flag & SELECT) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
+ if((seq->depth==0) && (seq->flag & SELECT) && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
seq->flag &= ~SEQ_OVERLAP;
if( test_overlap_seq(seq) ) {
seq->flag |= SEQ_OVERLAP;
@@ -3136,8 +3293,9 @@ void transform_seq(int mode, int context)
else if(seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(seq);
}
}
- END_SEQ;
-
+ /* warning, drawing should NEVER use WHILE_SEQ,
+ if it does the seq->depth value will be messed up and
+ overlap checks with metastrips will give incorrect results */
force_draw(0);
}
@@ -3173,8 +3331,8 @@ void transform_seq(int mode, int context)
if((event==ESCKEY) || (event==RIGHTMOUSE)) {
ts= transmain;
- WHILE_SEQ(ed->seqbasep) {
- if(seq->flag & SELECT) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
+ if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
seq->start= ts->start;
seq->machine= ts->machine;
seq->startstill= ts->startstill;
@@ -3192,9 +3350,7 @@ void transform_seq(int mode, int context)
else if(seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(seq);
}
}
- END_SEQ
-
-
+
/* Markers */
if (sseq->flag & SEQ_MARKER_TRANS) {
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
@@ -3205,11 +3361,12 @@ void transform_seq(int mode, int context)
a++;
}
}
- }
+ marker_moved = 0;
+ }
} else {
/* images, effects and overlap */
- WHILE_SEQ(ed->seqbasep) {
+ for(seq_index=0, seq=seqar[0]; seq_index < totseq_index; seq=seqar[++seq_index]) {
/* 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
@@ -3228,12 +3385,14 @@ void transform_seq(int mode, int context)
}
else if(seq->type & SEQ_EFFECT) calc_sequence(seq);
}
- END_SEQ
/* as last: */
sort_seq();
}
-
+
+ /* free sequence array */
+ if(seqar) MEM_freeN(seqar);
+
G.moving= 0;
MEM_freeN(transmain);
@@ -3245,7 +3404,10 @@ void transform_seq(int mode, int context)
else if (mode=='e')
BIF_undo_push("Transform Extend, Sequencer");
- allqueue(REDRAWSEQ, 0);
+ if (marker_moved)
+ allqueue(REDRAWMARKER, 0);
+ else
+ allqueue(REDRAWSEQ, 0);
}
/* since grab can move markers, we must turn this off before adding a new sequence
@@ -3262,137 +3424,6 @@ void transform_seq_nomarker(int mode, int context) {
sseq->flag = flag_back;
}
-void seq_cut(int cutframe)
-{
- Editing *ed;
- Sequence *seq;
- TransSeq *ts, *transmain;
- int tot=0;
- ListBase newlist;
-
- ed= G.scene->ed;
- if(ed==0) return;
-
- /* test for validity */
- for(seq= ed->seqbasep->first; seq; seq= seq->next) {
- if(seq->flag & SELECT) {
- if(cutframe > seq->startdisp && cutframe < seq->enddisp)
- if(seq->type==SEQ_META) break;
- }
- }
- if(seq) {
- error("Cannot Cut Meta Strips");
- return;
- }
-
- /* we build an array of TransSeq, to denote which strips take part in cutting */
- for(seq= ed->seqbasep->first; seq; seq= seq->next) {
- if(seq->flag & SELECT) {
- if(cutframe > seq->startdisp && cutframe < seq->enddisp)
- tot++;
- else
- seq->flag &= ~SELECT; // bad code, but we need it for recurs_dupli_seq... note that this ~SELECT assumption is used in loops below too (ton)
- }
- }
-
- if(tot==0) {
- error("No Strips to Cut");
- return;
- }
-
- ts=transmain= MEM_callocN(tot*sizeof(TransSeq), "transseq");
-
- for(seq= ed->seqbasep->first; seq; seq= seq->next) {
- if(seq->flag & SELECT) {
-
- ts->start= seq->start;
- ts->machine= seq->machine;
- ts->startstill= seq->startstill;
- ts->endstill= seq->endstill;
- ts->startdisp= seq->startdisp;
- ts->enddisp= seq->enddisp;
- ts->startofs= seq->startofs;
- ts->endofs= seq->endofs;
- ts->len= seq->len;
-
- ts++;
- }
- }
-
- for(seq= ed->seqbasep->first; seq; seq= seq->next) {
- if(seq->flag & SELECT) {
-
- /* strips with extended stillframes before */
- if ((seq->startstill) && (cutframe <seq->start)) {
- seq->start= cutframe -1;
- seq->startstill= cutframe -seq->startdisp -1;
- seq->len= 1;
- seq->endstill= 0;
- }
-
- /* normal strip */
- else if ((cutframe >=seq->start)&&(cutframe <=(seq->start+seq->len))) {
- seq->endofs = (seq->start+seq->len) - cutframe;
- }
-
- /* strips with extended stillframes after */
- else if (((seq->start+seq->len) < cutframe) && (seq->endstill)) {
- seq->endstill -= seq->enddisp - cutframe;
- }
-
- calc_sequence(seq);
- }
- }
-
- newlist.first= newlist.last= NULL;
-
- /* now we duplicate the cut strip and move it into place afterwards */
- recurs_dupli_seq(ed->seqbasep, &newlist);
- addlisttolist(ed->seqbasep, &newlist);
-
- ts= transmain;
-
- /* go through all the strips and correct them based on their stored values */
- for(seq= ed->seqbasep->first; seq; seq= seq->next) {
- if(seq->flag & SELECT) {
-
- /* strips with extended stillframes before */
- if ((seq->startstill) && (cutframe == seq->start + 1)) {
- seq->start = ts->start;
- seq->startstill= ts->start- cutframe;
- seq->len = ts->len;
- seq->endstill = ts->endstill;
- }
-
- /* normal strip */
- else if ((cutframe>=seq->start)&&(cutframe<=(seq->start+seq->len))) {
- seq->startstill = 0;
- seq->startofs = cutframe - ts->start;
- seq->endofs = ts->endofs;
- seq->endstill = ts->endstill;
- }
-
- /* strips with extended stillframes after */
- else if (((seq->start+seq->len) < cutframe) && (seq->endstill)) {
- seq->start = cutframe - ts->len +1;
- seq->startofs = ts->len-1;
- seq->endstill = ts->enddisp - cutframe -1;
- seq->startstill = 0;
- }
- calc_sequence(seq);
-
- ts++;
- }
- }
-
- /* as last: */
- sort_seq();
- MEM_freeN(transmain);
-
- allqueue(REDRAWSEQ, 0);
- BIF_undo_push("Cut Strips, Sequencer");
-}
-
void seq_separate_images(void)
{
Editing *ed;
@@ -3440,8 +3471,6 @@ void seq_separate_images(void)
/* new stripdata */
strip_new->stripdata= se_new= MEM_callocN(sizeof(StripElem)*1, "stripelem");
strncpy(se_new->name, se->name, FILE_MAXFILE-1);
- se_new->ok= 1;
-
calc_sequence(seq_new);
seq_new->flag &= ~SEQ_OVERLAP;
if (test_overlap_seq(seq_new)) {
@@ -3587,17 +3616,26 @@ void seq_snap(short event)
/* also check metas */
WHILE_SEQ(ed->seqbasep) {
- if(seq->flag & SELECT) {
- if(sequence_is_free_transformable(seq)) seq->start= CFRA-seq->startofs+seq->startstill;
+ if (seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK) &&
+ sequence_is_free_transformable(seq)) {
+ if((seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))==0) {
+ seq->start= CFRA-seq->startofs+seq->startstill;
+ } else {
+ if(seq->flag & SEQ_LEFTSEL) {
+ seq_tx_set_final_left(seq, CFRA);
+ } else { /* SEQ_RIGHTSEL */
+ seq_tx_set_final_right(seq, CFRA);
+ }
+ transform_grab_xlimits(seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
+ }
calc_sequence(seq);
}
}
END_SEQ
-
/* test for effects and overlap */
WHILE_SEQ(ed->seqbasep) {
- if(seq->flag & SELECT) {
+ if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
seq->flag &= ~SEQ_OVERLAP;
if( test_overlap_seq(seq) ) {
shuffle_seq(seq);
@@ -3621,6 +3659,23 @@ void seq_snap(short event)
allqueue(REDRAWSEQ, 0);
}
+void seq_mute_sel(int mute) {
+ Editing *ed;
+ Sequence *seq;
+
+ ed= G.scene->ed;
+ if(!ed) return;
+
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
+ if ((seq->flag & SELECT) && (seq->flag & SEQ_LOCK)==0) {
+ if (mute) seq->flag |= SEQ_MUTE;
+ else seq->flag &= ~SEQ_MUTE;
+ }
+ }
+ BIF_undo_push(mute?"Mute Strips, Sequencer":"UnMute Strips, Sequencer");
+ allqueue(REDRAWSEQ, 0);
+}
+
void borderselect_seq(void)
{
Sequence *seq;
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index 1b713609174..73ff70436f3 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -97,6 +97,7 @@
#include "BSE_drawipo.h"
#include "BSE_edit.h"
#include "BSE_filesel.h"
+#include "BSE_node.h"
#include "BSE_trans_types.h"
#include "BDR_editobject.h"
@@ -164,8 +165,8 @@ void be_square_tface_uv(EditMesh *em)
for (efa= em->faces.first; efa; efa= efa->next) {
if (efa->v4) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0)) {
+ 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];
@@ -176,7 +177,7 @@ void be_square_tface_uv(EditMesh *em)
}
}
- if (SIMA_UVSEL_CHECK(efa, tface, 1)) {
+ 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];
@@ -187,7 +188,7 @@ void be_square_tface_uv(EditMesh *em)
}
}
- if (SIMA_UVSEL_CHECK(efa, tface, 2)) {
+ 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];
@@ -197,7 +198,7 @@ void be_square_tface_uv(EditMesh *em)
tface->uv[1][1]= tface->uv[2][1];
}
}
- if (SIMA_UVSEL_CHECK(efa, tface, 3)) {
+ 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];
@@ -239,17 +240,12 @@ void transform_width_height_tface_uv(int *width, int *height)
}
}
-void mirror_tface_uv(char mirroraxis)
-{
- if (mirroraxis == 'x')
- Mirror(1); /* global x */
- else if (mirroraxis == 'y')
- Mirror(2); /* global y */
-}
-
void mirrormenu_tface_uv(void)
{
+ float mat[3][3];
short mode= 0;
+
+ Mat3One(mat);
if( is_uv_tface_editing_allowed()==0 ) return;
@@ -257,8 +253,16 @@ void mirrormenu_tface_uv(void)
if(mode==-1) return;
- if(mode==1) mirror_tface_uv('x');
- else if(mode==2) mirror_tface_uv('y');
+ if (mode == 1) {
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setSingleAxisConstraint(mat[0], " on X axis");
+ Transform();
+ }
+ else {
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setSingleAxisConstraint(mat[1], " on Y axis");
+ Transform();
+ }
BIF_undo_push("Mirror UV");
}
@@ -276,14 +280,14 @@ void weld_align_tface_uv(char tool)
if(tool == 'x' || tool == 'w') {
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0))
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0))
tface->uv[0][0]= cent[0];
- if (SIMA_UVSEL_CHECK(efa, tface, 1))
+ if (simaUVSel_Check(efa, tface, 1))
tface->uv[1][0]= cent[0];
- if (SIMA_UVSEL_CHECK(efa, tface, 2))
+ if (simaUVSel_Check(efa, tface, 2))
tface->uv[2][0]= cent[0];
- if (efa->v4 && SIMA_UVSEL_CHECK(efa, tface, 3))
+ if (efa->v4 && simaUVSel_Check(efa, tface, 3))
tface->uv[3][0]= cent[0];
}
}
@@ -292,14 +296,14 @@ void weld_align_tface_uv(char tool)
if(tool == 'y' || tool == 'w') {
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0))
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0))
tface->uv[0][1]= cent[1];
- if (SIMA_UVSEL_CHECK(efa, tface, 1))
+ if (simaUVSel_Check(efa, tface, 1))
tface->uv[1][1]= cent[1];
- if (SIMA_UVSEL_CHECK(efa, tface, 2))
+ if (simaUVSel_Check(efa, tface, 2))
tface->uv[2][1]= cent[1];
- if (efa->v4 && SIMA_UVSEL_CHECK(efa, tface, 3))
+ if (efa->v4 && simaUVSel_Check(efa, tface, 3))
tface->uv[3][1]= cent[1];
}
}
@@ -335,26 +339,26 @@ void stitch_vert_uv_tface(void)
// 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 (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0)) {
+ 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 (SIMA_UVSEL_CHECK(efa, tface, 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 (SIMA_UVSEL_CHECK(efa, tface, 2)) {
+ 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 && SIMA_UVSEL_CHECK(efa, tface, 3)) {
+ if (efa->v4 && simaUVSel_Check(efa, tface, 3)) {
uvav = uv_average + efa->v4->tmp.l;
uvav->count++;
uvav->uv[0] += tface->uv[3][0];
@@ -366,23 +370,23 @@ void stitch_vert_uv_tface(void)
// apply uv welding
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0)) {
+ 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 (SIMA_UVSEL_CHECK(efa, tface, 1)) {
+ 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 (SIMA_UVSEL_CHECK(efa, tface, 2)) {
+ 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 && SIMA_UVSEL_CHECK(efa, tface, 3)) {
+ 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;
@@ -426,7 +430,7 @@ void select_invert_tface_uv(void)
} else {
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ if (simaFaceDraw_Check(efa, tface)) {
tface->flag ^= TF_SEL1;
tface->flag ^= TF_SEL2;
tface->flag ^= TF_SEL3;
@@ -455,7 +459,7 @@ void select_swap_tface_uv(void)
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ if (simaFaceDraw_Check(efa, tface)) {
if(tface->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) {
sel= 1;
break;
@@ -465,7 +469,7 @@ void select_swap_tface_uv(void)
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ 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);
@@ -514,7 +518,7 @@ static void find_nearest_tface(MTFace **nearesttf, EditFace **nearestefa)
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
+ if (simaFaceDraw_Check(efa, tf)) {
fcenter[0]= fcenter[1]= 0;
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
@@ -585,13 +589,13 @@ void find_nearest_uv(MTFace **nearesttf, EditFace **nearestefa, unsigned int *ne
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
+ 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 (SIMA_UVSEL_CHECK(efa, tf, i))
+ if (simaUVSel_Check(efa, tf, i))
dist += 5;
if(dist<=mindist) {
@@ -695,24 +699,24 @@ void mouse_select_sima(void)
if(G.qual & LR_SHIFTKEY) {
/* (de)select face */
if(actface) {
- if(SIMA_FACESEL_CHECK(nearestefa, nearesttf)) {
- SIMA_FACESEL_UNSET(nearestefa, nearesttf);
+ if(simaFaceSel_Check(nearestefa, nearesttf)) {
+ simaFaceSel_UnSet(nearestefa, nearesttf);
selectsticky= 0;
}
else {
- SIMA_FACESEL_SET(nearestefa, nearesttf);
+ simaFaceSel_Set(nearestefa, nearesttf);
selectsticky= 1;
}
flush = -1;
}
/* (de)select uv node */
else {
- if (SIMA_UVSEL_CHECK(nearestefa, nearesttf, nearestuv)) {
- SIMA_UVSEL_UNSET(nearestefa, nearesttf, nearestuv);
+ if (simaUVSel_Check(nearestefa, nearesttf, nearestuv)) {
+ simaUVSel_UnSet(nearestefa, nearesttf, nearestuv);
selectsticky= 0;
}
else {
- SIMA_UVSEL_SET(nearestefa, nearesttf, nearestuv);
+ simaUVSel_Set(nearestefa, nearesttf, nearestuv);
selectsticky= 1;
}
flush = 1;
@@ -729,19 +733,19 @@ void mouse_select_sima(void)
if(selectsticky==0) {
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
+ 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))
- SIMA_UVSEL_UNSET(efa, tf, 0);
+ simaUVSel_UnSet(efa, tf, 0);
if(msel_hit(limit, hitv, efa->v2->tmp.l, hituv, tf->uv[1], sticky))
- SIMA_UVSEL_UNSET(efa, tf, 1);
+ simaUVSel_UnSet(efa, tf, 1);
if(msel_hit(limit, hitv, efa->v3->tmp.l, hituv, tf->uv[2], sticky))
- SIMA_UVSEL_UNSET(efa, tf, 2);
+ simaUVSel_UnSet(efa, tf, 2);
if (efa->v4)
if(msel_hit(limit, hitv, efa->v4->tmp.l, hituv, tf->uv[3], sticky))
- SIMA_UVSEL_UNSET(efa, tf, 3);
+ simaUVSel_UnSet(efa, tf, 3);
}
}
flush = -1;
@@ -750,17 +754,17 @@ void mouse_select_sima(void)
else {
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
+ if (simaFaceDraw_Check(efa, tf)) {
if (!sticky) continue;
if(msel_hit(limit, hitv, efa->v1->tmp.l, hituv, tf->uv[0], sticky))
- SIMA_UVSEL_SET(efa, tf, 0);
+ simaUVSel_Set(efa, tf, 0);
if(msel_hit(limit, hitv, efa->v2->tmp.l, hituv, tf->uv[1], sticky))
- SIMA_UVSEL_SET(efa, tf, 1);
+ simaUVSel_Set(efa, tf, 1);
if(msel_hit(limit, hitv, efa->v3->tmp.l, hituv, tf->uv[2], sticky))
- SIMA_UVSEL_SET(efa, tf, 2);
+ simaUVSel_Set(efa, tf, 2);
if (efa->v4)
if(msel_hit(limit, hitv, efa->v4->tmp.l, hituv, tf->uv[3], sticky))
- SIMA_UVSEL_SET(efa, tf, 3);
+ simaUVSel_Set(efa, tf, 3);
}
}
EM_set_actFace(nearestefa);
@@ -773,10 +777,10 @@ void mouse_select_sima(void)
if(actface) {
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- SIMA_FACESEL_UNSET(efa, tf);
+ simaFaceSel_UnSet(efa, tf);
}
if(nearesttf) {
- SIMA_FACESEL_SET(nearestefa, nearesttf);
+ simaFaceSel_Set(nearestefa, nearesttf);
EM_set_actFace(nearestefa);
}
@@ -785,25 +789,25 @@ void mouse_select_sima(void)
/* deselect uvs, and select sticky uvs */
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
- if(!actface) SIMA_FACESEL_UNSET(efa, tf);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if(!actface) simaFaceSel_UnSet(efa, tf);
if(!sticky) continue;
if(msel_hit(limit, hitv, efa->v1->tmp.l, hituv, tf->uv[0], sticky))
- SIMA_UVSEL_SET(efa, tf, 0);
+ simaUVSel_Set(efa, tf, 0);
if(msel_hit(limit, hitv, efa->v2->tmp.l, hituv, tf->uv[1], sticky))
- SIMA_UVSEL_SET(efa, tf, 1);
+ simaUVSel_Set(efa, tf, 1);
if(msel_hit(limit, hitv, efa->v3->tmp.l, hituv, tf->uv[2], sticky))
- SIMA_UVSEL_SET(efa, tf, 2);
+ simaUVSel_Set(efa, tf, 2);
if(efa->v4)
if(msel_hit(limit, hitv, efa->v4->tmp.l, hituv, tf->uv[3], sticky))
- SIMA_UVSEL_SET(efa, tf, 3);
+ simaUVSel_Set(efa, tf, 3);
flush= 1;
}
}
if(!actface) {
- SIMA_UVSEL_SET(nearestefa, nearesttf, nearestuv);
+ simaUVSel_Set(nearestefa, nearesttf, nearestuv);
flush= 1;
}
}
@@ -853,7 +857,7 @@ void borderselect_sima(short whichuvs)
/* assume not touched */
efa->tmp.l = 0;
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ 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;
@@ -866,47 +870,47 @@ void borderselect_sima(short whichuvs)
} else {
for (efa= em->faces.first; efa; efa= efa->next) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ 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) SIMA_UVSEL_SET(efa, tface, 0);
- else SIMA_UVSEL_UNSET(efa, tface, 0);
+ 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) SIMA_UVSEL_SET(efa, tface, 1);
- else SIMA_UVSEL_UNSET(efa, tface, 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) SIMA_UVSEL_SET(efa, tface, 2);
- else SIMA_UVSEL_UNSET(efa, tface, 2);
+ 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) SIMA_UVSEL_SET(efa, tface, 3);
- else SIMA_UVSEL_UNSET(efa, tface, 3);
+ 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) SIMA_UVSEL_SET(efa, tface, 0);
- else SIMA_UVSEL_UNSET(efa, tface, 0);
+ 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) SIMA_UVSEL_SET(efa, tface, 1);
- else SIMA_UVSEL_UNSET(efa, tface, 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) SIMA_UVSEL_SET(efa, tface, 2);
- else SIMA_UVSEL_UNSET(efa, tface, 2);
+ 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) SIMA_UVSEL_SET(efa, tface, 3);
- else SIMA_UVSEL_UNSET(efa, tface, 3);
+ if(select) simaUVSel_Set(efa, tface, 3);
+ else simaUVSel_UnSet(efa, tface, 3);
}
}
}
@@ -937,12 +941,12 @@ int snap_uv_sel_to_curs(void)
for (efa= em->faces.first; efa; efa= efa->next) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0)) VECCOPY2D(tface->uv[0], G.v2d->cursor);
- if (SIMA_UVSEL_CHECK(efa, tface, 1)) VECCOPY2D(tface->uv[1], G.v2d->cursor);
- if (SIMA_UVSEL_CHECK(efa, tface, 2)) VECCOPY2D(tface->uv[2], G.v2d->cursor);
+ 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 (SIMA_UVSEL_CHECK(efa, tface, 3)) VECCOPY2D(tface->uv[3], G.v2d->cursor);
+ if (simaUVSel_Check(efa, tface, 3)) VECCOPY2D(tface->uv[3], G.v2d->cursor);
change = 1;
}
}
@@ -968,12 +972,12 @@ int snap_uv_sel_to_adj_unsel(void)
* 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 (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0) && efa->v1->tmp.l==-1) efa->v1->tmp.l= count++;
- if (SIMA_UVSEL_CHECK(efa, tface, 1) && efa->v2->tmp.l==-1) efa->v2->tmp.l= count++;
- if (SIMA_UVSEL_CHECK(efa, tface, 2) && efa->v3->tmp.l==-1) efa->v3->tmp.l= count++;
+ 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 (SIMA_UVSEL_CHECK(efa, tface, 3) && efa->v4->tmp.l==-1) efa->v4->tmp.l= count++;
+ if (simaUVSel_Check(efa, tface, 3) && efa->v4->tmp.l==-1) efa->v4->tmp.l= count++;
change = 1;
/* optional speedup */
@@ -989,23 +993,23 @@ int snap_uv_sel_to_adj_unsel(void)
/* 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 (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// 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 && (!SIMA_UVSEL_CHECK(efa, tface, 0))) {
+ 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 && (!SIMA_UVSEL_CHECK(efa, tface, 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 && (!SIMA_UVSEL_CHECK(efa, tface, 2))) {
+ 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]++;
@@ -1013,7 +1017,7 @@ int snap_uv_sel_to_adj_unsel(void)
}
if (efa->v4) {
- if (efa->v4->tmp.l >= 0 && (!SIMA_UVSEL_CHECK(efa, tface, 3))) {
+ 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]++;
@@ -1033,10 +1037,10 @@ int snap_uv_sel_to_adj_unsel(void)
/* 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 (SIMA_FACEDRAW_CHECK(efa, tface)) {
+// if (simaFaceDraw_Check(efa, tface)) {
if ((tface=(MTFace *)efa->tmp.p)) {
- if ( SIMA_UVSEL_CHECK(efa, tface, 0) &&
+ if ( simaUVSel_Check(efa, tface, 0) &&
efa->v1->tmp.l >= 0 &&
(users = usercount[efa->v1->tmp.l])
) {
@@ -1044,7 +1048,7 @@ int snap_uv_sel_to_adj_unsel(void)
tface->uv[0][1] = coords[(efa->v1->tmp.l*2)+1] / users;
}
- if ( SIMA_UVSEL_CHECK(efa, tface, 1) &&
+ if ( simaUVSel_Check(efa, tface, 1) &&
efa->v2->tmp.l >= 0 &&
(users = usercount[efa->v2->tmp.l])
) {
@@ -1052,7 +1056,7 @@ int snap_uv_sel_to_adj_unsel(void)
tface->uv[1][1] = coords[(efa->v2->tmp.l*2)+1] / users;
}
- if ( SIMA_UVSEL_CHECK(efa, tface, 2) &&
+ if ( simaUVSel_Check(efa, tface, 2) &&
efa->v3->tmp.l >= 0 &&
(users = usercount[efa->v3->tmp.l])
) {
@@ -1061,7 +1065,7 @@ int snap_uv_sel_to_adj_unsel(void)
}
if (efa->v4) {
- if ( SIMA_UVSEL_CHECK(efa, tface, 3) &&
+ if ( simaUVSel_Check(efa, tface, 3) &&
efa->v4->tmp.l >= 0 &&
(users = usercount[efa->v4->tmp.l])
) {
@@ -1098,12 +1102,12 @@ int snap_uv_sel_to_pixels(void) /* warning, sanity checks must alredy be done */
for (efa= em->faces.first; efa; efa= efa->next) {
tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (SIMA_UVSEL_CHECK(efa, tface, 0)) snap_coord_to_pixel(tface->uv[0], w, h);
- if (SIMA_UVSEL_CHECK(efa, tface, 1)) snap_coord_to_pixel(tface->uv[1], w, h);
- if (SIMA_UVSEL_CHECK(efa, tface, 2)) snap_coord_to_pixel(tface->uv[2], w, h);
+ 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 (SIMA_UVSEL_CHECK(efa, tface, 3)) snap_coord_to_pixel(tface->uv[3], w, h);
+ if (simaUVSel_Check(efa, tface, 3)) snap_coord_to_pixel(tface->uv[3], w, h);
change = 1;
}
}
@@ -1184,8 +1188,8 @@ void sel_uvco_inside_radius(short sel, EditFace *efa, MTFace *tface, int index,
r2 = x * x + y * y;
if (r2 < 1.0) {
- if (sel == LEFTMOUSE) SIMA_UVSEL_SET(efa, tface, select_index);
- else SIMA_UVSEL_UNSET(efa, tface, select_index);
+ if (sel == LEFTMOUSE) simaUVSel_Set(efa, tface, select_index);
+ else simaUVSel_UnSet(efa, tface, select_index);
}
}
@@ -1435,7 +1439,7 @@ void select_linked_tface_uv(int mode) /* TODO */
if (mode == 2) {
for (a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
+ if (simaFaceDraw_Check(efa, tf)) {
if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) {
stack[stacksize]= a;
stacksize++;
@@ -1556,7 +1560,7 @@ void unlink_selection(void)
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ 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);
@@ -1624,9 +1628,9 @@ void uvface_setsel__internal(short select)
for(i=0; i<nverts; i++) {
if ((*(&efa->v1 + i))->tmp.l) {
if (select) {
- SIMA_UVSEL_SET(efa, tf, i);
+ simaUVSel_Set(efa, tf, i);
} else {
- SIMA_UVSEL_UNSET(efa, tf, i);
+ simaUVSel_UnSet(efa, tf, i);
}
}
}
@@ -1634,7 +1638,7 @@ void uvface_setsel__internal(short select)
} 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, *vlist_iter;
+ UvMapVert *vlist, *start_vlist=NULL, *vlist_iter;
struct UvVertMap *vmap;
float limit[2];
int efa_index;
@@ -1659,9 +1663,9 @@ void uvface_setsel__internal(short select)
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
if (select) {
- SIMA_UVSEL_SET(efa, tf, i);
+ simaUVSel_Set(efa, tf, i);
} else {
- SIMA_UVSEL_UNSET(efa, tf, i);
+ simaUVSel_UnSet(efa, tf, i);
}
vlist= vlist_iter= get_uv_map_vert_EM(vmap, (*(&efa->v1 + i))->tmp.l);
@@ -1687,9 +1691,9 @@ void uvface_setsel__internal(short select)
tf_vlist = CustomData_em_get(&em->fdata, efa_vlist->data, CD_MTFACE);
if (select) {
- SIMA_UVSEL_SET(efa_vlist, tf_vlist, vlist_iter->tfindex);
+ simaUVSel_Set(efa_vlist, tf_vlist, vlist_iter->tfindex);
} else {
- SIMA_UVSEL_UNSET(efa_vlist, tf_vlist, vlist_iter->tfindex);
+ simaUVSel_UnSet(efa_vlist, tf_vlist, vlist_iter->tfindex);
}
}
vlist_iter = vlist_iter->next;
@@ -1705,9 +1709,9 @@ void uvface_setsel__internal(short select)
if (efa->tmp.l) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (select) {
- SIMA_FACESEL_SET(efa, tf);
+ simaFaceSel_Set(efa, tf);
} else {
- SIMA_FACESEL_UNSET(efa, tf);
+ simaFaceSel_UnSet(efa, tf);
}
}
}
@@ -1724,20 +1728,20 @@ void pin_tface_uv(int mode)
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
+ if (simaFaceDraw_Check(efa, tface)) {
if(mode ==1) {
- if(SIMA_UVSEL_CHECK(efa, tface, 0)) tface->unwrap |= TF_PIN1;
- if(SIMA_UVSEL_CHECK(efa, tface, 1)) tface->unwrap |= TF_PIN2;
- if(SIMA_UVSEL_CHECK(efa, tface, 2)) tface->unwrap |= TF_PIN3;
+ 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(SIMA_UVSEL_CHECK(efa, tface, 3)) tface->unwrap |= TF_PIN4;
+ if(simaUVSel_Check(efa, tface, 3)) tface->unwrap |= TF_PIN4;
}
else if (mode ==0) {
- if(SIMA_UVSEL_CHECK(efa, tface, 0)) tface->unwrap &= ~TF_PIN1;
- if(SIMA_UVSEL_CHECK(efa, tface, 1)) tface->unwrap &= ~TF_PIN2;
- if(SIMA_UVSEL_CHECK(efa, tface, 2)) tface->unwrap &= ~TF_PIN3;
+ 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(SIMA_UVSEL_CHECK(efa, tface, 3)) tface->unwrap &= ~TF_PIN4;
+ if(simaUVSel_Check(efa, tface, 3)) tface->unwrap &= ~TF_PIN4;
}
}
}
@@ -1756,12 +1760,12 @@ void select_pinned_tface_uv(void)
for (efa= em->faces.first; efa; efa= efa->next) {
tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tface)) {
- if (tface->unwrap & TF_PIN1) SIMA_UVSEL_SET(efa, tface, 0);
- if (tface->unwrap & TF_PIN2) SIMA_UVSEL_SET(efa, tface, 1);
- if (tface->unwrap & TF_PIN3) SIMA_UVSEL_SET(efa, tface, 2);
+ 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) SIMA_UVSEL_SET(efa, tface, 3);
+ if (tface->unwrap & TF_PIN4) simaUVSel_Set(efa, tface, 3);
}
}
@@ -1789,11 +1793,11 @@ int minmax_tface_uv(float *min, float *max)
sel= 0;
for (efa= em->faces.first; efa; efa= efa->next) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
- if (SIMA_UVSEL_CHECK(efa, tf, 0)) DO_MINMAX2(tf->uv[0], min, max);
- if (SIMA_UVSEL_CHECK(efa, tf, 1)) DO_MINMAX2(tf->uv[1], min, max);
- if (SIMA_UVSEL_CHECK(efa, tf, 2)) DO_MINMAX2(tf->uv[2], min, max);
- if (efa->v4 && (SIMA_UVSEL_CHECK(efa, tf, 3))) DO_MINMAX2(tf->uv[3], min, max);
+ 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;
}
}
@@ -1816,11 +1820,11 @@ int cent_tface_uv(float *cent, int mode)
for (efa= G.editMesh->faces.first; efa; efa= efa->next) {
tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
- if (SIMA_UVSEL_CHECK(efa, tf, 0)) { DO_MINMAX2(tf->uv[0], min, max); change= 1;}
- if (SIMA_UVSEL_CHECK(efa, tf, 1)) { DO_MINMAX2(tf->uv[1], min, max); change= 1;}
- if (SIMA_UVSEL_CHECK(efa, tf, 2)) { DO_MINMAX2(tf->uv[2], min, max); change= 1;}
- if (efa->v4 && (SIMA_UVSEL_CHECK(efa, tf, 3))) { DO_MINMAX2(tf->uv[3], min, max); change= 1;}
+ 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;}
}
}
}
@@ -1889,6 +1893,7 @@ void sima_sample_color(void)
if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
float *fp= NULL, *zpf= NULL;
+ float vec[3];
int *zp= NULL;
char *cp= NULL;
@@ -1907,14 +1912,14 @@ void sima_sample_color(void)
if(ibuf->rect_float)
fp= (ibuf->rect_float + (ibuf->channels)*(y*ibuf->x + x));
+ if(fp==NULL) {
+ fp= vec;
+ vec[0]= (float)cp[0]/255.0f;
+ vec[1]= (float)cp[1]/255.0f;
+ vec[2]= (float)cp[2]/255.0f;
+ }
+
if(G.sima->cumap) {
- float vec[3];
- if(fp==NULL) {
- fp= vec;
- vec[0]= (float)cp[0]/255.0f;
- vec[1]= (float)cp[1]/255.0f;
- vec[2]= (float)cp[2]/255.0f;
- }
if(ibuf->channels==4) {
if(G.qual & LR_CTRLKEY) {
@@ -1928,18 +1933,36 @@ void sima_sample_color(void)
}
}
+ {
+ ScrArea *sa, *cur= curarea;
+
+ node_curvemap_sample(fp); /* sends global to node editor */
+ for(sa= G.curscreen->areabase.first; sa; sa= sa->next) {
+ if(sa->spacetype==SPACE_NODE) {
+ areawinset(sa->win);
+ scrarea_do_windraw(sa);
+ }
+ }
+ node_curvemap_sample(NULL); /* clears global in node editor */
+ curarea= cur;
+ }
+
+ areawinset(curarea->win);
scrarea_do_windraw(curarea);
myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
glLoadIdentity();
- sima_show_info(ibuf->channels, x, y, cp, fp, zp, zpf);
+
+ sima_show_info(ibuf->channels, x, y, cp, (ibuf->rect_float)?fp:NULL, zp, zpf);
+
screen_swapbuffers();
+
}
-
}
BIF_wait_for_statechange();
}
scrarea_queue_winredraw(curarea);
+
}
/* Image functions */
@@ -2216,8 +2239,9 @@ void reload_image_sima(void)
void new_image_sima(void)
{
- static int width= 256, height= 256;
+ static int width= 1024, height= 1024;
static short uvtestgrid= 0;
+ static int floatbuf=0;
static float color[] = {0, 0, 0, 1};
char name[22];
Image *ima;
@@ -2225,15 +2249,16 @@ void new_image_sima(void)
strcpy(name, "Untitled");
add_numbut(0, TEX, "Name:", 0, 21, name, NULL);
- add_numbut(1, NUM|INT, "Width:", 1, 5000, &width, NULL);
- add_numbut(2, NUM|INT, "Height:", 1, 5000, &height, NULL);
+ add_numbut(1, NUM|INT, "Width:", 1, 16384, &width, NULL);
+ add_numbut(2, NUM|INT, "Height:", 1, 16384, &height, NULL);
add_numbut(3, COL, "", 0, 0, &color, NULL);
add_numbut(4, NUM|FLO, "Alpha:", 0.0, 1.0, &color[3], NULL);
add_numbut(5, TOG|SHO, "UV Test Grid", 0, 0, &uvtestgrid, NULL);
- if (!do_clever_numbuts("New Image", 6, REDRAW))
+ add_numbut(6, TOG|INT, "32 bit Float", 0, 0, &floatbuf, NULL);
+ if (!do_clever_numbuts("New Image", 7, REDRAW))
return;
- ima = BKE_add_image_size(width, height, name, uvtestgrid, color);
+ ima = BKE_add_image_size(width, height, name, floatbuf, uvtestgrid, color);
image_changed(G.sima, ima);
BKE_image_signal(G.sima->image, &G.sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
BIF_undo_push("Add image");
@@ -2341,3 +2366,96 @@ void aspect_sima(SpaceImage *sima, float *x, float *y)
/* 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 2e333b9f43e..dfb5ce6e371 100644
--- a/source/blender/src/editsound.c
+++ b/source/blender/src/editsound.c
@@ -123,7 +123,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val) {
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
@@ -173,7 +173,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
getmouseco_areawin(mval);
areamouseco_to_ipoco(G.v2d, mval, &dx, &dy);
- marker = find_nearest_marker(0);
+ marker = find_nearest_marker(SCE_MARKERS, 0);
if (marker) {
if ((G.qual & LR_SHIFTKEY)==0)
deselect_markers(0, 0);
diff --git a/source/blender/src/edittime.c b/source/blender/src/edittime.c
index 280c69e2719..1520cb6c696 100644
--- a/source/blender/src/edittime.c
+++ b/source/blender/src/edittime.c
@@ -208,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;
@@ -225,11 +225,11 @@ void transform_markers(int mode, int smode) // mode and smode unused here, for c
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", (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
sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
}
@@ -242,11 +242,11 @@ void transform_markers(int mode, int smode) // mode and smode unused here, for c
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 ", (offs/(float)G.scene->r.frs_sec));
+ sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
else
sprintf(str, "Marker offset %.2f ", (double)(offs));
}
@@ -473,7 +473,7 @@ void get_minmax_markers(short sel, float *first, float *last)
*last= max;
}
-TimeMarker *find_nearest_marker(int clip_y)
+TimeMarker *find_nearest_marker(ListBase *markers, int clip_y)
{
TimeMarker *marker;
float xmin, xmax;
@@ -483,7 +483,7 @@ TimeMarker *find_nearest_marker(int clip_y)
getmouseco_areawin (mval);
/* first clip selection in Y */
- if((clip_y) && (mval[1] > 30))
+ if ((clip_y) && (mval[1] > 30))
return NULL;
mval[0]-=7;
@@ -494,7 +494,7 @@ TimeMarker *find_nearest_marker(int clip_y)
xmin= rectf.xmin;
xmax= rectf.xmax;
- for(marker= G.scene->markers.first; marker; marker= marker->next) {
+ for (marker= markers->first; marker; marker= marker->next) {
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
return marker;
}
@@ -836,7 +836,7 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val) {
- if( uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&sa->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
@@ -877,9 +877,9 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case RIGHTMOUSE: /* select/deselect marker */
getmouseco_areawin(mval);
areamouseco_to_ipoco(G.v2d, mval, &dx, &dy);
-
+
cfra= find_nearest_marker_time(dx);
-
+
if (G.qual && LR_SHIFTKEY)
select_timeline_marker_frame(cfra, 1);
else
diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c
index 93649168e82..93e39cba6eb 100644
--- a/source/blender/src/editview.c
+++ b/source/blender/src/editview.c
@@ -64,6 +64,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_editVert.h"
+#include "BLI_rand.h" /* random object selection */
#include "BKE_armature.h"
#include "BKE_depsgraph.h"
@@ -73,6 +74,7 @@
#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"
@@ -80,6 +82,7 @@
#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"
@@ -248,7 +251,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];
@@ -487,7 +490,7 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
/* assume not touched */
efa->tmp.l = 0;
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if ((select) != (SIMA_FACESEL_CHECK(efa, tf))) {
+ 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])) {
@@ -502,16 +505,16 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
} else { /* Vert Sel*/
for (efa= em->faces.first; efa; efa= efa->next) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (SIMA_FACEDRAW_CHECK(efa, tf)) {
+ if (simaFaceDraw_Check(efa, tf)) {
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
- if ((select) != (SIMA_UVSEL_CHECK(efa, tf, 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) {
- SIMA_UVSEL_SET(efa, tf, i);
+ simaUVSel_Set(efa, tf, i);
} else {
- SIMA_UVSEL_UNSET(efa, tf, i);
+ simaUVSel_UnSet(efa, tf, i);
}
}
}
@@ -531,14 +534,19 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp
if (lasso_inside(data->mcords, data->moves, x, y)) {
if (bp) {
- bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
} 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->f2|SELECT):(bezt->f2&~SELECT);
} else {
- bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|SELECT):(bezt->f1&~SELECT);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
+ }
}
}
}
@@ -559,7 +567,7 @@ static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x,
struct { short (*mcords)[2]; short moves; short select; } *data = userData;
if (lasso_inside(data->mcords, data->moves, x, y)) {
- bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
static void do_lasso_select_lattice(short mcords[][2], short moves, short select)
@@ -636,6 +644,8 @@ static void do_lasso_select(short mcords[][2], short moves, short select)
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);
}
@@ -1037,6 +1047,31 @@ void selectswap(void)
BIF_undo_push("Select Inverse");
}
+/* inverts object selection */
+void selectrandom(void)
+{
+ Base *base;
+ static short randfac = 50;
+ if(button(&randfac,0, 100,"Percentage:")==0) return;
+
+ for(base= FIRSTBASE; base; base= base->next) {
+ if(base->lay & G.vd->lay &&
+ (base->object->restrictflag & OB_RESTRICT_VIEW)==0
+ ) {
+ if (!TESTBASE(base) && ( (BLI_frand() * 100) < randfac)) {
+ select_base_v3d(base, BA_SELECT);
+ base->object->flag= base->flag;
+ }
+ }
+ }
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWDATASELECT, 0);
+ allqueue(REDRAWNLA, 0);
+
+ countall();
+ BIF_undo_push("Select Random");
+}
/* selects all objects of a particular type, on currently visible layers */
void selectall_type(short obtype)
@@ -1156,18 +1191,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 */
- }
- }
+ if(base && base->object->type!=OB_MESH)
+ exit_paint_modes();
/* sets scene->basact */
BASACT= base;
@@ -1600,14 +1625,19 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp,
if (BLI_in_rcti(data->rect, x, y)) {
if (bp) {
- bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
} 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->f2|SELECT):(bezt->f2&~SELECT);
} else {
- bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|SELECT):(bezt->f1&~SELECT);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
+ }
}
}
}
@@ -1627,7 +1657,7 @@ static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, i
struct { rcti *rect; int select; } *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
- bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
static void do_lattice_box_select(rcti *rect, int select)
@@ -1735,6 +1765,10 @@ void borderselect(void)
face_borderselect();
return;
}
+ else if(G.obedit==NULL && (G.f & G_PARTICLEEDIT)) {
+ PE_borderselect();
+ return;
+ }
a = 0;
#ifdef __APPLE__
@@ -2043,14 +2077,14 @@ static void nurbscurve_selectionCB__doSelect(void *userData, Nurb *nu, BPoint *b
if (r<=data->radius) {
if (bp) {
- bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
} else {
if (beztindex==0) {
- bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
+ bezt->f1 = data->select?(bezt->f1|SELECT):(bezt->f1&~SELECT);
} else if (beztindex==1) {
- bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ bezt->f2 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
} else {
- bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
}
}
}
@@ -2075,7 +2109,7 @@ static void latticecurve_selectionCB__doSelect(void *userData, BPoint *bp, int x
float r = sqrt(mx*mx + my*my);
if (r<=data->radius) {
- bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
static void lattice_selectionCB(int selecting, Object *editobj, short *mval, float rad)
@@ -2136,9 +2170,12 @@ void set_render_border(void)
allqueue(REDRAWVIEWCAM, 1);
- /* 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)
+ /* drawing a border surrounding the entire camera view switches off border rendering
+ * or the border covers no pixels */
+ 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.border.xmin == G.scene->r.border.xmax ||
+ G.scene->r.border.ymin == G.scene->r.border.ymax ))
{
G.scene->r.mode &= ~R_BORDER;
} else {
@@ -2625,7 +2662,7 @@ void fly(void)
G.vd->persp= 2;
/* record the motion */
- if (G.flags & G_RECORDKEYS && (!playing_anim || cfra != G.scene->r.cfra)) {
+ if (IS_AUTOKEY_MODE(NORMAL) && (!playing_anim || cfra != G.scene->r.cfra)) {
cfra = G.scene->r.cfra;
if (xlock || zlock || moffset[0] || moffset[1]) {
@@ -2672,7 +2709,7 @@ void fly(void)
DAG_object_flush_update(G.scene, G.vd->camera, OB_RECALC_OB);
- if (G.flags & G_RECORDKEYS) {
+ if (IS_AUTOKEY_MODE(NORMAL)) {
allqueue(REDRAWIPO, 0);
allspace(REMAKEIPO, 0);
allqueue(REDRAWNLA, 0);
@@ -2719,7 +2756,7 @@ void view3d_edit_clipping(View3D *v3d)
if(val==0) return;
v3d->flag |= V3D_CLIPPING;
- v3d->clipbb= MEM_mallocN(sizeof(BoundBox), "clipbb");
+ v3d->clipbb= MEM_callocN(sizeof(BoundBox), "clipbb");
/* convert border to 3d coordinates */
diff --git a/source/blender/src/filelist.c b/source/blender/src/filelist.c
index 54fab06f811..42940e5be04 100644
--- a/source/blender/src/filelist.c
+++ b/source/blender/src/filelist.c
@@ -441,12 +441,6 @@ void BIF_filelist_setdir(struct FileList* filelist, const char *dir)
BLI_strncpy(filelist->dir, dir, FILE_MAXDIR);
}
-void BIF_filelist_appenddir(struct FileList* filelist, const char *relname)
-{
- strcat(filelist->dir, relname);
- BLI_cleanup_dir(G.sce, filelist->dir);
-}
-
void BIF_filelist_imgsize(struct FileList* filelist, short w, short h)
{
filelist->prv_w = w;
@@ -709,10 +703,13 @@ void BIF_filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
|| BLI_testextensie(file->relname, ".otc")) {
file->flags |= FTFONTFILE;
} else if (has_quicktime){
- if( BLI_testextensie(file->relname, ".jpg")
+ 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")
@@ -726,6 +723,10 @@ void BIF_filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
|| BLI_testextensie(file->relname, ".pntg") //macpaint
|| BLI_testextensie(file->relname, ".qtif")
|| BLI_testextensie(file->relname, ".sgi")
+ || BLI_testextensie(file->relname, ".hdr")
+#ifdef WITH_DDS
+ || BLI_testextensie(file->relname, ".dds")
+#endif
#ifdef WITH_OPENEXR
|| BLI_testextensie(file->relname, ".exr")
#endif
@@ -745,14 +746,21 @@ void BIF_filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
file->flags |= SOUNDFILE;
}
} else { // no quicktime
- if(BLI_testextensie(file->relname, ".jpg")
+ 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")
+ || BLI_testextensie(file->relname, ".hdr")
+#ifdef WITH_DDS
+ || BLI_testextensie(file->relname, ".dds")
+#endif
#ifdef WITH_OPENEXR
|| BLI_testextensie(file->relname, ".exr")
#endif
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index d304125ca9a..8a9b5b4d2b8 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -34,6 +34,12 @@
#include <string.h>
#include <math.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include "MEM_guardedalloc.h"
+
+#include "BMF_Api.h"
+
#ifdef WIN32
#include <io.h>
#include <direct.h>
@@ -43,12 +49,6 @@
#include <sys/times.h>
#endif
-#include <sys/stat.h>
-#include <sys/types.h>
-#include "MEM_guardedalloc.h"
-
-#include "BMF_Api.h"
-
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_linklist.h"
@@ -116,11 +116,14 @@
#include "FTF_Api.h"
#endif
-#if defined WIN32 || defined __BeOS
+#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
@@ -1189,7 +1192,7 @@ 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(G.relbase_valid && BLI_convertstringcode(name, G.sce, G.scene->r.cfra))
+ if(G.relbase_valid && U.flag & USER_RELPATHS && type != FILE_BLENDER)
sfile->flag |= FILE_STRINGCODE;
else
sfile->flag &= ~FILE_STRINGCODE;
@@ -1418,7 +1421,9 @@ static void filesel_execute(SpaceFile *sfile)
}
do_library_append(sfile);
- BIF_undo_push("Append from file");
+
+ BIF_undo_push( ((sfile->flag & FILE_LINK)==0) ? "Append from file" : "Link from file");
+
allqueue(REDRAWALL, 1);
}
else if(filesel_has_func(sfile)) {
@@ -1480,8 +1485,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);
@@ -1799,7 +1814,7 @@ void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val) {
if( event!=RETKEY && event!=PADENTER)
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
switch(event) {
@@ -2188,7 +2203,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/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/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 a305607faad..f94551bc335 100644
--- a/source/blender/src/header_action.c
+++ b/source/blender/src/header_action.c
@@ -92,7 +92,15 @@ enum {
ACTMENU_VIEW_SLIDERS,
ACTMENU_VIEW_NEXTMARKER,
ACTMENU_VIEW_PREVMARKER,
+ ACTMENU_VIEW_NEXTKEYFRAME,
+ ACTMENU_VIEW_PREVKEYFRAME,
ACTMENU_VIEW_TIME,
+ ACTMENU_VIEW_NOHIDE,
+ ACTMENU_VIEW_OPENLEVELS,
+ ACTMENU_VIEW_CLOSELEVELS,
+ ACTMENU_VIEW_EXPANDALL,
+ ACTMENU_VIEW_TRANSDELDUPS,
+ ACTMENU_VIEW_HORIZOPTIMISE
};
enum {
@@ -102,7 +110,9 @@ enum {
ACTMENU_SEL_ALL_CHAN,
ACTMENU_SEL_ALL_MARKERS,
ACTMENU_SEL_INVERSE_KEYS,
- ACTMENU_SEL_INVERSE_MARKERS
+ ACTMENU_SEL_INVERSE_MARKERS,
+ ACTMENU_SEL_LEFTKEYS,
+ ACTMENU_SEL_RIGHTKEYS
};
enum {
@@ -114,8 +124,8 @@ enum {
enum {
ACTMENU_KEY_DUPLICATE = 0,
ACTMENU_KEY_DELETE,
- ACTMENU_KEY_BAKE,
- ACTMENU_KEY_CLEAN
+ ACTMENU_KEY_CLEAN,
+ ACTMENU_KEY_SAMPLEKEYS
};
enum {
@@ -126,9 +136,16 @@ enum {
};
enum {
+ ACTMENU_KEY_CHANGROUP_ADD_TOACTIVE = 0,
+ ACTMENU_KEY_CHANGROUP_ADD_TONEW,
+ ACTMENU_KEY_CHANGROUP_REMOVE
+};
+
+enum {
ACTMENU_KEY_TRANSFORM_MOVE = 0,
ACTMENU_KEY_TRANSFORM_SCALE,
- ACTMENU_KEY_TRANSFORM_SLIDE
+ ACTMENU_KEY_TRANSFORM_SLIDE,
+ ACTMENU_KEY_TRANSFORM_EXTEND
};
enum {
@@ -156,6 +173,7 @@ enum {
ACTMENU_KEY_SNAP_CURFRAME,
ACTMENU_KEY_SNAP_NEARMARK,
ACTMENU_KEY_SNAP_NEARTIME,
+ ACTMENU_KEY_SNAP_CFRA2KEY,
};
enum {
@@ -170,7 +188,10 @@ enum {
ACTMENU_MARKERS_DUPLICATE,
ACTMENU_MARKERS_DELETE,
ACTMENU_MARKERS_NAME,
- ACTMENU_MARKERS_MOVE
+ ACTMENU_MARKERS_MOVE,
+ ACTMENU_MARKERS_LOCALADD,
+ ACTMENU_MARKERS_LOCALRENAME,
+ ACTMENU_MARKERS_LOCALDELETE
};
void do_action_buttons(unsigned short event)
@@ -278,7 +299,7 @@ static void do_action_viewmenu(void *arg, int event)
break;
case ACTMENU_VIEW_LOCK:
G.v2d->flag ^= V2D_VIEWLOCK;
- if(G.v2d->flag & V2D_VIEWLOCK)
+ if (G.v2d->flag & V2D_VIEWLOCK)
view2d_do_locks(curarea, 0);
break;
case ACTMENU_VIEW_SLIDERS: /* Show sliders (when applicable) */
@@ -287,15 +308,39 @@ static void do_action_viewmenu(void *arg, int event)
case ACTMENU_VIEW_MAXIMIZE: /* Maximize Window */
/* using event B_FULL */
break;
- case ACTMENU_VIEW_NEXTMARKER: /* jump to next marker */
+ case ACTMENU_VIEW_NEXTMARKER: /* Jump to next marker */
nextprev_marker(1);
break;
- case ACTMENU_VIEW_PREVMARKER: /* jump to previous marker */
+ 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;
+ case ACTMENU_VIEW_NOHIDE: /* Show hidden channels */
+ G.saction->flag ^= SACTION_NOHIDE;
+ break;
+ case ACTMENU_VIEW_NEXTKEYFRAME: /* Jump to next keyframe */
+ nextprev_action_keyframe(1);
+ break;
+ case ACTMENU_VIEW_PREVKEYFRAME: /* Jump to previous keyframe */
+ nextprev_action_keyframe(-1);
+ break;
+ case ACTMENU_VIEW_OPENLEVELS: /* Unfold channels one step */
+ openclose_level_action(1);
+ break;
+ case ACTMENU_VIEW_CLOSELEVELS: /* Fold channels one step */
+ openclose_level_action(-1);
+ break;
+ case ACTMENU_VIEW_EXPANDALL: /* Expands all channels */
+ expand_all_action();
+ break;
+ case ACTMENU_VIEW_TRANSDELDUPS: /* Don't delete duplicate/overlapping keyframes after transform */
+ G.saction->flag ^= SACTION_NOTRANSKEYCULL;
+ break;
+ case ACTMENU_VIEW_HORIZOPTIMISE: /* Include keyframes not in view (horizontally) when preparing to draw */
+ G.saction->flag ^= SACTION_HORIZOPTIMISEON;
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -337,6 +382,24 @@ static uiBlock *action_viewmenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1,
ACTMENU_VIEW_SLIDERS, "");
+ uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_NOHIDE)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
+ "Show Hidden Channels|", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1,
+ ACTMENU_VIEW_NOHIDE, "");
+
+ // this option may get removed in future
+ uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_HORIZOPTIMISEON)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
+ "Cull Out-of-View Keys (Time)|", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1,
+ ACTMENU_VIEW_HORIZOPTIMISE, "");
+
+ // this option may get removed in future...
+ uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_NOTRANSKEYCULL)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
+ "AfterTrans Delete Dupli-Frames|", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1,
+ ACTMENU_VIEW_TRANSDELDUPS, "");
+
+
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,
@@ -349,6 +412,26 @@ static uiBlock *action_viewmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ /* only if editing action... */
+ // TODO: improve this code!
+
+ if (G.saction->action) {
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Toggle Show Hierachy|~", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_EXPANDALL, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Expand One Level|Ctrl NumPad+", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_OPENLEVELS, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Collapse One Level|Ctrl NumPad-", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_CLOSELEVELS, "");
+ }
+
+ 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,
@@ -356,6 +439,13 @@ static uiBlock *action_viewmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"Jump To Prev Marker|PageDown", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_PREVMARKER, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Jump To Next Keyframe|Ctrl PageUp", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_NEXTKEYFRAME, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Jump To Prev Keyframe|Ctrl PageDown", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_PREVKEYFRAME, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -403,35 +493,19 @@ static uiBlock *action_viewmenu(void *arg_unused)
static void do_action_selectmenu_columnmenu(void *arg, int event)
{
- SpaceAction *saction;
- bAction *act;
- Key *key;
-
- saction = curarea->spacedata.first;
- if (!saction) return;
-
- act = saction->action;
- key = get_action_mesh_key();
-
-#if 0 // actionrewite
- if (event == ACTMENU_SEL_COLUMN_MARKERSBETWEEN) {
- markers_selectkeys_between();
- }
- else if (ELEM(event, ACTMENU_SEL_COLUMN_KEYS, ACTMENU_SEL_COLUMN_MARKERSCOLUMN)) {
- if (act)
- column_select_actionkeys(act, event);
- else if (key)
- column_select_shapekeys(key, event);
+ switch (event) {
+ case ACTMENU_SEL_COLUMN_MARKERSBETWEEN:
+ markers_selectkeys_between();
+ break;
+ case ACTMENU_SEL_COLUMN_KEYS:
+ column_select_action_keys(1);
+ break;
+ case ACTMENU_SEL_COLUMN_MARKERSCOLUMN:
+ column_select_action_keys(2);
+ break;
}
- else
- return;
-#endif // actionrewite
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
static uiBlock *action_selectmenu_columnmenu(void *arg_unused)
@@ -513,6 +587,14 @@ static void do_action_selectmenu(void *arg, int event)
deselect_markers(0, 2);
allqueue(REDRAWMARKER, 0);
break;
+
+ case ACTMENU_SEL_LEFTKEYS:
+ selectkeys_leftright(1, SELECT_REPLACE);
+ break;
+
+ case ACTMENU_SEL_RIGHTKEYS:
+ selectkeys_leftright(0, SELECT_REPLACE);
+ break;
}
}
@@ -565,6 +647,19 @@ static uiBlock *action_selectmenu(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,
+ "Back In Time|Alt RMB", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_SEL_LEFTKEYS, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Ahead In Time|Alt RMB", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_SEL_RIGHTKEYS, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6,
+ menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
uiDefIconTextBlockBut(block, action_selectmenu_columnmenu,
NULL, ICON_RIGHTARROW_THIN, "Column Select Keys", 0, yco-=20, 120, 20, "");
@@ -594,6 +689,9 @@ static void do_action_keymenu_transformmenu(void *arg, int event)
case ACTMENU_KEY_TRANSFORM_SLIDE:
transform_action_keys('t', 0);
break;
+ case ACTMENU_KEY_TRANSFORM_EXTEND:
+ transform_action_keys('e', 0);
+ break;
}
scrarea_queue_winredraw(curarea);
@@ -612,6 +710,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,
@@ -781,16 +882,16 @@ static void do_action_keymenu_chanposmenu(void *arg, int event)
switch(event)
{
case ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_DOWN:
- down_sel_action();
+ rearrange_action_channels(REARRANGE_ACTCHAN_DOWN);
break;
case ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_UP:
- up_sel_action();
+ rearrange_action_channels(REARRANGE_ACTCHAN_UP);
break;
case ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_TOP:
- top_sel_action();
+ rearrange_action_channels(REARRANGE_ACTCHAN_TOP);
break;
case ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_BOTTOM:
- bottom_sel_action();
+ rearrange_action_channels(REARRANGE_ACTCHAN_BOTTOM);
break;
}
@@ -807,11 +908,11 @@ static uiBlock *action_keymenu_chanposmenu(void *arg_unused)
uiBlockSetButmFunc(block, do_action_keymenu_chanposmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move Up|Ctrl Page Up", 0, yco-=20,
+ "Move Up|Shift Page Up", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_UP, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move Down|Ctrl Page Down", 0, yco-=20,
+ "Move Down|Shift Page Down", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_DOWN, "");
@@ -819,11 +920,11 @@ static uiBlock *action_keymenu_chanposmenu(void *arg_unused)
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move to Top|Shift Page Up", 0, yco-=20,
+ "Move to Top|Ctrl Shift Page Up", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_TOP, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move to Bottom|Shift Page Down", 0, yco-=20,
+ "Move to Bottom|Ctrl Shift Page Down", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_BOTTOM, "");
@@ -833,6 +934,54 @@ static uiBlock *action_keymenu_chanposmenu(void *arg_unused)
return block;
}
+static void do_action_keymenu_changroupmenu(void *arg, int event)
+{
+ switch(event)
+ {
+ case ACTMENU_KEY_CHANGROUP_ADD_TOACTIVE:
+ action_groups_group(0);
+ break;
+ case ACTMENU_KEY_CHANGROUP_ADD_TONEW:
+ action_groups_group(1);
+ break;
+ case ACTMENU_KEY_CHANGROUP_REMOVE:
+ action_groups_ungroup();
+ break;
+ }
+}
+
+static uiBlock *action_keymenu_changroupmenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco= 0, menuwidth=120;
+
+ block= uiNewBlock(&curarea->uiblocks, "action_keymenu_changroupmenu",
+ UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_action_keymenu_changroupmenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Add to Active Group|Shift G", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_CHANGROUP_ADD_TOACTIVE, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Add To New Group|Ctrl Shift G", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_CHANGROUP_ADD_TONEW, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6,
+ menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Remove From Group|Alt G", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_CHANGROUP_REMOVE, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+
+ return block;
+}
+
static void do_action_keymenu_snapmenu(void *arg, int event)
{
switch(event)
@@ -843,6 +992,10 @@ static void do_action_keymenu_snapmenu(void *arg, int event)
case ACTMENU_KEY_SNAP_NEARTIME:
snap_action_keys(event);
break;
+
+ case ACTMENU_KEY_SNAP_CFRA2KEY:
+ snap_cfra_action();
+ break;
}
scrarea_queue_winredraw(curarea);
@@ -859,27 +1012,35 @@ static uiBlock *action_keymenu_snapmenu(void *arg_unused)
if (G.saction->flag & SACTION_DRAWTIME) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Nearest Second|Shift S, 1", 0, yco-=20,
+ "Key -> 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,
+ "Key -> 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,
+ "Key -> 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,
+ "Key -> 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,
+ "Key -> Nearest Marker|Shift S, 3", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_SNAP_NEARMARK, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6,
+ menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Current Frame -> Key|Ctrl Shift S", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_SNAP_NEARMARK, "");
@@ -952,11 +1113,14 @@ static void do_action_keymenu(void *arg, int event)
duplicate_action_keys();
break;
case ACTMENU_KEY_DELETE:
- delete_action_keys ();
+ delete_action_keys();
break;
case ACTMENU_KEY_CLEAN:
clean_action();
break;
+ case ACTMENU_KEY_SAMPLEKEYS:
+ sample_action_keys();
+ break;
}
}
@@ -998,6 +1162,11 @@ static uiBlock *action_keymenu(void *arg_unused)
"Clean Action|O", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_CLEAN, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Sample Keys|Alt O", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_SAMPLEKEYS, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -1015,6 +1184,14 @@ static uiBlock *action_keymenu(void *arg_unused)
uiDefIconTextBlockBut(block, action_keymenu_intpolmenu,
NULL, ICON_RIGHTARROW_THIN,
"Interpolation Mode", 0, yco-=20, 120, 20, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6,
+ menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBlockBut(block, action_keymenu_changroupmenu,
+ NULL, ICON_RIGHTARROW_THIN,
+ "Channel Grouping", 0, yco-=20, 120, 20, "");
+
uiDefIconTextBlockBut(block, action_keymenu_chanposmenu,
NULL, ICON_RIGHTARROW_THIN,
"Channel Ordering", 0, yco-=20, 120, 20, "");
@@ -1052,6 +1229,16 @@ static void do_action_markermenu(void *arg, int event)
case ACTMENU_MARKERS_MOVE:
transform_markers('g', 0);
break;
+
+ case ACTMENU_MARKERS_LOCALADD:
+ action_add_localmarker(G.saction->action, CFRA);
+ break;
+ case ACTMENU_MARKERS_LOCALDELETE:
+ action_remove_localmarkers(G.saction->action);
+ break;
+ case ACTMENU_MARKERS_LOCALRENAME:
+ action_rename_localmarker(G.saction->action);
+ break;
}
allqueue(REDRAWMARKER, 0);
@@ -1079,7 +1266,15 @@ static uiBlock *action_markermenu(void *arg_unused)
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_NAME, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_MOVE, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Local Marker|Shift L", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALADD, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rename Local Marker|Ctrl Shift L", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALRENAME, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Local Marker|Alt L", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALDELETE, "");
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
@@ -1190,24 +1385,8 @@ void action_buttons(void)
uiClearButLock();
- /* draw AUTOSNAP */
xco += 8;
- if (G.saction->flag & SACTION_DRAWTIME) {
- uiDefButS(block, MENU, B_REDR,
- "Auto-Snap Keyframes %t|Off %x0|Second Step %x1|Nearest Second %x2",
- 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",
- xco,0,70,YIC, &(G.saction->autosnap), 0, 1, 0, 0,
- "Auto-snapping mode for keyframes when transforming");
- }
-
- xco += (70 + 8);
-
/* COPY PASTE */
uiBlockBeginAlign(block);
if (curarea->headertype==HEADERTOP) {
@@ -1221,6 +1400,22 @@ void action_buttons(void)
uiBlockEndAlign(block);
xco += (XIC + 8);
+ /* draw AUTOSNAP */
+ if (G.saction->flag & SACTION_DRAWTIME) {
+ uiDefButS(block, MENU, B_REDR,
+ "Auto-Snap Keyframes %t|No Snap %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|No Snap %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 += (70 + 8);
+
/* draw LOCK */
uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco, 0, XIC, YIC,
&(G.saction->lock), 0, 0, 0, 0,
diff --git a/source/blender/src/header_buttonswin.c b/source/blender/src/header_buttonswin.c
index 15ef5962e99..3519c1f582c 100644
--- a/source/blender/src/header_buttonswin.c
+++ b/source/blender/src/header_buttonswin.c
@@ -170,6 +170,7 @@ void do_buts_buttons(short event)
}
}
matcopybuf.nodetree= ntreeCopyTree(ma->nodetree, 0);
+ matcopybuf.preview= NULL;
matcopied= 1;
}
break;
@@ -436,6 +437,14 @@ static uiBlock *buts_view_scenemenu(void *arg_unused)
uiDefIconTextButC(block, BUTM, B_REDR, ICON_CHECKBOX_DEHLT, "Render|F10",
0, yco-=20, menuwidth, 19, &(G.buts->tab[CONTEXT_SCENE]), (float)TAB_SCENE_RENDER, 0.0, 0, 10, "");
}
+
+ if((G.buts->mainb == CONTEXT_SCENE) && (G.buts->tab[CONTEXT_SCENE]==TAB_SCENE_SEQUENCER)) {
+ uiDefIconTextButC(block, BUTM, B_REDR, ICON_CHECKBOX_HLT, "Sequencer",
+ 0, yco-=20, menuwidth, 19, &(G.buts->tab[CONTEXT_SCENE]), (float)TAB_SCENE_SEQUENCER, 0.0, 0, 10, "");
+ } else {
+ uiDefIconTextButC(block, BUTM, B_REDR, ICON_CHECKBOX_DEHLT, "Sequencer",
+ 0, yco-=20, menuwidth, 19, &(G.buts->tab[CONTEXT_SCENE]), (float)TAB_SCENE_SEQUENCER, 0.0, 0, 10, "");
+ }
if((G.buts->mainb == CONTEXT_SCENE) && (G.buts->tab[CONTEXT_SCENE]==TAB_SCENE_ANIM)) {
uiDefIconTextButC(block, BUTM, B_REDR, ICON_CHECKBOX_HLT, "Animation",
@@ -683,6 +692,7 @@ void buts_buttons(void)
case CONTEXT_SCENE:
uiBlockBeginAlign(block);
uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SCENE]), 1.0, (float)TAB_SCENE_RENDER, 0, 0, "Render buttons ");
+ uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_SEQUENCE, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SCENE]), 1.0, (float)TAB_SCENE_SEQUENCER, 0, 0, "Sequencer buttons ");
uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_ANIM, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SCENE]), 1.0, (float)TAB_SCENE_ANIM, 0, 0, "Anim/playback buttons");
uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_SOUND, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SCENE]), 1.0, (float)TAB_SCENE_SOUND, 0, 0, "Sound block buttons");
@@ -690,7 +700,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 999fa2733af..7591a6e7e21 100644
--- a/source/blender/src/header_filesel.c
+++ b/source/blender/src/header_filesel.c
@@ -136,10 +136,13 @@ void file_buttons(void)
uiDefIconButBitS(block, TOG, FILE_HIDE_DOT, B_RELOADDIR, ICON_GHOST,xco+=XIC,0,XIC,YIC, &sfile->flag, 0, 0, 0, 0, "Hides dot files");
uiBlockEndAlign(block);
- uiDefButBitS(block, TOG, FILE_STRINGCODE, 0, "Relative Paths", xco+=XIC+20,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Makes sure returned paths are relative to the current .blend file");
-
- xco+=90;
-
+ if(sfile->type==FILE_BLENDER) {
+ xco+=20;
+ } else {
+ uiDefButBitS(block, TOG, FILE_STRINGCODE, 0, "Relative Paths", xco+=XIC+20,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Makes sure returned paths are relative to the current .blend file");
+ xco+=90;
+ }
+
if(sfile->type==FILE_LOADLIB) {
uiBlockBeginAlign(block);
uiDefButBitS(block, TOGN, FILE_LINK, B_REDR, "Append", xco+=XIC,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Copies selected data into current project");
diff --git a/source/blender/src/header_image.c b/source/blender/src/header_image.c
index 5b8c33309a0..1ec54423ab6 100644
--- a/source/blender/src/header_image.c
+++ b/source/blender/src/header_image.c
@@ -52,6 +52,7 @@
#include "DNA_userdef_types.h"
#include "DNA_customdata_types.h" /* for UV layer menu */
+#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BDR_drawmesh.h"
@@ -870,12 +871,20 @@ static uiBlock *image_uvs_transformmenu(void *arg_unused)
static void do_image_uvs_mirrormenu(void *arg, int event)
{
+ float mat[3][3];
+
+ Mat3One(mat);
+
switch(event) {
case 0: /* X axis */
- mirror_tface_uv('x');
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setSingleAxisConstraint(mat[0], " on global X axis");
+ Transform();
break;
case 1: /* Y axis */
- mirror_tface_uv('y');
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setSingleAxisConstraint(mat[1], " on global Y axis");
+ Transform();
break;
}
diff --git a/source/blender/src/header_imasel.c b/source/blender/src/header_imasel.c
index 1402e8c244e..bd09416e1ba 100644
--- a/source/blender/src/header_imasel.c
+++ b/source/blender/src/header_imasel.c
@@ -155,6 +155,11 @@ void imasel_buttons(void)
xco+=20;
type = simasel->type;
+
+ if(!simasel->files) {
+ simasel->files = BIF_filelist_new();
+ }
+
if (type == FILE_LOADLIB) {
do_filter = !BIF_filelist_islibrary(simasel->files, dir, group);
} else {
@@ -176,9 +181,13 @@ void imasel_buttons(void)
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_BLENDER) {
+ xco+=20;
+ } else {
+ 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);
diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c
index f4a572873d5..8200a9c0c76 100644
--- a/source/blender/src/header_info.c
+++ b/source/blender/src/header_info.c
@@ -101,6 +101,7 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
+#include "BLI_bpath.h"
#include "BLO_writefile.h"
#include "BSE_editipo.h"
@@ -303,6 +304,7 @@ Scene *copy_scene(Scene *sce, int level)
scen->toolsettings= MEM_dupallocN(sce->toolsettings);
duplicatelist(&(scen->markers), &(sce->markers));
+ duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
duplicatelist(&(scen->r.layers), &(sce->r.layers));
scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
@@ -483,20 +485,19 @@ void do_info_buttons(unsigned short event)
else if(G.scene->id.next) sce= G.scene->id.next;
else return;
if(okee("Delete current scene")) {
+ /* Note, anything besides free_libblock needs to be added in
+ * Python Scene.c for Blender.Scene.Unlink() */
+
/* 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 */
+ exit_paint_modes();
/* check all sets */
- sce1= G.main->scene.first;
- while(sce1) {
+ for (sce1= G.main->scene.first; sce1; sce1= sce1->id.next) {
if(sce1->set == G.scene) sce1->set= 0;
- sce1= sce1->id.next;
}
-
+
/* check all sequences */
clear_scene_in_allseqs(G.scene);
@@ -504,10 +505,9 @@ void do_info_buttons(unsigned short event)
clear_scene_in_nodes(G.scene);
/* al screens */
- sc= G.main->screen.first;
- while(sc) {
+
+ for (sc= G.main->screen.first; sc; sc= sc->id.next ) {
if(sc->scene == G.scene) sc->scene= sce;
- sc= sc->id.next;
}
free_libblock(&G.main->scene, G.scene);
set_scene(sce);
@@ -854,19 +854,6 @@ static void do_info_filemenu(void *arg, int event)
case 25:
BIF_screendump(1);
break;
- case 10: /* pack data */
- check_packAll();
- break;
- case 11: /* unpack to current dir */
- unpackAll(PF_WRITE_LOCAL);
- G.fileflags &= ~G_AUTOPACK;
- break;
- case 12: /* unpack data */
- if (buttons_do_unpack() != RET_CANCEL) {
- /* Clear autopack bit only if user selected one of the unpack options */
- G.fileflags &= ~G_AUTOPACK;
- }
- break;
case 13:
exit_usiblender();
break;
@@ -904,6 +891,7 @@ static void do_info_filemenu(void *arg, int event)
U.flag ^= (USER_FILECOMPRESS);
break;
}
+
allqueue(REDRAWINFO, 0);
}
@@ -946,6 +934,109 @@ static uiBlock *info_openrecentmenu(void *arg_unused)
return block;
}
+static void do_info_externalfiles(void *arg, int event)
+{
+ switch (event) {
+
+ case 1: /* pack data */
+ check_packAll();
+ break;
+#if 0
+ case 2: /* unpack to current dir */
+ unpackAll(PF_WRITE_LOCAL);
+ G.fileflags &= ~G_AUTOPACK;
+ break;
+#endif
+ case 3: /* unpack data */
+ if (buttons_do_unpack() != RET_CANCEL) {
+ /* Clear autopack bit only if user selected one of the unpack options */
+ G.fileflags &= ~G_AUTOPACK;
+ }
+ break;
+ case 10: /* make all paths relative */
+ if (G.relbase_valid) {
+ int tot,changed,failed,linked;
+ char str[512];
+ char txtname[24]; /* text block name */
+ txtname[0] = '\0';
+ makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
+ if (failed) sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
+ else sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
+ pupmenu(str);
+ } else {
+ pupmenu("Can't set relative paths with an unsaved blend file");
+ }
+ break;
+ case 11: /* make all paths relative */
+ {
+ int tot,changed,failed,linked;
+ char str[512];
+ char txtname[24]; /* text block name */
+ txtname[0] = '\0';
+ makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
+ sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
+ if (failed) sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
+ else sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
+
+ pupmenu(str);
+ }
+ break;
+ case 12: /* check images exist */
+ {
+ char txtname[24]; /* text block name */
+ txtname[0] = '\0';
+
+ /* run the missing file check */
+ checkMissingFiles( txtname );
+
+ if (txtname[0] == '\0') {
+ okee("No external files missing");
+ } else {
+ char str[128];
+ sprintf(str, "Missing files listed in Text \"%s\"", txtname );
+ error(str);
+ }
+ }
+ break;
+ case 13: /* search for referenced files that are not available */
+ if(curarea->spacetype==SPACE_INFO) {
+ ScrArea *sa;
+ sa= closest_bigger_area();
+ areawinset(sa->win);
+ }
+ activate_fileselect(FILE_SPECIAL, "Find Missing Files", "", findMissingFiles);
+ break;
+ }
+
+ allqueue(REDRAWINFO, 0);
+}
+
+static uiBlock *info_externalfiles(void *arg_unused)
+{
+ uiBlock *block;
+ short yco = 20, menuwidth = 120;
+
+ block= uiNewBlock(&curarea->uiblocks, "info_externalfiles", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_info_externalfiles, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack into Blend", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
+#if 0
+ uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Removes all packed files from the project and saves them to the current directory");
+#endif
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack into Files...", 0, yco-=20, 160, 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, "Make all Paths Relative", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Absolute", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Report Missing Files", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Find Missing Files", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+ return block;
+}
+
static uiBlock *info_filemenu(void *arg_unused)
{
uiBlock *block;
@@ -976,9 +1067,9 @@ 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, "Save Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dump Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dump Screen|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
#if GAMEBLENDER == 1
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
#ifdef _WIN32
@@ -999,13 +1090,11 @@ static uiBlock *info_filemenu(void *arg_unused)
uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack Data", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
-// uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "Removes all packed files from the project and saves them to the current directory");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack Data...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
-
+
+ uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",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, "Quit Blender|Ctrl Q", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
uiBlockSetDirection(block, UI_DOWN);
@@ -1652,8 +1741,13 @@ static uiBlock *info_timelinemenu(void *arg_unused)
void do_info_render_bakemenu(void *arg, int event)
{
-
- objects_bake_render(event);
+ switch (event) {
+ case R_BAKE_TO_ACTIVE:
+ G.scene->r.bake_flag ^= event;
+ break;
+ default:
+ objects_bake_render(event);
+ }
allqueue(REDRAWINFO, 0);
}
@@ -1661,15 +1755,24 @@ void do_info_render_bakemenu(void *arg, int event)
static uiBlock *info_render_bakemenu(void *arg_unused)
{
uiBlock *block;
- short yco= 0;
+ short yco= 0, menuwidth=160;
block= uiNewBlock(&curarea->uiblocks, "render_bakemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_info_render_bakemenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Full Render|Ctrl Alt B, 1", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ambient Occlusion|Ctrl Alt B, 2", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Normals|Ctrl Alt B, 3", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Only|Ctrl Alt B, 4", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
+ if(G.scene->r.bake_flag & R_BAKE_TO_ACTIVE) {
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, R_BAKE_TO_ACTIVE, "");
+ } else {
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, R_BAKE_TO_ACTIVE, "");
+ }
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Full Render|Ctrl Alt B, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ambient Occlusion|Ctrl Alt B, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Normals|Ctrl Alt B, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Only|Ctrl Alt B, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Displacement|Ctrl Alt B, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 50);
diff --git a/source/blender/src/header_ipo.c b/source/blender/src/header_ipo.c
index d2b16da3b35..4f98e966f8c 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"
@@ -64,11 +65,13 @@
#include "BKE_action.h"
#include "BKE_constraint.h"
+#include "BKE_depsgraph.h"
#include "BKE_global.h"
#include "BKE_ipo.h"
#include "BKE_key.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_particle.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -82,6 +85,7 @@
#include "BSE_time.h"
#include "BIF_editaction.h"
+#include "BIF_editconstraint.h"
#include "BIF_interface.h"
#include "BIF_mainqueue.h"
#include "BIF_resources.h"
@@ -137,11 +141,27 @@ void spaceipo_assign_ipo(SpaceIpo *si, Ipo *ipo)
Object *ob= (Object *)si->from;
/* constraint exception */
if(si->blocktype==ID_CO) {
- bConstraintChannel *conchan= get_constraint_channel(&ob->constraintChannels, si->constname);
- if(conchan) {
- if(conchan->ipo)
- conchan->ipo->id.us--;
- conchan->ipo= ipo;
+ /* check the local constraint ipo */
+ if(si->bonename && si->bonename[0] && ob->pose) {
+ bPoseChannel *pchan= get_pose_channel(ob->pose, si->bonename);
+ bConstraint *con;
+
+ for(con= pchan->constraints.first; con; con= con->next)
+ if(strcmp(con->name, si->constname)==0)
+ break;
+ if(con) {
+ if(con->ipo)
+ con->ipo->id.us--;
+ con->ipo= ipo;
+ }
+ }
+ else {
+ bConstraintChannel *conchan= get_constraint_channel(&ob->constraintChannels, si->constname);
+ if(conchan) {
+ if(conchan->ipo)
+ conchan->ipo->id.us--;
+ conchan->ipo= ipo;
+ }
}
}
else if(si->blocktype==ID_FLUIDSIM) { // NT
@@ -152,6 +172,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--;
@@ -935,6 +964,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);
@@ -1159,6 +1192,11 @@ void do_ipo_buttons(short event)
else ei->flag &= ~IPO_VISIBLE;
}
break;
+ case B_IPOREDRAW:
+ DAG_object_flush_update(G.scene, ob, OB_RECALC);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWIPO, 0);
+ break;
}
}
@@ -1255,11 +1293,14 @@ void ipo_buttons(void)
}
else if(G.sipo->blocktype==ID_CO) {
- if(G.sipo->from && G.sipo->actname[0]==0)
+ if(ob->pose==NULL)
uiDefIconButBitS(block, TOG, OB_ACTION_OB, B_IPO_ACTION_OB, ICON_ACTION, xco,0,XIC,YIC, &(ob->ipoflag), 0, 0, 0, 0, "Sets Ipo to be included in an Action or not");
else {
- uiSetButLock(1, "Pose Constraint Ipo cannot be switched");
- uiDefIconButS(block, TOG, 1, ICON_ACTION, xco,0,XIC,YIC, &fake1, 0, 0, 0, 0, "Ipo is connected to Pose Action");
+ bConstraint *con= get_active_constraint(ob);
+ if(con)
+ uiDefIconButBitS(block, TOGN, CONSTRAINT_OWN_IPO, B_IPOREDRAW, ICON_ACTION, xco,0,XIC,YIC, &con->flag, 0, 0, 0, 0,
+ (con->flag & CONSTRAINT_OWN_IPO)?"Ipo is connected to Constraint itself":"Ipo is connected to Pose Action"
+ );
}
xco+= XIC;
}
@@ -1304,6 +1345,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 297e21ef2f6..05f809a46ae 100644
--- a/source/blender/src/header_nla.c
+++ b/source/blender/src/header_nla.c
@@ -269,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);
@@ -289,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;
@@ -325,7 +331,7 @@ static void do_nla_stripmenu(void *arg, int event)
case 7: /* Move Down */
shift_nlastrips_down();
break;
- case 8: /* size */
+ case 8: /* reset scale */
reset_action_strips(1);
break;
case 9: /* reset start/end of action */
@@ -334,6 +340,9 @@ static void do_nla_stripmenu(void *arg, int event)
case 10: /* add new action as new action strip */
add_empty_nlablock();
break;
+ case 11: /* apply scale */
+ reset_action_strips(3);
+ break;
}
}
@@ -347,10 +356,11 @@ static uiBlock *nla_stripmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strip Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, nla_strip_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
- uiDefIconTextBlockBut(block, nla_strip_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap To Frame", 0, yco-=20, 120, 20, "");
+ uiDefIconTextBlockBut(block, nla_strip_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Strip Size|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Strip Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Action Start/End|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Strip Scaling|Alt S", 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, "");
@@ -507,47 +517,19 @@ void nla_buttons(void)
if (G.snla->flag & SNLA_DRAWTIME) {
uiDefButS(block, MENU, B_REDR,
- "Auto-Snap Strips/Keyframes %t|Off %x0|Second Step %x1|Nearest Second %x2",
+ "Auto-Snap Strips/Keyframes %t|No Snap %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",
+ "Auto-Snap Strips/Keyframes %t|No Snap %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 */
-
-
-// xco = 8;
-
-// uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), xco,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types.");
-
-// xco+= XIC+22;
-
- /* FULL WINDOW */
-// if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Returns to multiple views window (CTRL+Up arrow)");
-// else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Makes current window full screen (CTRL+Down arrow)");
-
- /* HOME */
-// uiDefIconBut(block, BUT, B_NLAHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms window to home view showing all items (HOMEKEY)");
-// xco+= XIC;
-
- /* IMAGE */
-// uiDefIconButS(block, TOG, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &sseq->mainb, 0, 0, 0, 0, "Toggles image display");
-
- /* ZOOM en BORDER */
-// xco+= XIC;
-// uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)");
-// uiDefIconBut(block, BUT, B_NLABORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zoom view to area");
-
- /* draw LOCK */
-// xco+= XIC/2;
-
xco += 8;
uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco,0,XIC,YIC, &(snla->lock), 0, 0, 0, 0, "Toggles forced redraw of other windows to reflect changes in real time");
diff --git a/source/blender/src/header_node.c b/source/blender/src/header_node.c
index 83aff8bcbe1..c9313c0edeb 100644
--- a/source/blender/src/header_node.c
+++ b/source/blender/src/header_node.c
@@ -23,7 +23,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): David Millan Escriva, Juho Vepsäläinen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -275,7 +275,6 @@ static void node_make_addmenu(SpaceNode *snode, int nodeclass, uiBlock *block)
bNodeType *type;
for(a=0, type= ntree->alltypes.first; type; type=type->next) {
if( type->nclass == nodeclass ) {
- printf("node %s\n", type->name);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, type->name, 0,
yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, type->type, "");
a++;
@@ -513,6 +512,16 @@ static void do_node_nodemenu(void *arg, int event)
case 10: /* execute */
addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
break;
+ case 11: /* make link */
+ node_make_link(snode);
+ break;
+ case 12: /* rename */
+ node_rename(snode);
+ break;
+ case 13: /* read saved full sample layers */
+ node_read_fullsamplelayers(snode);
+ break;
+
}
if(fromlib==-1) error_libdata();
@@ -537,6 +546,10 @@ static uiBlock *node_nodemenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 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, "Make Link|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ungroup|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
@@ -545,12 +558,14 @@ static uiBlock *node_nodemenu(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, "Hide/Unhide|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rename|Ctrl R", 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, "");
if(snode->treetype==NTREE_COMPOSIT) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Execute Composite|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Render Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Full Sample Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
}
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Cyclic Dependencies|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
@@ -662,7 +677,7 @@ void node_buttons(ScrArea *sa)
xco+= 80;
uiDefButBitS(block, TOG, R_COMP_FREE, B_NOP, "Free Unused", xco+5,0,80,19, &G.scene->r.scemode, 0.0f, 0.0f, 0, 0, "Free Nodes that are not used while composite");
xco+= 80;
- uiDefButBitS(block, TOG, SNODE_BACKDRAW, B_NOP, "Backdrop", xco+5,0,80,19, &snode->flag, 0.0f, 0.0f, 0, 0, "Use active Viewer Node output as backdrop");
+ uiDefButBitS(block, TOG, SNODE_BACKDRAW, REDRAWNODE, "Backdrop", xco+5,0,80,19, &snode->flag, 0.0f, 0.0f, 0, 0, "Use active Viewer Node output as backdrop");
xco+= 80;
}
diff --git a/source/blender/src/header_seq.c b/source/blender/src/header_seq.c
index a0edbdc316f..a937960036c 100644
--- a/source/blender/src/header_seq.c
+++ b/source/blender/src/header_seq.c
@@ -393,8 +393,7 @@ static void do_seq_editmenu(void *arg, int event)
case 3: /* Separate Meta Strip */
un_meta();
break;
- case 4: /* Properties... */
- add_blockhandler(curarea, SEQ_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
+ case 4: /* former Properties... */
break;
case 5: /* Duplicate */
add_duplicate_seq();
@@ -432,6 +431,9 @@ static void do_seq_editmenu(void *arg, int event)
case 16:
seq_separate_images();
break;
+ case 17:
+ reload_sequence();
+ break;
}
}
@@ -447,8 +449,6 @@ static uiBlock *seq_editmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "seq_editmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_seq_editmenu, NULL);
- 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, "");
@@ -478,10 +478,12 @@ static uiBlock *seq_editmenu(void *arg_unused)
}
-/* if (last_seq != NULL && last_seq->type == SEQ_MOVIE) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Filter Y|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
+ if (last_seq != NULL && last_seq->type == SEQ_MOVIE) {
+/* uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Filter Y|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, ""); */
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remap Paths...|Shift R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
}
-*/
+
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Meta Strip...|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
@@ -497,6 +499,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);
@@ -653,22 +658,23 @@ void seq_buttons()
xmax= GetButStringLength("View");
uiDefPulldownBut(block,seq_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
xco+=xmax;
-
- xmax= GetButStringLength("Select");
- 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;
+ if (sseq->mainb == 0) {
+ xmax= GetButStringLength("Select");
+ 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;
+ xmax= GetButStringLength("Add");
+ uiDefPulldownBut(block, seq_addmenu, NULL, "Add", xco, -2, xmax-3, 24, "");
+ xco+= xmax;
- xmax= GetButStringLength("Strip");
- uiDefPulldownBut(block, seq_editmenu, NULL, "Strip", xco, -2, xmax-3, 24, "");
- xco+= xmax;
+ xmax= GetButStringLength("Strip");
+ uiDefPulldownBut(block, seq_editmenu, NULL, "Strip", xco, -2, xmax-3, 24, "");
+ xco+= xmax;
+ }
/* end of pull down menus */
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -680,17 +686,19 @@ void seq_buttons()
"|Sequence %x0"
"|Image Preview %x1"
"|Luma Waveform %x2"
- "|Chroma Vectorscope %x3",
+ "|Chroma Vectorscope %x3"
+ "|Histogram %x4",
xco,0,XIC+10,YIC, &sseq->mainb, 0.0, 3.0,
0, 0,
"Shows the sequence output image preview");
xco+= 8 + XIC+10;
- /* CHANNEL shown in 3D preview */
if(sseq->mainb) {
int minchan = 0;
+ /* CHANNEL shown in image preview */
+
if (G.scene->ed && ((Editing*)G.scene->ed)->metastack.first)
minchan = -BLI_countlist(&((Editing*)G.scene->ed)->metastack);
@@ -700,22 +708,51 @@ void seq_buttons()
"The channel number shown in the image preview. 0 is the result of all strips combined.");
xco+= 8 + XIC*3.5;
+
+ if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
+ uiDefButS(block, MENU, B_REDR,
+ "Show zebra: %t"
+ "|Z 110 %x110"
+ "|Z 100 %x100"
+ "|Z 95 %x95"
+ "|Z 90 %x90"
+ "|Z 70 %x70"
+ "|Z Off %x0",
+ xco,0,3.0 * XIC, YIC, &sseq->zebra,
+ 0,0,0,0,
+ "Show overexposed "
+ "areas with zebra stripes");
+
+ xco+= 8 + XIC*3.0;
+
+ uiDefButBitI(block, TOG, SEQ_DRAW_SAFE_MARGINS,
+ B_REDR, "T",
+ xco,0,XIC,YIC, &sseq->flag,
+ 0, 0, 0, 0,
+ "Draw title safe margins in preview");
+ xco+= 8 + XIC;
+ }
+
+ if (sseq->mainb == SEQ_DRAW_IMG_WAVEFORM) {
+ uiDefButBitI(block, TOG, SEQ_DRAW_COLOR_SEPERATED,
+ B_REDR, "CS",
+ xco,0,XIC,YIC, &sseq->flag,
+ 0, 0, 0, 0,
+ "Seperate color channels in preview");
+ xco+= 8 + XIC;
+ }
+ } else {
+ /* ZOOM and BORDER */
+ xco+= 8;
+ uiBlockBeginAlign(block);
+ uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zooms view in and out (Ctrl MiddleMouse)");
+ uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to fit area");
+ uiBlockEndAlign(block);
+
+ xco+= 16;
}
-
- /* ZOOM and BORDER */
- xco+= 8;
- uiBlockBeginAlign(block);
- uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zooms view in and out (Ctrl MiddleMouse)");
- 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;
- uiDefBut(block, BUT, B_SEQCLEAR, "Refresh", xco+=XIC,0,3*XIC,YIC, 0, 0, 0, 0, 0, "Clears all buffered images in memory");
+ uiDefBut(block, BUT, B_SEQCLEAR, "Refresh", xco,0,3*XIC,YIC, 0, 0, 0, 0, 0, "Clears all buffered images in memory");
uiDrawBlock(block);
}
diff --git a/source/blender/src/header_text.c b/source/blender/src/header_text.c
index 32268c35210..728edc76a9c 100644
--- a/source/blender/src/header_text.c
+++ b/source/blender/src/header_text.c
@@ -79,13 +79,12 @@
void do_text_buttons(unsigned short event)
{
- SpaceText *st= curarea->spacedata.first;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
ID *id, *idtest;
int nr= 1;
Text *text;
-
- if (!st) return;
- if (st->spacetype != SPACE_TEXT) return;
+
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
switch (event) {
case B_TEXTBROWSE:
@@ -132,7 +131,7 @@ void do_text_buttons(unsigned short event)
st->top= 0;
pop_space_text(st);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
allqueue(REDRAWTEXT, 0);
allqueue(REDRAWHEADERS, 0);
}
@@ -230,13 +229,13 @@ void do_text_buttons(unsigned short event)
break;
case B_TAB_NUMBERS:
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
allqueue(REDRAWTEXT, 0);
allqueue(REDRAWHEADERS, 0);
break;
case B_SYNTAX:
if (st->showsyntax) {
- get_format_string();
+ get_format_string(st);
}
allqueue(REDRAWTEXT, 0);
allqueue(REDRAWHEADERS, 0);
@@ -278,15 +277,19 @@ static uiBlock *text_template_scriptsmenu (void *args_unused)
/* action executed after clicking in File menu */
static void do_text_filemenu(void *arg, int event)
{
- SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
+ Text *text;
ScrArea *sa;
-
+
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
+ text= st->text;
+
switch(event) {
case 1:
st->text= add_empty_text( "Text" );
st->top=0;
-
+
allqueue(REDRAWTEXT, 0);
allqueue(REDRAWHEADERS, 0);
break;
@@ -300,7 +303,7 @@ static void do_text_filemenu(void *arg, int event)
if (!reopen_text(text)) {
error("Could not reopen file");
}
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
}
break;
case 5:
@@ -313,36 +316,36 @@ static void do_text_filemenu(void *arg, int event)
break;
case 7:
{
- Object *obt;
+ Object *ob;
bConstraint *con;
short update;
/* check all pyconstraints */
- for (obt=G.main->object.first; obt; obt=obt->id.next) {
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
update = 0;
- if(obt->type==OB_ARMATURE && obt->pose) {
+ if (ob->type==OB_ARMATURE && ob->pose) {
bPoseChannel *pchan;
- for(pchan= obt->pose->chanbase.first; pchan; pchan= pchan->next) {
- for (con = pchan->constraints.first; con; con=con->next) {
+ 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) data->flag = 0;
+ if (data->text==text) BPY_pyconstraint_update(ob, con);
update = 1;
}
}
}
}
- for (con = obt->constraints.first; con; con=con->next) {
+ for (con = ob->constraints.first; con; con= con->next) {
if (con->type==CONSTRAINT_TYPE_PYTHON) {
bPythonConstraint *data = con->data;
- if (data->text==text) data->flag = 0;
+ if (data->text==text) BPY_pyconstraint_update(ob, con);
update = 1;
}
}
if (update) {
- DAG_object_flush_update(G.scene, obt, OB_RECALC_DATA);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
}
}
@@ -361,10 +364,14 @@ static void do_text_filemenu(void *arg, int event)
/* action executed after clicking in Edit menu */
static void do_text_editmenu(void *arg, int event)
{
- SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
+ Text *text;
ScrArea *sa;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
+ text= st->text;
+
switch(event) {
case 1:
txt_do_undo(text);
@@ -381,7 +388,7 @@ static void do_text_editmenu(void *arg, int event)
break;
case 5:
txt_paste(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
break;
case 6:
txt_print_cutbuffer();
@@ -410,10 +417,14 @@ static void do_text_editmenu(void *arg, int event)
/* action executed after clicking in View menu */
static void do_text_editmenu_viewmenu(void *arg, int event)
{
- SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
+ Text *text;
ScrArea *sa;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
+ text = st->text;
+
switch(event) {
case 1:
txt_move_bof(text, 0);
@@ -438,10 +449,14 @@ static void do_text_editmenu_viewmenu(void *arg, int event)
/* action executed after clicking in Select menu */
static void do_text_editmenu_selectmenu(void *arg, int event)
{
- SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
+ Text *text;
ScrArea *sa;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
+ text = st->text;
+
switch(event) {
case 1:
txt_sel_all(text);
@@ -464,10 +479,14 @@ static void do_text_editmenu_selectmenu(void *arg, int event)
/* action executed after clicking in Format menu */
static void do_text_formatmenu(void *arg, int event)
{
- SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
+ Text *text;
ScrArea *sa;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
+ text = st->text;
+
switch(event) {
case 3:
if (txt_has_sel(text)) {
@@ -490,7 +509,7 @@ static void do_text_formatmenu(void *arg, int event)
if ( txt_has_sel(text)) {
txt_order_cursors(text);
comment(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
break;
}
break;
@@ -498,7 +517,7 @@ static void do_text_formatmenu(void *arg, int event)
if ( txt_has_sel(text)) {
txt_order_cursors(text);
uncomment(text);
- if (st->showsyntax) get_format_string();
+ if (st->showsyntax) get_format_string(st);
break;
}
break;
@@ -552,7 +571,9 @@ static uiBlock *text_editmenu_selectmenu(void *arg_unused)
void do_text_formatmenu_convert(void *arg, int event)
{
- SpaceText *st= curarea->spacedata.first;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
+
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
switch(event) {
case 1: convert_tabs(st, 0); break;
@@ -611,8 +632,11 @@ static uiBlock *text_formatmenu(void *arg_unused)
/* action executed after clicking in Object to 3d Sub Menu */
void do_text_editmenu_to3dmenu(void *arg, int event)
{
- SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
+ Text *text;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
+ text = st->text;
switch(event) {
case 1: txt_export_to_object(text); break;
@@ -680,7 +704,7 @@ static uiBlock *text_editmenu(void *arg_unused)
/* File menu */
static uiBlock *text_filemenu(void *arg_unused)
{
- SpaceText *st= curarea->spacedata.first;
+ SpaceText *st= curarea->spacedata.first; /* bad but cant pass as an arg here */
Text *text= st->text;
uiBlock *block;
short yco= 0, menuwidth=120;
@@ -728,11 +752,13 @@ void text_buttons(void)
{
uiBlock *block;
SpaceText *st= curarea->spacedata.first;
- Text *text= st->text;
+ Text *text;
short xco, xmax;
char naam[256];
- if (!st || st->spacetype != SPACE_TEXT) return;
+ if (st==NULL || st->spacetype != SPACE_TEXT) return;
+
+ text = st->text;
sprintf(naam, "header %d", curarea->headwin);
block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin);
diff --git a/source/blender/src/header_time.c b/source/blender/src/header_time.c
index 70dbf60b0a0..7b98d2f5f4c 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, "");
@@ -469,27 +469,27 @@ void time_buttons(ScrArea *sa)
uiDefButI(block, NUM, REDRAWALL,"Start:",
xco,0, 4.5*XIC, YIC,
&G.scene->r.psfra,MINFRAMEF, MAXFRAMEF, 0, 0,
- "The start frame of the animation preview");
+ "The start frame of the animation preview (inclusive)");
xco += 4.5*XIC;
uiDefButI(block, NUM, REDRAWALL,"End:",
xco,0,4.5*XIC,YIC,
&G.scene->r.pefra,PSFRA,MAXFRAMEF, 0, 0,
- "The end frame of the animation preview");
+ "The end frame of the animation preview (inclusive)");
}
else {
uiDefButI(block, NUM, REDRAWALL,"Start:",
xco,0, 4.5*XIC, YIC,
&G.scene->r.sfra,MINFRAMEF, MAXFRAMEF, 0, 0,
- "The start frame of the animation");
+ "The start frame of the animation (inclusive)");
xco += 4.5*XIC;
uiDefButI(block, NUM, REDRAWALL,"End:",
xco,0,4.5*XIC,YIC,
&G.scene->r.efra,SFRA,MAXFRAMEF, 0, 0,
- "The end frame of the animation");
+ "The end frame of the animation (inclusive)");
}
uiBlockEndAlign(block);
@@ -498,7 +498,7 @@ void time_buttons(ScrArea *sa)
uiDefButI(block, NUM, B_NEWFRAME, "",
xco,0,3.5*XIC,YIC,
&(G.scene->r.cfra), MINFRAMEF, MAXFRAMEF, 0, 0,
- "Displays Current Frame of animation. Click to change.");
+ "Displays Current Frame of animation");
xco += 3.5*XIC+16;
@@ -524,10 +524,18 @@ void time_buttons(ScrArea *sa)
xco, 0, XIC, YIC, 0, 0, 0, 0, 0, "Skip to End frame (Shift UpArrow)");
xco+= XIC+8;
- uiDefIconButBitI(block, TOG, G_RECORDKEYS, REDRAWINFO, ICON_REC,
- xco, 0, XIC, YIC, &(G.flags), 0, 0, 0, 0, "Automatically insert keyframes in Object and Action Ipo curves");
+ uiDefIconButBitS(block, TOG, AUTOKEY_ON, REDRAWINFO, ICON_REC,
+ xco, 0, XIC, YIC, &(U.autokey_mode), 0, 0, 0, 0, "Automatic keyframe insertion for Objects and Bones");
+ xco+= XIC;
+ if (IS_AUTOKEY_ON) {
+ uiDefButS(block, MENU, REDRAWINFO,
+ "Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5",
+ xco, 0, 3*XIC, YIC, &(U.autokey_mode), 0, 1, 0, 0,
+ "Mode of automatic keyframe insertion for Objects and Bones");
+ xco+= (4*XIC);
+ }
- xco+= XIC+16;
+ xco+= 16;
uiDefIconButBitI(block, TOG, TIME_WITH_SEQ_AUDIO, B_DIFF, ICON_SPEAKER,
xco, 0, XIC, YIC, &(stime->redraws), 0, 0, 0, 0, "Play back and sync with audio from Sequence Editor");
diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c
index 534c87a093a..0a394d68d7a 100644
--- a/source/blender/src/header_view3d.c
+++ b/source/blender/src/header_view3d.c
@@ -72,6 +72,7 @@
#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
@@ -98,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"
@@ -109,7 +111,9 @@
#include "BIF_interface.h"
#include "BIF_mainqueue.h"
#include "BIF_meshtools.h"
+#include "BIF_poselib.h"
#include "BIF_poseobject.h"
+#include "BIF_radialcontrol.h"
#include "BIF_renderwin.h"
#include "BIF_resources.h"
#include "BIF_retopo.h"
@@ -150,6 +154,7 @@
#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;
@@ -597,6 +602,9 @@ static void do_view3d_viewmenu(void *arg, int event)
case 19: /* zoom within border */
view3d_border_zoom();
break;
+ case 20: /* Transform Space Panel */
+ add_blockhandler(curarea, VIEW3D_HANDLER_TRANSFORM, UI_PNL_UNSTOW);
+ break;
}
allqueue(REDRAWVIEW3D, 1);
}
@@ -610,6 +618,7 @@ static uiBlock *view3d_viewmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "view3d_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_view3d_viewmenu, NULL);
+ uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Orientations...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Render Preview...|Shift P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, "");
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 16, "");
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Background Image...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
@@ -905,6 +914,9 @@ void do_view3d_select_objectmenu(void *arg, int event)
case 2: /* inverse */
selectswap();
break;
+ case 3: /* random */
+ selectrandom();
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -923,6 +935,8 @@ static uiBlock *view3d_select_objectmenu(void *arg_unused)
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, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+
uiDefIconTextBlockBut(block, view3d_select_object_layermenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Layer", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_select_object_typemenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Type", 0, yco-=20, 120, 19, "");
@@ -1759,6 +1773,9 @@ static void do_view3d_transformmenu(void *arg, int event)
case 19:
G.scene->snap_target = SCE_SNAP_TARGET_MEDIAN;
break;
+ case 20:
+ G.scene->snap_target = SCE_SNAP_TARGET_ACTIVE;
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -1810,7 +1827,7 @@ static uiBlock *view3d_transformmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
}
- if (G.obedit != NULL && G.obedit->type==OB_MESH)
+ if (BIF_snappingSupported())
{
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -1830,19 +1847,28 @@ static uiBlock *view3d_transformmenu(void *arg_unused)
switch(G.scene->snap_target)
{
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_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, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
break;
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_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, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
break;
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, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Median", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
+ break;
+ case SCE_SNAP_TARGET_ACTIVE:
+ 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_DEHLT, "Snap Median", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
break;
}
}
@@ -1855,10 +1881,24 @@ static uiBlock *view3d_transformmenu(void *arg_unused)
void do_view3d_object_mirrormenu(void *arg, int event)
{
switch(event) {
+ case 0:
+ initTransform(TFM_MIRROR, CTX_NO_PET);
+ Transform();
+ break;
case 1:
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setLocalAxisConstraint('X', " on X axis");
+ Transform();
+ break;
case 2:
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setLocalAxisConstraint('Y', " on Y axis");
+ Transform();
+ break;
case 3:
- Mirror(event + 3); /* + 3 because the first three modes are global*/
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setLocalAxisConstraint('Z', " on Z axis");
+ Transform();
break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -1872,9 +1912,11 @@ static uiBlock *view3d_object_mirrormenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "view3d_object_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M", 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, "X Local|Ctrl M, X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -1903,7 +1945,10 @@ static void do_view3d_edit_object_transformmenu(void *arg, int event)
make_duplilist_real();
break;
case 6: /* apply scale/rotation or deformation */
- apply_object();
+ apply_objects_locrot();
+ break;
+ case 7: /* apply visual matrix to objects loc/size/rot */
+ apply_objects_visual_tx();
break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -1917,7 +1962,8 @@ static uiBlock *view3d_edit_object_transformmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Scale/Rotation|Ctrl A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Scale/Rotationr to ObData|Ctrl A, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Visual Transform|Ctrl A, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
@@ -2040,6 +2086,9 @@ static void do_view3d_edit_object_singleusermenu(void *arg, int event)
case 4: /* Materials+Tex */
single_mat_users(1);
break;
+ case 5: /* Ipo */
+ single_ipo_users(1);
+ break;
}
clear_id_newpoins();
@@ -2060,7 +2109,8 @@ static uiBlock *view3d_edit_object_singleusermenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ipos|U, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -2350,15 +2400,17 @@ extern ListBase session_list;
static void do_view3d_edit_objectmenu(void *arg, int event)
{
+#ifdef WITH_VERSE
+ struct VerseSession *session=NULL;
+
/* needed to check for valid selected objects */
Base *base=NULL;
Object *ob=NULL;
-#ifdef WITH_VERSE
- struct VerseSession *session=NULL;
-#endif
-
+
base= BASACT;
if (base) ob= base->object;
+#endif
+
switch(event) {
@@ -2823,17 +2875,44 @@ static uiBlock *view3d_edit_mesh_normalsmenu(void *arg_unused)
void do_view3d_edit_mirrormenu(void *arg, int event)
{
+ float mat[3][3];
+
+ Mat3One(mat);
+
switch(event) {
+ case 0:
+ initTransform(TFM_MIRROR, CTX_NO_PET);
+ Transform();
+ break;
case 1:
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setSingleAxisConstraint(mat[0], " on global X axis");
+ Transform();
+ break;
case 2:
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setSingleAxisConstraint(mat[1], " on global Y axis");
+ Transform();
+ break;
case 3:
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setSingleAxisConstraint(mat[2], "on global Z axis");
+ Transform();
+ break;
case 4:
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setLocalAxisConstraint('X', " on local X axis");
+ Transform();
+ break;
case 5:
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setLocalAxisConstraint('Y', " on local Y axis");
+ Transform();
+ break;
case 6:
- case 7:
- case 8:
- case 9:
- Mirror(event);
+ initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+ BIF_setLocalAxisConstraint('Z', " on local Z axis");
+ Transform();
break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -2847,21 +2926,19 @@ static uiBlock *view3d_edit_mirrormenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M", 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, "X Local|Ctrl M, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, Z", 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, "X View|Ctrl M, 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y View|Ctrl M, 8", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z View|Ctrl M, 9", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -2989,6 +3066,9 @@ static void do_view3d_edit_meshmenu(void *arg, int event)
if(session) b_verse_push_object(session, G.obedit);
break;
#endif
+ case 15:
+ uv_autocalc_tface();
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -3027,6 +3107,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, "");
@@ -3248,6 +3332,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);
}
@@ -3275,6 +3362,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, "");
@@ -3368,6 +3459,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);
@@ -3393,6 +3487,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, "");
@@ -3578,6 +3676,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);
}
@@ -3604,6 +3705,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 {
@@ -3690,7 +3795,6 @@ static void do_view3d_edit_armaturemenu(void *arg, int event)
static short numcuts= 2;
switch(event) {
-
case 0: /* Undo Editing */
remake_editArmature();
break;
@@ -3734,6 +3838,14 @@ static void do_view3d_edit_armaturemenu(void *arg, int event)
case 17: /* move to layer */
pose_movetolayer();
break;
+ case 18: /* merge bones */
+ merge_armature();
+ break;
+ case 19: /* auto-extensions */
+ case 20:
+ case 21:
+ armature_autoside_names(event-19);
+ break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -3804,6 +3916,8 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude Forked|Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill Between Joints|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 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, "");
@@ -3811,12 +3925,15 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
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, "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, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Left-Right|W, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Front-Back|W, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Top-Bottom|W, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
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, "");
uiDefIconTextBlockBut(block, view3d_edit_armature_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
@@ -3981,6 +4098,46 @@ static uiBlock *view3d_pose_armature_constraintsmenu(void *arg_unused)
return block;
}
+static void do_view3d_pose_armature_groupmenu(void *arg, int event)
+{
+ switch (event) {
+ case 1:
+ pose_assign_to_posegroup(1);
+ break;
+ case 2:
+ pose_assign_to_posegroup(0);
+ break;
+ case 3:
+ pose_add_posegroup();
+ break;
+ case 4:
+ pose_remove_from_posegroups();
+ break;
+ case 5:
+ pose_remove_posegroup();
+ break;
+ }
+}
+
+static uiBlock *view3d_pose_armature_groupmenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco = 20, menuwidth = 120;
+
+ block= uiNewBlock(&curarea->uiblocks, "view3d_pose_armature_groupmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_view3d_pose_armature_groupmenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Selected to Active Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Selected to Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add New Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove from All Groups|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Active Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+ return block;
+}
+
static void do_view3d_pose_armature_motionpathsmenu(void *arg, int event)
{
@@ -4012,13 +4169,55 @@ static uiBlock *view3d_pose_armature_motionpathsmenu(void *arg_unused)
return block;
}
+static void do_view3d_pose_armature_poselibmenu(void *arg, int event)
+{
+ Object *ob= OBACT;
+
+ switch(event) {
+ case 1:
+ poselib_preview_poses(ob, 0);
+ break;
+ case 2:
+ poselib_add_current_pose(ob, 0);
+ break;
+ case 3:
+ poselib_rename_pose(ob);
+ break;
+ case 4:
+ poselib_remove_pose(ob, NULL);
+ break;
+ }
+
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+static uiBlock *view3d_pose_armature_poselibmenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco = 20, menuwidth = 120;
+
+ block= uiNewBlock(&curarea->uiblocks, "view3d_pose_armature_poselibmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_view3d_pose_armature_poselibmenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Browse Poses|Ctrl L", 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, "Add/Replace Pose|Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rename Pose|Ctrl Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Pose|Alt L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+ return block;
+}
+
static void do_view3d_pose_armaturemenu(void *arg, int event)
{
Object *ob;
ob=OBACT;
switch(event) {
-
case 0: /* transform properties */
mainqenter(NKEY, 1);
break;
@@ -4053,6 +4252,14 @@ static void do_view3d_pose_armaturemenu(void *arg, int event)
case 14: /* move bone to layer / change armature layer */
pose_movetolayer();
break;
+ case 15:
+ pose_relax();
+ break;
+ case 16: /* auto-extensions for bones */
+ case 17:
+ case 18:
+ pose_autoside_names(event-16);
+ break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -4077,18 +4284,29 @@ static uiBlock *view3d_pose_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, "Relax Pose|W", 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, "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_poselibmenu, NULL, ICON_RIGHTARROW_THIN, "Pose Library", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_pose_armature_motionpathsmenu, NULL, ICON_RIGHTARROW_THIN, "Motion Paths", 0, yco-=20, 120, 19, "");
+ uiDefIconTextBlockBut(block, view3d_pose_armature_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Groups", 0, yco-=20, 120, 19, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_pose_armature_ikmenu, NULL, ICON_RIGHTARROW_THIN, "Inverse Kinematics", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_pose_armature_constraintsmenu, NULL, ICON_RIGHTARROW_THIN, "Constraints", 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, "AutoName Left-Right|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Front-Back|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Top-Bottom|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
+
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, "");
@@ -4282,16 +4500,19 @@ void do_view3d_sculpt_inputmenu(void *arg, int event)
switch(event) {
case 0:
sd->flags ^= SCULPT_INPUT_SMOOTH;
+ BIF_undo_push("Smooth stroke");
break;
case 1:
val= sd->tablet_size;
if(button(&val,0,10,"Tablet Size:")==0) return;
sd->tablet_size= val;
+ BIF_undo_push("Tablet size");
break;
case 2:
val= sd->tablet_strength;
if(button(&val,0,10,"Tablet Strength:")==0) return;
sd->tablet_strength= val;
+ BIF_undo_push("Tablet strength");
break;
}
@@ -4303,6 +4524,7 @@ void do_view3d_sculptmenu(void *arg, int event)
{
SculptData *sd= &G.scene->sculptdata;
BrushData *br= sculptmode_brush();
+
switch(event) {
case 0:
case 1:
@@ -4312,39 +4534,52 @@ void do_view3d_sculptmenu(void *arg, int event)
case 5:
case 6:
sd->brush_type= event+1;
+ BIF_undo_push("Brush type");
break;
case 7:
- br->airbrush= !br->airbrush; break;
+ br->flag ^= SCULPT_BRUSH_AIRBRUSH;
+ BIF_undo_push("Airbrush");
+ break;
case 8:
- sd->symm ^= SYMM_X; break;
+ sd->symm ^= SYMM_X;
+ BIF_undo_push("X Symmetry");
+ break;
case 9:
- sd->symm ^= SYMM_Y; break;
+ sd->symm ^= SYMM_Y;
+ BIF_undo_push("Y Symmetry");
+ break;
case 10:
- sd->symm ^= SYMM_Z; break;
+ sd->symm ^= SYMM_Z;
+ BIF_undo_push("Z Symmetry");
+ break;
case 11:
- if(G.vd)
+ if(G.vd)
G.vd->pivot_last= !G.vd->pivot_last;
break;
case 12:
sd->flags ^= SCULPT_DRAW_FAST;
+ BIF_undo_push("Partial Redraw");
break;
case 13:
sd->flags ^= SCULPT_DRAW_BRUSH;
+ BIF_undo_push("Draw Brush");
break;
case 14:
add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
break;
case 15:
- sculptmode_propset_init(PropsetTexRot);
+ sculpt_radialcontrol_start(RADIALCONTROL_ROTATION);
break;
case 16:
- sculptmode_propset_init(PropsetStrength);
+ sculpt_radialcontrol_start(RADIALCONTROL_STRENGTH);
break;
case 17:
- sculptmode_propset_init(PropsetSize);
+ sculpt_radialcontrol_start(RADIALCONTROL_SIZE);
break;
case 18:
- br->dir= br->dir==1 ? 2 : 1; break;
+ br->dir= br->dir==1 ? 2 : 1;
+ BIF_undo_push("Add/Sub");
+ break;
}
allqueue(REDRAWBUTSEDIT, 0);
@@ -4401,7 +4636,7 @@ uiBlock *view3d_sculptmenu(void *arg_unused)
if(sd->brush_type!=GRAB_BRUSH) {
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, (br->airbrush ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Airbrush|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+ uiDefIconTextBut(block, BUTM, 1, (br->flag & SCULPT_BRUSH_AIRBRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Airbrush|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
if(sd->brush_type!=SMOOTH_BRUSH && sd->brush_type!=FLATTEN_BRUSH) {
uiDefIconTextBut(block, BUTM, 1, (br->dir==1 ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Add|V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
@@ -4513,6 +4748,188 @@ static uiBlock *view3d_faceselmenu(void *arg_unused)
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, "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, "");
+
+ 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, "");
+
+ 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;
+ case 7:
+ PE_remove_doubles();
+ 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, "Remove Doubles|W, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+ 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);
+ }
+ else {
+ uiBlockSetDirection(block, UI_TOP);
+ uiBlockFlipOrder(block);
+ }
+
+ uiTextBoundsBlock(block, 50);
+
+ return block;
+}
+
static char *view3d_modeselect_pup(void)
{
@@ -4549,7 +4966,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);
}
@@ -4673,21 +5094,14 @@ void do_view3d_buttons(short event)
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 */
+ 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 */
}
@@ -4695,9 +5109,7 @@ 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_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();
@@ -4706,9 +5118,7 @@ void do_view3d_buttons(short event)
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();
@@ -4717,9 +5127,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();
@@ -4728,9 +5136,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();
@@ -4745,6 +5151,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;
@@ -4788,6 +5203,22 @@ void do_view3d_buttons(short event)
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:
if( (G.qual & LR_SHIFTKEY)==0 || G.vd->twtype==0)
@@ -4804,7 +5235,9 @@ void do_view3d_buttons(short event)
G.vd->twtype= V3D_MANIP_SCALE;
allqueue(REDRAWVIEW3D, 1);
break;
-
+ case B_MAN_MODE:
+ allqueue(REDRAWVIEW3D, 1);
+ break;
default:
if(event>=B_LAY && event<B_LAY+31) {
@@ -4893,6 +5326,8 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
}
} 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))
@@ -4932,6 +5367,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");
@@ -4959,7 +5395,13 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
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, "");
@@ -5022,6 +5464,7 @@ void view3d_buttons(void)
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_PARTICLEEDIT) G.vd->modeselect = V3D_PARTICLEEDITMODE_SEL;
G.vd->flag &= ~V3D_MODE;
@@ -5081,6 +5524,7 @@ void view3d_buttons(void)
xco+= XIC+10;
} else {
/* Manipulators arnt used in weight paint mode */
+ char *str_menu;
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)");
xco+= XIC+10;
@@ -5105,7 +5549,11 @@ void view3d_buttons(void)
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)");
+
+ str_menu = BIF_menustringTransformOrientation();
+ uiDefButS(block, MENU, B_MAN_MODE, str_menu,xco,0,70,YIC, &G.vd->twmode, 0, 0, 0, 0, "Transform Orientation (ALT+Space)");
+ MEM_freeN(str_menu);
+
xco+= 70;
uiBlockEndAlign(block);
xco+= 8;
@@ -5137,7 +5585,7 @@ void view3d_buttons(void)
}
/* 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) ");
@@ -5151,13 +5599,13 @@ void view3d_buttons(void)
}
/* Snap */
- if(G.obedit && (G.obedit->type == OB_MESH)) { // Only Mesh for now
+ if (BIF_snappingSupported()) {
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");
+ uiDefButS(block, MENU, B_NOP, "Mode%t|Closest%x0|Center%x1|Median%x2|Active%x3",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)");
@@ -5184,6 +5632,21 @@ void view3d_buttons(void)
}
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;
+ }
+ xco+= 20;
+ }
uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE_DEHLT, xco,0,XIC,YIC, NULL, 0, 1.0, 0, 0, "Render this window (hold CTRL for anim)");
diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c
index 2ad1702f1f0..dd3d6d9b33b 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";
@@ -325,6 +325,7 @@ int std_libbuttons(uiBlock *block, short xco, short yco,
}
if( GS(id->name)==ID_IP) len= 110;
+ else if((yco) && (GS(id->name)==ID_AC)) len= 100; // comes from button panel (poselib)
else if(yco) len= 140; // comes from button panel
else len= 120;
@@ -457,11 +458,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);
@@ -931,20 +933,21 @@ void do_global_buttons(unsigned short event)
allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
break;
case B_ACTIONBROWSE:
if (!ob)
break;
act=ob->action;
id= (ID *)act;
-
+
if (G.saction->actnr== -2){
activate_databrowse((ID *)G.saction->action, ID_AC, 0, B_ACTIONBROWSE, &G.saction->actnr, do_global_buttons);
return;
}
-
+
if(G.saction->actnr < 0) break;
-
+
/* See if we have selected a valid action */
for (idtest= G.main->action.first; idtest; idtest= idtest->next) {
if(nr==G.saction->actnr) {
@@ -955,7 +958,16 @@ void do_global_buttons(unsigned short event)
}
if(G.saction->pin) {
- G.saction->action= (bAction *)idtest;
+ if (idtest == NULL) {
+ /* assign new/copy of pinned action only - messy as it doesn't assign to any obj's */
+ if (G.saction->action)
+ G.saction->action= (bAction *)copy_action(G.saction->action);
+ else
+ G.saction->action= (bAction *)add_empty_action("PinnedAction");
+ }
+ else {
+ G.saction->action= (bAction *)idtest;
+ }
allqueue(REDRAWACTION, 0);
}
else {
@@ -1020,6 +1032,7 @@ void do_global_buttons(unsigned short event)
allqueue(REDRAWNLA, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWHEADERS, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
}
}
@@ -1075,6 +1088,7 @@ void do_global_buttons(unsigned short event)
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--;
@@ -1692,7 +1706,8 @@ void do_global_buttons2(short event)
if(act->id.lib) {
if(okee("Make local")) {
make_local_action(act);
- allqueue(REDRAWACTION,0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
}
}
}
@@ -1700,12 +1715,13 @@ void do_global_buttons2(short event)
case B_ACTALONE:
if(ob && ob->id.lib==0) {
act= ob->action;
-
+
if(act->id.us>1) {
if(okee("Single user")) {
ob->action=copy_action(act);
act->id.us--;
allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
}
}
}
diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c
index 07debe8f864..a17e488ef13 100644
--- a/source/blender/src/interface.c
+++ b/source/blender/src/interface.c
@@ -135,6 +135,7 @@ uiBut *UIbuttip;
static char but_copypaste_str[256]="";
static double but_copypaste_val=0.0;
static float but_copypaste_rgb[3];
+static ColorBand but_copypaste_coba;
/* ************* PROTOTYPES ***************** */
@@ -525,7 +526,6 @@ static int ui_but_copy_paste(uiBut *but, char mode)
}
}
else if(but->type==TEX) {
-
if(poin==NULL);
else if(mode=='c') {
strncpy(but_copypaste_str, but->poin, but->max);
@@ -545,7 +545,6 @@ static int ui_but_copy_paste(uiBut *but, char mode)
}
}
else if(but->type==IDPOIN) {
-
if(mode=='c') {
ID *id= *but->idpoin_idpp;
if(id) strncpy(but_copypaste_str, id->name+2, 22);
@@ -556,8 +555,24 @@ static int ui_but_copy_paste(uiBut *but, char mode)
return 1;
}
}
-
-
+ else if(but->type==BUT_COLORBAND) {
+ if(mode=='c') {
+ if (!but->poin) {
+ return 0;
+ }
+ memcpy( &but_copypaste_coba, but->poin, sizeof(ColorBand) );
+ } else {
+ if (but_copypaste_coba.tot==0) {
+ return 0;
+ }
+ if (!but->poin) {
+ but->poin= MEM_callocN( sizeof(ColorBand), "colorband");
+ }
+ memcpy( but->poin, &but_copypaste_coba, sizeof(ColorBand) );
+ return 1;
+ }
+ }
+
return 0;
}
@@ -1289,7 +1304,7 @@ static int ui_do_but_MENU(uiBut *but)
for(bt= block->buttons.first; bt; bt= bt->next) bt->win= block->win;
bwin_getsinglematrix(block->win, block->winmat);
- event= uiDoBlocks(&listb, 0);
+ event= uiDoBlocks(&listb, 0, 1);
menudata_free(md);
@@ -2336,7 +2351,7 @@ static int ui_do_but_ICONROW(uiBut *but)
this is needs better implementation */
block->win= G.curscreen->mainwin;
- uiDoBlocks(&listb, 0);
+ uiDoBlocks(&listb, 0, 1);
but->flag &= ~UI_SELECT;
ui_check_but(but);
@@ -2409,7 +2424,7 @@ static int ui_do_but_ICONTEXTROW(uiBut *but)
uiBoundsBlock(block, 3);
- uiDoBlocks(&listb, 0);
+ uiDoBlocks(&listb, 0, 1);
menudata_free(md);
@@ -3287,7 +3302,7 @@ static int ui_do_but_COL(uiBut *but)
for(bt= block->buttons.first; bt; bt= bt->next) bt->win= block->win;
bwin_getsinglematrix(block->win, block->winmat);
- event= uiDoBlocks(&listb, 0);
+ event= uiDoBlocks(&listb, 0, 1);
if(but->pointype==CHA) ui_set_but_vectorf(but, colstore);
@@ -4291,7 +4306,7 @@ int uiIsMenu(int *x, int *y, int *sizex, int *sizey)
* UI_CONT don't pass event to other ui's
* UI_RETURN something happened, return, swallow event
*/
-static int ui_do_block(uiBlock *block, uiEvent *uevent)
+static int ui_do_block(uiBlock *block, uiEvent *uevent, int movemouse_quit)
{
uiBut *but, *bt;
int butevent, event, retval=UI_NOTHING, count, act=0;
@@ -4778,7 +4793,7 @@ static int ui_do_block(uiBlock *block, uiEvent *uevent)
if((uevent->event==RETKEY || uevent->event==PADENTER) && uevent->val==1) return UI_RETURN_OK;
/* check outside */
- if(inside==0) {
+ if(inside==0 && movemouse_quit) {
uiBlock *tblock= NULL;
/* check for all parent rects, enables arrowkeys to be used */
@@ -4920,7 +4935,7 @@ static void ui_do_but_tip(uiBut *buttip)
}
/* returns UI_NOTHING, if nothing happened */
-int uiDoBlocks(ListBase *lb, int event)
+int uiDoBlocks(ListBase *lb, int event, int movemouse_quit)
{
/* return when: firstblock != BLOCK_LOOP
*
@@ -4975,7 +4990,7 @@ int uiDoBlocks(ListBase *lb, int event)
}
block->in_use= 1; // bit awkward, but now we can detect if frontbuf flush should be set
- retval |= ui_do_block(block, &uevent); /* we 'or' because 2nd loop can return to here, and we we want 'out' to return */
+ retval |= ui_do_block(block, &uevent, movemouse_quit); /* we 'or' because 2nd loop can return to here, and we we want 'out' to return */
block->in_use= 0;
if(retval & UI_EXIT_LOOP) break;
@@ -5019,7 +5034,7 @@ int uiDoBlocks(ListBase *lb, int event)
if(uevent.event) {
block->in_use= 1; // bit awkward, but now we can detect if frontbuf flush should be set
- retval= ui_do_block(block, &uevent);
+ retval= ui_do_block(block, &uevent, movemouse_quit);
block->in_use= 0;
if(block->needflush) { // flush (old menu) now, maybe new menu was opened
@@ -6515,7 +6530,7 @@ short pupmenu(char *instr)
uiBoundsBlock(block, 1);
- event= uiDoBlocks(&listb, 0);
+ event= uiDoBlocks(&listb, 0, 1);
/* calculate last selected */
if(event & UI_RETURN_OK) {
@@ -6673,7 +6688,7 @@ short pupmenu_col(char *instr, int maxrow)
uiBoundsBlock(block, 1);
- event= uiDoBlocks(&listb, 0);
+ event= uiDoBlocks(&listb, 0, 1);
menudata_free(md);
diff --git a/source/blender/src/interface_draw.c b/source/blender/src/interface_draw.c
index 4f1d5056111..0cbcff3875a 100644
--- a/source/blender/src/interface_draw.c
+++ b/source/blender/src/interface_draw.c
@@ -1970,7 +1970,7 @@ static void ui_draw_but_COLORBAND(uiBut *but)
ColorBand *coba= (ColorBand *)but->poin;
CBData *cbd;
float x1, y1, sizex, sizey;
- float dx, v3[2], v1[2], v2[2];
+ float dx, v3[2], v1[2], v2[2], v1a[2], v2a[2];
int a;
if(coba==NULL) return;
@@ -2038,39 +2038,55 @@ static void ui_draw_but_COLORBAND(uiBut *but)
/* help lines */
v1[0]= v2[0]=v3[0]= x1;
v1[1]= y1;
+ v1a[1]= y1+0.25*sizey;
v2[1]= y1+0.5*sizey;
+ v2a[1]= y1+0.75*sizey;
v3[1]= y1+sizey;
+
cbd= coba->data;
glBegin(GL_LINES);
for(a=0; a<coba->tot; a++, cbd++) {
- v1[0]=v2[0]=v3[0]= x1+ cbd->pos*sizex;
-
- glColor3ub(0, 0, 0);
- glVertex2fv(v1);
- glVertex2fv(v2);
+ v1[0]=v2[0]=v3[0]=v1a[0]=v2a[0]= x1+ cbd->pos*sizex;
if(a==coba->cur) {
- glVertex2f(v1[0]-1, v1[1]);
- glVertex2f(v2[0]-1, v2[1]);
- glVertex2f(v1[0]+1, v1[1]);
- glVertex2f(v2[0]+1, v2[1]);
- }
-
- glColor3ub(255, 255, 255);
- glVertex2fv(v2);
- glVertex2fv(v3);
-
- if(a==coba->cur) {
- if(cbd->pos>0.01) {
- glVertex2f(v2[0]-1, v2[1]);
- glVertex2f(v3[0]-1, v3[1]);
- }
- if(cbd->pos<0.99) {
- glVertex2f(v2[0]+1, v2[1]);
- glVertex2f(v3[0]+1, v3[1]);
- }
+ glColor3ub(0, 0, 0);
+ glVertex2fv(v1);
+ glVertex2fv(v3);
+ glEnd();
+
+ setlinestyle(2);
+ glBegin(GL_LINES);
+ glColor3ub(255, 255, 255);
+ glVertex2fv(v1);
+ glVertex2fv(v3);
+ glEnd();
+ setlinestyle(0);
+ glBegin(GL_LINES);
+
+ /* glColor3ub(0, 0, 0);
+ glVertex2fv(v1);
+ glVertex2fv(v1a);
+ glColor3ub(255, 255, 255);
+ glVertex2fv(v1a);
+ glVertex2fv(v2);
+ glColor3ub(0, 0, 0);
+ glVertex2fv(v2);
+ glVertex2fv(v2a);
+ glColor3ub(255, 255, 255);
+ glVertex2fv(v2a);
+ glVertex2fv(v3);
+ */
}
+ else {
+ glColor3ub(0, 0, 0);
+ glVertex2fv(v1);
+ glVertex2fv(v2);
+
+ glColor3ub(255, 255, 255);
+ glVertex2fv(v2);
+ glVertex2fv(v3);
+ }
}
glEnd();
}
@@ -2234,10 +2250,35 @@ static void ui_draw_but_CURVE(uiBut *but)
if(cumap->flag & CUMA_DRAW_CFRA) {
glColor3ub(0x60, 0xc0, 0x40);
glBegin(GL_LINES);
- glVertex2f(but->x1 + zoomx*(cumap->black[0]-offsx), but->y1);
- glVertex2f(but->x1 + zoomx*(cumap->black[0]-offsx), but->y2);
+ glVertex2f(but->x1 + zoomx*(cumap->sample[0]-offsx), but->y1);
+ glVertex2f(but->x1 + zoomx*(cumap->sample[0]-offsx), but->y2);
glEnd();
}
+ /* sample option */
+ if(cumap->flag & CUMA_DRAW_SAMPLE) {
+ if(cumap->cur==3) {
+ float lum= cumap->sample[0]*0.35f + cumap->sample[1]*0.45f + cumap->sample[2]*0.2f;
+ glColor3ub(240, 240, 240);
+
+ glBegin(GL_LINES);
+ glVertex2f(but->x1 + zoomx*(lum-offsx), but->y1);
+ glVertex2f(but->x1 + zoomx*(lum-offsx), but->y2);
+ glEnd();
+ }
+ else {
+ if(cumap->cur==0)
+ glColor3ub(240, 100, 100);
+ else if(cumap->cur==1)
+ glColor3ub(100, 240, 100);
+ else
+ glColor3ub(100, 100, 240);
+
+ glBegin(GL_LINES);
+ glVertex2f(but->x1 + zoomx*(cumap->sample[cumap->cur]-offsx), but->y1);
+ glVertex2f(but->x1 + zoomx*(cumap->sample[cumap->cur]-offsx), but->y2);
+ glEnd();
+ }
+ }
/* the curve */
BIF_ThemeColorBlend(TH_TEXT, TH_BUT_NEUTRAL, 0.35);
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 c289d75f88b..5eb4bf3dc61 100644
--- a/source/blender/src/language.c
+++ b/source/blender/src/language.c
@@ -173,8 +173,8 @@ float BIF_GetStringWidth(BMF_Font* font, char *str, int translate)
}
void BIF_GetBoundingBox(struct BMF_Font* font, char* str, int translate, rctf *bbox){
- float dummy;
#ifdef INTERNATIONAL
+ float dummy;
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);
diff --git a/source/blender/src/meshlaplacian.c b/source/blender/src/meshlaplacian.c
index a660b42996e..5e8fdac80da 100644
--- a/source/blender/src/meshlaplacian.c
+++ b/source/blender/src/meshlaplacian.c
@@ -31,6 +31,7 @@
* meshlaplacian.c: Algorithms using the mesh laplacian.
*/
+#include <math.h>
#include <string.h>
#include "MEM_guardedalloc.h"
@@ -39,17 +40,23 @@
#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"
@@ -336,7 +343,7 @@ void laplacian_begin_solve(LaplacianSystem *sys, int index)
if(index >= 0) {
for(a=0; a<sys->totvert; a++) {
if(sys->vpinned[a]) {
- nlSetVariable(a, sys->verts[a][index]);
+ nlSetVariable(0, a, sys->verts[a][index]);
nlLockVariable(a);
}
}
@@ -349,7 +356,7 @@ void laplacian_begin_solve(LaplacianSystem *sys, int index)
void laplacian_add_right_hand_side(LaplacianSystem *sys, int v, float value)
{
- nlRightHandSideAdd(v, value);
+ nlRightHandSideAdd(0, v, value);
}
int laplacian_system_solve(LaplacianSystem *sys)
@@ -365,7 +372,7 @@ int laplacian_system_solve(LaplacianSystem *sys)
float laplacian_system_get_solution(int v)
{
- return nlGetVariable(v);
+ return nlGetVariable(0, v);
}
/************************* Heat Bone Weighting ******************************/
@@ -373,7 +380,8 @@ float laplacian_system_get_solution(int v)
Ilya Baran and Jovan Popovic, SIGGRAPH 2007 */
#define C_WEIGHT 1.0f
-#define WEIGHT_LIMIT 0.05f
+#define WEIGHT_LIMIT_START 0.05f
+#define WEIGHT_LIMIT_END 0.025f
#define DISTANCE_EPSILON 1e-4f
/* Raytracing for vertex to bone visibility */
@@ -391,7 +399,7 @@ static void heat_ray_coords_func(RayFace *face, float **v1, float **v2, float **
*v4= (mface->v4)? verts[mface->v4]: NULL;
}
-static int heat_ray_check_func(Isect *is, RayFace *face)
+static int heat_ray_check_func(Isect *is, int ob, RayFace *face)
{
float *v1, *v2, *v3, *v4, nor[3];
@@ -400,7 +408,7 @@ static int heat_ray_check_func(Isect *is, RayFace *face)
if(v4) CalcNormFloat4(v1, v2, v3, v4, nor);
else CalcNormFloat(v1, v2, v3, nor);
-
+
return (INPR(nor, is->vec) < 0);
}
@@ -419,14 +427,14 @@ static void heat_ray_tree_create(LaplacianSystem *sys)
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);
+ heat_ray_coords_func, heat_ray_check_func, NULL, NULL);
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);
+ RE_ray_tree_add_face(tree, 0, mface);
sys->heat.vface[mface->v1]= mface;
sys->heat.vface[mface->v2]= mface;
@@ -453,6 +461,7 @@ static int heat_ray_bone_visible(LaplacianSystem *sys, int vertex, int bone)
return 1;
/* setup isec */
+ memset(&isec, 0, sizeof(isec));
isec.mode= RE_RAY_SHADOW;
isec.lay= -1;
isec.face_last= NULL;
@@ -593,12 +602,28 @@ static void heat_laplacian_create(LaplacianSystem *sys)
heat_set_H(sys, a);
}
+static float heat_limit_weight(float weight)
+{
+ float t;
+
+ if(weight < WEIGHT_LIMIT_END) {
+ return 0.0f;
+ }
+ else if(weight < WEIGHT_LIMIT_START) {
+ t= (weight - WEIGHT_LIMIT_END)/(WEIGHT_LIMIT_START - WEIGHT_LIMIT_END);
+ return t*WEIGHT_LIMIT_START;
+ }
+ else
+ return weight;
+}
+
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;
+ float solution, weight;
+ int *vertsflipped = NULL;
+ int a, totface, j, bbone, firstsegment, lastsegment, thrownerror = 0;
/* count triangles */
for(totface=0, a=0, mface=me->mface; a<me->totface; a++, mface++) {
@@ -620,11 +645,31 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numbones,
laplacian_system_construct_end(sys);
+ if(dgroupflip) {
+ vertsflipped = MEM_callocN(sizeof(int)*me->totvert, "vertsflipped");
+ for(a=0; a<me->totvert; a++)
+ vertsflipped[a] = mesh_get_x_mirror_vert(ob, a);
+ }
+
/* compute weights per bone */
for(j=0; j<numbones; j++) {
if(!selected[j])
continue;
+ firstsegment= (j == 0 || dgrouplist[j-1] != dgrouplist[j]);
+ lastsegment= (j == numbones-1 || dgrouplist[j] != dgrouplist[j+1]);
+ bbone= !(firstsegment && lastsegment);
+
+ /* clear weights */
+ if(bbone && firstsegment) {
+ for(a=0; a<me->totvert; a++) {
+ remove_vert_defgroup(ob, dgrouplist[j], a);
+ if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0)
+ remove_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ }
+ }
+
+ /* fill right hand side */
laplacian_begin_solve(sys, -1);
for(a=0; a<me->totvert; a++)
@@ -632,24 +677,41 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numbones,
laplacian_add_right_hand_side(sys, a,
sys->heat.H[a]*sys->heat.p[a]);
+ /* solve */
if(laplacian_system_solve(sys)) {
+ /* load solution into vertex groups */
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);
+
+ if(bbone) {
+ if(solution > 0.0f)
+ add_vert_to_defgroup(ob, dgrouplist[j], a, solution,
+ WEIGHT_ADD);
+ }
+ else {
+ weight= heat_limit_weight(solution);
+ if(weight > 0.0f)
+ add_vert_to_defgroup(ob, dgrouplist[j], a, weight,
+ 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);
+ if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0) {
+ if(bbone) {
+ if(solution > 0.0f)
+ add_vert_to_defgroup(ob, dgroupflip[j], vertsflipped[a],
+ solution, WEIGHT_ADD);
+ }
+ else {
+ weight= heat_limit_weight(solution);
+ if(weight > 0.0f)
+ add_vert_to_defgroup(ob, dgroupflip[j], vertsflipped[a],
+ weight, WEIGHT_REPLACE);
+ else
+ remove_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ }
}
}
}
@@ -659,9 +721,28 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numbones,
thrownerror= 1;
break;
}
+
+ /* remove too small vertex weights */
+ if(bbone && lastsegment) {
+ for(a=0; a<me->totvert; a++) {
+ weight= get_vert_defgroup(ob, dgrouplist[j], a);
+ weight= heat_limit_weight(weight);
+ if(weight <= 0.0f)
+ remove_vert_defgroup(ob, dgrouplist[j], a);
+
+ if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0) {
+ weight= get_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ weight= heat_limit_weight(weight);
+ if(weight <= 0.0f)
+ remove_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ }
+ }
+ }
}
/* free */
+ if(vertsflipped) MEM_freeN(vertsflipped);
+
RE_ray_tree_free(sys->heat.raytree);
MEM_freeN(sys->heat.vface);
@@ -797,11 +878,8 @@ void rigid_deform_iteration()
laplacian_begin_solve(sys, i);
for(a=0; a<sys->totvert; a++)
- if(!sys->vpinned[a]) {
- /*if (i==0)
- printf("rhs %f\n", sys->rigid.rhs[a][0]);*/
+ 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++)
@@ -815,8 +893,6 @@ void rigid_deform_iteration()
break;
}
}
-
- /*printf("\n--------------------------------------------\n\n");*/
}
static void rigid_laplacian_create(LaplacianSystem *sys)
@@ -904,3 +980,932 @@ void rigid_deform_end(int cancel)
}
#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.0005
+
+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..d75493def9d 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 */
@@ -107,6 +108,7 @@ void sort_faces(void);
#include "PIL_time.h"
#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
/* from rendercode.c */
#define VECMUL(dest, f) dest[0]*= f; dest[1]*= f; dest[2]*= f
@@ -684,7 +686,7 @@ static void mesh_octree_add_nodes(MocNode **basetable, float *co, float *offs, f
}
-static long mesh_octree_find_index(MocNode **bt, MVert *mvert, float *co)
+static long mesh_octree_find_index(MocNode **bt, float (*orco)[3], MVert *mvert, float *co)
{
float *vec;
int a;
@@ -695,7 +697,12 @@ static long mesh_octree_find_index(MocNode **bt, MVert *mvert, float *co)
for(a=0; a<MOC_NODE_RES; a++) {
if((*bt)->index[a]) {
/* does mesh verts and editmode, code looks potential dangerous, octree should really be filled OK! */
- if(mvert) {
+ if(orco) {
+ vec= orco[(*bt)->index[a]-1];
+ if(FloatCompare(vec, co, MOC_THRESH))
+ return (*bt)->index[a]-1;
+ }
+ else if(mvert) {
vec= (mvert+(*bt)->index[a]-1)->co;
if(FloatCompare(vec, co, MOC_THRESH))
return (*bt)->index[a]-1;
@@ -709,84 +716,118 @@ static long mesh_octree_find_index(MocNode **bt, MVert *mvert, float *co)
else return -1;
}
if( (*bt)->next)
- return mesh_octree_find_index(&(*bt)->next, mvert, co);
+ return mesh_octree_find_index(&(*bt)->next, orco, mvert, co);
return -1;
}
+static struct {
+ MocNode **table;
+ float offs[3], div[3];
+ float (*orco)[3];
+ float orcoloc[3];
+} MeshOctree = {NULL, {0, 0, 0}, {0, 0, 0}, NULL};
/* mode is 's' start, or 'e' end, or 'u' use */
/* if end, ob can be NULL */
long mesh_octree_table(Object *ob, float *co, char mode)
{
MocNode **bt;
- static MocNode **basetable= NULL;
- static float offs[3], div[3];
if(mode=='u') { /* use table */
- if(basetable==NULL)
+ if(MeshOctree.table==NULL)
mesh_octree_table(ob, NULL, 's');
- if(basetable) {
+ if(MeshOctree.table) {
Mesh *me= ob->data;
- bt= basetable + mesh_octree_get_base_offs(co, offs, div);
+ bt= MeshOctree.table + mesh_octree_get_base_offs(co, MeshOctree.offs, MeshOctree.div);
if(ob==G.obedit)
- return mesh_octree_find_index(bt, NULL, co);
+ return mesh_octree_find_index(bt, NULL, NULL, co);
else
- return mesh_octree_find_index(bt, me->mvert, co);
+ return mesh_octree_find_index(bt, MeshOctree.orco, me->mvert, co);
}
return -1;
}
else if(mode=='s') { /* start table */
Mesh *me= ob->data;
- BoundBox *bb = mesh_get_bb(me);
+ float min[3], max[3];
+
+ /* we compute own bounding box and don't reuse ob->bb because
+ * we are using the undeformed coordinates*/
+ INIT_MINMAX(min, max);
+
+ if(ob==G.obedit) {
+ EditVert *eve;
+
+ for(eve= G.editMesh->verts.first; eve; eve= eve->next)
+ DO_MINMAX(eve->co, min, max)
+ }
+ else {
+ MVert *mvert;
+ float *co;
+ int a, totvert;
+
+ MeshOctree.orco= mesh_getRefKeyCos(me, &totvert);
+ mesh_get_texspace(me, MeshOctree.orcoloc, NULL, NULL);
+
+ for(a=0, mvert= me->mvert; a<me->totvert; a++, mvert++) {
+ co= (MeshOctree.orco)? MeshOctree.orco[a]: mvert->co;
+ DO_MINMAX(co, min, max);
+ }
+ }
/* for quick unit coordinate calculus */
- VECCOPY(offs, bb->vec[0]);
- offs[0]-= MOC_THRESH; /* we offset it 1 threshold unit extra */
- offs[1]-= MOC_THRESH;
- offs[2]-= MOC_THRESH;
-
- VecSubf(div, bb->vec[6], bb->vec[0]);
- div[0]+= 2*MOC_THRESH; /* and divide with 2 threshold unit more extra (try 8x8 unit grid on paint) */
- div[1]+= 2*MOC_THRESH;
- div[2]+= 2*MOC_THRESH;
+ VECCOPY(MeshOctree.offs, min);
+ MeshOctree.offs[0]-= MOC_THRESH; /* we offset it 1 threshold unit extra */
+ MeshOctree.offs[1]-= MOC_THRESH;
+ MeshOctree.offs[2]-= MOC_THRESH;
- VecMulf(div, 1.0f/MOC_RES);
- if(div[0]==0.0f) div[0]= 1.0f;
- if(div[1]==0.0f) div[1]= 1.0f;
- if(div[2]==0.0f) div[2]= 1.0f;
+ VecSubf(MeshOctree.div, max, min);
+ MeshOctree.div[0]+= 2*MOC_THRESH; /* and divide with 2 threshold unit more extra (try 8x8 unit grid on paint) */
+ MeshOctree.div[1]+= 2*MOC_THRESH;
+ MeshOctree.div[2]+= 2*MOC_THRESH;
+
+ VecMulf(MeshOctree.div, 1.0f/MOC_RES);
+ if(MeshOctree.div[0]==0.0f) MeshOctree.div[0]= 1.0f;
+ if(MeshOctree.div[1]==0.0f) MeshOctree.div[1]= 1.0f;
+ if(MeshOctree.div[2]==0.0f) MeshOctree.div[2]= 1.0f;
- if(basetable) /* happens when entering this call without ending it */
+ if(MeshOctree.table) /* happens when entering this call without ending it */
mesh_octree_table(ob, co, 'e');
- basetable= MEM_callocN(MOC_RES*MOC_RES*MOC_RES*sizeof(void *), "sym table");
+ MeshOctree.table= MEM_callocN(MOC_RES*MOC_RES*MOC_RES*sizeof(void *), "sym table");
if(ob==G.obedit) {
EditVert *eve;
for(eve= G.editMesh->verts.first; eve; eve= eve->next) {
- mesh_octree_add_nodes(basetable, eve->co, offs, div, (long)(eve));
+ mesh_octree_add_nodes(MeshOctree.table, eve->co, MeshOctree.offs, MeshOctree.div, (long)(eve));
}
}
else {
MVert *mvert;
- long a;
+ float *co;
+ int a;
- for(a=1, mvert= me->mvert; a<=me->totvert; a++, mvert++) {
- mesh_octree_add_nodes(basetable, mvert->co, offs, div, a);
+ for(a=0, mvert= me->mvert; a<me->totvert; a++, mvert++) {
+ co= (MeshOctree.orco)? MeshOctree.orco[a]: mvert->co;
+ mesh_octree_add_nodes(MeshOctree.table, co, MeshOctree.offs, MeshOctree.div, a+1);
}
}
}
else if(mode=='e') { /* end table */
- if(basetable) {
+ if(MeshOctree.table) {
int a;
- for(a=0, bt=basetable; a<MOC_RES*MOC_RES*MOC_RES; a++, bt++) {
+ for(a=0, bt=MeshOctree.table; a<MOC_RES*MOC_RES*MOC_RES; a++, bt++) {
if(*bt) mesh_octree_free_node(bt);
}
- MEM_freeN(basetable);
- basetable= NULL;
+ MEM_freeN(MeshOctree.table);
+ MeshOctree.table= NULL;
+ }
+ if(MeshOctree.orco) {
+ MEM_freeN(MeshOctree.orco);
+ MeshOctree.orco= NULL;
}
}
return 0;
@@ -795,12 +836,22 @@ long mesh_octree_table(Object *ob, float *co, char mode)
int mesh_get_x_mirror_vert(Object *ob, int index)
{
Mesh *me= ob->data;
- MVert *mvert= me->mvert+index;
+ MVert *mvert;
float vec[3];
- vec[0]= -mvert->co[0];
- vec[1]= mvert->co[1];
- vec[2]= mvert->co[2];
+ if(MeshOctree.orco) {
+ float *loc= MeshOctree.orcoloc;
+
+ vec[0]= -(MeshOctree.orco[index][0] + loc[0]) - loc[0];
+ vec[1]= MeshOctree.orco[index][1];
+ vec[2]= MeshOctree.orco[index][2];
+ }
+ else {
+ mvert= me->mvert+index;
+ vec[0]= -mvert->co[0];
+ vec[1]= mvert->co[1];
+ vec[2]= mvert->co[2];
+ }
return mesh_octree_table(ob, vec, 'u');
}
@@ -820,6 +871,95 @@ 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;
+ 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++)
+ mirrorverts[a]= mesh_get_x_mirror_vert(ob, a);
+
+ 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 ********************** */
@@ -850,6 +990,7 @@ static ScrArea *biggest_image_area(void)
typedef struct BakeRender {
Render *re;
+ struct Object *actob;
int event, tot, ready;
} BakeRender;
@@ -857,7 +998,7 @@ static void *do_bake_render(void *bake_v)
{
BakeRender *bkr= bake_v;
- bkr->tot= RE_bake_shade_all_selected(bkr->re, bkr->event);
+ bkr->tot= RE_bake_shade_all_selected(bkr->re, bkr->event, bkr->actob);
bkr->ready= 1;
return NULL;
@@ -868,7 +1009,7 @@ void objects_bake_render_menu(void)
{
short event;
- event= pupmenu("Bake Selected Meshes %t|Full Render %x1|Ambient Occlusion %x2|Normals %x3|Texture Only %x4");
+ event= pupmenu("Bake Selected Meshes %t|Full Render %x1|Ambient Occlusion %x2|Normals %x3|Texture Only %x4|Displacement %x5");
objects_bake_render(event);
}
@@ -876,6 +1017,8 @@ void objects_bake_render_menu(void)
/* all selected meshes with UV maps are rendered for current scene visibility */
void objects_bake_render(short event)
{
+ Object *actob= OBACT;
+ int active= G.scene->r.bake_flag & R_BAKE_TO_ACTIVE;
short prev_r_raytrace= 0, prev_wo_amb_occ= 0;
if(event==0) event= G.scene->r.bake_mode;
@@ -885,19 +1028,23 @@ void objects_bake_render(short event)
return;
}
+ if(active && !actob)
+ return;
+
if(event>0) {
Render *re= RE_NewRender("_Bake View_");
ScrArea *area= biggest_image_area();
ListBase threads;
BakeRender bkr;
int timer=0, tot, sculptmode= G.f & G_SCULPTMODE;
-
+
if(sculptmode) set_sculptmode();
if(event==1) event= RE_BAKE_ALL;
else if(event==2) event= RE_BAKE_AO;
else if(event==3) event= RE_BAKE_NORMALS;
- else event= RE_BAKE_TEXTURE;
+ else if(event==4) event= RE_BAKE_TEXTURE;
+ else event= RE_BAKE_DISPLACEMENT;
if(event==RE_BAKE_AO) {
if(G.scene->world==NULL) {
@@ -906,19 +1053,20 @@ void objects_bake_render(short event)
}
/* If raytracing or AO is disabled, switch it on temporarily for baking. */
- prev_r_raytrace = (G.scene->r.mode & R_RAYTRACE) != 0;
prev_wo_amb_occ = (G.scene->world->mode & WO_AMB_OCC) != 0;
-
- G.scene->r.mode |= R_RAYTRACE;
G.scene->world->mode |= WO_AMB_OCC;
}
+ if(event==RE_BAKE_AO || active) {
+ prev_r_raytrace = (G.scene->r.mode & R_RAYTRACE) != 0;
+ G.scene->r.mode |= R_RAYTRACE;
+ }
waitcursor(1);
RE_test_break_cb(re, thread_break);
g_break= 0;
G.afbreek= 0; /* blender_test_break uses this global */
- RE_Database_Baking(re, G.scene, event);
+ RE_Database_Baking(re, G.scene, event, (active)? actob: NULL);
/* baking itself is threaded, cannot use test_break in threads. we also update optional imagewindow */
@@ -926,6 +1074,7 @@ void objects_bake_render(short event)
bkr.re= re;
bkr.event= event;
bkr.ready= 0;
+ bkr.actob= (active)? actob: NULL;
BLI_insert_thread(&threads, &bkr);
while(bkr.ready==0) {
@@ -953,21 +1102,26 @@ void objects_bake_render(short event)
if(tot==0) error("No Images found to bake to");
else {
Image *ima;
- /* force OpenGL reload */
+ /* force OpenGL reload and mipmap recalc */
for(ima= G.main->image.first; ima; ima= ima->id.next) {
if(ima->ok==IMA_OK_LOADED) {
ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
- if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
+ if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) {
free_realtime_image(ima);
+ imb_freemipmapImBuf(ibuf);
+ }
}
}
}
- /* restore raytrace and AO */
- if(event==RE_BAKE_AO) {
- if( prev_wo_amb_occ == 0) G.scene->world->mode &= ~WO_AMB_OCC;
- if( prev_r_raytrace == 0) G.scene->r.mode &= ~R_RAYTRACE;
- }
+ /* restore raytrace and AO */
+ if(event==RE_BAKE_AO)
+ if(prev_wo_amb_occ == 0)
+ G.scene->world->mode &= ~WO_AMB_OCC;
+
+ if(event==RE_BAKE_AO || active)
+ if(prev_r_raytrace == 0)
+ G.scene->r.mode &= ~R_RAYTRACE;
allqueue(REDRAWIMAGE, 0);
allqueue(REDRAWVIEW3D, 0);
@@ -977,4 +1131,3 @@ void objects_bake_render(short event)
}
}
-
diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c
index 8704f9abfa4..64edfb5f6cc 100644
--- a/source/blender/src/multires.c
+++ b/source/blender/src/multires.c
@@ -52,6 +52,7 @@
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_multires.h"
#include "BKE_object.h"
#include "BIF_editmesh.h"
@@ -78,8 +79,6 @@
#include <math.h>
-const CustomDataMask vdata_mask= CD_MASK_MDEFORMVERT;
-
void multires_calc_temp_data(struct MultiresLevel *lvl);
int multires_test()
@@ -109,407 +108,115 @@ void multires_check_state()
sculptmode_correct_state();
}
-typedef struct MultiresMapNode {
- struct MultiresMapNode *next, *prev;
- unsigned Index;
-} MultiresMapNode;
-
-MultiresLevel *current_level(Multires *mr)
-{
- return BLI_findlink(&mr->levels, mr->current - 1);
-}
-
-MultiresLevel *multires_level_n(Multires *mr, int n)
+static void medge_flag_to_eed(const short flag, const char crease, EditEdge *eed)
{
- if(mr)
- return BLI_findlink(&mr->levels, n - 1);
- else
- return NULL;
-}
-
-void Vec3fAvg3(float *out, float *v1, float *v2, float *v3)
-{
- out[0]= (v1[0]+v2[0]+v3[0])/3;
- out[1]= (v1[1]+v2[1]+v3[1])/3;
- out[2]= (v1[2]+v2[2]+v3[2])/3;
-}
-void Vec3fAvg4(float *out, float *v1, float *v2, float *v3, float *v4)
-{
- out[0]= (v1[0]+v2[0]+v3[0]+v4[0])/4;
- out[1]= (v1[1]+v2[1]+v3[1]+v4[1])/4;
- out[2]= (v1[2]+v2[2]+v3[2]+v4[2])/4;
-}
-
-short multires_vert_is_boundary(MultiresLevel *lvl, unsigned v)
-{
- MultiresMapNode *node= lvl->vert_edge_map[v].first;
- while(node) {
- if(lvl->edge_boundary_states[node->Index])
- return 1;
- node= node->next;
- }
- return 0;
-}
-
-typedef struct MultiApplyData {
- /* Smooth faces */
- float *corner1, *corner2, *corner3, *corner4;
- char quad;
-
- /* Smooth edges */
- char boundary;
- float edge_face_neighbor_midpoints_accum[3];
- unsigned edge_face_neighbor_midpoints_total;
- float *endpoint1, *endpoint2;
-
- /* Smooth verts */
- /* uses 'char boundary' */
- float *original;
- int edge_count;
- float vert_face_neighbor_midpoints_average[3];
- float vert_edge_neighbor_midpoints_average[3];
- float boundary_edges_average[3];
-} MultiApplyData;
-
-/* CATMULL-CLARK
- ============= */
-
-/* Simply averages the four corners of a polygon. */
-float catmullclark_smooth_face(MultiApplyData *data, const unsigned i)
-{
- const float total= data->corner1[i]+data->corner2[i]+data->corner3[i];
- return data->quad ? (total+data->corner4[i])/4 : total/3;
-}
-
-float catmullclark_smooth_edge(MultiApplyData *data, const unsigned i)
-{
- float accum= 0;
- unsigned count= 2;
-
- accum+= data->endpoint1[i] + data->endpoint2[i];
-
- if(!data->boundary) {
- accum+= data->edge_face_neighbor_midpoints_accum[i];
- count+= data->edge_face_neighbor_midpoints_total;
- }
-
- return accum / count;
-}
-float catmullclark_smooth_vert(MultiApplyData *data, const unsigned i)
-{
- if(data->boundary) {
- return data->original[i]*0.75 + data->boundary_edges_average[i]*0.25;
- } else {
- return (data->vert_face_neighbor_midpoints_average[i] +
- 2*data->vert_edge_neighbor_midpoints_average[i] +
- data->original[i]*(data->edge_count-3))/data->edge_count;
- }
-}
-
-
-
-/* Call func count times, passing in[i] as the input and storing the output in out[i] */
-void multi_apply(float *out, MultiApplyData *data,
- const unsigned count, float (*func)(MultiApplyData *, const unsigned))
-{
- unsigned i;
- for(i=0; i<count; ++i)
- out[i]= func(data,i);
-}
-
-#define GET_FLOAT(array, i, j, stride) (((float*)((char*)(array)+((i)*(stride))))[(j)])
-
-void edge_face_neighbor_midpoints_accum(MultiApplyData *data, MultiresLevel *lvl,
- void *array, const char stride, const MultiresEdge *e)
-{
- ListBase *neighbors1= &lvl->vert_face_map[e->v[0]];
- ListBase *neighbors2= &lvl->vert_face_map[e->v[1]];
- MultiresMapNode *n1, *n2;
- unsigned j,count= 0;
- float *out= data->edge_face_neighbor_midpoints_accum;
+ if(!eed) return;
- out[0]=out[1]=out[2]= 0;
-
- for(n1= neighbors1->first; n1; n1= n1->next) {
- for(n2= neighbors2->first; n2; n2= n2->next) {
- if(n1->Index == n2->Index) {
- for(j=0; j<3; ++j)
- out[j]+= GET_FLOAT(array,lvl->faces[n1->Index].mid,j,stride);
- ++count;
- }
- }
- }
-
- data->edge_face_neighbor_midpoints_total= count;
-}
-void vert_face_neighbor_midpoints_average(MultiApplyData *data, MultiresLevel *lvl,
- void *array, const char stride, const unsigned i)
-{
- ListBase *neighbors= &lvl->vert_face_map[i];
- MultiresMapNode *n1;
- unsigned j,count= 0;
- float *out= data->vert_face_neighbor_midpoints_average;
-
- out[0]=out[1]=out[2]= 0;
-
- for(n1= neighbors->first; n1; n1= n1->next) {
- for(j=0; j<3; ++j)
- out[j]+= GET_FLOAT(array,lvl->faces[n1->Index].mid,j,stride);
- ++count;
- }
- for(j=0; j<3; ++j) out[j]/= count;
-}
-void vert_edge_neighbor_midpoints_average(MultiApplyData *data, MultiresLevel *lvl,
- void *array, const char stride, const unsigned i)
-{
- ListBase *neighbors= &lvl->vert_edge_map[i];
- MultiresMapNode *n1;
- unsigned j,count= 0;
- float *out= data->vert_edge_neighbor_midpoints_average;
-
- out[0]=out[1]=out[2]= 0;
-
- for(n1= neighbors->first; n1; n1= n1->next) {
- for(j=0; j<3; ++j)
- out[j]+= (GET_FLOAT(array,lvl->edges[n1->Index].v[0],j,stride) +
- GET_FLOAT(array,lvl->edges[n1->Index].v[1],j,stride)) / 2;
- ++count;
- }
- for(j=0; j<3; ++j) out[j]/= count;
-}
-void boundary_edges_average(MultiApplyData *data, MultiresLevel *lvl,
- void *array, const char stride, const unsigned i)
-{
- ListBase *neighbors= &lvl->vert_edge_map[i];
- MultiresMapNode *n1;
- unsigned j,count= 0;
- float *out= data->boundary_edges_average;
-
- out[0]=out[1]=out[2]= 0;
+ if(flag & ME_SEAM) eed->seam= 1;
+ if(flag & ME_SHARP) eed->sharp = 1;
+ if(flag & SELECT) eed->f |= SELECT;
+ if(flag & ME_FGON) eed->h= EM_FGON;
+ if(flag & ME_HIDE) eed->h |= 1;
- for(n1= neighbors->first; n1; n1= n1->next) {
- const MultiresEdge *e= &lvl->edges[n1->Index];
- const unsigned end= e->v[0]==i ? e->v[1] : e->v[0];
-
- if(lvl->edge_boundary_states[n1->Index]) {
- for(j=0; j<3; ++j)
- out[j]+= GET_FLOAT(array,end,j,stride);
- ++count;
- }
- }
- for(j=0; j<3; ++j) out[j]/= count;
-}
-
-/* For manipulating vertex colors / uvs */
-void mcol_to_multires(MultiresColFace *mrf, MCol *mcol)
-{
- char i;
- for(i=0; i<4; ++i) {
- mrf->col[i].a= mcol[i].a;
- mrf->col[i].r= mcol[i].r;
- mrf->col[i].g= mcol[i].g;
- mrf->col[i].b= mcol[i].b;
- }
-}
-
-float clamp_component(const float c)
-{
- if(c<0) return 0;
- else if(c>255) return 255;
- else return c;
-}
-
-void multires_to_mcol(MultiresColFace *f, MCol mcol[4])
-{
- unsigned char j;
- for(j=0; j<4; ++j) {
- mcol->a= clamp_component(f->col[j].a);
- mcol->r= clamp_component(f->col[j].r);
- mcol->g= clamp_component(f->col[j].g);
- mcol->b= clamp_component(f->col[j].b);
- ++mcol;
- }
-}
-
-/* 1 <= count <= 4 */
-void multires_col_avg(MultiresCol *avg, MultiresCol cols[4], char count)
-{
- unsigned i;
- avg->a= avg->r= avg->g= avg->b= 0;
- for(i=0; i<count; ++i) {
- avg->a+= cols[i].a;
- avg->r+= cols[i].r;
- avg->g+= cols[i].g;
- avg->b+= cols[i].b;
- }
- avg->a/= count;
- avg->r/= count;
- avg->g/= count;
- avg->b/= count;
-}
-
-void multires_col_avg2(MultiresCol *avg, MultiresCol *c1, MultiresCol *c2)
-{
- MultiresCol in[2];
- in[0]= *c1;
- in[1]= *c2;
- multires_col_avg(avg,in,2);
+ eed->crease= ((float)crease)/255.0;
}
-void multires_load_cols(Mesh *me)
+void multires_level_to_editmesh(Object *ob, Mesh *me, const int render)
{
- MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1), *cur;
- EditMesh *em= G.obedit ? G.editMesh : NULL;
- CustomData *src= em ? &em->fdata : &me->fdata;
- EditFace *efa= NULL;
- unsigned i,j;
-
- if(!CustomData_has_layer(src, CD_MCOL) && !CustomData_has_layer(src, CD_MTFACE)) return;
-
- /* Add texcol data */
- for(cur= me->mr->levels.first; cur; cur= cur->next)
- if(!cur->colfaces)
- cur->colfaces= MEM_callocN(sizeof(MultiresColFace)*cur->totface,"ColFaces");
-
- me->mr->use_col= CustomData_has_layer(src, CD_MCOL);
-
- if(em) efa= em->faces.first;
- for(i=0; i<lvl->totface; ++i) {
- MultiresColFace *f= &lvl->colfaces[i];
+ MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
+ int i;
+ EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
+ EditVert **eves= NULL;
+ EditEdge *eed= NULL;
- if(me->mr->use_col)
- mcol_to_multires(f, em ? CustomData_em_get(src, efa->data, CD_MCOL) : &me->mcol[i*4]);
+ if(em) {
+ /* Remove editmesh elements */
+ free_editMesh(em);
- if(em) efa= efa->next;
- }
-
- /* Update higher levels */
- lvl= lvl->next;
- while(lvl) {
- MultiresColFace *cf= lvl->colfaces;
- for(i=0; i<lvl->prev->totface; ++i) {
- const char sides= lvl->prev->faces[i].v[3]?4:3;
- MultiresCol cntr;
-
- /* Find average color of 4 (or 3 for triangle) verts */
- multires_col_avg(&cntr,lvl->prev->colfaces[i].col,sides);
-
- for(j=0; j<sides; ++j) {
- MultiresColFace *pf= &lvl->prev->colfaces[i];
+ eves= MEM_callocN(sizeof(EditVert*)*lvl->totvert, "editvert pointers");
- multires_col_avg2(&cf->col[0],
- &pf->col[j],
- &pf->col[j==0?sides-1:j-1]);
- cf->col[1]= pf->col[j];
- multires_col_avg2(&cf->col[2],
- &pf->col[j],
- &pf->col[j==sides-1?0:j+1]);
- cf->col[3]= cntr;
-
- ++cf;
- }
+ /* Vertices/Edges/Faces */
+ for(i=0; i<lvl->totvert; ++i) {
+ eves[i]= addvertlist(me->mr->verts[i].co, NULL);
+ if(me->mr->verts[i].flag & 1) eves[i]->f |= SELECT;
+ if(me->mr->verts[i].flag & ME_HIDE) eves[i]->h= 1;
+ eves[i]->data= NULL;
+ }
+ for(i=0; i<lvl->totedge; ++i) {
+ addedgelist(eves[lvl->edges[i].v[0]], eves[lvl->edges[i].v[1]], NULL);
}
- lvl= lvl->next;
- }
-
- /* Update lower levels */
- lvl= me->mr->levels.last;
- lvl= lvl->prev;
- while(lvl) {
- unsigned curf= 0;
for(i=0; i<lvl->totface; ++i) {
- MultiresFace *f= &lvl->faces[i];
- for(j=0; j<(f->v[3]?4:3); ++j) {
- lvl->colfaces[i].col[j]= lvl->next->colfaces[curf].col[1];
- ++curf;
+ EditVert *eve4= lvl->faces[i].v[3] ? eves[lvl->faces[i].v[3]] : NULL;
+ EditFace *efa= addfacelist(eves[lvl->faces[i].v[0]], eves[lvl->faces[i].v[1]],
+ eves[lvl->faces[i].v[2]], eve4, NULL, NULL);
+ efa->flag= lvl->faces[i].flag & ~ME_HIDE;
+ efa->mat_nr= lvl->faces[i].mat_nr;
+ if(lvl->faces[i].flag & ME_FACE_SEL)
+ efa->f |= SELECT;
+ if(lvl->faces[i].flag & ME_HIDE) efa->h= 1;
+ efa->data= NULL;
+ }
+
+ /* Edge flags */
+ eed= em->edges.first;
+ if(lvl==me->mr->levels.first) {
+ for(i=0; i<lvl->totedge; ++i) {
+ medge_flag_to_eed(me->mr->edge_flags[i], me->mr->edge_creases[i], eed);
+ eed= eed->next;
+ }
+ } else {
+ MultiresLevel *lvl1= me->mr->levels.first;
+ const int last= lvl1->totedge * pow(2, me->mr->current-1);
+ for(i=0; i<last; ++i) {
+ const int ndx= i / pow(2, me->mr->current-1);
+
+ medge_flag_to_eed(me->mr->edge_flags[ndx], me->mr->edge_creases[ndx], eed);
+ eed= eed->next;
}
}
- lvl= lvl->prev;
- }
-}
-void multires_get_vert(MVert *out, EditVert *eve, MVert *m, int i)
-{
- if(eve) {
- VecCopyf(out->co, eve->co);
- out->flag= 0;
- if(eve->f & SELECT) out->flag |= 1;
- if(eve->h) out->flag |= ME_HIDE;
- eve->tmp.l= i;
- }
- else
- *out= *m;
-}
-
-void multires_get_face(MultiresFace *f, EditFace *efa, MFace *m)
-{
- if(efa) {
- MFace tmp;
- int j;
- tmp.v1= efa->v1->tmp.l;
- tmp.v2= efa->v2->tmp.l;
- tmp.v3= efa->v3->tmp.l;
- tmp.v4= 0;
- if(efa->v4) tmp.v4= efa->v4->tmp.l;
- test_index_face(&tmp, NULL, 0, efa->v4?4:3);
- for(j=0; j<4; ++j) f->v[j]= (&tmp.v1)[j];
+ eed= em->edges.first;
+ for(i=0, eed= em->edges.first; i<lvl->totedge; ++i, eed= eed->next) {
+ eed->h= me->mr->verts[lvl->edges[i].v[0]].flag & ME_HIDE ||
+ me->mr->verts[lvl->edges[i].v[1]].flag & ME_HIDE;
+ }
+
+ EM_select_flush();
- /* Flags */
- f->flag= efa->flag;
- if(efa->f & 1) f->flag |= ME_FACE_SEL;
- else f->flag &= ~ME_FACE_SEL;
- if(efa->h) f->flag |= ME_HIDE;
- f->mat_nr= efa->mat_nr;
- } else {
- f->v[0]= m->v1;
- f->v[1]= m->v2;
- f->v[2]= m->v3;
- f->v[3]= m->v4;
- f->flag= m->flag;
- f->mat_nr= m->mat_nr;
- }
-}
+ multires_customdata_to_mesh(me, em, lvl, &me->mr->vdata, em ? &em->vdata : &me->vdata, CD_MDEFORMVERT);
+ multires_customdata_to_mesh(me, em, lvl, &me->mr->fdata, em ? &em->fdata : &me->fdata, CD_MTFACE);
-void eed_to_medge_flag(EditEdge *eed, short *flag, char *crease)
-{
- if(!eed || !flag) return;
+ /* Colors */
+ if(me->mr->use_col) {
+ MCol c[4];
+ EditFace *efa= NULL;
+ CustomData *src= &em->fdata;
- /* Would be nice if EditMesh edge flags could be unified with Mesh flags! */
- *flag= (eed->f & SELECT) | ME_EDGERENDER;
- if(eed->f2<2) *flag |= ME_EDGEDRAW;
- if(eed->f2==0) *flag |= ME_LOOSEEDGE;
- if(eed->sharp) *flag |= ME_SHARP;
- if(eed->seam) *flag |= ME_SEAM;
- if(eed->h & EM_FGON) *flag |= ME_FGON;
- if(eed->h & 1) *flag |= ME_HIDE;
+ if(me->mr->use_col) EM_add_data_layer(src, CD_MCOL);
+ efa= em->faces.first;
+
+ for(i=0; i<lvl->totface; ++i) {
+ if(me->mr->use_col) {
+ multires_to_mcol(&lvl->colfaces[i], c);
+ CustomData_em_set(src, efa->data, CD_MCOL, c);
+ }
+ efa= efa->next;
+ }
+
+ }
- *crease= (char)(255.0*eed->crease);
-}
-
-void multires_get_edge(MultiresEdge *e, EditEdge *eed, MEdge *m, short *flag, char *crease)
-{
- if(eed) {
- e->v[0]= eed->v1->tmp.l;
- e->v[1]= eed->v2->tmp.l;
- eed_to_medge_flag(eed, flag, crease);
- } else {
- e->v[0]= m->v1;
- e->v[1]= m->v2;
- *flag= m->flag;
- *crease= m->crease;
+ mesh_update_customdata_pointers(me);
+
+ MEM_freeN(eves);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ recalc_editnormals();
}
}
void multires_make(void *ob, void *me_v)
{
Mesh *me= me_v;
- MultiresLevel *lvl;
- EditMesh *em= G.obedit ? G.editMesh : NULL;
- EditVert *eve= NULL;
- EditFace *efa= NULL;
- EditEdge *eed= NULL;
Key *key;
- int i;
/* Check for shape keys */
key= me->key;
@@ -522,64 +229,14 @@ void multires_make(void *ob, void *me_v)
return;
}
- lvl= MEM_callocN(sizeof(MultiresLevel), "multires level");
-
waitcursor(1);
multires_check_state();
- if(me->pv) sculptmode_pmv_off(me);
-
- me->mr= MEM_callocN(sizeof(Multires), "multires data");
-
- BLI_addtail(&me->mr->levels,lvl);
- me->mr->current= 1;
- me->mr->level_count= 1;
- me->mr->edgelvl= 1;
- me->mr->pinlvl= 1;
- me->mr->renderlvl= 1;
-
- /* Load mesh (or editmesh) into multires data */
-
- /* Load vertices and vdata (MDeformVerts) */
- lvl->totvert= em ? BLI_countlist(&em->verts) : me->totvert;
- me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts");
- multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata,
- &me->mr->vdata, CD_MDEFORMVERT);
- if(em) eve= em->verts.first;
- for(i=0; i<lvl->totvert; ++i) {
- multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i);
- if(em) eve= eve->next;
- }
-
- /* Load faces and fdata (MTFaces) */
- lvl->totface= em ? BLI_countlist(&em->faces) : me->totface;
- lvl->faces= MEM_callocN(sizeof(MultiresFace)*lvl->totface,"multires faces");
- multires_update_customdata(me->mr->levels.first, em ? &em->fdata : &me->fdata,
- &me->mr->fdata, CD_MTFACE);
- if(em) efa= em->faces.first;
- for(i=0; i<lvl->totface; ++i) {
- multires_get_face(&lvl->faces[i], efa, &me->mface[i]);
- if(em) efa= efa->next;
- }
-
- /* Load edges and edge_flags */
- lvl->totedge= em ? BLI_countlist(&em->edges) : me->totedge;
- lvl->edges= MEM_callocN(sizeof(MultiresEdge)*lvl->totedge,"multires edges");
- me->mr->edge_flags= MEM_callocN(sizeof(short)*lvl->totedge, "multires edge flags");
- me->mr->edge_creases= MEM_callocN(sizeof(short)*lvl->totedge, "multires edge creases");
- if(em) eed= em->edges.first;
- for(i=0; i<lvl->totedge; ++i) {
- multires_get_edge(&lvl->edges[i], eed, &me->medge[i], &me->mr->edge_flags[i], &me->mr->edge_creases[i]);
- if(em) eed= eed->next;
- }
-
- multires_load_cols(me);
+ multires_create(ob, me);
allqueue(REDRAWBUTSEDIT, 0);
-
BIF_undo_push("Make multires");
-
waitcursor(0);
}
@@ -596,103 +253,6 @@ void multires_delete(void *ob, void *me_v)
BIF_undo_push("Apply multires");
}
-MultiresLevel *multires_level_copy(MultiresLevel *orig)
-{
- if(orig) {
- MultiresLevel *lvl= MEM_dupallocN(orig);
-
- lvl->next= lvl->prev= NULL;
- lvl->faces= MEM_dupallocN(orig->faces);
- lvl->colfaces= MEM_dupallocN(orig->colfaces);
- lvl->edges= MEM_dupallocN(orig->edges);
- lvl->edge_boundary_states = NULL;
- lvl->vert_edge_map= lvl->vert_face_map= NULL;
- lvl->map_mem= NULL;
-
- return lvl;
- }
- return NULL;
-}
-
-Multires *multires_copy(Multires *orig)
-{
- if(orig) {
- Multires *mr= MEM_dupallocN(orig);
- MultiresLevel *lvl;
-
- mr->levels.first= mr->levels.last= NULL;
-
- for(lvl= orig->levels.first; lvl; lvl= lvl->next)
- BLI_addtail(&mr->levels, multires_level_copy(lvl));
-
- mr->verts= MEM_dupallocN(orig->verts);
-
- lvl= mr->levels.first;
- if(lvl) {
- CustomData_copy(&orig->vdata, &mr->vdata, vdata_mask, CD_DUPLICATE, lvl->totvert);
- CustomData_copy(&orig->fdata, &mr->fdata, CD_MASK_MTFACE, CD_DUPLICATE, lvl->totface);
- mr->edge_flags= MEM_dupallocN(orig->edge_flags);
- mr->edge_creases= MEM_dupallocN(orig->edge_creases);
- }
-
- return mr;
- }
- return NULL;
-}
-
-void multires_free(Multires *mr)
-{
- if(mr) {
- MultiresLevel* lvl= mr->levels.first;
-
- /* Free the first-level data */
- if(lvl) {
- CustomData_free(&mr->vdata, lvl->totvert);
- CustomData_free(&mr->fdata, lvl->totface);
- MEM_freeN(mr->edge_flags);
- MEM_freeN(mr->edge_creases);
- }
-
- while(lvl) {
- multires_free_level(lvl);
- lvl= lvl->next;
- }
-
- MEM_freeN(mr->verts);
-
- BLI_freelistN(&mr->levels);
-
- MEM_freeN(mr);
- }
-}
-
-/* Free and clear the temporary connectivity data */
-void multires_free_temp_data(MultiresLevel *lvl)
-{
- if(lvl) {
- if(lvl->edge_boundary_states) MEM_freeN(lvl->edge_boundary_states);
- if(lvl->vert_edge_map) MEM_freeN(lvl->vert_edge_map);
- if(lvl->vert_face_map) MEM_freeN(lvl->vert_face_map);
- if(lvl->map_mem) MEM_freeN(lvl->map_mem);
-
- lvl->edge_boundary_states = NULL;
- lvl->vert_edge_map = lvl->vert_face_map = NULL;
- lvl->map_mem = NULL;
- }
-}
-
-/* Does not actually free lvl itself! */
-void multires_free_level(MultiresLevel *lvl)
-{
- if(lvl) {
- if(lvl->faces) MEM_freeN(lvl->faces);
- if(lvl->edges) MEM_freeN(lvl->edges);
- if(lvl->colfaces) MEM_freeN(lvl->colfaces);
-
- multires_free_temp_data(lvl);
- }
-}
-
/* Make sure that all level indices are clipped to [1, mr->level_count] */
void multires_clip_levels(Multires *mr)
{
@@ -789,44 +349,23 @@ void multires_del_higher(void *ob, void *me)
BIF_undo_push("Multires delete higher");
}
-unsigned int find_mid_edge(ListBase *vert_edge_map,
- MultiresLevel *lvl,
- const unsigned int v1,
- const unsigned int v2 )
+void multires_finish_mesh_update(Object *ob)
{
- MultiresMapNode *n= vert_edge_map[v1].first;
- while(n) {
- if(lvl->edges[n->Index].v[0]==v2 ||
- lvl->edges[n->Index].v[1]==v2)
- return lvl->edges[n->Index].mid;
-
- n= n->next;
+ /* friendly check for background render */
+ if(G.background==0) {
+ object_handle_update(ob);
+ countall();
+
+ if(G.vd && G.vd->depths) G.vd->depths->damaged= 1;
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWIMAGE, 0);
}
- return -1;
}
-void check_colors(Mesh *me)
+void multires_subdivide(void *ob_v, void *me_v)
{
- CustomData *src= G.obedit ? &G.editMesh->fdata : &me->fdata;
- const char col= CustomData_has_layer(src, CD_MCOL);
-
- /* Check if vertex colors have been deleted or added */
- if(me->mr->use_col && !col)
- me->mr->use_col= 0;
- else if(!me->mr->use_col && col) {
- me->mr->use_col= 1;
- multires_load_cols(me);
- }
-}
+ Mesh *me = me_v;
-void multires_add_level(void *ob, void *me_v)
-{
- int i,j, curf, cure;
- Mesh *me= me_v;
- 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) {
@@ -836,201 +375,26 @@ void multires_add_level(void *ob, void *me_v)
}
waitcursor(1);
+ multires_add_level(ob_v, me, G.scene->toolsettings->multires_subdiv_type);
+ multires_level_to_editmesh(ob_v, me, 0);
+ multires_finish_mesh_update(ob_v);
- lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel");
- if(me->pv) sculptmode_pmv_off(me);
-
- check_colors(me);
- multires_update_levels(me, 0);
-
- ++me->mr->level_count;
- BLI_addtail(&me->mr->levels,lvl);
-
- /* Create vertices
- =============== */
- lvl->totvert= lvl->prev->totvert + lvl->prev->totedge + lvl->prev->totface;
- oldverts= me->mr->verts;
- me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert, "multitres verts");
- /* Copy old verts */
- for(i=0; i<lvl->prev->totvert; ++i)
- me->mr->verts[i]= oldverts[i];
- /* Create new edge verts */
- for(i=0; i<lvl->prev->totedge; ++i) {
- VecMidf(me->mr->verts[lvl->prev->totvert + i].co,
- oldverts[lvl->prev->edges[i].v[0]].co,
- oldverts[lvl->prev->edges[i].v[1]].co);
- lvl->prev->edges[i].mid= lvl->prev->totvert + i;
- }
- /* Create new face verts */
- for(i=0; i<lvl->prev->totface; ++i) {
- lvl->prev->faces[i].mid= lvl->prev->totvert + lvl->prev->totedge + i;
- }
-
- multires_calc_temp_data(lvl->prev);
-
- /* Create faces
- ============ */
- /* Allocate all the new faces (each triangle creates three, and
- each quad creates four */
- lvl->totface= 0;
- for(i=0; i<lvl->prev->totface; ++i)
- lvl->totface+= lvl->prev->faces[i].v[3] ? 4 : 3;
- lvl->faces= MEM_callocN(sizeof(MultiresFace)*lvl->totface,"multires faces");
-
- curf= 0;
- for(i=0; i<lvl->prev->totface; ++i) {
- const int max= lvl->prev->faces[i].v[3] ? 3 : 2;
-
- for(j=0; j<max+1; ++j) {
- lvl->faces[curf].v[0]= find_mid_edge(lvl->prev->vert_edge_map,lvl->prev,
- lvl->prev->faces[i].v[j],
- lvl->prev->faces[i].v[j==0?max:j-1]);
- lvl->faces[curf].v[1]= lvl->prev->faces[i].v[j];
- lvl->faces[curf].v[2]= find_mid_edge(lvl->prev->vert_edge_map,lvl->prev,
- lvl->prev->faces[i].v[j],
- lvl->prev->faces[i].v[j==max?0:j+1]);
- lvl->faces[curf].v[3]= lvl->prev->totvert + lvl->prev->totedge + i;
- lvl->faces[curf].flag= lvl->prev->faces[i].flag;
- lvl->faces[curf].mat_nr= lvl->prev->faces[i].mat_nr;
-
- ++curf;
- }
- }
-
- /* Create edges
- ============ */
- /* Figure out how many edges to allocate */
- lvl->totedge= lvl->prev->totedge*2;
- for(i=0; i<lvl->prev->totface; ++i)
- lvl->totedge+= lvl->prev->faces[i].v[3]?4:3;
- lvl->edges= MEM_callocN(sizeof(MultiresEdge)*lvl->totedge,"multires edges");
-
- for(i=0; i<lvl->prev->totedge; ++i) {
- lvl->edges[i*2].v[0]= lvl->prev->edges[i].v[0];
- lvl->edges[i*2].v[1]= lvl->prev->edges[i].mid;
- lvl->edges[i*2+1].v[0]= lvl->prev->edges[i].mid;
- lvl->edges[i*2+1].v[1]= lvl->prev->edges[i].v[1];
- }
- /* Add edges inside of old polygons */
- curf= 0;
- cure= lvl->prev->totedge*2;
- for(i=0; i<lvl->prev->totface; ++i) {
- for(j=0; j<(lvl->prev->faces[i].v[3]?4:3); ++j) {
- lvl->edges[cure].v[0]= lvl->faces[curf].v[2];
- lvl->edges[cure].v[1]= lvl->faces[curf].v[3];
- ++cure;
- ++curf;
- }
- }
-
- /* Smooth vertices
- =============== */
- for(i=0; i<lvl->prev->totface; ++i) {
- const MultiresFace *f= &lvl->prev->faces[i];
- data.corner1= oldverts[f->v[0]].co;
- data.corner2= oldverts[f->v[1]].co;
- data.corner3= oldverts[f->v[2]].co;
- data.corner4= oldverts[f->v[3]].co;
- data.quad= f->v[3] ? 1 : 0;
- multi_apply(me->mr->verts[f->mid].co, &data, 3, catmullclark_smooth_face);
- }
-
- if(G.scene->toolsettings->multires_subdiv_type == 0) {
- for(i=0; i<lvl->prev->totedge; ++i) {
- const MultiresEdge *e= &lvl->prev->edges[i];
- data.boundary= lvl->prev->edge_boundary_states[i];
- edge_face_neighbor_midpoints_accum(&data,lvl->prev, me->mr->verts, sizeof(MVert),e);
- data.endpoint1= oldverts[e->v[0]].co;
- data.endpoint2= oldverts[e->v[1]].co;
- multi_apply(me->mr->verts[e->mid].co, &data, 3, catmullclark_smooth_edge);
- }
-
- for(i=0; i<lvl->prev->totvert; ++i) {
- data.boundary= multires_vert_is_boundary(lvl->prev,i);
- data.original= oldverts[i].co;
- data.edge_count= BLI_countlist(&lvl->prev->vert_edge_map[i]);
- if(data.boundary)
- boundary_edges_average(&data,lvl->prev, oldverts, sizeof(MVert),i);
- else {
- vert_face_neighbor_midpoints_average(&data,lvl->prev, me->mr->verts,
- sizeof(MVert),i);
- vert_edge_neighbor_midpoints_average(&data,lvl->prev, oldverts,
- sizeof(MVert),i);
- }
- multi_apply(me->mr->verts[i].co, &data, 3, catmullclark_smooth_vert);
- }
- }
-
- multires_free_temp_data(lvl->prev);
- MEM_freeN(oldverts);
-
- /* Vertex Colors
- ============= */
- curf= 0;
- if(me->mr->use_col) {
- MultiresColFace *cf= MEM_callocN(sizeof(MultiresColFace)*lvl->totface,"Multirescolfaces");
- lvl->colfaces= cf;
- for(i=0; i<lvl->prev->totface; ++i) {
- const char sides= lvl->prev->faces[i].v[3]?4:3;
- MultiresCol cntr;
-
- /* Find average color of 4 (or 3 for triangle) verts */
- multires_col_avg(&cntr,lvl->prev->colfaces[i].col,sides);
-
- for(j=0; j<sides; ++j) {
- multires_col_avg2(&cf->col[0],
- &lvl->prev->colfaces[i].col[j],
- &lvl->prev->colfaces[i].col[j==0?sides-1:j-1]);
- cf->col[1]= lvl->prev->colfaces[i].col[j];
- multires_col_avg2(&cf->col[2],
- &lvl->prev->colfaces[i].col[j],
- &lvl->prev->colfaces[i].col[j==sides-1?0:j+1]);
- cf->col[3]= cntr;
-
- ++cf;
- }
- }
- }
-
- me->mr->newlvl= me->mr->level_count;
- me->mr->current= me->mr->newlvl;
- /* Unless the render level has been set to something other than the
- highest level (by the user), increment the render level to match
- the highest available level */
- if(me->mr->renderlvl == me->mr->level_count - 1) me->mr->renderlvl= me->mr->level_count;
-
- multires_level_to_mesh(ob, me, 0);
-
allqueue(REDRAWBUTSEDIT, 0);
-
BIF_undo_push("Add multires level");
-
waitcursor(0);
}
void multires_set_level_cb(void *ob, void *me)
{
- multires_set_level(ob, me, 0);
-}
-
-void multires_set_level(struct Object *ob, struct Mesh *me, const int render)
-{
waitcursor(1);
multires_check_state();
- if(me->pv) sculptmode_pmv_off(me);
-
- check_colors(me);
- multires_update_levels(me, render);
-
- me->mr->current= me->mr->newlvl;
- if(me->mr->current<1) me->mr->current= 1;
- else if(me->mr->current>me->mr->level_count) me->mr->current= me->mr->level_count;
-
- multires_level_to_mesh(ob, me, render);
+ multires_set_level(ob, me, 0);
+ multires_level_to_editmesh(ob, me, 0);
+ multires_finish_mesh_update(ob);
- if(!render && (G.obedit || G.f & G_SCULPTMODE))
+ if(G.obedit || G.f & G_SCULPTMODE)
BIF_undo_push("Multires set level");
allqueue(REDRAWBUTSEDIT, 0);
@@ -1038,593 +402,10 @@ void multires_set_level(struct Object *ob, struct Mesh *me, const int render)
waitcursor(0);
}
-
-void medge_flag_to_eed(const short flag, const char crease, EditEdge *eed)
+void multires_edge_level_update_cb(void *ob_v, void *me_v)
{
- if(!eed) return;
-
- if(flag & ME_SEAM) eed->seam= 1;
- if(flag & ME_SHARP) eed->sharp = 1;
- if(flag & SELECT) eed->f |= SELECT;
- if(flag & ME_FGON) eed->h= EM_FGON;
- if(flag & ME_HIDE) eed->h |= 1;
-
- eed->crease= ((float)crease)/255.0;
-}
-
-/* note, function is called in background render too, without UI */
-void multires_level_to_mesh(Object *ob, Mesh *me, const int render)
-{
- MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
- int i;
- EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
- EditVert **eves= NULL;
- EditEdge *eed= NULL;
-
- if(em) {
- /* Remove editmesh elements */
- free_editMesh(em);
-
- 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);
- CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
- CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
- CustomData_free_layers(&me->fdata, CD_MTFACE, me->totface);
- CustomData_free_layers(&me->fdata, CD_MCOL, me->totface);
-
- me->totvert= lvl->totvert;
- me->totface= lvl->totface;
- me->totedge= lvl->totedge;
-
- CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
- CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge);
- CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
- mesh_update_customdata_pointers(me);
- }
-
- /* Vertices/Edges/Faces */
-
- for(i=0; i<lvl->totvert; ++i) {
- if(em) {
- eves[i]= addvertlist(me->mr->verts[i].co, NULL);
- if(me->mr->verts[i].flag & 1) eves[i]->f |= SELECT;
- if(me->mr->verts[i].flag & ME_HIDE) eves[i]->h= 1;
- eves[i]->data= NULL;
- }
- else
- me->mvert[i]= me->mr->verts[i];
- }
- for(i=0; i<lvl->totedge; ++i) {
- if(em) {
- addedgelist(eves[lvl->edges[i].v[0]], eves[lvl->edges[i].v[1]], NULL);
- } else {
- me->medge[i].v1= lvl->edges[i].v[0];
- me->medge[i].v2= lvl->edges[i].v[1];
- me->medge[i].flag &= ~ME_HIDE;
- }
- }
- for(i=0; i<lvl->totface; ++i) {
- if(em) {
- EditVert *eve4= lvl->faces[i].v[3] ? eves[lvl->faces[i].v[3]] : NULL;
- EditFace *efa= addfacelist(eves[lvl->faces[i].v[0]], eves[lvl->faces[i].v[1]],
- eves[lvl->faces[i].v[2]], eve4, NULL, NULL);
- efa->flag= lvl->faces[i].flag & ~ME_HIDE;
- efa->mat_nr= lvl->faces[i].mat_nr;
- if(lvl->faces[i].flag & ME_FACE_SEL)
- efa->f |= SELECT;
- if(lvl->faces[i].flag & ME_HIDE) efa->h= 1;
- efa->data= NULL;
- }
- else {
- me->mface[i].v1= lvl->faces[i].v[0];
- me->mface[i].v2= lvl->faces[i].v[1];
- me->mface[i].v3= lvl->faces[i].v[2];
- me->mface[i].v4= lvl->faces[i].v[3];
- me->mface[i].flag= lvl->faces[i].flag;
- me->mface[i].flag &= ~ME_HIDE;
- me->mface[i].mat_nr= lvl->faces[i].mat_nr;
- }
- }
-
- /* Edge flags */
- if(em) eed= em->edges.first;
- if(lvl==me->mr->levels.first) {
- for(i=0; i<lvl->totedge; ++i) {
- if(em) {
- medge_flag_to_eed(me->mr->edge_flags[i], me->mr->edge_creases[i], eed);
- eed= eed->next;
- }
- else {
- me->medge[i].flag= me->mr->edge_flags[i];
- me->medge[i].crease= me->mr->edge_creases[i];
- }
- }
- } else {
- MultiresLevel *lvl1= me->mr->levels.first;
- const int last= lvl1->totedge * pow(2, me->mr->current-1);
- for(i=0; i<last; ++i) {
- const int ndx= i / pow(2, me->mr->current-1);
-
- if(em) {
- medge_flag_to_eed(me->mr->edge_flags[ndx], me->mr->edge_creases[ndx], eed);
- eed= eed->next;
- }
- else {
- me->medge[i].flag= me->mr->edge_flags[ndx];
- me->medge[i].crease= me->mr->edge_creases[ndx];
- }
- }
- }
-
- if(em) {
- eed= em->edges.first;
- for(i=0, eed= em->edges.first; i<lvl->totedge; ++i, eed= eed->next) {
- eed->h= me->mr->verts[lvl->edges[i].v[0]].flag & ME_HIDE ||
- me->mr->verts[lvl->edges[i].v[1]].flag & ME_HIDE;
- }
- }
-
- EM_select_flush();
-
- multires_customdata_to_mesh(me, em, lvl, &me->mr->vdata, em ? &em->vdata : &me->vdata, CD_MDEFORMVERT);
- multires_customdata_to_mesh(me, em, lvl, &me->mr->fdata, em ? &em->fdata : &me->fdata, CD_MTFACE);
-
- /* Colors */
- if(me->mr->use_col) {
- MCol c[4];
- EditFace *efa= NULL;
- CustomData *src= em ? &em->fdata : &me->fdata;
- if(em) {
- if(me->mr->use_col) EM_add_data_layer(src, CD_MCOL);
- efa= em->faces.first;
- }
- else {
- if(me->mr->use_col) me->mcol= CustomData_add_layer(src, CD_MCOL, CD_CALLOC, NULL, me->totface);
- }
-
- for(i=0; i<lvl->totface; ++i) {
- if(em) {
- if(me->mr->use_col) {
- multires_to_mcol(&lvl->colfaces[i], c);
- CustomData_em_set(src, efa->data, CD_MCOL, c);
- }
- efa= efa->next;
- }
- else if(me->mr->use_col) multires_to_mcol(&lvl->colfaces[i], &me->mcol[i*4]);
- }
-
- }
-
- mesh_update_customdata_pointers(me);
-
- if(em) {
- MEM_freeN(eves);
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- recalc_editnormals();
- } else {
- multires_edge_level_update(ob,me);
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
- }
-
- /* friendly check for background render */
- if(G.background==0) {
- object_handle_update(ob);
- countall();
-
- if(G.vd && G.vd->depths) G.vd->depths->damaged= 1;
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWIMAGE, 0);
- }
-}
-
-void multires_update_colors(Mesh *me)
-{
- MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
- MultiresCol *pr_deltas= NULL, *cr_deltas= NULL;
- EditMesh *em= G.obedit ? G.editMesh : NULL;
- CustomData *src= em ? &em->fdata : &me->fdata;
- EditFace *efa= NULL;
- unsigned i,j,curf= 0;
-
- if(me->mr->use_col) {
- /* Calc initial deltas */
- cr_deltas= MEM_callocN(sizeof(MultiresCol)*lvl->totface*4,"initial color/uv deltas");
-
- if(em) efa= em->faces.first;
- for(i=0; i<lvl->totface; ++i) {
- MCol *col= em ? CustomData_em_get(src, efa->data, CD_MCOL) : &me->mcol[i*4];
- for(j=0; j<4; ++j) {
- if(me->mr->use_col) {
- cr_deltas[i*4+j].a= col[j].a - lvl->colfaces[i].col[j].a;
- cr_deltas[i*4+j].r= col[j].r - lvl->colfaces[i].col[j].r;
- cr_deltas[i*4+j].g= col[j].g - lvl->colfaces[i].col[j].g;
- cr_deltas[i*4+j].b= col[j].b - lvl->colfaces[i].col[j].b;
- }
- }
- if(em) efa= efa->next;
- }
-
- /* Update current level */
- if(em) efa= em->faces.first;
- for(i=0; i<lvl->totface; ++i) {
- MultiresColFace *f= &lvl->colfaces[i];
-
- if(me->mr->use_col)
- mcol_to_multires(f, em ? CustomData_em_get(src, efa->data, CD_MCOL) : &me->mcol[i*4]);
-
- if(em) efa= efa->next;
- }
-
- /* Update higher levels */
- lvl= lvl->next;
- while(lvl) {
- /* Set up new deltas, but keep the ones from the previous level */
- if(pr_deltas) MEM_freeN(pr_deltas);
- pr_deltas= cr_deltas;
- cr_deltas= MEM_callocN(sizeof(MultiresCol)*lvl->totface*4,"color deltas");
-
- curf= 0;
- for(i=0; i<lvl->prev->totface; ++i) {
- const char sides= lvl->prev->faces[i].v[3]?4:3;
- MultiresCol cntr;
-
- /* Find average color of 4 (or 3 for triangle) verts */
- multires_col_avg(&cntr,&pr_deltas[i*4],sides);
-
- for(j=0; j<sides; ++j) {
- multires_col_avg2(&cr_deltas[curf*4],
- &pr_deltas[i*4+j],
- &pr_deltas[i*4+(j==0?sides-1:j-1)]);
- cr_deltas[curf*4+1]= pr_deltas[i*4+j];
- multires_col_avg2(&cr_deltas[curf*4+2],
- &pr_deltas[i*4+j],
- &pr_deltas[i*4+(j==sides-1?0:j+1)]);
- cr_deltas[curf*4+3]= cntr;
- ++curf;
- }
- }
-
- for(i=0; i<lvl->totface; ++i) {
- for(j=0; j<4; ++j) {
- lvl->colfaces[i].col[j].a+= cr_deltas[i*4+j].a;
- lvl->colfaces[i].col[j].r+= cr_deltas[i*4+j].r;
- lvl->colfaces[i].col[j].g+= cr_deltas[i*4+j].g;
- lvl->colfaces[i].col[j].b+= cr_deltas[i*4+j].b;
- }
- }
-
- lvl= lvl->next;
- }
- if(pr_deltas) MEM_freeN(pr_deltas);
- if(cr_deltas) MEM_freeN(cr_deltas);
-
- /* Update lower levels */
- lvl= me->mr->levels.last;
- lvl= lvl->prev;
- while(lvl) {
- MultiresColFace *nf= lvl->next->colfaces;
- for(i=0; i<lvl->totface; ++i) {
- MultiresFace *f= &lvl->faces[i];
- for(j=0; j<(f->v[3]?4:3); ++j) {
- lvl->colfaces[i].col[j]= nf->col[1];
- ++nf;
- }
- }
- lvl= lvl->prev;
- }
- }
-}
-
-/* Update vertex locations and vertex flags */
-void multires_update_vertices(Mesh *me, EditMesh *em)
-{
- MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl= NULL,
- *last_lvl= me->mr->levels.last;
- vec3f *pr_deltas= NULL, *cr_deltas= NULL, *swap_deltas= NULL;
- EditVert *eve= NULL;
- MultiApplyData data;
- int i, j;
-
- /* Prepare deltas */
- pr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 1");
- cr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 2");
-
- /* Calculate initial deltas -- current mesh subtracted from current level*/
- if(em) eve= em->verts.first;
- for(i=0; i<cr_lvl->totvert; ++i) {
- if(em) {
- VecSubf(&cr_deltas[i].x, eve->co, me->mr->verts[i].co);
- eve= eve->next;
- } else
- VecSubf(&cr_deltas[i].x, me->mvert[i].co, me->mr->verts[i].co);
- }
-
-
- /* Copy current level's vertex flags and clear the rest */
- if(em) eve= em->verts.first;
- for(i=0; i < last_lvl->totvert; ++i) {
- if(i < cr_lvl->totvert) {
- MVert mvflag;
- multires_get_vert(&mvflag, eve, &me->mvert[i], i);
- if(em) eve= eve->next;
- me->mr->verts[i].flag= mvflag.flag;
- }
- else
- me->mr->verts[i].flag= 0;
- }
-
- /* If already on the highest level, copy current verts (including flags) into current level */
- if(cr_lvl == last_lvl) {
- if(em)
- eve= em->verts.first;
- for(i=0; i<cr_lvl->totvert; ++i) {
- multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i);
- if(em) eve= eve->next;
- }
- }
-
- /* Update higher levels */
- pr_lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
- cr_lvl= pr_lvl->next;
- while(cr_lvl) {
- multires_calc_temp_data(pr_lvl);
-
- /* Swap the old/new deltas */
- swap_deltas= pr_deltas;
- pr_deltas= cr_deltas;
- cr_deltas= swap_deltas;
-
- /* Calculate and add new deltas
- ============================ */
- for(i=0; i<pr_lvl->totface; ++i) {
- const MultiresFace *f= &pr_lvl->faces[i];
- data.corner1= &pr_deltas[f->v[0]].x;
- data.corner2= &pr_deltas[f->v[1]].x;
- data.corner3= &pr_deltas[f->v[2]].x;
- data.corner4= &pr_deltas[f->v[3]].x;
- data.quad= f->v[3] ? 1 : 0;
- multi_apply(&cr_deltas[f->mid].x, &data, 3, catmullclark_smooth_face);
-
- for(j=0; j<(data.quad?4:3); ++j)
- me->mr->verts[f->mid].flag |= me->mr->verts[f->v[j]].flag;
- }
-
- for(i=0; i<pr_lvl->totedge; ++i) {
- const MultiresEdge *e= &pr_lvl->edges[i];
- data.boundary= pr_lvl->edge_boundary_states[i];
- edge_face_neighbor_midpoints_accum(&data,pr_lvl,cr_deltas,sizeof(vec3f),e);
- data.endpoint1= &pr_deltas[e->v[0]].x;
- data.endpoint2= &pr_deltas[e->v[1]].x;
- multi_apply(&cr_deltas[e->mid].x, &data, 3, catmullclark_smooth_edge);
-
- for(j=0; j<2; ++j)
- me->mr->verts[e->mid].flag |= me->mr->verts[e->v[j]].flag;
- }
-
- for(i=0; i<pr_lvl->totvert; ++i) {
- data.boundary= multires_vert_is_boundary(pr_lvl,i);
- data.original= &pr_deltas[i].x;
- data.edge_count= BLI_countlist(&pr_lvl->vert_edge_map[i]);
- if(data.boundary)
- boundary_edges_average(&data,pr_lvl,pr_deltas,sizeof(vec3f),i);
- else {
- vert_face_neighbor_midpoints_average(&data,pr_lvl,cr_deltas,sizeof(vec3f),i);
- vert_edge_neighbor_midpoints_average(&data,pr_lvl,pr_deltas,sizeof(vec3f),i);
- }
- multi_apply(&cr_deltas[i].x, &data, 3, catmullclark_smooth_vert);
- }
-
- /* Apply deltas to vertex locations */
- for(i=0; (cr_lvl == last_lvl) && (i < cr_lvl->totvert); ++i) {
- VecAddf(me->mr->verts[i].co,
- me->mr->verts[i].co,
- &cr_deltas[i].x);
- }
-
- multires_free_temp_data(pr_lvl);
-
- pr_lvl= pr_lvl->next;
- cr_lvl= cr_lvl->next;
- }
- if(pr_deltas) MEM_freeN(pr_deltas);
- if(cr_deltas) MEM_freeN(cr_deltas);
-
-}
-
-void multires_update_faces(Mesh *me, EditMesh *em)
-{
- MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl= NULL,
- *last_lvl= me->mr->levels.last;
- char *pr_flag_damaged= NULL, *cr_flag_damaged= NULL, *or_flag_damaged= NULL,
- *pr_mat_damaged= NULL, *cr_mat_damaged= NULL, *or_mat_damaged= NULL, *swap= NULL;
- EditFace *efa= NULL;
- unsigned i,j,curf;
-
- /* Find for each face whether flag/mat has changed */
- pr_flag_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "flag_damaged 1");
- cr_flag_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "flag_damaged 1");
- pr_mat_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "mat_damaged 1");
- cr_mat_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "mat_damaged 1");
- if(em) efa= em->faces.first;
- for(i=0; i<cr_lvl->totface; ++i) {
- MultiresFace mftmp;
- multires_get_face(&mftmp, efa, &me->mface[i]);
- if(cr_lvl->faces[i].flag != mftmp.flag)
- cr_flag_damaged[i]= 1;
- if(cr_lvl->faces[i].mat_nr != mftmp.mat_nr)
- cr_mat_damaged[i]= 1;
-
- /* Update current level */
- cr_lvl->faces[i].flag= mftmp.flag;
- cr_lvl->faces[i].mat_nr= mftmp.mat_nr;
-
- if(em) efa= efa->next;
- }
- or_flag_damaged= MEM_dupallocN(cr_flag_damaged);
- or_mat_damaged= MEM_dupallocN(cr_mat_damaged);
-
- /* Update lower levels */
- cr_lvl= cr_lvl->prev;
- while(cr_lvl) {
- swap= pr_flag_damaged;
- pr_flag_damaged= cr_flag_damaged;
- cr_flag_damaged= swap;
-
- swap= pr_mat_damaged;
- pr_mat_damaged= cr_mat_damaged;
- cr_mat_damaged= swap;
-
- curf= 0;
- for(i=0; i<cr_lvl->totface; ++i) {
- const int sides= cr_lvl->faces[i].v[3] ? 4 : 3;
-
- /* Check damages */
- for(j=0; j<sides; ++j, ++curf) {
- if(pr_flag_damaged[curf]) {
- cr_lvl->faces[i].flag= cr_lvl->next->faces[curf].flag;
- cr_flag_damaged[i]= 1;
- }
- if(pr_mat_damaged[curf]) {
- cr_lvl->faces[i].mat_nr= cr_lvl->next->faces[curf].mat_nr;
- cr_mat_damaged[i]= 1;
- }
- }
- }
-
- cr_lvl= cr_lvl->prev;
- }
-
- /* Clear to original damages */
- if(cr_flag_damaged) MEM_freeN(cr_flag_damaged);
- if(cr_mat_damaged) MEM_freeN(cr_mat_damaged);
- cr_flag_damaged= or_flag_damaged;
- cr_mat_damaged= or_mat_damaged;
-
- /* Update higher levels */
- pr_lvl= current_level(me->mr);
- cr_lvl= pr_lvl->next;
- while(cr_lvl) {
- swap= pr_flag_damaged;
- pr_flag_damaged= cr_flag_damaged;
- cr_flag_damaged= swap;
-
- swap= pr_mat_damaged;
- pr_mat_damaged= cr_mat_damaged;
- cr_mat_damaged= swap;
-
- /* Update faces */
- for(i=0, curf= 0; i<pr_lvl->totface; ++i) {
- const int sides= cr_lvl->prev->faces[i].v[3] ? 4 : 3;
- for(j=0; j<sides; ++j, ++curf) {
- if(pr_flag_damaged[i]) {
- cr_lvl->faces[curf].flag= pr_lvl->faces[i].flag;
- cr_flag_damaged[curf]= 1;
- }
- if(pr_mat_damaged[i]) {
- cr_lvl->faces[curf].mat_nr= pr_lvl->faces[i].mat_nr;
- cr_mat_damaged[curf]= 1;
- }
- }
- }
-
- pr_lvl= pr_lvl->next;
- cr_lvl= cr_lvl->next;
- }
-
- if(pr_flag_damaged) MEM_freeN(pr_flag_damaged);
- if(cr_flag_damaged) MEM_freeN(cr_flag_damaged);
- if(pr_mat_damaged) MEM_freeN(pr_mat_damaged);
- if(cr_mat_damaged) MEM_freeN(cr_mat_damaged);
-}
-
-void multires_update_levels(Mesh *me, const int render)
-{
- EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL;
-
- multires_update_first_level(me, em);
- multires_update_vertices(me, em);
- multires_update_faces(me, em);
- multires_update_colors(me);
-}
-
-void multires_calc_temp_data(MultiresLevel *lvl)
-{
- unsigned i, j, emax;
- MultiresMapNode *indexnode= NULL;
-
- lvl->map_mem= MEM_mallocN(sizeof(MultiresMapNode)*(lvl->totedge*2 + lvl->totface*4), "map_mem");
- indexnode= lvl->map_mem;
-
- /* edge map */
- lvl->vert_edge_map= MEM_callocN(sizeof(ListBase)*lvl->totvert,"vert_edge_map");
- for(i=0; i<lvl->totedge; ++i) {
- for(j=0; j<2; ++j, ++indexnode) {
- indexnode->Index= i;
- BLI_addtail(&lvl->vert_edge_map[lvl->edges[i].v[j]], indexnode);
- }
- }
-
- /* face map */
- lvl->vert_face_map= MEM_callocN(sizeof(ListBase)*lvl->totvert,"vert_face_map");
- for(i=0; i<lvl->totface; ++i){
- for(j=0; j<(lvl->faces[i].v[3]?4:3); ++j, ++indexnode) {
- indexnode->Index= i;
- BLI_addtail(&lvl->vert_face_map[lvl->faces[i].v[j]], indexnode);
- }
- }
-
- /* edge boundaries */
- emax = (lvl->prev ? (lvl->prev->totedge * 2) : lvl->totedge);
- lvl->edge_boundary_states= MEM_callocN(sizeof(char)*lvl->totedge, "edge_boundary_states");
- for(i=0; i<emax; ++i) {
- MultiresMapNode *n1= lvl->vert_face_map[lvl->edges[i].v[0]].first;
- unsigned total= 0;
-
- lvl->edge_boundary_states[i] = 1;
- while(n1 && lvl->edge_boundary_states[i] == 1) {
- MultiresMapNode *n2= lvl->vert_face_map[lvl->edges[i].v[1]].first;
- while(n2) {
- if(n1->Index == n2->Index) {
- ++total;
-
- if(total > 1) {
- lvl->edge_boundary_states[i] = 0;
- break;
- }
- }
-
- n2= n2->next;
- }
- n1= n1->next;
- }
- }
-}
-
-void multires_edge_level_update(void *ob, void *me_v)
-{
- if(!G.obedit) {
- Mesh *me= me_v;
- MultiresLevel *cr_lvl= BLI_findlink(&me->mr->levels,me->mr->current-1);
- MultiresLevel *edge_lvl= BLI_findlink(&me->mr->levels,me->mr->edgelvl-1);
- const int threshold= edge_lvl->totedge * powf(2, me->mr->current - me->mr->edgelvl);
- unsigned i;
-
- for(i=0; i<cr_lvl->totedge; ++i) {
- const int ndx= me->pv ? me->pv->edge_map[i] : i;
- if(ndx != -1) { /* -1= hidden edge */
- 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;
- }
- }
-
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- allqueue(REDRAWVIEW3D, 0);
- }
+ multires_edge_level_update(ob_v, me_v);
+ allqueue(REDRAWVIEW3D, 0);
}
int multires_modifier_warning()
diff --git a/source/blender/src/outliner.c b/source/blender/src/outliner.c
index 37d25e4f100..7f4736d9dd4 100644
--- a/source/blender/src/outliner.c
+++ b/source/blender/src/outliner.c
@@ -29,6 +29,7 @@
#include <string.h>
#include <stdlib.h>
+#include <stddef.h>
#include "MEM_guardedalloc.h"
@@ -138,6 +139,8 @@ extern ListBase server_list;
/* ******************** PROTOTYPES ***************** */
static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int startx, int *starty);
+static void outliner_do_object_operation(SpaceOops *soops, ListBase *lb,
+ void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *));
/* ******************** PERSISTANT DATA ***************** */
@@ -229,6 +232,7 @@ static void check_persistant(SpaceOops *soops, TreeElement *te, ID *id, short ty
if(type) tselem->nr= nr; // we're picky! :)
else tselem->nr= 0;
tselem->id= id;
+ tselem->used = 0;
tselem->flag= TSE_CLOSED;
te->store_index= ts->usedelem;
@@ -443,6 +447,10 @@ static void outliner_add_passes(SpaceOops *soops, TreeElement *tenla, ID *id, Sc
te->name= "UV";
te->directdata= &srl->passflag;
+ te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_MIST);
+ te->name= "Mist";
+ te->directdata= &srl->passflag;
+
te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, SCE_PASS_INDEXOB);
te->name= "Index Object";
te->directdata= &srl->passflag;
@@ -591,19 +599,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? */
}
@@ -632,6 +643,21 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
if(pchan->next) pchan->next->prev= pchan;
}
}
+
+ /* Pose Groups */
+ if(ob->pose->agroups.first) {
+ bActionGroup *agrp;
+ TreeElement *ten;
+ TreeElement *tenla= outliner_add_element(soops, &te->subtree, ob, te, TSE_POSEGRP_BASE, 0);
+ int a= 0;
+
+ tenla->name= "Bone Groups";
+ for (agrp=ob->pose->agroups.first; agrp; agrp=agrp->next, a++) {
+ ten= outliner_add_element(soops, &tenla->subtree, ob, tenla, TSE_POSEGRP, a);
+ ten->name= agrp->name;
+ ten->directdata= agrp;
+ }
+ }
}
outliner_add_element(soops, &te->subtree, ob->ipo, te, 0, 0);
@@ -641,20 +667,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? */
}
@@ -948,7 +977,7 @@ static void outliner_build_tree(SpaceOops *soops)
outliner_free_tree(&soops->tree);
outliner_storage_cleanup(soops);
-
+
/* clear ob id.new flags */
for(ob= G.main->object.first; ob; ob= ob->id.next) ob->id.newid= NULL;
@@ -1141,6 +1170,75 @@ static void outliner_set_flag(SpaceOops *soops, ListBase *lb, short flag, short
}
}
+void object_toggle_visibility_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+{
+ Base *base= (Base *)te->directdata;
+
+ if(base==NULL) base= object_in_scene((Object *)tselem->id, G.scene);
+ if(base) {
+ base->object->restrictflag^=OB_RESTRICT_VIEW;
+ }
+}
+
+void outliner_toggle_visibility(struct ScrArea *sa)
+{
+ SpaceOops *soops= sa->spacedata.first;
+
+ outliner_do_object_operation(soops, &soops->tree, object_toggle_visibility_cb);
+
+ BIF_undo_push("Outliner toggle selectability");
+
+ allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWOOPS, 0);
+ allqueue(REDRAWINFO, 1);
+}
+
+static void object_toggle_selectability_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+{
+ Base *base= (Base *)te->directdata;
+
+ if(base==NULL) base= object_in_scene((Object *)tselem->id, G.scene);
+ if(base) {
+ base->object->restrictflag^=OB_RESTRICT_SELECT;
+ }
+}
+
+void outliner_toggle_selectability(struct ScrArea *sa)
+{
+ SpaceOops *soops= sa->spacedata.first;
+
+ outliner_do_object_operation(soops, &soops->tree, object_toggle_selectability_cb);
+
+ BIF_undo_push("Outliner toggle selectability");
+
+ allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWOOPS, 0);
+ allqueue(REDRAWINFO, 1);
+}
+
+void object_toggle_renderability_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+{
+ Base *base= (Base *)te->directdata;
+
+ if(base==NULL) base= object_in_scene((Object *)tselem->id, G.scene);
+ if(base) {
+ base->object->restrictflag^=OB_RESTRICT_RENDER;
+ }
+}
+
+void outliner_toggle_renderability(struct ScrArea *sa)
+{
+ SpaceOops *soops= sa->spacedata.first;
+
+ outliner_do_object_operation(soops, &soops->tree, object_toggle_renderability_cb);
+
+ BIF_undo_push("Outliner toggle renderability");
+
+ allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWOOPS, 0);
+ allqueue(REDRAWINFO, 1);
+}
+
void outliner_toggle_visible(struct ScrArea *sa)
{
SpaceOops *soops= sa->spacedata.first;
@@ -1609,6 +1707,24 @@ static int tree_element_active_nla_action(TreeElement *te, TreeStoreElem *tselem
return 0;
}
+static int tree_element_active_posegroup(TreeElement *te, TreeStoreElem *tselem, int set)
+{
+ Object *ob= (Object *)tselem->id;
+
+ if(set) {
+ if (ob->pose) {
+ ob->pose->active_group= te->index+1;
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ }
+ else {
+ if(ob==OBACT && ob->pose) {
+ if (ob->pose->active_group== te->index+1) return 1;
+ }
+ }
+ return 0;
+}
+
static int tree_element_active_posechannel(TreeElement *te, TreeStoreElem *tselem, int set)
{
Object *ob= (Object *)tselem->id;
@@ -1790,6 +1906,8 @@ static int tree_element_type_active(SpaceOops *soops, TreeElement *te, TreeStore
return tree_element_active_constraint(te, tselem, set);
case TSE_R_LAYER:
return tree_element_active_renderlayer(te, tselem, set);
+ case TSE_POSEGRP:
+ return tree_element_active_posegroup(te, tselem, set);
}
return 0;
}
@@ -1908,21 +2026,17 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
/* activate a name button? */
if(event==LEFTMOUSE) {
- if (G.qual & LR_CTRLKEY) {
- if(ELEM8(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
+ if (G.qual == LR_CTRLKEY) {
+ if(ELEM9(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
error("Cannot edit builtin name");
- else if(tselem->id->lib)
+ else if(tselem->id->lib) {
error_libdata();
- else {
+ } else if(te->idcode == ID_LI && te->parent) {
+ error("Cannot edit the path of an indirectly linked library");
+ } else {
tselem->flag |= TSE_TEXTBUT;
}
} else {
-
- if (G.qual & LR_SHIFTKEY) {
- if(tselem->id->lib && tselem->type==0) {
- notice(tselem->id->lib->name);
- }
- }
/* always makes active object */
tree_element_active_object(soops, te);
@@ -2355,9 +2469,11 @@ void outliner_select(struct ScrArea *sa )
/* ************ SELECTION OPERATIONS ********* */
-static int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0; // globals, euh... you can do better
-
-static void set_operation_types(SpaceOops *soops, ListBase *lb)
+static void set_operation_types(SpaceOops *soops, ListBase *lb,
+ int *scenelevel,
+ int *objectlevel,
+ int *idlevel,
+ int *datalevel)
{
TreeElement *te;
TreeStoreElem *tselem;
@@ -2367,22 +2483,22 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb)
if(tselem->flag & TSE_SELECTED) {
if(tselem->type) {
#ifdef WITH_VERSE
- if(te->idcode==ID_VS) datalevel= TSE_VERSE_SESSION;
- else if(te->idcode==ID_VN) datalevel= TSE_VERSE_OBJ_NODE;
- else if(datalevel==0) datalevel= tselem->type;
+ if(te->idcode==ID_VS) *datalevel= TSE_VERSE_SESSION;
+ else if(te->idcode==ID_VN) *datalevel= TSE_VERSE_OBJ_NODE;
+ else if(*datalevel==0) *datalevel= tselem->type;
#else
- if(datalevel==0) datalevel= tselem->type;
+ if(*datalevel==0) *datalevel= tselem->type;
#endif
- else if(datalevel!=tselem->type) datalevel= -1;
+ else if(*datalevel!=tselem->type) *datalevel= -1;
}
else {
int idcode= GS(tselem->id->name);
switch(idcode) {
case ID_SCE:
- scenelevel= 1;
+ *scenelevel= 1;
break;
case ID_OB:
- objectlevel= 1;
+ *objectlevel= 1;
break;
case ID_ME: case ID_CU: case ID_MB: case ID_LT:
@@ -2390,13 +2506,16 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb)
case ID_MA: case ID_TE: case ID_IP: case ID_IM:
case ID_SO: case ID_KE: case ID_WO: case ID_AC:
case ID_NLA: case ID_TXT: case ID_GR:
- if(idlevel==0) idlevel= idcode;
- else if(idlevel!=idcode) idlevel= -1;
+ if(*idlevel==0) *idlevel= idcode;
+ else if(*idlevel!=idcode) *idlevel= -1;
break;
}
}
}
- if((tselem->flag & TSE_CLOSED)==0) set_operation_types(soops, &te->subtree);
+ if((tselem->flag & TSE_CLOSED)==0) {
+ set_operation_types(soops, &te->subtree,
+ scenelevel, objectlevel, idlevel, datalevel);
+ }
}
}
@@ -2552,6 +2671,30 @@ static void id_local_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tse
}
}
+static void group_linkobs2scene_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+{
+ Group *group= (Group *)tselem->id;
+ GroupObject *gob;
+ Base *base;
+
+ for(gob=group->gobject.first; gob; gob=gob->next) {
+ base= object_in_scene(gob->ob, G.scene);
+ if (base) {
+ base->object->flag |= SELECT;
+ base->flag |= SELECT;
+ } else {
+
+ /* link to scene */
+ base= MEM_callocN( sizeof(Base), "add_base");
+ BLI_addhead(&G.scene->base, base);
+ base->lay= (1<<20)-1; /*G.vd->lay;*/ /* would be nice to use the 3d layer but the include's not here */
+ gob->ob->flag |= SELECT;
+ base->flag = gob->ob->flag;
+ base->object= gob->ob;
+ }
+ }
+}
+
static void outliner_do_object_operation(SpaceOops *soops, ListBase *lb,
void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *))
{
@@ -2667,18 +2810,16 @@ void outliner_del(ScrArea *sa)
void outliner_operation_menu(ScrArea *sa)
{
SpaceOops *soops= sa->spacedata.first;
+ int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0;
- // bad globals
- scenelevel= objectlevel= idlevel= datalevel=0;
-
- set_operation_types(soops, &soops->tree);
+ set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel);
if(scenelevel) {
if(objectlevel || datalevel || idlevel) error("Mixed selection");
//else pupmenu("Scene Operations%t|Delete");
}
else if(objectlevel) {
- 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 */
+ short event= pupmenu("Select%x1|Deselect%x2|Delete%x4|Toggle Visible%x6|Toggle Selectable%x7|Toggle Renderable%x8"); /* make local: does not work... it doesn't set lib_extern flags... so data gets lost */
if(event>0) {
char *str="";
@@ -2702,7 +2843,18 @@ void outliner_operation_menu(ScrArea *sa)
outliner_do_object_operation(soops, &soops->tree, id_local_cb);
str= "Localized Objects";
}
-
+ else if(event==6) {
+ outliner_do_object_operation(soops, &soops->tree, object_toggle_visibility_cb);
+ str= "Toggle Visibility";
+ }
+ else if(event==7) {
+ outliner_do_object_operation(soops, &soops->tree, object_toggle_selectability_cb);
+ str= "Toggle Selectability";
+ }
+ else if(event==8) {
+ outliner_do_object_operation(soops, &soops->tree, object_toggle_renderability_cb);
+ str= "Toggle Renderability";
+ }
countall();
BIF_undo_push(str);
@@ -2712,7 +2864,12 @@ void outliner_operation_menu(ScrArea *sa)
else if(idlevel) {
if(idlevel==-1 || datalevel) error("Mixed selection");
else {
- short event= pupmenu("Unlink %x1|Make Local %x2");
+ short event;
+ if (idlevel==ID_GR)
+ event = pupmenu("Unlink %x1|Make Local %x2|Link Group Objects to Scene%x3");
+ else
+ event = pupmenu("Unlink %x1|Make Local %x2");
+
if(event==1) {
switch(idlevel) {
@@ -2740,6 +2897,10 @@ void outliner_operation_menu(ScrArea *sa)
BIF_undo_push("Localized Data");
allqueue(REDRAWALL, 0);
}
+ else if(event==3 && idlevel==ID_GR) {
+ outliner_do_libdata_operation(soops, &soops->tree, group_linkobs2scene_cb);
+ BIF_undo_push("Link Group Objects to Scene");
+ }
}
}
else if(datalevel) {
@@ -2852,6 +3013,8 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen
BIF_icon_draw(x, y, ICON_LAMP_DEHLT); break;
case TSE_LINKED_MAT:
BIF_icon_draw(x, y, ICON_MATERIAL_DEHLT); break;
+ case TSE_POSEGRP_BASE:
+ BIF_icon_draw(x, y, ICON_VERTEXSEL); break;
#ifdef WITH_VERSE
case ID_VS:
@@ -3373,7 +3536,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");
}
@@ -3441,6 +3604,15 @@ static void namebutton_cb(void *tep, void *oldnamep)
allqueue(REDRAWVIEW3D, 1);
allqueue(REDRAWBUTSEDIT, 0);
break;
+ case TSE_POSEGRP:
+ {
+ Object *ob= (Object *)tselem->id; // id = object
+ bActionGroup *grp= te->directdata;
+
+ BLI_uniquename(&ob->pose->agroups, grp, "Group", offsetof(bActionGroup, name), 32);
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ break;
case TSE_R_LAYER:
allqueue(REDRAWOOPS, 0);
allqueue(REDRAWBUTSSCENE, 0);
diff --git a/source/blender/src/parametrizer.c b/source/blender/src/parametrizer.c
index 62a07a437b0..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);
}
}
@@ -2796,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();
@@ -2807,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);
@@ -2826,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 */
@@ -2838,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]);
}
}
}
@@ -2848,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;
@@ -2870,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);
@@ -2890,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);
@@ -2905,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/playanim.c b/source/blender/src/playanim.c
index 65853a841d6..e94366571db 100644
--- a/source/blender/src/playanim.c
+++ b/source/blender/src/playanim.c
@@ -201,11 +201,11 @@ static void toscreen(Pict *picture, struct ImBuf *ibuf)
pupdate_time();
- if(picture && (qualN & LMOUSE)) {
+ if(picture && (qualN & (SHIFT|LMOUSE))) {
char str[256];
cpack(-1);
glRasterPos2f(0.02f, 0.03f);
- sprintf(str, "%s", picture->name);
+ sprintf(str, "%s | %.2f frames/s\n", picture->name, 1.0 / swaptime);
BMF_DrawString(G.fonts, str);
}
@@ -362,6 +362,22 @@ void playanim(int argc, char **argv)
printf("too few arguments for -p (need 2): skipping\n");
}
break;
+ case 'f':
+ if (argc>3) {
+ double fps = atof(argv[2]);
+ double fps_base= atof(argv[3]);
+ if (fps == 0) {
+ fps = 1;
+ printf("invalid fps,"
+ "forcing 1\n");
+ }
+ swaptime = fps_base / fps;
+ argc-= 2;
+ argv+= 2;
+ } else {
+ printf("too few arguments for -f (need 2): skipping\n");
+ }
+ break;
default:
printf("unknown option '%c': skipping\n", argv[1][1]);
break;
@@ -657,7 +673,10 @@ void playanim(int argc, char **argv)
swaptime = 1.0 / 30.0;
break;
case PAD4:
- swaptime = 1.0 / 25.0;
+ if (qualN & SHIFT)
+ swaptime = 1.0 / 24.0;
+ else
+ swaptime = 1.0 / 25.0;
break;
case PAD5:
swaptime = 1.0 / 20.0;
diff --git a/source/blender/src/poselib.c b/source/blender/src/poselib.c
new file mode 100644
index 00000000000..351ba93fa59
--- /dev/null
+++ b/source/blender/src/poselib.c
@@ -0,0 +1,1325 @@
+/**
+ * $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
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+
+#include "DNA_listBase.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_depsgraph.h"
+#include "BKE_ipo.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+
+//#include "BIF_keyframing.h"
+#include "BSE_editipo.h"
+
+#include "BDR_drawaction.h"
+#include "BSE_time.h"
+
+#include "BIF_poselib.h"
+#include "BIF_interface.h"
+#include "BIF_editaction.h"
+#include "BIF_space.h"
+#include "BIF_screen.h"
+#include "BIF_toets.h"
+#include "BIF_toolbox.h"
+
+
+#include "blendef.h"
+
+#include "PIL_time.h" /* sleep */
+#include "mydevice.h"
+
+/* ************************************************************* */
+/* == POSE-LIBRARY TOOL FOR BLENDER ==
+ *
+ * Overview:
+ * This tool allows animators to store a set of frequently used poses to dump into
+ * the active action to help in "budget" productions to quickly block out new actions.
+ * It acts as a kind of "glorified clipboard for poses", allowing for naming of poses.
+ *
+ * Features:
+ * - PoseLibs are simply normal Actions
+ * - Each "pose" is simply a set of keyframes that occur on a particular frame
+ * -> a set of TimeMarkers that belong to each Action, help 'label' where a 'pose' can be
+ * found in the Action
+ * - The Scrollwheel or PageUp/Down buttons when used in a special mode or after pressing/holding
+ * [a modifier] key, cycles through the poses available for the active pose's poselib, allowing the
+ * animator to preview what action best suits that pose
+ */
+/* ************************************************************* */
+
+/* gets list of poses in poselib as a string usable for pupmenu() */
+char *poselib_build_poses_menu (bAction *act, char title[])
+{
+ DynStr *pupds= BLI_dynstr_new();
+ TimeMarker *marker;
+ char *str;
+ char buf[64];
+ int i;
+
+ /* add title first */
+ sprintf(buf, "%s%%t|", title);
+ BLI_dynstr_append(pupds, buf);
+
+ /* loop through markers, adding them */
+ for (marker=act->markers.first, i=1; marker; marker=marker->next, i++) {
+ BLI_dynstr_append(pupds, marker->name);
+
+ sprintf(buf, "%%x%d", i);
+ BLI_dynstr_append(pupds, buf);
+
+ if (marker->next)
+ BLI_dynstr_append(pupds, "|");
+ }
+
+ /* convert to normal MEM_malloc'd string */
+ str= BLI_dynstr_get_cstring(pupds);
+ BLI_dynstr_free(pupds);
+
+ return str;
+}
+
+/* gets the first available frame in poselib to store a pose on
+ * - frames start from 1, and a pose should occur on every frame... 0 is error!
+ */
+int poselib_get_free_index (bAction *act)
+{
+ TimeMarker *marker;
+ int low=0, high=0;
+
+ /* sanity checks */
+ if (ELEM(NULL, act, act->markers.first)) return 1;
+
+ /* loop over poses finding various values (poses are not stored in chronological order) */
+ for (marker= act->markers.first; marker; marker= marker->next) {
+ /* only increase low if value is 1 greater than low, to find "gaps" where
+ * poses were removed from the poselib
+ */
+ if (marker->frame == (low + 1))
+ low++;
+
+ /* value replaces high if it is the highest value encountered yet */
+ if (marker->frame > high)
+ high= marker->frame;
+ }
+
+ /* - if low is not equal to high, then low+1 is a gap
+ * - if low is equal to high, then high+1 is the next index (add at end)
+ */
+ if (low < high)
+ return (low + 1);
+ else
+ return (high + 1);
+}
+
+/* returns the active pose for a poselib */
+TimeMarker *poselib_get_active_pose (bAction *act)
+{
+ if ((act) && (act->active_marker))
+ return BLI_findlink(&act->markers, act->active_marker-1);
+ else
+ return NULL;
+}
+
+/* ************************************************************* */
+
+/* Initialise a new poselib (whether it is needed or not) */
+bAction *poselib_init_new (Object *ob)
+{
+ /* sanity checks - only for armatures */
+ if (ELEM(NULL, ob, ob->pose))
+ return NULL;
+
+ /* init object's poselib action (unlink old one if there) */
+ if (ob->poselib)
+ ob->poselib->id.us--;
+ ob->poselib= add_empty_action("PoseLib");
+
+ return ob->poselib;
+}
+
+/* Initialise a new poselib (checks if that needs to happen) */
+bAction *poselib_validate (Object *ob)
+{
+ if (ELEM(NULL, ob, ob->pose))
+ return NULL;
+ else if (ob->poselib == NULL)
+ return poselib_init_new(ob);
+ else
+ return ob->poselib;
+}
+
+
+/* This tool automagically generates/validates poselib data so that it corresponds to the data
+ * in the action. This is for use in making existing actions usable as poselibs.
+ */
+void poselib_validate_act (bAction *act)
+{
+ ListBase keys = {NULL, NULL};
+ ActKeyColumn *ak;
+ TimeMarker *marker, *markern;
+
+ /* validate action and poselib */
+ if (act == NULL) {
+ error("No Action to validate");
+ return;
+ }
+
+ /* determine which frames have keys */
+ action_to_keylist(act, &keys, NULL, NULL);
+
+ /* for each key, make sure there is a correspnding pose */
+ for (ak= keys.first; ak; ak= ak->next) {
+ /* check if any pose matches this */
+ for (marker= act->markers.first; marker; marker= marker->next) {
+ if (IS_EQ(marker->frame, ak->cfra)) {
+ marker->flag = -1;
+ break;
+ }
+ }
+
+ /* add new if none found */
+ if (marker == NULL) {
+ char name[64];
+
+ /* add pose to poselib */
+ marker= MEM_callocN(sizeof(TimeMarker), "ActionMarker");
+
+ strcpy(name, "Pose");
+ BLI_strncpy(marker->name, name, sizeof(marker->name));
+
+ marker->frame= (int)ak->cfra;
+ marker->flag= -1;
+
+ BLI_addtail(&act->markers, marker);
+ }
+ }
+
+ /* remove all untagged poses (unused), and remove all tags */
+ for (marker= act->markers.first; marker; marker= markern) {
+ markern= marker->next;
+
+ if (marker->flag != -1)
+ BLI_freelinkN(&act->markers, marker);
+ else
+ marker->flag = 0;
+ }
+
+ /* free temp memory */
+ BLI_freelistN(&keys);
+
+ BIF_undo_push("PoseLib Validate Action");
+}
+
+/* ************************************************************* */
+
+/* This function adds an ipo-curve of the right type where it's needed */
+static IpoCurve *poselib_verify_icu (Ipo *ipo, int adrcode)
+{
+ IpoCurve *icu;
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ if (icu->adrcode==adrcode) break;
+ }
+ if (icu==NULL) {
+ icu= MEM_callocN(sizeof(IpoCurve), "ipocurve");
+
+ icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ;
+ if (ipo->curve.first==NULL) icu->flag |= IPO_ACTIVE; /* first one added active */
+
+ icu->blocktype= ID_PO;
+ icu->adrcode= adrcode;
+
+ set_icu_vars(icu);
+
+ BLI_addtail(&ipo->curve, icu);
+ }
+
+ return icu;
+}
+
+/* This tool adds the current pose to the poselib
+ * Note: Standard insertkey cannot be used for this due to its limitations
+ */
+void poselib_add_current_pose (Object *ob, int val)
+{
+ bArmature *arm= (ob) ? ob->data : NULL;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bPoseChannel *pchan;
+ TimeMarker *marker;
+ bAction *act;
+ bActionChannel *achan;
+ IpoCurve *icu;
+ int frame;
+ char name[64];
+
+ /* sanity check */
+ if (ELEM3(NULL, ob, arm, pose))
+ return;
+
+ /* mode - add new or replace existing */
+ if (val == 0) {
+ if ((ob->poselib) && (ob->poselib->markers.first)) {
+ val= pupmenu("PoseLib Add Current Pose%t|Add New%x1|Replace Existing%x2");
+ if (val <= 0) return;
+ }
+ else
+ val= 1;
+ }
+
+ if ((ob->poselib) && (val == 2)) {
+ char *menustr;
+
+ /* get poselib */
+ act= ob->poselib;
+
+ /* get the pose to replace */
+ menustr= poselib_build_poses_menu(act, "Replace PoseLib Pose");
+ val= pupmenu(menustr);
+ if (menustr) MEM_freeN(menustr);
+
+ if (val <= 0) return;
+ marker= BLI_findlink(&act->markers, val-1);
+ if (marker == NULL) return;
+
+ /* get the frame from the poselib */
+ frame= marker->frame;
+ }
+ else {
+ /* get name of pose */
+ sprintf(name, "Pose");
+ if (sbutton(name, 0, sizeof(name)-1, "Name: ") == 0)
+ return;
+
+ /* get/initialise poselib */
+ act= poselib_validate(ob);
+
+ /* get frame */
+ frame= poselib_get_free_index(act);
+
+ /* add pose to poselib - replaces any existing pose there */
+ for (marker= act->markers.first; marker; marker= marker->next) {
+ if (marker->frame == frame) {
+ BLI_strncpy(marker->name, name, sizeof(marker->name));
+ break;
+ }
+ }
+ if (marker == NULL) {
+ marker= MEM_callocN(sizeof(TimeMarker), "ActionMarker");
+
+ BLI_strncpy(marker->name, name, sizeof(marker->name));
+ marker->frame= frame;
+
+ BLI_addtail(&act->markers, marker);
+ }
+
+ /* validate name */
+ BLI_uniquename(&act->markers, marker, "Pose", offsetof(TimeMarker, name), 64);
+ }
+
+ /* loop through selected posechannels, keying their pose to the action */
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ /* check if available */
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
+ if (pchan->bone->flag & (BONE_SELECTED|BONE_ACTIVE)) {
+ /* make action-channel if needed */
+ achan= verify_action_channel(act, pchan->name);
+
+ /* make ipo if needed... */
+ if (achan->ipo == NULL)
+ achan->ipo= add_ipo(achan->name, ID_PO);
+
+ /* add missing ipo-curves and insert keys */
+ #define INSERT_KEY_ICU(adrcode, data) {\
+ icu= poselib_verify_icu(achan->ipo, adrcode); \
+ insert_vert_icu(icu, frame, data, 1); \
+ }
+
+ INSERT_KEY_ICU(AC_LOC_X, pchan->loc[0])
+ INSERT_KEY_ICU(AC_LOC_Y, pchan->loc[1])
+ INSERT_KEY_ICU(AC_LOC_Z, pchan->loc[2])
+ INSERT_KEY_ICU(AC_SIZE_X, pchan->size[0])
+ INSERT_KEY_ICU(AC_SIZE_Y, pchan->size[1])
+ INSERT_KEY_ICU(AC_SIZE_Z, pchan->size[2])
+ INSERT_KEY_ICU(AC_QUAT_W, pchan->quat[0])
+ INSERT_KEY_ICU(AC_QUAT_X, pchan->quat[1])
+ INSERT_KEY_ICU(AC_QUAT_Y, pchan->quat[2])
+ INSERT_KEY_ICU(AC_QUAT_Z, pchan->quat[3])
+ }
+ }
+ }
+
+ /* store new 'active' pose number */
+ act->active_marker= BLI_countlist(&act->markers);
+
+ BIF_undo_push("PoseLib Add Pose");
+ allqueue(REDRAWBUTSEDIT, 0);
+}
+
+
+/* This tool removes the pose that the user selected from the poselib (or the provided pose) */
+void poselib_remove_pose (Object *ob, TimeMarker *marker)
+{
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bAction *act= (ob) ? ob->poselib : NULL;
+ bActionChannel *achan;
+ char *menustr;
+ int val;
+
+ /* check if valid poselib */
+ if (ELEM(NULL, ob, pose)) {
+ error("PoseLib is only for Armatures in PoseMode");
+ return;
+ }
+ if (act == NULL) {
+ error("Object doesn't have PoseLib data");
+ return;
+ }
+
+ /* get index (and pointer) of pose to remove */
+ if (marker == NULL) {
+ menustr= poselib_build_poses_menu(act, "Remove PoseLib Pose");
+ val= pupmenu(menustr);
+ if (menustr) MEM_freeN(menustr);
+
+ if (val <= 0) return;
+ marker= BLI_findlink(&act->markers, val-1);
+ if (marker == NULL) return;
+ }
+ else {
+ /* only continue if pose belongs to poselib */
+ if (BLI_findindex(&act->markers, marker) == -1)
+ return;
+ }
+
+ /* remove relevant keyframes */
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ Ipo *ipo= achan->ipo;
+ IpoCurve *icu;
+ BezTriple *bezt;
+ int i;
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ /* check if remove... */
+ if (IS_EQ(bezt->vec[1][0], marker->frame)) {
+ delete_icu_key(icu, i, 1);
+ break;
+ }
+ }
+ }
+ }
+
+ /* remove poselib from list */
+ BLI_freelinkN(&act->markers, marker);
+
+ /* fix active pose number */
+ act->active_marker= 0;
+
+ /* undo + redraw */
+ BIF_undo_push("PoseLib Remove Pose");
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+}
+
+
+/* This tool renames the pose that the user selected from the poselib */
+void poselib_rename_pose (Object *ob)
+{
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bAction *act= (ob) ? ob->poselib : NULL;
+ TimeMarker *marker;
+ char *menustr, name[64];
+ int val;
+
+ /* check if valid poselib */
+ if (ELEM(NULL, ob, pose)) {
+ error("PoseLib is only for Armatures in PoseMode");
+ return;
+ }
+ if (act == NULL) {
+ error("Object doesn't have a valid PoseLib");
+ return;
+ }
+
+ /* get index of pose to remove */
+ menustr= poselib_build_poses_menu(act, "Rename PoseLib Pose");
+ val= pupmenu(menustr);
+ if (menustr) MEM_freeN(menustr);
+
+ if (val <= 0) return;
+ marker= BLI_findlink(&act->markers, val-1);
+ if (marker == NULL) return;
+
+ /* get name of pose */
+ sprintf(name, marker->name);
+ if (sbutton(name, 0, sizeof(name)-1, "Name: ") == 0)
+ return;
+
+ /* copy name and validate it */
+ BLI_strncpy(marker->name, name, sizeof(marker->name));
+ BLI_uniquename(&act->markers, marker, "Pose", offsetof(TimeMarker, name), 64);
+
+ /* undo and update */
+ BIF_undo_push("PoseLib Rename Pose");
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+}
+
+
+/* ************************************************************* */
+
+/* Simple struct for storing settings/data for use during PoseLib preview */
+typedef struct tPoseLib_PreviewData {
+ ListBase backups; /* tPoseLib_Backup structs for restoring poses */
+ ListBase searchp; /* LinkData structs storing list of poses which match the current search-string */
+
+ Object *ob; /* object to work on */
+ bArmature *arm; /* object's armature data */
+ bPose *pose; /* object's pose */
+ bAction *act; /* poselib to use */
+ TimeMarker *marker; /* 'active' pose */
+
+ short state; /* state of main loop */
+ short redraw; /* redraw/update settings during main loop */
+ short flag; /* flags for various settings */
+
+ int selcount; /* number of selected elements to work on */
+ int totcount; /* total number of elements to work on */
+
+ char headerstr[200]; /* Info-text to print in header */
+
+ char searchstr[64]; /* (Part of) Name to search for to filter poses that get shown */
+ char searchold[64]; /* Previously set searchstr (from last loop run), so that we can detected when to rebuild searchp */
+ short search_cursor; /* position of cursor in searchstr (cursor occurs before the item at the nominated index) */
+} tPoseLib_PreviewData;
+
+/* defines for tPoseLib_PreviewData->state values */
+enum {
+ PL_PREVIEW_ERROR = -1,
+ PL_PREVIEW_RUNNING,
+ PL_PREVIEW_CONFIRM,
+ PL_PREVIEW_CANCEL,
+ PL_PREVIEW_RUNONCE
+};
+
+/* defines for tPoseLib_PreviewData->redraw values */
+enum {
+ PL_PREVIEW_NOREDRAW = 0,
+ PL_PREVIEW_REDRAWALL,
+ PL_PREVIEW_REDRAWHEADER,
+};
+
+/* defines for tPoseLib_PreviewData->flag values */
+enum {
+ PL_PREVIEW_FIRSTTIME = (1<<0),
+ PL_PREVIEW_SHOWORIGINAL = (1<<1)
+};
+
+/* ---------------------------- */
+
+/* simple struct for storing backup info */
+typedef struct tPoseLib_Backup {
+ struct tPoseLib_Backup *next, *prev;
+
+ bPoseChannel *pchan;
+ bPoseChannel olddata;
+} tPoseLib_Backup;
+
+/* Makes a copy of the current pose for restoration purposes - doesn't do constraints currently */
+static void poselib_backup_posecopy (tPoseLib_PreviewData *pld)
+{
+ bActionChannel *achan;
+ bPoseChannel *pchan;
+
+ /* for each posechannel that has an actionchannel in */
+ for (achan= pld->act->chanbase.first; achan; achan= achan->next) {
+ /* try to find posechannel */
+ pchan= get_pose_channel(pld->pose, achan->name);
+
+ /* backup data if available */
+ if (pchan) {
+ tPoseLib_Backup *plb;
+
+ /* store backup */
+ plb= MEM_callocN(sizeof(tPoseLib_Backup), "tPoseLib_Backup");
+
+ plb->pchan= pchan;
+ memcpy(&plb->olddata, plb->pchan, sizeof(bPoseChannel));
+
+ BLI_addtail(&pld->backups, plb);
+
+ /* mark as being affected */
+ if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED))
+ pld->selcount++;
+ pld->totcount++;
+ }
+ }
+}
+
+/* Restores original pose - doesn't do constraints currently */
+static void poselib_backup_restore (tPoseLib_PreviewData *pld)
+{
+ tPoseLib_Backup *plb;
+
+ for (plb= pld->backups.first; plb; plb= plb->next) {
+ memcpy(plb->pchan, &plb->olddata, sizeof(bPoseChannel));
+ }
+}
+
+/* ---------------------------- */
+
+/* Applies the appropriate stored pose from the pose-library to the current pose
+ * - assumes that a valid object, with a poselib has been supplied
+ * - gets the string to print in the header
+ * - this code is based on the code for extract_pose_from_action in blenkernel/action.c
+ */
+static void poselib_apply_pose (tPoseLib_PreviewData *pld)
+{
+ bPose *pose= pld->pose;
+ bPoseChannel *pchan;
+ bAction *act= pld->act;
+ bActionChannel *achan;
+ IpoCurve *icu;
+ int frame;
+
+ if (pld->marker)
+ frame= pld->marker->frame;
+ else
+ return;
+
+ /* start applying - only those channels which have a key at this point in time! */
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ short found= 0;
+
+ /* apply this achan? */
+ if (achan->ipo) {
+ /* find a keyframe at this frame - users may not have defined the pose on every channel, so this is necessary */
+ for (icu= achan->ipo->curve.first; icu; icu= icu->next) {
+ BezTriple *bezt;
+ int i;
+
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ if (IN_RANGE(bezt->vec[1][0], (frame-0.5f), (frame+0.5f))) {
+ found= 1;
+ break;
+ }
+ }
+
+ if (found) break;
+ }
+
+ /* apply pose - only if posechannel selected? */
+ if (found) {
+ pchan= get_pose_channel(pose, achan->name);
+
+ if (pchan) {
+ short ok;
+
+ ok= (pchan->bone) ? (pchan->bone->flag & (BONE_SELECTED|BONE_ACTIVE)) : 0;
+ ok= (ok || pld->selcount) ? 1 : 0;
+
+ if (ok) {
+ /* Evaluates and sets the internal ipo values */
+ calc_ipo(achan->ipo, frame);
+ /* This call also sets the pchan flags */
+ execute_action_ipo(achan, pchan);
+ }
+ }
+ }
+ }
+
+ /* tag achan as having been used or not... */
+ if (found)
+ achan->flag |= ACHAN_SELECTED;
+ else
+ achan->flag &= ~ACHAN_SELECTED;
+ }
+}
+
+/* Auto-keys/tags bones affected by the pose used from the poselib */
+static void poselib_keytag_pose (tPoseLib_PreviewData *pld)
+{
+ bPose *pose= pld->pose;
+ bPoseChannel *pchan;
+ bAction *act= pld->act;
+ bActionChannel *achan;
+
+ /* start tagging/keying */
+ for (achan= act->chanbase.first; achan; achan= achan->next) {
+ /* only for selected action channels */
+ if (achan->flag & ACHAN_SELECTED) {
+ pchan= get_pose_channel(pose, achan->name);
+
+ if (pchan) {
+ // TODO: use a standard autokeying function in future (to allow autokeying-editkeys to work)
+ if (IS_AUTOKEY_MODE(NORMAL)) {
+ ID *id= &pld->ob->id;
+
+ /* Set keys on pose */
+ if (pchan->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 (pchan->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 (pchan->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 (pchan->bone)
+ pchan->bone->flag &= ~BONE_UNKEYED;
+ }
+ else {
+ /* add unkeyed tags */
+ if (pchan->bone)
+ pchan->bone->flag |= BONE_UNKEYED;
+ }
+ }
+ }
+ }
+}
+
+/* ---------------------------- */
+
+/* This helper function is called during poselib_preview_poses to find the
+ * pose to preview next (after a change event)
+ */
+static void poselib_preview_get_next (tPoseLib_PreviewData *pld, int step)
+{
+ if ((pld->marker) && (step)) {
+ /* search-string dictates a special approach */
+ if (pld->searchstr[0]) {
+ TimeMarker *marker;
+ LinkData *ld, *ldn, *ldc;
+
+ /* free and rebuild if needed (i.e. if search-str changed) */
+ if (strcmp(pld->searchstr, pld->searchold)) {
+ /* free list of temporary search matches */
+ BLI_freelistN(&pld->searchp);
+
+ /* generate a new list of search matches */
+ for (marker= pld->act->markers.first; marker; marker= marker->next) {
+ /* does the name partially match?
+ * - don't worry about case, to make it easier for users to quickly input a name (or
+ * part of one), which is the whole point of this feature
+ */
+ if (BLI_strcasestr(marker->name, pld->searchstr)) {
+ /* make link-data to store reference to it */
+ ld= MEM_callocN(sizeof(LinkData), "PoseMatch");
+ ld->data= marker;
+ BLI_addtail(&pld->searchp, ld);
+ }
+ }
+
+ /* set current marker to NULL (so that we start from first) */
+ pld->marker= NULL;
+ }
+
+ /* check if any matches */
+ if (pld->searchp.first == NULL) {
+ pld->marker= NULL;
+ return;
+ }
+
+ /* find first match */
+ for (ldc= pld->searchp.first; ldc; ldc= ldc->next) {
+ if (ldc->data == pld->marker)
+ break;
+ }
+ if (ldc == NULL)
+ ldc= pld->searchp.first;
+
+ /* Loop through the matches in a cyclic fashion, incrementing/decrementing step as appropriate
+ * until step == 0. At this point, marker should be the correct marker.
+ */
+ if (step > 0) {
+ for (ld=ldc; ld && step; ld=ldn, step--)
+ ldn= (ld->next) ? ld->next : pld->searchp.first;
+ }
+ else {
+ for (ld=ldc; ld && step; ld=ldn, step++)
+ ldn= (ld->prev) ? ld->prev : pld->searchp.last;
+ }
+
+ /* set marker */
+ if (ld)
+ pld->marker= ld->data;
+ }
+ else {
+ TimeMarker *marker, *next;
+
+ /* Loop through the markers in a cyclic fashion, incrementing/decrementing step as appropriate
+ * until step == 0. At this point, marker should be the correct marker.
+ */
+ if (step > 0) {
+ for (marker=pld->marker; marker && step; marker=next, step--)
+ next= (marker->next) ? marker->next : pld->act->markers.first;
+ }
+ else {
+ for (marker=pld->marker; marker && step; marker=next, step++)
+ next= (marker->prev) ? marker->prev : pld->act->markers.last;
+ }
+
+ /* it should be fairly impossible for marker to be NULL */
+ if (marker)
+ pld->marker= marker;
+ }
+ }
+}
+
+/* specially handle events for searching */
+static void poselib_preview_handle_search (tPoseLib_PreviewData *pld, unsigned short event, char ascii)
+{
+ if (ascii) {
+ /* character to add to the string */
+ short index= pld->search_cursor;
+ short len= (pld->searchstr[0]) ? strlen(pld->searchstr) : 0;
+ short i;
+
+ if (len) {
+ for (i = len; i > index; i--)
+ pld->searchstr[i]= pld->searchstr[i-1];
+ }
+ else
+ pld->searchstr[1]= 0;
+
+ pld->searchstr[index]= ascii;
+ pld->search_cursor++;
+
+ poselib_preview_get_next(pld, 1);
+ pld->redraw = PL_PREVIEW_REDRAWALL;
+ }
+ else {
+ /* some form of string manipulation */
+ switch (event) {
+ case BACKSPACEKEY:
+ if (pld->searchstr[0] && pld->search_cursor) {
+ short len= strlen(pld->searchstr);
+ short index= pld->search_cursor;
+ short i;
+
+ for (i = index; i <= len; i++)
+ pld->searchstr[i-1] = pld->searchstr[i];
+
+ pld->search_cursor--;
+
+ poselib_preview_get_next(pld, 1);
+ pld->redraw = PL_PREVIEW_REDRAWALL;
+ }
+ break;
+
+ case DELKEY:
+ if (pld->searchstr[0] && pld->searchstr[1]) {
+ short len= strlen(pld->searchstr);
+ short index= pld->search_cursor;
+ int i;
+
+ if (index < len) {
+ for (i = index; i < len; i++)
+ pld->searchstr[i] = pld->searchstr[i+1];
+
+ poselib_preview_get_next(pld, 1);
+ pld->redraw = PL_PREVIEW_REDRAWALL;
+ }
+ }
+ break;
+ }
+ }
+}
+
+/* handle events for poselib_preview_poses */
+static void poselib_preview_handle_event (tPoseLib_PreviewData *pld, unsigned short event, char ascii)
+{
+ /* backup stuff that needs to occur before every operation
+ * - make a copy of searchstr, so that we know if cache needs to be rebuilt
+ */
+ strcpy(pld->searchold, pld->searchstr);
+
+ /* if we're currently showing the original pose, only certain events are handled */
+ if (pld->flag & PL_PREVIEW_SHOWORIGINAL) {
+ switch (event) {
+ /* exit - cancel */
+ case ESCKEY:
+ case RIGHTMOUSE:
+ pld->state= PL_PREVIEW_CANCEL;
+ break;
+
+ /* exit - confirm */
+ case LEFTMOUSE:
+ case RETKEY:
+ case PADENTER:
+ case SPACEKEY:
+ pld->state= PL_PREVIEW_CONFIRM;
+ break;
+
+ /* view manipulation */
+ case MIDDLEMOUSE:
+ // there's a little bug here that causes the normal header to get drawn while view is manipulated
+ handle_view_middlemouse();
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ break;
+
+ /* view manipulation, or searching */
+ case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
+ case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
+ case PADPLUSKEY: case PADMINUS:
+ persptoetsen(event);
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ break;
+
+ case TABKEY:
+ pld->flag &= ~PL_PREVIEW_SHOWORIGINAL;
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ break;
+ }
+
+ /* EXITS HERE... */
+ return;
+ }
+
+ /* NORMAL EVENT HANDLING... */
+ /* searching takes priority over normal activity */
+ switch (event) {
+ /* exit - cancel */
+ case ESCKEY:
+ case RIGHTMOUSE:
+ pld->state= PL_PREVIEW_CANCEL;
+ break;
+
+ /* exit - confirm */
+ case LEFTMOUSE:
+ case RETKEY:
+ case PADENTER:
+ case SPACEKEY:
+ pld->state= PL_PREVIEW_CONFIRM;
+ break;
+
+ /* toggle between original pose and poselib pose*/
+ case TABKEY:
+ pld->flag |= PL_PREVIEW_SHOWORIGINAL;
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ break;
+
+ /* change to previous pose (cyclic) */
+ case PAGEUPKEY:
+ case WHEELUPMOUSE:
+ poselib_preview_get_next(pld, -1);
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ break;
+
+ /* change to next pose (cyclic) */
+ case PAGEDOWNKEY:
+ case WHEELDOWNMOUSE:
+ poselib_preview_get_next(pld, 1);
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ break;
+
+ /* jump 5 poses (cyclic, back) */
+ case DOWNARROWKEY:
+ poselib_preview_get_next(pld, -5);
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ break;
+
+ /* jump 5 poses (cyclic, forward) */
+ case UPARROWKEY:
+ poselib_preview_get_next(pld, 5);
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ break;
+
+ /* change to previous pose or searching cursor control */
+ case RIGHTARROWKEY:
+ if (pld->searchstr[0]) {
+ /* move text-cursor to the right */
+ if (pld->search_cursor < strlen(pld->searchstr))
+ pld->search_cursor++;
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ }
+ else {
+ /* change to previous pose (cyclic) */
+ poselib_preview_get_next(pld, -1);
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ }
+ break;
+
+ /* change to next pose or searching cursor control */
+ case LEFTARROWKEY:
+ if (pld->searchstr[0]) {
+ /* move text-cursor to the left */
+ if (pld->search_cursor)
+ pld->search_cursor--;
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ }
+ else {
+ /* change to next pose (cyclic) */
+ poselib_preview_get_next(pld, 1);
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ }
+ break;
+
+ /* change to first pose or start of searching string */
+ case HOMEKEY:
+ if (pld->searchstr[0]) {
+ pld->search_cursor= 0;
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ }
+ else {
+ /* change to first pose */
+ pld->marker= pld->act->markers.first;
+ pld->act->active_marker= 1;
+
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ }
+ break;
+
+ /* change to last pose or start of searching string */
+ case ENDKEY:
+ if (pld->searchstr[0]) {
+ pld->search_cursor= strlen(pld->searchstr);
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ }
+ else {
+ /* change to last pose */
+ pld->marker= pld->act->markers.last;
+ pld->act->active_marker= BLI_countlist(&pld->act->markers);
+
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ }
+ break;
+
+ /* view manipulation */
+ case MIDDLEMOUSE:
+ // there's a little bug here that causes the normal header to get drawn while view is manipulated
+ handle_view_middlemouse();
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ break;
+
+ /* view manipulation, or searching */
+ case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
+ case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
+ case PADPLUSKEY: case PADMINUS:
+ if (pld->searchstr[0]) {
+ poselib_preview_handle_search(pld, event, ascii);
+ }
+ else {
+ persptoetsen(event);
+ pld->redraw= PL_PREVIEW_REDRAWHEADER;
+ }
+ break;
+
+ /* otherwise, assume that searching might be able to handle it */
+ default:
+ poselib_preview_handle_search(pld, event, ascii);
+ break;
+ }
+}
+
+/* ---------------------------- */
+
+/* Init PoseLib Previewing data */
+static void poselib_preview_init_data (tPoseLib_PreviewData *pld, Object *ob, short apply_active)
+{
+ /* clear pld first as it resides on the stack */
+ memset(pld, 0, sizeof(tPoseLib_PreviewData));
+
+ /* get basic data */
+ pld->ob= ob;
+ pld->arm= (ob) ? (ob->data) : NULL;
+ pld->pose= (ob) ? (ob->pose) : NULL;
+ pld->act= (ob) ? (ob->poselib) : NULL;
+ pld->marker= poselib_get_active_pose(pld->act);
+
+ /* check if valid poselib */
+ if (ELEM3(NULL, pld->ob, pld->pose, pld->arm)) {
+ error("PoseLib is only for Armatures in PoseMode");
+ pld->state= PL_PREVIEW_ERROR;
+ return;
+ }
+ if (pld->act == NULL) {
+ error("Object doesn't have a valid PoseLib");
+ pld->state= PL_PREVIEW_ERROR;
+ return;
+ }
+ if (pld->marker == NULL) {
+ if ((apply_active==0) || (pld->act->markers.first)) {
+ /* just use first one then... */
+ pld->marker= pld->act->markers.first;
+ printf("PoseLib had no active pose\n");
+ }
+ else {
+ error("PoseLib has no poses to preview/apply");
+ pld->state= PL_PREVIEW_ERROR;
+ return;
+ }
+ }
+
+ /* make backups for restoring pose */
+ poselib_backup_posecopy(pld);
+
+ /* set flags for running */
+ pld->state= (apply_active) ? PL_PREVIEW_RUNONCE : PL_PREVIEW_RUNNING;
+ pld->redraw= PL_PREVIEW_REDRAWALL;
+ pld->flag= PL_PREVIEW_FIRSTTIME;
+
+ /* set depsgraph flags */
+ /* make sure the lock is set OK, unlock can be accidentally saved? */
+ pld->pose->flag |= POSE_LOCKED;
+ pld->pose->flag &= ~POSE_DO_UNLOCK;
+
+ /* clear strings + search */
+ strcpy(pld->headerstr, "");
+ strcpy(pld->searchstr, "");
+ strcpy(pld->searchold, "");
+ pld->search_cursor= 0;
+}
+
+/* After previewing poses */
+static void poselib_preview_cleanup (tPoseLib_PreviewData *pld)
+{
+ Base *base;
+ Object *ob= pld->ob;
+ bPose *pose= pld->pose;
+ bArmature *arm= pld->arm;
+ bAction *act= pld->act;
+ TimeMarker *marker= pld->marker;
+
+ /* this signal does one recalc on pose, then unlocks, so ESC or edit will work */
+ pose->flag |= POSE_DO_UNLOCK;
+
+ /* clear pose if cancelled */
+ if (pld->state == PL_PREVIEW_CANCEL) {
+ poselib_backup_restore(pld);
+
+ /* old optimize trick... this enforces to bypass the depgraph
+ * - note: code copied from transform_generics.c -> recalcData()
+ */
+ if ((arm->flag & ARM_DELAYDEFORM)==0) {
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); /* sets recalc flags */
+
+ /* bah, softbody exception... recalcdata doesnt reset */
+ for (base= FIRSTBASE; base; base= base->next) {
+ if (base->object->recalc & OB_RECALC_DATA)
+ if (modifiers_isSoftbodyEnabled(base->object)) {
+ base->object->softflag |= OB_SB_REDO;
+ }
+ }
+ }
+ else
+ where_is_pose(ob);
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ else if (pld->state == PL_PREVIEW_CONFIRM) {
+ /* tag poses as appropriate */
+ poselib_keytag_pose(pld);
+
+ /* change active pose setting */
+ act->active_marker= BLI_findindex(&act->markers, marker) + 1;
+ action_set_activemarker(act, marker, 0);
+
+ /* Update event for pose and deformation children */
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+
+ /* updates */
+ if (IS_AUTOKEY_MODE(NORMAL)) {
+ remake_action_ipos(ob->action);
+
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+ }
+ else {
+ /* need to trick depgraph, action is not allowed to execute on pose */
+ where_is_pose(ob);
+ ob->recalc= 0;
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+ }
+
+ /* free memory used for backups */
+ BLI_freelistN(&pld->backups);
+ BLI_freelistN(&pld->searchp);
+}
+
+
+
+/* This tool allows users to preview the pose from the pose-lib using the mouse-scrollwheel/pageupdown
+ * It is also used to apply the active poselib pose only
+ */
+void poselib_preview_poses (Object *ob, short apply_active)
+{
+ tPoseLib_PreviewData pld;
+ Base *base;
+
+ unsigned short event;
+ short val=0;
+ char ascii;
+
+ /* check if valid poselib */
+ poselib_preview_init_data(&pld, ob, apply_active);
+ if (pld.state == PL_PREVIEW_ERROR)
+ return;
+
+ /* start preview loop */
+ while (ELEM(pld.state, PL_PREVIEW_RUNNING, PL_PREVIEW_RUNONCE)) {
+ /* preview a pose */
+ if (pld.redraw) {
+ /* only recalc pose (and its dependencies) if pose has changed */
+ if (pld.redraw == PL_PREVIEW_REDRAWALL) {
+ /* don't clear pose if firsttime */
+ if ((pld.flag & PL_PREVIEW_FIRSTTIME)==0)
+ poselib_backup_restore(&pld);
+ else
+ pld.flag &= ~PL_PREVIEW_FIRSTTIME;
+
+ /* pose should be the right one to draw (unless we're temporarily not showing it) */
+ if ((pld.flag & PL_PREVIEW_SHOWORIGINAL)==0)
+ poselib_apply_pose(&pld);
+
+ /* old optimize trick... this enforces to bypass the depgraph
+ * - note: code copied from transform_generics.c -> recalcData()
+ */
+ if ((pld.arm->flag & ARM_DELAYDEFORM)==0) {
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); /* sets recalc flags */
+
+ /* bah, softbody exception... recalcdata doesnt reset */
+ for (base= FIRSTBASE; base; base= base->next) {
+ if (base->object->recalc & OB_RECALC_DATA)
+ if (modifiers_isSoftbodyEnabled(base->object)) {
+ base->object->softflag |= OB_SB_REDO;
+ }
+ }
+ }
+ else
+ where_is_pose(ob);
+ }
+
+ /* do header print - if interactively previewing */
+ if (pld.state == PL_PREVIEW_RUNNING) {
+ if (pld.flag & PL_PREVIEW_SHOWORIGINAL) {
+ sprintf(pld.headerstr, "PoseLib Previewing Pose: [Showing Original Pose] | Use Tab to start previewing poses again");
+ headerprint(pld.headerstr);
+ }
+ else if (pld.searchstr[0]) {
+ char tempstr[65];
+ char markern[64];
+ short index;
+
+ /* get search-string */
+ index= pld.search_cursor;
+
+ memcpy(&tempstr[0], &pld.searchstr[0], index);
+ tempstr[index]= '|';
+ memcpy(&tempstr[index+1], &pld.searchstr[index], 64-index);
+
+ /* get marker name */
+ if (pld.marker)
+ strcpy(markern, pld.marker->name);
+ else
+ strcpy(markern, "No Matches");
+
+ sprintf(pld.headerstr, "PoseLib Previewing Pose: Filter - [%s] | Current Pose - \"%s\" | Use ScrollWheel or PageUp/Down to change", tempstr, markern);
+ headerprint(pld.headerstr);
+ }
+ else {
+ sprintf(pld.headerstr, "PoseLib Previewing Pose: \"%s\" | Use ScrollWheel or PageUp/Down to change", pld.marker->name);
+ headerprint(pld.headerstr);
+ }
+ }
+
+ /* force drawing of view + clear redraw flag */
+ force_draw(0);
+ pld.redraw= PL_PREVIEW_NOREDRAW;
+ }
+
+ /* stop now if only running once */
+ if (pld.state == PL_PREVIEW_RUNONCE) {
+ pld.state = PL_PREVIEW_CONFIRM;
+ break;
+ }
+
+ /* essential for idling subloop */
+ if (qtest() == 0)
+ PIL_sleep_ms(2);
+
+ /* emptying queue and reading events */
+ while ( qtest() ) {
+ event= extern_qread_ext(&val, &ascii);
+
+ /* event processing */
+ if (val) {
+ poselib_preview_handle_event(&pld, event, ascii);
+ }
+ }
+ }
+
+ /* finish up */
+ poselib_preview_cleanup(&pld);
+
+ BIF_undo_push("PoseLib Apply Pose");
+}
diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c
index 5e78abd8b41..5692f2d54bd 100644
--- a/source/blender/src/poseobject.c
+++ b/source/blender/src/poseobject.c
@@ -27,16 +27,19 @@
*/
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
+#include "DNA_curve_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
@@ -44,6 +47,7 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_action.h"
#include "BKE_armature.h"
@@ -56,6 +60,7 @@
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
+#include "BKE_ipo.h"
#include "BIF_editarmature.h"
#include "BIF_editaction.h"
@@ -77,6 +82,9 @@
#include "mydevice.h"
#include "blendef.h"
+#include "transform.h"
+
+#include "BIF_transform.h" /* for autokey TFM_TRANSLATION, etc */
void enter_posemode(void)
{
@@ -160,6 +168,9 @@ bPoseChannel *get_active_posechannel (Object *ob)
bArmature *arm= ob->data;
bPoseChannel *pchan;
+ if ELEM(NULL, ob, ob->pose)
+ return NULL;
+
/* find active */
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if(pchan->bone && (pchan->bone->flag & BONE_ACTIVE) && (pchan->bone->layer & arm->layer))
@@ -219,7 +230,9 @@ int pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
/* ********************************************** */
-/* for the object with pose/action: create path curves for selected bones */
+/* For the object with pose/action: create path curves for selected bones
+ * This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
+ */
void pose_calculate_path(Object *ob)
{
bArmature *arm;
@@ -229,7 +242,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;
@@ -246,38 +259,50 @@ void pose_calculate_path(Object *ob)
cfra= CFRA;
sfra = arm->pathsf;
efra = arm->pathef;
- if (efra<=sfra) return;
+ if (efra <= sfra) {
+ error("Can't calculate paths when pathlen <= 0");
+ return;
+ }
+
+ waitcursor(1);
+
+ /* hack: for unsaved files, set OB_RECALC so that paths can get calculated */
+ if ((ob->recalc & OB_RECALC)==0) {
+ ob->recalc |= OB_RECALC;
+ DAG_object_update_flags(G.scene, ob, screen_view3d_layers());
+ }
+ else
+ DAG_object_update_flags(G.scene, ob, screen_view3d_layers());
- DAG_object_update_flags(G.scene, ob, screen_view3d_layers());
/* malloc the path blocks */
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(pchan->bone && (pchan->bone->flag & BONE_SELECTED)) {
- if(arm->layer & pchan->bone->layer) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
+ if (arm->layer & pchan->bone->layer) {
pchan->pathlen= efra-sfra+1;
pchan->pathsf= sfra;
pchan->pathef= efra+1;
- if(pchan->path)
+ if (pchan->path)
MEM_freeN(pchan->path);
pchan->path= MEM_callocN(3*pchan->pathlen*sizeof(float), "pchan path");
}
}
}
- for(CFRA=sfra; CFRA<=efra; CFRA++) {
+ for (CFRA=sfra; CFRA<=efra; CFRA++) {
/* do all updates */
- for(base= FIRSTBASE; base; base= base->next) {
- if(base->object->recalc) {
+ for (base= FIRSTBASE; base; base= base->next) {
+ if (base->object->recalc) {
int temp= base->object->recalc;
object_handle_update(base->object);
base->object->recalc= temp;
}
}
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(pchan->bone && (pchan->bone->flag & BONE_SELECTED)) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->path) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
+ if (arm->layer & pchan->bone->layer) {
+ if (pchan->path) {
fp= pchan->path+3*(CFRA-sfra);
if (arm->pathflag & ARM_PATH_HEADS) {
@@ -294,25 +319,113 @@ void pose_calculate_path(Object *ob)
}
}
+ waitcursor(0);
+
CFRA= cfra;
allqueue(REDRAWVIEW3D, 0); /* recalc tags are still there */
allqueue(REDRAWBUTSEDIT, 0);
}
+/* For the object with pose/action: update paths for those that have got them
+ * This should selectively update paths that exist...
+ */
+void pose_recalculate_paths(Object *ob)
+{
+ bArmature *arm;
+ bPoseChannel *pchan;
+ Base *base;
+ float *fp;
+ int cfra;
+ int sfra, efra;
+
+ if (ob==NULL || ob->pose==NULL)
+ return;
+ arm= ob->data;
+
+ /* set frame values */
+ cfra = CFRA;
+ sfra = efra = cfra;
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
+ if (pchan->path) {
+ /* if the pathsf and pathef aren't initialised, abort! */
+ if (ELEM(0, pchan->pathsf, pchan->pathef))
+ return;
+
+ /* try to increase area to do (only as much as needed) */
+ sfra= MIN2(sfra, pchan->pathsf);
+ efra= MAX2(efra, pchan->pathef);
+ }
+ }
+ }
+ if (efra <= sfra) return;
+
+ waitcursor(1);
+
+ /* hack: for unsaved files, set OB_RECALC so that paths can get calculated */
+ if ((ob->recalc & OB_RECALC)==0) {
+ ob->recalc |= OB_RECALC;
+ DAG_object_update_flags(G.scene, ob, screen_view3d_layers());
+ }
+ else
+ DAG_object_update_flags(G.scene, ob, screen_view3d_layers());
+
+ for (CFRA=sfra; CFRA<=efra; CFRA++) {
+ /* do all updates */
+ for (base= FIRSTBASE; base; base= base->next) {
+ if (base->object->recalc) {
+ int temp= base->object->recalc;
+ object_handle_update(base->object);
+ base->object->recalc= temp;
+ }
+ }
+
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
+ if (pchan->path) {
+ /* only update if:
+ * - in range of this pchan's existing path
+ * - ... insert evil filtering/optimising conditions here...
+ */
+ if (IN_RANGE(CFRA, pchan->pathsf, pchan->pathef)) {
+ fp= pchan->path+3*(CFRA-sfra);
+
+ if (arm->pathflag & ARM_PATH_HEADS) {
+ VECCOPY(fp, pchan->pose_head);
+ }
+ else {
+ VECCOPY(fp, pchan->pose_tail);
+ }
+
+ Mat4MulVecfl(ob->obmat, fp);
+ }
+ }
+ }
+ }
+ }
+
+ waitcursor(0);
+
+ CFRA= cfra;
+ allqueue(REDRAWVIEW3D, 0); /* recalc tags are still there */
+ allqueue(REDRAWBUTSEDIT, 0);
+}
-/* for the object with pose/action: clear all path curves */
+/* for the object with pose/action: clear path curves for selected bones only */
void pose_clear_paths(Object *ob)
{
bPoseChannel *pchan;
- if(ob==NULL || ob->pose==NULL)
+ if (ob==NULL || ob->pose==NULL)
return;
/* free the path blocks */
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(pchan->path) {
- MEM_freeN(pchan->path);
- pchan->path= NULL;
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
+ if (pchan->path) {
+ MEM_freeN(pchan->path);
+ pchan->path= NULL;
+ }
}
}
@@ -329,23 +442,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);
}
}
}
@@ -370,7 +490,7 @@ void pose_special_editmenu(void)
if(!ob && !ob->pose) return;
if(ob==G.obedit || (ob->flag & OB_POSEMODE)==0) return;
- nr= pupmenu("Specials%t|Select Constraint Target%x1|Flip Left-Right Names%x2|Calculate Paths%x3|Clear All Paths%x4|Clear User Transform %x5");
+ nr= pupmenu("Specials%t|Select Constraint Target%x1|Flip Left-Right Names%x2|Calculate Paths%x3|Clear Paths%x4|Clear User Transform %x5|Relax Pose %x6|%l|AutoName Left-Right%x7|AutoName Front-Back%x8|AutoName Top-Bottom%x9");
if(nr==1) {
pose_select_constraint_target();
}
@@ -388,6 +508,12 @@ void pose_special_editmenu(void)
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
BIF_undo_push("Clear User Transform Pose");
}
+ else if(nr==6) {
+ pose_relax();
+ }
+ else if(ELEM3(nr, 7, 8, 9)) {
+ pose_autoside_names(nr-7);
+ }
}
void pose_add_IK(void)
@@ -706,7 +832,7 @@ void paste_posebuf (int flip)
EulToQuat(eul, pchan->quat);
}
- if (G.flags & G_RECORDKEYS) {
+ if (autokeyframe_cfra_can_key(ob)) {
ID *id= &ob->id;
/* Set keys on pose */
@@ -743,7 +869,7 @@ void paste_posebuf (int flip)
/* Update event for pose and deformation children */
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- if (G.flags & G_RECORDKEYS) {
+ if ((IS_AUTOKEY_MODE(NORMAL))) {
remake_action_ipos(ob->action);
allqueue (REDRAWIPO, 0);
allqueue (REDRAWVIEW3D, 0);
@@ -788,6 +914,223 @@ void pose_adds_vgroups(Object *meshobj, int heatweights)
/* ********************************************** */
+/* adds a new pose-group */
+void pose_add_posegroup ()
+{
+ Object *ob= OBACT;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bActionGroup *grp;
+
+ if (ELEM(NULL, ob, ob->pose))
+ return;
+
+ grp= MEM_callocN(sizeof(bActionGroup), "PoseGroup");
+ strcpy(grp->name, "Group");
+ BLI_addtail(&pose->agroups, grp);
+ BLI_uniquename(&pose->agroups, grp, "Group", offsetof(bActionGroup, name), 32);
+
+ pose->active_group= BLI_countlist(&pose->agroups);
+
+ BIF_undo_push("Add Bone Group");
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+/* Remove the active bone-group */
+void pose_remove_posegroup ()
+{
+ Object *ob= OBACT;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bActionGroup *grp = NULL;
+ bPoseChannel *pchan;
+
+ /* sanity checks */
+ if (ELEM(NULL, ob, pose))
+ return;
+ if (pose->active_group <= 0)
+ return;
+
+ /* get group to remove */
+ grp= BLI_findlink(&pose->agroups, pose->active_group-1);
+ if (grp) {
+ /* firstly, make sure nothing references it */
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->agrp_index == pose->active_group)
+ pchan->agrp_index= 0;
+ }
+
+ /* now, remove it from the pose */
+ BLI_freelinkN(&pose->agroups, grp);
+ pose->active_group= 0;
+
+ BIF_undo_push("Remove Bone Group");
+ }
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+char *build_posegroups_menustr (bPose *pose, short for_pupmenu)
+{
+ DynStr *pupds= BLI_dynstr_new();
+ bActionGroup *grp;
+ char *str;
+ char buf[16];
+ int i;
+
+ /* add title first (and the "none" entry) */
+ BLI_dynstr_append(pupds, "Bone Group%t|");
+ if (for_pupmenu)
+ BLI_dynstr_append(pupds, "Add New%x0|");
+ else
+ BLI_dynstr_append(pupds, "BG: [None]%x0|");
+
+ /* loop through markers, adding them */
+ for (grp= pose->agroups.first, i=1; grp; grp=grp->next, i++) {
+ if (for_pupmenu == 0)
+ BLI_dynstr_append(pupds, "BG: ");
+ BLI_dynstr_append(pupds, grp->name);
+
+ sprintf(buf, "%%x%d", i);
+ BLI_dynstr_append(pupds, buf);
+
+ if (grp->next)
+ BLI_dynstr_append(pupds, "|");
+ }
+
+ /* convert to normal MEM_malloc'd string */
+ str= BLI_dynstr_get_cstring(pupds);
+ BLI_dynstr_free(pupds);
+
+ return str;
+}
+
+/* Assign selected pchans to the bone group that the user selects */
+void pose_assign_to_posegroup (short active)
+{
+ Object *ob= OBACT;
+ bArmature *arm= (ob) ? ob->data : NULL;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bPoseChannel *pchan;
+ char *menustr;
+ int nr;
+ short done= 0;
+
+ /* sanity checks */
+ if (ELEM3(NULL, ob, pose, arm))
+ return;
+
+ /* get group to affect */
+ if ((active==0) || (pose->active_group <= 0)) {
+ menustr= build_posegroups_menustr(pose, 1);
+ nr= pupmenu(menustr);
+ MEM_freeN(menustr);
+
+ if (nr < 0)
+ return;
+ else if (nr == 0) {
+ /* add new - note: this does an undo push and sets active group */
+ pose_add_posegroup();
+ }
+ else
+ pose->active_group= nr;
+ }
+
+ /* add selected bones to group then */
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer)) {
+ pchan->agrp_index= pose->active_group;
+ done= 1;
+ }
+ }
+
+ if (done)
+ BIF_undo_push("Add Bones To Group");
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+/* Remove selected pchans from their bone groups */
+void pose_remove_from_posegroups ()
+{
+ Object *ob= OBACT;
+ bArmature *arm= (ob) ? ob->data : NULL;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bPoseChannel *pchan;
+ short done= 0;
+
+ /* sanity checks */
+ if (ELEM3(NULL, ob, pose, arm))
+ return;
+
+ /* remove selected bones from their groups */
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer)) {
+ if (pchan->agrp_index) {
+ pchan->agrp_index= 0;
+ done= 1;
+ }
+ }
+ }
+
+ if (done)
+ BIF_undo_push("Remove Bones From Groups");
+
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+/* Ctrl-G in 3D-View while in PoseMode */
+void pgroup_operation_with_menu (void)
+{
+ Object *ob= OBACT;
+ bArmature *arm= (ob) ? ob->data : NULL;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bPoseChannel *pchan= NULL;
+ int mode;
+
+ /* sanity checks */
+ if (ELEM3(NULL, ob, pose, arm))
+ return;
+
+ /* check that something is selected */
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer))
+ break;
+ }
+ if (pchan == NULL)
+ return;
+
+ /* get mode of action */
+ if (pchan)
+ mode= pupmenu("Bone Groups%t|Add Selected to Active Group%x1|Add Selected to Group%x2|%|Remove Selected From Groups%x3|Remove Active Group%x4");
+ else
+ mode= pupmenu("Bone Groups%t|Add New Group%x5|Remove Active Group%x4");
+
+ /* handle mode */
+ switch (mode) {
+ case 1:
+ pose_assign_to_posegroup(1);
+ break;
+ case 2:
+ pose_assign_to_posegroup(0);
+ break;
+ case 5:
+ pose_add_posegroup();
+ break;
+ case 3:
+ pose_remove_from_posegroups();
+ break;
+ case 4:
+ pose_remove_posegroup();
+ break;
+ }
+}
+
+/* ********************************************** */
+
/* context active object */
void pose_flip_names(void)
{
@@ -819,7 +1162,39 @@ void pose_flip_names(void)
allqueue (REDRAWACTION, 0);
allqueue(REDRAWOOPS, 0);
BIF_undo_push("Flip names");
+}
+
+/* context active object */
+void pose_autoside_names(short axis)
+{
+ Object *ob= OBACT;
+ bArmature *arm= ob->data;
+ bPoseChannel *pchan;
+ char newname[32];
+
+ /* paranoia checks */
+ if (ELEM(NULL, ob, ob->pose)) return;
+ if (ob==G.obedit || (ob->flag & OB_POSEMODE)==0) return;
+
+ 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_ACTIVE|BONE_SELECTED)) {
+ BLI_strncpy(newname, pchan->name, sizeof(newname));
+ bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]);
+ armature_bone_rename(ob->data, pchan->name, newname);
+ }
+ }
+ }
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue (REDRAWACTION, 0);
+ allqueue(REDRAWOOPS, 0);
+ BIF_undo_push("Flip names");
}
/* context active object, or weightpainted object with armature in posemode */
@@ -900,6 +1275,7 @@ void pose_movetolayer(void)
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) {
@@ -914,8 +1290,14 @@ void pose_movetolayer(void)
for (ebo= G.edbo.first; ebo; ebo= ebo->next) {
if (arm->layer & ebo->layer) {
- if (ebo->flag & BONE_SELECTED)
+ 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;
+ }
+ }
}
}
@@ -954,3 +1336,163 @@ void pose_movetolayer(void)
allqueue(REDRAWBUTSEDIT, 0);
}
}
+
+
+/* for use with pose_relax only */
+static int pose_relax_icu(struct IpoCurve *icu, float framef, float *val, float *frame_prev, float *frame_next)
+{
+ if (!icu) {
+ return 0;
+ } else {
+ BezTriple *bezt = icu->bezt;
+
+ BezTriple *bezt_prev=NULL, *bezt_next=NULL;
+ float w1, w2, wtot;
+ int i;
+
+ for (i=0; i < icu->totvert; i++, bezt++) {
+ if (bezt->vec[1][0] < framef - 0.5) {
+ bezt_prev = bezt;
+ } else {
+ break;
+ }
+ }
+
+ if (bezt_prev==NULL) return 0;
+
+ /* advance to the next, dont need to advance i */
+ bezt = bezt_prev+1;
+
+ for (; i < icu->totvert; i++, bezt++) {
+ if (bezt->vec[1][0] > framef + 0.5) {
+ bezt_next = bezt;
+ break;
+ }
+ }
+
+ if (bezt_next==NULL) return 0;
+
+ if (val) {
+ w1 = framef - bezt_prev->vec[1][0];
+ w2 = bezt_next->vec[1][0] - framef;
+ wtot = w1 + w2;
+ w1=w1/wtot;
+ w2=w2/wtot;
+#if 0
+ val = (bezt_prev->vec[1][1] * w2) + (bezt_next->vec[1][1] * w1);
+#else
+ /* apply the value with a hard coded 6th */
+ *val = (((bezt_prev->vec[1][1] * w2) + (bezt_next->vec[1][1] * w1)) + (*val * 5.0f)) / 6.0f;
+#endif
+ }
+
+ if (frame_prev) *frame_prev = bezt_prev->vec[1][0];
+ if (frame_next) *frame_next = bezt_next->vec[1][0];
+
+ return 1;
+ }
+}
+
+void pose_relax()
+{
+ Object *ob = OBACT;
+ bPose *pose;
+ bAction *act;
+ bArmature *arm;
+
+ IpoCurve *icu_w, *icu_x, *icu_y, *icu_z;
+
+ bPoseChannel *pchan;
+ bActionChannel *achan;
+ float framef = F_CFRA;
+ float frame_prev, frame_next;
+ float quat_prev[4], quat_next[4], quat_interp[4], quat_orig[4];
+
+ int do_scale = 0;
+ int do_loc = 0;
+ int do_quat = 0;
+ int flag = 0;
+ int do_x, do_y, do_z;
+
+ if (!ob) return;
+
+ pose = ob->pose;
+ act = ob->action;
+ arm = (bArmature *)ob->data;
+
+ if (!pose || !act || !arm) return;
+
+ for (pchan=pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->bone->layer & arm->layer) {
+ if (pchan->bone->flag & BONE_SELECTED) {
+ /* do we have an ipo curve? */
+ achan= get_action_channel(act, pchan->name);
+
+ if (achan && achan->ipo) {
+ /*calc_ipo(achan->ipo, ctime);*/
+
+ do_x = pose_relax_icu(find_ipocurve(achan->ipo, AC_LOC_X), framef, &pchan->loc[0], NULL, NULL);
+ do_y = pose_relax_icu(find_ipocurve(achan->ipo, AC_LOC_Y), framef, &pchan->loc[1], NULL, NULL);
+ do_z = pose_relax_icu(find_ipocurve(achan->ipo, AC_LOC_Z), framef, &pchan->loc[2], NULL, NULL);
+ do_loc += do_x + do_y + do_z;
+
+ do_x = pose_relax_icu(find_ipocurve(achan->ipo, AC_SIZE_X), framef, &pchan->size[0], NULL, NULL);
+ do_y = pose_relax_icu(find_ipocurve(achan->ipo, AC_SIZE_Y), framef, &pchan->size[1], NULL, NULL);
+ do_z = pose_relax_icu(find_ipocurve(achan->ipo, AC_SIZE_Z), framef, &pchan->size[2], NULL, NULL);
+ do_scale += do_x + do_y + do_z;
+
+ if( ((icu_w = find_ipocurve(achan->ipo, AC_QUAT_W))) &&
+ ((icu_x = find_ipocurve(achan->ipo, AC_QUAT_X))) &&
+ ((icu_y = find_ipocurve(achan->ipo, AC_QUAT_Y))) &&
+ ((icu_z = find_ipocurve(achan->ipo, AC_QUAT_Z))) )
+ {
+ /* use the quatw keyframe as a basis for others */
+ if (pose_relax_icu(icu_w, framef, NULL, &frame_prev, &frame_next)) {
+ /* get 2 quats */
+ quat_prev[0] = eval_icu(icu_w, frame_prev);
+ quat_prev[1] = eval_icu(icu_x, frame_prev);
+ quat_prev[2] = eval_icu(icu_y, frame_prev);
+ quat_prev[3] = eval_icu(icu_z, frame_prev);
+
+ quat_next[0] = eval_icu(icu_w, frame_next);
+ quat_next[1] = eval_icu(icu_x, frame_next);
+ quat_next[2] = eval_icu(icu_y, frame_next);
+ quat_next[3] = eval_icu(icu_z, frame_next);
+
+#if 0
+ /* apply the setting, completely smooth */
+ QuatInterpol(pchan->quat, quat_prev, quat_next, (framef-frame_prev) / (frame_next-frame_prev) );
+#else
+ /* tricky interpolation */
+ QuatInterpol(quat_interp, quat_prev, quat_next, (framef-frame_prev) / (frame_next-frame_prev) );
+ QUATCOPY(quat_orig, pchan->quat);
+ QuatInterpol(pchan->quat, quat_orig, quat_interp, 1.0f/6.0f);
+ /* done */
+#endif
+ do_quat++;
+ }
+ }
+
+ /* apply BONE_TRANSFORM tag so that autokeying will pick it up */
+ pchan->bone->flag |= BONE_TRANSFORM;
+ }
+ }
+ }
+ }
+
+ ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
+
+ /* do auto-keying */
+ if (do_loc) flag |= TFM_TRANSLATION;
+ if (do_scale) flag |= TFM_RESIZE;
+ if (do_quat) flag |= TFM_ROTATION;
+ autokeyframe_pose_cb_func(ob, flag, 0);
+
+ /* clear BONE_TRANSFORM flags */
+ for (pchan=pose->chanbase.first; pchan; pchan= pchan->next)
+ pchan->bone->flag &= ~ BONE_TRANSFORM;
+
+ /* do depsgraph flush */
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ BIF_undo_push("Relax Pose");
+}
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/previewrender.c b/source/blender/src/previewrender.c
index 2f7b4754d76..383b73b7619 100644
--- a/source/blender/src/previewrender.c
+++ b/source/blender/src/previewrender.c
@@ -270,6 +270,11 @@ static Scene *preview_prepare_scene(RenderInfo *ri, int id_type, ID *id, int pr_
sce->r.scemode |= R_PREVIEWBUTS;
/* set world always back, is used now */
sce->world= pr_main->world.first;
+ /* now: exposure copy */
+ if(G.scene->world) {
+ sce->world->exp= G.scene->world->exp;
+ sce->world->range= G.scene->world->range;
+ }
sce->r.cfra= G.scene->r.cfra;
diff --git a/source/blender/src/radialcontrol.c b/source/blender/src/radialcontrol.c
new file mode 100644
index 00000000000..5e44d28f08f
--- /dev/null
+++ b/source/blender/src/radialcontrol.c
@@ -0,0 +1,267 @@
+/*
+ * $Id: multires.c 13015 2007-12-27 07:27:03Z nicholasbishop $
+ *
+ * ***** 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 by Nicholas Bishop
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ * Implements the multiresolution modeling tools.
+ *
+ * multires.h
+ *
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+#include "BIF_mywindow.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+#include "BIF_radialcontrol.h"
+
+#include "BKE_global.h"
+#include "BLI_arithb.h"
+
+#include "mydevice.h"
+#include "transform.h"
+
+#include "math.h"
+
+/* Prints the value being edited in the view header */
+static void radialcontrol_header(const RadialControl *rc)
+{
+ if(rc) {
+ char str[512];
+ const char *name= "";
+
+ if(rc->mode == RADIALCONTROL_SIZE)
+ name= "Size";
+ else if(rc->mode == RADIALCONTROL_STRENGTH)
+ name= "Strength";
+ else if(rc->mode == RADIALCONTROL_ROTATION)
+ name= "Angle";
+
+ sprintf(str, "%s: %d", name, (int)(rc->new_value));
+ headerprint(str);
+ }
+}
+
+/* Creates, initializes, and returns the control */
+RadialControl *radialcontrol_start(const int mode, RadialControlCallback callback,
+ const int original_value, const int max_value,
+ const unsigned int tex)
+{
+ RadialControl *rc= MEM_callocN(sizeof(RadialControl), "radial control");
+ short mouse[2];
+
+ getmouseco_areawin(mouse);
+ rc->origloc[0]= mouse[0];
+ rc->origloc[1]= mouse[1];
+
+ if(mode == RADIALCONTROL_SIZE)
+ rc->origloc[0]-= original_value;
+ else if(mode == RADIALCONTROL_STRENGTH)
+ rc->origloc[0]-= 200 - 2*original_value;
+ else if(mode == RADIALCONTROL_ROTATION) {
+ rc->origloc[0]-= 200 * cos(original_value * M_PI / 180.0);
+ rc->origloc[1]-= 200 * sin(original_value * M_PI / 180.0);
+ }
+
+ rc->callback = callback;
+ rc->original_value = original_value;
+ rc->max_value = max_value;
+
+ rc->tex = tex;
+
+ /* NumInput is used for keyboard input */
+ rc->num = MEM_callocN(sizeof(NumInput), "radialcontrol numinput");
+ rc->num->idx_max= 0;
+
+ rc->mode= mode;
+ radialcontrol_header(rc);
+
+ allqueue(REDRAWVIEW3D, 0);
+
+ return rc;
+}
+
+
+static void radialcontrol_end(RadialControl *rc)
+{
+ if(rc) {
+ rc->callback(rc->mode, rc->new_value);
+ BIF_undo_push("Brush property set");
+
+ /* Free everything */
+ glDeleteTextures(1, (GLuint*)(&rc->tex));
+ MEM_freeN(rc->num);
+ MEM_freeN(rc);
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWHEADERS, 0);
+ }
+}
+
+void radialcontrol_do_events(RadialControl *rc, unsigned short event)
+{
+ short mouse[2];
+ short tmp[2];
+ float dist;
+ char valset= 0;
+
+ if(!rc)
+ return;
+
+ handleNumInput(rc->num, event);
+
+ if(hasNumInput(rc->num)) {
+ float val;
+ applyNumInput(rc->num, &val);
+ rc->new_value = val;
+ valset= 1;
+ allqueue(REDRAWVIEW3D, 0);
+ }
+
+ switch(event) {
+ case MOUSEX:
+ case MOUSEY:
+ if(!hasNumInput(rc->num)) {
+ char ctrl= G.qual & LR_CTRLKEY;
+ getmouseco_areawin(mouse);
+ tmp[0]= rc->origloc[0]-mouse[0];
+ tmp[1]= rc->origloc[1]-mouse[1];
+ dist= sqrt(tmp[0]*tmp[0]+tmp[1]*tmp[1]);
+ if(rc->mode == RADIALCONTROL_SIZE)
+ rc->new_value = dist;
+ else if(rc->mode == RADIALCONTROL_STRENGTH) {
+ float fin= (200.0f - dist) * 0.5f;
+ rc->new_value= fin>=0 ? fin : 0;
+ } else if(rc->mode == RADIALCONTROL_ROTATION)
+ rc->new_value= ((int)(atan2(tmp[1], tmp[0]) * (180.0 / M_PI)) + 180);
+
+ if(ctrl)
+ rc->new_value= (rc->new_value + 5) / 10*10;
+
+ valset= 1;
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ break;
+ case ESCKEY:
+ case RIGHTMOUSE:
+ rc->new_value = rc->original_value;
+ case LEFTMOUSE:
+ while(get_mbut()==L_MOUSE);
+ case RETKEY:
+ case PADENTER:
+ radialcontrol_end(rc);
+ return;
+ default:
+ break;
+ };
+
+ if(valset) {
+ if(rc->new_value > rc->max_value)
+ rc->new_value = rc->max_value;
+ }
+
+ radialcontrol_header(rc);
+}
+
+static void rot_line(const short o[2], const float ang)
+{
+ sdrawXORline(o[0], o[1], o[0] + 200*cos(ang), o[1] + 200*sin(ang));
+}
+
+void radialcontrol_draw(RadialControl *rc)
+{
+ short r1, r2, r3;
+ float angle = 0;
+
+ if(rc && rc->mode) {
+ if(rc->mode == RADIALCONTROL_SIZE) {
+ r1= rc->new_value;
+ r2= rc->original_value;
+ r3= r1;
+ } else if(rc->mode == RADIALCONTROL_STRENGTH) {
+ r1= 200 - rc->new_value * 2;
+ r2= 200;
+ r3= 200;
+ } else if(rc->mode == RADIALCONTROL_ROTATION) {
+ r1= r2= 200;
+ r3= 200;
+ angle = rc->new_value;
+ }
+
+ /* Draw brush with texture */
+ glPushMatrix();
+ glTranslatef(rc->origloc[0], rc->origloc[1], 0);
+ glRotatef(angle, 0, 0, 1);
+
+ if(rc->tex) {
+ const float str = rc->mode == RADIALCONTROL_STRENGTH ? (rc->new_value / 200.0 + 0.5) : 1;
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBindTexture(GL_TEXTURE_2D, rc->tex);
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ glColor4f(0,0,0, str);
+ glTexCoord2f(0,0);
+ glVertex2f(-r3, -r3);
+ glTexCoord2f(1,0);
+ glVertex2f(r3, -r3);
+ glTexCoord2f(1,1);
+ glVertex2f(r3, r3);
+ glTexCoord2f(0,1);
+ glVertex2f(-r3, r3);
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+ }
+
+ glPopMatrix();
+
+ if(r1 != r2)
+ fdrawXORcirc(rc->origloc[0], rc->origloc[1], r1);
+ fdrawXORcirc(rc->origloc[0], rc->origloc[1], r2);
+
+ if(rc->mode == RADIALCONTROL_ROTATION) {
+ float ang1= rc->original_value * (M_PI/180.0f);
+ float ang2= rc->new_value * (M_PI/180.0f);
+
+ if(rc->new_value > 359)
+ ang2 = 0;
+
+ rot_line(rc->origloc, ang1);
+ if(ang1 != ang2)
+ rot_line(rc->origloc, ang2);
+ }
+ }
+}
diff --git a/source/blender/src/reeb.c b/source/blender/src/reeb.c
new file mode 100644
index 00000000000..85fb5815c3e
--- /dev/null
+++ b/source/blender/src/reeb.c
@@ -0,0 +1,1923 @@
+/**
+ * $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.
+ *
+ * Contributor(s): Martin Poirier
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <string.h> // for memcpy
+#include <stdio.h>
+#include <stdlib.h> // for qsort
+
+#include "DNA_listBase.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_edgehash.h"
+
+#include "BDR_editobject.h"
+
+#include "BIF_editmesh.h"
+#include "BIF_editarmature.h"
+#include "BIF_interface.h"
+#include "BIF_toolbox.h"
+#include "BIF_graphics.h"
+
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+#include "BKE_customdata.h"
+
+#include "blendef.h"
+
+#include "ONL_opennl.h"
+
+#include "reeb.h"
+
+/*
+ * Skeleton generation algorithm based on:
+ * "Harmonic Skeleton for Realistic Character Animation"
+ * Gregoire Aujay, Franck Hetroy, Francis Lazarus and Christine Depraz
+ * SIGGRAPH 2007
+ *
+ * Reeb graph generation algorithm based on:
+ * "Robust On-line Computation of Reeb Graphs: Simplicity and Speed"
+ * Valerio Pascucci, Giorgio Scorzelli, Peer-Timo Bremer and Ajith Mascarenhas
+ * SIGGRAPH 2007
+ *
+ * */
+
+int mergeArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1);
+int mergeConnectedArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1);
+EditEdge * NextEdgeForVert(EditMesh *em, EditVert *v);
+
+/***************************************** BUCKET UTILS **********************************************/
+
+void addVertToBucket(EmbedBucket *b, float co[3])
+{
+ b->nv++;
+ VecLerpf(b->p, b->p, co, 1.0f / b->nv);
+}
+
+void removeVertFromBucket(EmbedBucket *b, float co[3])
+{
+ VecMulf(b->p, (float)b->nv);
+ VecSubf(b->p, b->p, co);
+ b->nv--;
+ VecMulf(b->p, 1.0f / (float)b->nv);
+}
+
+void mergeBuckets(EmbedBucket *bDst, EmbedBucket *bSrc)
+{
+ if (bDst->nv > 0 && bSrc->nv > 0)
+ {
+ bDst->nv += bSrc->nv;
+ VecLerpf(bDst->p, bDst->p, bSrc->p, (float)bSrc->nv / (float)(bDst->nv));
+ }
+ else if (bSrc->nv > 0)
+ {
+ bDst->nv = bSrc->nv;
+ VECCOPY(bDst->p, bSrc->p);
+ }
+}
+
+void mergeArcBuckets(ReebArc *aDst, ReebArc *aSrc, float start, float end)
+{
+ if (aDst->bcount > 0 && aSrc->bcount > 0)
+ {
+ int indexDst = 0, indexSrc = 0;
+
+ start = MAX3(start, aDst->buckets[0].val, aSrc->buckets[0].val);
+
+ while(indexDst < aDst->bcount && aDst->buckets[indexDst].val < start)
+ {
+ indexDst++;
+ }
+
+ while(indexSrc < aSrc->bcount && aSrc->buckets[indexSrc].val < start)
+ {
+ indexSrc++;
+ }
+
+ for( ; indexDst < aDst->bcount &&
+ indexSrc < aSrc->bcount &&
+ aDst->buckets[indexDst].val <= end &&
+ aSrc->buckets[indexSrc].val <= end
+
+ ; indexDst++, indexSrc++)
+ {
+ mergeBuckets(aDst->buckets + indexDst, aSrc->buckets + indexSrc);
+ }
+ }
+}
+
+void allocArcBuckets(ReebArc *arc)
+{
+ int i;
+ float start = ceil(arc->v1->weight);
+ arc->bcount = (int)(floor(arc->v2->weight) - start) + 1;
+
+ if (arc->bcount > 0)
+ {
+ arc->buckets = MEM_callocN(sizeof(EmbedBucket) * arc->bcount, "embed bucket");
+
+ for(i = 0; i < arc->bcount; i++)
+ {
+ arc->buckets[i].val = start + i;
+ }
+ }
+ else
+ {
+ arc->buckets = NULL;
+ }
+
+}
+
+void resizeArcBuckets(ReebArc *arc)
+{
+ EmbedBucket *oldBuckets = arc->buckets;
+ int oldBCount = arc->bcount;
+
+ allocArcBuckets(arc);
+
+ if (oldBCount != 0 && arc->bcount != 0)
+ {
+ int oldStart = (int)oldBuckets[0].val;
+ int oldEnd = (int)oldBuckets[oldBCount - 1].val;
+ int newStart = (int)arc->buckets[0].val;
+ int newEnd = (int)arc->buckets[arc->bcount - 1].val;
+ int oldOffset = 0;
+ int newOffset = 0;
+ int len;
+
+ if (oldStart < newStart)
+ {
+ oldOffset = newStart - oldStart;
+ }
+ else
+ {
+ newOffset = oldStart - newStart;
+ }
+
+ len = MIN2(oldEnd - (oldStart + oldOffset) + 1, newEnd - (newStart - newOffset) + 1);
+
+ memcpy(arc->buckets + newOffset, oldBuckets + oldOffset, len * sizeof(EmbedBucket));
+ }
+
+ if (oldBuckets != NULL)
+ {
+ MEM_freeN(oldBuckets);
+ }
+}
+/***************************************** UTILS **********************************************/
+
+ReebEdge * copyEdge(ReebEdge *edge)
+{
+ ReebEdge *newEdge = NULL;
+
+ newEdge = MEM_callocN(sizeof(ReebEdge), "reeb edge");
+ memcpy(newEdge, edge, sizeof(ReebEdge));
+
+ newEdge->next = NULL;
+ newEdge->prev = NULL;
+
+ return newEdge;
+}
+
+void printArc(ReebArc *arc)
+{
+ ReebEdge *edge;
+ printf("arc: (%i)%f -> (%i)%f\n", arc->v1->index, arc->v1->weight, arc->v2->index, arc->v2->weight);
+
+ for(edge = arc->edges.first; edge ; edge = edge->next)
+ {
+ printf("\tedge (%i, %i)\n", edge->v1->index, edge->v2->index);
+ }
+}
+
+void freeArc(ReebArc *arc)
+{
+ BLI_freelistN(&arc->edges);
+
+ if (arc->buckets)
+ MEM_freeN(arc->buckets);
+
+ MEM_freeN(arc);
+}
+
+void freeGraph(ReebGraph *rg)
+{
+ ReebArc *arc;
+ ReebNode *node;
+
+ // free nodes
+ for( node = rg->nodes.first; node; node = node->next )
+ {
+ // Free adjacency lists
+ if (node->arcs != NULL)
+ {
+ MEM_freeN(node->arcs);
+ }
+ }
+ BLI_freelistN(&rg->nodes);
+
+ // free arcs
+ arc = rg->arcs.first;
+ while( arc )
+ {
+ ReebArc *next = arc->next;
+ freeArc(arc);
+ arc = next;
+ }
+
+ // free edge map
+ BLI_edgehash_free(rg->emap, NULL);
+
+ MEM_freeN(rg);
+}
+
+void repositionNodes(ReebGraph *rg)
+{
+ ReebArc *arc = NULL;
+ ReebNode *node = NULL;
+
+ // Reset node positions
+ for(node = rg->nodes.first; node; node = node->next)
+ {
+ node->p[0] = node->p[1] = node->p[2] = 0;
+ }
+
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->bcount > 0)
+ {
+ float p[3];
+
+ VECCOPY(p, arc->buckets[0].p);
+ VecMulf(p, 1.0f / arc->v1->degree);
+ VecAddf(arc->v1->p, arc->v1->p, p);
+
+ VECCOPY(p, arc->buckets[arc->bcount - 1].p);
+ VecMulf(p, 1.0f / arc->v2->degree);
+ VecAddf(arc->v2->p, arc->v2->p, p);
+ }
+ }
+}
+
+void verifyNodeDegree(ReebGraph *rg)
+{
+ ReebNode *node = NULL;
+ ReebArc *arc = NULL;
+
+ for(node = rg->nodes.first; node; node = node->next)
+ {
+ int count = 0;
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->v1 == node || arc->v2 == node)
+ {
+ count++;
+ }
+ }
+ if (count != node->degree)
+ {
+ printf("degree error in node %i: expected %i got %i\n", node->index, count, node->degree);
+ }
+ }
+}
+
+void verifyBuckets(ReebGraph *rg)
+{
+#ifdef DEBUG_REEB
+ ReebArc *arc = NULL;
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->bcount > 0)
+ {
+ int i;
+ for(i = 0; i < arc->bcount; i++)
+ {
+ if (arc->buckets[i].nv == 0)
+ {
+ printArc(arc);
+ printf("count error in bucket %i/%i\n", i+1, arc->bcount);
+ }
+ }
+
+ if (ceil(arc->v1->weight) < arc->buckets[0].val)
+ {
+ printArc(arc);
+ printf("alloc error in first bucket: %f should be %f \n", arc->buckets[0].val, ceil(arc->v1->weight));
+ }
+ if (floor(arc->v2->weight) < arc->buckets[arc->bcount - 1].val)
+ {
+ printArc(arc);
+ printf("alloc error in last bucket: %f should be %f \n", arc->buckets[arc->bcount - 1].val, floor(arc->v2->weight));
+ }
+ }
+ }
+#endif
+}
+
+/************************************** ADJACENCY LIST *************************************************/
+
+void addArcToNodeAdjacencyList(ReebNode *node, ReebArc *arc)
+{
+ ReebArc **arclist;
+
+ for(arclist = node->arcs; *arclist; arclist++)
+ { }
+
+ *arclist = arc;
+}
+
+void buildAdjacencyList(ReebGraph *rg)
+{
+ ReebNode *node = NULL;
+ ReebArc *arc = NULL;
+
+ for(node = rg->nodes.first; node; node = node->next)
+ {
+ if (node->arcs != NULL)
+ {
+ MEM_freeN(node->arcs);
+ }
+
+ node->arcs = MEM_callocN((node->degree + 1) * sizeof(ReebArc*), "adjacency list");
+ }
+
+ for(arc = rg->arcs.first; arc; arc= arc->next)
+ {
+ addArcToNodeAdjacencyList(arc->v1, arc);
+ addArcToNodeAdjacencyList(arc->v2, arc);
+ }
+}
+
+int hasAdjacencyList(ReebGraph *rg)
+{
+ ReebNode *node;
+
+ for(node = rg->nodes.first; node; node = node->next)
+ {
+ if (node->arcs == NULL)
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int countConnectedArcs(ReebGraph *rg, ReebNode *node)
+{
+ int count = 0;
+
+ /* use adjacency list if present */
+ if (node->arcs)
+ {
+ ReebArc **arcs;
+
+ for(arcs = node->arcs; *arcs; arcs++)
+ {
+ count++;
+ }
+ }
+ else
+ {
+ ReebArc *arc;
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->v1 == node || arc->v2 == node)
+ {
+ count++;
+ }
+ }
+ }
+
+ return count;
+}
+
+/****************************************** SMOOTHING **************************************************/
+
+void postprocessGraph(ReebGraph *rg, char mode)
+{
+ ReebArc *arc;
+ float fac1 = 0, fac2 = 1, fac3 = 0;
+
+ switch(mode)
+ {
+ case SKGEN_AVERAGE:
+ fac1 = fac2 = fac3 = 1.0f / 3.0f;
+ break;
+ case SKGEN_SMOOTH:
+ fac1 = fac3 = 0.25f;
+ fac2 = 0.5f;
+ break;
+ case SKGEN_SHARPEN:
+ fac1 = fac2 = -0.25f;
+ fac2 = 1.5f;
+ break;
+ default:
+ error("Unknown post processing mode");
+ return;
+ }
+
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ EmbedBucket *buckets = arc->buckets;
+ int bcount = arc->bcount;
+ int index;
+
+ for(index = 1; index < bcount - 1; index++)
+ {
+ VecLerpf(buckets[index].p, buckets[index].p, buckets[index - 1].p, fac1 / (fac1 + fac2));
+ VecLerpf(buckets[index].p, buckets[index].p, buckets[index + 1].p, fac3 / (fac1 + fac2 + fac3));
+ }
+ }
+}
+
+/********************************************SORTING****************************************************/
+
+int compareNodesWeight(void *vnode1, void *vnode2)
+{
+ ReebNode *node1 = (ReebNode*)vnode1;
+ ReebNode *node2 = (ReebNode*)vnode2;
+
+ if (node1->weight < node2->weight)
+ {
+ return -1;
+ }
+ if (node1->weight > node2->weight)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void sortNodes(ReebGraph *rg)
+{
+ BLI_sortlist(&rg->nodes, compareNodesWeight);
+}
+
+int compareArcsWeight(void *varc1, void *varc2)
+{
+ ReebArc *arc1 = (ReebArc*)varc1;
+ ReebArc *arc2 = (ReebArc*)varc2;
+
+ if (arc1->v1->weight < arc2->v1->weight)
+ {
+ return -1;
+ }
+ if (arc1->v1->weight > arc2->v1->weight)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void sortArcs(ReebGraph *rg)
+{
+ BLI_sortlist(&rg->arcs, compareArcsWeight);
+}
+
+/****************************************** FILTERING **************************************************/
+
+int compareArcs(void *varc1, void *varc2)
+{
+ ReebArc *arc1 = (ReebArc*)varc1;
+ ReebArc *arc2 = (ReebArc*)varc2;
+ float len1 = arc1->v2->weight - arc1->v1->weight;
+ float len2 = arc2->v2->weight - arc2->v1->weight;
+
+ if (len1 < len2)
+ {
+ return -1;
+ }
+ if (len1 > len2)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc * srcArc, int merging)
+{
+ ReebArc *arc = NULL, *nextArc = NULL;
+
+ /* first pass, merge buckets for arcs that spawned the two nodes into the source arc*/
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ if (arc->v1 == srcArc->v1 && arc->v2 == srcArc->v2 && arc != srcArc)
+ {
+ mergeArcBuckets(srcArc, arc, srcArc->v1->weight, srcArc->v2->weight);
+ }
+ }
+
+ /* second pass, replace removedNode by newNode, remove arcs that are collapsed in a loop */
+ arc = rg->arcs.first;
+ while(arc)
+ {
+ nextArc = arc->next;
+
+ if (arc->v1 == removedNode || arc->v2 == removedNode)
+ {
+ if (arc->v1 == removedNode)
+ {
+ arc->v1 = newNode;
+ }
+ else
+ {
+ arc->v2 = newNode;
+ }
+
+ // Remove looped arcs
+ if (arc->v1 == arc->v2)
+ {
+ // v1 or v2 was already newNode, since we're removing an arc, decrement degree
+ newNode->degree--;
+
+ // If it's safeArc, it'll be removed later, so keep it for now
+ if (arc != srcArc)
+ {
+ BLI_remlink(&rg->arcs, arc);
+ freeArc(arc);
+ }
+ }
+ // Remove flipped arcs
+ else if (arc->v1->weight > arc->v2->weight)
+ {
+ // Decrement degree from the other node
+ OTHER_NODE(arc, newNode)->degree--;
+
+ BLI_remlink(&rg->arcs, arc);
+ freeArc(arc);
+ }
+ else
+ {
+ newNode->degree++; // incrementing degree since we're adding an arc
+
+ if (merging)
+ {
+ // resize bucket list
+ resizeArcBuckets(arc);
+ mergeArcBuckets(arc, srcArc, arc->v1->weight, arc->v2->weight);
+ }
+ }
+ }
+
+ arc = nextArc;
+ }
+}
+
+void filterNullReebGraph(ReebGraph *rg)
+{
+ ReebArc *arc = NULL, *nextArc = NULL;
+
+ arc = rg->arcs.first;
+ while(arc)
+ {
+ nextArc = arc->next;
+ // Only collapse arcs too short to have any embed bucket
+ if (arc->bcount == 0)
+ {
+ ReebNode *newNode = arc->v1;
+ ReebNode *removedNode = arc->v2;
+ float blend;
+
+ blend = (float)newNode->degree / (float)(newNode->degree + removedNode->degree); // blending factors
+
+ //newNode->weight = FloatLerpf(newNode->weight, removedNode->weight, blend);
+ VecLerpf(newNode->p, newNode->p, removedNode->p, blend);
+
+ filterArc(rg, newNode, removedNode, arc, 0);
+
+ // Reset nextArc, it might have changed
+ nextArc = arc->next;
+
+ BLI_remlink(&rg->arcs, arc);
+ freeArc(arc);
+
+ BLI_freelinkN(&rg->nodes, removedNode);
+ }
+
+ arc = nextArc;
+ }
+}
+
+int filterInternalReebGraph(ReebGraph *rg, float threshold)
+{
+ ReebArc *arc = NULL, *nextArc = NULL;
+ int value = 0;
+
+ BLI_sortlist(&rg->arcs, compareArcs);
+
+ arc = rg->arcs.first;
+ while(arc)
+ {
+ nextArc = arc->next;
+
+ // Only collapse non-terminal arcs that are shorter than threshold
+ if ((arc->v1->degree > 1 && arc->v2->degree > 1 && arc->v2->weight - arc->v1->weight < threshold))
+ {
+ ReebNode *newNode = NULL;
+ ReebNode *removedNode = NULL;
+
+ /* Keep the node with the highestn number of connected arcs */
+ if (arc->v1->degree >= arc->v2->degree)
+ {
+ newNode = arc->v1;
+ removedNode = arc->v2;
+ }
+ else
+ {
+ newNode = arc->v2;
+ removedNode = arc->v1;
+ }
+
+ filterArc(rg, newNode, removedNode, arc, 1);
+
+ // Reset nextArc, it might have changed
+ nextArc = arc->next;
+
+ BLI_remlink(&rg->arcs, arc);
+ freeArc(arc);
+
+ BLI_freelinkN(&rg->nodes, removedNode);
+ value = 1;
+ }
+
+ arc = nextArc;
+ }
+
+ return value;
+}
+
+int filterExternalReebGraph(ReebGraph *rg, float threshold)
+{
+ ReebArc *arc = NULL, *nextArc = NULL;
+ int value = 0;
+
+ BLI_sortlist(&rg->arcs, compareArcs);
+
+ arc = rg->arcs.first;
+ while(arc)
+ {
+ nextArc = arc->next;
+
+ // Only collapse terminal arcs that are shorter than threshold
+ if ((arc->v1->degree == 1 || arc->v2->degree == 1) && arc->v2->weight - arc->v1->weight < threshold)
+ {
+ ReebNode *terminalNode = NULL;
+ ReebNode *middleNode = NULL;
+ ReebNode *newNode = NULL;
+ ReebNode *removedNode = NULL;
+ int merging = 0;
+
+ // Assign terminal and middle nodes
+ if (arc->v1->degree == 1)
+ {
+ terminalNode = arc->v1;
+ middleNode = arc->v2;
+ }
+ else
+ {
+ terminalNode = arc->v2;
+ middleNode = arc->v1;
+ }
+
+ // If middle node is a normal node, merge to terminal node
+ if (middleNode->degree == 2)
+ {
+ merging = 1;
+ newNode = terminalNode;
+ removedNode = middleNode;
+ }
+ // Otherwise, just plain remove of the arc
+ else
+ {
+ merging = 0;
+ newNode = middleNode;
+ removedNode = terminalNode;
+ }
+
+ // Merging arc
+ if (merging)
+ {
+ filterArc(rg, newNode, removedNode, arc, 1);
+ }
+ else
+ {
+ // removing arc, so we need to decrease the degree of the remaining node
+ newNode->degree--;
+ }
+
+ // Reset nextArc, it might have changed
+ nextArc = arc->next;
+
+ BLI_remlink(&rg->arcs, arc);
+ freeArc(arc);
+
+ BLI_freelinkN(&rg->nodes, removedNode);
+ value = 1;
+ }
+
+ arc = nextArc;
+ }
+
+ return value;
+}
+
+/************************************** WEIGHT SPREADING ***********************************************/
+
+int compareVerts( const void* a, const void* b )
+{
+ EditVert *va = *(EditVert**)a;
+ EditVert *vb = *(EditVert**)b;
+ int value = 0;
+
+ if (va->tmp.fp < vb->tmp.fp)
+ {
+ value = -1;
+ }
+ else if (va->tmp.fp > vb->tmp.fp)
+ {
+ value = 1;
+ }
+
+ return value;
+}
+
+void spreadWeight(EditMesh *em)
+{
+ EditVert **verts, *eve;
+ float lastWeight = 0.0f;
+ int totvert = BLI_countlist(&em->verts);
+ int i;
+ int work_needed = 1;
+
+ verts = MEM_callocN(sizeof(EditVert*) * totvert, "verts array");
+
+ for(eve = em->verts.first, i = 0; eve; eve = eve->next, i++)
+ {
+ verts[i] = eve;
+ }
+
+ while(work_needed == 1)
+ {
+ work_needed = 0;
+ qsort(verts, totvert, sizeof(EditVert*), compareVerts);
+
+ for(i = 0; i < totvert; i++)
+ {
+ eve = verts[i];
+
+ if (i == 0 || (eve->tmp.fp - lastWeight) > FLT_EPSILON)
+ {
+ lastWeight = eve->tmp.fp;
+ }
+ else
+ {
+ work_needed = 1;
+ eve->tmp.fp = lastWeight + FLT_EPSILON * 2;
+ lastWeight = eve->tmp.fp;
+ }
+ }
+ }
+
+ MEM_freeN(verts);
+}
+/*********************************** GRAPH AS TREE FUNCTIONS *******************************************/
+
+int subtreeDepth(ReebNode *node, ReebArc *rootArc)
+{
+ int depth = 0;
+
+ /* Base case, no arcs leading away */
+ if (node->arcs == NULL || *(node->arcs) == NULL)
+ {
+ return 0;
+ }
+ else
+ {
+ ReebArc ** pArc;
+
+ for(pArc = node->arcs; *pArc; pArc++)
+ {
+ ReebArc *arc = *pArc;
+
+ /* only arcs that go down the tree */
+ if (arc != rootArc)
+ {
+ ReebNode *newNode = OTHER_NODE(arc, node);
+ depth = MAX2(depth, subtreeDepth(newNode, arc));
+ }
+ }
+ }
+
+ return depth + 1;
+}
+
+/*************************************** CYCLE DETECTION ***********************************************/
+
+int detectCycle(ReebNode *node, ReebArc *srcArc)
+{
+ int value = 0;
+
+ if (node->flags == 0)
+ {
+ ReebArc ** pArc;
+
+ /* mark node as visited */
+ node->flags = 1;
+
+ for(pArc = node->arcs; *pArc && value == 0; pArc++)
+ {
+ ReebArc *arc = *pArc;
+
+ /* don't go back on the source arc */
+ if (arc != srcArc)
+ {
+ value = detectCycle(OTHER_NODE(arc, node), arc);
+ }
+ }
+ }
+ else
+ {
+ value = 1;
+ }
+
+ return value;
+}
+
+int isGraphCyclic(ReebGraph *rg)
+{
+ ReebNode *node;
+ int value = 0;
+
+ /* NEED TO CHECK IF ADJACENCY LIST EXIST */
+
+ /* Mark all nodes as not visited */
+ for(node = rg->nodes.first; node; node = node->next)
+ {
+ node->flags = 0;
+ }
+
+ /* detectCycles in subgraphs */
+ for(node = rg->nodes.first; node && value == 0; node = node->next)
+ {
+ /* only for nodes in subgraphs that haven't been visited yet */
+ if (node->flags == 0)
+ {
+ value = value || detectCycle(node, NULL);
+ }
+ }
+
+ return value;
+}
+
+/******************************************** EXPORT ***************************************************/
+
+void exportNode(FILE *f, char *text, ReebNode *node)
+{
+ fprintf(f, "%s i:%i w:%f d:%i %f %f %f\n", text, node->index, node->weight, node->degree, node->p[0], node->p[1], node->p[2]);
+}
+
+void exportGraph(ReebGraph *rg, int count)
+{
+#ifdef DEBUG_REEB
+ ReebArc *arc;
+ char filename[128];
+ FILE *f;
+
+ if (count == -1)
+ {
+ sprintf(filename, "test.txt");
+ }
+ else
+ {
+ sprintf(filename, "test%05i.txt", count);
+ }
+ f = fopen(filename, "w");
+
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ int i;
+
+ exportNode(f, "v1", arc->v1);
+
+ for(i = 0; i < arc->bcount; i++)
+ {
+ fprintf(f, "b nv:%i %f %f %f\n", arc->buckets[i].nv, arc->buckets[i].p[0], arc->buckets[i].p[1], arc->buckets[i].p[2]);
+ }
+
+ exportNode(f, "v2", arc->v2);
+ }
+
+ fclose(f);
+#endif
+}
+
+/***************************************** MAIN ALGORITHM **********************************************/
+
+ReebArc * findConnectedArc(ReebGraph *rg, ReebArc *arc, ReebNode *v)
+{
+ ReebArc *nextArc = arc->next;
+
+ for(nextArc = rg->arcs.first; nextArc; nextArc = nextArc->next)
+ {
+ if (arc != nextArc && (nextArc->v1 == v || nextArc->v2 == v))
+ {
+ break;
+ }
+ }
+
+ return nextArc;
+}
+
+void removeNormalNodes(ReebGraph *rg)
+{
+ ReebArc *arc;
+
+ // Merge degree 2 nodes
+ for(arc = rg->arcs.first; arc; arc = arc->next)
+ {
+ while (arc->v1->degree == 2 || arc->v2->degree == 2)
+ {
+ // merge at v1
+ if (arc->v1->degree == 2)
+ {
+ ReebArc *nextArc = findConnectedArc(rg, arc, arc->v1);
+
+ // Merge arc only if needed
+ if (arc->v1 == nextArc->v2)
+ {
+ mergeConnectedArcs(rg, arc, nextArc);
+ }
+ // Otherwise, mark down vert
+ else
+ {
+ arc->v1->degree = 3;
+ }
+ }
+
+ // merge at v2
+ if (arc->v2->degree == 2)
+ {
+ ReebArc *nextArc = findConnectedArc(rg, arc, arc->v2);
+
+ // Merge arc only if needed
+ if (arc->v2 == nextArc->v1)
+ {
+ mergeConnectedArcs(rg, arc, nextArc);
+ }
+ // Otherwise, mark down vert
+ else
+ {
+ arc->v2->degree = 3;
+ }
+ }
+ }
+ }
+
+}
+
+int edgeEquals(ReebEdge *e1, ReebEdge *e2)
+{
+ return (e1->v1 == e2->v1 && e1->v2 == e2->v2);
+}
+
+ReebArc *nextArcMappedToEdge(ReebArc *arc, ReebEdge *e)
+{
+ ReebEdge *nextEdge = NULL;
+ ReebEdge *edge = NULL;
+ ReebArc *result = NULL;
+
+ /* Find the ReebEdge in the edge list */
+ for(edge = arc->edges.first; edge && !edgeEquals(edge, e); edge = edge->next)
+ { }
+
+ nextEdge = edge->nextEdge;
+
+ if (nextEdge != NULL)
+ {
+ result = nextEdge->arc;
+ }
+
+ return result;
+}
+
+typedef enum {
+ MERGE_LOWER,
+ MERGE_HIGHER,
+ MERGE_APPEND
+} MergeDirection;
+
+void mergeArcEdges(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc, MergeDirection direction)
+{
+ ReebEdge *e = NULL;
+
+ if (direction == MERGE_APPEND)
+ {
+ for(e = aSrc->edges.first; e; e = e->next)
+ {
+ e->arc = aDst; // Edge is stolen by new arc
+ }
+
+ addlisttolist(&aDst->edges , &aSrc->edges);
+ }
+ else
+ {
+ for(e = aSrc->edges.first; e; e = e->next)
+ {
+ ReebEdge *newEdge = copyEdge(e);
+
+ newEdge->arc = aDst;
+
+ BLI_addtail(&aDst->edges, newEdge);
+
+ if (direction == MERGE_LOWER)
+ {
+ void **p = BLI_edgehash_lookup_p(rg->emap, e->v1->index, e->v2->index);
+
+ newEdge->nextEdge = e;
+
+ // if edge was the first in the list, point the edit edge to the new reeb edge instead.
+ if (*p == e)
+ {
+ *p = (void*)newEdge;
+ }
+ // otherwise, advance in the list until the predecessor is found then insert it there
+ else
+ {
+ ReebEdge *previous = (ReebEdge*)*p;
+
+ while(previous->nextEdge != e)
+ {
+ previous = previous->nextEdge;
+ }
+
+ previous->nextEdge = newEdge;
+ }
+ }
+ else
+ {
+ newEdge->nextEdge = e->nextEdge;
+ e->nextEdge = newEdge;
+ }
+ }
+ }
+}
+
+// return 1 on full merge
+int mergeConnectedArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1)
+{
+ int result = 0;
+ ReebNode *removedNode = NULL;
+
+ mergeArcEdges(rg, a0, a1, MERGE_APPEND);
+
+ // Bring a0 to the combine length of both arcs
+ if (a0->v2 == a1->v1)
+ {
+ removedNode = a0->v2;
+ a0->v2 = a1->v2;
+ }
+ else if (a0->v1 == a1->v2)
+ {
+ removedNode = a0->v1;
+ a0->v1 = a1->v1;
+ }
+
+ resizeArcBuckets(a0);
+ // Merge a1 in a0
+ mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
+
+ // remove a1 from graph
+ BLI_remlink(&rg->arcs, a1);
+ freeArc(a1);
+
+ BLI_freelinkN(&rg->nodes, removedNode);
+ result = 1;
+
+ return result;
+}
+// return 1 on full merge
+int mergeArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1)
+{
+ int result = 0;
+ // TRIANGLE POINTS DOWN
+ if (a0->v1->weight == a1->v1->weight) // heads are the same
+ {
+ if (a0->v2->weight == a1->v2->weight) // tails also the same, arcs can be totally merge together
+ {
+ mergeArcEdges(rg, a0, a1, MERGE_APPEND);
+
+ mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
+
+ // Adjust node degree
+ a1->v1->degree--;
+ a1->v2->degree--;
+
+ // remove a1 from graph
+ BLI_remlink(&rg->arcs, a1);
+
+ freeArc(a1);
+ result = 1;
+ }
+ else if (a0->v2->weight > a1->v2->weight) // a1->v2->weight is in the middle
+ {
+ mergeArcEdges(rg, a1, a0, MERGE_LOWER);
+
+ // Adjust node degree
+ a0->v1->degree--;
+ a1->v2->degree++;
+
+ mergeArcBuckets(a1, a0, a1->v1->weight, a1->v2->weight);
+ a0->v1 = a1->v2;
+ resizeArcBuckets(a0);
+ }
+ else // a0>n2 is in the middle
+ {
+ mergeArcEdges(rg, a0, a1, MERGE_LOWER);
+
+ // Adjust node degree
+ a1->v1->degree--;
+ a0->v2->degree++;
+
+ mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
+ a1->v1 = a0->v2;
+ resizeArcBuckets(a1);
+ }
+ }
+ // TRIANGLE POINTS UP
+ else if (a0->v2->weight == a1->v2->weight) // tails are the same
+ {
+ if (a0->v1->weight > a1->v1->weight) // a0->v1->weight is in the middle
+ {
+ mergeArcEdges(rg, a0, a1, MERGE_HIGHER);
+
+ // Adjust node degree
+ a1->v2->degree--;
+ a0->v1->degree++;
+
+ mergeArcBuckets(a0, a1, a0->v1->weight, a0->v2->weight);
+ a1->v2 = a0->v1;
+ resizeArcBuckets(a1);
+ }
+ else // a1->v1->weight is in the middle
+ {
+ mergeArcEdges(rg, a1, a0, MERGE_HIGHER);
+
+ // Adjust node degree
+ a0->v2->degree--;
+ a1->v1->degree++;
+
+ mergeArcBuckets(a1, a0, a1->v1->weight, a1->v2->weight);
+ a0->v2 = a1->v1;
+ resizeArcBuckets(a0);
+ }
+ }
+ else
+ {
+ // Need something here (OR NOT)
+ }
+
+ return result;
+}
+
+void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, ReebEdge *e1)
+{
+ int total = 0;
+ while (total == 0 && a0 != a1 && a0 != NULL && a1 != NULL)
+ {
+ total = mergeArcs(rg, a0, a1);
+
+ if (total == 0) // if it wasn't a total merge, go forward
+ {
+ if (a0->v2->weight < a1->v2->weight)
+ {
+ a0 = nextArcMappedToEdge(a0, e0);
+ }
+ else
+ {
+ a1 = nextArcMappedToEdge(a1, e1);
+ }
+ }
+ }
+}
+
+void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2)
+{
+ ReebArc *a0, *a1, *a2;
+ a0 = e0->arc;
+ a1 = e1->arc;
+ a2 = e2->arc;
+
+ glueByMergeSort(rg, a0, a1, e0, e1);
+ glueByMergeSort(rg, a0, a2, e0, e2);
+}
+
+ReebNode * addNode(ReebGraph *rg, EditVert *eve, float weight)
+{
+ ReebNode *node = NULL;
+
+ node = MEM_callocN(sizeof(ReebNode), "reeb node");
+
+ node->flags = 0; // clear flags on init
+ node->arcs = NULL;
+ node->degree = 0;
+ node->weight = weight;
+ node->index = rg->totnodes;
+ VECCOPY(node->p, eve->co);
+
+ BLI_addtail(&rg->nodes, node);
+ rg->totnodes++;
+
+ return node;
+}
+
+ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
+{
+ ReebEdge *edge;
+
+ edge = BLI_edgehash_lookup(rg->emap, node1->index, node2->index);
+
+ // Only add existing edges that haven't been added yet
+ if (edge == NULL)
+ {
+ ReebArc *arc;
+ ReebNode *v1, *v2;
+ float len, offset;
+ int i;
+
+ arc = MEM_callocN(sizeof(ReebArc), "reeb arc");
+ edge = MEM_callocN(sizeof(ReebEdge), "reeb edge");
+
+ arc->flags = 0; // clear flags on init
+
+ if (node1->weight <= node2->weight)
+ {
+ v1 = node1;
+ v2 = node2;
+ }
+ else
+ {
+ v1 = node2;
+ v2 = node1;
+ }
+
+ arc->v1 = v1;
+ arc->v2 = v2;
+
+ // increase node degree
+ v1->degree++;
+ v2->degree++;
+
+ BLI_edgehash_insert(rg->emap, node1->index, node2->index, edge);
+
+ edge->arc = arc;
+ edge->nextEdge = NULL;
+ edge->v1 = v1;
+ edge->v2 = v2;
+
+ BLI_addtail(&rg->arcs, arc);
+ BLI_addtail(&arc->edges, edge);
+
+ /* adding buckets for embedding */
+ allocArcBuckets(arc);
+
+ offset = arc->v1->weight;
+ len = arc->v2->weight - arc->v1->weight;
+
+#if 0
+ /* This is the actual embedding filling described in the paper
+ * the problem is that it only works with really dense meshes
+ */
+ if (arc->bcount > 0)
+ {
+ addVertToBucket(&(arc->buckets[0]), arc->v1->co);
+ addVertToBucket(&(arc->buckets[arc->bcount - 1]), arc->v2->co);
+ }
+#else
+ for(i = 0; i < arc->bcount; i++)
+ {
+ float co[3];
+ float f = (arc->buckets[i].val - offset) / len;
+
+ VecLerpf(co, v1->p, v2->p, f);
+ addVertToBucket(&(arc->buckets[i]), co);
+ }
+#endif
+
+ }
+
+ return edge;
+}
+
+void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode * n3)
+{
+ ReebEdge *re1, *re2, *re3;
+ ReebEdge *e1, *e2, *e3;
+ float len1, len2, len3;
+
+ re1 = createArc(rg, n1, n2);
+ re2 = createArc(rg, n2, n3);
+ re3 = createArc(rg, n3, n1);
+
+ len1 = (float)fabs(n1->weight - n2->weight);
+ len2 = (float)fabs(n2->weight - n3->weight);
+ len3 = (float)fabs(n3->weight - n1->weight);
+
+ /* The rest of the algorithm assumes that e1 is the longest edge */
+
+ if (len1 >= len2 && len1 >= len3)
+ {
+ e1 = re1;
+ e2 = re2;
+ e3 = re3;
+ }
+ else if (len2 >= len1 && len2 >= len3)
+ {
+ e1 = re2;
+ e2 = re1;
+ e3 = re3;
+ }
+ else
+ {
+ e1 = re3;
+ e2 = re2;
+ e3 = re1;
+ }
+
+ /* And e2 is the lowest edge
+ * If e3 is lower than e2, swap them
+ */
+ if (e3->v1->weight < e2->v1->weight)
+ {
+ ReebEdge *etmp = e2;
+ e2 = e3;
+ e3 = etmp;
+ }
+
+
+ mergePaths(rg, e1, e2, e3);
+}
+
+ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
+{
+ ReebGraph *rg;
+ struct DynamicList * dlist;
+ EditVert *eve;
+ EditFace *efa;
+ int index;
+ int totvert;
+ int totfaces;
+
+#ifdef DEBUG_REEB
+ int countfaces = 0;
+#endif
+
+ rg = MEM_callocN(sizeof(ReebGraph), "reeb graph");
+
+ rg->totnodes = 0;
+ rg->emap = BLI_edgehash_new();
+
+ totvert = BLI_countlist(&em->verts);
+ totfaces = BLI_countlist(&em->faces);
+
+ renormalizeWeight(em, 1.0f);
+
+ /* Spread weight to minimize errors */
+ spreadWeight(em);
+
+ renormalizeWeight(em, (float)subdivisions);
+
+ /* Adding vertice */
+ for(index = 0, eve = em->verts.first; eve; index++, eve = eve->next)
+ {
+ eve->hash = index;
+ eve->f2 = 0;
+ eve->tmp.p = addNode(rg, eve, eve->tmp.fp);
+ }
+
+ /* Temporarely convert node list to dynamic list, for indexed access */
+ dlist = BLI_dlist_from_listbase(&rg->nodes);
+
+ /* Adding face, edge per edge */
+ for(efa = em->faces.first; efa; efa = efa->next)
+ {
+ ReebNode *n1, *n2, *n3;
+
+ n1 = (ReebNode*)BLI_dlist_find_link(dlist, efa->v1->hash);
+ n2 = (ReebNode*)BLI_dlist_find_link(dlist, efa->v2->hash);
+ n3 = (ReebNode*)BLI_dlist_find_link(dlist, efa->v3->hash);
+
+ addTriangleToGraph(rg, n1, n2, n3);
+
+ if (efa->v4)
+ {
+ ReebNode *n4 = (ReebNode*)efa->v4->tmp.p;
+ addTriangleToGraph(rg, n1, n3, n4);
+ }
+
+#ifdef DEBUG_REEB
+ countfaces++;
+ if (countfaces % 100 == 0)
+ {
+ printf("face %i of %i\n", countfaces, totfaces);
+ }
+#endif
+
+
+ }
+ BLI_listbase_from_dlist(dlist, &rg->nodes);
+
+ removeNormalNodes(rg);
+
+ return rg;
+}
+
+/***************************************** WEIGHT UTILS **********************************************/
+
+void renormalizeWeight(EditMesh *em, float newmax)
+{
+ EditVert *eve;
+ float minimum, maximum, range;
+
+ if (em == NULL || BLI_countlist(&em->verts) == 0)
+ return;
+
+ /* First pass, determine maximum and minimum */
+ eve = em->verts.first;
+ minimum = eve->tmp.fp;
+ maximum = eve->tmp.fp;
+ for(eve = em->verts.first; eve; eve = eve->next)
+ {
+ maximum = MAX2(maximum, eve->tmp.fp);
+ minimum = MIN2(minimum, eve->tmp.fp);
+ }
+
+ range = maximum - minimum;
+
+ /* Normalize weights */
+ for(eve = em->verts.first; eve; eve = eve->next)
+ {
+ eve->tmp.fp = (eve->tmp.fp - minimum) / range * newmax;
+ }
+}
+
+
+int weightFromLoc(EditMesh *em, int axis)
+{
+ EditVert *eve;
+
+ if (em == NULL || BLI_countlist(&em->verts) == 0 || axis < 0 || axis > 2)
+ return 0;
+
+ /* Copy coordinate in weight */
+ for(eve = em->verts.first; eve; eve = eve->next)
+ {
+ eve->tmp.fp = eve->co[axis];
+ }
+
+ return 1;
+}
+
+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;
+}
+
+int weightToHarmonic(EditMesh *em)
+{
+ NLboolean success;
+ EditVert *eve;
+ EditEdge *eed;
+ EditFace *efa;
+ int totvert = 0;
+ int index;
+ int rval;
+
+ /* Find local extrema */
+ for(eve = em->verts.first; eve; eve = eve->next)
+ {
+ totvert++;
+ }
+
+ /* Solve with openNL */
+
+ nlNewContext();
+
+ nlSolverParameteri(NL_NB_VARIABLES, totvert);
+
+ nlBegin(NL_SYSTEM);
+
+ /* Find local extrema */
+ for(index = 0, eve = em->verts.first; eve; index++, eve = eve->next)
+ {
+ EditEdge *eed;
+ int maximum = 1;
+ int minimum = 1;
+
+ eve->hash = index; /* Assign index to vertex */
+
+ NextEdgeForVert(NULL, NULL); /* Reset next edge */
+ for(eed = NextEdgeForVert(em, eve); eed && (maximum || minimum); eed = NextEdgeForVert(em, eve))
+ {
+ EditVert *eve2;
+
+ if (eed->v1 == eve)
+ {
+ eve2 = eed->v2;
+ }
+ else
+ {
+ eve2 = eed->v1;
+ }
+
+ /* Adjacent vertex is bigger, not a local maximum */
+ if (eve2->tmp.fp > eve->tmp.fp)
+ {
+ maximum = 0;
+ }
+ /* Adjacent vertex is smaller, not a local minimum */
+ else if (eve2->tmp.fp < eve->tmp.fp)
+ {
+ minimum = 0;
+ }
+ }
+
+ if (maximum || minimum)
+ {
+ float w = eve->tmp.fp;
+ eve->f1 = 0;
+ nlSetVariable(0, index, w);
+ nlLockVariable(index);
+ }
+ else
+ {
+ eve->f1 = 1;
+ }
+ }
+
+ nlBegin(NL_MATRIX);
+
+ /* Zero edge weight */
+ for(eed = em->edges.first; eed; eed = eed->next)
+ {
+ eed->tmp.l = 0;
+ }
+
+ /* Add faces count to the edge weight */
+ for(efa = em->faces.first; efa; efa = efa->next)
+ {
+ efa->e1->tmp.l++;
+ efa->e2->tmp.l++;
+ efa->e3->tmp.l++;
+ }
+
+ /* Add faces angle to the edge weight */
+ for(efa = em->faces.first; efa; efa = efa->next)
+ {
+ /* Angle opposite e1 */
+ float t1= cotan_weight(efa->v1->co, efa->v2->co, efa->v3->co) / efa->e2->tmp.l;
+
+ /* Angle opposite e2 */
+ float t2 = cotan_weight(efa->v2->co, efa->v3->co, efa->v1->co) / efa->e3->tmp.l;
+
+ /* Angle opposite e3 */
+ float t3 = cotan_weight(efa->v3->co, efa->v1->co, efa->v2->co) / efa->e1->tmp.l;
+
+ int i1 = efa->v1->hash;
+ int i2 = efa->v2->hash;
+ int i3 = efa->v3->hash;
+
+ nlMatrixAdd(i1, i1, t2+t3);
+ nlMatrixAdd(i2, i2, t1+t3);
+ nlMatrixAdd(i3, i3, t1+t2);
+
+ nlMatrixAdd(i1, i2, -t3);
+ nlMatrixAdd(i2, i1, -t3);
+
+ nlMatrixAdd(i2, i3, -t1);
+ nlMatrixAdd(i3, i2, -t1);
+
+ nlMatrixAdd(i3, i1, -t2);
+ nlMatrixAdd(i1, i3, -t2);
+ }
+
+ nlEnd(NL_MATRIX);
+
+ nlEnd(NL_SYSTEM);
+
+ success = nlSolveAdvanced(NULL, NL_TRUE);
+
+ if (success)
+ {
+ rval = 1;
+ for(index = 0, eve = em->verts.first; eve; index++, eve = eve->next)
+ {
+ eve->tmp.fp = nlGetVariable(0, index);
+ }
+ }
+ else
+ {
+ rval = 0;
+ }
+
+ nlDeleteContext(nlGetCurrent());
+
+ return rval;
+}
+
+
+EditEdge * NextEdgeForVert(EditMesh *em, EditVert *v)
+{
+ static EditEdge *e = NULL;
+
+ /* Reset method, call with NULL mesh pointer */
+ if (em == NULL)
+ {
+ e = NULL;
+ return NULL;
+ }
+
+ /* first pass, start at the head of the list */
+ if (e == NULL)
+ {
+ e = em->edges.first;
+ }
+ /* subsequent passes, start on the next edge */
+ else
+ {
+ e = e->next;
+ }
+
+ for( ; e ; e = e->next)
+ {
+ if (e->v1 == v || e->v2 == v)
+ {
+ break;
+ }
+ }
+
+ return e;
+}
+
+int weightFromDistance(EditMesh *em)
+{
+ EditVert *eve;
+ int totedge = 0;
+ int vCount = 0;
+
+ if (em == NULL || BLI_countlist(&em->verts) == 0)
+ {
+ return 0;
+ }
+
+ totedge = BLI_countlist(&em->edges);
+
+ if (totedge == 0)
+ {
+ return 0;
+ }
+
+ /* Initialize vertice flags and find at least one selected vertex */
+ for(eve = em->verts.first; eve && vCount == 0; eve = eve->next)
+ {
+ eve->f1 = 0;
+ if (eve->f & SELECT)
+ {
+ vCount = 1;
+ }
+ }
+
+ if (vCount == 0)
+ {
+ return 0; /* no selected vert, failure */
+ }
+ else
+ {
+ EditVert *eve, *current_eve = NULL;
+ /* Apply dijkstra spf for each selected vert */
+ for(eve = em->verts.first; eve; eve = eve->next)
+ {
+ if (eve->f & SELECT)
+ {
+ current_eve = eve;
+ eve->f1 = 1;
+
+ {
+ EditEdge *eed = NULL;
+ EditEdge *select_eed = NULL;
+ EditEdge **edges = NULL;
+ float currentWeight = 0;
+ int eIndex = 0;
+
+ edges = MEM_callocN(totedge * sizeof(EditEdge*), "Edges");
+
+ /* Calculate edge weight and initialize edge flags */
+ for(eed= em->edges.first; eed; eed= eed->next)
+ {
+ eed->tmp.fp = VecLenf(eed->v1->co, eed->v2->co);
+ eed->f1 = 0;
+ }
+
+ do {
+ int i;
+
+ current_eve->f1 = 1; /* mark vertex as selected */
+
+ /* Add all new edges connected to current_eve to the list */
+ NextEdgeForVert(NULL, NULL); // Reset next edge
+ for(eed = NextEdgeForVert(em, current_eve); eed; eed = NextEdgeForVert(em, current_eve))
+ {
+ if (eed->f1 == 0)
+ {
+ edges[eIndex] = eed;
+ eed->f1 = 1;
+ eIndex++;
+ }
+ }
+
+ /* Find next shortest edge */
+ select_eed = NULL;
+ for(i = 0; i < eIndex; i++)
+ {
+ eed = edges[i];
+
+ if (eed->f1 != 2 && (eed->v1->f1 == 0 || eed->v2->f1 == 0)) /* eed is not selected yet and leads to a new node */
+ {
+ float newWeight = 0;
+ if (eed->v1->f1 == 1)
+ {
+ newWeight = eed->v1->tmp.fp + eed->tmp.fp;
+ }
+ else
+ {
+ newWeight = eed->v2->tmp.fp + eed->tmp.fp;
+ }
+
+ if (select_eed == NULL || newWeight < currentWeight) /* no selected edge or current smaller than selected */
+ {
+ currentWeight = newWeight;
+ select_eed = eed;
+ }
+ }
+ }
+
+ if (select_eed != NULL)
+ {
+ select_eed->f1 = 2;
+
+ if (select_eed->v1->f1 == 0) /* v1 is the new vertex */
+ {
+ current_eve = select_eed->v1;
+ }
+ else /* otherwise, it's v2 */
+ {
+ current_eve = select_eed->v2;
+ }
+ current_eve->tmp.fp = currentWeight;
+ }
+ } while (select_eed != NULL);
+
+ MEM_freeN(edges);
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+MCol MColFromWeight(EditVert *eve)
+{
+ MCol col;
+ col.a = 255;
+ col.b = (char)(eve->tmp.fp * 255);
+ col.g = 0;
+ col.r = (char)((1.0f - eve->tmp.fp) * 255);
+ return col;
+}
+
+void weightToVCol(EditMesh *em)
+{
+ EditFace *efa;
+ MCol *mcol;
+ if (!EM_vertColorCheck()) {
+ return;
+ }
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+
+ mcol[0] = MColFromWeight(efa->v1);
+ mcol[1] = MColFromWeight(efa->v2);
+ mcol[2] = MColFromWeight(efa->v3);
+
+ if(efa->v4) {
+ mcol[3] = MColFromWeight(efa->v4);
+ }
+ }
+}
+
+/****************************************** BUCKET ITERATOR **************************************************/
+
+void initArcIterator(ReebArcIterator *iter, ReebArc *arc, ReebNode *head)
+{
+ iter->arc = arc;
+
+ if (head == arc->v1)
+ {
+ iter->start = 0;
+ iter->end = arc->bcount - 1;
+ iter->stride = 1;
+ }
+ else
+ {
+ iter->start = arc->bcount - 1;
+ iter->end = 0;
+ iter->stride = -1;
+ }
+
+ iter->index = iter->start - iter->stride;
+}
+
+void initArcIterator2(ReebArcIterator *iter, ReebArc *arc, int start, int end)
+{
+ iter->arc = arc;
+
+ iter->start = start;
+ iter->end = end;
+
+ if (end > start)
+ {
+ iter->stride = 1;
+ }
+ else
+ {
+ iter->stride = -1;
+ }
+
+ iter->index = iter->start - iter->stride;
+}
+
+EmbedBucket * nextBucket(ReebArcIterator *iter)
+{
+ EmbedBucket *result = NULL;
+
+ if (iter->index != iter->end)
+ {
+ iter->index += iter->stride;
+ result = &(iter->arc->buckets[iter->index]);
+ }
+
+ return result;
+}
diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c
index 2d56b78b026..46af717f2e3 100644
--- a/source/blender/src/renderwin.c
+++ b/source/blender/src/renderwin.c
@@ -894,11 +894,11 @@ void make_renderinfo_string(RenderStats *rs, char *str)
else if(G.scene->r.scemode & R_SINGLE_LAYER)
spos+= sprintf(spos, "Single Layer | ");
- if(rs->tothalo)
- spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d Ha:%d La:%d Mem:%.2fM (%.2fM) ", (G.scene->r.cfra), rs->totvert, rs->totface, rs->tothalo, rs->totlamp, megs_used_memory, mmap_used_memory);
- else
- spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d La:%d Mem:%.2fM (%.2fM) ", (G.scene->r.cfra), rs->totvert, rs->totface, rs->totlamp, megs_used_memory, mmap_used_memory);
-
+ spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d ", (G.scene->r.cfra), rs->totvert, rs->totface);
+ if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo);
+ if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand);
+ spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory);
+
if(rs->curfield)
spos+= sprintf(spos, "Field %d ", rs->curfield);
if(rs->curblur)
@@ -1241,6 +1241,21 @@ void BIF_do_render(int anim)
if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_POSTRENDER);
}
+void do_ogl_view3d_render(Render *re, View3D *v3d, int winx, int winy)
+{
+ float winmat[4][4];
+
+ update_for_newframe_muted(); /* here, since camera can be animated */
+
+ if(v3d->persp==2 && v3d->camera) {
+ /* in camera view, use actual render winmat */
+ RE_GetCameraWindow(re, v3d->camera, CFRA, winmat);
+ drawview3d_render(v3d, winx, winy, winmat);
+ }
+ else
+ drawview3d_render(v3d, winx, winy, NULL);
+}
+
/* set up display, render the current area view in an image */
/* the RE_Render is only used to make sure we got the picture in the result */
void BIF_do_ogl_render(View3D *v3d, int anim)
@@ -1256,7 +1271,7 @@ void BIF_do_ogl_render(View3D *v3d, int anim)
winy= (G.scene->r.size*G.scene->r.ysch)/100;
RE_InitState(re, &G.scene->r, winx, winy, NULL);
-
+
/* for now, result is defaulting to floats still... */
rr= RE_GetResult(re);
if(rr->rect32==NULL)
@@ -1282,8 +1297,12 @@ void BIF_do_ogl_render(View3D *v3d, int anim)
/* user event can close window */
if(render_win==NULL)
break;
- drawview3d_render(v3d, winx, winy);
+
+ do_ogl_view3d_render(re, v3d, winx, winy);
glReadPixels(0, 0, winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, rr->rect32);
+ if((G.scene->r.scemode & R_STAMP_INFO) && (G.scene->r.stamp & R_STAMP_DRAW)) {
+ BKE_stamp_buf((unsigned char *)rr->rect32, rr->rectf, rr->rectx, rr->recty, 3);
+ }
window_swap_buffers(render_win->win);
if(BKE_imtype_is_movie(G.scene->r.imtype)) {
@@ -1297,7 +1316,7 @@ void BIF_do_ogl_render(View3D *v3d, int anim)
BKE_makepicstring(name, G.scene->r.pic, G.scene->r.cfra, G.scene->r.imtype);
- ibuf->rect= (unsigned int *)rr->rect32;
+ ibuf->rect= (unsigned int *)rr->rect32;
ok= BKE_write_ibuf(ibuf, name, G.scene->r.imtype, G.scene->r.subimtype, G.scene->r.quality);
if(ok==0) {
@@ -1321,8 +1340,11 @@ void BIF_do_ogl_render(View3D *v3d, int anim)
CFRA= cfrao;
}
else {
- drawview3d_render(v3d, winx, winy);
+ do_ogl_view3d_render(re, v3d, winx, winy);
glReadPixels(0, 0, winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, rr->rect32);
+ if((G.scene->r.scemode & R_STAMP_INFO) && (G.scene->r.stamp & R_STAMP_DRAW)) {
+ BKE_stamp_buf((unsigned char *)rr->rect32, rr->rectf, rr->rectx, rr->recty, 3);
+ }
window_swap_buffers(render_win->win);
}
diff --git a/source/blender/src/resources.c b/source/blender/src/resources.c
index 125c80093a8..722675f0453 100644
--- a/source/blender/src/resources.c
+++ b/source/blender/src/resources.c
@@ -274,6 +274,8 @@ char *BIF_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
cp= ts->strip; break;
case TH_STRIP_SELECT:
cp= ts->strip_select; break;
+ case TH_CFRAME:
+ cp= ts->cframe; break;
case TH_SYNTAX_B:
cp= ts->syntaxb; break;
@@ -369,6 +371,68 @@ void BIF_InitTheme(void)
BLI_strncpy(btheme->tui.iconfile, "", sizeof(btheme->tui.iconfile));
+ /* bone color sets */
+ /* set 1 */
+ SETCOL(btheme->tarm[0].solid, 0x9a, 0x00, 0x00, 255);
+ SETCOL(btheme->tarm[0].select, 0xbd, 0x11, 0x11, 255);
+ SETCOL(btheme->tarm[0].active, 0xf7, 0x0a, 0x0a, 255);
+ /* set 2 */
+ SETCOL(btheme->tarm[1].solid, 0xf7, 0x40, 0x18, 255);
+ SETCOL(btheme->tarm[1].select, 0xf6, 0x69, 0x13, 255);
+ SETCOL(btheme->tarm[1].active, 0xfa, 0x99, 0x00, 255);
+ /* set 3 */
+ SETCOL(btheme->tarm[2].solid, 0x1e, 0x91, 0x09, 255);
+ SETCOL(btheme->tarm[2].select, 0x59, 0xb7, 0x0b, 255);
+ SETCOL(btheme->tarm[2].active, 0x83, 0xef, 0x1d, 255);
+ /* set 4 */
+ SETCOL(btheme->tarm[3].solid, 0x0a, 0x36, 0x94, 255);
+ SETCOL(btheme->tarm[3].select, 0x36, 0x67, 0xdf, 255);
+ SETCOL(btheme->tarm[3].active, 0x5e, 0xc1, 0xef, 255);
+ /* set 5 */
+ SETCOL(btheme->tarm[4].solid, 0xa9, 0x29, 0x4e, 255);
+ SETCOL(btheme->tarm[4].select, 0xc1, 0x41, 0x6a, 255);
+ SETCOL(btheme->tarm[4].active, 0xf0, 0x5d, 0x91, 255);
+ /* set 6 */
+ SETCOL(btheme->tarm[5].solid, 0x43, 0x0c, 0x78, 255);
+ SETCOL(btheme->tarm[5].select, 0x54, 0x3a, 0xa3, 255);
+ SETCOL(btheme->tarm[5].active, 0x87, 0x64, 0xd5, 255);
+ /* set 7 */
+ SETCOL(btheme->tarm[6].solid, 0x24, 0x78, 0x5a, 255);
+ SETCOL(btheme->tarm[6].select, 0x3c, 0x95, 0x79, 255);
+ SETCOL(btheme->tarm[6].active, 0x6f, 0xb6, 0xab, 255);
+ /* set 8 */
+ SETCOL(btheme->tarm[7].solid, 0x4b, 0x70, 0x7c, 255);
+ SETCOL(btheme->tarm[7].select, 0x6a, 0x86, 0x91, 255);
+ SETCOL(btheme->tarm[7].active, 0x9b, 0xc2, 0xcd, 255);
+ /* set 9 */
+ SETCOL(btheme->tarm[8].solid, 0xf4, 0xc9, 0x0c, 255);
+ SETCOL(btheme->tarm[8].select, 0xee, 0xc2, 0x36, 255);
+ SETCOL(btheme->tarm[8].active, 0xf3, 0xff, 0x00, 255);
+ /* set 10 */
+ SETCOL(btheme->tarm[9].solid, 0x1e, 0x20, 0x24, 255);
+ SETCOL(btheme->tarm[9].select, 0x48, 0x4c, 0x56, 255);
+ SETCOL(btheme->tarm[9].active, 0xff, 0xff, 0xff, 255);
+ /* set 11 */
+ SETCOL(btheme->tarm[10].solid, 0x6f, 0x2f, 0x6a, 255);
+ SETCOL(btheme->tarm[10].select, 0x98, 0x45, 0xbe, 255);
+ SETCOL(btheme->tarm[10].active, 0xd3, 0x30, 0xd6, 255);
+ /* set 12 */
+ SETCOL(btheme->tarm[11].solid, 0x6c, 0x8e, 0x22, 255);
+ SETCOL(btheme->tarm[11].select, 0x7f, 0xb0, 0x22, 255);
+ SETCOL(btheme->tarm[11].active, 0xbb, 0xef, 0x5b, 255);
+ /* set 13 */
+ SETCOL(btheme->tarm[12].solid, 0x8d, 0x8d, 0x8d, 255);
+ SETCOL(btheme->tarm[12].select, 0xb0, 0xb0, 0xb0, 255);
+ SETCOL(btheme->tarm[12].active, 0xde, 0xde, 0xde, 255);
+ /* set 14 */
+ SETCOL(btheme->tarm[13].solid, 0x83, 0x43, 0x26, 255);
+ SETCOL(btheme->tarm[13].select, 0x8b, 0x58, 0x11, 255);
+ SETCOL(btheme->tarm[13].active, 0xbd, 0x6a, 0x11, 255);
+ /* set 15 */
+ SETCOL(btheme->tarm[14].solid, 0x08, 0x31, 0x0e, 255);
+ SETCOL(btheme->tarm[14].select, 0x1c, 0x43, 0x0b, 255);
+ SETCOL(btheme->tarm[14].active, 0x34, 0x62, 0x2b, 255);
+
/* space view3d */
SETCOL(btheme->tv3d.back, 115, 115, 115, 255);
SETCOL(btheme->tv3d.text, 0, 0, 0, 255);
@@ -399,6 +463,7 @@ void BIF_InitTheme(void)
SETCOL(btheme->tv3d.normal, 0x22, 0xDD, 0xDD, 255);
SETCOL(btheme->tv3d.face_dot, 255, 138, 48, 255);
btheme->tv3d.facedot_size= 4;
+ SETCOL(btheme->tv3d.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tv3d.bone_solid, 200, 200, 200, 255);
SETCOL(btheme->tv3d.bone_pose, 80, 200, 255, 80); // alpha 80 is not meant editable, used for wire+action draw
@@ -450,6 +515,8 @@ void BIF_InitTheme(void)
SETCOL(btheme->tact.hilite, 17, 27, 60, 100); // bar
SETCOL(btheme->tact.strip_select, 0xff, 0xff, 0xaa, 255);
SETCOL(btheme->tact.strip, 0xe4, 0x9c, 0xc6, 255);
+ SETCOL(btheme->tact.group, 0x39, 0x7d, 0x1b, 255);
+ SETCOL(btheme->tact.group_active, 0x7d, 0xe9, 0x60, 255);
/* space nla */
btheme->tnla= btheme->tv3d;
@@ -543,7 +610,7 @@ void BIF_InitTheme(void)
char *BIF_ThemeColorsPup(int spacetype)
{
- char *cp= MEM_callocN(32*32, "theme pup");
+ char *cp= MEM_callocN(32*64, "theme pup");
char *str = cp;
if(spacetype==0) {
@@ -604,7 +671,8 @@ char *BIF_ThemeColorsPup(int spacetype)
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);
+ str += sprintf(str, "Bone Pose %%x%d|", TH_BONE_POSE);
+ str += sprintf(str, "Current Frame %%x%d", TH_CFRAME);
break;
case SPACE_IPO:
str += sprintf(str, "Panel %%x%d|", TH_PANEL);
@@ -615,6 +683,7 @@ char *BIF_ThemeColorsPup(int spacetype)
str += sprintf(str, "Vertex %%x%d|", TH_VERTEX);
str += sprintf(str, "Vertex Selected %%x%d|", TH_VERTEX_SELECT);
str += sprintf(str, "Vertex Size %%x%d|", TH_VERTEX_SIZE);
+ str += sprintf(str, "Current Frame %%x%d", TH_CFRAME);
break;
case SPACE_FILE:
str += sprintf(str, "Selected file %%x%d", TH_HILITE);
@@ -628,6 +697,7 @@ char *BIF_ThemeColorsPup(int spacetype)
str += sprintf(str, "Bars selected %%x%d|", TH_HILITE);
str += sprintf(str, "Strips %%x%d|", TH_STRIP);
str += sprintf(str, "Strips selected %%x%d|", TH_STRIP_SELECT);
+ str += sprintf(str, "Current Frame %%x%d", TH_CFRAME);
break;
case SPACE_ACTION:
//str += sprintf(str, "Panel %%x%d|", TH_PANEL);
@@ -637,8 +707,11 @@ char *BIF_ThemeColorsPup(int spacetype)
str += sprintf(str, "View Sliders %%x%d|", TH_SHADE1);
str += sprintf(str, "Channels %%x%d|", TH_SHADE2);
str += sprintf(str, "Channels Selected %%x%d|", TH_HILITE);
+ str += sprintf(str, "Channel Group %%x%d|", TH_GROUP);
+ str += sprintf(str, "Active Channel Group %%x%d|", TH_GROUP_ACTIVE);
str += sprintf(str, "Long Key %%x%d|", TH_STRIP);
str += sprintf(str, "Long Key selected %%x%d|", TH_STRIP_SELECT);
+ str += sprintf(str, "Current Frame %%x%d", TH_CFRAME);
break;
case SPACE_IMAGE:
str += sprintf(str, "%%l|");
@@ -660,10 +733,12 @@ char *BIF_ThemeColorsPup(int spacetype)
str += sprintf(str, "Plugin Strip %%x%d|", TH_SEQ_PLUGIN);
str += sprintf(str, "Transition Strip %%x%d|", TH_SEQ_TRANSITION);
str += sprintf(str, "Meta Strip %%x%d|", TH_SEQ_META);
+ str += sprintf(str, "Current Frame %%x%d", TH_CFRAME);
break;
case SPACE_SOUND:
str += sprintf(str, "Grid %%x%d|", TH_GRID);
str += sprintf(str, "Window Slider %%x%d|", TH_SHADE1);
+ str += sprintf(str, "Current Frame %%x%d", TH_CFRAME);
break;
case SPACE_BUTS:
str += sprintf(str, "Panel %%x%d|", TH_PANEL);
@@ -689,6 +764,7 @@ char *BIF_ThemeColorsPup(int spacetype)
break;
case SPACE_TIME:
str += sprintf(str, "Grid %%x%d|", TH_GRID);
+ str += sprintf(str, "Current Frame %%x%d", TH_CFRAME);
break;
case SPACE_NODE:
str += sprintf(str, "Wires %%x%d|", TH_WIRE);
diff --git a/source/blender/src/retopo.c b/source/blender/src/retopo.c
index 4ef07b73061..60be622e3ad 100644
--- a/source/blender/src/retopo.c
+++ b/source/blender/src/retopo.c
@@ -452,11 +452,8 @@ void retopo_force_update()
if(vd) {
if(vd->depths) vd->depths->damaged= 1;
retopo_queue_updates(vd);
- if(retopo_mesh_paint_check() && vd->retopo_view_data) {
- /* Force redraw */
- drawview3dspace(vd->area, vd);
- retopo_paint_view_update(vd);
- }
+ if(retopo_mesh_paint_check() && vd->retopo_view_data)
+ allqueue(REDRAWVIEW3D, 0);
}
}
}
@@ -841,7 +838,7 @@ void retopo_do_all()
bp= nu->bp;
for(i=0; i<nu->pntsv; ++i) {
for(j=0; j<nu->pntsu; ++j, ++bp) {
- if(bp->f1 & 1)
+ if(bp->f1 & SELECT)
retopo_do_vert(G.vd,bp->vec);
}
}
diff --git a/source/blender/src/sculptmode-stroke.c b/source/blender/src/sculptmode-stroke.c
index 2f8dac2818c..69c20eeeddf 100644
--- a/source/blender/src/sculptmode-stroke.c
+++ b/source/blender/src/sculptmode-stroke.c
@@ -31,11 +31,16 @@
*/
#include "MEM_guardedalloc.h"
+
#include "DNA_listBase.h"
#include "DNA_scene_types.h"
+
+#include "BKE_sculpt.h"
#include "BLI_blenlib.h"
#include "BIF_gl.h"
+
#include "BDR_sculptmode.h"
+
#include <math.h>
/* Temporary storage of input stroke control points */
@@ -173,7 +178,7 @@ float sculpt_stroke_final_length(SculptStroke *stroke)
}
/* 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)
+static StrokePoint *sculpt_stroke_apply_generic(SculptStroke *stroke, struct BrushAction *a, const int partial)
{
const int sdspace = sculpt_data()->spacing;
const short spacing = sdspace > 0 ? sdspace : 2;
@@ -210,13 +215,13 @@ static StrokePoint *sculpt_stroke_apply_generic(SculptStroke *stroke, struct Edi
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);
+ do_symmetrical_brush_actions(a, co, NULL);
}
return p ? p->next : NULL;
}
-void sculpt_stroke_apply(struct EditData *e)
+void sculpt_stroke_apply(struct BrushAction *a)
{
SculptStroke *stroke = sculpt_session()->stroke;
/* TODO: make these values user-modifiable? */
@@ -227,7 +232,7 @@ void sculpt_stroke_apply(struct EditData *e)
sculpt_stroke_create_final();
if(sculpt_stroke_final_length(stroke) > min_len) {
- StrokePoint *p = sculpt_stroke_apply_generic(stroke, e, partial_len);
+ StrokePoint *p = sculpt_stroke_apply_generic(stroke, a, partial_len);
/* Replace remaining values in stroke->loc with remaining stroke->final values */
stroke->index = -1;
@@ -244,14 +249,14 @@ void sculpt_stroke_apply(struct EditData *e)
}
}
-void sculpt_stroke_apply_all(struct EditData *e)
+void sculpt_stroke_apply_all(struct BrushAction *a)
{
SculptStroke *stroke = sculpt_session()->stroke;
sculpt_stroke_create_final();
if(stroke) {
- sculpt_stroke_apply_generic(stroke, e, 0);
+ sculpt_stroke_apply_generic(stroke, a, 0);
}
}
diff --git a/source/blender/src/sculptmode.c b/source/blender/src/sculptmode.c
index 43b33a5c9a8..039b43efefb 100644
--- a/source/blender/src/sculptmode.c
+++ b/source/blender/src/sculptmode.c
@@ -53,6 +53,7 @@
#include "DNA_texture_types.h"
#include "DNA_view3d_types.h"
#include "DNA_userdef_types.h"
+#include "DNA_color_types.h"
#include "BKE_customdata.h"
#include "BKE_DerivedMesh.h"
@@ -64,8 +65,10 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_sculpt.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
+#include "BKE_colortools.h"
#include "BIF_editkey.h"
#include "BIF_editview.h"
@@ -73,6 +76,7 @@
#include "BIF_gl.h"
#include "BIF_interface.h"
#include "BIF_mywindow.h"
+#include "BIF_radialcontrol.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_space.h"
@@ -101,6 +105,9 @@
/* Number of vertices to average in order to determine the flatten distance */
#define FLATTEN_SAMPLE_SIZE 10
+/* Texture cache size */
+#define TC_SIZE 256
+
/* ===== STRUCTS =====
*
*/
@@ -121,36 +128,47 @@ typedef struct ActiveData {
float dist;
} ActiveData;
-typedef struct GrabData {
+typedef struct BrushActionSymm {
+ float center_3d[3];
+ char index;
+
+ float up[3], right[3], out[3];
+
+ /* Grab brush */
+ float grab_delta[3];
+} BrushActionSymm;
+
+typedef struct BrushAction {
+ BrushActionSymm symm;
+
char firsttime;
- ListBase active_verts[8];
- unsigned char index;
- vec3f delta, delta_symm;
- float depth;
-} GrabData;
-typedef struct EditData {
- vec3f center;
- float size;
- char flip;
- short mouse[2];
+ /* Some brushes need access to original mesh vertices */
+ vec3f *mesh_store;
+ short (*orig_norms)[3];
- /* Adjust brush strength along each axis
- to adjust for object scaling */
- float scale[3];
+ short mouse[2];
+ float size_3d;
- /* View normals */
- vec3f up, right, out;
+ float prev_radius;
+ float radius;
- GrabData *grabdata;
float *layer_disps;
- vec3f *layer_store;
-
+ char flip;
+
char clip[3];
float cliptol[3];
-
- char symm;
-} EditData;
+
+ float anchored_rot;
+
+ /* Grab brush */
+ ListBase grab_active_verts[8];
+ float depth;
+
+ /* Adjust brush strength along each axis
+ to adjust for object scaling */
+ float scale[3];
+} BrushAction;
typedef struct RectNode {
struct RectNode *next, *prev;
@@ -166,7 +184,6 @@ typedef struct ProjVert {
char inside;
} ProjVert;
-static ProjVert *projverts= NULL;
static Object *active_ob= NULL;
SculptData *sculpt_data(void)
@@ -175,7 +192,8 @@ SculptData *sculpt_data(void)
}
void sculpt_init_session(void);
-void init_editdata(EditData *e, short *, short *);
+void init_brushaction(BrushAction *a, short *, short *);
+void sculpt_undo_push(const short);
SculptSession *sculpt_session(void)
{
@@ -189,93 +207,13 @@ SculptSession *sculpt_session(void)
* Allocate/initialize/free data
*/
-/* Initialize 'permanent' sculpt data that is saved with file kept after
- switching out of sculptmode. */
-void sculptmode_init(Scene *sce)
-{
- SculptData *sd;
-
- if(!sce) {
- error("Unable to initialize sculptmode: bad scene");
- return;
- }
-
- sd= &sce->sculptdata;
-
- memset(sd, 0, sizeof(SculptData));
-
- sd->drawbrush.size = sd->smoothbrush.size = sd->pinchbrush.size =
- sd->inflatebrush.size = sd->grabbrush.size =
- sd->layerbrush.size = sd->flattenbrush.size = 50;
- sd->drawbrush.strength = sd->smoothbrush.strength =
- sd->pinchbrush.strength = sd->inflatebrush.strength =
- sd->grabbrush.strength = sd->layerbrush.strength =
- sd->flattenbrush.strength = 25;
- sd->drawbrush.dir = sd->pinchbrush.dir = sd->inflatebrush.dir = sd->layerbrush.dir= 1;
- sd->drawbrush.airbrush = sd->smoothbrush.airbrush =
- sd->pinchbrush.airbrush = sd->inflatebrush.airbrush =
- sd->layerbrush.airbrush = sd->flattenbrush.airbrush = 0;
- sd->drawbrush.view= 0;
- sd->brush_type= DRAW_BRUSH;
- sd->texact= -1;
- sd->texfade= 1;
- sd->averaging= 1;
- sd->texsep= 0;
- sd->texrept= SCULPTREPT_DRAG;
- sd->flags= SCULPT_DRAW_BRUSH;
- sd->tablet_size=3;
- sd->tablet_strength=10;
-}
-
-void sculptmode_free_session(Scene *);
void sculpt_init_session(void)
{
if(sculpt_data()->session)
- sculptmode_free_session(G.scene);
+ sculptsession_free(G.scene);
sculpt_data()->session= MEM_callocN(sizeof(SculptSession), "SculptSession");
}
-void sculptmode_free_vertexusers(SculptSession *ss)
-{
- if(ss && ss->vertex_users){
- MEM_freeN(ss->vertex_users);
- MEM_freeN(ss->vertex_users_mem);
- ss->vertex_users= NULL;
- ss->vertex_users_mem= NULL;
- ss->vertex_users_size= 0;
- }
-}
-
-void sculptmode_propset_end(SculptSession *ss, int);
-void sculptmode_free_session(Scene *sce)
-{
- SculptSession *ss= sce->sculptdata.session;
- if(ss) {
- sculptmode_free_vertexusers(ss);
- if(ss->texcache)
- MEM_freeN(ss->texcache);
- sculptmode_propset_end(ss, 1);
- MEM_freeN(ss);
- sce->sculptdata.session= NULL;
- }
-}
-
-void sculptmode_free_all(Scene *sce)
-{
- SculptData *sd= &sce->sculptdata;
- int a;
-
- sculptmode_free_session(sce);
-
- for(a=0; a<MAX_MTEX; a++) {
- MTex *mtex= sd->mtex[a];
- if(mtex) {
- if(mtex->tex) mtex->tex->id.us--;
- MEM_freeN(mtex);
- }
- }
-}
-
/* vertex_users is an array of Lists that store all the faces that use a
particular vertex. vertex_users is in the same order as mesh.mvert */
void calc_vertex_users()
@@ -285,7 +223,7 @@ void calc_vertex_users()
IndexNode *node= NULL;
Mesh *me= get_mesh(OBACT);
- sculptmode_free_vertexusers(ss);
+ sculpt_vertexusers_free(ss);
/* For efficiency, use vertex_users_mem as a memory pool (may be larger
than necessary if mesh has triangles, but only one alloc is needed.) */
@@ -339,7 +277,9 @@ void init_sculptmatrices()
glPushMatrix();
glMultMatrixf(OBACT->obmat);
- bgl_get_mats(&ss->mats);
+ if(!ss->mats)
+ ss->mats = MEM_callocN(sizeof(bglMats), "sculpt bglmats");
+ bgl_get_mats(ss->mats);
glPopMatrix();
@@ -368,32 +308,39 @@ float get_depth(short x, short y)
/* Uses window coordinates (x,y) and depth component z to find a point in
modelspace */
-vec3f unproject(const short x, const short y, const float z)
+void unproject(float out[3], const short x, const short y, const float z)
{
SculptSession *ss= sculpt_session();
double ux, uy, uz;
- vec3f p;
-
- gluUnProject(x,y,z, ss->mats.modelview, ss->mats.projection,
- (GLint *)ss->mats.viewport, &ux, &uy, &uz );
- p.x= ux;
- p.y= uy;
- p.z= uz;
- return p;
+
+ gluUnProject(x,y,z, ss->mats->modelview, ss->mats->projection,
+ (GLint *)ss->mats->viewport, &ux, &uy, &uz );
+ out[0] = ux;
+ out[1] = uy;
+ out[2] = uz;
}
/* Convert a point in model coordinates to 2D screen coordinates. */
-void project(const float v[3], short p[2])
+static void projectf(const float v[3], float p[2])
{
SculptSession *ss= sculpt_session();
double ux, uy, uz;
- gluProject(v[0],v[1],v[2], ss->mats.modelview, ss->mats.projection,
- (GLint *)ss->mats.viewport, &ux, &uy, &uz);
+ gluProject(v[0],v[1],v[2], ss->mats->modelview, ss->mats->projection,
+ (GLint *)ss->mats->viewport, &ux, &uy, &uz);
p[0]= ux;
p[1]= uy;
}
+static void project(const float v[3], short p[2])
+{
+ float f[2];
+ projectf(v, f);
+
+ p[0]= f[0];
+ p[1]= f[1];
+}
+
/* ===== Sculpting =====
*
*/
@@ -422,13 +369,14 @@ char brush_size()
/* Return modified brush strength. Includes the direction of the brush, positive
values pull vertices, negative values push. Uses tablet pressure and a
special multiplier found experimentally to scale the strength factor. */
-float brush_strength(EditData *e)
+float brush_strength(BrushAction *a)
{
const BrushData* b= sculptmode_brush();
float dir= b->dir==1 ? 1 : -1;
float pressure= 1;
short activedevice= get_activedevice();
- float flip= e->flip ? -1:1;
+ float flip= a->flip ? -1:1;
+ float anchored = b->flag & SCULPT_BRUSH_ANCHORED ? 25 : 1;
const float strength_factor= G.scene->sculptdata.tablet_strength / 10.0f;
if(ELEM(activedevice, DEV_STYLUS, DEV_ERASER))
@@ -442,28 +390,28 @@ float brush_strength(EditData *e)
switch(G.scene->sculptdata.brush_type){
case DRAW_BRUSH:
case LAYER_BRUSH:
- return b->strength / 5000.0f * dir * pressure * flip;
+ return b->strength / 5000.0f * dir * pressure * flip * anchored;
case SMOOTH_BRUSH:
- return b->strength / 50.0f * pressure;
+ return b->strength / 50.0f * pressure * anchored;
case PINCH_BRUSH:
- return b->strength / 1000.0f * dir * pressure * flip;
+ return b->strength / 1000.0f * dir * pressure * flip * anchored;
case GRAB_BRUSH:
return 1;
case INFLATE_BRUSH:
- return b->strength / 5000.0f * dir * pressure * flip;
+ return b->strength / 5000.0f * dir * pressure * flip * anchored;
case FLATTEN_BRUSH:
- return b->strength / 500.0f * pressure;
+ return b->strength / 500.0f * pressure * anchored;
default:
return 0;
}
}
/* For clipping against a mirror modifier */
-void sculpt_clip(const EditData *e, float *co, const float val[3])
+void sculpt_clip(const BrushAction *a, float *co, const float val[3])
{
char i;
for(i=0; i<3; ++i) {
- if(e->clip[i] && (fabs(co[i]) <= e->cliptol[i]))
+ if(a->clip[i] && (fabs(co[i]) <= a->cliptol[i]))
co[i]= 0.0f;
else
co[i]= val[i];
@@ -472,42 +420,56 @@ void sculpt_clip(const EditData *e, float *co, const float val[3])
/* Currently only for the draw brush; finds average normal for all active
vertices */
-vec3f calc_area_normal(const vec3f *outdir, const ListBase* active_verts)
+void calc_area_normal(float out[3], const BrushAction *a, const float *outdir, const ListBase* active_verts)
{
- Mesh *me= get_mesh(OBACT);
- vec3f area_normal= {0,0,0};
- ActiveData *node= active_verts->first;
- const int view= sculpt_data()->brush_type==DRAW_BRUSH ? sculptmode_brush()->view : 0;
+ Mesh *me = get_mesh(OBACT);
+ ActiveData *node = active_verts->first;
+ const int view = sculpt_data()->brush_type==DRAW_BRUSH ? sculptmode_brush()->view : 0;
- while(node){
- area_normal.x+= me->mvert[node->Index].no[0];
- area_normal.y+= me->mvert[node->Index].no[1];
- area_normal.z+= me->mvert[node->Index].no[2];
- node= node->next;
+ out[0] = out[1] = out[2] = 0;
+
+ if(sculptmode_brush()->flag & SCULPT_BRUSH_ANCHORED) {
+ for(; node; node = node->next) {
+ out[0] += a->orig_norms[node->Index][0];
+ out[1] += a->orig_norms[node->Index][1];
+ out[2] += a->orig_norms[node->Index][2];
+ }
}
- Normalize(&area_normal.x);
+ else {
+ for(; node; node = node->next) {
+ out[0] += me->mvert[node->Index].no[0];
+ out[1] += me->mvert[node->Index].no[1];
+ out[2] += me->mvert[node->Index].no[2];
+ }
+ }
+
+ Normalize(out);
+
if(outdir) {
- area_normal.x= outdir->x * view + area_normal.x * (10-view);
- area_normal.y= outdir->y * view + area_normal.y * (10-view);
- area_normal.z= outdir->z * view + area_normal.z * (10-view);
+ out[0] = outdir[0] * view + out[0] * (10-view);
+ out[1] = outdir[1] * view + out[1] * (10-view);
+ out[2] = outdir[2] * view + out[2] * (10-view);
}
- Normalize(&area_normal.x);
- return area_normal;
+
+ Normalize(out);
}
-void do_draw_brush(const EditData *e, const ListBase* active_verts)
+
+void do_draw_brush(const BrushAction *a, const ListBase* active_verts)
{
Mesh *me= get_mesh(OBACT);
- const vec3f area_normal= calc_area_normal(&e->out, active_verts);
+ float area_normal[3];
ActiveData *node= active_verts->first;
+ calc_area_normal(area_normal, a, a->symm.out, active_verts);
+
while(node){
float *co= me->mvert[node->Index].co;
- const float val[3]= {co[0]+area_normal.x*node->Fade*e->scale[0],
- co[1]+area_normal.y*node->Fade*e->scale[1],
- co[2]+area_normal.z*node->Fade*e->scale[2]};
+ const float val[3]= {co[0]+area_normal[0]*node->Fade*a->scale[0],
+ co[1]+area_normal[1]*node->Fade*a->scale[1],
+ co[2]+area_normal[2]*node->Fade*a->scale[2]};
- sculpt_clip(e, co, val);
+ sculpt_clip(a, co, val);
node= node->next;
}
@@ -563,7 +525,7 @@ vec3f neighbor_average(const int vert)
return avg;
}
-void do_smooth_brush(const EditData *e, const ListBase* active_verts)
+void do_smooth_brush(const BrushAction *a, const ListBase* active_verts)
{
ActiveData *node= active_verts->first;
Mesh *me= get_mesh(OBACT);
@@ -574,53 +536,55 @@ void do_smooth_brush(const EditData *e, const ListBase* active_verts)
const float val[3]= {co[0]+(avg.x-co[0])*node->Fade,
co[1]+(avg.y-co[1])*node->Fade,
co[2]+(avg.z-co[2])*node->Fade};
- sculpt_clip(e, co, val);
+ sculpt_clip(a, co, val);
node= node->next;
}
}
-void do_pinch_brush(const EditData *e, const ListBase* active_verts)
+void do_pinch_brush(const BrushAction *a, const ListBase* active_verts)
{
Mesh *me= get_mesh(OBACT);
ActiveData *node= active_verts->first;
while(node) {
float *co= me->mvert[node->Index].co;
- const float val[3]= {co[0]+(e->center.x-co[0])*node->Fade,
- co[1]+(e->center.y-co[1])*node->Fade,
- co[2]+(e->center.z-co[2])*node->Fade};
- sculpt_clip(e, co, val);
+ const float val[3]= {co[0]+(a->symm.center_3d[0]-co[0])*node->Fade,
+ co[1]+(a->symm.center_3d[1]-co[1])*node->Fade,
+ co[2]+(a->symm.center_3d[2]-co[2])*node->Fade};
+ sculpt_clip(a, co, val);
node= node->next;
}
}
-void do_grab_brush(EditData *e)
+void do_grab_brush(BrushAction *a)
{
Mesh *me= get_mesh(OBACT);
- ActiveData *node= e->grabdata->active_verts[e->grabdata->index].first;
+ ActiveData *node= a->grab_active_verts[a->symm.index].first;
float add[3];
while(node) {
float *co= me->mvert[node->Index].co;
- VecCopyf(add, &e->grabdata->delta_symm.x);
+ VecCopyf(add, a->symm.grab_delta);
VecMulf(add, node->Fade);
VecAddf(add, add, co);
- sculpt_clip(e, co, add);
+ sculpt_clip(a, co, add);
node= node->next;
}
}
-void do_layer_brush(EditData *e, const ListBase *active_verts)
+void do_layer_brush(BrushAction *a, const ListBase *active_verts)
{
Mesh *me= get_mesh(OBACT);
- vec3f area_normal= calc_area_normal(NULL, active_verts);
+ float area_normal[3];
ActiveData *node= active_verts->first;
- const float bstr= brush_strength(e);
+ const float bstr= brush_strength(a);
+
+ calc_area_normal(area_normal, a, NULL, active_verts);
while(node){
- float *disp= &e->layer_disps[node->Index];
+ float *disp= &a->layer_disps[node->Index];
if((bstr > 0 && *disp < bstr) ||
(bstr < 0 && *disp > bstr)) {
@@ -637,10 +601,10 @@ void do_layer_brush(EditData *e, const ListBase *active_verts)
}
{
- const float val[3]= {e->layer_store[node->Index].x+area_normal.x * *disp*e->scale[0],
- e->layer_store[node->Index].y+area_normal.y * *disp*e->scale[1],
- e->layer_store[node->Index].z+area_normal.z * *disp*e->scale[2]};
- sculpt_clip(e, co, val);
+ const float val[3]= {a->mesh_store[node->Index].x+area_normal[0] * *disp*a->scale[0],
+ a->mesh_store[node->Index].y+area_normal[1] * *disp*a->scale[1],
+ a->mesh_store[node->Index].z+area_normal[2] * *disp*a->scale[2]};
+ sculpt_clip(a, co, val);
}
}
@@ -648,7 +612,7 @@ void do_layer_brush(EditData *e, const ListBase *active_verts)
}
}
-void do_inflate_brush(const EditData *e, const ListBase *active_verts)
+void do_inflate_brush(const BrushAction *a, const ListBase *active_verts)
{
ActiveData *node= active_verts->first;
float add[3];
@@ -662,18 +626,18 @@ void do_inflate_brush(const EditData *e, const ListBase *active_verts)
add[1]= no[1]/ 32767.0f;
add[2]= no[2]/ 32767.0f;
VecMulf(add, node->Fade);
- add[0]*= e->scale[0];
- add[1]*= e->scale[1];
- add[2]*= e->scale[2];
+ add[0]*= a->scale[0];
+ add[1]*= a->scale[1];
+ add[2]*= a->scale[2];
VecAddf(add, add, co);
- sculpt_clip(e, co, add);
+ sculpt_clip(a, co, add);
node= node->next;
}
}
-void calc_flatten_center(Mesh *me, ActiveData *node, const EditData *e, float co[3])
+void calc_flatten_center(Mesh *me, ActiveData *node, float co[3])
{
ActiveData *outer[FLATTEN_SAMPLE_SIZE];
int i;
@@ -696,44 +660,44 @@ void calc_flatten_center(Mesh *me, ActiveData *node, const EditData *e, float co
VecMulf(co, 1.0f / FLATTEN_SAMPLE_SIZE);
}
-void do_flatten_brush(const EditData *e, const ListBase *active_verts)
+void do_flatten_brush(const BrushAction *a, const ListBase *active_verts)
{
Mesh *me= get_mesh(OBACT);
ActiveData *node= active_verts->first;
/* area_normal and cntr define the plane towards which vertices are squashed */
- vec3f area_normal= calc_area_normal(&e->out, active_verts);
+ float area_normal[3];
float cntr[3];
-
- calc_flatten_center(me, node, e, cntr);
+
+ calc_area_normal(area_normal, a, a->symm.out, active_verts);
+ calc_flatten_center(me, node, cntr);
while(node){
float *co= me->mvert[node->Index].co;
float p1[3], sub1[3], sub2[3], intr[3], val[3];
/* Find the intersection between squash-plane and vertex (along the area normal) */
- VecSubf(p1, co, &area_normal.x);
+ VecSubf(p1, co, area_normal);
VecSubf(sub1, cntr, p1);
VecSubf(sub2, co, p1);
VecSubf(intr, co, p1);
- VecMulf(intr, Inpf(&area_normal.x, sub1) / Inpf(&area_normal.x, sub2));
+ VecMulf(intr, Inpf(area_normal, sub1) / Inpf(area_normal, sub2));
VecAddf(intr, intr, p1);
VecSubf(val, intr, co);
VecMulf(val, node->Fade);
VecAddf(val, val, co);
- sculpt_clip(e, co, val);
+ sculpt_clip(a, co, val);
node= node->next;
}
}
-/* Creates a smooth curve for the brush shape. This is the cos(x) curve from
- [0,PI] scaled to [0,len]. The range is scaled to [0,1]. */
-float simple_strength(float p, const float len)
+/* Uses the brush curve control to find a strength value between 0 and 1 */
+float curve_strength(float p, const float len)
{
if(p > len) p= len;
- return 0.5f * (cos(M_PI*p/len) + 1);
+ return curvemapping_evaluateF(G.scene->sculptdata.cumap, 0, p/len);
}
/* Uses symm to selectively flip any axis of a coordinate. */
@@ -748,7 +712,7 @@ void flip_coord(float co[3], const char symm)
}
/* Use the warpfac field in MTex to store a rotation value for sculpt textures. Value is in degrees */
-float tex_angle(void)
+float sculpt_tex_angle(void)
{
SculptData *sd= sculpt_data();
if(sd->texact!=-1 && sd->mtex[sd->texact])
@@ -774,17 +738,44 @@ float to_deg(const float rad)
}
/* Get a pixel from the texcache at (px, py) */
-unsigned *get_texcache_pixel(const SculptSession *ss, int px, int py)
+static unsigned char get_texcache_pixel(const SculptSession *ss, int px, int py)
+{
+ unsigned *p;
+ p = ss->texcache + py * ss->texcache_w + px;
+ return ((unsigned char*)(p))[0];
+}
+
+static float get_texcache_pixel_bilinear(const SculptSession *ss, float u, float v)
{
- if(px < 0) px= 0;
- if(py < 0) py= 0;
- if(px > ss->texcache_w - 1) px= ss->texcache_w - 1;
- if(py > ss->texcache_h - 1) py= ss->texcache_h - 1;
- return ss->texcache + py * ss->texcache_w + px;
+ int x, y, x2, y2;
+ const int tc_max = TC_SIZE - 1;
+ float urat, vrat, uopp;
+
+ if(u < 0) u = 0;
+ else if(u >= TC_SIZE) u = tc_max;
+ if(v < 0) v = 0;
+ else if(v >= TC_SIZE) v = tc_max;
+
+ x = floor(u);
+ y = floor(v);
+ x2 = x + 1;
+ y2 = y + 1;
+
+ if(x2 > TC_SIZE) x2 = tc_max;
+ if(y2 > TC_SIZE) y2 = tc_max;
+
+ urat = u - x;
+ vrat = v - y;
+ uopp = 1 - urat;
+
+ return ((get_texcache_pixel(ss, x, y) * uopp +
+ get_texcache_pixel(ss, x2, y) * urat) * (1 - vrat) +
+ (get_texcache_pixel(ss, x, y2) * uopp +
+ get_texcache_pixel(ss, x2, y2) * urat) * vrat) / 255.0;
}
/* Return a multiplier for brush strength on a particular vertex. */
-float tex_strength(EditData *e, float *point, const float len,const unsigned vindex)
+float tex_strength(BrushAction *a, float *point, const float len,const unsigned vindex)
{
SculptData *sd= sculpt_data();
SculptSession *ss= sculpt_session();
@@ -811,25 +802,17 @@ float tex_strength(EditData *e, float *point, const float len,const unsigned vin
externtex(&mtex,point,&avg,&jnk,&jnk,&jnk,&jnk);
}
else if(ss->texcache) {
- const short bsize= sculptmode_brush()->size * 2;
- const short half= sculptmode_brush()->size;
- const float rot= to_rad(tex_angle());
- const unsigned tcw = ss->texcache_w, tch = ss->texcache_h;
+ const float bsize= a->radius * 2;
+ const float rot= to_rad(sculpt_tex_angle()) + a->anchored_rot;
int px, py;
- unsigned i, *p;
- ProjVert pv;
-
+ float flip[3], point_2d[2];
+
/* If the active area is being applied for symmetry, flip it
across the symmetry axis in order to project it. This insures
that the brush texture will be oriented correctly. */
- if(!e->symm)
- pv= projverts[vindex];
- else {
- float co[3];
- VecCopyf(co, point);
- flip_coord(co, e->symm);
- project(co, pv.co);
- }
+ VecCopyf(flip, point);
+ flip_coord(flip, a->symm.index);
+ projectf(flip, point_2d);
/* For Tile and Drag modes, get the 2D screen coordinates of the
and scale them up or down to the texture size. */
@@ -837,44 +820,40 @@ float tex_strength(EditData *e, float *point, const float len,const unsigned vin
const int sx= (const int)sd->mtex[sd->texact]->size[0];
const int sy= (const int)sd->texsep ? sd->mtex[sd->texact]->size[1] : sx;
- float fx= pv.co[0];
- float fy= pv.co[1];
+ float fx= point_2d[0];
+ float fy= point_2d[1];
float angle= atan2(fy, fx) - rot;
float len= sqrtf(fx*fx + fy*fy);
if(rot<0.001 && rot>-0.001) {
- px= pv.co[0];
- py= pv.co[1];
+ px= point_2d[0];
+ py= point_2d[1];
} else {
px= len * cos(angle) + 2000;
py= len * sin(angle) + 2000;
}
- px %= sx-1;
- py %= sy-1;
- p= get_texcache_pixel(ss, tcw*px/sx, tch*py/sy);
+ if(sx != 1)
+ px %= sx-1;
+ if(sy != 1)
+ py %= sy-1;
+ avg= get_texcache_pixel_bilinear(ss, TC_SIZE*px/sx, TC_SIZE*py/sy);
} else {
- float fx= (pv.co[0] - e->mouse[0] + half) * (tcw*1.0f/bsize) - tcw/2;
- float fy= (pv.co[1] - e->mouse[1] + half) * (tch*1.0f/bsize) - tch/2;
-
+ float fx= (point_2d[0] - a->mouse[0]) / bsize;
+ float fy= (point_2d[1] - a->mouse[1]) / bsize;
+
float angle= atan2(fy, fx) - rot;
float len= sqrtf(fx*fx + fy*fy);
- px= tcw/2 + len * cos(angle);
- py= tch/2 + len * sin(angle);
-
- p= get_texcache_pixel(ss, px, py);
- }
-
- avg= 0;
- for(i=0; i<3; ++i)
- avg+= ((unsigned char*)(p))[i] / 255.0f;
+ fx = len * cos(angle) + 0.5;
+ fy = len * sin(angle) + 0.5;
- avg/= 3;
+ avg= get_texcache_pixel_bilinear(ss, fx * TC_SIZE, fy * TC_SIZE);
+ }
}
if(sd->texfade)
- avg*= simple_strength(len,e->size); /* Smooth curve */
+ avg*= curve_strength(len, a->size_3d); /* Smooth curve */
return avg;
}
@@ -882,35 +861,66 @@ 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)
+void sculpt_add_damaged_rect(BrushAction *a)
{
short p[2];
- const float radius= brush_size();
RectNode *rn= MEM_mallocN(sizeof(RectNode),"RectNode");
Mesh *me= get_mesh(OBACT);
+ SculptSession *ss = sculpt_session();
+ const float radius = a->radius > a->prev_radius ? a->radius : a->prev_radius;
unsigned i;
/* Find center */
- project(&e->center.x, p);
- rn->r.xmin= p[0]-radius;
- rn->r.ymin= p[1]-radius;
- rn->r.xmax= p[0]+radius;
- rn->r.ymax= p[1]+radius;
+ project(a->symm.center_3d, p);
+ rn->r.xmin= p[0] - radius;
+ rn->r.ymin= p[1] - radius;
+ rn->r.xmax= p[0] + radius;
+ rn->r.ymax= p[1] + radius;
BLI_addtail(&sculpt_session()->damaged_rects, rn);
/* Update insides */
for(i=0; i<me->totvert; ++i) {
- if(!projverts[i].inside) {
- if(projverts[i].co[0] > rn->r.xmin && projverts[i].co[1] > rn->r.ymin &&
- projverts[i].co[0] < rn->r.xmax && projverts[i].co[1] < rn->r.ymax) {
- projverts[i].inside= 1;
+ if(!ss->projverts[i].inside) {
+ if(ss->projverts[i].co[0] > rn->r.xmin && ss->projverts[i].co[1] > rn->r.ymin &&
+ ss->projverts[i].co[0] < rn->r.xmax && ss->projverts[i].co[1] < rn->r.ymax) {
+ ss->projverts[i].inside= 1;
}
}
}
}
-void do_brush_action(EditData e)
+/* Clears the depth buffer in each modified area. */
+void sculpt_clear_damaged_areas(SculptSession *ss)
+{
+ RectNode *rn= NULL;
+
+ for(rn = ss->damaged_rects.first; rn; rn = rn->next) {
+ rcti clp = rn->r;
+ rcti *win = &curarea->winrct;
+
+ clp.xmin += win->xmin;
+ clp.xmax += win->xmin;
+ clp.ymin += win->ymin;
+ clp.ymax += win->ymin;
+
+ if(clp.xmin < win->xmax && clp.xmax > win->xmin &&
+ clp.ymin < win->ymax && clp.ymax > win->ymin) {
+ if(clp.xmin < win->xmin) clp.xmin = win->xmin;
+ if(clp.ymin < win->ymin) clp.ymin = win->ymin;
+ if(clp.xmax > win->xmax) clp.xmax = win->xmax;
+ if(clp.ymax > win->ymax) clp.ymax = win->ymax;
+
+ glScissor(clp.xmin + 1, clp.ymin + 1,
+ clp.xmax - clp.xmin - 2,
+ clp.ymax - clp.ymin - 2);
+ }
+
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+}
+
+void do_brush_action(BrushAction *a)
{
int i;
float av_dist;
@@ -918,29 +928,32 @@ void do_brush_action(EditData e)
ActiveData *adata= 0;
float *vert;
Mesh *me= get_mesh(OBACT);
- const float bstrength= brush_strength(&e);
+ const float bstrength= brush_strength(a);
KeyBlock *keyblock= ob_get_keyblock(OBACT);
+ SculptData *sd = sculpt_data();
SculptSession *ss = sculpt_session();
- sculptmode_add_damaged_rect(&e);
+ sculpt_add_damaged_rect(a);
/* Build a list of all vertices that are potentially within the brush's
area of influence. Only do this once for the grab brush. */
- if(!e.grabdata || (e.grabdata && e.grabdata->firsttime)) {
+ if((sd->brush_type != GRAB_BRUSH) || a->firsttime) {
for(i=0; i<me->totvert; ++i) {
/* Projverts.inside provides a rough bounding box */
- if(projverts[i].inside) {
+ if(ss->projverts[i].inside) {
vert= ss->vertexcosnos ? &ss->vertexcosnos[i*6] : me->mvert[i].co;
- av_dist= VecLenf(&e.center.x,vert);
- if(av_dist < e.size) {
+ av_dist= VecLenf(a->symm.center_3d, vert);
+ if(av_dist < a->size_3d) {
adata= (ActiveData*)MEM_mallocN(sizeof(ActiveData), "ActiveData");
+
adata->Index = i;
/* Fade is used to store the final strength at which the brush
should modify a particular vertex. */
- adata->Fade= tex_strength(&e,vert,av_dist,i) * bstrength;
+ adata->Fade= tex_strength(a, vert, av_dist, i) * bstrength;
adata->dist = av_dist;
- if(e.grabdata && e.grabdata->firsttime)
- BLI_addtail(&e.grabdata->active_verts[e.grabdata->index], adata);
+
+ if(sd->brush_type == GRAB_BRUSH && a->firsttime)
+ BLI_addtail(&a->grab_active_verts[a->symm.index], adata);
else
BLI_addtail(&active_verts, adata);
}
@@ -949,29 +962,29 @@ void do_brush_action(EditData e)
}
/* Only act if some verts are inside the brush area */
- if(active_verts.first || (e.grabdata && e.grabdata->active_verts[e.grabdata->index].first)) {
+ if(active_verts.first || (sd->brush_type == GRAB_BRUSH && a->grab_active_verts[a->symm.index].first)) {
/* Apply one type of brush action */
switch(G.scene->sculptdata.brush_type){
case DRAW_BRUSH:
- do_draw_brush(&e, &active_verts);
+ do_draw_brush(a, &active_verts);
break;
case SMOOTH_BRUSH:
- do_smooth_brush(&e, &active_verts);
+ do_smooth_brush(a, &active_verts);
break;
case PINCH_BRUSH:
- do_pinch_brush(&e, &active_verts);
+ do_pinch_brush(a, &active_verts);
break;
case INFLATE_BRUSH:
- do_inflate_brush(&e, &active_verts);
+ do_inflate_brush(a, &active_verts);
break;
case GRAB_BRUSH:
- do_grab_brush(&e);
+ do_grab_brush(a);
break;
case LAYER_BRUSH:
- do_layer_brush(&e, &active_verts);
+ do_layer_brush(a, &active_verts);
break;
case FLATTEN_BRUSH:
- do_flatten_brush(&e, &active_verts);
+ do_flatten_brush(a, &active_verts);
break;
}
@@ -979,7 +992,11 @@ void do_brush_action(EditData e)
if(keyblock) {
float *co= keyblock->data;
if(co) {
- adata = e.grabdata ? e.grabdata->active_verts[e.grabdata->index].first : active_verts.first;
+ if(sd->brush_type == GRAB_BRUSH)
+ adata = a->grab_active_verts[a->symm.index].first;
+ else
+ adata = active_verts.first;
+
for(; adata; adata= adata->next)
if(adata->Index < keyblock->totelem)
VecCopyf(&co[adata->Index*3], me->mvert[adata->Index].co);
@@ -989,7 +1006,7 @@ void do_brush_action(EditData e)
if(ss->vertexcosnos)
BLI_freelistN(&active_verts);
else {
- if(!e.grabdata)
+ if(sd->brush_type != GRAB_BRUSH)
addlisttolist(&ss->damaged_verts, &active_verts);
}
}
@@ -997,51 +1014,39 @@ void do_brush_action(EditData e)
/* Flip all the editdata across the axis/axes specified by symm. Used to
calculate multiple modifications to the mesh when symmetry is enabled. */
-EditData flip_editdata(EditData *e, const char symm)
+void calc_brushdata_symm(BrushAction *a, const char symm)
{
- EditData fe= *e;
- GrabData *gd= fe.grabdata;
-
- flip_coord(&fe.center.x, symm);
- flip_coord(&fe.up.x, symm);
- flip_coord(&fe.right.x, symm);
- flip_coord(&fe.out.x, symm);
+ flip_coord(a->symm.center_3d, symm);
+ flip_coord(a->symm.up, symm);
+ flip_coord(a->symm.right, symm);
+ flip_coord(a->symm.out, symm);
- fe.symm= symm;
+ a->symm.index= symm;
- project(&e->center.x,fe.mouse);
-
- if(gd) {
- gd->index= symm;
- gd->delta_symm= gd->delta;
- flip_coord(&gd->delta_symm.x, symm);
- }
-
- return fe;
+ flip_coord(a->symm.grab_delta, symm);
}
-void do_symmetrical_brush_actions(EditData * e, short co[2], short pr_co[2])
+void do_symmetrical_brush_actions(BrushAction *a, short co[2], short pr_co[2])
{
- const char symm= sculpt_data()->symm;
+ const char symm = sculpt_data()->symm;
+ BrushActionSymm orig;
+ int i;
- init_editdata(e, co, pr_co);
-
- do_brush_action(flip_editdata(e, 0));
-
- if(symm & SYMM_X)
- do_brush_action(flip_editdata(e, SYMM_X));
- if(symm & SYMM_Y)
- do_brush_action(flip_editdata(e, SYMM_Y));
- if(symm & SYMM_Z)
- do_brush_action(flip_editdata(e, SYMM_Z));
- if(symm & SYMM_X && symm & SYMM_Y)
- do_brush_action(flip_editdata(e, SYMM_X | SYMM_Y));
- if(symm & SYMM_X && symm & SYMM_Z)
- do_brush_action(flip_editdata(e, SYMM_X | SYMM_Z));
- if(symm & SYMM_Y && symm & SYMM_Z)
- do_brush_action(flip_editdata(e, SYMM_Y | SYMM_Z));
- if(symm & SYMM_X && symm & SYMM_Y && symm & SYMM_Z)
- do_brush_action(flip_editdata(e, SYMM_X | SYMM_Y | SYMM_Z));
+ init_brushaction(a, co, pr_co);
+ orig = a->symm;
+ do_brush_action(a);
+
+ for(i = 1; i <= symm; ++i) {
+ if(symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5))) {
+ // Restore the original symmetry data
+ a->symm = orig;
+
+ calc_brushdata_symm(a, i);
+ do_brush_action(a);
+ }
+ }
+
+ a->symm = orig;
}
void add_face_normal(vec3f *norm, const MFace* face)
@@ -1081,28 +1086,26 @@ void update_damaged_vert(Mesh *me, ListBase *lb)
}
}
-void calc_damaged_verts(ListBase *damaged_verts, GrabData *grabdata)
+void calc_damaged_verts(ListBase *damaged_verts, BrushAction *a)
{
Mesh *me= get_mesh(OBACT);
+ int i;
+
+ for(i=0; i<8; ++i)
+ update_damaged_vert(me, &a->grab_active_verts[i]);
- if(grabdata) {
- int i;
- for(i=0; i<8; ++i)
- update_damaged_vert(me,&grabdata->active_verts[i]);
- } else {
- update_damaged_vert(me,damaged_verts);
- BLI_freelistN(damaged_verts);
- damaged_verts->first = damaged_verts->last = NULL;
- }
+ update_damaged_vert(me, damaged_verts);
+ BLI_freelistN(damaged_verts);
+ damaged_verts->first = damaged_verts->last = NULL;
}
-void projverts_clear_inside()
+void projverts_clear_inside(SculptSession *ss)
{
Mesh *me = get_mesh(OBACT);
if(me) {
int i;
for(i = 0; i < me->totvert; ++i)
- projverts[i].inside = 0;
+ ss->projverts[i].inside = 0;
}
}
@@ -1120,7 +1123,7 @@ BrushData *sculptmode_brush(void)
sd->brush_type==FLATTEN_BRUSH ? &sd->flattenbrush : NULL);
if(!bd) {
- sculptmode_init(G.scene);
+ sculptdata_init(G.scene);
bd = &sd->drawbrush;
}
@@ -1133,7 +1136,7 @@ void sculptmode_update_tex()
SculptSession *ss= sculpt_session();
MTex *mtex = sd->mtex[sd->texact];
TexResult texres = {0};
- float x, y, step=2.0/128.0, co[3];
+ float x, y, step=2.0/TC_SIZE, co[3];
int hasrgb, ix, iy;
/* Skip Default brush shape and non-textures */
@@ -1144,15 +1147,15 @@ void sculptmode_update_tex()
ss->texcache= NULL;
}
- ss->texcache_w = ss->texcache_h = 128;
+ ss->texcache_w = ss->texcache_h = TC_SIZE;
ss->texcache = MEM_callocN(sizeof(int) * ss->texcache_w * ss->texcache_h, "Sculpt Texture cache");
if(mtex && mtex->tex) {
BKE_image_get_ibuf(sd->mtex[sd->texact]->tex->ima, NULL);
/*do normalized cannonical view coords for texture*/
- for (y=-1.0, iy=0; iy<128; iy++, y += step) {
- for (x=-1.0, ix=0; ix<128; ix++, x += step) {
+ for (y=-1.0, iy=0; iy<TC_SIZE; iy++, y += step) {
+ for (x=-1.0, ix=0; ix<TC_SIZE; ix++, x += step) {
co[0]= x;
co[1]= y;
co[2]= 0.0f;
@@ -1169,95 +1172,133 @@ void sculptmode_update_tex()
texres.tg + 0.2 * texres.tb);
texres.tin = texres.tin * 255.0;
- ((char*)ss->texcache)[(iy*128+ix)*4] = (char)texres.tin;
- ((char*)ss->texcache)[(iy*128+ix)*4+1] = (char)texres.tin;
- ((char*)ss->texcache)[(iy*128+ix)*4+2] = (char)texres.tin;
- ((char*)ss->texcache)[(iy*128+ix)*4+3] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4+1] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4+2] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4+3] = (char)texres.tin;
}
}
}
}
/* pr_mouse is only used for the grab brush, can be NULL otherwise */
-void init_editdata(EditData *e, short *mouse, short *pr_mouse)
+void init_brushaction(BrushAction *a, 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;
+ const float mouse_depth = get_depth(mouse[0], mouse[1]);
+ float brush_edge_loc[3], zero_loc[3], oldloc[3];
ModifierData *md;
int i;
const char flip = (get_qual() == LR_SHIFTKEY);
+ const char anchored = sculptmode_brush()->flag & SCULPT_BRUSH_ANCHORED;
+ short orig_mouse[2], dx, dy;
+
+ a->flip = flip;
+ a->symm.index = 0;
- e->flip= flip;
+ if(a->firsttime)
+ a->depth = mouse_depth;
/* Convert the location and size of the brush to
modelspace coords */
- e->center= unproject(mouse[0],mouse[1],mouse_depth);
- brush_edge_loc= unproject(mouse[0] +
- brush_size(),mouse[1],
- mouse_depth);
- e->size= VecLenf(&e->center.x,&brush_edge_loc.x);
+ if(a->firsttime || !anchored) {
+ unproject(a->symm.center_3d, mouse[0], mouse[1], mouse_depth);
+ a->mouse[0] = mouse[0];
+ a->mouse[1] = mouse[1];
+ }
+
+ if(anchored) {
+ project(a->symm.center_3d, orig_mouse);
+ dx = mouse[0] - orig_mouse[0];
+ dy = mouse[1] - orig_mouse[1];
+ }
+
+ if(anchored) {
+ unproject(brush_edge_loc, mouse[0], mouse[1], a->depth);
+ a->anchored_rot = atan2(dy, dx);
+ }
+ else
+ unproject(brush_edge_loc, mouse[0] + brush_size(), mouse[1], mouse_depth);
+
+ a->size_3d = VecLenf(a->symm.center_3d, brush_edge_loc);
+
+ a->prev_radius = a->radius;
+
+ if(anchored)
+ a->radius = sqrt(dx*dx + dy*dy);
+ else
+ a->radius = brush_size();
/* 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;
+ VecCopyf(&sculpt_session()->pivot.x, a->symm.center_3d);
/* 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);
- e->right= unproject(1, 0, 0);
- e->out= unproject(0, 0, -1);
- VecSubf(&e->up.x, &e->up.x, &zero_loc.x);
- VecSubf(&e->right.x, &e->right.x, &zero_loc.x);
- VecSubf(&e->out.x, &e->out.x, &zero_loc.x);
- Normalize(&e->up.x);
- Normalize(&e->right.x);
- Normalize(&e->out.x);
+ unproject(zero_loc, 0, 0, 0);
+ unproject(a->symm.up, 0, -1, 0);
+ unproject(a->symm.right, 1, 0, 0);
+ unproject(a->symm.out, 0, 0, -1);
+ VecSubf(a->symm.up, a->symm.up, zero_loc);
+ VecSubf(a->symm.right, a->symm.right, zero_loc);
+ VecSubf(a->symm.out, a->symm.out, zero_loc);
+ Normalize(a->symm.up);
+ Normalize(a->symm.right);
+ Normalize(a->symm.out);
/* Initialize mirror modifier clipping */
for(i=0; i<3; ++i) {
- e->clip[i]= 0;
- e->cliptol[i]= 0;
+ a->clip[i]= 0;
+ a->cliptol[i]= 0;
}
for(md= OBACT->modifiers.first; md; md= md->next) {
if(md->type==eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) {
const MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
- e->clip[mmd->axis]= 1;
- if(mmd->tolerance > e->cliptol[mmd->axis])
- e->cliptol[mmd->axis]= mmd->tolerance;
+ a->clip[mmd->axis]= 1;
+ if(mmd->tolerance > a->cliptol[mmd->axis])
+ a->cliptol[mmd->axis] = mmd->tolerance;
}
}
}
if(sd->brush_type == GRAB_BRUSH) {
- vec3f gcenter;
- if(!e->grabdata) {
- e->grabdata= MEM_callocN(sizeof(GrabData),"grab data");
- e->grabdata->firsttime= 1;
- e->grabdata->depth= mouse_depth;
- }
- else
- e->grabdata->firsttime= 0;
-
+ float gcenter[3];
+
/* Find the delta */
- gcenter= unproject(mouse[0],mouse[1],e->grabdata->depth);
- oldloc= unproject(pr_mouse[0],pr_mouse[1],e->grabdata->depth);
- VecSubf(&e->grabdata->delta.x,&gcenter.x,&oldloc.x);
+ unproject(gcenter, mouse[0], mouse[1], a->depth);
+ unproject(oldloc, pr_mouse[0], pr_mouse[1], a->depth);
+ VecSubf(a->symm.grab_delta, gcenter, oldloc);
}
else if(sd->brush_type == LAYER_BRUSH) {
Mesh *me= get_mesh(OBACT);
- if(!e->layer_disps)
- e->layer_disps= MEM_callocN(sizeof(float)*me->totvert,"Layer disps");
- if(!e->layer_store) {
- unsigned i;
- e->layer_store= MEM_mallocN(sizeof(vec3f)*me->totvert,"Layer store");
- for(i=0; i<me->totvert; ++i)
- VecCopyf(&e->layer_store[i].x,me->mvert[i].co);
+ if(!a->layer_disps)
+ a->layer_disps= MEM_callocN(sizeof(float)*me->totvert,"Layer disps");
+ }
+
+ if(sd->brush_type == LAYER_BRUSH || anchored) {
+ Mesh *me= get_mesh(OBACT);
+ unsigned i;
+
+ if(!a->mesh_store) {
+ a->mesh_store= MEM_mallocN(sizeof(vec3f) * me->totvert, "Sculpt mesh store");
+ for(i = 0; i < me->totvert; ++i)
+ VecCopyf(&a->mesh_store[i].x, me->mvert[i].co);
+ }
+
+ if(anchored && a->layer_disps)
+ memset(a->layer_disps, 0, sizeof(float) * me->totvert);
+
+ if(anchored && !a->orig_norms) {
+ a->orig_norms= MEM_mallocN(sizeof(short) * 3 * me->totvert, "Sculpt orig norm");
+ for(i = 0; i < me->totvert; ++i) {
+ a->orig_norms[i][0] = me->mvert[i].no[0];
+ a->orig_norms[i][1] = me->mvert[i].no[1];
+ a->orig_norms[i][2] = me->mvert[i].no[2];
+ }
}
- }
+ }
}
void sculptmode_set_strength(const int delta)
{
@@ -1267,141 +1308,85 @@ void sculptmode_set_strength(const int delta)
sculptmode_brush()->strength= val;
}
-void sculptmode_propset_calctex()
+static void sculpt_radialcontrol_callback(const int mode, const int val)
{
- SculptData *sd= sculpt_data();
- SculptSession *ss= sculpt_session();
- PropsetData *pd= sculpt_session()->propset;
- if(pd) {
- int i, j;
- const int tsz = 128;
- float *d;
- if(!pd->texdata) {
- pd->texdata= MEM_mallocN(sizeof(float)*tsz*tsz, "Brush preview");
- if(sd->texrept!=SCULPTREPT_3D)
- sculptmode_update_tex();
- for(i=0; i<tsz; ++i)
- for(j=0; j<tsz; ++j) {
- float magn= sqrt(pow(i-tsz/2,2)+pow(j-tsz/2,2));
- if(sd->texfade)
- pd->texdata[i*tsz+j]= simple_strength(magn,tsz/2);
- else
- pd->texdata[i*tsz+j]= magn < tsz/2 ? 1 : 0;
- }
- if(sd->texact != -1 && ss->texcache) {
- for(i=0; i<tsz; ++i)
- for(j=0; j<tsz; ++j) {
- const int col= ss->texcache[i*tsz+j];
- pd->texdata[i*tsz+j]*= (((char*)&col)[0]+((char*)&col)[1]+((char*)&col)[2])/3.0f/255.0f;
- }
- }
- }
-
- /* Adjust alpha with brush strength */
- d= MEM_dupallocN(pd->texdata);
- for(i=0; i<tsz; ++i)
- for(j=0; j<tsz; ++j)
- d[i*tsz+j]*= sculptmode_brush()->strength/200.0f+0.5f;
-
-
- if(!pd->tex)
- glGenTextures(1, (GLuint *)&pd->tex);
- glBindTexture(GL_TEXTURE_2D, pd->tex);
+ SculptSession *ss = sculpt_session();
+ BrushData *br = sculptmode_brush();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tsz, tsz, 0, GL_ALPHA, GL_FLOAT, d);
- MEM_freeN(d);
- }
+ if(mode == RADIALCONTROL_SIZE)
+ br->size = val;
+ else if(mode == RADIALCONTROL_STRENGTH)
+ br->strength = val;
+ else if(mode == RADIALCONTROL_ROTATION)
+ set_tex_angle(val);
+
+ ss->radialcontrol = NULL;
}
-void sculptmode_propset_header()
+/* Returns GL handle to brush texture */
+static GLuint sculpt_radialcontrol_calctex()
{
+ SculptData *sd= sculpt_data();
SculptSession *ss= sculpt_session();
- PropsetData *pd= ss ? ss->propset : NULL;
- if(pd) {
- char str[512];
- const char *name= "";
- int val= 0;
- if(pd->mode == PropsetSize) {
- name= "Size";
- val= sculptmode_brush()->size;
- }
- else if(pd->mode == PropsetStrength) {
- name= "Strength";
- val= sculptmode_brush()->strength;
- }
- else if(pd->mode == PropsetTexRot) {
- name= "Texture Angle";
- val= tex_angle();
- }
- sprintf(str, "Brush %s: %d", name, val);
- headerprint(str);
- }
-}
+ int i, j;
+ const int tsz = TC_SIZE;
+ float *texdata= MEM_mallocN(sizeof(float)*tsz*tsz, "Brush preview");
+ GLuint tex;
-void sculptmode_propset_end(SculptSession *ss, int cancel)
-{
- if(ss && ss->propset) {
- PropsetData *pd= ss->propset;
-
- if(cancel) {
- sculptmode_brush()->size= pd->origsize;
- sculptmode_brush()->strength= pd->origstrength;
- set_tex_angle(pd->origtexrot);
- } else {
- if(pd->mode != PropsetSize)
- sculptmode_brush()->size= pd->origsize;
- if(pd->mode != PropsetStrength)
- sculptmode_brush()->strength= pd->origstrength;
- if(pd->mode != PropsetTexRot)
- set_tex_angle(pd->origtexrot);
+ if(sd->texrept!=SCULPTREPT_3D)
+ sculptmode_update_tex();
+ for(i=0; i<tsz; ++i)
+ for(j=0; j<tsz; ++j) {
+ float magn= sqrt(pow(i-tsz/2,2)+pow(j-tsz/2,2));
+ if(sd->texfade)
+ texdata[i*tsz+j]= curve_strength(magn,tsz/2);
+ else
+ texdata[i*tsz+j]= magn < tsz/2 ? 1 : 0;
}
- glDeleteTextures(1, &pd->tex);
- MEM_freeN(pd->texdata);
- MEM_freeN(pd);
- ss->propset= NULL;
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSEDIT, 0);
+ if(sd->texact != -1 && ss->texcache) {
+ for(i=0; i<tsz; ++i)
+ for(j=0; j<tsz; ++j) {
+ const int col= ss->texcache[i*tsz+j];
+ texdata[i*tsz+j]*= (((char*)&col)[0]+((char*)&col)[1]+((char*)&col)[2])/3.0f/255.0f;
+ }
}
+
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, tsz, tsz, 0, GL_ALPHA, GL_FLOAT, texdata);
+ MEM_freeN(texdata);
+
+ return tex;
}
-void sculptmode_propset_init(PropsetMode mode)
+void sculpt_radialcontrol_start(int mode)
{
- SculptSession *ss= sculpt_session();
- PropsetData *pd= ss->propset;
- const float ang= tex_angle();
-
- if(!pd) {
- short mouse[2];
-
- pd= MEM_callocN(sizeof(PropsetData),"PropsetSize");
- ss->propset= pd;
-
- getmouseco_areawin(mouse);
- pd->origloc[0]= mouse[0];
- pd->origloc[1]= mouse[1];
-
- if(mode == PropsetSize)
- pd->origloc[0]-= sculptmode_brush()->size;
- else if(mode == PropsetStrength)
- pd->origloc[0]-= 200 - 2*sculptmode_brush()->strength;
- else if(mode == PropsetTexRot) {
- pd->origloc[0]-= 200 * cos(to_rad(ang));
- pd->origloc[1]-= 200 * sin(to_rad(ang));
+ SculptData *sd = sculpt_data();
+ SculptSession *ss = sculpt_session();
+ BrushData *br = sculptmode_brush();
+ int orig=1, max=100;
+
+ if(mode == RADIALCONTROL_SIZE) {
+ orig = br->size;
+ max = 200;
+ }
+ else if(mode == RADIALCONTROL_STRENGTH) {
+ orig = br->strength;
+ max = 100;
+ }
+ else if(mode == RADIALCONTROL_ROTATION) {
+ if(sd->texact!=-1 && sd->mtex[sd->texact]) {
+ orig = sculpt_tex_angle();
+ max = 360;
}
-
- pd->origsize= sculptmode_brush()->size;
- pd->origstrength= sculptmode_brush()->strength;
- pd->origtexrot= ang;
-
- sculptmode_propset_calctex();
-
- pd->num.idx_max= 0;
+ else
+ mode = RADIALCONTROL_NONE;
}
- pd->mode= mode;
- sculptmode_propset_header();
-
- allqueue(REDRAWVIEW3D, 0);
+ if(mode != RADIALCONTROL_NONE) {
+ ss->radialcontrol= radialcontrol_start(mode, sculpt_radialcontrol_callback, orig, max,
+ sculpt_radialcontrol_calctex());
+ }
}
void sculpt_paint_brush(char clear)
@@ -1424,90 +1409,6 @@ void sculpt_paint_brush(char clear)
}
}
-void sculptmode_propset(unsigned short event)
-{
- PropsetData *pd= sculpt_session()->propset;
- short mouse[2];
- short tmp[2];
- float dist;
- BrushData *brush= sculptmode_brush();
- char valset= 0;
-
- handleNumInput(&pd->num, event);
-
- if(hasNumInput(&pd->num)) {
- float val;
- applyNumInput(&pd->num, &val);
- if(pd->mode==PropsetSize)
- brush->size= val;
- else if(pd->mode==PropsetStrength)
- brush->strength= val;
- else if(pd->mode==PropsetTexRot)
- set_tex_angle(val);
- valset= 1;
- allqueue(REDRAWVIEW3D, 0);
- }
-
- switch(event) {
- case MOUSEX:
- case MOUSEY:
- if(!hasNumInput(&pd->num)) {
- char ctrl= G.qual & LR_CTRLKEY;
- getmouseco_areawin(mouse);
- tmp[0]= pd->origloc[0]-mouse[0];
- tmp[1]= pd->origloc[1]-mouse[1];
- dist= sqrt(tmp[0]*tmp[0]+tmp[1]*tmp[1]);
- if(pd->mode == PropsetSize) {
- brush->size= dist;
- if(ctrl) brush->size= (brush->size+5)/10*10;
- } else if(pd->mode == PropsetStrength) {
- float fin= (200.0f - dist) * 0.5f;
- brush->strength= fin>=0 ? fin : 0;
- if(ctrl) brush->strength= (brush->strength+5)/10*10;
- } else if(pd->mode == PropsetTexRot) {
- set_tex_angle((int)to_deg(atan2(tmp[1], tmp[0])) + 180);
- if(ctrl)
- set_tex_angle(((int)(tex_angle())+5)/10*10);
- }
- valset= 1;
- allqueue(REDRAWVIEW3D, 0);
- }
- break;
- case ESCKEY:
- case RIGHTMOUSE:
- brush->size= pd->origsize;
- brush->strength= pd->origstrength;
- set_tex_angle(pd->origtexrot);
- case LEFTMOUSE:
- while(get_mbut()==L_MOUSE);
- case RETKEY:
- case PADENTER:
- sculptmode_propset_end(sculpt_session(), 0);
- break;
- default:
- break;
- };
-
- if(valset) {
- if(pd->mode == PropsetSize) {
- if(brush->size<1) brush->size= 1;
- if(brush->size>200) brush->size= 200;
- }
- else if(pd->mode == PropsetStrength) {
- if(brush->strength > 100) brush->strength= 100;
- sculptmode_propset_calctex();
- }
- else if(pd->mode == PropsetTexRot) {
- if(tex_angle() < 0)
- set_tex_angle(0);
- else if(tex_angle() > 360)
- set_tex_angle(360);
- }
- }
-
- sculptmode_propset_header();
-}
-
void sculptmode_selectbrush_menu(void)
{
SculptData *sd= sculpt_data();
@@ -1519,6 +1420,8 @@ void sculptmode_selectbrush_menu(void)
if(val>0) {
sd->brush_type= val;
+
+ BIF_undo_push("Brush type");
allqueue(REDRAWVIEW3D, 1);
allqueue(REDRAWBUTSEDIT, 1);
@@ -1527,18 +1430,20 @@ void sculptmode_selectbrush_menu(void)
void sculptmode_update_all_projverts(float *vertcosnos)
{
+ SculptSession *ss = sculpt_session();
Mesh *me= get_mesh(OBACT);
unsigned i;
- if(projverts) MEM_freeN(projverts);
- projverts= MEM_mallocN(sizeof(ProjVert)*me->totvert,"ProjVerts");
+ if(!ss->projverts)
+ ss->projverts = MEM_mallocN(sizeof(ProjVert)*me->totvert,"ProjVerts");
+
for(i=0; i<me->totvert; ++i) {
- project(vertcosnos ? &vertcosnos[i * 6] : me->mvert[i].co, projverts[i].co);
- projverts[i].inside= 0;
+ project(vertcosnos ? &vertcosnos[i * 6] : me->mvert[i].co, ss->projverts[i].co);
+ ss->projverts[i].inside= 0;
}
}
-void sculptmode_draw_wires(int only_damaged, Mesh *me)
+void sculptmode_draw_wires(SculptSession *ss, int only_damaged, Mesh *me)
{
int i;
@@ -1549,7 +1454,7 @@ void sculptmode_draw_wires(int only_damaged, Mesh *me)
for(i=0; i<me->totedge; i++) {
MEdge *med= &me->medge[i];
- if((!only_damaged || (projverts[med->v1].inside || projverts[med->v2].inside)) &&
+ if((!only_damaged || (ss->projverts[med->v1].inside || ss->projverts[med->v2].inside)) &&
(med->flag & ME_EDGEDRAW)) {
glDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, &med->v1);
}
@@ -1563,6 +1468,7 @@ void sculptmode_draw_mesh(int only_damaged)
{
Mesh *me= get_mesh(OBACT);
int i, j, dt, drawCurrentMat = 1, matnr= -1;
+ SculptSession *ss = sculpt_session();
persp(PERSP_VIEW);
mymultmatrix(OBACT->obmat);
@@ -1592,7 +1498,7 @@ void sculptmode_draw_mesh(int only_damaged)
inside the area(s) modified by the brush */
if(only_damaged) {
for(j=0; j<(f->v4?4:3); ++j) {
- if(projverts[*((&f->v1)+j)].inside) {
+ if(ss->projverts[*((&f->v1)+j)].inside) {
inside= 1;
break;
}
@@ -1610,7 +1516,7 @@ void sculptmode_draw_mesh(int only_damaged)
glColorMask(1,1,1,1);
if(dt==OB_WIRE || (OBACT->dtx & OB_DRAWWIRE))
- sculptmode_draw_wires(only_damaged, me);
+ sculptmode_draw_wires(ss, only_damaged, me);
glDisable(GL_DEPTH_TEST);
}
@@ -1644,12 +1550,15 @@ void sculpt(void)
SculptData *sd= sculpt_data();
SculptSession *ss= sculpt_session();
Object *ob= OBACT;
- short mouse[2], mvalo[2], firsttime=1, mousebut;
+ /* lastSigMouse is for the rake, to store the last place the mouse movement was significant */
+ short mouse[2], mvalo[2], lastSigMouse[2],firsttime=1, mousebut;
short modifier_calculations= 0;
- EditData e;
- RectNode *rn= NULL;
+ BrushAction *a = MEM_callocN(sizeof(BrushAction), "brush action");
short spacing= 32000;
int scissor_box[4];
+ float offsetRot;
+ int smooth_stroke = 0, i;
+ int anchored;
if(!(G.f & G_SCULPTMODE) || G.obedit || !ob || ob->id.lib || !get_mesh(ob) || (get_mesh(ob)->totface == 0))
return;
@@ -1667,7 +1576,10 @@ void sculpt(void)
ss= sd->session;
}
- if(sd->flags & SCULPT_INPUT_SMOOTH)
+ anchored = sculptmode_brush()->flag & SCULPT_BRUSH_ANCHORED;
+ smooth_stroke = (sd->flags & SCULPT_INPUT_SMOOTH) && (sd->brush_type != GRAB_BRUSH) && !anchored;
+
+ if(smooth_stroke)
sculpt_stroke_new(256);
ss->damaged_rects.first = ss->damaged_rects.last = NULL;
@@ -1675,9 +1587,12 @@ void sculpt(void)
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);
+ if(ob != active_ob || !ss->vertex_users || ss->vertex_users_size != get_mesh(ob)->totvert) {
+ sculpt_vertexusers_free(ss);
calc_vertex_users();
+ if(ss->projverts)
+ MEM_freeN(ss->projverts);
+ ss->projverts = NULL;
active_ob= ob;
}
@@ -1688,9 +1603,6 @@ void sculpt(void)
getmouseco_areawin(mvalo);
- /* Make sure sculptdata has been init'd properly */
- if(!ss->vertex_users) calc_vertex_users();
-
/* Init texture
FIXME: Shouldn't be doing this every time! */
if(sd->texrept!=SCULPTREPT_3D)
@@ -1699,7 +1611,8 @@ void sculpt(void)
getmouseco_areawin(mouse);
mvalo[0]= mouse[0];
mvalo[1]= mouse[1];
-
+ lastSigMouse[0]=mouse[0];
+ lastSigMouse[1]=mouse[1];
mousebut = L_MOUSE;
/* If modifier_calculations is true, then extra time must be spent
@@ -1713,14 +1626,10 @@ void sculpt(void)
ss->vertexcosnos= mesh_get_mapped_verts_nors(ob);
sculptmode_update_all_projverts(ss->vertexcosnos);
- e.grabdata= NULL;
- e.layer_disps= NULL;
- e.layer_store= NULL;
-
/* Set scaling adjustment */
- e.scale[0]= 1.0f / ob->size[0];
- e.scale[1]= 1.0f / ob->size[1];
- e.scale[2]= 1.0f / ob->size[2];
+ a->scale[0]= 1.0f / ob->size[0];
+ a->scale[1]= 1.0f / ob->size[1];
+ a->scale[2]= 1.0f / ob->size[2];
/* Capture original copy */
if(sd->flags & SCULPT_DRAW_FAST)
@@ -1728,14 +1637,26 @@ void sculpt(void)
/* Get original scissor box */
glGetIntegerv(GL_SCISSOR_BOX, scissor_box);
-
+
+ /* For raking, get the original angle*/
+ offsetRot=sculpt_tex_angle();
+
while (get_mbut() & mousebut) {
getmouseco_areawin(mouse);
+ /* If rake, and the mouse has moved over 10 pixels (euclidean) (prevents jitter) then get the new angle */
+ if (sd->rake && (pow(lastSigMouse[0]-mouse[0],2)+pow(lastSigMouse[1]-mouse[1],2))>100){
+ /*Nasty looking, but just orig + new angle really*/
+ set_tex_angle(offsetRot+180.+to_deg(atan2((float)(mouse[1]-lastSigMouse[1]),(float)(mouse[0]-lastSigMouse[0]))));
+ lastSigMouse[0]=mouse[0];
+ lastSigMouse[1]=mouse[1];
+ }
- if(firsttime || mouse[0]!=mvalo[0] || mouse[1]!=mvalo[1] || sculptmode_brush()->airbrush) {
+ if(firsttime || mouse[0]!=mvalo[0] || mouse[1]!=mvalo[1] ||
+ sculptmode_brush()->flag & SCULPT_BRUSH_AIRBRUSH) {
+ a->firsttime = firsttime;
firsttime= 0;
- if(sd->flags & SCULPT_INPUT_SMOOTH)
+ if(smooth_stroke)
sculpt_stroke_add_point(mouse[0], mouse[1]);
spacing+= sqrt(pow(mvalo[0]-mouse[0],2)+pow(mvalo[1]-mouse[1],2));
@@ -1744,61 +1665,57 @@ void sculpt(void)
ss->vertexcosnos= mesh_get_mapped_verts_nors(ob);
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;
+ if(anchored) {
+ Mesh *me = get_mesh(ob);
+
+ /* Restore the mesh before continuing with anchored stroke */
+ if(a->mesh_store) {
+ for(i = 0; i < me->totvert; ++i) {
+ VecCopyf(me->mvert[i].co, &a->mesh_store[i].x);
+ me->mvert[i].no[0] = a->orig_norms[i][0];
+ me->mvert[i].no[1] = a->orig_norms[i][1];
+ me->mvert[i].no[2] = a->orig_norms[i][2];
+ }
+ }
+
+ do_symmetrical_brush_actions(a, mouse, NULL);
+ }
+ else {
+ if(smooth_stroke) {
+ sculpt_stroke_apply(a);
+ }
+ else if(sd->spacing==0 || spacing>sd->spacing) {
+ do_symmetrical_brush_actions(a, mouse, NULL);
+ spacing= 0;
+ }
}
}
else {
- do_symmetrical_brush_actions(&e, mouse, mvalo);
- ss->pivot= unproject(mouse[0],mouse[1],e.grabdata->depth);
+ do_symmetrical_brush_actions(a, mouse, mvalo);
+ unproject(&ss->pivot.x, mouse[0], mouse[1], a->depth);
}
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->flags & SCULPT_DRAW_FAST)) {
- calc_damaged_verts(&ss->damaged_verts,e.grabdata);
+ calc_damaged_verts(&ss->damaged_verts, a);
scrarea_do_windraw(curarea);
screen_swapbuffers();
} else { /* Optimized drawing */
- calc_damaged_verts(&ss->damaged_verts,e.grabdata);
+ calc_damaged_verts(&ss->damaged_verts, a);
/* Draw the stored image to the screen */
glAccum(GL_RETURN, 1);
- /* Clear each of the area(s) modified by the brush */
- for(rn=ss->damaged_rects.first; rn; rn= rn->next) {
- rcti clp= rn->r;
- rcti *win= &curarea->winrct;
-
- clp.xmin+= win->xmin;
- clp.xmax+= win->xmin;
- clp.ymin+= win->ymin;
- clp.ymax+= win->ymin;
-
- if(clp.xmin<win->xmax && clp.xmax>win->xmin &&
- clp.ymin<win->ymax && clp.ymax>win->ymin) {
- if(clp.xmin<win->xmin) clp.xmin= win->xmin;
- if(clp.ymin<win->ymin) clp.ymin= win->ymin;
- if(clp.xmax>win->xmax) clp.xmax= win->xmax;
- if(clp.ymax>win->ymax) clp.ymax= win->ymax;
- glScissor(clp.xmin+1, clp.ymin+1,
- clp.xmax-clp.xmin-2,clp.ymax-clp.ymin-2);
- }
-
- glClear(GL_DEPTH_BUFFER_BIT);
- }
+ sculpt_clear_damaged_areas(ss);
/* Draw all the polygons that are inside the modified area(s) */
glScissor(scissor_box[0], scissor_box[1], scissor_box[2], scissor_box[3]);
sculptmode_draw_mesh(1);
glAccum(GL_LOAD, 1);
- projverts_clear_inside();
+ projverts_clear_inside(ss);
persp(PERSP_WIN);
glDisable(GL_DEPTH_TEST);
@@ -1806,7 +1723,7 @@ void sculpt(void)
/* Draw cursor */
if(sculpt_data()->flags & SCULPT_DRAW_BRUSH)
fdrawXORcirc((float)mouse[0],(float)mouse[1],sculptmode_brush()->size);
- if(sculpt_data()->flags & SCULPT_INPUT_SMOOTH)
+ if(smooth_stroke)
sculpt_stroke_draw();
myswapbuffers();
@@ -1827,26 +1744,33 @@ void sculpt(void)
else BIF_wait_for_statechange();
}
- if(sd->flags & SCULPT_INPUT_SMOOTH) {
- sculpt_stroke_apply_all(&e);
- calc_damaged_verts(&ss->damaged_verts,e.grabdata);
+ /* Set the rotation of the brush back to what it was before any rake */
+ set_tex_angle(offsetRot);
+
+ if(smooth_stroke) {
+ sculpt_stroke_apply_all(a);
+ calc_damaged_verts(&ss->damaged_verts, a);
BLI_freelistN(&ss->damaged_rects);
}
- if(projverts) MEM_freeN(projverts);
- projverts= NULL;
- if(e.layer_disps) MEM_freeN(e.layer_disps);
- if(e.layer_store) MEM_freeN(e.layer_store);
- /* Free GrabData */
- if(e.grabdata) {
- int i;
- for(i=0; i<8; ++i)
- BLI_freelistN(&e.grabdata->active_verts[i]);
- MEM_freeN(e.grabdata);
- }
+ if(a->layer_disps) MEM_freeN(a->layer_disps);
+ if(a->mesh_store) MEM_freeN(a->mesh_store);
+ if(a->orig_norms) MEM_freeN(a->orig_norms);
+ for(i=0; i<8; ++i)
+ BLI_freelistN(&a->grab_active_verts[i]);
+ MEM_freeN(a);
sculpt_stroke_free();
- switch(G.scene->sculptdata.brush_type) {
+ sculpt_undo_push(G.scene->sculptdata.brush_type);
+
+ if(G.vd->depths) G.vd->depths->damaged= 1;
+
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+void sculpt_undo_push(const short brush_type)
+{
+ switch(brush_type) {
case DRAW_BRUSH:
BIF_undo_push("Draw Brush"); break;
case SMOOTH_BRUSH:
@@ -1864,10 +1788,6 @@ void sculpt(void)
default:
BIF_undo_push("Sculpting"); break;
}
-
- if(G.vd->depths) G.vd->depths->damaged= 1;
-
- allqueue(REDRAWVIEW3D, 0);
}
void set_sculptmode(void)
@@ -1877,9 +1797,9 @@ void set_sculptmode(void)
G.f &= ~G_SCULPTMODE;
- sculptmode_free_session(G.scene);
+ sculptsession_free(G.scene);
if(me && me->pv)
- sculptmode_pmv_off(me);
+ mesh_pmv_off(OBACT, me);
}
else {
G.f |= G_SCULPTMODE;
@@ -1900,80 +1820,12 @@ void set_sculptmode(void)
}
/* Partial Mesh Visibility */
-PartialVisibility *sculptmode_copy_pmv(PartialVisibility *pmv)
-{
- PartialVisibility *n= MEM_dupallocN(pmv);
- n->vert_map= MEM_dupallocN(pmv->vert_map);
- n->edge_map= MEM_dupallocN(pmv->edge_map);
- n->old_edges= MEM_dupallocN(pmv->old_edges);
- n->old_faces= MEM_dupallocN(pmv->old_faces);
- return n;
-}
-
-void sculptmode_pmv_free(PartialVisibility *pv)
-{
- MEM_freeN(pv->vert_map);
- MEM_freeN(pv->edge_map);
- MEM_freeN(pv->old_faces);
- MEM_freeN(pv->old_edges);
- MEM_freeN(pv);
-}
-
-void sculptmode_revert_pmv(Mesh *me)
-{
- if(me->pv) {
- unsigned i;
- MVert *nve, *old_verts;
-
- active_ob= NULL;
-
- /* Reorder vertices */
- nve= me->mvert;
- old_verts = MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts");
- for(i=0; i<me->pv->totvert; ++i)
- old_verts[i]= nve[me->pv->vert_map[i]];
-
- /* Restore verts, edges and faces */
- CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
- CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
- CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
-
- CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, old_verts, me->pv->totvert);
- CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, me->pv->old_edges, me->pv->totedge);
- CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, me->pv->old_faces, me->pv->totface);
- mesh_update_customdata_pointers(me);
-
- me->totvert= me->pv->totvert;
- me->totedge= me->pv->totedge;
- me->totface= me->pv->totface;
-
- me->pv->old_edges= NULL;
- me->pv->old_faces= NULL;
-
- /* Free maps */
- MEM_freeN(me->pv->edge_map);
- me->pv->edge_map= NULL;
- MEM_freeN(me->pv->vert_map);
- me->pv->vert_map= NULL;
-
- DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
- }
-}
-
-void sculptmode_pmv_off(Mesh *me)
-{
- if(me->pv) {
- sculptmode_revert_pmv(me);
- MEM_freeN(me->pv);
- me->pv= NULL;
- }
-}
/* mode: 0=hide outside selection, 1=hide inside selection */
-void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
+static void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
{
Mesh *me= get_mesh(ob);
- vec3f hidebox[6];
+ float hidebox[6][3];
vec3f plane_normals[4];
float plane_ds[4];
unsigned i, j;
@@ -1985,23 +1837,23 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
const unsigned SHOW= 0, HIDE=1;
/* Convert hide box from 2D to 3D */
- hidebox[0]= unproject(hb_2d->xmin, hb_2d->ymax, 1);
- hidebox[1]= unproject(hb_2d->xmax, hb_2d->ymax, 1);
- hidebox[2]= unproject(hb_2d->xmax, hb_2d->ymin, 1);
- hidebox[3]= unproject(hb_2d->xmin, hb_2d->ymin, 1);
- hidebox[4]= unproject(hb_2d->xmin, hb_2d->ymax, 0);
- hidebox[5]= unproject(hb_2d->xmax, hb_2d->ymin, 0);
+ unproject(hidebox[0], hb_2d->xmin, hb_2d->ymax, 1);
+ unproject(hidebox[1], hb_2d->xmax, hb_2d->ymax, 1);
+ unproject(hidebox[2], hb_2d->xmax, hb_2d->ymin, 1);
+ unproject(hidebox[3], hb_2d->xmin, hb_2d->ymin, 1);
+ unproject(hidebox[4], hb_2d->xmin, hb_2d->ymax, 0);
+ unproject(hidebox[5], hb_2d->xmax, hb_2d->ymin, 0);
/* Calculate normals for each side of hide box */
- CalcNormFloat(&hidebox[0].x,&hidebox[1].x,&hidebox[4].x,&plane_normals[0].x);
- CalcNormFloat(&hidebox[1].x,&hidebox[2].x,&hidebox[5].x,&plane_normals[1].x);
- CalcNormFloat(&hidebox[2].x,&hidebox[3].x,&hidebox[5].x,&plane_normals[2].x);
- CalcNormFloat(&hidebox[3].x,&hidebox[0].x,&hidebox[4].x,&plane_normals[3].x);
+ CalcNormFloat(hidebox[0], hidebox[1], hidebox[4], &plane_normals[0].x);
+ CalcNormFloat(hidebox[1], hidebox[2], hidebox[5], &plane_normals[1].x);
+ CalcNormFloat(hidebox[2], hidebox[3], hidebox[5], &plane_normals[2].x);
+ CalcNormFloat(hidebox[3], hidebox[0], hidebox[4], &plane_normals[3].x);
/* Calculate D for each side of hide box */
for(i= 0; i<4; ++i)
- plane_ds[i]= hidebox[i].x*plane_normals[i].x + hidebox[i].y*plane_normals[i].y +
- hidebox[i].z*plane_normals[i].z;
+ plane_ds[i]= hidebox[i][0]*plane_normals[i].x + hidebox[i][1]*plane_normals[i].y +
+ hidebox[i][2]*plane_normals[i].z;
/* Add partial visibility to mesh */
if(!me->pv) {
@@ -2011,7 +1863,7 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
for(i=0; i<me->pv->totvert; ++i) {
old_map[i]= me->pv->vert_map[i]<me->totvert?0:1;
}
- sculptmode_revert_pmv(me);
+ mesh_pmv_revert(ob, me);
}
/* Kill sculpt data */
@@ -2128,7 +1980,7 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
}
-rcti sculptmode_pmv_box()
+static rcti sculptmode_pmv_box()
{
short down[2], mouse[2];
rcti ret;
@@ -2183,7 +2035,7 @@ void sculptmode_pmv(int mode)
sculptmode_do_pmv(ob,&hb_2d,mode);
}
- else sculptmode_pmv_off(get_mesh(ob));
+ else mesh_pmv_off(ob, get_mesh(ob));
scrarea_do_windraw(curarea);
diff --git a/source/blender/src/seqaudio.c b/source/blender/src/seqaudio.c
index f050906efa5..ae76de90ddf 100644
--- a/source/blender/src/seqaudio.c
+++ b/source/blender/src/seqaudio.c
@@ -96,6 +96,7 @@ static int audio_scrub=0;
static int audio_playing=0;
static int audio_initialised=0;
static int audio_startframe=0;
+static double audio_starttime = 0.0;
/////
//
/* local protos ------------------- */
@@ -140,7 +141,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 */
@@ -183,7 +184,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) {
@@ -217,7 +218,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));
@@ -303,7 +304,7 @@ static void audio_fill_ram_sound(Sequence *seq, void * mixdown,
(seq->startdisp <= CFRA) && ((seq->enddisp) > CFRA))
{
if(seq->ipo && seq->ipo->curve.first) {
- do_seq_ipo(seq);
+ do_seq_ipo(seq, CFRA);
facf = seq->facf0;
} else {
facf = 1.0;
@@ -332,7 +333,7 @@ static void audio_fill_hd_sound(Sequence *seq,
(seq->startdisp <= CFRA) && ((seq->enddisp) > CFRA))
{
if(seq->ipo && seq->ipo->curve.first) {
- do_seq_ipo(seq);
+ do_seq_ipo(seq, CFRA);
facf = seq->facf0;
} else {
facf = 1.0;
@@ -453,9 +454,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 ));
}
@@ -468,9 +468,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 ));
}
@@ -496,7 +495,7 @@ void audiostream_play(Uint32 startframe, Uint32 duration, int mixdown)
sound_init_audio();
}
- if (!audio_initialised && !(duration + mixdown)) {
+ if (U.mixbufsize && !audio_initialised && !(duration + mixdown)) {
desired.freq=G.scene->audio.mixrate;
desired.format=AUDIO_S16SYS;
desired.channels=2;
@@ -508,10 +507,10 @@ void audiostream_play(Uint32 startframe, Uint32 duration, int mixdown)
}
audio_startframe = startframe;
- audio_pos = ( ((int)( (( (double)startframe)
- /(double)G.scene->r.frs_sec)
+ audio_pos = ( ((int)( FRA2TIME(startframe)
*(G.scene->audio.mixrate)*4 )) & (~3) );
-
+ audio_starttime = PIL_check_seconds_timer();
+
audio_scrub = duration;
if (!mixdown) {
SDL_PauseAudio(0);
@@ -538,10 +537,15 @@ void audiostream_stop(void)
int audiostream_pos(void)
{
int pos;
-
- pos = (int) (((double)(audio_pos-U.mixbufsize)
- / ( G.scene->audio.mixrate*4 ))
- * (double)G.scene->r.frs_sec );
+
+ if (U.mixbufsize) {
+ pos = (int) (((double)(audio_pos-U.mixbufsize)
+ / ( G.scene->audio.mixrate*4 ))
+ * FPS );
+ } else { /* fallback to seconds_timer when no audio available */
+ pos = (int) ((PIL_check_seconds_timer() - audio_starttime)
+ * 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 4a0dbdae186..8938edfd0e6 100644
--- a/source/blender/src/seqeffects.c
+++ b/source/blender/src/seqeffects.c
@@ -35,6 +35,7 @@
#include "MEM_guardedalloc.h"
#include "PIL_dynlib.h"
+#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
#include "BLI_blenlib.h"
@@ -785,9 +786,9 @@ static void do_cross_effect(Sequence * seq,int cfra,
********************************************************************** */
/* copied code from initrender.c */
-static unsigned short *gamtab = 0;
-static unsigned short *igamtab1 = 0;
-static int gamma_tabs_refcount = 0;
+static unsigned short gamtab[65536];
+static unsigned short igamtab1[256];
+static int gamma_tabs_init = FALSE;
#define RE_GAMMA_TABLE_SIZE 400
@@ -881,9 +882,6 @@ static void gamtabs(float gamma)
float val, igamma= 1.0f/gamma;
int a;
- gamtab= MEM_mallocN(65536*sizeof(short), "initGaus2");
- igamtab1= MEM_mallocN(256*sizeof(short), "initGaus2");
-
/* gamtab: in short, out short */
for(a=0; a<65536; a++) {
val= a;
@@ -906,36 +904,25 @@ static void gamtabs(float gamma)
}
-static void alloc_or_ref_gammatabs()
+static void build_gammatabs()
{
- if (gamma_tabs_refcount == 0) {
+ if (gamma_tabs_init == FALSE) {
gamtabs(2.0f);
makeGammaTables(2.0f);
+ gamma_tabs_init = TRUE;
}
- gamma_tabs_refcount++;
}
static void init_gammacross(Sequence * seq)
{
- alloc_or_ref_gammatabs();
}
static void load_gammacross(Sequence * seq)
{
- alloc_or_ref_gammatabs();
}
static void free_gammacross(Sequence * seq)
{
- if (--gamma_tabs_refcount == 0) {
- MEM_freeN(gamtab);
- MEM_freeN(igamtab1);
- gamtab = 0;
- igamtab1 = 0;
- }
- if (gamma_tabs_refcount < 0) {
- fprintf(stderr, "seqeffects: free_gammacross double free!\n");
- }
}
static void do_gammacross_effect_byte(float facf0, float facf1,
@@ -1042,6 +1029,8 @@ static void do_gammacross_effect(Sequence * seq,int cfra,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3, struct ImBuf *out)
{
+ build_gammatabs();
+
if (out->rect_float) {
do_gammacross_effect_float(
facf0, facf1, x, y,
@@ -2494,9 +2483,10 @@ static void do_glow_effect_byte(Sequence *seq, float facf0, float facf1,
unsigned char *outbuf=(unsigned char *)out;
unsigned char *inbuf=(unsigned char *)rect1;
GlowVars *glow = (GlowVars *)seq->effectdata;
+ struct RenderData *rd = &G.scene->r;
RVIsolateHighlights_byte(inbuf, outbuf , x, y, glow->fMini*765, glow->fBoost, glow->fClamp);
- RVBlurBitmap2_byte (outbuf, x, y, glow->dDist,glow->dQuality);
+ RVBlurBitmap2_byte (outbuf, x, y, glow->dDist * (rd->size / 100.0f),glow->dQuality);
if (!glow->bNoComp)
RVAddBitmaps_byte (inbuf , outbuf, outbuf, x, y);
}
@@ -2508,9 +2498,10 @@ static void do_glow_effect_float(Sequence *seq, float facf0, float facf1,
float *outbuf = out;
float *inbuf = rect1;
GlowVars *glow = (GlowVars *)seq->effectdata;
+ struct RenderData *rd = &G.scene->r;
RVIsolateHighlights_float(inbuf, outbuf , x, y, glow->fMini*3.0f, glow->fBoost, glow->fClamp);
- RVBlurBitmap2_float (outbuf, x, y, glow->dDist,glow->dQuality);
+ RVBlurBitmap2_float (outbuf, x, y, glow->dDist * (rd->size / 100.0f),glow->dQuality);
if (!glow->bNoComp)
RVAddBitmaps_float (inbuf , outbuf, outbuf, x, y);
}
@@ -2730,6 +2721,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) {
@@ -2756,9 +2748,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) {
@@ -2784,6 +2778,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;
}
@@ -3006,11 +3002,33 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
struct SeqEffectHandle get_sequence_effect(Sequence * seq)
{
- struct SeqEffectHandle rval = get_sequence_effect_impl(seq->type);
+ struct SeqEffectHandle rval;
+
+ memset(&rval, 0, sizeof(struct SeqEffectHandle));
+
+ if (seq->type & SEQ_EFFECT) {
+ rval = get_sequence_effect_impl(seq->type);
+ if ((seq->flag & SEQ_EFFECT_NOT_LOADED) != 0) {
+ rval.load(seq);
+ seq->flag &= ~SEQ_EFFECT_NOT_LOADED;
+ }
+ }
+
+ return rval;
+}
+
+struct SeqEffectHandle get_sequence_blend(Sequence * seq)
+{
+ struct SeqEffectHandle rval;
+
+ memset(&rval, 0, sizeof(struct SeqEffectHandle));
- if ((seq->flag & SEQ_EFFECT_NOT_LOADED) != 0) {
- rval.load(seq);
- seq->flag &= ~SEQ_EFFECT_NOT_LOADED;
+ if (seq->blend_mode != 0) {
+ rval = get_sequence_effect_impl(seq->blend_mode);
+ if ((seq->flag & SEQ_EFFECT_NOT_LOADED) != 0) {
+ rval.load(seq);
+ seq->flag &= ~SEQ_EFFECT_NOT_LOADED;
+ }
}
return rval;
@@ -3020,5 +3038,9 @@ int get_sequence_effect_num_inputs(int seq_type)
{
struct SeqEffectHandle rval = get_sequence_effect_impl(seq_type);
- return rval.num_inputs();
+ int cnt = rval.num_inputs();
+ if (rval.execute) {
+ return cnt;
+ }
+ return 0;
}
diff --git a/source/blender/src/seqscopes.c b/source/blender/src/seqscopes.c
index 1fa01a6145e..b7b1d2436f8 100644
--- a/source/blender/src/seqscopes.c
+++ b/source/blender/src/seqscopes.c
@@ -53,6 +53,14 @@ static void scope_put_pixel(unsigned char* table, unsigned char * pos)
pos[3] = 255;
}
+static void scope_put_pixel_single(unsigned char* table, unsigned char * pos,
+ int col)
+{
+ char newval = table[pos[col]];
+ pos[col] = newval;
+ pos[3] = 255;
+}
+
static void wform_put_line(int w,
unsigned char * last_pos, unsigned char * new_pos)
{
@@ -71,6 +79,67 @@ static void wform_put_line(int w,
}
}
+static void wform_put_line_single(
+ int w, unsigned char * last_pos, unsigned char * new_pos, int col)
+{
+ if (last_pos > new_pos) {
+ unsigned char* temp = new_pos;
+ new_pos = last_pos;
+ last_pos = temp;
+ }
+
+ while (last_pos < new_pos) {
+ if (last_pos[col] == 0) {
+ last_pos[col] = 32;
+ last_pos[3] = 255;
+ }
+ last_pos += 4*w;
+ }
+}
+
+static void wform_put_border(unsigned char * tgt, int w, int h)
+{
+ int x, y;
+
+ for (x = 0; x < w; x++) {
+ unsigned char * p = tgt + 4 * x;
+ p[1] = p[3] = 255.0;
+ p[4 * w + 1] = p[4 * w + 3] = 255.0;
+ p = tgt + 4 * (w * (h - 1) + x);
+ p[1] = p[3] = 255.0;
+ p[-4 * w + 1] = p[-4 * w + 3] = 255.0;
+ }
+
+ for (y = 0; y < h; y++) {
+ unsigned char * p = tgt + 4 * w * y;
+ p[1] = p[3] = 255.0;
+ p[4 + 1] = p[4 + 3] = 255.0;
+ p = tgt + 4 * (w * y + w - 1);
+ p[1] = p[3] = 255.0;
+ p[-4 + 1] = p[-4 + 3] = 255.0;
+ }
+}
+
+static void wform_put_gridrow(unsigned char * tgt, float perc, int w, int h)
+{
+ int i;
+
+ tgt += (int) (perc/100.0 * h) * w * 4;
+
+ for (i = 0; i < w*2; i++) {
+ tgt[0] = 255;
+
+ tgt += 4;
+ }
+}
+
+static void wform_put_grid(unsigned char * tgt, int w, int h)
+{
+ wform_put_gridrow(tgt, 90.0, w, h);
+ wform_put_gridrow(tgt, 70.0, w, h);
+ wform_put_gridrow(tgt, 10.0, w, h);
+}
+
static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
{
struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect, 0);
@@ -82,6 +151,8 @@ static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
float waveform_gamma = 0.2;
unsigned char wtable[256];
+ wform_put_grid(tgt, w, h);
+
for (x = 0; x < 256; x++) {
wtable[x] = (unsigned char) (pow(((float) x + 1)/256,
waveform_gamma)*255);
@@ -110,23 +181,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
}
}
- for (x = 0; x < w; x++) {
- unsigned char * p = tgt + 4 * x;
- p[1] = p[3] = 255.0;
- p[4 * w + 1] = p[4 * w + 3] = 255.0;
- p = tgt + 4 * (w * (h - 1) + x);
- p[1] = p[3] = 255.0;
- p[-4 * w + 1] = p[-4 * w + 3] = 255.0;
- }
-
- for (y = 0; y < h; y++) {
- unsigned char * p = tgt + 4 * w * y;
- p[1] = p[3] = 255.0;
- p[4 + 1] = p[4 + 3] = 255.0;
- p = tgt + 4 * (w * y + w - 1);
- p[1] = p[3] = 255.0;
- p[-4 + 1] = p[-4 + 3] = 255.0;
- }
+ wform_put_border(tgt, w, h);
return rval;
}
@@ -142,6 +197,8 @@ static struct ImBuf *make_waveform_view_from_ibuf_float(struct ImBuf * ibuf)
float waveform_gamma = 0.2;
unsigned char wtable[256];
+ wform_put_grid(tgt, w, h);
+
for (x = 0; x < 256; x++) {
wtable[x] = (unsigned char) (pow(((float) x + 1)/256,
waveform_gamma)*255);
@@ -173,23 +230,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_float(struct ImBuf * ibuf)
}
}
- for (x = 0; x < w; x++) {
- unsigned char * p = tgt + 4 * x;
- p[1] = p[3] = 255.0;
- p[4 * w + 1] = p[4 * w + 3] = 255.0;
- p = tgt + 4 * (w * (h - 1) + x);
- p[1] = p[3] = 255.0;
- p[-4 * w + 1] = p[-4 * w + 3] = 255.0;
- }
-
- for (y = 0; y < h; y++) {
- unsigned char * p = tgt + 4 * w * y;
- p[1] = p[3] = 255.0;
- p[4 + 1] = p[4 + 3] = 255.0;
- p = tgt + 4 * (w * y + w - 1);
- p[1] = p[3] = 255.0;
- p[-4 + 1] = p[-4 + 3] = 255.0;
- }
+ wform_put_border(tgt, w, h);
return rval;
}
@@ -204,6 +245,332 @@ struct ImBuf *make_waveform_view_from_ibuf(struct ImBuf * ibuf)
}
+static struct ImBuf *make_sep_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
+{
+ struct ImBuf * rval = IMB_allocImBuf(
+ ibuf->x + 3, 515, 32, IB_rect, 0);
+ int x,y;
+ unsigned char* src = (unsigned char*) ibuf->rect;
+ unsigned char* tgt = (unsigned char*) rval->rect;
+ int w = ibuf->x + 3;
+ int sw = ibuf->x/3;
+ int h = 515;
+ float waveform_gamma = 0.2;
+ unsigned char wtable[256];
+
+ wform_put_grid(tgt, w, h);
+
+ for (x = 0; x < 256; x++) {
+ wtable[x] = (unsigned char) (pow(((float) x + 1)/256,
+ waveform_gamma)*255);
+ }
+
+ for (y = 0; y < ibuf->y; y++) {
+ unsigned char * last_p[3] = {0,0,0};
+
+ for (x = 0; x < ibuf->x; x++) {
+ int c;
+ unsigned char * rgb = src + 4 * (ibuf->x * y + x);
+ for (c = 0; c < 3; c++) {
+ unsigned char * p = tgt;
+ p += 4 * (w * ((rgb[c] * (h - 3))/255 + 1)
+ + c * sw + x/3 + 1);
+
+ scope_put_pixel_single(wtable, p, c);
+ p += 4 * w;
+ scope_put_pixel_single(wtable, p, c);
+
+ if (last_p[c] != 0) {
+ wform_put_line_single(
+ w, last_p[c], p, c);
+ }
+ last_p[c] = p;
+ }
+ }
+ }
+
+ wform_put_border(tgt, w, h);
+
+ return rval;
+}
+
+static struct ImBuf *make_sep_waveform_view_from_ibuf_float(
+ struct ImBuf * ibuf)
+{
+ struct ImBuf * rval = IMB_allocImBuf(
+ ibuf->x + 3, 515, 32, IB_rect, 0);
+ int x,y;
+ float* src = ibuf->rect_float;
+ unsigned char* tgt = (unsigned char*) rval->rect;
+ int w = ibuf->x + 3;
+ int sw = ibuf->x/3;
+ int h = 515;
+ float waveform_gamma = 0.2;
+ unsigned char wtable[256];
+
+ wform_put_grid(tgt, w, h);
+
+ for (x = 0; x < 256; x++) {
+ wtable[x] = (unsigned char) (pow(((float) x + 1)/256,
+ waveform_gamma)*255);
+ }
+
+ for (y = 0; y < ibuf->y; y++) {
+ unsigned char * last_p[3] = {0, 0, 0};
+
+ for (x = 0; x < ibuf->x; x++) {
+ int c;
+ float * rgb = src + 4 * (ibuf->x * y + x);
+ for (c = 0; c < 3; c++) {
+ unsigned char * p = tgt;
+ float v = rgb[c];
+
+ CLAMP(v, 0.0, 1.0);
+
+ p += 4 * (w * ((int) (v * (h - 3)) + 1)
+ + c * sw + x/3 + 1);
+
+ scope_put_pixel_single(wtable, p, c);
+ p += 4 * w;
+ scope_put_pixel_single(wtable, p, c);
+
+ if (last_p[c] != 0) {
+ wform_put_line_single(
+ w, last_p[c], p, c);
+ }
+ last_p[c] = p;
+ }
+ }
+ }
+
+ wform_put_border(tgt, w, h);
+
+ return rval;
+}
+
+struct ImBuf *make_sep_waveform_view_from_ibuf(struct ImBuf * ibuf)
+{
+ if (ibuf->rect_float) {
+ return make_sep_waveform_view_from_ibuf_float(ibuf);
+ } else {
+ return make_sep_waveform_view_from_ibuf_byte(ibuf);
+ }
+}
+
+static void draw_zebra_byte(struct ImBuf * src,struct ImBuf * ibuf, float perc)
+{
+ unsigned int limit = 255 * perc / 100.0;
+ unsigned char * p = (unsigned char*) src->rect;
+ unsigned char * o = (unsigned char*) ibuf->rect;
+ int x;
+ int y;
+
+ for (y = 0; y < ibuf->y; y++) {
+ for (x = 0; x < ibuf->x; x++) {
+ unsigned char r = *p++;
+ unsigned char g = *p++;
+ unsigned char b = *p++;
+ unsigned char a = *p++;
+
+ if (r >= limit || g >= limit || b >= limit) {
+ if (r == limit
+ || g == limit
+ || b == limit
+ || (((x + y) & 0x08) != 0)) {
+ r = 255 - r;
+ g = 255 - g;
+ b = 255 - b;
+ }
+ }
+ *o++ = r;
+ *o++ = g;
+ *o++ = b;
+ *o++ = a;
+ }
+ }
+}
+
+#define FTOCHAR(val) val<=0.0f?0: (val>=1.0f?255: (char)(255.99f*val))
+
+static void draw_zebra_float(struct ImBuf * src,struct ImBuf * ibuf,float perc)
+{
+ float limit = perc / 100.0;
+ float * p = src->rect_float;
+ unsigned char * o = (unsigned char*) ibuf->rect;
+ int x;
+ int y;
+
+ for (y = 0; y < ibuf->y; y++) {
+ for (x = 0; x < ibuf->x; x++) {
+ float r = *p++;
+ float g = *p++;
+ float b = *p++;
+ float a = *p++;
+
+ if (r >= limit || g >= limit || b >= limit) {
+ if (r == limit
+ || g == limit
+ || b == limit
+ || (((x + y) & 0x08) != 0)) {
+ r = 1.0 - r;
+ g = 1.0 - g;
+ b = 1.0 - b;
+ }
+ }
+
+ *o++ = FTOCHAR(r);
+ *o++ = FTOCHAR(g);
+ *o++ = FTOCHAR(b);
+ *o++ = FTOCHAR(a);
+ }
+ }
+}
+
+struct ImBuf * make_zebra_view_from_ibuf(struct ImBuf * src, float perc)
+{
+ struct ImBuf * ibuf = IMB_allocImBuf(src->x, src->y, 32, IB_rect, 0);
+
+ if (src->rect_float) {
+ draw_zebra_float(src, ibuf, perc);
+ } else {
+ draw_zebra_byte(src, ibuf, perc);
+ }
+ return ibuf;
+}
+
+static void draw_histogram_marker(struct ImBuf * ibuf, int x)
+{
+ unsigned char * p = (unsigned char*) ibuf->rect;
+ int barh = ibuf->y * 0.1;
+ int i;
+
+ p += 4 * (x + ibuf->x * (ibuf->y - barh + 1));
+
+ for (i = 0; i < barh-1; i++) {
+ p[0] = p[1] = p[2] = 255;
+ p += ibuf->x * 4;
+ }
+}
+
+static void draw_histogram_bar(struct ImBuf * ibuf, int x,float val, int col)
+{
+ unsigned char * p = (unsigned char*) ibuf->rect;
+ int barh = ibuf->y * val * 0.9;
+ int i;
+
+ p += 4 * (x + ibuf->x);
+
+ for (i = 0; i < barh; i++) {
+ p[col] = 255;
+ p += ibuf->x * 4;
+ }
+}
+
+static struct ImBuf *make_histogram_view_from_ibuf_byte(
+ struct ImBuf * ibuf)
+{
+ struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect, 0);
+ int n,c,x,y;
+ unsigned char* src = (unsigned char*) ibuf->rect;
+
+ unsigned int bins[3][256];
+
+ memset(bins, 0, 3 * 256* sizeof(unsigned int));
+
+ for (y = 0; y < ibuf->y; y++) {
+ for (x = 0; x < ibuf->x; x++) {
+ bins[0][*src++]++;
+ bins[1][*src++]++;
+ bins[2][*src++]++;
+ src++;
+ }
+ }
+
+ n = 0;
+ for (c = 0; c < 3; c++) {
+ for (x = 0; x < 256; x++) {
+ if (bins[c][x] > n) {
+ n = bins[c][x];
+ }
+ }
+ }
+
+ for (c = 0; c < 3; c++) {
+ for (x = 0; x < 256; x++) {
+ draw_histogram_bar(rval, x*2+1,
+ ((float) bins[c][x])/n, c);
+ draw_histogram_bar(rval, x*2+2,
+ ((float) bins[c][x])/n, c);
+ }
+ }
+
+ wform_put_border((unsigned char*) rval->rect, rval->x, rval->y);
+
+ return rval;
+}
+
+static int get_bin_float(float f)
+{
+ if (f < -0.25) {
+ f = -0.25;
+ } else if (f > 1.25) {
+ f = 1.25;
+ }
+
+ return (int) (((f + 0.25) / 1.5) * 512);
+}
+
+static struct ImBuf *make_histogram_view_from_ibuf_float(
+ struct ImBuf * ibuf)
+{
+ struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect, 0);
+ int n,c,x,y;
+ float* src = ibuf->rect_float;
+
+ unsigned int bins[3][512];
+
+ memset(bins, 0, 3 * 256* sizeof(unsigned int));
+
+ for (y = 0; y < ibuf->y; y++) {
+ for (x = 0; x < ibuf->x; x++) {
+ bins[0][get_bin_float(*src++)]++;
+ bins[1][get_bin_float(*src++)]++;
+ bins[2][get_bin_float(*src++)]++;
+ src++;
+ }
+ }
+
+ draw_histogram_marker(rval, get_bin_float(0.0));
+ draw_histogram_marker(rval, get_bin_float(1.0));
+
+ n = 0;
+ for (c = 0; c < 3; c++) {
+ for (x = 0; x < 512; x++) {
+ if (bins[c][x] > n) {
+ n = bins[c][x];
+ }
+ }
+ }
+ for (c = 0; c < 3; c++) {
+ for (x = 0; x < 512; x++) {
+ draw_histogram_bar(rval, x+1, (float) bins[c][x]/n, c);
+ }
+ }
+
+ wform_put_border((unsigned char*) rval->rect, rval->x, rval->y);
+
+ return rval;
+}
+
+struct ImBuf *make_histogram_view_from_ibuf(struct ImBuf * ibuf)
+{
+ if (ibuf->rect_float) {
+ return make_histogram_view_from_ibuf_float(ibuf);
+ } else {
+ return make_histogram_view_from_ibuf_byte(ibuf);
+ }
+}
+
static void vectorscope_put_cross(unsigned char r, unsigned char g,
unsigned char b,
char * tgt, int w, int h, int size)
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index e93cc1b1075..460c4859b8c 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -71,22 +71,34 @@
#include "blendef.h"
+#include "BLI_threads.h"
#include <pthread.h>
int seqrectx, seqrecty;
-void free_stripdata(int len, StripElem *se)
+/* **********************************************************************
+ alloc / free functions
+ ********************************************************************** */
+
+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) {
IMB_freeImBuf(se->ibuf);
se->ibuf = 0;
}
+ if(se->ibuf_comp) {
+ IMB_freeImBuf(se->ibuf_comp);
+ se->ibuf_comp = 0;
+ }
}
MEM_freeN(seo);
@@ -102,19 +114,44 @@ void free_strip(Strip *strip)
return;
}
- if(strip->stripdata) {
- free_stripdata(strip->len, strip->stripdata);
+ if (strip->stripdata) {
+ MEM_freeN(strip->stripdata);
+ }
+
+ if (strip->proxy) {
+ MEM_freeN(strip->proxy);
+ }
+ if (strip->crop) {
+ MEM_freeN(strip->crop);
+ }
+ if (strip->transform) {
+ MEM_freeN(strip->transform);
+ }
+ if (strip->color_balance) {
+ MEM_freeN(strip->color_balance);
}
+
+ free_tstripdata(strip->len, strip->tstripdata);
+ free_tstripdata(strip->endstill, strip->tstripdata_endstill);
+ free_tstripdata(strip->startstill, strip->tstripdata_startstill);
+
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);
+ free_tstripdata(seq->strip->endstill,
+ seq->strip->tstripdata_endstill);
+ free_tstripdata(seq->strip->startstill,
+ seq->strip->tstripdata_startstill);
+
+ seq->strip->tstripdata= 0;
+ seq->strip->tstripdata_endstill= 0;
+ seq->strip->tstripdata_startstill= 0;
+
seq->strip->len= seq->len;
- if(seq->len>0) seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelems");
}
}
@@ -191,6 +228,66 @@ void build_seqar(ListBase *seqbase, Sequence ***seqar, int *totseq)
*seqar= tseqar;
}
+static void do_seq_count_cb(ListBase *seqbase, int *totseq,
+ int (*test_func)(Sequence * seq))
+{
+ Sequence *seq;
+
+ seq= seqbase->first;
+ while(seq) {
+ int test = test_func(seq);
+ if (test & BUILD_SEQAR_COUNT_CURRENT) {
+ (*totseq)++;
+ }
+ if(seq->seqbase.first && (test & BUILD_SEQAR_COUNT_CHILDREN)) {
+ do_seq_count_cb(&seq->seqbase, totseq, test_func);
+ }
+ seq= seq->next;
+ }
+}
+
+static void do_build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int depth,
+ int (*test_func)(Sequence * seq))
+{
+ Sequence *seq;
+
+ seq= seqbase->first;
+ while(seq) {
+ int test = test_func(seq);
+ seq->depth= depth;
+
+ if(seq->seqbase.first && (test & BUILD_SEQAR_COUNT_CHILDREN)) {
+ do_build_seqar_cb(&seq->seqbase, seqar, depth+1,
+ test_func);
+ }
+ if (test & BUILD_SEQAR_COUNT_CURRENT) {
+ **seqar= seq;
+ (*seqar)++;
+ }
+ seq= seq->next;
+ }
+}
+
+void build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int *totseq,
+ int (*test_func)(Sequence * seq))
+{
+ Sequence **tseqar;
+
+ *totseq= 0;
+ do_seq_count_cb(seqbase, totseq, test_func);
+
+ if(*totseq==0) {
+ *seqar= 0;
+ return;
+ }
+ *seqar= MEM_mallocN(sizeof(void *)* *totseq, "seqar");
+ tseqar= *seqar;
+
+ do_build_seqar_cb(seqbase, seqar, 0, test_func);
+ *seqar= tseqar;
+}
+
+
void free_editing(Editing *ed)
{
MetaStack *ms;
@@ -265,7 +362,7 @@ void calc_sequence(Sequence *seq)
}
if(seq->strip && seq->len!=seq->strip->len) {
- new_stripdata(seq);
+ new_tstripdata(seq);
}
}
@@ -284,7 +381,7 @@ void calc_sequence(Sequence *seq)
seq->len= max-min;
if(seq->strip && seq->len!=seq->strip->len) {
- new_stripdata(seq);
+ new_tstripdata(seq);
}
}
}
@@ -292,6 +389,85 @@ void calc_sequence(Sequence *seq)
}
}
+void reload_sequence_new_file(Sequence * seq)
+{
+ char str[FILE_MAXDIR+FILE_MAXFILE];
+
+ if (!(seq->type == SEQ_MOVIE || seq->type == SEQ_IMAGE ||
+ seq->type == SEQ_HD_SOUND || seq->type == SEQ_SCENE)) {
+ return;
+ }
+
+ new_tstripdata(seq);
+
+ if (seq->type == SEQ_IMAGE) {
+ return;
+ }
+
+ if (seq->type != SEQ_SCENE) {
+ strncpy(str, seq->strip->dir, FILE_MAXDIR-1);
+ strncat(str, seq->strip->stripdata->name, FILE_MAXFILE-1);
+ }
+
+ if (seq->type == SEQ_MOVIE) {
+ if(seq->anim) IMB_free_anim(seq->anim);
+ seq->anim = openanim(str, IB_rect);
+
+ if (!seq->anim) {
+ return;
+ }
+
+ seq->len = IMB_anim_get_duration(seq->anim);
+
+ seq->anim_preseek = IMB_anim_get_preseek(seq->anim);
+
+ seq->len -= seq->anim_startofs;
+ seq->len -= seq->anim_endofs;
+ if (seq->len < 0) {
+ seq->len = 0;
+ }
+ seq->strip->len = seq->len;
+ } else if (seq->type == SEQ_HD_SOUND) {
+ if(seq->hdaudio) sound_close_hdaudio(seq->hdaudio);
+ seq->hdaudio = sound_open_hdaudio(str);
+
+ if (!seq->hdaudio) {
+ return;
+ }
+
+ seq->strip->len = seq->len
+ = sound_hdaudio_get_duration(seq->hdaudio, FPS);
+ } else if (seq->type == SEQ_SCENE) {
+ Scene * sce = G.main->scene.first;
+ int nr = 1;
+ while(sce) {
+ if(nr == seq->scenenr) {
+ break;
+ }
+ nr++;
+ sce= sce->id.next;
+ }
+
+ if (sce) {
+ seq->scene = sce;
+ }
+
+ strncpy(seq->name + 2, sce->id.name + 2,
+ sizeof(seq->name) - 2);
+
+ seq->len= seq->scene->r.efra - seq->scene->r.sfra + 1;
+ seq->len -= seq->anim_startofs;
+ seq->len -= seq->anim_endofs;
+ if (seq->len < 0) {
+ seq->len = 0;
+ }
+ seq->strip->len = seq->len;
+ }
+
+
+ calc_sequence(seq);
+}
+
void sort_seq()
{
/* all strips together per kind, and in order of y location ("machine") */
@@ -362,6 +538,54 @@ void clear_scene_in_allseqs(Scene *sce)
}
}
+char *give_seqname_by_type(int type)
+{
+ switch(type) {
+ case SEQ_META: return "Meta";
+ case SEQ_IMAGE: return "Image";
+ case SEQ_SCENE: return "Scene";
+ case SEQ_MOVIE: return "Movie";
+ case SEQ_RAM_SOUND: return "Audio (RAM)";
+ case SEQ_HD_SOUND: return "Audio (HD)";
+ case SEQ_CROSS: return "Cross";
+ case SEQ_GAMCROSS: return "Gamma Cross";
+ case SEQ_ADD: return "Add";
+ case SEQ_SUB: return "Sub";
+ case SEQ_MUL: return "Mul";
+ case SEQ_ALPHAOVER: return "Alpha Over";
+ case SEQ_ALPHAUNDER: return "Alpha Under";
+ case SEQ_OVERDROP: return "Over Drop";
+ case SEQ_WIPE: return "Wipe";
+ case SEQ_GLOW: return "Glow";
+ case SEQ_TRANSFORM: return "Transform";
+ case SEQ_COLOR: return "Color";
+ case SEQ_SPEED: return "Speed";
+ default:
+ return 0;
+ }
+}
+
+char *give_seqname(Sequence *seq)
+{
+ char * name = give_seqname_by_type(seq->type);
+
+ if (!name) {
+ if(seq->type<SEQ_EFFECT) {
+ return seq->strip->dir;
+ } else if(seq->type==SEQ_PLUGIN) {
+ if(!(seq->flag & SEQ_EFFECT_NOT_LOADED) &&
+ seq->plugin && seq->plugin->doit) {
+ return seq->plugin->pname;
+ } else {
+ return "Plugin";
+ }
+ } else {
+ return "Effect";
+ }
+ }
+ return name;
+}
+
/* ***************** DO THE SEQUENCE ***************** */
static void make_black_ibuf(ImBuf *ibuf)
@@ -426,9 +650,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;
@@ -440,7 +664,7 @@ static void do_effect(int cfra, Sequence *seq, StripElem *se)
}
if(seq->ipo && seq->ipo->curve.first) {
- do_seq_ipo(seq);
+ do_seq_ipo(seq, cfra);
fac= seq->facf0;
facf= seq->facf1;
} else {
@@ -452,7 +676,8 @@ static void do_effect(int cfra, Sequence *seq, StripElem *se)
early_out = sh.early_out(seq, fac, facf);
if (early_out == -1) { /* no input needed */
- sh.execute(seq, cfra, fac, facf, se->ibuf->x, se->ibuf->y,
+ sh.execute(seq, cfra, fac, facf,
+ se->ibuf->x, se->ibuf->y,
0, 0, 0, se->ibuf);
return;
}
@@ -464,14 +689,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)
@@ -487,8 +711,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) {
@@ -508,8 +731,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) {
@@ -548,19 +770,13 @@ 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) {
+ if(seq->flag&SEQ_REVERSE_FRAMES) {
/*reverse frame in this sequence */
if(cfra <= seq->start) nr= seq->len-1;
else if(cfra >= seq->start+seq->len-1) nr= 0;
@@ -574,9 +790,102 @@ StripElem *give_stripelem(Sequence *seq, int cfra)
if (seq->strobe > 1.0) {
nr -= (int)fmod((double)nr, (double)seq->strobe);
}
+
+ return nr;
+}
+
+static TStripElem* alloc_tstripdata(int len, const char * name)
+{
+ int i;
+ TStripElem *se = MEM_callocN(len * sizeof(TStripElem), name);
+ for (i = 0; i < len; i++) {
+ se[i].ok = STRIPELEM_OK;
+ }
+ return se;
+}
+
+TStripElem *give_tstripelem(Sequence *seq, int cfra)
+{
+ TStripElem *se;
+ int nr;
+
+ se = seq->strip->tstripdata;
+ if (se == 0 && seq->len > 0) {
+ se = seq->strip->tstripdata = alloc_tstripdata(seq->len,
+ "tstripelems");
+ }
+ nr = give_stripelem_index(seq, cfra);
+
+ if (nr == -1) return 0;
+ if (se == 0) return 0;
+
+ se += nr;
+
+ /* if there are IPOs with blend modes active, one has to watch out
+ for startstill + endstill area: we can't use the same tstripelem
+ here for all ibufs, since then, blending with IPOs won't work!
+
+ Rather common case, if you use a single image and try to fade
+ it in and out... or want to use your strip as a watermark in
+ alpha over mode...
+ */
+ if (seq->blend_mode != SEQ_BLEND_REPLACE ||
+ (seq->ipo && seq->ipo->curve.first && !(seq->type & SEQ_EFFECT))) {
+ Strip * s = seq->strip;
+ if (cfra < seq->start) {
+ se = s->tstripdata_startstill;
+ if (seq->startstill > s->startstill) {
+ free_tstripdata(s->startstill,
+ s->tstripdata_startstill);
+ se = 0;
+ }
+
+ if (se == 0) {
+ s->startstill = seq->startstill;
+ se = seq->strip->tstripdata_startstill
+ = alloc_tstripdata(
+ s->startstill,
+ "tstripelems_startstill");
+ }
+ se += seq->start - cfra - 1;
+
+ } else if (cfra > seq->start + seq->len-1) {
+ se = s->tstripdata_endstill;
+ if (seq->endstill > s->endstill) {
+ free_tstripdata(s->endstill,
+ s->tstripdata_endstill);
+ se = 0;
+ }
+
+ if (se == 0) {
+ s->endstill = seq->endstill;
+ se = seq->strip->tstripdata_endstill
+ = alloc_tstripdata(
+ s->endstill,
+ "tstripelems_endstill");
+ }
+ se += cfra - (seq->start + seq->len-1) - 1;
+ }
+ }
+
- se+= nr; /* don't get confused by the increment, this is the same as strip->stripdata[nr], which works on some compilers...*/
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 + seq->anim_startofs;
return se;
}
@@ -587,7 +896,7 @@ static int evaluate_seq_frame_gen(
Sequence *seq;
int totseq=0;
- memset(seq_arr, 0, sizeof(Sequence*) * MAXSEQ);
+ memset(seq_arr, 0, sizeof(Sequence*) * (MAXSEQ+1));
seq= seqbase->first;
while(seq) {
@@ -613,204 +922,736 @@ int evaluate_seq_frame(int cfra)
}
-Sequence *get_shown_sequence(ListBase * seqbasep, int cfra, int chanshown)
+static int video_seq_is_rendered(Sequence * seq)
{
- Sequence *seq, *seqim, *seqeff;
- Sequence *seq_arr[MAXSEQ+1];
- int b;
+ return (seq
+ && !(seq->flag & SEQ_MUTE)
+ && seq->type != SEQ_RAM_SOUND
+ && seq->type != SEQ_HD_SOUND);
+}
- seq = 0;
+static int get_shown_sequences(
+ ListBase * seqbasep, int cfra, int chanshown, Sequence ** seq_arr_out)
+{
+ Sequence *seq_arr[MAXSEQ+1];
+ int b = chanshown;
+ int cnt = 0;
- if (chanshown > MAXSEQ) {
+ if (b > MAXSEQ) {
return 0;
}
if(evaluate_seq_frame_gen(seq_arr, seqbasep, cfra)) {
- if (chanshown > 0) {
- return seq_arr[chanshown];
- }
-
- /* we take the upper effect strip or
- the lowest imagestrip/metastrip */
- seqim= seqeff= 0;
-
- for(b=1; b<MAXSEQ; b++) {
- if(seq_arr[b]) {
- seq= seq_arr[b];
- if(seq->type & SEQ_EFFECT) {
- if(seqeff==0) seqeff= seq;
- else if(seqeff->machine < seq->machine)
- seqeff= seq;
- } else if (seq->type != SEQ_RAM_SOUND && seq->type != SEQ_HD_SOUND) {
- if(seqim==0) seqim= seq;
- else if(seqim->machine > seq->machine)
- seqim= seq;
+ if (b > 0) {
+ if (seq_arr[b] == 0) {
+ return 0;
+ }
+ } else {
+ for (b = MAXSEQ; b > 0; b--) {
+ if (video_seq_is_rendered(seq_arr[b])) {
+ break;
}
}
}
- if(seqeff) seq= seqeff;
- else if(seqim) seq= seqim;
- else seq= 0;
}
- return seq;
+ chanshown = b;
+
+ for (;b > 0; b--) {
+ if (video_seq_is_rendered(seq_arr[b])) {
+ if (seq_arr[b]->blend_mode == SEQ_BLEND_REPLACE) {
+ break;
+ }
+ }
+ }
+
+ for (;b <= chanshown; b++) {
+ if (video_seq_is_rendered(seq_arr[b])) {
+ seq_arr_out[cnt++] = seq_arr[b];
+ }
+ }
+
+ return cnt;
}
-static Sequence * get_shown_seq_from_metastrip(Sequence * seqm, int cfra)
+static int get_shown_seq_from_metastrip(Sequence * seqm, int cfra,
+ Sequence ** seq_arr_out)
{
- return get_shown_sequence(&seqm->seqbase, cfra, 0);
+ return get_shown_sequences(&seqm->seqbase, cfra, 0, seq_arr_out);
}
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++) {
+ int cnt;
+ Sequence *seq_arr[MAXSEQ+1];
+
cfra= a+seqm->start;
- seq = get_shown_seq_from_metastrip(seqm, cfra);
- if (seq) {
- se->se1= give_stripelem(seq, cfra);
+ cnt = get_shown_seq_from_metastrip(seqm, cfra, seq_arr);
+ if (cnt) {
+ se->se1= give_tstripelem(seq_arr[cnt-1], cfra);
} else {
se->se1= 0;
}
}
}
-static void do_build_seq_ibuf(Sequence * seq, int cfra)
+/* **********************************************************************
+ proxy management
+ ********************************************************************** */
+
+#define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE)
+
+static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name)
+{
+ int frameno;
+ char dir[FILE_MAXDIR];
+
+ if (!seq->strip->proxy) {
+ return FALSE;
+ }
+
+ if (seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) {
+ strcpy(dir, seq->strip->proxy->dir);
+ } else {
+ if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) {
+ snprintf(dir, FILE_MAXDIR, "%s/BL_proxy",
+ seq->strip->dir);
+ } else {
+ return FALSE;
+ }
+ }
+
+ /* generate a seperate proxy directory for each preview size */
+
+ if (seq->type == SEQ_IMAGE) {
+ StripElem * se = give_stripelem(seq, cfra);
+ snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy",
+ dir, G.scene->r.size, se->name);
+ frameno = 1;
+ } else if (seq->type == SEQ_MOVIE) {
+ TStripElem * tse = give_tstripelem(seq, cfra);
+
+ frameno = tse->nr + seq->anim_startofs;
+
+ snprintf(name, PROXY_MAXFILE, "%s/%s/%d/#", dir,
+ seq->strip->stripdata->name,
+ G.scene->r.size);
+ } else {
+ TStripElem * tse = give_tstripelem(seq, cfra);
+
+ frameno = tse->nr + seq->anim_startofs;
+
+ snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/#", dir,
+ G.scene->r.size);
+ }
+
+ BLI_convertstringcode(name, G.sce, frameno);
+
+ strcat(name, ".jpg");
+
+ return TRUE;
+}
+
+static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra)
+{
+ char name[PROXY_MAXFILE];
+
+ if (!(seq->flag & SEQ_USE_PROXY)) {
+ return 0;
+ }
+
+ /* rendering at 100% ? No real sense in proxy-ing, right? */
+ if (G.scene->r.size == 100.0) {
+ return 0;
+ }
+
+ if (!seq_proxy_get_fname(seq, cfra, name)) {
+ return 0;
+ }
+
+ if (BLI_exists(name)) {
+ return IMB_loadiffname(name, IB_rect);
+ } else {
+ return 0;
+ }
+}
+
+static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
+ int build_proxy_run);
+
+static void seq_proxy_build_frame(Sequence * seq, int cfra)
+{
+ char name[PROXY_MAXFILE];
+ int quality;
+ TStripElem * se;
+ int ok;
+ int rectx, recty;
+ struct ImBuf * ibuf;
+
+ if (!(seq->flag & SEQ_USE_PROXY)) {
+ return;
+ }
+
+ /* rendering at 100% ? No real sense in proxy-ing, right? */
+ if (G.scene->r.size == 100.0) {
+ return;
+ }
+
+ if (!seq_proxy_get_fname(seq, cfra, name)) {
+ return;
+ }
+
+ se = give_tstripelem(seq, cfra);
+
+ if(se->ibuf) {
+ IMB_freeImBuf(se->ibuf);
+ se->ibuf = 0;
+ }
+
+ do_build_seq_ibuf(seq, se, cfra, TRUE);
+
+ if (!se->ibuf) {
+ return;
+ }
+
+ rectx= (G.scene->r.size*G.scene->r.xsch)/100;
+ recty= (G.scene->r.size*G.scene->r.ysch)/100;
+
+ ibuf = se->ibuf;
+
+ if (ibuf->x != rectx || ibuf->y != recty) {
+ IMB_scalefastImBuf(ibuf, (short)rectx, (short)recty);
+ }
+
+ /* quality is fixed, otherwise one has to generate seperate
+ directories for every quality...
+
+ depth = 32 is intentionally left in, otherwise ALPHA channels
+ won't work... */
+ quality = 90;
+ ibuf->ftype= JPG | quality;
+
+ BLI_make_existing_file(name);
+
+ ok = IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat);
+ if (ok == 0) {
+ perror(name);
+ }
+
+ IMB_freeImBuf(ibuf);
+ se->ibuf = 0;
+}
+
+void seq_proxy_rebuild(Sequence * seq)
+{
+ int cfra;
+
+ waitcursor(1);
+
+ G.afbreek = 0;
+
+ /* flag management tries to account for strobe and
+ other "non-linearities", that might come in the future...
+ better way would be to "touch" the files, so that _really_
+ no one is rebuild twice.
+ */
+
+ for (cfra = seq->startdisp; cfra < seq->enddisp; cfra++) {
+ TStripElem * tse = give_tstripelem(seq, cfra);
+
+ tse->flag &= ~STRIPELEM_PREVIEW_DONE;
+ }
+
+ /* a _lot_ faster for movie files, if we read frames in
+ sequential order */
+ if (seq->flag & SEQ_REVERSE_FRAMES) {
+ for (cfra = seq->enddisp-seq->endstill-1;
+ cfra >= seq->startdisp + seq->startstill; cfra--) {
+ TStripElem * tse = give_tstripelem(seq, cfra);
+
+ if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {
+ seq_proxy_build_frame(seq, cfra);
+ tse->flag |= STRIPELEM_PREVIEW_DONE;
+ }
+ if (blender_test_break()) {
+ break;
+ }
+ }
+ } else {
+ for (cfra = seq->startdisp + seq->startstill;
+ cfra < seq->enddisp - seq->endstill; cfra++) {
+ TStripElem * tse = give_tstripelem(seq, cfra);
+
+ if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {
+ seq_proxy_build_frame(seq, cfra);
+ tse->flag |= STRIPELEM_PREVIEW_DONE;
+ }
+ if (blender_test_break()) {
+ break;
+ }
+ }
+ }
+ waitcursor(0);
+}
+
+
+/* **********************************************************************
+ color balance
+ ********************************************************************** */
+
+static StripColorBalance calc_cb(StripColorBalance * cb_)
+{
+ StripColorBalance cb = *cb_;
+ int c;
+
+ if (cb.flag & SEQ_COLOR_BALANCE_INVERSE_LIFT) {
+ for (c = 0; c < 3; c++) {
+ cb.lift[c] = 1.0 - cb.lift[c];
+ }
+ } else {
+ for (c = 0; c < 3; c++) {
+ cb.lift[c] = -(1.0 - cb.lift[c]);
+ }
+ }
+ if (cb.flag & SEQ_COLOR_BALANCE_INVERSE_GAIN) {
+ for (c = 0; c < 3; c++) {
+ if (cb.gain[c] != 0.0) {
+ cb.gain[c] = 1.0/cb.gain[c];
+ } else {
+ cb.gain[c] = 1000000; /* should be enough :) */
+ }
+ }
+ }
+
+ if (!(cb.flag & SEQ_COLOR_BALANCE_INVERSE_GAMMA)) {
+ for (c = 0; c < 3; c++) {
+ if (cb.gain[c] != 0.0) {
+ cb.gamma[c] = 1.0/cb.gamma[c];
+ } else {
+ cb.gamma[c] = 1000000; /* should be enough :) */
+ }
+ }
+ }
+
+ return cb;
+}
+
+static void make_cb_table_byte(float lift, float gain, float gamma,
+ unsigned char * table, float mul)
+{
+ int y;
+
+ for (y = 0; y < 256; y++) {
+ float v = 1.0 * y / 255;
+ v += lift;
+ v *= gain;
+ v = pow(v, gamma);
+ v *= mul;
+ if ( v > 1.0) {
+ v = 1.0;
+ } else if (v < 0.0) {
+ v = 0.0;
+ }
+ table[y] = v * 255;
+ }
+
+}
+
+static void make_cb_table_float(float lift, float gain, float gamma,
+ float * table, float mul)
+{
+ int y;
+
+ for (y = 0; y < 256; y++) {
+ float v = (float) y * 1.0 / 255.0;
+ v += lift;
+ v *= gain;
+ v = pow(v, gamma);
+ v *= mul;
+ table[y] = v;
+ }
+}
+
+static void color_balance_byte_byte(Sequence * seq, TStripElem* se,
+ float mul)
+{
+ unsigned char cb_tab[3][256];
+ int c;
+ unsigned char * p = (unsigned char*) se->ibuf->rect;
+ unsigned char * e = p + se->ibuf->x * 4 * se->ibuf->y;
+
+ StripColorBalance cb = calc_cb(seq->strip->color_balance);
+
+ for (c = 0; c < 3; c++) {
+ make_cb_table_byte(cb.lift[c], cb.gain[c], cb.gamma[c],
+ cb_tab[c], mul);
+ }
+
+ while (p < e) {
+ p[0] = cb_tab[0][p[0]];
+ p[1] = cb_tab[1][p[1]];
+ p[2] = cb_tab[2][p[2]];
+
+ p += 4;
+ }
+}
+
+static void color_balance_byte_float(Sequence * seq, TStripElem* se,
+ float mul)
+{
+ float cb_tab[4][256];
+ int c,i;
+ unsigned char * p = (unsigned char*) se->ibuf->rect;
+ unsigned char * e = p + se->ibuf->x * 4 * se->ibuf->y;
+ float * o;
+ StripColorBalance cb;
+
+ imb_addrectfloatImBuf(se->ibuf);
+
+ o = se->ibuf->rect_float;
+
+ cb = calc_cb(seq->strip->color_balance);
+
+ for (c = 0; c < 3; c++) {
+ make_cb_table_float(cb.lift[c], cb.gain[c], cb.gamma[c],
+ cb_tab[c], mul);
+ }
+
+ for (i = 0; i < 256; i++) {
+ cb_tab[3][i] = ((float)i)*(1.0f/255.0f);
+ }
+
+ while (p < e) {
+ o[0] = cb_tab[0][p[0]];
+ o[1] = cb_tab[1][p[1]];
+ o[2] = cb_tab[2][p[2]];
+ o[3] = cb_tab[3][p[3]];
+
+ p += 4; o += 4;
+ }
+}
+
+static void color_balance_float_float(Sequence * seq, TStripElem* se,
+ float mul)
+{
+ float * p = se->ibuf->rect_float;
+ float * e = se->ibuf->rect_float + se->ibuf->x * 4* se->ibuf->y;
+ StripColorBalance cb = calc_cb(seq->strip->color_balance);
+
+ while (p < e) {
+ int c;
+ for (c = 0; c < 3; c++) {
+ p[c] = pow((p[c] + cb.lift[c]) * cb.gain[c],
+ cb.gamma[c]) * mul;
+ }
+ }
+}
+
+static void color_balance(Sequence * seq, TStripElem* se, float mul)
+{
+ if (se->ibuf->rect_float) {
+ color_balance_float_float(seq, se, mul);
+ } else if(seq->flag & SEQ_MAKE_FLOAT) {
+ color_balance_byte_float(seq, se, mul);
+ } else {
+ color_balance_byte_byte(seq, se, mul);
+ }
+}
+
+/*
+ input preprocessing for SEQ_IMAGE, SEQ_MOVIE and SEQ_SCENE
+
+ Do all the things you can't really do afterwards using sequence effects
+ (read: before rescaling to render resolution has been done)
+
+ Order is important!
+
+ - Deinterlace
+ - Crop and transform in image source coordinate space
+ - Flip X + Flip Y (could be done afterwards, backward compatibility)
+ - Promote image to float data (affects pipeline operations afterwards)
+ - Color balance (is most efficient in the byte -> float
+ (future: half -> float should also work fine!)
+ case, if done on load, since we can use lookup tables)
+ - Premultiply
+
+*/
+
+static void input_preprocess(Sequence * seq, TStripElem* se, int cfra)
+{
+ float mul;
+
+ 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_USE_CROP || seq->flag & SEQ_USE_TRANSFORM) {
+ StripCrop c;
+ StripTransform t;
+
+ memset(&c, 0, sizeof(StripCrop));
+ memset(&t, 0, sizeof(StripTransform));
+
+ if(seq->flag & SEQ_USE_CROP && seq->strip->crop) {
+ c = *seq->strip->crop;
+ }
+ if(seq->flag & SEQ_USE_TRANSFORM && seq->strip->transform) {
+ t = *seq->strip->transform;
+ }
+
+ if (c.top + c.bottom >= se->ibuf->y ||
+ c.left + c.right >= se->ibuf->x ||
+ t.xofs >= se->ibuf->x ||
+ t.yofs >= se->ibuf->y) {
+ make_black_ibuf(se->ibuf);
+ } else {
+ ImBuf * i;
+ int sx = se->ibuf->x - c.left - c.right;
+ int sy = se->ibuf->y - c.top - c.bottom;
+ int dx = sx;
+ int dy = sy;
+
+ if (seq->flag & SEQ_USE_TRANSFORM) {
+ dx = seqrectx;
+ dy = seqrecty;
+ }
+
+ if (se->ibuf->rect_float) {
+ i = IMB_allocImBuf(dx, dy,32, IB_rectfloat, 0);
+ } else {
+ i = IMB_allocImBuf(dx, dy,32, IB_rect, 0);
+ }
+
+ IMB_rectcpy(i, se->ibuf,
+ t.xofs, t.yofs,
+ c.left, c.bottom,
+ sx, sy);
+
+ IMB_freeImBuf(se->ibuf);
+
+ se->ibuf = i;
+ }
+ }
+
+ 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;
+ }
+
+ mul = seq->mul;
+
+ if(seq->blend_mode == SEQ_BLEND_REPLACE) {
+ if (seq->ipo && seq->ipo->curve.first) {
+ do_seq_ipo(seq, cfra);
+ mul *= seq->facf0;
+ }
+ mul *= seq->blend_opacity / 100.0;
+ }
+
+ if(seq->flag & SEQ_USE_COLOR_BALANCE && seq->strip->color_balance) {
+ color_balance(seq, se, mul);
+ mul = 1.0;
+ }
+
+ if(seq->flag & SEQ_MAKE_FLOAT) {
+ if (!se->ibuf->rect_float) {
+ IMB_float_from_rect(se->ibuf);
+ }
+ if (se->ibuf->rect) {
+ imb_freerectImBuf(se->ibuf);
+ }
+ }
+
+ if(mul != 1.0) {
+ multibuf(se->ibuf, mul);
+ }
+
+ if(seq->flag & SEQ_MAKE_PREMUL) {
+ if(se->ibuf->depth == 32 && se->ibuf->zbuf == 0) {
+ converttopremul(se->ibuf);
+ }
+ }
+
+
+ if(se->ibuf->x != seqrectx || se->ibuf->y != seqrecty ) {
+ if(G.scene->r.mode & R_OSA) {
+ IMB_scaleImBuf(se->ibuf,
+ (short)seqrectx, (short)seqrecty);
+ } else {
+ IMB_scalefastImBuf(se->ibuf,
+ (short)seqrectx, (short)seqrecty);
+ }
+ }
+}
+
+/* test if image too small or discarded from cache: reload */
+
+static void test_and_auto_discard_ibuf(TStripElem * se)
+{
+ if (se->ibuf) {
+ 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= STRIPELEM_OK;
+ }
+ }
+ if (se->ibuf_comp) {
+ if(se->ibuf_comp->x != seqrectx || se->ibuf_comp->y != seqrecty
+ || !(se->ibuf_comp->rect || se->ibuf_comp->rect_float)) {
+ IMB_freeImBuf(se->ibuf_comp);
+
+ se->ibuf_comp = 0;
+ }
+ }
+}
+
+static TStripElem* do_build_seq_array_recursively(
+ ListBase *seqbasep, int cfra, int chanshown);
+
+static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
+ int build_proxy_run)
{
- StripElem *se = seq->curelem;
char name[FILE_MAXDIR+FILE_MAXFILE];
+
+ if (seq->type != SEQ_META) {
+ test_and_auto_discard_ibuf(se);
+ }
+
if(seq->type == SEQ_META) {
- se->ok= 2;
- if(se->se1==0) set_meta_stripdata(seq);
- if(se->se1) {
- se->ibuf= se->se1->ibuf;
+ if(seq->seqbase.first) {
+ if(cfra < seq->start) {
+ do_build_seq_array_recursively(
+ &seq->seqbase,
+ seq->start, 0);
+ } else if(cfra > seq->start + seq->len - 1) {
+ do_build_seq_array_recursively(
+ &seq->seqbase,
+ seq->start + seq->len - 1, 0);
+ } else {
+ do_build_seq_array_recursively(
+ &seq->seqbase,
+ cfra, 0);
+ }
}
- } 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 */
- if(se->ibuf) {
- if(se->ibuf->x < seqrectx || se->ibuf->y < seqrecty || !(se->ibuf->rect || se->ibuf->rect_float)) {
+
+ se->ok = STRIPELEM_META;
+ if(se->se1 == 0) set_meta_stripdata(seq);
+ if(se->se1) {
+ if(se->ibuf) {
IMB_freeImBuf(se->ibuf);
- se->ibuf= 0;
+ }
+ se->ibuf = se->se1->ibuf_comp;
+ if(se->ibuf) {
+ IMB_refImBuf(se->ibuf);
}
}
-
+ } else if(seq->type & SEQ_EFFECT) {
/* 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 (!build_proxy_run && se->ibuf == 0) {
+ se->ibuf = seq_proxy_fetch(seq, cfra);
+ }
+
+ 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);
}
-
- /* test size */
- if(se->ibuf) {
- if(se->ibuf->x != seqrectx || se->ibuf->y != seqrecty ) {
- if(G.scene->r.mode & R_OSA) {
- IMB_scaleImBuf(se->ibuf, (short)seqrectx, (short)seqrecty);
- } else {
- IMB_scalefastImBuf(se->ibuf, (short)seqrectx, (short)seqrecty);
- }
+ } else if(seq->type == SEQ_IMAGE) {
+ if(se->ok == STRIPELEM_OK && se->ibuf == 0) {
+ StripElem * s_elem = give_stripelem(seq, cfra);
+
+ strncpy(name, seq->strip->dir, FILE_MAXDIR-1);
+ strncat(name, s_elem->name, FILE_MAXFILE);
+ BLI_convertstringcode(name, G.sce, G.scene->r.cfra);
+ if (!build_proxy_run) {
+ se->ibuf = seq_proxy_fetch(seq, cfra);
}
- }
- } else if(seq->type < SEQ_EFFECT) {
- if(se->ibuf) {
- /* test if image too small
- or discarded from cache: reload */
- 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;
+ if (!se->ibuf) {
+ se->ibuf= IMB_loadiffname(
+ name, IB_rect);
}
- }
-
- if(seq->type==SEQ_IMAGE) {
- if(se->ok && se->ibuf==0) {
- /* 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);
- 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(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);
- }
+
+ if(se->ibuf == 0) {
+ se->ok = STRIPELEM_FAILED;
+ } else if (!build_proxy_run) {
+ input_preprocess(seq, se, cfra);
}
}
- else if(seq->type==SEQ_MOVIE) {
- if(se->ok && se->ibuf==0) {
+ } else if(seq->type == SEQ_MOVIE) {
+ if(se->ok == STRIPELEM_OK && se->ibuf==0) {
+ if(!build_proxy_run) {
+ se->ibuf = seq_proxy_fetch(seq, cfra);
+ }
+
+ if (se->ibuf == 0) {
if(seq->anim==0) {
strncpy(name, seq->strip->dir, FILE_MAXDIR-1);
strncat(name, seq->strip->stripdata->name, FILE_MAXFILE-1);
BLI_convertstringcode(name, G.sce, G.scene->r.cfra);
-
+
seq->anim = openanim(name, IB_rect);
}
if(seq->anim) {
IMB_anim_set_preseek(seq->anim, seq->anim_preseek);
- se->ibuf = IMB_anim_absolute(seq->anim, se->nr);
- }
-
- if(se->ibuf==0) se->ok= 0;
- else {
- if(seq->flag & SEQ_MAKE_PREMUL) {
- if(se->ibuf->depth==32) 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->mul==0.0) seq->mul= 1.0;
- if(seq->mul != 1.0) multibuf(se->ibuf, seq->mul);
+ se->ibuf = IMB_anim_absolute(seq->anim, se->nr + seq->anim_startofs);
}
}
- } else if(seq->type==SEQ_SCENE && se->ibuf==NULL && seq->scene) { // scene can be NULL after deletions
- int oldcfra = CFRA;
- Scene *sce= seq->scene, *oldsce= G.scene;
- Render *re;
- RenderResult rres;
- int doseq, rendering= G.rendering;
- char scenename[64];
+ if(se->ibuf == 0) {
+ se->ok = STRIPELEM_FAILED;
+ } else if (!build_proxy_run) {
+ input_preprocess(seq, se, cfra);
+ }
+ }
+ } else if(seq->type == SEQ_SCENE) { // scene can be NULL after deletions
+ int oldcfra = CFRA;
+ Scene *sce= seq->scene, *oldsce= G.scene;
+ Render *re;
+ RenderResult rres;
+ int doseq, rendering= G.rendering;
+ char scenename[64];
+
+ if (se->ibuf==NULL && seq->scene && !build_proxy_run) {
+ se->ibuf = seq_proxy_fetch(seq, cfra);
+ input_preprocess(seq, se, cfra);
+ }
+
+ if (se->ibuf==NULL && seq->scene) {
waitcursor(1);
/* Hack! This function can be called from do_render_seq(), in that case
@@ -834,7 +1675,8 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
/* hrms, set_scene still needed? work on that... */
if(sce!=oldsce) set_scene_bg(sce);
- RE_BlenderFrame(re, sce, seq->sfra + se->nr);
+ RE_BlenderFrame(re, sce,
+ seq->sfra+se->nr+seq->anim_startofs);
if(sce!=oldsce) set_scene_bg(oldsce);
/* UGLY WARNING, it is set to zero in RE_BlenderFrame */
@@ -864,52 +1706,36 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
if((G.f & G_PLAYANIM)==0) /* bad, is set on do_render_seq */
waitcursor(0);
CFRA = oldcfra;
- }
-
- /* size test */
- if(se->ibuf) {
- if(se->ibuf->x != seqrectx || se->ibuf->y != seqrecty ) {
-
- if (0) { // G.scene->r.mode & R_FIELDS) {
-
- if (seqrecty > 288)
- IMB_scalefieldImBuf(se->ibuf, (short)seqrectx, (short)seqrecty);
- else {
- IMB_de_interlace(se->ibuf);
-
- if(G.scene->r.mode & R_OSA)
- IMB_scaleImBuf(se->ibuf, (short)seqrectx, (short)seqrecty);
- else
- IMB_scalefastImBuf(se->ibuf, (short)seqrectx, (short)seqrecty);
- }
- }
- else {
- if(G.scene->r.mode & R_OSA)
- IMB_scaleImBuf(se->ibuf,(short)seqrectx, (short)seqrecty);
- else
- IMB_scalefastImBuf(se->ibuf, (short)seqrectx, (short)seqrecty);
- }
+
+ if (!build_proxy_run) {
+ input_preprocess(seq, se, cfra);
}
-
- }
+
+ }
}
- if (se->ibuf) {
- IMB_cache_limiter_insert(se->ibuf);
- IMB_cache_limiter_ref(se->ibuf);
- IMB_cache_limiter_touch(se->ibuf);
+ if (!build_proxy_run) {
+ 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 TStripElem* 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);
+ do_seq_ipo(seq, cfra);
fac= seq->facf0;
facf= seq->facf1;
} else {
@@ -924,79 +1750,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, FALSE);
/* 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, FALSE);
}
}
+ return se;
}
/* FIXME:
@@ -1007,16 +1804,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);
@@ -1025,22 +1822,15 @@ 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) {
- if(se->ibuf) {
- if(se->ibuf->x < seqrectx || se->ibuf->y < seqrecty
- || !(se->ibuf->rect || se->ibuf->rect_float)) {
- IMB_freeImBuf(se->ibuf);
- se->ibuf= 0;
- }
- }
+ test_and_auto_discard_ibuf(se);
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);
@@ -1072,11 +1862,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);
@@ -1110,35 +1899,248 @@ 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)
+static TStripElem* do_build_seq_array_recursively(
+ ListBase *seqbasep, int cfra, int chanshown)
+{
+ Sequence* seq_arr[MAXSEQ+1];
+ int count;
+ int i;
+ TStripElem* se = 0;
+
+ count = get_shown_sequences(seqbasep, cfra, chanshown, (Sequence **)&seq_arr);
+
+ if (!count) {
+ return 0;
+ }
+
+ se = give_tstripelem(seq_arr[count - 1], cfra);
+
+ test_and_auto_discard_ibuf(se);
+
+ if (se->ibuf_comp != 0) {
+ IMB_cache_limiter_insert(se->ibuf_comp);
+ IMB_cache_limiter_ref(se->ibuf_comp);
+ IMB_cache_limiter_touch(se->ibuf_comp);
+ return se;
+ }
+
+
+ if(count == 1) {
+ se = do_build_seq_recursively(seq_arr[0], cfra);
+ if (se->ibuf) {
+ se->ibuf_comp = se->ibuf;
+ IMB_refImBuf(se->ibuf_comp);
+ }
+ return se;
+ }
+
+
+ for (i = count - 1; i >= 0; i--) {
+ int early_out;
+ Sequence * seq = seq_arr[i];
+ struct SeqEffectHandle sh;
+
+ se = give_tstripelem(seq, cfra);
+
+ test_and_auto_discard_ibuf(se);
+
+ if (se->ibuf_comp != 0) {
+ break;
+ }
+ if (seq->blend_mode == SEQ_BLEND_REPLACE) {
+ do_build_seq_recursively(seq, cfra);
+ if (se->ibuf) {
+ se->ibuf_comp = se->ibuf;
+ IMB_refImBuf(se->ibuf);
+ } else {
+ se->ibuf_comp = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty,
+ 32, IB_rect, 0);
+ }
+ break;
+ }
+
+ sh = get_sequence_blend(seq);
+
+ seq->facf0 = seq->facf1 = 1.0;
+
+ if(seq->ipo && seq->ipo->curve.first) {
+ do_seq_ipo(seq, cfra);
+ }
+
+ if( G.scene->r.mode & R_FIELDS ); else seq->facf0 = seq->facf1;
+
+ seq->facf0 *= seq->blend_opacity / 100.0;
+ seq->facf1 *= seq->blend_opacity / 100.0;
+
+ early_out = sh.early_out(seq, seq->facf0, seq->facf1);
+
+ switch (early_out) {
+ case -1:
+ case 2:
+ do_build_seq_recursively(seq, cfra);
+ if (se->ibuf) {
+ se->ibuf_comp = se->ibuf;
+ IMB_refImBuf(se->ibuf_comp);
+ } else {
+ se->ibuf_comp = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty,
+ 32, IB_rect, 0);
+ }
+ break;
+ case 1:
+ if (i == 0) {
+ se->ibuf_comp = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty,
+ 32, IB_rect, 0);
+ IMB_cache_limiter_insert(se->ibuf_comp);
+ IMB_cache_limiter_ref(se->ibuf_comp);
+ IMB_cache_limiter_touch(se->ibuf_comp);
+ }
+ break;
+ case 0:
+ do_build_seq_recursively(seq, cfra);
+ if (!se->ibuf) {
+ se->ibuf = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty,
+ 32, IB_rect, 0);
+ }
+ if (i == 0) {
+ se->ibuf_comp = se->ibuf;
+ IMB_refImBuf(se->ibuf_comp);
+ }
+ break;
+ }
+
+ if (se->ibuf_comp) {
+ break;
+ }
+ }
+
+ i++;
+
+ for (; i < count; i++) {
+ Sequence * seq = seq_arr[i];
+ struct SeqEffectHandle sh = get_sequence_blend(seq);
+ TStripElem* se1 = give_tstripelem(seq_arr[i-1], cfra);
+ TStripElem* se2 = give_tstripelem(seq_arr[i], cfra);
+
+ int early_out = sh.early_out(seq, seq->facf0, seq->facf1);
+ switch (early_out) {
+ case 0: {
+ int x= se2->ibuf->x;
+ int y= se2->ibuf->y;
+ int swap_input = FALSE;
+
+ if (se1->ibuf_comp->rect_float ||
+ se2->ibuf->rect_float) {
+ se2->ibuf_comp = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty,
+ 32, IB_rectfloat, 0);
+ } else {
+ se2->ibuf_comp = IMB_allocImBuf(
+ (short)seqrectx, (short)seqrecty,
+ 32, IB_rect, 0);
+ }
+
+
+ if (!se1->ibuf_comp->rect_float &&
+ se2->ibuf_comp->rect_float) {
+ IMB_float_from_rect(se1->ibuf_comp);
+ }
+ if (!se2->ibuf->rect_float &&
+ se2->ibuf_comp->rect_float) {
+ IMB_float_from_rect(se2->ibuf);
+ }
+
+ if (!se1->ibuf_comp->rect &&
+ !se2->ibuf_comp->rect_float) {
+ IMB_rect_from_float(se1->ibuf_comp);
+ }
+ if (!se2->ibuf->rect &&
+ !se2->ibuf_comp->rect_float) {
+ IMB_rect_from_float(se2->ibuf);
+ }
+
+ /* bad hack, to fix crazy input ordering of
+ those two effects */
+
+ if (seq->blend_mode == SEQ_ALPHAOVER ||
+ seq->blend_mode == SEQ_ALPHAUNDER ||
+ seq->blend_mode == SEQ_OVERDROP) {
+ swap_input = TRUE;
+ }
+
+ if (swap_input) {
+ sh.execute(seq, cfra,
+ seq->facf0, seq->facf1, x, y,
+ se2->ibuf, se1->ibuf_comp, 0,
+ se2->ibuf_comp);
+ } else {
+ sh.execute(seq, cfra,
+ seq->facf0, seq->facf1, x, y,
+ se1->ibuf_comp, se2->ibuf, 0,
+ se2->ibuf_comp);
+ }
+
+ IMB_cache_limiter_insert(se2->ibuf_comp);
+ IMB_cache_limiter_ref(se2->ibuf_comp);
+ IMB_cache_limiter_touch(se2->ibuf_comp);
+
+ IMB_cache_limiter_unref(se1->ibuf_comp);
+ IMB_cache_limiter_unref(se2->ibuf);
+
+ break;
+ }
+ case 1: {
+ se2->ibuf_comp = se1->ibuf;
+ IMB_refImBuf(se2->ibuf_comp);
+
+ break;
+ }
+ }
+ se = se2;
+ }
+
+ return se;
+}
+
+/*
+ * 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;
@@ -1154,24 +2156,44 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
seqrectx= rectx; /* bad bad global! */
seqrecty= recty;
- seqfirst = get_shown_sequence(seqbasep, cfra, chanshown);
+ se = do_build_seq_array_recursively(seqbasep, cfra, chanshown);
- if (!seqfirst) {
+ if(!se) {
return 0;
}
- do_build_seq_recursively(seqfirst, cfra);
+ return se->ibuf_comp;
+}
+
+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 seqfirst->curelem->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 */
@@ -1214,7 +2236,6 @@ typedef struct PrefetchQueueElem {
struct ImBuf * ibuf;
} PrefetchQueueElem;
-
static void * seq_prefetch_thread(void * This_)
{
PrefetchThread * This = This_;
@@ -1253,12 +2274,8 @@ static void * seq_prefetch_thread(void * This_)
This->running = TRUE;
if (e->cfra >= s_last) {
- e->ibuf = give_ibuf_seq(e->rectx, e->recty, e->cfra,
- e->chanshown);
- }
-
- if (e->ibuf) {
- IMB_cache_limiter_ref(e->ibuf);
+ e->ibuf = give_ibuf_seq_impl(
+ e->rectx, e->recty, e->cfra, e->chanshown);
}
pthread_mutex_lock(&queue_lock);
@@ -1319,6 +2336,9 @@ void seq_start_threads()
pthread_create(&t->pthread, NULL, seq_prefetch_thread, t);
}
+
+ /* init malloc mutex */
+ BLI_init_threads(0, 0, 0);
}
void seq_stop_threads()
@@ -1359,6 +2379,9 @@ void seq_stop_threads()
}
BLI_freelistN(&running_threads);
+
+ /* deinit malloc mutex */
+ BLI_end_threads(0);
}
void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown)
@@ -1413,7 +2436,7 @@ void seq_wait_for_prefetch_ready()
fprintf(stderr, "SEQ-THREAD: prefetch done\n");
}
-ImBuf * give_ibuf_threaded(int rectx, int recty, int cfra, int chanshown)
+ImBuf * give_ibuf_seq_threaded(int rectx, int recty, int cfra, int chanshown)
{
PrefetchQueueElem * e = 0;
int found_something = FALSE;
@@ -1493,15 +2516,18 @@ ImBuf * give_ibuf_threaded(int rectx, int recty, int cfra, int chanshown)
/* 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)
- IMB_freeImBuf(se->ibuf);
- se->ibuf= 0;
- se->ok= 1;
- se->se1= se->se2= se->se3= 0;
+ if(se->ibuf) {
+ IMB_freeImBuf(se->ibuf);
}
+ if(se->ibuf_comp) {
+ IMB_freeImBuf(se->ibuf_comp);
+ }
+ se->ibuf_comp = 0;
+ se->ibuf= 0;
+ se->ok= STRIPELEM_OK;
+ se->se1= se->se2= se->se3= 0;
}
static void free_anim_seq(Sequence *seq)
@@ -1516,16 +2542,33 @@ 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->strip->len && se; a++, se++) {
+ if(se != curelem) {
+ free_imbuf_strip_elem(se);
+ }
+ }
+ for(a = 0, se = seq->strip->tstripdata_startstill;
+ a < seq->strip->startstill && se; a++, se++) {
+ if(se != curelem) {
+ free_imbuf_strip_elem(se);
+ }
+ }
+ for(a = 0, se = seq->strip->tstripdata_endstill;
+ a < seq->strip->endstill && se; a++, se++) {
+ if(se != curelem) {
free_imbuf_strip_elem(se);
+ }
+ }
if(seq->type==SEQ_MOVIE)
if(seq->startdisp > cfra || seq->enddisp < cfra)
@@ -1539,15 +2582,25 @@ 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++)
+ for(a = 0, se = seq->strip->tstripdata;
+ a < seq->strip->len && se; a++, se++) {
+ free_imbuf_strip_elem(se);
+ }
+ for(a = 0, se = seq->strip->tstripdata_startstill;
+ a < seq->strip->startstill && se; a++, se++) {
free_imbuf_strip_elem(se);
+ }
+ for(a = 0, se = seq->strip->tstripdata_endstill;
+ a < seq->strip->endstill && se; a++, se++) {
+ free_imbuf_strip_elem(se);
+ }
if(seq->type==SEQ_MOVIE)
free_anim_seq(seq);
@@ -1582,7 +2635,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 */
@@ -1594,24 +2647,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);
@@ -1646,7 +2702,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");
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index 559c74b7995..187cb1c9ef0 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,16 +79,21 @@
#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"
#include "BKE_ipo.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_multires.h"
#include "BKE_node.h"
#include "BKE_scene.h"
+#include "BKE_sculpt.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 */
@@ -97,6 +103,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"
@@ -119,8 +126,10 @@
#include "BIF_meshtools.h"
#include "BIF_mywindow.h"
#include "BIF_oops.h"
+#include "BIF_poselib.h"
#include "BIF_poseobject.h"
#include "BIF_outliner.h"
+#include "BIF_radialcontrol.h"
#include "BIF_resources.h"
#include "BIF_retopo.h"
#include "BIF_screen.h"
@@ -140,6 +149,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"
@@ -985,6 +995,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);
@@ -1002,6 +1015,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) {
@@ -1023,6 +1038,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) {
@@ -1041,7 +1058,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);
@@ -1158,7 +1177,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val) {
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
if(event==UI_BUT_EVENT) do_butspace(val); /* temporal, view3d deserves own queue? */
@@ -1170,7 +1189,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
/* 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.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT) || (G.f & G_PARTICLEEDIT)) ||
(G.obedit) )
{
if (event==LEFTMOUSE) event = RIGHTMOUSE;
@@ -1181,8 +1200,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(!mouse_in_header(sa)) {
if(!G.obedit && (G.f & G_SCULPTMODE)) {
SculptSession *ss= sculpt_session();
- if(ss && ss->propset) {
- sculptmode_propset(event);
+ if(ss && ss->radialcontrol) {
+ radialcontrol_do_events(ss->radialcontrol, event);
return;
}
else if(event!=LEFTMOUSE && event!=MIDDLEMOUSE && (event==MOUSEY || event==MOUSEX)) {
@@ -1190,6 +1209,21 @@ 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(*PE_radialcontrol()) {
+ radialcontrol_do_events(*PE_radialcontrol(), event);
+ return;
+ }
+ 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()) {
@@ -1337,7 +1371,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case LEFTMOUSE:
if(G.qual==LR_SHIFTKEY+LR_CTRLKEY)
sculptmode_pmv(0);
- else if(!(ss && ss->propset))
+ else if(!(ss && ss->radialcontrol))
sculpt();
break;
/* View */
@@ -1412,15 +1446,15 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
/* Brush properties */
case AKEY:
- br->airbrush= !br->airbrush;
+ br->flag ^= SCULPT_BRUSH_AIRBRUSH;
update_prop= 1; break;
case FKEY:
- if(G.qual==0)
- sculptmode_propset_init(PropsetSize);
- if(G.qual==LR_SHIFTKEY)
- sculptmode_propset_init(PropsetStrength);
- if(G.qual==LR_CTRLKEY)
- sculptmode_propset_init(PropsetTexRot);
+ if(ss) {
+ sculpt_radialcontrol_start(G.qual == 0 ? RADIALCONTROL_SIZE :
+ G.qual == LR_SHIFTKEY ? RADIALCONTROL_STRENGTH :
+ G.qual == LR_CTRLKEY ? RADIALCONTROL_ROTATION :
+ RADIALCONTROL_NONE);
+ }
break;
case VKEY:
br->dir= br->dir==1 ? 2 : 1;
@@ -1468,20 +1502,20 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case PAGEUPKEY:
if(me && me->mr) {
me->mr->newlvl= ((Mesh*)ob->data)->mr->current+1;
- multires_set_level(ob, ob->data, 0);
+ multires_set_level_cb(ob, ob->data);
}
break;
case PAGEDOWNKEY:
if(me && me->mr) {
me->mr->newlvl= ((Mesh*)ob->data)->mr->current-1;
- multires_set_level(ob, ob->data, 0);
+ multires_set_level_cb(ob, ob->data);
}
break;
/* Partial Visibility */
case HKEY:
if(G.qual==LR_ALTKEY) {
waitcursor(1);
- sculptmode_pmv_off(get_mesh(ob));
+ mesh_pmv_off(ob, get_mesh(ob));
BIF_undo_push("Partial mesh hide");
allqueue(REDRAWVIEW3D,0);
waitcursor(0);
@@ -1541,8 +1575,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
/* Shift-Tabe handling (other cases are in toets) */
if (G.qual == LR_SHIFTKEY)
{
- /* Snap toggle (only edit mesh right now) */
- if (G.obedit && G.obedit->type==OB_MESH)
+ /* Snap toggle only when supported */
+ if (BIF_snappingSupported())
{
G.scene->snap_flag ^= SCE_SNAP;
allqueue(REDRAWHEADERS, 0);
@@ -1554,7 +1588,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) {
@@ -1566,6 +1600,12 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if (G.f & G_TEXTUREPAINT) {
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:
handle_view_middlemouse();
@@ -1593,6 +1633,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
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;
@@ -1711,6 +1753,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
else {
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
@@ -1760,6 +1803,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
else if(G.qual==(LR_ALTKEY|LR_CTRLKEY))
add_constraint(0); /* editconstraint.c, generic for objects and posemode */
+ else if(G.qual==(LR_CTRLKEY|LR_SHIFTKEY)) {
+ BIF_manageTransformOrientation(0, 1);
+ allqueue(REDRAWVIEW3D, 0);
+ }
else if((G.qual==LR_SHIFTKEY)) {
view3d_home(1);
curs= give_cursor();
@@ -1848,7 +1895,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
fill_mesh();
else if(G.qual==LR_ALTKEY)
beauty_fill();
- else if(G.qual & (LR_CTRLKEY|LR_SHIFTKEY))
+ else if(G.qual==(LR_CTRLKEY|LR_SHIFTKEY))
edge_flip();
else if (G.qual==0)
addedgeface_mesh();
@@ -1858,7 +1905,12 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
- else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) addsegment_nurb();
+ else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
+ addsegment_nurb();
+ }
+ else if(G.obedit->type == OB_ARMATURE) {
+ fill_bones_armature();
+ }
}
else if(G.qual==LR_CTRLKEY)
sort_faces();
@@ -1867,6 +1919,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
pose_activate_flipped_bone();
else if(G.f & G_WEIGHTPAINT)
pose_activate_flipped_bone();
+ else if(G.f & G_PARTICLEEDIT)
+ PE_radialcontrol_start(RADIALCONTROL_STRENGTH);
else
fly();
}
@@ -1875,6 +1929,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
G.f ^= G_FACESELECT;
allqueue(REDRAWVIEW3D, 1);
}
+ else if(G.f & G_PARTICLEEDIT)
+ PE_radialcontrol_start(RADIALCONTROL_SIZE);
}
break;
@@ -1884,6 +1940,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(ELEM(G.obedit->type, OB_MESH, OB_LATTICE))
vgroup_assign_with_menu();
}
+ else if(ob && (ob->flag & OB_POSEMODE))
+ pgroup_operation_with_menu();
else
group_operation_with_menu();
}
@@ -1897,7 +1955,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(G.obedit) {
if(G.obedit->type==OB_MESH)
select_mesh_group_menu();
- } else
+ }
+ else if(ob && (ob->flag & OB_POSEMODE))
+ puts("Shift-G menu for PoseMode - Not Implemented!");
+ else
select_object_grouped_menu();
else if((G.obedit==0) && G.qual==LR_ALTKEY) {
if(okee("Clear location")) {
@@ -1981,6 +2042,14 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
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();
@@ -2083,7 +2152,16 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
selectconnected_nurb();
}
else if(ob && (ob->flag & OB_POSEMODE)) {
- selectconnected_posearmature();
+ if (G.qual == LR_CTRLKEY)
+ poselib_preview_poses(ob, 0);
+ else if (G.qual == LR_SHIFTKEY)
+ poselib_add_current_pose(ob, 0);
+ else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+ poselib_rename_pose(ob);
+ else if (G.qual == LR_ALTKEY)
+ poselib_remove_pose(ob, NULL);
+ else
+ selectconnected_posearmature();
}
else {
if(FACESEL_PAINT_TEST) {
@@ -2094,6 +2172,10 @@ 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) {
+ if(G.qual==0)
+ PE_select_linked();
+ }
else {
if((G.qual==0))
make_local_menu();
@@ -2110,10 +2192,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
pose_movetolayer();
}
else if (G.qual==LR_ALTKEY) {
- if(G.obedit->type==OB_MESH) {
+ if (G.obedit->type == OB_MESH) {
mergemenu();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
}
+ else if (G.obedit->type == OB_ARMATURE) {
+ merge_armature();
+ }
}
else if ((G.qual==0) || (G.qual==LR_CTRLKEY)) {
mirrormenu();
@@ -2169,7 +2254,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);
@@ -2323,7 +2408,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
ob= ob->parent;
if(ob && (ob->flag & OB_POSEMODE)) {
bArmature *arm= ob->data;
- if( ELEM(arm->drawtype, ARM_B_BONE, ARM_ENVELOPE)) {
+ if( arm->drawtype==ARM_ENVELOPE) {
initTransform(TFM_BONESIZE, CTX_NONE);
Transform();
break;
@@ -2374,6 +2459,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();
@@ -2398,10 +2487,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}*/
if(G.obedit) {
- if(G.qual==0) {
+ 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)
BIF_undo();
@@ -2580,6 +2672,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;
@@ -2596,6 +2691,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;
@@ -2702,7 +2800,7 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(sa->win==0) return;
if(val) {
- if( uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&sa->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
@@ -2993,7 +3091,6 @@ static void space_sound_button_function(int event)
}
#endif
-
static char *iconfile_menu(void)
{
static char string[512];
@@ -3031,10 +3128,66 @@ static void set_userdef_iconfile_cb(void *menuindex, void *unused2)
/* needed for event; choose new 'curmain' resets it... */
static short th_curcol= TH_BACK;
+static short th_curcolset = 1;
static char *th_curcol_ptr= NULL;
static char th_curcol_arr[4]={0, 0, 0, 255};
-static void info_user_themebuts(uiBlock *block, short y1, short y2, short y3)
+
+static void info_dump_customcolorset (void *arg1, void *arg2)
+{
+ bTheme *btheme= U.themes.first;
+ ThemeWireColor *tcs= &btheme->tarm[(th_curcolset - 1)];
+
+
+#if 0 // this version, if we keep the button
+ /* print (name, redval, greenval, blueval) */
+ printf("Theme '%s': Bone Color Set %d \n", btheme->name, th_curcolset);
+ printf("\t'Normal': 0x%02x, 0x%02x, 0x%02x \n", tcs->solid[0], tcs->solid[1], tcs->solid[2]);
+ printf("\t'Select': 0x%02x, 0x%02x, 0x%02x \n", tcs->select[0], tcs->select[1], tcs->select[2]);
+ printf("\t'Active': 0x%02x, 0x%02x, 0x%02x \n", tcs->active[0], tcs->active[1], tcs->active[2]);
+ printf("\n");
+#endif
+
+ // this version generates code that can be copy+paste-ed
+ printf("Theme '%s': Bone Color Set - Code for Copy+Paste \n", btheme->name);
+ printf("\t/* set %d */ \n", th_curcolset);
+ printf("\tSETCOL(btheme->tarm[%d].solid, 0x%02x, 0x%02x, 0x%02x, 255); \n", th_curcolset-1, tcs->solid[0], tcs->solid[1], tcs->solid[2]);
+ printf("\tSETCOL(btheme->tarm[%d].select, 0x%02x, 0x%02x, 0x%02x, 255); \n", th_curcolset-1, tcs->select[0], tcs->select[1], tcs->select[2]);
+ printf("\tSETCOL(btheme->tarm[%d].active, 0x%02x, 0x%02x, 0x%02x, 255); \n", th_curcolset-1, tcs->active[0], tcs->active[1], tcs->active[2]);
+}
+
+static void info_user_theme_colsets_buts(uiBlock *block, short y1, short y2, short y3, short y4)
+{
+ bTheme *btheme= U.themes.first;
+ ThemeWireColor *col_set= &btheme->tarm[(th_curcolset - 1)];
+ uiBut *but;
+ short y4label= y4-2; // sync this with info_user_themebuts
+
+ /* Selector for set (currently only 20 sets) */
+ uiDefButS(block, NUM, B_REDR, "Color Set: ", 255,y1,200,20, &th_curcolset, 1, 20, 0, 0, "Current color set");
+
+ /* "Solid" Color (unselected wire-color is derived from this) */
+ uiDefBut(block, LABEL,0,"Normal: ", 475,y4label,60,20,0, 0, 0, 0, 0, "");
+ uiDefButC(block, COL, B_UPDATE_THEME, "", 475,y1,50,y3-y1+20, col_set->solid, 0, 0, 0, 0, "Color to use for surface of bones");
+
+ /* Selected Color */
+ uiDefBut(block, LABEL,0,"Selected: ", 575,y4label,60,20,0, 0, 0, 0, 0, "");
+ uiDefButC(block, COL, B_UPDATE_THEME, "", 575,y1,50,y3-y1+20, col_set->select, 0, 0, 0, 0, "Color to use for 'selected' bones");
+
+ /* Active Color */
+ uiDefBut(block, LABEL,0,"Active: ", 675,y4label,60,20,0, 0, 0, 0, 0, "");
+ uiDefButC(block, COL, B_UPDATE_THEME, "", 675,y1,50,y3-y1+20, col_set->active, 0, 0, 0, 0, "Color to use for 'active' bones");
+
+ /* Extra 'Options' */
+ uiDefButBitS(block, TOG, TH_WIRECOLOR_CONSTCOLS, B_UPDATE_THEME, "Use 'Constraint' Colouring", 885,y2,200,20, &col_set->flag, 0, 0, 0, 0, "Allow the use of colors indicating constraints/keyed status");
+
+ /* 'Debug' Tools */
+ // these should be disabled for release... but are needed for development
+ but= uiDefBut(block, BUT, B_UPDATE_THEME, "Dump Colors Codes", 885,y3,200,20, NULL, 0, 0, 0, 0, "Prints this set's colors to the console");
+ uiButSetFunc(but, info_dump_customcolorset, NULL, NULL);
+}
+
+static void info_user_themebuts(uiBlock *block, short y1, short y2, short y3, short y4)
{
bTheme *btheme, *bt;
int spacetype= 0;
@@ -3089,7 +3242,7 @@ static void info_user_themebuts(uiBlock *block, short y1, short y2, short y3)
uiDefBut(block, TEX, B_NAME_THEME, "", 255,y3,200,20, btheme->name, 1.0, 30.0, 0, 0, "Rename theme");
/* main choices pup: note, it uses collums, and the seperators (%l) then have to fill both halves equally for the menu to work */
- uiDefButS(block, MENU, B_CHANGE_THEME, "UI and Buttons %x1|%l|3D View %x2|%l|Ipo Curve Editor %x3|Action Editor %x4|"
+ uiDefButS(block, MENU, B_CHANGE_THEME, "UI and Buttons %x1|%l|Bone Color Sets %x17|%l|3D View %x2|%l|Ipo Curve Editor %x3|Action Editor %x4|"
"NLA Editor %x5|%l|UV/Image Editor %x6|Video Sequence Editor %x7|Node Editor %x16|Timeline %x15|%l|Audio Window %x8|Text Editor %x9|%l|User Preferences %x10|"
"Outliner %x11|Buttons Window %x12|%l|File Browser %x13|Image Browser %x14",
255,y2,200,20, &curmain, 0, 0, 0, 0, "Specify theme for...");
@@ -3109,8 +3262,12 @@ static void info_user_themebuts(uiBlock *block, short y1, short y2, short y3)
else if(curmain==14) spacetype= SPACE_IMASEL;
else if(curmain==15) spacetype= SPACE_TIME;
else if(curmain==16) spacetype= SPACE_NODE;
+ else if(curmain==17) {
+ info_user_theme_colsets_buts(block, y1, y2, y3, y4);
+ return;
+ }
else return; /* only needed while coding... when adding themes for more windows */
-
+
/* color choices pup */
if(curmain==1) {
strp= BIF_ThemeColorsPup(0);
@@ -3282,7 +3439,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
/* line 2: left x co-ord, top y co-ord, width, height */
if(U.userpref == 6) {
- info_user_themebuts(block, y1, y2, y3);
+ info_user_themebuts(block, y1, y2, y3, y4);
}
else if (U.userpref == 0) { /* view & controls */
@@ -3455,6 +3612,11 @@ void drawinfospace(ScrArea *sa, void *spacedata)
0, 0, 0, 0, 0, "");
}
+ uiDefButBitI(block, TOG, USER_SHOW_FPS, B_DRAWINFO, "Display FPS in View",
+ (xpos+edgsp+(3*mpref)+(4*midsp)),y2,mpref,buth,
+ &(U.uiflag), 0, 0, 0, 0,
+ "Display the number of frames per secons being drawn");
+
/* illegal combo... */
if (U.flag & USER_LMOUSESELECT)
U.flag &= ~USER_TWOBUTTONMOUSE;
@@ -3545,16 +3707,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:",
@@ -3571,34 +3745,37 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiBlockEndAlign(block);
- uiDefBut(block, LABEL,0,"Auto keyframe",
- (xpos+(2*edgsp)+(2*mpref)+midsp),y5label,mpref,buth,
+ uiDefBut(block, LABEL,0,"Auto Keyframe",
+ (xpos+(2*edgsp)+(2*mpref)+midsp),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
-
- uiDefButBitI(block, TOG, G_RECORDKEYS, REDRAWTIME, "Action and Object",
- (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)),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)),y2,mpref, buth,
- &(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion only when keyframe needed");
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, AUTOKEY_ON, REDRAWTIME, "Auto-Keying Enabled",
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y5,mpref, buth,
+ &(U.autokey_mode), 0, 0, 0, 0, "Automatic keyframe insertion for Objects and Bones");
- 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");
+ if (IS_AUTOKEY_ON) {
+ uiDefButS(block, MENU, REDRAWTIME,
+ "Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5",
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y4,mpref, buth,
+ &(U.autokey_mode), 0, 1, 0, 0,
+ "Mode of automatic keyframe insertion for Objects and Bones");
+ }
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, AUTOKEY_FLAG_INSERTAVAIL, REDRAWTIME, "Available",
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y3,mpref, buth,
+ &(U.autokey_flag), 0, 0, 0, 0, "Automatic keyframe insertion in available curves");
+
+ uiDefButBitS(block, TOG, AUTOKEY_FLAG_INSERTNEEDED, REDRAWTIME, "Needed",
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y2,mpref, buth,
+ &(U.autokey_flag), 0, 0, 0, 0, "Automatic keyframe insertion only when keyframe needed");
+
+ uiDefButBitS(block, TOG, AUTOKEY_FLAG_AUTOMATKEY, REDRAWTIME, "Use Visual Keying",
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y1,mpref, buth,
+ &(U.autokey_flag), 0, 0, 0, 0, "Use Visual keying automatically for constrained objects");
uiBlockEndAlign(block);
-
-/* uiDefButBitS(block, TOG, USER_KEYINSERTACT, 0, "Action",
- (xpos+edgsp+(2*mpref)+(2*midsp)),y2,(spref+edgsp),buth,
- &(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion in Action Ipo curve");
- uiDefButBitS(block, TOG, USER_KEYINSERTOBJ, 0, "Object",
- (xpos+edgsp+(2*mpref)+(3*midsp)+spref-edgsp),y2,(spref+edgsp),buth,
- &(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion in Object Ipo curve"); */
uiDefBut(block, LABEL,0,"Duplicate with object:",
@@ -3741,7 +3918,10 @@ void drawinfospace(ScrArea *sa, void *spacedata)
"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, "");
@@ -3778,12 +3958,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
@@ -3842,11 +4026,12 @@ void drawinfospace(ScrArea *sa, void *spacedata)
(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,
@@ -3874,7 +4059,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
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)");
+ &(U.gameflags), 0, 0, 0, 0, "Scale textures for the 3d View (Looks nicer but uses more memory and slows image reloading)");
/* main choices pup: note, it uses collums, and the seperators (%l) then have to fill both halves equally for the menu to work */
uiDefButS(block, MENU, B_GLRESLIMITCHANGED, "GL Texture Clamp Off%x0|%l|GL Texture Clamp 8192%x8192|GL Texture Clamp 4096%x4096|GL Texture Clamp 2048%x2048|GL Texture Clamp 1024%x1024|GL Texture Clamp 512%x512|GL Texture Clamp 256%x256|GL Texture Clamp 128%x128",
@@ -3891,22 +4076,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);
@@ -3952,6 +4161,10 @@ void drawinfospace(ScrArea *sa, void *spacedata)
0, 0, 0, 0, 0, "Select the default texture plugin location");
uiBlockEndAlign(block);
+ uiDefButBitI(block, TOG, USER_RELPATHS, B_DRAWINFO, "Relative Paths Default",
+ (xpos+edgsp+(5*mpref)+(5*midsp)),y3,mpref,buth,
+ &(U.flag), 0, 0, 0, 0, "Default relative path option for the file selector");
+
uiBlockBeginAlign(block);
uiDefBut(block, TEX, 0, "Seq Plugins: ",
(xpos+edgsp+(3*lpref)+(3*midsp)),y2,(lpref-smfileselbut),buth,
@@ -4028,7 +4241,7 @@ static void winqreadinfospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
short val= evt->val;
if(val) {
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
switch(event) {
case UI_BUT_EVENT:
@@ -4101,6 +4314,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;
@@ -4140,7 +4360,7 @@ static void winqreadbutspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val) {
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
switch(event) {
case UI_BUT_EVENT:
@@ -4342,6 +4562,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;
@@ -4393,7 +4615,7 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(curarea->win==0) return;
if(val) {
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
@@ -4407,9 +4629,6 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
switch(event) {
- case UI_BUT_EVENT:
- do_seqbuttons(val);
- break;
case LEFTMOUSE:
if(sseq->mainb || view2dmove(event)==0) {
@@ -4468,16 +4687,6 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(sa, V2D_LOCK_COPY);
}
- else if((G.qual==LR_SHIFTKEY)) {
- insert_gap(25, CFRA);
- BIF_undo_push("Insert gaps Sequencer");
- allqueue(REDRAWSEQ, 0);
- }
- else if(G.qual==LR_ALTKEY) {
- insert_gap(250, CFRA);
- BIF_undo_push("Insert gaps Sequencer");
- allqueue(REDRAWSEQ, 0);
- }
}
doredraw= 1;
break;
@@ -4533,11 +4742,7 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case SPACEKEY:
if (G.qual==0) {
- if (sseq->mainb) {
- play_anim(1);
- } else {
- add_sequence(-1);
- }
+ add_sequence(-1);
}
break;
case BKEY:
@@ -4587,7 +4792,7 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case KKEY:
if((G.qual==0)) { /* Cut at current frame */
- if(okee("Cut strips")) seq_cut(CFRA);
+ seq_cut(CFRA);
}
break;
case LKEY:
@@ -4595,6 +4800,11 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
select_linked_seq( 0 );
} else if((G.qual==LR_CTRLKEY)) { /* Cut at current frame */
select_linked_seq( 2 );
+ } else if ((G.qual==LR_SHIFTKEY)) {
+ if (last_seq) {
+ last_seq->flag ^= SEQ_LOCK;
+ doredraw = 1;
+ }
}
break;
case YKEY:
@@ -4606,17 +4816,14 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
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))
- {
+ } else if(G.qual == 0){
+ make_meta();
+ break; /*dont redraw timeline etc */
+ } else if (G.qual==LR_SHIFTKEY) {
+ if (last_seq) {
last_seq->flag ^= SEQ_MUTE;
doredraw = 1;
- } 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)) {
@@ -4633,9 +4840,11 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case RKEY:
- if((G.qual==LR_SHIFTKEY))
+ if(G.qual==LR_SHIFTKEY)
seq_remap_paths();
- else
+ if(G.qual==LR_ALTKEY)
+ reload_sequence();
+ else if (G.qual==0)
reassign_inputs_seq_effect();
break;
case SKEY:
@@ -4654,6 +4863,13 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
doredraw= 1;
}
break;
+ case HKEY: /* hide==mute? - not that nice but MKey us used for meta :/ */
+ if((G.qual==0)) {
+ seq_mute_sel(1);
+ } else if((G.qual==LR_ALTKEY)) {
+ seq_mute_sel(0);
+ }
+ break;
case XKEY:
case DELKEY:
if(G.qual==0) {
@@ -4850,7 +5066,7 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val==0) return;
- if(uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if(uiDoBlocks(&sa->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
if (U.flag & USER_LMOUSESELECT) {
if (event == LEFTMOUSE) {
@@ -5235,7 +5451,7 @@ static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val==0) return;
- if( uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0;
+ if( uiDoBlocks(&sa->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
if (U.flag & USER_NONUMPAD) {
event= convert_for_nonumpad(event);
@@ -5274,6 +5490,15 @@ static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
outliner_find_panel(sa, again, search_flags);
}
break;
+ case RKEY:
+ outliner_toggle_renderability(sa);
+ break;
+ case SKEY:
+ outliner_toggle_selectability(sa);
+ break;
+ case VKEY:
+ outliner_toggle_visibility(sa);
+ break;
case XKEY:
case DELKEY:
outliner_del(sa);
@@ -6030,6 +6255,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;
@@ -6078,6 +6309,14 @@ void allqueue(unsigned short event, short val)
scrarea_queue_headredraw(sa);
}
break;
+ case REDRAWSEQ:
+ if(sa->spacetype==SPACE_SEQ) {
+ addqueue(sa->win, CHANGED, 1);
+ scrarea_queue_winredraw(sa);
+ scrarea_queue_headredraw(sa);
+ }
+ /* fall through, since N-keys moved to
+ Buttons */
case REDRAWBUTSSCENE:
if(sa->spacetype==SPACE_BUTS) {
buts= sa->spacedata.first;
@@ -6150,13 +6389,6 @@ void allqueue(unsigned short event, short val)
scrarea_queue_winredraw(sa);
}
break;
- case REDRAWSEQ:
- if(sa->spacetype==SPACE_SEQ) {
- addqueue(sa->win, CHANGED, 1);
- scrarea_queue_winredraw(sa);
- scrarea_queue_headredraw(sa);
- }
- break;
case REDRAWOOPS:
if(sa->spacetype==SPACE_OOPS) {
scrarea_queue_winredraw(sa);
diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c
index 6464f699d1a..088d91f7418 100644
--- a/source/blender/src/toets.c
+++ b/source/blender/src/toets.c
@@ -74,6 +74,7 @@
#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"
@@ -383,7 +384,6 @@ void persptoetsen(unsigned short event)
if(G.vd->depths) G.vd->depths->damaged= 1;
retopo_queue_updates(G.vd);
- retopo_force_update();
if(preview3d_event)
BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT);
@@ -734,27 +734,40 @@ int blenderqread(unsigned short event, short val)
}
else if(ob->type==OB_MESH) {
if(ob==G.obedit) EM_selectmode_menu();
+ else if(G.f & G_PARTICLEEDIT)
+ PE_selectbrush_menu();
else if(G.f & G_SCULPTMODE)
sculptmode_selectbrush_menu();
else set_wpaint();
}
}
}
+ else if(G.qual&LR_CTRLKEY && G.qual&LR_SHIFTKEY){
+ PE_set_particle_edit();
+ }
break;
case BACKSPACEKEY:
break;
-
- case AKEY:
- if(textediting==0 && textspace==0) {
- if(G.qual==(LR_SHIFTKEY|LR_ALTKEY)){
+ case SPACEKEY:
+ if (curarea && curarea->spacetype==SPACE_SEQ) {
+ SpaceSeq *sseq= curarea->spacedata.first;
+ if (G.qual==0 && sseq->mainb) {
play_anim(1);
return 0;
}
- else if(G.qual==LR_ALTKEY) {
+ }
+ break;
+ case AKEY:
+ if(textediting==0 && textspace==0) {
+ if ((G.qual==LR_ALTKEY) && (curarea && curarea->spacetype==SPACE_VIEW3D)) {
play_anim(0);
return 0;
}
+ else if ((G.qual==LR_ALTKEY) || (G.qual==(LR_ALTKEY|LR_SHIFTKEY))){
+ play_anim(1);
+ return 0;
+ }
}
break;
case EKEY:
@@ -943,6 +956,11 @@ int blenderqread(unsigned short event, short val)
if(G.qual==LR_CTRLKEY) {
if(okee("Erase all")) {
if( BIF_read_homefile(0)==0) error("No file ~/.B.blend");
+
+ /* Reset lights
+ * This isn't done when reading userdef, do it now
+ * */
+ default_gl_light();
}
return 0;
}
diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c
index f517eec055c..671628bf5c7 100644
--- a/source/blender/src/toolbox.c
+++ b/source/blender/src/toolbox.c
@@ -288,7 +288,7 @@ short button(short *var, short min, short max, char *str)
uiBoundsBlock(block, 5);
- ret= uiDoBlocks(&listb, 0);
+ ret= uiDoBlocks(&listb, 0, 0);
if(ret==UI_RETURN_OK) return 1;
return 0;
@@ -322,7 +322,7 @@ short sbutton(char *var, float min, float max, char *str)
uiBoundsBlock(block, 5);
mainqenter_ext(BUT_ACTIVATE, 32766, 0); /* note, button id '32766' is asking for errors some day! */
- ret= uiDoBlocks(&listb, 0);
+ ret= uiDoBlocks(&listb, 0, 0);
if(ret==UI_RETURN_OK) return 1;
return 0;
@@ -356,7 +356,7 @@ short fbutton(float *var, float min, float max, float a1, float a2, char *str)
uiBoundsBlock(block, 2);
- ret= uiDoBlocks(&listb, 0);
+ ret= uiDoBlocks(&listb, 0, 0);
if(ret==UI_RETURN_OK) return 1;
return 0;
@@ -416,7 +416,7 @@ int movetolayer_buts(unsigned int *lay, char *title)
uiBoundsBlock(block, 2);
- ret= uiDoBlocks(&listb, 0);
+ ret= uiDoBlocks(&listb, 0, 0);
if(ret==UI_RETURN_OK) return 1;
return 0;
@@ -466,7 +466,7 @@ int movetolayer_short_buts(short *lay, char *title)
uiBoundsBlock(block, 2);
- ret= uiDoBlocks(&listb, 0);
+ ret= uiDoBlocks(&listb, 0, 0);
if(ret==UI_RETURN_OK) return 1;
return 0;
@@ -603,7 +603,7 @@ int do_clever_numbuts(char *name, int tot, int winevent)
uiBoundsBlock(block, 5);
- event= uiDoBlocks(&listb, 0);
+ event= uiDoBlocks(&listb, 0, 0);
areawinset(curarea->win);
@@ -901,6 +901,7 @@ static TBitem tb_object_select[]= {
{ 0, "SEPR", 0, NULL},
{ 0, "Select/Deselect All|A", 1, NULL},
{ 0, "Inverse", 2, NULL},
+{ 0, "Random", 3, NULL},
{ 0, "Select All by Layer", 0, tb_object_select_layer},
{ 0, "Select All by Type", 0, tb_object_select_type},
{ 0, "SEPR", 0, NULL},
@@ -1272,12 +1273,15 @@ static void tb_do_transform_clearapply(void *arg, int event)
clear_object('s');
break;
case 3: /* apply scale/rotation */
- apply_object();
+ apply_objects_locrot();
break;
- case 4: /* apply deformation */
+ case 4: /* apply scale/rotation */
+ apply_objects_visual_tx();
+ break;
+ case 5: /* apply deformation */
object_apply_deform(ob);
break;
- case 5: /* make duplicates real */
+ case 6: /* make duplicates real */
if (ob->transflag & OB_DUPLI) make_duplilist_real();
else error("The active object does not have dupliverts");
break;
@@ -1289,9 +1293,10 @@ static TBitem tb_transform_clearapply[]= {
{ 0, "Clear Rotation|Alt R", 1, NULL},
{ 0, "Clear Scale|Alt S", 2, NULL},
{ 0, "SEPR", 0, NULL},
-{ 0, "Apply Scale/Rotation|Ctrl A", 3, NULL},
-{ 0, "Apply Deformation|Shift Ctrl A", 4, NULL},
-{ 0, "Make Duplicates Real|Shift Ctrl A", 5, NULL},
+{ 0, "Apply Scale/Rotation to ObData|Ctrl A, 1", 3, NULL},
+{ 0, "Apply Visual Transform|Ctrl A, 2", 4, NULL},
+{ 0, "Apply Deformation|Shift Ctrl A", 5, NULL},
+{ 0, "Make Duplicates Real|Shift Ctrl A", 6, NULL},
{ -1, "", 0, tb_do_transform_clearapply}};
static TBitem tb_transform_snap[]= {
@@ -1648,11 +1653,14 @@ static TBitem tb_node_node[]= {
{ 0, "Duplicate|Shift D", TB_SHIFT|'d', NULL},
{ 0, "Delete|X", 'x', NULL},
{ 0, "SEPR", 0, NULL},
+ { 0, "Make Link|F", 'f', NULL},
+ { 0, "SEPR", 0, NULL},
{ 0, "Make Group|Ctrl G", TB_CTRL|'g', NULL},
{ 0, "Ungroup|Alt G", TB_ALT|'g', NULL},
{ 0, "Edit Group|Tab", TB_TAB, NULL},
{ 0, "SEPR", 0, NULL},
{ 0, "Hide/Unhide|H", 'h', NULL},
+ { 0, "Rename|Ctrl R", TB_CTRL|'r', NULL},
{ 0, "SEPR", 0, NULL},
{ 0, "Read Saved Render Results|R", 'r', NULL},
{ 0, "Show Cyclic Dependencies|C", 'c', NULL},
@@ -1748,6 +1756,8 @@ static void do_group_addmenu(void *arg, int event)
ob->dup_group= BLI_findlink(&G.main->group, event);
if(ob->dup_group) {
+ rename_id(&ob->id, ob->dup_group->id.name+2);
+
id_us_plus((ID *)ob->dup_group);
ob->transflag |= OB_DUPLIGROUP;
DAG_scene_sort(G.scene);
@@ -2219,7 +2229,7 @@ void toolbox_n(void)
}
uiBoundsBlock(block, 2);
- event= uiDoBlocks(&tb_listb, 0);
+ event= uiDoBlocks(&tb_listb, 0, 1);
/* free all dynamic entries... */
BLI_freelistN(&storage);
diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c
index ec2e6b5275f..c3d51e192cb 100644
--- a/source/blender/src/transform.c
+++ b/source/blender/src/transform.c
@@ -49,6 +49,7 @@
#include "DNA_armature_types.h"
#include "DNA_action_types.h" /* for some special action-editor settings */
+#include "DNA_constraint_types.h"
#include "DNA_ipo_types.h" /* some silly ipo flag */
#include "DNA_listBase.h"
#include "DNA_meshdata_types.h"
@@ -75,17 +76,21 @@
#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_constraint.h"
#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"
@@ -152,6 +157,586 @@ static void helpline(TransInfo *t, float *vec)
glDrawBuffer(GL_BACK);
}
}
+
+/* *********************** TransSpace ************************** */
+
+void BIF_clearTransformOrientation(void)
+{
+ ListBase *transform_spaces = &G.scene->transform_spaces;
+ BLI_freelistN(transform_spaces);
+
+ if (G.vd->twmode >= V3D_MANIP_CUSTOM)
+ G.vd->twmode = V3D_MANIP_GLOBAL; /* fallback to global */
+}
+
+void BIF_manageTransformOrientation(int confirm, int set) {
+ int index = -1;
+
+ if (G.obedit) {
+ if (G.obedit->type == OB_MESH)
+ index = manageMeshSpace(confirm, set);
+ }
+ else {
+ index = manageObjectSpace(confirm, set);
+ }
+
+ if (set && index != -1)
+ {
+ BIF_selectTransformOrientationFromIndex(index);
+ }
+}
+
+int manageObjectSpace(int confirm, int set) {
+ Base *base = BASACT;
+
+ if (base == NULL)
+ return -1;
+
+ if (confirm == 0) {
+ if (set && pupmenu("Custom Orientation %t|Add and Use Active Object%x1") != 1) {
+ return -1;
+ }
+ else if (set == 0 && pupmenu("Custom Orientation %t|Add Active Object%x1") != 1) {
+ return -1;
+ }
+ }
+
+ return addObjectSpace(base->object);
+}
+
+/* return 1 on confirm */
+int confirmSpace(int set, char text[])
+{
+ char menu[64];
+
+ if (set) {
+ sprintf(menu, "Custom Orientation %%t|Add and Use %s%%x1", text);
+ }
+ else {
+ sprintf(menu, "Custom Orientation %%t|Add %s%%x1", text);
+ }
+
+ if (pupmenu(menu) == 1) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+
+int manageMeshSpace(int confirm, int set) {
+ EditMesh *em = G.editMesh;
+ float mat[3][3];
+ char name[36] = "";
+ int index;
+
+ /* Vertice Selected */
+ if (G.scene->selectmode & SCE_SELECT_VERTEX && (G.totvertsel == 1 || G.totvertsel == 2 || G.totvertsel == 3)) {
+ if (G.totvertsel == 1) {
+ /* EditSelection *ese; */
+ EditVert *eve = NULL;
+ float normal[3];
+
+ /*
+ for (ese = em->selected.first; ese; ese = ese->next)
+ {
+ if ( ese->type == EDITVERT ) {
+ eve = (EditVert *)ese->data;
+ break;
+ }
+ }
+ */
+
+ for (eve = em->verts.first; eve; eve = eve->next)
+ {
+ if (eve->f & SELECT)
+ {
+ break;
+ }
+ }
+
+ if (eve == NULL)
+ return -1;
+
+ if (confirm == 0 && confirmSpace(set, "vertex") == 0) {
+ return -1;
+ }
+
+ VECCOPY(normal, eve->no);
+ Mat4Mul3Vecfl(G.obedit->obmat, normal);
+
+ if (createSpaceNormal(mat, normal) == 0) {
+ error("Cannot use vertex with zero-length normal");
+ return -1;
+ }
+
+ strcpy(name, "Vertex");
+ }
+ else if (G.totvertsel == 2) {
+ /* EditSelection *ese; */
+ EditVert *eve;
+ EditVert *v1 = NULL, *v2 = NULL;
+ float normal[3];
+
+ /*
+ for (ese = em->selected.first; ese; ese = ese->next)
+ {
+ if ( ese->type == EDITVERT ) {
+ if (v1 == NULL) {
+ v1 = (EditVert *)ese->data;
+ }
+ else {
+ v2 = (EditVert *)ese->data;
+ break;
+ }
+ }
+ }
+ */
+
+ for (eve = em->verts.first; eve; eve = eve->next)
+ {
+ if ( eve->f & SELECT ) {
+ if (v1 == NULL) {
+ v1 = eve;
+ }
+ else {
+ v2 = eve;
+ break;
+ }
+ }
+ }
+
+ if (v2 == NULL)
+ return -1;
+
+ if (confirm == 0 && confirmSpace(set, "Edge") == 0) {
+ return -1;
+ }
+
+ VecSubf(normal, v2->co, v1->co);
+ Mat4Mul3Vecfl(G.obedit->obmat, normal);
+
+ if (createSpaceNormal(mat, normal) == 0) {
+ error("Cannot use zero-length edge");
+ return -1;
+ }
+
+ strcpy(name, "Edge");
+ }
+ else if (G.totvertsel == 3) {
+ /* EditSelection *ese; */
+ EditVert *eve;
+ EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL;
+ float normal[3], tangent[3], cotangent[3];
+
+ /*
+ for (ese = em->selected.first; ese; ese = ese->next)
+ {
+ if ( ese->type == EDITVERT ) {
+ if (v1 == NULL) {
+ v1 = (EditVert *)ese->data;
+ }
+ else if (v2 == NULL) {
+ v2 = (EditVert *)ese->data;
+ }
+ else {
+ v3 = (EditVert *)ese->data;
+ break;
+ }
+ }
+ }
+ */
+
+ for (eve = em->verts.first; eve; eve = eve->next)
+ {
+ if ( eve->f & SELECT ) {
+ if (v1 == NULL) {
+ v1 = eve;
+ }
+ else if (v2 == NULL) {
+ v2 = eve;
+ }
+ else {
+ v3 = eve;
+ break;
+ }
+ }
+ }
+
+ if (v3 == NULL)
+ return -1;
+
+ if (confirm == 0 && confirmSpace(set, "Face") == 0) {
+ return -1;
+ }
+
+ VecSubf(tangent, v2->co, v1->co);
+ VecSubf(cotangent, v3->co, v2->co);
+ Crossf(normal, cotangent, tangent);
+
+ Mat4Mul3Vecfl(G.obedit->obmat, normal);
+ Mat4Mul3Vecfl(G.obedit->obmat, tangent);
+
+ if (createSpaceNormal(mat, normal) == 0) {
+ error("Cannot use zero-area face");
+ return -1;
+ }
+
+ strcpy(name, "Face");
+ }
+
+ }
+ /* Edge Selected */
+ else if(G.scene->selectmode & SCE_SELECT_EDGE && (G.totedgesel == 1 || G.totedgesel == 2)) {
+ if (G.totedgesel == 1) {
+ /* EditSelection *ese; */
+ EditEdge *eed = NULL;
+ float normal[3];
+
+ /*
+ for (ese = em->selected.first; ese; ese = ese->next)
+ {
+ if ( ese->type == EDITEDGE ) {
+ eed = (EditEdge *)ese->data;
+ break;
+ }
+ }
+ */
+
+ for (eed = em->edges.first; eed; eed = eed->next)
+ {
+ if ( eed->f & SELECT ) {
+ break;
+ }
+ }
+
+ if (eed == NULL)
+ return -1;
+
+ if (confirm == 0 && confirmSpace(set, "Edge") == 0) {
+ return -1;
+ }
+
+ VecSubf(normal, eed->v2->co, eed->v1->co);
+ Mat4Mul3Vecfl(G.obedit->obmat, normal);
+
+ if (createSpaceNormal(mat, normal) == 0) {
+ error("Cannot use zero-length edge");
+ return -1;
+ }
+
+ strcpy(name, "Edge");
+ }
+ /* If selected edges form a triangle */
+ else if (G.totedgesel == 2 && G.totvertsel == 3) {
+ /* EditSelection *ese; */
+ EditEdge *eed;
+ EditEdge *e1 = NULL, *e2 = NULL;
+ EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL;
+ float normal[3], tangent[3], cotangent[3];
+
+ /*
+ for (ese = em->selected.first; ese; ese = ese->next)
+ {
+ if ( ese->type == EDITEDGE ) {
+ if (e1 == NULL) {
+ e1 = (EditEdge *)ese->data;
+ }
+ else {
+ e2 = (EditEdge *)ese->data;
+ break;
+ }
+ }
+ }
+ */
+
+ for (eed = em->edges.first; eed; eed = eed->next)
+ {
+ if ( eed->f & SELECT ) {
+ if (e1 == NULL) {
+ e1 = eed;
+ }
+ else {
+ e2 = eed;
+ break;
+ }
+ }
+ }
+
+ if (e1->v1 == e2->v1) {
+ v1 = e1->v2;
+ v2 = e1->v1;
+ v3 = e2->v2;
+ }
+ else if (e1->v1 == e2->v2) {
+ v1 = e1->v2;
+ v2 = e1->v1;
+ v3 = e2->v1;
+ }
+ else if (e1->v2 == e2->v1) {
+ v1 = e1->v1;
+ v2 = e1->v2;
+ v3 = e2->v2;
+ }
+ else if (e1->v2 == e2->v2) {
+ v1 = e1->v1;
+ v2 = e1->v2;
+ v3 = e2->v1;
+ }
+
+ if (v1 == NULL)
+ return -1;
+
+ if (confirm == 0 && confirmSpace(set, "Face") == 0) {
+ return -1;
+ }
+
+ VecSubf(tangent, v2->co, v1->co);
+ VecSubf(cotangent, v3->co, v2->co);
+ Crossf(normal, cotangent, tangent);
+
+ Mat4Mul3Vecfl(G.obedit->obmat, normal);
+ Mat4Mul3Vecfl(G.obedit->obmat, tangent);
+
+ if (createSpaceNormal(mat, normal) == 0) {
+ error("Cannot use zero-area face");
+ return -1;
+ }
+
+ strcpy(name, "Face");
+ }
+
+ }
+ /* Face Selected */
+ else if(G.scene->selectmode & SCE_SELECT_FACE && G.totfacesel == 1) {
+ /* EditSelection *ese; */
+ EditFace *efa = NULL;
+ float normal[3], tangent[3];
+
+ /*
+ for (ese = em->selected.first; ese; ese = ese->next)
+ {
+ if ( ese->type == EDITFACE ) {
+ efa = (EditFace *)ese->data;
+ break;
+ }
+ }
+ */
+
+ for (efa = em->faces.first; efa; efa = efa->next)
+ {
+ if (efa->f & SELECT)
+ {
+ break;
+ }
+ }
+
+ if (efa == NULL)
+ return -1;
+
+ if (confirm == 0 && confirmSpace(set, "Face") == 0) {
+ return -1;
+ }
+
+ VECCOPY(normal, efa->n);
+ VecSubf(tangent, efa->v2->co, efa->v1->co);
+
+ Mat4Mul3Vecfl(G.obedit->obmat, normal);
+ Mat4Mul3Vecfl(G.obedit->obmat, tangent);
+
+ if (createSpaceNormalTangent(mat, normal, tangent) == 0) {
+ error("Cannot use zero-area face");
+ return -1;
+ }
+
+ strcpy(name, "Face");
+ }
+ else {
+ return -1;
+ }
+
+ /* Input name */
+ sbutton(name, 1, 35, "name: ");
+
+ index = addMatrixSpace(mat, name);
+ return index;
+}
+
+int createSpaceNormal(float mat[3][3], float normal[3])
+{
+ float tangent[3] = {0.0f, 0.0f, 1.0f};
+
+ VECCOPY(mat[2], normal);
+ if (Normalize(mat[2]) == 0.0f) {
+ return 0; /* error return */
+ }
+
+ Crossf(mat[0], mat[2], tangent);
+ if (Inpf(mat[0], mat[0]) == 0.0f) {
+ tangent[0] = 1.0f;
+ tangent[1] = tangent[2] = 0.0f;
+ Crossf(mat[0], tangent, mat[2]);
+ }
+
+ Crossf(mat[1], mat[2], mat[0]);
+
+ Mat3Ortho(mat);
+
+ return 1;
+}
+
+int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3])
+{
+ VECCOPY(mat[2], normal);
+ if (Normalize(mat[2]) == 0.0f) {
+ return 0; /* error return */
+ }
+
+ Crossf(mat[0], mat[2], tangent);
+ if (Normalize(mat[0]) == 0.0f) {
+ return 0; /* error return */
+ }
+
+ Crossf(mat[1], mat[2], mat[0]);
+
+ Mat3Ortho(mat);
+
+ return 1;
+}
+
+
+int addObjectSpace(Object *ob) {
+ float mat[3][3];
+ char name[36] = "";
+
+ Mat3CpyMat4(mat, ob->obmat);
+ Mat3Ortho(mat);
+
+ strncpy(name, ob->id.name+2, 35);
+
+ /* Input name */
+ sbutton(name, 1, 35, "name: ");
+
+ return addMatrixSpace(mat, name);
+}
+
+int addMatrixSpace(float mat[3][3], char name[]) {
+ ListBase *transform_spaces = &G.scene->transform_spaces;
+ TransformOrientation *ts;
+ int index = 0;
+
+ /* if name is found in list, reuse that transform space */
+ for (index = 0, ts = transform_spaces->first; ts; ts = ts->next, index++) {
+ if (strncmp(ts->name, name, 35) == 0) {
+ break;
+ }
+ }
+
+ /* if not, create a new one */
+ if (ts == NULL)
+ {
+ ts = MEM_callocN(sizeof(TransformOrientation), "UserTransSpace from matrix");
+ BLI_addtail(transform_spaces, ts);
+ strncpy(ts->name, name, 35);
+ }
+
+ /* copy matrix into transform space */
+ Mat3CpyMat3(ts->mat, mat);
+
+ BIF_undo_push("Add/Update Transform Orientation");
+
+ return index;
+}
+
+void BIF_removeTransformOrientation(TransformOrientation *target) {
+ ListBase *transform_spaces = &G.scene->transform_spaces;
+ TransformOrientation *ts = transform_spaces->first;
+ int selected_index = (G.vd->twmode - V3D_MANIP_CUSTOM);
+ int i;
+
+ for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
+ if (ts == target) {
+ if (selected_index == i) {
+ G.vd->twmode = V3D_MANIP_GLOBAL; /* fallback to global */
+ }
+ else if (selected_index > i)
+ G.vd->twmode--;
+
+ BLI_freelinkN(transform_spaces, ts);
+ break;
+ }
+ }
+ BIF_undo_push("Remove Transform Orientation");
+}
+
+void BIF_selectTransformOrientation(TransformOrientation *target) {
+ ListBase *transform_spaces = &G.scene->transform_spaces;
+ TransformOrientation *ts = transform_spaces->first;
+ int i;
+
+ for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
+ if (ts == target) {
+ G.vd->twmode = V3D_MANIP_CUSTOM + i;
+ break;
+ }
+ }
+}
+
+void BIF_selectTransformOrientationFromIndex(int index) {
+ G.vd->twmode = V3D_MANIP_CUSTOM + index;
+}
+
+char * BIF_menustringTransformOrientation() {
+ char menu[] = "Orientation%t|Global%x0|Local%x1|Normal%x2|View%x3";
+ ListBase *transform_spaces = &G.scene->transform_spaces;
+ TransformOrientation *ts;
+ int i = V3D_MANIP_CUSTOM;
+ char *str_menu, *p;
+
+
+ str_menu = MEM_callocN(strlen(menu) + 40 * BIF_countTransformOrientation(), "UserTransSpace from matrix");
+ p = str_menu;
+
+ p += sprintf(str_menu, "%s", menu);
+
+ for (ts = transform_spaces->first; ts; ts = ts->next) {
+ p += sprintf(p, "|%s%%x%d", ts->name, i++);
+ }
+
+ return str_menu;
+}
+
+int BIF_countTransformOrientation() {
+ ListBase *transform_spaces = &G.scene->transform_spaces;
+ TransformOrientation *ts;
+ int count = 0;
+
+ for (ts = transform_spaces->first; ts; ts = ts->next) {
+ count++;
+ }
+
+ return count;
+}
+
+void applyTransformOrientation() {
+ TransInfo *t = BIF_GetTransInfo();
+ TransformOrientation *ts;
+ int selected_index = (G.vd->twmode - V3D_MANIP_CUSTOM);
+ int i;
+
+ if (selected_index >= 0) {
+ for (i = 0, ts = G.scene->transform_spaces.first; ts; ts = ts->next, i++) {
+ if (selected_index == i) {
+ strcpy(t->spacename, ts->name);
+ Mat3CpyMat3(t->spacemtx, ts->mat);
+ Mat4CpyMat3(G.vd->twmat, ts->mat);
+ break;
+ }
+ }
+ }
+}
+
/* ************************** INPUT FROM MOUSE *************************** */
float InputScaleRatio(TransInfo *t, short mval[2]) {
@@ -460,12 +1045,12 @@ static void viewRedrawPost(TransInfo *t)
void BIF_selectOrientation() {
short val;
- val= pupmenu("Orientation%t|Global|Local|Normal|View");
- if(val>0) {
- if(val==1) G.vd->twmode= V3D_MANIP_GLOBAL;
- else if(val==2) G.vd->twmode= V3D_MANIP_LOCAL;
- else if(val==3) G.vd->twmode= V3D_MANIP_NORMAL;
- else if(val==4) G.vd->twmode= V3D_MANIP_VIEW;
+ char *str_menu = BIF_menustringTransformOrientation();
+ val= pupmenu(str_menu);
+ MEM_freeN(str_menu);
+
+ if(val >= 0) {
+ G.vd->twmode = val;
}
}
@@ -582,6 +1167,10 @@ static char *transform_to_undostr(TransInfo *t)
return "Scale Anim. Data";
case TFM_TIME_SLIDE:
return "Time Slide";
+ case TFM_BAKE_TIME:
+ return "Key Time";
+ case TFM_MIRROR:
+ return "Mirror";
}
return "Transform";
}
@@ -808,7 +1397,10 @@ static void transformEvent(unsigned short event, short val) {
break;
case PAGEUPKEY:
case WHEELDOWNMOUSE:
- if(Trans.flag & T_PROP_EDIT) {
+ if (Trans.flag & T_AUTOIK) {
+ transform_autoik_update(&Trans, 1);
+ }
+ else if(Trans.flag & T_PROP_EDIT) {
Trans.propsize*= 1.1f;
calculatePropRatio(&Trans);
}
@@ -824,7 +1416,10 @@ static void transformEvent(unsigned short event, short val) {
break;
case PAGEDOWNKEY:
case WHEELUPMOUSE:
- if(Trans.flag & T_PROP_EDIT) {
+ if (Trans.flag & T_AUTOIK) {
+ transform_autoik_update(&Trans, -1);
+ }
+ else if (Trans.flag & T_PROP_EDIT) {
Trans.propsize*= 0.90909090f;
calculatePropRatio(&Trans);
}
@@ -937,6 +1532,7 @@ 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 */
+ /* EVIL3: extend mode for animation editors also switches modes... but is best way to avoid duplicate code */
mode = Trans.mode;
calculatePropRatio(&Trans);
@@ -1003,6 +1599,16 @@ void initTransform(int mode, int context) {
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;
+ case TFM_MIRROR:
+ initMirror(&Trans);
+ break;
}
}
@@ -1039,6 +1645,13 @@ void Transform()
}
Trans.redraw = 0;
}
+
+ /* If auto confirm is on, break after one pass */
+ if (Trans.context & CTX_AUTOCONFIRM)
+ {
+ Trans.state = TRANS_CONFIRM;
+ break;
+ }
/* essential for idling subloop */
if( qtest()==0) PIL_sleep_ms(2);
@@ -1238,7 +1851,7 @@ void ManipulatorTransform()
}
-/* ************************** TRANSFORMATIONS **************************** */
+/* ************************** TRANSFORM LOCKS **************************** */
static void protectedTransBits(short protectflag, float *vec)
{
@@ -1297,6 +1910,278 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
}
}
+/* ******************* TRANSFORM LIMITS ********************** */
+
+static void constraintTransLim(TransInfo *t, TransData *td)
+{
+ if (td->con) {
+ bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_LOCLIMIT);
+ bConstraintOb cob;
+ bConstraint *con;
+
+ /* Make a temporary bConstraintOb for using these limit constraints
+ * - they only care that cob->matrix is correctly set ;-)
+ * - current space should be local
+ */
+ memset(&cob, 0, sizeof(bConstraintOb));
+ Mat4One(cob.matrix);
+ if (td->tdi) {
+ TransDataIpokey *tdi= td->tdi;
+ cob.matrix[3][0]= tdi->locx[0];
+ cob.matrix[3][1]= tdi->locy[0];
+ cob.matrix[3][2]= tdi->locz[0];
+ }
+ else {
+ VECCOPY(cob.matrix[3], td->loc);
+ }
+
+ /* Evaluate valid constraints */
+ for (con= td->con; con; con= con->next) {
+ float tmat[4][4];
+
+ /* only use it if it's tagged for this purpose (and the right type) */
+ if (con->type == CONSTRAINT_TYPE_LOCLIMIT) {
+ bLocLimitConstraint *data= con->data;
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
+ continue;
+ }
+ else if (con->type == CONSTRAINT_TYPE_ROTLIMIT) {
+ bRotLimitConstraint *data= con->data;
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
+ continue;
+ }
+ else if (con->type == CONSTRAINT_TYPE_SIZELIMIT) {
+ bSizeLimitConstraint *data= con->data;
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
+ continue;
+ }
+ else {
+ /* not supported */
+ continue;
+ }
+
+ /* do space conversions */
+ if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
+ /* just multiply by td->mtx (this should be ok) */
+ Mat4CpyMat4(tmat, cob.matrix);
+ Mat4MulMat34(cob.matrix, td->mtx, tmat);
+ }
+ else if (con->ownspace != CONSTRAINT_SPACE_LOCAL) {
+ /* skip... incompatable spacetype */
+ continue;
+ }
+
+ /* do constraint */
+ cti->evaluate_constraint(con, &cob, NULL);
+
+ /* convert spaces again */
+ if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
+ /* just multiply by td->mtx (this should be ok) */
+ Mat4CpyMat4(tmat, cob.matrix);
+ Mat4MulMat34(cob.matrix, td->smtx, tmat);
+ }
+ }
+
+ /* copy results from cob->matrix */
+ if (td->tdi) {
+ TransDataIpokey *tdi= td->tdi;
+ tdi->locx[0]= cob.matrix[3][0];
+ tdi->locy[0]= cob.matrix[3][1];
+ tdi->locz[0]= cob.matrix[3][2];
+ }
+ else {
+ VECCOPY(td->loc, cob.matrix[3]);
+ }
+ }
+}
+
+static void constraintRotLim(TransInfo *t, TransData *td)
+{
+ if (td->con) {
+ bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_ROTLIMIT);
+ bConstraintOb cob;
+ bConstraint *con;
+
+ /* Make a temporary bConstraintOb for using these limit constraints
+ * - they only care that cob->matrix is correctly set ;-)
+ * - current space should be local
+ */
+ memset(&cob, 0, sizeof(bConstraintOb));
+ if (td->flag & TD_USEQUAT) {
+ /* quats */
+ if (td->ext)
+ QuatToMat4(td->ext->quat, cob.matrix);
+ else
+ return;
+ }
+ else if (td->tdi) {
+ /* ipo-keys eulers */
+ TransDataIpokey *tdi= td->tdi;
+ float eul[3];
+
+ eul[0]= tdi->rotx[0];
+ eul[1]= tdi->roty[0];
+ eul[2]= tdi->rotz[0];
+
+ EulToMat4(eul, cob.matrix);
+ }
+ else {
+ /* eulers */
+ if (td->ext)
+ EulToMat4(td->ext->rot, cob.matrix);
+ else
+ return;
+ }
+
+ /* Evaluate valid constraints */
+ for (con= td->con; con; con= con->next) {
+ /* we're only interested in Limit-Scale constraints */
+ if (con->type == CONSTRAINT_TYPE_ROTLIMIT) {
+ bRotLimitConstraint *data= con->data;
+ float tmat[4][4];
+
+ /* only use it if it's tagged for this purpose */
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
+ continue;
+
+ /* do space conversions */
+ if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
+ /* just multiply by td->mtx (this should be ok) */
+ Mat4CpyMat4(tmat, cob.matrix);
+ Mat4MulMat34(cob.matrix, td->mtx, tmat);
+ }
+ else if (con->ownspace != CONSTRAINT_SPACE_LOCAL) {
+ /* skip... incompatable spacetype */
+ continue;
+ }
+
+ /* do constraint */
+ cti->evaluate_constraint(con, &cob, NULL);
+
+ /* convert spaces again */
+ if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
+ /* just multiply by td->mtx (this should be ok) */
+ Mat4CpyMat4(tmat, cob.matrix);
+ Mat4MulMat34(cob.matrix, td->smtx, tmat);
+ }
+ }
+ }
+
+ /* copy results from cob->matrix */
+ if (td->flag & TD_USEQUAT) {
+ /* quats */
+ Mat4ToQuat(cob.matrix, td->ext->quat);
+ }
+ else if (td->tdi) {
+ /* ipo-keys eulers */
+ TransDataIpokey *tdi= td->tdi;
+ float eul[3];
+
+ Mat4ToEul(cob.matrix, eul);
+
+ tdi->rotx[0]= eul[0];
+ tdi->roty[0]= eul[1];
+ tdi->rotz[0]= eul[2];
+ }
+ else {
+ /* eulers */
+ Mat4ToEul(cob.matrix, td->ext->rot);
+ }
+ }
+}
+
+static void constraintSizeLim(TransInfo *t, TransData *td)
+{
+ if (td->con && td->ext) {
+ bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_SIZELIMIT);
+ bConstraintOb cob;
+ bConstraint *con;
+
+ /* Make a temporary bConstraintOb for using these limit constraints
+ * - they only care that cob->matrix is correctly set ;-)
+ * - current space should be local
+ */
+ memset(&cob, 0, sizeof(bConstraintOb));
+ if (td->tdi) {
+ TransDataIpokey *tdi= td->tdi;
+ float size[3];
+
+ size[0]= tdi->sizex[0];
+ size[1]= tdi->sizey[0];
+ size[2]= tdi->sizez[0];
+ SizeToMat4(size, cob.matrix);
+ }
+ else if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) {
+ /* scale val and reset size */
+ return; // TODO: fix this case
+ }
+ else {
+ /* Reset val if SINGLESIZE but using a constraint */
+ if (td->flag & TD_SINGLESIZE)
+ return;
+
+ SizeToMat4(td->ext->size, cob.matrix);
+ }
+
+ /* Evaluate valid constraints */
+ for (con= td->con; con; con= con->next) {
+ /* we're only interested in Limit-Scale constraints */
+ if (con->type == CONSTRAINT_TYPE_SIZELIMIT) {
+ bSizeLimitConstraint *data= con->data;
+ float tmat[4][4];
+
+ /* only use it if it's tagged for this purpose */
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
+ continue;
+
+ /* do space conversions */
+ if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
+ /* just multiply by td->mtx (this should be ok) */
+ Mat4CpyMat4(tmat, cob.matrix);
+ Mat4MulMat34(cob.matrix, td->mtx, tmat);
+ }
+ else if (con->ownspace != CONSTRAINT_SPACE_LOCAL) {
+ /* skip... incompatable spacetype */
+ continue;
+ }
+
+ /* do constraint */
+ cti->evaluate_constraint(con, &cob, NULL);
+
+ /* convert spaces again */
+ if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
+ /* just multiply by td->mtx (this should be ok) */
+ Mat4CpyMat4(tmat, cob.matrix);
+ Mat4MulMat34(cob.matrix, td->smtx, tmat);
+ }
+ }
+ }
+
+ /* copy results from cob->matrix */
+ if (td->tdi) {
+ TransDataIpokey *tdi= td->tdi;
+ float size[3];
+
+ Mat4ToSize(cob.matrix, size);
+
+ tdi->sizex[0]= size[0];
+ tdi->sizey[0]= size[1];
+ tdi->sizez[0]= size[2];
+ }
+ else if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) {
+ /* scale val and reset size */
+ return; // TODO: fix this case
+ }
+ else {
+ /* Reset val if SINGLESIZE but using a constraint */
+ if (td->flag & TD_SINGLESIZE)
+ return;
+
+ Mat4ToSize(cob.matrix, td->ext->size);
+ }
+ }
+}
+
/* ************************** WARP *************************** */
void initWarp(TransInfo *t)
@@ -1306,6 +2191,7 @@ void initWarp(TransInfo *t)
t->mode = TFM_WARP;
t->transform = Warp;
+ t->handleEvent = handleEventWarp;
t->idx_max = 0;
t->num.idx_max = 0;
@@ -1342,6 +2228,24 @@ void initWarp(TransInfo *t)
t->val= (max[0]-min[0])/2.0f; /* t->val is X dimension projected boundbox */
}
+int handleEventWarp(TransInfo *t, unsigned short event, short val)
+{
+ int status = 0;
+
+ if (event == MIDDLEMOUSE && val)
+ {
+ // Use customData pointer to signal warp direction
+ if (t->customData == 0)
+ t->customData = (void*)1;
+ else
+ t->customData = 0;
+
+ status = 1;
+ }
+
+ return status;
+}
+
int Warp(TransInfo *t, short mval[2])
{
TransData *td = t->data;
@@ -1372,6 +2276,11 @@ int Warp(TransInfo *t, short mval[2])
/* amount of degrees for warp */
circumfac= 360.0f * InputHorizontalRatio(t, mval);
+
+ if (t->customData) /* non-null value indicates reversed input */
+ {
+ circumfac *= -1;
+ }
snapGrid(t, &circumfac);
applyNumInput(&t->num, &circumfac);
@@ -1395,6 +2304,9 @@ int Warp(TransInfo *t, short mval[2])
float loc[3];
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
/* translate point to center, rotate in such a way that outline==distance */
VECCOPY(vec, td->iloc);
@@ -1521,6 +2433,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);
@@ -1676,7 +2591,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|T_POSE)) {
float obsizemat[3][3];
// Reorient the size mat to fit the oriented object.
@@ -1705,11 +2620,11 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
add_tdi_poin(tdi->sizey, tdi->oldsize+1, vec[1]);
add_tdi_poin(tdi->sizez, tdi->oldsize+2, vec[2]);
- }
+ }
else if((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)){
/* scale val and reset size */
*td->val = td->ival * fsize[0] * td->factor;
-
+
td->ext->size[0] = td->ext->isize[0];
td->ext->size[1] = td->ext->isize[1];
td->ext->size[2] = td->ext->isize[2];
@@ -1718,13 +2633,16 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
/* Reset val if SINGLESIZE but using a constraint */
if (td->flag & TD_SINGLESIZE)
*td->val = td->ival;
-
+
td->ext->size[0] = td->ext->isize[0] * (fsize[0]) * td->factor;
td->ext->size[1] = td->ext->isize[1] * (fsize[1]) * td->factor;
td->ext->size[2] = td->ext->isize[2] * (fsize[2]) * td->factor;
}
}
+
+ constraintSizeLim(t, td);
}
+
/* For individual element center, Editmode need to use iloc */
if (t->flag & T_POINTS)
VecSubf(vec, td->iloc, center);
@@ -1754,6 +2672,8 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
add_tdi_poin(tdi->locz, tdi->oldloc+2, vec[2]);
}
else VecAddf(td->loc, td->iloc, vec);
+
+ constraintTransLim(t, td);
}
int Resize(TransInfo *t, short mval[2])
@@ -1786,6 +2706,8 @@ int Resize(TransInfo *t, short mval[2])
constraintNumInput(t, size);
}
+ applySnapping(t, size);
+
SizeToMat3(size, mat);
if (t->con.applySize) {
@@ -1799,6 +2721,9 @@ 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);
}
@@ -1890,6 +2815,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);
@@ -1943,10 +2871,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);
+ }
}
}
/**
@@ -1986,29 +2924,32 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
VecAddf(td->loc, td->iloc, vec);
+ constraintTransLim(t, td);
+
/* rotation */
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
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);
/* this function works on end result */
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
+
+ constraintRotLim(t, td);
}
}
else {
/* translation */
-
VecSubf(vec, td->center, t->center);
Mat3MulVecfl(mat, vec);
VecAddf(vec, vec, t->center);
/* vec now is the location where the object has to be */
VecSubf(vec, vec, td->center);
Mat3MulVecfl(td->smtx, vec);
-
+
protectedTransBits(td->protectflag, vec);
-
+
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
add_tdi_poin(tdi->locx, tdi->oldloc, vec[0]);
@@ -2016,10 +2957,11 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
add_tdi_poin(tdi->locz, tdi->oldloc+2, vec[2]);
}
else VecAddf(td->loc, td->iloc, vec);
+
+ constraintTransLim(t, td);
/* rotation */
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
-
if(td->flag & TD_USEQUAT) {
Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
Mat3ToQuat(fmat, quat); // Actual transform
@@ -2081,6 +3023,8 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
VECCOPY(td->ext->rot, eul);
}
}
+
+ constraintRotLim(t, td);
}
}
}
@@ -2105,6 +3049,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) {
@@ -2168,7 +3115,7 @@ int Rotation(TransInfo *t, short mval[2])
dphi = saacos((float)deler);
if( (dx1*dy2-dx2*dy1)>0.0 ) dphi= -dphi;
- if(G.qual & LR_SHIFTKEY) t->fac += dphi/30.0f;
+ if(t->flag & T_SHIFT_MOD) t->fac += dphi/30.0f;
else t->fac += dphi;
/*
@@ -2199,7 +3146,7 @@ int Rotation(TransInfo *t, short mval[2])
outputNumInput(&(t->num), c);
- sprintf(str, "Rot: %s %s", &c[0], t->proptext);
+ sprintf(str, "Rot: %s %s %s", &c[0], t->con.text, t->proptext);
/* Clamp between -180 and 180 */
while (final >= 180.0)
@@ -2265,6 +3212,9 @@ 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);
@@ -2308,10 +3258,7 @@ int Trackball(TransInfo *t, short mval[2])
/* factore has to become setting or so */
phi[0]= 0.01f*(float)( t->imval[1] - mval[1] );
phi[1]= 0.01f*(float)( mval[0] - t->imval[0] );
-
- //if(G.qual & LR_SHIFTKEY) t->fac += dphi/30.0f;
- //else t->fac += dphi;
-
+
snapGrid(t, phi);
if (hasNumInput(&t->num)) {
@@ -2328,8 +3275,13 @@ int Trackball(TransInfo *t, short mval[2])
}
else {
sprintf(str, "Trackball: %.2f %.2f %s", 180.0*phi[0]/M_PI, 180.0*phi[1]/M_PI, t->proptext);
- }
+ if(t->flag & T_SHIFT_MOD) {
+ if(phi[0] != 0.0) phi[0]/= 5.0f;
+ if(phi[1] != 0.0) phi[1]/= 5.0f;
+ }
+ }
+
VecRotToMat3(axis1, phi[0], smat);
VecRotToMat3(axis2, phi[1], totmat);
@@ -2394,6 +3346,7 @@ void initTranslation(TransInfo *t)
static void headerTranslation(TransInfo *t, float vec[3], char *str) {
char tvec[60];
char distvec[20];
+ char autoik[20];
float dvec[3];
float dist;
@@ -2414,24 +3367,35 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
sprintf(distvec, "%.4e", dist);
else
sprintf(distvec, "%.4f", dist);
+
+ if(t->flag & T_AUTOIK) {
+ short chainlen= G.scene->toolsettings->autoik_chainlen;
+
+ if(chainlen)
+ sprintf(autoik, "AutoIK-Len: %d", chainlen);
+ else
+ strcpy(autoik, "");
+ }
+ else
+ strcpy(autoik, "");
if (t->con.mode & CON_APPLY) {
switch(t->num.idx_max) {
case 0:
- sprintf(str, "D: %s (%s)%s %s", &tvec[0], distvec, t->con.text, t->proptext);
+ sprintf(str, "D: %s (%s)%s %s %s", &tvec[0], distvec, t->con.text, t->proptext, &autoik[0]);
break;
case 1:
- sprintf(str, "D: %s D: %s (%s)%s %s", &tvec[0], &tvec[20], distvec, t->con.text, t->proptext);
+ sprintf(str, "D: %s D: %s (%s)%s %s %s", &tvec[0], &tvec[20], distvec, t->con.text, t->proptext, &autoik[0]);
break;
case 2:
- sprintf(str, "D: %s D: %s D: %s (%s)%s %s", &tvec[0], &tvec[20], &tvec[40], distvec, t->con.text, t->proptext);
+ sprintf(str, "D: %s D: %s D: %s (%s)%s %s %s", &tvec[0], &tvec[20], &tvec[40], distvec, t->con.text, t->proptext, &autoik[0]);
}
}
else {
if(t->flag & T_2D_EDIT)
sprintf(str, "Dx: %s Dy: %s (%s)%s %s", &tvec[0], &tvec[20], distvec, t->con.text, t->proptext);
else
- sprintf(str, "Dx: %s Dy: %s Dz: %s (%s)%s %s", &tvec[0], &tvec[20], &tvec[40], distvec, t->con.text, t->proptext);
+ sprintf(str, "Dx: %s Dy: %s Dz: %s (%s)%s %s %s", &tvec[0], &tvec[20], &tvec[40], distvec, t->con.text, t->proptext, &autoik[0]);
}
}
@@ -2443,7 +3407,10 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
for(i = 0 ; i < t->total; i++, td++) {
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);
@@ -2451,7 +3418,7 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
else {
VECCOPY(tvec, vec);
}
-
+
Mat3MulVecfl(td->smtx, tvec);
VecMulf(tvec, td->factor);
@@ -2465,6 +3432,8 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
add_tdi_poin(tdi->locz, tdi->oldloc+2, tvec[2]);
}
else VecAddf(td->loc, td->iloc, tvec);
+
+ constraintTransLim(t, td);
}
}
@@ -2472,7 +3441,7 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
int Translation(TransInfo *t, short mval[2])
{
float tvec[3];
- char str[200];
+ char str[250];
if(t->flag & T_SHIFT_MOD) {
float dvec[3];
@@ -2571,6 +3540,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);
@@ -2662,6 +3634,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;
}
@@ -2723,6 +3698,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;
@@ -2812,6 +3790,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);
@@ -2920,6 +3901,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;
@@ -3063,6 +4047,9 @@ int BoneSize(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;
ElementBoneSize(t, td, mat);
}
@@ -3145,6 +4132,9 @@ 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) {
/* if the old/original value was 0.0f, then just use ratio */
@@ -3242,6 +4232,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;
}
@@ -3257,101 +4250,161 @@ int BoneRoll(TransInfo *t, short mval[2])
return 1;
}
-/* ************************** MIRROR *************************** */
+/* ************************** BAKE TIME ******************* */
-void Mirror(short mode)
+void initBakeTime(TransInfo *t)
{
- TransData *td;
- float mati[3][3], matview[3][3], mat[3][3];
- float size[3];
- int i;
+ 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;
+}
- Trans.context = CTX_NO_PET;
+int BakeTime(TransInfo *t, short mval[2])
+{
+ TransData *td = t->data;
+ float time;
+ int i;
+ char str[50];
- initTrans(&Trans); // internal data, mouse, vectors
+
+ 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;
+ }
- Mat3One(mati);
- Mat3CpyMat4(matview, Trans.viewinv); // t->viewinv was set in initTrans
- Mat3Ortho(matview);
+ snapGrid(t, &time);
- createTransData(&Trans); // make TransData structs from selection
+ applyNumInput(&t->num, &time);
- calculatePropRatio(&Trans);
- calculateCenter(&Trans);
+ /* header print for NumInput */
+ if (hasNumInput(&t->num)) {
+ char c[20];
- initResize(&Trans);
+ outputNumInput(&(t->num), c);
- if (Trans.total == 0) {
- postTrans(&Trans);
- return;
+ 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;
- size[0] = size[1] = size[2] = 1.0f;
- td = Trans.data;
+ if (td->flag & TD_SKIP)
+ continue;
- switch (mode) {
- case 1:
- size[0] = -1.0f;
- setConstraint(&Trans, mati, (CON_AXIS0), "");
- break;
- case 2:
- size[1] = -1.0f;
- setConstraint(&Trans, mati, (CON_AXIS1), "");
- break;
- case 3:
- size[2] = -1.0f;
- setConstraint(&Trans, mati, (CON_AXIS2), "");
- break;
- case 4:
- size[0] = -1.0f;
- setLocalConstraint(&Trans, (CON_AXIS0), "");
- break;
- case 5:
- size[1] = -1.0f;
- setLocalConstraint(&Trans, (CON_AXIS1), "");
- break;
- case 6:
- size[2] = -1.0f;
- setLocalConstraint(&Trans, (CON_AXIS2), "");
- break;
- case 7:
- size[0] = -1.0f;
- setConstraint(&Trans, matview, (CON_AXIS0), "");
- break;
- case 8:
- size[1] = -1.0f;
- setConstraint(&Trans, matview, (CON_AXIS1), "");
- break;
- case 9:
- size[2] = -1.0f;
- setConstraint(&Trans, matview, (CON_AXIS2), "");
- break;
- default:
- return;
+ 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;
+ }
}
- SizeToMat3(size, mat);
+ recalcData(t);
+
+ headerprint(str);
+
+ viewRedrawForce(t);
+
+ helpline (t, t->center);
- if (Trans.con.applySize) {
- Trans.con.applySize(&Trans, NULL, mat);
+ return 1;
+}
+
+/* ************************** MIRROR *************************** */
+
+void initMirror(TransInfo *t)
+{
+ t->flag |= T_NULL_ONE;
+ if (!G.obedit) {
+ t->flag |= T_NO_ZERO;
}
+
+ t->transform = Mirror;
+}
- for(i = 0 ; i < Trans.total; i++, td++) {
- if (td->flag & TD_NOACTION)
- break;
+int Mirror(TransInfo *t, short mval[2])
+{
+ TransData *td;
+ float size[3], mat[3][3];
+ int i;
+ char str[200];
+
+ /*
+ * OPTIMISATION:
+ * This still recalcs transformation on mouse move
+ * while it should only recalc on constraint change
+ * */
+
+ /* if an axis has been selected */
+ if (t->con.mode & CON_APPLY) {
+ size[0] = size[1] = size[2] = -1;
+
+ SizeToMat3(size, mat);
- ElementResize(&Trans, td, mat);
+ if (t->con.applySize) {
+ t->con.applySize(t, NULL, mat);
+ }
+
+ sprintf(str, "Mirror%s", t->con.text);
+
+ 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);
+ }
+
+ recalcData(t);
+
+ headerprint(str);
+
+ viewRedrawForce(t);
}
-
- recalcData(&Trans);
+ else
+ {
+ size[0] = size[1] = size[2] = 1;
- BIF_undo_push("Mirror");
-
- /* free data, reset vars */
- postTrans(&Trans);
+ SizeToMat3(size, mat);
+
+ 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);
+ }
+
+ recalcData(t);
+
+ headerprint("Select a mirror axis (X, Y, Z)");
+
+ viewRedrawForce(t);
+ }
- /* send events out for redraws */
- viewRedrawPost(&Trans);
+ return 1;
}
/* ************************** ANIM EDITORS - TRANSFORM TOOLS *************************** */
@@ -3373,6 +4426,8 @@ static short getAnimEdit_SnapMode(TransInfo *t)
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;
@@ -3382,6 +4437,9 @@ static short getAnimEdit_SnapMode(TransInfo *t)
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) {
@@ -3391,6 +4449,8 @@ static short getAnimEdit_SnapMode(TransInfo *t)
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;
@@ -3400,6 +4460,9 @@ static short getAnimEdit_SnapMode(TransInfo *t)
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 {
@@ -3407,6 +4470,8 @@ static short getAnimEdit_SnapMode(TransInfo *t)
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;
}
@@ -3438,14 +4503,14 @@ static short getAnimEdit_DrawTime(TransInfo *t)
/* This function is used by Animation Editor specific transform functions to do
- * the Snap Keyframe to Nearest Keyframe
+ * 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);
- float secf= ((float)G.scene->r.frs_sec);
+ double secf= FPS;
float val;
/* convert frame to nla-action time (if needed) */
@@ -3466,6 +4531,25 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, Object *ob, short
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 ----------------------- */
@@ -3496,21 +4580,9 @@ static void headerTimeTranslate(TransInfo *t, char *str)
else {
short autosnap= getAnimEdit_SnapMode(t);
short doTime = getAnimEdit_DrawTime(t);
- float secf= ((float)G.scene->r.frs_sec);
+ double secf= FPS;
float val= t->fac;
- /* take into account scaling (for Action Editor only) */
- if ((t->spacetype == SPACE_ACTION) && (NLA_ACTION_SCALED)) {
- float cval, sval[2];
-
- /* recalculate the delta based on 'visual' times */
- areamouseco_to_ipoco(G.v2d, t->imval, &sval[0], &sval[1]);
- cval= sval[0] + t->fac;
-
- val = get_action_frame_inv(OBACT, cval);
- val -= get_action_frame_inv(OBACT, sval[0]);
- }
-
/* apply snapping + frame->seconds conversions */
if (autosnap == SACTSNAP_STEP) {
if (doTime)
@@ -3535,10 +4607,9 @@ static void applyTimeTranslate(TransInfo *t, float sval)
int i;
short doTime= getAnimEdit_DrawTime(t);
- float secf= ((float)G.scene->r.frs_sec);
+ double secf= FPS;
short autosnap= getAnimEdit_SnapMode(t);
- float cval= sval + t->fac;
float deltax, val;
@@ -3551,8 +4622,7 @@ static void applyTimeTranslate(TransInfo *t, float sval)
/* check if any need to apply nla-scaling */
if (ob) {
- deltax = get_action_frame_inv(ob, cval);
- deltax -= get_action_frame_inv(ob, sval);
+ deltax = t->fac;
if (autosnap == SACTSNAP_STEP) {
if (doTime)
@@ -3578,7 +4648,7 @@ static void applyTimeTranslate(TransInfo *t, float sval)
*(td->val) = td->ival + val;
}
- /* apply snap-to-nearest-frame? */
+ /* apply nearest snapping */
doAnimEdit_SnapFrame(t, td, ob, autosnap);
}
}
@@ -3770,7 +4840,7 @@ static void applyTimeScale(TransInfo *t) {
short autosnap= getAnimEdit_SnapMode(t);
short doTime= getAnimEdit_DrawTime(t);
- float secf= ((float)G.scene->r.frs_sec);
+ double secf= FPS;
for (i = 0 ; i < t->total; i++, td++) {
@@ -3797,7 +4867,7 @@ static void applyTimeScale(TransInfo *t) {
*(td->val) *= fac;
*(td->val) += startx;
- /* apply snap-to-nearest-frame? */
+ /* apply nearest snapping */
doAnimEdit_SnapFrame(t, td, ob, autosnap);
}
}
@@ -3851,3 +4921,4 @@ void BIF_TransformSetUndo(char *str)
}
+
diff --git a/source/blender/src/transform_constraints.c b/source/blender/src/transform_constraints.c
index ad48d3cc919..33311210ec5 100644
--- a/source/blender/src/transform_constraints.c
+++ b/source/blender/src/transform_constraints.c
@@ -539,6 +539,10 @@ void setUserConstraint(TransInfo *t, int mode, const char ftext[]) {
sprintf(text, ftext, "view");
setConstraint(t, t->spacemtx, mode, text);
break;
+ default: /* V3D_MANIP_CUSTOM */
+ sprintf(text, ftext, t->spacename);
+ setConstraint(t, t->spacemtx, mode, text);
+ break;
}
t->con.mode |= CON_USER;
@@ -594,12 +598,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 +631,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;
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index 3e1f08c82a3..496454274e5 100644
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -61,6 +61,7 @@
#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"
@@ -76,6 +77,7 @@
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_blender.h"
+#include "BKE_cloth.h"
#include "BKE_curve.h"
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
@@ -92,6 +94,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
@@ -103,6 +106,7 @@
#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"
@@ -113,11 +117,13 @@
#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_drawaction.h" // list of keyframes in action
#include "BDR_editobject.h" // reset_slowparents()
#include "BDR_unwrapper.h"
@@ -137,7 +143,7 @@ extern ListBase editelems;
#include "transform.h"
/* local function prototype - for Object/Bone Constraints */
-static short constraints_list_needinv(ListBase *list);
+static short constraints_list_needinv(TransInfo *t, ListBase *list);
/* ************************** Functions *************************** */
@@ -529,6 +535,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;
@@ -550,19 +558,19 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
else
Mat3CpyMat4(pmat, pchan->parent->pose_mat);
- if (constraints_list_needinv(&pchan->constraints)) {
+ 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
+ Mat3MulSerie(td->mtx, pchan->bone->bone_mat, pmat, omat, cmat, 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 {
- if (constraints_list_needinv(&pchan->constraints)) {
+ 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
+ Mat3MulSerie(td->mtx, pchan->bone->bone_mat, omat, cmat, 0,0,0,0,0); // dang mulserie swaps args
}
else
Mat3MulMat3(td->mtx, omat, pchan->bone->bone_mat); // Mat3MulMat3 has swapped args!
@@ -610,6 +618,9 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
Mat3Inv (td->smtx, td->mtx);
}
}
+
+ /* store reference to first constraint */
+ td->con= pchan->constraints.first;
}
static void bone_children_clear_transflag(ListBase *lb)
@@ -617,7 +628,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_CONNECTED))
+ bone->flag |= BONE_HINGE_CHILD_TRANSFORM;
+ else
+ bone->flag &= ~BONE_TRANSFORM;
+
bone_children_clear_transflag(&bone->childbase);
}
}
@@ -628,6 +643,7 @@ static void set_pose_transflags(TransInfo *t, Object *ob)
bArmature *arm= ob->data;
bPoseChannel *pchan;
Bone *bone;
+ int hastranslation;
t->total= 0;
@@ -638,6 +654,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;
}
}
@@ -651,23 +669,89 @@ static void set_pose_transflags(TransInfo *t, Object *ob)
}
}
/* now count, and check if we have autoIK or have to switch from translate to rotate */
+ hastranslation= 0;
+
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
if(bone->flag & BONE_TRANSFORM) {
+
t->total++;
if(t->mode==TFM_TRANSLATION) {
if( has_targetless_ik(pchan)==NULL ) {
- if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED))
- t->mode= TFM_ROTATION;
- else if((pchan->protectflag & OB_LOCK_LOC)==OB_LOCK_LOC)
- t->mode= TFM_ROTATION;
+ if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED)) {
+ if(pchan->bone->flag & BONE_HINGE_CHILD_TRANSFORM)
+ hastranslation= 1;
+ }
+ else if((pchan->protectflag & OB_LOCK_LOC)!=OB_LOCK_LOC)
+ hastranslation= 1;
}
+ else
+ hastranslation= 1;
+ }
+ }
+ }
+
+ /* if there are no translatable bones, do rotation */
+ if(t->mode==TFM_TRANSLATION && !hastranslation)
+ t->mode= TFM_ROTATION;
+}
+
+
+/* -------- Auto-IK ---------- */
+
+/* adjust pose-channel's auto-ik chainlen */
+static void pchan_autoik_adjust (bPoseChannel *pchan, short chainlen)
+{
+ bConstraint *con;
+
+ /* don't bother to search if no valid constraints */
+ if ((pchan->constflag & (PCHAN_HAS_IK|PCHAN_HAS_TARGET))==0)
+ return;
+
+ /* check if pchan has ik-constraint */
+ for (con= pchan->constraints.first; con; con= con->next) {
+ if (con->type == CONSTRAINT_TYPE_KINEMATIC) {
+ bKinematicConstraint *data= con->data;
+
+ /* only accept if a temporary one (for auto-ik) */
+ if (data->flag & CONSTRAINT_IK_TEMP) {
+ /* chainlen is new chainlen, but is limited by maximum chainlen */
+ if ((chainlen==0) || (chainlen > data->max_rootbone))
+ data->rootbone= data->max_rootbone;
+ else
+ data->rootbone= chainlen;
}
}
}
}
+/* change the chain-length of auto-ik */
+void transform_autoik_update (TransInfo *t, short mode)
+{
+ short *chainlen= &G.scene->toolsettings->autoik_chainlen;
+ bPoseChannel *pchan;
+
+ /* mode determines what change to apply to chainlen */
+ if (mode == 1) {
+ /* mode=1 is from WHEELMOUSEDOWN... increases len */
+ (*chainlen)++;
+ }
+ else if (mode == -1) {
+ /* mode==-1 is from WHEELMOUSEUP... decreases len */
+ if (*chainlen > 0) (*chainlen)--;
+ }
+
+ /* sanity checks (don't assume t->poseobj is set, or that it is an armature) */
+ if (ELEM(NULL, t->poseobj, t->poseobj->pose))
+ return;
+
+ /* apply to all pose-channels */
+ for (pchan=t->poseobj->pose->chanbase.first; pchan; pchan=pchan->next) {
+ pchan_autoik_adjust(pchan, *chainlen);
+ }
+}
+
/* frees temporal IKs */
static void pose_grab_with_ik_clear(Object *ob)
{
@@ -675,11 +759,15 @@ static void pose_grab_with_ik_clear(Object *ob)
bPoseChannel *pchan;
bConstraint *con;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- for(con= pchan->constraints.first; con; con= con->next) {
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ /* clear all temporary lock flags */
+ pchan->ikflag &= ~(BONE_IK_NO_XDOF_TEMP|BONE_IK_NO_YDOF_TEMP|BONE_IK_NO_ZDOF_TEMP);
+
+ /* remove all temporary IK-constraints added */
+ for (con= pchan->constraints.first; con; con= con->next) {
+ if (con->type==CONSTRAINT_TYPE_KINEMATIC) {
data= con->data;
- if(data->flag & CONSTRAINT_IK_TEMP) {
+ if (data->flag & CONSTRAINT_IK_TEMP) {
BLI_remlink(&pchan->constraints, con);
MEM_freeN(con->data);
MEM_freeN(con);
@@ -691,27 +779,28 @@ static void pose_grab_with_ik_clear(Object *ob)
}
}
-/* adds the IK to pchan */
-static void pose_grab_with_ik_add(bPoseChannel *pchan)
+/* adds the IK to pchan - returns if added */
+static short pose_grab_with_ik_add(bPoseChannel *pchan)
{
bKinematicConstraint *data;
bConstraint *con;
- if (pchan == NULL) { // Sanity check
- return;
- }
+ /* Sanity check */
+ if (pchan == NULL)
+ return 0;
- /* rule: not if there's already an IK on this channel */
- for(con= pchan->constraints.first; con; con= con->next)
- if(con->type==CONSTRAINT_TYPE_KINEMATIC)
+ /* Rule: not if there's already an IK on this channel */
+ for (con= pchan->constraints.first; con; con= con->next) {
+ if (con->type==CONSTRAINT_TYPE_KINEMATIC)
break;
+ }
- if(con) {
+ if (con) {
/* but, if this is a targetless IK, we make it auto anyway (for the children loop) */
data= has_targetless_ik(pchan);
- if(data)
+ if (data)
data->flag |= CONSTRAINT_IK_AUTO;
- return;
+ return 0;
}
con = add_new_constraint(CONSTRAINT_TYPE_KINEMATIC);
@@ -723,68 +812,93 @@ static void pose_grab_with_ik_add(bPoseChannel *pchan)
data->rootbone= 1;
/* we include only a connected chain */
- while(pchan && (pchan->bone->flag & BONE_CONNECTED)) {
+ while ((pchan) && (pchan->bone->flag & BONE_CONNECTED)) {
+ /* here, we set ik-settings for bone from pchan->protectflag */
+ if (pchan->protectflag & OB_LOCK_ROTX) pchan->ikflag |= BONE_IK_NO_XDOF_TEMP;
+ if (pchan->protectflag & OB_LOCK_ROTY) pchan->ikflag |= BONE_IK_NO_YDOF_TEMP;
+ if (pchan->protectflag & OB_LOCK_ROTZ) pchan->ikflag |= BONE_IK_NO_ZDOF_TEMP;
+
+ /* now we count this pchan as being included */
data->rootbone++;
pchan= pchan->parent;
}
+
+ /* make a copy of maximum chain-length */
+ data->max_rootbone= data->rootbone;
+
+ return 1;
}
-/* bone is a canditate to get IK, but we don't do it if it has children connected */
-static void pose_grab_with_ik_children(bPose *pose, Bone *bone)
+/* bone is a candidate to get IK, but we don't do it if it has children connected */
+static short pose_grab_with_ik_children(bPose *pose, Bone *bone)
{
Bone *bonec;
- int wentdeeper= 0;
+ short wentdeeper=0, added=0;
/* go deeper if children & children are connected */
- for(bonec= bone->childbase.first; bonec; bonec= bonec->next) {
- if(bonec->flag & BONE_CONNECTED) {
+ for (bonec= bone->childbase.first; bonec; bonec= bonec->next) {
+ if (bonec->flag & BONE_CONNECTED) {
wentdeeper= 1;
- pose_grab_with_ik_children(pose, bonec);
+ added+= pose_grab_with_ik_children(pose, bonec);
}
}
- if(wentdeeper==0) {
+ if (wentdeeper==0) {
bPoseChannel *pchan= get_pose_channel(pose, bone->name);
- if(pchan)
- pose_grab_with_ik_add(pchan);
+ if (pchan)
+ added+= pose_grab_with_ik_add(pchan);
}
+
+ return added;
}
/* main call which adds temporal IK chains */
-static void pose_grab_with_ik(Object *ob)
+static short pose_grab_with_ik(Object *ob)
{
bArmature *arm;
- bPoseChannel *pchan, *pchansel= NULL;
+ bPoseChannel *pchan, *parent;
+ Bone *bonec;
+ short tot_ik= 0;
- if(ob==NULL || ob->pose==NULL || (ob->flag & OB_POSEMODE)==0)
- return;
+ if ((ob==NULL) || (ob->pose==NULL) || (ob->flag & OB_POSEMODE)==0)
+ return 0;
arm = ob->data;
- /* rule: only one Bone */
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(pchan->bone->layer & arm->layer) {
- if(pchan->bone->flag & BONE_SELECTED) {
- if(pchansel)
- break;
- pchansel= pchan;
+ /* Rule: allow multiple Bones (but they must be selected, and only one ik-solver per chain should get added) */
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->bone->layer & arm->layer) {
+ if (pchan->bone->flag & BONE_SELECTED) {
+ /* Rule: no IK for solitatry (unconnected) bones */
+ for (bonec=pchan->bone->childbase.first; bonec; bonec=bonec->next) {
+ if (bonec->flag & BONE_CONNECTED) {
+ break;
+ }
+ }
+ if ((pchan->bone->flag & BONE_CONNECTED)==0 && (bonec == NULL))
+ continue;
+
+ /* rule: if selected Bone is not a root bone, it gets a temporal IK */
+ if (pchan->parent) {
+ /* only adds if there's no IK yet (and no parent bone was selected) */
+ for (parent= pchan->parent; parent; parent= parent->parent) {
+ if (parent->bone->flag & BONE_SELECTED)
+ break;
+ }
+ if (parent == NULL)
+ tot_ik += pose_grab_with_ik_add(pchan);
+ }
+ else {
+ /* rule: go over the children and add IK to the tips */
+ tot_ik += pose_grab_with_ik_children(ob->pose, pchan->bone);
+ }
}
}
}
- if(pchan || pchansel==NULL) return;
- /* rule: if selected Bone is not a root bone, it gets a temporal IK */
- if(pchansel->parent) {
- /* only adds if there's no IK yet */
- pose_grab_with_ik_add(pchansel);
- }
- else {
- /* rule: go over the children and add IK to the tips */
- pose_grab_with_ik_children(ob->pose, pchansel->bone);
- }
+ return (tot_ik) ? 1 : 0;
}
-
/* only called with pose mode active object now */
static void createTransPose(TransInfo *t, Object *ob)
{
@@ -792,6 +906,7 @@ static void createTransPose(TransInfo *t, Object *ob)
bPoseChannel *pchan;
TransData *td;
TransDataExtension *tdx;
+ short ik_on= 0;
int i;
t->total= 0;
@@ -809,8 +924,10 @@ static void createTransPose(TransInfo *t, Object *ob)
if (!(ob->lay & G.vd->lay)) return;
/* do we need to add temporal IK chains? */
- if((arm->flag & ARM_AUTO_IK) && t->mode==TFM_TRANSLATION)
- pose_grab_with_ik(ob);
+ if ((arm->flag & ARM_AUTO_IK) && t->mode==TFM_TRANSLATION) {
+ ik_on= pose_grab_with_ik(ob);
+ if (ik_on) t->flag |= T_AUTOIK;
+ }
/* set flags and count total (warning, can change transform to rotate) */
set_pose_transflags(t, ob);
@@ -844,6 +961,8 @@ static void createTransPose(TransInfo *t, Object *ob)
if(td != (t->data+t->total)) printf("Bone selection count error\n");
+ /* initialise initial auto=ik chainlen's? */
+ if (ik_on) transform_autoik_update(t, 0);
}
/* ********************* armature ************** */
@@ -1137,10 +1256,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 & SELECT) countsel+=3;
+ if(propmode) count+= 3;
+ } else {
+ if(bezt->f1 & SELECT) countsel++;
+ if(bezt->f2 & SELECT) countsel++;
+ if(bezt->f3 & SELECT) countsel++;
+ if(propmode) count+= 3;
+ }
}
}
}
@@ -1148,7 +1272,7 @@ static void createTransCurveVerts(TransInfo *t)
for(a= nu->pntsu*nu->pntsv, bp= nu->bp; a>0; a--, bp++) {
if(bp->hide==0) {
if(propmode) count++;
- if(bp->f1 & 1) countsel++;
+ if(bp->f1 & SELECT) countsel++;
}
}
}
@@ -1170,12 +1294,21 @@ 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 & SELECT) && (G.f & G_HIDDENHANDLES)) ||
+ ((bezt->f1 & SELECT) && (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;
- else td->flag= 0;
+ if (G.f & G_HIDDENHANDLES) {
+ if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
+ else td->flag= 0;
+ } else {
+ if(bezt->f1 & SELECT) td->flag= TD_SELECTED;
+ else td->flag= 0;
+ }
td->ext = NULL;
td->tdi = NULL;
td->val = NULL;
@@ -1187,22 +1320,25 @@ static void createTransCurveVerts(TransInfo *t)
count++;
tail++;
}
- /* THIS IS THE CV, the other two are handles */
- if(propmode || (bezt->f2 & 1)) {
+
+ /* This is the Curve Point, the other two are handles */
+ if(propmode || (bezt->f2 & SELECT)) {
VECCOPY(td->iloc, bezt->vec[1]);
td->loc= bezt->vec[1];
VECCOPY(td->center, td->loc);
- if(bezt->f2 & 1) td->flag= TD_SELECTED;
+ if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
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);
@@ -1212,12 +1348,20 @@ static void createTransCurveVerts(TransInfo *t)
count++;
tail++;
}
- if(propmode || (bezt->f3 & 1)) {
+ if( propmode ||
+ ((bezt->f1 & SELECT) && (G.f & G_HIDDENHANDLES)) ||
+ ((bezt->f3 & SELECT) && (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;
- else td->flag= 0;
+ if (G.f & G_HIDDENHANDLES) {
+ if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
+ else td->flag= 0;
+ } else {
+ if(bezt->f3 & SELECT) td->flag= TD_SELECTED;
+ else td->flag= 0;
+ }
td->ext = NULL;
td->tdi = NULL;
td->val = NULL;
@@ -1243,16 +1387,16 @@ static void createTransCurveVerts(TransInfo *t)
head = tail = td;
for(a= nu->pntsu*nu->pntsv, bp= nu->bp; a>0; a--, bp++) {
if(bp->hide==0) {
- if(propmode || (bp->f1 & 1)) {
+ if(propmode || (bp->f1 & SELECT)) {
VECCOPY(td->iloc, bp->vec);
td->loc= bp->vec;
VECCOPY(td->center, td->loc);
- if(bp->f1 & 1) td->flag= TD_SELECTED;
+ if(bp->f1 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
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 {
@@ -1294,7 +1438,7 @@ static void createTransLatticeVerts(TransInfo *t)
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
while(a--) {
if(bp->hide==0) {
- if(bp->f1 & 1) countsel++;
+ if(bp->f1 & SELECT) countsel++;
if(propmode) count++;
}
bp++;
@@ -1314,12 +1458,12 @@ static void createTransLatticeVerts(TransInfo *t)
bp= editLatt->def;
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
while(a--) {
- if(propmode || (bp->f1 & 1)) {
+ if(propmode || (bp->f1 & SELECT)) {
if(bp->hide==0) {
VECCOPY(td->iloc, bp->vec);
td->loc= bp->vec;
VECCOPY(td->center, td->loc);
- if(bp->f1 & 1) td->flag= TD_SELECTED;
+ if(bp->f1 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
@@ -1336,6 +1480,160 @@ 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->ob = ob;
+ 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 */
@@ -1469,9 +1767,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);
@@ -1650,11 +1953,17 @@ static void createTransEditVerts(TransInfo *t)
EditMesh *em = G.editMesh;
EditVert *eve;
EditVert **nears = NULL;
+ EditVert *eve_act = NULL;
float *vectors = NULL, *mappedcos = NULL, *quats= NULL;
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) {
@@ -1695,6 +2004,15 @@ static void createTransEditVerts(TransInfo *t)
/* note: in prop mode we need at least 1 selected */
if (countsel==0) return;
+ /* check active */
+ if (G.editMesh->selected.last) {
+ EditSelection *ese = G.editMesh->selected.last;
+ if ( ese->type == EDITVERT ) {
+ eve_act = (EditVert *)ese->data;
+ }
+ }
+
+
if(propmode) {
t->total = count;
@@ -1750,8 +2068,13 @@ static void createTransEditVerts(TransInfo *t)
if(eve->h==0) {
if(propmode || eve->f1) {
VertsToTransData(tob, eve);
-
+
+ /* selected */
if(eve->f1) tob->flag |= TD_SELECTED;
+
+ /* active */
+ if(eve == eve_act) tob->flag |= TD_ACTIVE;
+
if(propmode) {
if (eve->f2) {
float vec[3];
@@ -1866,11 +2189,11 @@ static void createTransUVs(TransInfo *t)
/* count */
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if SIMA_FACEDRAW_CHECK(efa, tf) {
- if (SIMA_UVSEL_CHECK(efa, tf, 0)) countsel++;
- if (SIMA_UVSEL_CHECK(efa, tf, 1)) countsel++;
- if (SIMA_UVSEL_CHECK(efa, tf, 2)) countsel++;
- if (efa->v4 && SIMA_UVSEL_CHECK(efa, tf, 3)) countsel++;
+ 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 += (efa->v4)? 4: 3;
}
@@ -1892,16 +2215,16 @@ static void createTransUVs(TransInfo *t)
td2d= t->data2d;
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if SIMA_FACEDRAW_CHECK(efa, tf) {
- if(propmode || SIMA_UVSEL_CHECK(efa, tf, 0))
- UVsToTransData(td++, td2d++, tf->uv[0], SIMA_UVSEL_CHECK(efa, tf, 0));
- if(propmode || SIMA_UVSEL_CHECK(efa, tf, 1))
- UVsToTransData(td++, td2d++, tf->uv[1], SIMA_UVSEL_CHECK(efa, tf, 1));
- if(propmode || SIMA_UVSEL_CHECK(efa, tf, 2))
- UVsToTransData(td++, td2d++, tf->uv[2], SIMA_UVSEL_CHECK(efa, tf, 2));
+ 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(efa->v4 && (propmode || SIMA_UVSEL_CHECK(efa, tf, 3)))
- UVsToTransData(td++, td2d++, tf->uv[3], SIMA_UVSEL_CHECK(efa, tf, 3));
+ if(efa->v4 && (propmode || simaUVSel_Check(efa, tf, 3)))
+ UVsToTransData(td++, td2d++, tf->uv[3], simaUVSel_Check(efa, tf, 3));
}
}
@@ -2024,7 +2347,144 @@ void flushTransIpoData(TransInfo *t)
/* ********************* ACTION/NLA EDITOR ****************** */
+/* Called by special_aftertrans_update to make sure selected keyframes replace
+ * any other keyframes which may reside on that frame (that is not selected).
+ */
+static void posttrans_ipo_clean (Ipo *ipo)
+{
+ IpoCurve *icu;
+ int i;
+
+ /* delete any keyframes that occur on same frame as selected keyframe, but is not selected */
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ float *selcache; /* cache for frame numbers of selected frames (icu->totvert*sizeof(float)) */
+ int len, index; /* number of frames in cache, item index */
+
+ /* allocate memory for the cache */
+ // TODO: investigate using GHash for this instead?
+ if (icu->totvert == 0)
+ continue;
+ selcache= MEM_callocN(sizeof(float)*icu->totvert, "IcuSelFrameNums");
+ len= 0;
+ index= 0;
+
+ /* We do 2 loops, 1 for marking keyframes for deletion, one for deleting
+ * as there is no guarantee what order the keyframes are exactly, even though
+ * they have been sorted by time.
+ */
+
+ /* Loop 1: find selected keyframes */
+ for (i = 0; i < icu->totvert; i++) {
+ BezTriple *bezt= &icu->bezt[i];
+
+ if (BEZSELECTED(bezt)) {
+ selcache[index]= bezt->vec[1][0];
+ index++;
+ len++;
+ }
+ }
+
+ /* Loop 2: delete unselected keyframes on the same frames (if any keyframes were found) */
+ if (len) {
+ for (i = 0; i < icu->totvert; i++) {
+ BezTriple *bezt= &icu->bezt[i];
+
+ if (BEZSELECTED(bezt) == 0) {
+ /* check beztriple should be removed according to cache */
+ for (index= 0; index < len; index++) {
+ if (IS_EQ(bezt->vec[1][0], selcache[index])) {
+ delete_icu_key(icu, i, 0);
+ break;
+ }
+ else if (bezt->vec[1][0] > selcache[index])
+ break;
+ }
+ }
+ }
+
+ testhandles_ipocurve(icu);
+ }
+
+ /* free cache */
+ MEM_freeN(selcache);
+ }
+}
+
+/* Called by special_aftertrans_update to make sure selected keyframes replace
+ * any other keyframes which may reside on that frame (that is not selected).
+ * remake_action_ipos should have already been called
+ */
+static void posttrans_action_clean (bAction *act)
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
+ actdata_filter(&act_data, filter, act, ACTCONT_ACTION);
+
+ /* loop through relevant data, removing keyframes from the ipo-blocks that were attached
+ * - all keyframes are converted in/out of global time
+ */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ if (NLA_ACTION_SCALED) {
+ actstrip_map_ipo_keys(OBACT, ale->key_data, 0, 1);
+ posttrans_ipo_clean(ale->key_data);
+ actstrip_map_ipo_keys(OBACT, ale->key_data, 1, 1);
+ }
+ else
+ posttrans_ipo_clean(ale->key_data);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&act_data);
+}
+
+/* ----------------------------- */
+
+/* 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 & SELECT) {
+ /* fully select the other two keys */
+ bezt->f1 |= SELECT;
+ bezt->f3 |= SELECT;
+
+ /* 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 */
@@ -2040,9 +2500,12 @@ static void TimeToTransData(TransData *td, float *time, Object *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);
+ * 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)
+static TransData *IpoToTransData(TransData *td, Ipo *ipo, Object *ob, char side, float cfra)
{
IpoCurve *icu;
BezTriple *bezt;
@@ -2052,18 +2515,21 @@ static TransData *IpoToTransData(TransData *td, Ipo *ipo, Object *ob)
return td;
for (icu= ipo->curve.first; icu; icu= icu->next) {
- /* only add selected keyframes (for now, proportional edit is not enabled) */
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)) {
- /* 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++;
+ /* 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++;
+ }
}
}
}
@@ -2083,6 +2549,8 @@ static void createTransActionData(TransInfo *t)
int filter;
int count=0;
+ float cfra;
+ char side;
/* determine what type of data we are operating on */
data = get_action_context(&datatype);
@@ -2095,10 +2563,31 @@ static void createTransActionData(TransInfo *t)
/* 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 += fullselect_ipo_keys(ale->key_data);
+ count += count_ipo_keys(ale->key_data, side, cfra);
/* stop if trying to build list if nothing selected */
if (count == 0) {
@@ -2118,7 +2607,7 @@ static void createTransActionData(TransInfo *t)
for (ale= act_data.first; ale; ale= ale->next) {
Ipo *ipo= (Ipo *)ale->key_data;
- td= IpoToTransData(td, ipo, ob);
+ td= IpoToTransData(td, ipo, ob, side, cfra);
}
/* check if we're supposed to be setting minx/maxx for TimeSlide */
@@ -2153,17 +2642,32 @@ static void createTransNlaData(TransInfo *t)
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= fullselect_ipo_keys(base->object->ipo);
+ 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 += fullselect_ipo_keys(conchan->ipo);
+ count += count_ipo_keys(conchan->ipo, side, CFRA);
/* skip actions and nlastrips if object is collapsed */
if (base->object->nlaflag & OB_NLA_COLLAPSED)
@@ -2178,9 +2682,11 @@ static void createTransNlaData(TransInfo *t)
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= fullselect_ipo_keys(achan->ipo);
+ i= count_ipo_keys(achan->ipo, side, cfra);
if (i) base->flag |= BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA;
count += i;
@@ -2188,7 +2694,7 @@ static void createTransNlaData(TransInfo *t)
if (EXPANDED_ACHAN(achan) && FILTER_CON_ACHAN(achan)) {
for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
if (EDITABLE_CONCHAN(conchan))
- count += fullselect_ipo_keys(conchan->ipo);
+ count += count_ipo_keys(conchan->ipo, side, cfra);
}
}
}
@@ -2200,7 +2706,9 @@ static void createTransNlaData(TransInfo *t)
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;
- count += 2;
+
+ if (FrameOnMouseSide(side, strip->start, CFRA)) count++;
+ if (FrameOnMouseSide(side, strip->end, CFRA)) count++;
}
}
}
@@ -2218,12 +2726,12 @@ static void createTransNlaData(TransInfo *t)
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);
+ 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);
+ td= IpoToTransData(td, conchan->ipo, NULL, side, CFRA);
/* skip actions and nlastrips if object collapsed */
if (base->object->nlaflag & OB_NLA_COLLAPSED)
@@ -2240,15 +2748,17 @@ static void createTransNlaData(TransInfo *t)
/* 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);
+ 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);
+ td= IpoToTransData(td, conchan->ipo, base->object, side, cfra);
}
}
}
@@ -2260,13 +2770,16 @@ static void createTransNlaData(TransInfo *t)
for (strip=base->object->nlastrips.first; strip; strip=strip->next) {
if (strip->flag & ACTSTRIP_SELECT) {
/* first TransData is the start, second is the end */
- td->val = &strip->start;
- td->ival = strip->start;
- td++;
-
- td->val = &strip->end;
- td->ival = strip->end;
- td++;
+ 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++;
+ }
}
}
}
@@ -2371,7 +2884,7 @@ static void ipokey_to_transdata(IpoKey *ik, TransData *td)
* These particular constraints benefit from this, but others don't, hence
* this semi-hack ;-) - Aligorith
*/
-static short constraints_list_needinv(ListBase *list)
+static short constraints_list_needinv(TransInfo *t, ListBase *list)
{
bConstraint *con;
@@ -2383,9 +2896,19 @@ static short constraints_list_needinv(ListBase *list)
/* 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;
+ }
}
}
}
@@ -2395,7 +2918,7 @@ static short constraints_list_needinv(ListBase *list)
}
/* transcribe given object into TransData for Transforming */
-static void ObjectToTransData(TransData *td, Object *ob)
+static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
{
Object *track;
ListBase fakecons = {NULL, NULL};
@@ -2406,12 +2929,14 @@ static void ObjectToTransData(TransData *td, Object *ob)
Mat3CpyMat4(td->axismtx, ob->obmat);
Mat3Ortho(td->axismtx);
+ td->con= ob->constraints.first;
+
/* 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(&ob->constraints);
+ constinv= constraints_list_needinv(t, &ob->constraints);
if (ob->track || constinv==0) {
track= ob->track;
ob->track= NULL;
@@ -2448,6 +2973,8 @@ static void ObjectToTransData(TransData *td, Object *ob)
VECCOPY(td->ext->dsize, ob->dsize);
VECCOPY(td->center, ob->obmat[3]);
+
+ Mat4CpyMat4(td->ext->obmat, ob->obmat);
/* is there a need to set the global<->data space conversion matrices? */
if (ob->parent || constinv) {
@@ -2468,6 +2995,13 @@ static void ObjectToTransData(TransData *td, Object *ob)
Mat3One(td->smtx);
Mat3One(td->mtx);
}
+
+ /* set active flag */
+ if (BASACT && BASACT->object == ob)
+ {
+ td->flag |= TD_ACTIVE;
+ }
+
#ifdef WITH_VERSE
if(ob->vnode) {
td->verse = (void*)ob;
@@ -2545,6 +3079,51 @@ static void clear_trans_object_base_flags(void)
}
}
+/* auto-keyframing feature - checks for whether anything should be done for the current frame */
+short autokeyframe_cfra_can_key(Object *ob)
+{
+ ListBase keys = {NULL, NULL};
+ ActKeyColumn *ak;
+ float cfra;
+ short found= 0;
+
+ /* only filter if auto-key mode requires this */
+ if (IS_AUTOKEY_ON == 0)
+ return 0;
+ else if (IS_AUTOKEY_MODE(NORMAL))
+ return 1;
+
+ /* sanity check */
+ if (ob == NULL)
+ return 0;
+
+ /* get keyframes that object has (bone anim is stored on ob too) */
+ if (ob->action)
+ action_to_keylist(ob->action, &keys, NULL, NULL);
+ else if (ob->ipo)
+ ipo_to_keylist(ob->ipo, &keys, NULL, NULL);
+ else
+ return 0;
+
+ /* get current frame (will apply nla-scaling as necessary) */
+ // ack... this is messy...
+ cfra= frame_to_float(CFRA);
+ cfra= get_action_frame(ob, cfra);
+
+ /* check if a keyframe occurs on current frame */
+ for (ak= keys.first; ak; ak= ak->next) {
+ if (IS_EQ(cfra, ak->cfra)) {
+ found= 1;
+ break;
+ }
+ }
+
+ /* free temp list */
+ BLI_freelistN(&keys);
+
+ return found;
+}
+
/* auto-keyframing feature - for objects
* tmode: should be a transform mode
*/
@@ -2553,12 +3132,12 @@ void autokeyframe_ob_cb_func(Object *ob, int tmode)
IpoCurve *icu;
char *actname="";
- if (G.flags & G_RECORDKEYS) {
- if(ob->ipoflag & OB_ACTION_OB)
+ if (autokeyframe_cfra_can_key(ob)) {
+ if (ob->ipoflag & OB_ACTION_OB)
actname= "Object";
-
- if(U.uiflag & USER_KEYINSERTAVAI) {
- if(ob->ipo || ob->action) {
+
+ if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
+ if (ob->ipo || ob->action) {
ID *id= (ID *)(ob);
if (ob->ipo) {
@@ -2574,9 +3153,9 @@ void autokeyframe_ob_cb_func(Object *ob, int tmode)
icu= NULL;
}
- while(icu) {
+ while (icu) {
icu->flag &= ~IPO_SELECT;
- if (U.uiflag & USER_KEYINSERTNEED)
+ if (IS_AUTOKEY_FLAG(INSERTNEEDED))
insertkey_smarter(id, ID_OB, actname, NULL, icu->adrcode);
else
insertkey(id, ID_OB, actname, NULL, icu->adrcode, 0);
@@ -2584,37 +3163,66 @@ void autokeyframe_ob_cb_func(Object *ob, int tmode)
}
}
}
- else if (U.uiflag & USER_KEYINSERTNEED) {
- if (tmode==TFM_RESIZE) {
- 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 if (IS_AUTOKEY_FLAG(INSERTNEEDED)) {
+ 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_ROTATION) {
- 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);
+ 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;
}
- else if (tmode==TFM_TRANSLATION) {
+
+ 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);
}
@@ -2626,6 +3234,7 @@ void autokeyframe_ob_cb_func(Object *ob, int tmode)
*/
void autokeyframe_pose_cb_func(Object *ob, int tmode, short targetless_ik)
{
+ bArmature *arm= ob->data;
bAction *act;
bPose *pose;
bPoseChannel *pchan;
@@ -2634,8 +3243,8 @@ void autokeyframe_pose_cb_func(Object *ob, int tmode, short targetless_ik)
pose= ob->pose;
act= ob->action;
- if (G.flags & G_RECORDKEYS) {
- if (!act)
+ if (autokeyframe_cfra_can_key(ob)) {
+ if (act == NULL)
act= ob->action= add_empty_action("Action");
for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
@@ -2644,14 +3253,14 @@ void autokeyframe_pose_cb_func(Object *ob, int tmode, short targetless_ik)
pchan->bone->flag &= ~BONE_UNKEYED;
/* only insert into available channels? */
- if(U.uiflag & USER_KEYINSERTAVAI) {
+ if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
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){
+ 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)
+ if (IS_AUTOKEY_FLAG(INSERTNEEDED))
insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, icu->adrcode);
else
insertkey(&ob->id, ID_PO, pchan->name, NULL, icu->adrcode, 0);
@@ -2661,19 +3270,43 @@ void autokeyframe_pose_cb_func(Object *ob, int tmode, short targetless_ik)
}
}
/* only insert keyframe if needed? */
- else if (U.uiflag & USER_KEYINSERTNEED) {
- if ((tmode==TFM_TRANSLATION) && (targetless_ik==0)) {
+ else if (IS_AUTOKEY_FLAG(INSERTNEEDED)) {
+ 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 ((tmode==TFM_ROTATION) || ((tmode==TFM_TRANSLATION) && targetless_ik)) {
+ 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 (tmode==TFM_RESIZE) {
+ 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);
@@ -2699,6 +3332,15 @@ void autokeyframe_pose_cb_func(Object *ob, int tmode, short targetless_ik)
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_recalculate_paths(ob);
+ }
}
else {
/* tag channels that should have unkeyed data */
@@ -2738,7 +3380,7 @@ void special_aftertrans_update(TransInfo *t)
if (t->spacetype==SPACE_VIEW3D)
EM_automerge(1);
- if(t->spacetype == SPACE_ACTION) {
+ if (t->spacetype == SPACE_ACTION) {
void *data;
short datatype;
@@ -2748,7 +3390,6 @@ void special_aftertrans_update(TransInfo *t)
ob = OBACT;
if (datatype == ACTCONT_ACTION) {
- /* Update the curve */
/* Depending on the lock status, draw necessary views */
if (ob) {
ob->ctime= -1234567.0f;
@@ -2759,8 +3400,16 @@ void special_aftertrans_update(TransInfo *t)
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
}
+ /* Do curve updates */
remake_action_ipos((bAction *)data);
+ /* Do curve cleanups? */
+ if ( (G.saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
+ (cancelled == 0) )
+ {
+ posttrans_action_clean((bAction *)data);
+ }
+
G.saction->flag &= ~SACTION_MOVING;
}
else if (datatype == ACTCONT_SHAPEKEY) {
@@ -2773,12 +3422,18 @@ void special_aftertrans_update(TransInfo *t)
sort_time_ipocurve(icu);
testhandles_ipocurve(icu);
}
+
+ if ( (G.saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
+ (cancelled == 0) )
+ {
+ posttrans_ipo_clean(key->ipo);
+ }
}
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
}
}
- else if(t->spacetype == SPACE_NLA) {
+ else if (t->spacetype == SPACE_NLA) {
synchronize_action_strips();
/* cleanup */
@@ -2787,35 +3442,35 @@ void special_aftertrans_update(TransInfo *t)
recalc_all_ipos(); // bad
}
- else if(t->spacetype == SPACE_IPO) {
+ 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)
+ 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;
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 */
@@ -2825,15 +3480,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 and unkeyed tagging - only if transform wasn't cancelled (or TFM_DUMMY) */
- if(!cancelled && (t->mode != 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()
@@ -2841,19 +3496,28 @@ 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;
+ else if((ob == OBACT) && modifiers_isClothEnabled(ob)) {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ if(clmd)
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
/* Set autokey if necessary */
if ((!cancelled) && (t->mode != TFM_DUMMY) && (base->flag & SELECT)) {
@@ -2867,7 +3531,7 @@ void special_aftertrans_update(TransInfo *t)
clear_trans_object_base_flags();
- if(redrawipo) {
+ if (redrawipo) {
allqueue(REDRAWNLA, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWIPO, 0);
@@ -2894,19 +3558,21 @@ static void createTransObject(TransInfo *t)
/* count */
for(base= FIRSTBASE; base; base= base->next) {
- if TESTBASELIB(base) {
+ if TESTBASE(base) {
ob= base->object;
/* store ipo keys? */
- if(ob->ipo && ob->ipo->showkey && (ob->ipoflag & OB_DRAWKEY)) {
+ if (ob->id.lib == 0 && ob->ipo && ob->ipo->showkey && (ob->ipoflag & OB_DRAWKEY)) {
elems.first= elems.last= NULL;
make_ipokey_transform(ob, &elems, 1); /* '1' only selected keys */
pushdata(&elems, sizeof(ListBase));
- for(ik= elems.first; ik; ik= ik->next) t->total++;
+ for(ik= elems.first; ik; ik= ik->next)
+ t->total++;
- if(elems.first==NULL) t->total++;
+ if(elems.first==NULL)
+ t->total++;
}
else {
t->total++;
@@ -2924,15 +3590,20 @@ static void createTransObject(TransInfo *t)
tx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "TransObExtension");
for(base= FIRSTBASE; base; base= base->next) {
- if TESTBASELIB(base) {
+ if TESTBASE(base) {
ob= base->object;
- td->flag= TD_SELECTED;
+ td->flag = TD_SELECTED;
td->protectflag= ob->protectflag;
td->ext = tx;
+
+ /* select linked objects, but skip them later */
+ if (ob->id.lib != 0) {
+ td->flag |= TD_SKIP;
+ }
/* store ipo keys? */
- if(ob->ipo && ob->ipo->showkey && (ob->ipoflag & OB_DRAWKEY)) {
+ if(ob->id.lib == 0 && ob->ipo && ob->ipo->showkey && (ob->ipoflag & OB_DRAWKEY)) {
popfirst(&elems); // bring back pushed listbase
@@ -2961,7 +3632,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;
@@ -2984,7 +3655,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++;
@@ -2992,7 +3663,7 @@ static void createTransObject(TransInfo *t)
}
}
else {
- ObjectToTransData(td, ob);
+ ObjectToTransData(t, td, ob);
td->tdi = NULL;
td->val = NULL;
td++;
@@ -3107,6 +3778,17 @@ void createTransData(TransInfo *t)
createTransPose(t, base->object);
}
}
+ else if (G.f & G_PARTICLEEDIT && PE_can_edit(PE_get_current(ob))) {
+ 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;
@@ -3120,3 +3802,5 @@ 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 744933088c8..1f6d8ecf7af 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"
@@ -59,6 +60,7 @@
#include "BIF_editmesh.h"
#include "BIF_editnla.h"
#include "BIF_editsima.h"
+#include "BIF_editparticle.h"
#include "BIF_meshtools.h"
#include "BIF_retopo.h"
@@ -72,6 +74,7 @@
#include "BKE_action.h"
#include "BKE_anim.h"
#include "BKE_armature.h"
+#include "BKE_cloth.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
@@ -154,6 +157,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;
@@ -166,28 +170,71 @@ 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);
+ }
+ }
+ }
+
}
}
}
@@ -205,6 +252,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) {
@@ -336,7 +385,7 @@ void recalcData(TransInfo *t)
if(t->state != TRANS_CANCEL)
clipMirrorModifier(t, G.obedit);
- if(G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR)
+ 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 */
@@ -419,14 +468,24 @@ void recalcData(TransInfo *t)
/* bah, softbody exception... recalcdata doesnt reset */
for(base= FIRSTBASE; base; base= base->next) {
if(base->object->recalc & OB_RECALC_DATA)
+ {
if(modifiers_isSoftbodyEnabled(base->object)) {
base->object->softflag |= OB_SB_REDO;
+ }
+ else if(modifiers_isClothEnabled(base->object)) {
+ ClothModifierData *clmd = (ClothModifierData *) modifiers_findByType(base->object, eModifierType_Cloth);
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
+
}
}
}
else
where_is_pose(ob);
}
+ else if(G.f & G_PARTICLEEDIT) {
+ flushTransParticles(t);
+ }
else {
for(base= FIRSTBASE; base; base= base->next) {
Object *ob= base->object;
@@ -453,10 +512,16 @@ void recalcData(TransInfo *t)
}
}
- /* softbody exception */
- if(modifiers_isSoftbodyEnabled(ob)) {
- if(ob->recalc & OB_RECALC_DATA)
- ob->softflag |= OB_SB_REDO;
+ /* softbody & cloth exception */
+ if(ob->recalc & OB_RECALC_DATA)
+ {
+ if(modifiers_isSoftbodyEnabled(ob)) {
+ ob->softflag |= OB_SB_REDO;
+ }
+ else if(modifiers_isClothEnabled(ob)) {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
}
/* proxy exception */
@@ -520,6 +585,7 @@ 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;
@@ -667,7 +733,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);
}
@@ -782,7 +848,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 {
/*
@@ -807,7 +874,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 {
/*
diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c
index 8035cbb7d76..13a8552b844 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++;
}
}
@@ -333,7 +340,7 @@ int calc_manipulator_stats(ScrArea *sa)
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- if(bp->f1 & 1) {
+ if(bp->f1 & SELECT) {
calc_tw_center(bp->vec);
totsel++;
}
@@ -381,7 +388,7 @@ int calc_manipulator_stats(ScrArea *sa)
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
while(a--) {
- if(bp->f1 & 1) {
+ if(bp->f1 & SELECT) {
calc_tw_center(bp->vec);
totsel++;
}
@@ -430,6 +437,27 @@ int calc_manipulator_stats(ScrArea *sa)
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 */
@@ -503,6 +531,9 @@ int calc_manipulator_stats(ScrArea *sa)
Mat4CpyMat3(v3d->twmat, mat);
}
break;
+ default: /* V3D_MANIP_CUSTOM */
+ applyTransformOrientation();
+ break;
}
}
diff --git a/source/blender/src/transform_snap.c b/source/blender/src/transform_snap.c
index d62d49c2de8..2a92629e4c9 100644
--- a/source/blender/src/transform_snap.c
+++ b/source/blender/src/transform_snap.c
@@ -78,6 +78,7 @@ void setSnappingCallback(TransInfo *t);
void ApplySnapTranslation(TransInfo *t, float vec[3]);
void ApplySnapRotation(TransInfo *t, float *vec);
+void ApplySnapResize(TransInfo *t, float *vec);
void CalcSnapGrid(TransInfo *t, float *vec);
void CalcSnapGeometry(TransInfo *t, float *vec);
@@ -85,15 +86,31 @@ void CalcSnapGeometry(TransInfo *t, float *vec);
void TargetSnapMedian(TransInfo *t);
void TargetSnapCenter(TransInfo *t);
void TargetSnapClosest(TransInfo *t);
+void TargetSnapActive(TransInfo *t);
float RotationBetween(TransInfo *t, float p1[3], float p2[3]);
float TranslationBetween(TransInfo *t, float p1[3], float p2[3]);
+float ResizeBetween(TransInfo *t, float p1[3], float p2[3]);
-// Trickery
-int findNearestVertFromObjects(int *dist, float *loc);
+/* Modes */
+#define NOT_SELECTED 0
+#define NOT_ACTIVE 1
+int findNearestVertFromObjects(int *dist, float *loc, int mode);
/****************** IMPLEMENTATIONS *********************/
+int BIF_snappingSupported(void)
+{
+ int status = 0;
+
+ if (G.obedit == NULL || G.obedit->type==OB_MESH) /* only support object or mesh */
+ {
+ status = 1;
+ }
+
+ return status;
+}
+
void drawSnapping(TransInfo *t)
{
if ((t->tsnap.status & (SNAP_ON|POINT_INIT|TARGET_INIT)) == (SNAP_ON|POINT_INIT|TARGET_INIT) &&
@@ -168,7 +185,13 @@ int handleSnapping(TransInfo *t, int event)
{
int status = 0;
- // Put keyhandling code here
+ if (BIF_snappingSupported() && event == TABKEY && (G.qual & LR_SHIFTKEY) == LR_SHIFTKEY)
+ {
+ /* toggle snap and reinit */
+ G.scene->snap_flag ^= SCE_SNAP;
+ initSnapping(t);
+ status = 1;
+ }
return status;
}
@@ -211,10 +234,19 @@ void initSnapping(TransInfo *t)
if (t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) { // Only 3D view or UV
setSnappingCallback(t);
+ /* Edit mode */
if (t->tsnap.applySnap != NULL && // A snapping function actually exist
+ (G.scene->snap_flag & SCE_SNAP) && // Only if the snap flag is on
(G.obedit != NULL && G.obedit->type==OB_MESH) && // Temporary limited to edit mode meshes
+ ((t->flag & T_PROP_EDIT) == 0) ) // No PET, obviously
+ {
+ t->tsnap.status |= SNAP_ON;
+ t->tsnap.modePoint = SNAP_GEO;
+ }
+ /* Object mode */
+ else if (t->tsnap.applySnap != NULL && // A snapping function actually exist
(G.scene->snap_flag & SCE_SNAP) && // Only if the snap flag is on
- (t->flag & T_PROP_EDIT) == 0) // No PET, obviously
+ (G.obedit == NULL) ) // Object Mode
{
t->tsnap.status |= SNAP_ON;
t->tsnap.modePoint = SNAP_GEO;
@@ -250,6 +282,11 @@ void setSnappingCallback(TransInfo *t)
t->tsnap.modeTarget = SNAP_MEDIAN;
t->tsnap.targetSnap = TargetSnapMedian;
break;
+ case SCE_SNAP_TARGET_ACTIVE:
+ t->tsnap.modeTarget = SNAP_ACTIVE;
+ t->tsnap.targetSnap = TargetSnapActive;
+ break;
+
}
switch (t->mode)
@@ -268,6 +305,16 @@ void setSnappingCallback(TransInfo *t)
t->tsnap.targetSnap = TargetSnapMedian;
}
break;
+ case TFM_RESIZE:
+ t->tsnap.applySnap = ApplySnapResize;
+ t->tsnap.distance = ResizeBetween;
+
+ // Can't do TARGET_CENTER with resize, use TARGET_MEDIAN instead
+ if (G.scene->snap_target == SCE_SNAP_TARGET_CENTER) {
+ t->tsnap.modeTarget = SNAP_MEDIAN;
+ t->tsnap.targetSnap = TargetSnapMedian;
+ }
+ break;
default:
t->tsnap.applySnap = NULL;
break;
@@ -291,6 +338,15 @@ void ApplySnapRotation(TransInfo *t, float *vec)
}
}
+void ApplySnapResize(TransInfo *t, float vec[3])
+{
+ if (t->tsnap.modeTarget == SNAP_CLOSEST) {
+ vec[0] = vec[1] = vec[2] = t->tsnap.dist;
+ }
+ else {
+ vec[0] = vec[1] = vec[2] = ResizeBetween(t, t->tsnap.snapTarget, t->tsnap.snapPoint);
+ }
+}
/********************** DISTANCE **************************/
@@ -355,6 +411,27 @@ float RotationBetween(TransInfo *t, float p1[3], float p2[3])
return angle;
}
+float ResizeBetween(TransInfo *t, float p1[3], float p2[3])
+{
+ float d1[3], d2[3], center[3];
+
+ VECCOPY(center, t->center);
+ if(t->flag & (T_EDIT|T_POSE)) {
+ Object *ob= G.obedit?G.obedit:t->poseobj;
+ Mat4MulVecfl(ob->obmat, center);
+ }
+
+ VecSubf(d1, p1, center);
+ VecSubf(d2, p2, center);
+
+ if (t->con.applyRot != NULL && (t->con.mode & CON_APPLY)) {
+ Mat3MulVecfl(t->con.pmtx, d1);
+ Mat3MulVecfl(t->con.pmtx, d2);
+ }
+
+ return VecLength(d2) / VecLength(d1);
+}
+
/********************** CALC **************************/
void CalcSnapGrid(TransInfo *t, float *vec)
@@ -364,7 +441,30 @@ void CalcSnapGrid(TransInfo *t, float *vec)
void CalcSnapGeometry(TransInfo *t, float *vec)
{
- if (G.obedit != NULL && G.obedit->type==OB_MESH)
+ /* Object mode */
+ if (G.obedit == NULL)
+ {
+ if (t->spacetype == SPACE_VIEW3D)
+ {
+ float vec[3];
+ int found = 0;
+ int dist = 40; // Use a user defined value here
+
+ found = findNearestVertFromObjects(&dist, vec, NOT_SELECTED);
+ if (found == 1)
+ {
+ VECCOPY(t->tsnap.snapPoint, vec);
+
+ t->tsnap.status |= POINT_INIT;
+ }
+ else
+ {
+ t->tsnap.status &= ~POINT_INIT;
+ }
+ }
+ }
+ /* Mesh edit mode */
+ else if (G.obedit != NULL && G.obedit->type==OB_MESH)
{
/*if (G.scene->selectmode & B_SEL_VERT)*/
@@ -378,7 +478,7 @@ void CalcSnapGeometry(TransInfo *t, float *vec)
// use findnearestverts in vert mode, others in other modes
nearest = findnearestvert(&dist, SELECT, 1);
- found = findNearestVertFromObjects(&dist, vec);
+ found = findNearestVertFromObjects(&dist, vec, NOT_ACTIVE);
if (found == 1)
{
VECCOPY(t->tsnap.snapPoint, vec);
@@ -465,20 +565,60 @@ void TargetSnapCenter(TransInfo *t)
}
}
+void TargetSnapActive(TransInfo *t)
+{
+ // Only need to calculate once
+ if ((t->tsnap.status & TARGET_INIT) == 0)
+ {
+ TransData *td = NULL;
+ TransData *active_td = NULL;
+ int i;
+
+ for(td = t->data, i = 0 ; i < t->total && td->flag & TD_SELECTED ; i++, td++)
+ {
+ if (td->flag & TD_ACTIVE)
+ {
+ active_td = td;
+ break;
+ }
+ }
+
+ if (active_td)
+ {
+ VECCOPY(t->tsnap.snapTarget, active_td->center);
+
+ if(t->flag & (T_EDIT|T_POSE)) {
+ Object *ob= G.obedit?G.obedit:t->poseobj;
+ Mat4MulVecfl(ob->obmat, t->tsnap.snapTarget);
+ }
+
+ t->tsnap.status |= TARGET_INIT;
+ }
+ /* No active, default to median */
+ else
+ {
+ t->tsnap.modeTarget = SNAP_MEDIAN;
+ t->tsnap.targetSnap = TargetSnapMedian;
+ TargetSnapMedian(t);
+ }
+ }
+}
+
void TargetSnapMedian(TransInfo *t)
{
// Only need to calculate once
if ((t->tsnap.status & TARGET_INIT) == 0)
{
TransData *td = NULL;
+ int i;
t->tsnap.snapTarget[0] = 0;
t->tsnap.snapTarget[1] = 0;
t->tsnap.snapTarget[2] = 0;
- for (td = t->data; td != NULL && td->flag & TD_SELECTED ; td++)
+ for(td = t->data, i = 0 ; i < t->total && td->flag & TD_SELECTED ; i++, td++)
{
- VecAddf(t->tsnap.snapTarget, t->tsnap.snapTarget, td->iloc);
+ VecAddf(t->tsnap.snapTarget, t->tsnap.snapTarget, td->center);
}
VecMulf(t->tsnap.snapTarget, 1.0 / t->total);
@@ -499,27 +639,64 @@ void TargetSnapClosest(TransInfo *t)
{
TransData *closest = NULL, *td = NULL;
- // Base case, only one selected item
- if (t->total == 1)
+ /* Object mode */
+ if (t->flag & T_OBJECT)
{
- VECCOPY(t->tsnap.snapTarget, t->data[0].iloc);
-
- if(t->flag & (T_EDIT|T_POSE)) {
- Object *ob= G.obedit?G.obedit:t->poseobj;
- Mat4MulVecfl(ob->obmat, t->tsnap.snapTarget);
+ int i;
+ for(td = t->data, i = 0 ; i < t->total && td->flag & TD_SELECTED ; i++, td++)
+ {
+ struct BoundBox *bb = object_get_boundbox(td->ob);
+
+ /* use boundbox if possible */
+ if (bb)
+ {
+ int j;
+
+ for (j = 0; j < 8; j++) {
+ float loc[3];
+ float dist;
+
+ VECCOPY(loc, bb->vec[j]);
+ Mat4MulVecfl(td->ext->obmat, loc);
+
+ dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
+
+ if (closest == NULL || fabs(dist) < fabs(t->tsnap.dist))
+ {
+ VECCOPY(t->tsnap.snapTarget, loc);
+ closest = td;
+ t->tsnap.dist = dist;
+ }
+ }
+ }
+ /* use element center otherwise */
+ else
+ {
+ float loc[3];
+ float dist;
+
+ VECCOPY(loc, td->center);
+
+ dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
+
+ if (closest == NULL || fabs(dist) < fabs(t->tsnap.dist))
+ {
+ VECCOPY(t->tsnap.snapTarget, loc);
+ closest = td;
+ t->tsnap.dist = dist;
+ }
+ }
}
-
- t->tsnap.dist = t->tsnap.distance(t, t->tsnap.snapTarget, t->tsnap.snapPoint);
}
- // More than one selected item
else
- {
- for (td = t->data; td != NULL && td->flag & TD_SELECTED ; td++)
+ {
+ int i;
+ for(td = t->data, i = 0 ; i < t->total && td->flag & TD_SELECTED ; i++, td++)
{
float loc[3];
float dist;
- VECCOPY(loc, td->iloc);
+ VECCOPY(loc, td->center);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= G.obedit?G.obedit:t->poseobj;
@@ -542,7 +719,7 @@ void TargetSnapClosest(TransInfo *t)
}
/*================================================================*/
-int findNearestVertFromObjects(int *dist, float *loc) {
+int findNearestVertFromObjects(int *dist, float *loc, int mode) {
Base *base;
int retval = 0;
short mval[2];
@@ -551,7 +728,7 @@ int findNearestVertFromObjects(int *dist, float *loc) {
base= FIRSTBASE;
for ( base = FIRSTBASE; base != NULL; base = base->next ) {
- if ( TESTBASE(base) && base != BASACT ) {
+ if ( BASE_SELECTABLE(base) && ((mode == NOT_SELECTED && (base->flag & SELECT) == 0) || (mode == NOT_ACTIVE && base != BASACT)) ) {
Object *ob = base->object;
if (ob->type == OB_MESH) {
diff --git a/source/blender/src/unwrapper.c b/source/blender/src/unwrapper.c
index bca7e44ed72..5cf5f3dc70b 100644
--- a/source/blender/src/unwrapper.c
+++ b/source/blender/src/unwrapper.c
@@ -221,10 +221,10 @@ ParamHandle *construct_param_handle(EditMesh *em, short implicit, short fill, sh
tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (implicit &&
- !( SIMA_UVSEL_CHECK(efa, tf, 0) ||
- SIMA_UVSEL_CHECK(efa, tf, 1) ||
- SIMA_UVSEL_CHECK(efa, tf, 2) ||
- (efa->v4 && SIMA_UVSEL_CHECK(efa, tf, 3)) )
+ !( simaUVSel_Check(efa, tf, 0) ||
+ simaUVSel_Check(efa, tf, 1) ||
+ simaUVSel_Check(efa, tf, 2) ||
+ (efa->v4 && simaUVSel_Check(efa, tf, 3)) )
) {
continue;
}
@@ -246,16 +246,16 @@ ParamHandle *construct_param_handle(EditMesh *em, short implicit, short fill, sh
pin[1] = ((tf->unwrap & TF_PIN2) != 0);
pin[2] = ((tf->unwrap & TF_PIN3) != 0);
- select[0] = ((SIMA_UVSEL_CHECK(efa, tf, 0)) != 0);
- select[1] = ((SIMA_UVSEL_CHECK(efa, tf, 1)) != 0);
- select[2] = ((SIMA_UVSEL_CHECK(efa, tf, 2)) != 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 (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] = (SIMA_UVSEL_CHECK(efa, tf, 3) != 0);
+ select[3] = (simaUVSel_Check(efa, tf, 3) != 0);
nverts = 4;
}
else
@@ -304,7 +304,7 @@ void unwrap_lscm(short seamcut)
MTFace *tf;
for(efa=em->faces.first; efa; efa=efa->next) {
tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- SIMA_FACESEL_SET(efa, tf);
+ simaFaceSel_Set(efa, tf);
}
}
}
diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c
index 8b6cd987cf8..86c2d0c0f68 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
@@ -192,6 +194,19 @@ 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 */
+
+ /* Auto-keyframing settings */
+ if(U.autokey_mode == 0) {
+ /* AUTOKEY_MODE_NORMAL - AUTOKEY_ON = x <==> 3 - 1 = 2 */
+ U.autokey_mode |= 2;
+
+ if(U.flag & (1<<15)) U.autokey_flag |= AUTOKEY_FLAG_INSERTAVAIL;
+ if(U.flag & (1<<19)) U.autokey_flag |= AUTOKEY_FLAG_INSERTNEEDED;
+ if(G.flags & (1<<30)) U.autokey_flag |= AUTOKEY_FLAG_AUTOMATKEY;
+ }
+
if (G.main->versionfile <= 191) {
strcpy(U.plugtexdir, U.textudir);
strcpy(U.sounddir, "/");
@@ -365,6 +380,94 @@ static void init_userdef_file(void)
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);
+ }
+ if ((G.main->versionfile < 245) || (G.main->versionfile == 245 && G.main->subversionfile < 11)) {
+ bTheme *btheme;
+ for (btheme= U.themes.first; btheme; btheme= btheme->next) {
+ /* these should all use the same colour */
+ SETCOL(btheme->tv3d.cframe, 0x60, 0xc0, 0x40, 255);
+ SETCOL(btheme->tipo.cframe, 0x60, 0xc0, 0x40, 255);
+ SETCOL(btheme->tact.cframe, 0x60, 0xc0, 0x40, 255);
+ SETCOL(btheme->tnla.cframe, 0x60, 0xc0, 0x40, 255);
+ SETCOL(btheme->tseq.cframe, 0x60, 0xc0, 0x40, 255);
+ SETCOL(btheme->tsnd.cframe, 0x60, 0xc0, 0x40, 255);
+ SETCOL(btheme->ttime.cframe, 0x60, 0xc0, 0x40, 255);
+ }
+ }
+ if ((G.main->versionfile < 245) || (G.main->versionfile == 245 && G.main->subversionfile < 13)) {
+ bTheme *btheme;
+ for (btheme= U.themes.first; btheme; btheme= btheme->next) {
+ /* action channel groups (recolour anyway) */
+ SETCOL(btheme->tact.group, 0x39, 0x7d, 0x1b, 255);
+ SETCOL(btheme->tact.group_active, 0x7d, 0xe9, 0x60, 255);
+
+ /* bone custom-color sets */
+ // FIXME: this check for initialised colors is bad
+ if (btheme->tarm[0].solid[3] == 0) {
+ /* set 1 */
+ SETCOL(btheme->tarm[0].solid, 0x9a, 0x00, 0x00, 255);
+ SETCOL(btheme->tarm[0].select, 0xbd, 0x11, 0x11, 255);
+ SETCOL(btheme->tarm[0].active, 0xf7, 0x0a, 0x0a, 255);
+ /* set 2 */
+ SETCOL(btheme->tarm[1].solid, 0xf7, 0x40, 0x18, 255);
+ SETCOL(btheme->tarm[1].select, 0xf6, 0x69, 0x13, 255);
+ SETCOL(btheme->tarm[1].active, 0xfa, 0x99, 0x00, 255);
+ /* set 3 */
+ SETCOL(btheme->tarm[2].solid, 0x1e, 0x91, 0x09, 255);
+ SETCOL(btheme->tarm[2].select, 0x59, 0xb7, 0x0b, 255);
+ SETCOL(btheme->tarm[2].active, 0x83, 0xef, 0x1d, 255);
+ /* set 4 */
+ SETCOL(btheme->tarm[3].solid, 0x0a, 0x36, 0x94, 255);
+ SETCOL(btheme->tarm[3].select, 0x36, 0x67, 0xdf, 255);
+ SETCOL(btheme->tarm[3].active, 0x5e, 0xc1, 0xef, 255);
+ /* set 5 */
+ SETCOL(btheme->tarm[4].solid, 0xa9, 0x29, 0x4e, 255);
+ SETCOL(btheme->tarm[4].select, 0xc1, 0x41, 0x6a, 255);
+ SETCOL(btheme->tarm[4].active, 0xf0, 0x5d, 0x91, 255);
+ /* set 6 */
+ SETCOL(btheme->tarm[5].solid, 0x43, 0x0c, 0x78, 255);
+ SETCOL(btheme->tarm[5].select, 0x54, 0x3a, 0xa3, 255);
+ SETCOL(btheme->tarm[5].active, 0x87, 0x64, 0xd5, 255);
+ /* set 7 */
+ SETCOL(btheme->tarm[6].solid, 0x24, 0x78, 0x5a, 255);
+ SETCOL(btheme->tarm[6].select, 0x3c, 0x95, 0x79, 255);
+ SETCOL(btheme->tarm[6].active, 0x6f, 0xb6, 0xab, 255);
+ /* set 8 */
+ SETCOL(btheme->tarm[7].solid, 0x4b, 0x70, 0x7c, 255);
+ SETCOL(btheme->tarm[7].select, 0x6a, 0x86, 0x91, 255);
+ SETCOL(btheme->tarm[7].active, 0x9b, 0xc2, 0xcd, 255);
+ /* set 9 */
+ SETCOL(btheme->tarm[8].solid, 0xf4, 0xc9, 0x0c, 255);
+ SETCOL(btheme->tarm[8].select, 0xee, 0xc2, 0x36, 255);
+ SETCOL(btheme->tarm[8].active, 0xf3, 0xff, 0x00, 255);
+ /* set 10 */
+ SETCOL(btheme->tarm[9].solid, 0x1e, 0x20, 0x24, 255);
+ SETCOL(btheme->tarm[9].select, 0x48, 0x4c, 0x56, 255);
+ SETCOL(btheme->tarm[9].active, 0xff, 0xff, 0xff, 255);
+ /* set 11 */
+ SETCOL(btheme->tarm[10].solid, 0x6f, 0x2f, 0x6a, 255);
+ SETCOL(btheme->tarm[10].select, 0x98, 0x45, 0xbe, 255);
+ SETCOL(btheme->tarm[10].active, 0xd3, 0x30, 0xd6, 255);
+ /* set 12 */
+ SETCOL(btheme->tarm[11].solid, 0x6c, 0x8e, 0x22, 255);
+ SETCOL(btheme->tarm[11].select, 0x7f, 0xb0, 0x22, 255);
+ SETCOL(btheme->tarm[11].active, 0xbb, 0xef, 0x5b, 255);
+ /* set 13 */
+ SETCOL(btheme->tarm[12].solid, 0x8d, 0x8d, 0x8d, 255);
+ SETCOL(btheme->tarm[12].select, 0xb0, 0xb0, 0xb0, 255);
+ SETCOL(btheme->tarm[12].active, 0xde, 0xde, 0xde, 255);
+ /* set 14 */
+ SETCOL(btheme->tarm[13].solid, 0x83, 0x43, 0x26, 255);
+ SETCOL(btheme->tarm[13].select, 0x8b, 0x58, 0x11, 255);
+ SETCOL(btheme->tarm[13].active, 0xbd, 0x6a, 0x11, 255);
+ /* set 15 */
+ SETCOL(btheme->tarm[14].solid, 0x08, 0x31, 0x0e, 255);
+ SETCOL(btheme->tarm[14].select, 0x1c, 0x43, 0x0b, 255);
+ SETCOL(btheme->tarm[14].active, 0x34, 0x62, 0x2b, 255);
+ }
+ }
}
/* GL Texture Garbage Collection (variable abused above!) */
@@ -451,7 +554,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();
@@ -650,6 +753,9 @@ static void readBlog(void)
fsmenu_append_separator();
}
+#else
+ /* add home dir on linux systems */
+ fsmenu_insert_entry(BLI_gethome(), 0, 0);
#endif
BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
diff --git a/source/blender/src/verse_object.c b/source/blender/src/verse_object.c
index fc937469d42..107aae59845 100644
--- a/source/blender/src/verse_object.c
+++ b/source/blender/src/verse_object.c
@@ -295,6 +295,7 @@ void b_verse_pop_node(VNode *vnode)
vbitmap->height,
vnode->name,
0,
+ 0,
color);
((Image*)vbitmap->image)->vnode = (void*)vnode;
sync_blender_image_with_verse_bitmap_node(vnode);
diff --git a/source/blender/src/view.c b/source/blender/src/view.c
index 4ddd6d71dea..abb49c0ec9d 100644
--- a/source/blender/src/view.c
+++ b/source/blender/src/view.c
@@ -66,13 +66,16 @@
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_object.h"
+#include "BKE_sculpt.h"
#include "BKE_utildefines.h"
+#include "BIF_transform.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"
@@ -86,6 +89,7 @@
#include "mydevice.h"
#include "blendef.h"
+#include "transform.h"
#include "PIL_time.h" /* smoothview */
@@ -1080,18 +1084,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);
@@ -1306,8 +1302,7 @@ void initlocalview()
if(G.vd->localvd) return;
- min[0]= min[1]= min[2]= 1.0e10;
- max[0]= max[1]= max[2]= -1.0e10;
+ INIT_MINMAX(min, max);
locallay= free_localbit();
@@ -1402,9 +1397,7 @@ void centerview() /* like a localview without local! */
float new_ofs[3];
float new_dist;
-
- min[0]= min[1]= min[2]= 1.0e10;
- max[0]= max[1]= max[2]= -1.0e10;
+ INIT_MINMAX(min, max);
if (G.f & G_WEIGHTPAINT) {
/* hardcoded exception, we look for the one selected armature */
@@ -1449,6 +1442,9 @@ void centerview() /* like a localview without local! */
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) {
@@ -1580,8 +1576,7 @@ void view3d_home(int center)
max[0]= max[1]= max[2]= 0.0;
}
else {
- min[0]= min[1]= min[2]= 1.0e10;
- max[0]= max[1]= max[2]= -1.0e10;
+ INIT_MINMAX(min, max);
}
for(base= FIRSTBASE; base; base= base->next) {
diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c
index 2f82cd2e2b2..c5bc84a513e 100644
--- a/source/blender/src/vpaint.c
+++ b/source/blender/src/vpaint.c
@@ -51,6 +51,7 @@
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_brush_types.h"
+#include "DNA_cloth_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
@@ -64,6 +65,7 @@
#include "BKE_armature.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_cloth.h"
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_deform.h"
@@ -71,6 +73,7 @@
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_multires.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
@@ -103,14 +106,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)
{
@@ -700,7 +703,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);
@@ -714,7 +717,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);
@@ -745,7 +748,7 @@ static int sample_backbuf_area(VPaint *vp, int *indexar, int totface, int x, int
struct ImBuf *ibuf;
int x1, y1, x2, y2, a, tot=0, index;
- if(totface>=MAXINDEX) return 0;
+ if(totface+4>=MAXINDEX) return 0;
if(size>64.0) size= 64.0;
@@ -775,7 +778,7 @@ static int sample_backbuf_area(VPaint *vp, int *indexar, int totface, int x, int
size= (y2-y1)*(x2-x1);
if(size<=0) return 0;
- memset(indexar, 0, sizeof(int)*totface+2); /* plus 2! first element is total */
+ memset(indexar, 0, sizeof(int)*totface+4); /* plus 2! first element is total, +2 was giving valgrind errors, +4 seems ok */
while(size--) {
@@ -841,7 +844,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;
@@ -864,7 +867,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;
@@ -1234,7 +1237,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;
@@ -1248,7 +1251,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)
@@ -1268,7 +1271,7 @@ void weight_paint(void)
}
}
- if(Gwp.mode==VP_FILT)
+ if(Gwp.mode==VP_BLUR)
paintweight/= (float)totw;
for(index=0; index<totindex; index++) {
@@ -1346,6 +1349,13 @@ void weight_paint(void)
/* this flag is event for softbody to refresh weightpaint values */
if(ob->soft) ob->softflag |= OB_SB_REDO;
+ // same goes for cloth
+ if(modifiers_isClothEnabled(ob)) {
+ ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
+ if(clmd)
+ clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_RESET;
+ }
+
BIF_undo_push("Weight Paint");
allqueue(REDRAWVIEW3D, 0);
}
@@ -1452,7 +1462,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 cb3d4158ec1..50d69fcdc76 100644
--- a/source/blender/src/writeimage.c
+++ b/source/blender/src/writeimage.c
@@ -148,6 +148,7 @@ void save_image_filesel_str(char *str)
case R_RADHDR:
strcpy(str, "Save Radiance HDR");
break;
+ case R_FFMPEG:
case R_PNG:
strcpy(str, "Save PNG");
break;
diff --git a/source/blender/yafray/YafRay_Api.h b/source/blender/yafray/YafRay_Api.h
index 8c47a79837f..a05e9752a1a 100644
--- a/source/blender/yafray/YafRay_Api.h
+++ b/source/blender/yafray/YafRay_Api.h
@@ -8,8 +8,6 @@ extern "C" {
void YAF_switchPlugin();
void YAF_switchFile();
int YAF_exportScene(Render* re);
- void YAF_addDupliMtx(Object* obj);
- int YAF_objectKnownData(Object* obj);
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/yafray/intern/api.cpp b/source/blender/yafray/intern/api.cpp
index f59c5e1f73e..0cb1c6fafdf 100644
--- a/source/blender/yafray/intern/api.cpp
+++ b/source/blender/yafray/intern/api.cpp
@@ -11,6 +11,4 @@ extern "C"
void YAF_switchPlugin() { YAFBLEND = &byplugin; }
void YAF_switchFile() { YAFBLEND = &byfile; }
int YAF_exportScene(Render* re) { return (int)YAFBLEND->exportScene(re); }
- void YAF_addDupliMtx(Object* obj) { YAFBLEND->addDupliMtx(obj); }
- int YAF_objectKnownData(Object* obj) { return (int)YAFBLEND->objectKnownData(obj); }
}
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
index c8c0b3c6bb1..73b30105b27 100644
--- a/source/blender/yafray/intern/export_File.cpp
+++ b/source/blender/yafray/intern/export_File.cpp
@@ -1188,7 +1188,7 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
}
-void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_list, const float obmat[4][4])
+void yafrayFileRender_t::writeObject(Object* obj, ObjectRen *obr, const vector<VlakRen*> &VLR_list, const float obmat[4][4])
{
ostr.str("");
// transform first (not necessarily actual obj->obmat, can be duplivert see below)
@@ -1230,7 +1230,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
string matname(face0mat->id.name);
// use name in imgtex_shader list if 'TexFace' enabled for this material
if (face0mat->mode & MA_FACETEXTURE) {
- MTFace* tface = RE_vlakren_get_tface(re, face0, 0, NULL, 0);
+ MTFace* tface = RE_vlakren_get_tface(obr, face0, obr->actmtface, NULL, 0);
if (tface) {
Image* fimg = (Image*)tface->tpage;
if (fimg) matname = imgtex_shader[string(face0mat->id.name) + string(fimg->id.name)];
@@ -1412,7 +1412,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
string fmatname(fmat->id.name);
// use name in imgtex_shader list if 'TexFace' enabled for this face material
if (fmat->mode & MA_FACETEXTURE) {
- MTFace* tface = RE_vlakren_get_tface(re, vlr, 0, NULL, 0);
+ MTFace* tface = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
if (tface) {
Image* fimg = (Image*)tface->tpage;
if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)];
@@ -1437,14 +1437,14 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
}
else if (vlr->flag & R_FACE_SPLIT) { ui2++; ui3++; }
- MTFace* uvc = RE_vlakren_get_tface(re, vlr, 0, NULL, 0); // possible uvcoords (v upside down)
+ MTFace* uvc = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0); // possible uvcoords (v upside down)
if (uvc) {
ostr << " u_a=\"" << uvc->uv[ui1][0] << "\" v_a=\"" << 1-uvc->uv[ui1][1] << "\""
<< " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
<< " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
}
- MCol *mcol= RE_vlakren_get_mcol(re, vlr, 0, NULL, 0);
+ MCol *mcol= RE_vlakren_get_mcol(obr, vlr, obr->actmcol, NULL, 0);
// since Blender seems to need vcols when uvs are used, for yafray only export when the material actually uses vcols
if ((EXPORT_VCOL) && mcol) {
@@ -1508,13 +1508,13 @@ void yafrayFileRender_t::writeAllObjects()
{
// first all objects except dupliverts (and main instance object for dups)
- for (map<Object*, vector<VlakRen*> >::const_iterator obi=all_objects.begin();
+ for (map<Object*, yafrayObjectRen >::const_iterator obi=all_objects.begin();
obi!=all_objects.end(); ++obi)
{
// skip main duplivert object if in dupliMtx_list, written later
Object* obj = obi->first;
if (dupliMtx_list.find(string(obj->id.name))!=dupliMtx_list.end()) continue;
- writeObject(obj, obi->second, obj->obmat);
+ writeObject(obj, obi->second.obr, obi->second.faces, obj->obmat);
}
// Now all duplivert objects (if any) as instances of main object
@@ -1534,7 +1534,7 @@ void yafrayFileRender_t::writeAllObjects()
// first object written as normal (but with transform of first duplivert)
Object* obj = dup_srcob[dupMtx->first];
- writeObject(obj, all_objects[obj], obmat);
+ writeObject(obj, all_objects[obj].obr, all_objects[obj].faces, obmat);
// all others instances of first
for (unsigned int curmtx=16;curmtx<dupMtx->second.size();curmtx+=16) { // number of 4x4 matrices
diff --git a/source/blender/yafray/intern/export_File.h b/source/blender/yafray/intern/export_File.h
index 5d2e0c53a21..0eb1bfec1ed 100644
--- a/source/blender/yafray/intern/export_File.h
+++ b/source/blender/yafray/intern/export_File.h
@@ -18,7 +18,7 @@ class yafrayFileRender_t : public yafrayRender_t
virtual void writeTextures();
virtual void writeShader(const std::string &shader_name, Material* matr, const std::string &facetexname="");
virtual void writeMaterialsAndModulators();
- virtual void writeObject(Object* obj, const std::vector<VlakRen*> &VLR_list, const float obmat[4][4]);
+ virtual void writeObject(Object* obj, ObjectRen *obr, const std::vector<VlakRen*> &VLR_list, const float obmat[4][4]);
virtual void writeAllObjects();
virtual void writeAreaLamp(LampRen* lamp, int num, float iview[4][4]);
virtual void writeLamps();
diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp
index 6a6137fefe9..c8d20180f8c 100644
--- a/source/blender/yafray/intern/export_Plugin.cpp
+++ b/source/blender/yafray/intern/export_Plugin.cpp
@@ -1079,7 +1079,7 @@ void yafrayPluginRender_t::writeMaterialsAndModulators()
}
-void yafrayPluginRender_t::genUVcoords(vector<yafray::GFLOAT> &uvcoords, VlakRen *vlr, MTFace* uvc, bool comple)
+void yafrayPluginRender_t::genUVcoords(vector<yafray::GFLOAT> &uvcoords, ObjectRen *obr, VlakRen *vlr, MTFace* uvc, bool comple)
{
if (uvc)
{
@@ -1107,9 +1107,9 @@ void yafrayPluginRender_t::genUVcoords(vector<yafray::GFLOAT> &uvcoords, VlakRen
}
}
-void yafrayPluginRender_t::genVcol(vector<yafray::CFLOAT> &vcol, VlakRen *vlr, bool comple)
+void yafrayPluginRender_t::genVcol(vector<yafray::CFLOAT> &vcol, ObjectRen *obr, VlakRen *vlr, bool comple)
{
- MCol *mcol= RE_vlakren_get_mcol(re, vlr, 0, NULL, 0);
+ MCol *mcol= RE_vlakren_get_mcol(obr, vlr, obr->actmcol, NULL, 0);
if (mcol)
{
@@ -1142,7 +1142,7 @@ void yafrayPluginRender_t::genVcol(vector<yafray::CFLOAT> &vcol, VlakRen *vlr, b
void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,vector<int> &faceshader,
vector<yafray::GFLOAT> &uvcoords,vector<yafray::CFLOAT> &vcol,
- map<VertRen*, int> &vert_idx,VlakRen *vlr,
+ map<VertRen*, int> &vert_idx,ObjectRen *obr,VlakRen *vlr,
int has_orco,bool has_uv)
{
Material* fmat = vlr->mat;
@@ -1150,7 +1150,7 @@ void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,ve
string fmatname(fmat->id.name);
// use name in imgtex_shader list if 'TexFace' enabled for this face material
if (fmat->mode & MA_FACETEXTURE) {
- MTFace* tface = RE_vlakren_get_tface(re, vlr, 0, NULL, 0);
+ MTFace* tface = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
if (tface) {
Image* fimg = (Image*)tface->tpage;
if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)];
@@ -1171,7 +1171,7 @@ void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,ve
faceshader.push_back(shaders.size()-1);
}
- MTFace* uvc = RE_vlakren_get_tface(re, vlr, 0, NULL, 0); // possible uvcoords (v upside down)
+ MTFace* uvc = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0); // possible uvcoords (v upside down)
int idx1, idx2, idx3;
idx1 = vert_idx.find(vlr->v1)->second;
@@ -1183,20 +1183,20 @@ void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,ve
faces.push_back(idx1); faces.push_back(idx2); faces.push_back(idx3);
- if(has_uv) genUVcoords(uvcoords, vlr, uvc);
- if (EXPORT_VCOL) genVcol(vcol, vlr);
+ if(has_uv) genUVcoords(uvcoords, obr, vlr, uvc);
+ if (EXPORT_VCOL) genVcol(vcol, obr, vlr);
}
void yafrayPluginRender_t::genCompleFace(vector<int> &faces,/*vector<string> &shaders,*/vector<int> &faceshader,
vector<yafray::GFLOAT> &uvcoords,vector<yafray::CFLOAT> &vcol,
- map<VertRen*, int> &vert_idx,VlakRen *vlr,
+ map<VertRen*, int> &vert_idx,ObjectRen *obr,VlakRen *vlr,
int has_orco,bool has_uv)
{
Material* fmat = vlr->mat;
bool EXPORT_VCOL = ((fmat->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))!=0);
faceshader.push_back(faceshader.back());
- MTFace* uvc = RE_vlakren_get_tface(re, vlr, 0, NULL, 0); // possible uvcoords (v upside down)
+ MTFace* uvc = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0); // possible uvcoords (v upside down)
int idx1, idx2, idx3;
idx1 = vert_idx.find(vlr->v3)->second;
idx2 = vert_idx.find(vlr->v4)->second;
@@ -1207,12 +1207,12 @@ void yafrayPluginRender_t::genCompleFace(vector<int> &faces,/*vector<string> &sh
faces.push_back(idx1); faces.push_back(idx2); faces.push_back(idx3);
- if (has_uv) genUVcoords(uvcoords, vlr, uvc, true);
- if (EXPORT_VCOL) genVcol(vcol, vlr, true);
+ if (has_uv) genUVcoords(uvcoords, obr, vlr, uvc, true);
+ if (EXPORT_VCOL) genVcol(vcol, obr, vlr, true);
}
void yafrayPluginRender_t::genVertices(vector<yafray::point3d_t> &verts, int &vidx,
- map<VertRen*, int> &vert_idx, VlakRen* vlr, int has_orco, Object* obj)
+ map<VertRen*, int> &vert_idx, ObjectRen *obr, VlakRen* vlr, int has_orco, Object* obj)
{
VertRen* ver;
float tvec[3]; // for back2world transform
@@ -1277,7 +1277,7 @@ void yafrayPluginRender_t::genVertices(vector<yafray::point3d_t> &verts, int &vi
}
}
-void yafrayPluginRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_list, const float obmat[4][4])
+void yafrayPluginRender_t::writeObject(Object* obj, ObjectRen *obr, const vector<VlakRen*> &VLR_list, const float obmat[4][4])
{
float mtr[4*4];
mtr[0*4+0]=obmat[0][0]; mtr[0*4+1]=obmat[1][0]; mtr[0*4+2]=obmat[2][0]; mtr[0*4+3]=obmat[3][0];
@@ -1338,8 +1338,8 @@ void yafrayPluginRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_
fci!=VLR_list.end();++fci)
{
VlakRen* vlr = *fci;
- genVertices(verts, vidx, vert_idx, vlr, has_orco, obj);
- if(RE_vlakren_get_tface(re, vlr, 0, NULL, 0)) has_uv=true;
+ genVertices(verts, vidx, vert_idx, obr, vlr, has_orco, obj);
+ if(RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0)) has_uv=true;
}
// all faces using the index list created above
vector<int> faces;
@@ -1350,9 +1350,9 @@ void yafrayPluginRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_
fci2!=VLR_list.end();++fci2)
{
VlakRen* vlr = *fci2;
- genFace(faces, shaders, faceshader, uvcoords, vcol, vert_idx, vlr, has_orco, has_uv);
+ genFace(faces, shaders, faceshader, uvcoords, vcol, vert_idx, obr, vlr, has_orco, has_uv);
if (vlr->v4)
- genCompleFace(faces, faceshader, uvcoords, vcol, vert_idx, vlr, has_orco, has_uv);
+ genCompleFace(faces, faceshader, uvcoords, vcol, vert_idx, obr, vlr, has_orco, has_uv);
}
// using the ObjectRen database, contruct a new name if object has a parent.
@@ -1382,15 +1382,14 @@ void yafrayPluginRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_
// write all objects
void yafrayPluginRender_t::writeAllObjects()
{
-
// first all objects except dupliverts (and main instance object for dups)
- for (map<Object*, vector<VlakRen*> >::const_iterator obi=all_objects.begin();
+ for (map<Object*, yafrayObjectRen >::const_iterator obi=all_objects.begin();
obi!=all_objects.end(); ++obi)
{
// skip main duplivert object if in dupliMtx_list, written later
Object* obj = obi->first;
if (dupliMtx_list.find(string(obj->id.name))!=dupliMtx_list.end()) continue;
- writeObject(obj, obi->second, obj->obmat);
+ writeObject(obj, obi->second.obr, obi->second.faces, obj->obmat);
}
// Now all duplivert objects (if any) as instances of main object
@@ -1408,7 +1407,7 @@ void yafrayPluginRender_t::writeAllObjects()
// first object written as normal (but with transform of first duplivert)
Object* obj = dup_srcob[dupMtx->first];
- writeObject(obj, all_objects[obj], obmat);
+ writeObject(obj, all_objects[obj].obr, all_objects[obj].faces, obmat);
// all others instances of first
for (unsigned int curmtx=16;curmtx<dupMtx->second.size();curmtx+=16)
@@ -1437,7 +1436,6 @@ void yafrayPluginRender_t::writeAllObjects()
}
}
-
}
void yafrayPluginRender_t::writeAreaLamp(LampRen* lamp, int num, float iview[4][4])
diff --git a/source/blender/yafray/intern/export_Plugin.h b/source/blender/yafray/intern/export_Plugin.h
index 1ce4988a260..660271daf96 100644
--- a/source/blender/yafray/intern/export_Plugin.h
+++ b/source/blender/yafray/intern/export_Plugin.h
@@ -35,7 +35,7 @@ class yafrayPluginRender_t : public yafrayRender_t
virtual void writeTextures();
virtual void writeShader(const std::string &shader_name, Material* matr, const std::string &facetexname="");
virtual void writeMaterialsAndModulators();
- virtual void writeObject(Object* obj,
+ virtual void writeObject(Object* obj, ObjectRen *obr,
const std::vector<VlakRen*> &VLR_list, const float obmat[4][4]);
virtual void writeAllObjects();
virtual void writeAreaLamp(LampRen* lamp, int num, float iview[4][4]);
@@ -48,18 +48,18 @@ class yafrayPluginRender_t : public yafrayRender_t
virtual bool initExport();
virtual bool finishExport();
- void genUVcoords(std::vector<yafray::GFLOAT> &uvcoords,VlakRen *vlr,MTFace* uvc, bool comple=false);
- void genVcol(std::vector<yafray::CFLOAT> &vcol, VlakRen *vlr, bool comple=false);
+ void genUVcoords(std::vector<yafray::GFLOAT> &uvcoords,ObjectRen *obr,VlakRen *vlr,MTFace* uvc, bool comple=false);
+ void genVcol(std::vector<yafray::CFLOAT> &vcol, ObjectRen *obr, VlakRen *vlr, bool comple=false);
void genFace(std::vector<int> &faces,std::vector<std::string> &shaders,std::vector<int> &faceshader,
std::vector<yafray::GFLOAT> &uvcoords,std::vector<yafray::CFLOAT> &vcol,
- std::map<VertRen*, int> &vert_idx,VlakRen *vlr,
+ std::map<VertRen*, int> &vert_idx,ObjectRen *obr,VlakRen *vlr,
int has_orco,bool has_uv);
void genCompleFace(std::vector<int> &faces,/*std::vector<std::string> &shaders,*/std::vector<int> &faceshader,
std::vector<yafray::GFLOAT> &uvcoords,std::vector<yafray::CFLOAT> &vcol,
- std::map<VertRen*, int> &vert_idx,VlakRen *vlr,
+ std::map<VertRen*, int> &vert_idx,ObjectRen *obr, VlakRen *vlr,
int has_orco,bool has_uv);
void genVertices(std::vector<yafray::point3d_t> &verts, int &vidx,
- std::map<VertRen*, int> &vert_idx, VlakRen* vlr, int has_orco, Object* obj);
+ std::map<VertRen*, int> &vert_idx, ObjectRen *obr, VlakRen* vlr, int has_orco, Object* obj);
};
class blenderYafrayOutput_t : public yafray::colorOutput_t
diff --git a/source/blender/yafray/intern/yafray_Render.cpp b/source/blender/yafray/intern/yafray_Render.cpp
index 1106e197335..d9d421e0720 100644
--- a/source/blender/yafray/intern/yafray_Render.cpp
+++ b/source/blender/yafray/intern/yafray_Render.cpp
@@ -73,7 +73,20 @@ bool yafrayRender_t::exportScene(Render* re)
// as well as associating them again with the original Object.
bool yafrayRender_t::getAllMatTexObs()
{
+ ObjectInstanceRen *obi;
+ ObjectRen *obr;
VlakRen* vlr;
+ float mat[4][4];
+
+ // convert blender object instances to dupli matrices
+ for(obi=(ObjectInstanceRen*)re->instancetable.first; obi; obi=obi->next) {
+ if(obi->flag & R_DUPLI_TRANSFORMED) {
+ // compute object matrix with dupli transform, need to transform
+ // obi->mat out of view space for it
+ MTC_Mat4MulSerie(mat, re->viewinv, obi->mat, re->viewmat, obi->obr->ob->obmat, 0, 0, 0, 0);
+ addDupliMtx(obi->obr->ob, mat);
+ }
+ }
// Blender does not include object which have total 0 alpha materials,
// however, the objects might have been included in the dupliMtx list,
@@ -84,69 +97,72 @@ bool yafrayRender_t::getAllMatTexObs()
// but on the other hand that could also hide the real problem of course...
map<string, Object*> renderobs;
- for (int i=0; i < re->totvlak; i++) {
-
- if ((i & 255)==0) vlr=re->vlaknodes[i>>8].vlak; else vlr++;
-
- // ---- The materials & textures
- // in this case, probably every face has a material assigned, which can be the default material,
- // so checking that this is !0 is probably not necessary, but just in case...
- Material* matr = vlr->mat;
- if (matr) {
- // The default assigned material seems to be nameless, no MA id, an empty string.
- // Since this name is needed in yafray, make it 'blender_default'
- if (strlen(matr->id.name)==0)
- used_materials["blender_default"] = matr;
- else
- used_materials[matr->id.name] = matr;
- // textures, all active channels
- for (int m=0;m<MAX_MTEX;m++) {
- if (matr->septex & (1<<m)) continue; // only active channels
- MTex* mx = matr->mtex[m];
- // if no mtex, ignore
- if (mx==NULL) continue;
- // if no tex, ignore
- Tex* tx = mx->tex;
- if (tx==NULL) continue;
- short txtp = tx->type;
- // if texture type not available in yafray, ignore
- if ((txtp==0) ||
- (txtp==TEX_MAGIC) ||
- (txtp==TEX_PLUGIN) ||
- (txtp==TEX_ENVMAP)) continue;
- // if texture is stucci, only export if 'nor' enabled
- if ((txtp==TEX_STUCCI) && !((mx->mapto & MAP_NORM) || (mx->maptoneg & MAP_NORM))) continue;
- // In the case of an image texture, check that there is an actual image, otherwise ignore.
- // Stupid error was here (...if (txtp & TEX_IMAGE)...),
- // which happened to work sofar, but not anymore with the extended texture support..
- if ((txtp==TEX_IMAGE) && (!tx->ima)) continue;
- used_textures[tx->id.name] = mx;
+ for(obr=(ObjectRen*)re->objecttable.first; obr; obr=obr->next) {
+ for (int i=0; i < obr->totvlak; i++) {
+
+ if ((i & 255)==0) vlr=obr->vlaknodes[i>>8].vlak; else vlr++;
+
+ // ---- The materials & textures
+ // in this case, probably every face has a material assigned, which can be the default material,
+ // so checking that this is !0 is probably not necessary, but just in case...
+ Material* matr = vlr->mat;
+ if (matr) {
+ // The default assigned material seems to be nameless, no MA id, an empty string.
+ // Since this name is needed in yafray, make it 'blender_default'
+ if (strlen(matr->id.name)==0)
+ used_materials["blender_default"] = matr;
+ else
+ used_materials[matr->id.name] = matr;
+ // textures, all active channels
+ for (int m=0;m<MAX_MTEX;m++) {
+ if (matr->septex & (1<<m)) continue; // only active channels
+ MTex* mx = matr->mtex[m];
+ // if no mtex, ignore
+ if (mx==NULL) continue;
+ // if no tex, ignore
+ Tex* tx = mx->tex;
+ if (tx==NULL) continue;
+ short txtp = tx->type;
+ // if texture type not available in yafray, ignore
+ if ((txtp==0) ||
+ (txtp==TEX_MAGIC) ||
+ (txtp==TEX_PLUGIN) ||
+ (txtp==TEX_ENVMAP)) continue;
+ // if texture is stucci, only export if 'nor' enabled
+ if ((txtp==TEX_STUCCI) && !((mx->mapto & MAP_NORM) || (mx->maptoneg & MAP_NORM))) continue;
+ // In the case of an image texture, check that there is an actual image, otherwise ignore.
+ // Stupid error was here (...if (txtp & TEX_IMAGE)...),
+ // which happened to work sofar, but not anymore with the extended texture support..
+ if ((txtp==TEX_IMAGE) && (!tx->ima)) continue;
+ used_textures[tx->id.name] = mx;
+ }
}
- }
- // Make list of faces per object, ignore <3 vert faces, duplicate vertex sorting done later.
- // ignore null object pointers.
- // Also make list of facetexture images (material 'TexFace').
- if (vlr->ob) {
- int nv = 0; // number of vertices
- MTFace *tface;
-
- if (vlr->v4) nv=4; else if (vlr->v3) nv=3;
- if (nv) {
- renderobs[vlr->ob->id.name] = vlr->ob;
- all_objects[vlr->ob].push_back(vlr);
-
- tface= RE_vlakren_get_tface(re, vlr, 0, NULL, 0);
- if (tface && tface->tpage) {
- Material* fmat = vlr->mat;
-
- // only save if TexFace enabled
- if(fmat && (fmat->mode & MA_FACETEXTURE))
- imagetex[tface->tpage].insert(fmat);
+ // Make list of faces per object, ignore <3 vert faces, duplicate vertex sorting done later.
+ // ignore null object pointers.
+ // Also make list of facetexture images (material 'TexFace').
+ if (obr->ob) {
+ int nv = 0; // number of vertices
+ MTFace *tface;
+
+ if (vlr->v4) nv=4; else if (vlr->v3) nv=3;
+ if (nv) {
+ renderobs[obr->ob->id.name] = obr->ob;
+ all_objects[obr->ob].obr= obr;
+ all_objects[obr->ob].faces.push_back(vlr);
+
+ tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
+ if (tface && tface->tpage) {
+ Material* fmat = vlr->mat;
+
+ // only save if TexFace enabled
+ if(fmat && (fmat->mode & MA_FACETEXTURE))
+ imagetex[tface->tpage].insert(fmat);
+ }
}
}
- }
+ }
}
// now remove any objects from dupliMtx_list which are not in the renderlist
@@ -168,7 +184,7 @@ bool yafrayRender_t::getAllMatTexObs()
// in all_objects with the name given in dupliMtx_list
if (!dupliMtx_list.empty()) {
- for (map<Object*, vector<VlakRen*> >::const_iterator obn=all_objects.begin();
+ for (map<Object*, yafrayObjectRen>::const_iterator obn=all_objects.begin();
obn!=all_objects.end();++obn)
{
Object* obj = obn->first;
@@ -187,16 +203,16 @@ bool yafrayRender_t::getAllMatTexObs()
return true;
}
-
-
-void yafrayRender_t::addDupliMtx(Object* obj)
+void yafrayRender_t::addDupliMtx(Object* obj, float mat[][4])
{
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
- dupliMtx_list[obj->id.name].push_back(obj->obmat[i][j]);
+ dupliMtx_list[obj->id.name].push_back(mat[i][j]);
}
+#if 0
+
bool yafrayRender_t::objectKnownData(Object* obj)
{
// if object data already known, no need to include in renderlist, otherwise save object datapointer
@@ -217,3 +233,5 @@ bool yafrayRender_t::objectKnownData(Object* obj)
objectData[obj->data] = obj;
return false;
}
+#endif
+
diff --git a/source/blender/yafray/intern/yafray_Render.h b/source/blender/yafray/intern/yafray_Render.h
index 4002f514a6e..43d2c6c602a 100644
--- a/source/blender/yafray/intern/yafray_Render.h
+++ b/source/blender/yafray/intern/yafray_Render.h
@@ -52,6 +52,12 @@ extern void error (char *fmt, ...);
#include <vector>
#include <set>
+class yafrayObjectRen {
+ public:
+ std::vector<VlakRen*> faces;
+ ObjectRen *obr;
+};
+
class yafrayRender_t
{
public:
@@ -62,7 +68,7 @@ class yafrayRender_t
// mtds
bool exportScene(Render* re);
- void addDupliMtx(Object* obj);
+ void addDupliMtx(Object* obj, float mat[][4]);
bool objectKnownData(Object* obj);
protected:
@@ -72,7 +78,7 @@ class yafrayRender_t
bool hasworld;
- std::map<Object*, std::vector<VlakRen*> > all_objects;
+ std::map<Object*, yafrayObjectRen> all_objects;
std::map<std::string, Material*> used_materials;
std::map<std::string, MTex*> used_textures;
std::map<std::string, std::vector<float> > dupliMtx_list;
@@ -86,7 +92,7 @@ class yafrayRender_t
virtual void writeTextures()=0;
virtual void writeShader(const std::string &shader_name, Material* matr, const std::string &facetexname)=0;
virtual void writeMaterialsAndModulators()=0;
- virtual void writeObject(Object* obj, const std::vector<VlakRen*> &VLR_list, const float obmat[4][4])=0;
+ virtual void writeObject(Object* obj, ObjectRen *obr, const std::vector<VlakRen*> &VLR_list, const float obmat[4][4])=0;
virtual void writeAllObjects()=0;
virtual void writeLamps()=0;
virtual void writeCamera()=0;
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index a34ed069b02..2b566d77a29 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -44,10 +44,17 @@ INCLUDE_DIRECTORIES(../../intern/guardedalloc
../kernel/gen_system
)
+
+
IF(WITH_QUICKTIME)
ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
+IF(LINUX)
+ ADD_DEFINITIONS(-DWITH_BINRELOC)
+ INCLUDE_DIRECTORIES(${BINRELOC_INC})
+endif(LINUX)
+
IF(YESIAMSTUPID)
ADD_DEFINITIONS(-DYESIAMSTUPID)
ENDIF(YESIAMSTUPID)
@@ -191,6 +198,10 @@ FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} src blender_python blender_render blender_radiosity blender_IK bf_elbeem)
+IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
+ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+
IF(UNIX)
# Sort libraries
SET(BLENDER_SORTED_LIBS
@@ -254,6 +265,7 @@ IF(UNIX)
bf_moto
blender_python
bf_quicktime
+ extern_binreloc
)
FOREACH(SORTLIB ${BLENDER_SORTED_LIBS})
diff --git a/source/creator/Makefile b/source/creator/Makefile
index 02c22aa4da8..a7f2dfeecb6 100644
--- a/source/creator/Makefile
+++ b/source/creator/Makefile
@@ -42,6 +42,7 @@ CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I../blender/render/extern/include
CPPFLAGS += -I../blender/radiosity/extern/include
+
# two needed for the kernel
CPPFLAGS += -I../blender/imbuf
CPPFLAGS += -I../blender/makesdna
@@ -59,6 +60,10 @@ ifeq ($(WITH_QUICKTIME), true)
CPPFLAGS += -I$(NAN_QUICKTIME)/include -DWITH_QUICKTIME
endif
+ifeq ($(WITH_BINRELOC), true)
+ CPPFLAGS += -I$(OCGDIR)/extern/binreloc/include -DWITH_BINRELOC
+endif
+
ifeq ($(NAN_YESIAMSTUPID), true)
CPPFLAGS += -DYESIAMSTUPID
endif
diff --git a/source/creator/SConscript b/source/creator/SConscript
index 9bc49b2fc30..833b56eccd8 100644
--- a/source/creator/SConscript
+++ b/source/creator/SConscript
@@ -15,4 +15,8 @@ if env['WITH_BF_QUICKTIME']==1:
incs += ' ' + env['BF_QUICKTIME_INC']
defs.append('WITH_QUICKTIME')
+if env['WITH_BF_BINRELOC']==1:
+ incs += ' ../../extern/binreloc/include'
+ defs.append('WITH_BINRELOC')
+
env.BlenderLib ( libname = 'blender_creator', sources = Split(sources), includes = Split(incs), defines = defs, libtype='core', priority = 1 )
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 c9474f01b5f..7c7e81b5b45 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -97,6 +97,10 @@
# include <sys/rtprio.h>
#endif
+#ifdef WITH_BINRELOC
+#include "binreloc.h"
+#endif
+
// from buildinfo.c
#ifdef BUILD_DATE
extern char * build_date;
@@ -159,6 +163,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
@@ -170,9 +175,15 @@ static void print_help(void)
{
printf ("Blender %d.%02d (sub %d) Build\n", G.version/100, G.version%100, BLENDER_SUBVERSION);
printf ("Usage: blender [options ...] [file]\n");
-
+ printf ("Note: Arguments are executed in the order they are given. eg.\n");
+ printf (" blender -b test.blend -f 1 -o /tmp\n");
+ printf (" ...may not render to /tmp because '-f 1' renders before the output path is set\n");
+ printf (" blender -b -o /tmp test.blend -f 1\n");
+ printf (" ...may not render to /tmp because loading the blend file overwrites the output path that was set\n");
+ printf (" \"blender -b test.blend -o /tmp -f 1\" works as expected.\n");
printf ("\nRender options:\n");
- printf (" -b <file>\tRender <file> in background\n");
+ printf (" -b <file>\tRender <file> in background (doesn't load the user defaults .B.blend file)\n");
+ printf (" -a render frames from start to end (inclusive), only works when used after -b\n");
printf (" -S <name>\tSet scene <name>\n");
printf (" -f <frame>\tRender frame <frame> and save it\n");
printf (" -s <frame>\tSet start to frame <frame> (use with -a)\n");
@@ -181,18 +192,28 @@ static void print_help(void)
printf (" Use // at the start of the path to\n");
printf (" render relative to the blend file.\n");
printf (" The frame number will be added at the end of the filename.\n");
- printf (" eg: blender -b foobar.blend -o //render_ -F PNG -x 1\n");
- printf (" -F <format>\tSet the render format, Valid options are..\n");
- printf (" \tTGA IRIS HAMX FTYPE JPEG MOVIE IRIZ RAWTGA\n");
+ printf (" eg: blender -b foobar.blend -o //render_ -F PNG -x 1 -a\n");
+ printf ("\nFormat options:\n");
+ printf (" -F <format>\tSet the render format, Valid options are...\n");
+ printf (" \tTGA IRIS HAMX JPEG MOVIE IRIZ RAWTGA\n");
printf (" \tAVIRAW AVIJPEG PNG BMP FRAMESERVER\n");
printf (" (formats that can be compiled into blender, not available on all systems)\n");
- printf (" \tHDR TIFF EXR MPEG AVICODEC QUICKTIME CINEON DPX\n");
+ printf (" \tHDR TIFF EXR MPEG AVICODEC QUICKTIME CINEON DPX DDS\n");
printf (" -x <bool>\tSet option to add the file extension to the end of the file.\n");
printf (" -t <threads>\tUse amount of <threads> for rendering\n");
- printf ("\nAnimation options:\n");
- printf (" -a <file(s)>\tPlayback <file(s)>\n");
+ /*Add these later - Campbell*/
+ /*
+ printf (" -colorchannel <type>\tColors to save, valid types are: BW RGB RGBA \n");
+ printf (" -compression <type>\t Use with EXR format, valid types are..\n");
+ printf (" \tZIP Pxr24 PIZ RLE\n");
+ printf (" -zbuf <bool>\tUse with EXR format, set the zbuf save option\n");
+ printf (" -halffloat <bool>\tUse with EXR format, set the half float option\n");
+ printf (" -preview <bool>\tUse with EXR format, save a jpeg for viewing as well as the EXR\n");*/
+ printf ("\nAnimation playback options:\n");
+ printf (" -a <file(s)>\tPlayback <file(s)>, only operates this way when -b is not used.\n");
printf (" -p <sx> <sy>\tOpen with lower left corner at <sx>, <sy>\n");
printf (" -m\t\tRead from disk (Don't buffer)\n");
+ printf (" -f <fps> <fps-base>\t\tSpecify FPS to start with\n");
printf ("\nWindow options:\n");
printf (" -w\t\tForce opening with borders (default)\n");
@@ -236,6 +257,11 @@ int main(int argc, char **argv)
int audio = 0;
#endif
+
+#ifdef WITH_BINRELOC
+ br_init( NULL );
+#endif
+
setCallbacks();
#ifdef __APPLE__
/* patch to ignore argument finder gives us (pid?) */
@@ -331,7 +357,7 @@ int main(int argc, char **argv)
/* Handle -* switches */
else if(argv[a][0] == '-') {
switch(argv[a][1]) {
- case 'a':
+ case 'a': /* -b was not given, play an animation */
playanim(argc-1, argv+1);
exit(0);
break;
@@ -634,7 +660,9 @@ int main(int argc, char **argv)
if (!strcmp(argv[a],"TGA")) G.scene->r.imtype = R_TARGA;
else if (!strcmp(argv[a],"IRIS")) G.scene->r.imtype = R_IRIS;
else if (!strcmp(argv[a],"HAMX")) G.scene->r.imtype = R_HAMX;
- else if (!strcmp(argv[a],"FTYPE")) G.scene->r.imtype = R_FTYPE;
+#ifdef WITH_DDS
+ else if (!strcmp(argv[a],"DDS")) G.scene->r.imtype = R_DDS;
+#endif
else if (!strcmp(argv[a],"JPEG")) G.scene->r.imtype = R_JPEG90;
else if (!strcmp(argv[a],"MOVIE")) G.scene->r.imtype = R_MOVIE;
else if (!strcmp(argv[a],"IRIZ")) G.scene->r.imtype = R_IRIZ;
@@ -647,12 +675,14 @@ int main(int argc, char **argv)
else if (!strcmp(argv[a],"BMP")) G.scene->r.imtype = R_BMP;
else if (!strcmp(argv[a],"HDR")) G.scene->r.imtype = R_RADHDR;
else if (!strcmp(argv[a],"TIFF")) G.scene->r.imtype = R_IRIS;
+#ifdef WITH_OPENEXR
else if (!strcmp(argv[a],"EXR")) G.scene->r.imtype = R_OPENEXR;
+#endif
else if (!strcmp(argv[a],"MPEG")) G.scene->r.imtype = R_FFMPEG;
else if (!strcmp(argv[a],"FRAMESERVER")) G.scene->r.imtype = R_FRAMESERVER;
else if (!strcmp(argv[a],"CINEON")) G.scene->r.imtype = R_CINEON;
else if (!strcmp(argv[a],"DPX")) G.scene->r.imtype = R_DPX;
- else printf("\nError: Format from '-F ' not known.\n");
+ else printf("\nError: Format from '-F' not known or not compiled in this release.\n");
}
} else {
printf("\nError: no blend loaded. cannot use '-x'.\n");
@@ -686,8 +716,59 @@ int main(int argc, char **argv)
}
}
else {
- BKE_read_file(argv[a], NULL);
- sound_initialize_sounds();
+
+ /* Make the path absolute because its needed for relative linked blends to be found */
+ int abs = 0;
+ int filelen;
+ char cwd[FILE_MAXDIR + FILE_MAXFILE];
+ char filename[FILE_MAXDIR + FILE_MAXFILE];
+ cwd[0] = filename[0] = '\0';
+
+ BLI_strncpy(filename, argv[a], sizeof(filename));
+ filelen = strlen(filename);
+
+ /* relative path checks, could do more tests here... */
+#ifdef WIN32
+ /* Account for X:/ and X:\ - should be enough */
+ if (filelen >= 3 && filename[1] == ':' && (filename[2] == '\\' || filename[2] == '/'))
+ abs = 1;
+#else
+ if (filelen >= 2 && filename[0] == '/')
+ abs = 1 ;
+#endif
+ if (!abs) {
+ BLI_getwdN(cwd); /* incase the full path to the blend isnt used */
+
+ if (cwd[0] == '\0') {
+ printf(
+ "Could not get the current working directory - $PWD for an unknown reason.\n\t"
+ "Relative linked files will not load if the entire blend path is not used.\n\t"
+ "The 'Play' button may also fail.\n"
+ );
+ } else {
+ /* uses the blend path relative to cwd important for loading relative linked files.
+ *
+ * cwd should contain c:\ etc on win32 so the relbase can be NULL
+ * relbase being NULL also prevents // being misunderstood as relative to the current
+ * blend file which isnt a feature we want to use in this case since were dealing
+ * with a path from the command line, rather then from inside Blender */
+
+ BLI_make_file_string(NULL, filename, cwd, argv[a]);
+ }
+ }
+
+ if (G.background) {
+ BKE_read_file(filename, 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(filename);
+ }
}
}
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 4ae5ab67270..e89c78614cc 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -609,7 +609,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))
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index 8f7609aed74..413b16bc300 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -54,8 +54,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
#include "RAS_OpenGLRasterizer/RAS_GLExtensionManager.h"
#include "RAS_OpenGLRasterizer/ARB_multitexture.h"
#include "BL_Material.h" // MAXTEX
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 90b5fc5308d..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, NULL, 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 47d8f186653..804241ac9b9 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -553,7 +553,7 @@ extern "C"
{
Ipo *add_ipo( char *name, int idcode );
char *getIpoCurveName( IpoCurve * icu );
- struct IpoCurve *verify_ipocurve(struct ID *, short, char *, char *, int);
+ struct IpoCurve *verify_ipocurve(struct ID *, short, char *, char *, char *, int);
void testhandles_ipocurve(struct IpoCurve *icu);
void Mat3ToEul(float tmat[][3], float *eul);
@@ -766,27 +766,27 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
IpoCurve *icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"LocX");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_LOC_X);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_LOC_X);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"LocY");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_LOC_Y);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_LOC_Y);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"LocZ");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_LOC_Z);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_LOC_Z);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"RotX");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_ROT_X);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_ROT_X);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"RotY");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_ROT_Y);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_ROT_Y);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"RotZ");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_ROT_Z);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_ROT_Z);
@@ -922,27 +922,27 @@ void KX_BlenderSceneConverter::TestHandlesPhysicsObjectToAnimationIpo()
IpoCurve *icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"LocX");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_LOC_X);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_LOC_X);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"LocY");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_LOC_Y);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_LOC_Y);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"LocZ");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_LOC_Z);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_LOC_Z);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"RotX");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_ROT_X);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_ROT_X);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"RotY");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_ROT_Y);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_ROT_Y);
icu1 = findIpoCurve((IpoCurve *)ipo->curve.first,"RotZ");
if (!icu1)
- icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, OB_ROT_Z);
+ icu1 = verify_ipocurve(&blenderObject->id, ipo->blocktype, NULL, NULL, NULL, OB_ROT_Z);
diff --git a/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp b/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp
index 5b3c2c84edb..840230902f8 100644
--- a/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp
@@ -43,8 +43,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index daded7a1d25..5ef20514390 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -46,8 +46,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
#include "GPG_Application.h"
diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp
index ab0479eb88b..3b74b74727a 100644
--- a/source/gameengine/Ketsji/BL_Shader.cpp
+++ b/source/gameengine/Ketsji/BL_Shader.cpp
@@ -9,8 +9,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
#include <iostream>
#include "BL_Shader.h"
diff --git a/source/gameengine/Ketsji/BL_Texture.cpp b/source/gameengine/Ketsji/BL_Texture.cpp
index d6b57f062f2..53e1af46e4e 100644
--- a/source/gameengine/Ketsji/BL_Texture.cpp
+++ b/source/gameengine/Ketsji/BL_Texture.cpp
@@ -8,8 +8,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
#include <iostream>
#include <map>
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
index fa1c67f251c..c3aa83bec69 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -15,8 +15,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
#include "KX_BlenderMaterial.h"
#include "BL_Material.h"
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 1a3a0490d21..1a6aafafabf 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -44,8 +44,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
#ifdef WIN32
#pragma warning (disable : 4786)
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
index 8576ea1487c..7b895258c1e 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
@@ -1,4 +1,33 @@
-
+/**
+ * ***** 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 *****
+ */
+
#define STRINGIFY(A) #A
#include "RAS_OpenGLFilters/RAS_Blur2DFilter.h"
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.h b/source/gameengine/Rasterizer/RAS_2DFilterManager.h
index 45e33db8d2e..227d2a26d41 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.h
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_I2DFILTER
#define __RAS_I2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
index 2b0bdbc4351..ac4c2456573 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_BLUR2DFILTER
#define __RAS_BLUR2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
index 9cf233d549a..44f67af3d75 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_DILATION2DFILTER
#define __RAS_DILATION2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
index 667da14c10e..80b6f184c36 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_EROSION2DFILTER
#define __RAS_EROSION2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
index 09f58c0a350..29cc91814ce 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_GRAYSCALE2DFILTER
#define __RAS_GRAYSCALE2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h
index c3b9ee117c0..a3482f9647f 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_INVERT2DFILTER
#define __RAS_INVERT2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
index 684ac4399fa..636ecdb68aa 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_LAPLACION2DFILTER
#define __RAS_LAPLACION2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
index c4b344b2ded..8046aacfbb1 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_PREWITT2DFILTER
#define __RAS_PREWITT2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h
index 4ba91b85784..b56911a48b4 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_SEPIA2DFILTER
#define __RAS_SEPIA2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
index 685471aab07..e5f942a535c 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_SHARPEN2DFILTER
#define __RAS_SHARPEN2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
index 93480afb250..545e76601e8 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
@@ -1,3 +1,33 @@
+/**
+ * ***** 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 __RAS_SOBEL2DFILTER
#define __RAS_SOBEL2DFILTER
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_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 85250fcd552..4f9c3a1bfb3 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -46,8 +46,12 @@
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
+#if defined(__sun__) && !defined(__sparc__)
+#include <mesa/glu.h>
+#else
#include <GL/glu.h>
#endif
+#endif
#include "RAS_Rect.h"
#include "RAS_TexVert.h"
diff --git a/source/nan_compile.mk b/source/nan_compile.mk
index ae2717e3b5c..0c52a3e6014 100644
--- a/source/nan_compile.mk
+++ b/source/nan_compile.mk
@@ -171,27 +171,44 @@ ifeq ($(OS),openbsd)
endif
ifeq ($(OS),solaris)
- CC = gcc
- CCC = g++
-# CC = cc
-# CCC = CC
+ # Adding gcc flag to $CC is not good, however if its not there makesdna wont build - Campbell
+ ifeq (x86_64, $(findstring x86_64, $(CPU)))
+ CC = gcc -m64
+ CCC = g++ -m64
+ else
+ CC = gcc
+ CCC = g++
+ #CC = cc
+ #CCC = CC
+ endif
+
JAVAC = javac
JAVAH = javah
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
+
+ # Note, you might still want to compile a 32 bit binary if you have a 64bit system. if so remove the following lines
+# ifeq ($(findstring 64,$(CPU)), 64)
+# CFLAGS += -m64
+# CCFLAGS += -m64
+# endif
+
+ REL_CFLAGS += -O2
+ REL_CCFLAGS += -O2
+
NAN_DEPEND = true
- ifeq ($(CPU),sparc)
- OPENGL_HEADERS = /usr/openwin/share/include
- CPPFLAGS += -DSUN_OGL_NO_VERTEX_MACROS
- JAVA_HEADERS = /usr/java/include
- JAVA_SYSTEM_HEADERS = /usr/java/include/solaris
- else
- OPENGL_HEADERS = /usr/local/include
- endif
+# ifeq ($(CPU),sparc)
+ ifeq ($(findstring sparc,$(CPU)), sparc)
+ OPENGL_HEADERS = /usr/openwin/share/include
+ CPPFLAGS += -DSUN_OGL_NO_VERTEX_MACROS
+ JAVA_HEADERS = /usr/java/include
+ JAVA_SYSTEM_HEADERS = /usr/java/include/solaris
+ else
+ # OPENGL_HEADERS = /usr/X11/include/mesa
+ OPENGL_HEADERS = /usr/X11/include/
+ endif
AR = ar
ARFLAGS = ruv
ARFLAGSQUIET = ru
diff --git a/source/nan_definitions.mk b/source/nan_definitions.mk
index f1248b86bf9..36b140c1ffb 100644
--- a/source/nan_definitions.mk
+++ b/source/nan_definitions.mk
@@ -141,8 +141,15 @@ endif
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
- export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a
+ ifeq ($(OS), solaris)
+ # this only exists at the moment for i386-64 CPU Types at the moment
+ export NAN_OPENEXR ?= $(LCGDIR)/openexr
+
+ export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a -lrt
+ else
+ export NAN_OPENEXR ?= /usr/local
+ export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a
+ endif
endif
endif
ifeq ($(WITH_OPENEXR), true)
@@ -165,6 +172,7 @@ endif
export NAN_PYTHON ?= $(LCGDIR)/python
export NAN_PYTHON_VERSION ?= 2.3
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= $(LCGDIR)/jpeg
@@ -211,10 +219,12 @@ endif
export NAN_PYTHON ?= /System/Library/Frameworks/Python.framework/Versions/2.3
export NAN_PYTHON_VERSION ?= 2.3
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= -framework Python
else
export NAN_PYTHON ?= /sw
export NAN_PYTHON_VERSION ?= 2.3
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
endif
export NAN_OPENAL ?= $(LCGDIR)/openal
@@ -229,6 +239,10 @@ endif
export NAN_NSPR ?= $(LCGDIR)/nspr
export NAN_FREETYPE ?= $(LCGDIR)/freetype
export NAN_GETTEXT ?= $(LCGDIR)/gettext
+ export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib/libintl.a
+ ifeq (($CPU), i386)
+ export NAN_GETTEXT_LIB += $(NAN_GETTEXT)/lib/libintl.a
+ endif
export NAN_SDL ?= $(LCGDIR)/sdl
export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include
export NAN_SDLLIBS ?= $(NAN_SDL)/lib/libSDL.a -framework Cocoa -framework IOKit
@@ -270,6 +284,7 @@ endif
export NAN_PYTHON ?= /usr/local
export NAN_PYTHON_VERSION ?= 2.3
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= /usr/local
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= /usr/local
@@ -314,6 +329,7 @@ endif
export NAN_PYTHON ?= $(LCGDIR)/python
export NAN_PYTHON_VERSION ?= 2.3
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= $(LCGDIR)/jpeg
@@ -326,6 +342,7 @@ endif
export NAN_NSPR ?= $(LCGDIR)/nspr
export NAN_FREETYPE ?= /usr/freeware
export NAN_GETTEXT ?= /usr/freeware
+ export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib32/libintl.a
export NAN_SDL ?= $(LCGDIR)/sdl
export NAN_SDLLIBS ?= -L$(NAN_SDL)/lib -lSDL
export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include/SDL
@@ -356,12 +373,9 @@ 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_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= /usr
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= /usr
@@ -402,6 +416,8 @@ endif
# enable freetype2 support for text objects
export WITH_FREETYPE2 ?= true
+ export WITH_BINRELOC ?= true
+
# enable ffmpeg support
ifndef NAN_NO_FFMPEG
export WITH_FFMPEG ?= true
@@ -417,6 +433,7 @@ endif
export NAN_PYTHON ?= $(LCGDIR)/python
export NAN_PYTHON_VERSION ?= 2.3
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= $(LCGDIR)/jpeg
@@ -456,24 +473,26 @@ endif
export ID = $(shell /usr/ucb/whoami)
export HOST = $(shell hostname)
- export NAN_PYTHON ?= /usr/local
- export NAN_PYTHON_VERSION ?= 2.3
+ export NAN_PYTHON ?= $(LCGDIR)/python
+ export NAN_PYTHON_VERSION ?= 2.5
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
- export NAN_OPENAL ?= /usr/local
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
+ export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_FMOD ?= $(LCGDIR)/fmod
- export NAN_JPEG ?= /usr/local
- export NAN_PNG ?= /usr/local
+ export NAN_JPEG ?= $(LCGDIR)/jpeg
+ export NAN_PNG ?= $(LCGDIR)/png
export NAN_TIFF ?= /usr
export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?=
- export NAN_MESA ?= /usr/src/Mesa-3.1
- export NAN_ZLIB ?= /usr
+ export NAN_MESA ?= /usr/X11
+ export NAN_ZLIB ?= $(LCGDIR)/zlib
export NAN_NSPR ?= $(LCGDIR)/nspr
export NAN_FREETYPE ?= $(LCGDIR)/freetype
export NAN_GETTEXT ?= $(LCGDIR)/gettext
- export NAN_SDL ?= $(shell sdl-config --prefix)
- export NAN_SDLLIBS ?= $(shell sdl-config --libs)
- export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags)
+ export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib/libintl.a $(NAN_GETTEXT)/lib/libiconv.a
+ export NAN_SDL ?= $(LCGDIR)/sdl
+ export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include/SDL
+ export NAN_SDLLIBS ?= $(NAN_SDL)/lib/libSDL.a
# Uncomment the following line to use Mozilla inplace of netscape
# CPPFLAGS +=-DMOZ_NOT_NET
@@ -502,20 +521,18 @@ endif
export NAN_PYTHON_VERSION ?= 2.5
ifeq ($(FREE_WINDOWS), true)
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/freepy.a
export NAN_FREETYPE ?= $(LCGDIR)/gcc/freetype
export NAN_ODE ?= $(LCGDIR)/gcc/ode
- ifeq ($(NAN_SDL),)
- export NAN_SDL ?= $(LCGDIR)/gcc/sdl
- export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include
- endif
+ export NAN_SDL ?= $(LCGDIR)/gcc/sdl
+ export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include
else
export NAN_PYTHON_BINARY ?= python
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python23.lib
export NAN_FREETYPE ?= $(LCGDIR)/freetype
export NAN_ODE ?= $(LCGDIR)/ode
- ifeq ($(NAN_SDL),)
- export NAN_SDL ?= $(LCGDIR)/sdl
- export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include
- endif
+ export NAN_SDL ?= $(LCGDIR)/sdl
+ export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include
endif
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_FMOD ?= $(LCGDIR)/fmod
@@ -527,6 +544,11 @@ endif
export NAN_ZLIB ?= $(LCGDIR)/zlib
export NAN_NSPR ?= $(LCGDIR)/nspr
export NAN_GETTEXT ?= $(LCGDIR)/gettext
+ ifeq ($(FREE_WINDOWS), true)
+ export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib/freegettext.a $(NAN_ICONV)/lib/freeiconv.a
+ else
+ export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib/gnu_gettext.lib $(NAN_ICONV)/lib/iconv.lib
+ endif
# Uncomment the following line to use Mozilla inplace of netscape
# CPPFLAGS +=-DMOZ_NOT_NET
@@ -554,6 +576,8 @@ endif
export NAN_PYTHON ?= $(LCGDIR)/python
export NAN_PYTHON_VERSION ?= 2.3
export NAN_PYTHON_BINARY ?= python
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
+
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_FMOD ?= $(LCGDIR)/fmod
export NAN_JPEG ?= $(LCGDIR)/jpeg
@@ -605,3 +629,8 @@ ifeq ($(NAN_NO_KETSJI), true)
export NAN_JUST_BLENDERDYNAMIC=true
export NAN_NO_OPENAL=true
endif
+
+# INTERNATIONAL implies WITH_FREETYPE2
+ifeq ($(INTERNATIONAL), true)
+ export WITH_FREETYPE2=true
+endif
diff --git a/source/nan_link.mk b/source/nan_link.mk
index e6824643a04..e0745e9c1d4 100644
--- a/source/nan_link.mk
+++ b/source/nan_link.mk
@@ -52,7 +52,6 @@ SOEXT = .so
ifeq ($(OS),beos)
LLIBS = -L/boot/develop/lib/x86/ -lGL -lbe -L/boot/home/config/lib/
- LLIBS += -lpython1.5
endif
ifeq ($(OS),darwin)
@@ -118,7 +117,14 @@ ifeq ($(OS),openbsd)
endif
ifeq ($(OS),solaris)
- LLIBS = -lGLU -lGL -lXmu -lXext -lXi -lX11 -lc -lm -ldl -lsocket -lnsl
+ ifeq (x86_64, $(findstring x86_64, $(CPU)))
+ LLIBS = -lrt
+ LLIBS += -L$(NAN_MESA)/lib/amd64
+ else
+ LLIBS += -L$(NAN_MESA)/lib
+ endif
+
+ LLIBS += -lGLU -lGL -lXmu -lXext -lXi -lX11 -lc -lm -ldl -lsocket -lnsl
DYNLDFLAGS = -shared $(LDFLAGS)
endif
@@ -162,3 +168,9 @@ endif
ifeq ($(WITH_FFMPEG),true)
LLIBS += $(NAN_FFMPEGLIBS)
endif
+
+ifeq ($(INTERNATIONAL),true)
+ LLIBS += $(NAN_GETTEXT_LIB)
+endif
+
+LLIBS += $(NAN_PYTHON_LIB)