From a1c8543f2acd7086d412cb794b32f96794b00659 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 24 Dec 2007 18:27:28 +0000 Subject: Step 3 for the initial commits for 2.5: removing src/ and python, adding new windowmanager module, and the first bits of new editors module. --- source/blender/editors/datafiles/B.blend.c | 3076 ++++ source/blender/editors/datafiles/Bfont.c | 139 + source/blender/editors/datafiles/Makefile | 49 + source/blender/editors/datafiles/bfont.ttf.c | 5992 ++++++++ source/blender/editors/datafiles/blenderbuttons.c | 2020 +++ source/blender/editors/datafiles/splash.jpg.c | 2483 ++++ source/blender/editors/include/BDR_drawaction.h | 88 + source/blender/editors/include/BDR_drawmesh.h | 84 + source/blender/editors/include/BDR_drawobject.h | 82 + source/blender/editors/include/BDR_editcurve.h | 105 + source/blender/editors/include/BDR_editface.h | 61 + source/blender/editors/include/BDR_editmball.h | 56 + source/blender/editors/include/BDR_editobject.h | 128 + source/blender/editors/include/BDR_imagepaint.h | 44 + source/blender/editors/include/BDR_sculptmode.h | 142 + source/blender/editors/include/BDR_unwrapper.h | 51 + source/blender/editors/include/BDR_vpaint.h | 58 + source/blender/editors/include/BIF_butspace.h | 140 + source/blender/editors/include/BIF_cursors.h | 103 + source/blender/editors/include/BIF_drawimage.h | 74 + source/blender/editors/include/BIF_drawoops.h | 41 + source/blender/editors/include/BIF_drawscene.h | 35 + source/blender/editors/include/BIF_drawscript.h | 41 + source/blender/editors/include/BIF_drawseq.h | 46 + source/blender/editors/include/BIF_drawtext.h | 54 + source/blender/editors/include/BIF_editaction.h | 162 + source/blender/editors/include/BIF_editarmature.h | 142 + .../blender/editors/include/BIF_editconstraint.h | 72 + source/blender/editors/include/BIF_editdeform.h | 76 + source/blender/editors/include/BIF_editfont.h | 73 + source/blender/editors/include/BIF_editgroup.h | 40 + source/blender/editors/include/BIF_editkey.h | 70 + source/blender/editors/include/BIF_editlattice.h | 45 + source/blender/editors/include/BIF_editmesh.h | 265 + source/blender/editors/include/BIF_editmode_undo.h | 59 + source/blender/editors/include/BIF_editnla.h | 65 + source/blender/editors/include/BIF_editoops.h | 47 + source/blender/editors/include/BIF_editparticle.h | 92 + source/blender/editors/include/BIF_editsca.h | 41 + source/blender/editors/include/BIF_editseq.h | 135 + source/blender/editors/include/BIF_editsima.h | 112 + source/blender/editors/include/BIF_editsound.h | 87 + source/blender/editors/include/BIF_editview.h | 61 + source/blender/editors/include/BIF_filelist.h | 86 + source/blender/editors/include/BIF_fsmenu.h | 76 + source/blender/editors/include/BIF_gl.h | 82 + source/blender/editors/include/BIF_glutil.h | 225 + source/blender/editors/include/BIF_graphics.h | 59 + source/blender/editors/include/BIF_imasel.h | 51 + source/blender/editors/include/BIF_interface.h | 331 + .../blender/editors/include/BIF_interface_icons.h | 72 + source/blender/editors/include/BIF_keyval.h | 39 + source/blender/editors/include/BIF_language.h | 69 + source/blender/editors/include/BIF_mainqueue.h | 47 + source/blender/editors/include/BIF_meshlaplacian.h | 87 + source/blender/editors/include/BIF_meshtools.h | 51 + source/blender/editors/include/BIF_mywindow.h | 145 + source/blender/editors/include/BIF_oops.h | 71 + source/blender/editors/include/BIF_outliner.h | 106 + source/blender/editors/include/BIF_poseobject.h | 71 + source/blender/editors/include/BIF_previewrender.h | 94 + source/blender/editors/include/BIF_renderwin.h | 67 + source/blender/editors/include/BIF_resources.h | 600 + source/blender/editors/include/BIF_retopo.h | 110 + source/blender/editors/include/BIF_scrarea.h | 54 + source/blender/editors/include/BIF_screen.h | 137 + source/blender/editors/include/BIF_space.h | 148 + source/blender/editors/include/BIF_spacetypes.h | 67 + source/blender/editors/include/BIF_tbcallback.h | 42 + source/blender/editors/include/BIF_toets.h | 41 + source/blender/editors/include/BIF_toolbox.h | 68 + source/blender/editors/include/BIF_transform.h | 110 + source/blender/editors/include/BIF_usiblender.h | 54 + source/blender/editors/include/BIF_verse.h | 142 + source/blender/editors/include/BIF_writeavicodec.h | 44 + source/blender/editors/include/BIF_writeimage.h | 45 + source/blender/editors/include/BIF_writemovie.h | 41 + source/blender/editors/include/BPI_script.h | 71 + source/blender/editors/include/BSE_drawimasel.h | 60 + source/blender/editors/include/BSE_drawipo.h | 76 + source/blender/editors/include/BSE_drawnla.h | 52 + source/blender/editors/include/BSE_drawoops.h | 50 + source/blender/editors/include/BSE_drawview.h | 88 + source/blender/editors/include/BSE_edit.h | 55 + .../blender/editors/include/BSE_editaction_types.h | 77 + source/blender/editors/include/BSE_editipo.h | 179 + source/blender/editors/include/BSE_editipo_types.h | 53 + source/blender/editors/include/BSE_editnla_types.h | 41 + source/blender/editors/include/BSE_filesel.h | 66 + source/blender/editors/include/BSE_headerbuttons.h | 158 + source/blender/editors/include/BSE_node.h | 137 + source/blender/editors/include/BSE_seqaudio.h | 53 + source/blender/editors/include/BSE_seqeffects.h | 96 + source/blender/editors/include/BSE_seqscopes.h | 38 + source/blender/editors/include/BSE_sequence.h | 89 + source/blender/editors/include/BSE_time.h | 71 + source/blender/editors/include/BSE_trans_types.h | 90 + source/blender/editors/include/BSE_types.h | 69 + source/blender/editors/include/BSE_view.h | 97 + source/blender/editors/include/LOD_DependKludge.h | 40 + source/blender/editors/include/blendef.h | 465 + source/blender/editors/include/butspace.h | 762 + source/blender/editors/include/datatoc.h | 63 + source/blender/editors/include/editlattice_ext.h | 42 + source/blender/editors/include/editmesh.h | 110 + source/blender/editors/include/interface.h | 236 + source/blender/editors/include/keyed_functions.h | 58 + source/blender/editors/include/license_key.h | 95 + source/blender/editors/include/multires.h | 81 + source/blender/editors/include/mydevice.h | 260 + source/blender/editors/include/nla.h | 45 + source/blender/editors/include/objfnt.h | 105 + source/blender/editors/include/particle_effect.h | 47 + source/blender/editors/include/playanim_ext.h | 41 + source/blender/editors/include/transform.h | 458 + source/blender/python/BPY_extern.h | 136 - source/blender/python/BPY_interface.c | 2659 ---- source/blender/python/BPY_menus.c | 1118 -- source/blender/python/BPY_menus.h | 128 - source/blender/python/CMakeLists.txt | 57 - source/blender/python/Makefile | 37 - source/blender/python/SConscript | 26 - source/blender/python/api2_2x/Armature.c | 1490 -- source/blender/python/api2_2x/Armature.h | 70 - source/blender/python/api2_2x/BGL.c | 1590 --- source/blender/python/api2_2x/BGL.h | 333 - source/blender/python/api2_2x/BezTriple.c | 716 - source/blender/python/api2_2x/BezTriple.h | 64 - source/blender/python/api2_2x/Blender.c | 1004 -- source/blender/python/api2_2x/Blender.h | 41 - source/blender/python/api2_2x/Bone.c | 1425 -- source/blender/python/api2_2x/Bone.h | 76 - source/blender/python/api2_2x/Camera.c | 1057 -- source/blender/python/api2_2x/Camera.h | 82 - source/blender/python/api2_2x/Constraint.c | 2692 ---- source/blender/python/api2_2x/Constraint.h | 76 - source/blender/python/api2_2x/CurNurb.c | 1098 -- source/blender/python/api2_2x/CurNurb.h | 70 - source/blender/python/api2_2x/Curve.c | 1696 --- source/blender/python/api2_2x/Curve.h | 78 - source/blender/python/api2_2x/Draw.c | 2197 --- source/blender/python/api2_2x/Draw.h | 77 - source/blender/python/api2_2x/EXPP_interface.c | 230 - source/blender/python/api2_2x/EXPP_interface.h | 56 - source/blender/python/api2_2x/Effect.c | 1575 --- source/blender/python/api2_2x/Effect.h | 58 - source/blender/python/api2_2x/Font.c | 403 - source/blender/python/api2_2x/Font.h | 53 - source/blender/python/api2_2x/Geometry.c | 428 - source/blender/python/api2_2x/Geometry.h | 42 - source/blender/python/api2_2x/Group.c | 813 -- source/blender/python/api2_2x/Group.h | 66 - source/blender/python/api2_2x/IDProp.c | 895 -- source/blender/python/api2_2x/IDProp.h | 61 - source/blender/python/api2_2x/Image.c | 1339 -- source/blender/python/api2_2x/Image.h | 60 - source/blender/python/api2_2x/Ipo.c | 1842 --- source/blender/python/api2_2x/Ipo.h | 63 - source/blender/python/api2_2x/Ipocurve.c | 1080 -- source/blender/python/api2_2x/Ipocurve.h | 58 - source/blender/python/api2_2x/Key.c | 681 - source/blender/python/api2_2x/Key.h | 68 - source/blender/python/api2_2x/Lamp.c | 1570 --- source/blender/python/api2_2x/Lamp.h | 61 - source/blender/python/api2_2x/Lattice.c | 813 -- source/blender/python/api2_2x/Lattice.h | 60 - source/blender/python/api2_2x/Library.c | 1192 -- source/blender/python/api2_2x/Library.h | 78 - source/blender/python/api2_2x/MTex.c | 827 -- source/blender/python/api2_2x/MTex.h | 63 - source/blender/python/api2_2x/Makefile | 64 - source/blender/python/api2_2x/Material.c | 3048 ---- source/blender/python/api2_2x/Material.h | 78 - source/blender/python/api2_2x/Mathutils.c | 1804 --- source/blender/python/api2_2x/Mathutils.h | 85 - source/blender/python/api2_2x/Mesh.c | 8677 ------------ source/blender/python/api2_2x/Mesh.h | 127 - source/blender/python/api2_2x/Metaball.c | 1189 -- source/blender/python/api2_2x/Metaball.h | 81 - source/blender/python/api2_2x/Modifier.c | 1693 --- source/blender/python/api2_2x/Modifier.h | 72 - source/blender/python/api2_2x/NLA.c | 1590 --- source/blender/python/api2_2x/NLA.h | 77 - source/blender/python/api2_2x/NMesh.c | 4164 ------ source/blender/python/api2_2x/NMesh.h | 157 - source/blender/python/api2_2x/Node.c | 1213 -- source/blender/python/api2_2x/Node.h | 91 - source/blender/python/api2_2x/Noise.c | 713 - source/blender/python/api2_2x/Object.c | 5964 -------- source/blender/python/api2_2x/Object.h | 62 - source/blender/python/api2_2x/Particle.c | 1040 -- source/blender/python/api2_2x/Particle.h | 67 - source/blender/python/api2_2x/Pose.c | 1395 -- source/blender/python/api2_2x/Pose.h | 71 - source/blender/python/api2_2x/Registry.c | 245 - source/blender/python/api2_2x/Registry.h | 50 - source/blender/python/api2_2x/Scene.c | 1868 --- source/blender/python/api2_2x/Scene.h | 70 - source/blender/python/api2_2x/Sound.c | 607 - source/blender/python/api2_2x/Sound.h | 57 - source/blender/python/api2_2x/SurfNurb.c | 857 -- source/blender/python/api2_2x/SurfNurb.h | 68 - source/blender/python/api2_2x/Sys.c | 400 - source/blender/python/api2_2x/Sys.h | 40 - source/blender/python/api2_2x/Text.c | 576 - source/blender/python/api2_2x/Text.h | 52 - source/blender/python/api2_2x/Text3d.c | 1206 -- source/blender/python/api2_2x/Text3d.h | 56 - source/blender/python/api2_2x/Texture.c | 2516 ---- source/blender/python/api2_2x/Texture.h | 64 - source/blender/python/api2_2x/Types.c | 262 - source/blender/python/api2_2x/Types.h | 41 - source/blender/python/api2_2x/Window.c | 1594 --- source/blender/python/api2_2x/Window.h | 43 - source/blender/python/api2_2x/World.c | 1034 -- source/blender/python/api2_2x/World.h | 58 - source/blender/python/api2_2x/bpy.c | 86 - source/blender/python/api2_2x/bpy.h | 41 - source/blender/python/api2_2x/bpy_config.c | 414 - source/blender/python/api2_2x/bpy_config.h | 52 - source/blender/python/api2_2x/bpy_data.c | 817 -- source/blender/python/api2_2x/bpy_data.h | 55 - source/blender/python/api2_2x/bpy_types.h | 93 - source/blender/python/api2_2x/charRGBA.c | 475 - source/blender/python/api2_2x/charRGBA.h | 59 - source/blender/python/api2_2x/constant.c | 269 - source/blender/python/api2_2x/constant.h | 53 - source/blender/python/api2_2x/doc/API_intro.py | 247 - source/blender/python/api2_2x/doc/API_related.py | 564 - source/blender/python/api2_2x/doc/Armature.py | 368 - source/blender/python/api2_2x/doc/BGL.py | 1778 --- source/blender/python/api2_2x/doc/BezTriple.py | 96 - source/blender/python/api2_2x/doc/Blender.py | 240 - source/blender/python/api2_2x/doc/Blender_API.css | 44 - source/blender/python/api2_2x/doc/Bpy.py | 25 - source/blender/python/api2_2x/doc/Bpy_config.py | 38 - source/blender/python/api2_2x/doc/Bpy_data.py | 281 - source/blender/python/api2_2x/doc/Camera.py | 257 - source/blender/python/api2_2x/doc/Constraint.py | 248 - source/blender/python/api2_2x/doc/Curve.py | 723 - source/blender/python/api2_2x/doc/Curvedoc.txt | 105 - source/blender/python/api2_2x/doc/Draw.py | 880 -- source/blender/python/api2_2x/doc/Effect.py | 590 - source/blender/python/api2_2x/doc/Effectdoc.txt | 257 - source/blender/python/api2_2x/doc/Font.py | 69 - source/blender/python/api2_2x/doc/Geometry.py | 97 - source/blender/python/api2_2x/doc/Group.py | 127 - source/blender/python/api2_2x/doc/IDProp.py | 130 - source/blender/python/api2_2x/doc/Image.py | 374 - source/blender/python/api2_2x/doc/Ipo.py | 437 - source/blender/python/api2_2x/doc/IpoCurve.py | 226 - source/blender/python/api2_2x/doc/Ipodoc.txt | 66 - source/blender/python/api2_2x/doc/Key.py | 124 - source/blender/python/api2_2x/doc/Lamp.py | 521 - source/blender/python/api2_2x/doc/Lattice.py | 209 - source/blender/python/api2_2x/doc/LibData.py | 137 - source/blender/python/api2_2x/doc/Library.py | 114 - source/blender/python/api2_2x/doc/Material.py | 1061 -- source/blender/python/api2_2x/doc/Mathutils.py | 864 -- source/blender/python/api2_2x/doc/Mesh.py | 1215 -- .../blender/python/api2_2x/doc/MeshPrimitives.py | 157 - source/blender/python/api2_2x/doc/Metaball.py | 246 - source/blender/python/api2_2x/doc/Metaballdoc.txt | 58 - source/blender/python/api2_2x/doc/Modifier.py | 226 - source/blender/python/api2_2x/doc/NLA.py | 245 - source/blender/python/api2_2x/doc/NMesh.py | 823 -- source/blender/python/api2_2x/doc/Noise.py | 300 - source/blender/python/api2_2x/doc/Object.py | 1757 --- source/blender/python/api2_2x/doc/Pose.py | 245 - source/blender/python/api2_2x/doc/Radio.py | 351 - source/blender/python/api2_2x/doc/Registry.py | 122 - source/blender/python/api2_2x/doc/Render.py | 1192 -- source/blender/python/api2_2x/doc/Scene.py | 392 - source/blender/python/api2_2x/doc/Sound.py | 147 - source/blender/python/api2_2x/doc/Sys.py | 167 - source/blender/python/api2_2x/doc/Text.py | 129 - source/blender/python/api2_2x/doc/Text3d.py | 302 - source/blender/python/api2_2x/doc/Texture.py | 557 - source/blender/python/api2_2x/doc/Theme.py | 211 - source/blender/python/api2_2x/doc/TimeLine.py | 80 - source/blender/python/api2_2x/doc/Types.py | 70 - source/blender/python/api2_2x/doc/Window.py | 538 - source/blender/python/api2_2x/doc/World.py | 351 - source/blender/python/api2_2x/doc/Worlddoc.txt | 55 - source/blender/python/api2_2x/doc/epy_docgen-3.sh | 12 - source/blender/python/api2_2x/doc/epy_docgen.sh | 12 - source/blender/python/api2_2x/doc/id_generics.py | 30 - source/blender/python/api2_2x/doc/testbgl.py | 45 - source/blender/python/api2_2x/doc/testcamera.py | 137 - source/blender/python/api2_2x/doc/testcurve.py | 20 - source/blender/python/api2_2x/doc/testeffect.py | 65 - source/blender/python/api2_2x/doc/testipo.py | 24 - source/blender/python/api2_2x/doc/testmball.py | 37 - source/blender/python/api2_2x/doc/testtext.py | 29 - source/blender/python/api2_2x/doc/testworld.py | 21 - source/blender/python/api2_2x/euler.c | 502 - source/blender/python/api2_2x/euler.h | 67 - source/blender/python/api2_2x/gen_library.c | 332 - source/blender/python/api2_2x/gen_library.h | 94 - source/blender/python/api2_2x/gen_utils.c | 948 -- source/blender/python/api2_2x/gen_utils.h | 176 - source/blender/python/api2_2x/logic.c | 529 - source/blender/python/api2_2x/logic.h | 61 - source/blender/python/api2_2x/matrix.c | 975 -- source/blender/python/api2_2x/matrix.h | 80 - source/blender/python/api2_2x/meshPrimitive.c | 279 - source/blender/python/api2_2x/meshPrimitive.h | 46 - source/blender/python/api2_2x/modules.h | 65 - source/blender/python/api2_2x/point.c | 526 - source/blender/python/api2_2x/point.h | 67 - source/blender/python/api2_2x/quat.c | 668 - source/blender/python/api2_2x/quat.h | 73 - source/blender/python/api2_2x/rgbTuple.c | 420 - source/blender/python/api2_2x/rgbTuple.h | 56 - source/blender/python/api2_2x/sceneRadio.c | 893 -- source/blender/python/api2_2x/sceneRadio.h | 51 - source/blender/python/api2_2x/sceneRender.c | 3216 ----- source/blender/python/api2_2x/sceneRender.h | 52 - source/blender/python/api2_2x/sceneSequence.c | 1163 -- source/blender/python/api2_2x/sceneSequence.h | 83 - source/blender/python/api2_2x/sceneTimeLine.c | 319 - source/blender/python/api2_2x/sceneTimeLine.h | 58 - source/blender/python/api2_2x/vector.c | 1264 -- source/blender/python/api2_2x/vector.h | 61 - source/blender/python/api2_2x/windowTheme.c | 828 -- source/blender/python/api2_2x/windowTheme.h | 60 - source/blender/src/.BCkey | 1 - source/blender/src/B.blend.c | 3076 ---- source/blender/src/Bfont.c | 139 - source/blender/src/CMakeLists.txt | 85 - source/blender/src/Makefile | 149 - source/blender/src/SConscript | 82 - source/blender/src/bfont.ttf.c | 5992 -------- source/blender/src/blenderbuttons.c | 2020 --- source/blender/src/booleanops.c | 566 - source/blender/src/booleanops_mesh.c | 296 - source/blender/src/butspace.c | 801 -- source/blender/src/buttons_editing.c | 6153 -------- source/blender/src/buttons_logic.c | 2814 ---- source/blender/src/buttons_object.c | 4749 ------- source/blender/src/buttons_scene.c | 2082 --- source/blender/src/buttons_script.c | 384 - source/blender/src/buttons_shading.c | 4372 ------ source/blender/src/cmap.tga.c | 92 - source/blender/src/cmovie.tga.c | 205 - source/blender/src/cre/license.jpeg.c | 38 - source/blender/src/cre/license_key.c | 197 - source/blender/src/cursors.c | 840 -- source/blender/src/drawaction.c | 1294 -- source/blender/src/drawarmature.c | 2279 --- source/blender/src/drawdeps.c | 316 - source/blender/src/drawimage.c | 2721 ---- source/blender/src/drawimasel.c | 735 - source/blender/src/drawipo.c | 2730 ---- source/blender/src/drawmesh.c | 1222 -- source/blender/src/drawnla.c | 862 -- source/blender/src/drawnode.c | 2886 ---- source/blender/src/drawobject.c | 5555 -------- source/blender/src/drawoops.c | 521 - source/blender/src/drawscene.c | 135 - source/blender/src/drawscript.c | 153 - source/blender/src/drawseq.c | 1482 -- source/blender/src/drawsound.c | 240 - source/blender/src/drawtext.c | 2230 --- source/blender/src/drawtime.c | 454 - source/blender/src/drawview.c | 3633 ----- source/blender/src/edit.c | 1936 --- source/blender/src/editaction.c | 3097 ----- source/blender/src/editarmature.c | 4770 ------- source/blender/src/editconstraint.c | 1103 -- source/blender/src/editcurve.c | 4632 ------ source/blender/src/editdeform.c | 944 -- source/blender/src/editface.c | 1437 -- source/blender/src/editfont.c | 1291 -- source/blender/src/editgroup.c | 186 - source/blender/src/editimasel.c | 1156 -- source/blender/src/editipo.c | 5790 -------- source/blender/src/editipo_lib.c | 401 - source/blender/src/editipo_mods.c | 1403 -- source/blender/src/editkey.c | 777 -- source/blender/src/editlattice.c | 323 - source/blender/src/editmball.c | 544 - source/blender/src/editmesh.c | 2205 --- source/blender/src/editmesh_add.c | 1349 -- source/blender/src/editmesh_lib.c | 2239 --- source/blender/src/editmesh_loop.c | 954 -- source/blender/src/editmesh_mods.c | 4139 ------ source/blender/src/editmesh_tools.c | 6800 --------- source/blender/src/editmode_undo.c | 348 - source/blender/src/editnla.c | 2054 --- source/blender/src/editnode.c | 2244 --- source/blender/src/editobject.c | 5620 -------- source/blender/src/editoops.c | 675 - source/blender/src/editparticle.c | 3141 ----- source/blender/src/editscreen.c | 3818 ----- source/blender/src/editseq.c | 3705 ----- source/blender/src/editsima.c | 2436 ---- source/blender/src/editsound.c | 1063 -- source/blender/src/edittime.c | 1008 -- source/blender/src/editview.c | 2777 ---- source/blender/src/eventdebug.c | 195 - source/blender/src/filelist.c | 1135 -- source/blender/src/filesel.c | 2611 ---- source/blender/src/fluidsim.c | 1147 -- source/blender/src/fsmenu.c | 257 - source/blender/src/ghostwinlay.c | 835 -- source/blender/src/glutil.c | 695 - source/blender/src/hddaudio.c | 577 - source/blender/src/header_action.c | 1285 -- source/blender/src/header_buttonswin.c | 729 - source/blender/src/header_filesel.c | 194 - source/blender/src/header_image.c | 1305 -- source/blender/src/header_imasel.c | 211 - source/blender/src/header_info.c | 2181 --- source/blender/src/header_ipo.c | 1408 -- source/blender/src/header_nla.c | 566 - source/blender/src/header_node.c | 673 - source/blender/src/header_oops.c | 578 - source/blender/src/header_script.c | 280 - source/blender/src/header_seq.c | 729 - source/blender/src/header_sound.c | 444 - source/blender/src/header_text.c | 847 -- source/blender/src/header_time.c | 539 - source/blender/src/header_view3d.c | 5489 -------- source/blender/src/headerbuttons.c | 2091 --- source/blender/src/imagepaint.c | 790 -- source/blender/src/imasel.c | 85 - source/blender/src/interface.c | 6699 --------- source/blender/src/interface_draw.c | 2467 ---- source/blender/src/interface_icons.c | 1074 -- source/blender/src/interface_panel.c | 1957 --- source/blender/src/keyval.c | 354 - source/blender/src/language.c | 453 - source/blender/src/lorem.c | 516 - source/blender/src/mainqueue.c | 102 - source/blender/src/meshlaplacian.c | 1891 --- source/blender/src/meshtools.c | 1132 -- source/blender/src/multires-firstlevel.c | 410 - source/blender/src/multires.c | 1650 --- source/blender/src/mywindow.c | 744 - source/blender/src/oops.c | 1104 -- source/blender/src/outliner.c | 3640 ----- source/blender/src/parametrizer.c | 4200 ------ source/blender/src/parametrizer.h | 85 - source/blender/src/parametrizer_intern.h | 192 - source/blender/src/playanim.c | 813 -- source/blender/src/poseobject.c | 1258 -- source/blender/src/preview.blend.c | 13901 ------------------- source/blender/src/previewrender.c | 912 -- source/blender/src/prvicons.c | 436 - source/blender/src/pub/license_key.c | 447 - source/blender/src/reeb.c | 1923 --- source/blender/src/renderwin.c | 1449 -- source/blender/src/resources.c | 923 -- source/blender/src/retopo.c | 921 -- source/blender/src/scrarea.c | 69 - source/blender/src/screendump.c | 161 - source/blender/src/sculptmode-stroke.c | 279 - source/blender/src/sculptmode.c | 2267 --- source/blender/src/seqaudio.c | 553 - source/blender/src/seqeffects.c | 3032 ---- source/blender/src/seqscopes.c | 340 - source/blender/src/sequence.c | 1776 --- source/blender/src/space.c | 6678 --------- source/blender/src/spacetypes.c | 161 - source/blender/src/splash.jpg.c | 2483 ---- source/blender/src/swapbuffers.c | 289 - source/blender/src/toets.c | 983 -- source/blender/src/toolbox.c | 2245 --- source/blender/src/transform.c | 4115 ------ source/blender/src/transform_constraints.c | 1046 -- source/blender/src/transform_conversions.c | 3616 ----- source/blender/src/transform_generics.c | 1061 -- source/blender/src/transform_manipulator.c | 1720 --- source/blender/src/transform_numinput.c | 247 - source/blender/src/transform_snap.c | 712 - source/blender/src/unwrapper.c | 480 - source/blender/src/usiblender.c | 1050 -- source/blender/src/verse_common.c | 298 - source/blender/src/verse_image.c | 343 - source/blender/src/verse_mesh.c | 1629 --- source/blender/src/verse_object.c | 600 - source/blender/src/view.c | 1863 --- source/blender/src/vpaint.c | 1621 --- source/blender/src/winlay.h | 88 - source/blender/src/writeavicodec.c | 835 -- source/blender/src/writeimage.c | 243 - source/blender/src/writemovie.c | 502 - source/blender/windowmanager/Makefile | 34 + source/blender/windowmanager/WM_api.h | 77 + source/blender/windowmanager/WM_types.h | 70 + source/blender/windowmanager/intern/Makefile | 98 + source/blender/windowmanager/intern/wm.c | 164 + source/blender/windowmanager/intern/wm_apple.c | 138 + source/blender/windowmanager/intern/wm_cursors.c | 879 ++ .../blender/windowmanager/intern/wm_event_system.c | 470 + source/blender/windowmanager/intern/wm_files.c | 929 ++ source/blender/windowmanager/intern/wm_init_exit.c | 302 + source/blender/windowmanager/intern/wm_keymap.c | 112 + source/blender/windowmanager/intern/wm_operators.c | 125 + source/blender/windowmanager/intern/wm_window.c | 491 + source/blender/windowmanager/wm.h | 43 + source/blender/windowmanager/wm_cursors.h | 115 + source/blender/windowmanager/wm_event_system.h | 97 + source/blender/windowmanager/wm_event_types.h | 255 + source/blender/windowmanager/wm_files.h | 36 + source/blender/windowmanager/wm_window.h | 59 + 507 files changed, 29536 insertions(+), 381865 deletions(-) create mode 100644 source/blender/editors/datafiles/B.blend.c create mode 100644 source/blender/editors/datafiles/Bfont.c create mode 100644 source/blender/editors/datafiles/Makefile create mode 100644 source/blender/editors/datafiles/bfont.ttf.c create mode 100644 source/blender/editors/datafiles/blenderbuttons.c create mode 100644 source/blender/editors/datafiles/splash.jpg.c create mode 100644 source/blender/editors/include/BDR_drawaction.h create mode 100644 source/blender/editors/include/BDR_drawmesh.h create mode 100644 source/blender/editors/include/BDR_drawobject.h create mode 100644 source/blender/editors/include/BDR_editcurve.h create mode 100644 source/blender/editors/include/BDR_editface.h create mode 100644 source/blender/editors/include/BDR_editmball.h create mode 100644 source/blender/editors/include/BDR_editobject.h create mode 100644 source/blender/editors/include/BDR_imagepaint.h create mode 100644 source/blender/editors/include/BDR_sculptmode.h create mode 100644 source/blender/editors/include/BDR_unwrapper.h create mode 100644 source/blender/editors/include/BDR_vpaint.h create mode 100644 source/blender/editors/include/BIF_butspace.h create mode 100644 source/blender/editors/include/BIF_cursors.h create mode 100644 source/blender/editors/include/BIF_drawimage.h create mode 100644 source/blender/editors/include/BIF_drawoops.h create mode 100644 source/blender/editors/include/BIF_drawscene.h create mode 100644 source/blender/editors/include/BIF_drawscript.h create mode 100644 source/blender/editors/include/BIF_drawseq.h create mode 100644 source/blender/editors/include/BIF_drawtext.h create mode 100644 source/blender/editors/include/BIF_editaction.h create mode 100644 source/blender/editors/include/BIF_editarmature.h create mode 100644 source/blender/editors/include/BIF_editconstraint.h create mode 100644 source/blender/editors/include/BIF_editdeform.h create mode 100644 source/blender/editors/include/BIF_editfont.h create mode 100644 source/blender/editors/include/BIF_editgroup.h create mode 100644 source/blender/editors/include/BIF_editkey.h create mode 100644 source/blender/editors/include/BIF_editlattice.h create mode 100644 source/blender/editors/include/BIF_editmesh.h create mode 100644 source/blender/editors/include/BIF_editmode_undo.h create mode 100644 source/blender/editors/include/BIF_editnla.h create mode 100644 source/blender/editors/include/BIF_editoops.h create mode 100644 source/blender/editors/include/BIF_editparticle.h create mode 100644 source/blender/editors/include/BIF_editsca.h create mode 100644 source/blender/editors/include/BIF_editseq.h create mode 100644 source/blender/editors/include/BIF_editsima.h create mode 100644 source/blender/editors/include/BIF_editsound.h create mode 100644 source/blender/editors/include/BIF_editview.h create mode 100644 source/blender/editors/include/BIF_filelist.h create mode 100644 source/blender/editors/include/BIF_fsmenu.h create mode 100644 source/blender/editors/include/BIF_gl.h create mode 100644 source/blender/editors/include/BIF_glutil.h create mode 100644 source/blender/editors/include/BIF_graphics.h create mode 100644 source/blender/editors/include/BIF_imasel.h create mode 100644 source/blender/editors/include/BIF_interface.h create mode 100644 source/blender/editors/include/BIF_interface_icons.h create mode 100644 source/blender/editors/include/BIF_keyval.h create mode 100644 source/blender/editors/include/BIF_language.h create mode 100644 source/blender/editors/include/BIF_mainqueue.h create mode 100644 source/blender/editors/include/BIF_meshlaplacian.h create mode 100644 source/blender/editors/include/BIF_meshtools.h create mode 100644 source/blender/editors/include/BIF_mywindow.h create mode 100644 source/blender/editors/include/BIF_oops.h create mode 100644 source/blender/editors/include/BIF_outliner.h create mode 100644 source/blender/editors/include/BIF_poseobject.h create mode 100644 source/blender/editors/include/BIF_previewrender.h create mode 100644 source/blender/editors/include/BIF_renderwin.h create mode 100644 source/blender/editors/include/BIF_resources.h create mode 100644 source/blender/editors/include/BIF_retopo.h create mode 100644 source/blender/editors/include/BIF_scrarea.h create mode 100644 source/blender/editors/include/BIF_screen.h create mode 100644 source/blender/editors/include/BIF_space.h create mode 100644 source/blender/editors/include/BIF_spacetypes.h create mode 100644 source/blender/editors/include/BIF_tbcallback.h create mode 100644 source/blender/editors/include/BIF_toets.h create mode 100644 source/blender/editors/include/BIF_toolbox.h create mode 100644 source/blender/editors/include/BIF_transform.h create mode 100644 source/blender/editors/include/BIF_usiblender.h create mode 100644 source/blender/editors/include/BIF_verse.h create mode 100644 source/blender/editors/include/BIF_writeavicodec.h create mode 100644 source/blender/editors/include/BIF_writeimage.h create mode 100644 source/blender/editors/include/BIF_writemovie.h create mode 100644 source/blender/editors/include/BPI_script.h create mode 100644 source/blender/editors/include/BSE_drawimasel.h create mode 100644 source/blender/editors/include/BSE_drawipo.h create mode 100644 source/blender/editors/include/BSE_drawnla.h create mode 100644 source/blender/editors/include/BSE_drawoops.h create mode 100644 source/blender/editors/include/BSE_drawview.h create mode 100644 source/blender/editors/include/BSE_edit.h create mode 100644 source/blender/editors/include/BSE_editaction_types.h create mode 100644 source/blender/editors/include/BSE_editipo.h create mode 100644 source/blender/editors/include/BSE_editipo_types.h create mode 100644 source/blender/editors/include/BSE_editnla_types.h create mode 100644 source/blender/editors/include/BSE_filesel.h create mode 100644 source/blender/editors/include/BSE_headerbuttons.h create mode 100644 source/blender/editors/include/BSE_node.h create mode 100644 source/blender/editors/include/BSE_seqaudio.h create mode 100644 source/blender/editors/include/BSE_seqeffects.h create mode 100644 source/blender/editors/include/BSE_seqscopes.h create mode 100644 source/blender/editors/include/BSE_sequence.h create mode 100644 source/blender/editors/include/BSE_time.h create mode 100644 source/blender/editors/include/BSE_trans_types.h create mode 100644 source/blender/editors/include/BSE_types.h create mode 100644 source/blender/editors/include/BSE_view.h create mode 100644 source/blender/editors/include/LOD_DependKludge.h create mode 100644 source/blender/editors/include/blendef.h create mode 100644 source/blender/editors/include/butspace.h create mode 100644 source/blender/editors/include/datatoc.h create mode 100644 source/blender/editors/include/editlattice_ext.h create mode 100644 source/blender/editors/include/editmesh.h create mode 100644 source/blender/editors/include/interface.h create mode 100644 source/blender/editors/include/keyed_functions.h create mode 100644 source/blender/editors/include/license_key.h create mode 100644 source/blender/editors/include/multires.h create mode 100644 source/blender/editors/include/mydevice.h create mode 100644 source/blender/editors/include/nla.h create mode 100644 source/blender/editors/include/objfnt.h create mode 100644 source/blender/editors/include/particle_effect.h create mode 100644 source/blender/editors/include/playanim_ext.h create mode 100644 source/blender/editors/include/transform.h delete mode 100644 source/blender/python/BPY_extern.h delete mode 100644 source/blender/python/BPY_interface.c delete mode 100644 source/blender/python/BPY_menus.c delete mode 100644 source/blender/python/BPY_menus.h delete mode 100644 source/blender/python/CMakeLists.txt delete mode 100644 source/blender/python/Makefile delete mode 100644 source/blender/python/SConscript delete mode 100644 source/blender/python/api2_2x/Armature.c delete mode 100644 source/blender/python/api2_2x/Armature.h delete mode 100644 source/blender/python/api2_2x/BGL.c delete mode 100644 source/blender/python/api2_2x/BGL.h delete mode 100644 source/blender/python/api2_2x/BezTriple.c delete mode 100644 source/blender/python/api2_2x/BezTriple.h delete mode 100644 source/blender/python/api2_2x/Blender.c delete mode 100644 source/blender/python/api2_2x/Blender.h delete mode 100644 source/blender/python/api2_2x/Bone.c delete mode 100644 source/blender/python/api2_2x/Bone.h delete mode 100644 source/blender/python/api2_2x/Camera.c delete mode 100644 source/blender/python/api2_2x/Camera.h delete mode 100644 source/blender/python/api2_2x/Constraint.c delete mode 100644 source/blender/python/api2_2x/Constraint.h delete mode 100644 source/blender/python/api2_2x/CurNurb.c delete mode 100644 source/blender/python/api2_2x/CurNurb.h delete mode 100644 source/blender/python/api2_2x/Curve.c delete mode 100644 source/blender/python/api2_2x/Curve.h delete mode 100644 source/blender/python/api2_2x/Draw.c delete mode 100644 source/blender/python/api2_2x/Draw.h delete mode 100644 source/blender/python/api2_2x/EXPP_interface.c delete mode 100644 source/blender/python/api2_2x/EXPP_interface.h delete mode 100644 source/blender/python/api2_2x/Effect.c delete mode 100644 source/blender/python/api2_2x/Effect.h delete mode 100644 source/blender/python/api2_2x/Font.c delete mode 100644 source/blender/python/api2_2x/Font.h delete mode 100644 source/blender/python/api2_2x/Geometry.c delete mode 100644 source/blender/python/api2_2x/Geometry.h delete mode 100644 source/blender/python/api2_2x/Group.c delete mode 100644 source/blender/python/api2_2x/Group.h delete mode 100644 source/blender/python/api2_2x/IDProp.c delete mode 100644 source/blender/python/api2_2x/IDProp.h delete mode 100644 source/blender/python/api2_2x/Image.c delete mode 100644 source/blender/python/api2_2x/Image.h delete mode 100644 source/blender/python/api2_2x/Ipo.c delete mode 100644 source/blender/python/api2_2x/Ipo.h delete mode 100644 source/blender/python/api2_2x/Ipocurve.c delete mode 100644 source/blender/python/api2_2x/Ipocurve.h delete mode 100644 source/blender/python/api2_2x/Key.c delete mode 100644 source/blender/python/api2_2x/Key.h delete mode 100644 source/blender/python/api2_2x/Lamp.c delete mode 100644 source/blender/python/api2_2x/Lamp.h delete mode 100644 source/blender/python/api2_2x/Lattice.c delete mode 100644 source/blender/python/api2_2x/Lattice.h delete mode 100644 source/blender/python/api2_2x/Library.c delete mode 100644 source/blender/python/api2_2x/Library.h delete mode 100644 source/blender/python/api2_2x/MTex.c delete mode 100644 source/blender/python/api2_2x/MTex.h delete mode 100644 source/blender/python/api2_2x/Makefile delete mode 100644 source/blender/python/api2_2x/Material.c delete mode 100644 source/blender/python/api2_2x/Material.h delete mode 100644 source/blender/python/api2_2x/Mathutils.c delete mode 100644 source/blender/python/api2_2x/Mathutils.h delete mode 100644 source/blender/python/api2_2x/Mesh.c delete mode 100644 source/blender/python/api2_2x/Mesh.h delete mode 100644 source/blender/python/api2_2x/Metaball.c delete mode 100644 source/blender/python/api2_2x/Metaball.h delete mode 100644 source/blender/python/api2_2x/Modifier.c delete mode 100644 source/blender/python/api2_2x/Modifier.h delete mode 100644 source/blender/python/api2_2x/NLA.c delete mode 100644 source/blender/python/api2_2x/NLA.h delete mode 100644 source/blender/python/api2_2x/NMesh.c delete mode 100644 source/blender/python/api2_2x/NMesh.h delete mode 100644 source/blender/python/api2_2x/Node.c delete mode 100644 source/blender/python/api2_2x/Node.h delete mode 100644 source/blender/python/api2_2x/Noise.c delete mode 100644 source/blender/python/api2_2x/Object.c delete mode 100644 source/blender/python/api2_2x/Object.h delete mode 100644 source/blender/python/api2_2x/Particle.c delete mode 100644 source/blender/python/api2_2x/Particle.h delete mode 100644 source/blender/python/api2_2x/Pose.c delete mode 100644 source/blender/python/api2_2x/Pose.h delete mode 100644 source/blender/python/api2_2x/Registry.c delete mode 100644 source/blender/python/api2_2x/Registry.h delete mode 100644 source/blender/python/api2_2x/Scene.c delete mode 100644 source/blender/python/api2_2x/Scene.h delete mode 100644 source/blender/python/api2_2x/Sound.c delete mode 100644 source/blender/python/api2_2x/Sound.h delete mode 100644 source/blender/python/api2_2x/SurfNurb.c delete mode 100644 source/blender/python/api2_2x/SurfNurb.h delete mode 100644 source/blender/python/api2_2x/Sys.c delete mode 100644 source/blender/python/api2_2x/Sys.h delete mode 100644 source/blender/python/api2_2x/Text.c delete mode 100644 source/blender/python/api2_2x/Text.h delete mode 100644 source/blender/python/api2_2x/Text3d.c delete mode 100644 source/blender/python/api2_2x/Text3d.h delete mode 100644 source/blender/python/api2_2x/Texture.c delete mode 100644 source/blender/python/api2_2x/Texture.h delete mode 100644 source/blender/python/api2_2x/Types.c delete mode 100644 source/blender/python/api2_2x/Types.h delete mode 100644 source/blender/python/api2_2x/Window.c delete mode 100644 source/blender/python/api2_2x/Window.h delete mode 100644 source/blender/python/api2_2x/World.c delete mode 100644 source/blender/python/api2_2x/World.h delete mode 100644 source/blender/python/api2_2x/bpy.c delete mode 100644 source/blender/python/api2_2x/bpy.h delete mode 100644 source/blender/python/api2_2x/bpy_config.c delete mode 100644 source/blender/python/api2_2x/bpy_config.h delete mode 100644 source/blender/python/api2_2x/bpy_data.c delete mode 100644 source/blender/python/api2_2x/bpy_data.h delete mode 100644 source/blender/python/api2_2x/bpy_types.h delete mode 100644 source/blender/python/api2_2x/charRGBA.c delete mode 100644 source/blender/python/api2_2x/charRGBA.h delete mode 100644 source/blender/python/api2_2x/constant.c delete mode 100644 source/blender/python/api2_2x/constant.h delete mode 100644 source/blender/python/api2_2x/doc/API_intro.py delete mode 100644 source/blender/python/api2_2x/doc/API_related.py delete mode 100644 source/blender/python/api2_2x/doc/Armature.py delete mode 100644 source/blender/python/api2_2x/doc/BGL.py delete mode 100644 source/blender/python/api2_2x/doc/BezTriple.py delete mode 100644 source/blender/python/api2_2x/doc/Blender.py delete mode 100644 source/blender/python/api2_2x/doc/Blender_API.css delete mode 100644 source/blender/python/api2_2x/doc/Bpy.py delete mode 100644 source/blender/python/api2_2x/doc/Bpy_config.py delete mode 100644 source/blender/python/api2_2x/doc/Bpy_data.py delete mode 100644 source/blender/python/api2_2x/doc/Camera.py delete mode 100644 source/blender/python/api2_2x/doc/Constraint.py delete mode 100644 source/blender/python/api2_2x/doc/Curve.py delete mode 100644 source/blender/python/api2_2x/doc/Curvedoc.txt delete mode 100644 source/blender/python/api2_2x/doc/Draw.py delete mode 100644 source/blender/python/api2_2x/doc/Effect.py delete mode 100644 source/blender/python/api2_2x/doc/Effectdoc.txt delete mode 100644 source/blender/python/api2_2x/doc/Font.py delete mode 100644 source/blender/python/api2_2x/doc/Geometry.py delete mode 100644 source/blender/python/api2_2x/doc/Group.py delete mode 100644 source/blender/python/api2_2x/doc/IDProp.py delete mode 100644 source/blender/python/api2_2x/doc/Image.py delete mode 100644 source/blender/python/api2_2x/doc/Ipo.py delete mode 100644 source/blender/python/api2_2x/doc/IpoCurve.py delete mode 100644 source/blender/python/api2_2x/doc/Ipodoc.txt delete mode 100644 source/blender/python/api2_2x/doc/Key.py delete mode 100644 source/blender/python/api2_2x/doc/Lamp.py delete mode 100644 source/blender/python/api2_2x/doc/Lattice.py delete mode 100644 source/blender/python/api2_2x/doc/LibData.py delete mode 100644 source/blender/python/api2_2x/doc/Library.py delete mode 100644 source/blender/python/api2_2x/doc/Material.py delete mode 100644 source/blender/python/api2_2x/doc/Mathutils.py delete mode 100644 source/blender/python/api2_2x/doc/Mesh.py delete mode 100644 source/blender/python/api2_2x/doc/MeshPrimitives.py delete mode 100644 source/blender/python/api2_2x/doc/Metaball.py delete mode 100644 source/blender/python/api2_2x/doc/Metaballdoc.txt delete mode 100644 source/blender/python/api2_2x/doc/Modifier.py delete mode 100644 source/blender/python/api2_2x/doc/NLA.py delete mode 100644 source/blender/python/api2_2x/doc/NMesh.py delete mode 100644 source/blender/python/api2_2x/doc/Noise.py delete mode 100644 source/blender/python/api2_2x/doc/Object.py delete mode 100644 source/blender/python/api2_2x/doc/Pose.py delete mode 100644 source/blender/python/api2_2x/doc/Radio.py delete mode 100644 source/blender/python/api2_2x/doc/Registry.py delete mode 100644 source/blender/python/api2_2x/doc/Render.py delete mode 100644 source/blender/python/api2_2x/doc/Scene.py delete mode 100644 source/blender/python/api2_2x/doc/Sound.py delete mode 100644 source/blender/python/api2_2x/doc/Sys.py delete mode 100644 source/blender/python/api2_2x/doc/Text.py delete mode 100644 source/blender/python/api2_2x/doc/Text3d.py delete mode 100644 source/blender/python/api2_2x/doc/Texture.py delete mode 100644 source/blender/python/api2_2x/doc/Theme.py delete mode 100644 source/blender/python/api2_2x/doc/TimeLine.py delete mode 100644 source/blender/python/api2_2x/doc/Types.py delete mode 100644 source/blender/python/api2_2x/doc/Window.py delete mode 100644 source/blender/python/api2_2x/doc/World.py delete mode 100644 source/blender/python/api2_2x/doc/Worlddoc.txt delete mode 100644 source/blender/python/api2_2x/doc/epy_docgen-3.sh delete mode 100644 source/blender/python/api2_2x/doc/epy_docgen.sh delete mode 100644 source/blender/python/api2_2x/doc/id_generics.py delete mode 100644 source/blender/python/api2_2x/doc/testbgl.py delete mode 100644 source/blender/python/api2_2x/doc/testcamera.py delete mode 100644 source/blender/python/api2_2x/doc/testcurve.py delete mode 100644 source/blender/python/api2_2x/doc/testeffect.py delete mode 100644 source/blender/python/api2_2x/doc/testipo.py delete mode 100644 source/blender/python/api2_2x/doc/testmball.py delete mode 100644 source/blender/python/api2_2x/doc/testtext.py delete mode 100644 source/blender/python/api2_2x/doc/testworld.py delete mode 100644 source/blender/python/api2_2x/euler.c delete mode 100644 source/blender/python/api2_2x/euler.h delete mode 100644 source/blender/python/api2_2x/gen_library.c delete mode 100644 source/blender/python/api2_2x/gen_library.h delete mode 100644 source/blender/python/api2_2x/gen_utils.c delete mode 100644 source/blender/python/api2_2x/gen_utils.h delete mode 100644 source/blender/python/api2_2x/logic.c delete mode 100644 source/blender/python/api2_2x/logic.h delete mode 100644 source/blender/python/api2_2x/matrix.c delete mode 100644 source/blender/python/api2_2x/matrix.h delete mode 100644 source/blender/python/api2_2x/meshPrimitive.c delete mode 100644 source/blender/python/api2_2x/meshPrimitive.h delete mode 100644 source/blender/python/api2_2x/modules.h delete mode 100644 source/blender/python/api2_2x/point.c delete mode 100644 source/blender/python/api2_2x/point.h delete mode 100644 source/blender/python/api2_2x/quat.c delete mode 100644 source/blender/python/api2_2x/quat.h delete mode 100644 source/blender/python/api2_2x/rgbTuple.c delete mode 100644 source/blender/python/api2_2x/rgbTuple.h delete mode 100644 source/blender/python/api2_2x/sceneRadio.c delete mode 100644 source/blender/python/api2_2x/sceneRadio.h delete mode 100644 source/blender/python/api2_2x/sceneRender.c delete mode 100644 source/blender/python/api2_2x/sceneRender.h delete mode 100644 source/blender/python/api2_2x/sceneSequence.c delete mode 100644 source/blender/python/api2_2x/sceneSequence.h delete mode 100644 source/blender/python/api2_2x/sceneTimeLine.c delete mode 100644 source/blender/python/api2_2x/sceneTimeLine.h delete mode 100644 source/blender/python/api2_2x/vector.c delete mode 100644 source/blender/python/api2_2x/vector.h delete mode 100644 source/blender/python/api2_2x/windowTheme.c delete mode 100644 source/blender/python/api2_2x/windowTheme.h delete mode 100644 source/blender/src/.BCkey delete mode 100644 source/blender/src/B.blend.c delete mode 100644 source/blender/src/Bfont.c delete mode 100644 source/blender/src/CMakeLists.txt delete mode 100644 source/blender/src/Makefile delete mode 100644 source/blender/src/SConscript delete mode 100644 source/blender/src/bfont.ttf.c delete mode 100644 source/blender/src/blenderbuttons.c delete mode 100644 source/blender/src/booleanops.c delete mode 100644 source/blender/src/booleanops_mesh.c delete mode 100644 source/blender/src/butspace.c delete mode 100644 source/blender/src/buttons_editing.c delete mode 100644 source/blender/src/buttons_logic.c delete mode 100644 source/blender/src/buttons_object.c delete mode 100644 source/blender/src/buttons_scene.c delete mode 100644 source/blender/src/buttons_script.c delete mode 100644 source/blender/src/buttons_shading.c delete mode 100644 source/blender/src/cmap.tga.c delete mode 100644 source/blender/src/cmovie.tga.c delete mode 100644 source/blender/src/cre/license.jpeg.c delete mode 100644 source/blender/src/cre/license_key.c delete mode 100644 source/blender/src/cursors.c delete mode 100644 source/blender/src/drawaction.c delete mode 100644 source/blender/src/drawarmature.c delete mode 100644 source/blender/src/drawdeps.c delete mode 100644 source/blender/src/drawimage.c delete mode 100644 source/blender/src/drawimasel.c delete mode 100644 source/blender/src/drawipo.c delete mode 100644 source/blender/src/drawmesh.c delete mode 100644 source/blender/src/drawnla.c delete mode 100644 source/blender/src/drawnode.c delete mode 100644 source/blender/src/drawobject.c delete mode 100644 source/blender/src/drawoops.c delete mode 100644 source/blender/src/drawscene.c delete mode 100644 source/blender/src/drawscript.c delete mode 100644 source/blender/src/drawseq.c delete mode 100644 source/blender/src/drawsound.c delete mode 100644 source/blender/src/drawtext.c delete mode 100644 source/blender/src/drawtime.c delete mode 100644 source/blender/src/drawview.c delete mode 100644 source/blender/src/edit.c delete mode 100644 source/blender/src/editaction.c delete mode 100644 source/blender/src/editarmature.c delete mode 100644 source/blender/src/editconstraint.c delete mode 100644 source/blender/src/editcurve.c delete mode 100644 source/blender/src/editdeform.c delete mode 100644 source/blender/src/editface.c delete mode 100644 source/blender/src/editfont.c delete mode 100644 source/blender/src/editgroup.c delete mode 100644 source/blender/src/editimasel.c delete mode 100644 source/blender/src/editipo.c delete mode 100644 source/blender/src/editipo_lib.c delete mode 100644 source/blender/src/editipo_mods.c delete mode 100644 source/blender/src/editkey.c delete mode 100644 source/blender/src/editlattice.c delete mode 100644 source/blender/src/editmball.c delete mode 100644 source/blender/src/editmesh.c delete mode 100644 source/blender/src/editmesh_add.c delete mode 100644 source/blender/src/editmesh_lib.c delete mode 100644 source/blender/src/editmesh_loop.c delete mode 100644 source/blender/src/editmesh_mods.c delete mode 100644 source/blender/src/editmesh_tools.c delete mode 100644 source/blender/src/editmode_undo.c delete mode 100644 source/blender/src/editnla.c delete mode 100644 source/blender/src/editnode.c delete mode 100644 source/blender/src/editobject.c delete mode 100644 source/blender/src/editoops.c delete mode 100644 source/blender/src/editparticle.c delete mode 100644 source/blender/src/editscreen.c delete mode 100644 source/blender/src/editseq.c delete mode 100644 source/blender/src/editsima.c delete mode 100644 source/blender/src/editsound.c delete mode 100644 source/blender/src/edittime.c delete mode 100644 source/blender/src/editview.c delete mode 100644 source/blender/src/eventdebug.c delete mode 100644 source/blender/src/filelist.c delete mode 100644 source/blender/src/filesel.c delete mode 100644 source/blender/src/fluidsim.c delete mode 100644 source/blender/src/fsmenu.c delete mode 100644 source/blender/src/ghostwinlay.c delete mode 100644 source/blender/src/glutil.c delete mode 100644 source/blender/src/hddaudio.c delete mode 100644 source/blender/src/header_action.c delete mode 100644 source/blender/src/header_buttonswin.c delete mode 100644 source/blender/src/header_filesel.c delete mode 100644 source/blender/src/header_image.c delete mode 100644 source/blender/src/header_imasel.c delete mode 100644 source/blender/src/header_info.c delete mode 100644 source/blender/src/header_ipo.c delete mode 100644 source/blender/src/header_nla.c delete mode 100644 source/blender/src/header_node.c delete mode 100644 source/blender/src/header_oops.c delete mode 100644 source/blender/src/header_script.c delete mode 100644 source/blender/src/header_seq.c delete mode 100644 source/blender/src/header_sound.c delete mode 100644 source/blender/src/header_text.c delete mode 100644 source/blender/src/header_time.c delete mode 100644 source/blender/src/header_view3d.c delete mode 100644 source/blender/src/headerbuttons.c delete mode 100644 source/blender/src/imagepaint.c delete mode 100644 source/blender/src/imasel.c delete mode 100644 source/blender/src/interface.c delete mode 100644 source/blender/src/interface_draw.c delete mode 100644 source/blender/src/interface_icons.c delete mode 100644 source/blender/src/interface_panel.c delete mode 100644 source/blender/src/keyval.c delete mode 100644 source/blender/src/language.c delete mode 100644 source/blender/src/lorem.c delete mode 100644 source/blender/src/mainqueue.c delete mode 100644 source/blender/src/meshlaplacian.c delete mode 100644 source/blender/src/meshtools.c delete mode 100644 source/blender/src/multires-firstlevel.c delete mode 100644 source/blender/src/multires.c delete mode 100644 source/blender/src/mywindow.c delete mode 100644 source/blender/src/oops.c delete mode 100644 source/blender/src/outliner.c delete mode 100644 source/blender/src/parametrizer.c delete mode 100644 source/blender/src/parametrizer.h delete mode 100644 source/blender/src/parametrizer_intern.h delete mode 100644 source/blender/src/playanim.c delete mode 100644 source/blender/src/poseobject.c delete mode 100644 source/blender/src/preview.blend.c delete mode 100644 source/blender/src/previewrender.c delete mode 100644 source/blender/src/prvicons.c delete mode 100644 source/blender/src/pub/license_key.c delete mode 100644 source/blender/src/reeb.c delete mode 100644 source/blender/src/renderwin.c delete mode 100644 source/blender/src/resources.c delete mode 100644 source/blender/src/retopo.c delete mode 100644 source/blender/src/scrarea.c delete mode 100644 source/blender/src/screendump.c delete mode 100644 source/blender/src/sculptmode-stroke.c delete mode 100644 source/blender/src/sculptmode.c delete mode 100644 source/blender/src/seqaudio.c delete mode 100644 source/blender/src/seqeffects.c delete mode 100644 source/blender/src/seqscopes.c delete mode 100644 source/blender/src/sequence.c delete mode 100644 source/blender/src/space.c delete mode 100644 source/blender/src/spacetypes.c delete mode 100644 source/blender/src/splash.jpg.c delete mode 100644 source/blender/src/swapbuffers.c delete mode 100644 source/blender/src/toets.c delete mode 100644 source/blender/src/toolbox.c delete mode 100644 source/blender/src/transform.c delete mode 100644 source/blender/src/transform_constraints.c delete mode 100644 source/blender/src/transform_conversions.c delete mode 100644 source/blender/src/transform_generics.c delete mode 100644 source/blender/src/transform_manipulator.c delete mode 100644 source/blender/src/transform_numinput.c delete mode 100644 source/blender/src/transform_snap.c delete mode 100644 source/blender/src/unwrapper.c delete mode 100644 source/blender/src/usiblender.c delete mode 100644 source/blender/src/verse_common.c delete mode 100644 source/blender/src/verse_image.c delete mode 100644 source/blender/src/verse_mesh.c delete mode 100644 source/blender/src/verse_object.c delete mode 100644 source/blender/src/view.c delete mode 100644 source/blender/src/vpaint.c delete mode 100644 source/blender/src/winlay.h delete mode 100644 source/blender/src/writeavicodec.c delete mode 100644 source/blender/src/writeimage.c delete mode 100644 source/blender/src/writemovie.c create mode 100644 source/blender/windowmanager/Makefile create mode 100644 source/blender/windowmanager/WM_api.h create mode 100644 source/blender/windowmanager/WM_types.h create mode 100644 source/blender/windowmanager/intern/Makefile create mode 100644 source/blender/windowmanager/intern/wm.c create mode 100644 source/blender/windowmanager/intern/wm_apple.c create mode 100644 source/blender/windowmanager/intern/wm_cursors.c create mode 100644 source/blender/windowmanager/intern/wm_event_system.c create mode 100644 source/blender/windowmanager/intern/wm_files.c create mode 100644 source/blender/windowmanager/intern/wm_init_exit.c create mode 100644 source/blender/windowmanager/intern/wm_keymap.c create mode 100644 source/blender/windowmanager/intern/wm_operators.c create mode 100644 source/blender/windowmanager/intern/wm_window.c create mode 100644 source/blender/windowmanager/wm.h create mode 100644 source/blender/windowmanager/wm_cursors.h create mode 100644 source/blender/windowmanager/wm_event_system.h create mode 100644 source/blender/windowmanager/wm_event_types.h create mode 100644 source/blender/windowmanager/wm_files.h create mode 100644 source/blender/windowmanager/wm_window.h diff --git a/source/blender/editors/datafiles/B.blend.c b/source/blender/editors/datafiles/B.blend.c new file mode 100644 index 00000000000..0a33fc99013 --- /dev/null +++ b/source/blender/editors/datafiles/B.blend.c @@ -0,0 +1,3076 @@ +/* DataToC output of file */ + +int datatoc_B_blend_size= 98212; +char datatoc_B_blend[]= { + 66, 76, 69, 78, + 68, 69, 82, 95,118, 50, 52, 49, 82, 69, 78, 68, 32, 0, 0, 0,144,240,255,191, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, +250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 83, 82, 0, 0, +116, 0, 0, 0, 8,237,195, 8,109, 0, 0, 0, 1, 0, 0, 0, 96, 40,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 82, 49, 45, 65,110,105,109, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +232,150,192, 8,168,240,195, 8,232,240,195, 8, 24,247,195, 8, 96,247,195, 8,152, 31,196, 8,136,251,196, 8, 0, 0,231, 3, +143, 1,174, 4,232, 3, 32, 3, 1, 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, 68, 65, 84, 65, 20, 0, 0, 0,232,150,192, 8,110, 0, 0, 0, 1, 0, 0, 0,168,237,195, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,237,195, 8,110, 0, 0, 0, 1, 0, 0, 0, +232,237,195, 8,232,150,192, 8, 0, 0, 0, 0, 0, 0, 32, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,232,237,195, 8, +110, 0, 0, 0, 1, 0, 0, 0, 40,238,195, 8,168,237,195, 8, 0, 0, 0, 0,232, 3, 32, 3, 0, 0, 0, 0, 68, 65, 84, 65, + 20, 0, 0, 0, 40,238,195, 8,110, 0, 0, 0, 1, 0, 0, 0,104,238,195, 8,232,237,195, 8, 0, 0, 0, 0,232, 3, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,238,195, 8,110, 0, 0, 0, 1, 0, 0, 0,168,238,195, 8, 40,238,195, 8, + 0, 0, 0, 0,232, 3,248, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,238,195, 8,110, 0, 0, 0, 1, 0, 0, 0, +232,238,195, 8,104,238,195, 8, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,232,238,195, 8, +110, 0, 0, 0, 1, 0, 0, 0, 40,239,195, 8,168,238,195, 8, 0, 0, 0, 0,232, 3, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, + 20, 0, 0, 0, 40,239,195, 8,110, 0, 0, 0, 1, 0, 0, 0,104,239,195, 8,232,238,195, 8, 0, 0, 0, 0,160, 2,248, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,239,195, 8,110, 0, 0, 0, 1, 0, 0, 0,168,239,195, 8, 40,239,195, 8, + 0, 0, 0, 0,160, 2, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,239,195, 8,110, 0, 0, 0, 1, 0, 0, 0, +232,239,195, 8,104,239,195, 8, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,232,239,195, 8, +110, 0, 0, 0, 1, 0, 0, 0, 40,240,195, 8,168,239,195, 8, 0, 0, 0, 0,232, 3,188, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 20, 0, 0, 0, 40,240,195, 8,110, 0, 0, 0, 1, 0, 0, 0,104,240,195, 8,232,239,195, 8, 0, 0, 0, 0,204, 0,248, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,240,195, 8,110, 0, 0, 0, 1, 0, 0, 0,168,240,195, 8, 40,240,195, 8, + 0, 0, 0, 0,204, 0, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,168,240,195, 8,110, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,104,240,195, 8, 0, 0, 0, 0,204, 0,188, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232,240,195, 8, +111, 0, 0, 0, 1, 0, 0, 0, 48,241,195, 8, 0, 0, 0, 0,168,237,195, 8,232,237,195, 8, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0, 48,241,195, 8,111, 0, 0, 0, 1, 0, 0, 0,120,241,195, 8,232,240,195, 8,232,150,192, 8, + 40,238,195, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,241,195, 8,111, 0, 0, 0, 1, 0, 0, 0, +192,241,195, 8, 48,241,195, 8,168,237,195, 8,168,238,195, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +192,241,195, 8,111, 0, 0, 0, 1, 0, 0, 0, 8,242,195, 8,120,241,195, 8,232,237,195, 8,232,238,195, 8, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,242,195, 8,111, 0, 0, 0, 1, 0, 0, 0, 80,242,195, 8,192,241,195, 8, +168,238,195, 8,232,238,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,242,195, 8,111, 0, 0, 0, + 1, 0, 0, 0,152,242,195, 8, 8,242,195, 8,104,238,195, 8, 40,239,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0,152,242,195, 8,111, 0, 0, 0, 1, 0, 0, 0,224,242,195, 8, 80,242,195, 8,232,238,195, 8,104,239,195, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,242,195, 8,111, 0, 0, 0, 1, 0, 0, 0, 40,243,195, 8, +152,242,195, 8, 40,239,195, 8,104,239,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40,243,195, 8, +111, 0, 0, 0, 1, 0, 0, 0,112,243,195, 8,224,242,195, 8,104,238,195, 8,232,238,195, 8, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0,112,243,195, 8,111, 0, 0, 0, 1, 0, 0, 0,184,243,195, 8, 40,243,195, 8,232,150,192, 8, +168,239,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,243,195, 8,111, 0, 0, 0, 1, 0, 0, 0, + 0,244,195, 8,112,243,195, 8,104,238,195, 8,232,239,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, + 0,244,195, 8,111, 0, 0, 0, 1, 0, 0, 0, 72,244,195, 8,184,243,195, 8, 40,238,195, 8,232,239,195, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72,244,195, 8,111, 0, 0, 0, 1, 0, 0, 0,144,244,195, 8, 0,244,195, 8, +168,239,195, 8,232,239,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,244,195, 8,111, 0, 0, 0, + 1, 0, 0, 0,216,244,195, 8, 72,244,195, 8, 40,239,195, 8, 40,240,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0,216,244,195, 8,111, 0, 0, 0, 1, 0, 0, 0, 32,245,195, 8,144,244,195, 8,168,238,195, 8,104,240,195, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,245,195, 8,111, 0, 0, 0, 1, 0, 0, 0,104,245,195, 8, +216,244,195, 8,104,239,195, 8,104,240,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,245,195, 8, +111, 0, 0, 0, 1, 0, 0, 0,176,245,195, 8, 32,245,195, 8, 40,240,195, 8,104,240,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0,176,245,195, 8,111, 0, 0, 0, 1, 0, 0, 0,248,245,195, 8,104,245,195, 8,168,239,195, 8, +168,240,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,245,195, 8,111, 0, 0, 0, 1, 0, 0, 0, + 64,246,195, 8,176,245,195, 8,232,239,195, 8,168,240,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, + 64,246,195, 8,111, 0, 0, 0, 1, 0, 0, 0,136,246,195, 8,248,245,195, 8,104,238,195, 8, 40,240,195, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136,246,195, 8,111, 0, 0, 0, 1, 0, 0, 0,208,246,195, 8, 64,246,195, 8, + 40,240,195, 8,168,240,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,246,195, 8,111, 0, 0, 0, + 1, 0, 0, 0, 24,247,195, 8,136,246,195, 8,168,238,195, 8,168,239,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0, 24,247,195, 8,111, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208,246,195, 8,104,240,195, 8,168,240,195, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0, 96,247,195, 8,113, 0, 0, 0, 1, 0, 0, 0,104, 5,196, 8, + 0, 0, 0, 0,232,150,192, 8,168,239,195, 8,232,239,195, 8, 40,238,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, + 0, 0, 0, 0,187, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0,161, 0, 0, 0,187, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, + 0, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4,233, 3,161, 0, 3, 0, 3, 0, 79, 1, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 2,196, 8,232, 3,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 88,248,195, 8, 24, 2,196, 8, 68, 65, 84, 65,164, 0, 0, 0, 88,248,195, 8,112, 0, 0, 0, 1, 0, 0, 0, 40,249,195, 8, + 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0, 40,249,195, 8,112, 0, 0, 0, 1, 0, 0, 0,248,249,195, 8, 88,248,195, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, +248,249,195, 8,112, 0, 0, 0, 1, 0, 0, 0,200,250,195, 8, 40,249,195, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0,200,250,195, 8,112, 0, 0, 0, + 1, 0, 0, 0,152,251,195, 8,248,249,195, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0,152,251,195, 8,112, 0, 0, 0, 1, 0, 0, 0,104,252,195, 8, +200,250,195, 8, 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,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, + 68, 65, 84, 65,164, 0, 0, 0,104,252,195, 8,112, 0, 0, 0, 1, 0, 0, 0, 56,253,195, 8,152,251,195, 8, 69,102,102,101, + 99,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, 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,210, 3, 0, 0, +162, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, + 56,253,195, 8,112, 0, 0, 0, 1, 0, 0, 0, 8,254,195, 8,104,252,195, 8, 72,111,111,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, 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, 70, 1, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,250,195, 8, 68, 65, 84, 65,164, 0, 0, 0, 8,254,195, 8,112, 0, 0, 0, + 1, 0, 0, 0,216,254,195, 8, 56,253,195, 8, 80, 97,114,116,105, 99,108,101, 32, 73,110,116,101,114, 97, 99,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, 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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,152,251,195, 8, 68, 65, 84, 65,164, 0, 0, 0,216,254,195, 8,112, 0, 0, 0, 1, 0, 0, 0,168,255,195, 8, + 8,254,195, 8, 83,111,102,116, 98,111,100,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,251,195, 8, + 68, 65, 84, 65,164, 0, 0, 0,168,255,195, 8,112, 0, 0, 0, 1, 0, 0, 0,120, 0,196, 8,216,254,195, 8, 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, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, +120, 0,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 72, 1,196, 8,168,255,195, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, 72, 1,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 24, 2,196, 8,120, 0,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0, 24, 2,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 72, 1,196, 8, 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,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, + 68, 65, 84, 65,212, 0, 0, 0,232, 2,196, 8, 94, 0, 0, 0, 1, 0, 0, 0,232, 3,196, 8, 0, 0, 0, 0, 4, 0, 0, 0, + 51, 51, 51, 63, 1, 86,141, 44, 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,193, 0, 64,212, 68, 0, 0, 0,193, 0, 0,104, 67, 0, 0, 0,193,145,133,185, 68, 0, 0, 0,193, 0, 0,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,128, 67, 0, 0, 40, 66, 0, 0,200, 68, 0, 0,225, 67, + 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0,233, 3,161, 0, 0, 0, 0, 0, 1, 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,150, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,232, 3,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +232, 2,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 86,141, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,104, 5,196, 8,113, 0, 0, 0, + 1, 0, 0, 0, 96, 6,196, 8, 96,247,195, 8,168,238,195, 8,168,237,195, 8,232,237,195, 8,232,238,195, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232, 3, 0, 0, 7, 3, 0, 0, 32, 3, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 7, 3, 0, 0, 33, 3, 0, 0, + 0, 0, 0, 0,232, 3, 0, 0, 32, 3, 0, 0, 32, 3, 0, 0, 0, 0, 0, 0, 1, 0, 7, 7,233, 3, 1, 0, 3, 0, 3, 1, +196, 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, 68, 65, 84, 65,204, 0, 0, 0, 96, 6,196, 8,113, 0, 0, 0, + 1, 0, 0, 0, 88, 13,196, 8,104, 5,196, 8, 40,240,195, 8,104,240,195, 8,104,239,195, 8, 40,239,195, 8, 0, 0, 0, 0, + 71,187,204, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +205, 0, 0, 0,159, 2, 0, 0,249, 0, 0, 0, 5, 3, 0, 0,205, 0, 0, 0,159, 2, 0, 0,249, 0, 0, 0, 19, 1, 0, 0, +205, 0, 0, 0,159, 2, 0, 0, 20, 1, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,211, 1,242, 1, 1, 0, 3, 0, +251, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 8,196, 8,216, 11,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 7,196, 8, 40, 8,196, 8, 68, 65, 84, 65,164, 0, 0, 0, 88, 7,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 40, 8,196, 8, 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,140, 0,210, 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, 68, 65, 84, 65,164, 0, 0, 0, 40, 8,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 88, 7,196, 8, 51, 68, 32, 86,105,101,119,112,111,114,116, 32,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 8, 0, 8, 0, 62, 1,204, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,180, 2, 0, 0,248, 8,196, 8, 89, 0, 0, 0, 1, 0, 0, 0,216, 11,196, 8, 0, 0, 0, 0, 1, 0, 0, 0, + 51, 51, 51, 63, 1, 86,156, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 71,187,204, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,178, 13, 32, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148,173, 42, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,249,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 71,187,204, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, +111, 18, 3,187, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,148,173, 42, 65, 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, +205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 1, 0, 7, 0,175, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0,221,162, 77, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,221,162, 77, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,162, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,216, 11,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +248, 8,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 86,156, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0, 88, 13,196, 8,113, 0, 0, 0, + 1, 0, 0, 0,240, 24,196, 8, 96, 6,196, 8, 40,239,195, 8,104,239,195, 8,232,238,195, 8,104,238,195, 8, 0, 0, 0, 0, + 1,184,157, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188, 0, 0, 0, 0, +161, 2, 0, 0,232, 3, 0, 0,249, 0, 0, 0, 5, 3, 0, 0,161, 2, 0, 0,232, 3, 0, 0,249, 0, 0, 0, 19, 1, 0, 0, +161, 2, 0, 0,232, 3, 0, 0, 20, 1, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 72, 1,242, 1, 3, 0, 3, 0, +203, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 15,196, 8,112, 23,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 14,196, 8, 80, 14,196, 8, 68, 65, 84, 65,164, 0, 0, 0, 80, 14,196, 8,112, 0, 0, 0, + 1, 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, 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, 68, 65, 84, 65, 40, 1, 0, 0, 32, 15,196, 8, 93, 0, 0, 0, 1, 0, 0, 0,120, 16,196, 8, + 0, 0, 0, 0, 2, 0, 0, 0, 51, 51, 51, 63, 1, 86,160, 92, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0,122, 67, + 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,242, 1, 0, 0, 16, 0, 0, 0, 7, 1, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 7, 1, 0, 0, 16, 0, 0, 0,242, 1, 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, 72, 12,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,196, 0, 0, 0,120, 16,196, 8, 97, 0, 0, 0, 1, 0, 0, 0,104, 17,196, 8, 32, 15,196, 8, + 3, 0, 0, 0, 51, 51, 51, 63, 1, 86,160, 92, 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,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, 68, 65, 84, 65, +160, 0, 0, 0,104, 17,196, 8,166, 0, 0, 0, 1, 0, 0, 0, 56, 18,196, 8,120, 16,196, 8, 11, 0, 0, 0, 51, 51, 51, 63, + 1, 86,160, 92, 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, 68, 65, 84, 65,120, 0, 0, 0, 56, 18,196, 8,100, 0, 0, 0, + 1, 0, 0, 0,224, 18,196, 8,104, 17,196, 8, 9, 0, 0, 0, 51, 51, 51, 63, 1, 86,160, 92, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,240, 3,197, 8, 0, 0, 0, 0, 31, 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,114, 1, 0, 0,116, 1, 0, 0, 5, 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0,116, 1, 0, 0, 68, 65, 84, 65, +164, 0, 0, 0,224, 18,196, 8, 99, 0, 0, 0, 1, 0, 0, 0,176, 19,196, 8, 56, 18,196, 8, 13, 0, 0, 0, 51, 51, 51, 63, + 1, 86,160, 92, 0, 0, 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, 68, 65, 84, 65,176, 0, 0, 0,176, 19,196, 8, +177, 0, 0, 0, 1, 0, 0, 0,144, 20,196, 8,224, 18,196, 8, 12, 0, 0, 0, 51, 51, 51, 63, 1, 86,160, 92, 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,128,193, 0, 0,247, 67, 0, 0, 0,191, + 0, 0, 2, 66, 0, 0,128,193, 0, 0,247, 67,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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0, +144, 20,196, 8, 89, 0, 0, 0, 1, 0, 0, 0,112, 23,196, 8,176, 19,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, 1, 86,160, 92, + 0, 0, 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, 32,193, 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, 32, 65, 0, 0,128, 63, 1,184,157, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, + 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 33,195, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29,254,249,195,125,254, 71,194, + 0, 0, 0, 0, 0, 0, 0, 0,173,128,249, 67,138, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 32, 65, 1, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 3, 0, 0, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 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, + 68, 65, 84, 65, 84, 1, 0, 0,112, 23,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144, 20,196, 8, 5, 0, 0, 0, + 51, 51, 51, 63, 1, 86,160, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,240, 24,196, 8,113, 0, 0, 0, 1, 0, 0, 0,152, 31,196, 8, + 88, 13,196, 8,168,240,195, 8, 40,240,195, 8,104,238,195, 8,232,239,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205, 0, 0, 0,232, 3, 0, 0, +189, 0, 0, 0,247, 0, 0, 0,205, 0, 0, 0,232, 3, 0, 0,189, 0, 0, 0,215, 0, 0, 0,205, 0, 0, 0,232, 3, 0, 0, +216, 0, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, 1, 0, 15, 15, 28, 3, 32, 0, 3, 0, 3, 0,192, 2, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 27,196, 8, 24, 30,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, +232, 25,196, 8,184, 26,196, 8, 68, 65, 84, 65,164, 0, 0, 0,232, 25,196, 8,112, 0, 0, 0, 1, 0, 0, 0,184, 26,196, 8, + 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0,184, 26,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232, 25,196, 8, 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, 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, 68, 65, 84, 65,148, 0, 0, 0, +136, 27,196, 8,102, 0, 0, 0, 1, 0, 0, 0, 72, 28,196, 8, 0, 0, 0, 0, 15, 0, 0, 0, 51, 51, 51, 63, 1, 86,170, 76, + 0, 0,128,192, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 16, 66,123, 10, 4,194,181,186,152, 67, 0, 0, 0, 0, 0, 0, 16, 66, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 3, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0,128, 63, 0, 0, 16, 66, 0, 0,250, 70, 0, 0, 16, 66, +205,204,204, 61, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0, 72, 28,196, 8,166, 0, 0, 0, 1, 0, 0, 0, 24, 29,196, 8,136, 27,196, 8, 11, 0, 0, 0, + 51, 51, 51, 63, 1, 86,170, 76, 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,233, 3, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,233, 3, 0, 0, 16, 0, 0, 0, 36, 0, 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, 68, 65, 84, 65,212, 0, 0, 0, 24, 29,196, 8, + 94, 0, 0, 0, 1, 0, 0, 0, 24, 30,196, 8, 72, 28,196, 8, 4, 0, 0, 0, 51, 51, 51, 63, 1, 86,170, 76, 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,193, 0, 0, 35, 68, 0, 0, 0,193, + 0, 0,104, 67,135, 22, 0,193,178, 16, 96, 68,112, 74,103, 67, 0, 0,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,128, 67, 0, 0, 40, 66, 0, 0,200, 68, 0, 0,225, 67, 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, + 1, 0, 1, 0,251, 4, 1, 0, 0, 0, 0, 0, 4, 0, 1, 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,150, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 84, 1, 0, 0, 24, 30,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 24, 29,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, + 1, 86,170, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,152, 31,196, 8,113, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 24,196, 8, +168,239,195, 8,168,238,195, 8,104,240,195, 8,168,240,195, 8, 0, 0, 0, 0,159,125, 11, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, + 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,203, 0, 0, 0,189, 0, 0, 0, + 5, 3, 0, 0, 0, 0, 0, 0,203, 0, 0, 0,189, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0,203, 0, 0, 0,216, 0, 0, 0, + 5, 3, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3,204, 0, 46, 2, 3, 0, 3, 0,145, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 34,196, 8,224, 38,196, 8, 0, 0, 0, 0, 0, 0, 0, 0,144, 32,196, 8, + 96, 33,196, 8, 68, 65, 84, 65,164, 0, 0, 0,144, 32,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 96, 33,196, 8, 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, +140, 0,210, 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, 68, 65, 84, 65, +164, 0, 0, 0, 96, 33,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144, 32,196, 8, 51, 68, 32, 86,105,101,119,112, +111,114,116, 32,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 8, 0, 8, 0, 62, 1,204, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,196, 0, 0, 0, 48, 34,196, 8, + 97, 0, 0, 0, 1, 0, 0, 0, 0, 36,196, 8, 0, 0, 0, 0, 3, 0, 0, 0, 51, 51, 51, 63, 1, 89, 2, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 67, 0, 0,190,194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 60, 67, 0,128, 11,196, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 46, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 46, 2, 0, 0, 0, 0,192,194, + 0,128, 11,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 1, 0, 1, 0, 1, 0,188, 0, 46, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 35,196, 8, 1, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 32, 35,196, 8,128, 0, 0, 0, 1, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 88, 35,196, 8, 68, 65, 84, 65,120, 0, 0, 0, 88, 35,196, 8,127, 0, 0, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0,136,251,196, 8, 0, 0, 0, 0, 1, 0, 1, 0,160, 2,197, 8, 0, 0, 0, 0, 1, 0, 1, 0, + 72, 12,197, 8, 0, 0, 0, 0, 1, 0, 1, 0, 24, 22,197, 8, 0, 0, 0, 0, 1, 0, 1, 0,184, 18,197, 8, 0, 0, 0, 0, + 1, 0, 1, 0, 8, 21,197, 8, 0, 0, 0, 0, 1, 0, 1, 0,152, 15,197, 8, 0, 0, 0, 0, 1, 0, 1, 0,120, 1,197, 8, + 0, 0, 0, 0, 1, 0, 1, 0, 40, 9,197, 8, 0, 0, 0, 0, 1, 0, 1, 0,216, 0,197, 8, 68, 65, 84, 65,180, 2, 0, 0, + 0, 36,196, 8, 89, 0, 0, 0, 1, 0, 0, 0,224, 38,196, 8, 48, 34,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, 1, 89, 2, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,159,125, 11, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,102,233,234, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,148,173, 42, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,249,195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,159,125, 11, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, 0, 0, 0,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +148,173, 42, 65, 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 1, 0, 7, 0,175, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 88,134, 55, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88,134, 55, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,134, 55, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 84, 1, 0, 0,224, 38,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 36,196, 8, 5, 0, 0, 0, + 51, 51, 51, 63, 1, 89, 2, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 0, 0,116, 0, 0, 0, 96, 40,196, 8,109, 0, 0, 0, 1, 0, 0, 0,192, 99,196, 8, + 8,237,195, 8, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 50, 45, 77,111,100,101,108, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 41,196, 8,192, 42,196, 8, 0, 43,196, 8,136, 45,196, 8,208, 45,196, 8, +144, 86,196, 8,136,251,196, 8, 1, 0, 0, 5,254,255,253, 3, 0, 5, 0, 4, 1, 0, 2, 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, 20, 0, 0, 0, 0, 41,196, 8,110, 0, 0, 0, + 1, 0, 0, 0, 64, 41,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, + 64, 41,196, 8,110, 0, 0, 0, 1, 0, 0, 0,128, 41,196, 8, 0, 41,196, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,128, 41,196, 8,110, 0, 0, 0, 1, 0, 0, 0,192, 41,196, 8, 64, 41,196, 8, 0, 0, 0, 0, + 0, 5, 0, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 41,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 0, 42,196, 8, +128, 41,196, 8, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 0, 42,196, 8,110, 0, 0, 0, + 1, 0, 0, 0, 64, 42,196, 8,192, 41,196, 8, 0, 0, 0, 0, 0, 0,236, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, + 64, 42,196, 8,110, 0, 0, 0, 1, 0, 0, 0,128, 42,196, 8, 0, 42,196, 8, 0, 0, 0, 0, 0, 5,236, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,128, 42,196, 8,110, 0, 0, 0, 1, 0, 0, 0,192, 42,196, 8, 64, 42,196, 8, 0, 0, 0, 0, + 0, 0,224, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 42,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +128, 42,196, 8, 0, 0, 0, 0, 0, 5,224, 3, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0, 43,196, 8,111, 0, 0, 0, + 1, 0, 0, 0, 72, 43,196, 8, 0, 0, 0, 0, 64, 41,196, 8,128, 41,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0, 72, 43,196, 8,111, 0, 0, 0, 1, 0, 0, 0,144, 43,196, 8, 0, 43,196, 8, 0, 41,196, 8,192, 41,196, 8, + 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 43,196, 8,111, 0, 0, 0, 1, 0, 0, 0,216, 43,196, 8, + 72, 43,196, 8, 0, 41,196, 8, 0, 42,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216, 43,196, 8, +111, 0, 0, 0, 1, 0, 0, 0, 32, 44,196, 8,144, 43,196, 8,192, 41,196, 8, 64, 42,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0, 32, 44,196, 8,111, 0, 0, 0, 1, 0, 0, 0,104, 44,196, 8,216, 43,196, 8, 0, 42,196, 8, + 64, 42,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104, 44,196, 8,111, 0, 0, 0, 1, 0, 0, 0, +176, 44,196, 8, 32, 44,196, 8, 64, 41,196, 8,128, 42,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +176, 44,196, 8,111, 0, 0, 0, 1, 0, 0, 0,248, 44,196, 8,104, 44,196, 8,128, 41,196, 8,192, 42,196, 8, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248, 44,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 64, 45,196, 8,176, 44,196, 8, +128, 42,196, 8,192, 42,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64, 45,196, 8,111, 0, 0, 0, + 1, 0, 0, 0,136, 45,196, 8,248, 44,196, 8, 0, 42,196, 8,128, 42,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0,136, 45,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 45,196, 8, 64, 42,196, 8,192, 42,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,208, 45,196, 8,113, 0, 0, 0, 1, 0, 0, 0,152, 85,196, 8, + 0, 0, 0, 0, 0, 41,196, 8, 0, 42,196, 8, 64, 42,196, 8,192, 41,196, 8, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,226,215,163,188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,209, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0,208, 0, 0, 0, 5, 0, 4, 0, 2, 0, 4, 4, 1, 5,209, 0, 1, 1, 1, 0, 79, 1, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 79,196, 8, 24, 84,196, 8, 56,189,193, 8,112,188,195, 8, +200, 46,196, 8,144,165,193, 8, 68, 65, 84, 65,164, 0, 0, 0,200, 46,196, 8,112, 0, 0, 0, 1, 0, 0, 0,152, 47,196, 8, + 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0,152, 47,196, 8,112, 0, 0, 0, 1, 0, 0, 0,104, 48,196, 8,200, 46,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, +104, 48,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 56, 49,196, 8,152, 47,196, 8, 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, 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,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, 68, 65, 84, 65,164, 0, 0, 0, 56, 49,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 8, 50,196, 8,104, 48,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0, 8, 50,196, 8,112, 0, 0, 0, 1, 0, 0, 0,216, 50,196, 8, + 56, 49,196, 8, 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,210, 3, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 49,196, 8, + 68, 65, 84, 65,164, 0, 0, 0,216, 50,196, 8,112, 0, 0, 0, 1, 0, 0, 0,168, 51,196, 8, 8, 50,196, 8, 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, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, +168, 51,196, 8,112, 0, 0, 0, 1, 0, 0, 0,120, 52,196, 8,216, 50,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0,120, 52,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 72, 53,196, 8,168, 51,196, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, 72, 53,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 24, 54,196, 8, +120, 52,196, 8, 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, 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, + 68, 65, 84, 65,164, 0, 0, 0, 24, 54,196, 8,112, 0, 0, 0, 1, 0, 0, 0,232, 54,196, 8, 72, 53,196, 8, 77,105,115,116, + 32, 83,116, 97,114,115, 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, 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,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, 68, 65, 84, 65,164, 0, 0, 0, +232, 54,196, 8,112, 0, 0, 0, 1, 0, 0, 0,184, 55,196, 8, 24, 54,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0,184, 55,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,136, 56,196, 8,232, 54,196, 8, 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,210, 3, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232, 54,196, 8, 68, 65, 84, 65,164, 0, 0, 0,136, 56,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 88, 57,196, 8, +184, 55,196, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0, 88, 57,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 40, 58,196, 8,136, 56,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, + 40, 58,196, 8,112, 0, 0, 0, 1, 0, 0, 0,248, 58,196, 8, 88, 57,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0,248, 58,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,200, 59,196, 8, 40, 58,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0,200, 59,196, 8,112, 0, 0, 0, 1, 0, 0, 0,152, 60,196, 8, +248, 58,196, 8, 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, 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0,152, 60,196, 8,112, 0, 0, 0, 1, 0, 0, 0,104, 61,196, 8,200, 59,196, 8, 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, 70, 1, 0, 0, + 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, +104, 61,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 56, 62,196, 8,152, 60,196, 8, 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,140, 2, 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, 68, 65, 84, 65,164, 0, 0, 0, 56, 62,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 8, 63,196, 8,104, 61,196, 8, 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, 24, 5, 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, 68, 65, 84, 65,164, 0, 0, 0, 8, 63,196, 8,112, 0, 0, 0, 1, 0, 0, 0,216, 63,196, 8, + 56, 62,196, 8, 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, 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, + 68, 65, 84, 65,164, 0, 0, 0,216, 63,196, 8,112, 0, 0, 0, 1, 0, 0, 0,168, 64,196, 8, 8, 63,196, 8, 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,140, 2, 0, 0, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 76,196, 8, 68, 65, 84, 65,164, 0, 0, 0, +168, 64,196, 8,112, 0, 0, 0, 1, 0, 0, 0,120, 65,196, 8,216, 63,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0,120, 65,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 72, 66,196, 8,168, 64,196, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, 72, 66,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 24, 67,196, 8, +120, 65,196, 8, 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, 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, + 68, 65, 84, 65,164, 0, 0, 0, 24, 67,196, 8,112, 0, 0, 0, 1, 0, 0, 0,232, 67,196, 8, 72, 66,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0, +232, 67,196, 8,112, 0, 0, 0, 1, 0, 0, 0,184, 68,196, 8, 24, 67,196, 8, 83, 99,114,105,112,116,108,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, 0, 0, 0, 0, 0, 83, 99,114,105,112,116, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 68, 65, 84, 65,164, 0, 0, 0,184, 68,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,136, 69,196, 8,232, 67,196, 8, 69,102,102,101, 99,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, 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,140, 2, 0, 0,162, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 67,196, 8, 68, 65, 84, 65,164, 0, 0, 0,136, 69,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 88, 70,196, 8, +184, 68,196, 8, 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,210, 3, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 64,196, 8, + 68, 65, 84, 65,164, 0, 0, 0, 88, 70,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 40, 71,196, 8,136, 69,196, 8, 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,210, 3, 0, 0, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 64,196, 8, 68, 65, 84, 65,164, 0, 0, 0, + 40, 71,196, 8,112, 0, 0, 0, 1, 0, 0, 0,248, 71,196, 8, 88, 70,196, 8, 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, 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, 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, 68, 65, 84, 65,164, 0, 0, 0,248, 71,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,200, 72,196, 8, 40, 71,196, 8, 83,111,117,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, 83,111,117,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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0,200, 72,196, 8,112, 0, 0, 0, 1, 0, 0, 0,152, 73,196, 8, +248, 71,196, 8, 76,105,115,116,101,110,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, 83,111,117,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, 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, + 68, 65, 84, 65,164, 0, 0, 0,152, 73,196, 8,112, 0, 0, 0, 1, 0, 0, 0,104, 74,196, 8,200, 72,196, 8, 83,101,113,117, +101,110, 99,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, 83,111,117,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,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, 68, 65, 84, 65,164, 0, 0, 0, +104, 74,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 56, 75,196, 8,152, 73,196, 8, 65,114,109, 97,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, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, 56, 75,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 8, 76,196, 8,104, 74,196, 8, 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, 70, 1, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,168, 51,196, 8, 68, 65, 84, 65,164, 0, 0, 0, 8, 76,196, 8,112, 0, 0, 0, 1, 0, 0, 0,216, 76,196, 8, + 56, 75,196, 8, 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,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, + 68, 65, 84, 65,164, 0, 0, 0,216, 76,196, 8,112, 0, 0, 0, 1, 0, 0, 0,168, 77,196, 8, 8, 76,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0, +168, 77,196, 8,112, 0, 0, 0, 1, 0, 0, 0,120, 78,196, 8,216, 76,196, 8, 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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 76,196, 8, 68, 65, 84, 65,164, 0, 0, 0,120, 78,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 8,158,193, 8,168, 77,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0, 8,158,193, 8,112, 0, 0, 0, 1, 0, 0, 0,144,165,193, 8, +120, 78,196, 8, 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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0,144,165,193, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,158,193, 8, 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,140, 2, 0, 0, + 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 8,158,193, 8, 68, 65, 84, 65,212, 0, 0, 0, + 72, 79,196, 8, 94, 0, 0, 0, 1, 0, 0, 0, 72, 80,196, 8, 0, 0, 0, 0, 4, 0, 0, 0, 51, 51, 51, 63,208, 45,196, 8, + 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,193, 0,192,202, 68, + 0, 0, 0,193, 0, 0,104, 67, 0, 0, 0,193, 40,224,182, 68, 0, 0, 0,193, 0, 0,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,128, 67, 0, 0, 40, 66, 0, 0,200, 68, 0, 0,225, 67, 0, 0, 0, 63,225,122,180, 63, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 5,209, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 4, 0, 24, 22,197, 8, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,141, 0, 0, 0, 0, 0,109, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,180, 2, 0, 0, 72, 80,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 40, 83,196, 8, 72, 79,196, 8, 1, 0, 0, 0, + 51, 51, 51, 63,208, 45,196, 8, 0, 0, 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, 32,193, 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, 32, 65, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 15, 51, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29,254,249,195,125,254, 71,194, 0, 0, 0, 0, 0, 0, 0, 0,173,128,249, 67,138, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 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, 32, 65, 1, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 1, 0, 7, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,196, 0, 0, 0, 40, 83,196, 8, 97, 0, 0, 0, 1, 0, 0, 0, 24, 84,196, 8, + 72, 80,196, 8, 3, 0, 0, 0, 51, 51, 51, 63,208, 45,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,192,192, 0, 0,160, 64, 0, 0, 0, 0,205,204,140, 65,201, 82, 5,194,124,171, 30, 66, 49,238,226, 64,140,108,168, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0,245, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0, 0,160, 67, 0, 0,160, 67, + 10,215, 35, 60, 0, 0, 0, 64, 0, 0, 0, 0, 1, 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, + 68, 65, 84, 65, 84, 1, 0, 0, 24, 84,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 83,196, 8, 5, 0, 0, 0, + 51, 51, 51, 63,208, 45,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,152, 85,196, 8,113, 0, 0, 0, 1, 0, 0, 0,144, 86,196, 8, +208, 45,196, 8,128, 42,196, 8, 64, 41,196, 8,128, 41,196, 8,192, 42,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, +225, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,225, 3, 0, 0,251, 3, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, +252, 3, 0, 0, 0, 4, 0, 0, 7, 0, 6, 0, 1, 0, 7, 7, 1, 5, 5, 0, 1, 1, 1, 1,196, 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, 32, 27,194, 8,176,231,195, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,144, 86,196, 8,113, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +152, 85,196, 8, 0, 42,196, 8,128, 42,196, 8,192, 42,196, 8, 64, 42,196, 8, 0, 0, 0, 0,184,119,162, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,240, 14, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +111, 18,131,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 5, 0, 0, +237, 0, 0, 0,223, 3, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0,237, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 8, 1, 0, 0,223, 3, 0, 0, 9, 0, 8, 0, 1, 0, 1, 1, 1, 5,216, 2, 1, 0, 1, 0, 5, 3, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 89,196, 8, 64, 98,196, 8,104,176,195, 8,104,176,195, 8, +136, 87,196, 8, 88, 88,196, 8, 68, 65, 84, 65,164, 0, 0, 0,136, 87,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 88, 88,196, 8, + 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, 44, 0, 21, 2, 62, 1,204, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0, 88, 88,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136, 87,196, 8, 86,105,101,119, + 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 84, 1, 8, 0, + 62, 1,204, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0, + 40, 89,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 8, 92,196, 8, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63,144, 86,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,184,119,162, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,183,240, 14, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,123,176, 73, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 62,229, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,121,195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,184,119,162, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,183,240, 14, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, + 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +123,176, 73, 65, 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 3, 0,251,255, 8, 8, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,189, 57,161, 60,205,204,204, 61, 0, 0,250, 67, + 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128,193, 55,143, 63, 0,174,255,192, 88, 23,141,191, 60, 0, 1, 0, 7, 0,175, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255,170,239,188, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +170,239,188, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,239,188, 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, + 68, 65, 84, 65, 40, 1, 0, 0, 8, 92,196, 8, 93, 0, 0, 0, 1, 0, 0, 0, 96, 93,196, 8, 40, 89,196, 8, 2, 0, 0, 0, + 51, 51, 51, 63,144, 86,196, 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,122, 67,205,204,204,189,205,204,140, 63, 0, 0, 0, 0, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, + 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 50, 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, 50, 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, 72, 12,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63, 68, 65, 84, 65, +196, 0, 0, 0, 96, 93,196, 8, 97, 0, 0, 0, 1, 0, 0, 0, 96, 96,196, 8, 8, 92,196, 8, 3, 0, 0, 0, 51, 51, 51, 63, +144, 86,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 24,167, 65,102,102,174,193, +122, 20,238, 65, 75, 95,116,194, 75, 95,116, 66, 51, 51, 9,194, 51, 51, 9, 66, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 50, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, + 50, 2, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0, 0,160, 67, 0, 0,160, 67, 10,215, 35, 60, 0, 0, 0, 64, 0, 0, 0, 0, + 1, 0, 0, 0,233, 3, 50, 2, 0, 0, 0, 0, 80, 94,196, 8, 8, 96,196, 8, 0, 0,143, 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, 68, 65, 84, 65, 44, 0, 0, 0, 80, 94,196, 8, +129, 0, 0, 0, 1, 0, 0, 0,168, 94,196, 8, 0, 0, 0, 0, 66, 79, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,113, 61, 10,192, + 0, 0, 0, 0, 0, 0, 0, 0, 72, 12,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0,168, 94,196, 8, +129, 0, 0, 0, 1, 0, 0, 0, 0, 95,196, 8, 80, 94,196, 8, 69, 77, 4, 0, 0, 0, 0, 0, 0, 0,192, 64,205,204,124, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 24, 22,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0, 0, 95,196, 8, +129, 0, 0, 0, 1, 0, 0, 0, 88, 95,196, 8,168, 94,196, 8, 65, 77, 5, 0, 0, 0, 0, 0,235, 49,126, 65, 98, 62,200, 65, + 0, 0, 0, 0, 0, 0, 0, 0,184, 18,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0, 88, 95,196, 8, +129, 0, 0, 0, 1, 0, 0, 0,176, 95,196, 8, 0, 95,196, 8, 66, 79, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 65, + 0, 0, 0, 0, 0, 0, 0, 0,152, 15,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0,176, 95,196, 8, +129, 0, 0, 0, 1, 0, 0, 0, 8, 96,196, 8, 88, 95,196, 8, 66, 79, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,112, 61, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0, 8, 96,196, 8, +129, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176, 95,196, 8, 67, 83, 0, 0, 0, 0, 0, 0, 0, 0,192, 64,102,102,174,193, + 0, 0, 0, 0, 0, 0, 0, 0,136,251,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,176, 0, 0, 0, 96, 96,196, 8, +177, 0, 0, 0, 1, 0, 0, 0, 64, 97,196, 8, 96, 93,196, 8, 12, 0, 0, 0, 51, 51, 51, 63,144, 86,196, 8, 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,128, 8, 68,217, 3, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 50, 2, 0, 0,128, 0, 0, 0, +217, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 0,217, 3, 0, 0, 16, 0, 0, 0, 50, 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,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,212, 0, 0, 0, + 64, 97,196, 8, 94, 0, 0, 0, 1, 0, 0, 0, 64, 98,196, 8, 96, 96,196, 8, 4, 0, 0, 0, 51, 51, 51, 63,144, 86,196, 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,224,159, 68, + 0, 0,160,193, 0, 0,100, 67,246, 56,165, 67, 26, 29,110, 68, 13,102,183,193,246, 25,161, 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,200, 68, 0, 0,225, 67, 0, 0, 0, 63,225,122,180, 63, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 84, 1, 0, 0, 64, 98,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 97,196, 8, 5, 0, 0, 0, + 51, 51, 51, 63,144, 86,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, + 83, 97,118,101, 32, 70,105,108,101, 0, 78, 84, 0, 32, 80, 73, 67, 84, 85, 82, 69, 83, 0, 0, 47, 85,115,101,114,115, 47,116, +111,110, 47, 68,101,115,107,116,111,112, 47, 0,117,109,112, 98,117,103, 32, 70,111,108,100,101,114, 47, 0,101,110,100,101,114, + 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,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,117,110,116,105,116,108,101,100, + 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, 8, 0, 11, 0, 1, 0, 0, 0,251, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 0, 0,116, 0, 0, 0,192, 99,196, 8,109, 0, 0, 0, 1, 0, 0, 0,232,163,196, 8, + 96, 40,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 51, 45, 77, 97,116,101,114,105, 97,108, 0,111,100,101,108, 32, 83,105, +110,103, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,100,196, 8,160,103,196, 8,224,103,196, 8, 16,110,196, 8, 88,110,196, 8, + 56,156,196, 8,136,251,196, 8, 0, 0,231, 3,143, 1,174, 4,232, 3, 32, 3, 1, 0, 3, 0, 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, 20, 0, 0, 0, 96,100,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,160,100,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +160,100,196, 8,110, 0, 0, 0, 1, 0, 0, 0,224,100,196, 8, 96,100,196, 8, 0, 0, 0, 0, 0, 0, 32, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,224,100,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 32,101,196, 8,160,100,196, 8, 0, 0, 0, 0, +232, 3, 32, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32,101,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 96,101,196, 8, +224,100,196, 8, 0, 0, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,101,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,160,101,196, 8, 32,101,196, 8, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +160,101,196, 8,110, 0, 0, 0, 1, 0, 0, 0,224,101,196, 8, 96,101,196, 8, 0, 0, 0, 0,232, 3, 60, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,224,101,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 32,102,196, 8,160,101,196, 8, 0, 0, 0, 0, + 0, 0, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32,102,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 96,102,196, 8, +224,101,196, 8, 0, 0, 0, 0,232, 3, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,102,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,160,102,196, 8, 32,102,196, 8, 0, 0, 0, 0, 44, 3, 60, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +160,102,196, 8,110, 0, 0, 0, 1, 0, 0, 0,224,102,196, 8, 96,102,196, 8, 0, 0, 0, 0, 44, 3, 6, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,224,102,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 32,103,196, 8,160,102,196, 8, 0, 0, 0, 0, + 0, 0,176, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32,103,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 96,103,196, 8, +224,102,196, 8, 0, 0, 0, 0, 44, 3,176, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,103,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,160,103,196, 8, 32,103,196, 8, 0, 0, 0, 0,164, 1,176, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +160,103,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,103,196, 8, 0, 0, 0, 0,164, 1, 6, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0,224,103,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 40,104,196, 8, 0, 0, 0, 0,160,100,196, 8, +224,100,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40,104,196, 8,111, 0, 0, 0, 1, 0, 0, 0, +112,104,196, 8,224,103,196, 8, 96,100,196, 8, 32,101,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +112,104,196, 8,111, 0, 0, 0, 1, 0, 0, 0,184,104,196, 8, 40,104,196, 8, 96,100,196, 8, 96,101,196, 8, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,104,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 0,105,196, 8,112,104,196, 8, + 32,101,196, 8,160,101,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0,105,196, 8,111, 0, 0, 0, + 1, 0, 0, 0, 72,105,196, 8,184,104,196, 8, 96,101,196, 8,160,101,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0, 72,105,196, 8,111, 0, 0, 0, 1, 0, 0, 0,144,105,196, 8, 0,105,196, 8,160,100,196, 8,224,101,196, 8, + 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,105,196, 8,111, 0, 0, 0, 1, 0, 0, 0,216,105,196, 8, + 72,105,196, 8,224,100,196, 8, 32,102,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,105,196, 8, +111, 0, 0, 0, 1, 0, 0, 0, 32,106,196, 8,144,105,196, 8,224,101,196, 8, 32,102,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0, 32,106,196, 8,111, 0, 0, 0, 1, 0, 0, 0,104,106,196, 8,216,105,196, 8,160,101,196, 8, + 32,102,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,106,196, 8,111, 0, 0, 0, 1, 0, 0, 0, +176,106,196, 8, 32,106,196, 8, 96,101,196, 8, 96,102,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +176,106,196, 8,111, 0, 0, 0, 1, 0, 0, 0,248,106,196, 8,104,106,196, 8,160,101,196, 8, 96,102,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,106,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 64,107,196, 8,176,106,196, 8, + 32,102,196, 8,160,102,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,107,196, 8,111, 0, 0, 0, + 1, 0, 0, 0,136,107,196, 8,248,106,196, 8, 96,102,196, 8,160,102,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0,136,107,196, 8,111, 0, 0, 0, 1, 0, 0, 0,208,107,196, 8, 64,107,196, 8, 96,101,196, 8,224,102,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,107,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 24,108,196, 8, +136,107,196, 8,224,101,196, 8,224,102,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,108,196, 8, +111, 0, 0, 0, 1, 0, 0, 0, 96,108,196, 8,208,107,196, 8,160,102,196, 8, 32,103,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0, 96,108,196, 8,111, 0, 0, 0, 1, 0, 0, 0,168,108,196, 8, 24,108,196, 8, 96,102,196, 8, + 32,103,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,108,196, 8,111, 0, 0, 0, 1, 0, 0, 0, +240,108,196, 8, 96,108,196, 8,224,102,196, 8, 32,103,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +240,108,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 56,109,196, 8,168,108,196, 8,224,102,196, 8, 96,103,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,109,196, 8,111, 0, 0, 0, 1, 0, 0, 0,128,109,196, 8,240,108,196, 8, + 32,103,196, 8, 96,103,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,109,196, 8,111, 0, 0, 0, + 1, 0, 0, 0,200,109,196, 8, 56,109,196, 8,224,101,196, 8,160,103,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0,200,109,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 16,110,196, 8,128,109,196, 8,160,102,196, 8,160,103,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,110,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +200,109,196, 8, 96,103,196, 8,160,103,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0, 88,110,196, 8, +113, 0, 0, 0, 1, 0, 0, 0,112,122,196, 8, 0, 0, 0, 0, 96,100,196, 8, 96,101,196, 8,160,101,196, 8, 32,101,196, 8, + 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,226,215,163,188, + 0, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 27, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 1, 0, 15, 15,233, 3, 33, 0, + 1, 1, 1, 0,192, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,114,196, 8, +240,120,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,196, 8,192,113,196, 8, 68, 65, 84, 65,164, 0, 0, 0, 80,111,196, 8, +112, 0, 0, 0, 1, 0, 0, 0, 32,112,196, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, 32,112,196, 8,112, 0, 0, 0, 1, 0, 0, 0, +240,112,196, 8, 80,111,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0,240,112,196, 8,112, 0, 0, 0, 1, 0, 0, 0,192,113,196, 8, 32,112,196, 8, + 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, +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, 68, 65, 84, 65, +164, 0, 0, 0,192,113,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,112,196, 8, 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,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, 68, 65, 84, 65,148, 0, 0, 0,144,114,196, 8, +102, 0, 0, 0, 1, 0, 0, 0, 80,115,196, 8, 0, 0, 0, 0, 15, 0, 0, 0, 51, 51, 51, 63, 1, 86,239, 92, 0, 0,128,192, + 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 16, 65, 0, 0,128,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 16, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +233, 3, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0,128, 63, 0, 0, 16, 65, 0, 0,250, 70, 0, 0, 16, 65,205,204,204, 61, + 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, +160, 0, 0, 0, 80,115,196, 8,166, 0, 0, 0, 1, 0, 0, 0, 32,116,196, 8,144,114,196, 8, 11, 0, 0, 0, 51, 51, 51, 63, + 1, 86,239, 92, 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,233, 3, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0,233, 3, 0, 0, 16, 0, 0, 0, 9, 0, 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, 68, 65, 84, 65,212, 0, 0, 0, 32,116,196, 8, 94, 0, 0, 0, + 1, 0, 0, 0, 32,117,196, 8, 80,115,196, 8, 4, 0, 0, 0, 51, 51, 51, 63, 1, 86,239, 92, 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,193, 0, 0,163, 68, 0, 0, 0,193, 0, 0,104, 67, + 63, 0, 0,193,172, 3,182, 68, 0, 0, 0,193, 0, 0,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,128, 67, 0, 0, 40, 66, 0, 0,200, 68, 0, 0,225, 67, 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0, +251, 4,209, 0, 0, 0, 0, 0, 0, 0,255,255, 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,109, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0, + 32,117,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 0,120,196, 8, 32,116,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, 1, 86,239, 92, + 0, 0, 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, 32,193, 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, 32, 65, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,183, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, + 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 99, 15, 51, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29,254,249,195,125,254, 71,194, + 0, 0, 0, 0, 0, 0, 0, 0,173,128,249, 67,138, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 32, 65, 1, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 3, 0, 0, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 0, 7, 0, 0, 0, + 0, 0, 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, + 68, 65, 84, 65,196, 0, 0, 0, 0,120,196, 8, 97, 0, 0, 0, 1, 0, 0, 0,240,120,196, 8, 32,117,196, 8, 3, 0, 0, 0, + 51, 51, 51, 63, 1, 86,239, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,192, 0, 0,160, 64, + 0, 0, 0, 0,205,204,140, 65,201, 82, 5,194,124,171, 30, 66, 49,238,226, 64,140,108,168, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, + 0, 0, 0, 0,245, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0, 0,160, 67, 0, 0,160, 67, 10,215, 35, 60, 0, 0, 0, 64, + 0, 0, 0, 0, 1, 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, 68, 65, 84, 65, 84, 1, 0, 0, +240,120,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,120,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 86,239, 92, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,204, 0, 0, 0,112,122,196, 8,113, 0, 0, 0, 1, 0, 0, 0,104,123,196, 8, 88,110,196, 8,224,101,196, 8, +160,100,196, 8,224,100,196, 8, 32,102,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 7, 3, 0, 0, 32, 3, 0, 0, + 0, 0, 0, 0,232, 3, 0, 0, 7, 3, 0, 0, 33, 3, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 32, 3, 0, 0, 32, 3, 0, 0, + 0, 0, 0, 0, 1, 0, 7, 7,233, 3, 1, 0, 1, 1, 1, 1,196, 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, + 68, 65, 84, 65,204, 0, 0, 0,104,123,196, 8,113, 0, 0, 0, 1, 0, 0, 0,216,140,196, 8,112,122,196, 8, 96,102,196, 8, +160,102,196, 8, 32,102,196, 8,160,101,196, 8, 0, 0, 0, 0,255,255, 71, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,139, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, + 0, 0, 0,128, 0, 0, 0,128, 74,215, 76,190, 0, 0, 0,128, 45, 3, 0, 0,232, 3, 0, 0, 61, 0, 0, 0, 5, 3, 0, 0, + 45, 3, 0, 0,232, 3, 0, 0, 61, 0, 0, 0, 87, 0, 0, 0, 45, 3, 0, 0,232, 3, 0, 0, 88, 0, 0, 0, 5, 3, 0, 0, + 0, 0, 0, 0, 1, 0, 4, 4,188, 0,174, 2, 1, 1, 1, 0,179, 1,126, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32,134,196, 8, 88,139,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 96,124,196, 8, 80,133,196, 8, + 68, 65, 84, 65,164, 0, 0, 0, 96,124,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 48,125,196, 8, 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, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, + 48,125,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0,126,196, 8, 96,124,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, 0,126,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,208,126,196, 8, 48,125,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0,208,126,196, 8,112, 0, 0, 0, 1, 0, 0, 0,160,127,196, 8, + 0,126,196, 8, 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, 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, + 68, 65, 84, 65,164, 0, 0, 0,160,127,196, 8,112, 0, 0, 0, 1, 0, 0, 0,112,128,196, 8,208,126,196, 8, 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, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, +112,128,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 64,129,196, 8,160,127,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, 64,129,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 16,130,196, 8,112,128,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, 16,130,196, 8,112, 0, 0, 0, 1, 0, 0, 0,224,130,196, 8, + 64,129,196, 8, 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, 68,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, + 68, 65, 84, 65,164, 0, 0, 0,224,130,196, 8,112, 0, 0, 0, 1, 0, 0, 0,176,131,196, 8, 16,130,196, 8, 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, 92,251, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, +176,131,196, 8,112, 0, 0, 0, 1, 0, 0, 0,128,132,196, 8,224,130,196, 8, 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, 96,252, 62, 1,204, 0, 4, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0,128,132,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 80,133,196, 8,176,131,196, 8, 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, 24,255, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112,128,196, 8, 68, 65, 84, 65,164, 0, 0, 0, 80,133,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +128,132,196, 8, 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, 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, + 68, 65, 84, 65,212, 0, 0, 0, 32,134,196, 8, 94, 0, 0, 0, 1, 0, 0, 0, 32,135,196, 8, 0, 0, 0, 0, 4, 0, 0, 0, + 51, 51, 51, 63, 1, 86,249,156, 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,128,148,196, 0, 0,104, 67, 0, 0, 0,193, 0, 0,163, 67,170,175,118,196,255,255,103, 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,200, 68, 0, 0,225, 67, + 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0,188, 0,174, 2, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 0, 0, 0, 0, 0,150, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0, 32,135,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 0,138,196, 8, + 32,134,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, 1, 86,249,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +188, 74,140, 62,166,194, 72,191, 33,132, 14, 63, 0, 0, 0, 0, 41,120,117, 63,135,105, 54, 62,200, 80, 98,190, 0, 0, 0, 0, +239,220,151, 61, 31, 40, 24, 63, 94,255, 76, 63, 0, 0, 0, 0,175,149, 97, 63,230,187,142,189,122,166,182,193, 0, 0,128, 63, +186, 74,140, 62, 35,120,117, 63,254,220,151, 61, 0, 0, 0, 0,160,194, 72,191,131,105, 54, 62, 30, 40, 24, 63, 0, 0, 0, 0, + 32,132, 14, 63,190, 80, 98,190, 94,255, 76, 63, 0, 0, 0, 0, 92,160, 70, 65,162, 28,188,192,224, 17,146, 65, 0, 0,128, 63, +197, 52, 91, 63,228,148, 91,191,186,146, 14,191, 33,132, 14,191,223,197, 63, 64,106,131, 71, 62,246,103, 98, 62,200, 80, 98, 62, + 52, 73,109, 62,225,107, 38, 63, 93, 20, 77,191, 94,255, 76,191,240, 60, 48, 64,130, 29,156,189,128, 31,181, 65,122,166,182, 65, +252,146,179, 61,173, 25,157, 62, 75, 99,194, 60, 0, 0,165, 50,214,141, 55,191,192,199, 38, 62,176, 28, 11, 63, 0,128, 24,181, +167, 58,120,194,184, 22,235, 65, 49,140,182,194, 27,247,159,192, 5, 26,118, 66, 44,106,233,193,230, 4,181, 66,126, 7,160, 64, +255,255, 71, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,139, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, 74,215, 76,190, 0, 0, 0,128, +188, 74,140, 62,166,194, 72,191, 33,132, 14, 63, 0, 0, 0, 0, 41,120,117, 63,135,105, 54, 62,200, 80, 98,190, 0, 0, 0, 0, +239,220,151, 61, 31, 40, 24, 63, 94,255, 76, 63, 0, 0, 0, 0,175,149, 97, 63,230,187,142,189,122,166,182,193, 0, 0,128, 63, +218, 31, 64, 63, 36, 17,139,190,182,154, 36,190,156,165, 20,191,221, 79,187, 65, 1, 0, 0, 0, 40, 9,197, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 10, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67,104,217, 30, 63,106, 40, 52, 63,116, 39,251, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 7, 0,175, 0, 0, 0, 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, 68, 65, 84, 65, 40, 1, 0, 0, 0,138,196, 8, 93, 0, 0, 0, + 1, 0, 0, 0, 88,139,196, 8, 32,135,196, 8, 2, 0, 0, 0, 51, 51, 51, 63, 1, 86,249,156, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32,193, 0, 0, 32, 65, + 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 88,139,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0,138,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 86,249,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 83, 65, 86, 69, 32, 70, 73, 76, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47,117,115,114, 47,104,111,109,101, 47,105,110,116,114,114, 47, 98,108,101,110,100,101,114, 47, 98,108,101,110, +100, 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,117,110,116,105,116,108,101,100, 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, 8, 0, 24, 0, 1, 0, 0, 0,203, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,216,140,196, 8, +113, 0, 0, 0, 1, 0, 0, 0,136,148,196, 8,104,123,196, 8, 96,101,196, 8,224,102,196, 8, 32,103,196, 8, 96,102,196, 8, + 0, 0, 0, 0, 85,240, 46, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,237,119,206, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 43, 3, 0, 0, 61, 0, 0, 0,175, 1, 0, 0, 0, 0, 0, 0, 43, 3, 0, 0, 61, 0, 0, 0, + 87, 0, 0, 0, 0, 0, 0, 0, 43, 3, 0, 0, 88, 0, 0, 0,175, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 44, 3, 88, 1, + 1, 0, 1, 0,251, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,141,196, 8, + 8,147,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0,208,141,196, 8, + 89, 0, 0, 0, 1, 0, 0, 0,176,144,196, 8, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 1, 87, 7,236, 0, 0, 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,104,217, 30, 63, +106, 40, 52, 63,116, 39,251, 62, 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,104,217, 30,191, +106, 40, 52,191,116, 39,251,190, 0, 0,128, 63, 85,240, 46, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +237,119,206, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0,202, 25,217, 60, +235, 76,145, 61, 70,151,128,186, 0, 0,128, 63,172, 79,187, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1,181, 30, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,255,255,249,195, 0, 0, 0, 0,103,217, 30,191, +106, 40, 52,191,116, 39,251,190, 0, 0,128, 63, 85,240, 46, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +237,119,206, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, 0, 0, 0,128, 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,104,217, 30, 63, +106, 40, 52, 63,116, 39,251, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 79,187, 65, + 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, + 10, 0, 8, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67,104,217, 30, 63, +106, 40, 52, 63,116, 39,251, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 1, 0, 7, 0,175, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 0, 69,104,138, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,104,138, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,104,138, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +212, 0, 0, 0,176,144,196, 8, 94, 0, 0, 0, 1, 0, 0, 0,176,145,196, 8,208,141,196, 8, 4, 0, 0, 0, 51, 51, 51, 63, + 1, 87, 7,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, 0, 0, 0, 0, + 0,224,159, 68, 0, 0, 0, 0, 0, 0,100, 67,172, 62, 57, 67, 44,184,136, 68,169,101, 28,195, 16,147,173, 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,200, 68, 0, 0,225, 67, 0, 0, 0, 63, +225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,176,145,196, 8, 93, 0, 0, 0, 1, 0, 0, 0, 8,147,196, 8,176,144,196, 8, + 2, 0, 0, 0, 51, 51, 51, 63, 1, 87, 7,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, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, + 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 84, 1, 0, 0, 8,147,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176,145,196, 8, 5, 0, 0, 0, + 51, 51, 51, 63, 1, 87, 7,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, + 83, 65, 86, 69, 32, 70, 73, 76, 69, 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,100,101,114, 47, 98,108,101,110,100, 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,117,110,116,105,116,108,101,100, + 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, 8, 0, 0, 0, 1, 0, 0, 0,203, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,136,148,196, 8,113, 0, 0, 0, 1, 0, 0, 0, 56,156,196, 8, +216,140,196, 8, 96,103,196, 8,160,103,196, 8,160,102,196, 8, 32,103,196, 8, 0, 0, 0, 0,173,101,182, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 36,209, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +154, 65,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, 72, 1, 77,190, 0, 0, 0,128,165, 1, 0, 0, 43, 3, 0, 0, +177, 1, 0, 0, 5, 3, 0, 0,165, 1, 0, 0, 43, 3, 0, 0,177, 1, 0, 0,177, 1, 0, 0,165, 1, 0, 0, 43, 3, 0, 0, +177, 1, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,135, 1, 85, 1, 3, 0, 1, 0, 83, 2, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,149,196, 8,184,154,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0,128,149,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 96,152,196, 8, + 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 1, 87, 12,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0, +191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63, +223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0, + 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, +144, 52,122, 63, 39,192, 4,191,244,250, 39,191, 8,165, 39,191,228,183,132, 63, 75,179, 2, 63,180,164, 28, 63,149, 84, 28, 63, +118,137,124,188,232, 64,187, 63, 8,108,228,190, 50,247,227,190, 18,188,246,190,141,144, 29,191,216, 49, 49, 65,152, 9, 52, 65, +116,112,246, 62,142,184, 2, 63, 64,191,248,187, 0, 0,144,179, 64,230, 70,190,226,211, 67, 62,254, 71, 12, 63, 0, 0, 0, 52, +211,120, 21,194,144, 5, 2, 66, 7,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,155,101,210, 65,173, 40,160, 64, +173,101,182, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 36,209, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, 72, 1, 77,190, 0, 0, 0,128, +221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0, +191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63, +241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 3, 35,171,190,221, 79,187, 65, 2, 0, 0, 0, 40, 9,197, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 10, 0, 8, 24, 0, 0, 12, 66, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67,104,217, 30, 63,106, 40, 52, 63,116, 39,251, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 7, 0,175, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0,221,224, 65, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,224, 65, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,221,224, 65, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,212, 0, 0, 0, 96,152,196, 8, 94, 0, 0, 0, + 1, 0, 0, 0, 96,153,196, 8,128,149,196, 8, 4, 0, 0, 0, 51, 51, 51, 63, 1, 87, 12,124, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,100, 67, +172, 62, 57, 67, 44,184,136, 68,169,101, 28,195, 16,147,173, 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,200, 68, 0, 0,225, 67, 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,150, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 96,153,196, 8, 93, 0, 0, 0, 1, 0, 0, 0,184,154,196, 8, 96,152,196, 8, 2, 0, 0, 0, 51, 51, 51, 63, 1, 87, 12,124, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, + 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,184,154,196, 8, + 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,153,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 87, 12,124, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 83, 65, 86, 69, 32, 70, 73, 76, 69, 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, +100,101,114, 47, 98,108,101,110,100, 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,117,110,116,105,116,108,101,100, 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, 8, 0, 0, 0, + 1, 0, 0, 0,203, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +204, 0, 0, 0, 56,156,196, 8,113, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,148,196, 8,224,102,196, 8,224,101,196, 8, +160,103,196, 8, 96,103,196, 8, 0, 0, 0, 0,152, 38,151, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 43,186, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, 0, 0, 0,128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,163, 1, 0, 0,177, 1, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, +163, 1, 0, 0,177, 1, 0, 0,177, 1, 0, 0, 0, 0, 0, 0,163, 1, 0, 0,177, 1, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1,164, 1, 85, 1, 3, 0, 1, 0, 83, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48,157,196, 8,104,162,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +180, 2, 0, 0, 48,157,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 16,160,196, 8, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, + 1, 87, 17, 12, 0, 0, 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,128, + 0, 0, 0, 0, 0, 0, 0,128,174, 2, 19, 51,255,255,127,191, 0, 0, 0, 0, 0, 0, 0, 0,255,255,127, 63,174, 2, 19, 51, + 0, 0, 0, 0, 58,248, 30,192, 45,161,118,192,107, 40, 52,191, 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, 51, 1, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,128,191,176, 2, 19, 51, + 0, 0, 0, 0, 59,248, 30, 64,107, 40, 52,191, 48,161,118, 64, 0, 0,128, 63,152, 38,151, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80,209, 85, 49,110, 18, 3, 59, 0, 0, 0, 0, 0, 0, 0, 0, 6, 43,186, 61,234,137,150,174, + 0, 0, 0, 0,195,184, 59,190,143, 90,179,190, 79,123,184, 58, 0, 0,128, 63, 74,202, 88, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 53, 0, 0,128, 52, 85, 3, 48, 65, 0, 0, 0, 0, 0, 0,128,171, 1, 0,250, 67,160,144,143,183, + 0, 0, 0, 0, 59,248, 30, 64,106, 40, 52,191, 48,161,118, 64, 0, 0,128, 63,152, 38,151, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 43,186, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, + 0, 0, 0,128, 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,128, + 0, 0, 0, 0, 0, 0, 0,128,174, 2, 19, 51,255,255,127,191, 0, 0, 0, 0, 0, 0, 0, 0,255,255,127, 63,174, 2, 19, 51, + 0, 0, 0, 0, 58,248, 30,192, 45,161,118,192,107, 40, 52,191, 0, 0,128, 63,243, 4, 53, 63,243, 4, 53,191, 0, 0, 0, 0, + 0, 0, 0, 0, 73,202, 88, 65, 0, 0, 1, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 3, 0, 10, 0, 8, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, + 0, 0,250, 67, 58,248, 30,192,106, 40, 52, 63, 46,161,118,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 2, 0, + 7, 0,175, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0,162,217,154, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,162,217,154, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162,217,154, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,212, 0, 0, 0, 16,160,196, 8, 94, 0, 0, 0, 1, 0, 0, 0, 16,161,196, 8, 48,157,196, 8, + 4, 0, 0, 0, 51, 51, 51, 63, 1, 87, 17, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,224,159, 68, 0, 0, 0, 0, 0, 0,100, 67,172, 62, 57, 67, 44,184,136, 68,169,101, 28,195, + 16,147,173, 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,200, 68, + 0, 0,225, 67, 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 16,161,196, 8, 93, 0, 0, 0, 1, 0, 0, 0, +104,162,196, 8, 16,160,196, 8, 2, 0, 0, 0, 51, 51, 51, 63, 1, 87, 17, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, + 0, 0,122, 67, 0, 0, 32,193, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,104,162,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 16,161,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 87, 17, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 83, 65, 86, 69, 32, 70, 73, 76, 69, 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,100,101,114, 47, 98,108,101,110,100, 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, +117,110,116,105,116,108,101,100, 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, 8, 0, 0, 0, 1, 0, 0, 0,203, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 0, 0,116, 0, 0, 0,232,163,196, 8,109, 0, 0, 0, + 1, 0, 0, 0,136,207,196, 8,192, 99,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 52, 45, 83,101,113,117,101,110, 99,101, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,164,196, 8,200,167,196, 8, 8,168,196, 8, +168,173,196, 8,240,173,196, 8, 96,201,196, 8,136,251,196, 8, 0, 0,231, 3,143, 1,174, 4,232, 3, 32, 3, 1, 0, 4, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +136,164,196, 8,110, 0, 0, 0, 1, 0, 0, 0,200,164,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,200,164,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 8,165,196, 8,136,164,196, 8, 0, 0, 0, 0, + 0, 0, 32, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 8,165,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 72,165,196, 8, +200,164,196, 8, 0, 0, 0, 0,232, 3, 32, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 72,165,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,136,165,196, 8, 8,165,196, 8, 0, 0, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +136,165,196, 8,110, 0, 0, 0, 1, 0, 0, 0,200,165,196, 8, 72,165,196, 8, 0, 0, 0, 0, 0, 0,200, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,200,165,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 8,166,196, 8,136,165,196, 8, 0, 0, 0, 0, +232, 3,200, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 8,166,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 72,166,196, 8, +200,165,196, 8, 0, 0, 0, 0, 0, 0, 6, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 72,166,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,136,166,196, 8, 8,166,196, 8, 0, 0, 0, 0,232, 3, 6, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +136,166,196, 8,110, 0, 0, 0, 1, 0, 0, 0,200,166,196, 8, 72,166,196, 8, 0, 0, 0, 0, 0, 0,244, 1, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,200,166,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 8,167,196, 8,136,166,196, 8, 0, 0, 0, 0, +232, 3,244, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 8,167,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 72,167,196, 8, +200,166,196, 8, 0, 0, 0, 0, 84, 2,244, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 72,167,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,136,167,196, 8, 8,167,196, 8, 0, 0, 0, 0, 84, 2, 6, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +136,167,196, 8,110, 0, 0, 0, 1, 0, 0, 0,200,167,196, 8, 72,167,196, 8, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,200,167,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,167,196, 8, 0, 0, 0, 0, +232, 3, 4, 1, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,168,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 80,168,196, 8, + 0, 0, 0, 0,200,164,196, 8, 8,165,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,168,196, 8, +111, 0, 0, 0, 1, 0, 0, 0,152,168,196, 8, 8,168,196, 8,136,164,196, 8, 72,165,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0,152,168,196, 8,111, 0, 0, 0, 1, 0, 0, 0,224,168,196, 8, 80,168,196, 8,136,164,196, 8, +136,165,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,168,196, 8,111, 0, 0, 0, 1, 0, 0, 0, + 40,169,196, 8,152,168,196, 8, 72,165,196, 8,200,165,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, + 40,169,196, 8,111, 0, 0, 0, 1, 0, 0, 0,112,169,196, 8,224,168,196, 8,136,165,196, 8,200,165,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,169,196, 8,111, 0, 0, 0, 1, 0, 0, 0,184,169,196, 8, 40,169,196, 8, +200,164,196, 8, 8,166,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,169,196, 8,111, 0, 0, 0, + 1, 0, 0, 0, 0,170,196, 8,112,169,196, 8, 8,165,196, 8, 72,166,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0, 0,170,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 72,170,196, 8,184,169,196, 8, 8,166,196, 8, 72,166,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72,170,196, 8,111, 0, 0, 0, 1, 0, 0, 0,144,170,196, 8, + 0,170,196, 8, 8,166,196, 8,136,166,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,170,196, 8, +111, 0, 0, 0, 1, 0, 0, 0,216,170,196, 8, 72,170,196, 8, 72,166,196, 8,200,166,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0,216,170,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 32,171,196, 8,144,170,196, 8,136,166,196, 8, +200,166,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,171,196, 8,111, 0, 0, 0, 1, 0, 0, 0, +104,171,196, 8,216,170,196, 8,136,166,196, 8, 8,167,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +104,171,196, 8,111, 0, 0, 0, 1, 0, 0, 0,176,171,196, 8, 32,171,196, 8,200,166,196, 8, 8,167,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176,171,196, 8,111, 0, 0, 0, 1, 0, 0, 0,248,171,196, 8,104,171,196, 8, + 8,166,196, 8, 72,167,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,171,196, 8,111, 0, 0, 0, + 1, 0, 0, 0, 64,172,196, 8,176,171,196, 8, 72,166,196, 8, 72,167,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0, 64,172,196, 8,111, 0, 0, 0, 1, 0, 0, 0,136,172,196, 8,248,171,196, 8, 8,167,196, 8, 72,167,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136,172,196, 8,111, 0, 0, 0, 1, 0, 0, 0,208,172,196, 8, + 64,172,196, 8,136,165,196, 8,136,167,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,172,196, 8, +111, 0, 0, 0, 1, 0, 0, 0, 24,173,196, 8,136,172,196, 8,136,166,196, 8,136,167,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0, 24,173,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 96,173,196, 8,208,172,196, 8,200,166,196, 8, +200,167,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,173,196, 8,111, 0, 0, 0, 1, 0, 0, 0, +168,173,196, 8, 24,173,196, 8,200,165,196, 8,200,167,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +168,173,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,173,196, 8,136,167,196, 8,200,167,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,240,173,196, 8,113, 0, 0, 0, 1, 0, 0, 0,168,180,196, 8, 0, 0, 0, 0, +136,164,196, 8,136,165,196, 8,200,165,196, 8, 72,165,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, +199, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0,173, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, +172, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4,233, 3,173, 0, 1, 0, 1, 1,139, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,178,196, 8, 40,179,196, 8, 0, 0, 0, 0, 0, 0, 0, 0,232,174,196, 8, + 88,177,196, 8, 68, 65, 84, 65,164, 0, 0, 0,232,174,196, 8,112, 0, 0, 0, 1, 0, 0, 0,184,175,196, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +164, 0, 0, 0,184,175,196, 8,112, 0, 0, 0, 1, 0, 0, 0,136,176,196, 8,232,174,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0,136,176,196, 8, +112, 0, 0, 0, 1, 0, 0, 0, 88,177,196, 8,184,175,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0, 88,177,196, 8,112, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,136,176,196, 8, 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,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, 68, 65, 84, 65,212, 0, 0, 0, 40,178,196, 8, 94, 0, 0, 0, 1, 0, 0, 0, 40,179,196, 8, 0, 0, 0, 0, + 4, 0, 0, 0, 51, 51, 51, 63, 1, 87, 30,252, 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,193, 0, 0,163, 68, 0, 0, 0,193, 0, 0,104, 67, 0, 0, 0,193,118,149,172, 68, 0, 0, 0,193, + 0, 0,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,128, 67, 0, 0, 40, 66, 0, 0,200, 68, + 0, 0,225, 67, 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0,233, 3,173, 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,150, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 40,179,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 40,178,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 87, 30,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,168,180,196, 8, +113, 0, 0, 0, 1, 0, 0, 0,160,181,196, 8,240,173,196, 8, 8,166,196, 8,200,164,196, 8, 8,165,196, 8, 72,166,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 7, 3, 0, 0, 32, 3, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 7, 3, 0, 0, + 33, 3, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 32, 3, 0, 0, 32, 3, 0, 0, 0, 0, 0, 0, 1, 0, 7, 7,233, 3, 1, 0, + 1, 0, 1, 1,196, 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, 68, 65, 84, 65,204, 0, 0, 0,160,181,196, 8, +113, 0, 0, 0, 1, 0, 0, 0,136,188,196, 8,168,180,196, 8,136,165,196, 8,136,167,196, 8,200,167,196, 8,200,165,196, 8, + 0, 0, 0, 0,228, 56,142, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,185,206,105, 62, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, + 0, 0,128, 63, 0, 0, 0, 0,232, 3, 0, 0,201, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0,232, 3, 0, 0,201, 0, 0, 0, +227, 0, 0, 0, 0, 0, 0, 0,232, 3, 0, 0,228, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 1, 0, 15, 15,233, 3, 32, 0, + 1, 0, 1, 1,192, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,182,196, 8, + 8,187,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,148, 0, 0, 0,152,182,196, 8, +102, 0, 0, 0, 1, 0, 0, 0, 88,183,196, 8, 0, 0, 0, 0, 15, 0, 0, 0, 51, 51, 51, 63, 1, 87, 38,188, 0, 0,128,192, + 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0,128,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +233, 3, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 66, 0, 0,250, 70, 0, 0, 0, 66,205,204,204, 61, + 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, +164, 0, 0, 0, 88,183,196, 8, 95, 0, 0, 0, 1, 0, 0, 0, 40,184,196, 8,152,182,196, 8, 8, 0, 0, 0, 51, 51, 51, 63, + 1, 87, 38,188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, + 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 16, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,233, 3, 0, 0, 16, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0, 0,250, 70, 0, 0, 0, 66,205,204,204, 61, 0, 0, 32, 65, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0, 40,184,196, 8, + 89, 0, 0, 0, 1, 0, 0, 0, 8,187,196, 8, 88,183,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, 1, 87, 38,188, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,228, 56,142, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +185,206,105, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,102,102,102, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 38,140, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,249,195, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,102,102,102, 65, + 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, + 0, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 7, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, + 84, 1, 0, 0, 8,187,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,184,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, + 1, 87, 38,188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 65, 86, 69, + 32, 84, 65, 82, 71, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 49, 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, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 57, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,136,188,196, 8,113, 0, 0, 0, 1, 0, 0, 0,176,194,196, 8,160,181,196, 8, + 8,167,196, 8, 72,167,196, 8, 72,166,196, 8,200,166,196, 8, 0, 0, 0, 0,228, 56,142, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,191, 72, 20, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, + 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63, 85, 2, 0, 0,232, 3, 0, 0,245, 1, 0, 0, + 5, 3, 0, 0, 85, 2, 0, 0,232, 3, 0, 0,245, 1, 0, 0,245, 1, 0, 0, 85, 2, 0, 0,232, 3, 0, 0,245, 1, 0, 0, + 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8,148, 1, 17, 1, 3, 0, 1, 1, 9, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,189,196, 8, 48,193,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0,128,189,196, 8, 95, 0, 0, 0, 1, 0, 0, 0, 80,190,196, 8, 0, 0, 0, 0, + 8, 0, 0, 0, 51, 51, 51, 63, 1, 87, 42,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0, 49, 1, 0, 0, 17, 0, 0, 0,124, 2, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, +124, 2, 0, 0, 17, 0, 0, 0, 49, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0, 0,250, 70, 0, 0, 0, 66,205,204,204, 61, + 0, 0, 32, 65, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, +180, 2, 0, 0, 80,190,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 48,193,196, 8,128,189,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, + 1, 87, 42,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,228, 56,142, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,191, 72, 20, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,102,102,102, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42,251,220, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,249,195, + 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,102,102,102, 65, 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, + 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 84, 1, 0, 0, 48,193,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80,190,196, 8, + 5, 0, 0, 0, 51, 51, 51, 63, 1, 87, 42,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 0, 65, 86, 69, 32, 84, 65, 82, 71, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 49, 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, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 57, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,176,194,196, 8,113, 0, 0, 0, 1, 0, 0, 0, + 96,201,196, 8,136,188,196, 8,136,166,196, 8, 8,166,196, 8, 72,167,196, 8, 8,167,196, 8, 0, 0, 0, 0,228, 56,142, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,220, 29, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, + 83, 2, 0, 0,245, 1, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 83, 2, 0, 0,245, 1, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, + 83, 2, 0, 0, 16, 2, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 84, 2,246, 0, 1, 0, 1, 0,203, 1, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,195,196, 8,224,199,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,195,196, 8, 93, 0, 0, 0, 1, 0, 0, 0, + 0,197,196, 8, 0, 0, 0, 0, 2, 0, 0, 0, 51, 51, 51, 63, 1, 87, 46, 28, 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,160,192, 0, 0,210, 66,205,204,204,189,205,204,140, 63, 0, 0,160,192, + 0, 0,210, 66,205,204,204,189,205,204,140, 63, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,246, 0, 0, 0, 16, 0, 0, 0, + 19, 2, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 19, 2, 0, 0, 16, 0, 0, 0,246, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 83, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,192, 0, 0,210, 66, +205,204,204,189,205,204,140, 63, 68, 65, 84, 65,180, 2, 0, 0, 0,197,196, 8, 89, 0, 0, 0, 1, 0, 0, 0,224,199,196, 8, +168,195,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, 1, 87, 46, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +228, 56,142, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,220, 29, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, +102,102,102, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,179,146,207, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,249,195, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,102,102,102, 65, 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 7, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 84, 1, 0, 0,224,199,196, 8, 96, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0,197,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 87, 46, 28, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 79, 65, 68, 32, 70, 73, 76, 69, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, + 57, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0, + 96,201,196, 8,113, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176,194,196, 8,136,167,196, 8,136,166,196, 8,200,166,196, 8, +200,167,196, 8, 0, 0, 0, 0,228, 56,142, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,185,206,105, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, + 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0,232, 3, 0, 0, 5, 1, 0, 0,243, 1, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, + 5, 1, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 32, 1, 0, 0,243, 1, 0, 0, 0, 0, 0, 0, 1, 0, 8, 8, +233, 3,212, 0, 1, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 88,202,196, 8, 8,206,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, + 88,202,196, 8, 95, 0, 0, 0, 1, 0, 0, 0, 40,203,196, 8, 0, 0, 0, 0, 8, 0, 0, 0, 51, 51, 51, 63, 1, 87, 49,172, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,212, 0, 0, 0, + 16, 0, 0, 0,233, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,233, 3, 0, 0, 16, 0, 0, 0,212, 0, 0, 0, + 0, 0, 32, 65, 0, 0,128, 64, 0, 0,250, 70, 0, 0, 0, 66,205,204,204, 61, 0, 0, 32, 65, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 2, 0, 0, 40,203,196, 8, 89, 0, 0, 0, + 1, 0, 0, 0, 8,206,196, 8, 88,202,196, 8, 1, 0, 0, 0, 51, 51, 51, 63, 1, 87, 49,172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63,228, 56,142, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,185,206,105, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63,102,102,102, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 38,140, 64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,249,195, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,102,102,102, 65, 0, 0, 7, 0, + 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 24, + 0, 0, 12, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 7, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 84, 1, 0, 0, + 8,206,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,203,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 87, 49,172, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 65, 86, 69, 32, 84, 65, 82, + 71, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 49, 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, 0, 0, 0, + 8, 0, 0, 0, 2, 0, 0, 0, 57, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 82, 0, 0,116, 0, 0, 0,136,207,196, 8,109, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,163,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 82, 53, 45, 83, 99,114,105,112,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 40,208,196, 8,104,210,196, 8,168,210,196, 8,152,214,196, 8,224,214,196, 8,176,236,196, 8,136,251,196, 8, + 0, 0,231, 3,143, 1,174, 4,232, 3, 32, 3, 1, 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, 68, 65, 84, 65, 20, 0, 0, 0, 40,208,196, 8,110, 0, 0, 0, 1, 0, 0, 0,104,208,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,208,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,168,208,196, 8, 40,208,196, 8, 0, 0, 0, 0, 0, 0, 32, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +168,208,196, 8,110, 0, 0, 0, 1, 0, 0, 0,232,208,196, 8,104,208,196, 8, 0, 0, 0, 0,232, 3, 32, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,232,208,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 40,209,196, 8,168,208,196, 8, 0, 0, 0, 0, +232, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 40,209,196, 8,110, 0, 0, 0, 1, 0, 0, 0,104,209,196, 8, +232,208,196, 8, 0, 0, 0, 0, 0, 0,212, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,209,196, 8,110, 0, 0, 0, + 1, 0, 0, 0,168,209,196, 8, 40,209,196, 8, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, +168,209,196, 8,110, 0, 0, 0, 1, 0, 0, 0,232,209,196, 8,104,209,196, 8, 0, 0, 0, 0,232, 3, 6, 3, 0, 0, 0, 0, + 68, 65, 84, 65, 20, 0, 0, 0,232,209,196, 8,110, 0, 0, 0, 1, 0, 0, 0, 40,210,196, 8,168,209,196, 8, 0, 0, 0, 0, +156, 1,212, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 40,210,196, 8,110, 0, 0, 0, 1, 0, 0, 0,104,210,196, 8, +232,209,196, 8, 0, 0, 0, 0,156, 1, 6, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,210,196, 8,110, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 40,210,196, 8, 0, 0, 0, 0,156, 1, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +168,210,196, 8,111, 0, 0, 0, 1, 0, 0, 0,240,210,196, 8, 0, 0, 0, 0,104,208,196, 8,168,208,196, 8, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,210,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 56,211,196, 8,168,210,196, 8, +104,208,196, 8,104,209,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,211,196, 8,111, 0, 0, 0, + 1, 0, 0, 0,128,211,196, 8,240,210,196, 8,168,208,196, 8,168,209,196, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0,128,211,196, 8,111, 0, 0, 0, 1, 0, 0, 0,200,211,196, 8, 56,211,196, 8,104,209,196, 8,168,209,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200,211,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 16,212,196, 8, +128,211,196, 8, 40,209,196, 8,232,209,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,212,196, 8, +111, 0, 0, 0, 1, 0, 0, 0, 88,212,196, 8,200,211,196, 8,104,209,196, 8, 40,210,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0, 88,212,196, 8,111, 0, 0, 0, 1, 0, 0, 0,160,212,196, 8, 16,212,196, 8,168,209,196, 8, + 40,210,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,212,196, 8,111, 0, 0, 0, 1, 0, 0, 0, +232,212,196, 8, 88,212,196, 8,232,209,196, 8, 40,210,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +232,212,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 48,213,196, 8,160,212,196, 8, 40,209,196, 8,104,209,196, 8, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,213,196, 8,111, 0, 0, 0, 1, 0, 0, 0,120,213,196, 8,232,212,196, 8, + 40,208,196, 8, 40,209,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,213,196, 8,111, 0, 0, 0, + 1, 0, 0, 0,192,213,196, 8, 48,213,196, 8, 40,208,196, 8,104,210,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 24, 0, 0, 0,192,213,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 8,214,196, 8,120,213,196, 8,232,208,196, 8,104,210,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,214,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 80,214,196, 8, +192,213,196, 8,232,209,196, 8,104,210,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,214,196, 8, +111, 0, 0, 0, 1, 0, 0, 0,152,214,196, 8, 8,214,196, 8, 40,210,196, 8,104,210,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0,152,214,196, 8,111, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80,214,196, 8,232,208,196, 8, +168,209,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,224,214,196, 8,113, 0, 0, 0, 1, 0, 0, 0, +216,215,196, 8, 0, 0, 0, 0,104,209,196, 8,104,208,196, 8,168,208,196, 8,168,209,196, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +232, 3, 0, 0, 7, 3, 0, 0, 32, 3, 0, 0, 0, 0, 0, 0,232, 3, 0, 0, 7, 3, 0, 0, 33, 3, 0, 0, 0, 0, 0, 0, +232, 3, 0, 0, 32, 3, 0, 0, 32, 3, 0, 0, 0, 0, 0, 0, 1, 0, 7, 7,233, 3, 1, 0, 3, 0, 3, 1,196, 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, 68, 65, 84, 65,204, 0, 0, 0,216,215,196, 8,113, 0, 0, 0, 1, 0, 0, 0, +208,222,196, 8,224,214,196, 8, 40,209,196, 8,104,209,196, 8, 40,210,196, 8,232,209,196, 8, 0, 0, 0, 0,122,214,248, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, + 0, 0, 0,128,111, 18, 3,187, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, +155, 1, 0, 0,213, 0, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0,155, 1, 0, 0,213, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, +155, 1, 0, 0,240, 0, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,156, 1, 22, 2, 1, 0, 3, 0,251, 2, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,218,196, 8, 80,221,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0,208,216,196, 8,160,217,196, 8, 68, 65, 84, 65,164, 0, 0, 0,208,216,196, 8,112, 0, 0, 0, 1, 0, 0, 0, +160,217,196, 8, 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,140, 0,210, 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, 68, 65, 84, 65,164, 0, 0, 0,160,217,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208,216,196, 8, + 51, 68, 32, 86,105,101,119,112,111,114,116, 32,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, + 8, 0, 8, 0, 62, 1,204, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, +180, 2, 0, 0,112,218,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 80,221,196, 8, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, + 1, 89, 46,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,122,214,248, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 18, 3,187, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 38,175, 3, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,148,173, 42, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,249,195, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,122,214,248, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,186,252,191, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128,111, 18, 3,187, + 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,148,173, 42, 65, 0, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, + 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 1, 0, + 7, 0,175, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0,232,197, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232,197, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,197, 63, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 80,221,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112,218,196, 8, + 5, 0, 0, 0, 51, 51, 51, 63, 1, 89, 46,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,208,222,196, 8,113, 0, 0, 0, 1, 0, 0, 0, +176,236,196, 8,216,215,196, 8,104,210,196, 8, 40,210,196, 8,168,209,196, 8,232,208,196, 8, 0, 0, 0, 0, 1,184,157, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188, 0, 0, 0, 0,157, 1, 0, 0, +232, 3, 0, 0, 0, 0, 0, 0, 5, 3, 0, 0,157, 1, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0,157, 1, 0, 0, +232, 3, 0, 0, 27, 0, 0, 0, 5, 3, 0, 0, 0, 0, 0, 0, 1, 0, 9, 9, 76, 2,235, 2, 3, 0, 3, 0,165, 2, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,224,196, 8, 48,235,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0,200,223,196, 8,200,223,196, 8, 68, 65, 84, 65,164, 0, 0, 0,200,223,196, 8,112, 0, 0, 0, 1, 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, 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, 68, 65, 84, 65,120, 0, 0, 0,152,224,196, 8,100, 0, 0, 0, 1, 0, 0, 0, 64,225,196, 8, 0, 0, 0, 0, + 9, 0, 0, 0, 51, 51, 51, 63, 1, 89, 47,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 3,197, 8, + 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,184, 0, 0, 0, 64,225,196, 8, 98, 0, 0, 0, + 1, 0, 0, 0, 40,226,196, 8,152,224,196, 8, 6, 0, 0, 0, 51, 51, 51, 63, 1, 89, 47,124, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, + 40, 1, 0, 0, 40,226,196, 8, 93, 0, 0, 0, 1, 0, 0, 0,128,227,196, 8, 64,225,196, 8, 2, 0, 0, 0, 51, 51, 51, 63, + 1, 89, 47,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,122, 67,205,204,204,189,205,204,140, 63, 0, 0, 0, 0, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0,242, 1, 0, 0, 16, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, + 59, 1, 0, 0, 16, 0, 0, 0,242, 1, 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, 72, 12,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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,196, 0, 0, 0, +128,227,196, 8, 97, 0, 0, 0, 1, 0, 0, 0,208,229,196, 8, 40,226,196, 8, 3, 0, 0, 0, 51, 51, 51, 63, 1, 89, 47,124, + 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,112,228,196, 8,120,229,196, 8, 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, 68, 65, 84, 65, 44, 0, 0, 0,112,228,196, 8,129, 0, 0, 0, + 1, 0, 0, 0,200,228,196, 8, 0, 0, 0, 0, 66, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 65, 0, 0, 0, 0, + 0, 0, 0, 0,152, 15,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0,200,228,196, 8,129, 0, 0, 0, + 1, 0, 0, 0, 32,229,196, 8,112,228,196, 8, 66, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,112, 61, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0, 32,229,196, 8,129, 0, 0, 0, + 1, 0, 0, 0,120,229,196, 8,200,228,196, 8, 66, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,113, 61, 10,192, 0, 0, 0, 0, + 0, 0, 0, 0, 72, 12,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 44, 0, 0, 0,120,229,196, 8,129, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 32,229,196, 8, 69, 77, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,174,143, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 22,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,208,229,196, 8,166, 0, 0, 0, + 1, 0, 0, 0,160,230,196, 8,128,227,196, 8, 11, 0, 0, 0, 51, 51, 51, 63, 1, 89, 47,124, 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, 68, 65, 84, 65,164, 0, 0, 0,160,230,196, 8, 99, 0, 0, 0, 1, 0, 0, 0,112,231,196, 8,208,229,196, 8, + 13, 0, 0, 0, 51, 51, 51, 63, 1, 89, 47,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,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, 68, 65, 84, 65, +176, 0, 0, 0,112,231,196, 8,177, 0, 0, 0, 1, 0, 0, 0, 80,232,196, 8,160,230,196, 8, 12, 0, 0, 0, 51, 51, 51, 63, + 1, 89, 47,124, 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,128,193, + 0, 0,247, 67, 0, 0, 0,191, 0, 0, 2, 66, 0, 0,128,193, 0, 0,247, 67,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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,180, 2, 0, 0, 80,232,196, 8, 89, 0, 0, 0, 1, 0, 0, 0, 48,235,196, 8,112,231,196, 8, 1, 0, 0, 0, + 51, 51, 51, 63, 1, 89, 47,124, 0, 0, 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, 32,193, 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, 32, 65, 0, 0,128, 63, 1,184,157, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 33,195, 79, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29,254,249,195,125,254, 71,194, 0, 0, 0, 0, 0, 0, 0, 0,173,128,249, 67,138, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 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, 32, 65, 1, 0, 7, 0, 40, 9,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 24, 0, 0, 12, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 7, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 84, 1, 0, 0, 48,235,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 80,232,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 89, 47,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 0, 0, 0,176,236,196, 8,113, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0,208,222,196, 8, 40,208,196, 8, 40,209,196, 8,232,209,196, 8,104,210,196, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 0,155, 1, 0, 0,185, 0, 0, 0,211, 0, 0, 0, + 0, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4,156, 1,185, 0, 3, 0, 3, 0, + 79, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,249,196, 8, 8,250,196, 8, + 0, 0, 0, 0, 0, 0, 0, 0,168,237,196, 8, 56,248,196, 8, 68, 65, 84, 65,164, 0, 0, 0,168,237,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,120,238,196, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0,120,238,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 72,239,196, 8, +168,237,196, 8, 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, 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, + 68, 65, 84, 65,164, 0, 0, 0, 72,239,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 24,240,196, 8,120,238,196, 8, 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, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,164, 0, 0, 0, + 24,240,196, 8,112, 0, 0, 0, 1, 0, 0, 0,232,240,196, 8, 72,239,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0,232,240,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,184,241,196, 8, 24,240,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0,184,241,196, 8,112, 0, 0, 0, 1, 0, 0, 0,136,242,196, 8, +232,240,196, 8, 69,102,102,101, 99,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, + 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,210, 3, 0, 0,162, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0,136,242,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 88,243,196, 8,184,241,196, 8, 72,111,111,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, 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, 70, 1, 0, 0, + 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,240,196, 8, 68, 65, 84, 65,164, 0, 0, 0, + 88,243,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 40,244,196, 8,136,242,196, 8, 80, 97,114,116,105, 99,108,101, 32, 73,110,116, +101,114, 97, 99,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, 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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,240,196, 8, 68, 65, 84, 65,164, 0, 0, 0, 40,244,196, 8,112, 0, 0, 0, + 1, 0, 0, 0,248,244,196, 8, 88,243,196, 8, 83,111,102,116, 98,111,100,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,232,240,196, 8, 68, 65, 84, 65,164, 0, 0, 0,248,244,196, 8,112, 0, 0, 0, 1, 0, 0, 0,200,245,196, 8, + 40,244,196, 8, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,164, 0, 0, 0,200,245,196, 8,112, 0, 0, 0, 1, 0, 0, 0,152,246,196, 8,248,244,196, 8, 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, 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, 68, 65, 84, 65,164, 0, 0, 0, +152,246,196, 8,112, 0, 0, 0, 1, 0, 0, 0,104,247,196, 8,200,245,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0,104,247,196, 8,112, 0, 0, 0, + 1, 0, 0, 0, 56,248,196, 8,152,246,196, 8, 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,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, 68, 65, 84, 65,164, 0, 0, 0, 56,248,196, 8,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +104,247,196, 8, 83, 99,114,105,112,116,108,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, 0, + 0, 0, 0, 0, 83, 99,114,105,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, + 68, 65, 84, 65,212, 0, 0, 0, 8,249,196, 8, 94, 0, 0, 0, 1, 0, 0, 0, 8,250,196, 8, 0, 0, 0, 0, 4, 0, 0, 0, + 51, 51, 51, 63, 1, 89, 48,124, 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,193, 0, 0,163, 67, 0, 0, 0,193, 0, 0,104, 67, 0, 0, 0,193, 35,159, 3, 68, 0, 0, 0,193, 0, 0,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,128, 67, 0, 0, 40, 66, 0, 0,200, 68, 0, 0,225, 67, + 0, 0, 0, 63,225,122,180, 63, 0, 0, 1, 0, 1, 0, 1, 0,156, 1,185, 0, 0, 0, 0, 0, 5, 0,255,255, 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,150, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 8,250,196, 8, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 8,249,196, 8, 5, 0, 0, 0, 51, 51, 51, 63, 1, 89, 48,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 57, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0,244, 3, 0, 0,136,251,196, 8, 87, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, + 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40, 9,197, 8,160, 2,197, 8, 0, 0, 0, 0, + 0, 0, 0, 0,168,255,196, 8, 56, 0,197, 8,168,255,196, 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, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 0, 0, 0, 0,128, 0,197, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, +250, 0,100, 0,100, 0, 0, 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, 5, 0, 0, 0,100, 0,141, 0, 32, 3, 88, 2, +100, 0,100, 0, 1, 0, 1, 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, 24, 0, 4, 0, 0, 0, 90, 0, 16, 0, 23, 0, 1, 0, 0, 0,128, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 25, 0, 10, 0, 0, 0, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,205,204, 76, 63,102,102,102, 63, 0, 0,128, 63, 0, 0,128, 64, + 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 72,226,187, 8, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0, +168,255,196, 8, 79, 0, 0, 0, 1, 0, 0, 0,240,255,196, 8, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, +128, 2,108, 1, 72, 12,197, 8, 68, 65, 84, 65, 28, 0, 0, 0,240,255,196, 8, 79, 0, 0, 0, 1, 0, 0, 0, 56, 0,197, 8, +168,255,196, 8, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 78, 3,159, 1,152, 15,197, 8, 68, 65, 84, 65, 28, 0, 0, 0, + 56, 0,197, 8, 79, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,255,196, 8, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, +251, 3, 33, 0, 40, 9,197, 8, 68, 65, 84, 65, 40, 0, 0, 0,128, 0,197, 8, 78, 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, 28, 0, 0, 0, 48, 49,197, 8, 86, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 90, 0, 9, 0, + 1, 0, 0, 0, 0, 0,128, 63,111, 18,131, 58, 32, 0, 32, 0, 32, 0, 0, 0, 67, 65, 0, 0,116, 0, 0, 0,216, 0,197, 8, + 23, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, + 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,205,204, 76, 62, + 0, 0, 0, 0,205,204,204, 61, 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, +252, 0, 0, 0,120, 1,197, 8, 31, 0, 0, 0, 1, 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, 32, 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, 64, 11, 3, 0, 46, 26,128, 63, 25, 4,240, 65, + 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 1, 0, 1, 0, 1, 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, 87, 79, 0, 0, 32, 1, 0, 0,160, 2,197, 8, 77, 0, 0, 0, 1, 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,128,174,103, 61,112, 29, 98, 62, +205,204,204, 62, 0, 0, 0, 0,205,204,204, 61,205,204,204, 61,205,204,204, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, +205,204, 28, 65, 0, 0, 0, 0, 0, 0, 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, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0,240, 3,197, 8, 21, 0, 0, 0, 1, 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, 7, 0, 0, 0, 1, 0, 0, 0,128, 4,197, 8,128, 4,197, 8,128, 4,197, 8,128, 4,197, 8, + 0, 0, 0, 0, 0, 0, 0, 0,248, 4,197, 8,255,255,255,255, 0, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, +128, 4,197, 8, 20, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 4,197, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 69, 82, 70, 68, 65, 84, 65, 4, 0, 0, 0,200, 4,197, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 79, 66, 0, 0, +244, 2, 0, 0, 40, 9,197, 8, 71, 0, 0, 0, 1, 0, 0, 0, 72, 12,197, 8, 0, 0, 0, 0, 1, 89, 70,108, 0, 0, 0, 0, + 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 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,216, 0,197, 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,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,222,149, 47, 63, + 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63, +149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, +157,190,215, 49,167,170, 4, 52, 0, 0, 0,128,129,116,157,178, 1, 0,128, 63, 33, 69, 15, 51, 0, 0, 0,128, 73,254, 67, 51, +243, 97,106, 49, 0, 0,128, 63, 0, 0, 0,128, 3, 0, 64, 52,183,164,157, 39, 0, 0,128, 53, 0, 0,128, 63, 1, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,100, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 6, 41,100, 63, 0, 0,128, 63,205,204,204, 62, 0, 0, 0, 0, 6, 41,100, 63, + 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,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, 79, 66, 0, 0,244, 2, 0, 0, 72, 12,197, 8, 71, 0, 0, 0, 1, 0, 0, 0,152, 15,197, 8, 40, 9,197, 8, + 1, 89,123, 92, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 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, 24, 22,197, 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,104, 15,197, 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,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,128, 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, 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,222,149, 47, 63, 52, 70, 58, 63,179, 56, 49,188, 0, 0, 0,128, 86,126,162,190,227,251,159, 62, 56, 53,101, 63, + 0, 0, 0,128, 7,165, 39, 63,149, 84, 28,191, 50,247,227, 62, 0, 0, 0,128,110,101,239, 64,151, 62,208,192, 77,255,170, 64, + 0, 0,128, 63, 1, 0, 0, 0, 1, 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, 1, 0,100, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62, + 0, 0, 0, 0,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 24,218,193, 8,200, 29,197, 8, 68, 65, 84, 65, 4, 0, 0, 0,104, 15,197, 8, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 79, 66, 0, 0,244, 2, 0, 0,152, 15,197, 8, 71, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72, 12,197, 8, + 1, 89,121, 92, 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, 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,120, 1,197, 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,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63, + 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 53,236,148,190,222,102, 69,191, 37,255, 16, 63, 0, 0, 0,128, 24,134,116, 63, 57,174, 76,190,240,161, 95, 62, + 0, 0, 0,128,235, 13, 98,189, 34,194, 26, 63,166,111, 75, 63, 0, 0, 0,128,208, 19, 13, 63,234, 65,102,190, 10, 10,231,192, + 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 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, 1, 0,100, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62, + 0, 0, 0, 0,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 77, 65, 0, 0,156, 1, 0, 0,184, 18,197, 8, 33, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 63, 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, 2, 0, 2, 0, 50, 0, 0, 6, 3, 0, 1, 3, 0, 0, 0, 0, 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, 1, 1, 0, 0, 3, 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, 1, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63,128, 20,197, 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, 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, 68, 65, 84, 65, + 88, 0, 0, 0,128, 20,197, 8, 25, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 21,197, 8, + 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,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63, +205,204, 76, 62, 0, 0, 0, 0, 84, 69, 0, 0,228, 0, 0, 0, 8, 21,197, 8, 30, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,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, 0, 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, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 69, 0, 0,188, 0, 0, 0, 24, 22,197, 8, 46, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,232, 31,194, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,197, 8, 88, 0,194, 8, + 0, 0, 0, 0, 0, 0, 0, 0,216, 21,194, 8,120, 28,194, 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, 8, 0, 0, 0, 12, 0, 0, 0, 6, 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, 1, 0, 1, 0, 1, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0, 0, 23,197, 8, 0, 0, 0, 0, + 1, 0, 0, 0,184, 18,197, 8, 68, 65, 84, 65,160, 0, 0, 0,216, 21,194, 8, 51, 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, +144, 0, 0, 0,120, 28,194, 8, 48, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, + 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, + 68, 65, 84, 65,120, 0, 0, 0, 88, 0,194, 8, 47, 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, 71, 76, 79, 66, 24, 0, 0, 0,160,240,255,191,114, 0, 0, 0, 1, 0, 0, 0, + 96, 40,196, 8,136,251,196, 8, 1, 0, 0, 1, 0, 0, 0, 0,128, 32, 4, 0, 0, 0, 0, 0, 85, 83, 69, 82,168, 7, 0, 0, +224,226,172, 8,108, 0, 0, 0, 1, 0, 0, 0, 33, 24, 0, 0, 63, 2, 0, 0, 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 85,115,101,114,115, + 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0, 45,112,111,119,101,114,112, 99, 47, 98,105,110, 47, 98,108,101,110,100, +101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, + 3, 0, 0, 0, 48, 52, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 11, 0, 0, 0, 0, 0, 64, 0, + 5, 0, 2, 0, 0,104, 97,108,107, 98,111, 97,114,100, 46,116,116,102, 0, 55, 46, 53, 46, 48, 45,112,111,119,101,114,112, 99, + 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, + 99,101,115, 47, 46, 98,102,111,110,116, 46,116,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,200, 32,197, 8,216, 40,197, 8, 32, 0, 0, 0, 5, 0, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63, +205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191, +154,153,153, 62,102,102,102, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, + 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, + 25, 0, 15, 0,120, 0, 0, 0, 60, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 7, 0, 0,200, 32,197, 8, +106, 0, 0, 0, 1, 0, 0, 0,216, 40,197, 8, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,160,160,255,160,160,160,255,173,160,147,255,138,158,161,255, +161,161,174,255,161,153,167,255,144,144,144,255,144,144,144,255,198,119,119,255,160,160,160,255, 0, 0, 0,255,255,255,255,255, +210,210,210,255,218,218,218,255,127,127,127,255, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0,180,180,180,255, 0, 0, 0,255, +255,255,255,255,195,195,195,255,255,255,255, 40,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 92, 92, 92,255, 0, 0, 0,255, +255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255, +230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +115,115,115,255, 0, 0, 0,255,255,255,255,255,195,195,195,255,165,165,165,127,160,160,160,100,127,112,112,100, 0, 0, 0, 0, + 92, 92, 92,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, + 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,128,128,128,255, 0, 0, 0,255,255,255,255,255,182,182,182,255,165,165,165,127,160,160,160,100, +127,112,112,100,160,160,208,255, 92, 92, 92,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255, +255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60, +255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,120,120,255, 0, 0, 0,255,255,255,255,255,195,195,195,255, +255,255,255,150,172,172,172,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40, +255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, + 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0,255, +255,255,255,255,195,195,195,255,165,165,165,127,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 92, 92, 92,255, 0, 0, 0,255, +255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255, +230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +153,153,153,255, 0, 0, 0,255,255,255,255,255,195,195,195,255,165,165,165,127,173,173,173,255,127,112,112,100, 0, 0, 0, 0, +140,140,140,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, + 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, 0, 0, 0,255,255,255,255,255,182,182,182,255,165,165,165,127,172,172,172,255, + 84, 44, 31,100, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255, +255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255,166,166,166,255,200,100,200, 60, +255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, 0, 0, 0,255,255,255,255,255,182,182,182,255, +165,165,165,127,172,172,172,255, 84, 44, 31,100, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40, +255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, + 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,228,156,198,255,255,255,170,255, + 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115,115,115,255, 0, 0, 0,255, +255,255,255,255,195,195,195,255,165,165,165,127,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 92, 92, 92,255, 0, 0, 0,255, +255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255, +230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53,255, 0, 0, 0,255,255,255,255,255,195,195,195,255,165,165,165,127,160,160,160,100,127,112,112,100, 0, 0, 0, 0, + 92, 92, 92,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, + 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, 0, 50,150, 40,200,100,200, 80,255,138, 48,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,110,110,110,255, 0, 0, 0,255,255,255,255,255,195,195,195,255,165,165,165,127,170,170,186,255, +127,112,112,100, 0, 0, 0, 0, 92, 92, 92,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255, +255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60, +255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0,255,255,255,255,255,195,195,195,255, +165,165,165,127,143,143,143,255,198,119,119,255,255, 0, 0,255, 92, 92, 92,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40, +255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, + 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 4, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255,153,153,153,255, 0, 0, 0,255, +255,255,255,255,195,195,195,255,165,165,165,127,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 92, 92, 92,255, 0, 0, 0,255, +255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,176,176, 48,255, +230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +153,153,153,255, 0, 0, 0,255,255,255,255,255,195,195,195,255,165,165,165,127,173,173,173,255,127,112,112,100, 0, 0, 0, 0, +140,140,140,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 40,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, + 0, 0, 0,255,176,176, 48,255,230,150, 50,255, 75, 75, 75,255, 0, 50,150, 30,200,100,200, 60,255,138, 48,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 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, 7, 0, 0,216, 40,197, 8,106, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +200, 32,197, 8, 82,111,117,110,100,101,100, 0, 0,101,119, 32, 85,115,101,114, 32, 84,104,101,109,101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,176,176,176,255,107,107,107,255,177,177,177,255,178,178,178,255,143,143,143,255,143,143,143,255, +107,107,107,255,198,119,119,255,143,143,143,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0,111, 0, 0, 33, 83,255,130, 0,255, +255,255,255,255, 0, 0, 0,255, 2, 0, 0, 0,107,107,107,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,175,175,175, 51, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, +255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30, +200,100,200, 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, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0, 51,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,217,217,217,255, + 0, 0, 0, 40,255,255,255,255,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255, + 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, + 0, 0, 0,255,255,255,255,255,107,107,107,255,165,165,165,150,160,160,160,100,127,112,112,100,255,130, 0,255, 88, 88, 88,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255, +144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,107,107,107,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,107,107,107,150,107,107,107,100,143,143,143,100, + 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,255,255,255, +255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,165,165,165,150, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, +255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30, +200,100,200, 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, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,158,158,255, 0, 0, 0,255,255,255,255,255, +158,158,158,255,165,165,165,150,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255,255,136,255,255, + 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, + 0, 0, 0,255,255,255,255,255,107,107,107,255,165,165,165,150,107,107,107,255,178,178,178,100,255,130, 0,100, 94, 94, 94,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255, +144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,143,143,143,255,200,100,200, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,107,107,107,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,165,165,165,150,107,107,107,255,178,178,178,100, +255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255, +255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,255,255,255,170,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,165,165,165,150, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, +255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30, +200,100,200, 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, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0,255,255,255,255,255, +195,195,195,255,165,165,165,150,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, + 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, + 0, 0, 0,255,255,255,255,255,195,195,195,255,165,165,165,150,143,143,143,255,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255, +144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,153,153,153,255, 0, 0, 0,255,255,255,255,255,153,153,153,255,165,165,165,150,143,143,143,255,198,119,119,255, +255, 0, 0,255, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255, +255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0,100, 0, 0,255, 0, 0,200,255, +128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255,107,107,107,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,165,165,165,150, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, +255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30, +200,100,200, 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, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,158,158,255, 0, 0, 0,255,255,255,255,255, +158,158,158,255,165,165,165,150,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255,255,136,255,255, + 0, 0, 0, 0,255,187,255,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49, + 60,100, 0, 0, 16,170,197, 8, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,196, 5, 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,110,101,119,105,100, 0, 42,108,105, 98, 0,110, 97,109, +101, 91, 50, 52, 93, 0,117,115, 0,102,108, 97,103, 0,112, 97,100, 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, 49, 54, 48, 93, 0,116,111,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,116,121,112, +101, 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,110, 97,109,101, 91, 51, 50, 93, 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,108,101,110, 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, 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, + 97,110,105,109, 0, 42,105, 98,117,102, 0, 42,109,105,112,109, 97,112, 91, 49, 48, 93, 0,111,107, 0,108, 97,115,116,102,114, + 97,109,101, 0,108, 97,115,116,113,117, 97,108,105,116,121, 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,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,114,101,115,101,114,118,101,100, 49, 0,114,101, +115,101,114,118,101,100, 50, 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,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, 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, 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,100, 97,116, 97, 91, 49, 54, 93, 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,115,116,121,112,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,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, 42,112,108,117,103,105,110, 0, 42, 99,111, 98, 97, 0, + 42,101,110,118, 0,102,114, 97,100,117,114, 91, 52, 93, 91, 50, 93, 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, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0,115,104, 97,100,115,112,111, +116,115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 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,112, 97,100, 51, 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,108, 97,121, 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,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, 50, 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,114,103, 98,115,101,108, 0,112,114, 95,116, +121,112,101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,115,101,112,116,101,120, 0,112, 97,100, 52, 0, +112, 97,100, 53, 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,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,108, +111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 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,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,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,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, 42,111, 98, 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, 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,101,102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,100,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,111, 99, 0, 42,115,117,109,111,104, 97,110,100,108,101, 0,116,111,116, +101,100,103,101, 0,116,111,116,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,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, + 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,108,101,118,101,108, +115, 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, +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, 97,120,105,115, + 0,116,111,108,101,114, 97,110, 99,101, 0,112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 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,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,112, 97,114,101,110,116, 0, 42,116,114, 97, 99,107, 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, 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,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,100,102,114, 97,115, 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,108,105,102,101, 0,108, 98,117,102, 0,112,111,114, +116, 0,102,108,117,105,100,115,105,109, 70,108, 97,103, 0,115,104, 97,112,101,110,114, 0,115,104, 97,112,101,102,108, 97,103, + 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,109, 97,116, 91, 52, 93, 91, 52, 93, 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,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, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, 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,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,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,109,105,120,114, 97,116,101, 0,109, + 97,105,110, 0,112, 97,100, 91, 51, 93, 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, 99,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 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,102,105,108,116,101,114,116,121,112,101, 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, +115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121, +112,101, 0, 98,117,102,102,108, 97,103, 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,100,111,103, 97, +109,109, 97, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,116, 0,115, 97,109,101, 95,109, 97,116, + 95,114,101,100,117,120, 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, 97,100,100, 0,112,111,115,116,105,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,122,109,105,110, 0,102,111, 99,117,115, 0,122,103, + 97,109,109, 97, 0,122,115,105,103,109, 97, 0,122, 98,108,117,114, 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, 99,111,114,110,101,114,116,121,112, +101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 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,103,109,101,110,116,115, 0,114,105,110,103,115, 0, +118,101,114,116,105, 99,101,115, 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, 42,103,114,111,117,112, 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,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,101,100,105,116, 98,117,116, +115,105,122,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, 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,100,105,114,116,121, 0,122,111,111,109, 0, 98,108,101,110,100, + 0,120,105,109, 0,121,105,109, 0, 42,114,101, 99,116, 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,112,101,114,115,112, + 0,118,105,101,119, 0, 42, 98,103,112,105, 99, 0, 42,108,111, 99, 97,108,118,100, 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, +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,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,109,101,110,117,110,114, 0,116,101,120,110,114, 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,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,114,101, 99,116,120, 0,114,101, 99,116,121, 0, 99,117,114,121, 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, 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, 42, +109,101,110,117,112, 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,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,105,109, 97,103,101, 0,105,109, 97,110,114, 0, 99,117,114,116,105,108,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,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, 42, 97,114,103, 49, 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,112, 97,100, 49, 91, 51, 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,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,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,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,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,111, 98, 99,101,110,116,101,114, 95,100,105, 97, 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,111,102,115,120, 0,111,102,115,121, 0, 99,111,110,116,114,111,108, 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, 42, 99,117,114,115, 99,114,101,101,110, 0, + 42, 99,117,114,115, 99,101,110,101, 0,100,105,115,112,108, 97,121,109,111,100,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,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,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,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, 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, 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,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, 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, + 42,105,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,100, 97, +116, 97, 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, 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,108,101,110,103,116,104, 0, +115,116,114,105,100,101, 97,120,105,115, 0,114,101,115,101,114,118,101,100, 51, 0,115,110,100,110,114, 0,109, 97,107,101, 99, +111,112,121, 0, 99,111,112,121,109, 97,100,101, 0,112, 97,100, 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, 97,100,100,101,100, +108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,111,116,104,101,114,112, 97,100, 91, 52, 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,108,111,111,112,115,116, + 97,114,116, 0,108,111,111,112,101,110,100, 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,103,107,101,121, 0,112, 97,100,102, 0,111,107,101,121, 0,103,111, + 98,106,101, 99,116, 0,103,107,101,121, 0, 42, 97, 99,116,105,118,101, 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, 99,108, 97,115,115, 0, 98,111,110, +101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122, +101, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,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, 99,104, 97,110, 98, + 97,115,101, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97, 99,116,110,114, 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,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, 97,108, 0,108, +111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,111,102,102,115,101,116, 91, 51, 93, 0,122,109, 97, +120, 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, +115,116,114,105,100,101, 95, 97,120,105,115, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 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, 84, 89, 80, 69,219, 0, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, + 0,117,115,104,111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, + 98,108,101, 0,118,111,105,100, 0, 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, 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, 73,109, 97,103,101, 0, 97,110,105,109, 0, 73,109, 66,117,102, 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, 76, 97,109,112, 0, 87, 97,118,101, 0, 77, 97,116,101,114,105, + 97,108, 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, 84, 70, 97, 99,101, 0, 77,101,115,104, 0, 77, 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, 79, 99, 73,110,102,111, 0, 77, 68,101,102,111,114,109, 87,101,105,103,104,116, 0, 77,111, +100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, + 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111,100,105,102,105,101,114, + 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,105,114,114,111,114, 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, 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, 76,105,102,101, + 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, 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, 65,117,100,105,111, 68, 97,116, 97, 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, + 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 83, 99,101,110,101, 0, 71,114,111,117,112, 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, 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, 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, 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, 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, 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, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 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, 75,101,121, 0, 79, 98,106, +101, 99,116, 75,101,121, 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, 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, 65, 99,116,105,111,110, 83,116,114,105,112, 0, 0, 84, 76, 69, 78, + 1, 0, 1, 0, 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 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, 48, 0,224, 0, 0, 0, 80, 0,104, 0,116, 0, 16, 0, 24, 0, +100, 0, 20, 0,116, 0, 48, 1, 0, 0, 0, 0, 88, 0,244, 2,228, 0, 80, 1, 24, 0,136, 1,128, 0,252, 0, 52, 0,156, 1, + 64, 1, 0, 0,108, 0, 96, 0,132, 0, 56, 0, 28, 0, 56, 0, 8, 0, 16, 0, 44, 1, 0, 0,140, 0, 84, 0, 60, 0,188, 0, + 20, 0, 20, 0, 12, 0, 12, 0, 4, 0, 8, 0, 24, 0, 8, 0, 52, 0, 68, 0, 88, 0, 88, 0, 68, 0, 60, 0, 60, 0, 92, 0, + 64, 0,180, 0, 52, 0, 64, 0,108, 0, 40, 0, 12, 0, 56, 0, 24, 0, 44, 0, 92, 0, 0, 0, 84, 1, 0, 0,208, 0, 16, 0, + 0, 0, 0, 0, 32, 1, 40, 0, 28, 0,176, 0,144, 0, 16, 0, 16, 3, 16, 0, 80, 0, 28, 0,244, 3, 68, 0, 0, 0, 36, 0, +180, 2, 36, 0,204, 0,120, 0, 36, 0, 40, 1,212, 0,164, 0, 84, 1, 0, 0, 0, 0,196, 0, 12, 0,184, 0,164, 0,120, 0, + 32, 0, 0, 0,148, 0,224, 2, 0, 0, 0, 0, 72, 0,136, 0,224, 7, 56, 0,168, 7,116, 0, 20, 0, 24, 0,164, 0, 24, 0, +104, 0,188, 0,160, 1,172, 0, 32, 1, 16, 0, 28, 0, 12, 0, 24, 0, 16, 0, 24, 0,236, 0, 0, 0, 56, 0, 12, 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, 20, 0, 16, 0, 64, 0, 16, 0, 76, 0,120, 0, 48, 0, 28, 0, 56, 0, 52, 0, 56, 0,108, 0,136, 0, + 4, 0, 40, 0, 0, 0, 64, 0,160, 0, 48, 0,112, 1, 20, 0, 4, 1, 80, 0, 68, 1, 60, 0,176, 0, 44, 0, 52, 0, 76, 0, + 44, 0, 44, 0, 44, 0, 60, 0, 56, 0, 44, 0, 20, 0, 60, 0, 24, 0, 52, 0, 88, 0, 0, 0, 83, 84, 82, 67,192, 0, 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, 8, 0, + 9, 0, 0, 0, 9, 0, 1, 0, 24, 0, 12, 0, 25, 0, 13, 0, 0, 0, 14, 0, 2, 0, 15, 0, 2, 0, 16, 0, 4, 0, 17, 0, + 25, 0, 6, 0, 24, 0, 18, 0, 24, 0, 19, 0, 26, 0, 20, 0, 0, 0, 21, 0, 4, 0, 22, 0, 4, 0, 17, 0, 27, 0, 6, 0, + 24, 0, 18, 0, 11, 0, 23, 0, 23, 0, 24, 0, 2, 0, 25, 0, 2, 0, 26, 0, 4, 0, 17, 0, 28, 0, 13, 0, 28, 0, 0, 0, + 28, 0, 1, 0, 7, 0, 27, 0, 7, 0, 28, 0, 2, 0, 29, 0, 2, 0, 30, 0, 4, 0, 31, 0, 9, 0, 32, 0, 7, 0, 33, 0, + 0, 0, 34, 0, 0, 0, 35, 0, 7, 0, 36, 0, 7, 0, 37, 0, 29, 0, 12, 0, 24, 0, 18, 0, 28, 0, 38, 0, 0, 0, 39, 0, + 4, 0, 40, 0, 7, 0, 28, 0, 11, 0, 41, 0, 27, 0, 42, 0, 24, 0, 43, 0, 2, 0, 29, 0, 2, 0, 44, 0, 2, 0, 45, 0, + 2, 0, 16, 0, 30, 0, 5, 0, 24, 0, 46, 0, 2, 0, 47, 0, 2, 0, 48, 0, 2, 0, 49, 0, 4, 0, 17, 0, 31, 0, 6, 0, + 31, 0, 0, 0, 31, 0, 1, 0, 0, 0, 50, 0, 0, 0, 51, 0, 4, 0, 52, 0, 4, 0, 53, 0, 32, 0, 13, 0, 24, 0, 18, 0, + 0, 0, 54, 0, 4, 0, 55, 0, 4, 0, 56, 0, 11, 0, 57, 0, 31, 0, 58, 0, 31, 0, 59, 0, 4, 0, 60, 0, 4, 0, 61, 0, + 0, 0, 62, 0, 4, 0, 63, 0, 4, 0, 64, 0, 9, 0, 65, 0, 33, 0, 5, 0, 4, 0, 66, 0, 4, 0, 67, 0, 4, 0, 55, 0, + 4, 0, 17, 0, 9, 0, 32, 0, 34, 0, 17, 0, 24, 0, 18, 0, 2, 0, 29, 0, 2, 0, 16, 0, 7, 0, 68, 0, 7, 0, 69, 0, + 7, 0, 70, 0, 7, 0, 71, 0, 7, 0, 72, 0, 7, 0, 73, 0, 7, 0, 74, 0, 7, 0, 75, 0, 7, 0, 76, 0, 2, 0, 77, 0, + 2, 0, 78, 0, 7, 0, 79, 0, 27, 0, 42, 0, 30, 0, 80, 0, 35, 0, 23, 0, 24, 0, 18, 0, 0, 0, 21, 0, 36, 0, 81, 0, + 37, 0, 82, 0, 37, 0, 83, 0, 2, 0, 84, 0, 2, 0, 16, 0, 2, 0, 85, 0, 2, 0, 86, 0, 2, 0, 87, 0, 2, 0, 88, 0, + 2, 0, 89, 0, 2, 0, 90, 0, 2, 0, 91, 0, 2, 0, 92, 0, 4, 0, 93, 0, 4, 0, 94, 0, 33, 0, 95, 0, 7, 0, 96, 0, + 4, 0, 97, 0, 2, 0, 98, 0, 2, 0, 99, 0, 4, 0,100, 0, 38, 0, 24, 0, 2, 0,101, 0, 2, 0,102, 0, 2, 0,103, 0, + 2, 0,104, 0, 39, 0,105, 0, 40, 0,106, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0,110, 0, 7, 0,111, 0, + 7, 0,112, 0, 2, 0,113, 0, 2, 0,114, 0, 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, 7, 0,118, 0, 7, 0,119, 0, + 7, 0,120, 0, 7, 0,121, 0, 7, 0,122, 0, 7, 0,123, 0, 7, 0,124, 0, 41, 0, 14, 0, 0, 0, 21, 0, 9, 0,125, 0, + 0, 0,126, 0, 0, 0,127, 0, 4, 0,128, 0, 4, 0,129, 0, 9, 0,130, 0, 7, 0,131, 0, 7, 0,132, 0, 7, 0,133, 0, + 4, 0,134, 0, 9, 0,135, 0, 4, 0,136, 0, 4, 0, 17, 0, 42, 0, 6, 0, 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, + 7, 0,137, 0, 7, 0, 27, 0, 4, 0, 24, 0, 43, 0, 5, 0, 2, 0, 16, 0, 2, 0, 22, 0, 2, 0, 24, 0, 2, 0,138, 0, + 42, 0,139, 0, 44, 0, 16, 0, 39, 0,105, 0, 35, 0,140, 0, 35, 0,141, 0, 7, 0,142, 0, 2, 0, 29, 0, 2, 0,143, 0, + 7, 0, 70, 0, 7, 0, 71, 0, 4, 0,144, 0, 2, 0,145, 0, 2, 0,146, 0, 2, 0, 84, 0, 2, 0, 85, 0, 2, 0,147, 0, + 2, 0,148, 0, 4, 0, 69, 0, 40, 0, 52, 0, 24, 0, 18, 0, 7, 0,149, 0, 7, 0,150, 0, 7, 0,151, 0, 7, 0,152, 0, + 7, 0,153, 0, 7, 0,154, 0, 7, 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, 7, 0,167, 0, 7, 0,168, 0, + 2, 0,169, 0, 2, 0,170, 0, 2, 0,171, 0, 2, 0,172, 0, 2, 0,173, 0, 2, 0,174, 0, 2, 0,175, 0, 2, 0, 16, 0, + 2, 0, 29, 0, 2, 0,143, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 2, 0,180, 0, 2, 0,181, 0, + 2, 0,182, 0, 2, 0, 52, 0, 7, 0,183, 0, 7, 0,184, 0, 2, 0,185, 0, 2, 0,186, 0, 2, 0,187, 0, 2, 0,188, 0, + 7, 0,121, 0, 27, 0, 42, 0, 35, 0,140, 0, 41, 0,189, 0, 43, 0,190, 0, 44, 0,191, 0, 2, 0,192, 0, 45, 0, 50, 0, + 24, 0, 18, 0, 2, 0, 29, 0, 2, 0,193, 0, 2, 0,114, 0, 2, 0,194, 0, 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, + 7, 0,118, 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, + 2, 0,202, 0, 2, 0,203, 0, 7, 0, 70, 0, 7, 0, 71, 0, 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 2, 0,207, 0, + 2, 0,208, 0, 2, 0,209, 0, 2, 0,210, 0, 2, 0,211, 0, 2, 0, 17, 0, 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, + 2, 0,215, 0, 2, 0,216, 0, 4, 0,217, 0, 4, 0,218, 0, 2, 0,219, 0, 2, 0,220, 0, 2, 0,221, 0, 2, 0,222, 0, + 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 2, 0,228, 0, 2, 0,229, 0, 38, 0,230, 0, + 27, 0, 42, 0, 30, 0, 80, 0, 46, 0, 2, 0, 24, 0, 18, 0, 27, 0, 42, 0, 47, 0, 95, 0, 24, 0, 18, 0, 2, 0,114, 0, + 2, 0,231, 0, 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, 7, 0,232, 0, 7, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, + 7, 0,236, 0, 7, 0,237, 0, 7, 0,238, 0, 7, 0,239, 0, 7, 0,240, 0, 7, 0,241, 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, 7, 0,249, 0, 7, 0,250, 0, 7, 0,251, 0, + 7, 0,252, 0, 7, 0,253, 0, 7, 0,254, 0, 7, 0,255, 0, 7, 0, 0, 1, 2, 0, 1, 1, 2, 0, 2, 1, 2, 0, 3, 1, + 0, 0, 4, 1, 0, 0, 5, 1, 4, 0,193, 0, 4, 0, 6, 1, 2, 0, 7, 1, 2, 0, 8, 1, 2, 0, 9, 1, 2, 0, 10, 1, + 7, 0, 11, 1, 7, 0, 12, 1, 7, 0, 13, 1, 7, 0, 14, 1, 7, 0, 15, 1, 7, 0, 16, 1, 7, 0, 17, 1, 0, 0, 18, 1, + 0, 0,215, 0, 0, 0, 19, 1, 0, 0, 17, 0, 2, 0, 20, 1, 2, 0, 21, 1, 2, 0, 22, 1, 2, 0, 23, 1, 4, 0, 24, 1, + 2, 0, 25, 1, 2, 0, 26, 1, 7, 0, 27, 1, 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, 2, 0,101, 0, + 2, 0,102, 0, 43, 0, 32, 1, 43, 0, 33, 1, 0, 0, 34, 1, 0, 0, 35, 1, 0, 0, 36, 1, 0, 0, 37, 1, 2, 0, 38, 1, + 2, 0, 39, 1, 7, 0, 40, 1, 7, 0, 41, 1, 38, 0,230, 0, 27, 0, 42, 0, 7, 0, 42, 1, 7, 0, 43, 1, 7, 0, 44, 1, + 7, 0, 45, 1, 7, 0, 46, 1, 2, 0, 47, 1, 2, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, 7, 0, 51, 1, 7, 0, 52, 1, + 7, 0, 53, 1, 4, 0, 54, 1, 4, 0, 55, 1, 4, 0, 56, 1, 30, 0, 80, 0, 48, 0, 6, 0, 24, 0, 18, 0, 0, 0, 57, 1, + 7, 0, 58, 1, 7, 0, 17, 0, 49, 0, 32, 0, 33, 0, 95, 0, 50, 0, 26, 0, 50, 0, 0, 0, 50, 0, 1, 0, 51, 0, 59, 1, + 4, 0, 60, 1, 4, 0, 61, 1, 4, 0, 62, 1, 4, 0, 63, 1, 4, 0, 64, 1, 4, 0, 65, 1, 2, 0, 29, 0, 2, 0, 16, 0, + 2, 0, 66, 1, 2, 0, 67, 1, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 68, 1, 7, 0, 69, 1, 7, 0, 70, 1, + 7, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 52, 0, 7, 0, 75, 1, 7, 0, 76, 1, 52, 0, 15, 0, + 24, 0, 18, 0, 51, 0, 59, 1, 11, 0, 77, 1, 11, 0, 78, 1, 27, 0, 42, 0, 47, 0, 79, 1, 2, 0, 16, 0, 2, 0, 80, 1, + 4, 0,113, 0, 7, 0, 81, 1, 7, 0,112, 0, 7, 0, 82, 1, 7, 0, 83, 1, 7, 0, 84, 1, 7, 0, 85, 1, 53, 0, 10, 0, + 7, 0, 86, 1, 7, 0, 87, 1, 7, 0, 88, 1, 7, 0, 17, 0, 2, 0, 89, 1, 2, 0, 90, 1, 0, 0, 91, 1, 0, 0, 92, 1, + 0, 0, 93, 1, 0, 0, 94, 1, 54, 0, 5, 0, 7, 0, 95, 1, 7, 0, 87, 1, 7, 0, 88, 1, 2, 0, 91, 1, 2, 0, 94, 1, + 55, 0, 20, 0, 55, 0, 0, 0, 55, 0, 1, 0, 2, 0, 29, 0, 2, 0, 96, 1, 2, 0, 94, 1, 2, 0, 16, 0, 2, 0, 97, 1, + 2, 0, 98, 1, 2, 0, 99, 1, 2, 0,100, 1, 2, 0,101, 1, 2, 0,102, 1, 2, 0,103, 1, 2, 0,104, 1, 7, 0,105, 1, + 7, 0,106, 1, 54, 0,107, 1, 53, 0,108, 1, 4, 0,109, 1, 4, 0, 17, 0, 56, 0, 5, 0, 2, 0,110, 1, 2, 0, 96, 1, + 0, 0, 16, 0, 0, 0, 17, 0, 2, 0, 48, 1, 57, 0, 4, 0, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 7, 0, 7, 0,111, 1, + 58, 0, 54, 0, 24, 0, 18, 0, 51, 0, 59, 1, 11, 0,112, 1, 11, 0, 78, 1, 39, 0,113, 1, 39, 0,114, 1, 39, 0,115, 1, + 27, 0, 42, 0, 59, 0,116, 1, 29, 0,117, 1, 47, 0, 79, 1, 11, 0,118, 1, 7, 0, 81, 1, 7, 0,112, 0, 7, 0, 82, 1, + 4, 0,113, 0, 2, 0,119, 1, 2, 0, 80, 1, 2, 0, 16, 0, 2, 0,120, 1, 7, 0,121, 1, 7, 0,122, 1, 7, 0,123, 1, + 2, 0, 99, 1, 2, 0,100, 1, 2, 0, 52, 0, 2, 0, 57, 0, 2, 0, 27, 0, 2, 0,124, 1, 7, 0,125, 1, 7, 0,126, 1, + 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 7, 0,132, 1, 7, 0,133, 1, 7, 0,134, 1, + 0, 0,135, 1, 0, 0,136, 1, 48, 0,137, 1, 48, 0,138, 1, 48, 0,139, 1, 48, 0,140, 1, 4, 0,141, 1, 4, 0,142, 1, + 4, 0,143, 1, 4, 0, 17, 0, 57, 0,144, 1, 4, 0,145, 1, 4, 0,146, 1, 56, 0,147, 1, 56, 0,148, 1, 60, 0, 6, 0, + 39, 0,149, 1, 2, 0, 25, 0, 2, 0, 30, 0, 2, 0, 29, 0, 2, 0, 16, 0, 0, 0,150, 1, 61, 0, 19, 0, 61, 0, 0, 0, + 61, 0, 1, 0, 54, 0,107, 1, 53, 0,108, 1, 23, 0,151, 1, 23, 0,152, 1, 2, 0, 25, 0, 2, 0, 30, 0, 2, 0,153, 1, + 2, 0,154, 1, 2, 0,155, 1, 2, 0,156, 1, 2, 0, 16, 0, 2, 0,157, 1, 7, 0, 10, 0, 7, 0, 11, 0, 4, 0,158, 1, + 7, 0, 28, 0, 60, 0,159, 1, 62, 0, 8, 0, 9, 0,160, 1, 7, 0,161, 1, 4, 0,162, 1, 0, 0, 16, 0, 0, 0,163, 1, + 2, 0,193, 0, 2, 0,164, 1, 2, 0,165, 1, 63, 0, 32, 0, 24, 0, 18, 0, 51, 0, 59, 1, 11, 0,166, 1, 27, 0, 42, 0, + 29, 0,117, 1, 47, 0, 79, 1, 64, 0,167, 1, 62, 0,168, 1, 9, 0,169, 1, 65, 0,170, 1, 66, 0,171, 1, 67, 0,172, 1, + 68, 0,173, 1, 69, 0,174, 1, 63, 0,175, 1, 70, 0,176, 1, 9, 0,177, 1, 4, 0,154, 1, 4, 0,178, 1, 4, 0,179, 1, + 4, 0,113, 0, 7, 0, 81, 1, 7, 0,112, 0, 7, 0, 82, 1, 7, 0,180, 1, 7, 0, 17, 0, 2, 0,181, 1, 2, 0, 16, 0, + 2, 0,182, 1, 2, 0,183, 1, 2, 0, 80, 1, 2, 0,184, 1, 64, 0, 8, 0, 4, 0,185, 1, 4, 0,186, 1, 4, 0,187, 1, + 4, 0,188, 1, 0, 0, 17, 0, 0, 0, 96, 1, 0, 0,189, 1, 0, 0, 16, 0, 66, 0, 5, 0, 4, 0,185, 1, 4, 0,186, 1, + 0, 0,190, 1, 0, 0, 17, 0, 2, 0, 16, 0, 71, 0, 2, 0, 4, 0,191, 1, 7, 0, 88, 1, 67, 0, 3, 0, 71, 0,192, 1, + 4, 0,193, 1, 4, 0, 16, 0, 65, 0, 4, 0, 7, 0,194, 1, 2, 0,195, 1, 0, 0, 16, 0, 0, 0, 96, 1, 68, 0, 4, 0, + 0, 0,137, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0,117, 0, 69, 0, 1, 0, 7, 0,196, 1, 72, 0, 6, 0, 72, 0, 0, 0, + 72, 0, 1, 0, 4, 0, 29, 0, 4, 0,193, 0, 0, 0, 34, 0, 0, 0,197, 1, 73, 0, 7, 0, 72, 0,198, 1, 2, 0,199, 1, + 2, 0,200, 1, 2, 0,201, 1, 2, 0, 55, 0, 9, 0,202, 1, 9, 0,203, 1, 74, 0, 3, 0, 72, 0,198, 1, 39, 0,105, 0, + 0, 0, 34, 0, 75, 0, 3, 0, 72, 0,198, 1, 39, 0,105, 0, 0, 0, 34, 0, 76, 0, 5, 0, 72, 0,198, 1, 7, 0,204, 1, + 7, 0,205, 1, 4, 0,206, 1, 4, 0,207, 1, 77, 0, 4, 0, 72, 0,198, 1, 2, 0,208, 1, 2, 0, 16, 0, 7, 0,209, 1, + 78, 0, 3, 0, 72, 0,198, 1, 7, 0,210, 1, 4, 0,211, 1, 79, 0, 12, 0, 72, 0,198, 1, 2, 0, 16, 0, 2, 0, 17, 0, + 7, 0,212, 1, 7, 0,213, 1, 7, 0,214, 1, 7, 0,121, 1, 7, 0,215, 1, 7, 0,216, 1, 7, 0,217, 1, 7, 0,218, 1, + 7, 0,219, 1, 80, 0, 5, 0, 72, 0,198, 1, 2, 0,220, 1, 2, 0, 69, 0, 4, 0, 48, 1, 39, 0,105, 0, 81, 0, 9, 0, + 72, 0,198, 1, 39, 0,105, 0, 7, 0,221, 1, 7, 0,222, 1, 7, 0,223, 1, 4, 0,224, 1, 4, 0,225, 1, 7, 0,226, 1, + 0, 0, 34, 0, 82, 0, 1, 0, 72, 0,198, 1, 83, 0, 4, 0, 72, 0,198, 1, 39, 0,105, 0, 4, 0,227, 1, 4, 0, 17, 0, + 84, 0, 23, 0, 24, 0, 18, 0, 2, 0, 97, 1, 2, 0, 98, 1, 2, 0,228, 1, 2, 0, 16, 0, 2, 0,229, 1, 2, 0,230, 1, + 2, 0,231, 1, 2, 0, 48, 1, 0, 0,232, 1, 0, 0,233, 1, 0, 0,234, 1, 0, 0, 29, 0, 4, 0, 17, 0, 7, 0,235, 1, + 7, 0,236, 1, 7, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 54, 0,241, 1, 27, 0, 42, 0, 29, 0,117, 1, + 85, 0, 3, 0, 85, 0, 0, 0, 85, 0, 1, 0, 0, 0, 34, 0, 51, 0, 1, 0, 7, 0,242, 1, 70, 0, 2, 0, 7, 0,243, 1, + 7, 0,112, 0, 86, 0, 4, 0, 2, 0, 22, 0, 2, 0,244, 1, 4, 0, 17, 0, 39, 0,245, 1, 39, 0, 95, 0, 24, 0, 18, 0, + 2, 0, 29, 0, 2, 0,246, 1, 4, 0,247, 1, 4, 0,248, 1, 4, 0,249, 1, 0, 0,250, 1, 9, 0,251, 1, 39, 0,252, 1, + 39, 0,253, 1, 27, 0, 42, 0, 59, 0,116, 1, 51, 0, 59, 1, 87, 0,254, 1, 88, 0,255, 1, 9, 0, 32, 0, 11, 0, 0, 2, + 11, 0,166, 1, 11, 0, 1, 2, 11, 0, 78, 1, 11, 0, 2, 2, 11, 0, 3, 2, 47, 0, 79, 1, 7, 0, 81, 1, 7, 0, 4, 2, + 7, 0, 5, 2, 7, 0,112, 0, 7, 0, 6, 2, 7, 0, 82, 1, 7, 0, 7, 2, 7, 0, 68, 1, 7, 0, 8, 2, 7, 0, 9, 2, + 7, 0,221, 1, 7, 0,142, 0, 4, 0,231, 0, 2, 0, 16, 0, 2, 0, 10, 2, 2, 0, 11, 2, 2, 0, 12, 2, 2, 0, 13, 2, + 2, 0, 14, 2, 2, 0, 15, 2, 2, 0, 16, 2, 2, 0, 17, 2, 2, 0, 18, 2, 2, 0, 19, 2, 2, 0, 20, 2, 2, 0, 21, 2, + 2, 0, 22, 2, 2, 0, 23, 2, 2, 0, 24, 2, 7, 0, 25, 2, 7, 0, 26, 2, 7, 0, 27, 2, 7, 0, 28, 2, 7, 0, 29, 2, + 7, 0, 30, 2, 7, 0, 31, 2, 7, 0, 32, 2, 7, 0, 33, 2, 0, 0, 34, 2, 0, 0, 35, 2, 0, 0, 80, 1, 0, 0, 36, 2, + 30, 0, 80, 0, 11, 0, 37, 2, 11, 0, 38, 2, 11, 0, 39, 2, 11, 0, 40, 2, 9, 0,177, 1, 7, 0, 41, 2, 2, 0, 42, 2, + 2, 0, 43, 2, 7, 0,162, 1, 4, 0, 44, 2, 4, 0, 45, 2, 2, 0, 46, 2, 2, 0,147, 0, 7, 0, 47, 2, 11, 0, 48, 2, + 11, 0, 49, 2, 11, 0, 50, 2, 89, 0, 51, 2, 90, 0, 52, 2, 91, 0, 53, 2, 86, 0, 54, 2, 86, 0, 55, 2, 2, 0, 56, 2, + 0, 0, 57, 2, 0, 0, 58, 2, 7, 0,181, 1, 92, 0, 59, 2, 93, 0, 60, 2, 93, 0, 61, 2, 94, 0, 14, 0, 94, 0, 0, 0, + 94, 0, 1, 0, 39, 0,252, 1, 7, 0,221, 1, 7, 0, 62, 2, 7, 0,222, 1, 7, 0,223, 1, 0, 0, 34, 0, 4, 0,224, 1, + 4, 0,225, 1, 4, 0, 63, 2, 2, 0, 29, 0, 2, 0, 64, 2, 7, 0,226, 1, 89, 0, 13, 0, 2, 0, 65, 2, 2, 0, 66, 2, + 2, 0, 16, 0, 2, 0, 17, 0, 7, 0, 67, 2, 7, 0, 68, 2, 7, 0, 69, 2, 7, 0, 70, 2, 7, 0, 71, 2, 7, 0, 72, 2, + 7, 0, 73, 2, 7, 0, 74, 2, 7, 0, 75, 2, 95, 0, 1, 0, 7, 0, 95, 1, 90, 0, 26, 0, 4, 0, 76, 2, 4, 0, 77, 2, + 96, 0, 78, 2, 97, 0, 79, 2, 7, 0, 26, 2, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 82, 2, 7, 0, 83, 2, 7, 0, 84, 2, + 7, 0, 85, 2, 7, 0, 86, 2, 7, 0, 87, 2, 7, 0, 88, 2, 7, 0, 89, 2, 2, 0, 90, 2, 2, 0, 69, 0, 7, 0, 91, 2, + 7, 0, 92, 2, 2, 0,187, 0, 2, 0, 93, 2, 2, 0, 94, 2, 2, 0, 48, 1, 95, 0, 95, 2, 4, 0, 96, 2, 4, 0, 44, 0, + 92, 0, 26, 0, 2, 0, 29, 0, 2, 0, 97, 2, 2, 0, 98, 2, 2, 0, 99, 2, 7, 0,100, 2, 2, 0,101, 2, 2, 0,102, 2, + 7, 0,103, 2, 2, 0,104, 2, 2, 0,105, 2, 7, 0,106, 2, 7, 0,107, 2, 7, 0,108, 2, 7, 0,109, 2, 7, 0,110, 2, + 7, 0,111, 2, 4, 0,112, 2, 7, 0,113, 2, 7, 0,114, 2, 7, 0,115, 2, 63, 0,116, 2, 63, 0,117, 2, 63, 0,118, 2, + 0, 0,119, 2, 7, 0,120, 2, 7, 0,121, 2, 98, 0, 56, 0, 24, 0, 18, 0, 2, 0,114, 0, 2, 0,194, 0, 2, 0,215, 0, + 2, 0,122, 2, 7, 0,123, 2, 7, 0,124, 2, 7, 0,125, 2, 7, 0,126, 2, 7, 0,127, 2, 7, 0,128, 2, 7, 0,129, 2, + 7, 0,130, 2, 7, 0,238, 0, 7, 0,240, 0, 7, 0,239, 0, 7, 0,131, 2, 4, 0,132, 2, 7, 0,133, 2, 7, 0,134, 2, + 7, 0,135, 2, 7, 0,136, 2, 7, 0,137, 2, 7, 0,138, 2, 7, 0,139, 2, 2, 0,140, 2, 2, 0,193, 0, 4, 0,141, 2, + 7, 0,142, 2, 7, 0,143, 2, 7, 0,144, 2, 7, 0,145, 2, 7, 0,146, 2, 7, 0,147, 2, 7, 0,148, 2, 7, 0,149, 2, + 7, 0,150, 2, 7, 0,151, 2, 7, 0,152, 2, 7, 0,153, 2, 2, 0,154, 2, 2, 0,155, 2, 2, 0,156, 2, 2, 0,157, 2, + 7, 0,158, 2, 7, 0,159, 2, 7, 0,160, 2, 7, 0,161, 2, 2, 0,162, 2, 2, 0,163, 2, 2, 0,164, 2, 2, 0,165, 2, + 7, 0,166, 2, 27, 0, 42, 0, 38, 0,230, 0, 30, 0, 80, 0, 99, 0, 16, 0, 2, 0,167, 2, 2, 0,168, 2, 2, 0,169, 2, + 2, 0, 16, 0, 2, 0,170, 2, 2, 0,171, 2, 2, 0,172, 2, 2, 0,173, 2, 2, 0,174, 2, 2, 0,175, 2, 2, 0,176, 2, + 2, 0,177, 2, 4, 0,178, 2, 7, 0,179, 2, 7, 0,180, 2, 7, 0,181, 2,100, 0, 8, 0,100, 0, 0, 0,100, 0, 1, 0, + 4, 0,231, 0, 4, 0,182, 2, 4, 0, 16, 0, 2, 0,183, 2, 2, 0,184, 2, 39, 0,105, 0,101, 0, 13, 0, 9, 0,185, 2, + 9, 0,186, 2, 4, 0,187, 2, 4, 0,188, 2, 4, 0,189, 2, 4, 0,190, 2, 4, 0,191, 2, 4, 0,192, 2, 4, 0,193, 2, + 4, 0,194, 2, 4, 0,195, 2, 4, 0, 17, 0, 0, 0,196, 2,102, 0, 5, 0, 9, 0,197, 2, 9, 0,198, 2, 4, 0,199, 2, + 4, 0, 48, 1, 0, 0,200, 2,103, 0, 4, 0, 4, 0,201, 2, 7, 0,202, 2, 2, 0, 16, 0, 2, 0,203, 2,104, 0, 98, 0, +101, 0,204, 2,102, 0,205, 2, 2, 0,206, 2, 2, 0,187, 0, 2, 0, 93, 2, 2, 0,207, 2, 2, 0,208, 2, 2, 0, 16, 0, + 7, 0, 26, 2, 7, 0,209, 2, 7, 0,210, 2, 7, 0,211, 2, 7, 0,212, 2, 7, 0,213, 2, 2, 0,214, 2, 2, 0,215, 2, + 2, 0,216, 2, 2, 0,217, 2, 2, 0,146, 0, 2, 0,218, 2, 2, 0,219, 2, 2, 0,220, 2, 2, 0,221, 2, 2, 0,222, 2, + 2, 0,223, 2, 2, 0, 17, 0, 2, 0, 66, 0, 2, 0,224, 2, 2, 0,225, 2, 2, 0,226, 2, 2, 0,227, 2, 2, 0,228, 2, + 2, 0,229, 2, 2, 0,230, 2, 23, 0,231, 2, 23, 0,232, 2, 2, 0,233, 2, 2, 0,234, 2, 2, 0,235, 2, 2, 0,236, 2, + 2, 0,237, 2, 2, 0,238, 2, 4, 0,193, 0, 2, 0,239, 2, 2, 0,240, 2, 2, 0,241, 2, 2, 0,242, 2, 2, 0,243, 2, + 2, 0,244, 2, 2, 0,245, 2, 2, 0,246, 2, 2, 0,247, 2, 7, 0,181, 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, 2, 0, 5, 3, 2, 0, 6, 3, 2, 0, 7, 3, 2, 0, 8, 3, 2, 0, 9, 3, 2, 0, 10, 3, + 2, 0, 11, 3, 2, 0, 12, 3, 2, 0, 13, 3, 2, 0, 14, 3, 4, 0, 15, 3, 4, 0, 16, 3, 4, 0, 17, 3, 4, 0, 18, 3, + 4, 0, 19, 3, 7, 0, 20, 3, 4, 0, 21, 3, 4, 0, 22, 3, 4, 0, 23, 3, 4, 0, 24, 3, 7, 0, 25, 3, 7, 0, 26, 3, + 7, 0, 27, 3, 7, 0, 28, 3, 7, 0, 29, 3, 7, 0, 30, 3, 7, 0, 31, 3, 7, 0, 32, 3, 7, 0, 33, 3, 0, 0, 34, 3, + 0, 0, 35, 3, 0, 0, 36, 3,105, 0, 5, 0, 7, 0, 37, 3, 0, 0, 29, 0, 0, 0, 69, 0, 0, 0, 48, 1, 0, 0, 39, 1, +106, 0, 5, 0,106, 0, 0, 0,106, 0, 1, 0, 4, 0, 38, 3, 0, 0, 39, 3, 4, 0, 16, 0,107, 0, 13, 0, 2, 0, 40, 3, + 2, 0, 41, 3, 2, 0, 42, 3, 2, 0, 43, 3, 2, 0, 44, 3, 2, 0, 69, 0, 7, 0, 45, 3, 7, 0, 46, 3, 2, 0, 47, 3, + 2, 0, 48, 3, 2, 0, 49, 3, 0, 0, 48, 1, 0, 0, 39, 1,108, 0, 31, 0, 24, 0, 18, 0, 39, 0, 50, 3, 98, 0, 51, 3, +108, 0, 52, 3, 35, 0,140, 0, 11, 0, 53, 3,100, 0, 54, 3,109, 0, 55, 3, 7, 0, 56, 3, 7, 0, 57, 3, 7, 0, 58, 3, + 7, 0, 59, 3, 4, 0,231, 0, 2, 0, 60, 3, 2, 0, 17, 0, 2, 0, 61, 3, 2, 0, 62, 3, 7, 0, 63, 3, 9, 0, 64, 3, + 99, 0, 65, 3, 9, 0,177, 1,105, 0, 66, 3,107, 0, 67, 3,104, 0,115, 0,103, 0, 68, 3, 30, 0, 80, 0, 11, 0, 69, 3, +110, 0, 70, 3, 2, 0, 71, 3, 2, 0, 72, 3, 4, 0, 73, 3,111, 0, 10, 0, 35, 0,140, 0, 40, 0,106, 0, 7, 0,132, 1, + 7, 0,133, 1, 7, 0, 66, 0, 7, 0, 74, 3, 7, 0, 75, 3, 2, 0, 76, 3, 2, 0, 77, 3, 4, 0, 78, 3,112, 0, 53, 0, +113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3, 7, 0, 83, 3, 7, 0, 84, 3, + 7, 0, 85, 3, 7, 0, 86, 3, 7, 0, 87, 3, 7, 0, 88, 3, 7, 0, 89, 3, 7, 0,196, 0, 2, 0, 90, 3, 2, 0, 91, 3, + 39, 0, 50, 3,111, 0, 92, 3,112, 0, 93, 3, 2, 0,169, 2, 2, 0, 94, 3, 4, 0,231, 0, 4, 0, 95, 3, 2, 0, 96, 3, + 2, 0, 97, 3, 2, 0, 98, 3, 2, 0, 16, 0, 7, 0, 72, 0, 7, 0, 99, 3, 7, 0,100, 3, 7, 0,101, 3, 7, 0,102, 3, + 7, 0,103, 3, 7, 0,111, 0, 7, 0, 56, 3, 2, 0,104, 3, 2, 0,105, 3, 2, 0,106, 3, 2, 0,107, 3, 2, 0,108, 3, + 2, 0,109, 3, 2, 0,110, 3, 2, 0,111, 3, 2, 0,112, 3, 2, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 51, 0,116, 3, + 11, 0,117, 3, 2, 0,118, 3, 2, 0,163, 1, 2, 0,119, 3, 2, 0, 48, 1,115, 0, 16, 0, 23, 0, 22, 0, 23, 0, 24, 0, + 22, 0,120, 3, 22, 0,121, 3, 22, 0,122, 3, 7, 0,123, 3, 7, 0,124, 3, 7, 0,125, 3, 7, 0,126, 3, 2, 0,127, 3, + 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 2, 0,131, 3, 2, 0,132, 3, 4, 0, 16, 0,113, 0, 6, 0,113, 0, 0, 0, +113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3,116, 0, 6, 0,113, 0, 0, 0,113, 0, 1, 0, + 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3,117, 0, 26, 0,113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, + 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3, 4, 0,133, 3, 4, 0, 48, 1,115, 0,134, 3, 9, 0,135, 3, 11, 0,136, 3, + 27, 0, 42, 0, 24, 0, 43, 0, 0, 0,137, 3, 0, 0,138, 3, 2, 0,139, 3, 2, 0,140, 3, 2, 0,141, 3, 2, 0,142, 3, + 2, 0, 26, 0, 2, 0, 25, 0, 2, 0,108, 3, 2, 0,143, 3, 4, 0, 16, 0, 7, 0,144, 3, 23, 0, 22, 0,118, 0, 31, 0, +113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3, 2, 0,145, 3, 2, 0,146, 3, + 2, 0,147, 3, 2, 0,148, 3,115, 0,134, 3, 2, 0,149, 3, 2, 0,108, 3, 2, 0,140, 3, 2, 0,150, 3, 9, 0,151, 3, + 2, 0,109, 3, 0, 0,152, 3, 0, 0,153, 3, 2, 0,154, 3, 2, 0,155, 3, 4, 0, 78, 3, 2, 0,156, 3, 2, 0,157, 3, + 2, 0,158, 3, 2, 0, 18, 2, 2, 0,159, 3, 2, 0, 69, 0, 4, 0,160, 3, 0, 0,215, 0, 0, 0,161, 3,119, 0, 10, 0, +113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3,115, 0,134, 3, 2, 0,149, 3, + 2, 0, 74, 3, 4, 0, 48, 1,120, 0, 24, 0,113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, + 2, 0, 82, 3,121, 0,162, 3, 4, 0,163, 3, 0, 0,164, 3, 0, 0,165, 3, 0, 0,166, 3, 2, 0, 29, 0, 2, 0,167, 3, + 2, 0, 16, 0, 2, 0,168, 3, 2, 0,169, 3, 2, 0,170, 3,122, 0,171, 3, 2, 0,172, 3, 2, 0,138, 0, 2, 0,173, 3, + 2, 0,174, 3, 9, 0,175, 3, 2, 0,176, 3,123, 0, 19, 0,113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3, +114, 0, 81, 3, 2, 0, 82, 3,115, 0,134, 3, 11, 0,177, 3, 2, 0,140, 3, 2, 0,178, 3, 2, 0, 16, 0, 2, 0,157, 1, + 9, 0,151, 3, 11, 0,179, 3,124, 0,180, 3, 2, 0, 29, 0, 2, 0,181, 3, 2, 0,182, 3, 2, 0,183, 3,125, 0, 17, 0, +113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3,115, 0,134, 3, 35, 0,184, 3, + 7, 0, 74, 3, 2, 0,193, 0, 2, 0,108, 3, 2, 0,185, 3, 2, 0,186, 3, 7, 0,132, 1, 7, 0,133, 1, 2, 0, 16, 0, + 2, 0,143, 3,126, 0, 10, 0,113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3, + 2, 0,108, 3, 2, 0,143, 3, 4, 0, 17, 0,115, 0,134, 3,127, 0, 22, 0,113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, + 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3, 32, 0,187, 3, 4, 0,188, 3, 4, 0,189, 3, 2, 0, 55, 0, 2, 0,108, 3, + 4, 0,190, 3, 4, 0,191, 3, 4, 0,192, 3, 4, 0,193, 3, 4, 0,194, 3, 4, 0,195, 3, 4, 0,196, 3, 4, 0,197, 3, + 7, 0,198, 3, 22, 0,199, 3, 22, 0,200, 3,128, 0, 9, 0,113, 0, 0, 0,113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3, +114, 0, 81, 3,129, 0,201, 3, 4, 0, 48, 1, 2, 0, 55, 0, 2, 0,108, 3,130, 0, 8, 0,113, 0, 0, 0,113, 0, 1, 0, + 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3,115, 0,134, 3, 4, 0, 16, 0, 4, 0,202, 3,131, 0, 81, 0,113, 0, 0, 0, +113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 0, 0,203, 3, 4, 0,204, 3, 2, 0,193, 0, 2, 0,205, 3, + 2, 0,206, 3, 2, 0,207, 3, 2, 0,208, 3, 2, 0,209, 3, 2, 0,210, 3, 2, 0,211, 3, 2, 0,212, 3, 2, 0,213, 3, + 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,225, 3, 2, 0,226, 3, 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, 2, 0,234, 3, 2, 0,235, 3, 2, 0,236, 3, 2, 0,237, 3, + 2, 0,238, 3, 2, 0,239, 3, 2, 0,240, 3, 2, 0,241, 3, 2, 0,242, 3, 2, 0,243, 3, 2, 0,244, 3, 2, 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, 0, 0,252, 3, 0, 0,253, 3, + 0, 0,254, 3, 0, 0,255, 3,132, 0, 0, 4,132, 0, 1, 4, 4, 0, 2, 4, 4, 0, 3, 4, 4, 0, 4, 4, 4, 0, 5, 4, + 4, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4, 7, 0, 9, 4, 2, 0, 10, 4, 2, 0, 11, 4, 2, 0, 12, 4, 2, 0, 13, 4, +133, 0, 14, 4,133, 0, 15, 4, 2, 0, 16, 4, 2, 0, 17, 4, 4, 0, 48, 1, 37, 0, 18, 4, 9, 0,175, 3, 9, 0, 19, 4, +134, 0, 19, 0, 0, 0, 20, 4, 0, 0, 21, 4, 0, 0, 22, 4, 0, 0, 23, 4, 0, 0, 24, 4, 0, 0, 25, 4, 0, 0, 26, 4, + 0, 0, 27, 4, 0, 0, 28, 4, 0, 0, 29, 4, 0, 0, 30, 4, 0, 0, 31, 4, 0, 0, 32, 4, 0, 0, 33, 4, 0, 0, 34, 4, + 0, 0, 35, 4, 0, 0, 36, 4, 0, 0, 37, 4, 0, 0, 38, 4,135, 0, 36, 0, 0, 0, 39, 4, 0, 0, 30, 4, 0, 0, 31, 4, + 0, 0, 40, 4, 0, 0, 41, 4, 0, 0, 42, 4, 0, 0, 43, 4, 0, 0, 44, 4, 0, 0, 45, 4, 0, 0, 46, 4, 0, 0, 47, 4, + 0, 0, 48, 4, 0, 0, 49, 4, 0, 0, 50, 4, 0, 0, 51, 4, 0, 0, 52, 4, 0, 0, 53, 4, 0, 0, 54, 4, 0, 0, 55, 4, + 0, 0, 56, 4, 0, 0, 57, 4, 0, 0, 58, 4, 0, 0, 59, 4, 0, 0, 60, 4, 0, 0, 61, 4, 0, 0, 62, 4, 0, 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, 0, 0, 71, 4, + 0, 0, 72, 4,136, 0, 18, 0,136, 0, 0, 0,136, 0, 1, 0, 0, 0, 34, 0,134, 0, 73, 4,135, 0, 74, 4,135, 0, 75, 4, +135, 0, 76, 4,135, 0, 77, 4,135, 0, 78, 4,135, 0, 79, 4,135, 0, 80, 4,135, 0, 81, 4,135, 0, 82, 4,135, 0, 83, 4, +135, 0, 84, 4,135, 0, 85, 4,135, 0, 86, 4,135, 0, 87, 4,137, 0, 5, 0, 4, 0, 16, 0, 4, 0, 17, 0, 7, 0,162, 1, + 7, 0, 88, 4, 7, 0, 95, 1,138, 0, 45, 0, 4, 0, 16, 0, 4, 0, 89, 4, 4, 0, 90, 4, 0, 0, 91, 4, 0, 0, 92, 4, + 0, 0, 93, 4, 0, 0, 94, 4, 0, 0, 95, 4, 0, 0, 96, 4, 0, 0, 97, 4, 0, 0, 98, 4, 0, 0, 99, 4, 2, 0,100, 4, + 2, 0,101, 4, 4, 0,102, 4, 4, 0,103, 4, 4, 0,104, 4, 4, 0,105, 4, 2, 0,106, 4, 2, 0,107, 4, 2, 0,108, 4, + 2, 0,109, 4, 4, 0,110, 4, 4, 0,111, 4, 2, 0,112, 4, 2, 0,113, 4, 2, 0,114, 4, 2, 0,115, 4, 0, 0,116, 4, + 11, 0,117, 4, 2, 0,118, 4, 2, 0,119, 4, 2, 0,120, 4, 2, 0,121, 4,137, 0,122, 4, 2, 0,123, 4, 2, 0,124, 4, + 2, 0,125, 4, 2, 0,126, 4, 4, 0,127, 4, 4, 0,128, 4, 2, 0,129, 4, 2, 0, 69, 0, 2, 0, 48, 1, 2, 0, 39, 1, +139, 0, 18, 0, 24, 0, 18, 0, 11, 0,130, 4, 11, 0,131, 4, 11, 0,132, 4,108, 0,133, 4, 2, 0,212, 1, 2, 0,134, 4, + 2, 0,213, 1, 2, 0,135, 4, 2, 0,136, 4, 2, 0,137, 4, 2, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4, 2, 0, 17, 0, + 2, 0,141, 4, 2, 0,142, 4, 2, 0,143, 4,140, 0, 5, 0,140, 0, 0, 0,140, 0, 1, 0,140, 0,144, 4, 12, 0,145, 4, + 4, 0, 16, 0,141, 0, 7, 0,141, 0, 0, 0,141, 0, 1, 0,140, 0,146, 4,140, 0,147, 4, 2, 0,232, 2, 2, 0, 16, 0, + 4, 0, 17, 0,142, 0, 16, 0,142, 0, 0, 0,142, 0, 1, 0, 0, 0,148, 4, 0, 0,149, 4, 2, 0,150, 4, 2, 0,151, 4, + 2, 0,136, 4, 2, 0,137, 4, 2, 0, 16, 0, 2, 0, 64, 2, 2, 0,152, 4, 2, 0, 17, 0, 2, 0,153, 4, 2, 0,154, 4, + 4, 0,155, 4,142, 0,156, 4,114, 0, 30, 0,114, 0, 0, 0,114, 0, 1, 0,140, 0,146, 4,140, 0,147, 4,140, 0,157, 4, +140, 0,158, 4,139, 0,159, 4, 7, 0,160, 4, 22, 0,152, 1, 22, 0,161, 4, 22, 0,162, 4, 2, 0,163, 4, 2, 0,164, 4, + 2, 0,165, 4, 0, 0, 79, 3, 0, 0,166, 4, 2, 0,167, 4, 2, 0,168, 4, 0, 0,169, 4, 0, 0,170, 4, 0, 0,171, 4, + 0, 0,172, 4, 2, 0,173, 4, 2, 0,174, 4, 2, 0,175, 4, 2, 0, 16, 0, 30, 0, 80, 0, 11, 0,176, 4, 11, 0,177, 4, + 11, 0,178, 4,143, 0, 7, 0, 9, 0,179, 4, 9, 0,180, 4, 2, 0,181, 4, 2, 0,233, 2, 4, 0,182, 4, 4, 0,183, 4, + 4, 0, 17, 0,144, 0, 8, 0, 0, 0,184, 4, 37, 0, 82, 0,144, 0,185, 4,144, 0,186, 4,144, 0,187, 4, 2, 0, 84, 0, + 2, 0,188, 4, 4, 0, 17, 0,145, 0, 11, 0,145, 0, 0, 0,145, 0, 1, 0, 2, 0,157, 1, 2, 0, 52, 0, 2, 0, 15, 0, + 2, 0,189, 4,144, 0,190, 4, 0, 0,165, 3, 2, 0,191, 4, 2, 0,192, 4, 4, 0, 17, 0,146, 0, 10, 0, 0, 0, 57, 1, + 9, 0,125, 0, 0, 0,126, 0, 4, 0,129, 0, 4, 0,136, 0, 9, 0,130, 0, 7, 0,132, 0, 7, 0,133, 0, 9, 0,134, 0, + 9, 0,135, 0,147, 0, 38, 0,147, 0, 0, 0,147, 0, 1, 0,147, 0,193, 4, 9, 0, 13, 0, 0, 0, 14, 0, 2, 0, 16, 0, + 2, 0, 29, 0, 4, 0, 52, 0, 4, 0,204, 1, 4, 0,194, 4, 4, 0,195, 4, 4, 0,196, 4, 4, 0,197, 4, 4, 0,198, 4, + 4, 0,146, 0, 4, 0,199, 4, 4, 0,200, 4, 7, 0,201, 4, 7, 0,202, 4, 4, 0,187, 0,145, 0,203, 4,144, 0,204, 4, + 27, 0, 42, 0,108, 0,133, 4, 36, 0, 81, 0, 7, 0,205, 4, 7, 0,206, 4,146, 0,189, 0,147, 0,207, 4,147, 0,208, 4, +147, 0,209, 4, 11, 0,210, 4,148, 0,211, 4, 7, 0,212, 4, 7, 0,213, 4, 4, 0,214, 4, 7, 0,215, 4, 9, 0,216, 4, +149, 0, 4, 0,149, 0, 0, 0,149, 0, 1, 0, 11, 0,217, 4,147, 0,218, 4,150, 0, 6, 0, 11, 0,219, 4, 11, 0,210, 4, + 11, 0,220, 4, 2, 0, 16, 0, 2, 0,157, 1, 4, 0, 17, 0,151, 0, 4, 0, 7, 0,221, 4, 7, 0,222, 4, 2, 0,223, 4, + 2, 0,224, 4,152, 0, 6, 0, 7, 0,225, 4, 7, 0,226, 4, 7, 0,227, 4, 7, 0,228, 4, 4, 0,229, 4, 4, 0,230, 4, +153, 0, 6, 0,153, 0, 0, 0,153, 0, 1, 0, 2, 0, 29, 0, 2, 0, 16, 0, 2, 0,231, 4, 2, 0,157, 1,154, 0, 8, 0, +154, 0, 0, 0,154, 0, 1, 0, 2, 0, 29, 0, 2, 0, 16, 0, 2, 0,231, 4, 2, 0,157, 1, 7, 0, 52, 0, 7, 0,187, 0, +155, 0, 41, 0,155, 0, 0, 0,155, 0, 1, 0, 2, 0, 29, 0, 2, 0, 16, 0, 2, 0,231, 4, 2, 0,143, 0, 2, 0, 90, 2, + 2, 0,232, 4, 7, 0,233, 4, 7, 0,234, 4, 7, 0,219, 1, 4, 0,235, 4, 4, 0, 44, 0, 4, 0,207, 1, 7, 0,236, 4, + 7, 0,237, 4, 7, 0,238, 4, 7, 0,239, 4, 7, 0,240, 4, 7, 0,241, 4, 7, 0,217, 1, 7, 0,184, 0, 7, 0,242, 4, + 7, 0,243, 4, 7, 0,244, 4, 7, 0,245, 4, 2, 0,246, 4, 2, 0,247, 4, 2, 0,248, 4, 2, 0,249, 4, 2, 0,250, 4, + 2, 0,251, 4, 2, 0,252, 4, 2, 0,253, 4, 2, 0,254, 4, 2, 0,255, 4, 2, 0, 78, 1, 2, 0, 0, 5, 0, 0, 1, 5, + 0, 0, 2, 5,156, 0, 3, 5,157, 0, 16, 0,157, 0, 0, 0,157, 0, 1, 0, 2, 0, 29, 0, 2, 0, 16, 0, 2, 0,231, 4, + 2, 0,143, 0, 7, 0,212, 1, 7, 0,213, 1, 7, 0,214, 1, 7, 0,121, 1, 7, 0,215, 1, 7, 0,216, 1, 7, 0, 4, 5, + 7, 0,217, 1, 7, 0,218, 1, 7, 0,219, 1,158, 0, 5, 0, 2, 0, 29, 0, 2, 0,188, 4, 2, 0, 16, 0, 2, 0, 5, 5, + 24, 0, 6, 5,124, 0, 3, 0, 4, 0, 31, 0, 4, 0, 7, 5,158, 0, 32, 0,159, 0, 12, 0,159, 0, 0, 0,159, 0, 1, 0, + 2, 0, 29, 0, 2, 0, 16, 0, 2, 0, 34, 2, 2, 0, 94, 1, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 8, 5, 7, 0, 9, 5, + 24, 0, 6, 5, 11, 0, 10, 5,160, 0, 11, 0,160, 0, 0, 0,160, 0, 1, 0, 0, 0, 34, 0, 2, 0, 29, 0, 2, 0, 11, 5, + 4, 0, 12, 5, 4, 0, 13, 5, 2, 0, 16, 0, 2, 0, 17, 0, 9, 0, 14, 5, 9, 0, 15, 5,161, 0, 5, 0, 0, 0, 34, 0, + 7, 0,196, 0, 7, 0, 16, 5, 4, 0, 17, 5, 4, 0, 17, 0,162, 0, 4, 0, 2, 0, 29, 0, 2, 0, 16, 0, 2, 0, 69, 0, + 2, 0, 48, 1,163, 0, 4, 0, 0, 0, 34, 0, 47, 0, 18, 5, 7, 0,196, 0, 7, 0, 17, 0,164, 0, 6, 0, 2, 0, 19, 5, + 2, 0, 20, 5, 2, 0, 29, 0, 2, 0, 21, 5, 0, 0, 22, 5, 0, 0, 23, 5,165, 0, 5, 0, 4, 0, 29, 0, 4, 0, 17, 0, + 0, 0, 34, 0, 0, 0, 24, 5, 0, 0, 25, 5,166, 0, 6, 0, 0, 0, 34, 0, 0, 0, 26, 5, 2, 0, 27, 5, 2, 0,217, 1, + 2, 0,193, 0, 2, 0, 48, 1,167, 0, 5, 0, 0, 0, 34, 0, 7, 0,222, 4, 7, 0,135, 2, 2, 0, 16, 0, 2, 0,208, 1, +168, 0, 3, 0, 0, 0, 34, 0, 4, 0,207, 1, 4, 0, 28, 5,169, 0, 7, 0, 0, 0, 34, 0, 7, 0,135, 2, 0, 0, 29, 5, + 0, 0, 30, 5, 2, 0,193, 0, 2, 0, 69, 0, 4, 0, 31, 5,170, 0, 3, 0, 39, 0, 32, 5, 0, 0, 33, 5, 0, 0, 34, 5, +171, 0, 17, 0,171, 0, 0, 0,171, 0, 1, 0, 2, 0, 29, 0, 2, 0, 11, 5, 2, 0, 16, 0, 2, 0, 35, 5, 2, 0, 36, 5, + 2, 0, 37, 5, 2, 0, 69, 0, 2, 0, 48, 1, 0, 0, 34, 0, 9, 0, 32, 0,172, 0, 38, 5, 39, 0,149, 1, 2, 0, 39, 5, + 2, 0, 40, 5, 4, 0, 17, 0,173, 0, 10, 0, 0, 0, 34, 0, 2, 0, 29, 0, 2, 0, 17, 0, 4, 0,208, 1, 4, 0, 41, 5, + 4, 0, 42, 5, 4, 0, 43, 5, 4, 0, 44, 5, 4, 0, 45, 5, 4, 0, 46, 5,174, 0, 1, 0, 0, 0, 47, 5,175, 0, 1, 0, + 32, 0,187, 3,172, 0, 18, 0,172, 0, 0, 0,172, 0, 1, 0,172, 0, 48, 5, 2, 0, 29, 0, 2, 0, 16, 0, 2, 0, 49, 5, + 2, 0, 37, 5, 2, 0, 11, 5, 2, 0, 50, 5, 2, 0, 48, 1, 2, 0, 39, 1, 0, 0, 34, 0, 9, 0, 32, 0,176, 0, 38, 5, +171, 0, 51, 5, 2, 0, 52, 5, 2, 0, 53, 5, 4, 0, 24, 1,177, 0, 3, 0, 4, 0, 54, 5, 4, 0, 17, 0, 39, 0,149, 1, +178, 0, 13, 0, 87, 0, 55, 5, 2, 0, 29, 0, 2, 0, 16, 0, 2, 0,233, 4, 2, 0,234, 4, 0, 0, 34, 0, 2, 0, 56, 5, + 2, 0, 57, 5, 7, 0, 58, 5, 2, 0, 59, 5, 2, 0, 99, 0, 2, 0,100, 0, 2, 0, 60, 5,179, 0, 9, 0, 2, 0, 16, 0, + 2, 0, 61, 5, 2, 0,233, 4, 2, 0,234, 4,148, 0,211, 4, 2, 0, 29, 0, 2, 0, 62, 5, 2, 0, 63, 5, 2, 0, 64, 5, +180, 0, 7, 0, 2, 0, 16, 0, 2, 0, 61, 5, 2, 0,233, 4, 2, 0,234, 4, 2, 0, 29, 0, 2, 0, 65, 5, 7, 0, 66, 5, +181, 0, 9, 0, 4, 0, 54, 5, 2, 0, 29, 0, 2, 0, 16, 0, 39, 0,149, 1, 63, 0, 67, 5, 0, 0, 34, 0, 7, 0, 68, 5, + 2, 0, 69, 5, 2, 0, 17, 0,182, 0, 5, 0, 2, 0, 29, 0, 2, 0, 16, 0, 4, 0, 17, 0,108, 0,133, 4, 39, 0, 50, 3, +183, 0, 5, 0, 4, 0, 16, 0, 4, 0, 29, 0, 0, 0, 34, 0, 0, 0, 24, 5, 39, 0,149, 1,184, 0, 12, 0, 4, 0, 16, 0, + 4, 0, 29, 0, 7, 0, 70, 5, 7, 0, 71, 5, 7, 0, 81, 1, 7, 0, 82, 1, 7, 0, 4, 2, 7, 0, 7, 2, 7, 0, 72, 5, + 7, 0, 73, 5, 7, 0, 74, 5, 0, 0, 75, 5,185, 0, 9, 0, 2, 0, 16, 0, 2, 0, 29, 0, 2, 0,233, 4, 2, 0,234, 4, + 0, 0, 34, 0, 2, 0, 69, 0, 2, 0, 24, 0, 2, 0, 76, 5, 2, 0, 77, 5,186, 0, 8, 0, 39, 0,149, 1, 7, 0,214, 1, + 7, 0, 78, 5, 7, 0,244, 1, 7, 0, 79, 5, 2, 0, 16, 0, 2, 0,208, 1, 7, 0, 80, 5,187, 0, 7, 0, 2, 0, 16, 0, + 2, 0,217, 1, 7, 0, 81, 5, 7, 0, 82, 5, 7, 0, 83, 5, 7, 0, 84, 5, 7, 0, 85, 5,188, 0, 10, 0, 2, 0, 16, 0, + 2, 0, 29, 0, 2, 0,233, 4, 2, 0,234, 4, 0, 0, 34, 0, 2, 0, 69, 0, 2, 0, 24, 0, 2, 0, 76, 5, 2, 0, 77, 5, +109, 0, 55, 3,189, 0, 7, 0, 4, 0,207, 1, 4, 0, 86, 5, 4, 0, 87, 5, 4, 0, 88, 5, 7, 0, 89, 5, 7, 0, 90, 5, + 0, 0, 29, 5,190, 0, 7, 0, 0, 0, 91, 5, 39, 0, 92, 5, 0, 0, 33, 5, 2, 0, 93, 5, 2, 0, 69, 0, 4, 0, 48, 1, + 0, 0, 34, 5,191, 0, 6, 0, 2, 0, 16, 0, 2, 0, 29, 0, 2, 0,233, 4, 2, 0,234, 4, 0, 0, 94, 5, 0, 0, 95, 5, +192, 0, 1, 0, 4, 0, 16, 0,176, 0, 10, 0,176, 0, 0, 0,176, 0, 1, 0,176, 0, 48, 5, 2, 0, 29, 0, 2, 0, 16, 0, + 2, 0, 11, 5, 2, 0, 96, 5, 0, 0, 34, 0, 9, 0, 32, 0, 39, 0,149, 1,193, 0, 10, 0, 7, 0, 27, 2, 7, 0, 97, 5, + 7, 0, 98, 5, 7, 0, 99, 5, 7, 0,100, 5, 4, 0, 16, 0, 7, 0,101, 5, 7, 0,102, 5, 7, 0,103, 5, 7, 0, 17, 0, +148, 0, 22, 0, 24, 0, 18, 0, 0, 0, 21, 0,194, 0,104, 5, 9, 0,105, 5, 33, 0, 95, 0, 33, 0,106, 5, 9, 0,107, 5, + 27, 0, 42, 0, 7, 0, 66, 5, 7, 0,108, 5, 7, 0,109, 5, 7, 0,110, 5, 7, 0,111, 5, 7, 0,112, 5, 7, 0,113, 5, + 4, 0, 55, 0, 4, 0,114, 5, 4, 0,115, 5, 4, 0,116, 5, 0, 0,117, 5, 0, 0,118, 5, 0, 0,119, 5,195, 0, 6, 0, + 24, 0, 18, 0, 7, 0,120, 5, 7, 0,121, 5, 7, 0,122, 5, 2, 0,123, 5, 2, 0,124, 5,196, 0, 14, 0,113, 0, 0, 0, +113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3,115, 0,134, 3,148, 0,211, 4, 2, 0,193, 0, 2, 0, 61, 5, + 2, 0,132, 1, 2, 0,133, 1, 2, 0, 16, 0, 2, 0,143, 3, 4, 0, 48, 1,197, 0, 6, 0,197, 0, 0, 0,197, 0, 1, 0, + 2, 0,187, 0, 2, 0, 93, 2, 7, 0,206, 2, 0, 0, 34, 0,198, 0, 31, 0,198, 0, 0, 0,198, 0, 1, 0,197, 0,125, 5, + 2, 0,246, 1, 2, 0, 17, 0, 4, 0,247, 1, 4, 0,248, 1, 4, 0,249, 1, 39, 0,252, 1, 39, 0,253, 1, 27, 0, 42, 0, + 7, 0, 81, 1, 7, 0, 4, 2, 7, 0, 5, 2, 7, 0,112, 0, 7, 0, 6, 2, 7, 0, 82, 1, 7, 0, 7, 2, 7, 0, 68, 1, + 7, 0, 8, 2, 7, 0, 9, 2, 7, 0,221, 1, 7, 0,142, 0, 4, 0,231, 0, 0, 0, 11, 2, 0, 0, 12, 2, 0, 0, 13, 2, + 0, 0, 14, 2, 7, 0, 25, 2, 7, 0, 26, 2, 7, 0,126, 5,199, 0, 4, 0,199, 0, 0, 0,199, 0, 1, 0, 39, 0,149, 1, + 11, 0,127, 5,109, 0, 4, 0, 24, 0, 18, 0, 11, 0,128, 5, 11, 0,129, 5,197, 0,130, 5,200, 0, 25, 0,200, 0, 0, 0, +200, 0, 1, 0,200, 0,252, 1, 11, 0,131, 5, 0, 0, 34, 0, 7, 0,132, 5, 7, 0,133, 5, 7, 0,134, 5, 7, 0,135, 5, + 4, 0, 16, 0, 7, 0,136, 5, 7, 0,137, 5, 7, 0,138, 5, 7, 0,196, 0, 7, 0, 88, 1, 7, 0,139, 5, 7, 0,205, 1, + 7, 0,140, 5, 7, 0,141, 5, 7, 0,142, 5, 7, 0,143, 5, 7, 0,144, 5, 7, 0,112, 0, 2, 0,145, 5, 2, 0, 47, 3, +201, 0, 8, 0, 24, 0, 18, 0, 11, 0,146, 5, 11, 0,147, 5, 4, 0, 16, 0, 4, 0,169, 2, 4, 0,220, 1, 2, 0,148, 5, + 2, 0,149, 5,202, 0, 29, 0,202, 0, 0, 0,202, 0, 1, 0, 11, 0, 48, 2, 0, 0, 34, 0, 2, 0, 16, 0, 2, 0,150, 5, + 2, 0,151, 5, 2, 0,119, 1, 2, 0, 16, 2, 2, 0, 17, 0, 2, 0, 69, 0, 2, 0, 48, 1,200, 0,152, 5,202, 0,252, 1, +202, 0,153, 5, 11, 0,154, 5, 9, 0,155, 5, 7, 0, 81, 1, 7, 0,112, 0, 7, 0, 68, 1, 7, 0,156, 5, 7, 0,157, 5, + 7, 0,158, 5, 7, 0,159, 5, 7, 0,160, 5, 7, 0,161, 5, 7, 0,162, 5, 7, 0,163, 5, 7, 0,116, 1, 88, 0, 3, 0, + 11, 0,164, 5, 4, 0, 16, 0, 7, 0,165, 5,203, 0, 7, 0,203, 0, 0, 0,203, 0, 1, 0, 27, 0, 42, 0, 11, 0, 0, 2, + 4, 0, 16, 0, 0, 0, 34, 0, 4, 0, 99, 0, 87, 0, 2, 0, 24, 0, 18, 0, 11, 0,164, 5,204, 0, 14, 0,113, 0, 0, 0, +113, 0, 1, 0, 4, 0, 79, 3, 7, 0, 80, 3,114, 0, 81, 3, 2, 0, 82, 3,115, 0,134, 3, 87, 0,254, 1, 4, 0, 16, 0, + 2, 0,140, 3, 2, 0,166, 5, 2, 0,143, 3, 2, 0, 17, 0, 7, 0,167, 5,205, 0, 5, 0,205, 0, 0, 0,205, 0, 1, 0, + 27, 0, 42, 0, 2, 0, 16, 0, 0, 0,168, 5,206, 0, 8, 0,206, 0, 0, 0,206, 0, 1, 0, 9, 0, 32, 0, 2, 0, 29, 0, + 2, 0, 16, 0, 2, 0, 99, 0, 0, 0,168, 5, 7, 0,169, 5,207, 0, 11, 0, 39, 0,170, 5, 7, 0,209, 1, 2, 0,171, 5, + 2, 0, 16, 0, 4, 0,172, 5, 4, 0, 17, 0, 0, 0,173, 5, 7, 0, 88, 1, 7, 0,174, 5, 7, 0,175, 5, 7, 0, 48, 1, +208, 0, 4, 0, 39, 0,170, 5, 4, 0, 99, 0, 4, 0,100, 0, 0, 0,173, 5,209, 0, 4, 0, 39, 0,170, 5, 4, 0, 16, 0, + 4, 0, 99, 0, 0, 0,173, 5,210, 0, 4, 0, 39, 0,170, 5, 4, 0, 16, 0, 4, 0, 99, 0, 0, 0,173, 5,211, 0, 7, 0, + 39, 0,170, 5, 4, 0,176, 5, 7, 0,186, 0, 2, 0,177, 5, 2, 0,178, 5, 7, 0,179, 5, 0, 0,173, 5,212, 0, 9, 0, + 39, 0,170, 5, 2, 0, 29, 0, 2, 0,180, 5, 2, 0,204, 1, 2, 0,234, 4, 7, 0, 78, 5, 7, 0,244, 1, 87, 0, 55, 5, + 0, 0,173, 5,213, 0, 4, 0, 39, 0,170, 5, 4, 0, 13, 2, 4, 0,181, 5, 0, 0,173, 5,214, 0, 5, 0, 39, 0,170, 5, + 7, 0,186, 0, 4, 0,182, 5, 4, 0, 13, 2, 4, 0, 14, 2,215, 0, 6, 0, 39, 0,170, 5, 0, 0,173, 5, 7, 0, 69, 0, + 7, 0, 48, 1, 7, 0,113, 5, 7, 0,183, 5,216, 0, 6, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, + 7, 0, 0, 3, 7, 0,184, 5,217, 0, 6, 0, 39, 0,170, 5, 4, 0,185, 5, 4, 0,186, 5, 7, 0,187, 5, 7, 0,188, 5, + 0, 0,173, 5,218, 0, 17, 0,218, 0, 0, 0,218, 0, 1, 0, 2, 0, 16, 0, 2, 0,193, 0, 2, 0,189, 5, 2, 0, 17, 0, + 27, 0, 42, 0, 87, 0, 55, 5, 7, 0,204, 1, 7, 0,234, 4, 7, 0,190, 5, 7, 0,191, 5, 7, 0,192, 5, 7, 0,193, 5, + 7, 0, 56, 5, 7, 0,194, 5, 0, 0,195, 5, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + diff --git a/source/blender/editors/datafiles/Bfont.c b/source/blender/editors/datafiles/Bfont.c new file mode 100644 index 00000000000..676b0c55b58 --- /dev/null +++ b/source/blender/editors/datafiles/Bfont.c @@ -0,0 +1,139 @@ +/* DataToC output of file */ +/* + * $Id: Bfont.c 125 2002-11-25 12:02:15Z mein $ + * + * ***** 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 ***** + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + + +int datatoc_Bfont_size= 25181; +char datatoc_Bfont[]= {"\x80\x01\xe4\x01\x00\x00\x25\x21\x50\x53\x2d\x41\x64\x6f\x62\x65\x46\x6f\x6e\x74\x2d\x31\x2e\x30\x3a\x20\x42\x66\x6f\x6e\x74\x20\x30\x30\x31\x2e\x30\x30\x31\x0a\x31\x31\x20\x64\x69\x63\x74\x20\x62\x65\x67\x69\x6e\x0a\x2f\x46\x6f\x6e\x74\x49\x6e\x66\x6f\x20\x31\x30\x20\x64\x69\x63\x74\x20\x64\x75\x70\x20\x62\x65\x67\x69\x6e\x0a\x2f\x76\x65\x72\x73\x69\x6f\x6e\x20\x28" \ +"\x30\x30\x31\x2e\x30\x30\x31\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x75\x6c\x6c\x4e\x61\x6d\x65\x20\x28\x42\x66\x6f\x6e\x74\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x61\x6d\x69\x6c\x79\x4e\x61\x6d\x65\x20\x28\x42\x66\x6f\x6e\x74\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x57\x65\x69\x67\x68\x74\x20\x28\x52\x65\x67\x75\x6c\x61\x72\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x49\x74\x61\x6c\x69\x63\x41\x6e\x67\x6c\x65\x20\x30\x20\x64\x65\x66\x0a\x2f\x69\x73\x46\x69\x78\x65\x64\x50\x69\x74\x63\x68\x20\x66\x61\x6c\x73\x65\x20\x64\x65\x66\x0a\x2f\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x50\x6f\x73\x69\x74\x69\x6f\x6e\x20\x2d\x31\x30\x30\x20\x64\x65\x66\x0a\x2f\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x54\x68\x69\x63\x6b\x6e\x65\x73\x73\x20\x35\x30\x20\x64\x65\x66\x0a\x65\x6e\x64\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x4e\x61\x6d\x65\x20\x2f\x42\x66\x6f\x6e\x74\x20\x64\x65\x66\x0a\x2f\x45\x6e" \ +"\x63\x6f\x64\x69\x6e\x67\x20\x53\x74\x61\x6e\x64\x61\x72\x64\x45\x6e\x63\x6f\x64\x69\x6e\x67\x20\x64\x65\x66\x0a\x2f\x50\x61\x69\x6e\x74\x54\x79\x70\x65\x20\x30\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x54\x79\x70\x65\x20\x31\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x4d\x61\x74\x72\x69\x78\x20\x5b\x30\x2e\x30\x30\x31\x20\x30\x20\x30\x20\x30\x2e\x30\x30\x31\x20\x30\x20\x30\x5d\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x63\x75\x72\x72\x65\x6e\x74\x64\x69\x63\x74\x20\x65\x6e\x64\x0a\x63\x75\x72\x72\x65\x6e\x74\x66\x69\x6c\x65\x20\x65\x65\x78\x65\x63\x0a\x80\x02\x92\x5e\x00\x00\xd9\xd6\x6f\x63\x3b\x84\x6a\x98\x9b\x99\x74\xb0\x17\x9f\xc6\xcc\x44\x5b\xc2\xc0\x31\x03\xc6\x85\x70\xa7\xb3\x54\xa4\xa2\x80\xae\x6f\xbf\x7f\x98\xf7\x5a\x84\xba\xce\x2d\x03\x6a\x6b\x51\xb8\x48\x49\x31\x59\x1d\x92\xe5\x06\x9e\x62\x26\xd5\xad\xcc\x5d\xe4\xf8\x10\x7a\xa6\x9a\x35\xb5\x5f\x6a\x9b\x4b\x4f\x93\xc5\x6c\x23\xbc\xc6\x1d\xd7\xbf\x8f\x32\xf2\x1d\x58\xe4\x1a\x5f\x79\x0c\xee\x2f\x02\xaf\x49\x86\x95\xe9\x0c\x1d\x0b\xd2\x59\xe7" \ +"\x5b\x02\x19\x30\x0b\x0f\x69\x2c\x33\x77\x9c\x2a\xa6\x7a\xe8\x51\x7a\xbe\x12\x30\x08\x45\x22\x4a\xf6\xad\x5d\xa9\xdb\x9a\x1a\x3a\x40\xfb\x06\xb3\x6a\x9c\xcd\x69\x12\x55\x07\xfc\x2d\xe9\xd0\x41\x84\xc7\x60\x42\xf0\x3f\xcf\xd1\x53\x84\x00\x23\x97\x2a\x81\x2a\xb9\xb3\xcb\x56\x70\xc1\xce\x27\x59\x71\x1c\x75\x29\x42\x62\xd6\xf2\x91\xaf\x9b\x7c\x76\x07\x1e\xda\x7e\x7a\xd0\x26\x21\x62\x32\x22\xb9\x36\x08\x7a\xb2\x7f\xfe\x5f\x07\x86\x47\x06\x65\x92\x18\x3d\xc3\x47\xae\x92\xe6\xbf\x56\xb1\x7b\xed\xce\x13\x68\x46\xf6\xa2\xa3\x76\xab\x8c\x0b\xc0\xff\x4e\x34\x7d\x20\xfd\x0e\xc7\x7e\xfa\xb1\xf0\x63\x31\x00\x14\x8d\x2a\x7d\x2f\xd2\x1f\x12\x5a\xaa\xcd\x8f\xdb\x99\x79\x83\x2b\x67\x0d\x8a\xaa\x76\xd2\x12\xba\xb5\x61\x46\x19\x90\x96\x0c\x35\x6e\xb8\xd8\xe9\xf3\xc6\x5d\x9d\xfe\x7f\x8c\x2c\x8a\x7b\x2b\xe9\x9e\x63\xff\x6c\x86\x88\x3c\x1d\xe5\x07\x8d\xa3\xb9\x1e\x03\xe4\x84\x0d\xdd\x6d\x30\xe3\x3c\xe3\x87\x75\xdc\x80\x43\xc3\x93\x20\x76\x47\xbe\x83\x0b\xf5\xc8\x5d\x1e\xe2\x20\x72\x1a\x27\xe8\x8a\x21\x6d\xe8\x01\x0b\xe9\xd4\x4e\xdd" \ +"\x58\x9e\x87\x5f\x9f\x0e\x26\x1f\x0c\x6a\xff\x33\x93\x2a\x8b\xfe\xd2\x77\x06\x60\xdd\xe2\x8c\xb7\xd5\xde\x05\xcd\x0d\x8c\xfd\xd6\x7d\x67\xe3\x34\x3c\x66\x1f\xfa\xa3\x93\xe4\xa7\x3a\xcf\x9c\x44\xa6\x96\xa7\xa9\x74\x53\xc2\x96\x68\x98\x1f\x07\x9d\x26\x4c\x1d\x0a\xf7\x3f\x39\xc2\x6a\xe6\xb7\x78\x87\xbb\xc9\xd3\x52\xea\xa8\xb6\xa7\x5a\x38\x25\x6d\xa0\x90\x0d\x30\xcc\xbe\x0e\xa9\x67\x7f\x88\x66\x18\x51\x3d\x20\xe9\xe4\x9e\x12\xeb\xbd\x1c\x00\xde\x43\x11\x6e\x8f\x47\xdf\xb5\x21\x11\x42\x51\xd2\x07\x17\xba\xf5\xe5\xc6\x8f\x3e\x71\x21\x50\xec\x57\x94\x41\x2a\x1b\x6f\x80\xdf\xc4\x8c\x2d\x20\x5b\x7b\x9e\x88\x99\xa6\x90\x7e\x73\x85\xdc\xfe\xea\xc0\x7b\x0e\xef\x4b\xc7\x74\x1c\xf1\x19\x1e\x42\xe2\xf8\x9f\x8e\x2e\x29\x0a\xed\x6f\xcd\x1f\xe6\x48\xc4\x31\xc8\x32\x1d\x73\x99\x8d\xc6\xe1\xda\x9d\x56\x38\x43\xf9\x63\x32\x19\x97\x0e\xc8\x23\xba\xfa\xcc\x97\xbb\xd1\x33\x81\xa1\x44\x76\x82\x1f\x19\x86\xff\x4b\xaa\xf0\xe1\x71\x90\x05\xb2\x85\x2d\x55\xf2\x42\x0a\x0a\x41\x8a\x5d\x93\x48\xd2\xfa\xd1\x7b\x94\x87\x0c\x9c\x5e\x0d\xfa\x1f" \ +"\xd3\x9d\x52\x80\x84\x8f\x0b\x9b\x2f\xd3\x97\xe8\x8e\xfd\x52\x68\xea\xe7\xbe\xa9\x4e\x20\x5a\x02\x29\xc9\x7a\x8e\xcd\x90\xea\xcc\xc6\xe3\x38\x39\x06\x3f\x08\xed\x59\xc7\x1e\xe2\xa9\x30\xc6\xbf\x26\x72\x57\x87\xbd\x62\xfb\xe0\xd2\x9a\x3a\x57\x1a\x38\x29\xdb\x77\x7c\x6d\x53\xb6\xa9\xa6\x7b\xff\xbe\x23\x79\xb1\x25\x5c\x80\xf2\xf7\x84\xda\x95\x8c\x74\xb8\xa3\x0d\xf8\x8a\x44\x7c\xe5\xd3\x59\xd2\x65\xac\x95\xdd\xb6\x71\x24\xb6\x2e\x05\x8d\x7f\x93\x36\x76\x43\x6b\x69\xbb\x28\x35\xd0\xaa\x19\x2d\x71\xd8\x6e\x87\x38\x07\x1a\x0e\xe1\x3d\x4f\xe4\x48\x1e\x27\xdc\xc3\xe3\xe5\x99\xc4\x1c\x06\x6b\xf0\x36\x43\x06\x5e\x8f\x00\x22\xb4\x31\x0e\x29\x6f\x09\x29\x5e\xcb\xb8\x8b\x8e\x22\x8c\x8a\x5a\x19\xd8\x59\xfc\x2d\x2e\x84\xa9\x9a\xe6\x83\x0f\x14\x64\x63\xeb\x6a\x49\xb9\x59\x06\x42\xe6\xab\xca\x16\xd5\xe3\xb7\x20\x8a\x74\xfd\xd0\xe6\x79\x10\x3f\xee\x84\x45\x1c\x87\x58\x73\x12\x15\x0b\x66\xac\xc8\x25\xde\xff\x64\xdd\x50\xad\xda\x35\xd2\xfa\x94\xd3\xf1\x61\x96\xb9\x2b\xfa\x8a\x0e\x7a\x85\x1e\xbf\x36\x9e\x76\x16\x0c\xe8\x19\xe4\x3c" \ +"\x65\xce\x77\x1d\x39\x0c\x63\x24\xa7\xb6\x99\x56\xc3\x15\x46\x9a\x66\x6a\x2d\xec\x46\x97\x8f\xb9\xcf\xfc\x6a\x2e\xa8\x50\xd8\xce\x9d\xab\x76\x4d\x52\x99\x18\x36\xa5\x80\xa0\x1b\xc3\x75\xf1\x8d\x5d\x97\xe9\xef\xf4\x49\x7b\x85\x2a\x8a\x7b\x44\x9f\xe1\xd1\xab\xf2\x46\xd4\x06\xa8\x13\x74\xe4\x00\x0e\x94\xbf\x84\x0a\xfe\x53\x7d\x14\x11\x47\x7e\x8e\x38\x50\x37\x30\x7d\xb8\xac\x9c\xa3\xa1\x48\xf9\x69\xcc\xcf\xb3\xd9\x73\xb1\x02\x52\xdc\x8e\x0e\xb4\x8a\xfe\x53\x8b\x24\x46\xcb\x5b\x51\x52\xe5\x14\xfd\x4e\x84\xd5\x40\x9a\xa3\x3b\x5d\xf5\xa8\x26\x94\x30\xe4\x0d\xba\xcc\x5f\x8c\xb8\x76\x16\x82\x6f\x1b\x26\x8b\x7f\x6a\xac\xa1\xfe\x88\xbb\xa6\x30\xa2\x98\x7c\x45\x1b\xba\x32\x7e\x07\x90\x2b\x4b\xb0\x91\x9f\xca\xf4\x07\x4e\xcb\xfa\x20\x2a\xc3\x47\xba\x5a\x5c\xa2\x7e\x62\x2c\xc3\xa3\x2f\x58\x7c\x2b\xb1\x7a\xfb\xfe\x1d\xa1\x46\x62\xeb\x85\x34\x0c\x1c\xb8\x43\x91\x49\x58\x63\x45\x3c\xe3\x8e\x0f\xda\x52\xa7\x39\xe1\xe6\xda\x83\xfb\xab\x0b\x3f\xbf\x41\xec\xb2\x3f\x9f\xd5\xd3\x72\x40\xc8\x55\x49\x28\x5e\x7b\x6c\xab\x59\xa9\xce\x63" \ +"\xc4\x1f\x0f\x98\x8a\x4d\x89\xd2\xc5\xe4\xff\x49\x7e\x78\xf9\xd6\xaa\xd4\xa8\x49\x36\x7d\x71\x4e\xe2\x25\x89\xf9\xbc\xef\x21\xe7\xf4\x7d\x74\x89\x7e\xbb\x1f\xc1\xc2\x76\x79\x13\x50\xfa\x57\x30\x50\x3e\xf6\x1d\x79\xf7\x87\xc6\xc1\xfd\x94\xd3\x11\xd2\x11\xf7\x2c\xcd\x5b\x01\xbe\xc3\xec\x42\x5f\x90\x3a\xeb\x02\x2a\x4f\x19\x52\xa4\xa7\xf4\x72\xbc\xc0\x65\x17\x37\x45\x8d\xa8\x1c\x59\x3c\x74\x5b\xa2\x79\x1c\x7b\x60\xfc\xa5\xb4\x45\x38\xe8\x36\x7a\x8a\xdf\x9e\x83\x5e\xab\x52\x04\x70\x0d\xa0\x75\xaa\x92\x1c\xf1\x9a\xd3\x77\x10\xe9\x8d\x60\x5e\xa7\x0d\x25\x76\x69\x49\xd3\x61\x6d\x94\x83\xbe\x77\x2d\x7c\xd0\xe1\x27\x5e\x30\x3e\x21\xbc\xf8\x9a\xe9\x2e\x9e\x07\x90\x01\x79\x00\xeb\x47\x19\x34\x0d\x2e\x01\x19\xab\x1b\xb3\xaa\xa4\xe7\x02\x19\xb6\xe2\xfa\x60\xc0\x17\xb9\xda\xda\x10\x8c\x24\xb4\xd8\x3b\x5f\x31\xa5\xa2\x86\xfc\x2f\xa8\x41\xf2\xb2\xd3\x3e\x0a\xef\x99\x41\xdb\xf7\x48\x11\x69\x31\xfe\x55\x88\xd3\x75\xf0\xda\x4d\xdd\xa6\x29\x91\xc6\x04\x68\x88\xf1\x30\x00\x9e\xd2\xec\xcf\x1a\x91\x8c\x5f\xa4\x75\xc6\x00\xb7\x68\xa1" \ +"\x3b\x09\xbd\x08\x20\x2c\x1a\xff\x9d\x77\xf5\xfa\x31\xb0\x9c\xe3\x66\xe4\x69\x53\x18\x99\x55\xc4\x81\x85\x80\xd0\x81\xca\x3e\xcc\xad\x89\x5b\xdf\x70\xd0\xf3\x57\xb4\x6d\x52\x8d\x38\xef\xd2\x28\x56\xc8\xad\x1f\x20\xe6\x8c\xca\x3d\xdc\xb0\x5c\x6c\xcf\xb1\xd5\xa9\xee\xac\x9e\xfe\x26\xf2\x8d\x06\x73\xd9\xc1\x86\xa6\xe3\x24\xd0\x77\x56\x2c\x22\xc3\x47\x77\x5e\xea\xf1\x7a\x4f\xa9\xad\x24\xdd\x78\x44\x17\x03\x2c\x7d\x26\x4e\x48\xe6\x19\x3e\x12\xcd\xce\x42\x8c\x4f\x7d\xe5\xdf\x00\x5c\x19\x76\xfd\xa1\xdb\x33\xe4\xe5\xd4\x0d\x9b\x1a\x32\x36\x69\x36\x26\x55\x98\x31\x96\xe9\x58\xbf\x6f\x00\x7a\x93\x5f\xd7\x32\x21\xb0\xd1\x4d\x88\xc6\x06\x47\x61\x64\x98\x00\x9f\x5e\x5b\xca\x07\x94\x7d\xfe\x3a\x26\x6b\x31\x65\x0e\xc2\xa3\x0c\x4f\xfd\x99\x96\x36\x1e\x25\x8c\xbd\xf1\x8d\x2f\x39\x8b\x91\x4a\x58\x0f\xb2\xb3\x3f\xf1\x5b\x81\x1e\x4f\x13\x68\x48\x38\xd7\x25\x7c\xf2\x4d\x51\x6d\x9b\x00\xe9\x7a\xba\x6b\x5b\x91\x5c\xa2\x5a\x04\x71\xaa\x54\xd3\x84\x8e\x40\x1b\x5d\x98\xf8\x6b\x5e\x5d\xa0\x6d\xf9\xf1\xfb\x66\x82\x42\x60\x33\x70\x8c\xf5" \ +"\x97\x41\x2d\xbd\x9d\x75\xbc\x5b\x61\x31\x8a\x6b\x6a\x87\xcc\xcb\x26\x77\x21\x95\x57\x7a\x9e\xc6\x08\x8e\xda\x03\x38\xf9\x50\x56\xfd\x52\xf6\xcb\xe7\x39\xa0\x32\x34\xbb\x18\x6c\x82\xfd\xc1\x18\x33\xc9\x32\x03\x43\xb0\xbb\x7c\xa5\xac\x8e\xfc\x9c\x9b\xdc\xfc\x33\xed\x69\x5e\x30\x2c\xe9\xbb\xbc\x7b\x64\xda\xdf\x24\x72\x36\xdb\xdf\x27\x9c\x70\xce\x2e\x13\x0a\xd5\x8b\x45\x0c\x8a\x86\x2c\x82\x5e\x88\x04\x6f\x4d\x15\x73\xe1\xa2\x0f\x26\x9f\xda\x8a\x66\xab\x02\x8e\x30\x9e\x39\x5e\x3b\xb6\x11\x7f\xbe\xdf\xc4\x42\xee\x6b\x32\x9a\x02\x8e\xa7\x98\x12\x19\xe2\x01\xfd\xfb\x11\x66\x14\x6f\x1c\x61\x88\x0f\x3c\x41\xe6\x27\x31\x19\xa6\x1f\x12\x36\x04\x18\x59\xd3\xe2\xfa\x4a\xe2\xb9\x43\x8a\x1d\x12\x55\x9c\x7c\x91\x54\x11\xaf\xa7\x33\x0d\x36\x52\x61\x40\xce\xc9\x6f\xc7\xd6\xd2\xeb\x94\x37\xb5\xf1\x88\x56\xfe\xdb\x7a\x40\x67\xb3\x4f\x71\xa3\x7e\x4b\x6b\x4f\x66\xf4\x15\x93\xc6\xd2\xfb\x23\x88\x49\x0f\x20\x2d\x96\x86\xfd\x71\x53\x6f\xa1\x6e\xd4\xf2\x21\x0c\x0c\x10\x8f\xc2\xc7\x25\xe4\xfb\x6e\x07\xd5\xc6\x37\x50\x20\xd1\x8c\x22\x2f" \ +"\x66\xf9\xd9\xa6\x76\x1f\x6a\x02\x12\x6a\x2e\x92\x94\x7d\x00\xd0\x59\xd1\xf7\x37\x8f\xb1\x13\xb7\x7f\x47\x76\x14\x88\x03\xe9\x6d\x77\xb5\x73\xdf\x6e\x8b\xb6\xab\x6d\x68\x48\x3e\x98\x8f\x0e\x9d\x52\x9a\xfd\x8e\xd7\x3b\x01\x0b\x62\x6b\x8c\x0c\xf0\x90\x38\x26\x0e\xdc\xed\x9a\xae\x97\xb3\xcf\x68\xea\xde\x54\x7e\x9d\x5a\x34\x76\x7e\x60\x17\xcb\x87\x86\x29\x10\xc4\xd2\x2c\x7d\x44\x91\xe8\xec\x34\xde\x66\x83\x50\x65\xed\xda\xf4\xd7\xcd\x5f\x3a\x60\x12\x42\xd5\x5b\xf7\x3a\x2c\x39\x96\xc1\x8b\x87\x24\x8f\xec\x5e\xd1\xec\xd5\xe3\x2a\xb0\xad\xce\x57\x97\xf0\x91\xb9\x2d\xd1\xb1\xc9\x7b\x20\xc4\x2c\x9e\x53\xcb\xca\x06\x6a\x36\x5d\x2b\xd1\x0c\x72\x4c\x64\xf2\x68\xa5\x8a\x0f\x8f\x05\x21\xe4\xc3\xf3\x6f\x51\xf9\xae\x0f\xa7\x28\xa5\x33\x61\xb9\xd7\x96\x76\xfd\x16\x67\x09\x15\xb9\xee\xbd\x5e\x31\x68\x64\x62\xa5\xc4\x1f\x94\x70\x7d\xc7\x2e\x67\xfc\x4f\x64\xa5\x70\x68\x52\xf9\xdb\xcd\x22\xc6\x1f\xc6\xbf\xb5\x48\xd4\xb6\x3e\x57\x0d\x35\xab\x54\xde\x9c\x83\xc9\xa2\xad\x2f\x2c\xbb\x69\x77\x84\x2f\xe4\xb8\x24\x55\xda\x0b\xfb\xf2\x7c" \ +"\xcd\xa8\xfc\x18\xf5\x31\x54\xa1\x6b\xd3\x15\x3f\xdb\x59\x0f\x74\xc0\x12\xd0\x56\x5f\x4b\x47\xef\xf7\x69\x7c\x55\xae\x90\xdc\x18\xbc\x5e\x28\xd1\x84\xea\xe1\x35\x45\xf0\x2a\x2f\x5c\x12\xf0\x78\xd2\x8c\xa8\xda\x69\x3c\xf6\xf7\xee\xbc\xf7\x0a\xa2\x18\x88\xe2\x5b\x6b\x9d\xa8\x33\xba\x0f\x4f\x44\x9a\xe1\x34\x29\xe4\x7f\x23\x29\xe0\x61\xe1\x2c\x55\x10\xe1\x63\xc6\x30\xb6\x62\xeb\xff\xb2\x18\xd2\x3a\x0e\xc8\x54\x12\x84\x89\x23\xab\x3f\xc3\xee\xc3\xa7\xa7\x08\xcf\xe8\xd6\x64\x5b\xc3\x5a\xe9\x56\x62\xcf\xb9\xe5\xc4\x8c\xfd\xec\xdb\x96\x3e\x3e\x02\x0f\x33\xe8\x9d\x2c\xea\x6b\xbc\xdc\xd6\xd1\x2a\xa5\x12\x5e\x8f\xeb\xf1\xc0\xfe\x6a\x9b\x30\xf6\xef\x7b\x11\x8c\x0c\x65\xfb\x66\x9c\x7e\x82\x02\x26\x3e\xff\x1b\x86\xb6\x78\x17\x9e\x67\x04\x30\x9a\x4e\xec\x0e\xfe\xde\xef\x2a\xe4\xe0\x8a\x57\xd3\xec\x4e\xd4\x01\x6b\x8b\x51\x05\xee\xb9\x54\xcd\x33\x53\x43\x34\x2a\x87\xff\xf4\x7b\x9d\xb9\x74\x72\xa0\x74\xf6\x1e\x93\x7f\x81\x9c\x33\xe5\x27\x7a\x02\x7a\x91\xe5\x19\x7a\x02\x97\x07\x7d\xf6\x4c\x81\xd1\x6e\x8a\xf6\xd3\x21\xb7\x3c\xc0" \ +"\x6c\xa7\xa1\x9d\xad\xbc\x86\xc0\xb3\xcb\xc3\x88\x54\x29\x6e\xc1\x7a\x83\x0b\x4b\x7c\x53\x8b\x50\x0c\x47\x5d\xd6\xb3\x2b\x46\x8b\x5b\x35\xe4\x61\x69\x43\xe6\x76\x5c\xb7\x83\x72\xe7\x4a\x8c\x30\x87\xb4\x0a\xb8\x94\x2e\x4b\xb6\xcd\x53\x2f\x97\xce\x54\xf3\xe8\xe9\x7e\x8e\x1e\x0b\x71\xdb\xfc\x99\x12\x10\xd7\xee\x79\x9b\xff\x15\xd6\x59\x06\xc4\x03\xc9\x83\x30\xbb\x9f\xeb\x0e\x1b\x9b\xf5\x4d\xe5\x82\x70\xa8\xa4\xfd\x45\x17\xfd\xf2\xaf\x13\xe8\x9b\xa1\x1b\x9e\x5f\xa0\x5a\x4f\x6d\x85\xcb\x2a\x46\xb5\x78\xf7\xf4\x55\xbf\xa7\xff\x24\xfb\x73\x36\xbf\x4e\xd3\xb6\xfc\x05\x0c\x64\x20\x30\xc8\x1a\xea\x7b\x19\xa1\xfd\x86\xa8\x3c\x0f\xbb\x3e\x18\xef\xb1\x62\x5c\x6d\xc3\x70\x4e\xf2\xa1\xfa\xe0\xd2\x5e\x6f\x22\x64\xc4\x47\x67\x4a\x7b\xd8\xd9\xb4\xa0\x21\x40\x69\x7b\xb7\x7d\x54\x4d\x50\x63\x6d\xf7\xad\xa8\xef\x7a\x58\xe9\x75\xed\x94\x2b\x90\xc3\xff\xde\x7c\xd6\x85\x9c\x75\xf4\x07\x49\x0d\x64\xa4\x44\xaf\xbf\x5d\xe1\xfc\x80\x60\x4d\xe7\xc4\x96\xdf\x78\x38\x17\x65\x5e\x17\x32\x4c\x26\x1b\x59\xb8\x5d\x8c\x25\x4f\xf9\x42\xc7\x1b\xdc" \ +"\xe6\x72\xb0\xb3\xe4\xc9\x0c\x38\x71\x01\x19\xcf\x68\xb1\xbf\x4f\xed\x8f\xe2\x68\x5c\x15\xf9\x62\xcd\x16\x69\xd7\xb8\x8e\xb2\x6b\x08\xc2\x0d\x20\x9c\x54\x6d\x92\x98\x39\xf1\x48\x3e\x4a\x7a\xd4\x58\xb3\x39\x17\xba\x4a\x49\x52\x25\x50\xb6\xa5\x28\x59\x1e\xf4\xd1\x6e\xa3\x18\xb6\xc9\x8b\x91\xe1\x94\xdb\xb8\x01\x6d\x63\x9c\x25\xf7\xb1\x6f\x32\xd1\xdd\xd0\x4e\x00\x48\x06\xec\x4c\x4f\x3f\x84\x1a\xe3\x48\x8e\xe5\xf8\x78\xa0\x94\x9b\x5b\x33\x3d\x28\x16\xc0\x60\x8b\xc1\xc0\x29\x74\x4f\x8c\x74\x9e\xf8\x40\xa8\xe3\xae\x38\x72\x5c\xa0\x1f\xc8\x5e\x52\x63\x8b\x43\x5f\x2f\x4c\xb4\x98\x2b\x83\x95\xb1\x04\xd4\x38\xd1\xbe\xd1\x66\x7a\xe0\x48\xea\xf4\x6f\xaf\x8a\x78\x17\xcb\x09\x92\xea\xef\x5e\xf1\x1c\x15\xaa\x33\x02\xb0\x7d\xb3\xd9\x63\x53\x11\x10\x71\x7b\x6f\x44\x5e\x9c\xc8\x5a\x75\x1e\xae\x83\x2a\xa1\x5b\x4c\x55\xc7\x2c\x4b\xc7\x00\x9f\x6f\x9e\xec\x3f\xfc\x49\x43\xdc\x71\xa9\x9e\x4a\x07\x51\xd6\x95\x9b\xde\x81\x5b\x3f\xa9\xc4\xa8\xd0\xe6\x53\xa8\x04\x13\x1b\xb0\x9d\x92\x38\x2a\xfe\x8f\xab\x77\x3c\x7f\x39\x25\x6b\x54\xff\xf6" \ +"\x4c\x9f\x26\xb0\xe9\x0d\x61\x6b\x40\x37\xce\xc9\xcc\xda\x03\x8b\x7b\x96\x97\x6e\x1c\xc6\x63\xf7\xa7\x9b\x25\xb8\xfd\xd6\x15\xfd\xfa\xb3\x1a\xe9\x62\xcd\x75\x6d\x5e\xde\x0f\x97\xb8\x77\xdb\x9f\x1a\x34\xea\x37\x42\x64\x6c\xaf\xae\x11\x6f\x87\xbd\xf4\xee\xad\x17\x11\xf1\x88\x4e\x7c\x4b\xcb\x72\x87\xe4\xdd\x4f\xf4\xb4\x54\xd7\x78\x3a\xc1\xea\x11\x15\x84\x6e\x0a\x5d\x5d\x00\xb7\xf5\x86\x3d\x5f\x44\xbf\x8d\xed\x5f\x7e\x57\x3a\x95\x86\xd5\x6e\x74\xd8\xc0\x0a\x70\x26\xe8\x32\x23\x78\x39\x2d\xac\xe8\x25\x4d\xe2\x99\x6e\x83\xfd\xd2\xa8\xb4\x53\x38\x33\x38\xbd\xde\x61\xc1\x88\x8a\x2a\x94\x32\x6f\x18\x13\xfe\xb1\x6d\x2a\x04\x41\xac\x60\xfb\xa0\x36\x3a\xa5\xca\x40\x4b\x26\x3a\x4b\xb0\xd8\x62\x92\x7d\x76\xf8\x0e\x6a\xe4\xe2\x51\xf1\xfb\x7f\x1b\x17\x5c\x9d\x8c\x0c\x3b\x56\xfc\x7a\x0d\x80\x0e\xb8\x37\x9b\x2c\xfd\x1d\x2f\x7b\xbf\xb9\x9a\xa3\x72\xfa\xd8\x30\xda\x18\x29\x89\xba\xc8\xd1\x93\x56\xea\x0b\xfb\x2a\x38\xb5\xf3\xee\xa6\x87\x5c\x97\x56\xae\x59\x4f\x47\x0e\x18\x05\xb3\x57\x83\x87\x66\x3b\xba\x42\x01\x06\x48\x05\x1c\x4f" \ +"\x31\xba\xc2\x3e\xb3\x35\xba\x1f\x8f\x0f\x69\x20\xfb\xbc\x8a\x0b\xf4\x24\x64\x65\x50\xbb\xfd\x35\x5a\x9a\xd4\xb5\x7e\xd1\x3a\x0a\x37\xa8\x1b\xec\x73\x65\xe0\xc1\x67\xe7\xe7\x4c\x82\xa9\x40\xf7\x8f\xa0\x06\x0c\xbb\x3e\x73\x55\x85\x61\x83\x9d\xa4\x05\x12\x33\x45\x35\xe2\xaa\x20\xf8\x85\xc2\x3a\x72\xf3\x9c\x35\xdb\xe4\x25\x33\x96\xf0\xe3\x4a\x64\x42\x8c\x73\x64\x67\x2f\xa0\x91\x27\xa0\x4b\xde\xda\x1c\x6c\xe8\x6b\x5b\x00\x39\xfa\x88\x06\x21\x76\x73\x67\xb3\xdd\x6c\x28\x8e\xaf\xb9\x02\x0c\xc0\x42\xd5\x98\x29\xe9\xdf\x29\xd4\x55\x11\x34\x3a\xd3\xb5\x2e\xd3\xce\xbd\x1a\x08\x5a\x73\xe0\x97\xc3\xe0\xd5\x22\xa2\xbd\xde\xda\x9b\x4e\xc9\x65\xf2\x09\x38\xd7\x98\xef\xf7\x79\x03\x10\xdd\x38\x2d\x23\xf3\x92\x80\x2c\x72\xd7\x84\x65\xdc\xe9\xb4\x02\x1d\x57\xcb\xb9\x90\x10\x25\x71\x3c\xf4\xd6\x8c\xbf\x18\xc0\x25\xff\xa1\x93\xd8\x1e\x28\x9b\x58\x3c\xba\x87\x0b\x17\xe4\x2b\x9d\xcb\x66\xc4\xc5\x01\x01\x57\xda\x7e\x50\x4c\x1e\xb6\xcf\x99\x87\xf8\x06\xb5\xd7\x4d\x80\xc8\x0a\x13\x6b\x8a\xca\x54\x78\xbf\x8c\x75\x32\x20\x1b\x69\xae\xe0" \ +"\xaa\x7b\x35\x4c\x30\xd2\x06\xe3\xc3\x72\xeb\x57\x91\x96\x1a\x15\x11\xd6\xc6\xf5\x7d\x6d\x9c\xaa\xcc\x8f\xe4\x3e\xc4\x80\x15\xf3\x99\x5b\x47\xa4\x71\xa4\xff\x30\x24\xee\x69\xdc\xa3\x5d\x03\x21\x2f\x96\xf1\xd3\xbe\x6f\x9d\xea\xbd\x19\x3a\xf7\x4b\x76\xf7\xa7\xab\x76\xdf\x01\xb4\x62\x53\x00\x02\x6d\x11\xff\x74\xf4\x6b\x65\xdc\x64\x46\x15\x85\xb3\x5a\xd2\x74\x20\xc5\x18\x52\x72\x78\xda\x0e\x93\x50\xc2\x50\x45\x4e\xdf\x9d\xb7\x82\x31\x8b\xa2\x22\x0c\xb0\x2d\xf2\x67\xe8\x80\x44\x58\xe1\xb5\x95\x03\xd2\x14\x26\x9b\x06\xce\x88\x16\xaa\x5c\x9c\xa5\x74\x8e\xfa\x48\xcb\xeb\xc1\x74\xf4\x04\xd1\x37\xba\x1d\x08\x21\xc1\xdd\x49\x1b\xd4\xcc\x16\xc5\xb3\x08\x7a\x86\x08\xff\x60\x33\x02\xa9\xc1\x60\x80\xb2\x6d\x8f\x83\x32\xdb\xd0\x3a\x9f\x67\xe9\x64\x1a\x02\xb1\x81\x7a\xa8\x78\x47\x27\x73\xe4\x6c\x72\xa1\xf3\x18\x0a\xdd\x69\x00\x20\xe6\x4b\xd0\xe9\x04\x46\xf9\x62\x25\x2e\x57\x9e\x91\x3c\x55\xe5\xc7\xec\x7e\x50\xb7\xb5\x0c\x44\x03\x0f\x17\x24\x5c\x92\x6d\x3d\x18\x80\x4e\xef\x58\xe6\xd7\xcc\x5a\x93\x76\xab\x33\xa8\x5f\x5d\x17\x5a" \ +"\xf4\xa4\xac\xc9\xde\x70\x8f\xc1\xd1\x82\xc9\xcf\x76\xaf\x33\x03\x53\x90\x35\x07\x02\xdf\x92\x32\x65\xa8\x9f\x85\x1c\x42\x1d\x40\xe9\x4c\xb6\x85\xac\x44\xdf\x72\xfe\xec\x6f\x1e\x49\x89\x82\xa4\x83\xc4\xbd\x6f\x9b\x93\xd9\x40\xc2\x73\x8f\xc9\x4d\x16\x99\xe4\x53\xbf\x35\xd2\x57\xea\x15\x22\xbb\xb8\x1c\x3f\xb3\xd6\x53\x0e\x70\x20\xa9\x9f\x85\xcf\x13\xa9\xbc\x93\x6f\xba\x72\x2b\x76\x98\x19\x47\xb8\xf7\xef\x3e\x27\x7d\x08\xb0\x5b\x2e\x7f\x25\xa9\xf7\xba\xaa\xe7\x6a\x7c\x5d\x52\xcb\x87\x32\xb1\x55\x4a\x73\xdb\x4c\x60\xad\x2c\xf2\x26\xa3\xab\x0e\x00\x5f\x4c\x63\x4b\x0e\x27\xd5\x74\xb6\x48\x02\xea\xb0\x41\x62\x96\x24\x46\x56\x89\x97\xda\xf5\x8d\x11\x18\xe9\x29\xb9\x3a\xb2\x38\x36\x7a\x94\xe7\x97\x29\xd6\x60\x04\xf3\x2e\x3f\xc8\xe9\x80\xa1\x5f\x8a\xf4\xb7\x8d\x91\x0e\x19\x5b\xc5\x46\x03\xe3\xbb\xcb\xdf\x30\x78\x71\x07\x00\x82\xc1\xa0\x43\x6c\xb9\x47\xed\xab\x65\x9f\x60\x62\x22\x04\x8e\x72\x9b\xa0\x93\xc1\xaa\x30\x73\xfd\xac\xf5\x3b\x91\xb0\x37\xcb\xf5\x3c\x18\xf7\xeb\x4f\x0c\x75\x4a\x12\x97\x0e\xd0\x07\xe3\xe6\x8a\xb6" \ +"\x6b\x21\xac\xd3\xe8\xf4\x5b\x56\x50\xed\x37\x9a\xaf\x20\xdd\x11\x97\x4f\x68\xee\x19\xe2\x4c\x9b\x48\x27\x5a\xd1\x5d\x77\x36\x11\x09\xde\x3e\x12\x88\x19\x0f\x3b\xc2\xcb\x39\x96\x00\x34\x7a\x68\x54\xc7\x68\xb4\x9a\xb4\xb1\x8d\xad\xa9\x9a\x71\x23\x4b\xc6\x9d\x96\x50\x2c\xd4\xf8\xae\xe8\xfb\x8c\x4a\xd6\xbd\x29\x78\x71\x9c\x41\x10\x0f\xc9\x12\x2d\x10\xd2\x68\xf7\x26\x21\x28\xf9\x3d\x77\x99\xb3\x48\x58\x7a\x6d\xd0\x5b\xba\xe7\xf6\xc9\x9a\x1a\x24\x73\x7e\xd9\x2c\xc2\x8c\x67\xe5\x0f\xfa\xe3\x8c\x6a\xcc\x76\xa9\x9d\x54\x96\x1f\x80\xc2\xfe\x90\xdd\x54\x4f\xd3\x94\x21\x3c\x6b\xd3\xaa\x9f\xf8\x69\x3f\x72\x00\x17\xea\x5c\xe6\xf0\x76\x06\xfa\xb5\xb8\xe3\x40\xba\x28\x5e\x43\xe1\x85\x59\x0f\x10\xae\x90\xa5\x3b\x06\x49\x0d\x12\x1d\x0a\x2e\xed\x17\x33\x21\x1b\xc1\xd4\x3f\xc2\x05\x4f\x42\xb1\x51\xc8\x54\xfe\xe1\x24\x6e\xd0\xe1\xca\xd5\x59\xd6\x8c\x8e\xe3\xdf\x3c\xd6\x13\x91\x5c\x5c\xa4\xcf\xde\x9e\xfa\x0c\x92\x96\x43\xcc\x78\xd3\x6d\x5f\xba\x28\xa7\xb2\x5a\x22\x2e\xea\x1c\x6d\xab\xb6\x53\xc5\x24\x33\x45\x98\xa8\x79\x30\x47\xb3" \ +"\x16\xda\xa8\xb6\xa0\x93\xc3\xb1\xb0\xc9\xea\xd5\xd1\x87\xde\x09\x01\x9d\xaa\xf0\xaf\xf6\xda\xff\x5c\x35\x66\xab\x16\xeb\xb4\xf8\x76\x0a\x55\x0e\x18\xda\xb8\x84\xbf\xe1\x70\x42\x03\xe7\x24\xeb\x22\xd6\xb5\x39\x68\x97\x4c\x45\x65\x53\x14\x27\xaa\x6c\xa1\xef\xec\x7e\x09\x90\x1b\x75\xd1\xae\xad\x5c\x10\xb9\x19\x08\x41\x1d\x86\x43\x01\xf8\x3e\xdd\xef\x86\x0c\x0f\xfc\xcb\x8c\xb3\x34\xf7\x03\xe6\x22\xb8\x66\x52\x76\x4c\xda\xfe\xf2\x18\x73\x16\x77\x5a\x04\x95\xec\xb0\x74\x44\x4d\x7b\xc9\xc0\xff\xbc\x6b\xc3\x03\xd9\xb8\x6a\xdb\x74\x51\xcf\xc1\xe3\x65\x29\x1d\xe8\x48\x55\xec\x97\x4a\x5d\x96\xa6\xab\x9b\x51\x83\x51\x6d\xab\xb8\x25\xbe\x72\x6a\x71\x90\xea\x4c\x8f\x5c\x62\xbe\x70\x97\xc6\x97\xb5\x63\x07\xb6\x32\xbe\x9d\x8d\x11\xc7\x94\xe6\x0e\xf0\x5f\xee\x8b\xa1\x60\x55\x89\x9a\x4f\x43\xa8\x65\xfd\x7e\x17\xa5\x8f\x2f\x21\x9d\x64\x06\x82\xfd\xbc\x42\x15\xcd\xf3\x74\x3e\xf1\xa1\xb1\xc7\xea\x3d\x87\x37\x71\x19\x99\x1b\x81\x95\xbd\x8c\x70\xd3\x31\xb0\x26\x2c\x6e\x1d\x87\xb2\x7a\xe9\x03\xa6\x61\xaf\x3d\x9f\x62\x3d\x36\x2e\x3e" \ +"\xf6\x89\x11\x96\xf9\xa5\x63\xd3\xac\x4c\x07\x68\x27\x6a\x77\xdd\x9f\xd2\x60\x21\xec\x57\xa4\x70\x2f\xe2\xf7\xec\x8c\xb9\xb6\x14\xc9\x33\x58\x61\x34\xc6\x46\x31\xf8\x60\x33\x52\x73\xa9\x4e\x49\x70\x7b\x6a\x78\x71\xb8\x5d\xc2\xe0\x44\xd3\xc8\xed\xd1\x29\xa0\x7f\x59\xa3\x37\x09\x1b\xfc\x4e\x5d\x93\x8d\x0c\x9c\x2c\xe2\x6a\x7e\x9f\xb5\x6a\x54\x19\x27\xdc\x29\x86\xb8\xad\x45\x8d\x80\xdd\x39\xc2\x38\x29\x94\x6b\xf2\xf1\xae\x81\x98\x7b\x51\x65\x01\xcc\x09\x6d\x9a\x61\xa9\x3f\xa7\x34\x60\xef\x3f\x74\xa3\x7a\x9e\x5e\xdd\x23\x5a\xb8\x45\xba\xdc\x9b\xcd\x41\xbf\x1f\xd1\x3e\x78\x9c\x4d\x9a\xd4\x3a\xa5\xd0\xfe\x41\xcc\x94\xc8\x79\x4e\x81\x4f\x79\x27\x22\x03\xa9\x76\x78\x34\x23\x77\x8e\x1d\x0f\x90\x9c\x5a\x86\x65\x69\x0b\x70\x20\x4a\x00\xdb\x9f\x84\x64\x07\x6a\x58\x8e\x2a\x9f\x9f\x85\x0b\xaf\x5c\x58\x90\x0c\x37\xb9\x2f\x8e\x1f\x2b\x27\x10\x53\x7a\x36\x07\x96\x9e\xd7\x0e\x8f\x88\x93\x8d\xe7\x9d\x43\x98\x77\xa4\x72\x9f\x47\xd2\x90\x62\x7f\x2c\x84\xda\xaa\xb7\x06\xb9\xd2\x5e\x5f\x63\xf0\x74\x1e\x7e\x4c\x73\xd4\xf6\x66\x5c\x60" \ +"\x9f\xfc\xb1\xad\xee\x57\x91\x78\xef\x53\x67\x94\x6f\xc1\xc8\x9d\xc7\x54\xf5\xa7\x44\x2b\x09\x45\x37\x53\xa4\x6d\x5a\x2e\x65\xd7\x24\x17\x4a\xaa\x49\x1f\x97\x3f\x0d\xe9\x97\x6b\xf8\x1c\x5c\x23\x46\x05\xeb\x55\xdb\x14\xd5\x99\x9d\xf9\xb0\x25\xff\xbf\x31\xdd\xc3\xf3\xcd\x96\xee\xea\xa8\x89\x99\xc9\xde\xcd\xc7\xa2\x77\x92\x29\x59\x69\x72\x90\x1b\xc2\xa7\x0f\x11\x66\x9b\x51\x14\x40\x19\xeb\xd9\x3f\x9a\xf2\xe1\x0d\x21\xb6\x26\x74\x2f\x6b\x32\xcf\x6e\x1d\x88\x37\x21\x8b\x88\xd6\x3f\x5c\x7d\x5a\x76\xca\x07\x0d\x2d\x2b\xa2\x6a\x35\x8f\x0d\xbe\xab\xe2\xc4\x90\x11\x31\x88\x78\xf6\x63\x1c\xdb\xb8\xab\x91\xe8\xf2\xe1\x56\xd8\x1d\xfb\xf9\x29\xf4\x90\x6f\x02\x0d\x43\x45\x61\x3b\xca\x5c\xfe\x47\xbd\x06\x77\xb4\xba\xcb\x22\x12\x55\x73\x67\xb2\x0f\x8b\x2a\x9a\x27\x18\x00\x13\x16\xf0\xff\xfc\x5d\xd9\x97\x76\x59\x4c\xe4\x75\xc8\x89\x0d\xbe\xf7\xff\x18\xfd\xa2\x18\xb8\x14\x46\xad\xf2\x41\xff\x0e\x55\xeb\x63\x67\x83\xb5\x54\x50\x3f\x9c\xb8\xcc\xbf\x3d\x9c\xfc\x3b\x25\x6d\xe5\x66\x8b\x5e\xb2\xb2\xa4\xe7\x31\x9b\x23\x38\xc4\x0f\xa9" \ +"\x90\xfb\xd7\x59\x81\xe6\x48\xdb\x8b\xc5\x4e\x6d\x66\x19\x30\x2c\x7b\xd3\xd8\x6a\xb9\xed\x7c\x85\x27\x25\xa2\x14\xd3\x86\x9b\xa8\x0b\xde\x98\x8f\xd3\x70\x85\x88\x15\xa9\x59\xbb\x5c\x3d\x90\x7e\x8e\xa5\x5b\x40\x2d\x29\x38\xa4\x6c\x31\xf1\x89\x63\x2c\xbf\x64\x0b\xe1\xa6\xf4\xb7\x0e\x45\x8d\xb8\xc1\xdc\x48\xd3\x43\xdf\x10\x2b\xe3\x22\x57\x5b\x20\xe5\x54\xa2\x71\xfb\x7d\xda\x76\x1f\xfe\x10\x21\xaa\xc9\xd1\x31\x1e\x71\x68\xc1\xd4\x52\x40\x50\xd6\x20\x95\xd9\xf4\xed\xc1\xdf\x68\x4d\x80\xe4\x8c\x37\xfc\xcc\xe5\xbb\x24\x63\x99\xf1\x8a\x87\xab\xa9\x3e\xfa\xb8\x3f\xa7\x8b\xb7\x39\xaa\x24\xd9\xc9\x81\xa9\xde\x4e\x99\x41\x99\xc3\xd3\xe5\x9f\xbf\x00\x91\x0c\xd1\x19\xf7\x7a\x13\x6c\xad\xa3\xbb\xeb\xfe\x57\x50\x19\x6e\xb3\x9e\x30\xe8\x14\x8a\x51\xc6\x4e\x12\x2c\x4b\xb5\x12\xee\x60\x3d\xf7\xe5\xfe\x02\x37\xa9\x20\xb4\x88\xb1\xa1\xd5\x84\x80\x6c\x5d\x9f\xc9\xd4\xee\xdf\xe9\xba\xf3\x04\xf8\x05\x21\xd6\xc1\xd6\x5f\x33\x8d\x3c\x48\x3f\x8e\xb8\x25\x7a\x76\x88\x61\x5d\x8e\xf5\x08\x93\xe0\x7e\x43\x5d\xaa\x69\x79\xe7\xab\x55\x69\xbf" \ +"\x7e\x58\x39\x2a\xfd\xb3\x55\xfb\xc1\xa3\x70\x47\x1c\x89\x68\xc7\x79\x0d\x7a\x3a\xe7\xa0\xb0\x32\xc8\x50\x41\x63\x19\x43\x81\x5b\x61\xb2\x83\xc3\x6f\x94\x86\x47\x39\x91\x71\xd1\xb1\x33\x9a\x1d\x1c\xb4\x4a\x0d\x45\x93\x60\xd2\x6c\xb0\x59\xf8\xee\x40\x8c\x55\xc4\xa9\x14\xfb\xee\xc2\x29\x38\x27\x3b\xe2\xbd\x82\xb2\x5a\xb0\xe2\x2e\x6c\x9c\xcc\xae\x55\x76\xa5\x89\xb8\xa0\x85\x59\xaa\xb8\x25\x30\x41\xf1\xe0\x75\xa4\xf8\xd5\x70\x8f\x80\x17\x82\x85\xd8\x42\xbe\x3f\xee\xb3\x54\x47\x1b\x32\x53\xc7\x5b\x7e\xa4\xc0\x4c\x6b\x64\xe5\x06\x19\xa4\x59\xeb\x75\xf7\x3d\x6d\xcd\x4c\x80\xe6\x29\xf3\x55\x3a\xbd\x80\xd8\x15\x35\x44\x50\x01\x19\xab\xcb\x47\xb0\x2e\x06\x54\x23\x96\x5f\x90\x90\xfd\xd2\x4e\x0a\x1f\xda\xb3\xf8\x5f\x51\xf4\x4f\xd7\x3f\xc4\x64\xa5\x78\x36\x0e\xb4\x7d\x98\x6a\xad\x7d\x0e\x6c\xd3\xa1\x83\xe5\x72\x38\xfc\x10\xdd\x10\xf2\x4a\x57\xa8\x79\x7f\xf7\xd4\xc8\x47\xcc\x74\xf6\xff\x9a\x18\x89\x7f\x2d\xb1\xd4\x11\xd4\x66\xec\x1d\x58\xb1\xa6\x87\x6b\xd2\xe6\xdb\x7c\x47\x62\x32\xe6\x6b\xde\x4f\xde\xbe\x25\xf1\xf2\xa7\x1b" \ +"\x75\xfd\xc9\x4c\xfb\xba\x12\x87\x60\xbf\xcf\x0f\x6b\x43\x92\xfb\x69\x66\x19\xc8\x47\xd1\xa5\x7d\xc0\x12\xe4\xa2\xee\xd6\xdd\x8a\x31\x28\x64\x7a\xf9\x14\x79\x39\xc7\x0b\x00\xf3\x4c\x39\x17\xd3\x6e\xd4\xfa\xda\x5f\x9a\x91\xb3\xad\x2d\xe9\x9b\xf6\x43\x23\xcb\x5d\x05\x02\x5b\x79\x74\x5d\x40\x45\x1f\xb6\xb3\x4a\x3b\xc6\x29\x13\x66\x33\x4c\x7e\xe0\x99\x41\xfe\xba\x5a\x10\x5b\xdc\x9a\x82\x14\xbb\x67\x8d\xf8\xbc\xf5\xfa\x8b\xbf\x30\x8a\x28\xc7\xc9\x9b\x93\x53\x3e\xfe\x50\x03\x6b\x68\x24\x67\xba\x5e\xba\xe1\x6b\xa7\x76\xe6\xc7\x55\xf1\xdb\x8b\x14\x1c\xe9\x05\x83\x90\x65\x15\xe4\xec\xf9\x73\x52\x3e\x93\xaf\xfb\xae\x80\xb0\xff\xf8\x8e\xef\x71\xa5\xfe\xee\x16\x63\xa2\xca\x6c\x4f\xeb\xf6\x20\xdc\x0b\x33\xef\x6d\x04\xcc\xb3\xd4\x56\x26\x05\xe8\xaa\x4c\x97\x83\xa5\xce\x7a\x69\x7c\x6b\x1c\x89\xc4\x63\xc2\x06\x7a\x1d\x4b\xb2\x1a\xe8\x46\x21\xe7\x18\x49\x21\xbb\xb5\xf0\x4b\x16\x72\xa3\x62\x72\x06\x5d\x02\x20\x10\x4f\x5d\x77\xdb\x99\x0f\xb6\x81\x7b\xf2\xa2\xb6\x98\xc8\x18\x0e\x5f\x30\x23\x3c\xed\x47\xb7\x98\x5c\x86\x1f\x52\xae" \ +"\x35\x9b\xaa\x60\xdd\x5d\x89\x5a\x1f\x80\x14\x83\x0f\x56\x9a\x5d\xbe\xb2\x7c\xd6\x82\x2b\x40\x86\xf9\x00\x30\xd7\x5c\xec\xca\x18\x2f\x3c\xe8\xbe\x7c\x03\x47\x91\xb7\xd7\xf0\x01\x64\xeb\xcb\xb9\xcd\x7a\xde\x29\xc7\x7f\x04\x4a\x39\x5c\x50\xe3\x6d\x51\xc5\x20\x26\x23\x35\x5e\xf5\x09\x8d\xf5\xdf\xdf\x5f\x2a\xaf\x9d\xd1\xd7\x5a\x40\x00\xf8\xf4\xf6\x19\x3c\x07\xa9\x8a\xf6\xb8\x60\x9b\x44\x5e\x9b\x16\x0f\xf1\xa9\x14\x31\xd7\xd1\x6f\xef\xc8\x90\x05\x21\x99\x8e\xef\x94\x6e\x75\x6d\xf8\x43\x62\x6d\x9d\xbb\xac\xa0\xa9\x55\x36\x00\x99\x81\xd9\x96\x43\x7c\x97\x65\x6a\x83\xcf\x86\x05\xff\x8b\x92\xc0\x00\x73\x5b\x06\x81\x3a\x3c\x67\x6a\xdf\x34\xd3\x66\xfc\x99\x07\x24\x22\x20\x88\x6f\x18\xe7\xda\x65\x72\x31\x80\xb9\x3a\xeb\x1a\x6c\x94\xd8\x02\x6d\x7f\x4c\xaa\xe6\xa7\x4d\xe6\x90\x78\xea\xb7\x4e\xf6\xcc\xe4\x86\xf9\x58\x64\xc4\xc6\xa8\x71\xd8\x2a\x23\xc1\xea\x22\xc3\x98\x7d\x4f\x4f\x18\xa1\xad\x10\xae\x2e\x43\xaa\x83\x9c\xe8\x56\x59\xad\x1e\x27\xd1\xb1\x32\x89\x54\x6d\xcb\x19\xb3\x69\x2a\x97\x8d\x38\x2f\x92\x6d\xaf\xe1\xf3\xd2" \ +"\xce\x51\xc4\xed\x9f\xc9\xa5\x37\xb5\x99\x45\x99\x75\x76\xd9\x82\x41\x8b\x44\x76\x3b\xc9\xca\x52\x81\xa2\x17\x66\x3d\x9b\x6d\xce\x7d\x29\x6f\x8b\x53\xae\x85\xf2\x2c\x02\xeb\xba\x3a\xf7\x63\x88\xad\x6a\xfa\xf8\x22\x98\x85\x03\xd0\xaa\x81\x17\x3c\x49\xd4\x2e\xbf\xbe\x58\xcf\xdd\xa4\xb2\x2d\xd7\x83\xcc\xe1\x75\xad\x8a\xb4\x03\x00\x0f\x0e\xdd\x49\xb8\x16\xa7\x53\xd8\x1f\x89\xfe\x6c\x5a\x15\xeb\x05\x44\x8f\xec\xda\xb1\xaa\xef\xb4\x08\xa8\x8c\xe2\xbd\x10\x91\x3e\xa3\xe1\x5d\xcd\x25\x78\x62\x81\xf9\x81\xfd\xd5\xae\xc8\x13\x8f\x8c\x09\xb1\x32\x69\x86\x45\x71\xf4\x85\x06\x78\x19\x9b\x84\xfe\xe2\xcf\x2b\x38\xa8\x45\xa9\x5f\x53\xa6\x22\x45\xd5\xbb\x62\xf3\x77\x8f\x79\xf9\x77\x81\xa5\x67\x92\x8c\x0d\x88\xee\xa0\xaa\xfd\xab\xd4\x62\xef\xac\xc3\xf9\x44\xcf\x3c\x18\x82\x80\xa7\xa3\xb2\x82\xdc\x06\x8b\xc6\xc9\x6e\x1a\x5b\x9b\x90\x8f\xd4\x55\x6a\x32\xc6\x4a\xd2\xa8\x92\xe8\xac\x1e\x98\xce\x45\x2c\x2f\x58\xa5\xb4\xdd\x2d\xfc\xf8\x2f\x1a\x21\x8e\xbd\x4d\x4d\x14\xb9\xf7\xf9\x58\x43\x75\xf9\x97\x76\x39\x12\x89\x80\xbd\x86\x94\x55" \ +"\x07\x2f\x3c\x8e\x6e\x69\xfc\x2d\xa5\xbb\x86\x32\xff\xb4\x38\x82\x89\x4c\xbd\xda\x98\x2e\x94\x2c\x01\xef\x2f\x48\xc0\x46\x0e\x4a\x5a\x88\xf5\x23\x28\xab\x1d\x11\x61\x4d\xb8\x20\x26\x26\xfc\x0c\x00\xe2\x0b\xde\x84\xb7\x79\xd1\x53\x03\xa4\xf3\x20\x6f\x6d\x91\xcb\x39\xf1\xc0\x05\x6b\xa4\x80\x03\xda\x45\xb2\xc8\xde\x2d\x41\x69\x6e\x73\xb8\x4b\xf3\xdd\x31\xe2\xaa\xbd\x31\xf6\x81\x21\x96\x26\xcb\x03\xd6\x6f\xce\x96\xa8\x89\xa2\xe4\x03\x60\x69\xb8\x1b\x6a\x51\x20\x93\xe6\x3c\xdb\xc7\xb0\x4a\x64\x12\x50\x8c\x46\x80\x73\x77\x6f\x52\xac\x08\x06\xa8\xbc\x38\xc5\x70\x9f\xa9\xd8\xc8\x5a\xfb\x68\x70\x13\xb3\x47\x3b\xb5\x8a\xe0\x9e\xfc\x94\x32\x41\x37\x21\x78\x8e\x89\x6c\x14\x8e\xec\x90\x59\xc5\xbe\xbc\x13\x66\xe3\xf0\x26\xaa\x81\x7b\x45\x7b\xc1\x0d\x25\x85\x2c\xa7\xd2\x8d\xac\x9a\xd0\x2a\x9c\x23\x7e\xb0\x01\x62\xc1\x87\x66\xeb\xe5\x16\x22\xbb\x12\x6f\x40\x53\x6b\x11\x9d\xf1\x75\x3b\x08\xd3\x3c\xc8\x57\xb8\x59\x84\xf9\x3c\x12\x51\xed\xe1\x35\xdd\x83\xff\xda\x40\xef\xc2\x07\xb5\x28\x03\x2e\x6c\xdc\x34\x6c\x3e\xfe\x8c\x25\x74" \ +"\x0f\x28\xa9\x5a\x2f\x88\x66\xfd\x07\xdf\x84\xcf\x3c\xea\x15\x86\x9b\x3f\x70\x25\x48\xde\x37\x3b\x14\x22\xa7\x47\xde\xdd\xa4\xa1\x5c\x83\xf4\xeb\xf3\xed\xb8\x81\x4d\xa5\xa0\x8b\xab\xea\xea\x45\x71\x80\x5d\xd7\x09\x54\x29\xd5\x23\xa4\x18\x78\xcc\xb4\xb2\x99\x2f\xf5\x39\x16\xaf\xce\x0c\xaf\xcb\x81\x27\x5d\x7f\x12\x0c\x37\x2b\x24\xfc\x01\x68\x74\x3b\x87\xc1\x91\xb7\x29\x3e\x4e\xa5\xbd\xe8\x80\xe0\x0b\x8e\xff\x02\xdf\x5f\x50\xdb\x57\xf9\x79\x1f\xb5\x32\xf1\x1f\x7f\xae\x63\xee\xb0\x74\x41\xdc\xa0\xbd\x19\xcc\x67\x14\xe7\x2a\xc3\x22\xb4\x69\x79\x6e\x63\x95\x8b\x01\xdd\x7c\x43\xac\x2f\xbd\xcf\x0e\xe5\x4f\x9e\xbb\xcb\x7e\xec\x0e\x35\x79\xf3\x84\x4e\x27\x48\x07\xa5\x16\x4e\x29\x65\x80\x14\xa8\x88\xc6\x6d\xe2\x20\x87\xa8\x68\x9b\x73\x39\x32\x42\x11\x48\xf5\x7c\x46\xbc\xc2\x90\x59\x8c\x55\x08\x0a\x81\xe3\xa7\x0f\x0f\xc9\x36\xef\xc2\x9a\xcc\x81\x1b\xbe\xf5\x66\xa6\xb2\xc9\x07\xc5\x4e\x95\x45\xf5\x04\x8f\x04\x54\x0d\xd9\x3b\xf2\xdf\xe2\xc7\xe7\x76\xbc\x37\x73\x38\x0f\xd9\x03\x00\xb5\xbe\x03\xa2\x7f\x78\xce\xb5\x08\xe1\x9b" \ +"\x94\xca\x75\x46\x60\x51\xf6\xa5\xfd\x73\x94\xd9\x8a\x2c\xcb\x24\x2c\xdd\x3b\x7a\x44\xaa\xf8\xeb\x58\xf2\xd1\x2a\x47\x1f\x75\x05\x95\xdd\xd8\x9a\x74\x29\xe7\x8a\x7b\x55\x80\x47\x6d\x6f\x11\x48\xa3\xe1\x6d\x07\x28\x85\x4a\x4c\x9b\x6b\x22\xc1\x72\xf0\x3d\x1f\x18\x2e\xd7\xc5\x60\x72\xd5\x12\xd6\x39\x77\x32\x12\x05\xaf\xfe\x15\xf6\x40\x91\xab\xd9\xf3\x9f\xfa\xe7\xe4\x40\xa4\x61\x3d\x96\x09\xe6\x0b\x8a\x84\x5f\xd1\x8a\x61\x57\x8b\xbe\xab\x87\x9e\xaa\x63\xc6\x12\x7f\x2c\x66\x01\xec\x5a\x49\xd6\x87\x74\x6b\xf7\xaf\x2e\xee\x33\x4f\xa3\xf9\x05\x89\x91\x5c\x8a\x17\xcf\x9e\x32\x6d\x83\x54\x3d\xb8\xfc\xe8\x14\x43\x6b\xbd\x3d\xc6\x1b\x06\xbd\x77\x22\xec\x5e\x69\x41\x8c\xb5\xf8\x20\x0c\x77\x7e\x00\x0e\xe2\x4e\x07\x79\x6f\x2f\x1e\x31\xce\xbb\x7d\xf7\xeb\x06\xe5\x22\xa1\xae\x48\x9a\x25\x5e\x08\x58\x7d\x36\xb6\x64\x2e\x54\x90\xd5\xfb\x3e\x47\xb1\x78\xff\xc2\x0e\x69\xce\x97\xb3\x90\x8c\xbf\xa7\xf8\x2c\x46\xe3\x9a\x8e\x20\xae\x9f\xc7\x9a\x4e\xa5\x44\x60\x49\x08\x0d\xf6\xa2\x9b\x30\x07\x79\x5a\xad\x28\xe2\xa6\xbd\x23\x57\xe1\x2d" \ +"\xd1\xdc\x46\x16\x9c\xd8\x27\x7e\x54\x8e\xcf\x64\xdb\x9b\xa6\x2b\xfd\xa1\xff\x8f\x94\x5d\x11\x07\x6d\xb0\x70\x0e\x57\x93\xba\x7b\x20\x9f\xfc\x53\x6f\xb6\xfa\x1c\xef\xcf\x5c\x40\x11\x1a\xd8\x00\x29\x18\x8e\xf6\x13\xac\x20\x89\xea\x45\x93\xfb\xea\xcf\x5f\x06\x71\xd1\x6b\x45\x7a\xc6\x94\x0d\x12\x1c\xee\xbf\xa8\xcd\x90\xea\xb5\xf7\xc0\x97\xb0\x5f\x9d\x3c\xe0\x1a\x78\x18\x10\x42\x66\x33\xb9\x6f\x27\x06\xcd\xbb\x10\x01\x8d\x2d\xea\x30\x90\x1a\x5c\x9b\xd5\xda\x58\x97\x00\x6f\x6d\x1c\x2c\xac\x18\xd7\xcd\xba\x2a\x77\x7c\x30\x29\xc7\x55\x51\xf4\x18\xaa\x47\x9c\x8d\xf9\xea\xc1\xae\x4d\xb8\x2f\x6b\x70\xeb\x7c\xfe\x07\xa3\x9c\x47\x3b\x7a\xe0\xc4\xd7\x47\x51\x91\xcf\xb2\x61\x76\x2d\x9a\x6d\xbe\x8f\x3f\x53\x87\x6e\xa6\xae\x2f\xc3\x21\x00\xea\xd4\xdf\x0b\xf8\xd2\x9e\x11\x8b\xef\x0f\x39\x85\xb9\x98\x47\x38\x02\x3e\x0a\x67\xf3\xf7\xb6\x51\x0a\x26\x31\x07\x83\x0a\xca\xb8\x4f\x95\x54\xd5\x7a\x85\xd0\x18\x8d\x84\x0c\xf4\xfb\xa0\x29\x38\xdb\x7b\x78\x17\xf0\x28\x1d\x20\xd5\xde\x24\x31\xad\xb0\x0b\xd1\x91\x68\x9a\x9a\xb6\xb7\x05\x3c" \ +"\x83\x46\xe0\x2f\x7d\x6e\x2f\xf6\xb4\xde\x7d\xf3\xfb\x37\x19\x93\x4d\xa4\x74\xda\x98\xbf\xf4\x2f\xc7\x44\xd0\xd1\x31\x5a\xc5\xb0\x02\xbf\x7f\xc6\x30\x10\xa8\xf3\x29\xc3\x32\xaf\x21\xac\x5c\xb9\xfe\x60\xdd\x41\x18\x24\xbb\x0a\x68\xf2\x65\xb9\xb0\xce\xd7\xa6\x52\xbd\xf5\xd0\x3e\x26\xcf\x61\xc0\x2d\x2e\x62\x42\xc9\x45\x5f\xce\xd3\xcc\xe1\x89\xcc\x64\x6e\x3a\x54\x1d\x70\x90\x33\x0f\x01\xaa\x4f\x29\xef\x4d\x01\xd0\xd1\x50\xd0\xd6\x1b\xa8\x99\xe5\xbc\x28\xfa\x0d\xf0\x17\x60\x36\xeb\x17\xca\xa5\xd7\x6d\x8f\xa3\xa1\x88\x65\x6d\x62\x66\x36\xe7\x8d\x9d\x16\x05\xc9\x59\x0a\xf1\x71\xe1\xb9\xea\x80\xd4\xce\xba\x3b\x72\x4f\x45\x2b\xab\xd0\xdb\x3f\xdb\x70\x36\x4d\x9c\x74\x96\x8c\x71\xba\x4f\x83\x6d\xe7\xcd\xaa\xfd\x83\x61\x8d\x6b\xf2\x05\xee\xa7\x20\x87\xc2\x8f\x97\x47\x16\x51\xfe\x54\x78\x67\x83\x3d\x56\x7e\x42\x33\xc9\x00\xaa\x46\x12\x26\x98\xe1\x03\x75\x62\x64\x8d\x72\x27\xa1\xbd\x92\x94\x2b\x37\xbd\x12\x9d\xb5\xb9\x07\x75\x4d\x38\xe5\x5b\x50\xe9\x4f\xa5\x8c\x18\x62\xc5\x82\x32\x46\x2c\x6f\xe6\xf1\x5c\xcc\xf6\x4e\x13\x12" \ +"\xe7\xdb\xc9\xcf\x54\xcd\x89\x8a\x71\x2d\x04\x48\x91\xcc\x03\x56\xe6\xc8\xd0\xa6\xda\xb7\xd9\x15\x59\x17\x28\x6b\xa1\x44\xe6\x60\xec\x5b\x6a\x0f\x26\xff\x84\x0d\xf8\x62\x6a\xb1\xdf\x36\xf7\x72\x52\x93\xa1\x2a\x2b\x0a\xc0\x0c\x5e\xc8\xf8\xc8\x55\xe7\xf7\xf6\xc9\xdd\xb4\xd9\x71\x0c\xde\x58\x35\x15\x06\x1a\xd6\xdc\x98\xfd\x5c\x38\x9e\x11\xe9\xda\x5f\xea\x5b\x61\x47\x94\x0b\x03\xe2\xc7\xfa\xc9\x84\x5c\xf4\x12\xd2\xf8\xd4\x59\xb6\x60\x49\x79\xfa\xde\x3b\x79\x76\x13\x1c\xdd\x7e\x30\x77\xbe\xd9\x48\xc2\x5b\x04\xd5\x11\x89\x22\xf6\x07\x06\x8f\xf5\x61\xc0\xfc\x37\x91\x52\x0a\x4d\x6f\x1f\x50\x4a\x9c\x0e\x44\x6f\x52\x4c\xa8\xcb\x09\xdc\x36\xe9\xaf\xba\xa9\x68\xf3\x02\x8f\x6d\xd5\xf7\xa3\xc4\xb5\x25\x10\x32\xda\x1c\x81\x76\xa2\xbb\x62\xca\xe2\xf4\x27\x1b\x5a\xff\xeb\x7d\x62\xce\x9b\xb3\xd3\x3a\x87\x50\x61\xdc\x20\x88\x12\xe2\x3c\xfb\x33\xaa\xa5\x2f\x04\x3f\xa0\x29\x69\x55\x17\x7a\x20\x91\x45\x55\x9f\x93\x49\xd1\xc9\xa9\x19\xe1\xa4\x06\x97\x5c\x09\xdf\x37\x89\xca\x43\xdd\x64\xa1\xf8\x0a\xd1\xc3\x1b\x92\x04\xdb\xe3\xbe\xcb" \ +"\x86\xe4\x0a\xa0\x22\xdd\xfa\x6e\xcb\x21\xba\x3c\x88\xb9\xeb\x48\x2d\x69\xb0\xa1\x24\xa9\xb9\xae\xa8\x92\x17\x39\x80\xc6\xa2\xc2\xc5\x3e\xfe\x66\xc8\x9a\x8c\x62\x28\xd0\x80\x5f\x97\x4d\x28\xbe\x58\x4b\x9c\x2f\xcf\xdc\x0b\x7d\x9f\x18\x59\x8e\x3c\x02\x9c\x19\x2c\xcb\x27\xde\xa6\x7a\x5d\xd7\x5b\x57\x39\xc7\x45\xd3\xf4\x8c\xf1\x6a\x2b\xc1\x0a\x96\x41\xe2\xa3\xca\xa5\x9b\x5d\xdb\xcf\x1c\xae\x9d\xc9\xc7\xa9\xae\x1c\x24\x75\x6a\x9b\x57\xd1\xdf\xab\x68\x48\x4c\xb4\x65\xc4\xf8\xa3\xfc\x96\x21\xe0\x76\x80\x82\x91\xd3\x1c\x50\x11\xae\x21\x9c\x6c\x8b\x78\xe1\x6f\x09\x2e\xe4\x4f\x70\x79\x23\xb5\xaa\x0c\x83\xad\xa9\x04\x28\x08\x65\x22\x9a\xe3\xc8\x39\x32\x76\xdc\x80\x15\xd0\x3e\x83\x44\xc1\x34\xa3\x23\x60\x2d\xe1\x1a\xdb\x32\xc2\x2c\x16\xb5\x53\x15\x52\x23\x64\x0a\xf1\xda\x0c\x68\xf0\xfe\xbe\x36\x30\xd5\x57\x41\xb7\x1b\xe8\x17\xf6\xa9\xb3\xa4\x37\x42\x46\xdb\x07\xd6\x80\x3a\xf4\x78\x34\xff\xd5\xaa\x51\xeb\x10\x2e\x12\xe5\xba\x8b\x76\x7f\x0c\x4a\xad\x6a\xab\xa1\x03\x6c\x03\x71\xd3\x02\x58\x5a\xe3\xca\xc4\xc3\x45\x58\xa8\x28" \ +"\x57\xf7\xd2\x05\x1a\x75\x9f\x2a\x03\x49\x94\xf7\xec\x6e\x10\xec\xa9\xb3\x16\xc6\x20\x4f\x8a\x60\x46\x06\xa1\x1b\x47\x9b\xf1\x70\x3c\xbc\x33\x86\x9a\x00\xcf\xcb\x2b\x66\x58\xb4\x8b\xef\x48\x1a\x2e\xae\x4c\x41\x0e\x87\xca\xd3\x7c\xc9\x04\xe3\x28\x77\x2e\x66\x17\x47\x8f\xa7\xa4\x4d\xc0\x87\x10\x1b\x94\x7f\x7b\xbf\xd1\xa0\x31\x5d\x8a\x5e\xa1\xb5\xcd\x50\x50\x21\x49\xcb\x2d\x24\xc2\xad\x56\x07\xea\xc8\x8a\x14\x3e\x14\x6e\x54\x10\xee\xcf\x7b\xaf\xe9\x28\x87\x33\x55\x88\x40\xcc\xc6\xcf\x97\xa2\x85\xcf\x3a\xf6\xbb\xc9\x5b\xb9\x4c\x2e\xd1\xad\x99\x47\x9e\xf1\x6d\x42\x81\x6d\x13\x46\x1e\xba\x4c\xf9\x7d\xc5\xf3\xdf\xdb\x10\x5d\x86\xe8\x3b\xbc\x2a\x04\x9b\x81\xec\x91\xa6\xf4\xde\x67\x03\xa6\x91\x96\x39\x81\x13\xfd\x9d\xf2\x42\x61\xa5\x6b\x57\xb4\xf5\xf7\x2f\x13\x22\x87\xdb\x5e\x4c\x76\x9c\xf7\x94\x2c\x8e\xa4\x14\xb8\x60\xb3\x8a\x36\x27\xd4\xeb\x60\xd7\x27\x2d\x33\xd7\x27\x2f\x77\x78\x16\xc5\xa6\x9e\x1a\x73\x15\x10\x6e\x17\xa6\x84\xd1\xe8\x67\xf8\xc8\x85\xee\xe0\x0d\x32\x6e\x21\xd3\x9a\x05\xef\x89\xe2\x57\x83\x98\xe1\x3b" \ +"\xd0\x31\xcc\xed\x51\x95\x22\xa7\x2e\xb5\x79\x6e\x1f\x6c\xe2\x0a\x50\x06\x2f\x54\xb4\xb0\x56\x46\xab\xdd\x55\x8f\xac\xe3\x78\xe5\x4b\x8c\x85\xc3\xb0\xad\x5c\x52\xb3\x61\x73\x74\xec\xe0\x46\x2c\xa6\xce\x17\x63\x00\xd5\x2f\xcb\x99\xdd\xb2\xf6\xc4\x1e\x4a\xd0\x64\xf5\x55\x88\x84\x06\xd5\x49\xc7\xf8\x3d\xce\x8d\x4a\x3d\x64\xb5\x9d\x33\x83\x5f\x74\xd9\xda\xa2\x20\x88\x0a\x73\xdd\x41\x10\xdf\x13\xa3\xac\x49\x8c\x61\x45\x43\xc7\x74\x89\xfb\xbc\x6a\x44\x4e\x19\xe1\xca\x28\x75\xa1\x72\x0a\xd0\x1d\x30\xd9\x52\xea\x4b\x86\x9c\x09\xfd\xf1\x90\x16\xba\x8b\x65\x6f\x25\x48\x5f\x21\xb1\x14\xf6\xd2\x84\x01\xff\x54\x99\xab\x8c\xde\x39\x56\x22\xb5\xe4\x27\x0d\x9e\x23\x39\x71\x10\x3d\x61\x6f\x27\x30\xc0\x58\x66\xc9\x53\x49\x71\xe3\x74\x14\x49\xa9\x87\x6b\x08\x60\xfa\x17\x19\xf2\x33\xa6\x1d\xa0\xa9\x2b\xef\x5a\xfe\xc6\xd1\x36\xf9\x1f\xd9\x17\x76\x39\xc0\x14\x45\x4d\x32\x18\x22\xbe\xa6\x1c\xb5\x31\x7e\xde\x85\xab\x00\x55\xd4\xe2\x5e\x23\x0b\xba\xfd\x2a\xa2\xe7\x6f\x29\x35\x15\x00\xc4\xd3\x11\x49\xb4\xd3\x2b\x0a\x0b\xa9\x2a\xd9\x64" \ +"\xdc\x6a\xd3\x08\x44\x2c\x41\x7c\xd6\x67\xc6\x1e\xbf\x19\x47\x36\xaf\x26\xb3\xc7\x46\x8a\x61\x6c\xff\x8a\x7d\x28\xe3\xa1\x4c\xed\x89\xb5\x97\x82\xc7\x93\x32\xca\x3f\xcc\xc9\xd2\xb0\x60\x22\x38\x43\x7b\xb7\x01\x4c\x9a\xeb\xb3\xd8\x0c\x75\xbc\x2e\x9c\xfc\x71\xa0\xe9\xc5\x55\x88\x1e\xf8\x8c\x0c\x5e\x86\x41\x56\xc3\xea\xf6\x5b\xa9\x16\xf6\xb3\x32\x09\x72\xdd\xb5\x75\x4b\xf8\xfa\xb2\x0d\x1b\x11\xfd\xf2\x2e\xd9\x26\xad\x29\xc7\x1d\x4a\x28\x23\x44\xd2\xd0\x3a\xb4\x85\xf4\x8a\x71\xcf\x22\xe1\x7a\x5c\x6f\xdd\xb7\x18\x96\x31\x07\x15\x42\x38\x3a\xa5\x72\x53\x1b\x1f\x30\x0e\x06\xa0\x42\x2d\x40\x57\xb8\x07\x1d\x7b\xf8\xe7\x4c\x01\x85\x52\x7a\x36\xc6\x2b\x8f\x87\x05\xad\x5a\xea\xc1\x0b\x0d\x9e\xc8\xd2\xeb\x22\x10\x93\x22\x0c\xa2\x7d\x11\x2a\x78\xb2\xfe\x46\xf7\x62\xef\xfd\x79\x06\xe4\x88\x8e\xe0\x54\xb5\xf4\x7a\x82\xa5\xf7\x1a\x28\x07\xc2\x4b\x45\x6d\x9a\x08\x45\x49\x13\xbb\x5d\x8d\x85\xa3\x8e\x66\xe6\xa7\x40\x3c\x52\x8c\x49\xcd\xdd\x2c\x8b\x6a\x43\x4b\xe8\xc0\xc9\xc7\xc6\x03\x8a\xe4\x8c\xa1\xd4\x39\x37\x33\x5e\x26\x59\xe1" \ +"\x5c\x25\xef\x38\x23\x32\xcb\x7b\x91\x8c\x3e\x25\x4e\x11\xdf\xec\xd3\x03\x98\x30\xc8\x49\x12\xca\xcb\x64\xb9\xab\x33\xfe\x8f\x27\x8d\x7d\x1c\xec\xb3\x2d\xea\x7e\x14\x41\xae\x61\xf1\xf2\x2d\x3f\x31\x0a\x89\xea\x89\xba\xe1\x84\x24\x36\xc3\xad\x15\xb9\xa3\x76\x7d\xf4\x42\xac\x91\x7c\xf2\x05\x15\xe6\x33\xa5\x18\x47\x9d\x74\xac\xb7\x93\xb0\x94\x88\x58\x54\x0a\x53\x16\xad\x43\xe4\x11\x25\x88\xf8\xea\x4d\xe9\x91\x6f\xfd\x1f\x4d\xd4\x6f\xde\xd7\x2e\x4d\x1d\x0a\xc0\x79\x11\xad\x46\xfc\x35\x88\x10\xb1\xa2\x1c\x71\x7c\xb5\x92\xeb\xf8\x50\x50\xf2\x5e\x15\xc0\xa2\xec\x15\xa3\xf4\xd9\x0f\xa7\x54\xc3\x2b\xd8\xdc\xb1\x45\x63\x23\x3a\xd9\xfc\xc3\x66\x0d\xc4\x69\x06\xd9\x30\xd1\xc7\x8f\x8b\x33\xe3\xb4\x50\x94\xce\xb7\x99\x1f\xf5\x3c\xb6\xcd\xc7\x99\xf4\xe8\xfb\xd1\xa9\x2a\xa3\x43\xd9\xb5\x1b\x39\x73\x6b\x4e\xc0\xfe\xec\xb7\xe6\x72\x2a\x9b\x13\x8e\x53\xcf\xac\x35\x14\xfa\x02\x96\x25\xd6\xba\x23\x08\xb3\xaa\x5a\xd6\xa0\xda\xfb\x82\xc5\x18\xbf\x17\xec\xe3\x9d\x03\x60\x20\xa8\xad\xf8\xd7\x29\x0e\x0e\x50\x86\x22\x41\x6c\x6a\x2e\xc3" \ +"\x96\x96\x7b\x67\x38\x79\xca\xd5\x6b\xf5\xbf\x81\xc0\x28\x5a\x05\x1e\x64\x77\x9c\xd0\x16\xce\x77\x30\x45\x36\x16\xe6\xd9\x61\xa7\x72\x69\x9b\xbc\x4e\x03\xaa\xe2\xd1\xa7\x93\x9a\x5a\x7e\xc1\x0c\xfd\xe4\xa5\x03\x1f\x66\x6a\x02\xeb\x12\x27\x98\xad\xb6\xc2\x7e\xb7\x72\xca\xd1\x20\x44\x62\x63\xb9\x37\x15\x74\x59\xe0\x4f\xa0\xa6\xab\x27\xb3\xad\x92\x4f\xa7\x24\x4b\xc3\x16\xf8\xb1\x61\x7a\x0e\x56\xea\x63\x14\x8a\xfc\x02\x1f\x2f\xbf\xbb\x88\xe0\xe9\xac\x1c\x3b\x4d\xe7\x7c\x56\x43\x19\x09\xde\x77\x9d\x1d\x1e\xa6\x6f\x6b\x8a\x99\xfe\x1a\x69\xf3\x5b\xd0\x02\xf9\xbc\x28\x22\x8a\x5b\x20\xab\xf6\x40\x39\x07\x91\xf3\x9b\x5d\xe4\xe4\x9e\x5e\xb9\x95\x3f\xec\xb0\xba\x23\x91\xab\xd1\xd5\xd6\x01\x9e\x8f\xb9\x21\xf8\x54\x01\x5b\xc9\x00\xae\x70\x34\xa5\xca\x18\x14\xea\x7d\xff\x8e\x23\x8a\x15\x57\x9d\x28\x57\x96\xde\xe2\x72\x77\x7f\xbe\x7b\x19\x0a\xaf\x14\x42\x23\x08\xfd\xcb\x11\x4f\xef\x4f\x31\x5c\x6f\x3e\x40\x5e\x96\x5f\x32\xf6\x13\x4e\x59\xf7\x04\x19\x92\x8e\xc9\x65\x89\x24\xb3\x5d\x50\x9e\x90\x22\xf8\xad\x14\xf5\xb4\x1e\x84\xf1" \ +"\x0a\x78\xcd\x0a\xc8\x77\xc3\xc1\x30\xcd\x8f\x30\x35\x9b\xf2\x32\x63\xb5\x9a\xb6\x2c\xf3\x05\x12\x79\x8c\x3c\x38\x8d\xd5\x9c\x9e\x7a\x1c\x7d\x2a\x98\x53\x2f\x84\x10\x36\xf6\xa4\x7b\x44\xed\x97\x14\xa1\x80\x18\xfb\x99\x24\x09\x64\xe3\xeb\x0f\xcc\x21\x45\x5a\xaf\x47\xc8\xd7\x18\x1c\x88\x7b\xe0\x70\xcd\xb7\xab\x82\x77\x9d\x57\x9b\x37\x59\x32\x79\x8f\x0c\x76\x33\x83\x6d\x6f\x27\xc2\xce\x77\x96\x59\x09\xc7\x56\x58\xcf\x20\xf1\x8d\x6a\x0b\x13\xf1\x8c\x4a\x13\xf1\x74\xba\xe0\xd8\x8b\x53\x23\xba\xbd\x7a\x40\xa8\x79\x3f\xb6\x65\xe8\x98\x60\x04\xa2\xbf\x98\x49\x0c\xf0\x37\x33\x70\xda\xd8\x81\x1e\x27\x31\xd1\x84\x18\x8c\x16\x11\xd8\xda\x78\xdd\xf8\x28\xa9\x18\x4e\xc6\xdb\x63\x56\xe1\xe9\xff\xef\x76\x0d\x2c\xbe\x91\x98\xcf\x65\x66\xa8\xcc\xd4\xb3\x6d\x36\x65\x30\x9b\x5b\xaa\x0a\x57\x83\x31\x5f\xa5\xc7\x3e\xa2\xbb\xef\xba\x07\xe1\x80\xb2\xc9\x27\xdf\xd5\xc2\xca\x41\xd8\xbc\xcc\xa1\x35\x67\xc8\x6c\x38\x77\xcd\x98\xe3\x69\x08\x37\x63\x64\xe2\xe3\xce\x68\xac\xf9\x7e\x27\xb9\x01\xf3\x86\xe2\x68\x24\xb0\xf2\x33\x1b\x53\xfc\xfa" \ +"\xdb\x02\xc9\xc5\x40\x9c\x66\xab\xac\x3b\x23\x3c\x9a\x70\x20\x0e\xfc\x4e\x5b\xa2\x36\x8b\xdf\x9a\x61\x9d\xec\x31\x21\xfd\x43\x3c\x64\x7f\xcc\x53\xeb\x07\xd9\xd7\x88\x55\x4c\xac\xa1\xb4\x36\x3d\x2b\xbb\xcf\x7d\x32\x9d\xf6\x60\x9f\xcb\x11\x3d\x1a\xb8\xce\xce\xe8\x49\x20\xde\xfc\x40\x9c\x4e\x8c\x29\x79\x49\xde\x85\x48\x62\x2d\xa1\xac\x2a\xe6\xa4\xf8\x8b\xff\x8c\x54\x05\xf4\x83\x9e\xb9\xb1\x05\x1b\xc9\x44\x45\x25\x20\x0b\x4f\x0f\xda\xc9\x29\x3d\xdc\x52\x66\x8f\x89\x5d\xa1\x5d\xb8\x85\x8c\x09\x76\xdc\xd9\xb8\x9d\xe3\xb8\x01\xdb\x23\xb7\xb7\x9a\xc3\x7b\x3b\x7c\xa6\xfb\x97\xf8\x53\xc7\x9e\xa3\xce\x04\x83\x20\x45\x89\x5d\x34\xd5\x54\xdb\xe1\x55\x92\x1a\x15\x7a\x8a\x6c\xbd\x5d\x1d\x24\x13\x7f\xb9\xfb\xba\x86\x01\x8b\x82\x94\x18\x93\x71\x99\x12\x9c\x71\xdc\x88\x63\xcf\x10\xe0\x76\x05\x7d\xf7\xdf\xbb\xff\xb0\x2d\xe1\x64\x41\xe6\x5e\xf7\x6a\xec\x8b\x30\xaa\x87\xbc\x6e\x48\xf5\x4d\xe5\x77\x79\xdd\x75\x50\xa1\x0b\x53\x6f\x68\x07\x10\xd7\xc8\x4c\x46\x1e\xeb\x6d\xff\x6c\x33\x16\x27\x76\xa6\xb9\x0a\xc9\x19\x87\x8b\x7b\x2f\xe7" \ +"\x5e\xed\x2c\xcd\xe0\x65\x9f\xdb\x34\x4b\xdb\x75\x7f\x5e\x25\x62\xa6\x1a\xda\xb6\x87\x4f\x61\x80\x2f\x50\x0b\x81\xe8\xc7\x49\xee\x14\x60\x49\x08\x0d\xf6\x96\x71\x10\x5d\x1d\x3f\x63\xb8\x7f\x30\xb8\x0f\xc9\x29\x08\x49\x14\xfe\xba\xbe\x55\x39\x6a\xdb\x32\xde\xf5\x13\x01\xe0\x7e\xcc\xb0\xd4\x2e\xca\xfd\xf6\x8b\x8b\x9d\xa5\xe0\x64\x10\x30\x32\x92\x92\xbd\xd7\x69\xfa\xdb\x07\x69\x1b\xc3\x3a\xb9\xdf\x18\x84\xc7\x79\xb7\x1c\x0f\xf2\xaa\xc4\x78\x74\x10\xc5\xd1\xe2\x39\xdd\x06\x14\x9a\x62\x32\x64\xd1\x44\x23\x39\x4d\xa8\x8b\x65\xb3\x49\xb6\x9e\xed\x36\x8c\x27\xb5\x6c\x9a\x8b\x70\xb9\x70\x58\x33\x7d\x5d\x1a\xca\x4d\x9d\x30\x58\x42\x4a\x40\x37\x99\x4e\x7b\x9c\xab\x3b\x2b\x0b\x8e\xf9\x89\x19\x88\xdb\xf4\xd2\x75\x2c\x9c\x88\x50\xe0\xec\xd5\xbe\x47\xfc\x87\x25\x5f\x07\x05\x1c\xac\xf1\x1b\xd9\x8c\x13\x2a\x8a\x6b\x47\x0c\x4b\xb3\x70\x1d\x81\xbf\x09\x8d\xb3\xff\x01\xa2\x07\x76\x69\x2f\x31\x69\x2c\x14\x56\xb9\x02\x7d\x92\xf1\x9f\x69\xb0\xdd\x73\xd5\x0e\x42\xca\x5f\xfa\xd5\x2b\xf8\xb0\x04\x2e\x27\x54\x13\xba\x50\xf2\x35\xb6\x9c" \ +"\x03\x2b\x08\x4f\x58\x9c\x7f\x0b\xf7\xb3\xc7\xd0\xfb\x25\xd9\x16\xcf\xbf\x80\x35\xa0\x10\x9f\xc5\x13\xd6\xf0\x1d\xc1\xd4\x49\xbf\xf4\x1b\xbd\xe5\x63\xfb\xfe\x32\x2a\xbf\xc7\x0f\x95\x8d\x51\x3c\x19\x87\x78\xe7\x28\x54\x7f\x3b\x96\x7f\x2d\x9a\x87\x7c\x6d\xfc\xba\xcc\x62\x94\xa2\x85\x0a\xea\xe8\x98\x58\xd8\x36\xf2\xce\x4e\xa0\x0c\x4e\x0a\xe4\x02\xee\x32\x09\xe6\x74\xcc\xce\xa0\x09\xc7\x0c\x0c\xe0\x0d\x99\x51\x33\xfd\x8c\xc5\x94\x2f\xc0\x0e\xbb\xff\xd8\x6e\x8d\xc6\x23\xd4\xf4\x43\x4d\x30\x57\x2e\x2e\x71\xcd\xdc\x51\x69\x6d\x09\xf8\xc2\x64\x47\xbb\xa0\x09\xdd\xb2\xb0\x77\xc4\x24\x88\x0c\x44\x22\x71\xdd\xfa\xfa\x04\xfb\x14\x89\x46\xf1\xac\xb2\xb9\xd6\x17\x37\xc4\x1f\xa0\x4c\xd6\xe6\x8b\xc0\x90\x78\xbc\xe1\xd7\x84\x21\x69\xb2\x53\x45\x5c\xc0\x70\x7b\xdd\x22\x07\x49\x91\xe9\x38\x0c\x43\x6a\x98\x4d\x8f\x4d\xd9\x66\x06\xc7\x35\x0e\xa2\x0c\x86\x5b\x3b\xa9\xb5\x12\x2f\x0b\xce\x45\x41\x42\x1b\xa0\x62\x95\x16\x18\x35\xc4\x77\xe7\x54\xd3\xf6\xe7\xda\x63\x78\xc5\x97\x1e\x99\xc0\x78\xfd\x46\xea\xfd\xef\x22\x4a\x06\xe9\x95\x9b" \ +"\xd6\x0c\x7f\x39\x5c\xe1\xc9\xe9\x74\x30\xe2\x5e\x9f\xd4\x4e\xde\x63\x74\x1d\xbb\x03\x3b\xa7\x44\x6c\xa2\x92\x7d\x06\xb2\xe6\x3c\x9e\x3c\x55\x5e\x71\x5d\x02\x4b\xc3\xea\x42\xc8\x94\x80\x32\x38\x3a\xcd\x4f\xe2\x0b\xbd\xbd\x58\x20\x43\x53\x54\xbc\x1f\xb4\x4f\xfc\x09\xb1\xc7\x35\xa3\x42\x36\x6e\xf5\xae\x71\xe1\xcc\xb4\x95\x06\x8d\x12\xfa\x96\xa8\xe5\x63\x6b\x6e\x6c\x3f\x46\x2b\x92\xd8\x40\x2a\x03\xe3\x92\xdf\xe9\x06\x8c\x6c\xee\x15\xf5\x46\x0e\x98\x5c\x6d\x8a\x68\xc8\xc3\xf8\x7d\xe6\x08\x04\x8a\x7d\xe4\xdd\xe1\x62\x92\xe6\x5b\xe1\xf7\xcf\x1d\x70\xb9\xca\x9d\xda\x12\xc1\x2d\x36\x2f\xd7\xa2\x1d\x5c\x5f\x0d\x58\x28\x81\x01\x96\x6a\xcb\x75\x4c\xb0\x9d\xa9\x3d\x2d\xc9\x43\x23\xee\x95\x15\xae\x32\xa2\x96\x78\x16\x90\xc3\xbb\xd6\xef\xb2\xe7\xa5\xc8\xa7\xaa\x6b\x62\xf2\xcd\x48\x71\xa6\xa3\x06\xc5\x39\xd2\x6a\xe7\xc0\x11\x70\x4d\x53\xab\xd8\x7f\x49\x8f\xb6\xe0\x6f\x68\x89\x7b\x77\x34\x99\x2a\xcd\xa1\x91\xae\xa7\x26\x75\x82\x52\x1f\xe4\x66\xea\x1e\xc7\xc2\xcf\x49\x6d\x40\xe7\x37\xdd\x41\xe1\xcb\x1c\x71\x02\x78\xc9\x16\x7d" \ +"\xd3\x4c\x52\x3a\x4b\xb5\x21\x79\xbd\x8a\x46\x7a\x9b\xfc\x85\x33\x23\xf1\xc1\x79\x94\x30\x2c\x9b\x7b\xf0\x09\xa9\x91\x0f\x4f\xd5\xb4\xa0\x1e\xc6\xe1\xd1\xba\x7c\xba\x35\xf0\xf6\x0d\xbc\x34\xd3\xdd\xb5\xd4\x8c\x8f\xbb\xb2\x0b\xb5\xca\x4e\x32\x37\x77\xe4\x71\x78\xe7\xb8\xa5\x7a\x79\x5e\xb5\xde\xf8\xe1\xcc\xf5\xae\xcd\x3f\xdb\xc0\xf6\x52\x65\x6d\x73\xa0\x99\x52\x83\x26\xdb\xe5\x3a\x72\xcd\x8a\x8d\x89\xed\x59\x5e\xf5\x54\xb1\xa6\x00\x26\x10\xad\x38\xf8\x43\x37\x72\xfc\x59\xfb\x92\x5d\x18\x68\x71\xb5\x25\xa4\x25\x9e\x60\x89\xbf\xd6\x15\x33\xd7\x3a\x7b\x6f\xa1\x74\x9d\x70\xd3\xbc\xd2\x34\x69\xdb\x5b\xd5\xbf\x85\xab\x2f\x66\xae\x33\xaa\xb4\x0a\x1e\xb5\x11\x2b\x4c\x0d\xf2\x88\x29\x2d\x9b\x18\x2d\x4f\x92\xda\x06\x6b\x2f\x8e\x20\x8d\x5e\xa5\x0c\x95\x54\xaa\x7a\xca\x43\x82\x7e\x27\x81\xf4\xbb\x13\xe3\x16\x6c\xea\x5e\x62\x3d\x9b\xfb\xe4\xd4\x2b\x25\xfe\x51\xde\x29\x43\x05\xe1\x7c\x35\xcb\x6f\x18\xd4\x40\x11\x55\xc2\xff\x38\xbe\x73\xc0\xcb\x37\xaa\x98\xbb\xa6\x74\x55\x42\xa7\xd5\xf7\x81\x0f\x76\x56\x68\xe0\xc3\x6c\x6d\x06" \ +"\xc8\xbf\x22\x8a\x75\x4a\xb6\xd1\x12\xcc\xb6\x8b\xb8\x1b\x6b\xaf\x0e\x91\x9b\xc5\xfb\x35\x8d\xd1\x62\x82\xe6\x02\x5b\x5b\x5a\xfe\x83\xfc\x5b\x55\x27\xd4\x49\x5a\x39\xb8\x90\x1a\xa3\x06\x20\xf3\xea\xa2\xea\xec\xa7\xea\x49\x71\x32\x4d\xa5\x81\x7a\xd3\x06\x22\xc2\xb8\x1d\x87\xe2\x5b\x72\x0e\x60\xf6\xf3\x16\xc8\xf2\xdc\xae\xe3\xf4\xa8\xc7\xc5\x37\x72\x3e\xd7\xac\x3a\x3c\x52\x29\xcd\x08\x6b\xfd\x3e\x6c\x7a\xf9\x4e\x89\x27\xa7\x0e\x23\x99\x88\x3e\xc1\xd3\x78\x31\xed\xe8\x16\xd7\xbe\x84\xa1\xfa\xf9\xae\xfd\x5a\x5d\xd2\x23\xde\x23\x3e\x3c\xcc\x6b\x3f\xc6\x79\x93\x44\xd5\x4b\x31\x32\x03\x05\x4a\x1e\x5c\x77\x0b\xdf\x85\xde\x1d\xe9\xf8\x5d\x57\xc2\x8b\x54\x34\xd6\x2c\x92\x13\xf1\x52\xcc\xa3\x9a\xfd\x82\x9f\x58\x94\x74\xcf\x1d\x72\x75\x96\x9a\x18\x51\x4e\x5f\x01\xd0\x54\xc5\xac\x8d\x03\x6b\x12\xc0\x78\xc4\x5b\x1e\x52\x5a\xe8\xa3\x0a\x8e\x60\xc6\x3e\x7e\xd4\x99\x64\xcf\x92\x7a\xe9\x5c\xbc\x93\x1b\x09\x66\xcc\x77\xd1\xf2\x47\xde\x6c\x72\xf9\xad\x3b\x0e\x43\x1a\x68\xf0\x88\xc7\x46\x83\x27\x86\x12\x01\x98\x4f\xe0\x82\x68\xc3" \ +"\xb3\xd7\x5a\xba\xf4\xee\x0c\x5a\xb5\x91\x4b\xee\x54\x9e\x6f\x3f\xbb\x79\x98\x84\xa7\x96\x8a\x3e\xcb\x28\x46\x8a\x9a\xd2\x25\x32\xe2\x45\xfd\x8f\x1a\x00\xf3\x83\x05\x8b\x4f\x30\x30\x73\x7a\x3d\x47\x29\x01\xe8\xef\x04\x60\x4a\xd1\xfd\x80\xe0\xde\x9e\x61\x96\x10\x1e\x84\xf0\xc7\xc5\x76\x0d\x47\x38\xa0\xbe\x23\xd7\x6e\xa5\xfe\x1a\x45\x2b\xc3\xa3\x1e\xf5\x8a\x30\x50\x8c\xf5\x59\x53\xa5\x41\x27\x14\x53\x73\x77\x6f\x5a\xca\x65\xac\x5b\xb2\x23\x11\x78\x2d\x76\x5b\x3c\xbd\xb4\x85\x22\x13\x89\x98\x8f\x10\xba\xd6\x04\x2e\xf2\x17\xb3\xe5\xcc\x37\xda\x16\xbc\x05\xde\x8c\x45\xc3\x2b\x1f\x22\x9f\x83\x35\x1c\x53\xd0\x9e\x70\xa3\x10\x3d\xaf\x03\x45\x71\x86\xae\x15\x7d\xa2\x5b\xb6\xfb\x78\x11\x5e\x64\xfc\xc7\x76\x23\xf8\x40\xce\xb3\x26\x79\xb0\x54\xc5\x09\x02\x2d\x6f\xf4\xa1\xfa\xc7\x82\xd0\xa7\xfa\x00\x9b\x39\x00\x5f\x27\xce\xed\x05\x17\x3a\x8e\x89\x4d\xa4\x98\xdb\x5e\x39\xed\x10\xdb\x77\x39\x3a\x65\xbd\x68\xcd\xe4\x1c\xed\x77\x8f\x63\xf1\x05\xa0\x73\x5b\xd7\xf6\xc6\x99\x3c\xba\x40\xf8\x7e\x43\x38\x9b\xb3\x37\x66\x03\x2f\x44" \ +"\x91\x29\xd1\x2d\x94\x6a\x0b\x47\xbf\xab\xf5\x21\x06\x85\xd8\x01\x6d\x80\x38\x78\xf7\x11\xa9\x96\xad\x3d\x6f\x00\x41\x02\x5f\xe5\x3f\x3b\xb9\x94\xd5\x95\x8c\xbe\x39\x97\xa3\x49\x09\xe7\xfa\x4c\x7e\xd3\x0c\xaf\x0e\x26\x92\x1e\x66\x16\x7c\x3a\x89\xef\xb5\x63\xb0\x02\xb8\x30\xc4\x84\xf8\x8c\x5a\xc2\x5f\x06\x5a\xf2\xab\xfe\xbd\xeb\x08\x44\xf4\x73\x59\xd9\x0a\x3d\xac\xfc\x4b\xba\x75\xd4\xd8\x3e\xfd\x62\x9c\xe9\x60\x8b\x37\x5b\xfb\xa8\xdd\x43\xe7\x12\x8c\xfa\x26\xe8\x8f\x41\xdc\xea\x81\x6a\xb8\x3f\xab\x77\x60\x20\x09\x2d\x97\x4a\x47\x51\xa2\x6d\x3a\xc2\x7d\xbf\xa9\xf4\x09\xbe\x25\x26\x62\x24\xee\xb0\x26\x96\x1e\xe3\x00\xbf\x3c\xbd\x00\x04\xb2\xc4\xee\xb6\xe9\x08\x7e\x0e\xec\x49\x64\x10\x96\x31\x1a\x68\x98\xc5\x84\x35\xe5\x64\xc4\xce\x07\x4a\x5b\x8f\x17\xce\x78\xfc\x34\x49\xa1\x94\x29\xa0\x89\x1d\xcf\xde\x0d\x80\x90\xbf\xa2\x3c\x18\xe2\xbb\xfa\x49\x4c\xf6\xf0\x1f\xfe\x6d\x90\x66\xf8\xcf\xd7\x2c\xb6\x1d\xca\x36\x8d\x6b\x7c\xef\xcd\xf3\x36\x9e\x00\x94\xca\x62\x41\xe9\xc9\x3c\xa9\x22\x40\x51\x3e\xcd\xe1\xe4\xe9\xfa\x17" \ +"\x92\x35\x68\x78\x44\x47\xb3\x1a\x9c\xe6\x19\xe1\xeb\x8a\x14\xc4\xdf\x48\xb0\xed\x43\x6b\xca\xd3\x20\x1f\xb8\x1a\xb2\x40\x86\xe1\x73\x08\xe3\x09\xc8\x21\x1f\x1f\x3a\x52\xfb\xf9\x36\x2e\x3c\x0c\xe9\x42\xde\x90\xf3\x6f\x6e\x19\x75\x4d\x6c\xdf\xd3\xd1\x17\x4e\xa2\x9a\x4d\x54\xfb\xa6\x59\xcf\x2d\x4e\x33\x55\x12\x33\x0e\x38\x09\x83\xba\x6f\xe5\xe6\x0b\xc5\xc4\xc9\xb8\x86\x93\x34\x0e\xb9\x91\x0e\x09\xa4\x9d\x52\x03\xfc\x2a\xf4\x8c\xcf\xbd\x4d\x0d\xe8\xf8\x8b\x0a\x89\x1e\xbd\x5b\x5c\xca\x3f\xf9\x61\xd4\x8b\x27\x9b\xfb\xfd\x0a\xf9\x0d\x73\xee\xcb\x70\x93\xba\xb9\x2e\xef\x33\x8f\x94\xfb\xa3\xd0\xfe\x79\xf0\xf3\x16\xa2\x2f\xc4\x2c\xf9\x00\x3b\x7f\x90\x52\x0b\x45\x7c\x4c\x83\xe7\xec\xa9\x61\xac\xa8\x9d\x18\x11\x3d\x6c\xe5\xb6\x99\x00\xc4\x17\x76\x28\x46\xa7\xb2\x4f\x2f\x71\x4b\x5d\x2e\x87\x94\x79\x39\x14\x96\x1c\x42\xd2\x8d\x8e\x5b\x83\x70\xef\xbc\x23\x05\xb5\x80\x02\x3b\x78\x06\xe4\xce\x82\x84\x68\x1e\xdb\x93\x52\x0c\x30\x09\x62\x33\x22\xc4\x87\xec\x73\xb2\x0a\x19\x08\xcd\x1c\xe7\x8c\xc7\xe0\xe0\xa2\x7b\x58\xc2\xca\xda" \ +"\x74\x31\xe9\x89\x70\x48\xeb\x9d\x7d\x89\x4a\x84\x31\x45\xe8\xf9\xf7\xf1\x2f\x08\x70\x05\x48\x8a\x95\x79\x02\x94\xcc\x5d\xe7\x2c\x81\x8c\x95\xce\x68\x25\xd0\xb5\x56\x43\x7a\xa7\x72\xa6\xc8\x86\xb4\xb3\x8b\x78\x10\x6a\xab\x5d\x3a\xb3\xaf\xb3\xf4\x94\x24\x53\xab\x9d\xb6\x92\x6f\x16\x00\x90\x6e\x69\x2f\x5a\xec\xb1\x2f\x2c\x23\xfa\xed\x6f\x8d\x59\x06\xba\x16\xc4\x20\xa6\x17\x8f\x11\x60\x7f\x3a\x8b\x89\x1d\xfa\xa4\x34\x8d\x01\x0d\x75\x52\x5d\xf1\xfe\x78\x8b\xa5\x01\x72\x69\x07\x87\xb4\x39\xfc\xca\xe9\x45\xfd\x26\x0b\x58\xdf\x11\xcb\x40\xa2\xaa\x7f\x3b\xa3\x5a\x08\x3a\x95\x14\xd6\x9f\x1a\xa0\x78\xf4\x7b\x5b\xcb\x1f\x56\xed\x14\xf2\x42\x0e\xb6\xce\x7f\x36\x77\x24\xb6\x29\x81\x80\xc1\x51\x13\xb6\x78\x55\x17\xd2\xdc\xb1\xca\xcc\x66\x8f\x51\xf3\xe9\x0f\x43\xb7\x9d\x60\x7a\x78\x82\x4f\x9a\x76\x24\x4e\x98\x18\x7b\x5a\x56\xa9\xc8\x14\x1d\x39\xd2\x85\x10\x34\x18\xca\x14\xad\x65\xe6\x3d\x2f\x69\x5e\xf4\x2f\xd9\xcf\x57\x57\x5d\xcc\x8a\x6e\x08\x96\xc8\xf8\x81\x8b\x86\xe1\x22\x22\x96\xf7\x46\xc2\x90\xa7\x15\x62\xa1\x07\x26\x4e" \ +"\x03\x24\x2a\x86\xa1\x9d\xcb\x57\x22\xab\x1c\xc7\x40\xba\x82\xdf\x67\x79\x58\x82\x32\xae\x0a\x32\x4f\x0d\x5c\xa2\x63\x01\x55\xa8\x7a\x3d\x84\x50\x55\x70\xee\x06\xb3\xcf\xa2\x35\x10\xc6\xfa\xda\xce\xca\xf2\xf8\x1f\x4a\x56\xc5\x85\xc1\x24\x63\x85\xa0\xdf\x37\x24\x99\x65\xa5\xbc\xb8\xb3\xbd\x24\xc6\xfe\x33\xc7\x0d\x74\x18\x0a\x87\x65\xd0\xa6\x36\x6b\x01\xa6\x61\x26\xc9\x2d\x56\xda\x2c\xa3\x3c\xad\x81\x45\x11\xcc\x37\x55\x8d\x50\x64\x58\x7f\x6c\xcd\x41\x49\x9f\xcc\xd8\xfa\xf0\x11\x79\xc4\xc4\x79\x2e\x40\x19\xd7\x58\x66\xdd\xf4\x23\xf8\x60\x72\x42\x7d\x86\x07\x53\x61\x00\x50\xa6\xe0\xd8\x16\xd5\x12\x2a\xf2\x7e\xb6\x51\xe0\x0a\x25\xc1\x2b\xae\x4a\x9f\x93\x3a\x41\xd9\x93\x6e\xd6\x5f\x7a\xae\x7d\x79\x4a\x42\x90\x4a\x63\x34\x84\x68\x69\x8b\xe1\x80\x3e\x01\xbc\x07\x2b\xb9\xde\x86\x06\xd8\x34\xd3\xd5\x53\x6d\xb0\xa6\x98\xa1\x30\xd3\x7c\xc6\xf1\x34\xed\x8b\x9b\x14\xe9\x8c\x37\x93\x44\x4d\xa6\x6a\x51\xd5\xfa\x4a\x7d\xa5\xd5\x41\x93\x5c\x1f\xd0\xf2\xa9\x5a\x1e\xef\xa5\x8f\xc4\x55\xf7\x79\x93\x26\xb5\xaa\x4b\x1e\xe0\x69\x79" \ +"\x1b\xc5\xf6\xac\x27\x6d\x06\xd1\x2a\xd0\x0d\x94\x99\x61\xf7\x26\xa8\xb9\x4c\x2a\x66\x91\xa6\x1b\xf2\x25\x88\x2d\xf5\x20\xc8\xb1\xe1\xf8\x9a\x75\xac\xb8\x25\x9c\xd0\x64\x97\x40\x10\xc1\xfe\xd5\xcd\x8c\xcf\x99\x40\x9b\x39\x2f\xed\x3b\xe7\x0a\x82\xcc\x48\x1e\x11\x3c\x4c\x73\xa1\xed\x68\x05\x26\xfe\x5a\x98\xd0\x31\xc2\xa0\xf3\x6a\x4e\x29\xfb\x8f\x68\x82\xb4\xf1\x62\xd3\xee\xc2\xe0\x24\xf2\x27\x6d\xb4\x43\x82\xd2\x2c\x08\xa2\x96\x10\x4c\x53\x28\x56\x61\x57\xbb\x2a\x32\x3f\x23\x62\xc0\x17\x8a\xec\x5a\x03\x9d\x13\x05\xfc\xe4\xd3\xef\x01\x55\xbe\x36\x90\xda\xdd\xb8\x13\x59\x4b\x8a\x35\x73\xce\x1f\x64\x63\xbb\x50\xa2\xde\x86\xa7\xee\x75\x54\x24\x3e\xb2\xe0\x93\x77\xa0\x41\xf4\xf5\x9d\xbc\xb8\xde\x2a\x35\xbc\x54\x33\x05\x16\xd6\xe5\x5c\xf9\x11\x4e\x06\x4f\x91\x5c\xc9\x35\x3a\x2d\x57\x5a\x13\xc2\xfd\x12\x44\x57\x3a\x30\xce\x55\xf1\xad\x28\x00\x26\x4b\xd2\xe3\xfe\x96\x75\xa8\x58\x29\xb4\x1f\x4d\xef\x88\x25\x6a\xde\x21\x3f\xef\xd9\xf5\x1d\x0b\xff\x5e\xb5\x84\x5b\x50\x98\x0f\xe0\xfd\xbb\x68\xbf\x5f\xb4\x37\x6c\x18\x41\x20" \ +"\x1b\x93\xc9\x66\x66\x40\xf5\x0e\xc4\x9a\xa9\x85\xbf\x75\x31\x6c\x4b\x85\x48\x5f\x30\x7e\x01\xa6\xbb\x81\xdf\x5e\x60\x27\xe1\xde\xc4\xd2\x81\x23\x18\xba\x91\x06\xad\x52\x43\x82\x61\xa7\x8a\xa7\x39\xb5\xe4\xf9\xf7\x2c\x1d\x09\x8c\xf5\x31\xa4\xd2\x77\x5b\xb0\x0f\x1f\xce\x58\xe5\x9b\x17\x48\x72\xe0\xed\xbe\xc2\x93\x85\xe9\xaa\x16\x40\xf1\xa2\xcc\x34\xd0\x8a\x9f\x1d\x5e\x19\x75\x67\x84\xe8\x41\xc6\x5a\xb7\x71\x06\x4c\x34\x8d\xc7\xa6\xaa\x80\xc7\xfb\x3c\x89\x56\x4e\x34\x10\x48\x40\x70\xae\x43\x36\x49\x3f\x37\xb7\x1e\x0b\x30\x83\x07\x5e\x97\x11\xa6\x73\x3e\x05\xdd\x47\x1e\x89\x23\xb5\xfa\xbb\x44\x1a\xbb\x33\xca\xf9\x4c\xa2\x3f\x0a\x90\x7b\x77\xd9\x9b\x0f\xd6\xd4\x34\x27\xd0\x6d\xd2\xce\xe6\xf2\xba\xfe\xaa\x8a\x34\x28\x82\x07\x66\x43\x1c\x26\x6a\x98\x7a\xac\xb8\xa6\x51\x1e\xec\x95\xd5\xec\xae\x82\x8c\x2c\x8f\xc7\x09\x76\x3a\x0b\x1e\x7e\x8b\x27\x80\x5c\x53\xf2\xcf\xc8\x9d\xf5\x93\x54\xcf\x8c\x78\x3b\x38\xe4\x91\xb1\x82\x30\x8b\x4e\x65\x7c\x2a\xe4\x81\xac\x0e\xf8\x90\x8e\xbd\x26\x9e\x3a\x55\x54\x4b\x88\xb4\xaf\x0d\xb8" \ +"\x00\x1a\x80\xea\x97\xa7\x28\x06\xa3\x08\x17\x39\x45\x2a\x59\xae\x32\x00\xd8\xba\xa6\x07\x8f\x7b\x5f\x17\x1a\x86\x7f\x7d\xc7\x75\x1a\xd7\x81\xd4\x77\x53\x02\x42\x60\xf7\x7e\xf1\x31\xab\xba\xde\x92\xea\x73\xc7\x7b\x70\x4f\x93\x35\xd2\x5f\xc0\xa6\x31\x89\xf5\x50\x78\x0e\xb8\xf2\xed\x83\x1b\x8d\x64\xb2\xb9\x36\xf5\x98\x37\xf3\x58\x2d\x7a\x30\xe5\xd6\x37\x76\x69\xde\x1a\xbd\x44\x2a\x15\x22\x39\xa5\xf6\x6d\x23\x54\x2d\x4c\xc4\x74\x7f\x58\xb4\x0a\xb3\x67\xe2\xd0\x21\x5b\x6f\x0c\xe7\xdd\xa6\x40\xc7\x5d\x57\x3a\xa4\x6c\x17\x7e\xa9\xd8\x77\x44\x68\x18\x33\x9c\x47\xaf\xb5\x5d\xb8\x7c\xab\x22\x48\x73\x5f\x94\x48\xa6\xf1\xb2\xdf\x24\x0a\x0c\xdb\x32\xac\x8b\x98\x1a\xe8\xb9\xf9\x5f\xf9\x08\xf4\x14\x4e\x88\x8d\x91\xa9\xa8\x02\xd0\x09\x1e\x25\x32\x95\x2f\x32\x11\x40\xd6\xa8\x20\x17\xe4\xe8\x1f\x4e\xdb\x4d\x08\x50\xfd\x29\x4f\x08\x7b\x41\xea\x24\x4e\x97\x17\x44\x12\x46\x0a\x09\x09\x21\x8e\x81\x73\x8f\xbf\x7f\xd1\x8d\xca\xbd\x37\x78\x10\x94\xb8\x7a\xb2\x4d\x0a\x95\x12\x1e\x06\x65\x35\x5a\x9b\xef\xfd\x52\x39\x0b\x7d\x54\x07\xaf" \ +"\x74\x3e\xd2\xe8\x70\x82\xfd\x69\x99\xcb\x1f\x78\xfb\xf1\x2d\x29\x7f\x60\x92\x0b\xbb\xb4\x73\x15\x3f\xb6\xd5\xc4\xaf\xff\xa2\x1f\xe9\x41\xc5\x6e\x2a\x88\x36\x76\xea\xb0\x03\xfc\x53\x04\x6b\x85\x13\xe2\x22\xa3\xe8\x1f\x27\xab\xb2\xf2\x24\x45\x40\x21\xa7\x8b\x51\xb8\xa0\xcf\x77\x25\x89\x28\xa5\x32\xa7\xf3\xbc\x52\x8e\x5b\x02\x00\xd1\x10\xa6\x98\x86\x71\xb9\xec\xfd\xa1\x78\x5a\x5e\xbd\x51\xc9\xe0\x3c\x42\x52\x17\x0c\xc7\xc5\x56\xc6\x10\x36\xae\xed\x79\xba\xf4\x8d\x32\x1a\x98\x78\x4e\x34\x47\x73\x28\x5e\x9c\x16\xa2\xf1\xdb\x5a\xd4\xec\x15\x99\xaa\x8e\x14\xc8\xfb\x31\x62\xc0\xad\x0e\xa7\xc7\xa7\xb0\xeb\x6f\x3d\xf3\x1e\xd7\x23\x71\x7f\x7a\xfa\x4f\xa2\x28\x82\x51\x1f\x33\xb1\xf0\x09\x1f\xc0\xd2\x97\xab\x4e\xc9\x32\x66\xe3\x4b\xc4\xef\xe8\xaf\xf0\x77\xcd\xbf\xb4\xd1\x44\x7b\x56\xf4\x72\xf4\xd1\x07\x23\x11\x10\x59\x85\x59\x2a\x09\x12\x7c\x15\xfc\x65\xf4\x58\x4f\xd6\xea\x91\x8c\x34\x76\x2f\x2c\x79\x2b\x0e\x06\x9d\x1a\x10\xac\xfc\x55\x5e\x54\x3b\x86\x13\x77\x0a\x46\x5b\x9d\xf6\x08\x4a\x20\x0f\x17\xe6\x02\xcd\xbc\x67\xed" \ +"\x5c\x13\x58\x15\x93\x87\x75\x7c\x6b\x8c\x27\x98\x33\x38\xf6\x7a\x99\xae\x6a\x91\x8c\x92\x4e\xb4\xf3\xd4\x3e\x2e\x03\x83\x89\x4e\x38\x4f\xa0\xfc\x75\x54\x7e\xc7\xc2\xf0\xe3\x17\xbc\x28\xce\x48\x44\x28\x3a\x5b\xb7\x50\x28\x1f\x41\x09\x46\x17\x22\x40\xc7\xd5\x8a\x50\x8c\x3a\xca\xd7\x73\xdf\x5c\xb5\xda\x74\xfc\xd2\xbe\xd2\x36\xa6\xf1\x42\x84\x3e\x62\x6d\x9e\x33\x34\x59\x45\x18\xab\xb0\xeb\x74\xaf\x12\x6f\x50\xa7\xd1\xaa\x96\xc2\x98\x17\x60\xa2\x29\xf4\xe8\x50\x55\x4c\xe2\x7e\xf0\xc4\xd6\x51\x28\xb7\xe1\x66\x0a\xa6\x39\xe7\xe6\xe8\x95\xa4\x74\x70\x7a\x00\xb6\x35\xc7\xfc\x37\x32\x6f\xf3\xc8\x40\xbf\x1d\xf0\x56\xbb\x7e\x85\x79\xf9\xf9\x25\x3a\xae\xd1\x27\x98\x67\x97\x83\x7f\xcf\x9a\x0e\xbc\xef\x1c\x6b\x21\x0a\x39\x52\x9e\x74\x3f\xe1\x1d\x67\x50\x86\x54\xf5\x25\x0d\x01\x46\x5f\xb4\x52\xbf\x00\x43\xf3\x43\xda\x94\x1e\xf8\xa0\x85\x5c\x53\xbe\xc5\xfb\x96\x75\x1c\xb2\x79\x11\x10\xd1\x04\xbc\x9b\x37\x52\x86\x80\x03\x68\x8e\x84\x90\x20\x65\x00\xdf\xa6\x4f\x31\x6c\x40\xe7\xa2\x06\x1b\x5e\x74\x44\xeb\xa8\x24\x73\x27\xbf\x97" \ +"\x1c\xca\xe4\x23\x5a\x35\xac\xaa\xad\x97\xec\xae\xc5\x13\x55\xd8\xc0\x9e\x80\x23\x06\x58\x15\x19\x9e\x5c\x12\xd5\x16\x88\x77\x95\x7c\xd5\x67\xc5\x06\xce\xae\x24\xc4\xc7\xd0\x44\x39\x54\x1c\xda\xfb\xd6\x4b\x9d\xfe\x2e\x3d\xe4\xbc\x57\x5d\x7d\x9b\x26\xaf\x04\x24\xa0\x1f\xb1\x46\xde\xf5\x55\xf6\x45\x6d\x2d\x4d\x97\xaf\xca\x17\x11\x8b\x42\x4d\xa6\x9b\xfb\x52\x9c\x0b\x4d\x66\xde\x14\xaa\xff\xe8\xa2\x29\x49\x1a\x59\x76\x3a\x7e\xd4\xcf\x6c\x37\x05\x88\x96\xf0\xdf\xb9\x67\xe7\x73\xb6\xbd\x27\xa4\xa2\xb6\x70\x71\x0b\x5d\xfa\x6c\xf7\xe7\x8f\xac\x43\xdf\xdd\xe0\x18\x74\x80\x77\xe8\x8f\x5a\x1b\x95\x31\xe2\xc3\xee\x42\xe9\x0f\x61\x89\xaa\x9b\xec\x7c\xb9\x5f\xc0\x79\x24\x52\x4c\xf9\x1f\x2e\x66\xb9\x0e\xf3\x1e\xf4\xd9\xb8\x9c\x9c\xcf\x23\x26\x59\x6b\xd4\x8b\x4b\xa1\x10\x4e\xe8\x4c\xd1\x07\x5c\x5e\x50\x9f\x3a\xa2\x8a\xd8\xce\xe7\x5d\x55\xc6\x8c\x5a\xc8\xaa\x4f\x76\x1a\x34\xa8\x6f\xa5\xe0\x5b\x2d\x55\x2a\xa2\x8e\x37\x00\x13\xa7\x8e\x56\x4a\xeb\x2b\xe6\x03\xa2\x5d\x21\xef\x2b\xb5\xfd\x9b\x6a\x1c\x30\x96\x2b\xea\x66\xbb\xf7\xbb" \ +"\x28\x2b\x9e\x21\x30\xf2\xd6\x5f\xb6\x7e\x03\x19\xda\x2f\xa3\x8c\xd9\x06\xdd\xc7\x39\x4c\xb6\xf4\x6e\x31\xa8\xf0\x81\x1f\xe2\xb9\x23\x12\xb9\xbd\x02\x11\xbe\x86\x89\x1d\x4c\x76\x30\xd8\x21\xbc\x67\xa0\x42\x8f\x17\xe6\xff\x18\xee\x06\x6f\x12\xd6\xa3\xf4\x1e\x24\x04\xd8\x1f\xa2\x3c\x7f\xeb\xcb\x43\x22\x45\x14\xe3\xdc\x38\x6b\x4e\x51\x0a\xa0\xa9\x13\xff\xd3\x7e\x2e\x4d\x2e\x98\x2e\x72\x87\x8b\x17\x03\xac\x34\x50\x56\x0b\x05\xbe\x33\x56\xbe\x43\x00\x4b\x11\xa0\xe5\x0c\xfe\x98\xdd\x03\xd5\xdc\xd5\xf4\x33\x9d\x49\xfb\xce\xd5\x2b\x71\xf7\xf5\xbd\x34\xe2\xfa\x6d\xd4\x04\xa8\x84\x18\x89\xa0\xaf\xdb\xcc\x9c\x20\xfd\x79\x08\xd1\xc8\x60\x58\x5d\x42\xf3\x54\x4c\x94\x8e\xe5\x56\x1f\x6a\x0a\x17\x88\xc8\x84\x98\x96\x33\x7d\xca\x0d\xca\x3f\x6e\x26\x7d\x0c\x71\x11\xa2\x5c\xd9\x18\x6c\xeb\xd1\x51\x41\xca\xb3\x3c\xb0\x0b\x5b\x3e\x2d\x7e\x60\x09\x42\x99\x86\x0b\x28\xe7\xcd\x42\x05\xf9\x5c\x63\x77\xce\x69\x6c\xcf\x4f\x2c\x3d\x0a\xb3\x12\x07\x21\x0f\x44\xcc\x28\xd6\xab\xdf\xb1\x62\x5e\xb0\xf3\xa5\x98\xe7\x9a\x01\x43\xe2\xec\x6d\x89" \ +"\xca\x48\xea\xf3\x17\x9c\x29\x69\x76\x28\x48\x70\x93\x35\x4c\x7e\x9e\xff\x91\xd5\xd6\x2b\xf1\xc2\x7d\xe3\x68\xf1\xc4\xf4\xed\x8c\xd6\x3e\xd2\xf9\xcf\x8f\x3a\x6a\xb6\x0a\x4b\xf7\x72\x13\x7f\xd2\xd9\x66\xbe\xc8\x95\x24\x3b\x89\xcc\xde\xdf\x7b\x3f\xd7\x54\xf9\x31\x95\x53\x89\xcd\xe0\xc0\x2c\xa6\x65\x6d\xb5\x62\xdb\x11\xa9\xba\x23\x0b\x6c\x83\x4b\xb9\xdc\x3a\xd6\x81\x43\x0f\x6a\xdc\x43\x4c\x07\xf7\x9a\xc9\x92\x19\xe0\x33\xa9\xb4\x3d\x49\xa9\xd8\xa3\x40\xb3\x90\x3d\xb8\xa3\xa3\x08\x71\x28\x2a\x35\x2e\x50\x32\xc7\x9c\x06\x8a\x2c\x56\x82\x0c\xc3\xfb\xbf\x63\x7a\x7f\x74\x9b\xf8\xcd\x56\xac\x31\xc5\x84\x65\x7c\x20\x17\xe1\x4e\xfc\x17\xb6\x1b\x0a\x5d\x87\xdc\x62\xf6\x3e\x9d\x86\x66\x01\x71\xf4\x41\x27\x03\x6a\xa8\x16\x8e\x10\x40\x8c\x0f\x50\x63\x23\x16\xb3\xa5\xa6\x55\x64\xe9\x5a\xe5\x12\x4e\x5c\xcc\xff\xda\xe0\x79\xda\x95\x92\x65\x5a\xed\xd1\x8d\xac\x47\xc1\x5a\xaf\xbd\xa5\xa9\x58\x1b\x0f\xc5\xe1\x84\x20\x7a\xd7\x59\x5c\x82\xaf\xa0\xba\xc9\x14\x3d\x40\xa2\x85\x03\x2b\xf2\x01\xfd\xfc\xb5\x88\xfd\xda\xa3\x82\x6f\x24\x0e" \ +"\x85\x07\xdb\xcc\x91\x22\x20\xaa\xc1\xec\x97\x4a\x4a\x93\x4c\x8a\x6b\x79\x7a\x75\x9e\x1c\xf6\x32\xff\x87\x8a\xa4\x11\x26\xa4\xd2\x4b\xae\x74\xd0\x92\x91\xa3\x36\xa1\x8e\x68\xf2\xfd\x4c\x61\xba\x5c\x83\x45\xbd\xd9\xf1\xe1\x9d\x4e\x25\x4e\x60\xdc\xc2\x03\xf6\xd6\x79\xb2\x5d\x1a\x2e\xa5\x89\x04\xdf\x61\x0e\x5e\x32\x34\xea\x32\x56\x45\x8d\xa5\x79\xca\x98\x25\x55\x16\x87\xd4\xe9\x1e\x6a\xd0\x98\x0a\xc4\x17\x90\x02\xc7\x12\x2b\x2f\xec\x53\x1e\x36\xf9\x07\x91\x74\xef\x24\xbf\x73\xab\x65\x4d\x27\x66\xa7\xf9\x98\xea\xc1\x8d\x18\x8f\xfe\x84\xf1\x31\xdd\xdf\xbd\x67\x0c\xf5\x14\xf0\xd5\x79\x98\x52\x45\xb3\xc0\xba\x06\x42\x38\x16\x16\x90\xf0\x7d\x57\x0d\xf8\x5d\x6c\xe5\xf5\x94\x0e\x3e\x83\x2d\x64\xc9\x3f\x44\x76\xf9\x42\x62\x84\x8d\x4a\x8c\x14\xdc\x51\x86\x8d\xac\xbe\xc7\x95\xcd\x5d\x39\x2d\x71\xf0\x0f\xa1\x04\x7a\xe4\x1c\x96\xdc\xb7\x58\xe2\x33\x75\x06\x6b\x7a\x27\xa5\x19\x0f\xc5\xc7\x95\x9d\x83\xd6\x2c\xfd\xf0\xf7\xf1\x8b\xe5\xe8\xd4\xda\x71\x17\xbc\x84\x93\xfa\xfc\x0e\x91\x07\xf6\x65\x1b\xbe\x9b\x1b\xe0\x14\x25\x3f\x02" \ +"\x36\x26\x05\x22\xba\x02\x6b\xdd\xa1\x42\xf8\xd9\x3f\x4f\xca\x53\x35\xfd\x7f\x57\xfc\x6c\x85\xaf\x0e\x52\x8c\x84\x96\x5e\xea\x78\x78\xd6\x20\xea\x35\x51\x3c\x6b\xff\xa6\xbc\x59\x99\x09\xad\xea\x55\xf4\x0b\x4c\xd9\xbe\x16\x10\x93\x50\x17\x71\x7e\xf1\x54\x39\x86\x54\x98\x2a\x61\x9e\xb0\xf7\x8a\xf9\x36\x6e\x67\x70\xaa\x34\xee\x6d\x1b\x83\x89\x54\x25\x35\xa2\x2d\x0c\x87\xe4\xb3\xc5\x2c\xa3\x8f\x21\x00\x7d\xc6\x2d\x7a\x5d\xfc\x94\xd0\xa3\xf2\x63\x7e\xc3\x7a\xf7\x67\x8d\x16\xd0\x94\x71\xec\xd2\xdf\x39\xf1\x80\x09\x28\x69\xcf\x6d\x45\xe5\xcc\xee\x62\x7c\x64\xe3\x11\xb9\xe2\x12\x77\xc0\x32\x18\x62\xc4\xbb\xe6\xe0\x3c\xbf\x9d\x29\xb3\x5f\x4c\x99\x06\xd9\xe8\x5d\x02\x6e\x29\x94\x8c\xcb\x09\x9c\xe1\xae\x1a\x10\x01\xb6\x14\xf2\xdd\x72\x48\x15\x8d\xe2\xd5\xc8\x11\xc6\x10\x64\xb0\xd8\x49\xf0\x4c\x06\xed\x4e\xc8\x77\x4d\x27\xf0\x9e\x1f\x94\x83\xbb\x3f\xe8\xd2\x40\xb3\xfa\xe8\x35\x4e\x28\x12\x59\x21\x27\x8c\xd1\x38\x70\xf9\x92\xde\x07\x7f\xa1\x41\x92\x21\x92\x7f\x38\x72\x20\x54\x50\x18\x70\xe5\xe6\xd5\x5e\x5b\x94\xf4\x6d\x0d" \ +"\x9d\x6f\x33\xc9\xad\xad\x42\x88\x96\x06\x6f\x6f\x9a\x0b\x11\x74\x0d\x1b\xd1\xf2\x3b\x63\x15\xa9\xde\x44\x48\xde\xa4\x3d\xd9\xc9\x35\xcd\x21\x0f\x8d\x0a\x50\x0a\xd7\x52\x7d\x2b\xa5\x36\xb8\x1a\x97\x47\xcb\xce\x32\x3a\x39\xa1\x34\xa8\x16\xf2\xb3\x7d\x6f\x2b\x5b\x57\x03\x07\x7e\xb1\x36\xa3\x94\x5d\xff\x37\x7c\x2b\x8d\x48\xa6\x22\x93\xa3\x87\x00\x32\x7e\x98\xa5\x01\xf4\x76\x5f\x60\x50\x04\xbb\xce\x6e\xef\xd6\xb7\xd1\x7d\xfc\x28\xb6\x7e\x86\x02\x2d\xb6\x8a\xb3\x02\x66\x8a\x65\x13\x5c\x86\x27\x45\x78\x39\xbe\x39\x82\xf5\x49\xdd\x17\xae\xb7\x5d\x1c\x9d\x2a\xe7\xd9\xce\x8b\x73\x26\xbc\x81\x7c\x0c\x6e\x59\x6c\x84\x33\x8e\xf4\x87\xf5\xfb\x44\x80\x38\xda\x1a\xf8\x81\x22\x9d\xa7\x54\x8a\xf5\x5f\x40\xac\x4a\x09\xfc\x11\xbc\x49\x6e\xe5\x4e\xe6\x99\xe7\x2c\xbf\x2e\x7e\x27\xf1\x7b\xdf\x2e\x2f\x27\x45\x8b\x76\x07\xb8\xb7\xa6\xab\x3d\x70\xc8\x6f\xc4\x3d\x7b\xd9\xbc\xc1\x66\xd4\x69\x5c\x00\x9f\x1b\xb0\x4a\x32\xfa\x6b\x44\x1a\xc4\xcb\xef\x00\x2a\xb8\x23\x8f\x0e\x6a\xac\x4c\x93\x70\x64\x19\xd7\x29\xaa\x7e\x5f\x6c\xda\x52\x24\x09" \ +"\x74\xb1\xb6\x7b\xfe\xbe\x38\x35\x7d\xef\x42\xf3\x91\x0a\x3d\x66\x39\x6d\xc5\x50\x9f\x61\xfd\x78\x30\xf9\x61\xb1\x02\xb9\x99\x0e\xc9\x79\xa5\x6b\x85\x76\xf8\xdc\x44\xce\x60\x89\x9a\x79\xd7\xd9\xbd\x4a\x4c\xcc\xde\x23\xde\xe3\x53\x34\x4d\xb4\x7a\x7b\xb8\xf9\xd4\xf0\x16\xc8\x88\xc2\xce\x6f\x78\xa2\xfd\xba\x9b\xd5\x95\x27\x61\xfc\x84\x5f\x46\xf1\x2f\x36\x13\x8f\xbc\x95\x94\xee\xa1\xc2\x79\x11\x5d\x6f\x85\xf2\xc9\xd4\xb7\x8a\x98\xb2\x25\xe6\x8c\x6b\x89\x7a\xa3\x4b\x05\x87\xe1\xba\x20\x32\x83\x68\xc5\x10\x57\xa3\xb4\xfb\xaa\x1b\xb5\xf1\x55\xb3\x7e\x74\xdb\xce\x4f\xf2\x05\x65\x29\xa5\x50\xdf\x42\x20\x44\x47\x58\x35\x75\xd8\xd1\xac\x70\xd4\x81\x98\x31\x6d\x3d\xec\x4f\xde\x9c\x0b\xef\x1f\xca\x3d\x7b\xcd\x3a\x80\x07\x5f\x1b\x8b\x87\x5b\x77\xc0\xbb\x0d\x63\xa5\x67\xfe\x8c\xc3\xea\x64\x4f\xe7\x9a\xb0\xe9\x52\xd6\xbf\x3c\xc1\x35\x8f\xd5\xfa\x83\x5b\x28\x91\xe1\xd4\x6a\x4d\xc9\x6a\xb9\x78\x8d\xe1\xc3\x05\x6e\x84\xeb\xbd\x5f\x2a\x5a\x37\xc2\x74\xde\x93\x5b\xac\xaf\xdc\xe8\x17\x5f\xc9\x04\x96\x66\xfa\x17\xc4\x56\x78\x1c\x2a" \ +"\xbc\x30\x2e\x90\x42\x55\x7c\x2a\xbb\x89\xd4\xc4\xe6\xf5\x6f\x93\xcc\xa1\x3f\x23\x64\x16\x90\xe8\xd0\x58\x65\x97\x0a\x1f\xd2\x5a\x01\x04\xca\x87\x78\x66\x51\x79\xbd\xc9\x2c\xde\xd1\x30\xbc\x98\x6c\xfa\x41\xad\x0d\xf0\x01\x7b\x6d\x24\xa3\x89\xac\x45\xfa\xa2\x0a\x4b\x59\x39\x66\x93\x4d\x12\x5d\x04\x68\xd8\xe1\xcf\xe5\x18\x39\xbb\xe4\x63\xda\xcc\x3a\x73\x2c\x78\xd1\x63\xc8\xd6\x9c\xdd\x8b\x11\x83\x9f\xa4\xe9\xa0\x06\x02\x1b\x0f\x3c\xcc\xdb\x12\xbe\xa4\xd2\xcb\xbc\x22\x74\x24\x86\x65\xc1\x4b\x58\xbd\xde\xf5\xae\xcb\x00\xc7\xa1\x39\x16\x04\xdb\x4d\x18\x24\x8d\x46\xd7\xdb\x1f\x5c\x69\x0a\x46\x66\xa9\xf4\xd7\xe6\xa9\x58\xf0\x9d\xbe\x05\x82\xba\xe8\x4c\x75\x2d\xe6\xb5\x73\x43\x23\xac\x0f\xa5\x1e\x7d\xb4\x39\xf5\x19\x61\xf4\xaa\xb6\xb4\x6b\x18\xe7\xc3\x8c\x61\x32\xdc\xdc\xc1\xc4\x90\x31\x20\x5a\x3e\xce\x6d\x55\x23\x87\xdc\xf9\xff\x4e\x67\xcf\x62\x9c\xe4\xd5\xfe\x16\xe7\xf7\xbf\x98\xfa\x25\x08\xac\xcc\x88\xb5\x1e\x4b\x09\xae\xe2\xaf\xac\xee\xed\x6b\x1b\xe6\x2e\xc5\xf0\x8c\xa2\xe1\x41\xa5\xf9\xd1\x31\x98\x13\x66\x60\x60" \ +"\xce\x91\x28\x27\x9b\x44\x08\xe4\xb0\x00\x70\x06\x1b\xa4\x0c\xdc\xb9\x8c\x5f\x47\xca\x7d\xea\x0f\xf6\x34\xce\x05\x67\xc6\x06\x41\x0c\xd1\x57\xdf\x79\xef\x7c\x78\x80\x9c\xc2\xfa\xef\x85\xf7\xe3\x4c\x6b\x49\x26\xe4\xf1\x21\x13\x3d\x8a\x46\x25\x2d\x3a\xef\x0d\xb0\x1b\x11\x29\xca\xe9\x3e\xdf\xaf\x9d\x24\xea\xc0\x17\xb4\x40\x3d\xe7\x67\xad\x53\xa9\xf1\x33\xc9\x51\x43\xd9\x4f\xf6\xcb\xf7\xe9\x75\xfd\x99\xfc\x32\x36\xfb\x78\xfe\xd7\x69\xa8\x2f\x80\x3d\x8b\xf3\x5b\x8e\xa6\xb3\x1a\x61\x41\xab\xa7\xf4\x72\xbc\xc0\x65\x17\x37\x73\xcd\xde\xd1\x3b\x6f\x53\x93\xbc\x1a\xa3\x7b\xf4\xfc\x62\x94\x68\x6e\x51\x1b\xa7\x43\xc8\x55\xfb\x50\xa3\x75\x24\x4e\x89\x5f\x22\x3b\xa3\xac\xa4\x59\xf7\x48\x40\xb5\x29\x56\xff\xb8\x9e\xee\xb9\xe2\x46\x70\x7b\xb3\x03\x49\x01\x6f\x6e\xa1\x31\x1d\x70\x7c\xf4\x6e\xee\xf7\x0e\x0e\x4c\xc7\x9f\xc5\xb3\xfa\xf4\xf7\x55\xac\x38\x62\x46\xe8\x63\xcc\xe2\x4b\x79\x49\xef\xcd\xbf\xd2\x4a\x5c\x04\x00\xea\xc1\xc4\xc2\xad\x44\x2c\x0f\x28\x9b\xa6\xcd\xc5\x34\xcf\xa9\x7b\x8f\x05\xb3\xea\x1f\xca\x56\x38\x18\xe9\x3e" \ +"\x79\xd3\x85\x13\xd1\x58\x20\x9e\x55\x46\x55\xf8\xf9\x30\xe1\x2f\x56\x0d\x80\x06\x8c\x24\x1f\x80\x3a\xd7\xb0\x51\x81\x7d\xac\xe0\xd1\xcf\xf6\xad\xcf\xc1\x16\x61\x3c\xad\xb7\x4d\xfd\x9b\x12\xb2\x24\x71\xba\xd8\x46\x35\x2f\xb0\xb0\x6e\x58\x86\x51\xda\xa4\xe6\x2d\xf1\x1b\x50\x64\x61\x07\xf1\x76\x48\xc8\xa5\xbb\x9b\xbe\x5e\x28\x1e\xcd\x99\x47\x68\x8d\x0f\xdc\x0f\x99\xb1\xc8\x9b\xef\x78\x65\x88\x11\x99\xff\x58\xa3\xb9\xdd\xc7\xd8\x62\x45\x5f\x3b\xaf\xa4\xe9\xfd\x85\xe1\x02\x9c\x79\x5d\xe9\x0b\xac\xa4\xfc\x42\x19\x3b\x8d\xc3\x72\x83\xe0\x32\x8b\xe3\x87\xf0\x04\xab\x0e\xce\x8c\xcf\x37\xd3\x9f\x87\x08\xc1\xef\xe9\xcf\x35\xf4\xee\x54\x13\x49\x01\x5e\x68\x2a\x94\x1a\x03\x65\xc6\x99\xef\xef\x22\xe6\xfd\x6c\x06\x36\x3b\x36\xfc\x31\x56\x43\x5a\xae\xc4\x8c\xef\xb5\x40\x55\x0b\x2c\x09\xe5\xf9\x88\x48\x7d\xc7\xbf\xf2\x9c\x91\x51\x46\xc1\x2c\xb5\x85\x24\xd3\xf2\x1e\x90\xf4\x07\x59\x61\x62\xf4\x3d\xb8\x03\xae\x65\xad\xdd\xef\x91\xa6\xe1\xb6\x52\xca\x4c\x4c\x96\xc6\x5d\x78\x64\xfe\x2f\x15\xa8\x3d\x26\xa5\x30\x1f\x4c\x3b\x25\x59" \ +"\x6a\x57\xcb\xb3\xf8\x9c\xa2\x40\x32\x4c\x05\x7b\x71\x09\xd7\xe2\x17\xcd\x2c\xf5\x75\xb3\xfb\xa0\x6a\xcd\x82\xbb\xfd\x97\xe0\x18\x20\x6b\xd2\xdd\x3e\x09\x85\xc0\x77\x8f\xe8\x45\xcc\x62\x05\x56\x79\x11\xf5\xb4\xf9\xe9\x30\xb9\x38\x3e\x14\xd7\x8c\x06\xdc\x8b\x2c\x2e\xb4\xec\xd7\xfa\x51\xc3\xfe\x65\x87\x28\x87\xeb\x8d\x16\xb7\x01\x1f\x03\x59\xfc\x57\xcf\x3a\x18\xa1\xe1\x1c\xd9\xae\x7a\x47\x2e\x64\x19\x55\xbd\xb1\x2d\xb9\x35\xd2\x6d\xde\xf0\xf4\x52\x4b\xbc\x11\xbf\x2d\xb8\xdc\x84\x69\x4b\x97\x0c\x05\xec\x94\x96\x0a\x16\xc7\x1a\x8f\x8e\x9f\x89\x57\x8e\x46\xf1\x43\x05\x0f\xeb\x57\x14\xe0\xcf\xd2\x26\x3c\xf5\x22\xee\x6c\xc1\xcc\xc2\xb3\x07\x83\x9e\x3f\xf5\xff\x5f\x22\xf7\x3f\x64\x27\x55\x33\xb6\xdc\x45\x7d\x58\xdf\x27\xa0\xb0\x73\x64\xe8\x96\x14\x28\xcd\x84\xe7\xc9\x61\x28\x42\xcf\x35\xc3\x27\x3b\x04\xbf\x8c\xd2\x42\x2e\x68\xc4\x40\x23\x16\x97\xd2\x58\xdc\x6c\x60\x5f\xaf\x61\x46\x19\x5a\x6f\x70\x7b\x6a\xcc\x16\x3b\x6a\xf8\xe8\xb2\x95\x20\x24\x10\xfe\xbf\xca\x5f\xb1\xb1\x74\x5f\xd5\xcd\xaa\xfe\x60\xb8\xe9\xa6\x0a\x9c" \ +"\x5f\xfe\x69\xcd\x37\x9e\x3d\x81\xd7\x62\xe6\x6b\x03\x3f\x9d\x9b\xcf\xf7\x9d\x4f\xfe\x8a\xbd\x5e\xf8\xf4\x98\xa7\x6f\x10\xca\xea\x51\x26\xfd\x01\xb4\xd2\x18\x59\xb8\xfc\x55\x06\x23\xdf\x09\x22\x53\xfe\xe0\x45\x8a\xc7\x25\x5a\x18\x15\x88\x0f\x33\x32\x1e\x36\xd8\xe3\x9c\x75\xf2\x64\x34\xa3\x59\x21\xa4\x62\x11\x59\xb0\x15\x9b\x0f\x92\xd8\x56\x75\xa8\x03\x79\x4b\xfc\x74\x50\xc7\xa2\xd7\x4a\x04\x1f\x76\xba\xce\xf9\x74\xdd\x63\x41\x36\x21\x0d\x4e\xd2\x23\xd2\x35\x7a\xbe\xc6\xdd\xb7\x86\xcc\x4f\x08\x19\xd2\xbc\xfd\x55\xc9\x2e\xfa\x03\xe8\xd0\x25\x0c\xdf\x48\x97\x94\xee\xa8\xcc\xfc\x1f\x01\x1c\x76\xf8\xaa\x95\x49\x3b\x20\xca\x65\x97\x0f\x08\xbd\xa3\xd9\x8d\x96\x74\x41\x81\xa6\x93\x36\x01\x42\xd6\xe4\x4d\x4c\x0c\x69\x01\x52\x81\x7b\x1c\x32\x6a\xef\x73\xbd\x51\xa5\x59\x40\xa2\x48\xad\xa2\x0c\x8f\xa1\x2a\xc3\x34\x31\x4f\x82\xe7\xcf\x7d\x71\x15\x2b\xb8\x78\x61\x4f\xa2\x24\x7d\xcc\xfd\x17\xeb\x16\x57\xfa\x81\x2e\x33\x8c\xb8\x7a\x05\xb0\x5b\x4d\x79\x63\x5e\xf6\xd9\xf7\xb5\x64\xbe\x51\x2b\x47\x61\xd8\x52\x90\x32\xd7\x48\x58" \ +"\x88\xca\xa7\x92\x14\x6c\x6f\x30\x08\x80\x4d\x3b\xb3\xe3\x74\x66\x6a\xaa\x7b\xb7\x96\x0f\x14\xe2\xb1\xf4\xc7\xd2\xe1\x60\x0b\xe8\xe6\x6b\xe6\x5c\x58\x07\xc8\xfa\xa2\x8f\xf5\xd7\xc2\xae\x7e\x1f\x91\xd3\x9e\xd2\x7d\xde\x56\x50\x69\xcf\x60\xc5\xf0\x10\x79\xe5\x10\x2b\x20\x12\x61\x74\xf9\x69\x35\x0a\x6d\xa3\xe2\x5a\x2b\xcd\x1b\xbe\x14\x4b\x05\x77\x61\x51\x64\xec\x1e\x0d\x2a\x1e\x94\xed\xe1\x95\x23\x11\x11\x05\x8e\x23\xfa\xd7\xc5\x9b\x11\x6f\x91\x81\x35\x39\x00\xc8\xf9\x59\xb0\xbd\x01\x74\x24\x0f\x8c\xb6\x5f\xd6\x8f\x74\xeb\x52\xa5\x35\xc0\xb5\xb7\x83\x6a\x05\x8e\x23\x1f\xeb\xb1\x5a\xcb\x79\xa7\xd8\xa5\x21\x2f\xe1\x15\xe3\xde\xeb\x52\x4a\xc3\xc5\xd7\x4f\xcd\x6c\x91\xb9\x58\xe0\xcf\xb9\x2b\x94\xc7\x37\xce\x37\x35\x24\x53\xe4\x0f\x9b\xf0\x34\x8b\x24\xa9\xca\x8c\x0b\x94\xc9\x64\x74\x05\x04\x5d\xd1\xff\x0e\x68\x1b\x1e\x8a\xe0\xb6\x88\x44\x1b\x12\x7f\x3d\xe7\x0d\x4f\xd3\x81\xaa\x53\x85\x79\x2a\xc9\x5b\xa1\x9d\x5d\x5c\xe4\xe6\x55\x2a\x48\xfc\x8e\x55\x31\x31\x5a\xf8\x69\x40\x65\x11\xb7\x68\x47\x42\x58\xe7\xf3\xb9\x7f\x6d" \ +"\x60\x10\x90\x43\x89\x8e\x33\x0f\xb0\xe5\xc3\xf4\x79\xe1\xeb\x01\x2f\x1a\xbb\xc7\x1d\x54\x2a\xd1\xc0\x17\x18\x42\x8b\x69\x3b\x2a\x62\x2a\x3b\x79\x2a\x13\xfc\xd8\x53\xaa\x0f\x99\xe3\xd1\xf2\xc0\x54\x7f\xe1\x07\x6a\x34\x7a\x0b\xc5\x0d\x72\xc4\xc2\x43\xd9\x6a\xc9\x09\x21\xbc\x2c\x50\x9c\x8a\x0d\xea\xbd\x1d\xf0\xbe\xf7\xe7\xc2\x71\x91\xb6\x3f\xb8\x51\xcb\x58\xad\x2b\x94\x7e\x3f\x37\x1e\xb3\xa9\x08\x04\xd3\x07\x49\x30\x98\xa9\x41\x8b\xef\x27\x2a\x42\x43\xd1\x04\x14\x66\xc1\x3a\x16\x9b\xe5\xf8\xe9\x63\xee\x3e\xad\x47\x38\x2b\x99\x81\xfd\xa1\x45\x57\x5e\x32\x35\x01\x12\xa7\xb3\xfd\xe8\x05\xf4\xb4\x49\xca\xce\xc7\xb1\x9c\xa8\x90\x9c\x70\xf7\xbb\x5d\x79\xe9\x95\x10\x50\x91\x43\xaf\x39\xfc\xb9\xda\x38\x0d\x00\xa4\xa0\x54\x13\x44\xa8\x0e\x59\x4d\xe1\x02\x0e\x53\x7c\x38\x37\xa2\xe5\x27\xc4\xf9\x1b\xf0\x5a\x85\xf1\xed\x4f\xa9\xe9\xad\x8f\xff\x24\xf9\xa6\x74\x74\xb1\xd8\x95\xe0\x1a\x40\x2c\xb1\x19\x05\xfd\x0d\x32\x41\xed\x0f\x8a\x2b\x5f\x6c\x14\x81\xb8\x8a\x79\x6e\xf0\x5b\x0c\x66\xbb\xb7\xe8\xc4\xfd\x8c\x5a\xae\xab\x09\x96" \ +"\x9f\x58\x61\x38\xe3\x9e\x5c\xe3\xd1\xe3\x89\xf8\xf8\xb6\xa7\xe5\x6e\xbc\x55\x1e\x4a\x07\x48\x63\x6a\xb2\xb5\x5a\xf8\x65\x3b\xb8\x40\x1a\xbc\x01\x4c\x91\xbf\x76\x4e\xa1\x5a\x9d\x6c\x79\xeb\x9a\x5a\x70\xec\xcc\xe2\x43\xc1\xcc\x88\x54\xe0\x2f\xa5\x00\x2c\x2e\xe2\x90\x71\x92\x85\x49\x49\x65\x3d\x31\xb7\x2d\x88\xd1\x0a\xb9\xcf\x18\xf1\xfd\x86\x71\xf8\xe9\x71\x4b\xa1\xb1\x02\x42\xd8\x3e\xb0\x3b\x04\xa3\x5a\xaf\x60\xee\xf3\xc3\x3e\x20\x3d\xe1\x4b\xb2\x7e\x60\x6d\x7a\xe7\xef\xb4\xc4\xcb\x14\xc1\x00\xcb\x31\x92\x22\x7f\xfa\xc0\xcc\x59\xff\x56\x09\x9b\x78\xa1\xed\x40\x94\x32\x36\x78\x5f\xbe\x79\x5d\x41\x7d\xbf\xca\xbe\x10\x70\xbf\x4d\x1c\x7d\x5a\x54\x80\x07\xda\xfb\xb1\x47\x90\xa2\x3c\x2b\xd9\xff\x31\x35\x65\x83\x2a\xc0\x40\x7b\xbc\x21\xd9\x93\xf8\x3f\x4b\x3d\x45\x95\xf8\x5a\x70\x94\x84\x0f\x72\x72\x42\xeb\xc6\xde\xa6\x6c\x8c\xac\xf8\x0e\xfc\x3f\x9e\x99\x91\x3d\x73\xa0\xc2\x1e\xca\x22\x12\x9e\x8b\x84\xaf\x49\x4d\x24\x0a\x55\x9c\xb4\x2c\x5c\xf5\x43\x7c\x15\x37\x03\xb5\xd0\x10\x4e\x90\x2d\x96\x99\xab\x63\xcb\x78\x66\x90" \ +"\xcd\x95\x10\xa8\xf5\x3c\x43\xab\x69\xa3\x4a\x65\xc5\xf3\x4d\xce\xbb\x4f\x7d\x36\xe8\x32\x63\x3c\xd1\x15\xe0\xcb\xf0\x36\x05\x40\xbe\x71\x34\x2b\x72\x99\x39\x18\xf6\xf9\x43\x05\x74\x6c\xa7\x18\x98\x9d\x91\x91\xb8\x87\x09\x15\x13\x28\xd0\x57\xfe\x30\xf9\xff\xa2\x27\x4b\x77\x14\xbc\xf5\xa6\x17\x86\x45\x40\x07\xf2\xb8\x59\x11\xa6\x24\x9e\x4c\x69\xeb\xd4\x4b\x0e\xb3\xa8\x33\xcc\x2a\x32\xbb\x05\x76\x4c\xad\x3a\x9b\xac\xc3\xa8\x2c\x1c\x81\x09\xbc\x08\x72\x4f\x39\xe9\x96\xaf\x24\xd5\x3b\xb0\xcf\x19\x0a\x94\x50\x03\x74\x0e\x78\xa1\xe9\xfa\x24\xd4\x74\x1a\xcb\x25\x81\x2a\x18\x41\xbe\x9d\x41\xc1\x84\xc3\xb5\x1b\x7d\xa1\xed\x11\x35\xcb\x20\x1d\x86\x78\xda\x78\x54\x8b\x27\x79\xf4\xbe\xa7\xb3\xa5\x71\xa9\xdb\x1f\x89\x56\x0f\x2b\xed\x63\x47\x2b\x97\xa7\xdd\xb6\x70\x9d\x6f\x28\x5b\x85\x11\x57\xde\x53\xdd\x27\xbc\x95\x33\x2d\x87\x68\x1b\x94\xf6\xf8\x1c\xa0\xdb\x7d\xc6\x29\x97\xce\x1a\xa7\xa7\x5e\x29\x69\xfb\x04\x23\xfb\xa6\x01\x6f\x9c\xd1\x7e\x27\x5d\x69\xea\xc5\x40\xb9\xb1\x30\xb6\x99\x63\x22\x1b\x6d\x7e\xc0\xb7\x14\x75\x83" \ +"\xd1\x5d\x25\x47\x60\x57\x04\xb7\x34\x10\x04\x7d\x0c\x35\x09\x4c\x68\x97\xaa\x09\xba\x4a\x98\x8c\xad\xe7\x34\x71\x0b\x73\x06\x4b\x3e\xd0\xc0\x66\x47\x70\xcc\x4a\xce\x14\x52\x05\x99\x10\xc2\xba\xb3\xbe\xaa\xdb\xfb\x6d\x18\x58\xdf\x89\xb9\xbe\xd9\xa8\x50\x65\xd2\x69\xdf\x73\x7c\x47\x5b\xc0\x30\x2a\xce\xdc\x0e\x30\x03\xe8\x63\x33\xf7\x27\x92\x97\x94\xe6\x5c\x71\x7b\xb8\x7c\xa9\x37\x05\xf9\xe2\x9c\x56\x51\xa7\x90\xa4\xa9\x49\xf1\x3d\x38\x14\xf7\x74\xac\x93\xaa\x03\x06\x50\xbd\x03\xdc\x0b\x3e\x38\x81\xb3\x91\xcd\x5b\x2e\x41\x1d\x72\xb8\xd0\x76\xef\x67\x21\xe0\xb1\x6d\x96\x13\x13\x64\x88\xa6\x61\x65\xa8\x09\x07\x1d\x8f\xa9\x5d\xba\x4c\x17\x03\xe3\x5d\xf0\xeb\x5e\xc3\x02\x2e\xbc\x4b\x25\xfc\x3c\x3e\xba\xfa\x8f\x85\x60\x7f\xd0\x7f\x37\xb0\xf7\xe8\x63\xc4\x63\xc5\x6b\xa2\xea\x2f\x6d\x1b\x79\x42\x49\xa0\x01\x34\x1d\x48\x59\xfc\xe7\x41\xec\xfa\xc6\xba\x81\x15\x66\x62\x39\x14\xb8\xdd\xae\x30\x25\x0b\xb9\x7b\xbb\x66\x4e\x5c\x03\x45\xa1\xde\x21\x96\xfa\x75\x55\x76\x6f\x04\x91\xf2\x3e\xff\x1b\x30\x48\x57\xfd\x20\x9d\x82\x44" \ +"\x3f\xe0\xdf\xe3\x1d\xd9\xb1\xad\x3d\xce\x22\x0e\xcd\x46\xa1\xe0\x1c\x83\xc5\xcb\x69\x21\xb2\x83\x90\xba\x93\x77\xa7\xac\x07\x74\x34\xd6\x34\xbf\x10\x14\x8a\xf1\x96\x3c\x11\x1e\x5a\x16\x90\xbb\xe3\xa3\x86\xb0\x42\x79\x0e\x01\xe8\x63\x5d\x39\x19\x71\xb1\xf3\x7e\x2e\x31\x00\x43\xcf\xc6\xff\x26\xa4\x34\xdd\x34\xdc\x5a\xc4\xbf\x49\x21\x88\x63\x4a\xc3\x1f\xe7\xc2\xc7\xb6\x8c\x52\x9d\xbc\x08\x0c\x51\x54\x6b\x02\x02\x23\x59\xa8\x3a\x82\x10\x3c\x58\xa3\xd4\x57\x84\xc2\xc2\x3f\xbb\x62\xf3\x73\x40\xf5\xaf\x09\xda\x00\x20\xd2\xc5\x28\xa6\x2c\x0f\xea\xee\x21\x99\xe0\xfa\x78\x33\x00\xe3\x78\xdb\x2c\x1e\x56\x40\x68\xea\xab\x89\x4e\x7d\xcc\xfd\x3c\x86\xd3\xda\x2f\x0f\x91\x32\xe7\x6c\x8f\x7e\x63\x50\x6d\xf2\xd3\x92\x8e\x53\x16\xea\x96\x30\x7b\xe3\x34\xd0\xd5\x89\x53\xd9\x52\x2b\x9b\xd4\xe6\xa2\x8b\x6b\xf3\xdc\x2d\xfd\xdc\xfa\x61\x67\xef\x36\x0e\x16\x83\x4a\xab\x63\xdb\x62\x28\xd8\xb0\x9e\x52\xfa\x6a\xfe\x02\x63\x31\x38\xa8\x77\xb8\x8c\xb6\x74\xba\x1d\x67\xdf\x14\x09\x5f\x06\x24\x1c\x86\x5a\x08\x39\x41\x9e\x21\xee\x9b\x3d\xd2" \ +"\xec\x7e\x6d\x90\xfc\xde\x2c\x68\x6a\xd4\x8c\xc3\x1f\xde\x8d\x83\x37\x01\xa0\xec\x34\x9b\xaa\xad\x9a\x55\xee\x06\x9a\x5d\xf4\xac\x14\xcf\x03\xf9\x8f\x34\x16\x4d\x64\x0e\xe3\xfe\x23\x42\x1b\x25\xde\x62\x07\x16\x91\xca\xd6\x74\xd6\x21\xde\x8a\x20\x9a\x33\x56\x68\x77\x1c\x6b\x44\x0d\xd9\x9b\xc4\xdf\xcd\xb4\x5e\x16\x95\x9c\xa7\xca\x2d\x7d\x25\x69\xcf\x91\x1a\xa2\x9b\xa7\x07\x9b\x33\xc9\x03\x48\xb6\x9a\xd1\x0e\xc5\xd7\x8c\x72\xba\x79\xac\x5e\x4d\x10\x8e\x00\x67\xb8\x17\x1d\x37\x65\xd3\x3c\xe5\x36\x4e\x79\xf6\x4f\xd4\x60\xef\x34\xb6\x84\x2a\xd6\xd0\x1c\x30\xfc\x4f\x71\x91\x5a\x6e\x2e\x91\xbe\x50\x3f\xa6\xd2\x4d\x22\x6f\x7d\x33\x66\x0a\x03\xc2\xd1\x09\xa0\x0f\x9b\x24\xeb\x8e\xfc\x7d\xae\x2c\xba\x4e\xab\x36\x3e\x0e\xe3\xbf\xc0\xea\x2b\x54\x63\x60\xc9\x01\x0c\x65\x62\xed\x0c\xf9\xba\x94\xdd\x11\xd1\x0b\xb5\x94\xa6\xb1\x2c\xa2\x10\x55\x23\xd6\x55\x72\x64\xf9\x4c\x52\x4a\x46\x1e\x92\x63\xe6\x0f\x9d\x75\x9a\xdb\x83\xa3\xc1\xaf\xd8\x1e\x93\xb0\xe0\x74\x52\x90\xe0\x83\xf9\x32\xf7\xc4\xed\x41\xb2\x66\x69\xfc\x14\x1f\xa6\x11" \ +"\xd9\xcf\x8c\xd8\xfe\x7b\x3b\x4d\x11\x6f\x62\xa8\xd2\xed\x4c\x6e\x6b\x10\x64\x28\x2e\xd0\x51\xc9\xa0\x34\x89\x19\xb4\x88\x25\xd6\xad\xac\x5f\x71\xd2\xc3\x5f\xde\xac\x76\x77\xbd\x62\xfd\x7b\x6b\x12\x62\x6f\xc9\xe0\xc5\x6d\x88\x96\x95\x05\x57\x7c\xbc\x25\xc9\x49\xc6\x1a\x06\x3e\x86\xbc\x88\xce\x7e\x65\x2e\xea\x11\xca\x2f\x87\xdf\x39\x3b\x35\x72\x26\x59\x1f\x01\x4c\x4c\xee\x8f\x0b\xbe\x1e\x4c\xe6\x2e\xa2\x33\x00\xba\xcf\x7e\x6b\xdb\x9c\x12\x68\xf7\x9e\xf4\x91\x14\x54\x1f\x44\x8d\x37\xbe\xdd\x69\x66\x38\x51\x9a\x7d\x47\x7b\x7e\xec\xb3\x51\xe7\xdc\xa7\x77\xce\x73\x6a\x3b\xa6\xa6\x03\x89\x2b\x38\x20\x05\x2d\xd7\x91\xa2\x2f\x94\xea\x72\x12\x03\xa6\xf8\xd1\x75\xc0\x67\x23\x53\x4f\x13\xd4\xe6\x0c\x80\xd6\x8e\x94\xad\xea\xd4\x3e\x4e\x90\x08\x8d\x3f\xfc\xff\xbc\x1b\xbf\x84\x35\xd7\xdc\x13\xbf\x4b\xfd\x91\xe6\x7a\x9c\x73\xfa\x49\xab\xd2\x16\xe9\xf4\x5b\x3a\x2f\x4b\x44\x74\xb6\x62\xb6\x4b\x42\x24\x9f\x40\xcd\xb0\x66\x32\xed\x26\x6b\x94\x3a\x3d\x40\x01\xf9\x44\x4b\xeb\x68\x19\xe4\x93\xe9\x2e\x19\xbe\x76\xc4\x22\x27\x01\x3c" \ +"\xc9\x43\x4d\x40\x09\x2b\x00\x96\x29\x49\x39\xfe\xd3\x60\x5d\x81\xe7\x3f\x0c\xb1\x6a\xee\x46\x49\x57\xfb\x07\xfe\x33\xd4\x22\x22\x89\x7f\xd1\xcf\x46\x3c\x44\x47\x4a\xd0\x77\xd3\x99\x64\xad\x15\xb2\x5f\x71\x06\x67\xf4\xcc\xc8\x8d\x3a\x9c\x0d\x15\x6d\xa9\xd7\xce\xb8\x0a\xf8\xd6\xdb\x02\x16\x6c\x25\xf7\x9d\x66\xa7\xfd\x8e\x8b\xb1\x3e\xf3\x3b\x93\x45\xe7\x96\x7b\xb1\xe7\xe0\x21\x1d\x4b\xb8\x73\x8f\xda\x04\x0a\x7d\x23\x32\xc9\x8f\x2c\xaf\x6c\xce\xf7\x98\x51\xf9\x87\xdd\x17\x84\x50\x68\x18\x06\x0a\xd0\x9b\x61\x2d\x09\x34\x1d\xe8\x98\xb0\x4b\xf2\xf1\x6f\x80\x7f\x90\x60\x9f\xab\x49\xfa\x34\xa3\x2b\x9e\xe8\x59\xe3\x41\xdb\x97\x99\xe3\x3d\x2e\xe8\xb1\xaa\xcb\xed\x09\xfd\xe1\xde\xe0\xc8\x56\x92\xb4\x68\x08\x0f\xbd\xb8\x5e\xb1\x24\x39\xaa\xce\x3e\x2f\x98\x43\x4d\x6a\x0a\x1a\xb4\x2c\x7c\xaf\x05\x51\x60\xd7\x8f\x8e\x98\x3d\x02\x51\xd8\x42\x8e\xd8\x47\x08\xaf\xf5\x33\x90\xba\xa6\x1c\xe6\x40\x9f\x96\x5a\xf9\x41\x97\x0a\x88\x5b\x26\x92\x01\xf3\x17\x8d\xe0\x7d\x6c\x04\xa6\xba\xf1\x37\x0a\xca\xfb\xe6\x60\xfc\xf8\xc5\x30\x1d\xef" \ +"\x81\xcc\xb8\x0f\x0a\x59\x82\xaf\x90\x3b\x9b\x21\xab\x79\x20\x13\xfc\x6d\xdc\xbf\x73\xed\x25\xf3\xe9\x79\x7a\x5a\xfa\x42\x8e\x2c\x23\xcb\xda\x91\xf3\x8c\x1c\xa1\xd5\x99\xe7\x4c\x8a\x4c\xfb\x97\x07\x0b\x40\xc1\x49\xe6\xbf\xc4\x99\x53\x05\x5e\x6b\x68\x01\x41\xcb\x95\x99\xd1\x4c\x52\x3c\x00\x15\x99\x3f\xac\x77\x6a\xdf\x33\xd4\xf4\x90\x19\x19\x7e\xd8\x09\x5d\x2a\x2e\xbc\x86\x9a\xc3\x54\x2e\x7e\x80\x88\x6f\x15\x5a\x67\xdb\xc6\x27\xa1\x35\xff\x97\xd5\x69\x87\x73\xe2\x5e\x1c\x30\xfc\x50\x21\x3c\xd5\xce\xf7\xbf\xaf\xc3\xe3\x76\x36\xb9\xcd\xc3\xf8\x0b\xee\xca\x0d\xec\x26\xb6\x01\x01\x33\x6f\xbe\xea\xf9\x57\xbd\xea\x23\x94\xe2\x48\x83\x4d\xf9\xd6\x30\x24\x74\x3a\xe4\x4d\xa8\xde\xbe\x73\xc1\x9d\xae\xd5\x69\x78\x17\x62\x86\x16\xcd\x96\xc0\xca\x80\x41\x80\x55\xfe\x63\x87\xe3\xaa\x50\x60\xea\xe1\xad\xac\x9c\xb3\xea\x51\xb9\x22\xe3\x9b\x29\xf2\xf4\x8a\x94\x3a\xff\xe8\x3f\x92\xb8\xe9\x9d\x69\xce\xb5\x35\x2a\xa5\x3b\x4d\x47\xce\xdb\xa9\xa8\xf6\x3d\x72\xab\x93\x16\x65\xda\x5c\x5d\x3a\x67\x50\xf0\x98\x50\x89\xb3\xb5\xaf\xcb\xf5" \ +"\x6f\xe7\x04\x29\x9e\x5e\xe0\xbd\xac\x7a\x61\x5c\x5d\x7e\x2f\xe5\xef\x34\xe1\x66\x26\x19\x3d\xc4\x79\xe3\x5e\x1b\x94\x85\x3d\x62\xf7\x07\x52\xbb\x9f\x6a\x4a\x33\xf5\xab\x2a\x45\xbc\xe3\x22\xb2\x88\xd2\x89\x3e\x56\x65\x08\xcc\x6a\x06\xea\x69\x85\x33\x45\x32\xa4\x54\xb6\x49\x5e\x6b\x0a\x86\x13\xa5\x6f\xbf\x91\xee\x00\x08\xbc\x39\x7b\xb9\x84\x09\xa9\x2b\xd7\x5c\x4a\x6c\xb0\xdb\x58\x1a\xe3\xff\xac\xc6\xaf\x28\x6a\x78\xe3\x94\x18\x97\xc3\x79\xb6\x46\xb1\xfb\x69\x1b\xa8\x10\x8e\xcf\xb0\x4a\x2f\xd9\xa1\x8b\x1c\x3c\xe4\xc4\xf6\xe9\xf9\xb8\xd4\x24\xc4\x60\x7d\x4f\xc5\x25\x11\x85\xfb\x59\xe2\xbb\xe8\x26\xee\x9e\xb7\x5c\x60\x23\x03\x1c\xf7\x44\x6f\x67\xae\x6e\x51\xa4\x92\xa5\xc3\xdb\x72\x1b\xcf\x53\xff\xfd\x7e\x58\xf2\xc6\x6f\x66\xda\xf9\x72\x09\x99\xdd\xdf\xb0\xbc\x58\x11\xd0\x2e\xb2\xee\x24\xfd\x6d\xe0\xde\x4f\x9a\x7d\x12\xc8\x65\x74\x39\x01\x81\x61\xc9\x97\x6f\xb7\xde\x8c\x87\x72\x9c\x5f\x54\xb2\xf1\x9f\xb1\x70\x3e\x19\x7d\x73\xe8\x66\xfb\x3e\xcb\x0e\x05\x96\x5c\x63\xf1\xdb\x35\xfa\x45\x30\x41\x8d\xf3\x82\x7c\xe1\x1e" \ +"\xb0\x3b\x11\xaf\x91\xfe\x31\xf1\xeb\x89\xe2\x88\x2a\x00\xfb\xa0\xcd\x9c\xc0\x0a\x09\x55\x37\x0e\x3b\x26\xac\xc0\x18\xdd\x42\x36\xed\xee\x93\x5a\xe4\xbd\x16\x09\xdc\xa4\x64\xda\x4c\xb0\x80\xb8\x88\x98\xfc\x43\xa2\xe3\x77\x85\x05\x0f\x6c\x82\xa5\xd3\x18\x13\x22\x4a\xea\xd1\xce\xcb\x05\xe8\x05\x85\x5c\xfb\x6f\xf2\x51\x39\x64\x0c\x74\x8b\xbd\x71\xa7\x8d\xb5\xae\x2f\x0a\x69\xed\x0a\xaa\xc3\x8c\xf5\xb8\xce\x2c\x07\xaf\xb6\x94\x9f\xd1\xef\x8d\xc0\xc2\x07\xbd\xe1\x5d\x25\xa1\x5a\x51\xa7\x61\x20\xa1\x0c\x93\x6e\x51\x80\x0e\x4e\x92\xfc\x13\xfc\xdd\x39\xc4\xe9\x62\xc0\xa6\x31\xc7\x96\x60\x1e\xf7\xa9\xb7\xfc\xd2\xc9\xe2\x17\x72\xc1\xe5\x7b\xfb\x5d\xbb\xbf\x2c\xc3\xd6\xde\xf3\x09\xb4\xd7\x22\x59\x43\xdc\xa2\xc3\xc8\x43\x7e\xf7\x3b\x8e\x23\x52\xee\x80\x19\x33\x87\x98\xee\x64\x34\x3b\x76\x98\x93\x6f\x85\x8a\x29\xc4\xd2\x18\xf1\x0a\x23\x49\xa3\x5e\x61\xb5\x20\x90\x18\xac\xbf\xcd\x0c\x19\xe6\x6c\x82\x8a\xf8\xa4\x62\x8d\x5c\x63\x38\xb4\xc0\x37\x3f\x46\xad\xa4\x39\x1a\x5f\x87\xf3\xff\x9f\xd3\xa3\x2f\x80\x47\x9b\x62\xbb\x51\x9f" \ +"\xbf\x01\x37\xe1\xf1\x10\xae\xf0\xa8\x7a\x25\x28\x61\xcf\x9d\x9d\xb0\x07\xfc\x51\x85\xd6\x80\x53\xf9\x21\x48\x8f\x04\x57\x08\xc5\xe7\x15\xde\x4a\x8a\x84\x95\x6c\x66\x18\xdd\x9a\x53\xbb\x50\x1f\x07\x3f\x74\xb4\xa9\x54\xca\x12\xbc\x0e\x76\x62\xa6\x4b\xf4\x0a\x01\xdb\x4f\x69\xa3\x00\xf9\xfd\x60\x56\xc9\x27\x61\x53\x53\xae\x30\xf9\x49\x27\xbf\xd0\xa8\x22\x43\x97\xfe\x10\x12\x87\x5c\x9d\xe0\xe1\x29\xfe\x2d\xcb\x29\xc5\xd8\x8d\x0f\xd2\x21\xdb\x43\xbd\xdc\x45\x32\x13\x4f\x2b\x4b\x7a\x01\x5d\x2c\x41\xc5\x0f\x1d\xea\x27\xaf\xe9\x88\x05\x41\x7b\x74\x6d\x88\x3f\x5c\x3b\x1f\x9e\x01\x28\xdb\x9e\x5e\x27\xec\xcf\xc6\x7c\xf7\xd1\x96\xa8\x92\x1b\xa4\x50\x6d\xfb\xdc\x65\x96\x1d\x8e\x2c\xc7\x47\xe8\x1b\x24\x76\x45\xe6\x54\x1a\xac\xfc\xe3\x2e\x13\x23\xa8\xef\x05\x0f\xdc\x80\x5f\xd4\x6a\xcd\xf2\x38\x80\x09\x14\x1c\x18\x21\x0b\xb1\xf4\x6e\xed\x83\xe9\xb7\xdf\x79\x73\x5a\xe1\xdf\xa0\x53\x42\x88\x46\x3a\x99\x0d\x68\x88\xcf\x27\xea\x81\x8c\xf7\xdb\xb0\x48\x78\xd3\xb9\x85\x76\x83\xd4\x3b\xba\xb2\xc7\xe4\x36\xe7\x61\xbb\xe0\x61\xed\xce" \ +"\xd7\x09\x16\x0c\x0c\x93\x15\x26\xa5\x4e\x95\xf5\x91\x76\x67\xf5\x81\x78\x05\x8e\x31\x00\xd3\xe0\xef\x4d\x72\x30\xac\x9e\xab\x13\xe0\xc9\x52\xda\x4e\xa8\x5b\x86\x0f\x28\xbb\x72\x2a\x1a\x08\x8e\xd3\x3d\xe9\x08\x9b\xb1\x93\x95\xe8\xa0\x01\xb1\x87\xf5\x90\x45\x16\x9d\x9c\xc8\x6d\x85\xc9\x9d\xd4\xfe\x86\xd5\xbf\xff\x65\xff\x14\xeb\x69\x3e\xdd\xd2\x9f\x40\xf6\x88\xb5\x3c\x29\x95\x81\xe0\x2e\x4f\xad\x88\x69\x7d\xc0\xf4\x10\xec\xac\xc2\xf7\x88\xa0\xbf\xdb\x18\x65\x97\xcc\xbd\xfe\x45\xa0\x4f\x54\x95\x2b\x6c\x5a\x41\x10\x4b\x31\xb6\x1d\xd3\xbc\x87\x91\x83\x6c\x8f\x61\x5f\x26\x26\xf4\x75\x5c\x9d\x5b\x26\x76\x76\x86\x6c\x7b\x53\xd7\xef\xe4\xba\x2d\x70\xca\xa6\x7f\xc7\x50\xb7\xfb\x70\x71\xed\x31\x94\x5c\x1f\x36\xf2\xd0\x0c\x2f\x65\x4a\x4f\x13\x4e\x7a\x3c\x7d\x55\x85\x03\x34\x7b\xec\x3c\x3e\xb2\x65\x6f\x5b\x59\xe4\x3f\x3e\x74\x35\x94\x47\x2e\x99\x85\xf4\x3b\x57\x75\xab\x43\xb6\x77\x03\xcc\xd7\xcd\x80\xf8\x0b\x3b\x22\x0f\x73\xf9\xb1\xf0\xc6\x3a\x34\x17\x65\x84\x76\x27\xb5\xc7\x31\x27\x62\xc4\x17\xb3\xc7\x3e\x41\xa5\xf6\xda" \ +"\xa1\x96\xa3\xfd\x5e\x7c\xd7\x0a\xf5\x47\x87\xa8\x3b\xfb\xe5\x9d\x27\x4b\xb3\xd3\x53\x21\xac\x51\x02\x1e\xde\xae\x42\x50\x0b\xc4\xbb\x7b\xff\x7f\xbb\xd0\xec\x6a\x58\x36\x5d\xfd\x25\x21\x9b\x52\x1a\x9c\x39\x57\x94\x82\x2c\x54\xcf\xab\xc8\x83\x52\x1c\x3d\x7a\x9b\x72\xa0\xfd\x1d\xb1\x32\xa8\x64\x49\x12\x84\x5c\x88\x43\x18\x9c\x95\xa4\x78\x6d\x82\xaa\x9c\xa4\xf8\x68\x53\x98\xe7\xd3\x64\x4e\x3b\xaa\x93\x65\x56\xfe\x7f\x8f\x7c\xb2\xe8\x23\x23\xf3\x03\xdc\xc6\xb6\x92\x47\xfa\x32\x3d\x98\xfd\x65\xdb\xdb\x9f\x3a\x22\xef\x6f\x90\x1d\x08\x63\x18\xd4\x7b\xb0\xab\x00\x84\xfd\x23\x8c\xa6\x9d\x44\xd7\xd9\x69\x4e\xe0\x12\x76\xd8\x4f\xe3\x65\x3b\x99\x1b\xd9\xf3\xfa\xc1\xd5\x64\xb8\x45\x4e\xe5\x07\x90\x6b\x05\xd6\xdf\x8b\x7b\x2c\x8c\xa5\x83\xd7\x41\x4d\xb5\x8f\x65\xda\xc6\x57\x2f\xbf\x0a\x66\xe7\x00\xef\x17\x80\x53\x0b\xda\x3e\x68\xb9\x49\xd3\xd8\x28\x46\xe7\x5c\xbb\xac\xff\x42\x9f\x5d\x9c\x23\xac\x7b\x02\xe6\x7b\xec\xf1\x9a\x58\x88\xb3\x93\xae\x59\x32\x05\x9e\xa9\x80\x7f\xd7\xe7\x52\x53\x9f\x42\xf1\xcd\x67\x8f\x14\xf8\xef\x8f" \ +"\x1f\xd2\xf9\x27\x19\x08\x08\xf2\x6f\x6f\xbc\x23\xbe\xfb\x11\x72\xa4\x31\x18\x71\x9f\x32\x73\x38\xbe\xb4\x5b\x7d\xed\x63\x74\xd3\x24\xd0\x73\x0c\x49\x3d\x63\x6e\x51\x40\x53\xa3\x83\x9a\xd3\x09\xa5\x0b\x1e\xb1\xb1\x2b\xf1\x07\x6c\xcb\xe0\x4b\x19\xf6\xa0\x21\x94\x20\x83\xb7\xbe\x00\xdb\x1c\xd0\xf2\x86\xae\x5b\x5c\x33\x24\xf0\x2b\x8b\x93\x65\xb7\x33\xd8\xf9\x2a\xa6\x34\x85\x73\xf9\x06\xf0\x17\x1b\x17\x4d\xb4\x28\xaf\xf0\xad\x68\x46\x89\x53\x52\xab\x9b\xd7\x88\x83\x04\xac\x13\x64\xff\x92\xa0\xc7\x80\xb1\x82\xa3\x38\x68\x6b\x66\x2c\xb2\xc4\xbb\x00\x26\x35\xe6\xbf\x94\xda\xcf\x69\x42\x6a\x67\x34\xf1\x77\xe9\x3f\x3f\xb6\x2d\x65\x3d\xd2\x59\xaf\x65\x62\x59\xac\xfc\xec\x24\x36\x8f\x83\x37\x23\xbd\x80\x39\x49\x22\xe5\xfa\xce\xfd\x2b\x25\x35\x88\xac\x49\xdd\x1b\xcd\xcf\x15\x78\x5c\x06\xdc\xa6\x42\x5f\x2d\xf1\xd1\x70\x48\x16\x1f\xdd\xe8\xdc\x9d\xf8\x4e\x69\xd6\xe6\x29\xc1\xd3\x2e\xf9\x1a\x0b\xf2\x2a\xe1\x74\xcf\xa6\x8d\x74\xb9\xdf\x56\xda\xbe\xff\xb9\xfa\xc7\xb5\x38\xbc\x84\x25\x1b\x55\xf8\x70\xa1\xb6\xa4\x99\x81\x28\x25" \ +"\x0d\x08\x43\xec\x24\xb6\x97\x82\x60\x83\x41\x1a\x67\xef\x41\xf3\xea\xa2\x07\x5a\xed\x18\x63\x91\x2f\xb5\x63\x41\x26\x24\x70\x9d\xef\xe1\x7f\xa1\xa8\x06\x42\xe7\xfc\x8e\x9a\xe1\x8a\xbd\xf3\x42\x8e\x47\x3d\xef\x37\xe6\x3b\x28\xe0\x86\x68\x64\xbd\xa6\xf9\x42\x5b\x92\x9a\x1c\x43\x4e\x8a\x28\x72\x47\xac\x03\xa8\xe9\x09\x6a\xe4\x8f\x38\xc1\xe3\xf3\x90\x33\xde\x5e\xe0\x2b\x4f\x95\xd4\xf5\x34\x44\xc8\x11\xeb\x2d\xa4\x93\x3e\x76\x34\xd8\xc3\x4e\x0d\x42\xbe\xbc\xf1\x8e\xea\xb6\x55\x30\x94\xd6\x7b\x39\xdf\xbc\xe5\x77\xa9\xb4\xc1\x46\xfa\xd7\xf9\x1d\x58\x7b\x58\xe2\xd2\xab\xaa\x20\x50\x55\x03\x1a\xdb\x6d\x61\x86\x0b\x60\x76\x47\x82\x56\xb6\x4d\x74\x89\xd6\x1c\x8c\xf2\xe3\xb2\xa7\xc8\xd6\xaf\x6b\x60\x84\x21\x28\x40\x5d\xce\x5a\x81\x84\xdd\xaa\xf2\x71\xeb\xfb\xac\xc1\x23\x3a\x55\x46\x09\x4b\x68\x47\xa1\x63\xd6\x06\x21\xcc\xfa\xac\xc7\x21\xb7\xf6\xfa\x6d\xfb\x32\x6a\x72\x10\x86\x96\x13\xdb\x15\x3c\x3f\xfb\xcc\x9d\x2d\x6a\xe9\x85\x9a\x91\x87\xc9\x4d\x3b\xb2\xb0\xd9\x6d\xec\x13\x13\xc8\x05\xa5\xeb\x51\x0e\x2a\x99\x28\xbd\x56" \ +"\x5c\x5a\xef\x4d\x35\x88\x41\x70\x5e\x82\x68\x47\x37\x4f\x16\xfa\x22\xb2\x0e\x5b\x18\x91\xfa\x04\xc5\x60\x48\x76\x8e\x1f\x53\x89\x0e\x39\x73\x24\xca\x90\x0a\x13\x7b\xb0\x17\x5d\x23\x5a\x91\x49\xa3\x7c\x42\x9c\x08\x52\xf3\x16\xcc\x3b\x4d\x31\xde\x01\xf6\x07\x4b\x0f\xea\x6e\x09\xe8\x1d\x9c\xef\xfa\x58\x18\xf4\x7b\x0f\xa9\x42\xb4\xfe\xd2\xe9\x86\x1b\x64\xa2\x67\x9e\xdf\x95\xe2\xa7\x8c\x35\x22\x39\x69\xdd\x70\x74\x48\xcf\xa9\x62\xc8\xbd\x21\x48\xb5\xa2\xa6\x04\x1d\x62\x9d\xb8\xf4\xbc\x7f\xba\x23\xba\xca\x18\x15\xb9\xa0\x3f\x11\x70\x4e\x60\x31\x57\x3c\x9a\xd7\x31\xc4\xb3\x7a\x3c\xfd\x9a\x56\xb1\xe3\x46\x01\x50\xcd\x3a\x42\x67\x92\xaa\x6c\x22\x86\x95\x86\xa0\xe1\x98\x3f\x12\xc7\x65\x9e\xc7\xeb\x7c\x62\x69\x08\x3e\x64\x5c\xf8\x51\x3b\x6c\xbe\x9c\xd8\x6a\x67\x5a\x45\xc7\xa0\x15\x42\xcb\x7d\x9d\xbd\x08\x73\x0f\x9e\x4d\x69\x7c\xab\xb4\xe3\x86\x32\xd0\xf5\xfe\x23\xe7\xd7\xe7\xc1\xda\xd8\x44\xcc\xe5\xe9\x5f\x78\xb1\x69\x6c\x5c\x09\xb5\x77\xc4\x13\x61\x05\x91\xfe\x70\x9c\x46\x09\x44\x27\x54\x21\x50\x02\x15\xe4\xb8\x91\xda" \ +"\x13\xca\xe7\x90\x03\x1d\x16\x0e\x92\xc1\x5a\xd8\x3f\x5f\xc5\x46\xc6\x44\xeb\x84\x10\x1f\x64\xb3\x13\x69\x13\xb2\xd2\xde\x76\x94\x25\xca\x32\xde\x54\xf6\x59\x24\x19\xb7\x50\xaf\x4f\x9a\x26\x77\x59\x7d\x85\x38\x15\x3d\xbb\x7b\x50\xe0\xbb\x0f\x54\x2e\x13\x01\x18\xf6\xfa\x20\xe2\xc1\x31\x76\xfc\x01\x2f\xac\xa1\xaf\x3c\x71\x38\xf8\xc6\x64\x75\x4e\x8a\x9a\x28\xe7\x76\x78\x17\xdf\x08\xef\x91\x33\x2b\x52\x92\x53\x81\x2b\x92\x4b\xab\x14\xba\x9d\xae\x89\xcd\xbb\xc6\x25\x0a\x6c\x41\x9a\xd4\xcf\x3f\xb2\x0b\x33\x05\x3e\xac\x7a\xdb\x93\x10\xdf\xf3\x86\x92\xa1\xad\x76\x71\xb9\xd4\xc7\x1d\x53\x05\xf1\x2a\x36\xa0\x39\x64\x74\x6f\xda\xc1\x27\x42\x43\x8d\xa1\xb3\x8d\x36\x57\x10\x2b\x0f\x5d\x29\xf0\x3e\x42\xe7\x3b\x2a\x30\x2e\xcf\x8d\x1b\xa0\x9c\xf7\x8a\x81\x82\x44\x22\x42\x45\xb1\x2d\x6c\x1a\x24\x32\x6d\x2e\xee\x52\xbb\xdb\xa6\xe1\x73\xcc\x79\xe4\x7a\x5c\x41\x43\x45\xa2\x68\x0a\x75\x11\x21\x71\x6e\x0a\x09\x02\x29\x18\xe3\xad\x31\x0a\x02\x93\x73\xc5\x5d\x85\x8b\x56\x26\x8a\x66\x5c\x11\x5e\x73\x4a\x65\x05\x0c\xde\xba\xe5\x10\x7e" \ +"\x10\xea\x69\xbf\xb8\xb6\x1b\x3b\x98\x76\xb3\x72\x4e\x41\x0f\x15\x2b\xd7\x07\xd7\x6e\xcf\x98\x80\x0e\x6a\xbc\x49\xe6\xb7\x17\x65\x5c\x5f\xfa\x73\xf5\x28\x3a\xa7\x9d\xc9\x01\xe5\xe9\x27\xf3\x67\xfd\x68\x87\xf8\xdb\x4a\x7f\x5b\x87\xe0\xf0\x2a\x06\x46\x46\x30\x17\x34\x4e\x0c\xd4\xcb\x37\x86\x6c\x6b\xb9\xed\x81\x78\xea\x36\xf3\xfc\xe7\x13\xbe\xbe\x2e\x30\x73\xc8\x91\x77\xc3\x8c\x7a\x15\x55\x78\xbd\x21\xd0\x3b\x27\xb5\x39\x37\x80\x90\x95\x78\x41\x4d\x71\x4b\xcb\xc2\xfb\xd9\x4d\x6e\x38\x36\x5d\xf0\x65\xdb\x34\xae\xa3\x99\xc1\x18\x10\x70\x67\xb2\xfc\x39\x02\x07\x37\xb8\x50\xb0\xf8\x80\xec\x49\xfa\x42\xda\x3f\x10\xe6\x95\x20\x95\xed\xc7\xa8\x51\x93\x3f\xd3\xfb\x70\xdf\x3e\x5c\x3c\x72\x9c\xcb\x0c\xe1\xe8\xfa\xa6\x7b\xc2\xe3\x38\x52\x04\x68\xa8\xaa\x26\x5d\x7a\xe8\xcf\xe4\x44\x3a\xf7\xa2\x60\x80\x14\xf9\x72\x5d\x25\xc7\xe5\x98\x86\xa8\x0e\xd4\x99\x89\x1f\xf1\xbd\xa3\xdf\xf7\xc4\x16\x43\x1b\x69\x0a\xeb\x1c\x18\xb1\xf9\xe6\x13\xf7\x91\xe4\x97\xc3\x11\xc9\x5d\xe2\xa7\x4c\xe3\x55\xcf\xc8\x8b\x25\x94\x28\xf3\xd6\x3c\x37\xf1" \ +"\xb7\x7e\xa0\x61\x06\x81\x68\xb6\xcf\xfa\x4d\x7b\xeb\xd3\x9e\xab\x34\xab\xba\x35\x79\x18\x89\x69\xa4\xf7\xac\x84\xc9\x1f\x87\x7b\x00\xa4\xa4\xeb\xa7\x67\x3f\x28\x36\x66\x2e\xc5\xb9\xc2\x0e\xc3\x9f\xb6\x78\x04\x24\x0e\xc2\xdb\x9b\x17\xe9\x94\xa9\x71\x9e\x5c\x67\x44\xf7\x85\xd6\xfc\x09\xdc\x32\xc6\xfb\x4b\x22\x0a\x73\xd1\xac\x93\xa8\xb9\x51\x46\xae\x9b\x50\x6f\xf6\x4e\xc7\x9b\xc0\x02\xf1\xa2\x7b\x7b\x4d\xe4\x65\x16\xf1\x59\xf5\x3f\x03\xeb\x4c\xa2\x14\x0c\x51\xe4\xfe\x32\x92\x4c\x95\x70\xe2\x58\xe7\xa7\xe5\x1b\xfa\x15\x62\x54\xeb\xfb\xd5\xee\xd1\x6f\x22\x90\xb5\xbe\x16\x3c\x70\xf4\x62\xf1\x13\x33\xa3\x04\xc6\x08\x32\xc2\xc8\xf1\x9b\xc0\x61\x5f\xad\x31\x5e\xa9\x70\x15\x57\x17\xe5\xe2\x4b\x3c\x86\x7e\x15\x0a\x56\x54\xee\x71\x13\x4d\xcd\x03\x9e\x69\xf1\x62\x56\xed\xe9\xbe\x61\x88\xca\xea\x93\x79\xfd\x9c\xb0\xee\xde\x47\x23\xb9\x7f\xd4\xd3\x00\x56\x81\x83\x5d\x6f\xa7\x79\x8a\x45\xfb\x04\x5a\xe5\x2b\x30\x90\x8a\x00\x30\xf9\xca\xcb\x2e\x75\xaf\x1b\x60\xe6\x77\x5d\x9c\x81\xba\x7a\x85\x72\xa0\xc4\x32\x51\x61\x3f\x0d\xbc" \ +"\x92\x3f\x04\xdc\xde\xa5\x09\xec\x7c\x75\x91\x5b\xf4\xba\xe9\x23\x4e\xf1\x2d\x26\x7f\xb3\xa5\x14\xfd\x83\xab\x29\xe6\x9e\xa2\x53\x32\x13\x17\x53\x80\x79\x43\xf8\x11\x91\x62\x70\xbe\xfa\xed\xf3\xf8\x40\x92\x29\x10\x2c\x9a\x21\x3c\xa2\xa1\x9c\xe5\xb0\xac\x31\x2a\xf0\xeb\x55\x5a\xa2\x97\xaa\xb7\x1b\x15\xb7\x28\x86\xbb\xc1\x4b\xb7\x4c\x3f\xeb\x1b\x5a\x85\x1a\x8a\x53\x96\x4d\xce\xe9\xa6\xcc\x5a\x7d\xd3\x85\xe5\x0a\xa6\x0c\x92\xb8\x98\x6b\xf2\xf5\x34\x91\x9a\x22\xf9\x0d\x66\xfd\xd1\x14\x03\xe1\x58\x9c\x89\x1e\xb6\xce\xd3\xff\x95\x27\x40\x85\x10\x7d\x05\x73\xdc\x33\x7a\xf2\x79\xde\xd4\xef\xed\xd0\x1f\x48\x62\x24\x83\xb9\x09\x7c\x0e\x37\xec\xc4\x26\x44\x52\x11\xc5\xff\xa8\xc7\x9e\x5e\x34\x3a\x7e\x64\x39\x76\xb8\xd6\x2a\x41\xf9\x9c\x80\x52\x8b\xea\x3f\x77\x37\x59\x6c\xcf\xd1\xe2\x22\xc6\x86\x36\x83\x9a\x57\x60\x1f\x0b\xf1\x01\x0b\x61\x3d\xa7\x14\xdf\xbc\xa3\x1f\xfa\xbd\x0d\x1d\xc4\xd1\xda\x77\x66\x0d\xac\x95\x95\xdb\xfb\x40\xee\xd3\xd4\x88\x52\xed\x96\x8c\xbc\xc9\x7b\xbf\x53\x85\xc1\xfd\x19\x1b\xf6\x48\x3c\xd4\xe3\xf1" \ +"\xd1\xce\x8e\x1d\x0b\x0b\x92\xb6\xcb\xd6\x19\xc0\xec\xc5\xb0\x06\xd8\x69\x91\xbf\x73\xa1\x6b\xaa\xc2\x79\x94\xcd\x41\x74\x9d\x60\xad\xd9\x1e\x60\xae\xef\xb2\x97\x79\x2e\x03\x56\x41\x20\x78\xc3\x42\x56\x90\xce\x5b\x24\x94\x2a\xd8\xd0\xa4\xcb\x95\x45\xe6\x31\x4e\xe0\xb1\x17\xaf\x67\xbf\x6f\xb5\x82\xff\xd7\xbd\xad\x86\xbd\x40\x24\xe2\x86\x59\x74\x8a\x5c\x51\xf6\xca\x0a\xf3\x15\x51\xa5\xd2\xeb\x31\x63\xd9\x13\xb8\x36\x47\x66\x84\x31\x87\xe4\x9c\x43\xaa\x26\xad\xc8\xef\xf4\xff\x41\xd3\x64\xa1\x76\x6f\xda\xdb\x57\x17\x39\x09\xf6\x66\xfc\x9d\xcd\x62\x0c\x61\xc6\xb7\x8d\xdf\x9a\x17\xb4\x7b\x50\x9c\x90\xe7\x5f\x2a\x87\x1f\xf4\xa4\x79\x8a\x74\x9a\xcf\xde\x8a\x20\x54\xb9\x38\x72\x09\xf4\x0b\xd5\xed\xa6\x5b\x1f\xd9\x14\xb3\xa8\x79\x8b\xed\xb5\xdd\x5a\xae\x02\xb0\x22\xd2\x82\xf1\x82\xf0\xb2\x59\xb0\x82\xb9\xf3\x34\x65\x74\x70\x06\x3c\x54\x06\x6e\x1d\xf6\x42\x0a\xa4\x82\x2e\x4b\xa3\xb3\x2d\xfa\x20\x39\x30\x4a\xa9\x85\x2c\xa7\xf1\x67\x1f\x77\xf3\x4a\xd0\x04\xa2\x11\x0b\x48\x7e\x0a\x51\x75\xbc\x67\xde\xa3\x4e\xce\x48\xd8\x49" \ +"\x02\xdd\xe6\x7a\x6b\x8d\x7e\x01\xec\x3f\x33\xa9\xa0\x0e\xa5\xd0\xae\x09\x5b\x4a\xfc\x92\xc6\x4f\xee\xaf\x27\x66\x4b\x96\x28\x6d\x8f\x75\x4d\x99\xea\x52\x26\xa2\x17\xf2\x6b\x7c\xd9\x0d\x33\x37\x5c\x01\x1c\x8a\x3e\xd1\x45\xde\x3f\x3e\x96\xdd\x4a\xe8\xdc\xb5\x15\x24\xcb\xb6\xc1\xb7\xad\x71\x9d\xf1\xd0\x83\xac\x00\xb0\x37\xe5\x3f\x36\x54\xc5\x69\xc4\x9a\x3c\x34\x32\xbf\xe6\xca\x81\x55\xeb\x4b\xf5\xac\x3a\xe6\x00\xfb\xfa\x68\x7b\xf7\xe0\x78\x76\x1e\x32\xdf\x90\xe9\xf3\xd5\x3a\xe4\x7c\x18\xa8\xc2\x18\xc0\x04\x3f\x6b\x27\x37\xca\xc4\xfe\x95\x8d\xbd\x88\xda\x6c\xcb\x64\xc6\x79\xf0\xfc\xd0\xc8\xe6\xb2\x75\xc7\x02\x37\xa5\xd6\xd2\xf6\x8e\xb2\x3f\x56\xf9\x9c\x64\xac\xca\xc5\x94\xde\x4c\xb9\xdd\xf8\x47\x07\xe7\xe0\x9e\xec\x1b\x2c\x35\x3a\xb5\x41\xb0\x92\xdf\xfe\x05\xf9\xcf\xda\xa0\xd4\xf5\x0e\x72\xf6\x99\x8b\x37\xe6\x59\x8f\x7d\x85\x67\xf9\x7b\x5b\xe5\xc3\xd6\x41\xfb\xdb\x0b\x30\xa7\x48\x09\x83\x6e\xcf\xf4\xc5\x9f\x17\x33\xa1\x87\xfb\xdc\x34\xf2\x7a\xc7\x15\xe7\x22\xb9\x54\x8c\x70\x03\xa4\xe7\x40\xa2\xc0\x67\xb6\xa2\x70" \ +"\x02\x8e\x16\x94\x3e\x47\x4f\xe8\x55\x26\x0f\x57\xe6\xe8\x70\xcb\x5e\xe6\xac\xe9\xdb\x9e\xf6\x57\x3d\x9b\x16\x0e\x9d\x17\x3d\x63\xc4\x61\x46\xd8\xad\xec\xd3\x78\xc5\x1c\xe7\x2f\xd7\x42\x47\x2e\x42\x1c\x1d\xdf\x4d\xad\x90\x52\xdc\xde\x63\xe5\x4a\x35\x58\x74\x7b\xa2\xf0\xa8\xd8\x8e\xcd\x90\xb7\x7f\x87\x04\xa2\x5b\xb0\x4e\x1a\xb2\xf9\x68\xc3\x4c\x69\xce\x8f\x14\x9e\xdc\x16\x43\xc9\xed\x4e\xf1\x38\x6f\x3f\xa0\xf0\xa8\x83\xfd\x3e\x08\x33\x58\x2b\xae\xd9\xeb\xf3\x47\x32\xd2\x07\xeb\x38\x3f\x80\x6f\x20\xf4\xbb\xd9\xaa\x4d\x98\x41\x07\xc8\x1e\x2f\x53\x7e\x8b\xaa\x8e\xdb\xb8\x9c\x36\x66\xf9\x5e\x20\x02\xcc\xce\x4d\xe6\x3c\xb8\x8f\xa7\x6e\xf1\xcb\x3c\x2c\xae\x80\x96\xba\xd7\xda\xbd\x57\x6b\xd8\x54\x4c\xa6\xab\x5b\x17\x10\xd0\xd3\xb5\xea\x3d\xcb\xe0\xac\x80\x81\x42\x07\xf9\x00\x4b\x9d\xeb\x31\xf4\x9a\x9d\x6b\xcd\x46\x92\x26\xbc\x06\xda\x85\xe7\xcc\xa8\xea\x85\x11\xf5\x55\xfd\xa3\xf2\xa8\x38\x09\x63\x8e\xec\xed\x43\x14\xe2\x3c\x04\x56\x53\xd0\xf3\x13\x7f\xa8\x06\x9c\x43\xb3\x42\xaa\xf2\xd3\xaa\xc7\xbc\x47\xe7\xbf\x43\x2a" \ +"\x6d\x25\x75\x9a\xe7\x74\x3f\xe8\xce\x6b\x8d\x11\x7f\x8f\x4f\xf7\xa0\x3e\x97\xea\x74\x7e\x0e\xdf\x08\x05\x34\x52\x08\x63\x11\x09\x07\x04\xd0\x6a\x0b\xd0\x9c\x9d\x55\x33\xec\x80\x29\x42\x63\xf3\xdc\x99\x83\x6f\x4e\xbd\x5f\xdb\x33\x64\x29\x96\xbc\xda\x23\x25\xb0\x1f\x7a\xfc\xcf\xde\xd6\x8e\x5f\x13\x88\x9f\xc3\xd1\x27\xb6\x13\x61\xb9\x48\x53\xa5\xd0\xf9\x53\x04\xf4\xe6\x1e\x07\x0d\xa1\x5a\xc8\x79\x8a\x43\x97\xfc\xc5\xa5\x2c\xd7\x09\x51\x76\xb3\x9f\x0f\x03\x9c\x69\x97\x68\x6d\xa1\xca\x8f\xc7\x29\xbb\xac\x9a\x40\x69\x45\x43\xad\xe2\x22\xea\x6f\x45\xf4\x2d\xe6\x31\x0b\x12\x9e\x38\xb8\x37\x7c\x2e\xfc\xd7\x6d\xec\x7c\x9c\xac\x94\x9f\x2c\x93\x81\x32\x31\xe6\x80\xd5\x89\xa1\x7d\x8c\xde\x24\x5a\x75\xdf\x92\xed\x7a\x27\x76\xbc\x5d\x0b\x28\x31\x72\xe6\x50\x1f\xdd\x3a\xc7\xae\xc0\x70\x1f\xec\x62\x38\x4c\x1b\xc7\x4e\x1c\x30\x3e\xf6\xcf\x1e\x55\x32\x1f\x04\x8f\x3a\xf1\x83\x53\xcb\x46\xf1\x7c\x96\xa0\x58\x1e\xe3\xb1\xd5\x4b\x8b\x7a\x53\x53\x29\x61\x8c\x4e\x9d\xbc\xac\x55\x34\xca\x4c\x2f\x91\x4c\x7e\x90\xe4\x31\xef\x67\xc4\x95" \ +"\xcb\x85\x9f\xc9\xd7\xf1\x47\xf5\x72\x31\x7d\xe4\x16\xc0\xeb\xe6\xf6\xf7\x64\x6e\x4c\x4a\xd6\xe2\xdd\x78\x8c\xfa\x6c\x09\xcb\x28\x5c\x13\xb8\x88\x56\x4c\xfa\xb1\x40\x4c\xd6\x4f\xbe\x56\x08\x83\xb2\x00\xc8\xab\xf5\x90\x5e\x02\xec\x0b\xbb\x77\xa5\x53\x82\xfc\x31\x7e\xfe\x83\x26\x2b\xf5\xaa\x35\x07\xb7\xcd\x54\x47\x10\x7f\x56\xf9\x1f\xa9\x41\x21\xcf\x92\x6f\x9b\x2b\x91\x55\xfa\xd8\x26\x5f\x12\x81\xba\x0e\x03\x9e\x2b\xb7\x2c\xcd\x5a\x25\x8d\x1b\x82\x73\x04\x79\x43\x71\x2b\x6d\xfb\x47\x67\x20\x81\xa3\x49\x74\xfc\x20\x95\x11\x96\x75\xa8\xda\x38\xa3\xad\x7d\x54\x67\x88\xc3\x59\x2e\x1b\x2d\x99\x06\xb8\x51\x5d\x83\x1c\x2a\xab\x57\xb1\x87\x6d\x18\x4e\x50\x67\x6e\xa8\x03\xfb\xa5\x8b\xab\x19\x4d\xa6\xfa\xc1\xa6\xa8\xc3\xa0\x0c\x19\x6e\x24\x00\x84\xf7\xc7\xc3\x1e\xb1\x0e\xb0\xc5\x3a\x8e\x5d\x2b\x97\x7e\x1c\xb8\xe7\xb3\x71\xe3\x1a\xa5\x62\xb4\xb7\xda\xb6\x96\x7d\xe7\x66\xe7\xce\x27\x39\x79\xc1\x2b\x0b\xfe\xad\x1d\xfb\x2d\xab\x6a\x57\x72\x26\x3a\x99\x48\x54\xc1\x24\x02\x8e\xd7\x79\x93\xa0\x0b\x25\xf3\xd5\xd9\xb5\x98\x70\xbf" \ +"\x9b\xd9\x88\x75\xaf\xb6\x7d\x86\xda\x3a\xd4\xef\x27\xfa\x77\xdc\x71\xd6\x8f\xcc\x7c\x0b\x99\xc8\x9e\xd7\xfd\x28\x23\x11\xe8\x2d\xd9\x2f\xbf\x9f\xc7\x52\x29\x6a\x9e\xf4\xde\xfe\x85\x6d\x97\x2b\xbb\xcb\xa5\x3d\xa3\xcd\x07\xd9\x0c\xfc\x7b\x5a\xff\xff\x58\xdd\x7a\x4c\xad\xb9\x55\xb9\x21\xe4\xe2\xa1\x48\xd9\x22\xc5\x8c\xbe\x12\x07\x8e\xb1\xcb\x31\x5d\x5b\x0c\x0c\x1d\x23\x64\x88\x3a\x16\xae\x31\x47\xd1\xda\xc7\x7d\x33\x6e\x75\x2d\xcd\x8d\x51\xc0\x94\xd3\xee\xda\x54\xe3\xbf\xa0\x31\x6e\xcf\xbe\x08\x9c\xb8\xa7\x94\xe4\x45\x13\x27\x03\xd2\xcc\xc4\xe6\x7b\x40\x7b\x85\x73\x21\x55\x0f\x2d\x90\xda\x1f\xc0\x22\x3c\xd0\xa6\x71\x97\x7a\xf9\xab\xcf\x08\xa4\xcf\x8a\xf6\xd9\xfb\x22\x1b\x91\x90\x39\x3c\xa5\xcb\x75\xc7\x50\x8d\xda\x24\x41\x18\x73\x21\x98\x8b\x98\x22\x48\x63\xc0\xdb\x31\x41\xbb\xd9\x0e\xd0\x38\x3e\x8f\x0c\x33\xe1\xbb\x26\x13\x72\x53\x76\x75\x11\xf9\xe0\xb9\xe1\xed\x47\x4f\x43\x4b\x33\x00\x5c\x7b\x9b\x7a\x9a\x69\x65\xeb\x11\xa0\x23\x98\x6c\x2d\x97\x9a\x5c\x95\x3f\xff\x4d\x99\x68\x62\xd0\xfb\x70\xbd\x26\x66\xcd\x75" \ +"\xff\xe8\x96\x6d\x33\x46\x05\x0b\xe0\x29\x8d\xc8\xe3\xaa\x01\xdc\x22\x67\x70\xb9\xa9\xcf\x8d\xb7\xac\x3d\x81\x71\x7e\xc8\x3b\xc5\x5d\xf5\xf0\x3a\xe8\x28\x5a\x7d\x25\x86\xd2\x52\x76\xea\xc8\x73\xa9\x7c\xbc\x01\xac\xec\x1f\x4f\xd3\xd5\x92\xc3\xce\x69\x39\xf1\x3b\xed\x91\x20\x06\x18\xfd\x17\x3c\xd3\x02\x5e\x2a\xbe\xb4\xd5\xb1\x17\xa7\x68\x03\xe2\xab\xd0\x5f\x60\x39\x35\x8d\x73\x58\xae\x0a\xce\xea\x96\xb6\x9d\xf2\x5d\x61\x50\x09\x9a\x98\xa6\x5e\x8d\xee\xd4\x44\xe7\xf4\x00\x24\xa7\x02\x09\xa9\x10\x97\xaa\x21\x33\x01\x69\xd2\xc2\xe0\x92\xdd\xe3\x89\x3f\x90\x0e\x05\x8c\x1e\xc1\xcb\x2f\x5a\x14\xe9\xa9\x42\xc0\x5b\xfc\xa1\x8c\x43\xca\x0c\x18\xbe\xf2\x2e\xd0\x79\x08\xc2\xa4\xa4\x7d\xd8\xc2\xf2\x7d\x83\x23\x05\x2d\x12\x98\x9d\xf0\x23\x38\xf6\x90\xaf\x02\x07\x7b\x0d\x9e\xa8\x73\xdd\xc3\x36\xec\x23\x84\xf6\x07\x64\x6c\x78\x11\x17\xd2\x3d\xee\x26\x49\x95\x1c\xf9\x1d\x05\xe8\x1c\x83\x54\x4f\x9b\x1a\x52\x60\x96\xdb\x7a\xa7\xe7\x38\xe9\xb0\x9a\xd5\x7e\x0e\x9b\x0d\x44\x9d\x19\xec\xf4\x40\x7d\x4a\xf7\xf1\x7b\xb1\x66\x2b\xf4\x7a" \ +"\xad\x4b\x84\xf4\xf8\xec\xf6\xa1\x8a\x44\x56\x02\x34\x79\xe8\x60\x64\xcf\xee\xdb\x40\xc5\xa2\x08\x61\x90\x59\x79\x42\x92\xa6\xe9\x07\x91\xd9\xdf\x33\xfe\x80\x01\xd3\x01\x00\x00\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" \ +"\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x63\x6c\x65\x61\x72\x74\x6f\x6d\x61\x72\x6b\x0a\x80" \ +"\x03"}; diff --git a/source/blender/editors/datafiles/Makefile b/source/blender/editors/datafiles/Makefile new file mode 100644 index 00000000000..302267be505 --- /dev/null +++ b/source/blender/editors/datafiles/Makefile @@ -0,0 +1,49 @@ +# +# $Id: Makefile 14 2002-10-13 15:57:19Z hans $ +# +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2007 Blender Foundation +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL LICENSE BLOCK ***** +# +# Makes module object directory and bounces make to subdirectories. + +LIBNAME = editors_datafiles +DIR = $(OCGDIR)/blender/$(LIBNAME) + +include nan_compile.mk + +CFLAGS += $(LEVEL_1_C_WARNINGS) + +CPPFLAGS += -I$(OPENGL_HEADERS) + +# not very neat.... +CPPFLAGS += -I../../../blenkernel +CPPFLAGS += -I../../../blenlib +CPPFLAGS += -I../../../makesdna +CPPFLAGS += -I../../../imbuf +CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include + +# own include + +CPPFLAGS += -I../include diff --git a/source/blender/editors/datafiles/bfont.ttf.c b/source/blender/editors/datafiles/bfont.ttf.c new file mode 100644 index 00000000000..a52d6ded28a --- /dev/null +++ b/source/blender/editors/datafiles/bfont.ttf.c @@ -0,0 +1,5992 @@ +/* DataToC output of file */ + +int datatoc_bfont_ttf_size= 191532; +char datatoc_bfont_ttf[]= { + 0, 1, 0, 0, 0, 17, 1, 0, 0, 4, 0, 16, + 79, 83, 47, 50,150,230,175, 11, 0, 0, 1,152, 0, 0, 0, 86, 99,109, 97,112, 83, 13, 80,227, 0, 0, 28, 64, 0, 0, 3,138, + 99,118,116, 32, 0,105, 29, 57, 0, 0, 37,224, 0, 0, 1,254,102,101, 97,116,128, 29, 10, 57, 0, 2,233,124, 0, 0, 0, 80, +102,112,103,109,113, 52,118,106, 0, 0, 31,204, 0, 0, 0,171,103,108,121,102, 31, 47,248,201, 0, 0, 53, 40, 0, 1,229,240, +104,101, 97,100,232, 93,169,219, 0, 0, 1, 28, 0, 0, 0, 54,104,104,101, 97, 12,184, 14,241, 0, 0, 1, 84, 0, 0, 0, 36, +104,109,116,120,203, 81,215, 70, 0, 0, 1,240, 0, 0, 26, 78,107,101,114,110,239,172, 97,238, 0, 2, 27, 24, 0, 0, 60, 6, +108,111, 99, 97,253, 73,117,214, 0, 0, 39,224, 0, 0, 13, 72,109, 97,120,112, 10,234, 6,122, 0, 0, 1,120, 0, 0, 0, 32, +109,111,114,120,223,111, 12,226, 0, 2,213, 8, 0, 0, 20,116,110, 97,109,101,179,203,190,182, 0, 2, 87, 32, 0, 0, 65, 55, +112,111,115,116, 15, 42,244, 94, 0, 2,152, 88, 0, 0, 60,174,112,114,101,112, 59, 7,241, 0, 0, 0, 32,120, 0, 0, 5,104, +112,114,111,112, 68,181,210, 32, 0, 2,233,204, 0, 0, 2, 96, 0, 1, 0, 0, 0, 2,204,204, 16,228, 33, 70, 95, 15, 60,245, + 2, 27, 8, 0, 0, 0, 0, 0,192,243, 73,110, 0, 0, 0, 0,192,243, 73,110,247,214,252,235, 13,114, 8, 75, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7,109,254, 29, 0, 0, 13,226,247,214,252,109, 13,114, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,132, 0, 1, 0, 0, 6,163, 0, 93, 0, 9, 0,112, 0, 8, 0, 2, 0, 16, 0, 64, + 0, 8, 0, 0, 4, 21, 5,104, 0, 8, 0, 3, 0, 1, 4, 14, 1,144, 0, 5, 0, 0, 5, 51, 5,153, 0, 0, 3,215, 5, 51, + 5,153, 0, 0, 0, 0, 0,102, 2, 18, 0, 0, 2, 11, 6, 3, 3, 8, 4, 2, 2, 4,224, 0, 38,255, 64, 0, 4,255, 0, 4, + 0, 32, 0, 0, 0, 0, 80,102, 69,100, 0, 64, 0, 13,255,253, 6, 20,254, 20, 1,154, 7,109, 1,227, 96, 0, 1,255,191,255, + 0, 0, 0, 0, 4,205, 0,102, 0, 0, 0, 0, 2,170, 0, 0, 2,139, 0, 0, 3, 53, 1, 53, 3,174, 0,197, 6,180, 0,158, + 5, 23, 0,170, 7,154, 0,113, 6, 61, 0,129, 2, 51, 0,197, 3, 31, 0,176, 3, 31, 0,164, 4, 0, 0, 61, 6,180, 0,217, + 2,139, 0,158, 2,227, 0,100, 2,139, 0,219, 2,178, 0, 0, 5, 23, 0,135, 5, 23, 0,225, 5, 23, 0,150, 5, 23, 0,156, + 5, 23, 0,100, 5, 23, 0,158, 5, 23, 0,143, 5, 23, 0,168, 5, 23, 0,139, 5, 23, 0,129, 2,178, 0,240, 2,178, 0,158, + 6,180, 0,217, 6,180, 0,217, 6,180, 0,217, 4, 63, 0,147, 8, 0, 0,135, 5,121, 0, 16, 5,125, 0,201, 5,150, 0,115, + 6, 41, 0,201, 5, 14, 0,201, 4,154, 0,201, 6, 51, 0,115, 6, 4, 0,201, 2, 92, 0,201, 2, 92,255,150, 5, 63, 0,201, + 4,117, 0,201, 6,231, 0,201, 5,252, 0,201, 6, 76, 0,115, 4,211, 0,201, 6, 76, 0,115, 5,143, 0,201, 5, 20, 0,135, + 4,227,255,250, 5,219, 0,178, 5,121, 0, 16, 7,233, 0, 68, 5,123, 0, 61, 4,227,255,252, 5,123, 0, 92, 3, 31, 0,176, + 2,178, 0, 0, 3, 31, 0,199, 6,180, 0,217, 4, 0,255,236, 4, 0, 0,170, 4,231, 0,123, 5, 20, 0,186, 4,102, 0,113, + 5, 20, 0,113, 4,236, 0,113, 2,209, 0, 47, 5, 20, 0,113, 5, 18, 0,186, 2, 57, 0,193, 2, 57,255,219, 4,162, 0,186, + 2, 57, 0,193, 7,203, 0,186, 5, 18, 0,186, 4,229, 0,113, 5, 20, 0,186, 5, 20, 0,113, 3, 74, 0,186, 4, 43, 0,111, + 3, 35, 0, 55, 5, 18, 0,174, 4,188, 0, 61, 6,139, 0, 86, 4,188, 0, 59, 4,188, 0, 61, 4, 51, 0, 88, 5, 23, 1, 0, + 2,178, 1, 4, 5, 23, 1, 0, 6,180, 0,217, 5, 23, 0, 0, 3, 53, 1, 53, 5, 23, 0,172, 5, 23, 0,129, 5, 23, 0, 94, + 5, 23, 0, 82, 2,178, 1, 4, 4, 0, 0, 92, 4, 0, 0,215, 8, 0, 1, 27, 3,197, 0,115, 4,229, 0,158, 6,180, 0,217, + 2,227, 0,100, 8, 0, 1, 27, 4, 0, 0,213, 4, 0, 0,195, 6,180, 0,217, 3, 53, 0, 94, 3, 53, 0, 98, 4, 0, 1,115, + 5, 23, 0,174, 5, 23, 0,158, 2,139, 0,219, 4, 0, 1, 35, 3, 53, 0,137, 3,197, 0, 96, 4,229, 0,193, 7,193, 0,137, + 7,193, 0,137, 7,193, 0, 98, 4, 63, 0,143, 5,121, 0, 16, 5,121, 0, 16, 5,121, 0, 16, 5,121, 0, 16, 5,121, 0, 16, + 5,121, 0, 16, 7,203, 0, 8, 5,150, 0,115, 5, 14, 0,201, 5, 14, 0,201, 5, 14, 0,201, 5, 14, 0,201, 2, 92, 0,201, + 2, 92, 0,201, 2, 92, 0,201, 2, 92, 0,201, 6, 51, 0, 10, 5,252, 0,201, 6, 76, 0,115, 6, 76, 0,115, 6, 76, 0,115, + 6, 76, 0,115, 6, 76, 0,115, 6,180, 1, 25, 6, 76, 0,102, 5,219, 0,178, 5,219, 0,178, 5,219, 0,178, 5,219, 0,178, + 4,227,255,252, 4,215, 0,201, 5, 10, 0,186, 4,231, 0,123, 4,231, 0,123, 4,231, 0,123, 4,231, 0,123, 4,231, 0,123, + 4,231, 0,123, 7,219, 0,123, 4,102, 0,113, 4,236, 0,113, 4,236, 0,113, 4,236, 0,113, 4,236, 0,113, 2, 57,255,199, + 2, 57, 0,144, 2, 57,255,222, 2, 57,255,244, 4,229, 0,113, 5, 18, 0,186, 4,229, 0,113, 4,229, 0,113, 4,229, 0,113, + 4,229, 0,113, 4,229, 0,113, 6,180, 0,217, 4,229, 0, 72, 5, 18, 0,174, 5, 18, 0,174, 5, 18, 0,174, 5, 18, 0,174, + 4,188, 0, 61, 5, 20, 0,186, 4,188, 0, 61, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, + 4,231, 0,123, 5,150, 0,115, 4,102, 0,113, 5,150, 0,115, 4,102, 0,113, 5,150, 0,115, 4,102, 0,113, 5,150, 0,115, + 4,102, 0,113, 6, 41, 0,201, 5, 20, 0,113, 6, 51, 0, 10, 5, 20, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, + 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 6, 51, 0,115, + 5, 20, 0,113, 6, 51, 0,115, 5, 20, 0,113, 6, 51, 0,115, 5, 20, 0,113, 6, 51, 0,115, 5, 20, 0,113, 6, 4, 0,201, + 5, 18, 0,186, 7, 84, 0,201, 5,143, 0,120, 2, 92, 0,201, 2, 57,255,211, 2, 92, 0, 3, 2, 57,255,242, 2, 92, 0,201, + 2, 57,255,228, 2, 92, 0,176, 2, 57, 0,150, 2, 92, 0,201, 2, 57, 0,193, 4,184, 0,201, 4,114, 0,193, 2, 92,255,150, + 2, 57,255,219, 5, 63, 0,201, 4,162, 0,186, 4,162, 0,186, 4,117, 0,201, 2, 88, 0,193, 4,117, 0,201, 2, 57, 0,136, + 4,117, 0,201, 3, 0, 0,193, 4,117, 0,201, 2,188, 0,193, 4,127,255,242, 2, 70, 0, 2, 5,252, 0,201, 5, 18, 0,186, + 5,252, 0,201, 5, 18, 0,186, 5,252, 0,201, 5, 18, 0,186, 6,130, 0,205, 5,252, 0,213, 5, 18, 0,186, 6, 76, 0,115, + 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 8,143, 0,115, 8, 47, 0,113, 5,143, 0,201, + 3, 74, 0,186, 5,143, 0,201, 3, 74, 0,130, 5,143, 0,201, 3, 74, 0,186, 5, 20, 0,135, 4, 43, 0,111, 5, 20, 0,135, + 4, 43, 0,111, 5, 20, 0,135, 4, 43, 0,111, 5, 20, 0,135, 4, 43, 0,111, 4,227,255,250, 3, 35, 0, 55, 4,227,255,250, + 3, 35, 0, 55, 4,227,255,250, 3, 35, 0, 55, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, + 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 7,233, 0, 68, + 6,139, 0, 86, 4,227,255,252, 4,188, 0, 61, 4,227,255,252, 5,123, 0, 92, 4, 51, 0, 88, 5,123, 0, 92, 4, 51, 0, 88, + 5,123, 0, 92, 4, 51, 0, 88, 2,209, 0, 47, 5, 20, 0, 32, 5,225,255,151, 5,125, 0,201, 5, 20, 0,186, 5,125, 0, 0, + 5, 20, 0, 0, 5,160, 0,115, 5,150, 0,115, 4,102, 0,113, 6, 51, 0, 10, 6,141,255,151, 5,125, 0,201, 5, 20, 0,113, + 4,229, 0,113, 5, 14, 0,131, 6, 76, 0,117, 4,234, 0,164, 4,154,255,150, 2,209,255,127, 6, 51, 0,115, 5,126, 0, 8, + 7,180, 0,186, 2,212, 0,201, 2, 92, 0, 10, 5,133, 0,201, 4,162, 0,185, 2, 57, 0, 10, 4,188, 0, 61, 7,203, 0,178, + 5,252,255,150, 5, 18, 0,186, 6, 76, 0,115, 7, 78, 0,103, 4,229, 0,118, 7,151, 0,115, 6, 19, 0,113, 5, 55,255,151, + 5, 20, 0,184, 4,215, 0,201, 5, 20, 0, 69, 4, 43, 0,100, 5, 14, 0,201, 2,176,254,242, 3, 35, 0, 55, 4,227, 0, 24, + 3, 35, 0, 55, 4,227,255,250, 6,221, 0,173, 5, 18, 0,176, 6, 29, 0, 78, 5,196, 0,201, 5,145,255,252, 6,112, 0, 61, + 5,123, 0, 92, 4, 51, 0, 88, 5, 84, 0,160, 5, 84, 0, 92, 4,159, 0,104, 4, 51, 0,113, 5, 23, 0,150, 5, 84, 0, 93, + 4,159, 0,104, 4, 21, 0, 88, 5, 20, 0,186, 2, 92, 0,201, 3,240, 0,201, 3,172, 0, 20, 2, 93, 0,201, 11, 96, 0,201, + 10,100, 0,201, 9, 60, 0,113, 6,175, 0,201, 6, 75, 0,201, 3,167, 0,193, 7,115, 0,201, 7,100, 0,201, 6, 97, 0,186, + 5,121, 0, 16, 4,231, 0,123, 2, 92, 0,201, 2, 57,255,224, 6, 76, 0,115, 4,229, 0,113, 5,219, 0,178, 5, 18, 0,174, + 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, + 4,236, 0, 0, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 7,203, 0, 8, 7,219, 0,123, 6, 51, 0,115, + 5, 20, 0,113, 6, 51, 0,115, 5, 20, 0,113, 5, 63, 0,201, 4,162, 0,186, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, + 4,229, 0,113, 5, 84, 0,160, 4,159, 0,220, 2, 57,255,219, 11, 96, 0,201, 10,100, 0,201, 9, 60, 0,113, 6, 51, 0,115, + 5, 20, 0,113, 8,231, 0,201, 5,117, 0,201, 5,252, 0,201, 5, 18, 0,186, 5,121, 0, 16, 4,231, 0,123, 7,203, 0, 8, + 7,219, 0,123, 6, 76, 0,102, 4,229, 0, 72, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5, 14, 0,201, + 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 2, 92, 0,201, 2, 57,255,195, 2, 92, 0,201, 2, 57,255,228, 6, 76, 0,115, + 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 5,143, 0,201, 3, 74, 0,130, 5,143, 0,201, 3, 74, 0,186, 5,219, 0,178, + 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5, 20, 0,135, 4, 43, 0,111, 4,227,255,250, 3, 35, 0, 55, 5, 4, 0,156, + 4, 44, 0, 71, 6, 4, 0,201, 5, 18, 0,186, 5,226, 0,201, 6,180, 0,113, 5,150, 0,113, 4,226, 0,113, 5,123, 0, 92, + 4, 51, 0, 88, 5,121, 0, 16, 4,231, 0,123, 5, 14, 0,201, 4,236, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, + 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 4,227,255,252, 4,188, 0, 61, 3,204, 0,138, + 6,190, 0,186, 3,209, 0, 55, 2, 57,255,219, 7,252, 0,113, 7,252, 0,113, 5,121,255,253, 5,150, 0, 11, 4,102, 0, 9, + 4,117, 0, 10, 4,227,255,178, 4, 43, 0,111, 4, 51, 0, 88, 4,211, 0, 80, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 3, 60, 0,117, 3, 49, 0,117, 1,102,255,233, 2, 18, 0,117, 2, 93, 0, 71, 2, 94, 0, 71, + 3, 8, 0, 32, 4, 31, 0, 54, 2,251, 0, 38, 2, 51, 0,197, 3,174, 0,197, 2,139, 0,174, 2,139, 0,178, 2,139, 0,196, + 2,117, 0,117, 2,117, 0,117, 2,245, 0,117, 2,245, 0,117, 4, 0, 1, 11, 4, 0, 1, 11, 4, 0, 0,193, 4, 0, 0,193, + 4, 0, 0,193, 4, 0, 0,193, 2, 51, 0,214, 4, 0, 0,213, 4, 0, 1,115, 4, 0, 0,170, 2, 51, 0,214, 4, 0, 0,213, + 4, 0, 0,170, 4, 0, 1,115, 2,178, 0,111, 2,178, 0,111, 2,117, 0,117, 2,117, 0,117, 4, 0, 1, 31, 4, 0, 1, 31, + 3, 77, 0,193, 4, 0, 1, 31, 4, 0, 0,199, 4, 0, 1,154, 4, 0, 0,238, 4, 0, 1, 76, 4, 0, 0,182, 4, 0, 0,240, + 2,134,255,255, 4, 0, 0,239, 3,104, 0,117, 1, 84, 0,121, 2,252, 0,117, 3,141, 0,117, 2,245, 0,117, 3,242, 0,214, + 3,242, 0,214, 3,242, 0,214, 3,242, 0,214, 3,242, 0,214, 4, 0, 0,193, 4, 0, 0,213, 4, 0, 1, 21, 4, 0, 0,238, + 4, 0, 0,182, 0, 0,252,168, 0, 0,253,113, 0, 0,252,191, 0, 0,252,180, 0, 0,252,217, 0, 0,251,236, 0, 0,252,191, + 0, 0,253,164, 0, 0,252,213, 0, 0,253, 55, 0, 0,252,236, 0, 0,252,244, 0, 0,252,197, 0, 0,253,188, 0, 0,252,240, + 0, 0,252, 93, 0, 0,252,191, 0, 0,252,191, 0, 0,254, 31, 0, 0,253,144, 0, 0,253,144, 0, 0,255,121, 0, 0,252,168, + 0, 0,253,113, 0, 0,253, 12, 0, 0,253,188, 0, 0,254, 85, 0, 0,254,240, 0, 0,253,129, 0, 0,253, 11, 0, 0,253, 11, + 0, 0,253, 11, 0, 0,253, 11, 0, 0,253,122, 0, 0,253,119, 0, 0,253,154, 0, 0,252,213, 0, 0,252,236, 0, 0,253,106, + 0, 0,253, 35, 0, 0,253, 76, 0, 0,253,188, 0, 0,252,240, 0, 0,252, 99, 0, 0,252,197, 0, 0,252,191, 0, 0,252,191, + 0, 0,252,191, 0, 0,252,180, 0, 0,252,217, 0, 0,251,236, 0, 0,251,236, 0, 0,251,140, 0, 0,253,120, 0, 0,250,237, + 0, 0,251,104, 0, 0,250, 18, 0, 0,253,249, 0, 0,252,241, 0, 0,252,240, 0, 0,252, 99, 0, 0,253, 43, 0, 0,254, 6, + 0, 0,251,236, 0, 0,252,168, 0, 0,253,113, 0, 0,252,180, 0, 0,253,133, 0, 0,252,231, 0, 0,253,198, 0, 0,252,213, + 0, 0,253, 31, 0, 0,253, 21, 0, 0,253, 31, 0, 0,252,182, 0, 0,253, 72, 0, 0, 0, 0, 0, 0,252, 99, 0, 0,253, 51, + 0, 0,253,120, 0, 0,252,191, 0, 0,253, 43, 0, 0,253,120, 0, 0,255, 46, 0, 0,252,112, 0, 0,252,112, 0, 0,253, 42, + 0, 0,252,112, 0, 0,252,119, 2, 58, 0,160, 2, 58, 0,160, 4, 0, 1,182, 2,178, 0,158, 4, 0, 1,115, 4, 0, 0,215, + 5,138, 0, 16, 2,139, 0,219, 5,248,255,231, 6,248,255,243, 3, 68,255,237, 6,128,255,242, 6,153,255,225, 6,155,255,219, + 2,181, 0, 5, 5,121, 0, 16, 5,125, 0,201, 4,117, 0,201, 5,121, 0, 16, 5, 14, 0,201, 5,123, 0, 92, 6, 4, 0,201, + 6, 76, 0,115, 2, 92, 0,201, 5, 63, 0,201, 5,121, 0, 16, 6,231, 0,201, 5,252, 0,201, 5, 14, 0,201, 6, 76, 0,115, + 6, 4, 0,201, 4,211, 0,201, 5, 14, 0,201, 4,227,255,250, 4,227,255,252, 6, 76, 0,115, 5,123, 0, 61, 6, 76, 0,115, + 6, 29, 0, 78, 2, 92, 0,201, 4,227,255,252, 5, 70, 0,113, 4, 99, 0,133, 5, 60, 0,186, 2,181, 0,166, 4,161, 0,149, + 5, 70, 0,113, 5, 27, 0,191, 4,188, 0, 32, 4,229, 0,113, 4, 83, 0,133, 4, 90, 0,107, 5, 18, 0,186, 4,229, 0,113, + 2,181, 0,166, 4,183, 0,191, 4,188, 0, 61, 5, 23, 0,174, 4,120, 0, 74, 4,118, 0,107, 4,229, 0,113, 4,209, 0, 74, + 5, 20, 0,186, 4,178, 0,113, 5, 18, 0,113, 4,209, 0,100, 4,161, 0,149, 5, 71, 0,111, 4,159, 0, 59, 5, 71, 0,112, + 6,179, 0,135, 2,181, 0, 5, 4,161, 0,149, 4,229, 0,113, 4,161, 0,149, 6,179, 0,135, 4,234, 0,166, 4,244, 0,112, + 5,151, 0, 87, 6,189,255,225, 5,151, 0, 87, 5, 71, 0,112, 6,179, 0, 65, 5, 79, 0,111, 6, 76, 0,115, 4,229, 0,113, + 5, 48, 0,139, 4,178, 0,113, 4,154, 0,201, 3,171,255, 64, 5, 71, 0,179, 5, 71, 0,191, 6,236, 0,114, 5, 5, 0,119, + 7,120, 0,115, 6,179, 0,135, 6, 17, 0,115, 5, 70, 0,113, 6, 85, 0,201, 4,235, 0, 45, 5,126, 0, 79, 4,219, 0,100, + 6, 36, 0,115, 5, 0, 0, 54, 5,152, 0,115, 4,229, 0,113, 4,227, 0, 44, 4, 74, 0, 55, 5, 79, 0,111, 5, 20, 0,183, + 4,102, 0,113, 2, 57,255,219, 6, 76, 0,115, 4,236, 0,113, 4,236, 0,196, 4,215, 0,201, 5, 20, 0,186, 5,150, 0,115, + 6,231, 0,201, 5, 53, 0,127, 5, 20, 0, 85, 5,160, 0,115, 5,150, 0,115, 5,160, 0,115, 5, 14, 0,201, 5, 14, 0,201, + 6, 74,255,250, 4,117, 0,201, 5,150, 0,115, 5, 20, 0,135, 2, 92, 0,201, 2, 92, 0,201, 2, 92,255,150, 8,192, 0, 54, + 8, 92, 0,201, 6, 74,255,250, 5, 63, 0,201, 5,252, 0,201, 4,224, 0, 35, 6, 4, 0,201, 5,121, 0, 16, 5,125, 0,201, + 5,125, 0,201, 4,117, 0,201, 6, 54, 0, 49, 5, 14, 0,201, 6,232, 0, 59, 5, 23, 0,156, 5,252, 0,201, 5,252, 0,201, + 5, 63, 0,201, 6, 4, 0, 54, 6,231, 0,201, 6, 4, 0,201, 6, 76, 0,115, 6, 4, 0,201, 4,211, 0,201, 5,150, 0,115, + 4,227,255,250, 4,224, 0, 35, 6, 76, 0,115, 5,123, 0, 61, 6, 54, 0,201, 5,124, 0,175, 8, 6, 0,201, 8, 52, 0,201, + 6,169, 0, 50, 7, 15, 0,201, 5,125, 0,201, 5,150, 0,111, 8, 63, 0,211, 5,143, 0, 59, 4,231, 0,123, 4,229, 0,113, + 4,176, 0,186, 3,238, 0,186, 5, 96, 0, 50, 4,236, 0,113, 5,222, 0, 50, 4, 83, 0,133, 5, 65, 0,193, 5, 65, 0,193, + 4,213, 0,191, 5, 29, 0, 46, 6, 9, 0,193, 5, 73, 0,193, 4,229, 0,113, 5, 71, 0,193, 5, 20, 0,186, 4,102, 0,113, + 4, 59, 0, 5, 4,188, 0, 61, 7, 85, 0,113, 4,188, 0, 59, 5,114, 0,193, 4,186, 0,150, 6,251, 0,193, 7, 36, 0,193, + 5,160, 0, 42, 6, 31, 0,193, 4,183, 0,193, 4,100, 0,113, 6,128, 0,193, 4,208, 0, 50, 4,236, 0,113, 4,236, 0,113, + 5, 39, 0, 40, 3,238, 0,186, 4,100, 0,113, 4, 43, 0,111, 2, 57, 0,193, 2, 57,255,244, 2, 57,255,219, 7, 48, 0, 46, + 7, 34, 0,193, 5, 25, 0, 40, 4,213, 0,191, 5, 65, 0,193, 4,188, 0, 61, 5, 76, 0,193, 7,120, 0,115, 6,179, 0,135, + 5,125, 0, 33, 4,183, 0, 58, 7,138, 0,211, 5,254, 0,193, 7, 9, 0, 16, 6, 68, 0, 51, 9, 71, 0,201, 8, 3, 0,193, + 6, 76, 0,115, 4,229, 0,107, 8, 55, 0,201, 6,152, 0,193, 5, 23, 0,115, 4, 83, 0, 91, 6, 76, 0,115, 5, 71, 0,112, + 6, 76, 0,115, 4,229, 0,113, 6, 64, 0, 16, 5, 82, 0, 50, 6, 64, 0, 16, 5, 82, 0, 50, 5,150, 0,113, 4,226, 0,113, + 7,160, 0,115, 6, 17, 0,113, 7,120, 0,115, 6,179, 0,135, 7,120, 0,115, 6,179, 0,135, 5,150, 0,115, 4,102, 0,113, + 4,192, 0, 50, 0, 0,251,218, 0, 0,251,247, 0, 0,252, 34, 0, 0,252, 34, 3, 88,247,214, 3, 88,248, 88, 6, 46, 0,201, + 5,106, 0,193, 5,125, 0, 33, 4,183, 0, 38, 4,211, 0,201, 5, 20, 0,186, 4,117, 0,201, 3,238, 0,186, 4,117, 0, 71, + 3,238, 0, 56, 4,254, 0,201, 4, 61, 0,186, 6,232, 0, 59, 5,222, 0, 50, 5, 23, 0,156, 4, 83, 0,133, 5, 63, 0,201, + 4,213, 0,191, 5, 63, 0,201, 4,213, 0,191, 5, 63, 0, 33, 4,162, 0, 61, 6,107, 0, 50, 5,191, 0, 42, 6, 4, 0,201, + 5, 73, 0,193, 8, 29, 0,201, 7, 4, 0,193, 8,166, 0,201, 7, 83, 0,193, 6, 94, 0,115, 5, 54, 0,113, 5,150, 0,115, + 4,102, 0,113, 4,227,255,250, 4, 59, 0, 5, 4,227,255,252, 4,188, 0, 61, 4,227,255,252, 4,188, 0, 61, 5,123, 0, 61, + 4,188, 0, 59, 7,121,255,250, 6,116, 0, 5, 5,124, 0,175, 4,186, 0,150, 5,124, 0,175, 4,186, 0,150, 5,124, 0,175, + 5, 18, 0,186, 7,135, 0, 20, 5,211, 0, 15, 7,135, 0, 20, 5,211, 0, 15, 2, 57, 0,193, 6,232, 0, 59, 5,222, 0, 50, + 5, 63, 0,201, 4,213, 0,191, 6, 53, 0, 54, 5, 93, 0, 46, 6, 4, 0,201, 5, 73, 0,193, 6, 54, 0,201, 5,114, 0,193, + 5,124, 0,175, 4,186, 0,150, 7, 26, 0,201, 6, 50, 0,193, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, + 7,203, 0, 8, 7,219, 0,123, 5, 14, 0,201, 4,236, 0,113, 6, 76, 0,117, 4,236, 0, 0, 6, 76, 0,117, 4,236, 1, 43, + 6,232, 0, 59, 5,222, 0, 50, 5, 23, 0,156, 4, 83, 0,133, 5, 84, 0,160, 4,159, 0, 0, 5,252, 0,201, 5, 65, 0,193, + 5,252, 0,201, 5, 65, 0,193, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, 4,229, 0, 0, 6, 76, 0,115, 4,229, 1, 74, + 5,150, 0,111, 4,100, 0,113, 4,224, 0, 35, 4,188, 0, 61, 4,224, 0, 35, 4,188, 0, 61, 4,224, 0, 35, 4,188, 0, 61, + 5,124, 0,175, 4,186, 0,150, 4,117, 0,201, 3,238, 0,186, 7, 15, 0,201, 6, 31, 0,193, 5,125, 0,145, 4,183, 0,113, + 8, 12, 0,145, 7, 45, 0,113, 7,204, 0,201, 6,244, 0,171, 5,110, 0,201, 4,181, 0,171, 8,147, 0, 54, 7,168, 0, 46, + 8,148, 0,201, 7,189, 0,193, 6, 51, 0,115, 5, 71, 0, 0, 6, 47,255,250, 5,176, 0, 5, 6,239, 0,178, 5,219, 0,178, + 7, 15, 0,178, 7, 15, 0,178, 5,219, 0,178, 5, 38, 0,155, 5,219, 0,178, 5,219, 0,178, 6,206, 0,178, 7, 15, 0,178, + 5,219, 0,178, 5, 8, 0,178, 6,151, 0,178, 7,228, 0, 65, 5,219, 0,178, 5,168, 0,178, 5, 38, 0,143, 7, 15, 0,178, + 6, 55, 0, 92, 7, 15, 0,178, 5,219, 0,140, 6,185, 0, 92, 5,219, 0,178, 5,219, 0,178, 5,219, 0,178, 6, 83, 0,178, + 5, 38, 0,155, 7, 15, 0,178, 5,219, 0,178, 7, 15, 0,178, 5, 20, 0,135, 5,219, 0,178, 5,219, 0,140, 6,101, 0,178, + 6, 76, 0,115, 6, 82, 0, 92, 6, 76, 0,115, 5, 20, 0,135, 2,117, 0,117, 2,139, 0,178, 4, 0, 0, 94, 4, 0, 0,120, + 3, 34, 0,158, 4, 54, 0, 94, 4, 0, 0, 90, 7,203, 0,186, 5, 18, 0,186, 5,147, 0,113, 5,157, 0,186, 5, 18, 0,174, + 5,147, 0,113, 4, 68, 0,174, 5, 18, 0,186, 5,154, 0,186, 5,147, 0,113, 5, 18, 0,186, 3, 59, 0,193, 7,189, 0,186, + 5, 32, 0,113, 5, 18, 0,174, 5, 18, 0,186, 5, 20, 0,113, 5,157, 0,186, 5, 18, 0,174, 5, 70, 0,174, 2, 57,255,219, + 6, 20, 0, 49, 4, 32, 0,159, 5, 18, 0,186, 3,159, 0, 70, 7,203, 0, 0, 4, 32, 0,159, 5, 18, 0,186, 5, 18, 0,174, + 5,145, 0,174, 7,202, 0,174, 5, 18, 0,186, 5, 20, 0,113, 3, 59, 0,193, 7,202, 0,174, 5, 47, 0, 0, 4,229, 0,113, + 5, 8, 0,122, 6, 26, 0,174, 2,178, 0,240, 3,119, 0, 96, 2,149, 0,219, 5,121, 0, 16, 4,231, 0,123, 5,125, 0,201, + 5, 20, 0,186, 5,125, 0,201, 5, 20, 0,186, 5,125, 0,201, 5, 20, 0,186, 5,150, 0,115, 4,102, 0,113, 6, 41, 0,201, + 5, 20, 0,113, 6, 41, 0,201, 5, 20, 0,113, 6, 41, 0,201, 5, 20, 0,113, 6, 41, 0,201, 5, 20, 0,113, 6, 41, 0,201, + 5, 20, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, + 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 4,154, 0,201, 2,209, 0, 47, 6, 51, 0,115, 5, 20, 0,113, 6, 4, 0,201, + 5, 18, 0,186, 6, 4, 0,201, 5, 18, 0,186, 6, 4, 0,201, 5, 18,255,235, 6, 4, 0, 17, 5, 18, 0, 2, 6, 4, 0,201, + 5, 18, 0,186, 2, 92, 0, 0, 2, 57, 0, 39, 2, 92, 0,201, 2, 57, 0,193, 5, 63, 0,201, 4,162, 0,186, 5, 63, 0,201, + 4,162, 0,186, 5, 63, 0,201, 4,162, 0,186, 4,117, 0,201, 2, 57, 0,182, 4,117, 0, 3, 2, 57,255,242, 4,117, 0,201, + 2, 57, 0, 39, 4,117, 0,201, 2, 57,255,222, 6,231, 0,201, 7,203, 0,186, 6,231, 0,201, 7,203, 0,186, 6,231, 0,201, + 7,203, 0,186, 5,252, 0,201, 5, 18, 0,186, 5,252, 0,201, 5, 18, 0,186, 5,252, 0,201, 5, 18, 0,186, 5,252, 0,201, + 5, 18, 0,186, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, + 4,229, 0,113, 4,211, 0,201, 5, 20, 0,186, 4,211, 0,201, 5, 20, 0,186, 5,143, 0,201, 3, 74, 0,186, 5,143, 0,201, + 3, 74, 0,186, 5,143, 0,201, 3, 74, 0,186, 5,143, 0,201, 3, 74, 0, 84, 5, 20, 0,135, 4, 43, 0,111, 5, 20, 0,135, + 4, 43, 0,111, 5, 20, 0,135, 4, 43, 0,111, 5, 20, 0,135, 4, 43, 0,111, 5, 20, 0,135, 4, 43, 0,111, 4,227,255,250, + 3, 35, 0, 55, 4,227,255,250, 3, 35, 0, 55, 4,227,255,250, 3, 35, 0, 55, 4,227,255,250, 3, 35, 0, 55, 5,219, 0,178, + 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, + 5, 18, 0,174, 5,121, 0, 16, 4,188, 0, 61, 5,121, 0, 16, 4,188, 0, 61, 7,233, 0, 68, 6,139, 0, 86, 7,233, 0, 68, + 6,139, 0, 86, 7,233, 0, 68, 6,139, 0, 86, 7,233, 0, 68, 6,139, 0, 86, 7,233, 0, 68, 6,139, 0, 86, 5,123, 0, 61, + 4,188, 0, 59, 5,123, 0, 61, 4,188, 0, 59, 4,227,255,252, 4,188, 0, 61, 5,123, 0, 92, 4, 51, 0, 88, 5,123, 0, 92, + 4, 51, 0, 88, 5,123, 0, 92, 4, 51, 0, 88, 5, 18, 0,186, 3, 35, 0, 4, 6,139, 0, 86, 4,188, 0, 61, 4,231, 0,123, + 2,209, 0, 47, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, + 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, + 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, 4,231, 0,123, 5,121, 0, 16, + 4,231, 0,123, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, + 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, 4,236, 0,113, 5, 14, 0,201, + 4,236, 0,113, 2, 92, 0, 90, 2, 57, 0, 68, 2, 92, 0,200, 2, 57, 0,183, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, + 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 6, 76, 0,115, + 4,229, 0,113, 6, 76, 0,115, 4,229, 0,113, 7, 78, 0,103, 4,229, 0,118, 7, 78, 0,103, 4,229, 0,118, 7, 78, 0,103, + 4,229, 0,118, 7, 78, 0,103, 4,229, 0,118, 7, 78, 0,103, 4,229, 0,118, 5,219, 0,178, 5, 18, 0,174, 5,219, 0,178, + 5, 18, 0,174, 6,221, 0,173, 5, 18, 0,176, 6,221, 0,173, 5, 18, 0,176, 6,221, 0,173, 5, 18, 0,176, 6,221, 0,173, + 5, 18, 0,176, 6,221, 0,173, 5, 18, 0,176, 4,227,255,252, 4,188, 0, 61, 4,227,255,252, 4,188, 0, 61, 4,227,255,252, + 4,188, 0, 61, 4,227,255,252, 4,188, 0, 61, 4, 0, 1,134, 4, 0, 1,115, 4, 0, 1,134, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 2,163, 0, 0, 2, 0, 0, 0, 1, 86, 0, 0, 5, 23, 0, 0, 2,139, 0, 0, 1,153, 0, 0, + 0,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,227, 0,100, 2,227, 0,100, + 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 1, 4, 4, 0,255,236, 2,139, 0,174, 2,139, 0,178, + 2,139, 0,174, 2,139, 0,178, 4, 37, 0,174, 4, 37, 0,174, 4, 37, 0,174, 4, 37, 0,174, 4, 0, 0, 57, 4, 0, 0, 57, + 4,184, 1, 51, 4,184, 1, 51, 2,173, 0,236, 5, 87, 0,236, 8, 0, 0,236, 2,139, 0,220, 10,188, 0,113, 13,226, 0,113, + 1,209, 0, 40, 2,253, 0, 40, 4, 41, 0, 40, 1,209, 0, 40, 2,253, 0, 40, 4, 41, 0, 40, 2,182, 0, 11, 3, 51, 0,158, + 3, 51, 0,193, 6,180, 0,195, 3,226, 0,147, 4, 63, 0,147, 4, 0,255,236, 6,110,255,167, 6,110,255,167, 2, 0,255,170, + 8, 0, 0, 61, 4, 0, 0,221, 1, 86,254,137, 3, 31, 0,176, 3, 31, 0,176, 7, 96, 0, 73, 5,221, 0,147, 5,221, 0,147, + 3,240, 0,111, 5, 23, 0,236, 4, 0, 0,216, 4, 0, 0,216, 4, 0, 0, 61, 2,178, 1, 29, 6,110,255,167, 4, 0, 0, 61, + 3,153, 0,145, 6,180, 0,217, 6,110,255,167, 6,180, 1, 56, 4,176, 0,250, 5, 78, 0, 40, 6,180, 1,102, 6,180, 1,102, + 2,139, 0,219, 6, 97, 0,100, 6,180, 0,112, 2,139, 0,219, 2,139, 0,219, 3, 53, 0, 87, 1,110, 0,121, 3, 53, 0, 63, + 3, 53, 0,102, 3, 53, 0, 92, 3, 53, 0,108, 3, 53, 0, 89, 3, 53, 0, 83, 4, 57, 0,137, 4, 57, 0,137, 4, 57, 0,137, + 1,247, 0,111, 1,247, 0,103, 3, 49, 0,117, 3, 53, 0, 87, 3, 53, 0,137, 3, 53, 0, 94, 3, 53, 0, 98, 3, 53, 0, 63, + 3, 53, 0,102, 3, 53, 0, 92, 3, 53, 0,108, 3, 53, 0, 89, 3, 53, 0, 83, 4, 57, 0,137, 4, 57, 0,137, 4, 57, 0,137, + 1,247, 0,111, 1,247, 0,103, 7, 4, 0, 86, 5, 23, 0,115, 5, 23, 0, 96, 5, 23, 0,133, 5, 23, 0,129, 7,203, 0,186, + 5,252, 0,117, 10, 46, 0,201, 8,151, 0,201, 7,233, 0, 59, 6, 70, 0, 95, 5, 23, 0,129, 5, 23, 0, 0, 5, 23, 0, 40, + 5, 23, 0, 20, 8,117, 0, 27, 5, 23, 0, 68, 6, 49, 0,117, 5, 33, 0,170, 0, 0,252, 61, 0, 0,252, 61, 8, 38, 0, 67, + 8,252, 0,195, 5, 35,255,214, 8, 38, 0, 60, 8,137, 0, 60, 7,157, 0,195, 5, 18, 0, 72, 5, 18, 0, 34, 5,148, 0,106, + 3, 78,255,228, 9, 81, 0,201, 8, 0, 1, 27, 5,148, 0,110, 6,131, 0, 83, 6, 87, 0,118, 7, 44, 0,169, 8, 40, 1, 3, + 8,152,255,252, 8, 0, 1, 39, 6, 29, 0, 78, 6, 29, 0, 78, 5, 63, 0,201, 5,121, 0, 16, 6,214, 0,125, 4,154, 0,201, + 3,178, 0,104, 5,246, 0,103, 9,141, 0,151, 6, 61, 0, 59, 7,193, 0,137, 7,193, 0, 94, 7,193, 0,137, 7,193, 0, 94, + 7,193, 0, 98, 7,193, 0, 63, 7,193, 0,137, 7,193, 0,102, 7,193, 0,137, 7,193, 0, 98, 7,193, 0,102, 7,193, 0,108, + 4,139, 0,137, 2, 92, 0,201, 3,240, 0,201, 5,132, 0,201, 7, 98, 0,201, 5,121, 0, 16, 7, 97, 0, 16, 8,245, 0, 16, + 10,137, 0, 16, 7, 87, 0,201, 5,123, 0, 61, 7,119, 0, 61, 9, 13, 0, 61, 4,117, 0,201, 5,150, 0,115, 6, 41, 0,201, + 6,231, 0,201, 2, 57, 0,193, 3,169, 0,193, 5, 25, 0,193, 6,126, 0,193, 4,188, 0, 61, 6,125, 0, 61, 7,237, 0, 61, + 9, 93, 0, 61, 6,141, 0,193, 4,188, 0, 59, 6,148, 0, 59, 8, 4, 0, 59, 2, 57, 0,193, 4,102, 0,113, 5, 20, 0,113, + 7,203, 0,186, 9,246, 0,121, 6, 41, 0,201, 9,246, 0,121, 5,160, 0,115, 6,180, 0,100, 6,180, 1,163, 6,180, 0,117, + 6,180, 1,163, 6,180, 0,100, 6,180, 1,163, 6,180, 1, 32, 6,180, 1, 32, 6,180, 1, 32, 6,180, 1, 32, 6,180, 0,100, + 6,180, 0,217, 6,180, 0,217, 6,180, 0,217, 1, 86,254,137, 5, 24, 1,138, 5, 2, 0,190, 5, 2, 1, 68, 2,139, 0,219, + 5, 25, 0, 61, 5, 25, 0, 61, 5, 25, 0, 61, 5,106, 0,221, 6,170, 0,221, 8, 0, 0,247, 6,180, 0,217, 8, 0, 0,172, + 3, 31, 0,183, 3, 31, 0,164, 7, 44, 0,152, 7, 44, 0,152, 7, 44, 0,152, 7, 44, 0,152, 7, 44, 0,152, 7, 44, 0,152, + 7, 44, 0,152, 7, 44, 0,152, 7, 44, 0,152, 7, 44, 0,152, 7, 44, 0,170, 5, 30, 0,170, 5,220, 0, 0, 5,131, 0, 47, + 5, 10, 0, 47, 5, 10, 0, 47, 7,188, 0, 47, 7,188, 0, 47, 5,125, 0, 47, 6,227, 0,111, 9,157, 0,170, 9,157, 0,174, + 9,145, 0,174, 9,125, 0,174, 12, 60, 0,174, 8, 52, 0, 30, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 28, + 0, 1, 0, 0, 0, 0, 2,132, 0, 3, 0, 1, 0, 0, 0, 28, 0, 4, 2,104, 0, 0, 0,150, 0,128, 0, 6, 0, 22, 0, 0, + 0,126, 2, 65, 2, 89, 2, 98, 2,112, 2,117, 2,146, 2,233, 2,238, 2,243, 2,247, 3, 78, 3, 83, 3, 88, 3, 93, 3, 98, + 3,117, 3,122, 3,126, 3,138, 3,140, 3,161, 3,206, 4,134, 4,206, 4,249, 5, 15, 5, 86, 5, 95, 5,135, 5,138, 6, 12, + 30,155, 30,249, 31,191, 31,254, 32, 39, 32, 94, 32,113, 32,142, 32,175, 32,177, 32,181, 32,215, 33, 0, 33, 6, 33, 9, 33, 15, + 33, 17, 33, 19, 33, 24, 33, 30, 33, 34, 33, 39, 33, 43, 33, 46, 33, 50, 33, 53, 33, 59, 33, 75, 33,131, 33,153, 33,181, 34, 30, + 35, 25, 35, 37, 35, 42, 36,105, 38,177, 40, 0,251, 6,251, 23,255,253,255,255, 0, 0, 0, 0, 0, 32, 0,160, 2, 89, 2, 98, + 2,112, 2,117, 2,146, 2,176, 2,236, 2,243, 2,247, 3, 0, 3, 81, 3, 87, 3, 92, 3, 96, 3,116, 3,122, 3,126, 3,132, + 3,140, 3,142, 3,163, 3,208, 4,136, 4,208, 5, 0, 5, 49, 5, 89, 5, 97, 5,137, 6, 12, 30, 0, 30,160, 31,191, 31,253, + 32, 0, 32, 48, 32,112, 32,116, 32,160, 32,177, 32,180, 32,214, 33, 0, 33, 3, 33, 9, 33, 14, 33, 17, 33, 19, 33, 22, 33, 28, + 33, 32, 33, 38, 33, 42, 33, 46, 33, 50, 33, 52, 33, 59, 33, 75, 33, 83, 33,144, 33,181, 34, 18, 35, 24, 35, 37, 35, 41, 36, 96, + 38,176, 40, 0,251, 0,251, 19,255,253,255,255, 0, 0,255,227,255,194,255,171,255,163,255,150,255,146,255,118,255, 89,255, 87, +255, 83,255, 80,255, 72,255, 70,255, 67,255, 64,255, 62,255, 45,255, 41,255, 38,255, 33,255, 32,255, 31,255, 30,255, 29,255, 28, +255, 27,255, 21,254,244,254,242,254,241,254,240,254,111,230,124,230,120,229,179,229,118,229,117,229,109,229, 92,229, 90,229, 73, +229, 72,229, 70,229, 38,228,254,228,252,228,250,228,246,228,245,228,244,228,242,228,239,228,238,228,235,228,233,228,231,228,228, +228,227,228,222,228,207,228,200,228,188,228,161,228, 69,227, 76,227, 65,227, 62,226, 9,223,195,222,117, 11,118, 11,106, 6,133, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 0,134,135, +137,139,147,152,158,163,162,164,166,165,167,169,171,170,172,173,175,174,176,177,179,181,180,182,184,183,188,187,189,190, 0,114, +100,101,105, 0,120,161,112,107, 0,118,106, 0,136,154, 0,115, 0, 0,103,119, 0, 0, 0, 0, 0,108,124, 0,168,186,129, 99, +110, 0, 0, 0, 0,109,125, 0, 98,130,133,151, 0, 0, 0, 0, 0, 0, 0, 0,185, 0,193, 0, 0, 0, 0, 0, 0, 0, 0,121, + 0, 0, 0,132,140,131,141,138,143,144,145,142,149,150, 0,148,156,157,155, 0, 0, 0,113, 0, 0, 0,122, 0, 0, 0, 0, 0, +183, 7, 6, 5, 4, 3, 2, 1, 0, 44, 32, 16,176, 2, 37, 73,100,176, 64, 81, 88, 32,200, 89, 33, 45, 44,176, 2, 37, 73,100, +176, 64, 81, 88, 32,200, 89, 33, 45, 44, 32, 16, 7, 32,176, 0, 80,176, 13,121, 32,184,255,255, 80, 88, 4, 27, 5, 89,176, 5, + 28,176, 3, 37, 8,176, 4, 37, 35,225, 32,176, 0, 80,176, 13,121, 32,184,255,255, 80, 88, 4, 27, 5, 89,176, 5, 28,176, 3, + 37, 8,225, 45, 44, 75, 80, 88, 32,176,253, 69, 68, 89, 33, 45, 44,176, 2, 37, 69, 96, 68, 45, 44, 75, 83, 88,176, 2, 37,176, + 2, 37, 69, 68, 89, 33, 33, 45, 44, 69, 68, 45, 44,176, 2, 37,176, 2, 37, 73,176, 5, 37,176, 5, 37, 73, 96,176, 32, 99,104, + 32,138, 16,138, 35, 58,138, 16,101, 58, 45, 0,184, 2,128, 64,255,251,254, 3,250, 20, 3,249, 37, 3,248, 50, 3,247,150, 3, +246, 14, 3,245,254, 3,244,254, 3,243, 37, 3,242, 14, 3,241,150, 3,240, 37, 3,239,138, 65, 5,239,254, 3,238,150, 3,237, +150, 3,236,250, 3,235,250, 3,234,254, 3,233, 58, 3,232, 66, 3,231,254, 3,230, 50, 3,229,228, 83, 5,229,150, 3,228,138, + 65, 5,228, 83, 3,227,226, 47, 5,227,250, 3,226, 47, 3,225,254, 3,224,254, 3,223, 50, 3,222, 20, 3,221,150, 3,220,254, + 3,219, 18, 3,218,125, 3,217,187, 3,216,254, 3,214,138, 65, 5,214,125, 3,213,212, 71, 5,213,125, 3,212, 71, 3,211,210, + 27, 5,211,254, 3,210, 27, 3,209,254, 3,208,254, 3,207,254, 3,206,254, 3,205,150, 3,204,203, 30, 5,204,254, 3,203, 30, + 3,202, 50, 3,201,254, 3,198,133, 17, 5,198, 28, 3,197, 22, 3,196,254, 3,195,254, 3,194,254, 3,193,254, 3,192,254, 3, +191,254, 3,190,254, 3,189,254, 3,188,254, 3,187,254, 3,186, 17, 3,185,134, 37, 5,185,254, 3,184,183,187, 5,184,254, 3, +183,182, 93, 5,183,187, 3,183,128, 4,182,181, 37, 5,182, 93, 64,255, 3,182, 64, 4,181, 37, 3,180,254, 3,179,150, 3,178, +254, 3,177,254, 3,176,254, 3,175,254, 3,174,100, 3,173, 14, 3,172,171, 37, 5,172,100, 3,171,170, 18, 5,171, 37, 3,170, + 18, 3,169,138, 65, 5,169,250, 3,168,254, 3,167,254, 3,166,254, 3,165, 18, 3,164,254, 3,163,162, 14, 5,163, 50, 3,162, + 14, 3,161,100, 3,160,138, 65, 5,160,150, 3,159,254, 3,158,157, 12, 5,158,254, 3,157, 12, 3,156,155, 25, 5,156,100, 3, +155,154, 16, 5,155, 25, 3,154, 16, 3,153, 10, 3,152,254, 3,151,150, 13, 5,151,254, 3,150, 13, 3,149,138, 65, 5,149,150, + 3,148,147, 14, 5,148, 40, 3,147, 14, 3,146,250, 3,145,144,187, 5,145,254, 3,144,143, 93, 5,144,187, 3,144,128, 4,143, +142, 37, 5,143, 93, 3,143, 64, 4,142, 37, 3,141,254, 3,140,139, 46, 5,140,254, 3,139, 46, 3,138,134, 37, 5,138, 65, 3, +137,136, 11, 5,137, 20, 3,136, 11, 3,135,134, 37, 5,135,100, 3,134,133, 17, 5,134, 37, 3,133, 17, 3,132,254, 3,131,130, + 17, 5,131,254, 3,130, 17, 3,129,254, 3,128,254, 3,127,254, 3, 64,255,126,125,125, 5,126,254, 3,125,125, 3,124,100, 3, +123, 84, 21, 5,123, 37, 3,122,254, 3,121,254, 3,120, 14, 3,119, 12, 3,118, 10, 3,117,254, 3,116,250, 3,115,250, 3,114, +250, 3,113,250, 3,112,254, 3,111,254, 3,110,254, 3,108, 33, 3,107,254, 3,106, 17, 66, 5,106, 83, 3,105,254, 3,104,125, + 3,103, 17, 66, 5,102,254, 3,101,254, 3,100,254, 3, 99,254, 3, 98,254, 3, 97, 58, 3, 96,250, 3, 94, 12, 3, 93,254, 3, + 91,254, 3, 90,254, 3, 89, 88, 10, 5, 89,250, 3, 88, 10, 3, 87, 22, 25, 5, 87, 50, 3, 86,254, 3, 85, 84, 21, 5, 85, 66, + 3, 84, 21, 3, 83, 1, 16, 5, 83, 24, 3, 82, 20, 3, 81, 74, 19, 5, 81,254, 3, 80, 11, 3, 79,254, 3, 78, 77, 16, 5, 78, +254, 3, 77, 16, 3, 76,254, 3, 75, 74, 19, 5, 75,254, 3, 74, 73, 16, 5, 74, 19, 3, 73, 29, 13, 5, 73, 16, 3, 72, 13, 3, + 71,254, 3, 70,150, 3, 69,150, 3, 68,254, 3, 67, 2, 45, 5, 67,250, 3, 66,187, 3, 65, 75, 3, 64,254, 3, 63,254, 3, 62, + 61, 18, 5, 62, 20, 3, 61, 60, 15, 5, 61, 18, 3, 60, 59, 13, 5, 60, 64,255, 15, 3, 59, 13, 3, 58,254, 3, 57,254, 3, 56, + 55, 20, 5, 56,250, 3, 55, 54, 16, 5, 55, 20, 3, 54, 53, 11, 5, 54, 16, 3, 53, 11, 3, 52, 30, 3, 51, 13, 3, 50, 49, 11, + 5, 50,254, 3, 49, 11, 3, 48, 47, 11, 5, 48, 13, 3, 47, 11, 3, 46, 45, 9, 5, 46, 16, 3, 45, 9, 3, 44, 50, 3, 43, 42, + 37, 5, 43,100, 3, 42, 41, 18, 5, 42, 37, 3, 41, 18, 3, 40, 39, 37, 5, 40, 65, 3, 39, 37, 3, 38, 37, 11, 5, 38, 15, 3, + 37, 11, 3, 36,254, 3, 35,254, 3, 34, 15, 3, 33, 1, 16, 5, 33, 18, 3, 32,100, 3, 31,250, 3, 30, 29, 13, 5, 30,100, 3, + 29, 13, 3, 28, 17, 66, 5, 28,254, 3, 27,250, 3, 26, 66, 3, 25, 17, 66, 5, 25,254, 3, 24,100, 3, 23, 22, 25, 5, 23,254, + 3, 22, 1, 16, 5, 22, 25, 3, 21,254, 3, 20,254, 3, 19,254, 3, 18, 17, 66, 5, 18,254, 3, 17, 2, 45, 5, 17, 66, 3, 16, +125, 3, 15,100, 3, 14,254, 3, 13, 12, 22, 5, 13,254, 3, 12, 1, 16, 5, 12, 22, 3, 11,254, 3, 10, 16, 3, 9,254, 3, 8, + 2, 45, 5, 8,254, 3, 7, 20, 3, 6,100, 3, 4, 1, 16, 5, 4,254, 3, 64, 21, 3, 2, 45, 5, 3,254, 3, 2, 1, 16, 5, + 2, 45, 3, 1, 16, 3, 0,254, 3, 1,184, 1,100,133,141, 1, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 29, 1, 53, 0,184, 0,203, 0,203, 0,193, 0,170, + 0,156, 1,166, 0,184, 0,102, 0, 0, 0,113, 0,203, 0,160, 2,178, 0,133, 0,117, 0,184, 0,195, 1,203, 1,137, 2, 45, + 0,203, 0,166, 0,240, 0,211, 0,170, 0,135, 0,203, 3,170, 4, 0, 1, 74, 0, 51, 0,203, 0, 0, 0,217, 5, 2, 0,244, + 1, 84, 0,180, 0,156, 1, 57, 1, 20, 1, 57, 7, 6, 4, 0, 4, 78, 4,180, 4, 82, 4,184, 4,231, 4,205, 0, 55, 4,115, + 4,205, 4, 96, 4,115, 1, 51, 3,162, 5, 86, 5,166, 5, 86, 5, 57, 3,197, 2, 18, 0,201, 0, 31, 0,184, 1,223, 0,115, + 0,186, 3,233, 3, 51, 3,188, 4, 68, 4, 14, 0,223, 3,205, 3,170, 0,229, 3,170, 4, 4, 0, 0, 0,203, 0,143, 0,164, + 0,123, 0,184, 0, 20, 1,111, 0,127, 2,123, 2, 82, 0,143, 0,199, 5,205, 0,154, 0,154, 0,111, 0,203, 0,205, 1,158, + 1,211, 0,240, 0,186, 1,131, 0,213, 0,152, 3, 4, 2, 72, 0,158, 1,213, 0,193, 0,203, 0,246, 0,131, 3, 84, 2,127, + 0, 0, 3, 51, 2,102, 0,211, 0,199, 0,164, 0,205, 0,143, 0,154, 0,115, 4, 0, 5,213, 1, 10, 0,254, 2, 43, 0,164, + 0,180, 0,156, 0, 0, 0, 98, 0,156, 0, 0, 0, 29, 3, 45, 5,213, 5,213, 5,213, 5,240, 0,127, 0,123, 0, 84, 0,164, + 6,184, 6, 20, 7, 35, 1,211, 0,184, 0,203, 0,166, 1,195, 1,236, 6,147, 0,160, 0,211, 3, 92, 3,113, 3,219, 1,133, + 4, 35, 4,168, 4, 72, 0,143, 1, 57, 1, 20, 1, 57, 3, 96, 0,143, 5,213, 1,154, 6, 20, 7, 35, 6,102, 1,121, 4, 96, + 4, 96, 4, 96, 4,123, 0,156, 0, 0, 2,119, 4, 96, 1,170, 0,233, 4, 96, 7, 98, 0,123, 0,197, 0,127, 2,123, 0, 0, + 0,180, 2, 82, 5,205, 0,102, 0,188, 0,102, 0,119, 6, 16, 0,205, 1, 59, 1,133, 3,137, 0,143, 0,123, 0, 0, 0, 29, + 0,205, 7, 74, 4, 47, 0,156, 0,156, 0, 0, 7,125, 0,111, 0, 0, 0,111, 3, 53, 0,106, 0,111, 0,123, 0,174, 0,178, + 0, 45, 3,150, 0,143, 2,123, 0,246, 0,131, 3, 84, 6, 55, 5,246, 0,143, 0,156, 4,225, 2,102, 0,143, 1,141, 2,246, + 0,205, 3, 68, 0, 41, 0,102, 4,238, 0,115, 0, 0, 20, 0, 0,150, 0, 0, 0, 0, 0, 34, 0, 34, 0, 34, 0, 34, 0, 84, + 0,138, 0,246, 1,162, 2, 54, 3,106, 3,148, 3,204, 3,248, 4, 70, 4,112, 4,140, 4,162, 4,182, 4,220, 5, 30, 5, 86, + 5,212, 6, 72, 6,166, 7, 6, 7,114, 7,184, 8, 34, 8,140, 8,172, 8,212, 9, 16, 9, 50, 9,110, 9,218, 10,154, 11, 20, + 11,108, 11,184, 11,248, 12, 40, 12, 82, 12,166, 12,212, 12,248, 13, 48, 13,196, 13,230, 14,100, 14,184, 14,254, 15, 62, 15,164, + 16, 46, 16,170, 16,226, 17, 36, 17,148, 18,114, 18,196, 19, 38, 19,134, 19,182, 19,220, 20, 6, 20, 40, 20, 62, 20,102, 20,252, + 21, 72, 21,148, 21,224, 22, 74, 22,150, 22,250, 23, 54, 23, 94, 23,156, 24, 20, 24, 50, 24,148, 24,208, 25, 34, 25,114, 25,194, + 25,250, 26,170, 26,232, 27, 36, 27,182, 28,200, 29,138, 30,112, 30,214, 31, 68, 31, 92, 31,210, 32, 20, 32, 20, 32, 92, 32,194, + 33, 30, 33,170, 34, 60, 34, 96, 35, 4, 35, 96, 35,242, 36, 96, 36,198, 36,226, 36,248, 37,158, 37,196, 38, 0, 38, 56, 38,136, + 38,230, 39, 14, 39,104, 39,150, 39,172, 39,220, 40, 8, 40, 76, 40,180, 40,196, 40,212, 40,228, 41, 96, 41,108, 41,120, 41,142, + 41,166, 41,190, 42, 94, 42,202, 42,214, 42,226, 42,238, 43, 0, 43, 18, 43, 30, 43, 42, 43, 60, 43, 78, 43,180, 43,204, 43,216, + 43,228, 43,250, 44, 20, 44, 44, 44,144, 45, 44, 45, 56, 45, 68, 45, 92, 45,120, 45,132, 45,200, 46, 92, 46,110, 46,128, 46,144, + 46,166, 46,194, 46,226, 47,192, 47,204, 47,216, 47,228, 47,246, 48, 8, 48, 20, 48, 32, 48, 50, 48, 68, 49, 28, 49, 40, 49, 52, + 49, 64, 49, 80, 49,102, 49,124, 49,170, 50,100, 50,112, 50,124, 50,140, 50,164, 50,176, 51, 0, 51, 24, 51, 46, 51, 66, 51, 88, + 51,104, 51,116, 51,128, 51,140, 51,152, 51,170, 51,182, 51,194, 51,206, 51,224, 51,236, 51,248, 52, 12, 52, 20, 52,114, 52,126, + 52,144, 52,162, 52,180, 52,192, 52,204, 52,216, 52,228, 52,246, 53, 12, 53, 30, 53, 48, 53, 60, 53, 72, 53, 90, 53,102, 53,114, + 53,126, 53,150, 53,184, 53,252, 54, 70, 54, 88, 54,106, 54,124, 54,142, 54,160, 54,178, 54,190, 54,202, 54,226, 55, 0, 55, 18, + 55, 36, 55, 54, 55, 72, 55, 84, 55, 96, 55,216, 55,228, 56, 0, 56, 12, 56, 30, 56, 42, 56, 60, 56, 72, 56, 98, 56,160, 56,232, + 56,250, 57, 12, 57, 24, 57, 36, 57, 60, 57, 82, 57, 94, 57,166, 57,244, 58, 10, 58, 26, 58, 48, 58, 64, 58, 76, 58, 88, 58,168, + 59, 60, 59, 72, 59, 84, 59, 96, 59,108, 59,126, 59,146, 59,158, 59,170, 59,190, 59,208, 59,220, 59,232, 59,252, 60, 14, 60, 26, + 60, 38, 60, 60, 60, 78, 60,144, 60,220, 60,242, 61, 4, 61, 28, 61, 46, 61, 68, 61, 86, 61,104, 61,122, 61,134, 61,146, 61,158, + 61,170, 61,188, 61,206, 61,224, 61,240, 62, 2, 62, 14, 62, 26, 62, 38, 62, 50, 62, 62, 62, 82, 62,126, 62,228, 63, 72, 63, 80, + 63,170, 63,240, 64, 68, 64,140, 64,202, 65, 0, 65, 8, 65, 82, 65,144, 65,192, 66, 8, 66, 54, 66,142, 66,234, 67, 42, 67,134, + 67,234, 68,116, 68,212, 69, 2, 69, 58, 69, 98, 69,230, 70, 22, 70, 58, 70,112, 70,216, 70,224, 71, 48, 71, 60, 71, 72, 71,130, + 71,184, 72, 4, 72,102, 72,164, 72,226, 73,134, 73,142, 73,196, 73,240, 74, 56, 74,134, 74,204, 74,216, 74,228, 75, 58, 75,106, + 75,142, 75,186, 75,222, 76, 2, 76, 62, 76,122, 76,180, 76,234, 77, 32, 77, 96, 77,156, 77,214, 78, 0, 78, 14, 78, 26, 78, 60, + 78, 68, 78, 80, 78, 92, 78,104, 78,116, 78,128, 78,140, 78,152, 78,164, 78,176, 78,192, 78,208, 78,228, 78,248, 79, 4, 79, 20, + 79, 36, 79, 54, 79, 66, 79, 78, 79, 90, 79,102, 79,114, 79,126, 79,138, 79,150, 79,158, 79,170, 79,182, 79,194, 79,206, 79,218, + 79,230, 80, 38, 80,118, 80,140, 80,152, 80,164, 80,198, 80,210, 80,222, 80,234, 80,246, 81, 2, 81, 14, 81, 34, 81, 46, 81, 58, + 81, 70, 81, 84, 81, 96, 81,146, 81,190, 81,202, 81,214, 81,226, 81,238, 81,250, 82, 6, 82, 18, 82, 30, 82, 42, 82, 54, 82, 66, + 82, 78, 82, 90, 82,102, 82,114, 82,126, 82,138, 82,150, 82,162, 82,174, 82,186, 82,198, 82,210, 82,222, 82,234, 82,246, 83, 2, + 83, 14, 83, 26, 83, 38, 83, 50, 83, 62, 83, 74, 83, 86, 83, 98, 83,110, 83,186, 84, 8, 84, 20, 84, 54, 84, 94, 84,176, 85, 10, + 85, 92, 85,130, 85,168, 85,180, 85,192, 85,204, 85,216, 85,228, 85,240, 85,252, 86, 8, 86, 20, 86, 32, 86, 44, 86, 56, 86, 68, + 86, 80, 86,122, 86,188, 86,240, 87, 34, 87,112, 87,190, 87,246, 88, 62, 88,128, 88,154, 88,194, 89, 22, 89, 66, 89,108, 89,108, + 89,108, 89,108, 89,108, 89,108, 89,166, 89,238, 90, 30, 90, 78, 90,116, 90,166, 90,220, 90,248, 91, 26, 91, 34, 91, 42, 91, 50, + 91, 58, 91, 76, 91,104, 91,134, 91,180, 91,228, 91,248, 92, 12, 92, 32, 92, 52, 92, 98, 92,144, 92,168, 92,176, 92,190, 92,206, + 92,230, 92,240, 93, 0, 93, 14, 93, 34, 93, 48, 93, 58, 93, 68, 93, 86, 93,104, 93,126, 93,140, 93,210, 93,234, 94, 32, 94, 80, + 94,176, 94,230, 95, 2, 95, 28, 95, 70, 95, 90, 95,166, 95,194, 95,242, 96, 12, 96, 50, 96, 82, 96,120, 96,146, 96,156, 96,168, + 96,188, 96,198, 96,244, 96,254, 97, 8, 97, 18, 97, 28, 97, 38, 97, 48, 97, 58, 97, 68, 97, 78, 97,136, 97,146, 97,156, 97,166, + 97,180, 97,194, 97,216, 97,230, 97,240, 98, 4, 98, 24, 98, 42, 98, 56, 98, 66, 98, 76, 98, 94, 98,112, 98,128, 98,186, 98,214, + 98,232, 98,250, 99, 16, 99, 30, 99, 54, 99, 78, 99, 88, 99, 98, 99,108, 99,126, 99,136, 99,146, 99,160, 99,178, 99,214, 99,224, + 99,234, 99,244, 99,254,100, 8,100, 18,100, 28,100, 38,100, 84,100, 98,100,112,100,128,100,144,100,154,100,164,100,186,100,222, +100,248,101, 40,101, 54,101, 64,101, 74,101, 84,101, 94,101,104,101,114,101,132,101,152,101,172,101,188,101,250,102, 14,102, 26, +102, 54,102, 74,102,106,102,118,102,128,102,160,102,170,102,180,102,190,102,248,103, 2,103, 22,103, 46,103, 70,103, 96,103,104, +103,144,103,168,103,180,103,188,103,202,103,216,103,230,103,242,104, 0,104, 12,104, 24,104, 32,104, 40,104, 68,104,122,104,130, +104,138,104,146,104,234,104,242,104,250,105, 44,105, 52,105, 60,105,108,105,116,105,124,105,132,105,194,105,202,105,210,105,218, +105,226,106, 44,106,132,106,150,106,168,106,180,106,192,106,204,106,216,106,228,107,144,107,228,108, 36,108,150,108,254,109, 80, +109,142,109,234,110, 18,110, 82,110,148,110,156,110,228,111, 66,111, 74,111,136,111,210,112, 40,112,116,112,164,112,234,113, 78, +113,184,114, 2,114, 80,114, 92,114,104,114,116,114,128,114,140,114,228,115, 40,115, 92,115,106,115,118,115,218,116, 16,116, 96, +116,150,116,200,117, 2,117, 56,117, 64,117,118,117,164,117,186,117,248,118, 38,118,134,118,200,118,252,119, 40,119,102,119,218, +120, 22,120, 78,120,168,121, 2,121, 76,121,152,121,182,121,210,122, 26,122, 80,122, 88,122, 96,122,154,122,210,123, 8,123, 16, +123, 24,123, 32,123, 62,123, 92,123,148,123,156,123,168,123,180,123,192,123,204,123,250,124, 6,124, 96,124,104,124,112,124,130, +124,138,124,196,124,246,125, 26,125, 38,125, 50,125, 62,125, 86,125, 94,125,158,125,166,125,194,126, 10,126, 18,126,118,126,126, +126,212,126,224,126,232,127, 26,127, 34,127, 42,127, 50,127, 86,127, 94,127,102,127,110,127,178,128, 18,128, 26,128, 70,128,118, +128,162,128,216,129, 24,129, 44,129,102,129,192,130, 32,130,116,130,124,130,234,131, 64,131, 92,131,162,131,170,132, 14,132,116, +132,172,132,184,132,246,133, 40,133,108,133,152,133,160,133,200,133,208,133,216,133,254,134, 6,134,142,134,150,134,194,134,242, +135, 30,135, 84,135,150,135,170,135,230,136, 22,136,110,136,200,136,212,136,224,137, 26,137, 38,137,114,137,122,137,130,137,148, +137,156,137,214,138, 10,138, 56,138, 68,138, 80,138, 92,138,116,138,196,138,204,138,212,139, 8,139, 80,139,136,139,172,139,208, +140, 0,140, 48,140,100,140,152,140,214,141, 18,141,124,141,240,141,248,142, 0,142, 66,142,132,142,172,143,114,143,170,143,182, +143,190,143,198,144, 66,144,184,144,196,144,208,145, 50,145,118,145,164,145,206,146, 0,146, 76,146,108,146,126,146,144,146,190, +147, 28,147, 58,147,108,147,156,147,208,147,254,148, 58,148, 90,148,122,148,148,148,174,148,218,149, 10,149, 58,149,106,149,118, +149,130,149,162,149,192,149,230,150, 10,150, 46,150, 82,150,114,150,144,150,174,150,204,150,232,151, 4,151, 52,151,102,151,200, +152, 38,152, 50,152, 62,152, 86,152,110,152,118,152,142,152,174,152,206,152,242,153, 22,153, 52,153, 82,153,118,153,154,153,194, +153,232,154, 8,154, 16,154, 88,154,156,154,168,154,180,154,188,154,206,154,224,155, 14,155, 64,155,102,155,144,155,182,155,218, +155,248,156, 22,156, 58,156, 94,156,132,156,170,156,192,156,208,156,232,157, 4,157, 12,157, 20,157, 38,157, 56,157, 64,157, 72, +157, 84,157, 96,157,114,157,126,157,138,157,150,157,158,157,166,157,178,157,190,157,202,157,214,157,238,158, 4,158, 12,158, 20, +158, 32,158, 44,158, 56,158, 68,158, 80,158, 92,158,104,158,116,158,128,158,140,158,152,158,164,158,186,158,208,158,220,158,232, +159, 18,159, 60,159,136,159,206,160, 30,160,108,160,170,160,232,161, 32,161, 86,161, 94,161,140,161,148,161,156,161,198,161,240, +162, 36,162, 86,162,150,162,200,162,250,163, 64,163,110,163,160,163,244,164, 52,164, 86,164,116,164,162,164,240,165, 18,165, 54, +165,144,165,192,166, 2,166, 52,166,120,166,170,166,226,167, 4,167, 60,167,102,167,174,167,224,167,232,168, 24,168, 32,168, 66, +168,154,168,190,168,198,169, 30,169, 38,169,114,169,122,169,130,169,144,169,176,169,184,169,222,169,240,170, 88,170,158,170,242, +171, 54,171,128,171,210,172, 10,172, 76,172,200,173, 22,173, 82,173,114,173,226,174, 92,174,154,174,162,175, 34,175,100,175,218, +176, 58,176, 66,176,154,176,250,177, 2,177,104,177,112,177,228,178, 70,178, 78,178,144,178,252,179, 58,179, 66,179, 96,179,206, +180, 50,180, 58,180,204,181, 12,181, 44,181, 70,181, 86,181, 98,181,110,181,122,181,134,181,146,181,158,181,170,181,182,181,196, +181,208,181,220,181,232,181,244,182, 0,182, 12,182, 24,182, 36,182, 48,182, 60,182, 72,182, 84,182, 96,182,108,182,120,182,132, +182,144,182,156,182,168,182,186,182,202,182,214,182,226,182,238,182,250,183, 6,183, 18,183, 30,183, 42,183, 54,183, 66,183, 78, +183, 90,183,102,183,114,183,126,183,140,183,152,183,164,183,178,183,190,183,202,183,214,183,226,183,238,183,250,184, 6,184, 22, +184, 34,184, 46,184, 60,184, 72,184, 84,184, 98,184,110,184,122,184,134,184,146,184,158,184,170,184,182,184,194,184,206,184,218, +184,230,184,242,184,254,185, 10,185, 22,185, 34,185, 50,185, 62,185, 74,185, 86,185, 98,185,112,185,124,185,136,185,148,185,160, +185,172,185,184,185,196,185,210,185,222,185,234,185,246,186, 2,186, 14,186, 26,186, 38,186, 56,186, 72,186, 84,186, 96,186,108, +186,120,186,132,186,144,186,156,186,168,186,180,186,194,186,206,186,218,186,230,186,242,186,254,187, 10,187, 22,187, 34,187, 46, +187, 58,187, 70,187, 82,187, 94,187,106,187,118,187,130,187,142,187,154,187,166,187,178,187,190,187,202,187,214,187,226,187,238, +187,250,188, 6,188, 18,188, 30,188, 42,188, 54,188, 66,188, 80,188, 92,188,104,188,116,188,128,188,140,188,152,188,164,188,176, +188,188,188,200,188,212,188,224,188,236,188,248,189, 4,189, 16,189, 28,189, 40,189, 52,189, 64,189, 76,189, 88,189,100,189,112, +189,124,189,136,189,148,189,160,189,172,189,184,189,196,189,208,189,220,189,232,189,244,190, 0,190, 12,190, 24,190, 36,190, 50, +190, 62,190, 74,190, 86,190, 98,190,110,190,122,190,134,190,146,190,158,190,170,190,186,190,198,190,210,190,222,190,234,190,246, +191, 2,191, 14,191, 26,191, 38,191, 50,191, 62,191, 74,191, 86,191, 98,191,110,191,122,191,134,191,150,191,162,191,174,191,186, +191,198,191,210,191,222,191,234,191,246,192, 2,192, 14,192, 26,192, 38,192, 50,192, 62,192, 74,192, 86,192, 98,192,110,192,122, +192,134,192,146,192,158,192,170,192,182,192,194,192,206,192,218,192,230,192,242,192,254,193, 12,193, 24,193, 80,193, 88,193,142, +193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142,193,142, +193,164,193,172,193,194,193,216,193,236,194, 0,194, 12,194, 24,194, 54,194, 84,194,112,194,130,194,176,194,222,195, 12,195, 38, +195, 82,195,148,195,180,195,194,195,206,195,224,196, 10,196, 22,196,220,197,100,197,116,197,128,197,144,197,158,197,170,197,186, +197,204,198, 4,198, 62,198, 86,198,100,198,162,198,172,198,220,199, 12,199, 34,199, 52,199, 64,199,100,199,124,199,148,199,160, +199,172,199,186,199,220,199,248,200, 16,200, 40,200, 50,200, 72,200, 84,200, 98,200,116,200,124,200,134,200,176,200,202,200,222, +200,254,201, 36,201, 54,201, 84,201,134,201,158,201,188,201,230,202, 8,202,142,202,192,203, 8,203, 28,203,116,203,186,203,212, +203,226,203,246,204, 18,204, 48,204,106,204,116,204,126,204,136,204,146,204,156,204,166,204,176,204,186,204,196,204,206,204,216, +204,226,204,236,204,246,205, 0,205, 58,205,146,205,218,205,250,206, 46,206,112,206,178,207, 36,207,140,207,226,208, 20,208, 32, +208,250,209, 30,209, 74,209,174,209,250,210, 74,210,148,210,168,210,188,211, 28,211, 42,211,190,212, 12,212, 88,212,100,212,146, +212,198,213, 16,213, 80,213, 92,213,176,214, 10,214,136,214,222,215,106,215,186,215,234,216, 48,216, 56,216,112,216,120,216,128, +216,196,216,218,217, 4,217, 88,217,154,217,232,217,248,218, 8,218, 24,218, 40,218, 56,218, 72,218, 88,218,104,218,120,218,136, +218,152,218,168,218,180,218,188,218,200,218,216,218,228,218,236,218,248,219, 8,219, 28,219, 40,219, 48,219, 60,219, 76,219, 84, +219, 92,219,100,219,108,219,116,219,128,219,144,219,156,219,164,219,176,219,192,219,212,219,224,219,232,219,244,220, 4,220, 12, +220, 20,220, 28,220, 36,220,102,221, 36,221,146,221,154,221,242,222, 74,222,162,222,250,223,138,224, 28,224, 52,224, 76,224,100, +224,124,224,152,224,174,224,204,225, 22,225, 58,225, 68,225, 78,225, 88,225,110,225,158,225,170,225,182,225,242,226,184,227, 54, +227, 72,227,100,227,120,227,140,228, 68,229, 70,230,142,231, 86,232, 92,233,142,234, 74,235,200,236,252,238, 50,238, 74,238,126, +238,126,238,214,239, 32,239, 96,239,208,240, 48,240,112,240,236,241, 84,241,168,241,246,242, 78,242,178,242,248,242,248,242,248, +242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248, +242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248,242,248, 0, 2, 0,102, +254,150, 4,102, 5,164, 0, 3, 0, 7, 0, 26, 64, 12, 4,251, 0, 6,251, 1, 8, 5,127, 2, 4, 0, 47,196,212,236, 49, 0, + 16,212,236,212,236, 48, 19, 17, 33, 17, 37, 33, 17, 33,102, 4, 0,252,115, 3, 27,252,229,254,150, 7, 14,248,242,114, 6, 41, + 0, 2, 1, 53, 0, 0, 2, 0, 5,213, 0, 3, 0, 9, 0, 53, 64, 15, 7, 0,131, 4,129, 2, 8, 7, 5, 1, 3, 4, 0, 0, + 10, 16,252, 75,176, 11, 84, 88,185, 0, 0,255,192, 56, 89, 60,236, 50, 57, 57, 49, 0, 47,228,252,204, 48, 1,182, 0, 11, 32, + 11, 80, 11, 3, 93, 37, 51, 21, 35, 17, 51, 17, 3, 35, 3, 1, 53,203,203,203, 20,162, 21,254,254, 5,213,253,113,254,155, 1, +101, 0, 0, 0, 0, 2, 0,197, 3,170, 2,233, 5,213, 0, 3, 0, 7, 0, 66, 64, 15, 5, 1,132, 4, 0,129, 8, 4, 5, 6, + 0, 5, 2, 4, 8, 16,252, 75,176, 18, 84, 75,176, 19, 84, 91, 88,185, 0, 2,255,192, 56, 89,252,220,236, 49, 0, 16,244, 60, +236, 50, 48, 1, 64, 15, 48, 9, 64, 9, 80, 9, 96, 9,112, 9,160, 9,191, 9, 7, 93, 1, 17, 35, 17, 33, 17, 35, 17, 1,111, +170, 2, 36,170, 5,213,253,213, 2, 43,253,213, 2, 43, 0, 0, 0, 2, 0,158, 0, 0, 6, 23, 5,190, 0, 3, 0, 31, 0, 96, + 64, 49, 27, 11, 0,135, 7, 4, 29, 9, 5, 25, 13, 2,135, 23, 19, 15, 21, 17, 31, 30, 28, 27, 26, 23, 22, 21, 20, 19, 18, 17, + 16, 14, 13, 12, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 26, 10, 24, 6, 32, 16,252,204, 23, 57, 49, 0, 47, 60,212, 60, 60,252, + 60, 60,212, 60, 60,196, 50,236, 50, 50, 48, 64, 17, 11, 1, 11, 2, 11, 12, 11, 13, 20, 4, 26, 17, 26, 18, 20, 31, 8, 1, 93, + 1, 33, 3, 33, 11, 1, 33, 19, 51, 3, 33, 21, 33, 3, 33, 21, 33, 3, 35, 19, 33, 3, 35, 19, 33, 53, 33, 19, 33, 53, 33, 19, + 4, 23,254,221, 84, 1, 37, 68,104, 1, 36,105,160,103, 1, 56,254,161, 82, 1, 62,254,155,104,160,103,254,219,103,161,104,254, +197, 1, 96, 84,254,190, 1,105,102, 3,133,254,178, 3,135,254, 97, 1,159,254, 97,154,254,178,153,254, 98, 1,158,254, 98, 1, +158,153, 1, 78,154, 1,159, 0, 0, 3, 0,170,254,211, 4,109, 6, 20, 0, 33, 0, 40, 0, 47, 0,189, 64, 85, 34, 2, 10, 11, + 10, 39, 1, 38, 40, 2, 11, 11, 10, 29, 1, 30, 28, 2, 47, 41, 47, 27, 2, 41, 41, 47, 66, 19, 17, 16, 34, 10, 27, 41, 4, 23, + 6, 9, 42, 33, 5, 2, 23,134, 22, 6,134, 5, 17, 35, 26,138, 22,137, 16, 0, 42,138, 5,137, 2, 45, 8, 22, 10, 30, 7, 41, + 26, 18, 3, 0, 9, 34, 16, 9, 3, 1, 7, 38, 8, 13, 5, 6, 48, 16,252, 75,176, 9, 84, 88,185, 0, 5,255,192, 56, 89, 75, +176, 12, 84, 75,176, 16, 84, 91, 75,176, 15, 84, 91, 88,185, 0, 5, 0, 64, 56, 89, 60,236,244, 23, 60,252, 23, 60,244,228,236, + 49, 0, 47,228,236,196,212,228,236, 50,196, 16,238, 16,238, 17, 18, 57, 17, 57, 17, 18, 23, 57, 17, 18, 57, 48, 75, 83, 88, 7, + 16, 4,237, 7, 16, 14,237, 17, 23, 57, 7, 16, 14,237, 17, 23, 57, 7, 16, 4,237, 89, 34, 1, 35, 3, 46, 1, 39, 53, 30, 1, + 23, 17, 46, 1, 53, 52, 54, 55, 53, 51, 21, 30, 1, 23, 21, 46, 1, 39, 17, 30, 1, 21, 20, 6, 7, 3, 17, 14, 1, 21, 20, 22, + 23, 17, 62, 1, 53, 52, 38, 2,180,100, 1,105,210,106,102,209,111,221,201,218,204,100, 93,174, 83, 83,175, 92,227,214,227,214, +100,116,122,113,225,127,129,123,254,211, 1, 45, 2, 45, 45,180, 64, 65, 1, 1,200, 36,172,150,163,188, 14,235,232, 4, 31, 27, +175, 42, 46, 4,254, 85, 35,180,156,169,195, 15, 3, 0, 1,154, 13,106, 88, 86, 96,213,254, 79, 17,110, 90, 88,104, 0, 0, 0, + 0, 5, 0,113,255,227, 7, 41, 5,240, 0, 11, 0, 23, 0, 35, 0, 39, 0, 51, 0,137, 64, 54, 36, 15, 37, 38, 37, 38, 15, 39, + 36, 39, 66, 0,146, 12, 30,146, 46,141, 24,146, 36, 6,146, 12,141, 38, 18,140, 40, 36,145, 52, 39, 33, 27, 37, 9, 3, 13, 21, + 14, 9, 13, 15, 33, 13, 43, 14, 27, 13, 15, 49, 11, 52, 16,252, 75,176, 9, 84, 75,176, 11, 84, 91, 75,176, 12, 84, 91, 75,176, + 20, 84, 91, 75,176, 14, 84, 91, 75,176, 13, 84, 91, 88,185, 0, 49,255,192, 56, 89,196,236,244,236, 16,238,246,238, 17, 57, 17, + 18, 57, 49, 0, 16,228, 50,244, 60,228,236, 16,238,246,238, 16,238, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 89, 34, 1, + 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 39, 50, 22, 21, 20, 6, 35, 34, 38, 53, 52, 54, 1, 34, 6, 21, 20, 22, 51, 50, 54, + 53, 52, 38, 37, 51, 1, 35, 19, 50, 22, 21, 20, 6, 35, 34, 38, 53, 52, 54, 5,209, 87, 99, 99, 87, 85, 99, 99, 85,158,186,187, +157,160,186,187,252,151, 86, 99, 98, 87, 87, 99,100, 3, 49,160,252, 90,160, 31,158,188,187,159,159,185,186, 2,145,148,132,130, +149,149,130,131,149,127,220,187,187,219,219,187,188,219, 2, 97,149,130,132,148,148,132,129,150,127,249,243, 6, 13,219,187,189, +218,219,188,186,220, 0, 0, 0, 0, 2, 0,129,255,227, 5,254, 5,240, 0, 9, 0, 48, 1,205, 64,150, 13, 1, 14, 12,134, 17, + 18, 17, 11,134, 10, 11, 18, 18, 17, 9,134, 0, 9, 21, 22, 21, 7, 1, 6, 8,134, 22, 22, 21, 2, 1, 3, 1,134, 29, 30, 29, + 0,134, 9, 0, 30, 30, 29, 32, 31, 2, 33, 30, 17, 10, 19, 10, 23, 22, 21, 3, 24, 20, 17, 19, 10, 7, 8, 2, 6, 9, 17, 19, + 19, 10, 2, 1, 2, 3, 0, 17, 10, 19, 10, 23, 22, 2, 24, 21, 17, 19, 10, 20, 17, 19, 19, 10, 66, 18, 11, 9, 3, 6, 0, 10, + 30, 3, 40, 21, 14, 6, 40, 39, 6,149, 24, 43,149, 39,148, 36,145, 24,140, 14, 19, 10, 46, 11, 14, 9, 0, 46, 18, 21, 39, 14, + 30, 3, 46, 18, 39, 33, 14, 17, 15, 19, 33, 3, 18, 27, 16, 49, 16,252,236,196,212,212,236, 16,198,238, 17, 57, 17, 18, 57, 57, + 17, 57, 57, 17, 57, 17, 57, 49, 0, 47,198,228,246,230,238, 16,238, 16,198, 17, 18, 57, 17, 23, 57, 17, 23, 57, 48, 75, 83, 88, + 7, 16, 5,237, 7, 5,237, 17, 23, 57, 7, 16, 5,237, 17, 23, 57, 7, 16, 5,237, 17, 23, 57, 7, 5,237, 17, 23, 57, 7, 16, + 5,237, 17, 23, 57, 7, 16, 8,237, 7, 16, 14,237, 17, 23, 57, 7, 16, 14,237, 17, 23, 57, 7, 16, 8,237, 7, 16, 8,237, 7, + 16, 14,237, 17, 23, 57, 89, 34,178, 15, 50, 1, 1, 93, 64,178, 7, 11, 5, 34, 9, 41, 28, 0, 28, 1, 31, 2, 23, 11, 42, 0, + 42, 1, 38, 18, 58, 0, 52, 18, 68, 11, 94, 0, 89, 1, 90, 10, 85, 18, 90, 26, 90, 31, 89, 48,103, 30,123, 0,155, 0,154, 1, +153, 2,151, 8,149, 11,147, 21,149, 22,149, 34,153, 45, 31, 9, 11, 9, 12, 8, 17, 12, 39, 12, 40, 24, 2, 27, 9, 25, 11, 25, + 12, 25, 17, 28, 20, 28, 21, 22, 29, 31, 50, 39, 0, 39, 1, 41, 9, 35, 18, 42, 19, 42, 20, 40, 21, 47, 50, 59, 9, 52, 18, 57, + 19, 63, 50, 74, 9, 76, 20, 75, 21, 70, 25, 79, 50, 86, 1, 90, 9, 89, 12, 85, 18, 89, 19, 92, 31, 95, 50,106, 12,105, 17, 96, + 50,117, 1,121, 12,122, 17,147, 0,147, 1,151, 2,149, 5,156, 7,156, 8,159, 8,154, 9,155, 11,154, 12,144, 50,160, 50,176, + 50, 57, 93, 0, 93, 1, 14, 1, 21, 20, 22, 51, 50, 54, 55, 9, 1, 62, 1, 55, 51, 6, 2, 7, 1, 35, 39, 14, 1, 35, 34, 0, + 53, 52, 54, 55, 46, 1, 53, 52, 54, 51, 50, 22, 23, 21, 46, 1, 35, 34, 6, 21, 20, 22, 1,242, 91, 85,212,160, 95,166, 73,254, +123, 1,252, 59, 66, 6,186, 12,104, 93, 1, 23,252,143,104,228,131,241,254,206,134,134, 48, 50,222,184, 83,165, 85, 87,158, 68, +105,131, 59, 3, 35, 81,161, 88,146,194, 63, 64, 2,143,253,248, 89,203,114,132,254,254,126,254,227,147, 89, 87, 1, 19,215,128, +225, 99, 63,125, 60,162,197, 36, 36,182, 47, 49,111, 88, 51,103, 0, 1, 0,197, 3,170, 1,111, 5,213, 0, 3, 0, 55, 64, 10, + 1,132, 0,129, 4, 0, 5, 2, 4, 4, 16,252, 75,176, 18, 84, 75,176, 19, 84, 91, 88,185, 0, 2,255,192, 56, 89,236, 49, 0, + 16,244,236, 48, 1, 64, 13, 64, 5, 80, 5, 96, 5,112, 5,144, 5,160, 5, 6, 93, 1, 17, 35, 17, 1,111,170, 5,213,253,213, + 2, 43, 0, 0, 0, 1, 0,176,254,242, 2,123, 6, 18, 0, 13, 0, 55, 64, 15, 6,152, 0,151, 14, 13, 7, 0, 3, 18, 6, 0, + 19, 10, 14, 16,220, 75,176, 19, 84, 88,185, 0, 10,255,192, 56, 89, 75,176, 15, 84, 88,185, 0, 10, 0, 64, 56, 89,228, 50,236, + 17, 57, 57, 49, 0, 16,252,236, 48, 1, 6, 2, 21, 20, 18, 23, 35, 38, 2, 53, 52, 18, 55, 2,123,134,130,131,133,160,150,149, +148,151, 6, 18,230,254, 62,231,231,254, 59,229,235, 1,198,224,223, 1,196,236, 0, 1, 0,164,254,242, 2,111, 6, 18, 0, 13, + 0, 31, 64, 15, 7,152, 0,151, 14, 7, 1, 0, 11, 18, 4, 19, 8, 0, 14, 16,220, 60,244,236, 17, 57, 57, 49, 0, 16,252,236, + 48, 19, 51, 22, 18, 21, 20, 2, 7, 35, 54, 18, 53, 52, 2,164,160,150,149,149,150,160,133,131,131, 6, 18,236,254, 60,223,224, +254, 58,235,229, 1,197,231,231, 1,194, 0, 0, 0, 1, 0, 61, 2, 74, 3,195, 5,240, 0, 17, 0, 78, 64, 44, 16, 13, 11, 0, + 4, 12, 9, 7, 4, 2, 4, 8, 3,153, 5, 17, 12,153, 10, 1, 14,145, 18, 8, 12, 10, 3, 9, 6, 17, 3, 1, 3, 2, 0, 20, + 15, 4, 11, 9, 20, 13, 6, 18, 16,212, 60,228, 50,220, 60,228, 50, 23, 57, 17, 18, 23, 57, 49, 0, 16,244,212, 60,236, 50,196, +236, 50, 23, 57, 18, 23, 57, 48, 1, 13, 1, 7, 37, 17, 35, 17, 5, 39, 45, 1, 55, 5, 17, 51, 17, 37, 3,195,254,153, 1,103, + 58,254,176,114,254,176, 58, 1,103,254,153, 58, 1, 80,114, 1, 80, 4,223,194,195, 98,203,254,135, 1,121,203, 98,195,194, 99, +203, 1,121,254,135,203, 0, 0, 0, 1, 0,217, 0, 0, 5,219, 5, 4, 0, 11, 0, 35, 64, 17, 0, 9, 1,156, 7, 3, 5, 2, + 21, 4, 0, 23, 10, 6, 21, 8, 12, 16,220,252, 60,252, 60,236, 49, 0, 47,212, 60,252, 60,196, 48, 1, 17, 33, 21, 33, 17, 35, + 17, 33, 53, 33, 17, 3,174, 2, 45,253,211,168,253,211, 2, 45, 5, 4,253,211,170,253,211, 2, 45,170, 2, 45, 0, 1, 0,158, +255, 18, 1,195, 0,254, 0, 5, 0, 25, 64, 12, 3,158, 0,131, 6, 3, 4, 1, 25, 0, 24, 6, 16,252,236,212,204, 49, 0, 16, +252,236, 48, 55, 51, 21, 3, 35, 19,240,211,164,129, 82,254,172,254,192, 1, 64, 0, 1, 0,100, 1,223, 2,127, 2,131, 0, 3, + 0, 17,182, 0,156, 2, 4, 1, 0, 4, 16,220,204, 49, 0, 16,212,236, 48, 19, 33, 21, 33,100, 2, 27,253,229, 2,131,164, 0, + 0, 1, 0,219, 0, 0, 1,174, 0,254, 0, 3, 0, 17,183, 0,131, 2, 1, 25, 0, 24, 4, 16,252,236, 49, 0, 47,236, 48, 55, + 51, 21, 35,219,211,211,254,254, 0, 1, 0, 0,255, 66, 2,178, 5,213, 0, 3, 0, 45, 64, 20, 0, 26, 1, 2, 1, 2, 26, 3, + 0, 3, 66, 2,159, 0,129, 4, 2, 0, 1, 3, 47,196, 57, 57, 49, 0, 16,244,236, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5, +237, 89, 34, 1, 51, 1, 35, 2, 8,170,253,248,170, 5,213,249,109, 0, 0, 0, 0, 2, 0,135,255,227, 4,143, 5,240, 0, 11, + 0, 23, 0, 35, 64, 19, 6,160, 18, 0,160, 12,145, 18,140, 24, 9, 28, 15, 30, 3, 28, 21, 27, 24, 16,252,236,244,236, 49, 0, + 16,228,244,236, 16,238, 48, 1, 34, 2, 17, 16, 18, 51, 50, 18, 17, 16, 2, 39, 50, 0, 17, 16, 0, 35, 34, 0, 17, 16, 0, 2, +139,156,157,157,156,157,157,157,157,251, 1, 9,254,247,251,251,254,247, 1, 9, 5, 80,254,205,254,204,254,205,254,205, 1, 51, + 1, 51, 1, 52, 1, 51,160,254,115,254,134,254,135,254,115, 1,141, 1,121, 1,122, 1,141, 0, 0, 1, 0,225, 0, 0, 4, 90, + 5,213, 0, 10, 0, 64, 64, 21, 66, 3,160, 4, 2,160, 5,129, 7, 0,160, 9, 8, 31, 6, 28, 3, 0, 31, 1, 11, 16,212, 75, +176, 15, 84, 88,185, 0, 1, 0, 64, 56, 89,236,196,252,236, 49, 0, 47,236, 50,244,236,212,236, 48, 75, 83, 88, 89, 34, 1,180, + 15, 3, 15, 4, 2, 93, 55, 33, 17, 5, 53, 37, 51, 17, 33, 21, 33,254, 1, 74,254,153, 1,101,202, 1, 74,252,164,170, 4,115, + 72,184, 72,250,213,170, 0, 0, 0, 1, 0,150, 0, 0, 4, 74, 5,240, 0, 28, 0,154, 64, 39, 25, 26, 27, 3, 24, 28, 17, 5, + 4, 0, 17, 5, 5, 4, 66, 16,161, 17,148, 13,160, 20,145, 4, 0,160, 2, 0, 16, 10, 2, 1, 10, 28, 23, 16, 3, 6, 29, 16, +252, 75,176, 21, 84, 75,176, 22, 84, 91, 75,176, 20, 84, 91, 88,185, 0, 3,255,192, 56, 89,196,212,236,192,192, 17, 18, 57, 49, + 0, 47,236, 50,244,236,244,236, 48, 75, 83, 88, 7, 16, 5,237, 7, 5,237, 17, 23, 57, 89, 34, 1, 64, 50, 85, 4, 86, 5, 86, + 7,122, 4,122, 5,118, 27,135, 25, 7, 4, 0, 4, 25, 4, 26, 4, 27, 5, 28,116, 0,118, 6,117, 26,115, 27,116, 28,130, 0, +134, 25,130, 26,130, 27,130, 28,168, 0,168, 27, 17, 93, 0, 93, 37, 33, 21, 33, 53, 54, 0, 55, 62, 1, 53, 52, 38, 35, 34, 6, + 7, 53, 62, 1, 51, 50, 4, 21, 20, 6, 7, 6, 0, 1,137, 2,193,252, 76,115, 1,141, 51, 97, 77,167,134, 95,211,120,122,212, + 88,232, 1, 20, 69, 91, 25,254,244,170,170,170,119, 1,145, 58,109,151, 73,119,150, 66, 67,204, 49, 50,232,194, 92,165,112, 29, +254,235, 0, 0, 0, 1, 0,156,255,227, 4,115, 5,240, 0, 40, 0,112, 64, 46, 0, 21, 19, 10,134, 9, 31,134, 32, 19,160, 21, + 13,160, 9,147, 6, 28,160, 32,147, 35,145, 6,140, 21,163, 41, 22, 28, 19, 0, 3, 20, 25, 28, 38, 32, 16, 28, 3, 20, 31, 9, + 6, 41, 16,252, 75,176, 22, 84, 75,176, 20, 84, 91, 88,185, 0, 9,255,192, 56, 89,196,196,212,236,244,236, 17, 23, 57, 57, 49, + 0, 16,236,228,244,228,236, 16,230,238, 16,238, 16,238, 16,238, 17, 18, 57, 48, 1, 64, 9,100, 30, 97, 31, 97, 32,100, 33, 4, + 0, 93, 1, 30, 1, 21, 20, 4, 33, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 43, 1, 53, 51, 50, 54, 53, 52, 38, 35, 34, + 6, 7, 53, 62, 1, 51, 50, 4, 21, 20, 6, 3, 63,145,163,254,208,254,232, 94,199,106, 84,200,109,190,199,185,165,174,182,149, +158,163,152, 83,190,114,115,201, 89,230, 1, 12,142, 3, 37, 31,196,144,221,242, 37, 37,195, 49, 50,150,143,132,149,166,119,112, +115,123, 36, 38,180, 32, 32,209,178,124,171, 0, 0, 2, 0,100, 0, 0, 4,164, 5,213, 0, 2, 0, 13, 0,129, 64, 29, 1, 13, + 3, 13, 0, 3, 3, 13, 66, 0, 3, 11, 7,160, 5, 1, 3,129, 9, 1, 12, 10, 0, 28, 6, 8, 4, 12, 14, 16,220, 75,176, 11, + 84, 75,176, 13, 84, 91, 88,185, 0, 12,255,192, 56, 89,212, 60,196,236, 50, 17, 57, 49, 0, 47,228,212, 60,236, 50, 18, 57, 48, + 75, 83, 88, 7, 16, 4,201, 7, 16, 5,201, 89, 34, 1, 64, 42, 11, 0, 42, 0, 72, 0, 89, 0,105, 0,119, 0,138, 0, 7, 22, + 1, 43, 0, 38, 1, 43, 3, 54, 1, 78, 1, 79, 12, 79, 13, 86, 1,102, 1,117, 1,122, 3,133, 1, 13, 93, 0, 93, 9, 1, 33, + 3, 51, 17, 51, 21, 35, 17, 35, 17, 33, 53, 3, 6,254, 2, 1,254, 53,254,213,213,201,253, 94, 5, 37,252,227, 3,205,252, 51, +168,254,160, 1, 96,195, 0, 0, 0, 1, 0,158,255,227, 4,100, 5,213, 0, 29, 0, 94, 64, 35, 4, 26, 7, 17,134, 16, 29, 26, +160, 7, 20,160, 16,137, 13, 2,160, 0,129, 13,140, 7,164, 30, 23, 28, 1, 10, 3, 28, 0, 10, 16, 6, 30, 16,252, 1, 75,176, + 22, 84, 75,176, 20, 84, 91, 88,185, 0, 16,255,192, 56, 89, 75,176, 15, 84, 88,185, 0, 16, 0, 64, 56, 89,196,212,236, 16,196, +238, 49, 0, 16,228,228,244,236, 16,230,238, 16,254,196, 16,238, 17, 18, 57, 48, 19, 33, 21, 33, 17, 62, 1, 51, 50, 0, 21, 20, + 0, 33, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 35, 34, 6, 7,221, 3, 25,253,160, 44, 88, 44,250, 1, 36,254,212,254, +239, 94,195,104, 90,192,107,173,202,202,173, 81,161, 84, 5,213,170,254,146, 15, 15,254,238,234,241,254,245, 32, 32,203, 49, 48, +182,156,156,182, 36, 38, 0, 0, 0, 2, 0,143,255,227, 4,150, 5,240, 0, 11, 0, 36, 0, 88, 64, 36, 19, 6, 0, 13,134, 12, + 0,160, 22, 6,160, 28, 22,165, 16,160, 12,137, 34,145, 28,140, 37, 12, 34, 9, 28, 25, 30, 19, 28, 3, 33, 31, 27, 37, 16,252, +236,236,244,236,228, 49, 0, 16,228,244,228,252,228, 16,238, 16,238, 16,238, 17, 18, 57, 48, 64, 20,203, 0,203, 1,205, 2,205, + 3,205, 4,203, 5,203, 6, 7,164, 30,178, 30, 2, 93, 1, 93, 1, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 1, 21, 46, 1, + 35, 34, 2, 3, 62, 1, 51, 50, 0, 21, 20, 0, 35, 32, 0, 17, 16, 0, 33, 50, 22, 2,164,136,159,159,136,136,159,159, 1, 9, + 76,155, 76,200,211, 15, 59,178,107,225, 1, 5,254,240,226,254,253,254,238, 1, 80, 1, 27, 76,155, 3, 59,186,162,161,187,187, +161,162,186, 2,121,184, 36, 38,254,242,254,239, 87, 93,254,239,235,230,254,234, 1,141, 1,121, 1, 98, 1,165, 30, 0, 0, 0, + 0, 1, 0,168, 0, 0, 4,104, 5,213, 0, 6, 0, 99, 64, 24, 5, 17, 2, 3, 2, 3, 17, 4, 5, 4, 66, 5,160, 0,129, 3, + 5, 3, 1, 4, 1, 0, 6, 7, 16,252,204,196, 17, 57, 57, 49, 0, 47,244,236, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, + 89, 34, 1, 75,176, 22, 84, 88,189, 0, 7, 0, 64, 0, 1, 0, 7, 0, 7,255,192, 56, 17, 55, 56, 89, 64, 18, 88, 2, 1, 6, + 3, 26, 5, 57, 5, 72, 5,103, 3,176, 0,176, 6, 7, 93, 0, 93, 19, 33, 21, 1, 35, 1, 33,168, 3,192,253,226,211, 1,254, +253, 51, 5,213, 86,250,129, 5, 43, 0, 0, 0, 0, 3, 0,139,255,227, 4,139, 5,240, 0, 11, 0, 35, 0, 47, 0, 67, 64, 37, + 24, 12, 0,160, 39, 6,160, 30, 45,160, 18,145, 30,140, 39,163, 48, 24, 12, 36, 42, 28, 21, 36, 28, 15, 9, 28, 21, 27, 30, 3, + 28, 15, 33, 27, 48, 16,252,196,236,244,196,236, 16,238, 16,238, 17, 57, 57, 49, 0, 16,236,228,244,236, 16,238, 16,238, 57, 57, + 48, 1, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 37, 46, 1, 53, 52, 36, 51, 50, 22, 21, 20, 6, 7, 30, 1, 21, 20, 4, 35, + 34, 36, 53, 52, 54, 19, 20, 22, 51, 50, 54, 53, 52, 38, 35, 34, 6, 2,139,144,165,165,144,144,166,165,254,165,130,145, 0,255, +222,223,254,145,129,146,163,254,247,247,247,254,247,164, 72,145,131,130,147,147,130,131,145, 2,197,154,135,135,154,155,134,135, +154, 86, 32,178,128,179,208,208,179,128,178, 32, 34,198,143,217,232,232,217,143,198, 1, 97,116,130,130,116,116,130,130, 0, 0, + 0, 2, 0,129,255,227, 4,135, 5,240, 0, 24, 0, 36, 0, 88, 64, 35, 7, 31, 25, 1,134, 0, 25,160, 10,165, 4,160, 0,137, + 22, 31,160, 16,145, 22,140, 37, 7, 28, 28, 33, 19, 30, 0, 34, 34, 28, 13, 27, 37, 16,252,236,228,244,236,236, 49, 0, 16,228, +244,236, 16,230,254,245,238, 16,238, 17, 18, 57, 48, 64, 22,196, 25,194, 26,192, 27,192, 28,192, 29,194, 30,196, 31, 7,170, 18, +188, 18,233, 18, 3, 93, 1, 93, 55, 53, 30, 1, 51, 50, 18, 19, 14, 1, 35, 34, 0, 53, 52, 0, 51, 32, 0, 17, 16, 0, 33, 34, + 38, 1, 50, 54, 53, 52, 38, 35, 34, 6, 21, 20, 22,225, 76,156, 75,200,211, 15, 58,178,108,224,254,251, 1, 16,226, 1, 3, 1, + 17,254,177,254,229, 76,156, 1, 62,136,159,159,136,136,159,159, 31,184, 36, 38, 1, 13, 1, 18, 86, 92, 1, 15,235,230, 1, 22, +254,115,254,134,254,159,254, 91, 30, 2,151,186,162,161,187,187,161,162,186, 0, 0, 2, 0,240, 0, 0, 1,195, 4, 35, 0, 3, + 0, 7, 0, 28, 64, 14, 6,131, 4,166, 0,131, 2, 5, 1, 3, 4, 0, 24, 8, 16,252, 60,236, 50, 49, 0, 47,236,244,236, 48, + 55, 51, 21, 35, 17, 51, 21, 35,240,211,211,211,211,254,254, 4, 35,254, 0, 0, 0, 2, 0,158,255, 18, 1,195, 4, 35, 0, 3, + 0, 9, 0, 37, 64, 19, 2,131, 0, 7,158, 4,131, 0,166, 10, 7, 8, 5, 1, 25, 4, 0, 24, 10, 16,252, 60,236, 50,212,204, + 49, 0, 16,228,252,236, 16,238, 48, 19, 51, 21, 35, 17, 51, 21, 3, 35, 19,240,211,211,211,164,129, 82, 4, 35,254,253,217,172, +254,192, 1, 64, 0, 1, 0,217, 0, 94, 5,219, 4,166, 0, 6, 0, 77, 64, 42, 2,156, 3, 4, 3, 1,156, 0, 1, 4, 4, 3, + 1,156, 2, 1, 5, 6, 5, 0,156, 6, 5, 66, 5, 4, 2, 1, 0, 5, 3,168, 6,167, 7, 1, 2, 0, 36, 4, 35, 7, 16,252, +236, 50, 57, 49, 0, 16,244,236, 23, 57, 48, 75, 83, 88, 7, 4,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 4,237, 89, 34, 9, + 2, 21, 1, 53, 1, 5,219,251,248, 4, 8,250,254, 5, 2, 3,240,254,145,254,147,182, 1,209,166, 1,209, 0, 0, 2, 0,217, + 1, 96, 5,219, 3,162, 0, 3, 0, 7, 0, 28, 64, 13, 0,156, 2, 6,156, 4, 8, 5, 1, 4, 0, 35, 8, 16,252, 60,196, 50, + 49, 0, 16,212,236,212,236, 48, 19, 33, 21, 33, 21, 33, 21, 33,217, 5, 2,250,254, 5, 2,250,254, 3,162,168,240,170, 0, 0, + 0, 1, 0,217, 0, 94, 5,219, 4,166, 0, 6, 0, 79, 64, 43, 6,156, 0, 6, 3, 4, 3, 5,156, 4, 4, 3, 0,156, 1, 2, + 1, 6,156, 5, 6, 2, 2, 1, 66, 6, 5, 3, 2, 0, 5, 4,168, 1,167, 7, 6, 2, 36, 4, 0, 35, 7, 16,252, 60,236, 57, + 49, 0, 16,244,236, 23, 57, 48, 75, 83, 88, 7, 16, 8,237, 7, 16, 4,237, 7, 16, 4,237, 7, 16, 8,237, 89, 34, 19, 53, 1, + 21, 1, 53, 1,217, 5, 2,250,254, 4, 6, 3,240,182,254, 47,166,254, 47,182, 1,109, 0, 0, 0, 2, 0,147, 0, 0, 3,176, + 5,240, 0, 3, 0, 36, 0,101, 64, 43, 36, 30, 9, 6, 4, 10, 29, 19, 4, 0, 20,134, 19,136, 16,149, 23,145, 0,131, 2, 29, + 26, 13, 9, 5, 4, 10, 30, 1, 13, 28, 26, 4, 28, 5, 1, 3, 0, 38, 26, 19, 37, 16,220, 75,176, 12, 84, 88,185, 0, 19,255, +192, 56, 89,196,252,236,212,236, 16,238, 17, 57, 57, 17, 18, 57, 17, 18, 57, 49, 0, 47,238,246,254,244,238, 16,205, 17, 57, 57, + 23, 57, 48, 1,182,121, 9,122, 10,122, 32, 3, 93, 37, 51, 21, 35, 19, 35, 53, 52, 54, 63, 1, 62, 1, 53, 52, 38, 35, 34, 6, + 7, 53, 62, 1, 51, 50, 22, 21, 20, 6, 15, 1, 14, 1, 7, 14, 1, 21, 1,135,203,203,197,191, 56, 90, 90, 57, 51,131,108, 79, +179, 97, 94,193,103,184,223, 72, 90, 88, 47, 39, 8, 6, 6,254,254, 1,145,154,101,130, 86, 89, 53, 94, 49, 89,110, 70, 67,188, + 57, 56,194,159, 76,137, 86, 86, 47, 53, 25, 21, 60, 52, 0, 0, 0, 2, 0,135,254,156, 7,113, 5,162, 0, 11, 0, 76, 0,149, + 64, 50, 24, 12, 3, 9,169, 25, 21, 27, 3,169, 76, 15, 52, 51, 15,172, 48,169, 55, 21,172, 36,169, 55, 67, 77, 51, 52, 30, 26, + 0, 40, 18, 6, 24, 12, 40, 26, 43, 30, 40, 73, 18, 43, 42, 40, 73, 44, 61, 77, 16,220,236,252,236, 16,254,253,254, 60,198, 16, +238, 17, 18, 57, 57, 49, 0, 16,212,196,252,236, 16,254,237,212,198, 16,197,238, 50, 16,196,238, 17, 57, 57, 48, 0, 75,176, 9, + 84, 75,176, 12, 84, 91, 75,176, 16, 84, 91, 75,176, 19, 84, 91, 75,176, 20, 84, 91, 88,189, 0, 77,255,192, 0, 1, 0, 77, 0, + 77, 0, 64, 56, 17, 55, 56, 89, 64, 9, 15, 78, 31, 78, 47, 78, 63, 78, 4, 1, 93, 1, 20, 22, 51, 50, 54, 53, 52, 38, 35, 34, + 6, 1, 14, 1, 35, 34, 38, 53, 52, 54, 51, 50, 22, 23, 53, 51, 17, 62, 1, 53, 52, 38, 39, 38, 36, 35, 34, 6, 7, 6, 2, 21, + 20, 18, 23, 22, 4, 51, 50, 54, 55, 23, 6, 4, 35, 34, 36, 39, 38, 2, 53, 52, 18, 55, 54, 36, 51, 50, 4, 23, 30, 1, 21, 16, + 0, 5, 2,250,142,124,123,141,144,122,121,143, 2, 33, 60,155,103,172,215,216,171,103,156, 59,143,146,165, 63, 64,104,254,213, +176,123,226, 96,157,177,115,109,105, 1, 20,157,129,249,104, 90,125,254,217,152,185,254,184,128,128,134,136,126,129, 1, 82,189, +212, 1,107,123, 75, 79,254,194,254,232, 2, 25,143,163,164,142,140,165,164,254, 72, 77, 73,249,200,200,250, 75, 76,131,253, 32, + 22,223,177,107,188, 80,131,139, 65, 64,102,254,181,193,159,254,234,106,104,109, 87, 81,111, 97,103,131,125,125, 1, 73,189,182, + 1, 74,125,127,135,174,160, 98,230,123,254,249,254,208, 6, 0, 0, 2, 0, 16, 0, 0, 5,104, 5,213, 0, 2, 0, 10, 0,186, + 64, 65, 0, 17, 1, 0, 4, 5, 4, 2, 17, 5, 5, 4, 1, 17, 10, 3, 10, 0, 17, 2, 0, 3, 3, 10, 7, 17, 5, 4, 6, 17, + 5, 5, 4, 9, 17, 3, 10, 8, 17, 10, 3, 10, 66, 0, 3, 7,149, 1, 3,129, 9, 5, 9, 8, 7, 6, 4, 3, 2, 1, 0, 9, + 5, 10, 11, 16,212,196, 23, 57, 49, 0, 47, 60,228,212,236, 18, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 5,237, 7, 16, 5,237, + 7, 5,237, 7, 16, 8,237, 7, 16, 5,237, 7, 16, 5,237, 7, 16, 8,237, 89, 34,178, 32, 12, 1, 1, 93, 64, 58, 15, 0, 88, + 0,118, 0,112, 0,140, 0, 5, 7, 1, 8, 2, 6, 3, 9, 4, 22, 1, 25, 2, 86, 1, 88, 2, 80, 12,103, 1,104, 2,120, 1, +118, 2,124, 3,114, 4,119, 7,120, 8,135, 1,136, 2,128, 12,152, 2,153, 3,150, 4, 23, 93, 0, 93, 9, 1, 33, 1, 51, 1, + 35, 3, 33, 3, 35, 2,188,254,238, 2, 37,254,123,229, 2, 57,210,136,253, 95,136,213, 5, 14,253, 25, 3,174,250, 43, 1,127, +254,129, 0, 0, 0, 3, 0,201, 0, 0, 4,236, 5,213, 0, 8, 0, 17, 0, 32, 0, 67, 64, 35, 25, 0,149, 10, 9,149, 18,129, + 1,149, 10,173, 31, 17, 11, 8, 2, 19, 25, 31, 5, 0, 14, 28, 22, 5, 25, 28, 46, 9, 0, 28, 18, 4, 33, 16,252,236, 50,252, +236,212,236, 17, 23, 57, 57, 57, 49, 0, 47,236,236,244,236, 16,238, 57, 48,178, 15, 34, 1, 1, 93, 1, 17, 33, 50, 54, 53, 52, + 38, 35, 1, 17, 33, 50, 54, 53, 52, 38, 35, 37, 33, 50, 22, 21, 20, 6, 7, 30, 1, 21, 20, 4, 35, 33, 1,147, 1, 68,163,157, +157,163,254,188, 1, 43,148,145,145,148,254, 11, 2, 4,231,250,128,124,149,165,254,240,251,253,232, 2,201,253,221,135,139,140, +133, 2,102,254, 62,111,114,113,112,166,192,177,137,162, 20, 32,203,152,200,218, 0, 1, 0,115,255,227, 5, 39, 5,240, 0, 25, + 0, 54, 64, 26, 13,161, 14,174, 10,149, 17, 1,161, 0,174, 4,149, 23,145, 17,140, 26, 7, 25, 13, 0, 48, 20, 16, 26, 16,252, +236, 50,236, 49, 0, 16,228,244,236,244,236, 16,238,246,238, 48,180, 15, 27, 31, 27, 2, 1, 93, 1, 21, 46, 1, 35, 32, 0, 17, + 16, 0, 33, 50, 54, 55, 21, 14, 1, 35, 32, 0, 17, 16, 0, 33, 50, 22, 5, 39,102,231,130,255, 0,254,240, 1, 16, 1, 0,130, +231,102,106,237,132,254,173,254,122, 1,134, 1, 83,134,237, 5, 98,213, 95, 94,254,199,254,216,254,217,254,199, 94, 95,211, 72, + 72, 1,159, 1,103, 1,104, 1,159, 71, 0, 0, 0, 2, 0,201, 0, 0, 5,176, 5,213, 0, 8, 0, 17, 0, 46, 64, 21, 0,149, + 9,129, 1,149, 16, 8, 2, 16, 10, 0, 5, 25, 13, 50, 0, 28, 9, 4, 18, 16,252,236,244,236, 17, 57, 57, 57, 57, 49, 0, 47, +236,244,236, 48,178, 96, 19, 1, 1, 93, 1, 17, 51, 32, 0, 17, 16, 0, 33, 37, 33, 32, 0, 17, 16, 0, 41, 1, 1,147,244, 1, + 53, 1, 31,254,225,254,203,254, 66, 1,159, 1,178, 1,150,254,104,254, 80,254, 97, 5, 47,251,119, 1, 24, 1, 46, 1, 44, 1, + 23,166,254,151,254,128,254,126,254,150, 0, 0, 0, 1, 0,201, 0, 0, 4,139, 5,213, 0, 11, 0, 46, 64, 21, 6,149, 4, 2, +149, 0,129, 8,149, 4,173, 10, 5, 1, 9, 7, 3, 28, 0, 4, 12, 16,252,236, 50,212,196,196, 49, 0, 47,236,236,244,236, 16, +238, 48,178, 31, 13, 1, 1, 93, 19, 33, 21, 33, 17, 33, 21, 33, 17, 33, 21, 33,201, 3,176,253, 26, 2,199,253, 57, 2,248,252, + 62, 5,213,170,254, 70,170,253,227,170, 0, 0, 0, 1, 0,201, 0, 0, 4, 35, 5,213, 0, 9, 0, 41, 64, 18, 6,149, 4, 2, +149, 0,129, 4,173, 8, 5, 1, 7, 3, 28, 0, 4, 10, 16,252,236, 50,212,196, 49, 0, 47,236,244,236, 16,238, 48,178, 15, 11, + 1, 1, 93, 19, 33, 21, 33, 17, 33, 21, 33, 17, 35,201, 3, 90,253,112, 2, 80,253,176,202, 5,213,170,254, 72,170,253, 55, 0, + 0, 1, 0,115,255,227, 5,139, 5,240, 0, 29, 0, 57, 64, 32, 0, 5, 27, 1,149, 3, 27,149, 8, 18,161, 17,174, 21,149, 14, +145, 8,140, 30, 2, 0, 28, 17, 52, 4, 51, 24, 25, 11, 16, 30, 16,252,236,252,228,252,196, 49, 0, 16,228,244,236,244,236, 16, +254,212,238, 17, 57, 57, 48, 37, 17, 33, 53, 33, 17, 6, 4, 35, 32, 0, 17, 16, 0, 33, 50, 4, 23, 21, 46, 1, 35, 32, 0, 17, + 16, 0, 33, 50, 54, 4,195,254,182, 2, 18,117,254,230,160,254,162,254,117, 1,139, 1, 94,146, 1, 7,111,112,252,139,254,238, +254,237, 1, 19, 1, 18,107,168,213, 1,145,166,253,127, 83, 85, 1,153, 1,109, 1,110, 1,153, 72, 70,215, 95, 96,254,206,254, +209,254,210,254,206, 37, 0, 0, 0, 1, 0,201, 0, 0, 5, 59, 5,213, 0, 11, 0, 44, 64, 20, 8,149, 2,173, 4, 0,129, 10, + 6, 7, 3, 28, 5, 56, 9, 1, 28, 0, 4, 12, 16,252,236, 50,252,236, 50, 49, 0, 47, 60,228, 50,252,236, 48,178, 80, 13, 1, + 1, 93, 19, 51, 17, 33, 17, 51, 17, 35, 17, 33, 17, 35,201,202, 2,222,202,202,253, 34,202, 5,213,253,156, 2,100,250, 43, 2, +199,253, 57, 0, 0, 1, 0,201, 0, 0, 1,147, 5,213, 0, 3, 0, 46,183, 0,175, 2, 1, 28, 0, 4, 4, 16,252, 75,176, 16, + 84, 88,185, 0, 0, 0, 64, 56, 89,236, 49, 0, 47,236, 48, 1, 64, 13, 48, 5, 64, 5, 80, 5, 96, 5,143, 5,159, 5, 6, 93, + 19, 51, 17, 35,201,202,202, 5,213,250, 43, 0, 0, 1,255,150,254,102, 1,147, 5,213, 0, 11, 0, 66, 64, 19, 11, 2, 0, 7, +149, 5,176, 0,129, 12, 5, 8, 6, 57, 1, 28, 0, 4, 12, 16,252, 75,176, 16, 84, 88,185, 0, 0, 0, 64, 56, 89,236,228, 57, + 57, 49, 0, 16,228,252,236, 17, 57, 57, 48, 1, 64, 13, 48, 13, 64, 13, 80, 13, 96, 13,143, 13,159, 13, 6, 93, 19, 51, 17, 16, + 6, 43, 1, 53, 51, 50, 54, 53,201,202,205,227, 77, 63,134,110, 5,213,250,147,254,242,244,170,150,194, 0, 0, 0, 1, 0,201, + 0, 0, 5,106, 5,213, 0, 10, 0,239, 64, 40, 8, 17, 5, 6, 5, 7, 17, 6, 6, 5, 3, 17, 4, 5, 4, 2, 17, 5, 5, 4, + 66, 8, 5, 2, 3, 3, 0,175, 9, 6, 5, 1, 4, 6, 8, 1, 28, 0, 4, 11, 16,252,236, 50,212,196, 17, 57, 49, 0, 47, 60, +236, 50, 23, 57, 48, 75, 83, 88, 7, 16, 4,237, 7, 16, 5,237, 7, 16, 5,237, 7, 16, 4,237, 89, 34,178, 8, 3, 1, 1, 93, + 64,146, 20, 2, 1, 4, 2, 9, 8, 22, 2, 40, 5, 40, 8, 55, 2, 54, 5, 52, 8, 71, 2, 70, 5, 67, 8, 85, 2,103, 2,118, + 2,119, 5,131, 2,136, 5,143, 8,148, 2,155, 8,231, 2, 21, 6, 3, 9, 5, 9, 6, 27, 3, 25, 7, 5, 10, 3, 10, 7, 24, + 3, 40, 5, 43, 6, 42, 7, 54, 4, 54, 5, 54, 6, 53, 7, 48, 12, 65, 3, 64, 4, 69, 5, 64, 6, 64, 7, 64, 12, 98, 3, 96, + 4,104, 5,103, 7,119, 5,112, 12,139, 3,139, 5,142, 6,143, 7,143, 12,154, 3,157, 6,157, 7,182, 3,181, 7,197, 3,197, + 7,215, 3,214, 7,232, 3,233, 4,232, 5,234, 6,247, 3,248, 5,249, 6, 44, 93,113, 0, 93,113, 19, 51, 17, 1, 33, 9, 1, + 33, 1, 17, 35,201,202, 2,158, 1, 4,253, 27, 3, 26,254,246,253, 51,202, 5,213,253,137, 2,119,253, 72,252,227, 2,207,253, + 49, 0, 0, 0, 0, 1, 0,201, 0, 0, 4,106, 5,213, 0, 5, 0, 37, 64, 12, 2,149, 0,129, 4, 1, 28, 3, 58, 0, 4, 6, + 16,252,236,236, 49, 0, 47,228,236, 48, 64, 9, 48, 7, 80, 7,128, 3,128, 4, 4, 1, 93, 19, 51, 17, 33, 21, 33,201,202, 2, +215,252, 95, 5,213,250,213,170, 0, 1, 0,201, 0, 0, 6, 31, 5,213, 0, 12, 0,191, 64, 52, 3, 17, 7, 8, 7, 2, 17, 1, + 2, 8, 8, 7, 2, 17, 3, 2, 9, 10, 9, 1, 17, 10, 10, 9, 66, 10, 7, 2, 3, 8, 3, 0,175, 8, 11, 5, 9, 8, 3, 2, + 1, 5, 10, 6, 28, 4, 62, 10, 28, 0, 4, 13, 16,252,236,252,236, 17, 23, 57, 49, 0, 47, 60,196,236, 50, 17, 23, 57, 48, 75, + 83, 88, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 89, 34,178,112, 14, 1, 1, 93, 64, 86, 3, 7, 15, 8, + 15, 9, 2, 10, 21, 2, 20, 7, 19, 10, 38, 2, 38, 7, 32, 7, 38, 10, 32, 10, 52, 7, 53, 10,105, 2,124, 2,123, 7,121, 10, +128, 2,130, 7,130, 10,144, 2, 22, 4, 1, 11, 3, 19, 1, 27, 3, 35, 1, 44, 3, 39, 8, 40, 9, 52, 1, 60, 3, 86, 8, 89, + 9,101, 8,106, 9,118, 8,121, 9,129, 1,141, 3,149, 1,155, 3, 20, 93, 0, 93, 19, 33, 9, 1, 33, 17, 35, 17, 1, 35, 1, + 17, 35,201, 1, 45, 1,125, 1,127, 1, 45,197,254,127,203,254,127,196, 5,213,252, 8, 3,248,250, 43, 5, 31,252, 0, 4, 0, +250,225, 0, 0, 0, 1, 0,201, 0, 0, 5, 51, 5,213, 0, 9, 0,121, 64, 30, 7, 17, 1, 2, 1, 2, 17, 6, 7, 6, 66, 7, + 2, 3, 0,175, 8, 5, 6, 1, 7, 2, 28, 4, 54, 7, 28, 0, 4, 10, 16,252,236,252,236, 17, 57, 57, 49, 0, 47, 60,236, 50, + 57, 57, 48, 75, 83, 88, 7, 16, 4,237, 7, 16, 4,237, 89, 34,178, 31, 11, 1, 1, 93, 64, 48, 54, 2, 56, 7, 72, 2, 71, 7, +105, 2,102, 7,128, 2, 7, 6, 1, 9, 6, 21, 1, 26, 6, 70, 1, 73, 6, 87, 1, 88, 6,101, 1,105, 6,121, 6,133, 1,138, + 6,149, 1,154, 6,159, 11, 16, 93, 0, 93, 19, 33, 1, 17, 51, 17, 33, 1, 17, 35,201, 1, 16, 2,150,196,254,240,253,106,196, + 5,213,251, 31, 4,225,250, 43, 4,225,251, 31, 0, 2, 0,115,255,227, 5,217, 5,240, 0, 11, 0, 23, 0, 35, 64, 19, 6,149, + 18, 0,149, 12,145, 18,140, 24, 9, 25, 15, 51, 3, 25, 21, 16, 24, 16,252,236,252,236, 49, 0, 16,228,244,236, 16,238, 48, 1, + 34, 0, 17, 16, 0, 51, 50, 0, 17, 16, 0, 39, 32, 0, 17, 16, 0, 33, 32, 0, 17, 16, 0, 3, 39,220,254,253, 1, 3,220,220, + 1, 1,254,255,220, 1, 58, 1,120,254,136,254,198,254,197,254,135, 1,121, 5, 76,254,184,254,229,254,230,254,184, 1, 72, 1, + 26, 1, 27, 1, 72,164,254, 91,254,158,254,159,254, 91, 1,164, 1, 98, 1, 98, 1,165, 0, 0, 0, 2, 0,201, 0, 0, 4,141, + 5,213, 0, 8, 0, 19, 0, 58, 64, 24, 1,149, 16, 0,149, 9,129, 18, 16, 10, 8, 2, 4, 0, 5, 25, 13, 63, 17, 0, 28, 9, + 4, 20, 16,252,236, 50,252,236, 17, 23, 57, 49, 0, 47,244,236,212,236, 48, 64, 11, 15, 21, 31, 21, 63, 21, 95, 21,175, 21, 5, + 1, 93, 1, 17, 51, 50, 54, 53, 52, 38, 35, 37, 33, 50, 4, 21, 20, 4, 43, 1, 17, 35, 1,147,254,141,154,154,141,254, 56, 1, +200,251, 1, 1,254,255,251,254,202, 5, 47,253,207,146,135,134,146,166,227,219,221,226,253,168, 0, 2, 0,115,254,248, 5,217, + 5,240, 0, 11, 0, 29, 0, 82, 64, 42, 17, 16, 2, 15, 1, 12, 13, 12, 14, 1, 13, 13, 12, 66, 15, 30, 12, 6,149, 18, 0,149, + 24,145, 18,140, 13, 30, 13, 27, 15, 12, 3, 9, 25, 27, 51, 3, 25, 21, 16, 30, 16,252,236,252,236, 17, 57, 57, 17, 57, 49, 0, + 16,196,228,244,236, 16,238, 57, 18, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 23, 57, 89, 34, 1, 34, 0, 17, 16, 0, + 51, 50, 0, 17, 16, 0, 19, 1, 35, 39, 14, 1, 35, 32, 0, 17, 16, 0, 33, 32, 0, 17, 16, 2, 3, 39,220,254,253, 1, 3,220, +220, 1, 1,254,255, 63, 1, 10,244,221, 33, 35, 16,254,197,254,135, 1,121, 1, 59, 1, 58, 1,120,209, 5, 76,254,184,254,229, +254,230,254,184, 1, 72, 1, 26, 1, 27, 1, 72,250,207,254,221,239, 2, 2, 1,165, 1, 97, 1, 98, 1,165,254, 91,254,158,254, +252,254,142, 0, 0, 2, 0,201, 0, 0, 5, 84, 5,213, 0, 19, 0, 28, 0,177, 64, 53, 9, 8, 7, 3, 10, 6, 17, 3, 4, 3, + 5, 17, 4, 4, 3, 66, 6, 4, 0, 21, 3, 4, 21,149, 9, 20,149, 13,129, 11, 4, 5, 6, 3, 17, 9, 0, 28, 22, 14, 5, 10, + 25, 25, 4, 17, 63, 20, 10, 28, 12, 4, 29, 16,252,236, 50,252,196,236, 17, 23, 57, 17, 57, 57, 57, 49, 0, 47, 60,244,236,212, +236, 18, 57, 18, 57, 18, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 17, 23, 57, 89, 34,178, 64, 30, 1, 1, 93, 64, 66, +122, 19, 1, 5, 0, 5, 1, 5, 2, 6, 3, 7, 4, 21, 0, 21, 1, 20, 2, 22, 3, 23, 4, 37, 0, 37, 1, 37, 2, 38, 3, 39, + 6, 38, 7, 38, 8, 38, 9, 32, 30, 54, 1, 54, 2, 70, 1, 70, 2,104, 5,117, 4,117, 5,119, 19,136, 6,136, 7,152, 6,152, + 7, 31, 93, 0, 93, 1, 30, 1, 23, 19, 35, 3, 46, 1, 43, 1, 17, 35, 17, 33, 32, 22, 21, 20, 6, 1, 17, 51, 50, 54, 53, 52, + 38, 35, 3,141, 65,123, 62,205,217,191, 74,139,120,220,202, 1,200, 1, 0,252,131,253,137,254,146,149,149,146, 2,188, 22,144, +126,254,104, 1,127,150, 98,253,137, 5,213,214,216,141,186, 2, 79,253,238,135,131,131,133, 0, 0, 1, 0,135,255,227, 4,162, + 5,240, 0, 39, 0,126, 64, 60, 13, 12, 2, 14, 11, 2, 30, 31, 30, 8, 9, 2, 7, 10, 2, 31, 31, 30, 66, 10, 11, 30, 31, 4, + 21, 1, 0, 21,161, 20,148, 24,149, 17, 4,149, 0,148, 37,145, 17,140, 40, 30, 10, 11, 31, 27, 7, 0, 34, 27, 25, 14, 45, 7, + 25, 20, 34, 40, 16,220,196,236,252,236,228, 17, 18, 57, 57, 57, 57, 49, 0, 16,228,244,228,236, 16,238,246,238, 16,198, 17, 23, + 57, 48, 75, 83, 88, 7, 16, 14,237, 17, 23, 57, 7, 16, 14,237, 17, 23, 57, 89, 34,178, 15, 41, 1, 1, 93,182, 31, 41, 47, 41, + 79, 41, 3, 93, 1, 21, 46, 1, 35, 34, 6, 21, 20, 22, 31, 1, 30, 1, 21, 20, 4, 33, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, + 52, 38, 47, 1, 46, 1, 53, 52, 36, 51, 50, 22, 4, 72,115,204, 95,165,179,119,166,122,226,215,254,221,254,231,106,239,128,123, +236,114,173,188,135,154,123,226,202, 1, 23,245,105,218, 5,164,197, 55, 54,128,118, 99,101, 31, 25, 43,217,182,217,224, 48, 47, +208, 69, 70,136,126,110,124, 31, 24, 45,192,171,198,228, 38, 0, 0, 1,255,250, 0, 0, 4,233, 5,213, 0, 7, 0, 74, 64, 14, + 6, 2,149, 0,129, 4, 1, 64, 3, 28, 0, 64, 5, 8, 16,212,228,252,228, 49, 0, 47,244,236, 50, 48, 1, 75,176, 10, 84, 88, +189, 0, 8, 0, 64, 0, 1, 0, 8, 0, 8,255,192, 56, 17, 55, 56, 89, 64, 19, 0, 9, 31, 0, 16, 1, 16, 2, 31, 7, 16, 9, + 64, 9,112, 9,159, 9, 9, 93, 3, 33, 21, 33, 17, 35, 17, 33, 6, 4,239,253,238,203,253,238, 5,213,170,250,213, 5, 43, 0, + 0, 1, 0,178,255,227, 5, 41, 5,213, 0, 17, 0, 64, 64, 22, 8, 2, 17, 11, 0, 5,149, 14,140, 9, 0,129, 18, 8, 28, 10, + 56, 1, 28, 0, 65, 18, 16,252, 75,176, 16, 84, 88,185, 0, 0,255,192, 56, 89,236,252,236, 49, 0, 16,228, 50,244,236, 17, 57, + 57, 57, 57, 48, 1,182, 31, 19,143, 19,159, 19, 3, 93, 19, 51, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, 16, 0, 33, 32, 0, 17, +178,203,174,195,194,174,203,254,223,254,230,254,229,254,223, 5,213,252,117,240,211,211,240, 3,139,252, 92,254,220,254,214, 1, + 42, 1, 36, 0, 0, 1, 0, 16, 0, 0, 5,104, 5,213, 0, 6, 0,183, 64, 39, 4, 17, 5, 6, 5, 3, 17, 2, 3, 6, 6, 5, + 3, 17, 4, 3, 0, 1, 0, 2, 17, 1, 1, 0, 66, 3, 4, 1,175, 0, 6, 4, 3, 2, 0, 5, 5, 1, 7, 16,212,196, 23, 57, + 49, 0, 47,236, 50, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 89, 34,178, 80, 8, 1, + 1, 93, 64, 98, 0, 3, 42, 3, 71, 4, 71, 5, 90, 3,125, 3,131, 3, 7, 6, 0, 7, 2, 8, 4, 9, 6, 21, 1, 20, 2, 26, + 4, 26, 5, 42, 0, 38, 1, 38, 2, 41, 4, 41, 5, 37, 6, 32, 8, 56, 0, 51, 1, 51, 2, 60, 4, 60, 5, 55, 6, 72, 0, 69, + 1, 69, 2, 73, 4, 73, 5, 71, 6, 89, 0, 86, 6,102, 2,105, 4,105, 5,122, 0,118, 1,118, 2,121, 4,121, 5,117, 6,128, + 8,152, 0,151, 6, 41, 93, 0, 93, 33, 1, 51, 9, 1, 51, 1, 2, 74,253,198,211, 1,217, 1,218,210,253,199, 5,213,251, 23, + 4,233,250, 43, 0, 1, 0, 68, 0, 0, 7,166, 5,213, 0, 12, 1,123, 64, 73, 5, 26, 6, 5, 9, 10, 9, 4, 26, 10, 9, 3, + 26, 10, 11, 10, 2, 26, 1, 2, 11, 11, 10, 6, 17, 7, 8, 7, 5, 17, 4, 5, 8, 8, 7, 2, 17, 3, 2, 12, 0, 12, 1, 17, + 0, 0, 12, 66, 10, 5, 2, 3, 6, 3, 0,175, 11, 8, 12, 11, 10, 9, 8, 6, 5, 4, 3, 2, 1, 11, 7, 0, 13, 16,212,204, + 23, 57, 49, 0, 47, 60,236, 50, 50, 23, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 7, + 16, 8,237, 7, 16, 5,237, 7, 5,237, 7, 16, 8,237, 89, 34,178, 0, 14, 1, 1, 93, 64,242, 6, 2, 6, 5, 2, 10, 0, 10, + 0, 10, 18, 10, 40, 5, 36, 10, 32, 10, 62, 2, 62, 5, 52, 10, 48, 10, 76, 2, 77, 5, 66, 10, 64, 10, 89, 2,106, 2,107, 5, +103, 10, 96, 10,123, 2,127, 2,124, 5,127, 5,128, 10,150, 2,149, 5, 29, 7, 0, 9, 2, 8, 3, 0, 4, 6, 5, 0, 5, 0, + 6, 1, 7, 4, 8, 0, 8, 7, 9, 0, 9, 4, 10, 10, 12, 0, 14, 26, 3, 21, 4, 21, 8, 25, 12, 16, 14, 32, 4, 33, 5, 32, + 6, 32, 7, 32, 8, 35, 9, 36, 10, 37, 11, 32, 14, 32, 14, 60, 2, 58, 3, 53, 4, 51, 5, 48, 8, 54, 9, 57, 11, 63, 12, 48, + 14, 70, 0, 70, 1, 74, 2, 64, 4, 69, 5, 64, 5, 66, 6, 66, 7, 66, 8, 64, 8, 64, 9, 68, 10, 77, 12, 64, 14, 64, 14, 88, + 2, 86, 8, 89, 12, 80, 14,102, 2,103, 3, 97, 4, 98, 5, 96, 6, 96, 7, 96, 8,100, 9,100, 10,100, 11,119, 0,118, 1,123, + 2,120, 3,119, 4,116, 5,121, 6,121, 7,119, 8,112, 8,120, 12,127, 12,127, 14,134, 2,135, 3,136, 4,137, 5,133, 9,138, + 11,143, 14,151, 4,159, 14,175, 14, 91, 93, 0, 93, 19, 51, 9, 1, 51, 9, 1, 51, 1, 35, 9, 1, 35, 68,204, 1, 58, 1, 57, +227, 1, 58, 1, 57,205,254,137,254,254,197,254,194,254, 5,213,251, 18, 4,238,251, 18, 4,238,250, 43, 5, 16,250,240, 0, 0, + 0, 1, 0, 61, 0, 0, 5, 59, 5,213, 0, 11, 0,102, 64, 6, 13, 4, 6, 0, 10, 12, 16,212,196,220,196,196, 49,180,128, 0, +127, 10, 2, 93, 0, 64, 5, 3, 0,175, 9, 6, 47, 60,236, 50, 48, 75,176, 66, 80, 88, 64, 20, 7, 17, 6, 6, 5, 9, 17, 10, + 11, 10, 3, 17, 4, 5, 4, 1, 17, 0, 11, 0, 5, 7, 16,236, 7, 16,236, 7, 16,236, 7, 16,236, 64, 20, 11, 10, 3, 7, 0, + 8, 9, 4, 7, 0, 5, 9, 4, 6, 1, 2, 10, 3, 6, 1, 15, 15, 15, 15, 89, 19, 51, 9, 1, 51, 9, 1, 35, 9, 1, 35, 1, +129,217, 1,115, 1,117,217,254, 32, 2, 0,217,254, 92,254, 89,218, 2, 21, 5,213,253,213, 2, 43,253, 51,252,248, 2,123,253, +133, 3, 29, 0, 0, 1,255,252, 0, 0, 4,231, 5,213, 0, 8, 0,148, 64, 40, 3, 17, 4, 5, 4, 2, 17, 1, 2, 5, 5, 4, + 2, 17, 3, 2, 8, 0, 8, 1, 17, 0, 0, 8, 66, 2, 3, 0,175, 6, 2, 7, 4, 64, 5, 28, 0, 64, 7, 9, 16,212,228,252, +228, 18, 57, 49, 0, 47,236, 50, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 89, 34,178, + 0, 10, 1, 1, 93, 64, 60, 5, 2, 20, 2, 53, 2, 48, 2, 48, 5, 48, 8, 70, 2, 64, 2, 64, 5, 64, 8, 81, 2, 81, 5, 81, + 8,101, 2,132, 2,147, 2, 16, 22, 1, 26, 3, 31, 10, 38, 1, 41, 3, 55, 1, 56, 3, 64, 10,103, 1,104, 3,120, 3,112, 10, +159, 10, 13, 93, 0, 93, 3, 51, 9, 1, 51, 1, 17, 35, 17, 4,217, 1,158, 1,155,217,253,240,203, 5,213,253,154, 2,102,252, +242,253, 57, 2,199, 0, 0, 0, 0, 1, 0, 92, 0, 0, 5, 31, 5,213, 0, 9, 0,144, 64, 27, 3, 17, 7, 8, 7, 8, 17, 2, + 3, 2, 66, 8,149, 0,129, 3,149, 5, 8, 3, 0, 1, 66, 4, 0, 6, 10, 16,220, 75,176, 9, 84, 75,176, 10, 84, 91, 88,185, + 0, 6,255,192, 56, 89,196,212,228, 17, 57, 57, 49, 0, 47,236,244,236, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 89, 34, + 1, 64, 64, 5, 2, 10, 7, 24, 7, 41, 2, 38, 7, 56, 7, 72, 2, 71, 7, 72, 8, 9, 5, 3, 11, 8, 0, 11, 22, 3, 26, 8, + 16, 11, 47, 11, 53, 3, 57, 8, 63, 11, 71, 3, 74, 8, 79, 11, 85, 3, 89, 8,102, 3,105, 8,111, 11,119, 3,120, 8,127, 11, +159, 11, 22, 93, 0, 93, 19, 33, 21, 1, 33, 21, 33, 53, 1, 33,115, 4,149,252, 80, 3,199,251, 61, 3,176,252,103, 5,213,154, +251,111,170,154, 4,145, 0, 0, 0, 1, 0,176,254,242, 2, 88, 6, 20, 0, 7, 0, 59, 64, 15, 4,169, 6,178, 2,169, 0,177, + 8, 5, 1, 3, 67, 0, 8, 16,220, 75,176, 12, 84, 88,185, 0, 0, 0, 64, 56, 89, 75,176, 18, 84, 75,176, 19, 84, 91, 88,185, + 0, 0,255,192, 56, 89,252,204, 50, 49, 0, 16,252,236,244,236, 48, 19, 33, 21, 35, 17, 51, 21, 33,176, 1,168,240,240,254, 88, + 6, 20,143,249,252,143, 0, 0, 0, 1, 0, 0,255, 66, 2,178, 5,213, 0, 3, 0, 45, 64, 20, 2, 26, 1, 1, 0, 0, 26, 3, + 3, 2, 66, 1,159, 0,129, 4, 2, 0, 1, 3, 47,196, 57, 57, 49, 0, 16,244,236, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5, +237, 89, 34, 19, 1, 35, 1,170, 2, 8,170,253,248, 5,213,249,109, 6,147, 0, 0, 1, 0,199,254,242, 2,111, 6, 20, 0, 7, + 0, 48, 64, 16, 3,169, 1,178, 5,169, 0,177, 8, 0, 67, 4, 6, 2, 4, 8, 16,252, 75,176, 15, 84, 75,176, 16, 84, 91, 88, +185, 0, 2, 0, 64, 56, 89, 60,220,236, 49, 0, 16,252,236,244,236, 48, 1, 17, 33, 53, 51, 17, 35, 53, 2,111,254, 88,239,239, + 6, 20,248,222,143, 6, 4,143, 0, 1, 0,217, 3,168, 5,219, 5,213, 0, 6, 0, 24, 64, 10, 3, 4, 1, 0,129, 7, 3, 1, + 5, 7, 16,220,204, 57, 49, 0, 16,244,204, 50, 57, 48, 9, 1, 35, 9, 1, 35, 1, 3,188, 2, 31,201,254, 72,254, 72,201, 2, + 31, 5,213,253,211, 1,139,254,117, 2, 45, 0, 0, 1,255,236,254, 29, 4, 20,254,172, 0, 3, 0, 15,181, 0,169, 1, 0, 2, + 4, 16,196,196, 49, 0,212,236, 48, 1, 21, 33, 53, 4, 20,251,216,254,172,143,143, 0, 0, 0, 0, 1, 0,170, 4,240, 2,137, + 6,102, 0, 3, 0, 49, 64, 9, 1,180, 0,179, 4, 3, 68, 1, 4, 16,220,236, 49, 0, 16,244,236, 48, 0, 75,176, 9, 84, 75, +176, 14, 84, 91, 88,189, 0, 4,255,192, 0, 1, 0, 4, 0, 4, 0, 64, 56, 17, 55, 56, 89, 9, 1, 35, 1, 1,111, 1, 26,153, +254,186, 6,102,254,138, 1,118, 0, 2, 0,123,255,227, 4, 45, 4,123, 0, 10, 0, 37, 0,188, 64, 39, 25, 31, 11, 23, 9, 14, + 0,169, 23, 6,185, 14, 17, 32,134, 31,186, 28,185, 35,184, 17,140, 23, 12, 0, 23, 3, 24, 13, 9, 8, 11, 31, 3, 8, 20, 69, + 38, 16,252,236,204,212,236, 50, 50, 17, 57, 57, 49, 0, 47,196,228,244,252,244,236, 16,198,238, 16,238, 17, 57, 17, 57, 18, 57, + 48, 64,110, 48, 29, 48, 30, 48, 31, 48, 32, 48, 33, 48, 34, 63, 39, 64, 29, 64, 30, 64, 31, 64, 32, 64, 33, 64, 34, 80, 29, 80, + 30, 80, 31, 80, 32, 80, 33, 80, 34, 80, 39,112, 39,133, 29,135, 30,135, 31,135, 32,135, 33,133, 34,144, 39,160, 39,240, 39, 30, + 48, 30, 48, 31, 48, 32, 48, 33, 64, 30, 64, 31, 64, 32, 64, 33, 80, 30, 80, 31, 80, 32, 80, 33, 96, 30, 96, 31, 96, 32, 96, 33, +112, 30,112, 31,112, 32,112, 33,128, 30,128, 31,128, 32,128, 33, 24, 93, 1, 93, 1, 34, 6, 21, 20, 22, 51, 50, 54, 61, 1, 55, + 17, 35, 53, 14, 1, 35, 34, 38, 53, 52, 54, 51, 33, 53, 52, 38, 35, 34, 6, 7, 53, 62, 1, 51, 50, 22, 2,190,223,172,129,111, +153,185,184,184, 63,188,136,172,203,253,251, 1, 2,167,151, 96,182, 84,101,190, 90,243,240, 2, 51,102,123, 98,115,217,180, 41, + 76,253,129,170,102, 97,193,162,189,192, 18,127,139, 46, 46,170, 39, 39,252, 0, 0, 2, 0,186,255,227, 4,164, 6, 20, 0, 11, + 0, 28, 0, 56, 64, 25, 3,185, 12, 15, 9,185, 24, 21,140, 15,184, 27,151, 25, 0, 18, 18, 71, 24, 12, 6, 8, 26, 70, 29, 16, +252,236, 50, 50,244,236, 49, 0, 47,236,228,244,196,236, 16,198,238, 48,182, 96, 30,128, 30,160, 30, 3, 1, 93, 1, 52, 38, 35, + 34, 6, 21, 20, 22, 51, 50, 54, 1, 62, 1, 51, 50, 0, 17, 16, 2, 35, 34, 38, 39, 21, 35, 17, 51, 3,229,167,146,146,167,167, +146,146,167,253,142, 58,177,123,204, 0,255,255,204,123,177, 58,185,185, 2, 47,203,231,231,203,203,231,231, 2, 82,100, 97,254, +188,254,248,254,248,254,188, 97,100,168, 6, 20, 0, 1, 0,113,255,227, 3,231, 4,123, 0, 25, 0, 63, 64, 27, 0,134, 1,136, + 4, 14,134, 13,136, 10,185, 17, 4,185, 23,184, 17,140, 26, 7, 18, 13, 0, 72, 20, 69, 26, 16,252,228, 50,236, 49, 0, 16,228, +244,236, 16,254,244,238, 16,245,238, 48, 64, 11, 15, 27, 16, 27,128, 27,144, 27,160, 27, 5, 1, 93, 1, 21, 46, 1, 35, 34, 6, + 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 0, 17, 16, 0, 33, 50, 22, 3,231, 78,157, 80,179,198,198,179, 80,157, 78, 77, +165, 93,253,254,214, 1, 45, 1, 6, 85,162, 4, 53,172, 43, 43,227,205,205,227, 43, 43,170, 36, 36, 1, 62, 1, 14, 1, 18, 1, + 58, 35, 0, 0, 0, 2, 0,113,255,227, 4, 90, 6, 20, 0, 16, 0, 28, 0, 56, 64, 25, 26,185, 0, 14, 20,185, 5, 8,140, 14, +184, 1,151, 3, 23, 4, 0, 8, 2, 71, 17, 18, 11, 69, 29, 16,252,236,244,236, 50, 50, 49, 0, 47,236,228,244,196,236, 16,196, +238, 48,182, 96, 30,128, 30,160, 30, 3, 1, 93, 1, 17, 51, 17, 35, 53, 14, 1, 35, 34, 2, 17, 16, 0, 51, 50, 22, 1, 20, 22, + 51, 50, 54, 53, 52, 38, 35, 34, 6, 3,162,184,184, 58,177,124,203,255, 0,255,203,124,177,253,199,167,146,146,168,168,146,146, +167, 3,182, 2, 94,249,236,168,100, 97, 1, 68, 1, 8, 1, 8, 1, 68, 97,254, 21,203,231,231,203,203,231,231, 0, 2, 0,113, +255,227, 4,127, 4,123, 0, 20, 0, 27, 0,112, 64, 36, 0, 21, 1, 9,134, 8,136, 5, 21,169, 1, 5,185, 12, 1,187, 24,185, + 18,184, 12,140, 28, 27, 21, 2, 8, 21, 8, 0, 75, 2, 18, 15, 69, 28, 16,252,236,244,236,196, 17, 18, 57, 49, 0, 16,228,244, +236,228, 16,238, 16,238, 16,244,238, 17, 18, 57, 48, 64, 41, 63, 29,112, 29,160, 29,208, 29,240, 29, 5, 63, 0, 63, 1, 63, 2, + 63, 21, 63, 27, 5, 44, 7, 47, 8, 47, 9, 44, 10,111, 0,111, 1,111, 2,111, 21,111, 27, 9, 93,113, 1, 93, 1, 21, 33, 30, + 1, 51, 50, 54, 55, 21, 14, 1, 35, 32, 0, 17, 16, 0, 51, 50, 0, 7, 46, 1, 35, 34, 6, 7, 4,127,252,178, 12,205,183,106, +199, 98, 99,208,107,254,244,254,199, 1, 41,252,226, 1, 7,184, 2,165,136,154,185, 14, 2, 94, 90,190,199, 52, 52,174, 42, 44, + 1, 56, 1, 10, 1, 19, 1, 67,254,221,196,151,180,174,158, 0, 0, 1, 0, 47, 0, 0, 2,248, 6, 20, 0, 19, 0, 89, 64, 28, + 5, 16, 1, 12, 8,169, 6, 1,135, 0,151, 14, 6,188, 10, 2, 19, 7, 0, 7, 9, 5, 8, 13, 15, 11, 76, 20, 16,252, 75,176, + 10, 84, 88,185, 0, 11, 0, 64, 56, 89, 75,176, 14, 84, 88,185, 0, 11,255,192, 56, 89, 60,196,252, 60,196,196, 18, 57, 57, 49, + 0, 47,228, 50,252,236, 16,238, 50, 18, 57, 57, 48, 1,182, 64, 21, 80, 21,160, 21, 3, 93, 1, 21, 35, 34, 6, 29, 1, 33, 21, + 33, 17, 35, 17, 35, 53, 51, 53, 52, 54, 51, 2,248,176, 99, 77, 1, 47,254,209,185,176,176,174,189, 6, 20,153, 80,104, 99,143, +252, 47, 3,209,143, 78,187,171, 0, 2, 0,113,254, 86, 4, 90, 4,123, 0, 11, 0, 40, 0, 74, 64, 35, 25, 12, 29, 9, 18,134, + 19, 22,185, 15, 3,185, 38, 35,184, 39,188, 9,185, 15,189, 26, 29, 38, 25, 0, 8, 12, 71, 6, 18, 18, 32, 69, 41, 16,252,196, +236,244,236, 50, 50, 49, 0, 47,196,228,236,228,244,196,236, 16,254,213,238, 17, 18, 57, 57, 48,182, 96, 42,128, 42,160, 42, 3, + 1, 93, 1, 52, 38, 35, 34, 6, 21, 20, 22, 51, 50, 54, 23, 16, 2, 33, 34, 38, 39, 53, 30, 1, 51, 50, 54, 61, 1, 14, 1, 35, + 34, 2, 17, 16, 18, 51, 50, 22, 23, 53, 51, 3,162,165,149,148,165,165,148,149,165,184,254,254,250, 97,172, 81, 81,158, 82,181, +180, 57,178,124,206,252,252,206,124,178, 57,184, 2, 61,200,220,220,200,199,220,220,235,254,226,254,233, 29, 30,179, 44, 42,189, +191, 91, 99, 98, 1, 58, 1, 3, 1, 4, 1, 58, 98, 99,170, 0, 0, 1, 0,186, 0, 0, 4,100, 6, 20, 0, 19, 0, 52, 64, 25, + 3, 9, 0, 3, 14, 1, 6,135, 14, 17,184, 12,151, 10, 1, 2, 8, 0, 78, 13, 9, 8, 11, 70, 20, 16,252,236, 50,244,236, 49, + 0, 47, 60,236,244,196,236, 17, 18, 23, 57, 48,178, 96, 21, 1, 1, 93, 1, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 51, + 17, 62, 1, 51, 50, 22, 4,100,184,124,124,149,172,185,185, 66,179,117,193,198, 2,164,253, 92, 2,158,159,158,190,164,253,135, + 6, 20,253,158,101,100,239, 0, 0, 2, 0,193, 0, 0, 1,121, 6, 20, 0, 3, 0, 7, 0, 43, 64, 14, 6,190, 4,177, 0,188, + 2, 5, 1, 8, 4, 0, 70, 8, 16,252, 60,236, 50, 49, 0, 47,228,252,236, 48, 64, 11, 16, 9, 64, 9, 80, 9, 96, 9,112, 9, + 5, 1, 93, 19, 51, 17, 35, 17, 51, 21, 35,193,184,184,184,184, 4, 96,251,160, 6, 20,233, 0, 0, 2,255,219,254, 86, 1,121, + 6, 20, 0, 11, 0, 15, 0, 68, 64, 28, 11, 2, 7, 0, 14,190, 12, 7,135, 5,189, 0,188, 12,177, 16, 8, 16, 5, 6, 79, 13, + 1, 8, 12, 0, 70, 16, 16,252, 60,236, 50,228, 57, 18, 57, 49, 0, 16,236,228,244,236, 16,238, 17, 18, 57, 57, 48, 64, 11, 16, + 17, 64, 17, 80, 17, 96, 17,112, 17, 5, 1, 93, 19, 51, 17, 20, 6, 43, 1, 53, 51, 50, 54, 53, 17, 51, 21, 35,193,184,163,181, + 70, 49,105, 76,184,184, 4, 96,251,140,214,192,156, 97,153, 6, 40,233, 0, 0, 0, 1, 0,186, 0, 0, 4,156, 6, 20, 0, 10, + 0,188, 64, 41, 8, 17, 5, 6, 5, 7, 17, 6, 6, 5, 3, 17, 4, 5, 4, 2, 17, 5, 5, 4, 66, 8, 5, 2, 3, 3,188, 0, +151, 9, 6, 5, 1, 4, 6, 8, 1, 8, 0, 70, 11, 16,252,236, 50,212,196, 17, 57, 49, 0, 47, 60,236,228, 23, 57, 48, 75, 83, + 88, 7, 16, 4,237, 7, 16, 5,237, 7, 16, 5,237, 7, 16, 4,237, 89, 34,178, 16, 12, 1, 1, 93, 64, 95, 4, 2, 10, 8, 22, + 2, 39, 2, 41, 5, 43, 8, 86, 2,102, 2,103, 8,115, 2,119, 5,130, 2,137, 5,142, 8,147, 2,150, 5,151, 8,163, 2, 18, + 9, 5, 9, 6, 2, 11, 3, 10, 7, 40, 3, 39, 4, 40, 5, 43, 6, 43, 7, 64, 12,104, 3, 96, 12,137, 3,133, 4,137, 5,141, + 6,143, 7,154, 3,151, 7,170, 3,167, 5,182, 7,197, 7,214, 7,247, 3,240, 3,247, 4,240, 4, 26, 93,113, 0, 93, 19, 51, + 17, 1, 51, 9, 1, 35, 1, 17, 35,186,185, 2, 37,235,253,174, 2,107,240,253,199,185, 6, 20,252,105, 1,227,253,244,253,172, + 2, 35,253,221, 0, 1, 0,193, 0, 0, 1,121, 6, 20, 0, 3, 0, 34,183, 0,151, 2, 1, 8, 0, 70, 4, 16,252,236, 49, 0, + 47,236, 48, 64, 13, 16, 5, 64, 5, 80, 5, 96, 5,112, 5,240, 5, 6, 1, 93, 19, 51, 17, 35,193,184,184, 6, 20,249,236, 0, + 0, 1, 0,186, 0, 0, 7, 29, 4,123, 0, 34, 0, 90, 64, 38, 6, 18, 9, 24, 15, 0, 6, 29, 7, 21, 12,135, 29, 32, 3,184, + 27,188, 25, 16, 7, 0, 17, 15, 8, 8, 6, 80, 17, 8, 15, 80, 28, 24, 8, 26, 70, 35, 16,252,236, 50,252,252,252,236, 17, 18, + 57, 49, 0, 47, 60, 60,228,244, 60,196,236, 50, 17, 18, 23, 57, 48, 64, 19, 48, 36, 80, 36,112, 36,144, 36,160, 36,160, 36,191, + 36,223, 36,255, 36, 9, 1, 93, 1, 62, 1, 51, 50, 22, 21, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 52, 38, 35, 34, 6, + 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 4, 41, 69,192,130,175,190,185,114,117,143,166,185,114,119,141,166,185,185, 63,176, +121,122,171, 3,137,124,118,245,226,253, 92, 2,158,161,156,190,164,253,135, 2,158,162,155,191,163,253,135, 4, 96,174,103, 98, +124, 0, 0, 0, 0, 1, 0,186, 0, 0, 4,100, 4,123, 0, 19, 0, 54, 64, 25, 3, 9, 0, 3, 14, 1, 6,135, 14, 17,184, 12, +188, 10, 1, 2, 8, 0, 78, 13, 9, 8, 11, 70, 20, 16,252,236, 50,244,236, 49, 0, 47, 60,228,244,196,236, 17, 18, 23, 57, 48, +180, 96, 21,207, 21, 2, 1, 93, 1, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 4,100,184,124, +124,149,172,185,185, 66,179,117,193,198, 2,164,253, 92, 2,158,159,158,190,164,253,135, 4, 96,174,101,100,239, 0, 2, 0,113, +255,227, 4,117, 4,123, 0, 11, 0, 23, 0, 74, 64, 19, 6,185, 18, 0,185, 12,184, 18,140, 24, 9, 18, 15, 81, 3, 18, 21, 69, + 24, 16,252,236,244,236, 49, 0, 16,228,244,236, 16,238, 48, 64, 35, 63, 25,123, 0,123, 6,127, 7,127, 8,127, 9,127, 10,127, + 11,123, 12,127, 13,127, 14,127, 15,127, 16,127, 17,123, 18,160, 25,240, 25, 17, 1, 93, 1, 34, 6, 21, 20, 22, 51, 50, 54, 53, + 52, 38, 39, 50, 0, 17, 16, 0, 35, 34, 0, 17, 16, 0, 2,115,148,172,171,149,147,172,172,147,240, 1, 18,254,238,240,241,254, +239, 1, 17, 3,223,231,201,201,231,232,200,199,233,156,254,200,254,236,254,237,254,199, 1, 57, 1, 19, 1, 20, 1, 56, 0, 0, + 0, 2, 0,186,254, 86, 4,164, 4,123, 0, 16, 0, 28, 0, 62, 64, 27, 26,185, 0, 14, 20,185, 5, 8,184, 14,140, 1,189, 3, +188, 29, 17, 18, 11, 71, 23, 4, 0, 8, 2, 70, 29, 16,252,236, 50, 50,244,236, 49, 0, 16,228,228,228,244,196,236, 16,196,238, + 48, 64, 9, 96, 30,128, 30,160, 30,224, 30, 4, 1, 93, 37, 17, 35, 17, 51, 21, 62, 1, 51, 50, 0, 17, 16, 2, 35, 34, 38, 1, + 52, 38, 35, 34, 6, 21, 20, 22, 51, 50, 54, 1,115,185,185, 58,177,123,204, 0,255,255,204,123,177, 2, 56,167,146,146,167,167, +146,146,167,168,253,174, 6, 10,170,100, 97,254,188,254,248,254,248,254,188, 97, 1,235,203,231,231,203,203,231,231, 0, 0, 0, + 0, 2, 0,113,254, 86, 4, 90, 4,123, 0, 11, 0, 28, 0, 62, 64, 27, 3,185, 12, 15, 9,185, 24, 21,184, 15,140, 27,189, 25, +188, 29, 24, 12, 6, 8, 26, 71, 0, 18, 18, 69, 29, 16,252,236,244,236, 50, 50, 49, 0, 16,228,228,228,244,196,236, 16,198,238, + 48, 64, 9, 96, 30,128, 30,160, 30,224, 30, 4, 1, 93, 1, 20, 22, 51, 50, 54, 53, 52, 38, 35, 34, 6, 1, 14, 1, 35, 34, 2, + 17, 16, 0, 51, 50, 22, 23, 53, 51, 17, 35, 1, 47,167,146,146,168,168,146,146,167, 2,115, 58,177,124,203,255, 0,255,203,124, +177, 58,184,184, 2, 47,203,231,231,203,203,231,231,253,174,100, 97, 1, 68, 1, 8, 1, 8, 1, 68, 97,100,170,249,246, 0, 0, + 0, 1, 0,186, 0, 0, 3, 74, 4,123, 0, 17, 0, 48, 64, 20, 6, 11, 7, 0, 17, 11, 3,135, 14,184, 9,188, 7, 10, 6, 8, + 0, 8, 70, 18, 16,252,196,236, 50, 49, 0, 47,228,244,236,196,212,204, 17, 18, 57, 48,180, 80, 19,159, 19, 2, 1, 93, 1, 46, + 1, 35, 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 23, 3, 74, 31, 73, 44,156,167,185,185, 58,186,133, 19, 46, 28, 3, +180, 18, 17,203,190,253,178, 4, 96,174,102, 99, 5, 5, 0, 0, 0, 1, 0,111,255,227, 3,199, 4,123, 0, 39, 0,231, 64, 60, + 13, 12, 2, 14, 11, 83, 31, 30, 8, 9, 2, 7, 10, 83, 30, 31, 30, 66, 10, 11, 30, 31, 4, 21, 0,134, 1,137, 4, 20,134, 21, +137, 24,185, 17, 4,185, 37,184, 17,140, 40, 30, 10, 11, 31, 27, 7, 0, 82, 27, 8, 14, 7, 8, 20, 34, 69, 40, 16,252,196,236, +212,236,228, 17, 18, 57, 57, 57, 57, 49, 0, 16,228,244,236, 16,254,245,238, 16,245,238, 18, 23, 57, 48, 75, 83, 88, 7, 16, 14, +237, 17, 23, 57, 7, 14,237, 17, 23, 57, 89, 34,178, 0, 39, 1, 1, 93, 64,109, 28, 10, 28, 11, 28, 12, 46, 9, 44, 10, 44, 11, + 44, 12, 59, 9, 59, 10, 59, 11, 59, 12, 11, 32, 0, 32, 1, 36, 2, 40, 10, 40, 11, 42, 19, 47, 20, 47, 21, 42, 22, 40, 30, 40, + 31, 41, 32, 41, 33, 36, 39,134, 10,134, 11,134, 12,134, 13, 18, 0, 0, 0, 1, 2, 2, 6, 10, 6, 11, 3, 12, 3, 13, 3, 14, + 3, 15, 3, 16, 3, 25, 3, 26, 3, 27, 3, 28, 4, 29, 9, 39, 47, 41, 63, 41, 95, 41,127, 41,128, 41,144, 41,160, 41,240, 41, + 24, 93, 0, 93,113, 1, 21, 46, 1, 35, 34, 6, 21, 20, 22, 31, 1, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, + 53, 52, 38, 47, 1, 46, 1, 53, 52, 54, 51, 50, 22, 3,139, 78,168, 90,137,137, 98,148, 63,196,165,247,216, 90,195,108,102,198, + 97,130,140,101,171, 64,171,152,224,206,102,180, 4, 63,174, 40, 40, 84, 84, 64, 73, 33, 14, 42,153,137,156,182, 35, 35,190, 53, + 53, 89, 81, 75, 80, 37, 15, 36,149,130,158,172, 30, 0, 0, 0, 0, 1, 0, 55, 0, 0, 2,242, 5,158, 0, 19, 0, 56, 64, 25, + 14, 5, 8, 15, 3,169, 0, 17, 1,188, 8,135, 10, 11, 8, 9, 2, 4, 0, 8, 16, 18, 14, 70, 20, 16,252, 60,196,252, 60,196, + 50, 57, 57, 49, 0, 47,236,244, 60,196,236, 50, 17, 57, 57, 48,178,175, 21, 1, 1, 93, 1, 17, 33, 21, 33, 17, 20, 22, 59, 1, + 21, 35, 34, 38, 53, 17, 35, 53, 51, 17, 1,119, 1,123,254,133, 75,115,189,189,213,162,135,135, 5,158,254,194,143,253,160,137, + 78,154,159,210, 2, 96,143, 1, 62, 0, 0, 0, 0, 1, 0,174,255,227, 4, 88, 4, 96, 0, 19, 0, 54, 64, 25, 3, 9, 0, 3, + 14, 1, 6,135, 14, 17,140, 10, 1,188, 12, 13, 9, 8, 11, 78, 2, 8, 0, 70, 20, 16,252,236,244,236, 50, 49, 0, 47,228, 50, +244,196,236, 17, 18, 23, 57, 48,180, 96, 21,207, 21, 2, 1, 93, 19, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, 35, 53, 14, + 1, 35, 34, 38,174,184,124,124,149,173,184,184, 67,177,117,193,200, 1,186, 2,166,253, 97,159,159,190,164, 2,123,251,160,172, +102, 99,240, 0, 0, 1, 0, 61, 0, 0, 4,127, 4, 96, 0, 6, 0,251, 64, 39, 3, 17, 4, 5, 4, 2, 17, 1, 2, 5, 5, 4, + 2, 17, 3, 2, 6, 0, 6, 1, 17, 0, 0, 6, 66, 2, 3, 0,191, 5, 6, 5, 3, 2, 1, 5, 4, 0, 7, 16,212, 75,176, 10, + 84, 88,185, 0, 0, 0, 64, 56, 89, 75,176, 20, 84, 75,176, 21, 84, 91, 88,185, 0, 0,255,192, 56, 89,196, 23, 57, 49, 0, 47, +236, 50, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 89, 34, 1, 64,142, 72, 2,106, 2, +123, 2,127, 2,134, 2,128, 2,145, 2,164, 2, 8, 6, 0, 6, 1, 9, 3, 9, 4, 21, 0, 21, 1, 26, 3, 26, 4, 38, 0, 38, + 1, 41, 3, 41, 4, 32, 8, 53, 0, 53, 1, 58, 3, 58, 4, 48, 8, 70, 0, 70, 1, 73, 3, 73, 4, 70, 5, 72, 6, 64, 8, 86, + 0, 86, 1, 89, 3, 89, 4, 80, 8,102, 0,102, 1,105, 3,105, 4,103, 5,104, 6, 96, 8,117, 0,116, 1,123, 3,123, 4,117, + 5,122, 6,133, 0,133, 1,137, 3,137, 4,137, 5,134, 6,150, 0,150, 1,151, 2,154, 3,152, 4,152, 5,151, 6,168, 5,167, + 6,176, 8,192, 8,223, 8,255, 8, 62, 93, 0, 93, 19, 51, 9, 1, 51, 1, 35, 61,195, 1, 94, 1, 94,195,254, 92,250, 4, 96, +252, 84, 3,172,251,160, 0, 0, 0, 1, 0, 86, 0, 0, 6, 53, 4, 96, 0, 12, 1,235, 64, 73, 5, 85, 6, 5, 9, 10, 9, 4, + 85, 10, 9, 3, 85, 10, 11, 10, 2, 85, 1, 2, 11, 11, 10, 6, 17, 7, 8, 7, 5, 17, 4, 5, 8, 8, 7, 2, 17, 3, 2, 12, + 0, 12, 1, 17, 0, 0, 12, 66, 10, 5, 2, 3, 6, 3, 0,191, 11, 8, 12, 11, 10, 9, 8, 6, 5, 4, 3, 2, 1, 11, 7, 0, + 13, 16,212, 75,176, 10, 84, 75,176, 17, 84, 91, 75,176, 18, 84, 91, 75,176, 19, 84, 91, 75,176, 11, 84, 91, 88,185, 0, 0, 0, + 64, 56, 89, 1, 75,176, 12, 84, 75,176, 13, 84, 91, 75,176, 16, 84, 91, 88,185, 0, 0,255,192, 56, 89,204, 23, 57, 49, 0, 47, + 60,236, 50, 50, 23, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 7, 16, 8,237, 7, 16, + 5,237, 7, 5,237, 7, 16, 8,237, 89, 34, 1, 64,255, 5, 2, 22, 2, 22, 5, 34, 10, 53, 10, 73, 2, 73, 5, 70, 10, 64, 10, + 91, 2, 91, 5, 85, 10, 80, 10,110, 2,110, 5,102, 10,121, 2,127, 2,121, 5,127, 5,135, 2,153, 2,152, 5,148, 10,188, 2, +188, 5,206, 2,199, 3,207, 5, 29, 5, 2, 9, 3, 6, 4, 11, 5, 10, 8, 11, 9, 4, 11, 5, 12, 21, 2, 25, 3, 22, 4, 26, + 5, 27, 8, 27, 9, 20, 11, 21, 12, 37, 0, 37, 1, 35, 2, 39, 3, 33, 4, 37, 5, 34, 6, 34, 7, 37, 8, 39, 9, 36, 10, 33, + 11, 35, 12, 57, 3, 54, 4, 54, 8, 57, 12, 48, 14, 70, 2, 72, 3, 70, 4, 64, 4, 66, 5, 64, 6, 64, 7, 64, 8, 68, 9, 68, + 10, 68, 11, 64, 14, 64, 14, 86, 0, 86, 1, 86, 2, 80, 4, 81, 5, 82, 6, 82, 7, 80, 8, 83, 9, 84, 10, 85, 11, 99, 0,100, + 1,101, 2,106, 3,101, 4,106, 5,106, 6,106, 7,110, 9, 97, 11,103, 12,111, 14,117, 0,117, 1,121, 2,125, 3,120, 4,125, + 5,122, 6,127, 6,122, 7,127, 7,120, 8,121, 9,127, 9,123, 10,118, 11,125, 12,135, 2,136, 5,143, 14,151, 0,151, 1,148, + 2,147, 3,156, 4,155, 5,152, 6,152, 7,153, 8, 64, 47,150, 12,159, 14,166, 0,166, 1,164, 2,164, 3,171, 4,171, 5,169, + 6,169, 7,171, 8,164, 12,175, 14,181, 2,177, 3,189, 4,187, 5,184, 9,191, 14,196, 2,195, 3,204, 4,202, 5,121, 93, 0, + 93, 19, 51, 27, 1, 51, 27, 1, 51, 1, 35, 11, 1, 35, 86,184,230,229,217,230,229,184,254,219,217,241,242,217, 4, 96,252,150, + 3,106,252,150, 3,106,251,160, 3,150,252,106, 0, 1, 0, 59, 0, 0, 4,121, 4, 96, 0, 11, 1, 67, 64, 70, 5, 17, 6, 7, + 6, 4, 17, 3, 4, 7, 7, 6, 4, 17, 5, 4, 1, 2, 1, 3, 17, 2, 2, 1, 11, 17, 0, 1, 0, 10, 17, 9, 10, 1, 1, 0, + 10, 17, 11, 10, 7, 8, 7, 9, 17, 8, 8, 7, 66, 10, 7, 4, 1, 4, 8, 0,191, 5, 2, 10, 7, 4, 1, 4, 8, 0, 2, 8, + 6, 12, 16,212, 75,176, 10, 84, 75,176, 15, 84, 91, 75,176, 16, 84, 91, 75,176, 17, 84, 91, 88,185, 0, 6, 0, 64, 56, 89, 75, +176, 20, 84, 88,185, 0, 6,255,192, 56, 89,196,212,196, 17, 23, 57, 49, 0, 47, 60,236, 50, 23, 57, 48, 75, 83, 88, 7, 16, 5, +237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 89, 34, 1, + 64,152, 10, 4, 4, 10, 26, 4, 21, 10, 38, 10, 61, 4, 49, 10, 85, 4, 87, 7, 88, 10,102, 10,118, 1,122, 4,118, 7,116, 10, +141, 4,130, 10,153, 4,159, 4,151, 7,146, 10,144, 10,166, 1,169, 4,175, 4,165, 7,163, 10,160, 10, 28, 10, 3, 4, 5, 5, + 9, 10, 11, 26, 3, 21, 5, 21, 9, 26, 11, 41, 3, 38, 5, 37, 9, 42, 11, 32, 13, 58, 1, 57, 3, 55, 5, 52, 7, 54, 9, 57, + 11, 48, 13, 73, 3, 70, 5, 69, 9, 74, 11, 64, 13, 89, 0, 86, 1, 89, 2, 89, 3, 87, 5, 86, 6, 89, 7, 86, 8, 86, 9, 89, + 11, 80, 13,111, 13,120, 1,127, 13,155, 1,148, 7,171, 1,164, 7,176, 13,207, 13,223, 13,255, 13, 47, 93, 0, 93, 9, 2, 35, + 9, 1, 35, 9, 1, 51, 9, 1, 4,100,254,107, 1,170,217,254,186,254,186,217, 1,179,254,114,217, 1, 41, 1, 41, 4, 96,253, +223,253,193, 1,184,254, 72, 2, 74, 2, 22,254,113, 1,143, 0, 0, 1, 0, 61,254, 86, 4,127, 4, 96, 0, 15, 1,139, 64, 67, + 7, 8, 2, 9, 17, 0, 15, 10, 17, 11, 10, 0, 0, 15, 14, 17, 15, 0, 15, 13, 17, 12, 13, 0, 0, 15, 13, 17, 14, 13, 10, 11, + 10, 12, 17, 11, 11, 10, 66, 13, 11, 9, 16, 0, 11, 5,135, 3,189, 14, 11,188, 16, 14, 13, 12, 10, 9, 6, 3, 0, 8, 15, 4, + 15, 11, 16, 16,212, 75,176, 10, 84, 75,176, 8, 84, 91, 88,185, 0, 11, 0, 64, 56, 89, 75,176, 20, 84, 88,185, 0, 11,255,192, + 56, 89,196,196, 17, 23, 57, 49, 0, 16,228, 50,244,236, 17, 57, 17, 57, 18, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 8,237, + 7, 16, 8,237, 7, 16, 5,237, 7, 16, 8,237, 7, 5,237, 23, 50, 89, 34, 1, 64,240, 6, 0, 5, 8, 6, 9, 3, 13, 22, 10, + 23, 13, 16, 13, 35, 13, 53, 13, 73, 10, 79, 10, 78, 13, 90, 9, 90, 10,106, 10,135, 13,128, 13,147, 13, 18, 10, 0, 10, 9, 6, + 11, 5, 12, 11, 14, 11, 15, 23, 1, 21, 2, 16, 4, 16, 5, 23, 10, 20, 11, 20, 12, 26, 14, 26, 15, 39, 0, 36, 1, 36, 2, 32, + 4, 32, 5, 41, 8, 40, 9, 37, 10, 36, 11, 36, 12, 39, 13, 42, 14, 42, 15, 32, 17, 55, 0, 53, 1, 53, 2, 48, 4, 48, 5, 56, + 10, 54, 11, 54, 12, 56, 13, 57, 14, 57, 15, 48, 17, 65, 0, 64, 1, 64, 2, 64, 3, 64, 4, 64, 5, 64, 6, 64, 7, 64, 8, 66, + 9, 69, 10, 71, 13, 73, 14, 73, 15, 64, 17, 84, 0, 81, 1, 81, 2, 85, 3, 80, 4, 80, 5, 86, 6, 85, 7, 86, 8, 87, 9, 87, + 10, 85, 11, 85, 12, 89, 14, 89, 15, 80, 17,102, 1,102, 2,104, 10,105, 14,105, 15, 96, 17,123, 8,120, 14,120, 15,137, 0,138, + 9,133, 11,133, 12,137, 13,137, 14,137, 15,153, 9,149, 11,149, 12,154, 14,154, 15,164, 11,164, 12,171, 14,171, 15,176, 17,207, + 17,223, 17,255, 17,101, 93, 0, 93, 5, 14, 1, 43, 1, 53, 51, 50, 54, 63, 1, 1, 51, 9, 1, 51, 2,147, 78,148,124,147,108, + 76, 84, 51, 33,254, 59,195, 1, 94, 1, 94,195,104,200,122,154, 72,134, 84, 4, 78,252,148, 3,108, 0, 0, 0, 0, 1, 0, 88, + 0, 0, 3,219, 4, 96, 0, 9, 0,157, 64, 26, 8, 17, 2, 3, 2, 3, 17, 7, 8, 7, 66, 8,169, 0,188, 3,169, 5, 8, 3, + 1, 0, 4, 1, 6, 10, 16,220, 75,176, 11, 84, 75,176, 12, 84, 91, 88,185, 0, 6,255,192, 56, 89, 75,176, 19, 84, 88,185, 0, + 6, 0, 64, 56, 89,196, 50,196, 17, 57, 57, 49, 0, 47,236,244,236, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 89, 34, 1, + 64, 66, 5, 2, 22, 2, 38, 2, 71, 2, 73, 7, 5, 11, 8, 15, 11, 24, 3, 27, 8, 43, 8, 32, 11, 54, 3, 57, 8, 48, 11, 64, + 1, 64, 2, 69, 3, 64, 4, 64, 5, 67, 8, 87, 3, 89, 8, 95, 11, 96, 1, 96, 2,102, 3, 96, 4, 96, 5, 98, 8,127, 11,128, + 11,175, 11, 27, 93, 0, 93, 19, 33, 21, 1, 33, 21, 33, 53, 1, 33,113, 3,106,253, 76, 2,180,252,125, 2,180,253,101, 4, 96, +168,252,219,147,168, 3, 37, 0, 0, 1, 1, 0,254,178, 4, 23, 6, 20, 0, 36, 0,119, 64, 52, 25, 15, 21, 11, 6, 37, 9, 26, + 16, 21, 29, 11, 5, 32, 33, 3, 0, 11,169, 9, 0,169, 1,192, 9, 21,169, 19,177, 37, 12, 9, 10, 5, 36, 22, 25, 0, 29, 10, + 5, 19, 2, 20, 0, 32, 25, 67, 10, 15, 5, 37, 16,212, 75,176, 12, 84, 88,185, 0, 5, 0, 64, 56, 89, 60,196,252, 60,196, 50, + 57, 57, 17, 18, 57, 17, 18, 57, 57, 17, 18, 57, 57, 49, 0, 16,252,236,196,244,236, 16,238, 18, 23, 57, 18, 57, 17, 57, 57, 17, + 18, 57, 17, 18, 57, 57, 48, 1,178, 0, 38, 1, 93, 5, 21, 35, 34, 38, 61, 1, 52, 38, 43, 1, 53, 51, 50, 54, 61, 1, 52, 54, + 59, 1, 21, 35, 34, 6, 29, 1, 20, 6, 7, 30, 1, 29, 1, 20, 22, 51, 4, 23, 62,249,169,108,142, 61, 61,143,107,169,249, 62, + 68,141, 86, 91,110,111, 90, 86,141,190,144,148,221,239,151,116,143,115,149,240,221,147,143, 88,141,248,157,142, 25, 27,142,156, +248,141, 88, 0, 0, 1, 1, 4,254, 29, 1,174, 6, 29, 0, 3, 0, 18,183, 1, 0,177, 4, 0, 5, 2, 4, 16,212,236, 49, 0, + 16,252,204, 48, 1, 17, 35, 17, 1,174,170, 6, 29,248, 0, 8, 0, 0, 0, 0, 0, 1, 1, 0,254,178, 4, 23, 6, 20, 0, 36, + 0,135, 64, 54, 31, 37, 27, 22, 12, 15, 8, 27, 11, 21, 25, 15, 4, 5, 32, 3, 0, 25,169, 27, 0,169, 35,192, 27, 15,169, 17, +177, 37, 28, 25, 26, 21, 15, 1, 4, 0, 8, 26, 21, 35, 18, 4, 0, 26, 31, 21, 67, 16, 0, 11, 4, 37, 16,212, 75,176, 10, 84, + 88,185, 0, 4,255,192, 56, 89, 75,176, 14, 84, 88,185, 0, 4, 0, 64, 56, 89, 60,196, 50,252, 60,196, 17, 18, 57, 57, 17, 18, + 57, 17, 18, 57, 57, 17, 18, 57, 57, 49, 0, 16,252,236,196,244,236, 16,238, 18, 23, 57, 17, 18, 57, 57, 17, 57, 17, 57, 57, 17, + 18, 57, 48, 1,178, 0, 38, 1, 93, 5, 51, 50, 54, 61, 1, 52, 54, 55, 46, 1, 61, 1, 52, 38, 43, 1, 53, 51, 50, 22, 29, 1, + 20, 22, 59, 1, 21, 35, 34, 6, 29, 1, 20, 6, 43, 1, 1, 0, 70,140, 85, 90,111,111, 90, 85,140, 70, 63,249,167,108,142, 62, + 62,142,108,167,249, 63,190, 86,143,248,156,142, 27, 25,142,157,248,142, 87,143,147,221,240,149,115,143,116,151,239,221,148, 0, + 0, 1, 0,217, 1,211, 5,219, 3, 49, 0, 29, 0, 35, 64, 16, 1, 16, 27, 12, 0, 19, 4,156, 27, 19,156, 12, 30, 0, 15, 30, + 16,212,196, 49, 0, 16,212,252,212,236, 16,192, 17, 18, 57, 57, 48, 1, 21, 14, 1, 35, 34, 39, 38, 39, 38, 39, 38, 35, 34, 6, + 7, 53, 62, 1, 51, 50, 23, 22, 23, 22, 23, 22, 51, 50, 54, 5,219,105,179, 97,110,146, 11, 5, 7, 15,155, 94, 88,172, 98,105, +179, 97,110,147, 10, 5, 8, 14,155, 94, 86,169, 3, 49,178, 79, 68, 59, 4, 2, 3, 5, 62, 77, 83,178, 79, 69, 60, 4, 2, 3, + 5, 62, 76, 0, 0, 2, 1, 53, 0, 0, 2, 0, 5,213, 0, 3, 0, 9, 0, 98, 64, 15, 7, 0,131, 2,129, 4, 8, 7, 4, 0, + 3, 5, 1, 0, 10, 16,252, 60,236, 50, 57, 57, 49, 0, 47,244,252,204, 48, 1, 75,176, 11, 84, 88,189, 0, 10, 0, 64, 0, 1, + 0, 10, 0, 10,255,192, 56, 17, 55, 56, 89, 1, 75,176, 15, 84, 75,176, 16, 84, 91, 75,176, 19, 84, 91, 88,189, 0, 10,255,192, + 0, 1, 0, 10, 0, 10, 0, 64, 56, 17, 55, 56, 89,182, 0, 11, 32, 11, 80, 11, 3, 93, 1, 35, 53, 51, 17, 35, 17, 19, 51, 19, + 2, 0,203,203,203, 21,162, 20, 4,215,254,250, 43, 2,143, 1,101,254,155, 0, 0, 2, 0,172,254,199, 4, 35, 5,152, 0, 6, + 0, 33, 0, 81, 64, 43, 19, 22, 20, 0, 15, 12, 1, 11, 7,134, 8,136, 11, 16,134, 15,136, 12,185, 20, 22, 11,185, 29, 31, 28, +184, 22,140, 34, 28, 21, 0, 9, 30, 19, 11, 15, 7, 4, 18, 25, 34, 16,220,236,212, 60,212, 60, 60,236, 50, 50, 49, 0, 16,228, +244, 60,196,236, 16,196,254,244,238, 16,245,238, 18, 57, 17, 18, 57, 17, 18, 57, 48, 37, 17, 14, 1, 21, 20, 22, 1, 21, 46, 1, + 39, 3, 62, 1, 55, 21, 14, 1, 7, 17, 35, 17, 38, 0, 17, 16, 0, 55, 17, 51, 19, 30, 1, 2,166,147,164,164, 2, 16, 74,136, + 68, 1, 70,137, 72, 65,137, 77,102,241,254,247, 1, 9,241,102, 1, 73,137,131, 3, 88, 18,226,184,185,226, 3,161,172, 41, 42, + 3,252,160, 5, 42, 39,170, 30, 35, 7,254,228, 1, 32, 20, 1, 51, 1, 1, 1, 2, 1, 50, 22, 1, 31,254,225, 4, 33, 0, 0, + 0, 1, 0,129, 0, 0, 4, 98, 5,240, 0, 27, 0, 96, 64, 33, 7, 22, 8, 1,134, 0, 18, 10,169, 20, 8, 12, 4,160, 0,148, + 25,145, 16, 12,160, 14, 0, 13, 9, 11, 7, 28, 19, 15, 21, 17, 28, 16,220, 60,204,204,252, 60,196,212,196, 49, 0, 47,236, 50, +244,228,236, 16,212, 60,238, 50, 16,238, 17, 57, 57, 48, 1, 75,176, 12, 84, 88,189, 0, 28,255,192, 0, 1, 0, 28, 0, 28, 0, + 64, 56, 17, 55, 56, 89,180, 54, 1, 54, 2, 2, 0, 93, 1, 21, 46, 1, 35, 34, 6, 29, 1, 33, 21, 33, 17, 33, 21, 33, 53, 51, + 17, 35, 53, 51, 53, 16, 54, 51, 50, 22, 4, 78, 76,136, 61,148,116, 1,135,254,121, 2, 45,252, 31,236,199,199,214,232, 61,151, + 5,180,182, 41, 41,155,212,215,143,254, 47,170,170, 1,209,143,238, 1, 5,243, 31, 0, 0, 0, 0, 2, 0, 94, 0, 82, 4,188, + 4,178, 0, 35, 0, 47, 0,131, 64, 73, 3, 9, 27, 21, 4, 45, 30, 0, 39, 28, 2, 33, 29, 12, 18, 45, 20, 11, 10, 3, 19, 15, + 1, 29, 45,185, 19,235, 15,236, 39,185, 29,235, 33, 48, 30, 12, 0, 18, 4, 42, 36, 20, 48, 28, 21, 27, 42, 29, 19, 28, 24, 9, + 3, 36, 11, 10, 1, 3, 2, 36, 40, 2,115, 6,116, 42, 40, 28,115, 24, 48, 16,220,228,236,244,228,236, 18, 23, 57, 18, 57, 57, + 17, 18, 57, 57, 18, 57, 57, 17, 18, 57, 17, 18, 23, 57, 49, 0, 16,212,228,236,244,228,236, 16,192, 17, 18, 23, 57, 18, 57, 57, + 17, 18, 57, 57, 17, 57, 57, 18, 23, 57, 48, 1, 55, 23, 7, 30, 1, 21, 20, 6, 7, 23, 7, 39, 14, 1, 35, 34, 38, 39, 7, 39, + 55, 46, 1, 53, 52, 54, 55, 39, 55, 23, 62, 1, 51, 50, 22, 19, 52, 38, 35, 34, 6, 21, 20, 22, 51, 50, 54, 3,123,207,114,206, + 37, 36, 38, 40,209,114,207, 59,116, 61, 58,120, 61,207,113,207, 37, 37, 38, 38,207,115,207, 55,116, 64, 60,117, 92,155,114,112, +158,157,113,113,156, 3,225,209,115,206, 59,119, 62, 63,115, 57,207,113,207, 40, 38, 37, 37,207,115,206, 62,118, 58, 64,116, 56, +206,115,207, 39, 37, 36,254,124,112,154,154,112,114,156,157, 0, 0, 1, 0, 82, 0, 0, 4,195, 5,213, 0, 24, 0,198, 64, 70, + 16, 2, 17, 22, 17, 15, 2, 14, 15, 22, 22, 17, 15, 2, 16, 15, 8, 13, 8, 14, 2, 13, 13, 8, 66, 15, 11, 9, 4, 0,211, 23, + 6, 18, 11,211, 20, 9, 16, 13,129, 2, 12, 9, 14, 3, 5, 22, 15, 3, 21, 18, 16, 3, 0, 17,102, 19, 0,101, 1, 28, 13,102, + 10, 5,101, 7, 3, 25, 16,212, 60,236, 50,236,252,236, 50,236, 18, 23, 57, 18, 57, 57, 17, 23, 57, 49, 0, 47,228, 50,212, 60, +236, 50,212, 60,236, 50, 17, 18, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 5,237, 89, 34, 1, + 75,176, 12, 84, 88,189, 0, 25,255,192, 0, 1, 0, 25, 0, 25, 0, 64, 56, 17, 55, 56, 89, 64, 40,134, 15,144, 15,166, 15,160, + 15,181, 15, 5, 39, 12, 39, 13, 39, 14, 41, 16, 40, 17, 40, 18, 55, 14, 57, 16,135, 12,136, 18,166, 13,165, 14,170, 16,169, 17, + 14, 93, 0, 93, 1, 33, 17, 35, 17, 33, 53, 33, 53, 39, 33, 53, 33, 1, 51, 9, 1, 51, 1, 33, 21, 33, 7, 21, 33, 4,141,254, + 99,201,254, 96, 1,160, 84,254,180, 1, 8,254,195,190, 1,123, 1,121,191,254,194, 1, 8,254,181, 84, 1,159, 1,199,254, 57, + 1,199,123, 51,155,123, 2, 74,253, 68, 2,188,253,182,123,155, 51, 0, 0, 0, 0, 2, 1, 4,254,162, 1,174, 5,152, 0, 3, + 0, 7, 0, 28, 64, 13, 1,245, 0, 4,245, 5, 8, 4, 0, 5, 6, 2, 8, 16,220, 60,236, 50, 49, 0, 16,212,236,212,236, 48, + 1, 17, 35, 17, 19, 17, 35, 17, 1,174,170,170,170, 1,152,253, 10, 2,246, 4, 0,253, 10, 2,246, 0, 0, 0, 0, 2, 0, 92, +255, 61, 3,162, 5,240, 0, 11, 0, 62, 0,145, 64, 60, 47, 48, 42, 6, 0, 23, 29, 48, 54, 4, 13, 39,138, 38, 13,138, 12, 42, +198, 38,197, 35, 16,198, 12,197, 60,145, 35, 63, 47, 6, 0, 23, 48, 4, 19, 29, 45, 9, 54, 3, 19, 87, 57, 45, 87, 32, 9, 87, + 12, 34, 26, 57, 38, 34, 3, 87, 51, 63, 16,220,236,228,196,212,228,236,212,236, 16,238, 17, 57, 17, 18, 57, 17, 23, 57, 57, 49, + 0, 16,196,244,228,236, 16,230,238, 16,238, 16,238, 17, 23, 57, 57, 57, 17, 18, 57, 48, 1, 75,176, 10, 84, 75,176, 11, 84, 91, + 75,176, 12, 84, 91, 75,176, 14, 84, 91, 88,189, 0, 63, 0, 64, 0, 1, 0, 63, 0, 63,255,192, 56, 17, 55, 56, 89, 1, 14, 1, + 21, 20, 22, 23, 62, 1, 53, 52, 38, 19, 21, 46, 1, 35, 34, 6, 21, 20, 23, 22, 23, 30, 1, 21, 20, 6, 7, 30, 1, 21, 20, 6, + 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 47, 1, 46, 1, 53, 52, 54, 55, 46, 1, 53, 52, 54, 51, 50, 22, 1,123, 63, 62, +139,250, 63, 62,143,204, 83,143, 56, 97,108,206, 26, 14,211,131, 92, 93, 62, 57,204,173, 73,154, 88, 87,148, 58,102,113,221, 25, +214,128, 93, 91, 59, 59,200,166, 73,153, 3,168, 46, 90, 46, 76,133,135, 45, 91, 46, 75,136, 2,147,164, 39, 39, 80, 71, 90,115, + 15, 8,119,154,101, 90,140, 53, 52,109, 64,142,168, 29, 29,164, 39, 39, 84, 76,102,123, 14,120,153,102, 91,143, 49, 44,112, 69, +130,159, 29, 0, 0, 2, 0,215, 5, 70, 3, 41, 6, 16, 0, 3, 0, 7, 0,146, 64, 14, 6, 2,206, 4, 0,205, 8, 1,100, 0, + 5,100, 4, 8, 16,220,252,212,236, 49, 0, 16,252, 60,236, 50, 48, 0, 75,176, 10, 84, 75,176, 13, 84, 91, 88,189, 0, 8, 0, + 64, 0, 1, 0, 8, 0, 8,255,192, 56, 17, 55, 56, 89, 1, 75,176, 12, 84, 75,176, 13, 84, 91, 75,176, 14, 84, 91, 75,176, 23, + 84, 91, 88,189, 0, 8,255,192, 0, 1, 0, 8, 0, 8, 0, 64, 56, 17, 55, 56, 89, 1, 75,176, 15, 84, 75,176, 25, 84, 91, 88, +189, 0, 8, 0, 64, 0, 1, 0, 8, 0, 8,255,192, 56, 17, 55, 56, 89, 64, 17, 96, 1, 96, 2, 96, 5, 96, 6,112, 1,112, 2, +112, 5,112, 6, 8, 93, 1, 51, 21, 35, 37, 51, 21, 35, 2, 94,203,203,254,121,203,203, 6, 16,202,202,202, 0, 0, 3, 1, 27, + 0, 0, 6,229, 5,205, 0, 23, 0, 47, 0, 73, 0, 67, 64, 38, 61,203, 62, 58,204, 65,202, 36, 49,203, 48, 52,204, 71,202, 24, +201, 0,200, 36,201, 12, 55, 97, 68, 61, 48, 94, 42, 9, 6, 68, 94, 30, 9, 6, 18, 74, 16,220,204,252,236, 16,254,237, 50, 16, +238, 49, 0, 47,238,246,254,253,238,214,238, 16,253,238,214,238, 48, 1, 50, 4, 23, 22, 18, 21, 20, 2, 7, 6, 4, 35, 34, 36, + 39, 38, 2, 53, 52, 18, 55, 54, 36, 23, 34, 6, 7, 14, 1, 21, 20, 22, 23, 30, 1, 51, 50, 54, 55, 62, 1, 53, 52, 38, 39, 46, + 1, 23, 21, 46, 1, 35, 34, 6, 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 53, 52, 54, 51, 50, 22, 4, 0,152, 1, 7, +109,109,108,108,109,109,254,249,152,152,254,249,109,109,108,108,109,109, 1, 7,152,131,226, 94, 94, 96, 96, 94, 94,226,131,132, +227, 94, 93, 93, 94, 92, 94,227,167, 66,130, 66,149,167,171,155, 64,122, 66, 67,137, 70,216,251,251,216, 73,136, 5,205,110,109, +109,254,250,154,152,254,251,109,109,110,110,109,109, 1, 5,152,154, 1, 6,109,109,110,103, 94, 94, 94,229,130,129,227, 94, 94, + 95, 95, 94, 93,226,131,133,227, 93, 94, 94,245,129, 33, 32,175,157,159,174, 31, 34,127, 29, 28,244,208,209,242, 28, 0, 0, 0, + 0, 3, 0,115, 1,213, 3, 59, 5,240, 0, 3, 0, 30, 0, 41, 0, 95, 64, 51, 40, 7, 37, 4, 31, 18, 24, 16, 2,227, 0, 31, +221, 16, 0,225, 37,221, 5, 10, 25,223, 24,222, 21,221, 10,224, 28,145, 42, 0, 24, 13, 31, 16, 34, 6, 2, 1, 40, 17, 6,107, + 4,108, 24, 34,107, 13, 42, 16,220,236,204,252,236, 50, 50,192,192, 17, 18, 57, 57, 17, 18, 57, 49, 0, 16,244,228,252,244,236, + 16,196,238,237,214,238, 16,238, 17, 18, 57, 18, 57, 17, 57, 57, 48, 19, 33, 21, 33, 1, 17, 35, 53, 14, 1, 35, 34, 38, 53, 52, + 54, 59, 1, 53, 52, 38, 35, 34, 6, 7, 53, 62, 1, 51, 50, 22, 5, 34, 6, 21, 20, 22, 51, 50, 54, 61, 1,139, 2,176,253, 80, + 2,174,149, 44,144, 93,128,152,191,188,182,117,117, 62,136, 68, 73,145, 69,183,179,254,236,161,126, 98, 82,104,130, 2, 80,123, + 2,184,254, 64,112, 63, 68,135,113,135,138, 4, 91, 91, 34, 34,127, 28, 28,176,240, 67, 79, 64, 77,144,114, 29, 0, 2, 0,158, + 0,141, 4, 37, 4, 35, 0, 6, 0, 13, 0,134, 64, 73, 3,232, 4, 5, 4, 2,232, 1, 2, 5, 5, 4, 2,232, 3, 2, 6, 0, + 6, 1,232, 0, 0, 6, 10,232, 11, 12, 11, 9,232, 8, 9, 12, 12, 11, 9,232, 10, 9, 13, 7, 13, 8,232, 7, 7, 13, 66, 9, + 2, 11, 4,231, 7, 0,166, 14, 9, 12, 5, 2, 7, 3, 0,111, 5, 10, 7,111, 12,110, 14, 16,252,252, 60,212,236, 50, 17, 57, + 17, 18, 57, 49, 0, 16,244, 60,236, 50, 57, 57, 48, 75, 83, 88, 7, 16, 4,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 4,237, + 7, 16, 4,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 4,237, 89, 34, 1, 21, 9, 1, 21, 1, 53, 19, 21, 9, 1, 21, 1, 53, + 4, 37,254,211, 1, 45,254, 43, 35,254,211, 1, 45,254, 43, 4, 35,191,254,244,254,244,191, 1,162, 82, 1,162,191,254,244,254, +244,191, 1,162, 82, 0, 0, 0, 0, 1, 0,217, 1, 31, 5,219, 3, 94, 0, 5, 0, 23, 64, 10, 4,156, 2, 0, 6, 3, 23, 1, + 0, 6, 16,220,212,236, 49, 0, 16,212,196,236, 48, 19, 33, 17, 35, 17, 33,217, 5, 2,168,251,166, 3, 94,253,193, 1,149, 0, + 0, 1, 0,100, 1,223, 2,127, 2,131, 0, 3, 0, 17,182, 0,156, 2, 4, 1, 0, 4, 16,220,204, 49, 0, 16,212,236, 48, 19, + 33, 21, 33,100, 2, 27,253,229, 2,131,164, 0, 0, 4, 1, 27, 0, 0, 6,229, 5,205, 0, 23, 0, 47, 0, 56, 0, 76, 0, 96, + 64, 54, 69, 66, 67, 63, 50,201, 72, 48,201, 57, 74, 67,202, 12, 57,202, 0,201, 24,200, 12,201, 36, 72, 69, 51, 48, 4, 49, 66, + 60, 63, 57, 54, 73, 49, 96, 75, 54, 96, 67, 60, 94, 18, 9, 30, 75, 94, 6, 9, 30, 95, 42, 77, 16,220,228,252,236, 16,254,253, +196,238, 16,238, 50, 17, 57, 57, 18, 57, 18, 23, 57, 49, 0, 47,238,246,254,237, 16,237, 50, 16,238,214,238, 57, 18, 57, 57, 48, + 1, 34, 6, 7, 14, 1, 21, 20, 22, 23, 30, 1, 51, 50, 54, 55, 62, 1, 53, 52, 38, 39, 46, 1, 39, 50, 4, 23, 22, 18, 21, 20, + 2, 7, 6, 4, 35, 34, 36, 39, 38, 2, 53, 52, 18, 55, 54, 36, 19, 35, 17, 51, 50, 54, 53, 52, 38, 39, 50, 22, 21, 20, 6, 7, + 30, 1, 31, 1, 35, 39, 46, 1, 43, 1, 17, 35, 17, 4, 0,131,226, 94, 94, 96, 96, 94, 94,226,131,132,227, 94, 93, 93, 94, 92, + 94,227,132,152, 1, 7,109,109,108,108,109,109,254,249,152,152,254,249,109,109,108,108,109,109, 1, 7,125,123,123,110, 87, 88, +102,176,174,105, 96, 24, 67, 46,137,172,129, 59, 73, 54, 66,155, 5,102, 94, 94, 94,229,130,129,227, 94, 94, 95, 95, 94, 93,226, +131,133,227, 93, 94, 94,103,110,109,109,254,250,154,152,254,251,109,109,110,110,109,109, 1, 5,152,154, 1, 6,109,109,110,254, + 98,254,236, 62, 75, 76, 63,103,119,121, 86,112, 17, 8, 77, 73,223,209, 96, 51,254,156, 3, 68, 0, 1, 0,213, 5, 98, 3, 43, + 5,246, 0, 3, 0, 47,183, 2,239, 0,238, 4, 1, 0, 4, 16,212,204, 49, 0, 16,252,236, 48, 0, 75,176, 9, 84, 75,176, 14, + 84, 91, 88,189, 0, 4,255,192, 0, 1, 0, 4, 0, 4, 0, 64, 56, 17, 55, 56, 89, 19, 33, 21, 33,213, 2, 86,253,170, 5,246, +148, 0, 0, 0, 0, 2, 0,195, 3,117, 3, 61, 5,240, 0, 11, 0, 26, 0, 32, 64, 17, 6,195, 21,196, 0,195, 12,145, 27, 9, + 90, 18, 91, 3, 90, 24, 27, 16,220,236,252,236, 49, 0, 16,244,236,252,236, 48, 1, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, + 39, 50, 22, 23, 30, 1, 21, 20, 6, 35, 34, 38, 53, 52, 54, 2, 0, 80,110,110, 80, 80,110,111, 79, 64,118, 43, 46, 46,185,134, +135,180,184, 5,111,111, 80, 79,109,109, 79, 79,112,129, 49, 46, 45,114, 66,132,183,180,135,134,186, 0, 0, 0, 0, 2, 0,217, + 0, 0, 5,219, 5, 4, 0, 11, 0, 15, 0, 46, 64, 24, 5,208, 7, 3,156, 0,208, 9, 1, 12,156, 14, 13, 2, 21, 4, 0, 23, + 12, 8, 21, 10, 6, 16, 16,212, 60,236, 50,252, 60,236, 50, 49, 0, 47,236,212, 60,236,252, 60,236, 48, 1, 17, 33, 21, 33, 17, + 35, 17, 33, 53, 33, 17, 1, 33, 21, 33, 3,174, 2, 45,253,211,168,253,211, 2, 45,253,211, 5, 2,250,254, 5, 4,254,125,170, +254,125, 1,131,170, 1,131,251,166,170, 0, 0, 0, 1, 0, 94, 2,156, 2,180, 5,240, 0, 24, 0, 74, 64, 36, 0,125, 6, 4, + 0, 23,125, 6, 6, 4, 66, 4, 2, 0, 14,221, 15, 0,221, 2,247, 11,221, 15, 18,145, 25, 0, 14, 8,126, 1, 21, 14, 3, 25, + 16,220,196,212,196,236, 17, 57, 49, 0, 16,244,196,236,252,236, 16,238, 17, 18, 57, 48, 75, 83, 88, 7, 16, 5,237, 23, 50, 7, + 5,237, 89, 34, 1, 33, 21, 33, 53, 54, 55, 0, 53, 52, 38, 35, 34, 6, 7, 53, 62, 1, 51, 50, 22, 21, 20, 1, 6, 1, 12, 1, +168,253,170, 34, 63, 1, 88,104, 85, 52,122, 72, 77,133, 57,145,174,254,181, 56, 3, 14,114,110, 31, 56, 1, 49, 94, 66, 81, 35, + 35,123, 28, 28,132,108,139,254,228, 48, 0, 0, 0, 1, 0, 98, 2,141, 2,205, 5,240, 0, 40, 0, 72, 64, 39, 0, 21, 19, 10, +221, 9, 31,221, 32, 19,221, 21, 13,221, 9,248, 6,247, 28,221, 32,248, 35,145, 41, 22, 19, 0, 20, 25,126, 38, 16,126, 3, 20, + 31, 9, 41, 16,220,196,196,212,236,212,236, 17, 57, 57, 57, 49, 0, 16,244,228,236,252,228,236,212,236, 16,238, 16,238, 17, 18, + 57, 48, 1, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 43, 1, 53, 51, 50, 54, 53, 52, 38, 35, 34, + 6, 7, 53, 62, 1, 51, 50, 22, 21, 20, 6, 2, 12, 92,101,190,177, 57,125, 70, 52,119, 67,109,120,111,108, 86, 94, 94, 97,100, + 95, 40,102, 81, 73,128, 55,144,169, 90, 4, 96, 18,109, 82,124,134, 21, 20,121, 27, 26, 79, 70, 74, 76,108, 63, 60, 58, 61, 18, + 23,115, 17, 18,118, 99, 69, 96, 0, 1, 1,115, 4,238, 3, 82, 6,102, 0, 3, 0, 49, 64, 9, 2,180, 0,179, 4, 3, 68, 1, + 4, 16,212,236, 49, 0, 16,244,236, 48, 0, 75,176, 9, 84, 75,176, 14, 84, 91, 88,189, 0, 4,255,192, 0, 1, 0, 4, 0, 4, + 0, 64, 56, 17, 55, 56, 89, 1, 51, 1, 35, 2,139,199,254,186,153, 6,102,254,136, 0, 0, 0, 0, 1, 0,174,254, 86, 4,229, + 4, 96, 0, 32, 0, 77, 64, 37, 19, 25, 31, 3, 22, 6, 3, 9, 12, 3, 1, 18, 15, 6,135, 28, 22,140, 10, 1,188, 0,189, 33, + 25, 9, 18, 9, 8, 11, 78, 31, 2, 8, 0, 70, 33, 16,252,236, 50,244,236,196, 18, 57, 49, 0, 16,228,228, 50,244, 60,236,220, +196, 17, 23, 57, 17, 18, 23, 57, 48,182, 31, 34, 96, 34,207, 34, 3, 1, 93, 19, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, + 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 39, 14, 1, 35, 34, 38, 39, 17,174,184,138,135,148,149,184, 35, 37, 9, 32, 28, + 41, 73, 35, 69, 82, 15, 50,145, 98,102,143, 42,254, 86, 6, 10,253, 72,145,148,168,168, 2,141,252,162, 60, 57, 11, 12,148, 23, + 22, 78, 80, 79, 79, 78, 78,253,215, 0, 0, 0, 0, 1, 0,158,255, 59, 4, 57, 5,213, 0, 13, 0, 37, 64, 18, 8, 2, 4,193, + 0,129, 6, 2, 14, 0, 7, 93, 5, 3, 93, 1, 11, 14, 16,212,212,252,220,236, 57, 49, 0, 16,196, 50,244,236, 17, 57, 48, 1, + 33, 17, 35, 17, 35, 17, 35, 17, 46, 1, 53, 52, 36, 2,121, 1,192,141,190,142,215,235, 1, 4, 5,213,249,102, 6, 31,249,225, + 3, 78, 17,221,184,190,232, 0, 0, 1, 0,219, 2, 72, 1,174, 3, 70, 0, 3, 0, 18,183, 2,131, 0, 4, 1, 25, 0, 4, 16, +212,236, 49, 0, 16,212,236, 48, 19, 51, 21, 35,219,211,211, 3, 70,254, 0, 0, 0, 1, 1, 35,254,117, 2,193, 0, 0, 0, 19, + 0, 31, 64, 14, 9, 6, 10, 13,243, 6, 0, 19, 0, 16, 39, 3, 9, 20, 16,220,212,236,212,204, 49, 0, 47,212,252,196, 18, 57, + 48, 33, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 39, 2, 84, 55, 54,120,118, 46, 87, 43, 34, 74, + 47, 59, 60, 43, 45, 62,105, 48, 89, 91, 12, 12,131, 17, 15, 48, 46, 30, 87, 61, 0, 1, 0,137, 2,156, 2,197, 5,223, 0, 10, + 0, 44, 64, 24, 7, 0,221, 9, 3,221, 4, 2,221, 9,247, 5,145, 11, 8,124, 6, 93, 3,124, 1,124, 0, 11, 16,220,244,228, +252,228, 49, 0, 16,244,236,236,212,236, 16,238, 50, 48, 19, 51, 17, 7, 53, 55, 51, 17, 51, 21, 33,156,204,223,230,137,205,253, +215, 3, 10, 2, 99, 41,116, 39,253, 43,110, 0, 0, 3, 0, 96, 1,213, 3,100, 5,240, 0, 3, 0, 15, 0, 27, 0, 46, 64, 25, + 2,227, 0,225, 22,221, 10,224, 16,221, 4,145, 28, 0, 19, 13, 1, 25,107, 7,108, 19,107, 13, 28, 16,220,236,252,236, 57, 17, + 18, 57, 49, 0, 16,244,236,244,236,252,236, 48, 19, 33, 21, 33, 1, 50, 22, 21, 20, 6, 35, 34, 38, 53, 52, 54, 23, 34, 6, 21, + 20, 22, 51, 50, 54, 53, 52, 38,139, 2,176,253, 80, 1, 88,179,206,206,179,179,208,208,179,105,126,127,104,105,125,124, 2, 80, +123, 4, 27,221,191,191,219,220,190,191,221,115,161,136,133,160,160,133,137,160, 0, 2, 0,193, 0,141, 4, 72, 4, 35, 0, 6, + 0, 13, 0,134, 64, 73, 12,232, 13, 12, 9, 10, 9, 11,232, 10, 10, 9, 13,232, 7, 8, 7, 12,232, 11, 12, 8, 8, 7, 5,232, + 6, 5, 2, 3, 2, 4,232, 3, 3, 2, 6,232, 0, 1, 0, 5,232, 4, 5, 1, 1, 0, 66, 12, 5, 10, 3,231, 7, 0,166, 14, + 12, 8, 1, 5, 0, 8,111, 10, 7, 1,111, 3, 0,112, 14, 16,252, 60,252,212, 60,236, 18, 57, 17, 18, 57, 49, 0, 16,244, 60, +236, 50, 57, 57, 48, 75, 83, 88, 7, 16, 8,237, 7, 16, 4,237, 7, 16, 4,237, 7, 16, 8,237, 7, 16, 8,237, 7, 16, 4,237, + 7, 16, 4,237, 7, 16, 8,237, 89, 34, 19, 1, 21, 1, 53, 9, 1, 37, 1, 21, 1, 53, 9, 1,193, 1,213,254, 43, 1, 45,254, +211, 1,178, 1,213,254, 43, 1, 45,254,211, 4, 35,254, 94, 82,254, 94,191, 1, 12, 1, 12,191,254, 94, 82,254, 94,191, 1, 12, + 1, 12, 0, 0,255,255, 0,137,255,227, 7,127, 5,240, 16, 39, 5,206, 4,139,253,100, 16, 38, 0,123, 0, 0, 16, 7, 6, 90, + 3, 53, 0, 0,255,255, 0,137,255,227, 7, 63, 5,240, 16, 38, 0,123, 0, 0, 16, 39, 6, 90, 3, 53, 0, 0, 16, 7, 0,116, + 4,139,253,100,255,255, 0, 98,255,227, 7,127, 5,240, 16, 39, 5,206, 4,139,253,100, 16, 38, 0,117, 0, 0, 16, 7, 6, 90, + 3, 53, 0, 0, 0, 2, 0,143,255,227, 3,172, 5,213, 0, 32, 0, 36, 0,134, 64, 47, 32, 26, 5, 2, 4, 6, 25, 0, 16,134, + 15,136, 12, 0, 33,131, 35, 12,149, 19,140, 35,129, 37, 6, 34, 25, 22, 9, 5, 1, 0, 26, 34, 9, 0, 28, 1, 34, 28, 33, 38, + 15, 9, 28, 22, 37, 16,220,236,212,252,236,212,236, 17, 18, 57, 17, 18, 57, 17, 18, 57, 18, 57, 49, 0, 16,228,244,236, 16,254, +205, 16,244,238, 18, 57, 57, 23, 57, 48, 1, 75,176, 16, 84, 75,176, 18, 84, 91, 75,176, 19, 84, 91, 88,189, 0, 37,255,192, 0, + 1, 0, 37, 0, 37, 0, 64, 56, 17, 55, 56, 89, 64, 11,116, 4,116, 5,116, 6,116, 7,118, 28, 5, 93, 1, 51, 21, 20, 6, 15, + 1, 14, 1, 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 53, 52, 54, 63, 1, 62, 1, 55, 62, 1, 53, 19, 35, 53, 51, 1, +244,190, 55, 90, 90, 58, 51,131,109, 78,180, 96, 94,192,103,184,224, 73, 89, 88, 48, 38, 8, 7, 6,196,202,202, 4, 68,156,101, +130, 87, 88, 53, 94, 49, 89,110, 70, 67,188, 57, 56,194,159, 76,137, 86, 86, 47, 53, 25, 21, 60, 54, 1, 14,254,255,255, 0, 16, + 0, 0, 5,104, 5,213, 18, 38, 0, 36, 0, 0, 16, 7, 6,135, 4,188, 1,117,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 38, + 0, 36, 0, 0, 16, 7, 6,133, 4,188, 1,117,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 38, 0, 36, 0, 0, 17, 7, 6,136, + 4,188, 1,117, 0, 16,180, 5, 13, 17, 10, 7, 43, 64, 5, 15, 13, 0, 17, 2, 93, 49, 0, 0,255,255, 0, 16, 0, 0, 5,104, + 5,213, 18, 38, 0, 36, 0, 0, 17, 7, 6,134, 4,188, 1,117, 0, 20,180, 10, 20, 35, 5, 7, 43, 64, 9, 64, 20, 79, 35, 32, + 20, 47, 35, 4, 93, 49, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 38, 0, 36, 0, 0, 17, 7, 6,132, 4,188, 1,117, + 0, 20,180, 10, 18, 13, 5, 7, 43, 64, 9, 48, 18, 63, 13, 0, 18, 15, 13, 4, 93, 49, 0, 0, 0, 3, 0, 16, 0, 0, 5,104, + 7,109, 0, 11, 0, 14, 0, 33, 0,203, 64, 84, 12, 17, 13, 12, 27, 28, 27, 14, 17, 28, 27, 30, 17, 28, 27, 29, 17, 28, 28, 27, + 13, 17, 33, 15, 33, 12, 17, 14, 12, 15, 15, 33, 32, 17, 15, 33, 31, 17, 33, 15, 33, 66, 12, 27, 15, 13, 9, 3,193, 21, 9, 30, +149, 13, 9,142, 32, 28, 30, 29, 28, 24, 32, 31, 33, 13, 18, 6, 14, 24, 12, 6, 27, 0, 86, 24, 28, 15, 6, 86, 18, 28, 33, 34, + 16,212,196,212,236, 50, 16,212,238, 50, 17, 57, 17, 57, 17, 18, 57, 17, 57, 57, 17, 18, 57, 57, 49, 0, 47, 60,230,214,238, 16, +212,238, 17, 18, 57, 57, 57, 48, 75, 83, 88, 7, 16, 5,237, 7, 5,237, 7, 16, 8,237, 7, 16, 5,237, 7, 16, 5,237, 7, 5, +237, 7, 5,237, 7, 16, 8,237, 89, 34,178, 32, 35, 1, 1, 93, 64, 32, 26, 12,115, 12,155, 12, 3, 7, 15, 8, 27, 80, 35,102, + 13,105, 14,117, 13,123, 14,121, 28,121, 29,118, 32,118, 33,128, 35, 12, 93, 0, 93, 1, 52, 38, 35, 34, 6, 21, 20, 22, 51, 50, + 54, 3, 1, 33, 1, 46, 1, 53, 52, 54, 51, 50, 22, 21, 20, 6, 7, 1, 35, 3, 33, 3, 35, 3, 84, 89, 63, 64, 87, 88, 63, 63, + 89,152,254,240, 2, 33,254, 88, 61, 62,159,115,114,161, 63, 60, 2, 20,210,136,253, 95,136,213, 6, 90, 63, 89, 87, 65, 63, 88, + 88,254,243,253, 25, 3, 78, 41,115, 73,115,160,161,114, 70,118, 41,250,139, 1,127,254,129, 0, 0, 2, 0, 8, 0, 0, 7, 72, + 5,213, 0, 15, 0, 19, 0,135, 64, 57, 17, 17, 14, 15, 14, 16, 17, 15, 15, 14, 13, 17, 15, 14, 12, 17, 14, 15, 14, 66, 5,149, + 3, 11,149, 17, 1,149, 16,149, 0,129, 17, 7,149, 3,173, 13, 9, 17, 16, 15, 13, 12, 5, 14, 10, 0, 4, 8, 6, 2, 28, 18, + 10, 14, 20, 16,212,212, 60,236, 50,212,196,196, 17, 18, 23, 57, 49, 0, 47, 60,236,236,196,244,236,236, 16,238, 16,238, 48, 75, + 83, 88, 7, 16, 5,237, 7, 5,237, 7, 16, 5,237, 7, 16, 5,237, 89, 34,178,128, 21, 1, 1, 93, 64, 19,103, 17,119, 16,119, + 17,134, 12,133, 16,150, 17,144, 21,160, 21,191, 21, 9, 93, 1, 21, 33, 17, 33, 21, 33, 17, 33, 21, 33, 17, 33, 3, 35, 1, 23, + 1, 33, 17, 7, 53,253, 27, 2,199,253, 57, 2,248,252, 61,253,240,160,205, 2,113,139,254,182, 1,203, 5,213,170,254, 70,170, +253,227,170, 1,127,254,129, 5,213,158,252,240, 3, 16, 0, 0,255,255, 0,115,254,117, 5, 39, 5,240, 18, 38, 0, 38, 0, 0, + 16, 7, 0,122, 1, 45, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 38, 0, 40, 0, 0, 16, 7, 6,135, 4,158, 1,117, +255,255, 0,201, 0, 0, 4,139, 5,213, 18, 38, 0, 40, 0, 0, 16, 7, 6,133, 4,158, 1,117,255,255, 0,201, 0, 0, 4,139, + 5,213, 18, 38, 0, 40, 0, 0, 17, 7, 6,136, 4,158, 1,117, 0, 7, 64, 3, 64, 12, 1, 93, 49, 0, 0, 0,255,255, 0,201, + 0, 0, 4,139, 5,213, 18, 38, 0, 40, 0, 0, 17, 7, 6,132, 4,158, 1,117, 0, 9, 64, 5, 64, 12, 64, 16, 2, 93, 49, 0, +255,255, 0,201, 0, 0, 1,147, 5,213, 18, 38, 0, 44, 0, 0, 16, 7, 6,135, 3, 47, 1,117,255,255, 0,201, 0, 0, 1,147, + 5,213, 18, 38, 0, 44, 0, 0, 16, 7, 6,133, 3, 47, 1,117,255,255, 0,201, 0, 0, 1,147, 5,213, 18, 38, 0, 44, 0, 0, + 17, 7, 6,136, 3, 47, 1,117, 0, 8,180, 1, 6, 10, 0, 7, 43, 49, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 18, 38, + 0, 44, 0, 0, 17, 7, 6,132, 3, 47, 1,117, 0, 8,180, 0, 10, 7, 1, 7, 43, 49, 0, 0, 0, 2, 0, 10, 0, 0, 5,186, + 5,213, 0, 12, 0, 25, 0,103, 64, 32, 16, 9,169, 11, 13,149, 0,129, 18,149, 14, 11, 7, 7, 1, 25, 19, 4, 15, 13, 22, 25, + 4, 50, 10, 17, 13, 28, 8, 0,121, 26, 16,244, 60,236, 50,196,244,236, 16,196, 23, 57, 49, 0, 47,198, 50,238,246,238, 16,238, + 50, 48, 64, 40, 32, 27,127, 27,176, 27, 3,159, 9,159, 10,159, 11,159, 12,159, 14,159, 15,159, 16,159, 17,191, 9,191, 10,191, + 11,191, 12,191, 14,191, 15,191, 16,191, 17, 16, 93, 1, 93, 19, 33, 32, 0, 17, 16, 0, 41, 1, 17, 35, 53, 51, 19, 17, 33, 21, + 33, 17, 51, 32, 0, 17, 16, 0, 33,211, 1,160, 1,177, 1,150,254,105,254, 80,254, 96,201,201,203, 1, 80,254,176,243, 1, 53, + 1, 31,254,225,254,203, 5,213,254,151,254,128,254,126,254,150, 2,188,144, 1,227,254, 29,144,253,234, 1, 24, 1, 46, 1, 44, + 1, 23, 0, 0,255,255, 0,201, 0, 0, 5, 51, 5,213, 18, 38, 0, 49, 0, 0, 17, 7, 6,134, 4,254, 1,117, 0, 20,180, 0, + 19, 34, 4, 7, 43, 64, 9, 48, 19, 63, 34, 16, 19, 31, 34, 4, 93, 49, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 38, + 0, 50, 0, 0, 16, 7, 6,135, 5, 39, 1,117,255,255, 0,115,255,227, 5,217, 5,240, 18, 38, 0, 50, 0, 0, 16, 7, 6,133, + 5, 39, 1,117,255,255, 0,115,255,227, 5,217, 5,240, 18, 38, 0, 50, 0, 0, 17, 7, 6,136, 5, 39, 1,117, 0, 16,180, 15, + 26, 30, 21, 7, 43, 64, 5, 31, 26, 16, 30, 2, 93, 49, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 38, 0, 50, 0, 0, + 17, 7, 6,134, 5, 39, 1,117, 0, 24,180, 3, 33, 48, 9, 7, 43, 64, 13, 48, 33, 63, 48, 32, 33, 47, 48, 16, 33, 31, 48, 6, + 93, 49, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 38, 0, 50, 0, 0, 17, 7, 6,132, 5, 39, 1,117, 0, 20,180, 3, + 31, 26, 9, 7, 43, 64, 9, 64, 31, 79, 26, 16, 31, 31, 26, 4, 93, 49, 0, 0, 0, 1, 1, 25, 0, 63, 5,156, 4,197, 0, 11, + 0,133, 64, 77, 10,156, 11, 10, 7, 8, 7, 9,156, 8, 8, 7, 4,156, 3, 4, 7, 7, 6, 5,156, 6, 7, 6, 4,156, 5, 4, + 1, 2, 1, 3,156, 2, 2, 1, 11,156, 0, 1, 0, 10,156, 9, 10, 1, 1, 0, 66, 10, 8, 7, 6, 4, 2, 1, 0, 8, 5, 3, + 11, 9, 12, 11, 10, 9, 7, 5, 4, 3, 1, 8, 2, 0, 8, 6, 12, 16,212, 60,204, 50, 23, 57, 49, 0, 16,212, 60,204, 50, 23, + 57, 48, 75, 83, 88, 7, 16, 8,237, 7, 16, 5,237, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 5,237, 7, 16, 8,237, 7, 16, 5, +237, 7, 16, 8,237, 89, 34, 9, 2, 7, 9, 1, 39, 9, 1, 55, 9, 1, 5,156,254, 55, 1,201,119,254, 53,254, 53,118, 1,200, +254, 56,118, 1,203, 1,203, 4, 76,254, 53,254, 55,121, 1,203,254, 53,121, 1,201, 1,203,121,254, 53, 1,203, 0, 3, 0,102, +255,186, 5,229, 6, 23, 0, 9, 0, 19, 0, 43, 0,158, 64, 60, 29, 31, 26, 13, 43, 44, 19, 10, 1, 0, 4, 13, 41, 38, 32, 20, + 13, 4, 42, 38, 30, 26, 4,149, 38, 13,149, 26,145, 38,140, 44, 43, 44, 42, 20, 23, 16, 32, 30, 35, 19, 10, 1, 0, 4, 29, 41, + 16, 7, 31, 7, 25, 35, 51, 16, 25, 23, 16, 44, 16,252,236,252,236,192, 17, 18, 57, 57, 23, 57, 18, 57, 57, 17, 18, 57, 57, 17, + 57, 49, 0, 16,228,244,236, 16,238, 16,192, 16,192, 17, 18, 57, 57, 18, 57, 18, 23, 57, 18, 57, 17, 18, 57, 57, 48, 64, 42, 87, + 0, 90, 21, 87, 25, 85, 33,106, 21,101, 33,123, 21,118, 28,117, 33, 9, 70, 19, 89, 0, 86, 19,106, 0,100, 19,100, 28,106, 40, +124, 0,115, 19,118, 28,122, 40, 11, 93, 1, 93, 9, 1, 30, 1, 51, 50, 0, 17, 52, 38, 39, 46, 1, 35, 34, 0, 17, 20, 22, 23, + 7, 38, 2, 53, 16, 0, 33, 50, 22, 23, 55, 23, 7, 22, 18, 21, 16, 0, 33, 34, 38, 39, 7, 39, 4,182,253, 51, 62,161, 95,220, + 1, 1, 39,121, 61,161, 95,220,254,253, 39, 39,134, 78, 79, 1,121, 1, 59,130,221, 87,162,102,170, 78, 80,254,136,254,198,128, +221, 91,162,103, 4, 88,252,178, 64, 67, 1, 72, 1, 26,112,184,184, 64, 67,254,184,254,229,112,188, 68,158,102, 1, 8,160, 1, + 98, 1,165, 77, 75,191, 89,198,103,254,246,158,254,159,254, 91, 75, 75,191, 88,255,255, 0,178,255,227, 5, 41, 5,213, 18, 38, + 0, 56, 0, 0, 16, 7, 6,135, 4,238, 1,117,255,255, 0,178,255,227, 5, 41, 5,213, 18, 38, 0, 56, 0, 0, 16, 7, 6,133, + 4,238, 1,117,255,255, 0,178,255,227, 5, 41, 5,213, 18, 38, 0, 56, 0, 0, 17, 7, 6,136, 4,238, 1,117, 0, 20,180, 10, + 20, 24, 0, 7, 43, 64, 9, 47, 20, 32, 24, 31, 20, 16, 24, 4, 93, 49, 0, 0,255,255, 0,178,255,227, 5, 41, 5,213, 18, 38, + 0, 56, 0, 0, 17, 7, 6,132, 4,238, 1,117, 0, 28,180, 1, 25, 20, 9, 7, 43, 64, 17, 80, 25, 95, 20, 64, 25, 79, 20, 32, + 25, 47, 20, 16, 25, 31, 20, 8, 93, 49, 0, 0,255,255,255,252, 0, 0, 4,231, 5,213, 18, 38, 0, 60, 0, 0, 16, 7, 6,133, + 4,115, 1,117, 0, 2, 0,201, 0, 0, 4,141, 5,213, 0, 12, 0, 21, 0, 61, 64, 27, 14,149, 9, 13,149, 2,246, 0,129, 11, + 21, 15, 9, 3, 4, 1, 18, 25, 6, 63, 13, 10, 1, 28, 0, 4, 22, 16,252,236, 50, 50,252,236, 17, 23, 57, 49, 0, 47,244,252, +236,212,236, 48, 64, 9, 15, 23, 31, 23, 63, 23, 95, 23, 4, 1, 93, 19, 51, 17, 51, 50, 4, 21, 20, 4, 43, 1, 17, 35, 19, 17, + 51, 50, 54, 53, 52, 38, 35,201,202,254,251, 1, 1,254,255,251,254,202,202,254,141,154,153,142, 5,213,254,248,225,220,220,226, +254,174, 4, 39,253,209,146,134,134,145, 0, 0, 0, 1, 0,186,255,227, 4,172, 6, 20, 0, 47, 0,154, 64, 48, 45, 39, 33, 12, + 4, 6, 13, 32, 0, 4, 42, 22,134, 23, 26,185, 19, 42,185, 3,151, 19,140, 46, 12, 9, 13, 29, 32, 33, 39, 9, 8, 36, 39, 8, + 6, 29, 8, 36, 16, 22, 45, 8, 16, 0, 70, 48, 16,252,196,252,204, 16,198,238,212,238, 16,238, 17, 57, 57, 18, 57, 18, 57, 49, + 0, 47,228,254,238, 16,254,213,238, 18, 23, 57, 23, 57, 48, 64, 64, 15, 5, 15, 6, 15, 7, 15, 39, 15, 40,138, 12,138, 13, 7, + 10, 6, 10, 7, 10, 11, 10, 12, 10, 13, 10, 31, 13, 32, 10, 33, 12, 34, 4, 38, 25, 13, 25, 31, 25, 32, 58, 32, 58, 33, 77, 31, + 77, 32, 73, 33, 73, 34,106, 31,106, 32,165, 6,165, 7,166, 32, 24, 93, 1, 93, 19, 52, 54, 51, 50, 22, 23, 14, 1, 21, 20, 22, + 31, 1, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 47, 1, 46, 1, 53, 52, 54, 55, 46, 1, 35, 34, + 6, 21, 17, 35,186,239,218,208,219, 3,151,168, 58, 65, 57,166, 96,225,211, 64,136, 73, 80,140, 65,116,120, 59,101, 92, 96, 87, +167,151, 8,131,113,130,136,187, 4,113,200,219,232,224, 8,115, 96, 47, 81, 42, 37,106,142,100,172,183, 25, 24,164, 30, 29, 95, + 91, 63, 84, 62, 55, 59,135, 91,127,172, 29,103,112,139,131,251,147, 0, 0, 0,255,255, 0,123,255,227, 4, 45, 6,102, 18, 38, + 0, 68, 0, 0, 17, 6, 0, 67, 82, 0, 0, 11, 64, 7, 63, 38, 47, 38, 31, 38, 3, 93, 49, 0,255,255, 0,123,255,227, 4, 45, + 6,102, 18, 38, 0, 68, 0, 0, 17, 6, 0,118, 82, 0, 0, 11, 64, 7, 63, 38, 47, 38, 31, 38, 3, 93, 49, 0,255,255, 0,123, +255,227, 4, 45, 6,102, 18, 38, 0, 68, 0, 0, 17, 6, 2, 31, 82, 0, 0, 8,180, 11, 40, 44, 20, 7, 43, 49,255,255, 0,123, +255,227, 4, 45, 6, 55, 18, 38, 0, 68, 0, 0, 17, 6, 2, 53, 82, 0, 0, 20,180, 20, 46, 60, 11, 7, 43, 64, 9, 32, 46, 47, + 60, 16, 46, 31, 60, 4, 93, 49,255,255, 0,123,255,227, 4, 45, 6, 16, 18, 38, 0, 68, 0, 0, 17, 6, 0,106, 82, 0, 0, 32, +180, 20, 45, 40, 11, 7, 43, 64, 21,127, 40,111, 40, 80, 45, 95, 40, 64, 45, 79, 40, 48, 45, 63, 40, 0, 45, 15, 40, 10, 93, 49, +255,255, 0,123,255,227, 4, 45, 7, 6, 18, 38, 0, 68, 0, 0, 17, 6, 2, 51, 82, 0, 0, 37, 64, 14, 38, 44, 20, 44, 38, 11, + 7, 50, 56, 20, 56, 50, 11, 7, 43, 16,196, 43, 16,196, 49, 0, 64, 9, 63, 53, 63, 47, 15, 53, 15, 47, 4, 93, 48, 0, 0, 0, + 0, 3, 0,123,255,227, 7,111, 4,123, 0, 6, 0, 51, 0, 62, 1, 3, 64, 67, 39, 45, 37, 61, 14, 13, 0, 52,169, 37, 22,134, + 21,136, 18, 0,169, 14, 58, 18,185, 28, 25, 46,134, 45,186, 42, 3,185, 14,187, 7, 49, 10,184, 31, 25,140, 37, 63, 52, 55, 38, + 6, 15, 0, 37, 55, 28, 7, 38, 15, 21, 0, 8, 13, 61, 38, 8, 15, 45, 55, 8, 34, 69, 63, 16,252,236,204,212,252, 60,212,236, +196, 17, 18, 57, 57, 17, 57, 17, 18, 57, 17, 18, 57, 49, 0, 16,196,228, 50,244, 60,196,228,252, 60,244,236, 16,196,238, 50, 16, +238, 16,244,238, 16,238, 17, 57, 17, 57, 17, 18, 57, 48, 64,129, 48, 43, 48, 44, 48, 45, 48, 46, 48, 47, 48, 48, 64, 43, 64, 44, + 64, 45, 64, 46, 64, 47, 64, 48, 80, 43, 80, 44, 80, 45, 80, 46, 80, 47, 80, 48,133, 43,133, 48,128, 64,144, 64,160, 64,176, 64, +192, 64,208, 64,224, 64,224, 64,240, 64, 29, 63, 0, 63, 6, 63, 13, 63, 14, 63, 15, 5, 48, 44, 48, 45, 48, 46, 48, 47, 64, 44, + 64, 45, 64, 46, 64, 47, 80, 44, 80, 45, 80, 46, 80, 47,111, 0,111, 6,111, 13,111, 14,111, 15, 96, 44, 96, 45, 96, 46, 96, 47, +112, 44,112, 45,112, 46,112, 47,128, 44,128, 45,128, 46,128, 47, 29, 93,113, 1, 93, 1, 46, 1, 35, 34, 6, 7, 3, 62, 1, 51, + 50, 0, 29, 1, 33, 30, 1, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 39, 14, 1, 35, 34, 38, 53, 52, 54, 51, 33, 53, 52, 38, 35, + 34, 6, 7, 53, 62, 1, 51, 50, 22, 3, 34, 6, 21, 20, 22, 51, 50, 54, 61, 1, 6,182, 1,165,137,153,185, 14, 68, 74,212,132, +226, 1, 8,252,178, 12,204,183,104,200,100,100,208,106,167,248, 77, 73,216,143,189,210,253,251, 1, 2,167,151, 96,182, 84,101, +190, 90,142,213,239,223,172,129,111,153,185, 2,148,151,180,174,158, 1, 48, 90, 94,254,221,250, 90,191,200, 53, 53,174, 42, 44, +121,119,120,120,187,168,189,192, 18,127,139, 46, 46,170, 39, 39, 96,254, 24,102,123, 98,115,217,180, 41, 0, 0,255,255, 0,113, +254,117, 3,231, 4,123, 18, 38, 0, 70, 0, 0, 16, 7, 0,122, 0,143, 0, 0,255,255, 0,113,255,227, 4,127, 6,102, 18, 38, + 0, 72, 0, 0, 16, 7, 0, 67, 0,139, 0, 0,255,255, 0,113,255,227, 4,127, 6,102, 18, 38, 0, 72, 0, 0, 16, 7, 0,118, + 0,139, 0, 0,255,255, 0,113,255,227, 4,127, 6,102, 18, 38, 0, 72, 0, 0, 17, 7, 2, 31, 0,139, 0, 0, 0, 8,180, 21, + 30, 34, 27, 7, 43, 49, 0, 0,255,255, 0,113,255,227, 4,127, 6, 16, 18, 38, 0, 72, 0, 0, 17, 7, 0,106, 0,139, 0, 0, + 0, 7, 64, 3, 64, 32, 1, 93, 49, 0, 0, 0,255,255,255,199, 0, 0, 1,166, 6,102, 18, 38, 0,243, 0, 0, 16, 7, 0, 67, +255, 29, 0, 0,255,255, 0,144, 0, 0, 2,111, 6,102, 18, 38, 0,243, 0, 0, 16, 7, 0,118,255, 29, 0, 0,255,255,255,222, + 0, 0, 2, 92, 6,102, 18, 38, 0,243, 0, 0, 17, 7, 2, 31,255, 29, 0, 0, 0, 8,180, 1, 6, 10, 0, 7, 43, 49, 0, 0, +255,255,255,244, 0, 0, 2, 70, 6, 16, 18, 38, 0,243, 0, 0, 17, 7, 0,106,255, 29, 0, 0, 0, 8,180, 0, 10, 7, 1, 7, + 43, 49, 0, 0, 0, 2, 0,113,255,227, 4,117, 6, 20, 0, 14, 0, 40, 1, 39, 64, 94, 37,123, 38, 37, 30, 35, 30, 36,123, 35, + 35, 30, 15,123, 35, 30, 40,123, 39, 40, 30, 35, 30, 38, 39, 40, 39, 37, 36, 37, 40, 40, 39, 34, 35, 34, 31, 32, 31, 33, 32, 32, + 31, 66, 40, 39, 38, 37, 34, 33, 32, 31, 8, 35, 30, 3, 15, 35, 3,185, 27, 9,185, 21,140, 27, 35,177, 41, 38, 39, 18, 12, 33, + 32, 24, 40, 37, 35, 34, 31, 5, 30, 15, 6, 12, 18, 18, 81, 6, 18, 24, 69, 41, 16,252,236,244,236, 17, 57, 57, 23, 57, 18, 57, + 57, 17, 18, 57, 57, 49, 0, 16,236,196,244,236, 16,238, 18, 57, 18, 57, 18, 23, 57, 48, 75, 83, 88, 7, 16, 14,201, 7, 16, 8, +201, 7, 16, 8,201, 7, 16, 14,201, 7, 16, 8,237, 7, 14,237, 7, 16, 5,237, 7, 16, 8,237, 89, 34,178, 63, 42, 1, 1, 93, + 64,118, 22, 37, 43, 31, 40, 34, 47, 35, 47, 36, 41, 37, 45, 38, 45, 39, 42, 40, 54, 37, 70, 37, 88, 32, 88, 33, 96, 32, 96, 33, +102, 34,117, 32,117, 33,117, 34, 19, 37, 35, 37, 36, 38, 38, 38, 39, 39, 40, 54, 36, 54, 37, 70, 36, 69, 37, 90, 32, 90, 33, 98, + 32, 98, 33,127, 0,127, 1,127, 2,122, 3,123, 9,127, 10,127, 11,127, 12,127, 13,127, 14,127, 15,127, 16,127, 17,127, 18,127, + 19,127, 20,123, 21,122, 27,122, 28,127, 29,127, 30,118, 32,118, 33,120, 34,160, 42,240, 42, 39, 93, 0, 93, 1, 46, 1, 35, 34, + 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 19, 22, 18, 21, 20, 0, 35, 34, 0, 17, 52, 0, 51, 50, 22, 23, 39, 5, 39, 37, 39, 51, + 23, 37, 23, 5, 3, 70, 50, 88, 41,167,185,174,146,145,174, 54, 9,126,114,254,228,230,231,254,229, 1, 20,221, 18, 52, 42,159, +254,193, 33, 1, 25,181,228,127, 1, 77, 33,254,217, 3,147, 17, 16,216,195,188,222,222,188,122,188, 1, 38,143,254,224,173,255, +254,201, 1, 55, 0,255,250, 1, 55, 5, 5,180,107, 99, 92,204,145,111, 97, 98,255,255, 0,186, 0, 0, 4,100, 6, 55, 18, 38, + 0, 81, 0, 0, 16, 7, 2, 53, 0,152, 0, 0,255,255, 0,113,255,227, 4,117, 6,102, 18, 38, 0, 82, 0, 0, 16, 6, 0, 67, +115, 0, 0, 0,255,255, 0,113,255,227, 4,117, 6,102, 18, 38, 0, 82, 0, 0, 16, 6, 0,118,115, 0, 0, 0,255,255, 0,113, +255,227, 4,117, 6,102, 18, 38, 0, 82, 0, 0, 17, 6, 2, 31,115, 0, 0, 8,180, 15, 26, 30, 21, 7, 43, 49,255,255, 0,113, +255,227, 4,117, 6, 55, 18, 38, 0, 82, 0, 0, 17, 6, 2, 53,115, 0, 0, 20,180, 21, 32, 46, 15, 7, 43, 64, 9, 32, 32, 47, + 46, 16, 32, 31, 46, 4, 93, 49,255,255, 0,113,255,227, 4,117, 6, 16, 18, 38, 0, 82, 0, 0, 17, 6, 0,106,115, 0, 0, 20, +180, 3, 31, 26, 9, 7, 43, 64, 9, 64, 31, 79, 26, 48, 31, 63, 26, 4, 93, 49, 0, 3, 0,217, 0,150, 5,219, 4,111, 0, 3, + 0, 7, 0, 11, 0, 41, 64, 20, 0,234, 2, 6,234, 4, 2, 8,156, 4, 10, 12, 9, 5, 1,114, 4, 0, 8, 12, 16,220,212, 60, +252, 60,196, 49, 0, 16,212,196,252,196, 16,238, 16,238, 48, 1, 51, 21, 35, 17, 51, 21, 35, 1, 33, 21, 33, 2,223,246,246,246, +246,253,250, 5, 2,250,254, 4,111,246,254, 18,245, 2, 65,170, 0, 3, 0, 72,255,162, 4,156, 4,188, 0, 9, 0, 19, 0, 43, + 0,228, 64, 60, 43, 44, 38, 31, 29, 26, 19, 10, 1, 0, 4, 13, 41, 38, 32, 20, 13, 4, 42, 38, 30, 26, 4,185, 38, 13,185, 26, +184, 38,140, 44, 43, 44, 42, 20, 23, 16, 32, 30, 35, 19, 10, 1, 0, 4, 16, 7, 31, 29, 7, 18, 35, 81, 41, 16, 18, 23, 69, 44, + 16,252,236, 50,244,236, 50,192, 17, 18, 23, 57, 18, 57, 57, 17, 18, 57, 57, 17, 57, 49, 0, 16,228,244,236, 16,238, 16,192, 16, +192, 17, 18, 57, 57, 18, 57, 18, 23, 57, 17, 57, 57, 17, 18, 57, 48, 64,112, 40, 1, 63, 45, 89, 20, 86, 28, 85, 29, 86, 32,106, + 21,102, 33,127, 0,123, 4,127, 5,127, 6,127, 7,127, 8,127, 9,127, 10,127, 11,127, 12,123, 13,122, 21,123, 26,127, 27,127, + 28,127, 29,127, 30,127, 31,127, 32,123, 33,127, 34,127, 35,127, 36,127, 37,123, 38,155, 25,149, 37,168, 25,160, 45,240, 45, 38, + 89, 0, 86, 19, 85, 29, 90, 40,105, 0,102, 19,101, 28,106, 40,122, 0,116, 19,118, 28,122, 40,137, 30,149, 24,154, 36,162, 24, +173, 36, 17, 93, 1, 93, 9, 1, 30, 1, 51, 50, 54, 53, 52, 38, 39, 46, 1, 35, 34, 6, 21, 20, 22, 23, 7, 46, 1, 53, 16, 0, + 51, 50, 22, 23, 55, 23, 7, 30, 1, 21, 16, 0, 35, 34, 38, 39, 7, 39, 3,137,254, 25, 41,103, 65,147,172, 20, 92, 42,103, 62, +151,169, 19, 20,125, 54, 54, 1, 17,241, 93,159, 67,139, 95,146, 53, 54,254,238,240, 96,161, 63,139, 96, 3, 33,253,176, 42, 40, +232,200, 79,117,154, 41, 41,235,211, 72,110, 46,151, 77,197,119, 1, 20, 1, 56, 51, 52,168, 79,179, 77,198,120,254,237,254,199, + 52, 51,168, 78,255,255, 0,174,255,227, 4, 88, 6,102, 18, 38, 0, 88, 0, 0, 16, 6, 0, 67,123, 0, 0, 0,255,255, 0,174, +255,227, 4, 88, 6,102, 18, 38, 0, 88, 0, 0, 16, 6, 0,118,123, 0, 0, 0,255,255, 0,174,255,227, 4, 88, 6,102, 18, 38, + 0, 88, 0, 0, 17, 6, 2, 31,123, 0, 0, 8,180, 11, 22, 26, 1, 7, 43, 49,255,255, 0,174,255,227, 4, 88, 6, 16, 18, 38, + 0, 88, 0, 0, 17, 6, 0,106,123, 0, 0, 24,180, 2, 26, 23, 10, 7, 43, 64, 13, 64, 26, 79, 23, 48, 26, 63, 23, 0, 26, 15, + 23, 6, 93, 49,255,255, 0, 61,254, 86, 4,127, 6,102, 18, 38, 0, 92, 0, 0, 16, 6, 0,118, 94, 0, 0, 0, 0, 2, 0,186, +254, 86, 4,164, 6, 20, 0, 16, 0, 28, 0, 62, 64, 27, 20,185, 5, 8, 26,185, 0, 14,140, 8,184, 1,189, 3,151, 29, 17, 18, + 11, 71, 23, 4, 0, 8, 2, 70, 29, 16,252,236, 50, 50,244,236, 49, 0, 16,236,228,228,244,196,236, 16,198,238, 48, 64, 9, 96, + 30,128, 30,160, 30,224, 30, 4, 1, 93, 37, 17, 35, 17, 51, 17, 62, 1, 51, 50, 0, 17, 16, 2, 35, 34, 38, 1, 52, 38, 35, 34, + 6, 21, 20, 22, 51, 50, 54, 1,115,185,185, 58,177,123,204, 0,255,255,204,123,177, 2, 56,167,146,146,167,167,146,146,167,168, +253,174, 7,190,253,162,100, 97,254,188,254,248,254,248,254,188, 97, 1,235,203,231,231,203,203,231,231, 0, 0,255,255, 0, 61, +254, 86, 4,127, 6, 16, 18, 38, 0, 92, 0, 0, 17, 6, 0,106, 94, 0, 0, 22,180, 24, 23, 18, 25, 7, 43, 64, 11, 48, 23, 63, + 18, 32, 23, 47, 18, 31, 18, 5, 93, 49, 0, 0,255,255, 0, 16, 0, 0, 5,104, 7, 49, 16, 39, 0,113, 0,188, 1, 59, 19, 6, + 0, 36, 0, 0, 0, 16,180, 14, 3, 2, 9, 7, 43, 64, 5, 64, 3, 79, 2, 2, 93, 49, 0, 0,255,255, 0,123,255,227, 4, 45, + 5,246, 16, 38, 0,113, 74, 0, 19, 6, 0, 68, 0, 0, 0, 16,180, 24, 3, 2, 15, 7, 43, 64, 5,111, 2,127, 3, 2, 93, 49, +255,255, 0, 16, 0, 0, 5,104, 7,146, 16, 39, 2, 49, 0,206, 1, 74, 19, 6, 0, 36, 0, 0, 0, 18,180, 24, 0, 8, 19, 7, + 43, 49, 0, 64, 5,111, 0,111, 8, 2, 93, 48,255,255, 0,123,255,227, 4, 45, 6, 31, 16, 38, 2, 49, 79,215, 19, 6, 0, 68, + 0, 0, 0, 8,180, 34, 0, 8, 25, 7, 43, 49,255,255, 0, 16,254,117, 5,165, 5,213, 16, 39, 2, 52, 2,228, 0, 0, 18, 6, + 0, 36, 0, 0,255,255, 0,123,254,117, 4,128, 4,123, 16, 39, 2, 52, 1,191, 0, 0, 18, 6, 0, 68, 0, 0,255,255, 0,115, +255,227, 5, 39, 5,240, 18, 38, 0, 38, 0, 0, 16, 7, 6,133, 5, 45, 1,117,255,255, 0,113,255,227, 3,231, 6,102, 18, 38, + 0, 70, 0, 0, 16, 7, 0,118, 0,137, 0, 0,255,255, 0,115,255,227, 5, 39, 5,240, 16, 39, 6,136, 5, 76, 1,117, 19, 6, + 0, 38, 0, 0, 0, 9,178, 4, 4, 30, 16, 60, 61, 47, 49, 0,255,255, 0,113,255,227, 3,231, 6,102, 16, 39, 2, 31, 0,164, + 0, 0, 18, 6, 0, 70, 0, 0,255,255, 0,115,255,227, 5, 39, 5,240, 16, 39, 6,140, 5, 76, 1,117, 18, 6, 0, 38, 0, 0, +255,255, 0,113,255,227, 3,231, 6, 16, 16, 39, 2, 50, 0,164, 0, 0, 18, 6, 0, 70, 0, 0,255,255, 0,115,255,227, 5, 39, + 5,240, 18, 38, 0, 38, 0, 0, 17, 7, 6,137, 5, 45, 1,117, 0, 7, 64, 3, 31, 29, 1, 93, 49, 0, 0, 0,255,255, 0,113, +255,227, 3,231, 6,102, 18, 38, 0, 70, 0, 0, 16, 7, 2, 32, 0,137, 0, 0,255,255, 0,201, 0, 0, 5,176, 5,213, 16, 38, + 0, 39, 0, 0, 16, 7, 6,137, 4,236, 1,137,255,255, 0,113,255,227, 4, 90, 6, 20, 18, 38, 0, 71, 0, 0, 17, 7, 6,131, + 5, 20, 0, 0, 0, 11, 64, 7, 95, 29, 63, 29, 31, 29, 3, 93, 49, 0, 0, 0,255,255, 0, 10, 0, 0, 5,186, 5,213, 16, 6, + 0,146, 0, 0, 0, 2, 0,113,255,227, 4,244, 6, 20, 0, 24, 0, 36, 0, 74, 64, 36, 7, 3,211, 9, 1,249, 34,185, 0, 22, + 28,185, 13, 16,140, 22,184, 5,151, 11, 2, 31, 12, 4, 3, 0, 8, 8, 10, 6, 71, 25, 18, 19, 69, 37, 16,252,236,244, 60,196, +252, 23, 60,196, 49, 0, 47,236,228,244,196,236, 16,196,238,253, 60,238, 50, 48,182, 96, 38,128, 38,160, 38, 3, 1, 93, 1, 17, + 33, 53, 33, 53, 51, 21, 51, 21, 35, 17, 35, 53, 14, 1, 35, 34, 2, 17, 16, 0, 51, 50, 22, 1, 20, 22, 51, 50, 54, 53, 52, 38, + 35, 34, 6, 3,162,254,186, 1, 70,184,154,154,184, 58,177,124,203,255, 0,255,203,124,177,253,199,167,146,146,168,168,146,146, +167, 3,182, 1, 78,125,147,147,125,250,252,168,100, 97, 1, 68, 1, 8, 1, 8, 1, 68, 97,254, 21,203,231,231,203,203,231,231, +255,255, 0,201, 0, 0, 4,139, 7, 51, 16, 39, 0,113, 0,161, 1, 61, 18, 6, 0, 40, 0, 0,255,255, 0,113,255,227, 4,127, + 5,246, 16, 39, 0,113, 0,150, 0, 0, 19, 6, 0, 72, 0, 0, 0, 7, 64, 3,112, 0, 1, 93, 49, 0, 0, 0,255,255, 0,201, + 0, 0, 4,139, 5,213, 16, 39, 6,139, 4,161, 1,117, 19, 6, 0, 40, 0, 0, 0, 7, 64, 3, 64, 0, 1, 93, 49, 0, 0, 0, +255,255, 0,113,255,227, 4,127, 6, 72, 16, 39, 2, 49, 0,150, 0, 0, 19, 6, 0, 72, 0, 0, 0, 7, 64, 3,112, 0, 1, 93, + 49, 0, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 16, 39, 6,140, 4,161, 1,117, 18, 6, 0, 40, 0, 0,255,255, 0,113, +255,227, 4,127, 6, 16, 16, 39, 2, 50, 0,150, 0, 0, 18, 6, 0, 72, 0, 0,255,255, 0,201,254,117, 4,141, 5,213, 16, 39, + 2, 52, 1,204, 0, 0, 18, 6, 0, 40, 0, 0,255,255, 0,113,254,117, 4,127, 4,123, 16, 39, 2, 52, 1,120, 0, 0, 18, 6, + 0, 72, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 38, 0, 40, 0, 0, 17, 7, 6,137, 4,166, 1,111, 0, 7, 64, 3, + 64, 12, 1, 93, 49, 0, 0, 0,255,255, 0,113,255,227, 4,127, 6, 97, 18, 38, 0, 72, 0, 0, 17, 7, 2, 32, 0,148,255,251, + 0, 16,180, 0, 33, 29, 15, 7, 43, 64, 5, 15, 33, 0, 29, 2, 93, 49, 0, 0,255,255, 0,115,255,227, 5,139, 5,240, 16, 39, + 6,136, 5, 92, 1,117, 19, 6, 0, 42, 0, 0, 0, 9,178, 4, 4, 21, 16, 60, 61, 47, 49, 0,255,255, 0,113,254, 86, 4, 90, + 6,102, 16, 38, 2, 31,104, 0, 19, 6, 0, 74, 0, 0, 0, 9,178, 4, 4, 10, 16, 60, 61, 47, 49, 0, 0, 0,255,255, 0,115, +255,227, 5,139, 5,240, 18, 38, 0, 42, 0, 0, 16, 7, 6,139, 5, 27, 1,117,255,255, 0,113,254, 86, 4, 90, 6, 72, 18, 38, + 0, 74, 0, 0, 16, 7, 2, 49, 0,139, 0, 0,255,255, 0,115,255,227, 5,139, 5,240, 16, 39, 6,140, 5, 92, 1,117, 19, 6, + 0, 42, 0, 0, 0, 8, 0, 64, 3, 63, 0, 1, 93, 48, 0, 0,255,255, 0,113,254, 86, 4, 90, 6, 16, 16, 38, 2, 50,104, 0, + 18, 6, 0, 74, 0, 0, 0, 0,255,255, 0,115,254, 1, 5,139, 5,240, 16, 39, 2,110, 5, 94,255,237, 18, 6, 0, 42, 0, 0, +255,255, 0,113,254, 86, 4, 90, 6, 52, 16, 39, 2, 90, 3,224, 1, 12, 18, 6, 0, 74, 0, 0,255,255, 0,201, 0, 0, 5, 59, + 5,213, 16, 39, 6,136, 5, 2, 1,117, 19, 6, 0, 43, 0, 0, 0, 20,180, 12, 2, 6, 7, 7, 43, 64, 9, 47, 2, 32, 6, 31, + 2, 16, 6, 4, 93, 49, 0, 0,255,255, 0,186, 0, 0, 4,100, 6, 20, 16, 39, 6,136, 3, 22, 1,117, 19, 6, 0, 75, 0, 0, + 0, 42,180, 20, 2, 6, 19, 7, 43, 49, 0, 75,176, 14, 81, 88,187, 0, 20,255,192, 0, 19,255,192, 56, 56, 89, 64, 13,144, 20, +144, 19,128, 20,128, 19, 64, 20, 64, 19, 6, 93, 0, 2, 0,201, 0, 0, 6,139, 5,213, 0, 19, 0, 23, 0, 58, 64, 30, 6, 2, + 18,149, 9, 20, 17, 12,149, 21,173, 4, 0,129, 14, 10, 7, 12, 23, 4, 28, 5, 56, 18, 13, 20, 1, 28, 0, 24, 16,220,236, 50, + 50,204,252,236, 50, 50,204, 49, 0, 47, 60,228, 50,252,236,220, 50, 50,236, 50, 50, 48, 1, 51, 21, 33, 53, 51, 21, 51, 21, 35, + 17, 35, 17, 33, 17, 35, 17, 35, 53, 51, 23, 21, 33, 53, 1,113,202, 2,222,202,168,168,202,253, 34,202,168,168,202, 2,222, 5, +213,224,224,224,164,251,175, 2,199,253, 57, 4, 81,164,164,224,224, 0, 0, 0, 0, 1, 0,120, 0, 0, 4,159, 6, 20, 0, 27, + 0, 62, 64, 33, 3, 9, 0, 3, 22, 1, 14, 18,135, 13, 21, 6,135, 22, 25,184, 16,151, 10, 1, 2, 8, 0, 78, 19, 14, 17, 21, + 9, 8, 16, 11, 28, 16,220, 50,236, 50, 50,204,204,244,236, 49, 0, 47, 60,236,244,196,236,220, 50,236, 50, 17, 18, 23, 57, 48, + 1, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 35, 53, 51, 53, 51, 21, 33, 21, 33, 17, 62, 1, 51, 50, 22, 4,159,184,124, +124,149,172,185,125,125,185, 1, 96,254,160, 66,179,117,193,198, 2,164,253, 92, 2,158,159,158,190,164,253,135, 4,246,164,122, +122,164,254,188,101,100,239, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 16, 39, 6,134, 3, 46, 1,117, 19, 6, 0, 44, 0, 0, + 0, 8,180, 30, 9, 24, 31, 7, 43, 49, 0, 0,255,255,255,211, 0, 0, 2,103, 6, 55, 16, 39, 2, 53,255, 29, 0, 0, 19, 6, + 0,243, 0, 0, 0, 8,180, 28, 8, 22, 29, 7, 43, 49, 0, 0,255,255, 0, 3, 0, 0, 2, 89, 7, 49, 16, 39, 0,113,255, 46, + 1, 59, 19, 6, 0, 44, 0, 0, 0, 8,180, 4, 3, 2, 5, 7, 43, 49, 0, 0,255,255,255,242, 0, 0, 2, 72, 5,245, 16, 39, + 0,113,255, 29,255,255, 19, 6, 0,243, 0, 0, 0, 8,180, 4, 3, 2, 5, 7, 43, 49, 0, 0,255,255, 0,201, 0, 0, 1,147, + 5,213, 16, 39, 6,139, 3, 46, 1,117, 19, 6, 0, 44, 0, 0, 0, 8,180, 14, 0, 8, 15, 7, 43, 49, 0, 0,255,255,255,228, + 0, 0, 2, 86, 6, 72, 16, 39, 2, 49,255, 29, 0, 0, 19, 6, 0,243, 0, 0, 0, 8,180, 14, 0, 8, 15, 7, 43, 49, 0, 0, +255,255, 0,176,254,117, 2, 37, 5,213, 16, 39, 2, 52,255,100, 0, 0, 18, 6, 0, 44, 0, 0,255,255, 0,150,254,117, 2, 11, + 6, 20, 16, 39, 2, 52,255, 74, 0, 0, 18, 6, 0, 76, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 18, 38, 0, 44, 0, 0, + 17, 7, 6,140, 3, 47, 1,117, 0, 19,179, 6, 1, 7, 0, 16, 60, 16, 60, 49, 0,180, 63, 7, 63, 6, 2, 93, 48, 0, 0, 0, + 0, 1, 0,193, 0, 0, 1,121, 4, 96, 0, 3, 0, 32,183, 0,191, 2, 1, 8, 0, 70, 4, 16,252,236, 49, 0, 47,236, 48, 64, + 11, 16, 5, 64, 5, 80, 5, 96, 5,112, 5, 5, 1, 93, 19, 51, 17, 35,193,184,184, 4, 96,251,160, 0, 0, 0,255,255, 0,201, +254,102, 3,239, 5,213, 16, 39, 0, 45, 2, 92, 0, 0, 17, 6, 0, 44, 0, 0, 0, 8, 64, 3, 17, 4, 1, 16,236, 49, 0, 0, +255,255, 0,193,254, 86, 3,177, 6, 20, 16, 39, 0, 77, 2, 56, 0, 0, 17, 6, 0, 76, 0, 0, 0, 8, 64, 3, 25, 70, 1, 16, +236, 49, 0, 0,255,255,255,150,254,102, 1,147, 5,213, 16, 39, 6,136, 3, 46, 1,117, 19, 6, 0, 45, 0, 0, 0, 8,180, 8, + 2, 6, 7, 7, 43, 49, 0, 0,255,255,255,219,254, 86, 2, 92, 6,102, 16, 39, 2, 31,255, 29, 0, 0, 19, 6, 1,249, 0, 0, + 0, 8,180, 8, 2, 6, 7, 7, 43, 49, 0, 0,255,255, 0,201,254, 30, 5,106, 5,213, 16, 39, 2,110, 5, 27, 0, 10, 18, 6, + 0, 46, 0, 0,255,255, 0,186,254, 30, 4,156, 6, 20, 16, 39, 2,110, 4,172, 0, 10, 18, 6, 0, 78, 0, 0, 0, 1, 0,186, + 0, 0, 4,156, 4, 96, 0, 10, 0,187, 64, 40, 8, 17, 5, 6, 5, 7, 17, 6, 6, 5, 3, 17, 4, 5, 4, 2, 17, 5, 5, 4, + 66, 8, 5, 2, 3, 3, 0,188, 9, 6, 5, 1, 4, 6, 8, 1, 8, 0, 70, 11, 16,252,236, 50,212,196, 17, 57, 49, 0, 47, 60, +236, 50, 23, 57, 48, 75, 83, 88, 7, 16, 4,237, 7, 16, 5,237, 7, 16, 5,237, 7, 16, 4,237, 89, 34,178, 16, 12, 1, 1, 93, + 64, 95, 4, 2, 10, 8, 22, 2, 39, 2, 41, 5, 43, 8, 86, 2,102, 2,103, 8,115, 2,119, 5,130, 2,137, 5,142, 8,147, 2, +150, 5,151, 8,163, 2, 18, 9, 5, 9, 6, 2, 11, 3, 10, 7, 40, 3, 39, 4, 40, 5, 43, 6, 43, 7, 64, 12,104, 3, 96, 12, +137, 3,133, 4,137, 5,141, 6,143, 7,154, 3,151, 7,170, 3,167, 5,182, 7,197, 7,214, 7,247, 3,240, 3,247, 4,240, 4, + 26, 93,113, 0, 93, 19, 51, 17, 1, 51, 9, 1, 35, 1, 17, 35,186,185, 2, 37,235,253,174, 2,107,240,253,199,185, 4, 96,254, + 27, 1,229,253,242,253,174, 2, 33,253,223, 0,255,255, 0,201, 0, 0, 4,106, 5,213, 16, 39, 6,133, 3,110, 1,118, 18, 6, + 0, 47, 0, 0,255,255, 0,193, 0, 0, 1,121, 6, 20, 16, 39, 6,133, 3, 90, 1,118, 19, 6, 0, 79, 0, 0, 0, 30,177, 3, + 4, 16, 60, 49, 0, 75,176, 14, 81, 88,185, 0, 0, 0, 64, 56, 89, 64, 7,159, 0,143, 0, 79, 0, 3, 93, 48,255,255, 0,201, +254, 30, 4,106, 5,213, 16, 39, 2,110, 4,155, 0, 10, 18, 6, 0, 47, 0, 0,255,255, 0,136,254, 30, 1,174, 6, 20, 16, 39, + 2,110, 3, 30, 0, 10, 19, 6, 0, 79, 0, 0, 0, 7, 64, 3, 64, 0, 1, 93, 49, 0, 0, 0,255,255, 0,201, 0, 0, 4,106, + 5,213, 16, 39, 6,131, 2,159,255,195, 18, 6, 0, 47, 0, 0,255,255, 0,193, 0, 0, 1,121, 6, 20, 16, 39, 6,131, 2, 57, + 0, 2, 17, 6, 0, 79, 0, 0, 0, 9, 64, 5,143, 0, 31, 0, 2, 93, 49, 0,255,255, 0,201, 0, 0, 4,106, 5,213, 16, 39, + 0,121, 2, 49, 0,119, 18, 6, 0, 47, 0, 0,255,255, 0,193, 0, 0, 2,132, 6, 20, 16, 39, 0,121, 0,214, 0,115, 17, 6, + 0, 79, 0, 0, 0, 23, 75,176, 13, 81, 75,176, 17, 83, 75,176, 24, 81, 90, 91, 88,185, 0, 0, 0, 64, 56, 89, 49, 0, 0, 0, + 0, 1,255,242, 0, 0, 4,117, 5,213, 0, 13, 0, 63, 64, 30, 12, 11, 10, 4, 3, 2, 6, 0, 6,149, 0,129, 8, 3, 4, 1, + 11, 14, 0, 4, 5, 1, 28, 12, 7, 58, 9, 0,121, 14, 16,244, 60,236,196,252, 60,196, 17, 18, 57, 17, 18, 57, 49, 0, 47,228, +236, 17, 23, 57, 48,180, 48, 15, 80, 15, 2, 1, 93, 19, 51, 17, 37, 23, 1, 17, 33, 21, 33, 17, 7, 39, 55,211,203, 1, 57, 80, +254,119, 2,215,252, 94,148, 77,225, 5,213,253,152,219,111,254,238,253,227,170, 2, 59,106,110,158, 0, 0, 0, 0, 1, 0, 2, + 0, 0, 2, 72, 6, 20, 0, 11, 0, 94, 64, 26, 10, 9, 8, 4, 3, 2, 6, 0,151, 6, 3, 4, 1, 9, 10, 0, 4,122, 5, 1, + 8, 10,122, 7, 0, 12, 16,212, 60,228,252, 60,228, 17, 18, 57, 17, 18, 57, 49, 0, 47,236, 23, 57, 48, 1, 75,176, 16, 84, 88, +189, 0, 12, 0, 64, 0, 1, 0, 12, 0, 12,255,192, 56, 17, 55, 56, 89, 64, 19, 16, 13, 64, 13, 80, 13, 96, 13,115, 4,122, 10, +112, 13,224, 13,240, 13, 9, 93, 19, 51, 17, 55, 23, 7, 17, 35, 17, 7, 39, 55,199,184,125, 76,201,184,123, 74,197, 6, 20,253, +166, 90,106,141,252,227, 2,154, 88,106,141, 0,255,255, 0,201, 0, 0, 5, 51, 5,213, 16, 39, 6,133, 4,197, 1,118, 19, 6, + 0, 49, 0, 0, 0, 7, 64, 3, 79, 0, 1, 93, 49, 0, 0, 0,255,255, 0,186, 0, 0, 4,100, 6,109, 16, 38, 0,118, 66, 7, + 19, 6, 0, 81, 0, 0, 0, 9, 64, 5, 63, 0, 79, 0, 2, 93, 49, 0, 0, 0,255,255, 0,201,254, 30, 5, 51, 5,213, 16, 39, + 2,110, 5, 0, 0, 10, 18, 6, 0, 49, 0, 0,255,255, 0,186,254, 30, 4,100, 4,123, 16, 39, 2,110, 4,144, 0, 10, 18, 6, + 0, 81, 0, 0,255,255, 0,201, 0, 0, 5, 51, 5,213, 18, 38, 0, 49, 0, 0, 17, 7, 6,137, 4,245, 1,103, 0, 20,180, 4, + 15, 11, 0, 7, 43, 64, 9, 47, 15, 32, 11, 31, 15, 16, 11, 4, 93, 49, 0, 0,255,255, 0,186, 0, 0, 4,100, 6,102, 18, 38, + 0, 81, 0, 0, 17, 7, 2, 32, 0,141, 0, 0, 0, 16,180, 0, 25, 21, 12, 7, 43, 64, 5, 15, 25, 0, 21, 2, 93, 49, 0, 0, +255,255, 0,205, 0, 0, 5,185, 5,213, 16, 39, 0, 81, 1, 85, 0, 0, 16, 6, 2, 21, 27, 0, 0, 1, 0,213,254, 86, 5, 39, + 5,213, 0, 19, 0, 74, 64, 33, 17, 17, 1, 2, 1, 2, 17, 16, 17, 16, 66, 11,149, 10, 17, 2, 3, 0,175, 16, 19, 11, 16, 1, + 17, 2, 28, 4, 54, 17, 28, 0, 20, 16,220,236,252,236, 17, 57, 57,204, 49, 0, 47, 60,236, 50, 57, 57,220,236, 48, 75, 83, 88, + 7, 16, 4,237, 7, 16, 4,237, 89, 34,178, 31, 21, 1, 1, 93, 19, 51, 1, 17, 51, 17, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, + 53, 1, 17, 35,213,184, 2,226,184, 82, 81,181,254,233,105, 38, 38,253, 30,184, 5,213,251,131, 4,125,250, 23,214, 96, 96,156, + 48, 49,173, 4,125,251,131, 0, 0, 1, 0,186,254, 86, 4,100, 4,123, 0, 31, 0, 59, 64, 28, 13, 19, 0, 3, 24, 21, 7,135, + 6, 16,135, 24, 28,184, 22,188, 21, 7, 13, 8, 0, 78, 19, 23, 8, 22, 70, 32, 16,252,236, 50,244,236,196, 49, 0, 47,228,244, +196,236,212,236, 17, 18, 23, 57, 48,180, 96, 33,207, 33, 2, 1, 93, 1, 17, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, + 38, 35, 34, 6, 21, 17, 35, 17, 51, 21, 54, 55, 54, 51, 50, 23, 22, 4,100, 82, 81,181,254,233,105, 38, 38,124,124,149,172,185, +185, 66, 89, 90,117,193, 99, 99, 2,164,253, 72,214, 96, 96,156, 48, 49,153, 2,178,159,158,190,164,253,135, 4, 96,174,101, 50, + 50,119,120, 0,255,255, 0,115,255,227, 5,217, 7, 49, 16, 39, 0,113, 1, 39, 1, 59, 19, 6, 0, 50, 0, 0, 0, 16,180, 13, + 2, 3, 7, 7, 43, 64, 5, 31, 2, 16, 3, 2, 93, 49, 0, 0,255,255, 0,113,255,227, 4,117, 5,245, 16, 38, 0,113,115,255, + 19, 6, 0, 82, 0, 0, 0, 8,180, 19, 2, 3, 25, 7, 43, 49,255,255, 0,115,255,227, 5,217, 5,240, 16, 39, 6,139, 5, 39, + 1,117, 19, 6, 0, 50, 0, 0, 0, 16,180, 17, 0, 8, 23, 7, 43, 64, 5, 16, 0, 31, 8, 2, 93, 49, 0, 0,255,255, 0,113, +255,227, 4,117, 6, 72, 16, 38, 2, 49,115, 0, 19, 6, 0, 82, 0, 0, 0, 8,180, 29, 8, 0, 35, 7, 43, 49,255,255, 0,115, +255,227, 5,217, 5,240, 16, 39, 6,141, 5, 39, 1,117, 18, 6, 0, 50, 0, 0,255,255, 0,113,255,227, 4,117, 6,102, 16, 39, + 2, 54, 0,160, 0, 0, 18, 6, 0, 82, 0, 0, 0, 2, 0,115, 0, 0, 8, 12, 5,213, 0, 16, 0, 25, 0, 59, 64, 31, 5,149, + 3, 17, 1,149, 0,129, 24, 7,149, 3,173, 9, 24, 18, 16, 10, 21, 6, 2, 28, 17, 0, 4, 8, 21, 25, 13, 16, 26, 16,252,236, +212,196,196,212,236, 50, 18, 57, 57, 57, 57, 49, 0, 47,236,236, 50,244,236, 50, 16,238, 48, 1, 21, 33, 17, 33, 21, 33, 17, 33, + 21, 33, 32, 0, 17, 16, 0, 33, 23, 35, 32, 0, 17, 16, 0, 33, 51, 7,250,253, 26, 2,199,253, 57, 2,248,251,215,254, 79,254, + 65, 1,191, 1,177,103,129,254,191,254,192, 1, 64, 1, 65,129, 5,213,170,254, 70,170,253,227,170, 1,124, 1,112, 1,109, 1, +124,170,254,225,254,224,254,223,254,223, 0, 0, 0, 3, 0,113,255,227, 7,195, 4,123, 0, 6, 0, 39, 0, 51, 0,132, 64, 49, + 7, 8, 0, 16,134, 15,136, 12, 0,169, 8, 46, 12,185, 22, 19, 40, 3,185, 8,187, 34, 37, 31,184, 25, 19,140, 52, 6, 0, 22, + 34, 49, 9, 15, 0, 8, 7, 75, 49, 18, 9, 81, 43, 18, 28, 69, 52, 16,252,236,244,252,244,236,196, 17, 18, 57, 57, 18, 57, 49, + 0, 16,228, 50,244, 60,196,228,236, 50, 16,196,238, 50, 16,238, 16,244,238, 17, 18, 57, 48, 64, 37, 63, 53, 95, 53,112, 53,159, + 53,207, 53,208, 53,240, 53, 7, 63, 0, 63, 6, 63, 7, 63, 8, 63, 9, 5,111, 0,111, 6,111, 7,111, 8,111, 9, 5, 93,113, + 1, 93, 1, 46, 1, 35, 34, 6, 7, 5, 21, 33, 30, 1, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 39, 14, 1, 35, 34, 0, 17, 16, + 0, 51, 50, 22, 23, 62, 1, 51, 50, 0, 37, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 7, 10, 2,164,137,153,185, 14, 3, 72, +252,178, 12,204,183,106,200, 98,100,208,106,160,242, 81, 71,209,140,241,254,239, 1, 17,241,140,211, 66, 78,232,143,226, 1, 8, +250,176,148,172,171,149,147,172,172, 2,148,152,179,174,158, 53, 90,190,199, 52, 52,174, 42, 44,110,109,110,109, 1, 57, 1, 19, + 1, 20, 1, 56,111,108,107,112,254,221,135,231,201,201,231,232,200,199,233, 0,255,255, 0,201, 0, 0, 5, 84, 5,213, 16, 39, + 6,133, 4,149, 1,118, 18, 6, 0, 53, 0, 0,255,255, 0,186, 0, 0, 3,149, 6,109, 16, 38, 0,118, 66, 7, 18, 6, 0, 85, + 0, 0, 0, 0,255,255, 0,201,254, 30, 5, 84, 5,213, 16, 39, 2,110, 5, 16, 0, 10, 18, 6, 0, 53, 0, 0,255,255, 0,130, +254, 30, 3, 74, 4,123, 16, 39, 2,110, 3, 24, 0, 10, 18, 6, 0, 85, 0, 0,255,255, 0,201, 0, 0, 5, 84, 5,213, 18, 38, + 0, 53, 0, 0, 17, 7, 6,137, 4,125, 1,103, 0, 8, 0, 64, 3, 95, 29, 1, 93, 48, 0, 0,255,255, 0,186, 0, 0, 3, 90, + 6,102, 18, 38, 0, 85, 0, 0, 17, 6, 2, 32, 27, 0, 0, 16,180, 17, 23, 19, 9, 7, 43, 64, 5, 15, 23, 0, 19, 2, 93, 49, +255,255, 0,135,255,227, 4,162, 5,240, 16, 39, 6,133, 4,149, 1,118, 18, 6, 0, 54, 0, 0,255,255, 0,111,255,227, 3,199, + 6,109, 16, 38, 0,118, 66, 7, 18, 6, 0, 86, 0, 0, 0, 0,255,255, 0,135,255,227, 4,162, 5,240, 16, 39, 6,136, 4,147, + 1,117, 19, 6, 0, 54, 0, 0, 0, 11,180, 4, 32, 21, 41, 41, 16, 73, 99, 58, 49, 0, 0, 0,255,255, 0,111,255,227, 3,199, + 6,102, 16, 38, 2, 31, 37, 0, 19, 6, 0, 86, 0, 0, 0, 11,180, 4, 32, 21, 41, 41, 16, 73, 99, 58, 49, 0,255,255, 0,135, +254,117, 4,162, 5,240, 18, 38, 0, 54, 0, 0, 16, 7, 0,122, 0,139, 0, 0,255,255, 0,111,254,117, 3,199, 4,123, 18, 38, + 0, 86, 0, 0, 16, 6, 0,122, 23, 0, 0, 0,255,255, 0,135,255,227, 4,162, 5,240, 18, 38, 0, 54, 0, 0, 17, 7, 6,137, + 4,139, 1,117, 0, 11,180, 43, 32, 14, 34, 34, 16, 73, 99, 58, 49, 0, 0, 0,255,255, 0,111,255,227, 3,199, 6,102, 18, 38, + 0, 86, 0, 0, 17, 6, 2, 32, 23, 0, 0, 11,180, 43, 32, 14, 34, 34, 16, 73, 99, 58, 49, 0,255,255,255,250,254,117, 4,233, + 5,213, 16, 38, 0,122, 80, 0, 18, 6, 0, 55, 0, 0, 0, 0,255,255, 0, 55,254,117, 2,242, 5,158, 16, 38, 0,122,225, 0, + 18, 6, 0, 87, 0, 0, 0, 0,255,255,255,250, 0, 0, 4,233, 5,213, 18, 38, 0, 55, 0, 0, 17, 7, 6,137, 4,115, 1,103, + 0, 16,180, 1, 13, 9, 0, 7, 43, 49, 0, 64, 3, 95, 8, 1, 93, 48, 0, 0,255,255, 0, 55, 0, 0, 2,242, 5,158, 18, 38, + 0, 87, 0, 0, 17, 7, 6,131, 2, 55, 0,112, 0, 7, 64, 3,143, 20, 1, 93, 49, 0, 0, 0, 0, 1,255,250, 0, 0, 4,233, + 5,213, 0, 15, 0, 70, 64, 24, 7, 11,149, 4, 12, 9, 3, 15,149, 0,129, 9, 5, 1, 64, 7, 3, 28, 12, 0, 64, 10, 14, 16, + 16,212, 60,228,204,252, 60,228,204, 49, 0, 47,244,236, 50, 16,212, 60,236, 50, 48, 1, 64, 19, 0, 17, 31, 0, 16, 1, 16, 2, + 31, 15, 16, 17, 64, 17,112, 17,159, 17, 9, 93, 3, 33, 21, 33, 17, 33, 21, 33, 17, 35, 17, 33, 53, 33, 17, 33, 6, 4,239,253, +238, 1, 9,254,247,203,254,247, 1, 9,253,238, 5,213,170,253,192,170,253,191, 2, 65,170, 2, 64, 0, 0, 0, 0, 1, 0, 55, + 0, 0, 2,242, 5,158, 0, 29, 0, 67, 64, 31, 8, 22,169, 5, 23, 4, 26,169, 0, 1, 27,188, 13,135, 16, 16, 13, 14, 2, 6, + 8, 4, 0, 8, 23, 27, 21, 25, 29, 70, 30, 16,252, 60, 60,196, 50,252, 60, 60,196,196, 50, 57, 57, 49, 0, 47,236,244, 60,196, +252, 60,220, 60,236, 50, 48,178,175, 31, 1, 1, 93, 1, 17, 33, 21, 33, 21, 51, 21, 35, 21, 20, 23, 22, 59, 1, 21, 35, 34, 39, + 38, 61, 1, 35, 53, 51, 53, 35, 53, 51, 17, 1,119, 1,123,254,133,190,190, 37, 38,115,189,189,213, 81, 81,135,135,135,135, 5, +158,254,194,143,233,142,233,137, 39, 39,154, 80, 79,210,233,142,233,143, 1, 62,255,255, 0,178,255,227, 5, 41, 5,213, 16, 39, + 6,134, 4,238, 1,117, 19, 6, 0, 56, 0, 0, 0, 16,180, 31, 9, 24, 39, 7, 43, 64, 5, 16, 9, 31, 24, 2, 93, 49, 0, 0, +255,255, 0,174,255,227, 4, 88, 6, 55, 16, 39, 2, 53, 0,131, 0, 0, 19, 6, 0, 88, 0, 0, 0, 8,180, 30, 8, 22, 38, 7, + 43, 49, 0, 0,255,255, 0,178,255,227, 5, 41, 7, 49, 16, 39, 0,113, 0,238, 1, 59, 19, 6, 0, 56, 0, 0, 0, 20,180, 5, + 3, 2, 13, 7, 43, 64, 9, 47, 2, 32, 3, 31, 2, 16, 3, 4, 93, 49, 0, 0,255,255, 0,174,255,227, 4, 88, 5,245, 16, 39, + 0,113, 0,131,255,255, 19, 6, 0, 88, 0, 0, 0, 8,180, 6, 3, 2, 14, 7, 43, 49, 0, 0,255,255, 0,178,255,227, 5, 41, + 5,213, 16, 39, 6,139, 4,238, 1,117, 19, 6, 0, 56, 0, 0, 0, 16,180, 15, 0, 8, 23, 7, 43, 64, 5, 16, 0, 31, 8, 2, + 93, 49, 0, 0,255,255, 0,174,255,227, 4, 88, 6, 72, 16, 39, 2, 49, 0,131, 0, 0, 19, 6, 0, 88, 0, 0, 0, 8,180, 16, + 0, 8, 24, 7, 43, 49, 0, 0,255,255, 0,178,255,227, 5, 41, 8, 75, 18, 38, 0, 56, 0, 0, 17, 7, 2, 51, 0,240, 1, 69, + 0, 9, 64, 5, 64, 30, 64, 18, 2, 93, 49, 0,255,255, 0,174,255,227, 4, 88, 6,202, 18, 38, 0, 88, 0, 0, 17, 6, 2, 51, +124,196, 0, 9, 64, 5, 64, 20, 64, 32, 2, 93, 49, 0, 0, 0,255,255, 0,178,255,227, 5, 41, 5,213, 16, 39, 6,141, 4,238, + 1,117, 18, 6, 0, 56, 0, 0,255,255, 0,174,255,227, 4, 94, 6,102, 16, 39, 2, 54, 0,176, 0, 0, 18, 6, 0, 88, 0, 0, +255,255, 0,178,254,101, 5, 41, 5,213, 18, 38, 0, 56, 0, 0, 16, 7, 2, 52, 0,250,255,240,255,255, 0,174,254,117, 4,232, + 4, 96, 18, 38, 0, 88, 0, 0, 16, 7, 2, 52, 2, 39, 0, 0,255,255, 0, 68, 0, 0, 7,166, 5,213, 16, 39, 6,136, 5,245, + 1,124, 19, 6, 0, 58, 0, 0, 0, 8,180, 21, 2, 6, 20, 7, 43, 49, 0, 0,255,255, 0, 86, 0, 0, 6, 53, 6,109, 16, 39, + 2, 31, 1, 69, 0, 7, 19, 6, 0, 90, 0, 0, 0, 8,180, 21, 2, 6, 20, 7, 43, 49, 0, 0,255,255,255,252, 0, 0, 4,231, + 5,213, 16, 39, 6,136, 4,114, 1,124, 19, 6, 0, 60, 0, 0, 0, 8,180, 11, 2, 6, 7, 7, 43, 49, 0, 0,255,255, 0, 61, +254, 86, 4,127, 6,109, 16, 38, 2, 31, 94, 7, 19, 6, 0, 92, 0, 0, 0, 8,180, 24, 2, 6, 23, 7, 43, 49,255,255,255,252, + 0, 0, 4,231, 5,213, 18, 38, 0, 60, 0, 0, 17, 7, 6,132, 4,115, 1,117, 0, 8,180, 0, 16, 11, 4, 7, 43, 49, 0, 0, +255,255, 0, 92, 0, 0, 5, 31, 5,213, 16, 39, 6,133, 4,149, 1,118, 18, 6, 0, 61, 0, 0,255,255, 0, 88, 0, 0, 3,219, + 6,109, 16, 38, 0,118, 66, 7, 18, 6, 0, 93, 0, 0, 0, 0,255,255, 0, 92, 0, 0, 5, 31, 5,213, 16, 39, 6,140, 4,168, + 1, 98, 18, 6, 0, 61, 0, 0,255,255, 0, 88, 0, 0, 3,219, 6, 16, 16, 38, 2, 50, 0, 0, 18, 6, 0, 93, 0, 0, 0, 0, +255,255, 0, 92, 0, 0, 5, 31, 5,213, 18, 38, 0, 61, 0, 0, 16, 7, 6,137, 4,190, 1,117,255,255, 0, 88, 0, 0, 3,219, + 6,102, 18, 38, 0, 93, 0, 0, 17, 6, 2, 32, 27, 0, 0, 16,180, 1, 15, 11, 0, 7, 43, 64, 5, 15, 15, 0, 11, 2, 93, 49, + 0, 1, 0, 47, 0, 0, 2,248, 6, 20, 0, 16, 0, 35, 64, 18, 11,135, 10,151, 1, 2,169, 5,188, 1, 10, 16, 8, 4, 6, 2, + 76, 17, 16,252, 60,204,252,204, 49, 0, 47,244,236, 16,244,236, 48, 33, 35, 17, 35, 53, 51, 53, 52, 54, 59, 1, 21, 35, 34, 7, + 6, 21, 1,152,185,176,176,174,189,174,176, 99, 39, 38, 3,209,143, 78,187,171,153, 40, 41,103, 0, 2, 0, 32,255,227, 4,164, + 6, 20, 0, 15, 0, 44, 0, 68, 64, 37, 4,185, 16, 20, 12,185, 32, 28,140, 20,184, 34, 41, 37,169, 44, 36, 39,151, 34, 46, 69, + 0, 18, 24, 71, 42, 32, 6, 44, 40, 8, 37, 35, 39, 70, 45, 16,252, 60,204,236, 50, 50, 50,204,244,236,236, 49, 0, 47,244,220, + 60,236, 50, 16,228,244,196,236, 16,198,238, 48, 1, 52, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 51, 50, 55, 54, 1, 54, 55, 54, + 51, 50, 23, 22, 17, 16, 7, 6, 35, 34, 39, 38, 39, 21, 35, 17, 35, 53, 51, 53, 51, 21, 33, 21, 33, 3,229, 83, 84,146,146, 84, + 83, 83, 84,146,146, 84, 83,253,142, 58, 89, 88,123,204,127,128,128,127,204,123, 88, 89, 58,185,154,154,185, 1, 69,254,187, 2, + 47,203,116,115,115,116,203,203,116,115,115,116, 2, 82,100, 48, 49,162,162,254,248,254,248,162,162, 49, 48,100,168, 5, 4,125, +147,147,125, 0, 0, 3,255,151, 0, 0, 5, 80, 5,213, 0, 8, 0, 17, 0, 41, 0, 67, 64, 35, 25, 0,149, 10, 9,149, 18,129, + 1,149, 10,173, 31, 17, 11, 8, 2, 19, 25, 31, 5, 0, 14, 28, 22, 5, 25, 28, 46, 9, 0, 28, 18, 4, 42, 16,252,236, 50,252, +236,212,236, 17, 23, 57, 57, 57, 49, 0, 47,236,236,244,236, 16,238, 57, 48,178, 15, 34, 1, 1, 93, 1, 17, 33, 50, 54, 53, 52, + 38, 35, 1, 17, 33, 50, 54, 53, 52, 38, 35, 37, 33, 50, 22, 21, 20, 6, 7, 30, 1, 21, 20, 4, 35, 33, 17, 34, 6, 29, 1, 35, + 53, 52, 54, 1,247, 1, 68,163,157,157,163,254,188, 1, 43,148,145,145,148,254, 11, 2, 4,231,250,128,124,149,165,254,240,251, +253,232,132,118,156,192, 2,201,253,221,135,139,140,133, 2,102,254, 62,111,114,113,112,166,192,177,137,162, 20, 32,203,152,200, +218, 5, 48, 95,105, 49, 70,181,163, 0, 0, 0,255,255, 0,201, 0, 0, 4,236, 5,213, 18, 6, 3, 46, 0, 0, 0, 2, 0,186, +255,227, 4,164, 6, 20, 0, 22, 0, 38, 0, 56, 64, 31, 27,185, 0, 4, 35,185, 16, 12,140, 4,184, 18, 22,169, 19,151, 18, 40, + 69, 20, 23, 18, 8, 71, 16, 31, 22, 8, 19, 70, 39, 16,252,236, 50, 50,244,236,196,236, 49, 0, 47,244,236, 16,228,244,196,236, + 16,198,238, 48, 1, 54, 55, 54, 51, 50, 23, 22, 17, 16, 7, 6, 35, 34, 39, 38, 39, 21, 35, 17, 33, 21, 37, 1, 52, 39, 38, 35, + 34, 7, 6, 21, 20, 23, 22, 51, 50, 55, 54, 1,115, 58, 89, 88,123,204,127,128,128,127,204,123, 88, 89, 58,185, 3, 78,253,107, + 2,114, 83, 84,146,146, 84, 83, 83, 84,146,146, 84, 83, 3,182,100, 48, 49,162,162,254,248,254,248,162,162, 49, 48,100,168, 6, + 20,166, 1,252,192,203,116,115,115,116,203,203,116,115,115,116, 0, 2, 0, 0, 0, 0, 4,236, 5,213, 0, 10, 0, 23, 0, 51, + 64, 12, 23, 11, 25, 0, 25, 16, 46, 5, 11, 28, 21, 22, 47,220,236, 50,252,236,196, 16,204, 49, 64, 9, 5,149, 12,173, 11,129, + 6,149, 20, 0, 47,236,228,244,236,179, 21, 21, 11, 20, 17, 18, 57, 47, 48, 1, 52, 39, 38, 35, 33, 17, 33, 50, 55, 54, 1, 17, + 33, 50, 4, 21, 20, 4, 35, 33, 17, 35, 1, 4, 23, 79, 78,163,254,188, 1, 68,163, 78, 79,253,124, 1, 78,251, 1, 16,254,240, +251,253,232,201, 1, 56, 1,183,139, 68, 67,253,221, 68, 67, 4,168,253,154,218,222,221,218, 4, 68, 1,145, 0, 0, 2, 0, 0, +255,227, 4,164, 6, 21, 0, 18, 0, 30, 0, 62, 64, 13, 17, 18, 32, 19, 18, 6, 71, 13, 25, 18, 8, 15, 16, 47,220,236, 50, 50, +244,236,196, 16,204, 49, 64, 14, 0, 22,185, 3,184, 14, 12, 28,185, 9,140, 17,151, 14, 0, 47,228,244,236,196, 16,244,236,196, +179, 15, 15, 17, 14, 17, 18, 57, 47, 48, 1, 62, 1, 51, 50, 0, 17, 16, 2, 35, 34, 38, 39, 21, 35, 17, 35, 1, 51, 1, 52, 38, + 35, 34, 6, 21, 20, 22, 51, 50, 54, 1,115, 58,177,123,204, 0,255,255,204,123,177, 58,185,186, 1, 34, 81, 2,114,167,146,146, +167,167,146,146,167, 3,182,100, 97,254,188,254,248,254,248,254,188, 97,100,168, 4, 68, 1,209,252, 26,203,231,231,203,203,231, +231, 0, 0, 0, 0, 1, 0,115,255,227, 5, 39, 5,240, 0, 25, 0, 48, 64, 27, 25,134, 0,136, 22,149, 3,145, 26, 13,134, 12, +136, 16,149, 9,140, 26, 27, 16, 19, 25, 6, 48, 13, 0, 26, 16,220, 60,244,236,236, 49, 0, 16,244,236,244,236, 16,244,236,244, +236, 48, 19, 62, 1, 51, 32, 0, 17, 16, 0, 33, 34, 38, 39, 53, 30, 1, 51, 32, 0, 17, 16, 0, 33, 34, 6, 7,115,104,237,134, + 1, 83, 1,134,254,122,254,173,132,237,106,102,231,130, 1, 0, 1, 16,254,240,255, 0,130,231,102, 5, 98, 71, 71,254, 97,254, +152,254,153,254, 97, 72, 72,211, 95, 94, 1, 57, 1, 39, 1, 40, 1, 57, 94, 95, 0, 1, 0,115,255,227, 6, 90, 7,100, 0, 36, + 0, 0, 1, 54, 55, 54, 59, 1, 21, 35, 34, 6, 29, 1, 46, 1, 35, 32, 0, 17, 16, 0, 33, 50, 54, 55, 21, 14, 1, 35, 32, 0, + 17, 16, 0, 33, 50, 23, 22, 4, 97, 16, 83,102,227, 77, 63,134,110,102,231,130,255, 0,254,240, 1, 16, 1, 0,130,231,102,106, +237,132,254,173,254,122, 1,134, 1, 83,134,118, 13, 5,197,195, 98,122,170,150,194,213, 95, 94,254,199,254,216,254,217,254,199, + 94, 95,211, 72, 72, 1,159, 1,103, 1,104, 1,159, 36, 3, 0, 0, 1, 0,113,255,227, 4,205, 5,203, 0, 33, 0, 0, 1, 54, + 55, 54, 59, 1, 21, 35, 34, 6, 29, 1, 46, 1, 35, 34, 6, 16, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 0, 17, 16, 0, 33, 50, + 3, 49, 9, 70, 82,181, 70, 49,105, 76, 78,157, 80,179,198,198,179, 80,157, 78, 77,165, 93,253,254,214, 1, 45, 1, 6, 72, 4, +111,169, 83, 96,156, 97,153,172, 43, 43,227,254,102,227, 43, 43,170, 36, 36, 1, 62, 1, 14, 1, 18, 1, 58, 0,255,255, 0, 10, + 0, 0, 5,186, 5,213, 16, 6, 0,146, 0, 0, 0, 2,255,151, 0, 0, 6, 20, 5,213, 0, 8, 0, 26, 0, 46, 64, 21, 0,149, + 9,129, 1,149, 16, 8, 2, 16, 10, 0, 5, 25, 13, 50, 0, 28, 9, 4, 27, 16,252,236,244,236, 17, 57, 57, 57, 57, 49, 0, 47, +236,244,236, 48,178, 96, 19, 1, 1, 93, 1, 17, 51, 32, 0, 17, 16, 0, 33, 37, 33, 32, 0, 17, 16, 0, 41, 1, 17, 34, 6, 29, + 1, 35, 53, 52, 54, 1,247,244, 1, 53, 1, 31,254,225,254,203,254, 66, 1,159, 1,178, 1,150,254,104,254, 80,254, 97,132,118, +156,192, 5, 47,251,119, 1, 24, 1, 46, 1, 44, 1, 23,166,254,151,254,128,254,126,254,150, 5, 48, 95,105, 49, 70,181,163, 0, + 0, 2, 0,201, 0, 0, 4,236, 5,213, 0, 7, 0, 20, 0, 46, 64, 12, 22, 8, 4, 19, 28, 10, 46, 0, 25, 14, 16, 21, 16,252, +236,244,236, 50,196,196, 49, 64, 12, 19,149, 9,129, 10, 4,149, 18,173, 3,149, 10, 0, 47,236,244,236, 16,244,236, 48, 1, 16, + 41, 1, 17, 33, 34, 6, 17, 33, 17, 33, 34, 36, 53, 52, 36, 51, 33, 17, 33, 1,158, 1, 64, 1, 68,254,188,163,157, 3, 78,253, +232,251,254,240, 1, 16,251, 1, 78,253,124, 1,183,254,239, 2, 35,135, 3,147,250, 43,218,222,221,218, 1,192, 0, 2, 0,113, +255,227, 4, 90, 6, 20, 0, 17, 0, 25, 0, 0, 1, 17, 5, 53, 33, 17, 35, 53, 14, 1, 35, 34, 2, 16, 0, 51, 50, 22, 0, 16, + 22, 32, 54, 16, 38, 32, 3,162,253,107, 3, 77,184, 58,177,123,204,255, 0,255,204,123,177,253,200,167, 1, 36,167,167,254,220, + 3,182, 1,185, 1,166,249,236,168,100, 97, 1, 68, 2, 16, 1, 68, 97,254,224,254,106,231,231, 1,150,231, 0, 0, 2, 0,113, +254, 86, 4,117, 4, 99, 0, 28, 0, 45, 0, 0, 23, 22, 51, 50, 53, 52, 37, 38, 39, 38, 17, 16, 55, 54, 51, 50, 23, 22, 17, 20, + 7, 6, 7, 22, 21, 16, 33, 34, 39, 1, 54, 55, 54, 53, 52, 39, 38, 35, 34, 6, 21, 20, 23, 22, 23, 22,250,102,239,253,254,248, +208,117,142,137,137,240,239,138,137,137, 53, 75,156,254, 71,221,120, 1,232, 68, 55, 86, 85, 86,149,147,172, 91, 97,126, 64,203, + 70,117, 92, 48, 37,112,135, 1, 21, 1, 9,156,157,157,156,254,237,204,165, 64, 36, 79,141,254,240, 70, 1,216, 29, 73,113,204, +203,114,115,232,190,199, 96,103, 11, 6, 0, 0, 0, 1, 0,131, 0, 0, 4, 69, 5,213, 0, 11, 0, 43, 64, 9, 13, 5, 9, 28, + 0, 11, 7, 2, 12, 16,220,196,196,212,236, 50,196, 49, 64, 12, 10,149, 11,129, 2, 6,149, 7,173, 3,149, 2, 0, 47,236,244, +236, 16,244,236, 48, 1, 17, 33, 53, 33, 17, 33, 53, 33, 17, 33, 53, 4, 69,252, 62, 2,248,253, 57, 2,199,253, 26, 5,213,250, + 43,170, 2, 29,170, 1,186,170, 0, 2, 0,117,255,227, 5,217, 5,240, 0, 19, 0, 26, 0, 68, 64, 38, 1, 20, 0, 8,161, 7, +174, 4, 0,149, 20, 23,149, 17, 0,149, 20,173, 4,149, 11,145, 17,140, 27, 1, 20, 26, 26, 25, 15, 51, 20, 25, 7, 0, 16, 27, + 16,252,196,236,244,236, 17, 18, 57, 49, 0, 16,228,244,236,244,228, 16,238, 16,238, 16,244,238, 17, 18, 57, 48, 19, 33, 16, 0, + 33, 34, 6, 7, 53, 54, 36, 51, 32, 0, 17, 16, 0, 33, 32, 0, 55, 22, 0, 51, 50, 0, 55,117, 4,143,254,237,254,238,139,252, +112,111, 1, 7,146, 1, 94, 1,139,254,136,254,198,254,183,254,151,220, 13, 0,255,202,202, 0,255, 13, 3, 12, 1, 12, 1, 50, + 96, 95,215, 70, 72,254,103,254,146,254,159,254, 91, 1,183,204,195,254,228, 1, 28,195, 0, 0, 0, 1, 0,164,255,227, 4,123, + 5,240, 0, 40, 0, 64, 64, 36, 10,134, 9,136, 13,149, 6,145, 41, 0, 22,149, 19,173, 41, 31,134, 32,136, 28,149, 35,140, 41, + 42, 20, 9, 31, 16, 25, 3, 25, 25, 38, 16, 41, 16,252,236,212,236,212,196,196,204, 49, 0, 16,244,236,244,236, 16,244,236, 57, + 16,244,236,244,236, 48, 1, 46, 1, 53, 52, 36, 51, 50, 22, 23, 21, 46, 1, 35, 34, 6, 21, 20, 22, 59, 1, 21, 35, 34, 6, 21, + 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 32, 36, 53, 52, 54, 1,216,131,142, 1, 12,230, 89,201,115,114,190, 83,152,163,158,149, +182,174,165,185,199,190,109,200, 84,106,199, 94,254,232,254,208,163, 3, 37, 33,171,124,178,209, 32, 32,180, 38, 36,123,115,112, +119,166,149,132,143,150, 50, 49,195, 37, 37,242,221,144,196, 0, 0, 1,255,150,254,102, 4, 35, 5,213, 0, 17, 0, 65, 64, 31, + 17, 8, 18, 13,149, 12,176, 18, 6,149, 4, 2,149, 0,129, 4,173, 18, 17, 8, 0, 7, 12, 5, 1, 7, 3, 28, 0, 4, 18, 16, +252,236, 50,212,196,196, 17, 18, 57, 57, 49, 0, 16,236,244,236, 16,238, 16,244,236, 16, 57, 57, 48,178, 15, 11, 1, 1, 93, 19, + 33, 21, 33, 17, 33, 21, 33, 17, 16, 6, 43, 1, 53, 51, 50, 54, 53,201, 3, 90,253,112, 2, 80,253,176,205,227, 77, 63,134,110, + 5,213,170,254, 72,170,253,159,254,242,244,170,150,194, 0, 0, 0, 1,255,127,254, 86, 2,248, 6, 20, 0, 27, 0,101, 64, 35, + 19, 10, 15,135, 13,189, 29, 5, 24, 1, 20, 8,169, 6, 1,135, 0,151, 22, 6,188, 28, 2, 27, 7, 0, 7, 9, 5, 8, 21, 23, + 19, 76, 28, 16,252, 75,176, 10, 84, 88,185, 0, 19, 0, 64, 56, 89, 75,176, 22, 84, 88,185, 0, 19,255,192, 56, 89, 60,196,252, + 60,196,196, 18, 57, 57, 49, 0, 16,228, 50,252,236, 16,238, 50, 18, 57, 57, 16,244,236, 57, 57, 48, 1,182, 64, 29, 80, 29,160, + 29, 3, 93, 1, 21, 35, 34, 6, 29, 1, 33, 21, 33, 17, 20, 6, 43, 1, 53, 51, 50, 54, 53, 17, 35, 53, 51, 53, 52, 54, 51, 2, +248,176, 99, 77, 1, 47,254,209,174,189,174,176, 99, 77,176,176,174,189, 6, 20,153, 80,104, 99,143,251,235,187,171,153, 80,104, + 4, 42,143, 78,187,171, 0, 0, 0, 1, 0,115,255,227, 6,151, 7,100, 0, 38, 0, 70, 64, 39, 22,149, 21, 39, 0, 5, 36, 1, +149, 3, 36,149, 8, 26,161, 27, 30,149, 14,145, 8,140, 39, 21, 2, 0, 28, 4, 17, 28, 26, 52, 4, 51, 33, 25, 11, 70, 39, 16, +252,236,252,244,236, 16,252,196,196, 49, 0, 16,228,244,252,244,204, 16,254,212,238, 17, 57, 57, 16,220,236, 48, 37, 17, 33, 53, + 33, 17, 6, 4, 35, 32, 0, 17, 16, 0, 33, 50, 22, 23, 52, 54, 59, 1, 21, 35, 34, 6, 29, 1, 46, 1, 35, 32, 0, 17, 16, 0, + 33, 50, 54, 4,195,254,182, 2, 18,117,254,230,160,254,162,254,117, 1,139, 1, 94, 91,163, 68,201,227, 77, 63,134,110,112,252, +139,254,238,254,237, 1, 19, 1, 18,107,168,213, 1,145,166,253,127, 83, 85, 1,153, 1,109, 1,110, 1,153, 25, 25,188,234,170, +150,194,215, 95, 96,254,206,254,209,254,210,254,206, 37, 0, 0, 0, 2, 0, 8,254, 82, 5,118, 5,213, 0, 15, 0, 37, 0,149, + 64, 13, 39, 80, 18, 1, 18, 4, 25, 23, 12, 25, 31, 36, 38, 16,212,212,236,212,236,212, 93,196,181, 16, 8, 0, 3, 4, 12, 17, + 18, 23, 57, 49, 64, 10, 0,149, 27,189, 17, 37, 18, 36,129, 38, 0, 16,228, 50, 50, 50,244,236,179, 31, 23, 8, 27, 17, 18, 57, + 57, 48, 64, 12, 19, 17, 17, 18, 18, 8, 35, 37, 17, 36, 36, 8, 7, 5, 16,236, 60, 7, 16,236, 60,182, 19, 17, 8, 18, 8, 36, + 8, 7, 8, 16,236,182, 35, 17, 8, 36, 8, 18, 8, 7, 8, 16,236,180, 16, 37, 19, 17, 35, 15, 64, 16, 22, 21, 20, 3, 23, 19, + 36, 8, 34, 33, 32, 3, 31, 35, 18, 8, 4, 7, 17, 18, 23, 57, 7, 17, 18, 23, 57, 1, 50, 55, 54, 53, 52, 39, 38, 39, 6, 7, + 6, 21, 20, 23, 22, 19, 1, 51, 1, 22, 23, 22, 21, 20, 7, 6, 35, 34, 39, 38, 53, 52, 55, 54, 55, 1, 51, 2,191, 54, 44, 28, + 31, 51, 44, 44, 51, 31, 28, 44, 54, 1,217,222,253,186,104, 67, 46, 75,100,155,155,100, 75, 46, 67,104,253,186,222,254,253, 32, + 20, 66, 57, 73,121, 92, 92,121, 73, 57, 66, 20, 32, 3,122, 3, 94,251,207,200,174,119, 66,139, 65, 87, 87, 65,139, 66,119,174, +200, 4, 49, 0, 0, 1, 0,186, 0, 0, 7, 71, 6, 20, 0, 67, 0, 0, 1, 52, 38, 35, 34, 6, 7, 17, 35, 17, 51, 17, 52, 54, + 51, 50, 22, 21, 17, 20, 23, 22, 59, 1, 50, 63, 1, 53, 51, 63, 2, 53, 51, 55, 53, 51, 53, 55, 51, 53, 63, 2, 54, 53, 52, 39, + 38, 39, 33, 22, 23, 22, 23, 22, 23, 22, 21, 20, 7, 6, 35, 7, 6, 39, 38, 53, 4,100,198,193,117,179, 66,185,185,172,149,124, +124, 81, 82,181, 70,225,142, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 35, 30, 66, 54, 56,114,254,190, 46, 76, 77, 55, 15, 24, + 66, 88, 88,144, 51,103, 40, 38, 2,164,232,239,100,101, 2, 98,249,236, 2,121,164,190,158,156,254,245,214, 96, 96,146, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 47,119,161,136,110,113,100, 12, 44, 45, 72, 21, 36,100,146,158, 98, 97, 1, 2, 50, + 49,153, 0, 0, 0, 1, 0,201, 0, 0, 2,198, 5,213, 0, 11, 0, 46, 64, 16, 11, 2, 0, 6,149, 0,129, 7, 5, 8, 6, 1, + 28, 0, 4, 12, 16,252, 75,176, 16, 84, 88,185, 0, 0, 0, 64, 56, 89,236,196, 57, 57, 49, 0, 47,228,236, 17, 57, 57, 48, 1, + 19, 51, 17, 20, 22, 59, 1, 21, 35, 34, 38, 17,201,202,110,134, 63, 77,227,205, 5,213,252, 45,194,150,170,244, 1, 14, 0, 0, + 0, 1, 0, 10, 0, 0, 2, 82, 5,213, 0, 11, 0, 69, 64, 17, 2, 11,149, 5, 8, 0,175, 6, 3, 5, 1, 28, 10, 8, 0, 4, + 12, 16,252, 60,196, 75,176, 16, 84, 88,187, 0, 8, 0, 64, 0, 0, 0, 64, 56, 56, 89,236, 50,196, 49, 0, 47,236,220, 60,244, + 50, 48, 1, 64, 13, 48, 13, 64, 13, 80, 13, 96, 13,143, 13,159, 13, 6, 93, 19, 51, 17, 51, 21, 35, 17, 35, 17, 35, 53, 51,201, +202,191,191,202,191,191, 5,213,253, 22,170,253,191, 2, 65,170, 0, 1, 0,201, 0, 0, 5,221, 5,222, 0, 18, 0, 0, 1, 54, + 31, 1, 55, 39, 38, 7, 6, 7, 1, 17, 35, 17, 51, 17, 1, 33, 1, 4, 80, 62, 58,172,105,237, 96, 76, 53, 71,253,203,202,202, + 2,205, 1, 10,252,230, 4,254, 59, 33,141,116,176, 72, 39, 27, 67,253,236, 2,119,250, 43, 2,207,253, 49, 3, 29, 0, 0, 0, + 0, 1, 0,185, 0, 0, 4,156, 6, 20, 0, 18, 0,193, 64, 44, 16, 17, 13, 14, 13, 15, 17, 14, 14, 13, 11, 17, 12, 13, 12, 10, + 17, 13, 13, 12, 66, 16, 13, 10, 3, 6,149, 3,151, 11,188, 17, 14, 4, 13, 9, 12, 14, 16, 9, 8, 0, 70, 19, 16,252,236, 50, +212,196, 17, 57,196, 49, 0, 47, 60,228,252,228, 23, 57, 48, 75, 83, 88, 7, 16, 4,237, 7, 16, 5,237, 7, 16, 5,237, 7, 16, + 4,237, 89, 34,178, 16, 12, 1, 1, 93, 64, 95, 4, 10, 10, 16, 22, 10, 39, 10, 41, 13, 43, 16, 86, 10,102, 10,103, 16,115, 10, +119, 13,130, 10,137, 13,142, 16,147, 10,150, 13,151, 16,163, 10, 18, 17, 5, 17, 6, 10, 11, 11, 10, 15, 40, 11, 39, 12, 40, 13, + 43, 14, 43, 15, 64, 20,104, 11, 96, 20,137, 11,133, 12,137, 13,141, 14,143, 15,154, 11,151, 15,170, 11,167, 13,182, 15,197, 15, +214, 15,247, 11,240, 11,247, 12,240, 12, 26, 93,113, 0, 93, 19, 52, 54, 59, 1, 21, 35, 34, 6, 21, 17, 1, 51, 9, 1, 35, 1, + 17, 35,185,163,181,191,168,105, 76, 2, 37,235,253,174, 2,107,240,253,199,185, 4,126,214,192,156, 97,153,253,255, 1,227,253, +244,253,172, 2, 35,253,221, 0, 0, 1, 0, 10, 0, 0, 2, 42, 6, 20, 0, 11, 0, 50, 64, 7, 5, 1, 8, 8, 0, 70, 12, 16, +252, 60,236, 50, 49, 0, 64, 8, 2, 11,169, 5, 8, 0,151, 6, 47,236,212, 60,236, 50, 48, 64, 13, 16, 13, 64, 13, 80, 13, 96, + 13,112, 13,240, 13, 6, 1, 93, 19, 51, 17, 51, 21, 35, 17, 35, 17, 35, 53, 51,193,184,177,177,184,183,183, 6, 20,253, 56,144, +253, 68, 2,188,144, 0, 0, 0, 0, 1, 0, 61, 0, 0, 4,127, 6, 20, 0, 15, 0, 0, 51, 1, 39, 5, 39, 37, 39, 51, 23, 37, + 23, 5, 1, 35, 9, 1, 61, 1,235, 71,254,212, 33, 1, 41, 75,200, 52, 1, 58, 33,254,201, 1,237,195,254,198,254,126, 4, 50, +188,101, 99, 99,197,138,104, 97,104,250,215, 3, 60,252,196, 0, 0, 1, 0,178,255,227, 7, 39, 5,213, 0, 35, 0, 0, 37, 14, + 1, 35, 34, 38, 53, 17, 51, 17, 20, 23, 22, 51, 50, 54, 53, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, 35, 53, 14, 1, 35, + 34, 38, 3,166, 69,192,130,175,190,203, 39, 57,117,143,166,203,114,119,123,166,203,203, 63,176,121,122,171,213,124,118,245,226, + 4, 27,251,239,186, 53, 78,190,164, 3,236,251,239,162,155,191,163, 3,236,250, 41,174,103, 98,124, 0, 0, 0, 0, 1,255,150, +254,102, 5, 51, 5,213, 0, 17, 0,140, 64, 41, 7, 17, 1, 2, 1, 2, 17, 6, 7, 6, 66, 8, 17, 0, 13,149, 12,176, 18, 7, + 2, 3, 0,175, 5, 6, 1, 7, 2, 28, 4, 54, 11, 14, 12, 57, 7, 28, 0, 4, 18, 16,252,236,228, 57, 57,252,236, 17, 57, 57, + 49, 0, 47,236, 50, 57, 57, 16,252,236, 17, 57, 57, 48, 75, 83, 88, 7, 16, 4,237, 7, 16, 4,237, 89, 34,178, 31, 11, 1, 1, + 93, 64, 48, 54, 2, 56, 7, 72, 2, 71, 7,105, 2,102, 7,128, 2, 7, 6, 1, 9, 6, 21, 1, 26, 6, 70, 1, 73, 6, 87, 1, + 88, 6,101, 1,105, 6,121, 6,133, 1,138, 6,149, 1,154, 6,159, 19, 16, 93, 0, 93, 19, 33, 1, 17, 51, 17, 33, 1, 17, 16, + 6, 43, 1, 53, 51, 50, 54, 53,201, 1, 16, 2,150,196,254,240,253,106,205,227, 71, 63,134,110, 5,213,251, 31, 4,225,250, 43, + 4,225,251,135,254,242,244,170,150,194, 0, 0,255,255, 0,186,254, 86, 4,100, 4,123, 16, 6, 2,213, 0, 0, 0, 3, 0,115, +255,227, 5,217, 5,240, 0, 11, 0, 18, 0, 25, 0, 47, 64, 11, 25, 16, 25, 6, 51, 15, 19, 25, 0, 16, 26, 16,252,236, 50,244, +236, 50, 49, 0, 64, 14, 22,149, 9, 15,149, 19,173, 12,149, 3,145, 9,140, 26, 16,228,244,236,244,228, 16,236, 48, 19, 16, 0, + 33, 32, 0, 17, 16, 0, 33, 32, 0, 1, 34, 2, 7, 33, 38, 2, 1, 22, 0, 51, 50, 0, 55,115, 1,121, 1, 59, 1, 58, 1,120, +254,136,254,198,254,197,254,135, 2,180,232,239, 6, 3,186, 6,239,253, 66, 13, 0,255,202,202, 0,255, 13, 2,233, 1, 98, 1, +165,254, 91,254,158,254,159,254, 91, 1,164, 3,197,254,172,236,236, 1, 84,253, 26,195,254,228, 1, 28,195, 0,255,255, 0,103, +255,227, 6,195, 5,240, 16, 38, 0, 50,244, 0, 16, 7, 2, 99, 6, 72, 0, 11,255,255, 0,118,255,227, 4,211, 4,235, 16, 39, + 2, 99, 4, 88, 0, 11, 16, 6, 0, 82, 5, 0, 0, 2, 0,115,255,227, 6,207, 5,240, 0, 10, 0, 30, 0, 0, 1, 34, 0, 17, + 16, 0, 51, 50, 55, 17, 38, 1, 17, 52, 38, 35, 17, 6, 33, 32, 0, 16, 0, 33, 50, 23, 33, 50, 22, 25, 1, 3, 39,220,254,253, + 1, 3,220,175,128,138, 2, 57,110,122,188,254,198,254,197,254,135, 1,121, 1, 59,112, 97, 1, 39,227,205, 5, 76,254,184,254, +229,254,230,254,184,164, 3,125,164,250,180, 3,211,194,150,251,139,211, 1,164, 2,196, 1,165, 27,244,254,242,252, 45, 0, 0, + 0, 2, 0,113,254, 86, 5, 89, 4,123, 0, 9, 0, 30, 0, 0, 1, 38, 7, 6, 16, 22, 32, 55, 17, 38, 1, 17, 52, 38, 35, 17, + 6, 35, 34, 0, 17, 16, 0, 51, 50, 23, 51, 50, 22, 21, 17, 2,115,147, 87, 86,171, 1, 42, 44, 44, 1,153, 76,105,137,240,241, +254,239, 1, 17,241,100, 82,216,181,163, 3,223, 2,117,116,254,110,231, 89, 2,168, 95,250,119, 4,116,153, 97,252,188,157, 1, + 57, 1, 19, 1, 20, 1, 56, 27,192,214,251,140, 0, 2,255,151, 0, 0, 4,241, 5,213, 0, 8, 0, 28, 0, 58, 64, 24, 1,149, + 16, 0,149, 9,129, 18, 16, 10, 8, 2, 4, 0, 5, 25, 13, 63, 17, 0, 28, 9, 4, 29, 16,252,236, 50,252,236, 17, 23, 57, 49, + 0, 47,244,236,212,236, 48, 64, 11, 15, 21, 31, 21, 63, 21, 95, 21,175, 21, 5, 1, 93, 1, 17, 51, 50, 54, 53, 52, 38, 35, 37, + 33, 50, 4, 21, 20, 4, 43, 1, 17, 35, 17, 34, 6, 29, 1, 35, 53, 52, 54, 1,247,254,141,154,154,141,254, 56, 1,200,251, 1, + 1,254,255,251,254,202,132,118,156,192, 5, 47,253,207,146,135,134,146,166,227,219,221,226,253,168, 5, 48, 95,105, 49, 70,181, +163, 0, 0, 0, 0, 2, 0,184,254, 86, 4,164, 6, 20, 0, 24, 0, 36, 0, 79, 64, 36, 35,185, 0, 23, 29,185, 14, 17,184, 23, +140, 1,189, 37, 3, 12, 9,169, 6,151, 37, 26, 18, 20, 71, 6, 9, 3, 7, 32, 12, 0, 8, 2, 70, 37, 16,252,236, 50, 50,204, + 17, 57, 57,244,236, 49, 0, 16,244,236, 57, 57, 16,228,228,244,196,236, 16,196,238, 48, 64, 9, 96, 39,128, 39,160, 39,224, 39, + 4, 1, 93, 37, 17, 35, 3, 52, 54, 59, 1, 21, 35, 34, 6, 29, 1, 62, 1, 51, 50, 0, 17, 16, 2, 35, 34, 38, 1, 52, 38, 35, + 34, 6, 21, 20, 22, 51, 50, 54, 1,115,185, 1,163,181,254,231,105, 76, 58,177,123,204, 0,255,255,204,123,177, 2, 56,167,146, +146,167,167,146,146,167,168,253,174, 6, 40,214,192,156, 97,153,200,100, 97,254,188,254,248,254,248,254,188, 97, 1,235,203,231, +231,203,203,231,231, 0, 0, 0, 0, 2, 0,201,254, 86, 4,166, 5,213, 0, 29, 0, 38, 0, 0, 19, 51, 17, 51, 50, 4, 16, 7, + 6, 7, 22, 23, 19, 22, 23, 22, 59, 1, 21, 35, 34, 39, 38, 39, 3, 38, 43, 1, 17, 35, 1, 51, 50, 54, 16, 38, 43, 1, 17,201, +202,254,251, 1, 1,129,101,178, 10, 9,144, 54, 39, 42, 76, 59, 98,127, 71, 74, 78,153, 21, 46,119,202, 1, 2,198,141,154,153, +142,254, 5,213,254,248,225,254, 72,113, 89, 19, 20, 23,254,146,136, 34, 36,154, 61, 63,198, 1,133, 53,254,174, 1,248,146, 1, + 12,145,253,209, 0, 1, 0, 69,255,227, 4, 96, 5,240, 0, 39, 0, 0, 19, 62, 1, 51, 50, 4, 21, 20, 6, 15, 1, 14, 1, 21, + 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 32, 36, 53, 52, 54, 63, 1, 62, 1, 53, 52, 38, 35, 34, 6, 7,159,114,218,105,245, 1, + 23,202,226,123,154,135,188,173,114,236,123,128,239,106,254,231,254,221,215,226,122,166,119,179,165, 95,204,115, 5,164, 38, 38, +228,198,171,192, 45, 24, 31,124,110,126,136, 70, 69,208, 47, 48,224,217,182,217, 43, 25, 31,101, 99,118,128, 54, 55, 0, 0, 0, + 0, 1, 0,100,255,227, 3,188, 4,123, 0, 39, 0,207, 64, 17, 10, 30, 29, 9, 13, 33, 20, 33, 8, 6, 13, 8, 0, 82, 26, 69, + 40, 16,252,228,236,212,236,196, 17, 18, 57, 57, 57, 57, 49, 64, 25, 30, 29, 10, 9, 4, 19, 0,134, 39,137, 36, 20,134, 19,137, + 16,185, 23, 36,185, 3,184, 23,140, 40, 0, 16,228,244,236, 16,254,245,238, 16,245,238, 18, 23, 57, 48, 64, 18, 27, 28, 2, 26, + 29, 83, 9, 10, 32, 31, 2, 33, 30, 83, 10, 10, 9, 66, 75, 83, 88, 7, 16, 14,237, 17, 23, 57, 7, 14,237, 17, 23, 57, 89, 34, +178, 0, 1, 1, 1, 93, 64, 17, 47, 41, 63, 41, 95, 41,127, 41,128, 41,144, 41,160, 41,240, 41, 8, 93, 64, 37, 32, 0, 32, 39, + 36, 38, 40, 30, 40, 29, 42, 21, 47, 20, 47, 19, 42, 18, 40, 10, 40, 9, 41, 8, 41, 7, 36, 1,134, 30,134, 29,134, 28,134, 27, + 18, 0, 93, 64, 23, 28, 30, 28, 29, 28, 28, 46, 31, 44, 30, 44, 29, 44, 28, 59, 31, 59, 30, 59, 29, 59, 28, 11,113, 19, 62, 1, + 51, 50, 22, 21, 20, 6, 15, 1, 14, 1, 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 53, 52, 54, 63, 1, 62, 1, 53, 52, + 38, 35, 34, 6, 7,160, 76,180,102,206,224,152,171, 64,171,101,140,130, 97,198,102,108,195, 90,216,247,165,196, 63,148, 98,137, +137, 90,168, 78, 4, 63, 30, 30,172,158,130,149, 36, 15, 37, 80, 75, 81, 89, 53, 53,190, 35, 35,182,156,137,153, 42, 14, 33, 73, + 64, 84, 84, 40, 40, 0, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 16, 6, 2,193, 0, 0, 0, 2,254,242,254, 86, 2,215, + 6, 20, 0, 8, 0, 33, 0, 0, 19, 38, 39, 38, 35, 34, 7, 6, 51, 5, 3, 20, 23, 22, 59, 1, 21, 35, 34, 39, 38, 53, 17, 35, + 32, 53, 52, 33, 50, 23, 22, 23, 51, 21,180, 7, 18, 33,110,124, 3, 3,119, 1,120, 2, 39, 37,100,176,174,195, 81, 87,190,254, +242, 1, 47,181, 82, 53, 18,191, 5, 4, 45, 23, 48, 65, 51,154,251, 61,103, 41, 40,153, 86, 92,180, 4,174,210,216, 96, 64,111, +155, 0, 0, 0, 0, 1, 0, 55,254, 86, 2,242, 5,158, 0, 29, 0, 0, 1, 17, 33, 21, 33, 17, 20, 22, 59, 1, 21, 20, 6, 43, + 1, 53, 51, 50, 54, 61, 1, 35, 34, 38, 53, 17, 35, 53, 51, 17, 1,119, 1,123,254,133, 75,115,189,164,180, 70, 48,106, 76, 5, +213,162,135,135, 5,158,254,194,143,253,160,137, 78,174,214,192,156, 97,153, 20,159,210, 2, 96,143, 1, 62, 0, 0, 1, 0, 24, + 0, 0, 4,233, 5,213, 0, 15, 0, 88, 64, 21, 13, 10, 12, 6, 2,149, 0,129, 4, 0, 7, 1, 64, 3, 28, 5, 11, 28, 13, 5, + 16, 16,212,212,236, 16,252,228, 57, 57, 49, 0, 47,244,236, 50,196, 57, 57, 48, 1, 75,176, 10, 84, 88,189, 0, 16, 0, 64, 0, + 1, 0, 16, 0, 16,255,192, 56, 17, 55, 56, 89, 64, 19, 0, 17, 31, 0, 16, 1, 16, 2, 31, 7, 16, 17, 64, 17,112, 17,159, 17, + 9, 93, 1, 33, 21, 33, 17, 35, 17, 35, 34, 6, 29, 1, 35, 53, 52, 54, 1,174, 3, 59,253,238,203, 94,132,118,156,192, 5,213, +170,250,213, 5, 43, 90,105, 49, 70,181,163, 0, 0, 1, 0, 55, 0, 0, 2,242, 6, 20, 0, 27, 0, 73, 64, 16, 25, 22, 11, 8, + 4, 23, 9, 2, 4, 0, 8, 16, 19, 14, 70, 28, 16,252, 60,196,252, 60,196, 50, 50, 23, 57, 49, 0, 64, 19, 19, 0, 25,135, 22, +151, 10, 14, 5, 8, 15, 3,169, 17, 1,188, 8,135, 10, 47,236,244, 60,236, 50, 17, 57, 57, 16,244,236, 57, 57, 48,178,175, 21, + 1, 1, 93, 1, 21, 33, 21, 33, 17, 20, 22, 59, 1, 21, 35, 34, 38, 53, 17, 35, 53, 51, 53, 52, 54, 59, 1, 21, 35, 34, 6, 1, +119, 1,123,254,133, 75,115,189,189,213,162,135,135,174,189,174,176, 99, 77, 4,195, 99,143,253,160,137, 78,154,159,210, 2, 96, +143, 78,187,171,153, 81, 0, 0, 0, 1,255,250,254,102, 4,233, 5,213, 0, 15, 0, 84, 64, 20, 7,149, 10,189, 16, 14, 2,149, + 0,129, 16, 8, 1, 64, 3, 28, 0, 64, 13, 16, 16,212,228,252,228,196, 49, 0, 16,244,236, 50, 16,244,236, 48, 1, 75,176, 10, + 84, 88,189, 0, 16, 0, 64, 0, 1, 0, 16, 0, 16,255,192, 56, 17, 55, 56, 89, 64, 19, 0, 17, 31, 0, 16, 1, 16, 2, 31, 15, + 16, 17, 64, 17,112, 17,159, 17, 17, 93, 3, 33, 21, 33, 17, 20, 22, 59, 1, 21, 35, 34, 38, 25, 1, 33, 6, 4,239,253,238,110, +134, 63, 78,227,205,253,238, 5,213,170,251, 61,194,150,170,244, 1, 14, 4,195,255,255, 0,173,255,247, 6, 95, 5,233, 16, 38, + 0, 56,251, 20, 16, 7, 2, 99, 5,228, 0, 11,255,255, 0,176,255,227, 5,105, 4,235, 16, 39, 2, 99, 4,238, 0, 11, 16, 6, + 0, 88, 2, 0, 0, 1, 0, 78,255,227, 5,207, 5,202, 0, 31, 0, 58, 64, 16, 3, 6, 25, 40, 16, 0, 28, 51, 22, 15, 12, 25, + 18, 22, 16, 32, 16,252,196,252,196, 16,244,196,236,252,196, 49, 0, 64, 14, 19, 15, 31, 3,149, 2, 16,129, 32, 9,149, 25,140, + 32, 16,244,236, 16,252, 60,236, 50, 50, 50, 48, 1, 53, 33, 21, 22, 18, 21, 20, 0, 35, 34, 0, 53, 52, 18, 55, 53, 33, 21, 33, + 6, 2, 21, 16, 0, 33, 32, 0, 17, 52, 2, 39, 5,207,253,168,177,198,254,248,216,216,254,247,199,178,253,168, 1, 63,158,145, + 1,127, 1, 49, 1, 47, 1,129,142,161, 5, 24,178,178, 97,254,180,202,240,254,222, 1, 35,239,202, 1, 76, 97,178,178,139,254, +214,184,254,194,254,118, 1,137, 1, 53,194, 1, 40,141, 0, 0, 0, 1, 0,201,255,254, 5,118, 5,213, 0, 26, 0, 0, 37, 35, + 34, 38, 53, 17, 35, 17, 16, 23, 22, 31, 1, 32, 0, 17, 52, 2, 47, 1, 21, 22, 23, 22, 21, 20, 0, 2,198, 63,134,110,202,103, + 97,232, 77, 1, 47, 1,129,142,161,179,110, 65, 99,254,248,170,150,194, 3,211,252, 45,254,242,122,116, 6, 2, 1,137, 1, 53, +194, 1, 40,141, 1, 68, 87,109,166,202,240,254,222, 0, 0, 0, 0, 1,255,252, 0, 0, 5,220, 5,237, 0, 16, 0, 0, 9, 1, + 54, 55, 54, 23, 5, 7, 39, 6, 7, 1, 17, 35, 17, 1, 51, 2,115, 1, 72, 52, 49, 66,109, 1, 13, 78,198, 85, 38,254,138,203, +253,240,217, 3,111, 1,235, 78, 40, 54, 49,122,135,101, 6, 57,253,205,253, 57, 2,199, 3, 14, 0, 1, 0, 61,254, 86, 5,150, + 4,112, 0, 23, 0, 0, 5, 14, 1, 43, 1, 53, 51, 50, 54, 63, 1, 1, 51, 9, 1, 54, 55, 54, 31, 1, 7, 39, 38, 7, 2,147, + 78,148,124,147,108, 76, 84, 51, 33,254, 59,195, 1, 94, 1, 23, 50, 81, 97,101,215, 53,195, 81, 28,104,200,122,154, 72,134, 84, + 4, 78,252,148, 2,187,126, 41, 50, 48,101,147, 94, 39, 69, 0, 0, 1, 0, 92, 0, 0, 5, 31, 5,213, 0, 17, 0, 0, 19, 33, + 21, 1, 33, 21, 33, 1, 33, 21, 33, 53, 1, 33, 53, 33, 1, 33,115, 4,149,254,112, 1, 25,254,115,254, 84, 3,199,251, 61, 1, +185,254,213, 1,159, 1,131,252,103, 5,213,154,254, 17,144,253,238,170,154, 2, 34,144, 1,223, 0, 1, 0, 88, 0, 0, 3,219, + 4, 96, 0, 17, 0, 0, 19, 33, 21, 3, 51, 21, 33, 1, 33, 21, 33, 53, 1, 35, 53, 33, 1, 33,113, 3,106,251,194,254,194,254, +195, 2,180,252,125, 1, 43,212, 1, 80, 1, 13,253,101, 4, 96,168,254,220,144,254,143,147,168, 1, 92,144, 1, 57, 0, 0, 0, + 0, 1, 0,160,255,193, 4,248, 5,213, 0, 37, 0, 0, 37, 50, 55, 54, 53, 52, 39, 38, 43, 1, 53, 1, 33, 53, 33, 21, 1, 50, + 23, 22, 23, 22, 21, 20, 15, 1, 6, 7, 6, 33, 34, 39, 38, 39, 53, 22, 23, 22, 2,168,192, 99,100, 92, 93,165,174, 1,129,252, +252, 4, 0,254,101,106,128, 98, 86, 81, 59, 28, 20, 45,152,254,232,119,125,126,134,106,127,126,107, 75, 75,143,134, 73, 74,166, + 1,220,170,168,254, 36, 56, 42,109,104,138,151, 85, 41, 29, 36,121, 19, 18, 37,195, 49, 25, 25, 0, 1, 0, 92,255,193, 4,180, + 5,213, 0, 37, 0, 0, 37, 50, 55, 54, 55, 21, 6, 7, 6, 35, 32, 39, 38, 47, 1, 38, 53, 52, 55, 54, 55, 54, 51, 1, 53, 33, + 21, 33, 1, 21, 35, 34, 7, 6, 21, 20, 23, 22, 2,172,137,126,127,106,134,126,125,119,254,232,152, 45, 20, 28, 59, 81, 86, 98, +128,106,254,101, 4, 0,252,252, 1,129,174,165, 93, 92,100, 99,107, 25, 25, 49,195, 37, 18, 19,121, 36, 29, 41, 85,151,138,104, +109, 42, 56, 1,220,168,170,254, 36,166, 74, 73,134,143, 75, 75, 0, 1, 0,104,254, 76, 4, 63, 4, 96, 0, 36, 0, 0, 1, 34, + 7, 6, 7, 6, 21, 20, 31, 1, 22, 23, 22, 33, 50, 55, 54, 55, 53, 14, 1, 35, 34, 39, 38, 53, 52, 55, 54, 59, 1, 53, 1, 33, + 53, 33, 21, 2, 91,106,128, 98, 86, 81, 59, 28, 28, 37,152, 1, 24, 94, 99,100,106, 84,200,109,190, 99,100, 92, 93,165,174,254, + 82, 2,155,252,150, 1,220, 56, 42,109,104,138,138, 98, 41, 36, 29,121, 18, 19, 37,195, 49, 50, 75, 75,143,132, 75, 74,166, 1, +243,147,168, 0, 0, 1, 0,113,254, 86, 3,232, 4, 96, 0, 31, 0, 0, 1, 50, 55, 54, 55, 21, 6, 7, 6, 35, 32, 17, 52, 37, + 36, 53, 52, 35, 33, 1, 33, 53, 33, 21, 1, 32, 21, 16, 5, 6, 21, 20, 2,127, 84, 77, 79, 81, 87, 80, 86, 97,254, 32, 1,150, + 1, 28,235,254,222, 1,229,253,101, 3,106,254,158, 1,111,254, 48,226,254,238, 21, 21, 44,179, 32, 13, 14, 1, 25,238, 53, 37, + 98,124, 2, 56,147,168,254,100,229,254,236, 49, 24, 97,139, 0, 0, 1, 0,150, 0, 0, 4, 74, 5,240, 0, 34, 0, 0, 37, 33, + 21, 33, 53, 1, 55, 33, 53, 33, 54, 55, 54, 53, 52, 38, 35, 34, 6, 7, 53, 62, 1, 51, 50, 4, 21, 20, 7, 6, 7, 51, 21, 35, + 7, 1,137, 2,193,252, 76, 1, 58,115,254,167, 1,226, 95, 37, 39,167,134, 95,211,120,122,212, 88,232, 1, 20, 34, 31, 74,104, +236, 48,170,170,170, 1, 64,117,144,109, 72, 76, 73,119,150, 66, 67,204, 49, 50,232,194, 92, 82, 73, 96,144, 49, 0, 1, 0, 93, +255,193, 4,249, 5,213, 0, 40, 0, 0, 1, 50, 23, 22, 23, 22, 21, 20, 15, 1, 6, 7, 6, 33, 32, 39, 38, 47, 1, 38, 53, 51, + 20, 23, 22, 32, 55, 54, 53, 52, 39, 38, 35, 33, 21, 35, 17, 33, 21, 33, 17, 3, 6,104,130, 99, 85, 81, 59, 28, 20, 45,152,254, +232,254,220,152, 45, 20, 28, 59,201,100, 99, 1,124, 99,100, 92, 93,165,254,193,202, 3,161,253, 41, 3, 81, 56, 43,108,104,138, +151, 85, 41, 29, 36,121,121, 36, 29, 41, 85,151,143, 75, 75, 75, 75,143,134, 73, 74, 1, 3, 45,170,254, 37, 0, 0, 1, 0,104, +254, 76, 4, 63, 4, 96, 0, 37, 0, 0, 1, 50, 23, 22, 23, 22, 21, 20, 15, 1, 6, 7, 6, 33, 34, 39, 38, 39, 53, 30, 1, 51, + 50, 55, 54, 53, 52, 39, 38, 35, 33, 53, 51, 19, 33, 21, 33, 3, 2, 76,105,129, 99, 85, 81, 59, 28, 20, 45,152,254,232, 94, 99, +100,106, 84,200,109,190, 99,100, 92, 93,165,254,158, 1, 3, 3, 22,253,162, 3, 1,220, 56, 43,108,104,138,151, 85, 41, 29, 36, +121, 18, 19, 37,195, 49, 50, 75, 75,143,134, 73, 74,168, 2,132,170,254, 38, 0, 0, 1, 0, 88,255,227, 3,165, 5,158, 0, 36, + 0, 0, 1, 7, 22, 23, 22, 21, 20, 7, 6, 33, 34, 39, 38, 39, 53, 22, 23, 22, 51, 50, 55, 54, 55, 52, 39, 38, 43, 1, 19, 35, + 53, 51, 17, 51, 17, 51, 21, 2, 33, 2,170,112,108,110,137,254,237, 85, 81, 81, 76, 73, 84, 78, 80,179, 99, 57, 1, 58, 86,192, + 62, 2,229,229,202,231, 3,230,125, 30,119,115,170,186,125,157, 18, 17, 35,172, 40, 24, 22,114, 65,133, 98, 76,114, 1, 15,164, + 1, 20,254,236,164, 0, 0, 0, 0, 2, 0,186,254, 86, 4,164, 4,123, 0, 14, 0, 23, 0, 0, 5, 17, 35, 17, 51, 21, 54, 55, + 54, 51, 50, 23, 22, 21, 16, 1, 0, 53, 52, 39, 38, 35, 34, 7, 1,115,185,185, 52,135, 81,210,184, 77, 78,252,207, 2,114, 57, + 56,120,220,173,122,254,208, 6, 10,170, 66, 82, 49,112,113,153,254, 87,254,228, 1,144,249,133, 66, 65,239, 0, 0, 1, 0,201, +254, 86, 1,147, 5,213, 0, 3, 0, 0, 19, 51, 17, 35,201,202,202, 5,213,248,129, 0, 0, 0,255,255, 0,201,254, 86, 3, 39, + 5,213, 16, 39, 1,130, 1,148, 0, 0, 16, 6, 1,130, 0, 0, 0, 1, 0, 20,254, 86, 3,156, 5,213, 0, 19, 0, 0, 1, 51, + 17, 33, 21, 33, 21, 33, 21, 33, 17, 35, 17, 33, 53, 33, 53, 33, 53, 33, 1,115,202, 1, 95,254,161, 1, 95,254,161,202,254,161, + 1, 95,254,161, 1, 95, 5,213,253,151,168,240,170,253, 44, 2,212,170,240,168,255,255, 0,201, 0, 0, 1,148, 5,213, 16, 6, + 0, 4,148, 0,255,255, 0,201, 0, 0, 10,208, 5,213, 16, 39, 1, 63, 5,177, 0, 0, 16, 6, 0, 39, 0, 0,255,255, 0,201, + 0, 0, 9,176, 6,102, 16, 39, 1, 64, 5,213, 0, 0, 16, 6, 0, 39, 0, 0,255,255, 0,113,255,227, 8,145, 6,102, 16, 39, + 1, 64, 4,182, 0, 0, 16, 6, 0, 71, 0, 0,255,255, 0,201,254,102, 6, 36, 5,213, 16, 39, 0, 45, 4,145, 0, 0, 16, 6, + 0, 47, 0, 0,255,255, 0,201,254, 86, 5,222, 6, 20, 16, 39, 0, 77, 4,101, 0, 0, 16, 6, 0, 47, 0, 0,255,255, 0,193, +254, 86, 2,239, 6, 20, 16, 39, 0, 77, 1,118, 0, 0, 16, 6, 0, 79, 0, 0,255,255, 0,201,254,102, 6,242, 5,213, 16, 39, + 0, 45, 5, 95, 0, 0, 16, 6, 0, 49, 0, 0,255,255, 0,201,254, 86, 6,183, 6, 20, 16, 39, 0, 77, 5, 62, 0, 0, 16, 6, + 0, 49, 0, 0,255,255, 0,186,254, 86, 5,222, 6, 20, 16, 39, 0, 77, 4,101, 0, 0, 16, 6, 0, 81, 0, 0,255,255, 0, 16, + 0, 0, 5,104, 5,213, 18, 38, 0, 36, 0, 0, 17, 7, 6,137, 4,190, 1,117, 0, 6,177, 14, 0, 16, 60, 49,255,255, 0,123, +255,227, 4, 45, 6,102, 18, 38, 0, 68, 0, 0, 17, 6, 2, 32, 90, 0, 0, 8,180, 11, 43, 39, 20, 7, 43, 49,255,255, 0,201, + 0, 0, 1,147, 5,213, 18, 38, 0, 44, 0, 0, 17, 7, 6,137, 3, 47, 1,117, 0, 11,180, 7, 32, 1, 0, 0, 16, 73, 99, 58, + 49, 0, 0, 0,255,255,255,224, 0, 0, 2, 94, 6,102, 18, 38, 0,243, 0, 0, 17, 7, 2, 32,255, 31, 0, 0, 0, 11,180, 7, + 32, 1, 0, 0, 16, 73, 99, 58, 49, 0, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 38, 0, 50, 0, 0, 16, 7, 6,137, + 5, 39, 1,117,255,255, 0,113,255,227, 4,117, 6,102, 18, 38, 0, 82, 0, 0, 17, 6, 2, 32,118, 0, 0, 6,177, 27, 12, 16, + 60, 49, 0, 0,255,255, 0,178,255,227, 5, 41, 5,213, 18, 38, 0, 56, 0, 0, 17, 7, 6,137, 4,246, 1,117, 0, 6,177, 21, + 5, 16, 60, 49,255,255, 0,174,255,227, 4, 88, 6,102, 18, 38, 0, 88, 0, 0, 17, 6, 2, 32,118, 0, 0, 11,180, 23, 32, 11, + 1, 1, 16, 73, 99, 58, 49, 0,255,255, 0,178,255,227, 5, 41, 5,213, 16, 38, 6,143, 48, 0, 18, 2, 0, 56, 0, 0, 0, 0, +255,255, 0,174,255,227, 4, 88, 7, 49, 16, 39, 0,113, 0,123, 1, 59, 18, 6, 0,190, 0, 0,255,255, 0,178,255,227, 5, 41, + 5,213, 16, 38, 0, 56, 0, 0, 16, 6, 6,146, 54, 0, 0, 0,255,255, 0,174,255,227, 4, 88, 4, 96, 16, 38, 0, 88, 0, 0, + 16, 7, 6,146,255,190,254,200,255,255, 0,178,255,227, 5, 41, 5,213, 16, 38, 0, 56, 0, 0, 16, 6, 6,151, 48, 0, 0, 0, +255,255, 0,174,255,227, 4, 88, 4, 96, 16, 38, 0, 88, 0, 0, 16, 7, 6,151,255,196,254,200,255,255, 0,178,255,227, 5, 41, + 5,213, 16, 38, 0, 56, 0, 0, 16, 6, 6,147, 48, 6, 0, 0,255,255, 0,174,255,227, 4, 88, 4, 96, 16, 38, 0, 88, 0, 0, + 16, 7, 6,147,255,190,254,200,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 16, 6, 2, 4, 0, 0,255,255, 0, 16, 0, 0, 5,104, + 5,213, 18, 34, 0, 36, 0, 0, 16, 6, 6,143, 0, 0, 0, 0,255,255, 0,123,255,227, 4, 45, 7, 49, 18, 38, 0,166, 0, 0, + 16, 7, 0,113, 0, 82, 1, 59,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, 0, 36, 0, 0, 16, 6, 6,145, 0, 0, 0, 0, +255,255, 0,123,255,227, 4, 45, 4,123, 18, 34, 0, 68, 0, 0, 16, 7, 6,145,255,147,254,193,255,255, 0, 8, 0, 0, 7, 72, + 7, 52, 16, 39, 0,113, 2,215, 1, 62, 18, 6, 0,136, 0, 0,255,255, 0,123,255,227, 7,111, 5,242, 16, 39, 0,113, 1,232, +255,252, 18, 6, 0,168, 0, 0, 0, 1, 0,115,255,227, 6, 4, 5,240, 0, 37, 0, 0, 1, 21, 6, 4, 35, 32, 0, 17, 16, 0, + 33, 50, 4, 23, 21, 46, 1, 35, 32, 0, 17, 16, 0, 33, 50, 54, 55, 53, 35, 53, 51, 53, 33, 53, 33, 17, 51, 21, 5,139,117,254, +230,160,254,162,254,117, 1,139, 1, 94,146, 1, 7,111,112,252,139,254,238,254,237, 1, 19, 1, 18,107,168, 67,253,253,254,182, + 2, 18,121, 1,138,255, 83, 85, 1,153, 1,109, 1,110, 1,153, 72, 70,215, 95, 96,254,206,254,209,254,210,254,206, 37, 39,181, + 88,132,166,254,214, 88, 0, 0, 0, 2, 0,113,254, 86, 4,250, 4,123, 0, 11, 0, 52, 0, 0, 1, 52, 38, 35, 34, 6, 21, 20, + 22, 51, 50, 54, 3, 54, 61, 1, 14, 1, 35, 34, 2, 17, 16, 18, 51, 50, 22, 23, 53, 51, 17, 20, 7, 51, 21, 35, 6, 7, 6, 33, + 34, 38, 39, 53, 30, 1, 51, 50, 55, 54, 55, 5, 53, 3,162,165,149,148,165,165,148,149,165, 22, 22, 57,178,124,206,252,252,206, +124,178, 57,184, 19,179,198, 31, 58,127,254,250, 97,172, 81, 81,158, 82,181, 90, 21, 17,253,132, 2, 61,200,220,220,200,199,220, +220,254, 79, 71, 94, 91, 99, 98, 1, 58, 1, 3, 1, 4, 1, 58, 98, 99,170,252, 43,110, 88, 70, 93, 64,140, 29, 30,179, 44, 42, + 95, 23, 28, 1, 70, 0, 0, 0,255,255, 0,115,255,227, 5,139, 5,240, 18, 34, 0, 42, 0, 0, 17, 7, 6,137, 5, 74, 1,117, + 0, 16,177, 33, 14, 16, 60, 64, 7,148, 33, 84, 33, 36, 33, 3, 93, 49, 0, 0,255,255, 0,113,254, 86, 4, 90, 6, 99, 16, 34, + 2, 32, 74,253, 18, 2, 0, 74, 0, 0, 0, 0,255,255, 0,201, 0, 0, 5,106, 5,213, 16, 39, 6,137, 4,162, 1,117, 18, 2, + 0, 46, 0, 0,255,255, 0,186, 0, 0, 4,156, 6, 20, 18, 34, 0, 78, 0, 0, 17, 7, 6,137, 3, 26, 1,117, 0, 42,180, 1, + 16, 12, 0, 7, 43, 49, 0, 75,176, 14, 81, 88,187, 0, 1,255,192, 0, 0,255,192, 56, 56, 89, 64, 13,144, 1,144, 0,128, 1, +128, 0, 64, 1, 64, 0, 6, 93,255,255, 0,115,254,101, 5,217, 5,240, 16, 39, 2, 52, 1, 52,255,240, 18, 6, 0, 50, 0, 0, +255,255, 0,113,254,101, 4,117, 4,123, 16, 39, 2, 52, 0,128,255,240, 18, 6, 0, 82, 0, 0,255,255, 0,115,254,101, 5,217, + 7, 49, 16, 39, 0,113, 1, 39, 1, 59, 18, 6, 1,172, 0, 0,255,255, 0,113,254,101, 4,117, 5,245, 16, 38, 0,113,115,255, + 18, 6, 1,173, 0, 0, 0, 0,255,255, 0,160,255,193, 4,248, 5,213, 16, 39, 6,137, 4,190, 1,117, 18, 2, 1,121, 0, 0, +255,255, 0,220, 4,238, 3, 90, 6,102, 16, 38, 2, 32, 27, 0, 16, 6, 2, 8, 0, 0, 0, 0,255,255,255,219,254, 86, 2,100, + 6,102, 16, 39, 2, 32,255, 37, 0, 0, 17, 6, 1,249, 0, 0, 0, 11,180, 3, 32, 8, 7, 7, 16, 73, 99, 58, 49, 0, 0, 0, +255,255, 0,201, 0, 0, 10,208, 5,213, 16, 39, 0, 61, 5,177, 0, 0, 16, 6, 0, 39, 0, 0,255,255, 0,201, 0, 0, 9,176, + 5,213, 16, 39, 0, 93, 5,213, 0, 0, 16, 6, 0, 39, 0, 0,255,255, 0,113,255,227, 8,145, 6, 20, 16, 39, 0, 93, 4,182, + 0, 0, 16, 6, 0, 71, 0, 0,255,255, 0,115,255,227, 5,139, 7,107, 18, 34, 0, 42, 0, 0, 16, 67, 0,118, 1, 22, 2,240, + 64, 0, 44,204,255,255, 0,113,254, 86, 4, 90, 6, 99, 18, 34, 0, 74, 0, 0, 16, 2, 0,118, 27,253, 0, 0, 0, 1, 0,201, +255,227, 8, 45, 5,213, 0, 29, 0, 0, 1, 17, 20, 7, 6, 33, 32, 39, 38, 53, 17, 33, 17, 35, 17, 51, 17, 33, 17, 51, 17, 20, + 23, 22, 23, 50, 55, 54, 53, 17, 8, 45,100, 96,254,230,254,237,103,100,253, 34,202,202, 2,222,202, 62, 61,153,148, 66, 62, 4, + 96,253, 90,223,128,120,120,118,233, 1, 13,253, 57, 5,213,253,156, 2,100,251,236,159, 80, 78, 1, 79, 75,164, 2,159, 0, 0, + 0, 2, 0,201,254, 86, 5, 2, 5,240, 0, 14, 0, 23, 0, 0, 37, 17, 35, 17, 51, 21, 54, 55, 54, 51, 50, 23, 22, 21, 16, 1, + 0, 17, 52, 39, 38, 35, 34, 3, 1,147,202,202, 56,145, 87,226,198, 83, 84,252,145, 2,161, 61, 60,129,237,186,156,253,186, 7, +127,185, 72, 87, 53,120,122,164,254, 55,254,206, 1,174, 1, 12,143, 71, 70,254,255, 0, 0, 0,255,255, 0,201, 0, 0, 5, 51, + 5,213, 16, 39, 6,135, 5, 30, 1,117, 18, 2, 0, 49, 0, 0,255,255, 0,186, 0, 0, 4,100, 6,100, 18, 34, 0, 81, 0, 0, + 16, 3, 0, 67, 1, 24,255,254,255,255, 0, 16, 0, 0, 5,104, 7,109, 16, 34, 0,135, 0, 0, 16, 7, 6,133, 6, 92, 1,125, +255,255, 0,123,255,227, 4, 45, 7, 6, 16, 34, 0,167, 0, 0, 16, 7, 6,133, 5,236, 1,125,255,255, 0, 8, 0, 0, 7, 72, + 5,213, 16, 39, 6,133, 6, 92, 1,118, 18, 2, 0,136, 0, 0,255,255, 0,123,255,227, 7,111, 6, 99, 18, 34, 0,168, 0, 0, + 16, 3, 0,118, 1,101,255,253,255,255, 0,102,255,186, 5,229, 6, 23, 16, 39, 6,133, 4,254, 1,118, 18, 2, 0,154, 0, 0, +255,255, 0, 72,255,162, 4,156, 6, 99, 18, 34, 0,186, 0, 0, 16, 2, 0,118, 28,253, 0, 0,255,255, 0, 16, 0, 0, 5,104, + 5,213, 18, 34, 0, 36, 0, 0, 16, 7, 6,142, 4,229, 1,122,255,255, 0,123,255,227, 4, 45, 6,100, 16, 35, 2, 87, 4,152, +255,254, 18, 2, 0, 68, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, 0, 36, 0, 0, 16, 7, 6,138, 4,188, 1, 62, +255,255, 0,123,255,227, 4, 45, 6, 72, 16, 35, 2, 89, 4,101, 0, 0, 18, 6, 0, 68, 0, 0,255,255, 0,201, 0, 0, 4,139, + 5,213, 18, 34, 0, 40, 0, 0, 16, 7, 6,142, 4,165, 1,122,255,255, 0,113,255,227, 4,127, 6, 99, 16, 35, 2, 87, 4,186, +255,253, 18, 2, 0, 72, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 7, 6,138, 4,166, 1, 62, +255,255, 0,113,255,227, 4,127, 6, 72, 16, 35, 2, 89, 4,169, 0, 0, 18, 2, 0, 72, 0, 0,255,255, 0,201, 0, 0, 1,147, + 5,213, 18, 34, 0, 44, 0, 0, 16, 7, 6,142, 3, 89, 1,122,255,255,255,195, 0, 0, 2,129, 6, 99, 16, 35, 2, 87, 3,102, +255,253, 18, 2, 0,243, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 18, 34, 0, 44, 0, 0, 16, 7, 6,138, 3, 62, 1, 62, +255,255,255,227, 0, 0, 2, 86, 6, 72, 16, 35, 2, 89, 3, 36, 0, 0, 18, 2, 0,243, 0, 0,255,255, 0,115,255,227, 5,217, + 5,240, 18, 34, 0, 50, 0, 0, 16, 7, 6,142, 5, 65, 1,122,255,255, 0,113,255,227, 4,117, 6,100, 16, 35, 2, 87, 4,159, +255,254, 18, 2, 0, 82, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 7, 6,138, 5, 28, 1, 62, +255,255, 0,113,255,227, 4,117, 6, 72, 16, 35, 2, 89, 4,152, 0, 0, 18, 2, 0, 82, 0, 0,255,255, 0,201, 0, 0, 5, 84, + 5,213, 18, 34, 0, 53, 0, 0, 16, 7, 6,142, 4,121, 1,122,255,255, 0,130, 0, 0, 3, 74, 6, 99, 16, 35, 2, 87, 4, 37, +255,253, 18, 2, 0, 85, 0, 0,255,255, 0,201, 0, 0, 5, 84, 5,213, 18, 34, 0, 53, 0, 0, 16, 7, 6,138, 4,128, 1, 62, +255,255, 0,186, 0, 0, 3, 94, 6, 72, 16, 35, 2, 89, 4, 45, 0, 0, 18, 2, 0, 85, 0, 0,255,255, 0,178,255,227, 5, 41, + 5,213, 18, 34, 0, 56, 0, 0, 16, 7, 6,142, 5, 21, 1,122,255,255, 0,174,255,227, 4, 88, 6,100, 16, 35, 2, 87, 4,212, +255,254, 18, 2, 0, 88, 0, 0,255,255, 0,178,255,227, 5, 41, 5,213, 18, 34, 0, 56, 0, 0, 16, 7, 6,138, 4,236, 1, 62, +255,255, 0,174,255,227, 4, 88, 6, 72, 16, 35, 2, 89, 4,171, 0, 0, 18, 2, 0, 88, 0, 0,255,255, 0,135,254, 20, 4,162, + 5,240, 16, 39, 2,110, 4,118, 0, 0, 18, 6, 0, 54, 0, 0,255,255, 0,111,254, 20, 3,199, 4,123, 16, 39, 2,110, 4, 44, + 0, 0, 18, 6, 0, 86, 0, 0,255,255,255,250,254, 20, 4,233, 5,213, 16, 39, 2,110, 4, 83, 0, 0, 18, 6, 0, 55, 0, 0, +255,255, 0, 55,254, 20, 2,242, 5,158, 16, 39, 2,110, 4, 0, 0, 0, 18, 6, 0, 87, 0, 0, 0, 1, 0,156,254, 82, 4,115, + 5,240, 0, 49, 0, 0, 19, 54, 55, 54, 55, 54, 53, 52, 38, 35, 34, 15, 1, 53, 55, 54, 55, 54, 53, 52, 39, 38, 7, 34, 7, 6, + 7, 53, 54, 55, 54, 51, 50, 23, 22, 21, 20, 7, 6, 7, 22, 23, 22, 21, 20, 7, 6, 5, 6, 7,156,199,194,165,126, 98,146, 91, + 63, 70,240,248,142,106, 79, 81, 95, 99,105,113, 89,120,119, 96,129,101,192,132,134, 71, 82,120,138, 81, 89,150,130,254,208,218, +181,254,242, 64, 88, 75,121, 94,142,113,134, 31,106,171,106, 61,118, 88,144,123, 53, 63, 1, 58, 46, 80,190, 66, 42, 56,104,105, +178,170, 99,113, 77, 19,109,119,113,218,142,123,129, 92, 40, 0, 0, 1, 0, 71,254, 79, 3,188, 4,123, 0, 50, 0, 0, 19, 54, + 55, 54, 55, 54, 53, 52, 39, 38, 35, 34, 15, 1, 53, 55, 54, 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 7, 53, 54, 55, 54, 51, 50, + 23, 22, 21, 20, 7, 6, 7, 22, 23, 22, 21, 20, 7, 6, 5, 6, 7, 71,178,176,148,114, 88, 66, 65, 82, 57, 63,216,223,124, 99, + 71, 73, 78, 96, 92,104, 79,109, 96, 98,115, 91,171,121,120, 64, 73,108,124, 73, 80,135,120,254,241,196,163,254,209, 51, 72, 60, + 99, 76,115, 91, 55, 54, 25, 86,139, 85, 47, 99, 71,116, 96, 47, 50, 47, 35, 67,154, 48, 39, 46, 85, 85,144,137, 81, 91, 63, 15, + 88, 97, 91,177,115,102,102, 74, 33, 0, 0, 0,255,255, 0,201, 0, 0, 5, 59, 5,213, 16, 39, 6,137, 5, 4, 1,117, 18, 2, + 0, 43, 0, 0,255,255, 0,186, 0, 0, 4,100, 6, 20, 16, 39, 6,137, 3, 33, 1,117, 19, 2, 0, 75, 0, 0, 0, 42,180, 20, + 5, 1, 19, 7, 43, 49, 0, 75,176, 14, 81, 88,187, 0, 20,255,192, 0, 19,255,192, 56, 56, 89, 64, 13,144, 20,144, 19,128, 20, +128, 19, 64, 20, 64, 19, 6, 93, 0, 1, 0,201,254, 86, 5, 25, 5,240, 0, 23, 0, 0, 1, 17, 35, 17, 52, 39, 38, 35, 34, 7, + 6, 21, 17, 35, 17, 51, 21, 54, 55, 54, 51, 50, 23, 22, 5, 25,201, 78, 76,153,179,109,106,202,202, 78,105,105,154,227,116,117, + 3,125,250,217, 5, 41,212,109,107,129,126,222,252,178, 5,213,241,135, 66, 67,159,159, 0, 0, 0, 3, 0,113,255,112, 6, 68, + 6, 20, 0, 7, 0, 40, 0, 52, 0, 0, 37, 22, 51, 50, 53, 52, 39, 34, 7, 54, 51, 50, 21, 16, 33, 34, 39, 6, 7, 35, 54, 55, + 38, 53, 6, 7, 6, 35, 34, 39, 38, 16, 55, 54, 51, 50, 23, 22, 23, 17, 51, 0, 16, 23, 22, 32, 55, 54, 16, 39, 38, 32, 7, 4, +182, 17, 37,160, 52, 52,202,110,136,244,254,170, 73, 53, 34, 24,196, 29, 67, 48, 58, 88, 89,124,203,128,127,127,128,203,124, 89, + 88, 58,184,252,213, 83, 84, 1, 36, 84, 84, 84, 84,254,220, 84,130, 5,175, 45, 1, 32,184,206,254,191, 15, 72, 58, 69,147, 60, + 36,100, 48, 49,162,162, 2, 16,162,162, 49, 48,100, 2, 94,252,230,254,106,116,115,115,116, 1,150,116,115,115, 0, 2, 0,113, +255,227, 5, 37, 5,240, 0, 12, 0, 59, 0, 0, 1, 34, 7, 6, 16, 23, 22, 32, 55, 54, 53, 52, 38, 3, 14, 1, 21, 20, 23, 22, + 51, 50, 55, 54, 53, 52, 39, 38, 39, 53, 50, 23, 22, 21, 20, 6, 7, 22, 23, 22, 21, 20, 7, 6, 32, 39, 38, 53, 52, 55, 54, 55, + 38, 39, 38, 53, 52, 55, 54, 33, 2,203,184,106,107,107,106, 1,112,107,107,212,244,130,170, 95, 59,204,168, 95, 96, 76,109,130, +228,150,139,170,152,172, 95, 96,156,155,253,186,155,156, 96, 97,171,171, 67, 85,130,116, 1, 1, 2,197, 77, 77,254,242, 77, 77, + 77, 78,134,135,154, 2, 39, 3,124, 79, 69, 72, 45, 65, 65,136,158, 43, 77, 8,100,104, 97,186,128,178, 32, 34, 99, 99,143,217, +116,116,116,116,217,143, 99, 99, 34, 31, 70, 89, 88,130, 83, 74, 0, 2, 0,113,255,227, 4,113, 5, 47, 0, 13, 0, 52, 0, 0, + 1, 34, 7, 6, 16, 23, 22, 32, 55, 54, 53, 52, 39, 38, 19, 22, 21, 20, 7, 6, 7, 22, 23, 22, 21, 20, 7, 6, 32, 39, 38, 53, + 52, 54, 55, 38, 39, 38, 53, 52, 55, 23, 6, 20, 23, 22, 51, 50, 55, 54, 53, 52, 39, 2,113,144, 83, 82, 82, 83, 1, 32, 83, 83, + 83, 82,254, 58, 52, 73,129,146, 82, 81,133,132,254, 18,132,133,164,146,142, 61, 52, 63,161, 43, 73, 72,131,130, 73, 74, 44, 2, +197, 77, 77,254,242, 77, 77, 77, 78,134,135, 77, 77, 2,106, 82,112,153, 64, 89, 32, 34, 99, 99,143,217,116,116,116,116,217,143, +198, 34, 35, 86, 75,142,106, 88, 32, 65,232, 65, 65, 65, 65,116,119, 62, 0, 0, 0, 1, 0, 92,254, 86, 5, 31, 5,213, 0, 21, + 0, 0, 5, 16, 7, 6, 43, 1, 53, 51, 50, 55, 54, 61, 1, 33, 53, 1, 33, 53, 33, 21, 1, 33, 5, 31,158, 72,114,254,233,105, + 38, 38,251,245, 3,176,252,103, 4,149,252, 80, 3,199, 20,254,223, 80, 37,156, 48, 49,153, 20,154, 4,145,170,154,251,111, 0, + 0, 1, 0, 88,254, 86, 3,219, 4, 96, 0, 21, 0, 0, 5, 16, 7, 6, 43, 1, 53, 51, 50, 55, 54, 61, 1, 33, 53, 1, 33, 53, + 33, 21, 1, 33, 3,219,158, 72,114,254,233,105, 38, 38,253, 53, 2,180,253,101, 3,106,253, 76, 2,180, 20,254,223, 80, 37,156, + 48, 49,153, 20,168, 3, 37,147,168,252,219, 0,255,255, 0, 16, 0, 0, 5,104, 7, 80, 18, 34, 0, 36, 0, 0, 16, 3, 2, 50, + 0,196, 1, 64,255,255, 0,123,255,227, 4, 45, 6, 18, 18, 34, 0, 68, 0, 0, 16, 2, 2, 50, 95, 2, 0, 0,255,255, 0,201, +254,117, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 3, 0,122, 0,162, 0, 0,255,255, 0,113,254,117, 4,127, 4,123, 18, 34, + 0, 72, 0, 0, 16, 2, 0,122,123, 0, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,143, + 98, 0, 0, 0,255,255, 0,113,255,227, 4,117, 7, 49, 18, 38, 0,184, 0, 0, 16, 7, 0,113, 0,115, 1, 59,255,255, 0,115, +255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,150,105, 0, 0, 0,255,255, 0,113,255,227, 4,117, 4,123, 16, 38, + 0, 82, 0, 0, 16, 7, 6,150,255,181,254,182,255,255, 0,115,255,227, 5,217, 5,240, 16, 39, 6,140, 5, 39, 1,116, 18, 6, + 0, 50, 0, 0,255,255, 0,113,255,227, 4,117, 6, 16, 16, 38, 2, 50,115, 0, 18, 6, 0, 82, 0, 0, 0, 0,255,255, 0,115, +255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,145,106, 0, 0, 0,255,255, 0,113,255,227, 4,117, 7, 49, 18, 38, + 1,241, 0, 0, 16, 7, 0,113, 0,115, 1, 59,255,255,255,252, 0, 0, 4,231, 7, 49, 16, 39, 0,113, 0,114, 1, 59, 18, 6, + 0, 60, 0, 0,255,255, 0, 61,254, 86, 4,127, 5,245, 16, 38, 0,113, 94,255, 18, 6, 0, 92, 0, 0, 0, 0, 0, 2, 0,138, +255,112, 3, 92, 6, 14, 0, 7, 0, 25, 0, 0, 37, 22, 51, 50, 53, 52, 39, 34, 7, 54, 51, 50, 21, 16, 33, 34, 39, 6, 7, 35, + 54, 55, 38, 55, 17, 51, 1,206, 17, 37,160, 52, 52,202,110,136,244,254,170, 73, 53, 34, 24,196, 29, 67, 49, 1,184,130, 5,175, + 45, 1, 32,184,206,254,191, 15, 72, 58, 69,147, 60, 90, 5, 48, 0, 2, 0,186,255,112, 6, 78, 4,123, 0, 7, 0, 43, 0, 0, + 37, 22, 51, 50, 53, 52, 39, 34, 7, 54, 51, 50, 21, 16, 33, 34, 39, 6, 7, 35, 54, 55, 38, 55, 17, 52, 38, 35, 34, 6, 21, 17, + 35, 17, 51, 21, 54, 55, 54, 51, 50, 23, 22, 21, 4,192, 17, 37,160, 52, 52,202,110,136,244,254,170, 73, 53, 34, 24,196, 29, 67, + 49, 1,124,124,149,172,185,185, 66, 89, 90,117,193, 99, 99,130, 5,175, 45, 1, 32,184,206,254,191, 15, 72, 58, 69,147, 60, 90, + 1,192,159,158,190,164,253,135, 4, 96,174,101, 50, 50,119,120,232, 0, 0, 0, 0, 2, 0, 55,255,112, 3, 97, 5,158, 0, 7, + 0, 33, 0, 0, 37, 22, 51, 50, 53, 52, 39, 34, 7, 54, 51, 50, 21, 16, 33, 34, 39, 6, 7, 35, 54, 55, 38, 53, 17, 35, 53, 51, + 17, 51, 17, 33, 21, 33, 1,211, 17, 37,160, 52, 52,202,110,136,244,254,170, 73, 54, 33, 24,196, 29, 67, 49,135,135,185, 1,123, +254,133,130, 5,175, 45, 1, 32,184,206,254,191, 15, 72, 58, 69,147, 60, 90, 2,243,143, 1, 62,254,194,143, 0, 0, 1,255,219, +254, 86, 1,121, 4, 96, 0, 11, 0, 56, 64, 21, 11, 2, 7, 0, 7,135, 5,189, 0,188, 12, 8, 12, 5, 6, 79, 1, 8, 0, 70, + 12, 16,252,236,228, 57, 18, 57, 49, 0, 16,228,244,236, 17, 18, 57, 57, 48, 64, 11, 16, 13, 64, 13, 80, 13, 96, 13,112, 13, 5, + 1, 93, 19, 51, 17, 20, 6, 43, 1, 53, 51, 50, 54, 53,193,184,163,181, 70, 49,105, 76, 4, 96,251,140,214,192,156, 97,153, 0, + 0, 3, 0,113,255,227, 7,140, 6, 20, 0, 7, 0, 37, 0, 45, 0, 0, 0, 16, 22, 32, 54, 16, 38, 32, 5, 62, 1, 51, 50, 0, + 16, 2, 35, 34, 38, 39, 21, 43, 1, 53, 14, 1, 35, 34, 2, 16, 0, 51, 50, 22, 23, 17, 59, 1, 0, 16, 38, 32, 6, 16, 22, 32, + 1, 47,167, 1, 36,168,168,254,220, 2,133, 58,177,123,204, 0,255,255,204,123,177, 58, 1,184, 58,177,124,203,255, 0,255,203, +124,177, 58,184, 1, 2,114,167,254,220,167,167, 1, 36, 2,250,254,106,231,231, 1,150,231, 43,100, 97,254,188,253,240,254,188, + 97,100,168,168,100, 97, 1, 68, 2, 16, 1, 68, 97,100, 2, 94,251, 80, 1,150,231,231,254,106,231, 0, 0, 0, 0, 3, 0,113, +254, 86, 7,140, 4,123, 0, 7, 0, 37, 0, 45, 0, 0, 0, 16, 38, 32, 6, 16, 22, 32, 37, 17, 43, 1, 17, 14, 1, 35, 34, 2, + 16, 0, 51, 50, 22, 23, 53, 59, 1, 21, 62, 1, 51, 50, 0, 16, 2, 35, 34, 38, 0, 16, 22, 32, 54, 16, 38, 32, 6,205,167,254, +220,167,167, 1, 36,254, 53, 1,184, 58,177,124,203,255, 0,255,203,124,177, 58,184, 1, 58,177,123,204, 0,255,255,204,123,177, +252,154,167, 1, 36,168,168,254,220, 1,100, 1,150,231,231,254,106,231, 43,253,174, 2, 82,100, 97, 1, 68, 2, 16, 1, 68, 97, +100,170,170,100, 97,254,188,253,240,254,188, 97, 2,182,254,106,231,231, 1,150,231, 0, 0, 0, 0, 3,255,253,255,186, 5,124, + 6, 23, 0, 18, 0, 22, 0, 25, 0, 0, 1, 51, 19, 1, 23, 9, 1, 35, 3, 33, 15, 1, 35, 7, 39, 35, 55, 39, 55, 9, 1, 51, + 1, 3, 33, 3, 2, 74,229,134, 1, 97,102,254,112, 1,124,210,136,253,214,205, 50, 70, 59, 82, 2, 1, 20, 47, 2,144,254,238, + 22, 1,111,189, 1, 93,106, 5,213,254,161, 1,161, 89,254, 39,252, 27, 1,127,241,142, 70, 70, 1, 17, 56, 4,196,253, 25, 1, +177,254, 79, 1, 31, 0, 0, 0, 0, 2, 0, 11,255,186, 5,139, 6, 23, 0, 31, 0, 40, 0, 0, 23, 39, 19, 38, 17, 16, 0, 33, + 50, 23, 22, 23, 55, 23, 7, 21, 38, 39, 1, 22, 23, 22, 33, 50, 54, 55, 21, 14, 1, 35, 32, 39, 19, 1, 35, 38, 35, 32, 0, 17, + 20,114,102,220,117, 1,134, 1, 83,134,118, 61, 58,101,102, 99, 46, 49,252,244, 9, 11,136, 1, 0,130,231,102,106,237,132,254, +180,194, 57, 2,216, 1,116,130,255, 0,254,240, 70, 88, 1, 5,187, 1, 23, 1,104, 1,159, 36, 18, 27,120, 89,118,187, 43, 33, +252,102, 13, 12,157, 94, 95,211, 72, 72,199, 1, 21, 3, 92, 47,254,199,254,216,173, 0, 0, 0, 0, 2, 0, 9,255,162, 4, 93, + 4,188, 0, 31, 0, 39, 0, 0, 23, 39, 55, 38, 53, 16, 0, 33, 50, 23, 22, 23, 55, 23, 7, 21, 38, 39, 1, 22, 23, 22, 51, 50, + 54, 55, 21, 14, 1, 35, 34, 39, 19, 1, 38, 35, 34, 6, 21, 20,105, 96,189, 85, 1, 45, 1, 6, 85, 81, 46, 45, 89, 95,118, 25, + 24,253,211, 7, 6, 99,179, 80,157, 78, 77,165, 93,240,147, 55, 1,238, 71, 71,179,198, 94, 78,230,141,204, 1, 18, 1, 58, 17, + 10, 16,108, 79,143, 85, 14, 11,253, 94, 8, 8,113, 43, 43,170, 36, 36,144, 1, 5, 2, 86, 17,227,205,103, 0, 0, 1, 0, 10, + 0, 0, 4,106, 5,213, 0, 13, 0, 0, 19, 51, 17, 51, 21, 35, 17, 33, 21, 33, 17, 35, 53, 51,201,202,191,191, 2,215,252, 95, +191,191, 5,213,253,119,144,253,238,170, 2,188,144, 0, 0, 0, 0, 2,255,178,255,186, 5, 49, 6, 23, 0, 15, 0, 18, 0, 0, + 3, 39, 55, 23, 33, 21, 33, 17, 1, 7, 1, 17, 35, 17, 1, 35, 1, 17, 33, 6, 72,102, 56, 4,153,253,238, 2, 90,103,254, 13, +203,254, 34, 52, 2, 18,254,212, 5,105, 85, 89, 66,170,253,174,253, 57, 88, 2, 77,253,249, 2,247, 2, 52,254,158, 1, 98, 0, + 0, 1, 0,111,254, 16, 4, 25, 4,123, 0, 55, 0, 0, 1, 52, 38, 47, 1, 46, 1, 53, 52, 54, 51, 50, 22, 23, 21, 46, 1, 35, + 34, 6, 21, 20, 22, 31, 1, 22, 23, 22, 21, 20, 7, 6, 7, 31, 1, 22, 51, 21, 35, 34, 39, 38, 47, 1, 38, 39, 38, 39, 38, 39, + 53, 30, 1, 51, 50, 54, 3, 10,101,171, 64,171,152,224,206,102,180, 76, 78,168, 90,137,137, 98,148, 63,198, 80, 83,123, 87,132, +159,147, 42, 76, 39, 84,114, 71, 89,237, 30, 36, 16, 17, 97,108,102,198, 97,130,140, 1, 39, 75, 80, 37, 15, 36,149,130,158,172, + 30, 30,174, 40, 40, 84, 84, 64, 73, 33, 14, 44, 75, 76,137,156, 91, 64, 19,159,126, 36,154, 61, 38, 91,243, 30, 16, 3, 2, 18, + 35,190, 53, 53, 89, 0, 0, 0, 0, 1, 0, 88,254, 16, 4, 51, 4, 96, 0, 24, 0, 0, 19, 33, 21, 1, 22, 23, 1, 23, 22, 59, + 1, 21, 35, 34, 39, 38, 47, 1, 38, 43, 1, 61, 1, 1, 33,113, 3,106,253, 78, 92, 49, 1, 8,147, 42, 76,108,147, 84,114, 71, + 89,237, 61, 90, 94, 2,180,253,101, 4, 96,168,252,221, 16, 49,254,248,126, 36,154, 61, 38, 91,243, 63,156, 12, 3, 37, 0, 0, + 0, 1, 0, 80, 0, 0, 4,141, 5,213, 0, 25, 0, 0, 1, 51, 50, 54, 16, 38, 43, 1, 34, 7, 6, 7, 53, 54, 55, 54, 59, 1, + 50, 4, 16, 4, 43, 1, 17, 35, 1,160,241,141,154,153,142,254, 69, 90, 86, 78, 76, 81, 81, 85,254,251, 1, 1,254,255,251, 39, +202, 3, 0,146, 1, 12,145, 22, 21, 43,182, 35, 17, 18,225,254, 72,226,253,166, 0, 1, 0,117, 2,156, 2,197, 6, 4, 0, 19, + 0, 48, 64, 7, 21, 0, 3, 14, 10, 11, 20, 16,212,220, 60, 47,204,204, 75,176, 13, 81, 88,177, 21, 64, 56, 89, 49,178,127, 21, + 1, 93, 0, 64, 6, 6, 17, 12, 2, 11, 20, 16,212, 60,196,212,204, 48, 1, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 51, + 17, 62, 1, 51, 50, 22, 2,196,116, 78, 78, 94,108,117,117, 41,113, 74,121,125, 4, 23,254,133, 1,119, 89, 89,107, 92,254,158, + 3,103,254,171, 56, 56,134, 0, 0, 1, 0,117, 2,156, 2,197, 6, 4, 0, 27, 0, 59, 64, 8, 29, 0, 3, 16, 22, 10, 11, 28, + 16,212,220, 60,204, 47,204,204, 75,176, 13, 81, 88,177, 29, 64, 56, 89, 49,178,127, 29, 1, 93, 0, 64, 7, 6, 25, 17, 15, 2, + 11, 28, 16,212, 60,212,204,212,204,180, 13,131, 25,131, 6, 93, 48, 1, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 52, 54, + 59, 1, 21, 35, 34, 6, 29, 1, 62, 1, 51, 50, 22, 2,196,116, 78, 78, 94,108,117,103,114,160,146, 66, 48, 41,113, 74,121,125, + 4, 23,254,133, 1,119, 89, 89,107, 92,254,158, 2,132,120,107, 87, 54, 86,114, 56, 56,134, 0, 0, 2,255,233, 1,173, 0,238, + 6, 3, 0, 13, 0, 17, 0, 35, 64, 7, 19, 15, 1, 8, 14, 0, 18, 16,220, 60,204,220, 60,204, 49, 0, 64, 7, 14, 17, 0, 8, + 7, 0, 18, 16,212,212,204, 16,220,204, 48, 19, 51, 17, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 51, 21, 35,122,116, 52, + 51,114, 44, 31, 66, 24, 24,116,116, 5, 15,253,130,120, 54, 54, 88, 27, 27, 86, 3,114,130, 0, 0, 1, 0,117, 2,156, 2, 19, + 5, 31, 0, 17, 0, 31, 64, 5, 17, 11, 7, 8, 18, 16,220,204, 0,204, 49, 0, 64, 7, 0, 17, 7, 3, 14, 9, 8, 47,196,212, +204, 16,212,204, 48, 1, 46, 1, 35, 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 23, 2, 18, 19, 46, 28, 98,105,117,117, + 36,117, 84, 12, 29, 18, 4,175, 10, 9,113,107,254,182, 2,115, 97, 57, 55, 2, 3, 0, 0, 0, 0, 1, 0, 71, 2,141, 1,228, + 5, 15, 0, 21, 0, 0, 19, 22, 23, 22, 51, 50, 55, 54, 53, 17, 51, 17, 35, 53, 6, 7, 6, 35, 34, 39, 38, 39, 71, 20, 23, 23, + 27, 99, 52, 53,116,116, 37, 58, 59, 84, 12, 14, 15, 17, 2,252, 10, 5, 4, 57, 56,107, 1, 74,253,141, 97, 57, 27, 28, 1, 2, + 2, 0, 0, 0, 0, 1, 0, 71, 1,173, 2,117, 5, 15, 0, 32, 0, 0, 19, 22, 23, 22, 51, 50, 55, 54, 53, 17, 51, 17, 21, 20, + 22, 59, 1, 21, 35, 34, 38, 61, 1, 35, 53, 6, 7, 6, 35, 34, 39, 38, 39, 71, 20, 23, 23, 27, 99, 52, 53,116, 48, 66, 31, 44, +114,102, 1, 37, 58, 60, 83, 12, 14, 15, 17, 2,252, 10, 5, 4, 57, 56,107, 1, 74,253,141, 11, 86, 54, 88,108,120, 11, 97, 57, + 27, 28, 1, 2, 2, 0, 0, 0, 0, 2, 0, 32, 2,156, 2,143, 5, 15, 0, 22, 0, 33, 0, 0, 1, 30, 1, 21, 20, 7, 6, 43, + 1, 17, 51, 17, 51, 50, 55, 54, 63, 1, 51, 7, 6, 7, 6, 1, 51, 50, 55, 54, 53, 52, 39, 38, 43, 1, 1,155, 67, 70, 67, 68, +137,244,116,107, 61, 37, 37, 40,102,123,110, 33, 33, 34,254,215,125, 75, 39, 41, 41, 39, 75,125, 3,233, 15, 78, 59, 91, 45, 45, + 2,115,254,247, 21, 20, 63,161,171, 53, 30, 30,255, 0, 23, 24, 47, 46, 24, 25, 0, 1, 0, 54, 2,156, 3,233, 5, 15, 0, 12, + 0, 0, 19, 51, 27, 1, 51, 27, 1, 51, 3, 35, 11, 1, 35, 54,116,145,144,137,145,144,116,185,136,152,153,136, 5, 15,254, 23, + 1,233,254, 23, 1,233,253,141, 2, 2,253,254, 0, 1, 0, 38, 1,173, 2,213, 5, 15, 0, 17, 0, 0, 1, 6, 7, 6, 43, 1, + 53, 51, 50, 55, 54, 63, 1, 1, 51, 27, 1, 51, 1,159, 49, 47, 46, 78, 93, 68, 48, 26, 27, 32, 21,254,226,123,221,220,123, 2, + 98,112, 34, 35, 87, 20, 20, 75, 47, 2,105,254, 22, 1,234, 0,255,255, 0,197, 3,170, 1,111, 5,213, 18, 2, 0, 10, 0, 0, +255,255, 0,197, 3,170, 2,233, 5,213, 18, 2, 0, 5, 0, 0,255,255, 0,174, 3,233, 1,211, 5,213, 16, 6, 5,141, 0, 0, +255,255, 0,178, 3,254, 1,215, 5,213, 16, 6, 5,142, 0, 0, 0, 1, 0,196, 4,238, 1,233, 6,218, 0, 5, 0, 0, 1, 21, + 19, 35, 3, 53, 1,151, 82,129,164, 6,218,172,254,192, 1, 64,172, 0, 0, 0, 0, 1, 0,117, 3,239, 1,135, 6, 20, 0, 16, + 0, 0, 19, 52, 53, 50, 54, 53, 52, 38, 35, 52, 53, 50, 23, 22, 20, 7, 6,117, 64, 88, 88, 64,115, 80, 79, 79, 80, 3,239, 61, + 62, 88, 64, 63, 88, 61, 62, 80, 79,230, 80, 80, 0, 1, 0,117, 3,239, 1,135, 6, 20, 0, 16, 0, 0, 1, 34, 39, 38, 52, 55, + 54, 51, 20, 21, 34, 6, 21, 20, 22, 51, 20, 1,135,115, 80, 79, 79, 80,115, 64, 88, 88, 64, 3,239, 80, 80,230, 79, 80, 62, 61, + 88, 63, 64, 88, 62, 0, 0, 0, 0, 1, 0,117, 2,156, 2,137, 6, 2, 0, 28, 0, 0, 1, 51, 50, 55, 54, 53, 38, 39, 38, 35, + 34, 7, 6, 7, 53, 54, 55, 54, 51, 50, 23, 22, 21, 20, 7, 6, 7, 17, 35, 1, 20, 39,121, 55, 36, 1, 35, 63,113, 50, 50, 49, + 49, 48, 51, 51, 53,174, 87, 68, 68, 70,107,128, 4, 91, 64, 42, 55, 75, 36, 64, 12, 12, 24, 96, 20, 9, 10, 88, 70,104, 95, 64, + 67, 17,254,147, 0, 1, 0,117, 2,156, 2,137, 6, 2, 0, 28, 0, 0, 1, 17, 35, 17, 38, 39, 38, 53, 52, 55, 54, 51, 50, 23, + 22, 23, 21, 38, 39, 38, 35, 34, 7, 6, 7, 20, 23, 22, 51, 1,234,127,107, 71, 68, 69, 87,173, 53, 51, 51, 48, 49, 50, 49, 50, +113, 62, 36, 1, 37, 54,121, 4, 91,254, 65, 1,109, 17, 67, 64, 95,104, 70, 88, 10, 9, 20, 96, 24, 12, 12, 64, 36, 75, 55, 42, + 64, 0, 0, 0, 0, 1, 1, 11, 4, 50, 2,245, 6,176, 0, 6, 0, 0, 1, 37, 21, 13, 1, 21, 37, 1, 11, 1,234,254,153, 1, +103,254, 22, 5,187,245,139,180,180,139,245, 0, 0, 1, 1, 11, 4, 50, 2,245, 6,176, 0, 6, 0, 0, 1, 5, 53, 45, 1, 53, + 5, 2,245,254, 22, 1,103,254,153, 1,234, 5, 39,245,139,180,180,139,245, 0, 0, 1, 0,193, 4,124, 3, 63, 6,102, 0, 6, + 0, 0, 1, 3, 51, 27, 1, 51, 3, 1,182,245,139,180,180,139,245, 4,124, 1,234,254,153, 1,103,254, 22, 0, 0, 1, 0,193, + 4,124, 3, 63, 6,102, 0, 6, 0, 0, 1, 51, 19, 35, 11, 1, 35, 1,182,148,245,139,180,180,139, 6,102,254, 22, 1,103,254, +153, 0, 0, 0, 0, 1, 0,193, 4,238, 3, 63, 6,102, 0, 6, 0, 55, 64, 12, 4, 5, 2,180, 0,179, 7, 4, 2,117, 6, 7, + 16,220,236, 57, 49, 0, 16,244,236, 50, 57, 48, 0, 75,176, 9, 84, 75,176, 14, 84, 91, 88,189, 0, 7,255,192, 0, 1, 0, 7, + 0, 7, 0, 64, 56, 17, 55, 56, 89, 1, 51, 19, 35, 39, 7, 35, 1,182,148,245,139,180,180,139, 6,102,254,136,245,245, 0, 0, + 0, 1, 0,193, 4,238, 3, 63, 6,102, 0, 6, 0, 55, 64, 12, 3, 0,180, 4, 1,179, 7, 3, 5,117, 1, 7, 16,220,236, 57, + 49, 0, 16,244, 60,236, 57, 48, 0, 75,176, 9, 84, 75,176, 14, 84, 91, 88,189, 0, 7,255,192, 0, 1, 0, 7, 0, 7, 0, 64, + 56, 17, 55, 56, 89, 1, 3, 51, 23, 55, 51, 3, 1,182,245,139,180,180,139,245, 4,238, 1,120,245,245,254,136, 0, 1, 0,214, + 3,231, 1, 94, 6, 18, 0, 3, 0, 19, 64, 4, 5, 0, 3, 4, 16,220,220,204, 49, 0, 64, 2, 3, 2, 47,196, 48, 1, 17, 35, + 17, 1, 94,136, 6, 18,253,213, 2, 43, 0, 0,255,255, 0,213, 5, 98, 3, 43, 5,246, 16, 6, 0,113, 0, 0, 0, 1, 1,115, + 4,238, 3, 82, 6,102, 0, 3, 0, 0, 1, 51, 1, 35, 2,139,199,254,186,153, 6,102,254,136, 0, 1, 0,170, 4,240, 2,137, + 6,102, 0, 3, 0, 0, 9, 1, 35, 1, 1,111, 1, 26,153,254,186, 6,102,254,138, 1,118, 0, 0, 1, 0,214,254,209, 1, 94, + 0,252, 0, 3, 0, 19, 64, 4, 5, 0, 3, 4, 16,220,220,204, 49, 0, 64, 2, 3, 2, 47,196, 48, 37, 17, 35, 17, 1, 94,136, +252,253,213, 2, 43, 0, 0, 0,255,255, 0,213,254,192, 3, 43,255, 84, 16, 7, 0,113, 0, 0,249, 94, 0, 0, 0, 1, 0,170, +254, 28, 2,137,255,146, 0, 3, 0, 0, 5, 1, 35, 1, 1,111, 1, 26,153,254,186,110,254,138, 1,118, 0, 0, 0, 1, 1,115, +254, 28, 3, 82,255,148, 0, 3, 0, 0, 5, 51, 1, 35, 2,139,199,254,186,153,108,254,136, 0, 0, 2, 0,111, 0, 0, 1,212, + 4, 35, 0, 2, 0, 5, 0, 0, 1, 3, 33, 3, 19, 33, 1, 33,178, 1,101,179,179,254,155, 2,217, 1, 74,253, 39,254,182, 0, + 0, 1, 0,111, 2,216, 1,212, 4, 35, 0, 2, 0, 0, 1, 3, 33, 1, 33,178, 1,101, 2,217, 1, 74, 0, 0,255,255, 0,117, + 1,254, 1,135, 4, 35, 16, 7, 2, 23, 0, 0,254, 15, 0, 0,255,255, 0,117, 1,254, 1,135, 4, 35, 16, 7, 2, 24, 0, 0, +254, 15, 0, 0, 0, 1, 1, 31, 1,212, 2,225, 3,150, 0, 7, 0, 0, 1, 21, 33, 53, 51, 17, 51, 17, 2,225,254, 62,150,150, + 2,106,150,150, 1, 44,254,212, 0, 1, 1, 31, 1,212, 2,225, 3,150, 0, 7, 0, 0, 1, 53, 33, 21, 35, 17, 35, 17, 1, 31, + 1,194,150,150, 3, 0,150,150,254,212, 1, 44, 0, 1, 0,193, 1,137, 3, 23, 3,223, 0, 11, 0, 0, 1, 53, 51, 21, 51, 21, + 35, 21, 35, 53, 35, 53, 1,162,148,225,225,148,225, 2,254,225,225,148,225,225,148, 0, 0, 0, 0, 1, 1, 31, 2,106, 2,225, + 3, 0, 0, 3, 0, 0, 1, 33, 53, 33, 2,225,254, 62, 1,194, 2,106,150, 0, 0, 1, 0,199, 5, 41, 3, 57, 6, 72, 0, 13, + 0, 87, 64, 14, 11,240, 4, 7, 0,179, 14, 7, 86, 8, 1, 86, 0, 14, 16,220,236,212,236, 49, 0, 16,244, 60,212,236, 48, 0, + 75,176, 9, 84, 88,189, 0, 14,255,192, 0, 1, 0, 14, 0, 14, 0, 64, 56, 17, 55, 56, 89, 0, 75,176, 15, 84, 75,176, 16, 84, + 91, 75,176, 17, 84, 91, 88,189, 0, 14, 0, 64, 0, 1, 0, 14, 0, 14,255,192, 56, 17, 55, 56, 89, 19, 51, 30, 1, 51, 50, 54, + 55, 51, 14, 1, 35, 34, 38,199,118, 11, 97, 87, 86, 96, 13,118, 10,158,145,145,158, 6, 72, 75, 75, 74, 76,143,144,144, 0, 0, + 0, 1, 1,154, 5, 68, 2,102, 6, 16, 0, 3, 0, 21, 64, 9, 2,131, 0,205, 4, 1, 25, 0, 4, 16,212,236, 49, 0, 16,252, +236, 48, 0, 1, 51, 21, 35, 1,154,204,204, 6, 16,204, 0, 0, 0, 2, 0,238, 4,225, 3, 18, 7, 6, 0, 11, 0, 23, 0, 32, + 64, 17, 3,193, 21,242, 9,193, 15,241, 24, 0, 86, 12,120, 6, 86, 18, 24, 16,212,236,244,236, 49, 0, 16,244,236,244,236, 48, + 1, 52, 38, 35, 34, 6, 21, 20, 22, 51, 50, 54, 55, 20, 6, 35, 34, 38, 53, 52, 54, 51, 50, 22, 2,152, 88, 64, 65, 87, 87, 65, + 64, 88,122,159,115,115,159,159,115,115,159, 5,244, 63, 88, 87, 64, 65, 87, 88, 64,115,160,160,115,115,159,159, 0, 1, 1, 76, +254,117, 2,193, 0, 0, 0, 19, 0, 32, 64, 15, 11, 14, 10, 7,243, 14,244, 0, 1, 0, 10, 4, 39, 17, 20, 16,212,236,196,212, +204, 49, 0, 47,252,252,196, 18, 57, 48, 33, 51, 14, 1, 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 53, 52, 54, 1,184, +119, 45, 43, 55, 54, 32, 62, 31, 38, 68, 30,122,115, 53, 61, 88, 31, 46, 46, 15, 15,133, 10, 10, 87, 93, 48,105, 0, 1, 0,182, + 5, 29, 3, 74, 6, 55, 0, 27, 0, 99, 64, 36, 0, 18, 7, 14, 11, 4, 1, 18, 7, 15, 11, 4, 18,195, 25, 7, 4,195, 21, 11, +237, 28, 15, 1, 14, 0, 7, 21, 86, 22,119, 7, 86, 8,118, 28, 16,244,236,252,236, 17, 57, 57, 57, 57, 49, 0, 16,252, 60,252, +212, 60,236, 17, 18, 57, 17, 18, 57, 17, 18, 57, 17, 18, 57, 48, 0, 75,176, 9, 84, 75,176, 12, 84, 91, 88,189, 0, 28,255,192, + 0, 1, 0, 28, 0, 28, 0, 64, 56, 17, 55, 56, 89, 1, 39, 46, 1, 35, 34, 6, 7, 35, 62, 1, 51, 50, 22, 31, 1, 30, 1, 51, + 50, 54, 55, 51, 14, 1, 35, 34, 38, 1,252, 57, 22, 33, 13, 38, 36, 2,125, 2,102, 91, 38, 64, 37, 57, 22, 33, 13, 38, 36, 2, +125, 2,102, 91, 38, 64, 5, 90, 55, 20, 19, 73, 82,135,147, 28, 33, 55, 20, 19, 73, 82,135,147, 28, 0, 0, 0, 0, 2, 0,240, + 4,238, 3,174, 6,102, 0, 3, 0, 7, 0, 66, 64, 17, 6, 2,180, 4, 0,179, 8, 4, 7, 3, 0, 5, 1, 3, 5, 7, 8, 16, +212,220,212,204, 17, 57, 17, 18, 57, 49, 0, 16,244, 60,236, 50, 48, 0, 75,176, 9, 84, 75,176, 14, 84, 91, 88,189, 0, 8,255, +192, 0, 1, 0, 8, 0, 8, 0, 64, 56, 17, 55, 56, 89, 1, 51, 3, 35, 3, 51, 3, 35, 2,252,178,248,135,129,170,223,137, 6, +102,254,136, 1,120,254,136, 0, 0, 1,255,255, 1,222, 2,173, 4, 8, 0, 15, 0, 0, 3, 37, 51, 21, 20, 23, 22, 59, 1, 21, + 35, 34, 39, 38, 53, 5, 1, 1, 22,184, 38, 38,105, 43, 64,175, 87, 82,254,235, 3,100,164,148,153, 49, 48,156, 96, 90,200,162, + 0, 1, 0,239, 4,238, 3, 16, 6,102, 0, 11, 0, 0, 1, 39, 7, 35, 55, 39, 51, 23, 55, 51, 7, 23, 2, 92, 92, 93,180,181, +181,180, 93, 92,180,182,182, 4,238, 97, 97,187,189, 96, 96,189,187, 0, 0, 0, 0, 2, 0,117, 1,170, 2,253, 5, 15, 0, 13, + 0, 21, 0, 0, 1, 22, 21, 20, 7, 4, 39, 38, 55, 3, 51, 23, 55, 51, 1, 6, 23, 22, 51, 50, 55, 52, 2, 5,178,242,254,246, + 1, 1,182,250,137,191,183,137,254,188,140, 3, 2,134,128, 1, 3,220,249,180,129, 3, 3,135,192,241, 1, 47,224,224,254,138, +174,152, 77, 77,140, 0, 0, 0, 0, 1, 0,121, 2,156, 0,238, 6, 4, 0, 3, 0, 13,177, 2, 3, 47,204, 49, 0,177, 0, 3, + 47,196, 48, 19, 51, 17, 35,122,116,116, 6, 3,252,153, 0, 0, 0, 1, 0,117, 2,156, 2,144, 5, 47, 0, 50, 0, 0, 1, 21, + 38, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 31, 1, 22, 23, 22, 21, 20, 7, 6, 35, 34, 39, 38, 39, 53, 22, 23, 22, 51, 50, 54, + 53, 52, 39, 38, 47, 1, 38, 39, 38, 53, 52, 55, 54, 51, 50, 23, 22, 2,106, 49, 53, 52, 57, 87, 43, 43, 31, 31, 93, 40,125, 50, + 52, 78, 77,136, 57, 62, 61, 68, 64, 63, 62, 61, 82, 88, 32, 28,111, 40,108, 48, 48, 71, 70,130, 64, 57, 57, 5, 13, 97, 22, 11, + 11, 23, 24, 47, 36, 20, 21, 18, 8, 24, 42, 43, 77, 87, 51, 51, 10, 10, 19,107, 30, 15, 15, 50, 45, 42, 23, 20, 23, 8, 21, 41, + 42, 73, 88, 48, 49, 9, 8, 0, 0, 1, 0,117, 2,156, 3, 33, 5, 15, 0, 11, 0, 0, 1, 3, 1, 35, 39, 7, 35, 1, 3, 51, + 23, 55, 3, 20,255, 1, 12,137,205,205,137, 1, 18,251,137,187,187, 5, 15,254,207,254,190,246,246, 1, 72, 1, 43,223,223, 0, + 0, 1, 0,117, 2,156, 2,137, 6, 2, 0, 28, 0, 0, 1, 17, 35, 17, 38, 39, 38, 53, 52, 55, 54, 51, 50, 23, 22, 23, 21, 38, + 39, 38, 35, 34, 7, 6, 7, 20, 23, 22, 51, 1,234,127,107, 71, 68, 69, 87,173, 53, 51, 51, 48, 49, 50, 49, 50,113, 62, 36, 1, + 37, 54,121, 4, 91,254, 65, 1,109, 17, 67, 64, 95,104, 70, 88, 10, 9, 20, 96, 24, 12, 12, 64, 36, 75, 55, 42, 64, 0, 0, 0, + 0, 1, 0,214, 0, 0, 3, 29, 5, 88, 0, 5, 0, 21, 64, 9, 1,169, 3, 0, 0, 8, 4, 2, 6, 16,196,212,236, 49, 0, 47, +212,236, 48, 33, 17, 33, 53, 33, 17, 2,149,254, 65, 2, 71, 4,208,136,250,168, 0, 1, 0,214, 0, 0, 3, 29, 5, 88, 0, 7, + 0, 39, 64, 24, 63, 4, 63, 1, 47, 4, 47, 1, 31, 4, 31, 1, 6, 1,169, 4, 5, 0, 0, 4, 8, 6, 2, 8, 16,196,212,236, + 50, 49, 0, 47,212,220,236, 93, 48, 33, 17, 33, 53, 33, 17, 51, 17, 2,149,254, 65, 1,191,136, 3,156,136, 1, 52,250,168, 0, + 0, 1, 0,214, 0, 0, 3, 29, 5, 88, 0, 7, 0, 25, 64, 11, 1,169, 4, 5, 0, 0, 4, 8, 6, 2, 8, 16,196,212,236, 50, + 49, 0, 47,212,220,236, 48, 33, 17, 33, 53, 33, 17, 51, 17, 2,149,254, 65, 1,191,136, 2,104,136, 2,104,250,168, 0, 0, 0, + 0, 1, 0,214, 0, 0, 3, 29, 5, 88, 0, 7, 0, 39, 64, 24,112, 4,112, 1, 48, 4, 48, 1, 16, 4, 16, 1, 6, 4,169, 1, + 5, 0, 0, 4, 8, 6, 2, 8, 16,196,212,236, 50, 49, 0, 47,212,220,236, 93, 48, 33, 17, 33, 53, 33, 17, 51, 17, 2,149,254, + 65, 1,191,136, 1, 52,136, 3,156,250,168, 0, 0, 1, 0,214, 0, 0, 3, 29, 5, 88, 0, 5, 0, 21, 64, 9, 1, 0,169, 4, + 0, 8, 2, 4, 6, 16,196,212,236, 49, 0, 47,236,196, 48, 37, 17, 51, 17, 33, 53, 2,149,136,253,185,136, 4,208,250,168,136, +255,255, 0,193,253,236, 3, 63,255,214, 16, 3, 2, 29, 0, 0,249,112, 0, 0,255,255, 0,213, 4,226, 3, 43, 6,118, 18, 35, + 0,113, 0, 0, 0,128, 18, 2, 0,113, 0,128, 0, 2, 1, 21, 4,238, 2,235, 6,102, 0, 3, 0, 7, 0, 0, 1, 51, 17, 35, + 1, 51, 17, 35, 1, 21,150,150, 1, 64,150,150, 6,102,254,136, 1,120,254,136,255,255, 0,238,253, 46, 3, 18,255, 83, 16, 7, + 2, 51, 0, 0,248, 77, 0, 0, 0, 1, 0,182,254,118, 3, 74,255,144, 0, 27, 0, 0, 1, 39, 46, 1, 35, 34, 6, 7, 35, 62, + 1, 51, 50, 22, 31, 1, 30, 1, 51, 50, 54, 55, 51, 14, 1, 35, 34, 38, 1,252, 57, 22, 33, 13, 38, 36, 2,125, 2,102, 91, 38, + 64, 37, 57, 22, 33, 13, 38, 36, 2,125, 2,102, 91, 38, 64,254,179, 55, 20, 19, 73, 82,135,147, 28, 33, 55, 20, 19, 73, 82,135, +147, 28, 0, 0,255,255,252,168, 4,240,254,135, 6,102, 16, 7, 0, 67,251,254, 0, 0, 0, 0,255,255,253,113, 4,238,255, 80, + 6,102, 16, 7, 0,118,251,254, 0, 0, 0, 0,255,255,252,191, 4,238,255, 61, 6,102, 16, 7, 2, 31,251,254, 0, 0, 0, 0, +255,255,252,180, 5, 29,255, 72, 6, 55, 16, 7, 2, 53,251,254, 0, 0, 0, 0,255,255,252,217, 5, 98,255, 47, 5,246, 16, 7, + 0,113,252, 4, 0, 0, 0, 0,255,255,251,236, 5,124, 0, 20, 6, 11, 16, 7, 5,171,252, 0, 0, 0, 0, 0,255,255,252,191, + 5, 41,255, 49, 6, 72, 16, 7, 2, 49,251,248, 0, 0, 0, 0,255,255,253,164, 5, 68,254,112, 6, 16, 16, 7, 2, 50,252, 10, + 0, 0, 0, 0,255,255,252,213, 5, 70,255, 39, 6, 16, 16, 7, 0,106,251,254, 0, 0, 0, 0, 0, 1,253, 55, 4,242,254,247, + 6,123, 0, 25, 0, 34, 64, 9, 20, 86, 64, 5,128, 12, 86, 25, 13, 47,204,236, 26,220, 26,236, 49, 0, 64, 6, 23,193, 64, 2, +192, 13, 47, 26,220, 26,236, 48, 1, 54, 51, 50, 22, 21, 20, 15, 1, 6, 7, 6, 21, 35, 53, 52, 54, 63, 1, 54, 53, 52, 38, 35, + 34, 7,253, 55,112,105,104,127, 88, 44, 35, 4, 7,119, 30, 51, 45, 46, 62, 71, 90,100, 6, 72, 51, 85, 67, 61, 65, 32, 26, 9, + 16, 32, 12, 40, 54, 37, 34, 34, 40, 21, 36, 52,255,255,252,236, 4,225,255, 16, 7, 6, 16, 7, 2, 51,251,254, 0, 0, 0, 0, +255,255,252,244, 4,238,255,178, 6,102, 16, 7, 2, 54,252, 4, 0, 0, 0, 0,255,255,252,197, 4,238,255, 67, 6,102, 16, 7, + 2, 32,252, 4, 0, 0, 0, 0, 0, 1,253,188, 4,236,254, 68, 6,168, 0, 3, 0, 0, 1, 17, 35, 17,254, 68,136, 6,168,254, + 68, 1,188, 0,255,255,252,240, 4,236,255, 16, 6,168, 16, 39, 2, 85,255, 52, 0, 0, 16, 7, 2, 85, 0,204, 0, 0, 0, 0, + 0, 2,252, 93, 4,238,255, 27, 6,102, 0, 3, 0, 7, 0, 0, 1, 19, 35, 3, 33, 19, 35, 3,253, 15,205,135,248, 2, 0,190, +137,223, 6,102,254,136, 1,120,254,136, 1,120,255,255,252,191, 5, 41,255, 49, 6,214, 16, 39, 2, 50,252, 4, 0,198, 16, 7, + 2, 49,251,248, 0, 0, 0, 0,255,255,252,191, 5, 41,255, 49, 6, 72, 16, 15, 2, 49,255,248, 11,113,192, 0, 0, 1,254, 31, + 3,233,255, 68, 5, 40, 0, 3, 0, 10, 64, 3, 2, 1, 4, 0, 16,212,204, 48, 1, 35, 19, 51,254,242,211,164,129, 3,233, 1, + 63, 0, 0, 0, 0, 1,253,144, 4,194,254,130, 6,193, 0, 8, 0, 0, 1, 16, 35, 53, 22, 53, 35, 53, 51,254,130,242,112,112, +242, 5,195,254,255,123, 3,137,254, 0, 0, 0, 0, 1,253,144, 4,194,254,130, 6,193, 0, 8, 0, 0, 1, 53, 51, 21, 35, 20, + 55, 21, 34,253,144,241,111,112,242, 5,195,254,254,137, 3,123, 0, 1,255,121, 4,154, 0,135, 6, 18, 0, 3, 0, 0, 3, 51, + 3, 35, 64,199,117,153, 6, 18,254,136, 0, 0,255,255,252,168,253,223,254,135,255, 85, 16, 7, 0, 67,251,254,248,239, 0, 0, +255,255,253,113,253,221,255, 80,255, 85, 16, 7, 0,118,251,254,248,239, 0, 0, 0, 1,253, 12,253, 38,254, 68,255, 16, 0, 7, + 0, 0, 1, 53, 51, 17, 35, 53, 35, 53,253,188,136,136,176,254, 95,177,254, 22,177,136, 0, 0, 0, 1,253,188,253, 38,254,244, +255, 16, 0, 7, 0, 0, 1, 51, 21, 35, 21, 35, 17, 51,254, 68,176,176,136,136,254, 95,136,177, 1,234, 0, 0, 0, 1,254, 85, + 5,134, 0, 63, 7,112, 0, 5, 0, 0, 3, 33, 53, 33, 17, 35, 73,254,158, 1,234,136, 6,232,136,254, 22, 0, 0, 1,254,240, + 3,107, 0,123, 4,224, 0, 19, 0, 49, 64, 6, 7, 86, 14, 4, 17, 0, 47, 75,176, 12, 84, 75,176, 13, 84, 91, 75,176, 14, 84, + 91, 88,185, 0, 0, 0, 64, 56, 89,220, 50,220,236, 49, 0, 64, 5, 10, 4,193, 0, 17, 47,196,252,204, 48, 1, 53, 30, 1, 51, + 50, 54, 53, 52, 38, 39, 51, 30, 1, 21, 20, 6, 35, 34, 38,254,240, 61, 88, 31, 46, 46, 15, 15,133, 10, 10, 87, 93, 48,105, 3, +215,119, 45, 43, 55, 54, 32, 62, 31, 38, 68, 30,122,115, 53, 0, 0, 1,253,129,252,235,254,147,255, 16, 0, 16, 0, 0, 5, 20, + 21, 34, 6, 21, 20, 22, 51, 20, 21, 34, 39, 38, 52, 55, 54,254,147, 64, 88, 88, 64,115, 80, 79, 79, 80,240, 62, 61, 88, 64, 63, + 88, 62, 61, 79, 80,230, 80, 80, 0, 1,253, 11,253,215,254,245,255, 16, 0, 7, 0, 0, 1, 51, 21, 33, 53, 51, 53, 51,254, 68, +177,254, 22,177,136,254, 95,136,136,177, 0, 0, 0, 1,253, 11,253,215,254,245,255, 16, 0, 7, 0, 0, 1, 35, 53, 33, 21, 35, + 21, 35,253,188,177, 1,234,177,136,254,136,136,136,177, 0, 0, 0, 1,253, 11,253, 38,254,245,255, 16, 0, 11, 0, 0, 1, 35, + 53, 51, 53, 51, 21, 51, 21, 35, 21, 35,253,188,177,177,136,177,177,136,253,215,136,177,177,136,177, 0, 0, 0, 0, 1,253, 11, +254,136,254,245,255, 16, 0, 3, 0, 0, 1, 53, 33, 21,253, 11, 1,234,254,136,136,136, 0, 0, 0, 1,253,122,254, 86,255,208, + 0,128, 0, 13, 0, 0, 39, 21, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, 61, 1, 48, 82, 81,181,254,233,105, 38, 38,128,148,214, + 96, 96,156, 48, 49,153,148, 0, 0, 1,253,119,254, 86,255,205, 0,128, 0, 13, 0, 0, 37, 51, 21, 20, 23, 22, 59, 1, 21, 35, + 34, 39, 38, 53,253,119,184, 38, 38,105,233,254,181, 81, 82,128,148,153, 49, 48,156, 96, 96,214,255,255,253,154,254,135,254,102, +255, 83, 16, 7, 2, 50,252, 0,249, 67, 0, 0,255,255,252,213,254,137,255, 39,255, 83, 16, 7, 0,106,251,254,249, 67, 0, 0, +255,255,252,236,253, 46,255, 16,255, 83, 16, 7, 2, 51,251,254,248, 77, 0, 0, 0, 1,253,106,254, 20,254,143,255, 84, 0, 3, + 0, 10, 64, 3, 3, 0, 4, 0, 16,212,204, 48, 5, 51, 3, 35,253,188,211,164,129,172,254,192,255,255,253, 35,254,117,254,193, + 0, 0, 16, 7, 0,122,252, 0, 0, 0, 0, 0,255,255,253, 76,254,117,254,193, 0, 0, 16, 7, 2, 52,252, 0, 0, 0, 0, 0, + 0, 1,253,188,253,152,254, 68,255, 84, 0, 3, 0, 0, 5, 17, 35, 17,254, 68,136,172,254, 68, 1,188, 0, 0, 0, 1,252,240, +254, 10,255, 23,255, 84, 0, 7, 0, 0, 7, 17, 35, 53, 33, 21, 35, 17,233,137,254,235,137,172,254,182,194,194, 1, 74, 0, 0, + 0, 1,252, 99,254, 57,255,152,255, 88, 0, 20, 0, 0, 1, 6, 35, 34, 3, 52, 53, 51, 22, 51, 50, 55, 51, 22, 23, 50, 55, 51, + 2, 7, 34,253,254, 60,116,218, 17,117, 14,104,101, 15,118, 12,105,102, 15,118, 15,220,116,254,139, 82, 1, 26, 2, 3,150,150, +149, 1,150,254,226, 1, 0, 0,255,255,252,197,253,218,255, 67,255, 82, 16, 7, 2, 32,252, 4,248,236, 0, 0,255,255,252,191, +253,221,255, 61,255, 85, 16, 7, 2, 31,251,254,248,239, 0, 0,255,255,252,191,254, 57,255, 49,255, 88, 16, 7, 2, 49,251,248, +249, 16, 0, 0,255,255,252,191,254, 54,255, 49,255, 85, 16, 15, 2, 49,255,248, 4,126,192, 0,255,255,252,180,254, 57,255, 72, +255, 83, 16, 7, 2, 53,251,254,249, 28, 0, 0,255,255,252,217,254,192,255, 47,255, 84, 16, 7, 2, 38,252, 4, 0, 0, 0, 0, +255,255,251,236,254, 29, 0, 20,254,172, 16, 7, 0, 66,252, 0, 0, 0, 0, 0,255,255,251,236,254, 29, 0, 20,255,238, 16, 7, + 5,140,252, 0, 0, 0, 0, 0, 0, 1,251,140, 1,236,255,173, 3, 12, 0, 27, 0, 0, 3, 21, 14, 1, 35, 34, 39, 38, 39, 46, + 1, 35, 34, 6, 7, 53, 62, 1, 51, 50, 22, 23, 22, 23, 22, 51, 50, 54, 83, 75,143, 79, 90,113, 22, 11, 77,103, 51, 79,141, 73, + 78,146, 83, 53,100, 74, 12, 21,116, 93, 70,137, 3, 12,174, 59, 55, 51, 10, 4, 33, 24, 59, 63,174, 60, 54, 22, 31, 5, 10, 55, + 61, 0, 0, 0, 0, 1,253,119, 1,196,255,136, 2,104, 0, 3, 0, 0, 3, 21, 33, 53,120,253,240, 2,104,164,164, 0, 0, 0, + 0, 1,250,237, 1,196,255,255, 2,104, 0, 3, 0, 0, 1, 53, 33, 21,250,237, 5, 18, 1,196,164,164, 0, 0, 0, 1,251,104, +255,162,255,188, 4,188, 0, 3, 0, 0, 5, 39, 1, 23,251,200, 96, 3,245, 95, 94, 78, 4,204, 79, 0, 0, 0, 0, 1,250, 18, +255,186,255,145, 6, 23, 0, 3, 0, 0, 5, 39, 1, 23,250,121,103, 5, 25,102, 70, 88, 6, 5, 89, 0, 0, 0,255,255,253,249, +253, 59,255, 11,255, 96, 16, 15, 2,100,252,140,252, 75,192, 0,255,255,252,241,254, 91,255, 24,255,165, 16, 15, 2,114,252, 8, +253,175,192, 0, 0, 2,252,240,253, 46,255, 23,255, 84, 0, 3, 0, 7, 0, 0, 7, 17, 33, 17, 1, 17, 33, 17,233,253,217, 1, +158,254,235,172,253,218, 2, 38,254, 98, 1, 22,254,234, 0, 0, 0, 1,252, 99,254, 57,255,152,255, 88, 0, 20, 0, 0, 5, 54, + 51, 50, 19, 20, 21, 35, 38, 35, 34, 7, 35, 38, 39, 34, 7, 35, 18, 55, 50,253,254, 59,116,218, 17,118, 13,103,102, 16,118, 11, +105,102, 15,118, 15,220,116,250, 82,254,230, 2, 3,150,150,149, 1,150, 1, 30, 1, 0, 0, 0, 0, 1,253, 42, 4,242,254,230, + 6,174, 0, 11, 0, 0, 1, 7, 39, 55, 39, 55, 23, 55, 23, 7, 23, 7,254, 8,125, 96,125,125, 96,125,125, 96,125,125, 96, 5, +112,125, 96,125,125, 96,125,125, 96,125,125, 96, 0, 1,254, 6, 4,194,255, 32, 6,210, 0, 29, 0, 0, 1, 46, 1, 53, 52, 54, + 55, 21, 14, 1, 21, 20, 23, 22, 31, 1, 30, 1, 21, 20, 6, 7, 53, 62, 1, 53, 52, 39, 38, 39,254, 67, 33, 28,147,135, 82, 73, + 9, 12, 18, 55, 33, 28,147,135, 82, 73, 9, 12, 18, 5,199, 28, 48, 28, 80, 81, 2,110, 2, 27, 28, 10, 12, 15, 14, 43, 28, 48, + 28, 80, 81, 2,110, 2, 27, 28, 10, 12, 15, 14,255,255,251,236, 4, 58, 0, 20, 6, 11, 16, 39, 5,171,252, 0, 0, 0, 16, 7, + 5,171,252, 0,254,190, 0, 0,255,255,252,168, 4,240,254,135, 6,102, 16, 7, 0, 67,251,254, 0, 0, 0, 0,255,255,253,113, + 4,238,255, 80, 6,102, 16, 7, 0,118,251,254, 0, 0, 0, 0,255,255,252,180, 5, 29,255, 72, 6, 55, 16, 7, 2, 53,251,254, + 0, 0, 0, 0,255,255,253,132, 4,194,254,118, 6, 97, 16, 7, 5,114,251,254, 0, 0, 0, 0,255,255,252,231, 5, 70,255, 98, + 7,210, 16, 7, 2,166,252, 16, 0, 0, 0, 0,255,255,253,198,254, 86,254,162,255,164, 16, 7, 2,163,252, 16, 0, 0, 0, 0, + 0, 1,252,213, 5, 29,255, 43, 6, 73, 0, 7, 0, 0, 3, 35, 53, 33, 21, 35, 17, 33,213,150,254,214,150, 2, 86, 5, 29,150, +150, 1, 44, 0, 0, 2,253, 31,254, 50,254,225,255,184, 0, 3, 0, 7, 0, 0, 1, 33, 53, 33, 53, 33, 53, 33,254,225,254, 62, + 1,194,254, 62, 1,194,254, 50,120,150,120, 0, 0, 2,253, 21,254, 20,254,235,255,140, 0, 3, 0, 7, 0, 0, 5, 51, 17, 35, + 1, 51, 17, 35,253, 21,150,150, 1, 64,150,150,116,254,136, 1,120,254,136, 0, 0, 1,253, 31,254, 20,254,225,255,214, 0, 5, + 0, 0, 5, 33, 17, 35, 17, 33,253, 31, 1,194,150,254,212, 42,254, 62, 1, 44, 0, 1,252,182, 4,238,255, 74, 6,102, 0, 39, + 0, 0, 1, 55, 51, 7, 22, 23, 22, 51, 50, 55, 54, 55, 51, 6, 7, 6, 35, 34, 39, 38, 39, 7, 35, 55, 38, 39, 38, 35, 34, 7, + 6, 7, 35, 54, 55, 54, 51, 50, 23, 22,253,255, 66,109,107, 11, 22, 16, 13, 38, 18, 18, 2,125, 2, 51, 51, 91, 38, 32, 30, 33, + 66,110,107, 13, 20, 16, 13, 38, 18, 18, 2,125, 2, 51, 51, 91, 38, 32, 30, 5,255,103,169, 9, 14, 10, 36, 37, 82,135, 74, 73, + 14, 13, 29,103,168, 11, 13, 10, 36, 37, 82,135, 74, 73, 14, 13, 0, 2,253, 72, 4,137,254,176, 6,204, 0, 3, 0, 7, 0, 0, + 1, 51, 21, 35, 19, 51, 21, 35,253, 72,150,150,210,150,150, 5, 31,150, 2, 67,150, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 34, 6,134, 0,183, 16, 3, 6,134, 0, 0, 0,167, 0, 1,252, 99,254, 40,255,157,255,194, 0, 13, 0, 0, 1, 55, + 33, 23, 35, 39, 55, 51, 7, 33, 39, 51, 23, 7,254,112,132,254, 25,132,127,175,175,127,132, 1,231,132,126,175,175,254, 40,155, +155,205,205,155,155,205,205, 0, 0, 1,253, 51,254, 20,254,205,255,164, 0, 8, 0, 0, 1, 35, 53, 7, 53, 55, 23, 21, 39,254, + 50,100,155,205,205,155,254, 20,231,132,126,175,175,126,132, 0, 0, 1,253,120, 4,225,254,136, 7, 6, 0, 16, 0, 0, 1, 6, + 7, 6, 21, 20, 23, 22, 23, 21, 38, 39, 38, 52, 55, 54, 55,254,136, 64, 42, 44, 44, 42, 64,114, 78, 80, 80, 78,114, 6,139, 1, + 42, 44, 64, 65, 43, 43, 1,123, 1, 79, 80,230, 80, 78, 1, 0,255,255,252,191, 5, 41,255, 49, 6,216, 16, 39, 2, 89, 0, 0, + 0,144, 16, 6, 2, 79, 0,229,255,255,253, 42,253, 84,254,230,255, 16, 16, 7, 2,133, 0, 0,248, 98, 0, 0, 0, 1,253,120, + 4,225,254,136, 7, 6, 0, 16, 0, 0, 1, 53, 22, 23, 22, 20, 7, 6, 7, 53, 54, 55, 54, 53, 52, 39, 38,253,120,114, 78, 80, + 80, 78,114, 64, 42, 44, 44, 42, 6,139,123, 1, 78, 80,230, 80, 79, 1,123, 1, 43, 43, 65, 64, 44, 42, 0, 0,255,255,255, 46, + 5, 68,255,250, 6, 16, 16, 7, 2, 50,253,148, 0, 0, 0, 0,255,255,252,112,254, 27, 3,144,255,133, 16, 7, 5,172,252,201, + 0, 0, 0, 0,255,255,252,112, 6,107, 3,144, 7,213, 16, 7, 5,172,252,201, 8, 80, 0, 0, 0, 1,253, 42, 5, 29, 2,214, + 6, 55, 0, 35, 0, 0, 3, 39, 38, 39, 38, 35, 34, 7, 6, 7, 35, 54, 55, 54, 51, 50, 23, 22, 31, 1, 22, 23, 22, 51, 50, 55, + 54, 55, 51, 6, 7, 6, 35, 34, 39, 38, 4,144, 28, 79, 44, 36,101, 53, 70, 5,162, 4,113,112,200, 91, 63, 57, 90,144, 28, 79, + 44, 36, 97, 57, 71, 4,162, 4,113,112,200, 91, 63, 57, 5, 90, 55, 11, 18, 10, 36, 48, 71,135, 74, 73, 14, 13, 34, 55, 11, 18, + 10, 36, 44, 75,135, 74, 73, 14, 13, 0, 0, 0,255,255,252,112, 6, 4, 3,144, 7,110, 16, 7, 5,173,252,201, 0, 0, 0, 0, + 0, 1,252,119,254, 40, 3,147,255,194, 0, 8, 0, 0, 1, 53, 33, 39, 51, 23, 7, 35, 55,252,119, 6,115,132,126,175,175,126, +132,254,195,100,155,205,205,155, 0, 1, 0,160, 4,116, 1,159, 6,102, 0, 3, 0, 17, 64, 6, 1, 0, 4, 2, 0, 4, 16,212, +204, 49, 0, 16,212,204, 48, 27, 1, 51, 3,160, 65,190,110, 4,116, 1,242,254, 14, 0, 0, 0, 0, 1, 0,160,254, 86, 1,159, + 0, 72, 0, 3, 0, 17, 64, 6, 2, 3, 4, 0, 2, 4, 16,212,204, 49, 0, 16,212,204, 48, 37, 3, 35, 19, 1,159, 65,190,110, + 72,254, 14, 1,242, 0, 0, 0, 0, 1, 1,182,254, 86, 2,146,255,164, 0, 13, 0, 0, 1, 35, 34, 39, 38, 61, 1, 51, 21, 20, + 23, 22, 59, 1, 2,146,148, 26, 26, 20,149, 10, 12, 14, 35,254, 86, 33, 26, 46,229,229, 14, 12, 13, 0, 0, 0,255,255, 0,158, +255, 18, 1,195, 4, 35, 18, 6, 0, 30, 0, 0, 0, 1, 1,115, 4,238, 3, 82, 6,102, 0, 3, 0, 49, 64, 9, 2,180, 0,179, + 4, 3, 68, 1, 4, 16,212,236, 49, 0, 16,244,236, 48, 0, 75,176, 9, 84, 75,176, 14, 84, 91, 88,189, 0, 4,255,192, 0, 1, + 0, 4, 0, 4, 0, 64, 56, 17, 55, 56, 89, 1, 51, 1, 35, 2,139,199,254,186,153, 6,102,254,136, 0, 0, 0,255,255, 0,215, + 5, 70, 3, 82, 7,210, 18, 38, 0,106, 0, 0, 17, 7, 2,165, 0, 0, 1,108, 0, 20, 0, 64, 7,175, 8,159, 8, 95, 8, 3, + 93, 64, 5, 95, 8, 15, 8, 2,113, 48, 0, 0,255,255, 0, 16, 0, 0, 5,104, 6,102, 16, 39, 2,165,254,218, 0, 0, 16, 6, + 2,176, 0, 0,255,255, 0,219, 2, 72, 1,174, 3, 70, 18, 6, 0,121, 0, 0,255,255,255,231, 0, 0, 5,117, 6,102, 16, 39, + 2,165,254,116, 0, 0, 16, 7, 2,180, 0,234, 0, 0, 0, 0,255,255,255,243, 0, 0, 6, 31, 6,102, 16, 39, 2,165,254,128, + 0, 0, 16, 7, 2,182, 0,228, 0, 0, 0, 0,255,255,255,237, 0, 0, 2,125, 6,102, 16, 39, 2,165,254,122, 0, 0, 16, 7, + 2,184, 0,234, 0, 0, 0, 0,255,255,255,242,255,227, 6, 1, 6,102, 16, 39, 2,165,254,127, 0, 0, 16, 6, 2,190, 40, 0, +255,255,255,225, 0, 0, 6,145, 6,102, 16, 39, 2,165,254,110, 0, 0, 16, 7, 2,195, 1,170, 0, 0, 0, 0,255,255,255,219, + 0, 0, 6, 5, 6,102, 16, 39, 2,165,254,104, 0, 0, 16, 6, 2,199, 54, 0,255,255, 0, 5, 0, 0, 2,128, 7,210, 16, 39, + 2,166,255, 46, 0, 0, 18, 6, 2,215, 15, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 6, 0, 36, 0, 0,255,255, 0,201, + 0, 0, 4,236, 5,213, 18, 6, 0, 37, 0, 0, 0, 1, 0,201, 0, 0, 4,106, 5,213, 0, 5, 0, 25, 64, 12, 4,149, 1,129, + 0, 7, 2, 4, 28, 1, 4, 6, 16,252,252,204,196, 49, 0, 47,244,236, 48, 51, 17, 33, 21, 33, 17,201, 3,161,253, 41, 5,213, +170,250,213, 0, 0, 2, 0, 16, 0, 0, 5,104, 5,213, 0, 2, 0, 6, 0, 61, 64, 12, 66, 0,149, 4,129, 1,149, 3, 8, 6, + 3, 7, 16,212,196,196, 49, 0, 47,236,244,236, 48, 75, 83, 88, 64, 18, 0, 17, 5, 4, 3, 2, 17, 6, 6, 5, 0, 17, 4, 1, + 17, 3, 3, 4, 5, 7, 16,236, 16,236, 7, 16,236, 8, 16,236, 89, 9, 1, 33, 5, 1, 51, 1, 2,188,254,102, 3, 53,251,185, + 2, 58,229, 2, 57, 5, 14,251,154,168, 5,213,250, 43, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 6, 0, 40, 0, 0, +255,255, 0, 92, 0, 0, 5, 31, 5,213, 18, 6, 0, 61, 0, 0,255,255, 0,201, 0, 0, 5, 59, 5,213, 18, 6, 0, 43, 0, 0, + 0, 3, 0,115,255,227, 5,217, 5,240, 0, 3, 0, 18, 0, 33, 0, 50, 64, 28, 4,149, 19,145, 34, 3,149, 0,173, 34, 11,149, + 26,140, 34, 35, 16, 1, 15, 25, 22, 51, 0, 8, 25, 30, 16, 34, 16,252,236,196,244,236,196,236, 49, 0, 16,244,236, 16,244,236, + 16,244,236, 48, 1, 33, 21, 33, 1, 34, 7, 6, 17, 16, 0, 51, 50, 55, 54, 17, 16, 39, 38, 39, 32, 0, 17, 16, 7, 6, 33, 32, + 39, 38, 17, 16, 55, 54, 1,197, 2,194,253, 62, 1, 98,220,129,130, 1, 3,220,220,129,128,128,129,220, 1, 58, 1,120,188,188, +254,198,254,197,188,189,189,188, 3,112,170, 2,134,164,164,254,229,254,230,254,184,164,164, 1, 26, 1, 27,164,164,164,254, 91, +254,158,254,159,210,211,210,210, 1, 98, 1, 98,211,210, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 18, 6, 0, 44, 0, 0, +255,255, 0,201, 0, 0, 5,106, 5,213, 18, 6, 0, 46, 0, 0, 0, 1, 0, 16, 0, 0, 5,104, 5,213, 0, 6, 0, 60, 64, 11, + 66, 6,149, 2,129, 5, 1, 8, 4, 1, 7, 16,212,196,196, 49, 0, 47, 60,244,236, 48, 75, 83, 88, 64, 18, 6, 17, 3, 2, 1, + 5, 17, 4, 4, 3, 6, 17, 2, 0, 17, 1, 1, 2, 5, 7, 16,236, 16,236, 7, 16,236, 8, 16,236, 89, 51, 35, 1, 51, 1, 35, + 1,229,213, 2, 58,229, 2, 57,210,254, 38, 5,213,250, 43, 5, 14, 0, 0, 0,255,255, 0,201, 0, 0, 6, 31, 5,213, 18, 6, + 0, 48, 0, 0,255,255, 0,201, 0, 0, 5, 51, 5,213, 18, 6, 0, 49, 0, 0, 0, 3, 0,201, 0, 0, 4, 98, 5,213, 0, 3, + 0, 7, 0, 11, 0, 42, 64, 22, 7,149, 4,129, 11, 3,149, 0,173, 8,149, 11, 13, 4, 1, 9, 5, 0, 8, 4, 4, 12, 16,252, + 60,196,212, 60,196,236, 49, 0, 47,236,244,236, 16,244,236, 48, 1, 33, 21, 33, 3, 33, 21, 33, 17, 33, 21, 33, 1, 50, 2,199, +253, 57,105, 3,153,252,103, 3,153,252,103, 3,113,170, 3, 14,170,251,127,170,255,255, 0,115,255,227, 5,217, 5,240, 18, 6, + 0, 50, 0, 0,255,255, 0,201, 0, 0, 5, 59, 5,213, 18, 6, 3, 60, 0, 0,255,255, 0,201, 0, 0, 4,141, 5,213, 18, 6, + 0, 51, 0, 0, 0, 1, 0,201, 0, 0, 4,139, 5,213, 0, 11, 0, 70, 64, 17, 66, 10, 6,149, 7,129, 0, 4,149, 3, 13, 1, + 8, 4, 7, 4, 12, 16,252, 60,212, 60,204, 49, 0, 47,236, 50,244,236, 50, 48, 75, 83, 88, 64, 18, 11, 17, 5, 5, 4, 10, 17, + 6, 6, 5, 11, 17, 5, 0, 17, 4, 5, 4, 5, 7, 16,236, 16,236, 7, 16,236, 8, 16,236, 89, 37, 33, 21, 33, 53, 9, 1, 53, + 33, 21, 33, 1, 1,177, 2,218,252, 62, 1,223,254, 33, 3,176,253, 56, 1,223,170,170,170, 2,112, 2, 17,170,170,253,243, 0, +255,255,255,250, 0, 0, 4,233, 5,213, 18, 6, 0, 55, 0, 0,255,255,255,252, 0, 0, 4,231, 5,213, 18, 6, 0, 60, 0, 0, +255,255, 0,115, 0, 0, 5,217, 5,213, 18, 6, 3, 65, 0, 0,255,255, 0, 61, 0, 0, 5, 59, 5,213, 18, 6, 0, 59, 0, 0, + 0, 1, 0,115, 0, 0, 5,219, 5,213, 0, 29, 0, 46, 64, 23, 16, 13,149, 27, 2, 21, 14, 7,129, 0, 31, 21, 28, 22, 2, 14, + 28, 27, 15, 8, 28, 7, 30, 16,220,236,212, 60,252, 60,212,236,204, 49, 0, 47,228, 50, 50,220, 60,236, 50, 48, 33, 54, 39, 34, + 39, 38, 3, 17, 51, 17, 16, 23, 22, 23, 17, 51, 17, 54, 55, 54, 25, 1, 51, 17, 2, 7, 6, 35, 6, 23, 2,194, 1, 1,214,188, +184, 5,213,130,110,138,202,138,110,130,213, 5,184,188,214, 1, 1,134,176,210,204, 1,104, 1,153,254,103,254,230,164,140, 14, + 3,241,252, 15, 14,140,164, 1, 26, 1,153,254,103,254,152,204,210, 72,238, 0, 0, 1, 0, 78, 0, 0, 5,207, 5,231, 0, 38, + 0, 51, 64, 27, 11,149, 30,145, 38, 3, 18, 21,149, 2, 20, 3, 7, 25, 40, 16, 0, 34, 51, 26, 18, 14, 25, 21, 26, 16, 39, 16, +252,196,252,196, 16,244,196,236,252,196, 49, 0, 47, 60,236, 50, 50, 50,244,236, 48, 37, 21, 33, 53, 54, 55, 54, 53, 52, 39, 38, + 35, 34, 0, 21, 20, 23, 22, 23, 21, 33, 53, 33, 38, 39, 38, 53, 16, 55, 54, 33, 32, 23, 22, 17, 20, 7, 6, 7, 5,207,253,168, +177, 99, 99,132,132,216,216,254,247, 99,100,178,253,168, 1, 63,158, 73, 72,192,191, 1, 49, 1, 47,193,192, 71, 71,161,178,178, +178, 97,166,166,202,240,145,145,254,221,239,202,166,166, 97,178,178,139,149,149,184, 1, 62,197,197,197,196,254,203,194,148,148, +141, 0, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 16, 39, 6,132, 3, 47, 1,117, 19, 6, 2,184, 0, 0, 0, 8,180, 9, + 3, 6, 8, 7, 43, 49, 0, 0,255,255,255,252, 0, 0, 4,231, 5,213, 16, 39, 6,132, 4,113, 1,117, 19, 6, 2,195, 0, 0, + 0, 8,180, 12, 2, 7, 8, 7, 43, 49, 0, 0,255,255, 0,113,255,230, 4,229, 6,102, 18, 38, 2,207, 0, 0, 16, 6, 2,165, +110, 0, 0, 0,255,255, 0,133,255,227, 3,200, 6,102, 16, 38, 2,165, 80, 0, 18, 6, 2,211, 0, 0, 0, 0,255,255, 0,186, +254, 86, 4,100, 6,102, 16, 39, 2,165, 0,198, 0, 0, 18, 6, 2,213, 0, 0,255,255, 0,166, 0, 0, 2,152, 6,102, 18, 38, + 2,215, 0, 0, 16, 7, 2,165,255, 70, 0, 0,255,255, 0,149,255,226, 4, 42, 7,210, 18, 38, 2,227, 0, 0, 16, 6, 2,166, + 27, 0, 0, 0, 0, 2, 0,113,255,230, 4,229, 4,122, 0, 13, 0, 42, 0,200, 64, 11, 18, 17, 7, 44, 16, 23, 7, 18, 37, 69, + 43, 16,252,236,212,196,196, 18, 57, 57, 64, 10, 63, 16, 47, 16, 31, 16, 3,143, 16, 1, 93,113, 0, 64, 17, 18, 17, 11, 3,185, + 41,184, 25, 11,185, 33,140, 15,188, 22,135, 25, 47,236,228,244,236, 16,244,236, 17, 57, 57, 5, 64, 20, 29, 17, 0, 17, 14, 17, + 18, 17, 17, 16, 15, 17, 14, 17, 0, 17, 29, 17, 17, 16, 7, 16, 60,236,236,236, 8, 7, 16, 60,236,236, 49, 48, 1, 64, 11,132, + 18,134, 17,136, 1,137, 13,128, 16, 5, 93, 64, 19, 73, 19, 73, 18, 73, 28, 74, 29, 78, 13, 76, 0, 78, 1, 73, 14, 75, 17, 9, + 93, 64, 17, 58, 14, 57, 18, 58, 17, 56, 29, 56, 17, 63, 13, 60, 0, 62, 1, 8, 93, 64, 11, 43, 13, 43, 1, 42, 0, 41, 14, 41, + 17, 5, 93, 64, 13, 25, 15, 24, 14, 27, 13, 27, 1, 26, 0, 25, 17, 6, 93, 0, 64, 5, 43, 30, 43, 31, 2, 93, 1, 39, 38, 39, + 38, 7, 6, 21, 20, 23, 22, 51, 50, 55, 27, 1, 51, 3, 23, 22, 23, 22, 59, 1, 21, 35, 34, 39, 38, 39, 6, 7, 6, 39, 38, 39, + 38, 17, 16, 55, 54, 55, 36, 3, 78, 44, 45,178,134, 61, 77, 75, 76,121,134, 72,164, 99,164,205, 40, 9, 35, 41, 32, 88,110, 94, + 84, 41, 17, 44, 96, 44,143,234,115,117,127,141,198, 1, 55, 2, 9,231,236, 1, 1,111,137,183,220,105,107,213, 1,231, 1, 37, +253,161,219, 49, 41, 48,156, 84, 42, 88,107, 91, 42, 1, 2,150,156, 1, 20, 1, 41,135,151, 3, 5, 0, 0, 0, 0, 2, 0,191, +254, 86, 4,137, 6, 33, 0, 14, 0, 28, 0, 55, 64, 15, 24, 18, 7, 30, 69, 19, 18, 11, 22, 0, 28, 8, 3, 70, 29, 16,252,236, + 50,196,212,236,228,212,236, 49, 0, 64, 14, 26,185, 5, 9, 21,185, 22, 17,185, 13,140, 2,189, 29, 16,236,244,236,212,252, 57, +212,236, 48, 37, 17, 35, 17, 16, 33, 32, 19, 18, 7, 4, 19, 18, 37, 38, 3, 22, 55, 32, 17, 16, 5, 53, 4, 17, 52, 7, 32, 17, + 1,121,185, 1,170, 1,176, 2, 3,175, 1, 23, 1, 2,254, 28,212, 89,111,197, 1, 32,254, 48, 1,107,234,254,251, 69,254, 17, + 6, 3, 1,200,254,127,254,238,100, 90,254,245,254, 37, 1, 1, 1, 73,174, 1, 1, 58, 1, 26, 22,170, 6, 1, 70,220, 1,254, +200, 0, 0, 0, 0, 1, 0, 32,254, 86, 4,127, 4, 96, 0, 14, 0, 64, 64, 7, 16, 3, 7, 8, 4, 12, 15, 16,212,212,252,212, +196, 49, 0, 64, 7, 2, 12,191, 6,189, 4, 7, 47, 60,236,228, 50, 48, 5, 64, 18, 1, 17, 8, 7, 2, 17, 3, 4, 3, 14, 13, + 1, 17, 0, 17, 7, 8, 7, 7, 16,236,236, 57, 57, 7, 16,236, 8,236, 1, 19, 1, 51, 1, 17, 35, 17, 1, 38, 43, 1, 53, 51, + 50, 1,105,245, 1, 94,195,254, 59,184,254,218, 44, 95, 49, 70,197, 3,176,253, 76, 3,100,251,160,254, 86, 1,170, 3, 68,126, +158, 0, 0, 0, 0, 2, 0,113,255,227, 4,117, 5,240, 0, 28, 0, 45, 0, 84, 64, 20, 6, 5, 40, 4, 47, 69, 28, 40, 18, 10, + 81, 18, 4, 18, 24, 33, 18, 18, 69, 46, 16,252,236,212,236, 16,244,178,127, 10, 1, 93,236,196,236, 17, 18, 57, 57, 0, 64, 14, + 6, 5, 37, 2, 28, 0, 2,185, 26, 37,185, 14,140, 46, 16,244,236,212,252,212,204, 17, 18, 57, 57, 64, 6, 22, 29, 83, 5, 6, + 5, 7, 14, 16,236, 57, 49, 48, 1, 38, 35, 34, 21, 20, 5, 22, 23, 22, 17, 16, 7, 6, 35, 34, 39, 38, 17, 52, 55, 54, 55, 38, + 53, 16, 33, 50, 23, 1, 6, 7, 6, 21, 20, 23, 22, 51, 50, 54, 53, 52, 39, 38, 39, 38, 3,236,102,239,253, 1, 8,208,117,142, +137,137,240,239,138,137,137, 53, 75,156, 1,185,221,120,254, 24, 68, 55, 86, 85, 86,149,147,172, 91, 97,126, 64, 5, 17, 70,117, + 92, 48, 37,112,135,254,235,254,247,156,157,157,156, 1, 19,204,165, 64, 36, 79,141, 1, 16, 70,254, 40, 29, 73,113,204,203,114, +115,232,190,199, 96,103, 11, 6, 0, 1, 0,133,255,227, 3,200, 4,124, 0, 50, 0, 61, 64, 34, 12,134, 11,136, 16,185, 8,184, + 51, 27,169, 24, 51, 39,134, 40,136, 35,185, 44,140, 51, 52, 25, 11, 39, 20, 8, 4, 31, 8, 48, 69, 51, 16,252,236,212,236,212, +196,196,196, 49, 0, 16,244,236,244,236, 16,212,236, 16,244,236,244,236, 48, 1, 38, 39, 38, 53, 52, 55, 54, 51, 50, 22, 23, 21, + 38, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 59, 1, 21, 35, 34, 7, 6, 21, 20, 23, 22, 51, 50, 55, 54, 55, 21, 6, 7, 6, 35, + 34, 39, 38, 53, 52, 54, 1,139,112, 60, 60,114,113,196, 76,170, 98, 97, 80, 81, 71,119, 69, 70, 68, 67,116,155,148,137, 72, 78, + 84, 85,151, 93, 85, 85, 71, 90, 84, 85, 80,238,129,129,138, 2, 92, 24, 65, 64, 93,141, 79, 78, 24, 24,167, 29, 13, 13, 46, 46, + 64, 70, 45, 44,152, 51, 56, 88, 90, 56, 56, 18, 19, 37,171, 28, 14, 14, 91, 91,173,108,146, 0, 0, 1, 0,107,254, 82, 3,248, + 6, 20, 0, 29, 0, 62, 64, 11, 10, 14, 18, 31, 4, 25, 24, 28, 18, 20, 30, 16,212,236,212,212,212,196,252,204, 75,176, 16, 81, + 88,185, 0, 22, 0, 64, 56, 89, 49, 0, 64, 14, 8,185, 10, 0,185, 18,140, 30, 26, 23,135, 24,151, 30, 16,244,236, 50, 16,244, +236,220,236, 48, 37, 22, 23, 22, 21, 20, 7, 6, 35, 52, 53, 22, 55, 54, 53, 52, 39, 38, 35, 32, 3, 16, 1, 33, 53, 33, 21, 0, + 17, 16, 2,202,132, 79, 84, 74, 80,163, 69, 42, 32, 32, 31, 58,253,162, 1, 2, 59,253,236, 3,102,253, 44,127, 1, 75, 79,120, +115, 80, 87, 75, 76, 5, 44, 35, 37, 53, 44, 42, 2, 51, 1,236, 1, 89,185,185,254,148,254, 39,254,105, 0, 0, 0, 1, 0,186, +254, 86, 4,100, 4,123, 0, 21, 0, 49, 64, 22, 6,135, 14, 18,184, 12,188, 2,189, 11, 23, 70, 3, 8, 0, 78, 9, 13, 8, 12, + 70, 22, 16,252,236, 50,244,236,236, 49, 0, 47,236,228,244,196,236, 48, 64, 5,160, 23,128, 23, 2, 1, 93, 1, 17, 35, 17, 52, + 38, 35, 34, 6, 21, 17, 35, 17, 51, 21, 54, 55, 54, 51, 50, 23, 22, 4,100,184,124,124,149,172,185,185, 66, 89, 90,117,193, 99, + 99, 2,164,251,178, 4, 72,159,158,190,164,253,135, 4, 96,174,101, 50, 50,119,120, 0, 0, 0, 0, 3, 0,113,255,233, 4,117, + 6, 36, 0, 8, 0, 17, 0, 33, 0, 63, 64, 27, 13,185, 18,151, 34, 1,149, 17, 34, 5,185, 26,140, 34, 35, 69, 0, 9, 18, 22, + 81, 1, 17, 18, 30, 69, 34, 16,252,236, 50,244,178,127, 22, 1, 93,236, 50,236, 49, 0, 16,244,236, 16,212,236, 16,244,236, 48, + 64, 5,160, 35,128, 35, 2, 1, 93, 1, 33, 18, 23, 22, 51, 50, 55, 54, 19, 2, 39, 38, 35, 34, 7, 6, 3, 1, 50, 23, 22, 17, + 16, 7, 6, 35, 34, 39, 38, 17, 16, 55, 54, 3,177,253,131, 15, 69, 86,149,150, 83, 73, 9, 28, 54, 86,147,153, 81, 64, 19, 1, + 61,240,137,137,137,137,240,241,136,137,137,136, 2,198,254,213,127,156,157,138, 1,201, 1, 28,100,158,156,126,254,252, 2,180, +212,211,254,138,254,139,212,213,213,212, 1,117, 1,118,211,212, 0, 1, 0,166, 0, 0, 2,110, 4, 96, 0, 13, 0, 27, 64, 7, + 15, 6, 0, 8, 13, 70, 14, 16,252,252,212,196, 49, 0, 64, 5, 13,188, 5,135, 8, 47,236,228, 48, 1, 17, 20, 23, 22, 59, 1, + 21, 35, 34, 39, 38, 53, 3, 1, 99, 34, 36,108, 89,111,180, 82, 82, 1, 4, 96,253, 43,145, 46, 48,156, 96, 98,212, 2,202, 0, + 0, 1, 0,191, 0, 0, 4,133, 4, 96, 0, 11, 0, 73, 64, 9, 13, 6, 4, 9, 1, 8, 11, 70, 12, 16,252,236, 50,196,212,196, + 49, 0, 64, 5, 3, 0,188, 7, 11, 47, 60,228, 50, 48, 64, 22, 8, 17, 9, 4, 5, 7, 17, 6, 6, 5, 8, 5, 9, 4, 3, 17, + 4, 2, 17, 9, 9, 4, 7, 16, 4,236, 16, 5,236, 9, 60, 60, 7, 16, 5,236, 16, 8,236, 19, 51, 17, 1, 51, 9, 1, 35, 1, + 7, 17, 35,191,190, 1,227,224,254, 71, 1,254,225,254, 98,137,190, 4, 96,254, 47, 1,209,254, 90,253, 70, 2, 66,129,254, 63, + 0, 1, 0, 61, 0, 0, 4,127, 6, 21, 0, 13, 0, 70, 64, 5, 15, 1, 11, 5, 14, 16,212,196,212,196, 49, 0, 64, 6, 10,135, + 11,151, 2, 5, 47, 60,244,236, 48, 64, 24, 3, 17, 1, 0, 6, 4, 17, 5, 6, 5, 7, 17, 6, 17, 3, 17, 1, 0, 0, 2, 17, + 0, 1, 0, 7, 16, 5,236, 16, 9,236,236, 5,236, 7, 16, 5,236, 16, 8,236, 9, 1, 35, 9, 1, 35, 1, 39, 38, 43, 1, 53, + 23, 22, 2,122, 2, 5,195,254,198,254,126,195, 1,235, 74, 47,107, 96,117,226, 5,101,250,155, 3, 60,252,196, 4, 50,198,126, +158, 2, 3, 0,255,255, 0,174,254, 86, 4,229, 4, 96, 16, 6, 0,119, 0, 0, 0, 1, 0, 74, 0, 0, 4, 24, 4, 96, 0, 21, + 0, 65, 64, 7, 23, 7, 18, 17, 0, 1, 22, 16,212,196,212,236,196, 49, 64, 4, 11, 1,188, 0, 0, 47,228, 50, 48, 64, 21, 20, + 19, 18, 17, 21, 17, 6, 5, 4, 3, 7, 3, 17, 1, 0, 0, 2, 17, 1, 1, 0, 7, 16, 5,236, 16, 9,236, 18, 23, 57, 5,236, + 18, 23, 57, 33, 1, 51, 1, 54, 55, 54, 55, 54, 39, 38, 39, 51, 49, 22, 23, 22, 21, 20, 7, 6, 7, 1,160,254,170,198, 1, 33, +120,100, 76, 4, 2, 24, 28,106,186, 69, 46, 42,136,177,123, 4, 96,252, 84,124,172,129,112, 53,100,119,131, 89,124,114, 78,196, +175,228,116, 0, 0, 1, 0,107,254, 82, 4, 1, 6, 20, 0, 38, 0, 64, 64, 15, 10, 14, 18, 40, 4, 34, 29, 28, 32, 18, 24, 37, + 18, 20, 39, 16,212,236,212,236,212,212,196,212,196,252,204, 49, 64, 18, 8,185, 10, 0,185, 18,140, 39, 22, 35,135, 34, 30, 27, +135, 28,151, 39, 0, 16,244,252, 60,212,236, 57, 16,244,236,220,236, 48, 37, 22, 23, 22, 21, 20, 7, 6, 35, 52, 53, 22, 55, 54, + 53, 52, 39, 38, 35, 32, 17, 16, 37, 36, 17, 52, 55, 35, 53, 33, 21, 32, 17, 20, 5, 21, 36, 19, 18, 2,218,132, 79, 84, 74, 80, +163, 69, 42, 32, 32, 31, 58,253,145, 1, 77,254,232,220,208, 3, 21,253,139, 2, 16,253,198, 2, 1,127, 1, 75, 79,120,115, 80, + 87, 75, 76, 5, 44, 35, 37, 53, 44, 42, 1,181, 1, 44, 88, 36, 1, 4,197, 82,185,185,254,221,191, 9,170, 22,254,188,254,241, +255,255, 0,113,255,227, 4,117, 4,123, 18, 6, 0, 82, 0, 0, 0, 1, 0, 74,255,217, 4,152, 4, 96, 0, 23, 0, 47, 64, 11, + 25, 10, 1, 18, 8, 3, 19, 8, 0, 22, 24, 16,220,196,236,212,236,196,196,204, 49, 64, 12, 7,135, 14,140, 21, 3, 19, 23,135, + 0,188, 21, 0, 47,244,236, 50, 50, 16,244,236, 48, 19, 33, 21, 35, 17, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 53, 17, + 33, 17, 35, 17, 35, 74, 4, 49,141, 49, 55, 15, 44, 7, 35, 74, 37,120, 92,254, 99,188,143, 4, 96,184,253, 80, 72, 63, 5, 1, +133, 13, 12,131,176, 2,156,252, 88, 3,168, 0, 0, 2, 0,186,254, 86, 4,164, 4,123, 0, 17, 0, 29, 0, 49, 64, 25, 21,185, + 4,184, 30, 27,185, 10,140, 15,189, 30, 31, 69, 18, 18, 7, 81, 13, 8, 24, 18, 16, 70, 30, 16,252,236,236,244,178,127, 7, 1, + 93,236,236, 49, 0, 16,236,244,236, 16,244,236, 48, 1, 54, 55, 54, 51, 50, 0, 17, 16, 2, 35, 34, 38, 39, 17, 35, 17, 52, 5, + 52, 38, 35, 34, 6, 21, 20, 22, 51, 50, 54, 1, 20, 61,151, 59,182,204, 0,255,255,204,123,177, 58,185, 3, 43,167,146,146,167, +167,146,146,167, 3,152,102, 90, 35,254,188,254,248,254,248,254,188, 97,100,253,174, 3,207,231,221,203,231,231,203,203,231,231, + 0, 1, 0,113,254, 82, 3,231, 4,123, 0, 36, 0, 54, 64, 12, 29, 33, 18, 23, 38, 9, 72, 16, 18, 3, 69, 37, 16,252,236,244, +204,212,252,196, 49, 64, 17, 27,185, 29, 19,185, 0,140, 37, 9,134, 10,136, 13,185, 6,184, 37, 0, 16,244,252,244,236, 16,244, +236,220,236, 48, 5, 32, 0, 17, 16, 0, 33, 50, 22, 23, 21, 46, 1, 35, 34, 6, 21, 20, 22, 51, 50, 23, 22, 21, 20, 7, 6, 35, + 52, 53, 22, 55, 54, 53, 52, 39, 38, 2,168,254,243,254,214, 1, 45, 1, 6, 85,162, 76, 78,157, 80,179,198,198,175,131, 80, 84, + 74, 80,163, 69, 42, 32, 32, 31, 29, 1, 62, 1, 14, 1, 18, 1, 58, 35, 35,172, 43, 43,227,205,205,227, 76, 79,120,115, 80, 87, + 75, 76, 5, 44, 35, 37, 53, 44, 42, 0, 0, 0, 0, 2, 0,113,255,227, 4,214, 4, 98, 0, 13, 0, 30, 0, 49, 64, 11, 32, 15, + 10, 18, 19, 81, 4, 18, 27, 69, 31, 16,252,236,244,178,127, 19, 1, 93,236,212,196, 49, 64, 12, 7,185, 23,140, 31, 17,135, 0, +185, 14,188, 31, 0, 16,244,236,236, 16,244,236, 48, 1, 34, 7, 6, 21, 20, 22, 51, 50, 54, 53, 52, 39, 38, 39, 5, 21, 35, 22, + 21, 16, 7, 6, 35, 34, 39, 38, 17, 16, 55, 54, 2,115,152, 82, 86,171,149,147,172, 86, 79,154, 2, 99,206,109,137,137,240,241, +136,137,137,114, 3,206,110,115,190,201,231,232,200,183,122,110,147, 1,184,156,221,254,237,156,157,157,156, 1, 19, 1, 20,156, +130, 0, 0, 0, 0, 1, 0,100, 0, 0, 4,109, 4, 96, 0, 17, 0, 35, 64, 8, 19, 13, 3, 15, 8, 12, 10, 18, 16,212,196,252, +196,196,196, 49, 0, 64, 8, 15, 11,135, 12,188, 2,185, 5, 47,236,244,236, 50, 48, 37, 22, 59, 1, 21, 35, 34, 39, 38, 53, 17, + 33, 53, 33, 21, 33, 17, 20, 2,230, 36,108, 89,111,180, 82, 82,254, 92, 4, 9,254, 87,204, 48,156, 96, 98,212, 2, 18,184,184, +253,227,145, 0, 0, 1, 0,149,255,226, 4, 42, 4, 96, 0, 28, 0, 43, 64, 10, 30, 69, 9, 18, 19, 0, 8, 28, 70, 29, 16,252, +236,212,236,228, 64, 7, 63, 30, 63, 9, 63, 19, 3, 93, 49, 0, 64, 6, 13, 28,188, 5,185, 23, 47,236,244, 60, 48, 1, 17, 20, + 23, 22, 51, 50, 55, 54, 55, 54, 39, 38, 39, 51, 49, 22, 23, 22, 21, 20, 7, 6, 39, 34, 39, 38, 53, 3, 1, 82, 50, 55,107,150, +105, 59, 15, 8, 30, 28,106,186, 70, 45, 42,128,156,254,179,101, 98, 1, 4, 96,253, 43,135, 64, 69,208,118,187,102,128,119,131, + 90,123,115,154,253,187,228, 1,120,118,197, 2,202, 0, 0, 0, 0, 2, 0,111,254, 86, 4,210, 4,104, 0, 10, 0, 41, 0, 61, + 64, 16, 43, 69, 7, 18, 15, 19, 2, 8, 30, 22, 40, 35, 18, 26, 69, 42, 16,252,236,212, 60,204,252, 60,212,236,236, 49, 0, 64, + 16, 0, 31,185, 11, 30,184, 42, 3, 39,135, 19, 22,140, 21,189, 42, 16,236,244, 60,236, 50, 16,244, 60,236, 50, 48, 1, 34, 21, + 17, 50, 55, 54, 39, 38, 39, 38, 39, 50, 23, 22, 19, 18, 7, 6, 35, 17, 35, 17, 34, 39, 38, 17, 2, 55, 54, 55, 21, 6, 7, 6, + 23, 22, 23, 22, 51, 17, 16, 3, 61, 65, 94, 96, 86, 1, 1, 85, 70, 54,144,123,133, 4, 4,141,133,199,183,199,134,136, 1,137, +104,164, 66, 58, 87, 1, 1, 85, 76,113, 3,203,145,253, 82,104, 93,223,208,112, 91,157,132,141,254,217,254,241,161,152,254,110, + 1,145,153,156, 1, 19, 1, 30,146,109, 28,163, 23, 78,115,190,202,115,103, 2,175, 1, 46, 0, 0, 1, 0, 59,254, 85, 4,100, + 4, 97, 0, 23, 0,118, 64, 12, 17, 16, 5, 4, 4, 9, 25, 20, 15, 3, 9, 24, 16,212,196,212,196,196, 18, 23, 57, 0, 64, 18, + 17, 16, 5, 4, 4, 19, 8,135, 14, 9,188, 24, 19,135, 22, 3,189, 24, 16,244, 60,236, 16,244, 60,236, 17, 23, 57, 5, 64, 20, + 14, 17, 15, 16, 15, 12, 17, 5, 5, 4, 2, 17, 3, 4, 3, 0, 17, 17, 17, 16, 7, 16,236, 7, 16,236, 7, 16,236, 7, 16,236, + 64, 20, 16, 17, 12, 15, 2, 13, 17, 12, 14, 3, 4, 14, 3, 5, 0, 1, 15, 2, 5, 0, 15, 15, 15, 15, 49, 48, 5, 3, 1, 35, + 1, 3, 38, 43, 1, 53, 23, 4, 23, 19, 1, 51, 1, 19, 22, 59, 1, 21, 39, 36, 2,220,149,254,205,217, 1,178,182, 49,154, 49, + 70, 1, 2, 65,148, 1, 51,217,254, 78,182, 49,154, 49, 70,254,254,250, 1,127,253,208, 3, 24, 1,215,126,158, 2, 7,167,254, +129, 2, 48,252,232,254, 41,126,158, 2, 7, 0, 0, 1, 0,112,254, 86, 4,209, 4, 96, 0, 27, 0, 54, 64, 13, 29, 19, 8, 20, + 25, 13, 8, 0, 12, 6, 8, 5, 28, 16,220,236,212, 60,252, 60,212,236,204, 49, 0, 64, 14, 19, 12, 5,188, 28, 14, 11,135, 25, + 0,140, 27,189, 28, 16,236,244, 60,236, 50, 16,244, 60, 60, 48, 5, 38, 39, 38, 53, 17, 51, 17, 20, 23, 22, 23, 17, 51, 17, 54, + 55, 54, 53, 17, 51, 17, 20, 7, 6, 7, 17, 35, 2, 69,231,107,131,186, 85, 74,124,183,131, 67, 85,186,131,118,220,183, 25, 37, + 97,119,243, 2,137,253,126,183, 76, 66, 14, 3,213,252, 44, 14, 66, 84,175, 2,129,253,120,252,110, 99, 35,254,110, 0, 0, 0, + 0, 1, 0,135,255,226, 6, 40, 4, 96, 0, 26, 0, 56, 64, 20, 18, 18, 19, 28, 69, 16, 18, 21, 11, 8, 12, 7, 18, 2, 5, 18, + 4, 2, 69, 27, 16,252,220,236, 16,236,212,252,212,236,236,220,236, 49, 0, 64, 9, 11, 18, 4,188, 14, 9,135, 23, 0, 47, 60, +236, 50,244, 60,196, 48, 5, 32, 17, 52, 19, 51, 2, 21, 2, 51, 50, 3, 51, 2, 55, 54, 17, 52, 3, 51, 18, 21, 18, 37, 36, 3, + 2, 2, 38,254, 97,155,198,143, 1,223,207, 4,170, 4,207,222,143,198,155, 2,254, 95,254,241, 34, 41, 29, 2, 82,235, 1, 64, +254,192,240,254, 79, 2, 26,253,227, 3, 2, 1,175,240, 1, 64,254,192,235,253,173, 1, 1, 1, 42,254,213, 0,255,255, 0, 5, + 0, 0, 2,125, 6, 16, 18, 38, 2,215, 15, 0, 16, 7, 0,106,255, 46, 0, 0,255,255, 0,149,255,226, 4, 42, 6, 16, 16, 38, + 0,106, 29, 0, 18, 6, 2,227, 0, 0, 0, 0,255,255, 0,113,255,227, 4,117, 6,102, 16, 38, 2,165,125, 0, 18, 6, 2,221, + 0, 0, 0, 0,255,255, 0,149,255,226, 4, 42, 6,102, 16, 38, 2,165, 34, 0, 18, 6, 2,227, 0, 0, 0, 0,255,255, 0,135, +255,226, 6, 40, 6,102, 18, 38, 2,231, 0, 0, 16, 7, 2,165, 1, 89, 0, 0, 0, 3, 0,166,255,233, 4, 77, 6, 36, 0, 13, + 0, 37, 0, 53, 0, 0, 1, 50, 55, 54, 55, 54, 53, 52, 39, 38, 39, 38, 7, 6, 1, 22, 23, 22, 21, 20, 7, 6, 35, 34, 39, 38, + 3, 2, 55, 54, 23, 22, 23, 22, 23, 22, 7, 6, 7, 6, 7, 6, 35, 16, 23, 22, 51, 50, 55, 54, 55, 52, 39, 38, 1,105, 80, 84, +119, 68,121, 36, 50,117,122, 93, 54, 1,238, 96, 59, 91, 59,126,246,252,139,111, 1, 1,120,134,210,164,107,111, 1, 1, 55, 38, +251, 67, 93, 74, 78, 58, 80,174,143, 87, 24, 1, 79, 94, 3,112, 1, 3, 61,108,147, 87, 53, 73, 9, 10,196,112,254,203, 65, 75, +117,143,130, 95,213,213,168, 1,161, 1,139,190,213, 1, 1,111,115,155,128,107, 75,150, 15, 3, 2,254,234,128,176,156, 45, 86, +123, 72, 86, 0, 0, 2, 0,112,255,233, 4,118, 6, 36, 0, 11, 0, 40, 0, 0, 1, 54, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, + 5, 4, 39, 38, 17, 52, 55, 54, 51, 50, 23, 22, 3, 2, 7, 6, 35, 34, 39, 38, 19, 23, 2, 23, 22, 51, 50, 55, 54, 3,174, 6, + 55, 75,140, 83, 64, 56,121, 74, 1, 19,254,204,131,211,104,104,175,209,135,128, 9, 9,128,137,240,237,140,149, 12,195, 33,117, + 85,150,144, 89, 95, 3,112,246,126,170, 71, 66, 90,153,107, 65,160, 9, 74,120, 1, 39,160,110,112,212,200,254,127,254,125,198, +213,213,225, 1,210, 1,254,130,215,155,156,166, 0, 1, 0, 87, 0, 0, 5, 81, 5,223, 0, 27, 0, 0, 1, 6, 3, 6, 21, 17, + 35, 17, 52, 39, 2, 39, 38, 7, 53, 54, 23, 4, 19, 18, 37, 54, 23, 22, 7, 6, 39, 38, 4, 70,160, 82, 42,203, 42, 82,160,116, +120, 67,160, 1, 67, 72,107, 1, 31,111, 64,120, 54, 33,117, 86, 5, 17, 72,254,243,141,165,253,118, 2,138,165,141, 1, 13, 72, + 52, 26,170, 21, 24, 48,254,114, 1,123, 67, 26, 49, 93,150, 86, 26, 18, 0, 0,255,255,255,225, 0, 0, 6,161, 6,102, 16, 39, + 2,165,254,110, 0, 0, 16, 7, 2,239, 1, 80, 0, 0, 0, 0,255,255, 0, 87, 0, 0, 5, 81, 5,223, 16, 39, 6,132, 4,197, + 1,117, 18, 6, 2,239, 0, 0, 0, 3, 0,112,254, 86, 4,209, 6, 20, 0, 21, 0, 30, 0, 39, 0, 65, 64, 16, 41, 26, 18, 6, + 9, 1, 30, 8, 12, 20, 32, 36, 18, 16, 69, 40, 16,252,236,212, 60, 60,252, 60, 60,212,236,196, 49, 64, 18, 30, 32,135, 1, 20, +184, 40, 22, 31,135, 9, 12,140, 21,151, 11,189, 40, 0, 16,236,228,244, 60,252, 60, 16,244, 60,252, 60, 48, 1, 17, 50, 23, 22, + 17, 16, 7, 6, 35, 17, 35, 17, 34, 39, 38, 17, 16, 55, 54, 51, 17, 19, 50, 55, 54, 55, 54, 39, 38, 35, 3, 17, 34, 7, 6, 23, + 22, 23, 22, 2,252,199,133,137,137,133,199,183,199,134,136,136,134,199,183,113, 77, 84, 1, 1, 86, 77,113,183,113, 76, 87, 1, + 1, 85, 76, 6, 20,254, 99,153,156,254,237,254,237,156,153,254,111, 1,145,153,156, 1, 19, 1, 19,156,153, 1,157,250,119,103, +115,202,200,117,103,252,184, 3, 72,103,117,200,202,115,103, 0, 0, 2, 0, 65,255,226, 6,109, 4, 96, 0, 16, 0, 30, 0, 0, + 19, 53, 33, 21, 35, 22, 21, 16, 37, 36, 3, 2, 33, 32, 17, 52, 55, 41, 1, 6, 21, 16, 51, 50, 3, 51, 2, 55, 54, 17, 52, 65, + 6, 44,147, 77,254, 97,254,241, 34, 41,254,248,254, 97, 77, 4, 58,252,146, 71,222,207, 4,170, 4,207,222, 3,168,184,184,207, +164,253,173, 1, 1, 1, 42,254,213, 2, 82,164,207,209,167,254, 79, 2, 26,253,227, 3, 3, 1,174,167, 0, 0, 0, 1, 0,111, +254, 91, 4,206, 4,103, 0, 47, 0, 0, 5, 38, 39, 38, 55, 7, 2, 7, 6, 39, 38, 55, 54, 55, 54, 39, 38, 35, 34, 7, 53, 54, + 23, 22, 23, 22, 7, 55, 18, 55, 54, 23, 22, 7, 6, 7, 6, 23, 22, 51, 50, 55, 2, 7, 6, 39, 53, 4, 3,249,246, 33, 21, 24, +189, 96,200,141, 3, 1, 61, 96,136, 91, 43, 26,142, 57, 91, 82,126,246, 33, 19, 42,189, 96,200,141, 3, 1, 61, 96,136, 91, 43, + 26,142, 57, 91, 38,205,152,173, 1, 55, 10, 32,240,156, 99,108,254,247,124, 89,145, 68, 84,132,124,203,169,104,108,224, 61, 17, + 34,238,140,112,108, 1, 9,124, 89,145, 68, 84,132,124,203,169,104,108,253,224,102, 77, 90,160,160, 0, 0, 0, 0, 2, 0,115, +254, 88, 5,217, 5,240, 0, 15, 0, 25, 0, 0, 5, 17, 35, 17, 38, 39, 38, 16, 0, 33, 32, 0, 17, 16, 7, 6, 2, 32, 0, 17, + 16, 0, 32, 0, 17, 16, 3,132,184,252,160,189, 1,121, 1, 59, 1, 58, 1,120,188,159,123,254, 72,254,253, 1, 3, 1,184, 1, + 1, 24,254,112, 1,144, 26,179,210, 2,196, 1,165,254, 91,254,158,254,159,210,179, 5, 73,254,184,254,229,254,230,254,184, 1, + 72, 1, 26, 1, 27, 0, 0, 0, 0, 2, 0,113,254, 86, 4,117, 4,123, 0, 10, 0, 27, 0, 0, 1, 34, 6, 16, 22, 51, 50, 54, + 53, 52, 38, 3, 17, 35, 17, 38, 39, 38, 17, 16, 0, 51, 50, 0, 17, 16, 7, 6, 2,115,148,172,171,149,147,172,172, 57,170,190, +107,137, 1, 17,241,240, 1, 18,137,106, 3,223,231,254,110,231,232,200,199,233,252, 9,254,110, 1,146, 27,125,156, 1, 19, 1, + 20, 1, 56,254,200,254,236,254,237,156,123, 0, 0, 1, 0,139,254, 82, 4,171, 5,213, 0, 36, 0, 0, 1, 32, 7, 6, 17, 16, + 23, 22, 51, 50, 23, 22, 21, 20, 7, 6, 35, 52, 53, 22, 55, 54, 53, 52, 39, 38, 35, 32, 39, 38, 17, 16, 55, 54, 41, 1, 21, 3, + 70,254,243, 96,123, 91,109,200,122, 89, 84, 74, 80,163, 69, 42, 32, 32, 31, 58,254,192,142,149,185,138, 1,120, 1,101, 5, 43, +119,152,254,205,254,181,127,152, 84, 79,120,115, 80, 87, 75, 76, 5, 44, 35, 37, 53, 44, 42,203,214, 1,101, 1, 78,237,177,170, + 0, 1, 0,113,254, 82, 4, 81, 4, 97, 0, 34, 0, 0, 1, 34, 7, 6, 21, 20, 22, 51, 50, 23, 22, 21, 20, 7, 6, 35, 52, 53, + 22, 55, 54, 53, 52, 39, 38, 35, 34, 0, 17, 52, 55, 54, 5, 33, 21, 2,172,216, 62, 99,198,110,131, 80, 84, 74, 80,163, 69, 42, + 32, 32, 32, 57,204,254,214,151,104, 1, 52, 1,173, 3,168, 72,113,192,205,227, 76, 79,120,115, 80, 87, 75, 76, 5, 44, 35, 37, + 53, 44, 42, 1, 62, 1, 14,243,188,131, 1,184,255,255, 0,201, 0, 0, 4, 35, 5,213, 18, 6, 0, 41, 0, 0, 0, 1,255, 64, +254, 86, 3, 70, 6, 20, 0, 35, 0, 0, 51, 17, 52, 55, 54, 51, 50, 22, 23, 21, 46, 1, 35, 34, 7, 6, 21, 17, 33, 21, 33, 17, + 20, 7, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 55, 54,238,136, 96,169, 49, 99, 51, 36, 82, 44,120, 58, 75, 1, 65,254,191,139, + 98,173, 57,102, 46, 49,100, 48, 87, 64, 82, 4,130,160,142,100, 18, 18,164, 28, 29, 62, 81,111,254,201,143,253, 63,146,165,115, + 21, 22,164, 31, 33, 75, 95, 0, 0, 1, 0,179,255,252, 4,212, 5,213, 0, 23, 0, 0, 1, 3, 1, 3, 6, 23, 22, 55, 21, 34, + 39, 38, 55, 19, 1, 19, 54, 39, 38, 7, 53, 50, 23, 22, 2, 54,110, 3, 12,234, 39, 27, 66,131,230, 81, 95, 19,154,253, 6,172, + 39, 27, 66,131,230, 81, 95, 4,135,254, 91, 1,126,253, 44, 96, 42,108, 35,189, 70, 82,182, 1,218,254,145, 2,144, 96, 42,108, + 35,189, 70, 82, 0, 1, 0,191, 0, 0, 4,136, 6, 19, 0, 7, 0, 0, 9, 1, 35, 19, 33, 1, 51, 3, 4,136,254,231,184,226, +253, 38, 1, 25,184,226, 3,112,252,144, 2,198, 3, 77,253, 93, 0, 1, 0,114,254, 86, 6, 96, 5,241, 0, 33, 0, 0, 1, 17, + 35, 17, 6, 7, 53, 54, 5, 4, 19, 18, 17, 16, 3, 35, 0, 17, 16, 39, 6, 7, 6, 23, 17, 35, 54, 17, 52, 63, 1, 38, 37, 38, + 2, 81,170,205,104,208, 1,130, 1,217,237,214,246,225, 1, 4, 82, 56,121, 69, 5,205, 2,182,187,208,254,164, 48, 5, 58,253, +140, 2, 73, 75,105,198,215, 8, 10,254,216,254,241,253,189,254, 88,254,146, 1, 76, 1,202, 1,209,125, 32, 92, 52,208,253,198, + 33, 2, 20,247,143,141,249, 11, 1, 0, 0, 0, 0, 1, 0,119,254,144, 4,150, 4,120, 0, 22, 0, 0, 1, 3, 35, 1, 38, 39, + 1, 35, 1, 38, 39, 38, 35, 53, 32, 23, 22, 19, 18, 17, 35, 16, 39, 3,110,239,185, 1,100, 14, 50,254, 70,185, 2, 31, 98, 46, +188,211, 1, 45,242,224,172,116,168, 96, 1, 52,254,204, 1,192, 35, 77,253,208, 2,176,127, 33,132,164,216,200,254, 80,254,223, +254,137, 1, 94,246, 0, 0, 0, 0, 1, 0,115,254, 75, 7, 5, 5,213, 0, 61, 0, 0, 1, 52, 3, 38, 39, 35, 22, 19, 22, 21, + 16, 7, 6, 35, 34, 39, 38, 61, 1, 35, 21, 20, 7, 6, 35, 34, 39, 38, 17, 52, 55, 18, 55, 35, 6, 7, 2, 21, 16, 23, 22, 51, + 50, 55, 54, 55, 22, 23, 22, 23, 6, 7, 6, 7, 23, 54, 55, 36, 55, 54, 55, 54, 7, 5,100, 56, 95,250, 84,135, 67, 71, 65,134, +116, 70, 70,199, 71, 72,114,125, 73, 72, 67,135, 84,249, 93, 59,100,123,121,211,146,101,100, 39, 39,100, 68,103,164,205,121,138, + 97,140,118, 1, 20,180,219, 68, 61, 2,224,194, 1, 21,156,130, 70,254,191,159,183,254,217,119,109,105,104,198,241,241,198,104, +105,109,107, 1, 51,183,159, 1, 65, 70,127,159,254,242,201,254,104,180,177, 94, 94,173,173, 94, 65, 23,128, 81, 48, 24,133, 23, + 42,100,136,166,230,203, 0, 0, 0, 1, 0,135,254, 85, 6, 40, 4, 96, 0, 37, 0, 0, 33, 36, 3, 2, 33, 32, 17, 52, 19, 51, + 2, 21, 2, 23, 22, 3, 51, 2, 55, 54, 17, 52, 3, 51, 18, 21, 22, 7, 6, 7, 6, 7, 6, 7, 39, 54, 55, 54, 4,136,254,237, + 30, 35,254,242,254, 97,135,218,143, 1,223,208, 5,170, 3,206,222,143,218,135, 1, 57,105,197,154,210,107,112, 91, 81,139,199, + 1, 1, 13,254,242, 2, 53,235, 1, 64,254,192,240,254,151, 1, 1, 1,212,254, 43, 2, 2, 1,104,240, 1, 64,254,192,235,209, +132,244,158,123, 73, 37, 16,108, 11, 43, 63, 0, 0, 1, 0,115,254, 86, 5, 72, 5,240, 0, 29, 0, 0, 1, 6, 7, 6, 17, 20, + 23, 22, 51, 50, 55, 54, 25, 1, 51, 17, 35, 17, 6, 7, 6, 35, 32, 39, 38, 17, 16, 19, 54, 37, 2,236,180, 96,133,110, 98,195, +196, 98, 99,217,217, 68,104,104,170,255, 0,156,162,186,151, 1, 40, 5, 74, 18,132,185,254,238,249,171,152,152,153, 1, 11, 2, +236,248,129, 2,144,132, 64, 63,213,221, 1, 71, 1, 54, 1, 8,213, 1, 0, 0, 0, 1, 0,113,254, 86, 4,140, 4,123, 0, 26, + 0, 0, 1, 6, 7, 6, 21, 20, 23, 22, 32, 54, 53, 17, 51, 17, 35, 17, 14, 1, 35, 34, 39, 38, 53, 52, 55, 54, 51, 2,139,154, + 80,114, 94, 83, 1, 76,168,184,184, 58,177,144,218,133,137,158,127,253, 3,253, 14, 99,141,208,189,129,116,231,203, 2, 49,249, +246, 2, 82,100, 97,162,168,248,236,200,162, 0, 0, 1, 0,201,254, 75, 5,226, 5,213, 0, 37, 0, 0, 1, 32, 23, 22, 17, 20, + 7, 6, 7, 6, 7, 6, 7, 39, 54, 55, 54, 55, 54, 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 21, 17, 35, 17, 51, 17, 54, 55, 54, + 3, 76, 1, 39,177,190, 60, 67,170,195,241,185, 73, 97,134,125,217,152,136, 44, 54,126,115,205,203,115,113,202,202, 78,105,105, + 4,123,179,194,254,253,204,161,178,128,147, 69, 53, 12,133, 22, 50, 87,122,109,104,127,192,157,150,134,129,126,222,254, 39, 5, +213,253,154,135, 66, 67, 0, 0, 0, 2, 0, 45,255,227, 4,146, 4,154, 0, 23, 0, 77, 0, 0, 1, 38, 35, 34, 7, 6, 7, 6, + 7, 6, 21, 20, 23, 22, 23, 22, 23, 22, 51, 50, 55, 54, 55, 54, 37, 22, 21, 20, 7, 6, 33, 34, 39, 38, 35, 34, 7, 39, 54, 51, + 50, 23, 22, 51, 50, 55, 54, 53, 52, 39, 6, 7, 6, 7, 6, 39, 38, 39, 38, 39, 38, 39, 38, 53, 52, 55, 54, 55, 54, 55, 54, 51, + 50, 23, 54, 55, 23, 6, 3, 44,127,141, 31, 55, 29, 37, 29, 16, 14, 12, 15, 24, 26, 35, 32, 30, 25, 71, 59, 73, 36, 1, 11,108, +127,111,254,247,141, 99, 75, 53, 65, 81, 84,135, 95,130, 82, 63, 91,157, 79, 75, 49, 27, 31, 70,117,102, 71, 41, 72, 50, 64, 48, + 41, 30, 29, 31, 46, 62, 80,101, 94,210,144, 56, 42,136, 55, 3, 68,152, 22, 11, 33, 26, 32, 27, 33, 32, 21, 28, 17, 20, 6, 5, + 25, 20, 49, 24, 50,192,212,176,156,136, 46, 35, 65,147, 76, 46, 35, 94, 89,127,140,113, 25, 23, 52, 43, 38, 2, 1, 10, 7, 34, + 26, 72, 52, 66, 59, 59, 61, 47, 63, 34, 43,159, 86,104, 80,146, 0, 1, 0, 79,254, 86, 5, 11, 5,246, 0, 33, 0, 0, 5, 4, + 33, 32, 1, 0, 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 7, 35, 54, 55, 54, 33, 32, 23, 22, 21, 20, 7, 0, 1, 22, 51, 32, 55, + 4,250,255, 0,254,237,254,175,254,185, 2,186,179,108,108, 99,164,180, 94, 35, 24,240, 44, 86,163, 1, 24, 1, 19,161,162,162, +254,247,254, 24,156,213, 1, 41,232,236,190, 1,163, 1,241,219,132,156,141,101, 93,146, 54, 63,161,102,194,144,145,241,216,182, +254,242,254,133,181,179, 0, 0, 0, 1, 0,100,254, 86, 4,106, 4,123, 0, 32, 0, 0, 1, 6, 35, 32, 1, 0, 55, 54, 53, 52, + 39, 38, 35, 34, 7, 6, 7, 35, 54, 55, 54, 51, 50, 4, 21, 20, 7, 6, 1, 22, 51, 50, 55, 4, 92,218,234,254,238,254,222, 2, + 66,167, 92, 92, 84,139,153, 80, 30, 20,204, 37, 73,139,238,232, 1, 20,138,175,254, 47,145,169,253,197,254,239,153, 1,121, 1, + 89,194,107,125,111, 83, 75,117, 44, 50,129, 82,156,232,194,164,156,197,254,224,186,144, 0, 0, 0, 2, 0,115, 0, 0, 5,182, + 5,239, 0, 2, 0, 53, 0, 0, 37, 33, 9, 3, 38, 39, 38, 35, 34, 15, 1, 53, 54, 55, 54, 51, 50, 23, 22, 23, 9, 1, 54, 55, + 54, 51, 50, 23, 22, 23, 21, 39, 38, 35, 34, 7, 6, 7, 9, 1, 22, 23, 22, 59, 1, 21, 33, 53, 51, 50, 55, 54, 1,218, 2,110, +254,205,254, 20, 1,128,254,220, 19, 26, 34, 63, 25, 22, 69, 33, 32, 31, 28,114, 75, 44, 47, 1, 2, 1, 9, 52, 39, 75,114, 29, + 30, 32, 33, 68, 23, 24, 60, 38, 19, 26,254,210, 1,116, 6, 7, 29, 69, 71,250,195, 71, 72, 26, 12,170, 1,202,254,104, 2, 61, + 1,187, 29, 26, 34, 4, 10,187, 11, 5, 5, 67, 40, 70,254,129, 1,127, 75, 35, 67, 5, 5, 11,187, 10, 4, 34, 17, 38,254, 69, +253,195, 9, 8, 33,170,170, 33, 15, 0, 0, 0, 0, 3, 0, 54, 0, 0, 4,203, 4,123, 0, 0, 0, 3, 0, 54, 0, 0, 37, 41, + 1, 3, 9, 1, 3, 38, 39, 38, 35, 34, 15, 1, 53, 54, 55, 54, 51, 50, 23, 22, 23, 27, 1, 54, 55, 54, 51, 50, 23, 22, 23, 21, + 39, 38, 35, 34, 7, 6, 7, 3, 1, 22, 23, 22, 59, 1, 21, 33, 53, 51, 50, 55, 54, 4,203,252,207, 1,204,228,254, 91, 1, 57, +239, 21, 17, 29, 54, 21, 19, 58, 28, 27, 26, 24,131, 64, 37, 40,197,197, 40, 37, 64,131, 24, 26, 27, 28, 58, 19, 21, 54, 29, 17, + 21,246, 1, 45, 6, 5, 25, 58, 73,251,107, 73, 58, 25, 5,158, 1, 56,254,238, 1,164, 1, 61, 28, 14, 25, 3, 7,141, 8, 4, + 4, 51, 30, 53,254,250, 1, 6, 53, 30, 51, 4, 4, 8,141, 7, 3, 25, 14, 28,254,184,254,103, 8, 5, 25,158,158, 25, 5, 0, + 0, 2, 0,115,255,227, 5, 37, 6, 16, 0, 29, 0, 43, 0, 0, 1, 36, 7, 6, 7, 54, 55, 54, 51, 50, 0, 16, 0, 33, 32, 39, + 38, 17, 16, 55, 54, 33, 50, 55, 54, 55, 21, 6, 7, 6, 18, 16, 38, 35, 34, 7, 6, 21, 20, 23, 22, 51, 50, 55, 3, 42,254,214, + 87, 56, 22, 81, 85,123,130,245, 1, 50,254,206,254,249,254,206,164,163,139,124, 1,176,115,149,160, 75, 94,151,108,142,200,186, +188,104,105,105,101,191,188, 98, 5, 45, 2,115, 74,160, 86, 34, 49,254,188,253,240,254,188,156,155, 1, 80, 1,222,210,187, 10, + 10, 39,177, 36, 8, 6,252, 65, 1,130,230,115,116,192,189,120,115,115, 0, 0, 0, 2, 0,113,255,227, 4, 91, 6, 16, 0, 31, + 0, 47, 0, 0, 1, 38, 7, 6, 7, 54, 55, 54, 51, 50, 23, 22, 16, 7, 6, 35, 34, 39, 38, 17, 16, 55, 54, 33, 50, 55, 54, 55, + 21, 6, 7, 6, 19, 52, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 51, 50, 55, 54, 2,155,227, 73, 44, 20, 41,101, 91,120,204,127, +128,128,127,219,255,137,136,116,103, 1, 79, 95, 92, 83, 71, 93, 69, 90,168, 83, 84,146,149, 86, 88, 88, 84,151,148, 82, 83, 5, + 55, 2,120, 74,169, 70, 54, 49,162,162,253,240,162,162,156,155, 1, 80, 1,222,210,187, 10, 10, 39,167, 39, 5, 6,252,248,205, +114,115,115,116,203,199,120,115,115,116, 0, 0, 0, 1, 0, 44,254, 86, 4,183, 5,213, 0, 15, 0, 0, 1, 17, 35, 53, 33, 17, + 35, 17, 33, 21, 35, 17, 33, 17, 51, 17, 4,183,203,254,235,203,254,235,203, 1,224,203, 4, 96,254,242,100,250,160, 5, 96,100, + 1, 14, 1,117,254,139, 0, 0, 0, 1, 0, 55,254, 85, 4, 20, 5,207, 0, 15, 0, 0, 1, 17, 35, 53, 35, 17, 35, 17, 35, 21, + 35, 17, 33, 17, 51, 17, 4, 20,173,229,185,229,173, 1,146,185, 4, 95,255, 0,112,250,134, 5,122,112, 1, 0, 1,112,254,144, + 0, 1, 0,111,255,242, 4,206, 4,103, 0, 43, 0, 0, 1, 2, 7, 6, 39, 38, 55, 54, 55, 54, 39, 38, 35, 34, 7, 53, 54, 23, + 22, 23, 22, 7, 55, 18, 55, 54, 23, 22, 7, 6, 7, 6, 23, 22, 51, 50, 55, 21, 6, 39, 38, 39, 38, 55, 2, 40, 96,200,141, 3, + 1, 61, 96,136, 91, 43, 26,142, 57, 91, 82,126,246, 33, 19, 42,189, 96,200,141, 3, 1, 61, 96,136, 91, 43, 26,142, 57, 91, 82, +126,246, 33, 19, 42, 1,153,254,247,124, 89,145, 68, 84,132,124,203,169,104,108,224, 61, 17, 32,240,140,112,108, 1, 9,124, 89, +145, 68, 84,132,124,203,169,104,108,224, 61, 17, 32,240,140,112, 0, 2, 0,183,254, 86, 4,164, 4,123, 0, 21, 0, 29, 0, 0, + 19, 54, 55, 54, 55, 54, 51, 50, 0, 16, 2, 35, 34, 38, 39, 18, 41, 1, 21, 33, 32, 19, 36, 16, 38, 32, 6, 16, 22, 32,186, 2, + 88, 61,151, 59,182,204, 0,255,255,204,123,177, 58, 5, 1, 32, 1,244,254, 28,254, 10, 6, 3, 45,167,254,220,167,167, 1, 36, + 2, 37,204,167,102, 90, 35,254,188,253,240,254,188, 97,100,254, 88,170, 2,218, 52, 1,150,231,231,254,106,231,255,255, 0,113, +255,227, 3,231, 4,123, 18, 6, 0, 70, 0, 0,255,255,255,219,254, 86, 1,121, 6, 20, 18, 6, 0, 77, 0, 0, 0, 3, 0,115, +255,227, 5,217, 5,240, 0, 7, 0, 15, 0, 26, 0, 0, 1, 33, 18, 23, 22, 32, 55, 54, 19, 38, 39, 38, 32, 7, 6, 7, 1, 32, + 0, 17, 16, 0, 33, 32, 0, 16, 0, 5, 3,252, 69, 8,122,129, 1,184,129,119, 1, 22, 98,129,254, 72,129, 96, 25, 1,214, 1, + 58, 1,120,254,136,254,198,254,197,254,135, 1,121, 2,198,254,255,154,164,164,153, 1,172,186,126,164,164,121,191, 2,128,254, + 91,254,158,254,159,254, 91, 1,164, 2,196, 1,165, 0, 0, 0, 0, 1, 0,113,255,227, 3,216, 4,123, 0, 33, 0, 0, 1, 38, + 39, 38, 35, 34, 7, 6, 7, 33, 21, 33, 22, 23, 22, 51, 50, 63, 1, 21, 7, 6, 35, 32, 39, 38, 16, 55, 54, 33, 50, 23, 22, 23, + 3,216, 37, 37, 99,106,183,102, 95, 18, 2,165,253, 91, 18, 95,102,183,128, 77, 74, 79,104,107,254,244,156,157,157,156, 1, 12, +101,110, 40, 39, 3,174, 13, 10, 26, 99, 92,169,144,169, 92, 99, 26, 25,167, 18, 22,156,156, 2, 40,156,156, 22, 8, 12, 0, 0, + 0, 1, 0,196,255,227, 4, 43, 4,123, 0, 33, 0, 0, 19, 53, 54, 55, 54, 51, 32, 23, 22, 16, 7, 6, 33, 34, 47, 1, 53, 23, + 22, 51, 50, 55, 54, 55, 33, 53, 33, 38, 39, 38, 35, 34, 7, 6,196, 39, 40,110,101, 1, 12,156,157,157,156,254,244,107,104, 79, + 74, 77,128,183,102, 95, 18,253, 91, 2,165, 18, 95,102,183,106, 99, 37, 3,174,163, 12, 8, 22,156,156,253,216,156,156, 22, 18, +167, 25, 26, 99, 92,169,144,169, 92, 99, 26, 10,255,255, 0,201, 0, 0, 4,141, 5,213, 18, 6, 0,160, 0, 0,255,255, 0,186, +254, 86, 4,164, 6, 20, 18, 6, 0,192, 0, 0,255,255, 0,115,255,227, 5, 39, 5,240, 18, 6, 0, 38, 0, 0, 0, 1, 0,201, + 0, 0, 6, 31, 5,213, 0, 12, 0, 0, 19, 33, 9, 1, 33, 17, 35, 17, 1, 35, 1, 17, 35,201, 1, 45, 1,125, 1,127, 1, 45, +197,254,127,203,254,127,196, 5,213,254, 33, 1,223,250, 43, 5, 31,254, 25, 1,231,250,225, 0, 0, 1, 0,127,254, 86, 4,179, + 4, 96, 0, 12, 0, 0, 19, 33, 19, 1, 33, 17, 35, 17, 1, 35, 1, 17, 35,127, 1, 27,254, 1, 0, 1, 27,185,254,236,153,254, +235,185, 4, 96,254,123, 1,133,251,160, 3,178,254, 96, 1,160,250,164, 0, 0, 0, 2, 0, 85,254, 86, 4,164, 4,123, 0, 24, + 0, 32, 0, 0, 23, 17, 52, 55, 54, 55, 54, 51, 50, 0, 16, 2, 35, 34, 38, 39, 17, 33, 21, 33, 21, 35, 53, 35, 53, 0, 16, 38, + 32, 6, 16, 22, 32,186, 90, 61,151, 59,182,204, 0,255,255,204,123,177, 58, 1,229,254, 27,185,101, 3,144,167,254,220,167,167, + 1, 36,144, 2,181,231,140,102, 90, 35,254,188,253,240,254,188, 97,100,254,200,170,112,112,170, 1,244, 1,150,231,231,254,106, +231, 0, 0, 0,255,255, 0,115,255,227, 5, 39, 5,240, 18, 6, 1, 72, 0, 0,255,255, 0,115,255,227, 5, 39, 5,240, 18, 38, + 3, 22, 0, 0, 16, 7, 0,121, 2, 51, 0, 0,255,255, 0,115,255,227, 5, 39, 5,240, 16, 39, 0,121, 0,228, 0, 0, 18, 6, + 3, 26, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 38, 3, 50, 0, 0, 16, 7, 6,135, 4,238, 1,117,255,255, 0,201, + 0, 0, 4,139, 5,213, 18, 38, 3, 50, 0, 0, 16, 7, 6,132, 4,229, 1,117, 0, 1,255,250,254,102, 5,172, 5,213, 0, 29, + 0, 0, 37, 16, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, 38, 35, 33, 17, 35, 17, 33, 53, 33, 21, 33, 17, 33, 50, 23, 22, 21, + 5,172,204,228, 76, 62,134, 56, 55,124,124,254,136,203,254, 82, 4,139,253,238, 1,161,186,113,109,104,254,242,244,170, 75, 75, +194, 1, 34,159,158,253, 57, 5, 43,170,170,254, 70,119,114,238,255,255, 0,201, 0, 0, 4,106, 5,213, 18, 38, 3, 48, 0, 0, + 16, 7, 6,133, 4,174, 1,117, 0, 1, 0,115,255,227, 5, 39, 5,240, 0, 36, 0, 58, 64, 32, 36,149, 35,173, 37, 26,161, 25, +174, 30,149, 21,145, 37, 8,161, 9,174, 4,149, 13,140, 37, 38, 35, 25, 8, 34, 0, 25, 17, 37, 16,220,236, 50,212, 60,204,204, + 49, 0, 16,244,236,244,236, 16,244,236,244,236, 16,244,236, 48, 1, 18, 23, 22, 33, 50, 55, 54, 55, 21, 6, 7, 6, 35, 32, 39, + 38, 17, 16, 55, 54, 33, 50, 23, 22, 23, 21, 38, 39, 38, 35, 32, 7, 6, 7, 33, 21, 1, 72, 7,129,136, 1, 0,130,116,115,102, +106,119,118,132,254,173,195,195,195,195, 1, 83,134,118,119,104,102,115,116,130,255, 0,136,103, 25, 2,178, 2,199,254,242,147, +157, 47, 47, 95,211, 72, 36, 36,207,208, 1,103, 1,104,207,208, 36, 35, 71,213, 95, 47, 47,156,119,198,170, 0,255,255, 0,135, +255,227, 4,162, 5,240, 18, 6, 0, 54, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 18, 6, 0, 44, 0, 0,255,255, 0,201, + 0, 0, 1,147, 5,213, 18, 38, 3, 35, 0, 0, 17, 7, 6,132, 3, 47, 1,117, 0, 8,180, 0, 10, 7, 1, 7, 43, 49, 0, 0, +255,255,255,150,254,102, 1,147, 5,213, 18, 6, 0, 45, 0, 0, 0, 2, 0, 54,255,227, 8, 47, 5,213, 0, 22, 0, 33, 0, 0, + 1, 33, 21, 16, 3, 6, 5, 53, 54, 55, 18, 25, 1, 33, 17, 51, 50, 4, 21, 20, 4, 35, 33, 1, 52, 39, 38, 43, 1, 17, 51, 50, + 55, 54, 4,112,254, 27,132, 98,254,145,212, 67,117, 3,120,234,251, 1, 16,254,240,251,254, 76, 2,234, 79, 78,163,224,224,161, + 80, 79, 5, 43,213,254, 24,254,170,253, 56,167, 46,168, 1, 37, 2, 53, 1, 27,253,154,218,222,221,218, 1,183,139, 68, 67,253, +221, 68, 67, 0, 0, 2, 0,201, 0, 0, 7,204, 5,213, 0, 18, 0, 29, 0, 0, 33, 17, 33, 17, 35, 17, 51, 17, 33, 17, 51, 17, + 51, 50, 4, 21, 20, 4, 35, 1, 52, 39, 38, 43, 1, 17, 51, 50, 55, 54, 4, 13,253,134,202,202, 2,122,202,234,251, 1, 16,254, +240,251, 1, 54, 79, 78,163,224,224,161, 80, 79, 2,199,253, 57, 5,213,253,156, 2,100,253,154,218,222,221,218, 1,183,139, 68, + 67,253,221, 68, 67, 0, 0, 0, 0, 1,255,250, 0, 0, 5,172, 5,213, 0, 20, 0, 0, 1, 50, 23, 22, 21, 17, 35, 17, 52, 38, + 35, 33, 17, 35, 17, 33, 53, 33, 21, 33, 17, 4, 20,186,113,109,201,124,124,254,136,203,254, 82, 4,139,253,238, 3,113,119,114, +238,254,102, 1,138,159,158,253, 57, 5, 43,170,170,254, 70, 0,255,255, 0,201, 0, 0, 5,106, 5,213, 18, 38, 3, 55, 0, 0, + 16, 7, 6,133, 4,238, 1,117,255,255, 0,201, 0, 0, 5, 51, 5,213, 18, 38, 3, 53, 0, 0, 16, 7, 6,135, 4,229, 1,117, +255,255, 0, 35,255,227, 4,189, 5,213, 16, 39, 6,139, 4,114, 1,117, 18, 6, 3, 64, 0, 0, 0, 1, 0,201,254, 86, 5, 59, + 5,213, 0, 11, 0, 0, 41, 1, 17, 51, 17, 33, 17, 51, 17, 33, 17, 35, 2,188,254, 13,202, 2,222,202,254, 74,201, 5,213,250, +213, 5, 43,250, 43,254, 86, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 6, 0, 36, 0, 0, 0, 2, 0,201, 0, 0, 4,236, + 5,213, 0, 10, 0, 23, 0, 44, 64, 24, 13,149, 23,129, 22, 5,149, 14,173, 6,149, 22, 25, 11, 0, 25, 18, 46, 5, 13, 28, 23, + 4, 24, 16,252,236, 50,244,236,196,204, 49, 0, 47,236,244,236, 16,244,236, 48, 1, 52, 39, 38, 35, 33, 17, 33, 50, 55, 54, 17, + 21, 33, 17, 33, 50, 4, 21, 20, 4, 35, 33, 17, 4, 23, 79, 78,163,254,188, 1, 68,163, 78, 79,253,124, 1, 78,251, 1, 16,254, +240,251,253,232, 1,183,139, 68, 67,253,221, 68, 67, 4,168,166,254, 64,218,222,221,218, 5,213,255,255, 0,201, 0, 0, 4,236, + 5,213, 18, 6, 0, 37, 0, 0, 0, 1, 0,201, 0, 0, 4,106, 5,213, 0, 5, 0, 25, 64, 12, 4,149, 1,129, 0, 7, 2, 4, + 28, 1, 4, 6, 16,252,252,204,196, 49, 0, 47,244,236, 48, 51, 17, 33, 21, 33, 17,201, 3,161,253, 41, 5,213,170,250,213, 0, + 0, 2, 0, 49,254, 86, 6, 3, 5,213, 0, 7, 0, 23, 0, 53, 64, 15, 2, 28, 14, 25, 19, 28, 16, 23, 3, 28, 13, 20, 28, 23, + 24, 16,220,236,212,236, 16,212,236,204,212,236, 49, 0, 64, 12, 3,149, 13,129, 18, 22,189, 15, 0, 23,149, 20, 47,236, 50, 50, +236, 50,244,236, 48, 37, 33, 17, 33, 21, 16, 3, 6, 5, 54, 55, 18, 25, 1, 33, 17, 51, 17, 35, 17, 33, 17, 35, 17, 1,200, 2, +168,254, 27,132, 24,254,168,132, 50,117, 3,120,201,201,251,192,201,170, 4,129,212,254, 17,254,177, 61, 50, 57,126, 1, 37, 2, + 53, 1, 26,250,213,253,172, 1,170,254, 86, 2, 84, 0, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 6, 0, 40, 0, 0, + 0, 1, 0, 59, 0, 0, 6,173, 5,213, 0, 21, 0,110, 64, 22, 66, 2, 20, 16,129, 14, 8, 12,149, 0, 18,173, 6, 10, 14, 23, + 8, 21, 28, 11, 20, 22, 16,212, 60,252, 60,196, 49, 0, 47, 60, 60,244, 60,236, 50, 16,244, 60, 60, 48, 75, 83, 88, 64, 36, 4, + 17, 7, 2, 1, 5, 17, 6, 7, 6, 4, 17, 1, 3, 17, 2, 2, 1, 15, 17, 18, 13, 12, 16, 17, 17, 18, 17, 15, 17, 12, 14, 17, + 13, 13, 12, 5, 7, 16,236, 16,236, 7, 16,236, 8, 16,236, 5, 7, 16,236, 16,236, 7, 16,236, 8, 16,236, 89, 1, 51, 1, 51, + 9, 1, 35, 1, 35, 17, 35, 17, 35, 1, 35, 9, 1, 51, 1, 51, 17, 51, 3,217,149, 1, 52,217,254,162, 1,144,217,254,155,150, +202,150,254,155,217, 1,144,254,162,217, 1, 52,149,202, 3,113, 2,100,253, 71,252,228, 2,199,253, 57, 2,199,253, 57, 3, 28, + 2,185,253,156, 2,100, 0, 0,255,255, 0,156,255,227, 4,115, 5,240, 18, 6, 0, 22, 0, 0, 0, 1, 0,201, 0, 0, 5, 51, + 5,213, 0, 9, 0,121, 64, 30, 3, 17, 9, 9, 8, 8, 17, 4, 4, 3, 66, 8, 3, 9, 6,175, 2, 5, 9, 4, 7, 3, 28, 0, + 54, 7, 28, 6, 4, 10, 16,252,236,252,236, 17, 57, 57, 49, 0, 47, 60,236, 50, 57, 57, 48, 75, 83, 88, 7, 16, 4,237, 7, 16, + 4,237, 89, 34,178, 31, 11, 1, 1, 93, 64, 48, 54, 8, 56, 3, 72, 8, 71, 3,105, 8,102, 3,128, 8, 7, 6, 4, 9, 9, 21, + 4, 26, 9, 70, 4, 73, 9, 87, 4, 88, 9,101, 4,105, 9,121, 9,133, 4,138, 9,149, 4,154, 9,159, 11, 16, 93, 0, 93, 1, + 17, 35, 17, 1, 33, 17, 51, 17, 1, 5, 51,196,253,106,254,240,196, 2,150, 5,213,250, 43, 4,225,251, 31, 5,213,251, 31, 4, +225, 0, 0, 0,255,255, 0,201, 0, 0, 5, 51, 5,213, 16, 39, 6,139, 4,245, 1,117, 18, 6, 3, 53, 0, 0,255,255, 0,201, + 0, 0, 5,106, 5,213, 18, 6, 0, 46, 0, 0, 0, 1, 0, 54,255,228, 5, 58, 5,213, 0, 15, 0, 38, 64, 20, 11,149, 6,129, + 9, 1,149, 0,140, 9, 17, 4, 10, 28, 7, 11, 28, 6, 1, 16, 16,212,212,236,212,236,236, 49, 0, 47,244,236, 16,244,236, 48, + 23, 53, 54, 55, 18, 25, 1, 33, 17, 35, 17, 33, 21, 16, 3, 6, 54,212, 67,117, 3,120,202,254, 27,132, 98, 28,167, 46,168, 1, + 37, 2, 53, 1, 26,250, 43, 5, 43,212,254, 24,254,170,253, 0,255,255, 0,201, 0, 0, 6, 31, 5,213, 18, 6, 0, 48, 0, 0, +255,255, 0,201, 0, 0, 5, 59, 5,213, 18, 6, 0, 43, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 6, 0, 50, 0, 0, + 0, 1, 0,201, 0, 0, 5, 59, 5,213, 0, 7, 0, 31, 64, 16, 4,149, 7,129, 2, 6, 9, 4, 3, 28, 0, 4, 28, 7, 4, 8, + 16,252,236,212,236,236, 49, 0, 47, 60,244,236, 48, 1, 17, 35, 17, 33, 17, 35, 17, 5, 59,202,253, 34,202, 5,213,250, 43, 5, + 43,250,213, 5,213, 0, 0, 0,255,255, 0,201, 0, 0, 4,141, 5,213, 18, 6, 0, 51, 0, 0,255,255, 0,115,255,227, 5, 39, + 5,240, 18, 6, 0, 38, 0, 0,255,255,255,250, 0, 0, 4,233, 5,213, 18, 6, 0, 55, 0, 0, 0, 1, 0, 35,255,227, 4,189, + 5,213, 0, 17, 0, 65, 64, 14, 66, 6,149, 5,140, 16, 13,129, 18, 19, 17, 6, 13, 18, 16,212,196,212,196, 49, 0, 16,228, 50, +244,236, 48, 75, 83, 88, 64, 18, 15, 17, 0, 13, 12, 16, 17, 17, 17, 0, 15, 17, 12, 14, 17, 13, 13, 12, 5, 7, 16,236, 16,236, + 7, 16,236, 8, 16,236, 89, 37, 6, 7, 6, 43, 1, 53, 51, 50, 55, 54, 63, 1, 1, 51, 9, 1, 51, 2,143, 22, 31,103,227, 77, + 63,140, 49, 14, 8, 45,254, 33,217, 1,115, 1,117,217,181, 51, 37,122,170, 75, 22, 18,106, 4,107,252,148, 3,108, 0, 0, 0, + 0, 3, 0,115, 0, 0, 5,217, 5,213, 0, 8, 0, 17, 0, 39, 0, 59, 64, 31, 17, 0,149, 29, 26, 27,129, 39, 9, 8,149, 37, + 18, 39, 41, 16, 13, 25, 33, 18, 0, 27, 28, 37, 17, 28, 4, 25, 22, 16, 40, 16,252,236,212, 60, 60,252, 60, 60,212,236,236, 49, + 0, 47,220, 60,236, 50, 16,244,220, 60,236, 50, 48, 1, 6, 7, 6, 21, 20, 23, 22, 23, 51, 54, 55, 54, 53, 52, 39, 38, 39, 3, + 38, 39, 38, 17, 16, 55, 54, 55, 53, 51, 21, 22, 23, 22, 17, 16, 7, 6, 7, 21, 35, 2,194,150, 98,130,130, 98,150,202,150, 98, +128,128, 98,150,202,244,158,189,189,157,245,202,244,157,188,188,157,244,202, 4,142, 21, 87,115,198,197,115, 87, 21, 21, 87,115, +197,198,115, 87, 21,252, 16, 22,134,160, 1, 15, 1, 15,161,135, 22,159,159, 23,134,161,254,241,254,242,161,134, 23,157, 0, 0, +255,255, 0, 61, 0, 0, 5, 59, 5,213, 18, 6, 0, 59, 0, 0, 0, 1, 0,201,254, 86, 6, 4, 5,213, 0, 11, 0, 40, 64, 21, + 6, 2,129, 11,189, 8, 4,149, 1, 13, 0, 28, 9, 6, 28, 7, 3, 28, 2, 4, 12, 16,252,236,212,236,212,236,204, 49, 0, 47, +236, 50,236,244, 60, 48, 41, 1, 17, 51, 17, 33, 17, 51, 17, 51, 17, 35, 5, 59,251,142,202, 2,222,202,201,201, 5,213,250,213, + 5, 43,250,213,253,172, 0, 0, 0, 1, 0,175, 0, 0, 4,179, 5,213, 0, 16, 0, 35, 64, 18, 2,149, 12,173, 14, 7,129, 0, + 18, 4, 1, 14, 28, 15, 8, 28, 7, 17, 16,220,236,212,236, 50,236, 49, 0, 47,228, 50,244,236, 48, 33, 17, 33, 34, 39, 38, 53, + 17, 51, 17, 20, 22, 51, 33, 17, 51, 17, 3,232,254, 95,186,113,109,201,124,124, 1,120,203, 2,199,119,114,238, 1, 55,254,217, +159,158, 2,100,250, 43, 0, 0, 0, 1, 0,201, 0, 0, 7, 57, 5,213, 0, 11, 0, 40, 64, 21, 10, 2, 6,129, 0, 8,149, 5, + 13, 4, 2, 28, 3, 10, 28, 11, 7, 28, 6, 4, 12, 16,252,236,212,252,212,236,236, 49, 0, 47,236, 50,244, 60,196, 48, 37, 33, + 17, 51, 17, 33, 17, 51, 17, 33, 17, 51, 4,102, 2, 9,202,249,144,202, 2, 9,202,170, 5, 43,250, 43, 5,213,250,213, 4,221, + 0, 1, 0,201,254, 86, 8, 2, 5,213, 0, 15, 0, 49, 64, 26, 6, 10, 2,129, 15,189, 12, 8, 4,149, 1, 17, 0, 28, 13, 10, + 28, 11, 6, 28, 7, 3, 28, 2, 4, 16, 16,252,236,212,252,212,236,212,236,204, 49, 0, 47,236, 50, 50,236,244, 60,196, 48, 41, + 1, 17, 51, 17, 33, 17, 51, 17, 33, 17, 51, 17, 51, 17, 35, 7, 57,249,144,202, 2, 9,202, 2, 9,202,201,201, 5,213,250,213, + 4,221,251, 35, 5, 43,250,213,253,172, 0, 0, 0, 2, 0, 50, 0, 0, 6, 24, 5,213, 0, 12, 0, 23, 0, 42, 64, 22, 2,149, + 3,129, 0, 18,149, 5,173, 19,149, 0, 16, 13, 25, 9, 18, 4, 28, 1, 3, 24, 16,204,220,236, 50,212,236,204, 49, 0, 47,236, +244,236, 16,244,236, 48, 33, 17, 33, 53, 33, 17, 33, 50, 4, 21, 20, 4, 35, 1, 52, 39, 38, 35, 33, 17, 33, 50, 55, 54, 1,245, +254, 61, 2,141, 1, 78,251, 1, 16,254,240,251, 1, 54, 79, 78,163,254,188, 1, 68,161, 80, 79, 5, 43,170,253,154,218,222,221, +218, 1,183,139, 68, 67,253,221, 68, 67, 0, 0,255,255, 0,201, 0, 0, 6, 70, 5,213, 16, 39, 0, 44, 4,179, 0, 0, 17, 6, + 3, 73, 0, 0, 0, 13, 64, 6, 27, 4, 1, 28, 0, 21, 16,220,252,236, 49, 0, 0, 2, 0,201, 0, 0, 4,236, 5,213, 0, 10, + 0, 21, 0, 36, 64, 19, 5,149, 13,173, 11,129, 6,149, 21, 23, 0, 25, 17, 5, 12, 28, 11, 4, 22, 16,252,236, 50,212,236,204, + 49, 0, 47,236,228,244,236, 48, 1, 52, 39, 38, 35, 33, 17, 33, 50, 55, 54, 1, 51, 17, 33, 50, 4, 21, 20, 4, 35, 33, 4, 23, + 79, 78,163,254,188, 1, 68,163, 78, 79,252,178,202, 1, 78,251, 1, 16,254,240,251,253,232, 1,183,139, 68, 67,253,221, 68, 67, + 4,168,253,154,218,222,221,218, 0, 1, 0,111,255,227, 5, 35, 5,240, 0, 36, 0, 58, 64, 32, 1,149, 2,173, 37, 11,161, 12, +174, 7,149, 16,145, 37, 29,161, 28,174, 33,149, 24,140, 37, 38, 0, 3, 25, 20, 2, 29, 12, 37, 16,220, 60,204,212,236, 50,204, + 49, 0, 16,244,236,244,236, 16,244,236,244,236, 16,244,236, 48, 1, 33, 53, 33, 38, 39, 38, 33, 34, 7, 6, 7, 53, 54, 55, 54, + 51, 32, 23, 22, 17, 16, 7, 6, 33, 34, 39, 38, 39, 53, 22, 23, 22, 51, 32, 55, 54, 4, 78,253, 70, 2,178, 25,103,136,255, 0, +130,116,115,102,104,119,118,134, 1, 83,195,195,195,195,254,173,132,118,119,106,102,115,116,130, 1, 0,136,129, 2,199,170,198, +119,156, 47, 47, 95,213, 71, 35, 36,208,207,254,152,254,153,208,207, 36, 36, 72,211, 95, 47, 47,157,147, 0, 0, 0, 2, 0,211, +255,227, 7,204, 5,240, 0, 15, 0, 38, 0, 56, 64, 31, 0,149, 20,145, 39, 8,149, 28,140, 39, 33,149, 38,173, 36,129, 35, 40, + 12, 25, 24, 4, 25, 32, 16, 33, 37, 28, 36, 4, 39, 16,252,236, 50,212, 60,236,212,236,204, 49, 0, 47,228,244,236, 16,244,236, + 16,244,236, 48, 1, 34, 7, 6, 17, 16, 23, 22, 51, 50, 55, 54, 17, 16, 39, 38, 1, 18, 55, 54, 33, 32, 23, 22, 17, 16, 7, 6, + 33, 32, 39, 38, 3, 35, 17, 35, 17, 51, 17, 5, 26,220,130,129,129,130,220,220,128,129,129,128,252,119, 30,151,189, 1, 59, 1, + 58,188,188,188,188,254,198,254,197,189,179, 9,201,202,202, 5, 76,164,164,254,229,254,230,164,164,164,164, 1, 26, 1, 27,164, +164,254, 37, 1, 5,168,210,210,211,254,158,254,159,210,211,210,200, 1, 74,253, 57, 5,213,253,156, 0, 0, 0, 0, 2, 0, 59, + 0, 0, 4,198, 5,213, 0, 19, 0, 28, 0, 69, 64, 22, 66, 21,149, 6,129, 16, 11,149, 27,173, 9, 16, 30, 4, 10, 20, 28, 7, + 24, 25, 3, 29, 16,212,236,212,236, 50,236, 49, 0, 47, 60,244,236, 16,244,236, 48, 75, 83, 88, 64, 13, 13, 12, 11, 3, 10, 14, + 17, 17, 15, 17, 16, 17, 16, 5, 7, 16,236, 16,236, 17, 23, 57, 89, 1, 46, 1, 53, 52, 54, 41, 1, 17, 35, 17, 35, 34, 6, 7, + 3, 35, 19, 62, 1, 1, 35, 34, 6, 21, 20, 22, 59, 1, 2, 2,125,131,252, 1, 0, 1,200,202,220,120,139, 74,191,217,205, 62, +123, 2, 59,254,146,149,149,146,254, 2,188, 36,186,141,216,214,250, 43, 2,119, 98,150,254,129, 1,152,126,144, 2,137,133,131, +131,135, 0, 0,255,255, 0,123,255,227, 4, 45, 4,123, 18, 6, 0, 68, 0, 0, 0, 2, 0,113,255,227, 4,117, 5,240, 0, 28, + 0, 45, 0, 73, 64, 40, 29, 22, 44,185, 6, 46, 0,134, 28,136, 2,185, 26, 46, 37,185, 14,140, 46, 29, 40, 22, 33, 4, 47, 69, + 28, 40, 18, 10, 81, 18, 4, 18, 24, 33, 18, 18, 69, 46, 16,252,236,212,236, 16,244,236,196,236, 17, 18, 57, 18, 57, 49, 0, 16, +244,236, 16,212,236,244,236, 16,212,236, 57, 57, 48, 1, 38, 35, 34, 21, 20, 5, 22, 23, 22, 17, 16, 7, 6, 35, 34, 39, 38, 17, + 52, 55, 54, 55, 38, 53, 16, 33, 50, 23, 1, 6, 7, 6, 21, 20, 23, 22, 51, 50, 54, 53, 52, 39, 38, 39, 38, 3,236,102,239,253, + 1, 8,208,117,142,137,137,240,239,138,137,137, 53, 75,156, 1,185,221,120,254, 24, 68, 55, 86, 85, 86,149,147,172, 91, 97,126, + 64, 5, 17, 70,117, 92, 48, 37,112,135,254,235,254,247,156,157,157,156, 1, 19,204,165, 64, 36, 79,141, 1, 16, 70,254, 40, 29, + 73,113,204,203,114,115,232,190,199, 96,103, 11, 6, 0, 0, 0, 0, 3, 0,186, 0, 0, 4, 62, 4, 96, 0, 10, 0, 21, 0, 38, + 0, 45, 64, 24, 0,169, 12, 38, 11,169, 22,188, 1,169, 38, 17, 18, 26, 40, 6, 18, 33, 0, 11, 8, 22, 70, 39, 16,252,236, 50, +212,236,204,212,236, 49, 0, 47,236,244,236, 16,212,236, 48, 1, 17, 33, 50, 55, 54, 53, 52, 39, 38, 35, 1, 17, 51, 50, 55, 54, + 53, 52, 39, 38, 35, 37, 33, 50, 22, 21, 20, 7, 6, 7, 30, 1, 21, 20, 7, 6, 35, 33, 1,114, 1, 6,129, 66, 63, 63, 69,126, +254,250,242,117, 61, 58, 58, 61,117,254, 86, 1,182,197,212, 54, 54,106,127,140,116,115,214,254, 57, 2, 2,254,151, 46, 44, 91, + 94, 41, 45, 1,197,254,218, 38, 36, 75, 72, 36, 37,153,144,133,103, 60, 61, 15, 24,152,114,150, 82, 82, 0, 0, 0, 1, 0,186, + 0, 0, 3,208, 4, 96, 0, 5, 0, 25, 64, 12, 4,169, 1,188, 0, 7, 2, 4, 8, 1, 70, 6, 16,252,252,204,196, 49, 0, 47, +244,236, 48, 51, 17, 33, 21, 33, 17,186, 3, 22,253,162, 4, 96,170,252, 74, 0, 0, 2, 0, 50,254, 86, 5, 46, 4, 96, 0, 7, + 0, 23, 0, 53, 64, 15, 2, 8, 14, 25, 19, 8, 16, 23, 3, 8, 13, 20, 8, 23, 24, 16,220,236,212,236, 16,212,236,204,212,236, + 49, 0, 64, 12, 3,169, 13,188, 18, 22,189, 15, 0, 23,169, 20, 47,236, 50, 50,236, 50,244,236, 48, 37, 33, 17, 33, 21, 16, 7, + 6, 5, 54, 55, 54, 17, 53, 33, 17, 51, 17, 35, 17, 33, 17, 35, 17, 1,166, 2, 24,254,123,118, 20,254,237, 91, 40, 98, 2,245, +184,184,252,116,184,153, 3, 46,134,254,109,223, 17, 37, 40, 85,211, 1,163,212,252, 57,253,189, 1,170,254, 86, 2, 67, 0, 0, +255,255, 0,113,255,227, 4,127, 4,123, 18, 6, 0, 72, 0, 0, 0, 1, 0, 50, 0, 0, 5,173, 4, 96, 0, 21, 0,109, 64, 21, + 66, 2, 20, 16,188, 14, 8, 12,169, 0, 18, 6, 10, 14, 23, 8, 21, 8, 11, 20, 22, 16,212, 60,252, 60,196, 49, 0, 47, 60, 60, +212, 60,236, 50, 16,244, 60, 60, 48, 75, 83, 88, 64, 36, 4, 17, 7, 2, 1, 5, 17, 6, 7, 6, 4, 17, 1, 3, 17, 2, 2, 1, + 15, 17, 18, 13, 12, 16, 17, 17, 18, 17, 15, 17, 12, 14, 17, 13, 13, 12, 5, 7, 16,236, 16,236, 7, 16,236, 8, 16,236, 5, 7, + 16,236, 16,236, 7, 16,236, 8, 16,236, 89, 1, 51, 1, 51, 9, 1, 35, 1, 35, 17, 35, 17, 35, 1, 35, 9, 1, 51, 1, 51, 17, + 51, 3, 75,113, 1, 2,196,254,215, 1, 84,197,254,213,114,183,114,254,213,197, 1, 84,254,215,196, 1, 2,113,183, 2,161, 1, +191,253,245,253,171, 2, 9,253,247, 2, 9,253,247, 2, 85, 2, 11,254, 65, 1,191, 0, 0, 0, 0, 1, 0,133,255,227, 3,200, + 4,124, 0, 49, 0, 60, 64, 33, 38,134, 39,136, 34,185, 42,184, 50, 24,169, 25, 50, 11,134, 10,136, 15,185, 6,140, 50, 30, 18, + 46, 51, 19, 18, 3, 25, 39, 11, 50, 16,220,196,196,212,236,204,212,236, 49, 0, 16,244,236,252,236, 16,212,236, 16,244,236,252, +236, 48, 1, 30, 1, 21, 20, 4, 35, 34, 39, 38, 39, 53, 22, 23, 22, 51, 50, 55, 54, 53, 52, 39, 38, 43, 1, 53, 51, 50, 55, 54, + 53, 52, 39, 38, 35, 34, 7, 6, 7, 53, 62, 1, 51, 50, 23, 22, 21, 20, 7, 6, 2,194,124,138,254,254,238, 80, 85, 84, 90, 71, + 85, 85, 93,151, 85, 84, 78, 72,137,148,155,116, 67, 68, 70, 69,119, 71, 81, 80, 97, 98,170, 76,196,113,114, 60, 60, 2, 92, 24, +146,108,173,182, 14, 14, 28,171, 37, 19, 18, 56, 56, 90, 88, 56, 51,152, 44, 45, 70, 64, 46, 46, 13, 13, 29,167, 24, 24, 78, 79, +141, 93, 64, 65, 0, 1, 0,193, 0, 0, 4,128, 4, 96, 0, 9, 0, 63, 64, 21, 66, 8, 3, 9, 6,188, 2, 5, 11, 70, 9, 4, + 7, 3, 8, 0, 7, 8, 6, 70, 10, 16,252,236,212,236, 17, 57, 57,236, 49, 0, 47, 60,228, 50, 57, 57, 48, 75, 83, 88, 64, 10, + 3, 17, 9, 9, 8, 8, 17, 4, 4, 3, 7, 16,236, 7, 16,236, 89, 1, 17, 35, 17, 1, 35, 17, 51, 17, 1, 4,128,183,253,228, +236,183, 2, 27, 4, 96,251,160, 3,131,252,125, 4, 96,252,127, 3,129, 0, 0,255,255, 0,193, 0, 0, 4,128, 6, 20, 16, 39, + 2, 49, 0,160,255,204, 18, 6, 3, 85, 0, 0, 0, 1, 0,191, 0, 0, 4,161, 4, 96, 0, 10, 0, 70, 64, 17, 66, 3, 0,188, + 7, 10, 12, 5, 1, 4, 6, 8, 1, 8, 0, 70, 11, 16,252,236, 50,212,196, 17, 57,196, 49, 0, 47, 60,228, 50, 48, 75, 83, 88, + 64, 16, 7, 17, 6, 8, 17, 5, 6, 5, 2, 17, 5, 3, 17, 4, 5, 4, 5, 7, 16,236, 4, 16,236, 7, 16,236, 5, 16,236, 89, + 19, 51, 17, 1, 51, 9, 1, 35, 1, 17, 35,191,185, 2, 37,235,253,174, 2,107,240,253,199,185, 4, 96,254, 29, 1,227,253,244, +253,172, 2, 35,253,221, 0, 0, 0, 1, 0, 46,255,227, 4,115, 4, 96, 0, 15, 0, 38, 64, 20, 11,169, 6,188, 9, 1,169, 0, +140, 9, 17, 70, 10, 8, 7, 11, 8, 6, 1, 16, 16,212,212,236,212,236,236, 49, 0, 47,244,236, 16,244,236, 48, 23, 53, 54, 55, + 54, 17, 53, 33, 17, 35, 17, 33, 21, 16, 3, 6, 46,179, 59, 98, 2,245,184,254,123,118, 94, 29,153, 27,127,207, 1,167,212,251, +160, 3,199,134,254,146,254,252,207, 0, 0, 0, 0, 1, 0,193, 0, 0, 5, 72, 4, 96, 0, 12, 0, 77, 64, 22, 66, 10, 7, 2, + 3, 8, 3, 0,188, 9, 6, 12, 14, 70, 7, 8, 4, 10, 8, 0, 70, 13, 16,252,236,220,236,236, 49, 0, 47, 60,196,236, 50, 17, + 23, 57, 48, 75, 83, 88, 64, 18, 2, 17, 8, 10, 9, 3, 17, 7, 8, 7, 2, 17, 9, 1, 17, 10, 10, 9, 5, 7, 16,237, 16,237, + 7, 16,237, 8, 16,237, 89, 19, 33, 9, 1, 33, 17, 35, 17, 1, 35, 1, 17, 35,193, 1, 6, 1, 62, 1, 63, 1, 4,178,254,203, +184,254,202,178, 4, 96,253, 18, 2,238,251,160, 3,176,253, 39, 2,217,252, 80, 0, 1, 0,193, 0, 0, 4,136, 4, 96, 0, 11, + 0, 39, 64, 20, 9,169, 2, 4, 0,188, 7, 11, 13, 70, 8, 4, 8, 5, 9, 1, 8, 0, 70, 12, 16,252,236, 50,220,236, 50,236, + 49, 0, 47, 60,228, 50,220,236, 48, 19, 51, 17, 33, 17, 51, 17, 35, 17, 33, 17, 35,193,184, 2, 87,184,184,253,169,184, 4, 96, +254, 51, 1,205,251,160, 2, 4,253,252, 0, 0,255,255, 0,113,255,227, 4,117, 4,123, 18, 6, 0, 82, 0, 0, 0, 1, 0,193, + 0, 0, 4,136, 4, 96, 0, 7, 0, 40, 64, 16, 4,169, 7,188, 2, 6, 3, 8, 9, 70, 0, 4, 8, 7, 70, 8, 16,252,236,212, +236,236, 49, 0, 47, 60,244,236, 48, 64, 5,160, 9,128, 9, 2, 1, 93, 1, 17, 35, 17, 33, 17, 35, 17, 4,136,184,253,169,184, + 4, 96,251,160, 3,198,252, 58, 4, 96, 0, 0,255,255, 0,186,254, 86, 4,164, 4,123, 18, 6, 0, 83, 0, 0,255,255, 0,113, +255,227, 3,231, 4,123, 18, 6, 0, 70, 0, 0, 0, 1, 0, 5, 0, 0, 4, 54, 4, 96, 0, 7, 0, 37, 64, 13, 3, 7,169, 0, +188, 5, 9, 1, 3, 8, 0, 6, 8, 16,212,204,252,204,204, 49, 0, 47,244,236, 50, 48, 64, 5,160, 9,128, 9, 2, 1, 93, 19, + 33, 21, 33, 17, 35, 17, 33, 5, 4, 49,254, 66,181,254, 66, 4, 96,170,252, 74, 3,182, 0, 0,255,255, 0, 61,254, 86, 4,127, + 4, 96, 18, 6, 0, 92, 0, 0, 0, 3, 0,113,254, 86, 6,228, 5,213, 0, 15, 0, 52, 0, 67, 0, 64, 64, 35, 57, 12,185, 39, + 28,184, 33,151, 68, 64, 4,185, 47, 21,140, 16,189, 68, 69, 69, 53, 18, 43, 17, 8, 33, 8, 51, 61, 34, 0, 18, 25, 69, 68, 16, +252,236,212, 60, 60,252, 60, 60,212,236,236, 49, 0, 16,236,244, 60,236, 50, 16,228,244, 60,236, 50, 48, 1, 20, 23, 22, 51, 50, + 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 1, 17, 6, 7, 6, 35, 34, 39, 38, 17, 16, 18, 51, 50, 23, 22, 23, 17, 51, 17, 54, 55, + 54, 51, 50, 23, 22, 17, 16, 7, 6, 35, 34, 39, 38, 39, 17, 1, 52, 39, 38, 35, 34, 7, 6, 21, 20, 22, 51, 50, 55, 54, 1, 52, + 68, 67,133,133, 69, 68, 68, 69,133,133, 67, 68, 2, 26, 45, 77, 76,101,201,116,117,232,202,100, 77, 76, 46,185, 46, 77, 76,100, +203,115,116,116,116,202,102, 76, 77, 44, 2, 28, 67, 68,133,134, 69, 69,138,134,133, 68, 67, 2, 47,214,109,109,109,110,213,213, +110,109,109,109,251, 81, 2, 57, 83, 44, 45,155,156, 1, 17, 1, 22, 1, 58, 43, 44, 83, 2, 4,253,252, 83, 44, 43,157,157,254, +234,254,239,156,155, 43, 44, 83,253,201, 3,217,214,109,109,109,110,213,212,220,109,109, 0, 0,255,255, 0, 59, 0, 0, 4,121, + 4, 96, 18, 6, 0, 91, 0, 0, 0, 1, 0,193,254, 86, 5, 64, 4, 96, 0, 11, 0, 40, 64, 21, 6, 2,188, 11,189, 8, 4,169, + 1, 13, 0, 8, 9, 6, 8, 7, 3, 8, 2, 70, 12, 16,252,236,212,236,212,236,204, 49, 0, 47,236, 50,236,244, 60, 48, 41, 1, + 17, 51, 17, 33, 17, 51, 17, 51, 17, 35, 4,136,252, 57,184, 2, 87,184,184,184, 4, 96,252, 57, 3,199,252, 57,253,189, 0, 0, + 0, 1, 0,150, 0, 0, 4, 0, 4, 96, 0, 17, 0, 34, 64, 17, 2,169, 13, 15, 7,188, 0, 19, 70, 1, 15, 8, 16, 8, 8, 7, + 18, 16,220,236,212,236, 50,236, 49, 0, 47,228, 50,212,236, 48, 33, 17, 33, 34, 39, 38, 61, 1, 51, 21, 20, 23, 22, 51, 33, 17, + 51, 17, 3, 72,254,169,153,102, 92,184, 52, 53,104, 1, 41,184, 2, 9, 95, 86,184,234,211,117, 59, 59, 1,190,251,160, 0, 0, + 0, 1, 0,193, 0, 0, 6, 58, 4, 96, 0, 11, 0, 40, 64, 21, 10, 2, 6,188, 0, 8,169, 5, 13, 70, 2, 8, 3, 10, 8, 11, + 7, 8, 6, 70, 12, 16,252,236,212,252,212,236,236, 49, 0, 47,236, 50,244, 60,196, 48, 37, 33, 17, 51, 17, 33, 17, 51, 17, 33, + 17, 51, 3,217, 1,169,184,250,135,184, 1,168,184,153, 3,199,251,160, 4, 96,252, 57, 3,140, 0, 1, 0,193,254, 86, 6,242, + 4, 96, 0, 15, 0, 49, 64, 26, 6, 10, 2,188, 15,189, 12, 8, 4,169, 1, 17, 0, 8, 13, 10, 8, 11, 6, 8, 7, 3, 8, 2, + 70, 16, 16,252,236,212,252,212,236,212,236,204, 49, 0, 47,236, 50, 50,236,244, 60,196, 48, 41, 1, 17, 51, 17, 33, 17, 51, 17, + 33, 17, 51, 17, 51, 17, 35, 6, 58,250,135,184, 1,168,184, 1,169,184,184,184, 4, 96,252, 57, 3,140,252,116, 3,199,252, 57, +253,189, 0, 0, 0, 2, 0, 42, 0, 0, 5, 46, 4, 96, 0, 10, 0, 25, 0, 42, 64, 22, 12,169, 13,188, 25, 5,169, 15, 6,169, + 25, 27, 69, 0, 18, 20, 5, 14, 8, 11, 13, 26, 16,204,220,236, 50,212,236,236, 49, 0, 47,236,212,236, 16,244,236, 48, 1, 52, + 39, 38, 35, 33, 17, 33, 50, 55, 54, 1, 33, 53, 33, 17, 33, 50, 23, 22, 21, 20, 7, 6, 35, 33, 4,106, 62, 67,128,254,249, 1, + 7,129, 66, 62,253, 64,254,128, 2, 56, 1, 15,208,121,116,116,115,214,254, 57, 1, 76, 94, 42, 46,254,151, 46, 43, 2,212,154, +254, 59, 85, 82,168,168, 82, 82,255,255, 0,193, 0, 0, 5,105, 4, 96, 16, 38, 3,105, 0, 0, 17, 7, 0,243, 3,240, 0, 0, + 0, 13, 64, 6, 29, 70, 25, 8, 24, 18, 16,220,252,236, 49, 0, 0, 2, 0,193, 0, 0, 4, 69, 4, 96, 0, 10, 0, 23, 0, 36, + 64, 19, 5,169, 13, 11,188, 6,169, 23, 25, 69, 0, 18, 18, 5, 12, 8, 11, 70, 24, 16,252,236, 50,212,236,236, 49, 0, 47,236, +228,212,236, 48, 1, 52, 39, 38, 35, 33, 17, 33, 50, 55, 54, 1, 51, 17, 33, 50, 23, 22, 21, 20, 7, 6, 35, 33, 3,129, 62, 67, +128,254,249, 1, 7,129, 66, 62,253, 64,184, 1, 15,208,121,116,116,115,214,254, 57, 1, 76, 94, 42, 46,254,151, 46, 43, 3,110, +254, 59, 85, 82,168,168, 82, 82, 0, 1, 0,113,255,227, 3,231, 4,123, 0, 28, 0, 0, 1, 34, 7, 21, 54, 51, 50, 23, 22, 23, + 33, 21, 33, 6, 7, 6, 35, 34, 39, 21, 22, 51, 32, 55, 54, 17, 16, 39, 38, 1,180,166,157,161,154,230, 92, 34, 12,254, 52, 1, +212, 13,158, 85,120,157,158,147,189, 1, 11,148,135,151,148, 4,123, 70,172, 86,180, 65, 87,143,244, 94, 51, 86,170, 72,172,157, + 1, 3, 1, 17,157,158, 0, 0, 0, 2, 0,193,255,227, 6, 16, 4,123, 0, 14, 0, 36, 0, 56, 64, 31, 0,185, 19,184, 37, 8, +185, 26,140, 37, 31,169, 36, 34,188, 33, 38, 69, 11, 18, 22, 4, 18, 30, 15, 31, 35, 8, 34, 70, 37, 16,252,236, 50,212, 60,236, +212,236,236, 49, 0, 47,228,212,236, 16,244,236, 16,244,236, 48, 1, 34, 7, 6, 21, 20, 23, 22, 51, 50, 54, 53, 52, 39, 38, 1, + 54, 55, 54, 51, 50, 0, 17, 16, 7, 6, 35, 34, 39, 38, 39, 35, 17, 35, 17, 51, 17, 4, 14,148, 86, 86, 85, 86,149,147,172, 86, + 86,253,113, 19,112,137,240,240, 1, 18,137,137,240,241,136,127, 9,148,184,184, 3,223,115,116,201,201,116,115,232,200,199,116, +117,254,194,190,128,156,254,200,254,236,254,237,156,157,157,145,248,253,247, 4, 96,254, 65, 0, 0, 2, 0, 50, 0, 0, 4, 15, + 4, 96, 0, 22, 0, 33, 0, 68, 64, 21, 66, 24,169, 7,188, 18, 12,169, 32, 10, 18, 35, 70, 11, 23, 8, 8, 28, 18, 3, 34, 16, +212,236,212,236, 50,236, 49, 0, 47, 60,212,236, 16,244,236, 48, 75, 83, 88, 64, 13, 15, 14, 13, 3, 12, 16, 17, 19, 17, 17, 18, + 19, 18, 5, 7, 16,236, 16,236, 17, 23, 57, 89, 1, 46, 1, 53, 52, 55, 54, 51, 33, 17, 35, 17, 35, 34, 7, 6, 7, 3, 35, 19, + 54, 55, 54, 1, 35, 34, 7, 6, 21, 20, 23, 22, 59, 1, 1,181,106,112,107,108,217, 1,132,185,169, 97, 59, 59, 63,162,195,174, + 53, 52, 53, 1,216,198,119, 63, 64, 64, 63,119,198, 2, 13, 27,140,105,162, 81, 80,251,160, 1,217, 37, 36,113,254,225, 1, 50, + 94, 54, 54, 1,201, 42, 42, 84, 83, 43, 43, 0,255,255, 0,113,255,227, 4,127, 6,107, 16, 38, 0, 67, 90, 5, 18, 6, 3, 82, + 0, 0, 0, 0,255,255, 0,113,255,227, 4,127, 6, 16, 16, 39, 0,106, 0,150, 0, 0, 18, 6, 3, 82, 0, 0, 0, 1, 0, 40, +254, 86, 4,107, 6, 20, 0, 40, 0, 0, 19, 35, 53, 51, 53, 51, 21, 33, 21, 33, 17, 54, 55, 54, 51, 50, 23, 22, 21, 17, 20, 7, + 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, 38, 35, 34, 7, 6, 21, 17, 35,193,153,153,185, 1, 70,254,186, 66, 89, 90,117,185, +107, 99, 82, 81,181, 70, 49,110, 33, 38,124,124,154, 81, 86,185, 5, 4,125,147,147,125,254, 87,101, 50, 50,119,110,242,253,159, +214, 96, 96,156, 48, 55,147, 2, 91,159,158, 95,101,158,253,222,255,255, 0,186, 0, 0, 3,216, 6,109, 16, 39, 0,118, 0,134, + 0, 7, 18, 6, 3, 80, 0, 0, 0, 1, 0,113,255,227, 3,231, 4,123, 0, 28, 0, 58, 64, 33, 2,134, 3,136, 5, 19,134, 18, +136, 16,185, 21, 10,169, 11,187, 5,185, 0,184, 21,140, 29, 10, 12, 9, 18, 18, 2, 72, 25, 69, 29, 16,252,228, 50,252, 50,204, + 49, 0, 16,228,244,236,244,238, 16,254,244,238, 16,245,238, 48, 1, 50, 23, 21, 38, 35, 34, 7, 6, 7, 33, 21, 33, 22, 23, 22, + 51, 50, 55, 21, 6, 35, 32, 39, 38, 17, 16, 55, 54, 2,164,166,157,161,154,230, 92, 34, 12, 1,204,254, 44, 13,158, 85,120,157, +158,147,188,254,243,148,134,151,149, 4,123, 70,172, 86,180, 65, 87,143,244, 94, 51, 86,170, 72,173,157, 1, 2, 1, 17,157,158, +255,255, 0,111,255,227, 3,199, 4,123, 18, 6, 0, 86, 0, 0,255,255, 0,193, 0, 0, 1,121, 6, 20, 18, 6, 0, 76, 0, 0, +255,255,255,244, 0, 0, 2, 70, 6, 16, 18, 38, 0,243, 0, 0, 17, 7, 0,106,255, 29, 0, 0, 0, 8,180, 0, 10, 7, 1, 7, + 43, 49, 0, 0,255,255,255,219,254, 86, 1,121, 6, 20, 18, 6, 0, 77, 0, 0, 0, 2, 0, 46,255,227, 6,190, 4, 96, 0, 23, + 0, 34, 0, 0, 1, 33, 21, 16, 3, 6, 5, 53, 54, 55, 54, 17, 53, 33, 17, 51, 50, 23, 22, 16, 7, 6, 35, 33, 1, 52, 39, 38, + 43, 1, 17, 51, 50, 55, 54, 3,158,254,152,118, 94,254,204,179, 59, 98, 2,216,171,208,121,116,116,115,214,254,157, 2, 92, 62, + 67,128,163,163,129, 66, 62, 3,199,134,254,146,254,252,207, 29,153, 27,127,207, 1,167,212,254, 59, 85, 82,254,176, 82, 82, 1, + 76, 94, 42, 46,254,151, 46, 43, 0, 2, 0,193, 0, 0, 6,188, 4, 96, 0, 10, 0, 30, 0, 0, 1, 52, 39, 38, 43, 1, 17, 51, + 50, 55, 54, 5, 17, 33, 17, 35, 17, 51, 17, 33, 17, 51, 17, 51, 50, 23, 22, 16, 7, 6, 35, 5,248, 62, 66,129,163,163,129, 66, + 62,253,164,253,221,184,184, 2, 35,184,171,208,121,116,116,115,214, 1, 76, 95, 42, 45,254,151, 46, 43,242, 2, 2,253,254, 4, + 96,254, 59, 1,197,254, 59, 85, 82,254,176, 82, 82, 0, 0, 0, 0, 1, 0, 40, 0, 0, 4,107, 6, 20, 0, 30, 0, 0, 19, 35, + 53, 51, 53, 51, 21, 33, 21, 33, 17, 54, 55, 54, 51, 50, 23, 22, 21, 17, 35, 17, 52, 38, 35, 34, 7, 6, 21, 17, 35,193,153,153, +185, 1, 70,254,186, 66, 89, 90,117,189,103, 99,184,124,124,152, 83, 86,185, 5, 4,125,147,147,125,254, 87,101, 50, 50,119,115, +237,253,179, 2, 71,159,158, 95, 98,161,253,222,255,255, 0,191, 0, 0, 4,161, 6,109, 16, 39, 0,118, 0,228, 0, 7, 18, 6, + 3, 87, 0, 0,255,255, 0,193, 0, 0, 4,128, 6,107, 16, 38, 0, 67,100, 5, 18, 6, 3, 85, 0, 0, 0, 0,255,255, 0, 61, +254, 86, 4,127, 6, 20, 16, 38, 2, 49, 94,204, 18, 6, 3, 96, 0, 0, 0, 0, 0, 1, 0,193,254, 86, 4,136, 4, 96, 0, 11, + 0, 0, 33, 17, 35, 17, 33, 17, 51, 17, 33, 17, 51, 17, 2,255,184,254,122,184, 2, 87,184,254, 86, 1,170, 4, 96,252, 58, 3, +198,251,160, 0, 0, 1, 0,115,255,227, 7, 5, 5,213, 0, 52, 0, 0, 1, 22, 51, 50, 55, 54, 61, 1, 51, 21, 20, 23, 22, 51, + 50, 55, 54, 17, 52, 39, 2, 39, 51, 22, 23, 18, 21, 16, 7, 6, 35, 34, 39, 38, 39, 6, 7, 6, 35, 34, 39, 38, 17, 52, 19, 54, + 55, 51, 6, 3, 6, 21, 16, 1,146, 73,125,114, 72, 71,199, 70, 70,116,134, 65, 71, 67,135, 84,250, 95, 56,100,123,123,209,146, +101,100, 39, 39,100,101,146,211,121,123,100, 59, 93,249, 84,135, 67, 1, 90,109,105,104,198,241,241,198,104,105,109,119, 1, 39, +183,159, 1, 65, 70,130,156,254,231,190,254,102,178,177, 94, 94,173,173, 94, 94,177,180, 1,152,201, 1, 14,159,127, 70,254,191, +159,183,254,205,255,255, 0,135,255,226, 6, 40, 4, 96, 16, 2, 2,231, 0, 0,255,255, 0, 33, 0, 0, 4,236, 5,213, 16, 2, + 3,168, 0, 0, 0, 2, 0, 58, 0, 0, 4, 69, 5,213, 0, 19, 0, 30, 0, 0, 1, 17, 33, 50, 23, 22, 16, 7, 6, 35, 33, 17, + 35, 53, 51, 17, 51, 17, 51, 21, 1, 52, 39, 38, 35, 33, 17, 33, 50, 55, 54, 1,121, 1, 15,208,121,116,116,115,214,254, 57,135, +135,184,175, 1, 89, 62, 67,128,254,249, 1, 7,129, 66, 62, 3,209,254,202, 85, 82,254,176, 82, 82, 3,209,143, 1,117,254,139, +143,253,123, 94, 42, 46,254,151, 46, 43, 0, 0, 0, 1, 0,211,255,227, 7, 27, 5,240, 0, 43, 0, 0, 1, 17, 35, 17, 51, 17, + 51, 18, 55, 54, 33, 50, 23, 22, 23, 21, 38, 39, 38, 35, 32, 7, 6, 7, 33, 21, 33, 18, 23, 22, 33, 50, 55, 54, 55, 21, 6, 7, + 6, 35, 32, 39, 38, 3, 1,157,202,202,210, 30,157,195, 1, 83,134,118,119,104,102,115,116,130,255, 0,136,103, 25, 2,178,253, + 70, 7,129,137, 0,255,130,116,115,102,106,119,118,132,254,173,195,186, 9, 2,199,253, 57, 5,213,253,156, 1, 8,167,208, 36, + 35, 71,213, 95, 47, 47,156,119,198,170,254,243,148,157, 47, 47, 95,211, 72, 36, 36,207,198, 1, 79, 0, 0, 0, 0, 1, 0,193, +255,227, 5,129, 4,123, 0, 35, 0, 0, 1, 50, 23, 21, 38, 35, 34, 7, 6, 7, 33, 21, 33, 22, 23, 22, 51, 50, 55, 21, 6, 35, + 32, 39, 38, 39, 35, 17, 35, 17, 51, 17, 51, 54, 55, 54, 4, 62,166,157,161,154,230, 92, 34, 12, 1,204,254, 44, 13,158, 85,120, +157,158,147,188,254,243,148,123, 10,147,184,184,152, 23,122,151, 4,123, 70,172, 86,180, 65, 87,143,244, 94, 51, 86,170, 72,173, +144,228,253,252, 4, 96,254, 51,202,128,158, 0, 0, 2, 0, 16, 0, 0, 6,248, 5,213, 0, 3, 0, 15, 0, 0, 1, 11, 1, 31, + 1, 17, 35, 17, 39, 1, 35, 1, 51, 1, 35, 1, 4,106,230,231,231,102,202,222,254,175,225, 3, 2,229, 3, 1,225,254,175, 3, + 63, 1,192,254, 64,119,172,253,228, 2, 27,114,253,115, 5,213,250, 43, 2,142, 0, 2, 0, 51, 0, 0, 6, 17, 4, 96, 0, 3, + 0, 15, 0, 0, 1, 11, 1, 31, 1, 17, 35, 17, 39, 1, 35, 1, 51, 1, 35, 1, 3,226,192,192,192, 93,184,179,254,226,195, 2, +142,195, 2,141,195,254,226, 2,112, 1, 74,254,182, 87,131,254,106, 1,149, 81,254, 26, 4, 96,251,160, 1,231, 0, 2, 0,201, + 0, 0, 9, 20, 5,213, 0, 3, 0, 23, 0, 0, 1, 11, 1, 23, 5, 33, 17, 35, 17, 51, 17, 33, 1, 51, 1, 35, 1, 7, 17, 35, + 17, 39, 1, 35, 6,134,230,231,231,253,251,253,248,202,202, 2, 95, 1, 60,229, 3, 1,225,254,175,220,202,222,254,175,225, 3, + 63, 1,192,254, 64,119, 1,253, 57, 5,213,253,156, 2,100,250, 43, 2,142,114,253,228, 2, 27,114,253,115, 0, 0, 2, 0,193, + 0, 0, 7,208, 4, 96, 0, 3, 0, 23, 0, 0, 1, 11, 1, 23, 5, 33, 17, 35, 17, 51, 17, 33, 1, 51, 1, 35, 1, 7, 17, 35, + 17, 39, 1, 35, 5,161,192,192,192,254, 45,254,107,184,184, 1,233, 1, 30,195, 2,141,195,254,226,177,184,179,254,226,195, 2, +112, 1, 74,254,182, 87, 50,254, 25, 4, 96,254, 23, 1,233,251,160, 1,231, 81,254,106, 1,149, 81,254, 26, 0, 0, 2, 0,115, + 0, 0, 5,217, 5,213, 0, 23, 0, 26, 0, 0, 1, 17, 35, 17, 6, 7, 6, 17, 35, 16, 55, 54, 55, 1, 33, 1, 22, 23, 22, 17, + 35, 16, 39, 38, 39, 1, 33, 3,139,202,147,100,130,213,189,120,170,254, 81, 5, 18,254, 80,164,116,188,213,128, 96,248, 1, 62, +253,131, 2, 89,253,167, 2, 89, 28,126,164,254,229, 1, 98,210,134, 49, 2,234,253, 19, 50,130,210,254,158, 1, 30,161,122,202, + 2, 40, 0, 0, 0, 2, 0,107, 0, 0, 4,123, 4, 96, 0, 2, 0, 26, 0, 0, 1, 33, 19, 9, 1, 22, 23, 22, 17, 35, 52, 39, + 38, 39, 17, 35, 17, 6, 7, 6, 21, 35, 16, 55, 54, 55, 1, 3, 69,254, 93,209, 2, 8,254,187,107, 75,137,195, 86, 58, 86,184, + 83, 56, 86,194,137, 74,108,254,187, 3,182,254,150, 2, 20,253,204, 38, 86,156,254,236,199,116, 79, 26,254, 92, 1,162, 26, 75, +116,201, 1, 20,156, 85, 39, 2, 52, 0, 0, 0, 0, 2, 0,201, 0, 0, 7,196, 5,213, 0, 30, 0, 33, 0, 0, 9, 1, 33, 1, + 22, 23, 22, 17, 35, 16, 39, 38, 39, 17, 35, 17, 6, 7, 6, 17, 35, 16, 55, 54, 55, 33, 17, 35, 17, 51, 17, 5, 1, 33, 3,239, +254,159, 5, 18,254, 80,164,116,188,213,128, 96,153,202,147,100,130,213,189, 85,110,253,181,202,202, 3,132, 1, 62,253,131, 3, +113, 2,100,253, 19, 50,130,210,254,158, 1, 30,161,122, 32,253,167, 2, 89, 28,126,164,254,229, 1, 98,210, 95, 52,253, 57, 5, +213,253,156,110, 2, 40, 0, 0, 0, 2, 0,193, 0, 0, 6, 46, 4, 96, 0, 30, 0, 33, 0, 0, 9, 1, 33, 1, 22, 23, 22, 17, + 35, 52, 39, 38, 39, 17, 35, 17, 6, 7, 6, 21, 35, 16, 55, 54, 55, 33, 17, 35, 17, 51, 17, 1, 33, 19, 3, 55,254,231, 4, 16, +254,187,107, 75,137,195, 86, 58, 86,184, 83, 56, 86,194,137, 27, 31,254,146,184,184, 3,127,254, 93,209, 2,119, 1,233,253,204, + 38, 86,156,254,236,199,116, 79, 26,254, 92, 1,162, 26, 75,116,201, 1, 20,156, 31, 24,254, 25, 4, 96,254, 23, 1, 63,254,150, + 0, 1, 0,115,254, 86, 4,115, 5,240, 0, 75, 0, 0, 5, 50, 23, 22, 23, 21, 38, 39, 38, 35, 32, 39, 38, 53, 52, 55, 54, 51, + 50, 23, 22, 51, 50, 55, 54, 53, 52, 39, 38, 43, 1, 53, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 6, 7, 53, 54, 55, 54, 51, 50, + 23, 22, 21, 20, 7, 6, 7, 22, 23, 22, 21, 20, 7, 6, 35, 34, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 2,187, 60, 91, 96, 86, + 71,103,134, 25,254,205,114,163, 63, 71, 99, 46,132, 73,100, 91, 85, 63, 92, 91,167,174,182,149, 79, 79, 81, 82,152, 83,190,114, +115,100,101, 89,230,134,134, 71, 71,131,147, 80, 81,115,152,198, 86, 76, 85, 42, 40, 32, 24,117, 94,209, 6, 6, 38,167, 41, 8, + 10, 67, 96,147,144, 72, 81, 45, 25, 90, 65,121,122, 74, 73,166, 59, 60,112,115, 61, 62, 36, 38,180, 32, 16, 16,104,105,178,124, + 85, 86, 33, 31, 96, 98,134,208,102,136, 36, 42, 36, 27, 67, 87, 39, 32, 0, 0, 0, 2, 0, 91,254,116, 3,200, 6,102, 0, 73, + 0, 80, 0, 0, 37, 50, 55, 54, 53, 52, 39, 38, 43, 1, 53, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 7, 53, 62, 1, 51, + 50, 23, 22, 21, 20, 7, 6, 7, 30, 1, 21, 20, 6, 39, 38, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 51, 50, 23, 22, 23, 21, 38, + 39, 38, 35, 32, 39, 38, 53, 52, 55, 54, 51, 50, 23, 22, 11, 1, 51, 23, 55, 51, 3, 2, 75, 87, 59, 54, 78, 72,137,148,155,116, + 67, 68, 70, 69,119, 71, 81, 80, 97, 98,170, 76,196,113,114, 60, 60,112,124,138,238,168, 78, 59, 75, 32, 36, 25, 19, 98,106,140, + 82, 46, 93, 59, 59, 88,132, 1,254,254, 96,137, 52, 58, 86, 51,103, 62, 62,245,139,180,180,139,245,153, 49, 45, 91, 76, 56, 51, +152, 44, 45, 70, 64, 46, 46, 13, 13, 29,167, 24, 24, 78, 79,141, 93, 64, 65, 24, 24,146, 96,161,182, 5, 2, 28, 35, 30, 23, 76, + 99, 25, 27, 5, 11, 26,139, 34, 6, 9, 56, 81,152,141, 59, 68, 36, 21, 4, 85, 1,120,245,245,254,136, 0, 0,255,255, 0,115, + 0, 0, 5,219, 5,213, 18, 2, 2,198, 0, 0,255,255, 0,112,254, 86, 4,209, 4, 96, 18, 2, 2,230, 0, 0, 0, 3, 0,115, +255,227, 5,217, 5,240, 0, 9, 0, 20, 0, 35, 0, 0, 1, 5, 39, 5, 18, 23, 22, 32, 55, 54, 17, 38, 39, 38, 35, 34, 7, 6, + 7, 37, 23, 3, 32, 23, 22, 17, 16, 7, 6, 33, 32, 39, 38, 16, 55, 54, 5, 4,254,104,230,254,194, 8,122,129, 1,184,129,120, + 25, 95,129,220,218,131, 98, 24, 1,144,230,159, 1, 58,188,188,188,188,254,198,254,197,188,189,189,188, 2,199,110,200, 90,254, +255,155,164,164,152, 1,174,189,122,164,164,123,188,110,200, 2,217,210,211,254,158,254,159,210,211,210,210, 2,196,211,210, 0, + 0, 3, 0,113,255,227, 4,117, 4,123, 0, 10, 0, 21, 0, 36, 0, 0, 1, 37, 23, 55, 38, 39, 38, 35, 34, 7, 6, 3, 22, 23, + 22, 51, 50, 55, 54, 55, 5, 39, 19, 50, 0, 17, 16, 7, 6, 35, 34, 39, 38, 17, 16, 55, 54, 1, 57, 1, 7,150,213, 17, 62, 86, +147,149, 85, 63, 22, 8, 76, 86,149,147, 86, 76, 9,254,243,150,101,240, 1, 18,137,137,240,241,136,137,137,136, 2,148, 70,120, + 50,129, 85,117,115, 85,254,237,173,101,115,116,103,170, 70,130, 2, 59,254,200,254,236,254,237,156,157,157,156, 1, 19, 1, 20, +156,156, 0, 0, 0, 1, 0, 16, 0, 0, 6, 39, 5,240, 0, 20, 0, 0, 33, 35, 1, 51, 9, 1, 18, 55, 54, 51, 50, 22, 23, 21, + 39, 38, 35, 34, 7, 6, 7, 3, 47,229,253,198,211, 1,217, 1, 56,115, 96, 78,148, 31, 62, 33, 68, 22, 25, 73, 34, 71, 84, 5, +213,251, 23, 3, 61, 1, 50, 82, 67, 10, 11,187, 10, 4, 34, 67,221, 0, 0, 0, 0, 1, 0, 50, 0, 0, 5, 31, 4,123, 0, 21, + 1, 56, 64, 5, 23, 8, 4, 19, 22, 16, 75,176, 10, 84, 88,185, 0, 19, 0, 64, 56, 89, 75,176, 20, 84, 75,176, 21, 84, 91, 88, +185, 0, 19,255,192, 56, 89,212,212,196,196,180, 21, 17, 18, 4, 19, 17, 18, 57, 57, 57, 49, 64, 10, 9,134, 8, 12,185, 4,184, + 19,188, 18, 0, 47,228,244,228,212,236, 48,182, 21, 17, 20, 17, 19, 19, 18, 7, 5, 16,236, 4,236,183, 3, 2, 1, 0, 17, 16, + 16, 17, 7, 5, 16,236, 50, 50, 50, 64, 26, 12, 15, 15, 9, 15, 8, 11, 16, 10, 3, 10, 2, 12, 1, 10, 0, 8, 21, 9, 17, 8, + 18, 8, 20, 7, 19, 64, 16, 25, 16, 25, 0, 31, 22, 26, 17, 29, 18, 28, 21, 29, 20, 29, 19, 64, 12, 43, 1, 41, 16, 41, 0, 40, + 21, 38, 20, 38, 19, 64, 18, 51, 15, 52, 1, 50, 16, 51, 0, 54, 21, 54, 20, 54, 19, 55, 17, 52, 18, 64, 24, 74, 2, 74, 16, 74, + 0, 77, 1, 72, 21, 70, 19, 70, 20, 70, 17, 74, 18, 79, 9, 79, 8, 79, 23, 64, 28, 90, 2, 92, 1, 91, 16, 91, 0, 95, 22, 93, + 21, 94, 20, 95, 19, 94, 18, 90, 17, 90, 15, 95, 23, 95, 9, 95, 8, 64, 26,107, 15,107, 2,105, 1,111, 1,106, 16,106, 0,105, + 21,102, 20,102, 19,105, 18,111, 9,111, 8,111, 23, 64, 18,124, 2,127, 1,122, 16,122, 21,122, 0,119, 17,124, 18,117, 20,118, + 19,176, 84, 1, 93, 64, 17, 6, 21, 25, 21, 39, 21, 54, 21, 74, 21, 91, 21,106, 21,127, 21, 8, 0, 93, 1, 54, 55, 54, 51, 50, + 23, 22, 23, 21, 39, 38, 35, 34, 7, 6, 7, 1, 35, 1, 51, 1, 3, 59, 80,102, 66,129, 26, 26, 27, 28, 58, 19, 21, 54, 29, 65, + 61,254,228,250,254, 92,195, 1, 94, 3, 36,213, 79, 51, 4, 4, 8,141, 7, 3, 25, 55,162,253, 10, 4, 96,252, 84, 0, 0, 0, + 0, 3, 0, 16, 0, 0, 6, 39, 7,108, 0, 3, 0, 7, 0, 28, 0, 0, 1, 19, 35, 3, 37, 19, 35, 3, 19, 35, 1, 51, 9, 1, + 18, 55, 54, 51, 50, 22, 23, 21, 39, 38, 35, 34, 7, 6, 7, 1,253,144,135,174, 1,238,134,137,157,137,229,253,198,211, 1,217, + 1, 56,115, 96, 78,148, 31, 62, 33, 68, 22, 25, 73, 34, 71, 84, 7,107,254,248, 1, 8, 1,254,247, 1, 9,248,148, 5,213,251, + 23, 3, 61, 1, 50, 82, 67, 10, 11,187, 10, 4, 34, 67,221, 0,255,255, 0, 50, 0, 0, 5, 31, 6,102, 16, 35, 2, 87, 4,194, + 0, 0, 18, 2, 3,146, 0, 0,255,255, 0,113,255,227, 5, 37, 5,240, 16, 2, 1,228, 0, 0,255,255, 0,113,255,227, 4,113, + 5, 47, 16, 2, 1,229, 0, 0, 0, 2, 0,115,255,227, 7, 45, 5,240, 0, 41, 0, 82, 0, 0, 37, 51, 50, 55, 54, 53, 52, 39, + 38, 43, 1, 6, 7, 6, 7, 6, 34, 39, 38, 39, 38, 39, 35, 34, 7, 6, 21, 20, 23, 22, 59, 1, 54, 55, 54, 55, 54, 50, 23, 22, + 23, 22, 7, 35, 32, 39, 38, 16, 55, 54, 33, 51, 54, 55, 54, 55, 54, 50, 23, 22, 23, 22, 23, 51, 32, 23, 22, 17, 16, 7, 6, 33, + 35, 6, 7, 6, 7, 6, 34, 39, 38, 39, 38, 4, 93, 30,235,114,128,128,114,235, 30, 11, 15, 22, 27, 26, 62, 26, 27, 22, 16, 10, + 46,235,114,130,130,114,235, 46, 10, 16, 22, 27, 26, 62, 26, 27, 22, 16,254, 46,254,161,152,189,189,152, 1, 95, 45, 11, 16, 22, + 27, 26, 62, 26, 31, 18, 16, 11, 29, 1, 94,152,188,188,152,254,162, 29, 10, 17, 22, 27, 26, 62, 26, 31, 18, 16,194,145,164,242, +243,164,145, 20, 14, 21, 12, 11, 11, 12, 21, 16, 18,145,164,243,242,164,145, 18, 16, 21, 12, 11, 11, 12, 21, 16,161,170,210, 2, +116,211,170, 21, 15, 21, 12, 11, 11, 14, 19, 17, 19,170,211,254,198,254,199,210,171, 19, 17, 21, 12, 11, 11, 14, 19, 17, 0, 0, + 0, 2, 0,113,255,227, 5,161, 4,123, 0, 38, 0, 80, 0, 0, 37, 51, 50, 55, 54, 53, 52, 39, 38, 43, 1, 6, 7, 14, 1, 34, + 38, 39, 38, 39, 35, 34, 7, 6, 21, 20, 23, 22, 59, 1, 54, 55, 62, 1, 50, 23, 22, 23, 22, 7, 35, 32, 39, 38, 53, 52, 55, 54, + 33, 51, 54, 55, 54, 55, 54, 50, 23, 22, 23, 22, 23, 51, 32, 23, 22, 21, 20, 7, 6, 33, 35, 6, 7, 6, 7, 6, 34, 39, 38, 39, + 38, 3,114, 45,161, 72, 86, 86, 63,170, 45, 7, 10, 18, 44, 52, 44, 18, 10, 7, 45,163, 71, 86, 85, 72,163, 45, 7, 10, 18, 44, + 52, 22, 27, 13, 9,201, 46,254,255,120,137,137,116, 1, 5, 46, 7, 9, 13, 27, 22, 52, 22, 27, 13, 9, 7, 46, 1, 2,119,137, +137,116,254,251, 46, 7, 9, 13, 27, 22, 52, 22, 27, 13, 9,164, 96,116,183,167,131, 97, 11, 10, 17, 20, 20, 17, 10, 11, 95,116, +184,188,112, 95, 11, 10, 17, 20, 10, 12, 15, 10,147,137,156,238,233,162,136, 10, 10, 15, 12, 10, 10, 12, 15, 10, 10,136,156,239, +232,162,137, 10, 10, 15, 12, 10, 10, 12, 15, 10,255,255, 0,115,255,227, 7, 5, 7,183, 16, 35, 3,160, 6, 44, 1, 61, 16, 2, + 3,125, 0, 0,255,255, 0,135,255,226, 6, 40, 6,100, 16, 35, 3,160, 5,196,255,234, 16, 2, 3,126, 0, 0, 0, 2, 0,115, +255,227, 7, 5, 7, 51, 0, 11, 0, 64, 0, 0, 1, 7, 35, 39, 35, 7, 35, 39, 35, 7, 35, 39, 3, 22, 51, 50, 55, 54, 61, 1, + 51, 21, 20, 23, 22, 51, 50, 55, 54, 17, 52, 39, 2, 39, 51, 22, 23, 18, 21, 16, 7, 6, 35, 34, 39, 38, 39, 6, 7, 6, 35, 34, + 39, 38, 17, 52, 19, 54, 55, 51, 6, 3, 6, 21, 16, 5,126,100, 50, 50,175, 50, 50, 50,175, 50, 50,100,104, 73,125,114, 72, 71, +199, 70, 70,116,134, 65, 71, 67,135, 84,250, 95, 56,100,123,123,209,146,101,100, 39, 39,100,101,146,211,121,123,100, 59, 93,249, + 84,135, 67, 7, 51,200,100,100,100,100,200,250, 39,109,105,104,198,241,241,198,104,105,109,119, 1, 39,183,159, 1, 65, 70,130, +156,254,231,190,254,102,178,177, 94, 94,173,173, 94, 94,177,180, 1,152,201, 1, 14,159,127, 70,254,191,159,183,254,205, 0, 0, + 0, 2, 0,135,255,226, 6, 40, 5,224, 0, 11, 0, 38, 0, 0, 1, 7, 35, 39, 35, 7, 35, 39, 35, 7, 35, 39, 19, 32, 17, 52, + 19, 51, 2, 21, 2, 51, 50, 3, 51, 2, 55, 54, 17, 52, 3, 51, 18, 21, 18, 37, 36, 3, 2, 5, 27,100, 50, 50,175, 50, 50, 50, +175, 50, 50,100,143,254, 97,155,198,143, 1,223,207, 4,170, 4,207,222,143,198,155, 2,254, 95,254,241, 34, 41, 5,224,200,100, +100,100,100,200,250, 3, 2, 82,235, 1, 64,254,192,240,254, 79, 2, 26,253,227, 3, 2, 1,175,240, 1, 64,254,192,235,253,173, + 1, 1, 1, 42,254,213, 0, 0, 0, 1, 0,115,254, 86, 5, 39, 5,240, 0, 25, 0, 0, 33, 35, 32, 39, 38, 17, 16, 0, 33, 50, + 22, 23, 21, 46, 1, 35, 32, 0, 17, 16, 23, 22, 51, 33, 17, 35, 3,250,174,254,165,187,195, 1,134, 1, 83,134,237,104,102,231, +130,255, 0,254,240,136,152,240, 1,107,201,198,208, 1, 83, 1,104, 1,159, 71, 71,213, 95, 94,254,199,254,216,254,211,130,148, +253,176, 0, 0, 0, 1, 0,113,254, 86, 3,231, 4,123, 0, 24, 0, 0, 33, 32, 39, 38, 53, 16, 0, 33, 50, 22, 23, 21, 46, 1, + 35, 34, 6, 21, 20, 22, 59, 1, 17, 35, 17, 2,152,254,251,141,149, 1, 45, 1, 6, 85,162, 76, 78,157, 80,179,198,198,179,245, +201,150,159,250, 1, 18, 1, 58, 35, 35,172, 43, 43,227,205,185,227,253,195, 1,170, 0, 0, 0, 0, 1, 0, 50, 0, 52, 4,142, + 5,188, 0, 27, 0, 0, 1, 55, 39, 55, 23, 55, 23, 7, 23, 7, 39, 7, 23, 7, 39, 7, 23, 7, 39, 7, 39, 55, 39, 55, 23, 55, + 39, 55, 2, 59,105,216,100,216,125,174,125,216,100,216,105,216,100,216,105,216,100,216,125,174,125,216,100,216,105,216,100, 3, +129,181,125,174,125,216,100,216,125,174,125,181,125,174,125,181,125,174,125,216,100,216,125,174,125,181,125,174, 0, 1,251,218, + 4,222,255, 66, 6,122, 0, 47, 0, 0, 1, 33, 20, 7, 6, 7, 6, 7, 6, 34, 39, 38, 39, 38, 39, 38, 53, 52, 55, 54, 55, 54, + 55, 54, 51, 33, 52, 55, 54, 55, 54, 55, 54, 50, 23, 22, 23, 22, 23, 22, 21, 20, 7, 6, 7, 6, 7, 6,254,185,254, 51, 10, 11, + 19, 20, 25, 24, 56, 24, 25, 20, 19, 11, 10, 10, 11, 19, 20, 25, 24, 28, 1,205, 10, 11, 19, 20, 25, 24, 56, 24, 25, 20, 20, 10, + 10, 10, 11, 19, 20, 25, 24, 5,103, 27, 25, 27, 18, 19, 11, 10, 10, 11, 19, 18, 27, 25, 27, 28, 25, 27, 18, 19, 11, 10, 27, 25, + 27, 18, 19, 11, 10, 10, 11, 19, 21, 24, 25, 28, 27, 25, 27, 18, 19, 11, 10, 0, 0, 1,251,247, 5, 41,254,249, 6, 77, 0, 17, + 0, 0, 1, 54, 51, 50, 23, 22, 23, 51, 38, 39, 38, 35, 34, 7, 6, 7, 21, 54,253, 18, 93, 91, 70, 56, 48, 11,118, 10, 79, 86, +138,124,120, 72,141,138, 5,149, 47, 42, 36, 77,143, 72, 77, 67, 41, 40,134, 23, 0, 1,252, 34, 4,227,254,248, 6,117, 0, 7, + 0, 0, 1, 21, 33, 21, 35, 17, 51, 21,254,248,253,192,150,150, 5,247,150,126, 1,146,126, 0, 0, 1,252, 34, 4,227,254,248, + 6,117, 0, 7, 0, 0, 1, 33, 53, 51, 17, 35, 53, 33,252, 34, 2, 64,150,150,253,192, 5,247,126,254,110,126,255,255,247,214, +254,144, 3, 70, 7, 96, 16, 43, 2, 49,255,142, 4,216,192, 0, 16, 43, 2, 49,251, 15, 8,177,192, 0, 16, 43, 2, 49, 4, 13, + 8,177,192, 0, 16, 43, 2, 49,252, 96, 5,249,192, 0, 16, 43, 2, 49, 2,188, 5,249,192, 0, 16, 43, 2, 49,252, 96, 11,105, +192, 0, 16, 43, 2, 49, 2,188, 11,105,192, 0, 16, 11, 2, 49,255,142, 12,137,192, 0, 0, 0, 0, 8,248, 88,253,195, 2,194, + 8, 45, 0, 5, 0, 11, 0, 17, 0, 23, 0, 29, 0, 35, 0, 41, 0, 47, 0, 0, 39, 55, 23, 19, 7, 3, 1, 7, 39, 3, 55, 19, + 1, 39, 55, 37, 23, 5, 1, 23, 7, 5, 39, 37, 1, 53, 51, 5, 21, 45, 1, 21, 35, 37, 53, 5, 1, 35, 53, 19, 51, 11, 1, 51, + 21, 3, 35, 19,107,150,121,111, 92,169,251,119,150,121,111, 92,169, 5, 31,150,122, 1, 86, 92,254,227,250, 76,149,121,254,169, + 91, 1, 28, 6, 96,172, 1, 64,254,192,248,194,172,254,192, 1, 64, 4, 95,211,164,129, 82,211,211,164,129, 82, 90,150,121,254, +169, 92, 1, 29, 5,181,150,121, 1, 87, 92,254,227,254,241,149,122,110, 91,169,251,119,150,121,111, 92,168, 2, 24,212,164,130, + 82,212,212,164,130, 82, 2,223,172, 1, 64,254,192,248,194,172,254,192, 1, 64, 0, 1, 0,201,254, 86, 5,252, 5,213, 0, 14, + 0, 0, 33, 35, 17, 1, 33, 17, 51, 17, 1, 33, 17, 51, 21, 1, 35, 5, 51,196,253,106,254,240,196, 2,150, 1, 16,201,254,146, +134, 4,225,251, 31, 5,213,251, 31, 4,225,250,213,170,254, 86, 0, 2, 0,193,254, 86, 5, 56, 6, 20, 0, 14, 0, 28, 0, 0, + 33, 35, 17, 1, 35, 17, 51, 17, 1, 51, 17, 51, 21, 1, 35, 1, 51, 30, 1, 51, 50, 54, 55, 51, 14, 1, 35, 34, 38, 4,128,183, +253,228,236,183, 2, 27,237,184,254,222,123,253,205,118, 10, 98, 86, 86, 96, 14,118, 10,158,146,144,158, 3,131,252,125, 4, 96, +252,127, 3,129,252, 57,153,254, 86, 7,190, 75, 75, 74, 76,143,144,144, 0, 0, 0, 2, 0, 33, 0, 0, 4,236, 5,213, 0, 18, + 0, 29, 0, 0, 1, 21, 33, 50, 4, 21, 20, 4, 35, 33, 17, 35, 53, 51, 53, 51, 21, 51, 21, 1, 52, 39, 38, 35, 33, 17, 33, 50, + 55, 54, 1,147, 1, 78,251, 1, 16,254,240,251,253,232,168,168,202,168, 1,220, 79, 78,163,254,188, 1, 68,163, 78, 79, 4, 81, +226,218,222,221,218, 4, 81,164,224,224,164,253,102,139, 68, 67,253,221, 68, 67, 0, 2, 0, 38, 0, 0, 4, 69, 5,158, 0, 10, + 0, 30, 0, 0, 1, 52, 39, 38, 35, 33, 17, 33, 50, 55, 54, 1, 17, 33, 50, 23, 22, 16, 7, 6, 35, 33, 17, 35, 53, 51, 17, 51, + 17, 51, 21, 3,129, 62, 67,128,254,249, 1, 7,129, 66, 62,253,248, 1, 15,208,121,116,116,115,214,254, 57,155,155,184,157, 1, + 76, 94, 42, 46,254,151, 46, 43, 2,223,254,202, 85, 82,254,176, 82, 82, 3,209,143, 1, 62,254,194,143, 0, 0, 0, 2, 0,201, + 0, 0, 4,225, 5,213, 0, 14, 0, 27, 0, 0, 1, 23, 7, 39, 6, 43, 1, 17, 35, 17, 33, 50, 4, 21, 20, 39, 54, 55, 52, 38, + 43, 1, 17, 51, 50, 55, 39, 55, 4, 85,140,106,146,126,214,254,202, 1,200,251, 1, 1,226, 12, 1,154,141,254,254,114, 71,215, +106, 3, 35,117,126,123, 83,253,168, 5,213,227,219,146, 45, 44, 57,134,146,253,207, 47,180,126, 0, 2, 0,186,254, 86, 4,164, + 4,123, 0, 13, 0, 35, 0, 0, 37, 39, 55, 23, 54, 53, 52, 38, 32, 6, 16, 22, 51, 50, 5, 23, 7, 39, 6, 35, 34, 38, 39, 17, + 35, 17, 51, 21, 62, 1, 51, 50, 0, 16, 7, 6, 3, 42,140,110,138, 79,167,254,220,167,167,146, 70, 1, 27,147,111,149, 87,108, +123,177, 58,185,185, 58,177,123,204, 0,255,128, 12,152,167, 93,165,115,197,203,231,231,254,106,231, 20,174, 93,179, 46, 97,100, +253,174, 6, 10,170,100, 97,254,188,253,240,162, 15, 0, 0, 0, 0, 1, 0,201, 0, 0, 4,106, 7, 7, 0, 7, 0, 27, 64, 13, + 3, 6,149, 1,129, 0, 3, 4, 6, 28, 1, 4, 8, 16,252,252,220,204, 49, 0, 47,244,236,204, 48, 51, 17, 33, 17, 51, 17, 33, + 17,201, 2,216,201,253, 41, 5,213, 1, 50,254, 36,250,213, 0, 0, 1, 0,186, 0, 0, 3,208, 5,154, 0, 7, 0, 27, 64, 13, + 3, 6,169, 1,188, 0, 3, 4, 6, 8, 1, 70, 8, 16,252,252,220,204, 49, 0, 47,244,236,204, 48, 51, 17, 33, 17, 51, 17, 33, + 17,186, 2, 94,184,253,162, 4, 96, 1, 58,254, 28,252, 74, 0, 0, 1, 0, 71, 0, 0, 4,106, 5,213, 0, 13, 0, 0, 19, 51, + 17, 33, 21, 33, 17, 33, 21, 33, 17, 35, 17, 35, 71,130, 3,161,253, 41, 2, 35,253,221,202,130, 3,232, 1,237,170,254,189,170, +252,194, 3, 62, 0, 1, 0, 56, 0, 0, 3,208, 4, 96, 0, 13, 0, 0, 51, 17, 35, 53, 51, 17, 33, 21, 33, 17, 33, 21, 33, 17, +186,130,130, 3, 22,253,162, 1,160,254, 96, 1,244,170, 1,194,170,254,232,170,254, 12, 0, 0, 0, 1, 0,201,254,102, 4,204, + 5,213, 0, 27, 0, 0, 1, 17, 35, 17, 33, 21, 33, 17, 33, 50, 23, 22, 21, 17, 16, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, + 38, 35, 1,147,202, 3,161,253, 41, 1,161,186,113,109,204,228, 76, 62,134, 56, 55,124,124, 2,199,253, 57, 5,213,170,254, 70, +119,114,238,254,206,254,242,244,170, 75, 75,194, 1, 34,159,158, 0, 1, 0,186,254, 86, 4, 11, 4, 96, 0, 29, 0, 0, 1, 17, + 35, 17, 33, 21, 33, 17, 51, 32, 23, 22, 21, 17, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, 39, 38, 35, 1,114,184, 3, + 22,253,162,250, 1, 7, 70, 82, 82, 81,181,193,172,110, 33, 38, 38, 49,134, 1,231,254, 25, 4, 96,170,254,193, 71, 81,229,254, +242,214, 96, 96,156, 48, 55,147, 1, 8,170, 32, 41, 0, 0, 0, 0, 1, 0, 59,254, 86, 6,194, 5,213, 0, 25, 0, 0, 37, 51, + 17, 35, 17, 35, 1, 35, 17, 35, 17, 35, 1, 35, 9, 1, 51, 1, 51, 17, 51, 17, 51, 1, 51, 1, 6, 87,107,197, 41,254,155,150, +202,150,254,155,217, 1,144,254,162,217, 1, 52,149,202,149, 1, 52,217,254,162,170,253,172, 1,170, 2,199,253, 57, 2,199,253, + 57, 3, 28, 2,185,253,156, 2,100,253,156, 2,100,253, 71, 0, 0, 1, 0, 50,254, 86, 5,193, 4, 96, 0, 25, 0, 0, 37, 51, + 17, 35, 17, 35, 1, 35, 17, 35, 17, 35, 1, 35, 9, 1, 51, 1, 51, 17, 51, 17, 51, 1, 51, 1, 5, 85,108,184, 33,254,213,114, +183,114,254,213,197, 1, 84,254,215,196, 1, 2,113,183,113, 1, 2,196,254,215,153,253,189, 1,170, 2, 9,253,247, 2, 9,253, +247, 2, 85, 2, 11,254, 65, 1,191,254, 65, 1,191,253,245, 0,255,255, 0,156,254,117, 4,115, 5,240, 16, 38, 0,122, 57, 0, + 16, 6, 3, 52, 0, 0, 0, 0,255,255, 0,133,254,117, 3,200, 4,124, 16, 38, 0,122,206, 0, 16, 6, 3, 84, 0, 0, 0, 0, + 0, 1, 0,201,254, 86, 5,106, 5,213, 0, 14, 0, 0, 37, 51, 17, 35, 17, 35, 1, 17, 35, 17, 51, 17, 1, 33, 1, 4,193,169, +197, 69,253, 51,202,202, 2,158, 1, 4,253, 27,170,253,172, 1,170, 2,207,253, 49, 5,213,253,137, 2,119,253, 72, 0, 0, 0, + 0, 1, 0,191,254, 86, 4,161, 4, 96, 0, 14, 0, 0, 37, 51, 17, 35, 17, 35, 1, 17, 35, 17, 51, 17, 1, 51, 1, 4, 2,159, +184, 56,253,199,185,185, 2, 37,235,253,174,153,253,189, 1,170, 2, 35,253,221, 4, 96,254, 29, 1,227,253,244, 0, 1, 0,201, + 0, 0, 5,106, 5,213, 0, 18, 0, 0, 1, 39, 17, 35, 17, 51, 17, 55, 17, 51, 21, 1, 33, 9, 1, 33, 1, 21, 35, 1,224, 77, +202,202, 77,100, 1,237, 1, 4,253, 27, 3, 26,254,246,253,228,100, 2,130, 77,253, 49, 5,213,253,137, 73, 1, 81,243, 1,208, +253, 72,252,227, 2, 30,248, 0, 0, 1, 0,191, 0, 0, 4,161, 4, 96, 0, 18, 0, 0, 1, 21, 35, 53, 39, 17, 35, 17, 51, 17, + 55, 53, 55, 21, 1, 51, 9, 1, 35, 2, 29,101, 64,185,185, 64,101, 1,128,235,253,174, 2,107,240, 1,132,138,235, 62,253,221, + 4, 96,254, 29, 56,217, 2,130, 1, 82,253,244,253,172, 0, 0, 0, 1, 0, 33, 0, 0, 5,106, 5,213, 0, 18, 0, 0, 19, 35, + 53, 51, 53, 51, 21, 51, 21, 35, 21, 1, 33, 9, 1, 33, 1, 17, 35,201,168,168,202,168,168, 2,158, 1, 4,253, 27, 3, 26,254, +246,253, 51,202, 4, 81,164,224,224,164,243, 2,119,253, 72,252,227, 2,207,253, 49, 0, 0, 0, 0, 1, 0, 61, 0, 0, 4,156, + 6, 20, 0, 18, 0, 0, 1, 17, 1, 51, 9, 1, 35, 1, 17, 35, 17, 35, 53, 51, 53, 51, 21, 33, 21, 1,115, 2, 37,235,253,174, + 2,107,240,253,199,185,125,125,185, 1, 96, 4,246,253,135, 1,227,253,244,253,172, 2, 35,253,221, 4,246,164,122,122,164, 0, + 0, 1, 0, 50, 0, 0, 6,150, 5,213, 0, 12, 0, 0, 1, 33, 53, 33, 17, 1, 33, 9, 1, 33, 1, 17, 35, 1,245,254, 61, 2, +141, 2,158, 1, 4,253, 27, 3, 26,254,246,253, 51,202, 5, 43,170,253,137, 2,119,253, 72,252,227, 2,207,253, 49, 0, 0, 0, + 0, 1, 0, 42, 0, 0, 5,139, 4, 96, 0, 12, 0, 0, 1, 33, 53, 33, 17, 1, 51, 9, 1, 35, 1, 17, 35, 1,169,254,129, 2, + 56, 2, 37,235,253,174, 2,107,240,253,199,185, 3,198,154,254, 29, 1,227,253,244,253,172, 2, 35,253,221, 0, 0, 1, 0,201, +254, 86, 6, 4, 5,213, 0, 15, 0, 0, 33, 17, 33, 17, 35, 17, 51, 17, 33, 17, 51, 17, 51, 17, 35, 17, 4,113,253, 34,202,202, + 2,222,202,201,201, 2,199,253, 57, 5,213,253,156, 2,100,250,213,253,172, 1,170, 0, 0, 0, 0, 1, 0,193,254, 86, 5, 64, + 4, 96, 0, 15, 0, 0, 37, 51, 17, 35, 17, 35, 17, 33, 17, 35, 17, 51, 17, 33, 17, 51, 4,136,184,184,184,253,169,184,184, 2, + 87,184,153,253,189, 1,170, 2, 4,253,252, 4, 96,254, 51, 1,205, 0, 0, 0, 0, 1, 0,201, 0, 0, 8, 18, 5,213, 0, 13, + 0, 0, 1, 17, 35, 17, 33, 17, 35, 17, 51, 17, 33, 17, 33, 21, 5, 59,202,253, 34,202,202, 2,222, 3,161, 5, 43,250,213, 2, +199,253, 57, 5,213,253,156, 2,100,170, 0, 0, 0, 1, 0,193, 0, 0, 6,230, 4, 96, 0, 13, 0, 0, 1, 17, 35, 17, 33, 17, + 35, 17, 51, 17, 33, 17, 33, 21, 4,136,184,253,169,184,184, 2, 87, 3, 22, 3,182,252, 74, 2, 4,253,252, 4, 96,254, 51, 1, +205,170, 0, 0, 0, 1, 0,201,254,102, 8,116, 5,213, 0, 29, 0, 0, 1, 17, 35, 17, 33, 17, 35, 17, 33, 17, 33, 50, 23, 22, + 21, 17, 16, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, 38, 35, 5, 59,202,253, 34,202, 4,114, 1,161,186,113,109,204,228, 76, + 62,134, 56, 55,124,124, 2,199,253, 57, 5, 43,250,213, 5,213,253,156,119,114,238,254,206,254,242,244,170, 75, 75,194, 1, 34, +159,158, 0, 0, 0, 1, 0,193,254, 86, 7, 33, 4, 96, 0, 31, 0, 0, 1, 17, 35, 17, 33, 17, 35, 17, 33, 17, 51, 32, 23, 22, + 21, 17, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, 39, 38, 7, 4,136,184,253,169,184, 3,199,250, 1, 7, 70, 82, 82, + 81,181,193,172,110, 33, 38, 38, 49,134, 1,231,254, 25, 3,198,252, 58, 4, 96,254, 23, 71, 81,229,254,242,214, 96, 96,156, 48, + 55,147, 1, 8,164, 38, 46, 5, 0, 2, 0,115,255, 45, 6, 39, 5,240, 0, 50, 0, 64, 0, 0, 37, 38, 17, 52, 55, 54, 51, 50, + 22, 21, 20, 7, 6, 7, 22, 51, 50, 55, 21, 6, 35, 4, 39, 6, 35, 36, 39, 38, 17, 16, 55, 54, 33, 50, 23, 22, 23, 21, 38, 39, + 38, 35, 32, 7, 6, 17, 16, 23, 22, 51, 50, 55, 54, 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 21, 16, 3, 69,100, 96, 95,169,168, +192,102, 74,120,117,142, 84, 71, 73, 82,254,233,190, 68, 76,254,197,188,189,195,195, 1, 83,117,135,129, 94, 92,125,125,121,255, + 0,136,136,130,129,220, 15,217, 73, 48, 97, 43, 43, 73, 74, 43, 43,136,185, 1, 19,220,125,125,250,220,214,157,115, 63, 93, 24, +166, 22, 1,192, 10, 1,209,210, 1, 98, 1,104,207,208, 36, 34, 62,183, 55, 47, 47,156,157,254,216,254,232,166,164, 46, 36, 63, +127,214,120, 69, 71, 69, 70,121,254,228, 0, 0, 0, 2, 0,113,255, 82, 5, 4, 4,123, 0, 12, 0, 63, 0, 0, 37, 54, 55, 54, + 53, 52, 38, 35, 34, 7, 6, 21, 20, 7, 38, 53, 52, 55, 54, 51, 22, 23, 22, 21, 20, 7, 6, 7, 22, 51, 50, 55, 21, 6, 35, 34, + 39, 6, 35, 32, 39, 38, 17, 16, 55, 54, 33, 50, 23, 22, 23, 21, 38, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 51, 3, 87, 33, 22, + 86, 48, 41, 44, 24, 27,143, 51, 77, 78,131,132, 78, 77,137, 39, 56, 72,101, 90, 62, 70, 82,235,137, 53, 60,254,253,138,137,151, +150, 1, 6, 85, 81, 81, 76, 67, 90, 73, 85,179, 99, 99, 85, 84,171,173, 21, 29,113,135, 72, 84, 42, 46, 78,179,155,133,194,155, + 87, 88, 1, 88, 87,165,181,154, 44, 30, 52, 20,158, 18,151, 6,157,156, 1, 19, 1, 18,157,157, 17, 18, 35,152, 25, 22, 19,113, +114,205,201,116,115, 0, 0, 0,255,255, 0,115,254,117, 5, 39, 5,240, 16, 39, 0,122, 1, 45, 0, 0, 16, 6, 3, 62, 0, 0, +255,255, 0,113,254,117, 3,231, 4,123, 16, 39, 0,122, 0,143, 0, 0, 16, 6, 3, 94, 0, 0, 0, 1,255,250,254, 86, 4,233, + 5,213, 0, 11, 0, 0, 37, 51, 17, 35, 17, 35, 17, 33, 53, 33, 21, 33, 2,215,201,201,203,253,238, 4,239,253,238,170,253,172, + 1,170, 5, 43,170,170, 0, 0, 0, 1, 0, 5,254, 86, 4, 54, 4, 96, 0, 11, 0, 0, 37, 51, 17, 35, 17, 35, 17, 33, 53, 33, + 21, 33, 2,120,184,184,181,254, 66, 4, 49,254, 66,153,253,189, 1,170, 3,182,170,170, 0, 0,255,255,255,252, 0, 0, 4,231, + 5,213, 18, 6, 0, 60, 0, 0, 0, 1, 0, 61,254, 86, 4,127, 4, 96, 0, 8, 0, 0, 37, 17, 35, 17, 1, 51, 9, 1, 51, 2, +197,195,254, 59,195, 1, 94, 1, 94,195, 18,254, 68, 1,188, 4, 78,252,148, 3,108, 0, 0, 0, 0, 1,255,252, 0, 0, 4,231, + 5,213, 0, 14, 0, 0, 9, 1, 51, 9, 1, 51, 1, 33, 21, 33, 17, 35, 17, 33, 53, 2, 12,253,240,217, 1,158, 1,155,217,253, +240, 2, 12,253,244,203,253,244, 2,199, 3, 14,253,154, 2,102,252,242,170,253,227, 2, 29,170, 0, 1, 0, 61,254, 86, 4,127, + 4, 96, 0, 14, 0, 0, 5, 17, 35, 17, 33, 53, 33, 1, 51, 9, 1, 51, 1, 33, 21, 2,197,195,254, 59, 1,197,254, 59,195, 1, + 94, 1, 94,195,254, 70, 1,186,124,254,210, 1, 46,142, 4, 78,252,148, 3,108,251,178,142, 0, 0, 1, 0, 61,254, 86, 5, 59, + 5,213, 0, 15, 0, 0, 37, 51, 17, 35, 17, 35, 9, 1, 35, 9, 1, 51, 9, 1, 51, 1, 4,203,112,197, 20,254, 92,254, 89,218, + 2, 21,254, 47,217, 1,115, 1,117,217,254, 32,170,253,172, 1,170, 2,123,253,133, 3, 29, 2,184,253,213, 2, 43,253, 51, 0, + 0, 1, 0, 59,254, 86, 4,121, 4, 96, 0, 15, 0, 0, 37, 51, 17, 35, 17, 35, 9, 1, 35, 9, 1, 51, 9, 1, 51, 1, 4, 8, +113,184, 33,254,186,254,186,217, 1,179,254,114,217, 1, 41, 1, 41,217,254,107,153,253,189, 1,170, 1,184,254, 72, 2, 74, 2, + 22,254,113, 1,143,253,223, 0, 0, 1,255,250,254, 86, 7, 71, 5,213, 0, 15, 0, 0, 37, 33, 17, 51, 17, 51, 17, 35, 17, 33, + 17, 33, 53, 33, 21, 33, 2,214, 2,222,202,201,201,251,142,253,238, 4,239,253,238,170, 5, 43,250,213,253,172, 1,170, 5, 43, +170,170, 0, 0, 0, 1, 0, 5,254, 86, 6, 66, 4, 96, 0, 15, 0, 0, 37, 33, 17, 51, 17, 51, 17, 35, 17, 33, 17, 33, 53, 33, + 21, 33, 2,120, 2, 90,184,184,184,252, 57,254, 66, 4, 49,254, 66,153, 3,199,252, 57,253,189, 1,170, 3,182,170,170, 0, 0, + 0, 1, 0,175,254, 86, 5,124, 5,213, 0, 20, 0, 0, 37, 51, 17, 35, 17, 35, 17, 33, 34, 39, 38, 53, 17, 51, 17, 20, 22, 51, + 33, 17, 51, 4,179,201,201,203,254, 95,186,113,109,201,124,124, 1,120,203,170,253,172, 1,170, 2,199,119,114,238, 1, 55,254, +217,159,158, 2,100, 0, 0, 0, 0, 1, 0,150,254, 86, 4,184, 4, 96, 0, 21, 0, 0, 37, 51, 17, 35, 17, 35, 17, 33, 34, 39, + 38, 61, 1, 51, 21, 20, 23, 22, 51, 33, 17, 51, 4, 0,184,184,184,254,169,153,102, 92,184, 52, 53,104, 1, 41,184,153,253,189, + 1,170, 2, 9, 95, 86,184,234,211,117, 59, 59, 1,190, 0, 0, 0, 1, 0,175, 0, 0, 4,179, 5,213, 0, 24, 0, 0, 1, 35, + 34, 39, 38, 53, 17, 51, 17, 20, 22, 59, 1, 17, 51, 17, 51, 17, 51, 17, 35, 17, 35, 17, 35, 2,130, 59,186,113,109,201,124,124, + 18,144,214,203,203,214,144, 2,199,119,114,238, 1, 55,254,217,159,158, 1, 57,254,199, 2,100,250, 43, 2,199,254,207, 0, 0, + 0, 1, 0,150, 0, 0, 4, 0, 4, 96, 0, 24, 0, 0, 1, 53, 51, 21, 51, 17, 51, 17, 35, 17, 35, 21, 35, 53, 35, 34, 39, 38, + 61, 1, 51, 21, 20, 23, 22, 1,249,160,175,184,184,175,160, 8,153,102, 92,184, 52, 43, 2,164,194,196, 1,190,251,160, 2, 9, +196,196, 95, 86,184,234,211,117, 59, 48, 0, 0, 0, 1, 0,175, 0, 0, 4,179, 5,213, 0, 16, 0, 0, 1, 17, 33, 50, 23, 22, + 21, 17, 35, 17, 52, 38, 35, 33, 17, 35, 17, 1,122, 1,161,186,113,109,201,124,124,254,136,203, 5,213,253,156,119,114,238,254, +102, 1,138,159,158,253, 57, 5,213, 0, 0, 0,255,255, 0,186, 0, 0, 4,100, 6, 20, 16, 6, 0, 75, 0, 0, 0, 2, 0, 20, +255,227, 7, 20, 5,240, 0, 33, 0, 41, 0, 0, 1, 18, 55, 54, 33, 32, 23, 22, 19, 33, 16, 0, 33, 50, 54, 55, 21, 6, 4, 35, + 32, 39, 38, 3, 6, 39, 38, 61, 1, 51, 21, 20, 23, 22, 37, 33, 38, 39, 38, 32, 7, 6, 1,178, 34,150,188, 1, 58, 1, 67,181, +187, 1,251,112, 1, 18, 1, 18,139,252,112,111,254,249,146,254,162,197,188, 10,170,118,122,170, 75, 66, 1, 64, 3,173, 24, 98, +130,254, 72,128, 97, 3,109, 1, 7,170,210,210,219,254,132,254,244,254,206, 96, 95,215, 70, 72,205,194, 1, 85, 1,103,107,223, + 76, 62,157, 68, 57, 2,191,124,164,164,124, 0, 0, 2, 0, 15,255,226, 5,102, 4,123, 0, 34, 0, 41, 0, 0, 1, 34, 39, 38, + 61, 1, 51, 21, 20, 23, 22, 51, 54, 55, 54, 33, 50, 0, 29, 1, 33, 30, 1, 51, 50, 54, 55, 21, 6, 7, 6, 39, 36, 39, 38, 1, + 46, 1, 35, 34, 6, 7, 1, 88,144, 89, 96,156, 48, 57, 74, 26,116,146, 0,255,226, 1, 7,252,178, 12,205,183,106,199, 98, 99, +104,110,101,254,243,156,148, 3, 78, 2,165,136,154,185, 14, 2, 4, 82, 90,172, 70, 49,151, 33, 38,197,130,161,254,221,250, 90, +190,199, 52, 52,174, 42, 22, 23, 1, 5,151,144, 1,133,151,180,174,158, 0, 0,255,255, 0, 20,254,117, 7, 20, 5,240, 16, 39, + 2, 52, 2,188, 0, 0, 16, 6, 3,216, 0, 0,255,255, 0, 15,254,117, 5,102, 4,123, 16, 39, 2, 52, 1,231, 0, 0, 16, 6, + 3,217, 0, 0,255,255, 0,193, 0, 0, 1,121, 6, 20, 16, 6, 0, 79, 0, 0,255,255, 0, 59, 0, 0, 6,173, 5,213, 16, 39, + 6,139, 5,116, 1,117, 17, 6, 3, 51, 0, 0, 0, 8,180, 34, 0, 8, 35, 7, 43, 49, 0, 0,255,255, 0, 50, 0, 0, 5,173, + 6, 72, 16, 39, 2, 49, 0,240, 0, 0, 19, 6, 3, 83, 0, 0, 0, 8,180, 34, 0, 8, 35, 7, 43, 49, 0, 0, 0, 1, 0,201, +254,102, 5, 53, 5,213, 0, 28, 0, 0, 1, 51, 50, 23, 22, 21, 17, 16, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, 38, 35, 33, + 17, 35, 17, 51, 17, 1, 33, 2,169,139,186,113,109,204,228, 76, 62,134, 56, 55,124,124,254,136,202,202, 2,158, 1, 4, 3,113, +119,114,238,254,206,254,242,244,170, 75, 75,194, 1, 34,159,158,253, 57, 5,213,253,137, 2,119, 0, 1, 0,191,254, 86, 4,136, + 4, 96, 0, 30, 0, 0, 1, 51, 32, 23, 22, 21, 17, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, 53, 17, 52, 39, 38, 35, 33, 17, 35, + 17, 51, 17, 1, 51, 2, 94, 20, 1, 5, 72, 82, 82, 81,181,193,172,110, 33, 38, 38, 44,139,254,252,185,185, 2, 37,235, 2,119, + 71, 81,229,254,242,214, 96, 96,156, 48, 55,147, 1, 8,166, 36, 41,254, 25, 4, 96,254, 29, 1,227, 0, 0, 0, 0, 1, 0, 54, +254, 86, 6, 3, 5,213, 0, 20, 0, 0, 33, 35, 17, 33, 21, 16, 3, 6, 5, 53, 54, 55, 18, 25, 1, 33, 17, 51, 21, 1, 35, 5, + 58,202,254, 27,132, 98,254,145,212, 67,117, 3,120,201,254,146,134, 5, 43,212,254, 24,254,170,253, 56,167, 46,168, 1, 37, 2, + 53, 1, 26,250,213,170,254, 86, 0, 2, 0, 46,254, 86, 5, 43, 4, 96, 0, 0, 0, 21, 0, 0, 9, 1, 51, 21, 1, 35, 19, 35, + 17, 33, 21, 16, 3, 6, 5, 53, 54, 55, 54, 17, 53, 33,253,180, 6,191,184,254,222,123,229,184,254,123,118, 94,254,204,179, 59, + 98, 2,245, 8, 0,248,153,153,254, 86, 1,170, 3,199,134,254,146,254,252,207, 29,153, 27,127,207, 1,167,212, 0, 1, 0,201, +254,102, 5, 59, 5,213, 0, 21, 0, 0, 37, 17, 33, 17, 35, 17, 51, 17, 33, 17, 51, 17, 16, 7, 6, 43, 1, 53, 51, 50, 55, 54, + 4,113,253, 34,202,202, 2,222,202,103,103,227, 76, 62,134, 56, 55,104, 2, 95,253, 57, 5,213,253,156, 2,100,250,147,254,242, +122,122,170, 75, 75, 0, 0, 0, 0, 1, 0,193,254, 86, 4,136, 4, 96, 0, 21, 0, 0, 5, 17, 33, 17, 35, 17, 51, 17, 33, 17, + 51, 17, 20, 7, 6, 43, 1, 53, 51, 50, 55, 54, 3,208,253,169,184,184, 2, 87,184, 82, 81,181,193,172,110, 33, 38, 20, 2, 24, +253,252, 4, 96,254, 51, 1,205,251,140,214, 96, 96,156, 48, 55, 0, 1, 0,201,254, 86, 6, 4, 5,213, 0, 16, 0, 0, 33, 35, + 17, 33, 17, 35, 17, 51, 17, 33, 17, 51, 17, 51, 21, 1, 35, 5, 59,202,253, 34,202,202, 2,222,202,201,254,146,134, 2,199,253, + 57, 5,213,253,156, 2,100,250,213,170,254, 86, 0, 1, 0,193,254, 86, 5, 64, 4, 96, 0, 16, 0, 0, 33, 35, 17, 33, 17, 35, + 17, 51, 17, 33, 17, 51, 17, 51, 21, 1, 35, 4,136,184,253,169,184,184, 2, 87,184,184,254,222,123, 2, 4,253,252, 4, 96,254, + 51, 1,205,252, 57,153,254, 86, 0, 1, 0,175,254, 86, 4,179, 5,213, 0, 20, 0, 0, 37, 17, 33, 34, 39, 38, 53, 17, 51, 17, + 20, 22, 51, 33, 17, 51, 17, 35, 17, 35, 17, 3,232,254, 95,186,113,109,201,124,124, 1,120,203,203,201,170, 2, 29,119,114,238, + 1, 55,254,217,159,158, 2,100,250, 43,254, 86, 2, 84, 0, 0, 0, 1, 0,150,254, 86, 4, 0, 4, 96, 0, 21, 0, 0, 37, 17, + 33, 34, 39, 38, 61, 1, 51, 21, 20, 23, 22, 51, 33, 17, 51, 17, 35, 17, 35, 17, 3, 72,254,169,153,102, 92,184, 52, 53,104, 1, + 41,184,184,184,153, 1,112, 95, 86,184,234,211,117, 59, 59, 1,190,251,160,254, 86, 2, 67, 0, 0, 1, 0,201,254, 86, 6,232, + 5,213, 0, 17, 0, 0, 37, 51, 21, 1, 35, 1, 35, 17, 1, 35, 1, 17, 35, 17, 33, 9, 1, 33, 6, 31,201,254,146,134, 1, 43, +197,254,127,203,254,127,196, 1, 45, 1,125, 1,127, 1, 45,170,170,254, 86, 1,170, 5, 31,252, 0, 4, 0,250,225, 5,213,252, + 8, 3,248, 0, 0, 1, 0,193,254, 86, 6, 0, 4, 96, 0, 17, 0, 0, 37, 51, 21, 1, 35, 19, 35, 17, 1, 35, 1, 17, 35, 17, + 33, 9, 1, 33, 5, 72,184,254,222,123,229,178,254,203,184,254,202,178, 1, 6, 1, 62, 1, 63, 1, 4,153,153,254, 86, 1,170, + 3,176,253, 39, 2,217,252, 80, 4, 96,253, 18, 2,238, 0, 0,255,255, 0, 16, 0, 0, 5,104, 7,146, 16, 39, 2, 49, 0,206, + 1, 74, 17, 6, 3, 45, 0, 0, 0, 18,180, 24, 0, 8, 19, 7, 43, 49, 0, 64, 5,111, 0,111, 8, 2, 93, 48,255,255, 0,123, +255,227, 4, 45, 6, 31, 16, 38, 2, 49, 79,215, 19, 6, 3, 77, 0, 0, 0, 8,180, 34, 0, 8, 25, 7, 43, 49,255,255, 0, 16, + 0, 0, 5,104, 5,213, 16, 38, 3, 45, 0, 0, 17, 7, 6,132, 4,188, 1,117, 0, 20,180, 10, 18, 13, 5, 7, 43, 64, 9, 48, + 18, 63, 13, 0, 18, 15, 13, 4, 93, 49, 0, 0,255,255, 0,123,255,227, 4, 45, 6, 16, 18, 38, 3, 77, 0, 0, 17, 6, 0,106, + 82, 0, 0, 32,180, 20, 45, 40, 11, 7, 43, 64, 21,127, 40,111, 40, 80, 45, 95, 40, 64, 45, 79, 40, 48, 45, 63, 40, 0, 45, 15, + 40, 10, 93, 49,255,255, 0, 8, 0, 0, 7, 72, 5,213, 18, 6, 0,136, 0, 0,255,255, 0,123,255,227, 7,111, 4,123, 18, 6, + 0,168, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 16, 39, 6,139, 4,161, 1,117, 17, 6, 3, 50, 0, 0, 0, 7, 64, 3, + 64, 0, 1, 93, 49, 0, 0, 0,255,255, 0,113,255,227, 4,127, 6, 72, 16, 39, 2, 49, 0,150, 0, 0, 19, 6, 3, 82, 0, 0, + 0, 7, 64, 3,112, 0, 1, 93, 49, 0, 0, 0,255,255, 0,117,255,227, 5,217, 5,240, 16, 6, 1, 81, 0, 0,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 6, 2, 4, 0, 0,255,255, 0,117,255,227, 5,217, 5,240, 16, 39, 6,132, 5, 32, 1,117, 16, 6, + 3,243, 0, 0,255,255, 1, 43, 5, 70, 3,125, 6, 16, 16, 38, 0,106, 84, 0, 16, 6, 3,244, 0, 0, 0, 0,255,255, 0, 59, + 0, 0, 6,173, 5,213, 16, 39, 6,132, 5,116, 1,117, 17, 6, 3, 51, 0, 0, 0, 8,180, 28, 7, 2, 29, 7, 43, 49, 0, 0, +255,255, 0, 50, 0, 0, 5,173, 6, 16, 16, 39, 0,106, 0,240, 0, 0, 18, 6, 3, 83, 0, 0,255,255, 0,156,255,227, 4,115, + 5,240, 16, 39, 6,132, 4,135, 1,117, 16, 6, 3, 52, 0, 0,255,255, 0,133,255,227, 3,200, 6, 16, 16, 38, 0,106, 58, 0, + 16, 6, 3, 84, 0, 0, 0, 0,255,255, 0,160,255,193, 4,248, 5,213, 16, 6, 1,121, 0, 0,255,255, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 6, 2, 8, 0, 0,255,255, 0,201, 0, 0, 5, 51, 7, 49, 16, 39, 0,113, 0,245, 1, 59, 16, 6, 3, 53, 0, 0, +255,255, 0,193, 0, 0, 4,128, 5,245, 16, 39, 0,113, 0,137,255,255, 16, 6, 3, 85, 0, 0,255,255, 0,201, 0, 0, 5, 51, + 5,213, 16, 39, 6,132, 4,245, 1,117, 16, 6, 3, 53, 0, 0,255,255, 0,193, 0, 0, 4,128, 6, 16, 16, 39, 0,106, 0,137, + 0, 0, 16, 6, 3, 85, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 16, 38, 3, 59, 0, 0, 17, 7, 6,132, 5, 39, 1,117, + 0, 20,180, 3, 31, 26, 9, 7, 43, 64, 9, 64, 31, 79, 26, 16, 31, 31, 26, 4, 93, 49, 0, 0,255,255, 0,113,255,227, 4,117, + 6, 16, 18, 38, 3, 91, 0, 0, 17, 6, 0,106,115, 0, 0, 20,180, 3, 31, 26, 9, 7, 43, 64, 9, 64, 31, 79, 26, 48, 31, 63, + 26, 4, 93, 49,255,255, 0,115,255,227, 5,217, 5,240, 16, 6, 3, 17, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 16, 6, + 2, 7, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 38, 4, 3, 0, 0, 16, 7, 6,132, 5, 39, 1,117,255,255, 1, 74, + 5, 70, 3,156, 6, 16, 18, 38, 4, 4, 0, 0, 16, 6, 0,106,115, 0, 0, 0,255,255, 0,111,255,227, 5, 35, 5,240, 16, 39, + 6,132, 4,103, 1,117, 16, 6, 3, 74, 0, 0,255,255, 0,113,255,227, 3,231, 6, 16, 16, 38, 0,106,226, 0, 16, 6, 3,106, + 0, 0, 0, 0,255,255, 0, 35,255,227, 4,189, 7, 49, 16, 39, 0,113, 0,114, 1, 59, 16, 6, 3, 64, 0, 0,255,255, 0, 61, +254, 86, 4,127, 5,245, 16, 38, 0,113, 94,255, 16, 6, 3, 96, 0, 0, 0, 0,255,255, 0, 35,255,227, 4,189, 5,213, 16, 39, + 6,132, 4,114, 1,117, 16, 6, 3, 64, 0, 0,255,255, 0, 61,254, 86, 4,127, 6, 16, 16, 38, 0,106, 94, 0, 16, 6, 3, 96, + 0, 0, 0, 0,255,255, 0, 35,255,227, 4,189, 5,213, 16, 39, 6,141, 4,114, 1,117, 16, 6, 3, 64, 0, 0,255,255, 0, 61, +254, 86, 4,127, 6,102, 16, 38, 2, 54, 94, 0, 16, 6, 3, 96, 0, 0, 0, 0,255,255, 0,175, 0, 0, 4,179, 5,213, 16, 39, + 6,132, 4,204, 1,117, 16, 6, 3, 68, 0, 0,255,255, 0,150, 0, 0, 4, 0, 6, 16, 16, 38, 0,106, 94, 0, 16, 6, 3,100, + 0, 0, 0, 0, 0, 1, 0,201,254, 86, 4,106, 5,213, 0, 9, 0, 0, 37, 51, 17, 35, 17, 35, 17, 33, 21, 33, 1,147,201,201, +202, 3,161,253, 41,170,253,172, 1,170, 5,213,170, 0, 0, 0, 0, 1, 0,186,254, 86, 3,208, 4, 96, 0, 9, 0, 0, 37, 51, + 17, 35, 17, 35, 17, 33, 21, 33, 1,114,184,184,184, 3, 22,253,162,153,253,189, 1,170, 4, 96,170, 0, 0, 0,255,255, 0,201, + 0, 0, 6, 70, 5,213, 18, 38, 3, 72, 0, 0, 16, 7, 6,132, 5,183, 1,117,255,255, 0,193, 0, 0, 5,105, 6, 16, 16, 38, + 3,104, 0, 0, 16, 7, 0,106, 1, 8, 0, 0, 0, 2, 0,145, 0, 0, 4,180, 5,213, 0, 10, 0, 21, 0, 0, 1, 20, 23, 22, + 51, 33, 17, 33, 34, 7, 6, 1, 17, 33, 34, 36, 53, 52, 36, 51, 33, 17, 1,102, 79, 78,163, 1, 68,254,188,163, 78, 79, 3, 78, +253,232,251,254,240, 1, 16,251, 1, 78, 1,183,138, 67, 68, 2, 35, 67, 68, 3,147,250, 43,218,221,222,218, 2,102, 0, 0, 0, + 0, 2, 0,113, 0, 0, 3,245, 4, 96, 0, 10, 0, 22, 0, 0, 1, 20, 23, 22, 51, 33, 17, 33, 34, 7, 6, 1, 17, 33, 34, 39, + 38, 16, 55, 54, 51, 33, 17, 1, 53, 62, 66,129, 1, 7,254,249,128, 67, 62, 2,192,254, 57,214,115,116,116,121,208, 1, 15, 1, + 76, 90, 43, 46, 1,105, 46, 42, 2,182,251,160, 82, 82, 1, 80, 82, 85, 1,197, 0, 2, 0,145,255,227, 7, 67, 5,213, 0, 12, + 0, 48, 0, 0, 1, 33, 34, 7, 6, 16, 23, 22, 51, 50, 55, 54, 53, 19, 6, 7, 6, 7, 6, 35, 34, 39, 38, 53, 52, 36, 51, 33, + 17, 51, 3, 20, 23, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 3,234,254,188,163, 78, 79, 79, 95,129,180, + 75, 86, 33, 12, 14, 51,106, 94,110,238,129,136, 1, 16,251, 1, 78,202, 1, 63, 52,112,105, 59, 63,202,110,104,215,217,102, 49, + 2,201, 67, 68,254,234, 80, 95,109,125,159,254,221, 29, 28, 96, 54, 49,129,137,202,222,218, 2,102,251,236,143, 91, 74, 74, 79, +155, 2,159,253, 90,224,127,120,120, 57, 0, 0, 0, 2, 0,113,255,227, 6,115, 4, 96, 0, 12, 0, 46, 0, 0, 1, 33, 34, 7, + 6, 21, 20, 22, 51, 50, 55, 54, 53, 19, 6, 7, 6, 35, 34, 38, 53, 52, 55, 54, 51, 33, 17, 51, 17, 20, 23, 22, 51, 50, 55, 54, + 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 3, 61,254,249,128, 67, 62,129,106,148, 92, 45, 49, 67, 93, 94,136,172,203,116,121, +208, 1, 15,184, 62, 60,106,104, 60, 62,184,100,104,206,211,100, 31, 2, 2, 46, 42, 94, 92,115,109, 52,156,254,246,108, 48, 49, +193,166,170, 82, 85, 1,197,253, 97,159, 80, 79, 79, 82,157, 1, 65,254,184,236,115,120,120, 37, 0, 1, 0,201,255,227, 7, 3, + 5,240, 0, 55, 0, 0, 1, 52, 39, 38, 43, 1, 53, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 6, 7, 53, 54, 55, 54, 51, 50, 23, + 22, 21, 20, 7, 6, 7, 22, 23, 22, 21, 20, 23, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 39, 38, 3,170, + 92, 93,165,174,182,149, 79, 79, 81, 82,152, 83,190,114,115,100,101, 89,230,134,134, 71, 71,131,145, 82, 81, 63, 52,112,105, 59, + 63,202,110,104,215,217,102, 48, 28, 33, 1,178,132, 74, 75,166, 59, 60,112,115, 61, 62, 36, 38,180, 32, 16, 16,104,105,178,124, + 85, 86, 33, 31, 98, 98,144,128, 91, 74, 74, 79,155, 2,159,253, 90,224,127,120,120, 56, 80, 97, 0, 1, 0,171,255,227, 6, 70, + 4,124, 0, 53, 0, 0, 1, 52, 39, 38, 43, 1, 53, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 7, 53, 62, 1, 51, 50, 23, + 22, 21, 20, 7, 6, 7, 22, 23, 22, 21, 20, 23, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 3, 19, 78, 72, +137,148,155,116, 67, 68, 70, 69,119, 71, 81, 80, 97, 98,170, 76,196,113,114, 60, 60,112,129, 64, 69, 62, 61,105,104, 60, 62,184, +100,104,206,199,112, 98, 1, 56,102, 56, 51,152, 44, 45, 70, 64, 46, 46, 13, 13, 29,167, 24, 24, 78, 79,141, 93, 64, 65, 24, 25, + 72, 79, 72, 88, 68, 69, 79, 82,157, 1, 65,254,184,236,115,120,117,101, 0, 0, 0, 1, 0,201,254, 86, 5, 60, 5,240, 0, 41, + 0, 0, 33, 35, 17, 52, 39, 38, 43, 1, 53, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 6, 7, 53, 54, 55, 54, 51, 50, 23, 22, 21, + 20, 7, 6, 7, 22, 23, 22, 21, 17, 51, 17, 35, 4,115,201, 92, 93,165,174,182,149, 79, 79, 81, 82,152, 83,190,114,115,100,101, + 89,230,134,134, 71, 71,131,145, 82, 81,201,201, 1,177,133, 74, 75,166, 59, 60,112,115, 61, 62, 36, 38,180, 32, 16, 16,104,105, +178,124, 85, 86, 33, 31, 98, 97,146,254,249,253,172, 0, 0, 0, 0, 1, 0,171,254, 86, 4,131, 4,124, 0, 41, 0, 0, 37, 51, + 17, 35, 17, 35, 17, 52, 39, 38, 43, 1, 53, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 7, 6, 7, 53, 62, 1, 51, 50, 23, 22, 21, + 20, 7, 6, 7, 22, 23, 22, 21, 3,200,187,184,184, 78, 72,137,148,155,116, 67, 68, 70, 69,119, 71, 81, 80, 97, 98,170, 76,196, +113,114, 60, 60,112,126, 67, 69,153,253,189, 1,170, 1, 70, 88, 56, 51,152, 44, 45, 70, 64, 46, 46, 13, 13, 29,167, 24, 24, 78, + 79,141, 93, 64, 65, 24, 24, 73, 75,106, 0, 0, 0, 1, 0, 54,255,227, 7,202, 5,213, 0, 33, 0, 0, 1, 17, 20, 23, 22, 51, + 50, 55, 54, 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 53, 17, 33, 21, 16, 3, 6, 5, 53, 54, 55, 18, 25, 1, 5, 58, 63, 52, +112,105, 59, 63,202,110,104,215,214,105,110,254, 27,132, 98,254,145,212, 67,117, 5,213,251,236,143, 91, 74, 74, 79,155, 2,159, +253, 90,224,127,120,120,125,226, 3,113,212,254, 24,254,170,253, 56,167, 46,168, 1, 37, 2, 53, 1, 26, 0, 0, 0, 1, 0, 46, +255,227, 6,238, 4, 96, 0, 32, 0, 0, 1, 17, 20, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 53, 17, 33, + 21, 16, 3, 6, 5, 53, 54, 55, 54, 17, 53, 4,115,122,103,104, 60, 62,184,100,104,206,199,112, 98,254,123,118, 94,254,204,179, + 59, 98, 4, 96,253, 4, 87,138, 79, 82,157, 1, 65,254,184,236,115,120,117,101,123, 2,143,134,254,146,254,252,207, 29,153, 27, +127,207, 1,167,212, 0, 0, 0,255,255, 0,201,255,227, 8, 45, 5,213, 16, 2, 1,184, 0, 0, 0, 1, 0,193,255,227, 7, 3, + 4, 96, 0, 28, 0, 0, 1, 17, 20, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 61, 1, 33, 17, 35, 17, 51, + 17, 33, 17, 4,136,122,103,104, 60, 62,184,100,104,206,199,112, 98,253,169,184,184, 2, 87, 4, 96,253, 4, 87,138, 79, 82,157, + 1, 65,254,184,236,115,120,117,101,123,204,253,252, 4, 96,254, 51, 1,205, 0,255,255, 0,115,255,227, 5,139, 5,240, 16, 2, + 0, 42, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 16, 2, 2, 5, 0, 0, 0, 1,255,250,255,227, 5,102, 5,213, 0, 25, + 0, 0, 1, 17, 20, 23, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 53, 17, 33, 53, 33, 21, 2,215, 63, 52, +111,105, 59, 63,202,110,104,215,214,105,110,253,238, 4,239, 5, 43,252,150,143, 91, 74, 74, 79,155, 2,159,253, 90,224,127,120, +120,125,226, 3,113,170,170, 0, 0, 1, 0, 5,255,227, 4,246, 4, 96, 0, 25, 0, 0, 1, 17, 20, 23, 22, 51, 50, 55, 54, 53, + 17, 51, 17, 20, 7, 6, 35, 34, 39, 38, 53, 17, 33, 53, 33, 21, 2,120, 62, 61,105,104, 60, 62,184,100,104,206,199,112, 98,254, + 66, 4, 49, 3,182,253,174, 86, 70, 69, 79, 82,157, 1, 65,254,184,236,115,120,117,101,123, 2,126,170,170, 0, 0, 1, 0,178, +255,227, 6,160, 5,213, 0, 33, 0, 0, 37, 6, 7, 6, 33, 32, 0, 25, 1, 51, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, 20, 7, + 51, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 4,239, 42, 45,144,254,230,254,229,254,223,203,174,195,194,174,203, 9, 44,148, + 96, 96,156, 48, 55, 81,248, 82, 46,149, 1, 42, 1, 36, 3,164,252,117,240,211,211,240, 3,139,252, 92, 71, 67, 91, 91,171, 70, + 49,108, 42, 49, 0, 1, 0,178, 0, 0, 5, 41, 5,242, 0, 32, 0, 0, 33, 35, 17, 16, 0, 33, 32, 23, 22, 17, 21, 35, 53, 52, + 38, 35, 34, 6, 29, 1, 33, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 33, 1,125,203, 1, 33, 1, 27, 1, 23,147,145,203,174, +194,195,174, 2, 88,149, 95, 96,156, 48, 55, 81,253,168, 3,164, 1, 36, 1, 42,149,146,254,217, 57, 32,240,211,211,240,157, 91, + 91,171, 70, 49,108, 42, 49, 0, 0, 2, 0,178, 0, 0, 6,196, 5,242, 0, 28, 0, 40, 0, 0, 1, 51, 50, 23, 22, 29, 1, 35, + 53, 52, 39, 38, 43, 1, 17, 35, 17, 33, 34, 39, 38, 53, 52, 55, 54, 33, 32, 0, 17, 3, 17, 52, 38, 35, 34, 6, 21, 20, 23, 22, + 51, 5, 41, 71,149, 95, 96,156, 48, 55, 81, 71,203,254, 42,201,159,110,144,152, 1, 19, 1, 27, 1, 33,203,174,195,194,174, 53, + 90,166, 2,114, 91, 91,171, 70, 49,108, 42, 49,254, 61, 1,195,179,124,224,253,142,149,254,214,254,220,254,206, 1, 25,240,211, +211,175,149, 73,124, 0, 0, 0, 0, 1, 0,178, 0, 0, 6,196, 5,242, 0, 32, 0, 0, 1, 51, 50, 23, 22, 29, 1, 35, 53, 52, + 39, 38, 43, 1, 17, 35, 17, 52, 38, 35, 34, 7, 6, 29, 1, 35, 53, 16, 0, 33, 32, 23, 22, 5, 23, 89,149, 95, 96,156, 48, 55, + 81, 71,203,174,194,195, 87, 87,203, 1, 33, 1, 27, 1, 26,144, 90, 4, 96, 91, 91,171, 70, 49,108, 42, 49,252, 79, 3,139,240, +211,106,106,239, 32, 57, 1, 36, 1, 42,149, 92, 0, 1, 0,178,255,227, 5, 41, 5,213, 0, 32, 0, 0, 19, 16, 0, 33, 32, 55, + 54, 61, 1, 35, 21, 20, 6, 35, 34, 38, 53, 17, 33, 50, 23, 22, 29, 1, 51, 53, 52, 39, 38, 35, 33, 17, 35,178, 1, 33, 1, 27, + 1, 23,147,145,203,174,194,195,174, 2, 88, 81, 55, 48,156, 96, 95,149,253,168,203, 2, 49,254,220,254,214,149,146,227, 57, 32, +172,211,211,240, 1,103, 49, 42,108, 49, 70,171, 91, 91, 1,117, 0, 2, 0,155,255, 8, 4,186, 5,240, 0, 33, 0, 43, 0, 0, + 37, 33, 54, 55, 6, 7, 6, 35, 34, 0, 53, 52, 0, 51, 32, 23, 22, 3, 2, 3, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 33, + 17, 51, 18, 32, 54, 53, 52, 38, 32, 6, 21, 20, 1,102, 1, 15,232, 60, 48, 28, 73,124,224,254,251, 1, 16,226, 1, 8,131,155, + 58, 52,231,149, 95, 96,156, 48, 55, 81,253, 53,203,167, 1, 16,159,159,254,240,159,175,225,208, 39, 17, 46, 1, 15,235,230, 1, + 22,198,234,254,169,254,207,254,247, 91, 91,171, 70, 49,108, 42, 49, 1, 76, 1, 76,186,162,161,187,187,161,162, 0, 1, 0,178, +255, 8, 5, 41, 5,213, 0, 29, 0, 0, 37, 33, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 33, 17, 51, 17, 33, 50, 23, 22, 29, + 1, 35, 53, 52, 39, 38, 35, 33, 1,125, 1,133,149, 95, 96,156, 48, 55, 81,253,176,203, 2, 88,149, 95, 96,156, 48, 55, 81,253, +168,175, 91, 91,171, 70, 49,108, 42, 49, 5,213,254,139, 91, 91,171, 70, 49,108, 42, 49, 0, 0, 0, 1, 0,178,255, 8, 5, 41, + 5,242, 0, 31, 0, 0, 51, 17, 16, 0, 33, 32, 23, 22, 17, 21, 35, 53, 52, 38, 35, 34, 7, 6, 21, 17, 33, 50, 23, 22, 29, 1, + 35, 53, 52, 39, 38, 35,178, 1, 33, 1, 27, 1, 19,151,145,203,174,194,197, 85, 87, 2, 88,149, 95, 96,156, 48, 55, 81, 3,164, + 1, 36, 1, 42,149,142,254,213, 57, 32,240,211,106,108,237,253, 36, 91, 91,171, 70, 49,108, 42, 49, 0, 0, 0, 0, 2, 0,178, + 0, 0, 6,142, 5,242, 0, 43, 0, 56, 0, 0, 1, 35, 21, 20, 7, 6, 7, 6, 39, 38, 39, 38, 55, 54, 51, 33, 38, 39, 38, 35, + 34, 6, 21, 17, 35, 17, 16, 0, 33, 32, 23, 22, 23, 51, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 33, 35, 34, 21, 20, 23, 22, 51, + 50, 55, 54, 53, 52, 5, 58, 17,103,105,152,146,109,130, 2, 1, 73, 78, 75, 1, 40, 22, 42, 87,194,195,174,203, 1, 33, 1, 27, + 1, 19,151, 92, 33, 37,149, 95, 96,156, 48, 53,254,208,187,153, 57, 58, 69, 53, 58, 46, 3,177, 32,223,114,115, 10, 10, 84,102, +189,147, 76, 81, 82, 50,106,211,240,252,117, 3,164, 1, 36, 1, 42,149, 91,162, 91, 91,171, 70, 49,106, 44, 49,135,105, 45, 45, + 81, 64,147, 17, 0, 2, 0,178, 0, 0, 6,196, 5,242, 0, 28, 0, 40, 0, 0, 1, 35, 17, 16, 0, 33, 32, 39, 38, 17, 52, 55, + 54, 51, 33, 17, 51, 17, 51, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 41, 1, 34, 7, 6, 21, 20, 22, 51, 50, 54, 53, 5,112, 71, +254,223,254,229,254,237,152,144,110,159,201, 1,214,203, 71,149, 95, 96,156, 48, 55,254,157,254, 84,166, 90, 53,174,194,195,174, + 3,177,254,157,254,220,254,214,149,142, 1, 46,224,124,179, 1,146,254,110, 91, 91,171, 70, 49,108, 42, 49,125, 72,149,224,211, +211,240, 0, 0, 0, 1, 0,178, 0, 0, 5, 41, 5,213, 0, 20, 0, 0, 19, 51, 17, 54, 51, 32, 23, 22, 17, 21, 35, 53, 52, 38, + 35, 34, 7, 6, 21, 17, 35,178,203,160,209, 1, 19,151,145,203,174,194,193, 89, 87,203, 5,213,254, 59,100,149,142,254,213, 75, + 50,240,211,106,103,242,253,243, 0, 1, 0,178,255, 8, 4, 86, 5,213, 0, 15, 0, 0, 1, 17, 33, 50, 23, 22, 29, 1, 35, 53, + 52, 39, 38, 35, 33, 17, 1,125, 1,133,149, 95, 96,156, 48, 55, 81,253,176, 5,213,250,218, 91, 91,171, 70, 49,108, 42, 49, 5, +213, 0, 0, 0, 0, 1, 0,178,255,227, 5,231, 5,213, 0, 27, 0, 0, 1, 17, 16, 23, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, + 7, 6, 35, 34, 39, 38, 25, 1, 33, 17, 35, 17, 51, 17, 3,124, 37, 51,120,129, 42, 37,203,113, 88,210,198,100,113,254,204,203, +203, 4, 96,253,215,254,229, 62, 87, 87, 75,135, 2,176,253, 55,213,125, 98, 98,112, 1,105, 1,147,252, 79, 5,213,254,139, 0, + 0, 2, 0, 65,255,227, 7,153, 6,205, 0, 34, 0, 47, 0, 0, 1, 22, 17, 16, 0, 33, 32, 0, 17, 16, 55, 35, 6, 39, 38, 61, + 1, 51, 21, 20, 23, 22, 51, 33, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 37, 34, 7, 6, 17, 16, 0, 32, 0, 17, 16, 39, 38, + 5,214,201,254,136,254,198,254,197,254,135,195,103,148, 96, 96,156, 48, 55, 81, 4,176,149, 95, 96,156, 48, 55, 81,253,168,225, +124,130, 1, 3, 1,184, 1, 1,128,121, 5, 38,225,254,164,254,159,254, 91, 1,164, 1, 98, 1, 99,218, 1, 92, 91,171, 70, 49, +108, 42, 49, 91, 91,171, 70, 49,108, 42, 49, 32,158,164,254,229,254,230,254,184, 1, 72, 1, 26, 1, 22,169,158, 0, 1, 0,178, + 0, 0, 5, 41, 5,213, 0, 20, 0, 0, 33, 35, 17, 6, 35, 32, 39, 38, 25, 1, 51, 17, 20, 22, 51, 50, 55, 54, 61, 1, 51, 5, + 41,203,160,209,254,237,152,144,203,174,194,193, 89, 87,203, 1,197,100,149,142, 1, 43, 2, 38,253,243,240,211,105,104,242,152, + 0, 1, 0,178,255, 8, 5, 41, 5,213, 0, 18, 0, 0, 9, 2, 33, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 33, 53, 9, 1, + 3,117, 1,119,252,201, 2, 32,149, 95, 96,156, 48, 55, 81,252,221, 3, 49,254,107, 5,213,254,174,252, 44, 91, 91,171, 70, 49, +108, 42, 49,175, 3,192, 1,102, 0, 3, 0,143,255,210, 4,201, 5,240, 0, 38, 0, 44, 0, 54, 0, 0, 37, 6, 35, 34, 39, 38, + 55, 54, 51, 50, 23, 54, 55, 6, 7, 6, 35, 34, 0, 53, 52, 0, 51, 32, 23, 22, 3, 2, 7, 6, 7, 22, 55, 54, 55, 21, 6, 7, + 6, 37, 38, 7, 6, 23, 22, 18, 32, 54, 53, 52, 38, 32, 6, 21, 20, 2,174,110, 86,172, 73,103, 2, 5,201,178,148,131,114, 48, + 28, 73,124,224,254,251, 1, 16,226, 1, 8,131,155, 58, 55,190, 32, 36, 84, 46,129,126,103,152,154,254,206, 93, 42, 86, 31, 24, +181, 1, 16,159,159,254,240,159, 28, 64, 35, 50,110,245,154,119,239, 39, 17, 46, 1, 15,235,230, 1, 22,198,234,254,169,254,191, +204, 34, 37, 22, 3, 7,100,192, 89, 1, 3,198, 81, 4, 8, 60, 45, 2, 38,186,162,161,187,187,161,162, 0, 0, 0, 1, 0,178, +255, 8, 6,196, 5,242, 0, 30, 0, 0, 33, 17, 52, 38, 35, 34, 7, 6, 29, 1, 35, 53, 16, 0, 33, 32, 0, 25, 1, 51, 50, 23, + 22, 29, 1, 35, 53, 52, 39, 38, 35, 4, 94,174,194,197, 85, 87,203, 1, 33, 1, 27, 1, 26, 1, 33, 71,149, 95, 96,156, 48, 55, + 81, 3,139,240,211,106,106,239, 32, 57, 1, 36, 1, 42,254,214,254,220,253, 11, 91, 91,171, 70, 49,108, 42, 49, 0, 2, 0, 92, +255,226, 5,133, 5,213, 0, 13, 0, 43, 0, 0, 1, 17, 20, 22, 51, 50, 55, 54, 61, 1, 52, 39, 38, 35, 33, 35, 53, 51, 53, 52, + 55, 54, 51, 33, 21, 33, 34, 7, 6, 21, 33, 50, 23, 22, 21, 17, 35, 53, 6, 35, 32, 39, 38, 17, 1,217,174,194,193, 89, 87, 48, + 55, 81,253, 12,178,178, 96, 95,149, 3, 35,253, 12, 81, 55, 48, 2, 88,149, 95, 96,203,160,209,254,231,146,144, 3,177,254,152, +240,211,106,103,242,161,108, 42, 49,175, 20,171, 91, 91,175, 49, 42,107, 91, 91,171,253, 1, 70,100,149,148, 1, 37, 0, 0, 0, + 0, 1, 0,178,255,227, 6,196, 5,213, 0, 29, 0, 0, 1, 17, 16, 0, 33, 32, 0, 25, 1, 51, 17, 20, 22, 51, 50, 54, 53, 17, + 33, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 5, 41,254,223,254,230,254,229,254,223,203,174,195,194,174, 1, 18,149, 95, 96, +156, 48, 55, 81, 5, 38,253, 11,254,220,254,214, 1, 42, 1, 36, 3,164,252,117,240,211,211,240, 3,139, 91, 91,171, 70, 49,108, + 42, 49, 0, 0, 0, 1, 0,140,255,227, 5, 83, 5,242, 0, 44, 0, 0, 19, 52, 55, 54, 33, 32, 23, 22, 21, 20, 7, 6, 7, 30, + 1, 21, 20, 4, 32, 36, 53, 51, 20, 23, 22, 32, 54, 53, 52, 38, 35, 33, 53, 33, 50, 54, 53, 52, 39, 38, 35, 34, 7, 6, 7,173, +155,144, 1, 23, 1, 20,147,155, 73, 73,129,146,163,254,247,253, 74,254,248,202, 82, 83, 1,232,166,165,245,253,191, 2, 65,230, +147, 99, 97,181,181, 97, 87, 11, 4,171,143, 96, 88, 88, 96,143,128, 91, 89, 32, 34,198,175,245,232,231,246,162, 78, 77,155,162, +167,154,159,130,116, 89, 49, 48, 48, 43, 74, 0, 0, 1, 0, 92,255,227, 6,110, 6,205, 0, 30, 0, 0, 1, 17, 20, 22, 51, 50, + 55, 54, 61, 1, 51, 21, 16, 0, 33, 32, 0, 25, 1, 35, 34, 39, 38, 61, 1, 51, 21, 20, 23, 22, 51, 2,194,174,194,197, 85, 87, +203,254,223,254,229,254,230,254,223, 71,149, 95, 96,156, 48, 55, 81, 5,213,252,117,240,211,105,107,239, 32, 57,254,220,254,214, + 1, 42, 1, 36, 2,245, 91, 91,171, 70, 49,108, 42, 49, 0, 0, 0, 1, 0,178,255,225, 5, 41, 6,147, 0, 32, 0, 0, 1, 20, + 23, 22, 51, 50, 55, 54, 61, 1, 51, 21, 16, 7, 6, 37, 36, 39, 38, 53, 16, 55, 54, 37, 55, 37, 53, 5, 21, 5, 4, 7, 6, 1, +122, 90, 91,190,195, 87, 87,203,145,159,254,244,254,208,123,144, 61,129, 1,115,150,253, 57, 4, 17,254,164,254,153, 87, 47, 2, + 7,175,104,105,105,107,239, 32, 57,254,220,149,165, 16, 18,131,155,234, 1, 38,100,224,161, 65,140,190,190,190,156,161,158, 85, + 0, 1, 0,178, 0, 0, 5, 41, 5,242, 0, 17, 0, 0, 51, 17, 16, 0, 33, 32, 0, 25, 1, 35, 17, 52, 38, 35, 34, 6, 21, 17, +178, 1, 33, 1, 27, 1, 26, 1, 33,203,174,194,195,174, 3,164, 1, 36, 1, 42,254,214,254,220,252, 92, 3,139,240,211,211,240, +252,117, 0, 0, 0, 1, 0,178,255, 66, 5, 41, 5,244, 0, 32, 0, 0, 1, 52, 39, 38, 35, 34, 7, 6, 29, 1, 35, 53, 16, 55, + 54, 5, 4, 23, 22, 21, 16, 7, 6, 5, 7, 5, 21, 37, 53, 37, 36, 55, 54, 4, 97, 90, 91,190,195, 87, 87,203,144,160, 1, 12, + 1, 48,122,145, 61,129,254,141,150, 2,199,251,239, 1, 92, 1,103, 87, 47, 3,206,175,103,106,106,106,239, 32, 57, 1, 36,149, +165, 16, 18,131,155,234,254,218,100,224,161, 65,140,190,190,190,156,161,158, 85, 0, 1, 0,178, 0, 0, 5,161, 5,242, 0, 24, + 0, 0, 1, 17, 35, 17, 6, 7, 6, 29, 1, 35, 53, 16, 55, 54, 33, 32, 23, 22, 25, 1, 35, 17, 52, 39, 38, 3,144,203,136, 75, +117,203,174,145, 1, 57, 1, 41,159,175,203,117, 66, 5, 71,252,148, 3,108, 19, 80,124,221, 32, 57, 1, 5,180,149,149,163,254, +234,252, 92, 3,139,204,141, 80, 0, 2, 0,155,255, 8, 4,186, 5,240, 0, 29, 0, 43, 0, 0, 37, 38, 39, 38, 17, 52, 0, 51, + 32, 23, 22, 3, 2, 3, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 33, 17, 51, 21, 33, 55, 54, 55, 54, 39, 38, 39, 38, 32, 6, + 21, 20, 23, 22, 2,162, 69,240,202, 1, 16,226, 1, 8,131,155, 58, 52,231,149, 95, 96,156, 48, 55, 81,253, 53,203, 1, 20,171, +101, 15, 63, 28, 25, 55, 79,254,240,159,151,163,220,220,170,142, 1, 4,230, 1, 22,198,234,254,169,254,207,254,247, 91, 91,171, + 70, 49,108, 42, 49, 1, 76,157,195,194, 44,189,215,190, 64, 94,187,161,170,116,126, 0, 0, 0, 0, 1, 0,178, 0, 0, 6,196, + 5,242, 0, 31, 0, 0, 1, 51, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 43, 1, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, + 16, 0, 33, 32, 23, 22, 5, 23, 89,149, 95, 96,156, 48, 55, 81, 71,203,174,194,195,174,203, 1, 33, 1, 27, 1, 26,144, 90, 4, + 96, 91, 91,171, 70, 49,108, 42, 49,252, 79, 3,139,240,211,211,240,252,117, 3,164, 1, 36, 1, 42,149, 92, 0,255,255, 0,178, +255,227, 5, 41, 5,213, 18, 6, 0, 56, 0, 0, 0, 1, 0,178,255, 8, 6,196, 5,213, 0, 32, 0, 0, 41, 1, 50, 23, 22, 29, + 1, 51, 53, 52, 39, 38, 43, 1, 17, 35, 17, 20, 7, 6, 35, 34, 38, 61, 1, 35, 21, 16, 23, 22, 33, 50, 55, 4, 94, 1, 18, 81, + 55, 48,156, 96, 95,149, 71,203, 87, 89,193,194,174,203,144,152, 1, 19,209,160, 49, 42,108, 49, 70,171, 91, 91, 5, 38,253,243, +242,104,105,211,240,152,177,254,215,144,149,100,255,255, 0,135,255,227, 4,162, 5,240, 18, 6, 0, 54, 0, 0, 0, 1, 0,178, + 0, 0, 5, 41, 5,242, 0, 18, 0, 0, 51, 17, 16, 0, 33, 32, 23, 22, 17, 21, 35, 53, 52, 38, 35, 34, 6, 21, 17,178, 1, 33, + 1, 27, 1, 19,151,145,203,174,194,195,174, 3,164, 1, 36, 1, 42,149,142,254,213, 57, 32,240,211,211,240,252,117, 0, 0, 0, + 0, 2, 0,140,255,227, 5, 83, 5,242, 0, 43, 0, 57, 0, 0, 1, 30, 1, 21, 20, 4, 32, 36, 53, 51, 20, 23, 22, 32, 54, 53, + 52, 38, 35, 34, 7, 6, 7, 34, 35, 54, 55, 54, 55, 38, 39, 38, 53, 52, 55, 54, 33, 32, 23, 22, 21, 20, 7, 6, 1, 34, 7, 6, + 21, 20, 22, 51, 50, 54, 53, 52, 39, 38, 4, 30,146,163,254,247,253, 74,254,248,202, 82, 83, 1,232,166,165,245,226,101, 31, 5, +102,103, 3, 35, 82,146,129, 72, 74,155,147, 1, 19, 1, 20,147,155, 73, 73,254, 80,180, 97, 99,147,229,230,147, 99, 97, 3, 87, + 34,198,175,245,232,231,246,162, 78, 77,155,162,167,154, 77, 28, 12, 28, 42, 99, 34, 32, 89, 91,128,143, 96, 88, 88, 94,145,128, + 91, 89, 1,217, 48, 49, 89,116,130,130,116, 89, 49, 48, 0, 0, 0, 1, 0,178, 0, 0, 6, 12, 5,213, 0, 21, 0, 0, 1, 53, + 52, 38, 35, 34, 7, 6, 21, 17, 35, 17, 51, 17, 54, 51, 32, 23, 22, 23, 51, 21, 4, 94,174,194,193, 89, 87,203,203,160,209, 1, + 19,151,117, 24,231, 1,219, 50,240,211,106,103,242,253,243, 5,213,254, 59,100,149,115,226,175,255,255, 0,115, 0, 0, 5,217, + 5,213, 18, 6, 2,196, 0, 0, 0, 2, 0, 92, 0, 0, 5,227, 5,242, 0, 44, 0, 60, 0, 0, 1, 17, 52, 55, 54, 51, 50, 23, + 22, 21, 20, 7, 6, 35, 34, 39, 21, 33, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 35, 33, 17, 35, 17, 35, 34, 39, 38, 61, 1, 51, + 21, 20, 23, 22, 51, 1, 6, 7, 6, 21, 20, 23, 22, 23, 22, 55, 54, 53, 52, 39, 38, 1,208,146,141,235,244,132,145,145,132,244, +246, 73, 1,244,149, 95, 96,156, 48, 55, 81,254, 12,203, 32,149, 95, 96,156, 48, 55, 81, 2, 42,138, 93, 87, 87, 93,138,136, 95, + 87, 87, 95, 2,114, 2, 8,149,115,112,112,122,144,149,122,112, 83,218, 91, 91,171, 70, 49,108, 42, 49,254, 61, 1,195, 91, 91, +171, 70, 49,108, 42, 49, 2,220, 1, 65, 62, 84, 93, 61, 66, 1, 1, 68, 61, 91, 86, 62, 67, 0,255,255, 0,115,255,227, 5,217, + 5,240, 18, 6, 0, 50, 0, 0, 0, 3, 0,135,255,227, 4,162, 5,240, 0, 8, 0, 19, 0, 46, 0, 0, 1, 17, 54, 55, 54, 53, + 52, 39, 38, 1, 17, 52, 39, 34, 7, 6, 21, 20, 23, 22, 5, 23, 30, 1, 21, 20, 4, 33, 34, 38, 39, 53, 22, 23, 22, 23, 17, 38, + 39, 38, 53, 52, 55, 54, 51, 50, 21, 2,185,113, 71, 94, 67, 67,254,188, 57, 53, 43, 26, 60, 38, 1, 5, 48,226,215,254,221,254, +231,106,239,128,123,118, 69, 66,190, 91,101, 75, 91,165,231, 2,148,253,248, 11, 52, 68,126,110, 62, 61, 1, 18, 1,132, 62, 2, + 64, 37,145, 99, 51, 31, 65, 10, 43,217,182,217,224, 48, 47,208, 69, 35, 20, 10, 2, 44, 44, 87, 96,171,215, 97,114,201, 0, 0, +255,255, 0,117, 3,239, 1,135, 6, 20, 16, 6, 2, 24, 0, 0,255,255, 0,178, 3,254, 1,215, 5,213, 16, 6, 2, 21, 0, 0, + 0, 1, 0, 94, 4,241, 3,169, 6,194, 0, 3, 0, 0, 1, 35, 1, 51, 1, 51,213, 2,118,213, 4,241, 1,209, 0, 1, 0,120, + 4,241, 3,134, 7, 37, 0, 17, 0, 0, 1, 34, 7, 6, 21, 35, 52, 55, 54, 51, 50, 55, 54, 53, 51, 20, 7, 6, 1,255, 91, 82, + 66,152,104,106,181, 91, 82, 66,152,104,106, 5,205, 84, 68, 68,130,106,108, 84, 68, 68,130,106,108, 0, 0, 0,255,255, 0,158, + 4,240, 2,125, 6,102, 16, 6, 0, 67,244, 0, 0, 1, 0, 94, 4,229, 3,189, 7, 55, 0, 21, 0, 0, 19, 35, 52, 55, 18, 33, + 32, 23, 18, 33, 34, 17, 51, 20, 51, 50, 39, 38, 39, 38, 7, 6,252,158, 32,113, 1, 51, 1, 85, 55, 75,254,193,251,152, 97,121, + 38, 34,205,206, 57, 25, 4,241,211, 83, 1, 32,252,254,170, 1, 8,122,158,140, 2, 1,179, 78, 0, 1, 0, 90, 4,241, 3,178, + 7, 37, 0, 5, 0, 0, 27, 1, 51, 3, 33, 21, 90,170,170,125, 2,129, 4,241, 2, 52,254, 98,150, 0, 0, 0, 0, 1, 0,186, +255,230, 7, 29, 4, 98, 0, 38, 0, 94, 64, 17, 0, 18, 20, 30, 27, 8, 29, 80, 18, 8, 20, 80, 10, 8, 8, 70, 39, 16,252,236, +252,252,252,252, 60, 17, 18, 57, 49, 64, 22, 7, 20, 10, 26, 17, 0, 6, 31, 8, 13, 23,135, 31, 4, 35,140, 29, 27, 18, 8,188, + 29, 0, 47,244, 60, 60, 16,244, 60,196,236, 50, 17, 18, 23, 57, 48, 64, 19, 48, 40, 80, 40,112, 40,144, 40,160, 40,160, 40,191, + 40,223, 40,255, 40, 9, 1, 93, 37, 6, 7, 6, 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 55, 54, 53, 17, 51, 17, 20, 22, 51, + 50, 54, 53, 17, 51, 17, 35, 53, 6, 7, 6, 35, 34, 39, 38, 3,174, 69, 96, 96,130,175,190,185,114,117,143, 83, 83,185,114,119, +141,166,185,185, 63, 88, 88,121,122, 86, 85,216,124, 58, 60,246,226, 2,164,253, 98,162,156, 96, 94,164, 2,122,253, 98,162,156, +192,162, 2,122,251,160,174,104, 48, 50, 62, 62, 0, 1, 0,186,254, 86, 4,100, 4,123, 0, 23, 0, 63, 64, 30, 1, 7, 22, 3, + 16, 10, 4,135, 16, 19,184, 14,188, 10, 23, 9,169, 10, 0, 8, 9, 22, 78, 11, 15, 7, 8, 13, 70, 24, 16,252,236, 50, 50,244, + 60,236, 49, 0, 47,252,204, 16,228,244,196,236, 17, 18, 23, 57, 48,180, 96, 25,207, 25, 2, 1, 93, 1, 17, 52, 38, 35, 34, 6, + 21, 17, 33, 21, 33, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 21, 17, 3,172,124,124,149,172, 2,241,253, 15,185,185, 66,179,117, +193,198, 1, 44, 1,114,159,158,190,164,254, 54,175,254, 86, 6, 10,174,101,100,239,232,254,136, 0, 2, 0,113,254, 86, 5, 47, + 4,123, 0, 11, 0, 32, 0, 60, 64, 14, 34, 30, 26, 14, 6, 8, 12, 28, 71, 0, 18, 20, 69, 33, 16,252,236,244, 60,236, 50, 50, +220,212, 49, 64, 18, 3,185, 14, 17, 9,185, 26, 23,184, 17,140, 30,169, 12,189, 27,188, 33, 0, 16,228,228,236,228,244,196,236, + 16,198,238, 48, 1, 20, 22, 51, 50, 54, 53, 52, 38, 35, 34, 6, 1, 35, 17, 14, 1, 35, 34, 2, 17, 16, 0, 51, 50, 22, 23, 53, + 51, 17, 51, 21, 35, 1, 47,167,146,146,168,168,146,146,167, 3, 43,184, 58,177,124,203,255, 0,255,203,124,177, 58,184,213,213, + 2, 47,203,231,231,203,203,231,231,251, 92, 2, 82,100, 97, 1, 68, 1, 8, 1, 8, 1, 68, 97,100,170,252, 79,175, 0, 0, 0, + 0, 1, 0,186,254, 86, 5, 57, 4,123, 0, 23, 0, 61, 64, 13, 25, 22, 3, 8, 0, 21, 78, 9, 13, 8, 12, 70, 24, 16,252,236, + 50,244, 60,236,220,196, 49, 64, 13, 6,135, 14, 17,184, 12,188, 2,189, 21,169, 11, 0, 0, 47, 60,236,236,228,244,196,236,181, + 9, 3, 20, 3, 14, 10, 17, 18, 23, 57, 48, 33, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 21, + 17, 51, 21, 4,100,184,124,124,149,172,185,185, 66,179,117,193,198,213,254, 86, 4, 72,159,158,190,164,253,135, 4, 96,174,101, +100,239,232,254, 11,175, 0, 0, 0, 1, 0,174,255,227, 4, 88, 6, 20, 0, 26, 0, 63, 64, 30, 7, 15, 0, 3, 20, 3, 11,135, + 20, 23,140, 18, 17, 5,169, 4,188, 18, 19, 15, 8, 4, 17, 78, 6, 2, 8, 0, 70, 27, 16,252,236, 50,244, 60,236, 50, 49, 0, + 47,244,252,204, 16,244,196,236, 17, 18, 23, 57, 48,180, 96, 28,207, 28, 2, 1, 93, 19, 17, 51, 17, 33, 21, 33, 17, 20, 23, 22, + 51, 50, 55, 54, 53, 17, 51, 17, 35, 53, 14, 1, 35, 34, 39, 38,174,184, 2,242,253, 14, 62, 62,124,152, 84, 86,184,184, 67,177, +117,193,100,100, 1,186, 4, 90,254, 76,170,254, 11,159, 80, 79, 95, 98,161, 1, 59,252,224,172,102, 99,120,120, 0, 2, 0,113, +254, 86, 5, 47, 4,123, 0, 18, 0, 30, 0, 60, 64, 13, 32, 1, 16, 4, 25, 8, 18, 71, 19, 18, 10, 69, 31, 16,252,236,244,236, + 50, 50,220,212, 49, 64, 19, 22,185, 4, 7, 28,185, 16, 13,184, 7,140, 31, 1,169, 2,189, 17,188, 31, 0, 16,228,244,236, 16, +228,244,196,236, 16,198,238, 48, 1, 51, 21, 33, 17, 14, 1, 35, 34, 2, 17, 16, 0, 51, 50, 22, 23, 53, 51, 1, 20, 22, 51, 50, + 54, 53, 52, 38, 35, 34, 6, 4, 90,213,254,115, 58,177,124,203,255, 0,255,203,124,177, 58,184,252,213,167,146,146,168,168,146, +146,167,254,248,162, 2, 82,100, 97, 1, 68, 1, 8, 1, 8, 1, 68, 97,100,170,253,207,203,231,231,203,203,231,231, 0, 0, 0, + 0, 1, 0,174,255, 26, 3,224, 6, 20, 0, 19, 0, 44, 64, 12, 21, 5, 15, 18, 14, 5, 8, 3, 8, 1, 70, 20, 16,252,252, 60, +220,212,236, 16,196, 49, 64, 10, 7,169, 4,188, 14, 9,169, 2,151, 1, 0, 47,228,236,204,244,236, 48, 41, 1, 17, 51, 17, 33, + 21, 33, 17, 51, 50, 23, 22, 29, 1, 35, 53, 52, 39, 38, 2, 83,254, 91,184, 2,122,253,134,237,152, 77, 96,156, 48, 49, 6, 20, +254, 76,170,252,249, 73, 91,171, 70, 49,105, 38, 38, 0, 0, 0, 0, 1, 0,186,254, 86, 4,100, 4,123, 0, 21, 0, 62, 64, 30, + 1, 7, 20, 3, 14, 21, 4,135, 14, 17,184, 12,188, 21, 9,169, 10,189, 21, 0, 8, 9, 20, 78, 13, 7, 8, 11, 70, 22, 16,252, +236, 50,244, 60,236, 49, 0, 47,252,236, 16,228,244,196,236, 17, 18, 23, 57, 48,180, 96, 23,207, 23, 2, 1, 93, 33, 17, 52, 38, + 35, 34, 6, 21, 17, 33, 21, 33, 17, 51, 21, 62, 1, 51, 50, 22, 21, 17, 3,172,124,124,149,172, 2,241,252, 86,185, 66,179,117, +193,198, 2,158,159,158,190,164,252,140,175, 6, 10,174,101,100,239,232,253, 92, 0, 2, 0,186,254, 86, 5, 54, 4,123, 0, 32, + 0, 41, 0,117, 64, 12, 43, 19, 1, 18, 18, 71, 7, 11, 8, 9, 70, 42, 16,252,236, 50,244,236,220,196,179, 36, 18, 29, 7, 16, +220,252,179, 33, 18, 21, 18, 16,212,236,178, 0, 33, 36, 73, 83, 88,179, 29, 9, 36, 7, 16, 60, 16, 60, 89, 49, 64, 15, 38,185, + 25,140, 42, 4,185, 12, 15,184, 11,188, 9,189, 42, 0, 16,236,228,244,196,236, 16,244,236, 64, 6, 18, 1,169, 21, 33, 38, 16, +220, 60,252, 60,178, 0, 4, 1, 73, 83, 88,181, 18, 1,169, 21, 33, 38, 16, 60, 60,252, 60, 89, 48, 1, 51, 52, 38, 35, 34, 6, + 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 0, 17, 51, 21, 35, 6, 7, 6, 7, 6, 39, 38, 53, 52, 55, 54, 5, 35, 34, 23, 22, 51, + 50, 55, 54, 3, 35,194,167,146,146,167,185,185, 58,177,123,204, 0,255,146,162, 29, 53, 96,172,160, 52,120, 66,100, 1, 66,152, +159, 5, 5,139, 74, 52, 28, 2, 47,203,231,231,203,252, 39, 6, 10,170,100, 97,254,188,254,248,175,161, 90,161, 1, 2, 43,104, +124,123, 78,118,175,144,113,113, 60, 0, 0, 0, 0, 2, 0,113,255,227, 5, 47, 6, 20, 0, 12, 0, 31, 0, 52, 64, 13, 33, 30, + 0, 27, 8, 13, 29, 71, 5, 18, 21, 69, 32, 16,252,236,244, 60,236, 50,220,196, 49, 64, 14, 8,185, 18,140, 32, 31, 0,169, 26, + 29,188, 28,151, 32, 0, 16,228,244, 60,252, 60, 16,244,236, 48, 1, 33, 34, 7, 6, 21, 20, 22, 51, 50, 55, 54, 53, 19, 17, 16, + 5, 6, 35, 34, 2, 17, 52, 55, 54, 51, 33, 17, 51, 17, 51, 21, 3,162,254,198,136, 98, 79,167,146,154, 77, 83,184,254,236, 75, +149,246,255,127,125,249, 1, 60,184,213, 3,182,122, 97,172,203,231,107,115,212, 1,135,254, 67,254,175,154, 43, 1, 68, 1, 8, +223,171,167, 1,180,254, 76,170, 0, 1, 0,186,254, 86, 4,100, 6, 20, 0, 19, 0, 53, 64, 26, 3, 9, 0, 3, 14, 1, 6,135, + 14, 17,184, 12,151, 10,189, 1, 2, 8, 0, 78, 13, 9, 8, 11, 70, 20, 16,252,236, 50,244,236, 49, 0, 47,236,236,244,196,236, + 17, 18, 23, 57, 48,178, 96, 21, 1, 1, 93, 1, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 51, 17, 62, 1, 51, 50, 22, 4, +100,184,124,124,149,172,185,185, 66,179,117,193,198, 2,164,253, 92, 2,158,159,158,190,164,251,221, 7,190,253,158,101,100,239, + 0, 1, 0,193,254, 86, 2,215, 4, 96, 0, 5, 0, 32, 64, 7, 7, 1, 5, 8, 3, 70, 6, 16,252,252,212,196, 49, 0, 64, 8, + 4,188, 6, 0,169, 3,189, 6, 16,244,228, 16,228, 48, 1, 33, 21, 33, 17, 51, 1,121, 1, 94,253,234,184,254,248,162, 6, 10, + 0, 1, 0,186,254, 86, 7, 28, 6, 20, 0, 40, 0,105, 64, 15, 32, 29, 8, 31, 80, 40, 8, 20, 80, 8, 11, 8, 9, 70, 41, 16, +252,236, 50,244,252,244,252, 60, 49, 64, 18, 4,135, 12, 16,184, 31, 25,135, 33, 36,140, 29,188, 10,151, 8,189, 31, 0, 47,236, +228,228,244,196,236, 16,244,196,236,181, 40, 21, 28, 3, 33, 29, 17, 18, 23, 57,181, 20, 0, 7, 3, 12, 32, 17, 18, 23, 57, 48, + 64, 19, 48, 41, 80, 41,112, 41,144, 41,160, 41,160, 41,191, 41,223, 41,255, 41, 9, 1, 93, 1, 52, 39, 38, 35, 34, 6, 21, 17, + 35, 17, 51, 17, 54, 55, 54, 51, 50, 23, 22, 29, 1, 20, 23, 22, 51, 50, 54, 53, 17, 51, 17, 35, 53, 14, 1, 35, 34, 39, 38, 53, + 3,143, 62, 62,124,120,172,185,185, 99, 38, 89,107,193, 99, 99, 62, 56,110,140,173,184,184, 67,177,108,175, 98,100, 2,158,159, + 79, 79,190,164,251,221, 7,190,253,158,129, 22, 50,119,120,232,227,151, 88, 79,190,164, 2,123,251,160,172,102, 99,120,123,228, + 0, 2, 0,113,255,226, 4,188, 6, 20, 0, 14, 0, 48, 0, 92, 64, 11, 50, 32, 12, 18, 36, 71, 5, 18, 44, 69, 49, 16,252,236, +244,236,220,196,180, 18, 18, 27, 23, 44, 16,220,220,236, 49, 64, 17, 1, 32,169, 48, 31,188, 49, 24,169, 23,151, 49, 8,185, 40, +140, 49, 0, 16,244,236, 16,244,236, 16,244, 60,252, 60, 48,180, 33, 30, 34, 29, 34, 5, 7, 16, 60, 60,181, 0, 17, 33, 15, 17, + 30, 16,236, 16,236,178, 14, 16, 0, 16, 60, 60, 1, 35, 34, 7, 6, 21, 20, 22, 51, 50, 55, 54, 55, 54, 39, 1, 39, 38, 53, 52, + 55, 54, 59, 1, 21, 35, 38, 23, 22, 31, 1, 33, 21, 33, 19, 22, 21, 20, 7, 6, 39, 38, 39, 38, 17, 52, 55, 54, 51, 2,195, 91, +165, 65, 83,167,146,173, 93, 46, 3, 2, 23,254,221, 83, 22, 68, 56, 49,147, 78, 47, 1, 1, 15, 86, 1,144,254,201,174, 33,133, +135,226,247,127,127,127,113,218, 3,182, 90,115,186,203,231,150, 73, 82, 92, 43, 2, 43,152, 40, 86, 76, 45, 37,175, 1, 41, 36, + 27,158,170,254,182, 63,137,166,141,143, 1, 1,161,162, 1, 8,235,174,152, 0, 0, 1, 0,174,254, 86, 4, 88, 6, 20, 0, 19, + 0, 58, 64, 28, 3, 9, 0, 3, 14, 10, 6,135, 14, 17,140, 1,151, 10,188, 12,189, 20, 13, 9, 8, 11, 78, 2, 8, 0, 70, 20, + 16,252,236,244,236, 50, 49, 0, 16,236,228,228,244,196,236, 17, 18, 23, 57, 48,180, 96, 21,207, 21, 2, 1, 93, 19, 17, 51, 17, + 20, 22, 51, 50, 54, 53, 17, 51, 17, 35, 17, 14, 1, 35, 34, 38,174,184,124,124,149,173,184,184, 67,177,117,193,200, 1,186, 4, + 90,251,173,159,159,190,164, 2,123,249,246, 2, 86,102, 99,240,255,255, 0,186, 0, 0, 4,100, 6, 20, 18, 6, 0, 75, 0, 0, + 0, 2, 0,113,255,227, 4, 90, 6, 20, 0, 11, 0, 52, 0,101, 64, 10, 18, 6, 8, 16, 71, 0, 18, 25, 69, 53, 16,252,236,244, +252, 60, 64, 13, 40, 18, 39, 39, 42, 37, 37, 18, 42, 30, 18, 51, 16, 16,220,252,212,236, 17, 18, 57, 47,236,178, 12, 16, 28, 17, + 18, 57, 49, 64, 16, 46,169, 32, 9,185, 28,184, 18, 3,185, 19, 22,140, 39,151, 18, 0, 47,228,244,196,236, 16,244,236,220,236, +178, 12, 9, 28, 17, 18, 57, 48, 64, 9, 96, 54,128, 54,160, 54,224, 54, 4, 1, 93, 1, 20, 22, 51, 50, 54, 53, 52, 38, 35, 34, + 6, 1, 22, 23, 22, 25, 1, 35, 53, 14, 1, 35, 34, 2, 17, 16, 0, 51, 50, 53, 38, 43, 1, 34, 39, 38, 53, 52, 55, 51, 6, 21, + 20, 23, 22, 59, 1, 50, 23, 22, 21, 20, 1, 47,167,146,146,168,168,146,146,167, 1,233,110, 68,144,184, 58,177,124,203,255, 1, + 0,202, 87, 1, 67,118, 62, 31, 30, 33,184, 37, 8, 17, 26,147, 55, 41, 29, 2, 47,203,231,231,203,203,231,231, 1,107, 29, 80, +168,254,219,253,213,168,100, 97, 1, 68, 1, 8, 1, 8, 1, 69, 60, 54, 29, 29,112, 71, 53, 80, 48, 14, 7, 15, 44, 33, 75, 55, + 0, 1, 0,186,254, 86, 5, 57, 4,123, 0, 21, 0, 59, 64, 12, 23, 0, 3, 8, 21, 78, 9, 13, 8, 12, 70, 22, 16,252,236, 50, +244,236,220,196, 49, 64, 13, 6,135, 14, 17,184, 12,188, 11, 0,169, 2,189, 11, 0, 47,252,236, 16,228,244,196,236,181, 9, 3, + 20, 3, 14, 10, 17, 18, 23, 57, 48, 1, 21, 33, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 21, 17, 5, + 57,254,115,124,124,149,172,185,185, 66,179,117,193,198,254,248,162, 4, 72,159,158,190,164,253,135, 4, 96,174,101,100,239,232, +252, 84, 0, 0, 0, 2, 0,174,255,227, 4, 88, 6, 20, 0, 29, 0, 45, 0, 98, 64, 12, 2, 40, 8, 20, 0, 78, 32, 8, 14, 10, + 70, 46, 16,252, 60,236,244, 60,236, 50,182, 16, 13, 45, 26, 4, 0, 14, 17, 18, 23, 57,183, 25, 8, 16, 30, 8, 13, 16, 13, 7, + 16,236, 16,236, 1,176, 13, 47, 49, 64, 18, 37,135, 3, 6,140, 1, 30, 14,169, 25, 15,188, 1, 21,134, 20,151, 1, 0, 47,244, +236, 16,244, 60,252, 60, 16,244,196,236,181, 33, 10, 40, 3, 15, 3, 17, 18, 23, 57, 48, 1, 17, 35, 53, 14, 1, 35, 34, 39, 38, + 61, 1, 52, 55, 35, 53, 51, 54, 55, 36, 55, 21, 6, 7, 6, 7, 51, 50, 23, 22, 37, 6, 29, 1, 20, 23, 22, 51, 50, 54, 61, 1, + 52, 39, 38, 35, 4, 88,184, 67,177,117,195, 98,100,122,122,218,112,152, 1, 27,173,141,221, 62, 66,105,176,130, 79,253,152,138, + 62, 65,121,149,173, 26, 99, 87, 2, 32,253,224,172,102, 99,120,123,228, 73,233,202,170,128, 96,174, 38,175, 36,132, 37, 56,195, +118,143,198,229, 74,162, 77, 79,190,164, 59,207, 41,158, 0, 0, 0, 1, 0,174,255,227, 5, 10, 6, 20, 0, 43, 0, 63, 64, 15, + 45, 23, 17, 18, 28, 37, 9, 8, 36, 78, 2, 8, 0, 70, 44, 16,252,236,244,236, 50,220,236,220,196, 49, 64, 19, 0, 3, 9, 3, + 38, 1, 23,169, 22,151, 36, 6,135, 38, 41,140, 1,188, 36, 0, 47,228,244,196,236, 16,244,236, 17, 18, 23, 57, 48, 19, 17, 51, + 17, 20, 22, 51, 50, 54, 53, 17, 52, 39, 38, 47, 1, 38, 55, 54, 55, 54, 59, 1, 21, 35, 34, 7, 6, 21, 20, 31, 1, 22, 23, 22, + 21, 17, 35, 53, 14, 1, 35, 34, 38,174,184,124,124,149,173, 3, 3, 10, 77, 46, 1, 4, 61, 60,139,236,236, 40, 21, 24, 17, 96, + 19, 4, 7,184, 67,177,117,193,200, 1,186, 2,166,253, 97,159,159,190,164, 1,151, 19, 22, 32, 23,188,112, 48,129, 46, 45,175, + 9, 11, 23, 31, 42,243, 47, 23, 40, 20,252,132,172,102, 99,240,255,255,255,219,254, 86, 1,121, 4, 96, 18, 6, 1,249, 0, 0, + 0, 1, 0, 49,255,227, 5, 90, 6, 20, 0, 35, 0, 71, 64, 15, 37, 14, 11, 8, 12, 78, 3, 8, 22, 27, 33, 0, 18, 27, 36, 16, +212,252,204, 16,220,236,244,236, 50,196, 49, 64, 23, 10, 4, 21, 3, 15, 12, 33,169, 32,151, 13, 22,169, 3, 12,188, 13, 7,135, + 15, 18,140, 13, 0, 47,244,196,236, 16,244, 60,236, 16,244,236, 17, 18, 23, 57, 48, 19, 20, 59, 1, 17, 20, 22, 51, 50, 54, 53, + 17, 51, 17, 35, 53, 14, 1, 35, 34, 38, 53, 17, 35, 34, 39, 38, 55, 54, 55, 54, 59, 1, 21, 35, 34,242,131,243,124,124,149,173, +184,184, 67,177,117,193,200, 59,149, 94, 83, 3, 3, 87,115,118, 89, 89,131, 4,234,138,253, 97,159,159,190,164, 2,123,251,160, +172,102, 99,240,231, 1,252, 94, 83,145,131, 66, 87,175, 0, 0, 0, 1, 0,159,254, 86, 3,150, 4,124, 0, 31, 0, 84, 64, 12, + 33, 69, 16, 18, 5, 29, 2, 18, 11, 22, 70, 32, 16,252, 60,236,212, 60,236,228, 49, 64, 13, 5,169, 6,189, 32, 22,134, 23, 20, +185, 25,184, 32, 0, 16,244,236,212,236, 16,252,236, 48, 64, 10, 0, 31, 29, 31, 17, 0, 17, 13, 14, 13, 7, 5, 16,236,236, 1, + 73, 80, 88,177, 31, 29, 16, 60, 89,179, 30, 31, 14, 13, 7, 4, 16, 60, 5, 6, 21, 20, 51, 33, 21, 33, 34, 39, 38, 39, 38, 55, + 1, 54, 39, 38, 39, 38, 7, 6, 7, 53, 54, 23, 22, 23, 22, 21, 20, 7, 1,134, 14, 47, 1,238,253,195, 87, 58, 37, 2, 2, 38, + 1,205, 68, 1, 1, 47, 67,141,120,188,188,161,195,132, 81, 69,192, 19, 21, 32,162, 69, 44, 65, 56, 56, 2,173,102, 93, 68, 64, + 90, 1, 1,120,198,106, 1, 1,170,104,136,154,101, 0, 0, 0,255,255, 0,186, 0, 0, 4,100, 4,123, 18, 6, 0, 81, 0, 0, + 0, 1, 0, 70,254, 86, 3, 59, 4, 96, 0, 37, 0, 88, 64, 17, 16, 18, 35, 35, 5, 26, 39, 5, 11, 26, 30, 18, 21, 2, 18, 11, + 38, 16,212,236,220,236,204, 16,220,196, 17, 18, 57, 47,236, 49, 64, 14, 35, 16, 5, 27, 27,169, 26,188, 38, 5,169, 6,189, 38, + 0, 16,252,236, 16,244,236, 17, 18, 57, 57, 48,182, 37, 17, 0, 17, 13, 14, 13, 7, 4, 16,236,236,182, 19, 17, 18, 17, 32, 33, + 32, 7, 4, 16,236,236, 5, 6, 21, 20, 51, 33, 21, 33, 34, 39, 38, 53, 52, 55, 1, 54, 55, 54, 47, 1, 38, 53, 52, 55, 54, 59, + 1, 21, 35, 38, 21, 20, 31, 1, 22, 21, 20, 7, 1, 40, 14, 51, 1,238,253,195, 87, 58, 39, 36, 1, 70, 31, 1, 2, 91,149, 76, + 22, 50,214,115,101, 96, 54,142,103, 43,182, 17, 33, 32,162, 69, 47, 62, 65, 47, 1,173, 40, 60, 69, 99,163, 83,101, 40, 50,122, +175, 1, 58, 46, 59,155,112,110,117, 57, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 16, 6, 2, 6, 0, 0, 0, 2, 0,159, +254, 86, 3,150, 4,123, 0, 27, 0, 41, 0, 99, 64, 14, 43, 69, 40, 18, 5, 25, 2, 18, 11, 34, 18, 17, 69, 42, 16,252,236, 60, +236,212, 60,236,228, 49, 64, 10, 5,169, 6,189, 42, 30,185, 21,184, 42, 0, 16,244,236, 16,252,236, 48, 64, 11, 26, 27, 27, 17, + 0, 17, 37, 14, 13, 38, 13, 7, 5, 16, 60, 60,236,236, 4, 16, 60,178, 0, 27, 25, 1, 73, 80, 88,177, 27, 25, 16, 60, 89, 64, + 9, 37, 17, 36, 17, 14, 38, 13, 15, 14, 7, 8, 16,236,236, 5, 6, 21, 20, 51, 33, 21, 33, 34, 39, 38, 39, 38, 63, 1, 3, 38, + 53, 52, 55, 54, 51, 50, 23, 22, 21, 20, 7, 3, 38, 35, 34, 7, 6, 21, 20, 23, 27, 1, 54, 39, 38, 1,134, 14, 47, 1,238,253, +195, 87, 58, 37, 2, 2, 38,145,141, 40, 96, 91,175,212,115, 68, 69,159, 72,100, 59, 54, 59, 33, 88,191, 68, 1, 1,192, 19, 21, + 32,162, 69, 44, 65, 55, 57,217, 1,228,137, 70,163,109,103,171,101,139,154,101, 1,139, 89, 45, 49,103, 60,120,254,191, 1, 26, +101, 94, 89, 0, 0, 1, 0,186, 0, 0, 4,116, 4,123, 0, 28, 0,103, 64, 13, 28, 9, 2, 18, 25, 21, 78, 13, 9, 8, 11, 70, + 29, 16,252,236, 50,244, 60,236, 16,220, 49, 64, 12, 6,135, 14, 17,184, 12,188, 28, 25,169, 26, 10, 0, 47, 60,236, 50,228,244, +196,236,181, 21, 2, 9, 3, 14, 10, 17, 18, 23, 57, 48,177, 23, 0, 16, 60, 64, 8, 23, 17, 0, 24, 17, 28, 0, 28, 7, 5, 16, +236, 16,236, 1,178, 0, 23, 21, 73, 80, 88,177, 23, 21, 16, 60, 89,180, 96, 30,207, 30, 2, 1, 93, 1, 54, 55, 54, 39, 38, 35, + 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 23, 22, 21, 20, 7, 1, 33, 21, 33, 53, 3, 82, 90, 1, 1, 64, 62,124,149,172, +185,185, 66,179,117,205,127, 65, 71,254,250, 1, 87,253,223, 1,232,110,132, 96, 82, 79,190,164,253,135, 4, 96,174,101,100,185, + 94,119,176, 85,254,199,175,175,255,255, 0,174,255,227, 4, 88, 4, 96, 18, 6, 0, 88, 0, 0, 0, 1, 0,174,254, 86, 5, 45, + 6, 20, 0, 21, 0, 61, 64, 12, 23, 13, 15, 9, 8, 11, 78, 2, 8, 0, 70, 22, 16,252,236,244,236, 50,220,196, 49, 64, 21, 3, + 9, 0, 3, 16, 1, 6,135, 16, 19,140, 10,151, 1,188, 22, 13,169, 15,189, 22, 0, 16,252,236, 16,228,228,244,196,236, 17, 18, + 23, 57, 48, 19, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, 51, 21, 33, 17, 14, 1, 35, 34, 38,174,184,124,124,149,173,184, +213,254,115, 67,177,117,193,200, 1,186, 2,166,253, 97,159,159,190,164, 4, 47,248,228,162, 2, 86,102, 99,240, 0, 1, 0,174, +255,227, 7, 28, 4,123, 0, 37, 0,105, 64, 15, 12, 8, 10, 80, 21, 1, 8, 2, 20, 80, 31, 8, 29, 70, 38, 16,252,236,252, 60, +252, 60,252,236, 49, 64, 17, 15,135, 3, 6,184, 10, 34,135, 22, 25,140, 10, 1, 29,188, 20, 10, 0, 47, 60,244, 60, 16,244,196, +236, 16,244,196,236,181, 28, 31, 0, 3, 22, 29, 17, 18, 23, 57,181, 9, 12, 19, 3, 3, 10, 17, 18, 23, 57, 48, 64, 19, 48, 39, + 80, 39,112, 39,144, 39,160, 39,160, 39,191, 39,223, 39,255, 39, 9, 1, 93, 1, 17, 51, 21, 62, 1, 51, 50, 22, 21, 17, 35, 17, + 52, 38, 35, 34, 7, 6, 21, 17, 35, 53, 14, 1, 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 55, 54, 3,143,184, 66,179, 89,193, +198,184,124,124,122, 85, 86,184, 67,177,100,193,200,184,124,124,130, 88, 87, 1,229, 2,123,174,101,100,239,232,253, 92, 2,158, +159,158, 95, 96,163,253,135,172,102, 99,240,231, 2,166,253, 97,159,159, 95, 92, 0, 1, 0,186,254, 86, 4,100, 4,123, 0, 19, + 0, 55, 64, 26, 3, 9, 0, 3, 14, 1, 6,135, 14, 17,184, 12,188, 10,189, 1, 2, 8, 0, 78, 13, 9, 8, 11, 70, 20, 16,252, +236, 50,244,236, 49, 0, 47,236,228,244,196,236, 17, 18, 23, 57, 48,180, 96, 21,207, 21, 2, 1, 93, 1, 17, 35, 17, 52, 38, 35, + 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 4,100,184,124,124,149,172,185,185, 66,179,117,193,198, 2,164,253, 92, 2, +158,159,158,190,164,251,221, 6, 10,174,101,100,239, 0, 0, 0,255,255, 0,113,254, 86, 4, 90, 4,123, 18, 6, 0, 74, 0, 0, + 0, 1, 0,193, 0, 0, 2,215, 4, 96, 0, 5, 0, 29, 64, 7, 7, 1, 5, 8, 3, 70, 6, 16,252,252,212,196, 49, 0, 64, 6, + 4,188, 3, 1,169, 2, 47,236, 16,228, 48, 37, 33, 21, 33, 17, 51, 1,121, 1, 94,253,234,184,175,175, 4, 96, 0, 1, 0,174, +254, 86, 7, 28, 6, 20, 0, 37, 0,107, 64, 15, 12, 8, 10, 80, 21, 1, 8, 2, 20, 80, 31, 8, 29, 70, 38, 16,252,236,252, 60, +252, 60,252,236, 49, 64, 19, 15,135, 3, 6,184, 10, 34,135, 22, 25,140, 10, 29,188, 1,151, 20,189, 10, 0, 47,236,228,244, 16, +244,196,236, 16,244,196,236,181, 28, 31, 0, 3, 22, 29, 17, 18, 23, 57,181, 9, 12, 19, 3, 3, 10, 17, 18, 23, 57, 48, 64, 19, + 48, 39, 80, 39,112, 39,144, 39,160, 39,160, 39,191, 39,223, 39,255, 39, 9, 1, 93, 1, 17, 51, 17, 62, 1, 51, 50, 22, 21, 17, + 35, 17, 52, 38, 35, 34, 7, 6, 21, 17, 35, 17, 14, 1, 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 55, 54, 3,143,184, 66,179, + 89,193,198,184,124,124,118, 89, 86,184, 67,177,100,193,200,184,124,124,130, 88, 87, 1,229, 4, 47,253,158,101,100,239,232,253, + 92, 2,158,159,158, 95, 92,167,251,221, 2, 86,102, 99,240,231, 2,166,253, 97,159,159, 95, 92, 0, 2, 0, 0,254, 86, 4,191, + 4,123, 0, 24, 0, 36, 0, 85, 64, 16, 38, 69, 11, 19, 25, 18, 11, 71, 31, 22, 4, 18, 8, 23, 2, 1, 47,220, 60,236, 50, 50, + 50,244,236,196, 16,228, 49, 64, 22, 34,185, 17, 14, 28,185, 5, 8,184, 14,140, 37, 20, 24,169, 18, 2, 22,189, 3,188, 37, 0, + 16,228,236,220, 60,252, 60, 16,228,244,196,236, 16,196,238,178, 0, 22, 24, 73, 80, 88,177, 22, 24, 16, 60, 89, 48, 21, 53, 51, + 17, 51, 21, 62, 1, 51, 50, 0, 17, 16, 2, 35, 34, 38, 39, 17, 33, 21, 33, 21, 35, 53, 1, 52, 38, 35, 34, 6, 21, 20, 22, 51, + 50, 54,213,185, 58,177,123,204, 0,255,255,204,123,177, 58, 2,233,253, 23,185, 3, 43,167,146,146,167,167,146,146,167,250,150, + 4,196,170,100, 97,254,188,254,248,254,248,254,188, 97,100,254,244,150,176,176, 3, 41,203,231,231,203,203,231,231, 0, 0, 0, +255,255, 0,113,255,227, 4,117, 4,123, 18, 6, 0, 82, 0, 0, 0, 3, 0,122,254, 86, 4,150, 6, 43, 0, 34, 0, 45, 0, 54, + 0,117, 64, 17, 56, 51, 18, 28, 32, 22, 46, 8, 0, 35, 10, 42, 18, 5, 14, 69, 55, 16,252, 60,236,220, 60, 60,252, 60, 60,220, +236,196, 49, 64, 18, 5,134, 4, 38,185, 18,151, 55, 47, 9,135, 4, 32, 0,140, 34,189, 55, 0, 16,236,244, 60,196,236, 50, 16, +244,236, 16,236,179, 23, 35, 0, 18, 17, 18, 57, 57,178, 14, 35, 18, 17, 18, 57,182, 26, 51, 46, 10, 4, 32, 23, 17, 18, 23, 57, + 48,180, 23, 35, 24, 24, 44, 7, 4, 16, 60, 60,181, 46, 17, 23, 10, 17, 35, 16,236, 16,236, 5, 38, 39, 38, 39, 53, 22, 23, 22, + 23, 17, 38, 39, 38, 53, 52, 55, 54, 55, 54, 23, 22, 21, 17, 23, 22, 23, 22, 21, 16, 7, 6, 35, 17, 35, 25, 1, 52, 39, 38, 7, + 6, 21, 22, 23, 22, 5, 17, 50, 55, 54, 53, 52, 39, 38, 2, 44, 68,100,125,141, 49,211, 75, 99,231,102,101,112, 95,152,123, 53, + 83, 35,194, 97,108,146,126,162,184, 69, 85, 24, 64, 1, 59, 39, 1, 71, 93, 55, 95, 69, 56, 24, 2, 17, 21, 71,187, 31, 73, 26, + 1, 2,163, 45, 97, 96,165,147,113, 96, 1, 2, 52, 79,148,254,169, 7, 45, 98,108,235,254,218,105, 90,254,110, 5,141, 1, 33, +115, 3, 2, 29, 79, 59,115, 58, 36,246,253,129, 43, 73,191,179, 74, 62, 0, 0, 0, 1, 0,174,255,227, 5,182, 6, 20, 0, 21, + 0, 56, 64, 12, 23, 13, 15, 9, 8, 11, 78, 2, 8, 0, 70, 22, 16,252,236,244,236, 50,220,196, 49, 64, 18, 3, 9, 0, 3, 16, + 10, 6,135, 16, 19,140, 1,151, 10,188, 13,169, 15, 0, 47,236,228,228,244,196,236, 17, 18, 23, 57, 48, 19, 17, 51, 17, 20, 22, + 51, 50, 54, 53, 17, 51, 17, 33, 21, 33, 53, 14, 1, 35, 34, 38,174,184,124,124,149,173,184, 1, 94,253,234, 67,177,117,193,200, + 1,186, 4, 90,251,173,159,159,190,164, 2,123,252, 79,175,172,102, 99,240, 0, 0, 2, 0,240, 0, 0, 1,195, 3, 82, 0, 3, + 0, 7, 0, 29, 64, 7, 5, 1, 3, 4, 0, 24, 8, 16,252, 60,236, 50, 49, 0, 64, 6, 6,131, 4, 0,131, 2, 47,236, 47,236, + 48, 55, 51, 21, 35, 17, 51, 21, 35,240,211,211,211,211,254,254, 3, 82,254, 0, 0, 1, 0, 96, 1,164, 3, 33, 2,238, 0, 11, + 0, 0, 1, 30, 1, 55, 21, 14, 1, 34, 38, 39, 51, 22, 1, 85, 32,222,205, 44,228,255,157, 20,167, 16, 2, 99, 24, 1, 65,162, + 14, 55,170,159, 87, 0, 0, 0, 0, 1, 0,219, 0, 0, 2, 0, 1,236, 0, 5, 0, 0, 33, 35, 53, 19, 51, 3, 1,174,211,164, +129, 82,172, 1, 64,254,192, 0,255,255, 0, 16,253, 46, 5,104, 5,213, 16, 39, 2, 70, 0,183, 0, 0, 18, 2, 0, 36, 0, 0, +255,255, 0,123,253, 46, 4, 45, 4,123, 16, 38, 2, 70,107, 0, 18, 2, 0, 68, 0, 0, 0, 0,255,255, 0,201, 0, 0, 4,236, + 7, 80, 18, 34, 0, 37, 0, 0, 16, 3, 2, 50, 0,173, 1, 64,255,255, 0,186,255,227, 4,164, 7,133, 16, 39, 2, 79, 3, 22, + 1,117, 18, 6, 0, 69, 0, 0,255,255, 0,201,254,135, 4,236, 5,213, 18, 34, 0, 37, 0, 0, 16, 3, 2,107, 4,165, 0, 0, +255,255, 0,186,254,135, 4,164, 6, 20, 18, 34, 0, 69, 0, 0, 16, 3, 2,107, 4,154, 0, 0,255,255, 0,201,254,192, 4,236, + 5,213, 18, 34, 0, 37, 0, 0, 16, 3, 2, 38, 0,151, 0, 0,255,255, 0,186,254,192, 4,164, 6, 20, 18, 34, 0, 69, 0, 0, + 16, 3, 2, 38, 0,143, 0, 0,255,255, 0,115,254,117, 5, 39, 7,107, 18, 34, 0,137, 0, 0, 16, 67, 0,118, 0,254, 2,240, + 64, 0, 44,204,255,255, 0,113,254,117, 3,231, 6,102, 18, 34, 0,169, 0, 0, 16, 2, 0,118, 67, 0, 0, 0,255,255, 0,201, + 0, 0, 5,176, 7, 80, 18, 34, 0, 39, 0, 0, 16, 3, 2, 50, 0,253, 1, 64,255,255, 0,113,255,227, 4,110, 7,133, 16, 39, + 2, 79, 5,254, 1,117, 18, 6, 0, 71, 0, 0,255,255, 0,201,254,135, 5,176, 5,213, 16, 35, 2,107, 4,174, 0, 0, 16, 2, + 0, 39, 0, 0,255,255, 0,113,254,135, 4, 90, 6, 20, 16, 35, 2,107, 4,122, 0, 0, 16, 2, 0, 71, 0, 0,255,255, 0,201, +254,192, 5,176, 5,213, 18, 34, 0, 39, 0, 0, 16, 3, 2, 38, 0,232, 0, 0,255,255, 0,113,254,192, 4, 90, 6, 20, 18, 34, + 0, 71, 0, 0, 16, 2, 2, 38, 79, 0, 0, 0,255,255, 0,201,254,119, 5,176, 5,213, 18, 34, 0, 39, 0, 0, 16, 2, 0,122, + 91, 2, 0, 0,255,255, 0,113,254,117, 4, 90, 6, 20, 18, 34, 0, 71, 0, 0, 16, 2, 0,122,246, 0, 0, 0,255,255, 0,201, +254, 24, 5,176, 5,213, 16, 39, 2, 31, 0,166,249, 42, 18, 6, 0, 39, 0, 0,255,255, 0,113,254, 24, 4, 90, 6, 20, 16, 39, + 2, 31, 0, 94,249, 42, 18, 6, 0, 71, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 6, 6,149, +238, 0, 0, 0,255,255, 0,113,255,227, 4,127, 4,123, 16, 39, 6,149,255,217,255, 4, 16, 6, 0, 72, 0, 0,255,255, 0,201, + 0, 0, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 6, 6,148,236, 0, 0, 0,255,255, 0,113,255,227, 4,127, 4,123, 16, 38, + 0, 72, 0, 0, 16, 7, 6,148,255,215,255, 4,255,255, 0,201,253,221, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 3, 2,117, + 4,177, 0, 0,255,255, 0,113,253,221, 4,127, 4,123, 18, 34, 0, 72, 0, 0, 16, 3, 2,117, 4,176, 0, 0,255,255, 0,201, +254,118, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 3, 2, 71, 0,179, 0, 0,255,255, 0,113,254,118, 4,127, 4,123, 18, 34, + 0, 72, 0, 0, 16, 3, 2, 71, 0,155, 0, 0,255,255, 0,201,254,117, 4,139, 7,102, 18, 34, 0, 40, 0, 0, 16, 99, 2, 49, + 0,218, 1,190, 64, 0, 57,153, 16, 3, 0,122, 0,190, 0, 0,255,255, 0,113,254,117, 4,127, 6, 72, 18, 34, 0, 72, 0, 0, + 16, 35, 2, 49, 0,135, 0, 0, 16, 2, 0,122, 75, 0, 0, 0,255,255, 0,201, 0, 0, 4, 35, 7, 80, 18, 34, 0, 41, 0, 0, + 16, 3, 2, 50, 0,118, 1, 64,255,255, 0, 47, 0, 0, 2,248, 7, 80, 18, 34, 0, 73, 0, 0, 16, 3, 2, 50, 0, 12, 1, 64, +255,255, 0,115,255,227, 5,139, 7, 24, 18, 34, 0, 42, 0, 0, 16, 3, 2, 34, 1, 50, 1, 34,255,255, 0,113,254, 86, 4, 90, + 5,246, 18, 34, 0, 74, 0, 0, 16, 2, 2, 34, 73, 0, 0, 0,255,255, 0,201, 0, 0, 5, 59, 7, 80, 18, 34, 0, 43, 0, 0, + 16, 3, 2, 50, 1, 20, 1, 64,255,255, 0,186, 0, 0, 4,100, 7,133, 16, 39, 2, 79, 3, 22, 1,117, 18, 6, 0, 75, 0, 0, +255,255, 0,201,254,135, 5, 59, 5,213, 16, 35, 2,107, 5, 2, 0, 0, 16, 2, 0, 43, 0, 0,255,255, 0,186,254,135, 4,100, + 6, 20, 16, 35, 2,107, 4,143, 0, 0, 16, 2, 0, 75, 0, 0,255,255, 0,201, 0, 0, 5, 59, 7, 80, 18, 34, 0, 43, 0, 0, + 16, 3, 0,106, 1, 8, 1, 64,255,255,255,235, 0, 0, 4,100, 7,133, 16, 39, 2, 80, 3, 22, 1,117, 18, 6, 0, 75, 0, 0, +255,255, 0, 17,254,116, 5, 59, 5,213, 18, 34, 0, 43, 0, 0, 16, 3, 0,122,254,238,255,255,255,255, 0, 2,254,116, 4,100, + 6, 20, 18, 34, 0, 75, 0, 0, 16, 3, 0,122,254,223,255,255,255,255, 0,201,254, 57, 5, 59, 5,213, 18, 34, 0, 43, 0, 0, + 16, 3, 2,118, 5, 10, 0, 0,255,255, 0,186,254, 57, 4,100, 6, 20, 18, 34, 0, 75, 0, 0, 16, 3, 2,118, 4,149, 0, 0, +255,255, 0, 0,254,118, 2,148, 5,213, 18, 34, 0, 44, 0, 0, 16, 3, 2, 71,255, 74, 0, 0,255,255, 0, 39,254,118, 2, 56, + 6, 20, 18, 34, 0, 76, 0, 0, 16, 66, 2, 71,150, 0, 51, 51, 64, 0, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 18, 34, + 0, 44, 0, 0, 16, 7, 6,146,254,116, 0, 0,255,255, 0,193, 0, 0, 1,121, 4, 96, 18, 34, 0,243, 0, 0, 16, 7, 6,146, +254, 97,254,188,255,255, 0,201, 0, 0, 5,106, 7,107, 18, 34, 0, 46, 0, 0, 16, 67, 0,118, 0,164, 2,240, 64, 0, 44,204, +255,255, 0,186, 0, 0, 4,156, 6, 20, 16, 39, 6,133, 3, 90, 1,118, 18, 2, 0, 78, 0, 0,255,255, 0,201,254,135, 5,106, + 5,213, 18, 34, 0, 46, 0, 0, 16, 3, 2,107, 4,220, 0, 0,255,255, 0,186,254,135, 4,156, 6, 20, 18, 34, 0, 78, 0, 0, + 16, 3, 2,107, 4,145, 0, 0,255,255, 0,201,254,192, 5,106, 5,213, 18, 34, 0, 46, 0, 0, 16, 3, 2, 38, 1, 13, 0, 0, +255,255, 0,186,254,192, 4,156, 6, 20, 18, 34, 0, 78, 0, 0, 16, 2, 2, 38,118, 0, 0, 0,255,255, 0,201,254,135, 4,106, + 5,213, 16, 35, 2,107, 4,154, 0, 0, 16, 2, 0, 47, 0, 0,255,255, 0,182,254,135, 1,131, 6, 20, 16, 35, 2,107, 3, 28, + 0, 0, 16, 2, 0, 79, 0, 0,255,255, 0, 3,254,136, 4,106, 7,107, 16, 39, 2, 76, 3, 42, 1,117, 16, 39, 2,107, 4,153, + 0, 1, 18, 6, 0, 47, 0, 0,255,255,255,241,254,135, 2, 72, 7, 49, 16, 35, 0,113,255, 28, 1, 59, 16, 2, 4,179, 0, 0, +255,255, 0,201,254,192, 4,106, 5,213, 18, 34, 0, 47, 0, 0, 16, 3, 2, 38, 0,142, 0, 0,255,255, 0, 39,254,192, 2, 7, + 6, 20, 18, 34, 0, 79, 0, 0, 16, 67, 2, 38,255,125, 0, 0, 51, 51, 64, 0,255,255, 0,201,254, 23, 4,106, 5,213, 16, 39, + 2, 31, 0,151,249, 41, 18, 6, 0, 47, 0, 0,255,255,255,222,254, 23, 2, 92, 6, 20, 16, 39, 2, 31,255, 29,249, 41, 18, 6, + 0, 79, 0, 0,255,255, 0,201, 0, 0, 6, 31, 7,107, 18, 34, 0, 48, 0, 0, 16, 67, 0,118, 1, 66, 2,240, 64, 0, 44,204, +255,255, 0,186, 0, 0, 7, 29, 6,102, 18, 34, 0, 80, 0, 0, 16, 3, 0,118, 1,148, 0, 0,255,255, 0,201, 0, 0, 6, 31, + 7, 80, 18, 34, 0, 48, 0, 0, 16, 3, 2, 50, 1,119, 1, 64,255,255, 0,186, 0, 0, 7, 29, 6, 16, 16, 39, 2, 50, 2, 70, + 0, 0, 18, 6, 0, 80, 0, 0,255,255, 0,201,254,135, 6, 31, 5,213, 16, 35, 2,107, 5,116, 0, 0, 16, 2, 0, 48, 0, 0, +255,255, 0,186,254,135, 7, 29, 4,123, 16, 35, 2,107, 5,230, 0, 0, 16, 2, 0, 80, 0, 0,255,255, 0,201, 0, 0, 5, 51, + 5,213, 16, 39, 6,140, 4,254, 1, 92, 18, 6, 0, 49, 0, 0,255,255, 0,186, 0, 0, 4,100, 5,193, 16, 39, 2, 50, 0,143, +255,177, 18, 6, 0, 81, 0, 0,255,255, 0,201,254,135, 5, 51, 5,213, 16, 35, 2,107, 4,254, 0, 0, 16, 2, 0, 49, 0, 0, +255,255, 0,186,254,135, 4,100, 4,123, 16, 35, 2,107, 4,143, 0, 0, 16, 2, 0, 81, 0, 0,255,255, 0,201,254,192, 5, 51, + 5,213, 18, 34, 0, 49, 0, 0, 16, 3, 2, 38, 0,247, 0, 0,255,255, 0,186,254,192, 4,100, 4,123, 18, 34, 0, 81, 0, 0, + 16, 3, 2, 38, 0,140, 0, 0,255,255, 0,201,254, 21, 5, 51, 5,213, 16, 39, 2, 31, 0,254,249, 39, 18, 6, 0, 49, 0, 0, +255,255, 0,186,254, 21, 4,100, 4,123, 16, 39, 2, 31, 0,149,249, 39, 18, 6, 0, 81, 0, 0,255,255, 0,115,255,227, 5,217, + 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,154,102, 0, 0, 0,255,255, 0,113,255,227, 4,117, 4,123, 18, 34, 0, 82, 0, 0, + 16, 7, 6,154,255,178,254,178,255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,152,108, 0, 0, 0, +255,255, 0,113,255,227, 4,117, 7, 15, 18, 34, 0, 82, 0, 0, 16, 39, 0,106, 0,111, 0,255, 16, 7, 6,134, 4,114, 0, 18, +255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,149,106, 0, 0, 0,255,255, 0,113,255,227, 4,117, + 4,123, 16, 38, 0, 82, 0, 0, 16, 7, 6,149,255,181,255, 4,255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, + 16, 6, 6,148,104, 0, 0, 0,255,255, 0,113,255,227, 4,117, 4,123, 16, 39, 6,148,255,185,255, 4, 16, 6, 0, 82, 0, 0, +255,255, 0,201, 0, 0, 4,141, 7,107, 18, 34, 0, 51, 0, 0, 16, 67, 0,118, 0, 65, 2,240, 64, 0, 44,204,255,255, 0,186, +254, 86, 4,164, 6,102, 18, 34, 0, 83, 0, 0, 16, 2, 0,118, 50, 0, 0, 0,255,255, 0,201, 0, 0, 4,141, 7, 80, 18, 34, + 0, 51, 0, 0, 16, 3, 2, 50, 0,132, 1, 64,255,255, 0,186,254, 86, 4,164, 6, 16, 16, 39, 2, 50, 0,217, 0, 0, 18, 6, + 0, 83, 0, 0,255,255, 0,201, 0, 0, 5, 84, 7, 80, 18, 34, 0, 53, 0, 0, 16, 3, 2, 50, 0,131, 1, 64,255,255, 0,186, + 0, 0, 3, 74, 6, 18, 18, 34, 0, 85, 0, 0, 16, 2, 2, 50, 19, 2, 0, 0,255,255, 0,201,254,135, 5, 84, 5,213, 16, 35, + 2,107, 4,125, 0, 0, 16, 2, 0, 53, 0, 0,255,255, 0,186,254,135, 3, 74, 4,123, 16, 35, 2,107, 3, 32, 0, 0, 16, 2, + 0, 85, 0, 0,255,255, 0,201,254,135, 5, 84, 7, 51, 16, 99, 0,113, 0,122, 1, 50, 64, 0, 64,110, 16, 2, 4,214, 0, 0, +255,255, 0,186,254,135, 3, 74, 5,245, 16, 34, 0,113, 24,255, 16, 2, 4,215, 0, 0, 0, 0,255,255, 0,201,254,192, 5, 84, + 5,213, 18, 34, 0, 53, 0, 0, 16, 3, 2, 38, 0,229, 0, 0,255,255, 0, 84,254,192, 3, 74, 4,123, 18, 34, 0, 85, 0, 0, + 16, 3, 2, 38,255,127, 0, 0,255,255, 0,135,255,227, 4,162, 7, 80, 18, 34, 0, 54, 0, 0, 16, 3, 2, 50, 0,184, 1, 64, +255,255, 0,111,255,227, 3,199, 6, 16, 16, 38, 2, 50, 37, 0, 18, 6, 0, 86, 0, 0, 0, 0,255,255, 0,135,254,135, 4,162, + 5,240, 16, 35, 2,107, 4,138, 0, 0, 16, 2, 0, 54, 0, 0,255,255, 0,111,254,135, 3,199, 4,123, 16, 35, 2,107, 4, 21, + 0, 0, 16, 2, 0, 86, 0, 0,255,255, 0,135,255,227, 4,162, 7,107, 18, 34, 0, 54, 0, 0, 16, 35, 2, 50,255,164, 1, 90, + 16, 67, 0,118, 0,242, 2,240, 64, 0, 44,204,255,255, 0,111,255,227, 3,226, 6,102, 18, 34, 0, 86, 0, 0, 16, 34, 2, 50, +140, 86, 16, 3, 0,118, 0,144, 0, 0, 0, 0,255,255, 0,135,255,227, 4,162, 5,240, 16, 38, 6,153,228, 0, 18, 2, 0, 54, + 0, 0, 0, 0,255,255, 0,111,255,227, 3,199, 7,176, 16, 38, 1, 35, 0, 0, 16, 7, 2, 50, 0, 34, 1,160,255,255, 0,135, +254,135, 4,162, 7, 80, 18, 34, 4,222, 0, 0, 16, 3, 2, 50, 0,155, 1, 64,255,255, 0,111,254,135, 3,199, 6, 18, 18, 34, + 4,223, 0, 0, 16, 2, 2, 50, 42, 2, 0, 0,255,255,255,250, 0, 0, 4,233, 7, 80, 18, 34, 0, 55, 0, 0, 16, 3, 2, 50, + 0,114, 1, 64,255,255, 0, 55, 0, 0, 2,242, 7, 47, 18, 34, 0, 87, 0, 0, 16, 3, 2, 50,255, 35, 1, 31,255,255,255,250, +254,135, 4,233, 5,213, 16, 35, 2,107, 4,113, 0, 0, 16, 2, 0, 55, 0, 0,255,255, 0, 55,254,135, 2,242, 5,158, 16, 35, + 2,107, 3,232, 0, 0, 16, 2, 0, 87, 0, 0,255,255,255,250,254,192, 4,233, 5,213, 18, 34, 0, 55, 0, 0, 16, 2, 2, 38, + 98, 0, 0, 0,255,255, 0, 55,254,192, 2,242, 5,158, 18, 34, 0, 87, 0, 0, 16, 66, 2, 38, 60, 0, 51, 51, 64, 0, 0, 0, +255,255,255,250,254, 21, 4,233, 5,213, 16, 39, 2, 31, 0,114,249, 39, 18, 6, 0, 55, 0, 0,255,255, 0, 55,254, 20, 3, 39, + 5,158, 16, 39, 2, 31,255,232,249, 38, 18, 6, 0, 87, 0, 0,255,255, 0,178,254,137, 5, 41, 5,213, 16, 35, 2,108, 4,240, + 0, 0, 18, 2, 0, 56, 0, 0,255,255, 0,174,254,137, 4, 88, 4, 96, 16, 35, 2,108, 4,123, 0, 0, 18, 2, 0, 88, 0, 0, +255,255, 0,178,254,118, 5, 41, 5,213, 18, 34, 0, 56, 0, 0, 16, 3, 2, 71, 0,242, 0, 0,255,255, 0,174,254,118, 4, 88, + 4, 96, 18, 34, 0, 88, 0, 0, 16, 3, 2, 71, 0,143, 0, 0,255,255, 0,178,253,221, 5, 41, 5,213, 18, 34, 0, 56, 0, 0, + 16, 3, 2,117, 4,224, 0, 0,255,255, 0,174,253,221, 4, 88, 4, 96, 18, 34, 0, 88, 0, 0, 16, 3, 2,117, 4,117, 0, 0, +255,255, 0,178,255,227, 5, 41, 5,213, 16, 38, 6,154, 46, 0, 18, 2, 0, 56, 0, 0, 0, 0,255,255, 0,174,255,227, 4, 88, + 7,236, 16, 38, 1, 43, 0, 0, 16, 7, 0,118, 0,150, 1,134,255,255, 0,178,255,227, 5, 41, 5,213, 16, 38, 6,144, 50, 0, + 18, 2, 0, 56, 0, 0, 0, 0,255,255, 0,174,255,227, 4, 88, 4, 96, 16, 39, 6,144,255,200,254,192, 18, 2, 0, 88, 0, 0, +255,255, 0, 16, 0, 0, 5,104, 7,125, 18, 34, 0, 57, 0, 0, 16, 3, 2, 53, 0,237, 1, 70,255,255, 0, 61, 0, 0, 4,127, + 6, 55, 18, 34, 0, 89, 0, 0, 16, 2, 2, 53,109, 0, 0, 0,255,255, 0, 16,254,135, 5,104, 5,213, 16, 38, 0, 57, 0, 0, + 16, 7, 2,107, 4,188, 0, 0,255,255, 0, 61,254,135, 4,127, 4, 96, 16, 38, 0, 89, 0, 0, 16, 7, 2,107, 4, 94, 0, 0, +255,255, 0, 68, 0, 0, 7,166, 5,213, 16, 39, 6,135, 5,245, 1,124, 18, 6, 0, 58, 0, 0,255,255, 0, 86, 0, 0, 6, 53, + 6,107, 16, 39, 0, 67, 1, 9, 0, 5, 18, 6, 0, 90, 0, 0,255,255, 0, 68, 0, 0, 7,166, 5,213, 16, 39, 6,133, 5,245, + 1,124, 18, 6, 0, 58, 0, 0,255,255, 0, 86, 0, 0, 6, 53, 6,109, 16, 39, 0,118, 1,134, 0, 7, 18, 6, 0, 90, 0, 0, +255,255, 0, 68, 0, 0, 7,166, 7, 52, 16, 39, 0,106, 1,245, 1, 36, 18, 6, 0, 58, 0, 0,255,255, 0, 86, 0, 0, 6, 53, + 5,191, 16, 39, 0,106, 1, 69,255,175, 18, 6, 0, 90, 0, 0,255,255, 0, 68, 0, 0, 7,166, 7, 80, 18, 34, 0, 58, 0, 0, + 16, 3, 2, 50, 1,245, 1, 64,255,255, 0, 86, 0, 0, 6, 53, 6, 18, 18, 34, 0, 90, 0, 0, 16, 3, 2, 50, 1, 71, 0, 2, +255,255, 0, 68,254,135, 7,166, 5,213, 18, 34, 0, 58, 0, 0, 16, 3, 2,107, 5,251, 0, 0,255,255, 0, 86,254,135, 6, 53, + 4, 96, 18, 34, 0, 90, 0, 0, 16, 3, 2,107, 5, 74, 0, 0,255,255, 0, 61, 0, 0, 5, 59, 7, 80, 18, 34, 0, 59, 0, 0, + 16, 3, 2, 50, 0,202, 1, 64,255,255, 0, 59, 0, 0, 4,121, 6, 18, 18, 34, 0, 91, 0, 0, 16, 2, 2, 50,103, 2, 0, 0, +255,255, 0, 61, 0, 0, 5, 59, 7, 78, 18, 34, 0, 59, 0, 0, 16, 3, 0,106, 0,202, 1, 62,255,255, 0, 59, 0, 0, 4,121, + 6, 16, 18, 34, 0, 91, 0, 0, 16, 2, 0,106,102, 0, 0, 0,255,255,255,252, 0, 0, 4,231, 7, 80, 18, 34, 0, 60, 0, 0, + 16, 3, 2, 50, 0,112, 1, 64,255,255, 0, 61,254, 86, 4,127, 6, 16, 18, 34, 0, 92, 0, 0, 16, 2, 2, 50,102, 0, 0, 0, +255,255, 0, 92, 0, 0, 5, 31, 7,107, 18, 34, 0, 61, 0, 0, 16, 67, 2, 31, 0,190, 2,240, 64, 0, 44,204,255,255, 0, 88, + 0, 0, 3,219, 6,102, 18, 34, 0, 93, 0, 0, 16, 2, 2, 31, 26, 0, 0, 0,255,255, 0, 92,254,135, 5, 31, 5,213, 18, 34, + 0, 61, 0, 0, 16, 3, 2,107, 4,217, 0, 0,255,255, 0, 88,254,135, 3,219, 4, 96, 18, 34, 0, 93, 0, 0, 16, 3, 2,107, + 4, 49, 0, 0,255,255, 0, 92,254,192, 5, 31, 5,213, 18, 34, 0, 61, 0, 0, 16, 3, 2, 38, 0,199, 0, 0,255,255, 0, 88, +254,192, 3,219, 4, 96, 18, 34, 0, 93, 0, 0, 16, 2, 2, 38, 27, 0, 0, 0,255,255, 0,186,254,192, 4,100, 6, 20, 18, 34, + 0, 75, 0, 0, 16, 2, 2, 38,102, 0, 0, 0,255,255, 0, 4, 0, 0, 2,242, 7, 78, 18, 34, 0, 87, 0, 0, 16, 3, 0,106, +255, 45, 1, 62,255,255, 0, 86, 0, 0, 6, 53, 7, 6, 18, 34, 0, 90, 0, 0, 16, 3, 2, 51, 1, 66, 0, 0,255,255, 0, 61, +254, 86, 4,127, 7, 6, 18, 34, 0, 92, 0, 0, 16, 3, 2, 51, 0,129, 0, 0,255,255, 0,123,255,227, 5, 97, 6, 20, 18, 34, + 0, 68, 0, 0, 16, 3, 2, 23, 3,218, 0, 0,255,255, 0, 47, 0, 0, 2,248, 7, 80, 18, 34, 1, 65, 0, 0, 16, 3, 2, 50, +255,253, 1, 64,255,255, 0, 16,254,135, 5,104, 5,213, 16, 35, 2,107, 4,183, 0, 0, 18, 2, 0, 36, 0, 0,255,255, 0,123, +254,135, 4, 45, 4,123, 16, 35, 2,107, 4, 33, 0, 0, 18, 2, 0, 68, 0, 0,255,255, 0, 16, 0, 0, 5,104, 7,240, 18, 38, + 0, 36, 0, 0, 16, 7, 2, 81, 4,188, 1,117,255,255, 0,123,255,227, 4, 45, 6,123, 18, 38, 0, 68, 0, 0, 16, 7, 2, 81, + 4, 84, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, 0, 36, 0, 0, 16, 6, 6,155, 0, 0, 0, 0,255,255, 0,123, +255,227, 4, 45, 4,123, 16, 39, 6,155,255,151,254,139, 16, 6, 0, 68, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, + 0, 36, 0, 0, 16, 6, 6,156, 0, 0, 0, 0,255,255, 0,123,255,227, 4, 45, 4,123, 16, 38, 0, 68, 0, 0, 16, 7, 6,156, +255,148,254,140,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, 0, 36, 0, 0, 16, 6, 6,162, 0, 0, 0, 0,255,255, 0,123, +255,227, 4, 45, 4,123, 16, 39, 6,162,255,150,254,139, 16, 6, 0, 68, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, + 0, 36, 0, 0, 16, 6, 6,157, 0, 0, 0, 0,255,255, 0,123,255,227, 4, 45, 4,123, 16, 39, 6,157,255,150,254,139, 16, 6, + 0, 68, 0, 0,255,255, 0, 16,254,135, 5,104, 5,213, 16, 35, 2,107, 4,175, 0, 0, 18, 2, 0,132, 0, 0,255,255, 0,123, +254,135, 4, 45, 6,102, 18, 34, 0,164, 0, 0, 16, 3, 2,107, 4, 34, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, + 0, 36, 0, 0, 16, 6, 6,159, 0, 0, 0, 0,255,255, 0,123,255,227, 4, 45, 4,123, 16, 39, 6,159,255,145,254,170, 16, 6, + 0, 68, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, 0, 36, 0, 0, 16, 6, 6,160, 0, 0, 0, 0,255,255, 0,123, +255,227, 4, 45, 4,123, 16, 39, 6,160,255,146,254,170, 16, 6, 0, 68, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, + 0, 36, 0, 0, 16, 6, 6,161, 0, 0, 0, 0,255,255, 0,123,255,227, 4, 45, 4,123, 16, 39, 6,161,255,148,254,170, 16, 6, + 0, 68, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 18, 34, 0, 36, 0, 0, 16, 6, 6,158, 0, 0, 0, 0,255,255, 0,123, +255,227, 4, 45, 4,123, 16, 38, 0, 68, 0, 0, 16, 7, 6,158,255,146,254,170,255,255, 0, 16,254,135, 5,104, 7,146, 18, 34, + 0,196, 0, 0, 16, 3, 2,107, 4,192, 0, 0,255,255, 0,123,254,135, 4, 45, 6, 31, 18, 34, 0,197, 0, 0, 16, 3, 2,107, + 4, 51, 0, 0,255,255, 0,201,254,135, 4,139, 5,213, 16, 38, 0, 40, 0, 0, 16, 7, 2,107, 4,158, 0, 0,255,255, 0,113, +254,135, 4,127, 4,123, 16, 38, 0, 72, 0, 0, 16, 7, 2,107, 4,139, 0, 0,255,255, 0,201, 0, 0, 4,139, 7,240, 18, 38, + 0, 40, 0, 0, 16, 7, 2, 81, 4,158, 1,117,255,255, 0,113,255,227, 4,127, 6,123, 18, 38, 0, 72, 0, 0, 16, 7, 2, 81, + 4,141, 0, 0,255,255, 0,201, 0, 0, 4,139, 7, 69, 16, 99, 2, 53, 0,185, 2, 76, 64, 0, 51, 51, 18, 2, 0, 40, 0, 0, +255,255, 0,113,255,227, 4,127, 6, 55, 16, 35, 2, 53, 0,151, 0, 0, 18, 2, 0, 72, 0, 0,255,255, 0,201, 0, 0, 4,139, + 5,213, 18, 34, 0, 40, 0, 0, 16, 6, 6,155, 0, 0, 0, 0,255,255, 0,113,255,227, 4,127, 4,123, 16, 39, 6,155,255,208, +254,139, 16, 6, 0, 72, 0, 0,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 6, 6,156,238, 0, 0, 0, +255,255, 0,113,255,227, 4,127, 4,123, 16, 39, 6,156,255,208,254,140, 16, 6, 0, 72, 0, 0,255,255, 0,201, 0, 0, 4,139, + 5,213, 18, 34, 0, 40, 0, 0, 16, 6, 6,162,238, 0, 0, 0,255,255, 0,113,255,227, 4,127, 4,123, 16, 38, 0, 72, 0, 0, + 16, 7, 6,162,255,208,254,139,255,255, 0,201, 0, 0, 4,139, 5,213, 18, 34, 0, 40, 0, 0, 16, 6, 6,157,234, 0, 0, 0, +255,255, 0,113,255,227, 4,127, 4,123, 16, 39, 6,157,255,209,254,139, 16, 6, 0, 72, 0, 0,255,255, 0,201,254,135, 4,139, + 5,213, 18, 34, 0,140, 0, 0, 16, 7, 2,107, 4,158, 0, 0,255,255, 0,113,254,135, 4,127, 6,102, 16, 39, 2,107, 4,139, + 0, 0, 16, 38, 5, 49, 0, 0, 16, 7, 2, 31, 0,139, 0, 0,255,255, 0, 90, 0, 0, 2, 26, 7,240, 18, 38, 0, 44, 0, 0, + 16, 7, 2, 81, 3, 35, 1,117,255,255, 0, 68, 0, 0, 2, 4, 6,124, 18, 34, 0,243, 0, 0, 16, 7, 2, 81, 3, 13, 0, 1, +255,255, 0,200,254,135, 1,148, 5,213, 16, 38, 0, 44, 0, 0, 16, 7, 2,107, 3, 46, 0, 0,255,255, 0,183,254,135, 1,131, + 6, 20, 16, 38, 0, 76, 0, 0, 16, 7, 2,107, 3, 29, 0, 0,255,255, 0,115,254,135, 5,217, 5,240, 16, 38, 0, 50, 0, 0, + 16, 7, 2,107, 5, 39, 0, 0,255,255, 0,113,254,135, 4,117, 4,123, 16, 38, 0, 82, 0, 0, 16, 7, 2,107, 4,115, 0, 0, +255,255, 0,115,255,227, 5,217, 7,240, 18, 38, 0, 50, 0, 0, 16, 7, 2, 81, 5, 39, 1,117,255,255, 0,113,255,227, 4,117, + 6,123, 18, 38, 0, 82, 0, 0, 16, 7, 2, 81, 4,125, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, + 16, 6, 6,155,108, 0, 0, 0,255,255, 0,113,255,227, 4,117, 4,123, 16, 39, 6,155,255,182,254,139, 16, 6, 0, 82, 0, 0, +255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,156,106, 0, 0, 0,255,255, 0,113,255,227, 4,117, + 4,123, 16, 39, 6,156,255,181,254,140, 16, 6, 0, 82, 0, 0,255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, + 16, 6, 6,162,106, 0, 0, 0,255,255, 0,113,255,227, 4,117, 4,123, 16, 39, 6,162,255,182,254,139, 16, 6, 0, 82, 0, 0, +255,255, 0,115,255,227, 5,217, 5,240, 18, 34, 0, 50, 0, 0, 16, 6, 6,157,101, 0, 0, 0,255,255, 0,113,255,227, 4,117, + 4,123, 16, 39, 6,157,255,182,254,139, 16, 6, 0, 82, 0, 0,255,255, 0,115,254,135, 5,217, 5,240, 18, 34, 0,150, 0, 0, + 16, 7, 2,107, 5, 39, 0, 0,255,255, 0,113,254,135, 4,117, 6,102, 16, 39, 2,107, 4,115, 0, 0, 16, 38, 5, 69, 0, 0, + 16, 6, 2, 31,115, 0, 0, 0,255,255, 0,103,255,227, 6,195, 5,240, 16, 39, 6,133, 5, 39, 1,117, 18, 2, 1, 98, 0, 0, +255,255, 0,118,255,227, 4,211, 6,102, 16, 38, 0,118,115, 0, 18, 2, 1, 99, 0, 0, 0, 0,255,255, 0,103,255,227, 6,195, + 5,240, 16, 39, 6,135, 5, 39, 1,117, 18, 2, 1, 98, 0, 0,255,255, 0,118,255,227, 4,211, 6,102, 16, 38, 0, 67,115, 0, + 18, 2, 1, 99, 0, 0, 0, 0,255,255, 0,103,255,227, 6,195, 7,240, 18, 34, 1, 98, 0, 0, 16, 7, 2, 81, 5, 39, 1,117, +255,255, 0,118,255,227, 4,211, 6,123, 18, 38, 1, 99, 0, 0, 16, 7, 2, 81, 4,125, 0, 0,255,255, 0,103,255,227, 6,195, + 5,240, 16, 39, 6,134, 5, 39, 1,117, 18, 2, 1, 98, 0, 0,255,255, 0,118,255,227, 4,211, 6, 55, 16, 38, 2, 53,115, 0, + 18, 2, 1, 99, 0, 0, 0, 0,255,255, 0,103,254,135, 6,195, 5,240, 18, 34, 1, 98, 0, 0, 16, 7, 2,107, 5, 39, 0, 0, +255,255, 0,118,254,135, 4,211, 4,235, 18, 34, 1, 99, 0, 0, 16, 7, 2,107, 4,115, 0, 0,255,255, 0,178,254,135, 5, 41, + 5,213, 16, 38, 0, 56, 0, 0, 16, 7, 2,107, 4,245, 0, 0,255,255, 0,174,254,135, 4, 88, 4, 96, 16, 38, 0, 88, 0, 0, + 16, 7, 2,107, 4,123, 0, 0,255,255, 0,178,255,227, 5, 41, 7,240, 18, 38, 0, 56, 0, 0, 16, 7, 2, 81, 4,238, 1,117, +255,255, 0,174,255,227, 4, 88, 6,123, 18, 38, 0, 88, 0, 0, 16, 7, 2, 81, 4,125, 0, 0,255,255, 0,173,255,247, 6, 95, + 5,233, 16, 39, 6,133, 4,238, 1,117, 18, 2, 1,113, 0, 0,255,255, 0,176,255,227, 5,105, 6,102, 16, 38, 0,118,123, 0, + 18, 2, 1,114, 0, 0, 0, 0,255,255, 0,173,255,247, 6, 95, 5,233, 16, 39, 6,135, 4,238, 1,117, 18, 2, 1,113, 0, 0, +255,255, 0,176,255,227, 5,105, 6,102, 16, 38, 0, 67,123, 0, 18, 2, 1,114, 0, 0, 0, 0,255,255, 0,173,255,247, 6, 95, + 7,240, 18, 34, 1,113, 0, 0, 16, 7, 2, 81, 4,238, 1,117,255,255, 0,176,255,227, 5,105, 6,123, 18, 34, 1,114, 0, 0, + 16, 7, 2, 81, 4,125, 0, 0,255,255, 0,173,255,247, 6, 95, 5,233, 16, 39, 6,134, 4,238, 1,117, 18, 2, 1,113, 0, 0, +255,255, 0,176,255,227, 5,105, 6, 55, 16, 35, 2, 53, 0,128, 0, 0, 18, 2, 1,114, 0, 0,255,255, 0,173,254,135, 6, 95, + 5,233, 18, 34, 1,113, 0, 0, 16, 7, 2,107, 4,245, 0, 0,255,255, 0,176,254,135, 5,105, 4,235, 18, 34, 1,114, 0, 0, + 16, 7, 2,107, 4,123, 0, 0,255,255,255,252, 0, 0, 4,231, 5,213, 18, 38, 0, 60, 0, 0, 16, 7, 6,135, 4,114, 1,124, +255,255, 0, 61,254, 86, 4,127, 6,107, 18, 38, 0, 92, 0, 0, 16, 6, 0, 67, 33, 5, 0, 0,255,255,255,252,254,130, 4,231, + 5,213, 16, 35, 2,107, 4,118,255,251, 18, 2, 0, 60, 0, 0,255,255, 0, 61,254, 86, 4,127, 4, 96, 16, 35, 2,107, 5,116, + 0, 0, 18, 2, 0, 92, 0, 0,255,255,255,252, 0, 0, 4,231, 7,247, 18, 38, 0, 60, 0, 0, 16, 7, 2, 81, 4,114, 1,124, +255,255, 0, 61,254, 86, 4,127, 6,130, 18, 38, 0, 92, 0, 0, 16, 7, 2, 81, 4, 96, 0, 7,255,255,255,252, 0, 0, 4,231, + 7, 69, 16, 99, 2, 53, 0,121, 2, 76, 64, 0, 51, 51, 18, 2, 0, 60, 0, 0,255,255, 0, 61,254, 86, 4,127, 6, 55, 16, 34, + 2, 53,119, 0, 18, 2, 0, 92, 0, 0, 0, 0, 0, 1, 1,134, 4,194, 2,120, 6, 97, 0, 8, 0, 72,180, 5, 8, 7, 2, 9, + 16,212, 60,220,178, 63, 8, 1, 93,192, 49,182, 0, 6, 7, 6, 3, 2, 9, 0, 16,212,180, 63, 2, 95, 2, 2, 93,176, 17, 75, + 80, 88,204, 27,192, 89,204,204,178, 63, 7, 1, 93, 17, 57, 48,177, 6, 3, 73,177, 7, 6, 73, 80, 88,179, 5, 64, 6, 64, 56, + 56, 89, 1, 16, 35, 53, 22, 53, 35, 53, 51, 2,120,242,134,133,241, 5,205,254,245,103, 3,157,158, 0, 0, 0,255,255, 1,115, + 4,238, 3, 82, 6,102, 16, 6, 0,118, 0, 0, 0, 1, 1,134, 4,194, 2,120, 6, 97, 0, 8, 0, 72,180, 2, 7, 4, 0, 9, + 16,212,192,220,178, 63, 7, 1, 93, 60, 49,182, 0, 3, 2, 3, 6, 7, 9, 0, 16,212,180, 63, 7, 95, 7, 2, 93,176, 17, 75, + 80, 88,204, 27,192, 89,204,204,178, 63, 2, 1, 93, 17, 57, 48,177, 3, 6, 73,177, 2, 3, 73, 80, 88,179, 3, 64, 4, 64, 56, + 56, 89, 1, 53, 51, 21, 35, 20, 55, 21, 34, 1,134,242,134,134,242, 5,205,148,158,157, 3,103, 0, 1, 0,100, 1,223, 2,127, + 2,131, 0, 3, 0, 17,182, 0,156, 2, 4, 1, 0, 4, 16,220,204, 49, 0, 16,212,236, 48, 19, 33, 21, 33,100, 2, 27,253,229, + 2,131,164, 0,255,255, 0,100, 1,223, 2,127, 2,131, 18, 6, 5,133, 0, 0, 0, 1, 0, 0, 1,233, 4, 0, 2,121, 0, 3, + 0, 16,182, 2,169, 0,233, 4, 1, 0, 47,198, 49, 0, 16,252,236, 48, 17, 33, 21, 33, 4, 0,252, 0, 2,121,144, 0, 0, 0, + 0, 1, 0, 0, 1,233, 4, 0, 2,121, 0, 3, 0, 16,182, 2,169, 0,233, 4, 1, 0, 47,198, 49, 0, 16,252,236, 48, 17, 33, + 21, 33, 4, 0,252, 0, 2,121,144, 0, 0, 0, 0, 1, 0, 0, 1,233, 8, 0, 2,121, 0, 3, 0, 15,181, 2,169, 0, 4, 1, + 0, 47,204, 49, 0, 16,212,236, 48, 17, 33, 21, 33, 8, 0,248, 0, 2,121,144, 0, 1, 0, 0, 1,233, 8, 0, 2,121, 0, 3, + 0, 15,181, 2,169, 0, 4, 1, 0, 47,204, 49, 0, 16,212,236, 48, 17, 33, 21, 33, 8, 0,248, 0, 2,121,144,255,255, 1, 4, +254, 29, 2,248, 6, 29, 16, 34, 0, 95, 0, 0, 16, 3, 0, 95, 1, 74, 0, 0,255,255,255,236,254, 29, 4, 20,255,238, 16, 38, + 0, 66, 0, 0, 16, 7, 0, 66, 0, 0, 1, 66, 0, 1, 0,174, 3,233, 1,211, 5,213, 0, 5, 0, 24, 64, 11, 0,158, 3,129, + 6, 3, 4, 0, 25, 1, 6, 16,220,252,212,204, 49, 0, 16,244,236, 48, 1, 35, 53, 19, 51, 3, 1,129,211,164,129, 82, 3,233, +173, 1, 63,254,193, 0, 0, 0, 0, 1, 0,178, 3,254, 1,215, 5,213, 0, 5, 0, 24, 64, 11, 3,158, 0,129, 6, 3, 4, 1, + 25, 0, 6, 16,220,236,212,204, 49, 0, 16,244,236, 48, 1, 51, 21, 3, 35, 19, 1, 4,211,164,129, 82, 5,213,152,254,193, 1, + 63, 0, 0, 0, 0, 1, 0,174,255, 18, 1,211, 0,254, 0, 5, 0, 24, 64, 11, 3,158, 0,131, 6, 3, 4, 1, 25, 0, 6, 16, +212,236,212,204, 49, 0, 16,252,236, 48, 37, 51, 21, 3, 35, 19, 1, 0,211,164,129, 82,254,172,254,192, 1, 64, 0, 1, 0,178, + 3,254, 1,215, 5,213, 0, 5, 0, 0, 1, 21, 19, 35, 3, 53, 1,133, 82,129,164, 5,213,152,254,193, 1, 63,152, 0, 0, 0, + 0, 2, 0,174, 3,233, 3,109, 5,213, 0, 5, 0, 11, 0, 39, 64, 19, 6, 0,158, 9, 3,129, 12, 9, 10, 6, 25, 7, 3, 4, + 7, 0, 25, 1, 12, 16,220,252,204,212,204, 16,254,212,206, 49, 0, 16,244, 60,236, 50, 48, 1, 35, 53, 19, 51, 3, 5, 35, 53, + 19, 51, 3, 1,129,211,164,129, 82, 1,154,211,164,129, 82, 3,233,173, 1, 63,254,193,173,173, 1, 63,254,193, 0, 2, 0,174, + 3,233, 3,109, 5,213, 0, 5, 0, 11, 0, 39, 64, 19, 9, 3,158, 6, 0,129, 12, 9, 10, 7, 25, 6, 1, 3, 4, 1, 25, 0, + 12, 16,220,236,212,204, 16,220,238,212,206, 49, 0, 16,244, 60,236, 50, 48, 1, 51, 21, 3, 35, 19, 37, 51, 21, 3, 35, 19, 1, + 0,211,164,129, 82, 1,154,211,164,129, 82, 5,213,172,254,192, 1, 64,172,172,254,192, 1, 64, 0, 2, 0,174,255, 18, 3,109, + 0,254, 0, 5, 0, 11, 0, 39, 64, 19, 9, 3,158, 6, 0,131, 12, 3, 4, 1, 25, 0, 7, 9, 10, 7, 25, 6, 12, 16,220,236, +212,204, 16,220,238,212,206, 49, 0, 16,252, 60,236, 50, 48, 37, 51, 21, 3, 35, 19, 37, 51, 21, 3, 35, 19, 2,154,211,164,129, + 82,254,102,211,164,129, 82,254,172,254,192, 1, 64,172,172,254,192, 1, 64, 0, 0, 2, 0,174, 3,233, 3,109, 5,213, 0, 5, + 0, 11, 0, 0, 1, 21, 19, 35, 3, 53, 33, 21, 19, 35, 3, 53, 1,129, 82,129,164, 2,109, 82,129,164, 5,213,173,254,193, 1, + 63,173,173,254,193, 1, 63,173, 0, 1, 0, 57,255, 59, 3,199, 5,213, 0, 11, 0, 39, 64, 20, 8, 4,185, 10, 2, 0,129, 6, +194, 12, 3, 89, 5, 1, 87, 9, 89, 7, 0, 12, 16,212, 60,236,252, 60,236, 49, 0, 16,228,244,212, 60,236, 50, 48, 1, 51, 17, + 33, 21, 33, 17, 35, 17, 33, 53, 33, 1,168,176, 1,111,254,145,176,254,145, 1,111, 5,213,254, 92,153,251,163, 4, 93,153, 0, + 0, 1, 0, 57,255, 59, 3,199, 5,213, 0, 19, 0, 62, 64, 32, 18, 6,185, 0, 16, 8,185, 10, 4, 0, 2, 14, 10, 12,129, 2, +194, 20, 15, 0, 89, 17, 13, 1, 87, 9, 5, 89, 11, 7, 3, 20, 16,212, 60, 60,236, 50,252, 60, 60,236, 50, 49, 0, 16,228,244, +196, 50, 16,196, 50, 16,238, 50, 16,238, 50, 48, 37, 33, 17, 35, 17, 33, 53, 33, 17, 33, 53, 33, 17, 51, 17, 33, 21, 33, 17, 33, + 3,199,254,145,176,254,145, 1,111,254,145, 1,111,176, 1,111,254,145, 1,111,223,254, 92, 1,164,154, 2, 31,153, 1,164,254, + 92,153,253,225, 0, 1, 1, 51, 1,209, 3,133, 4, 33, 0, 11, 0, 18,183, 9,199, 3, 12, 6, 92, 0, 12, 16,212,236, 49, 0, + 16,212,236, 48, 1, 52, 54, 51, 50, 22, 21, 20, 6, 35, 34, 38, 1, 51,173,126,124,171,172,125,125,172, 2,250,124,171,171,124, +125,172,172, 0, 0, 1, 1, 51, 1,129, 3,213, 4,113, 0, 2, 0, 0, 1, 17, 1, 1, 51, 2,162, 1,129, 2,240,254,136, 0, + 0, 1, 0,236, 0, 0, 1,193, 0,254, 0, 3, 0, 0, 55, 51, 21, 35,236,213,213,254,254, 0, 0, 2, 0,236, 0, 0, 4,107, + 0,254, 0, 3, 0, 7, 0, 0, 37, 51, 21, 35, 37, 51, 21, 35, 3,150,213,213,253, 86,213,213,254,254,254,254, 0, 3, 0,236, + 0, 0, 7, 20, 0,254, 0, 3, 0, 7, 0, 11, 0, 35, 64, 17, 8, 4, 0,131, 10, 6, 2, 4, 25, 5, 0, 25, 1, 9, 25, 8, + 12, 16,212,252,212,236,212,236, 49, 0, 47, 60, 60,236, 50, 50, 48, 37, 51, 21, 35, 37, 51, 21, 35, 37, 51, 21, 35, 3,150,212, +212, 2,169,213,213,250,173,213,213,254,254,254,254,254,254, 0, 0, 1, 0,220, 2,107, 1,175, 3,105, 0, 3, 0, 0, 19, 51, + 21, 35,220,211,211, 3,105,254, 0, 7, 0,113,255,227, 10, 76, 5,240, 0, 11, 0, 23, 0, 35, 0, 39, 0, 51, 0, 63, 0, 75, + 0,174, 64, 68, 36, 15, 37, 38, 37, 38, 15, 39, 36, 39, 66, 64, 0,146, 12, 46,146, 30,141, 40,146, 24, 70, 6,146, 52, 12,141, + 58, 38, 18,140, 36, 24,145, 76, 37, 73, 67, 39, 49, 43, 67, 13, 61, 9, 13, 15, 14, 3, 13, 21, 49, 13, 27, 61, 14, 73, 13, 21, + 55, 43, 13, 27, 14, 33, 11, 76, 16,252,228,236,212,196,236,228, 16,238, 16,238,246,238, 16,238, 17, 18, 57, 17, 18, 57, 49, 0, + 16,228, 50,244, 60, 60,228, 50,236, 50, 16,238,246,238, 16,238, 50, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 89, 34, 1, + 75,176, 20, 84, 75,176, 9, 84, 91, 75,176, 11, 84, 91, 75,176, 12, 84, 91, 75,176, 13, 84, 91, 75,176, 14, 84, 91, 88,189, 0, + 76, 0, 64, 0, 1, 0, 76, 0, 76,255,192, 56, 17, 55, 56, 89, 1, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 39, 50, 22, 21, + 20, 6, 35, 34, 38, 53, 52, 54, 1, 50, 22, 21, 20, 6, 35, 34, 38, 53, 52, 54, 33, 51, 1, 35, 19, 34, 6, 21, 20, 22, 51, 50, + 54, 53, 52, 38, 1, 50, 22, 21, 20, 6, 35, 34, 38, 53, 52, 54, 23, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 8,244, 87,100, +100, 87, 85, 99, 99, 85,158,186,187,157,160,186,187,249,116,158,188,187,159,159,185,186, 4, 37,160,252, 90,160, 31, 86, 99, 98, + 87, 87, 99,100, 3,178,158,186,187,157,160,186,187,159, 87, 99, 99, 87, 85, 99, 99, 2,145,148,132,130,149,149,130,131,149,127, +220,187,187,219,219,187,188,219, 2,224,219,187,189,218,219,188,186,220,249,243, 5,142,149,130,132,148,148,132,129,150,253,159, +220,187,187,219,219,187,188,219,127,148,132,130,149,149,130,131,149, 0, 0, 0, 0, 9, 0,113,255,227, 13,114, 5,240, 0, 11, + 0, 22, 0, 34, 0, 45, 0, 55, 0, 59, 0, 69, 0, 80, 0, 92, 0, 0, 1, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 39, 50, + 22, 16, 6, 35, 34, 38, 53, 52, 54, 5, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 39, 50, 22, 16, 6, 35, 34, 38, 53, 52, 54, + 0, 32, 22, 21, 20, 6, 32, 38, 53, 52, 37, 51, 1, 35, 18, 34, 6, 21, 20, 22, 50, 54, 53, 52, 1, 50, 22, 16, 6, 35, 34, 38, + 53, 52, 54, 23, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 12, 26, 87,100,100, 87, 85, 99, 99, 85,158,186,187,157,160,186,187, +253,121, 87,100,100, 87, 85, 99, 99, 85,158,186,187,157,160,186,187,248,214, 1, 60,188,187,254,194,185, 4,223,160,252, 90,160, +117,172, 99, 98,174, 99, 3, 78,158,186,187,157,160,186,187,159, 87, 99, 99, 87, 85, 99, 99, 2,145,148,132,130,149,149,130,131, +149,127,220,254,138,219,219,187,188,219,127,148,132,130,149,149,130,131,149,127,220,254,138,219,219,187,188,219, 2,224,219,187, +189,218,219,188,186,220,249,243, 5,142,149,130,132,148,148,132,129,254, 53,220,254,138,219,219,187,188,219,127,148,132,130,149, +149,130,131,149, 0, 1, 0, 40, 4, 96, 1,160, 5,213, 0, 3, 0, 0, 27, 1, 51, 1, 40,173,203,254,223, 4, 96, 1,117,254, +139, 0, 0, 0,255,255, 0, 40, 4, 96, 2,204, 5,213, 16, 38, 5,159, 0, 0, 16, 7, 5,159, 1, 44, 0, 0,255,255, 0, 40, + 4, 96, 3,248, 5,213, 16, 39, 5,159, 1, 44, 0, 0, 16, 38, 5,159, 0, 0, 16, 7, 5,159, 2, 88, 0, 0, 0, 1, 0, 40, + 4, 96, 1,160, 5,213, 0, 3, 0, 0, 1, 35, 1, 51, 1,160, 87,254,223,203, 4, 96, 1,117,255,255, 0, 40, 4, 96, 2,204, + 5,213, 16, 38, 5,162, 0, 0, 16, 7, 5,162, 1, 44, 0, 0,255,255, 0, 40, 4, 96, 3,248, 5,213, 16, 38, 5,162, 0, 0, + 16, 39, 5,162, 2, 88, 0, 0, 16, 7, 5,162, 1, 44, 0, 0, 0, 1, 0, 11,254, 29, 2,171,255,195, 0, 5, 0, 0, 1, 35, + 39, 7, 35, 1, 2,171,148,187,188,149, 1, 82,254, 29,249,249, 1,166, 0, 0, 0, 1, 0,158, 0,141, 2,115, 4, 35, 0, 6, + 0, 71, 64, 37, 3,232, 4, 5, 4, 2,232, 1, 2, 5, 5, 4, 2,232, 3, 2, 6, 0, 6, 1,232, 0, 6, 66, 2, 4,231, 0, +166, 7, 2, 3, 0,111, 5,110, 7, 16,252,236, 50, 57, 49, 0, 16,244,236, 57, 48, 75, 83, 88, 7, 4,237, 7, 16, 8,237, 7, + 16, 8,237, 7, 16, 4,237, 89, 34, 1, 21, 9, 1, 21, 1, 53, 2,115,254,211, 1, 45,254, 43, 4, 35,191,254,244,254,244,191, + 1,162, 82, 0, 0, 1, 0,193, 0,141, 2,150, 4, 35, 0, 6, 0, 73, 64, 38, 5,232, 6, 5, 2, 3, 2, 4,232, 3, 3, 2, + 6,232, 0, 1, 0, 5,232, 4, 5, 1, 1, 0, 66, 5, 3,231, 0,166, 7, 5, 1,111, 3, 0,112, 7, 16,252, 60,236, 57, 49, + 0, 16,244,236, 57, 48, 75, 83, 88, 7, 16, 8,237, 7, 16, 4,237, 7, 16, 4,237, 7, 16, 8,237, 89, 34, 19, 1, 21, 1, 53, + 9, 1,193, 1,213,254, 43, 1, 45,254,211, 4, 35,254, 94, 82,254, 94,191, 1, 12, 1, 12, 0,255,255, 0,195, 0, 4, 5,235, + 5,204, 18, 34, 0,153, 0, 75, 16, 35, 0, 17,255,232, 2, 78, 16, 35, 0, 17, 2, 22, 0, 4, 16, 35, 0, 17, 4, 61, 2, 78, + 16, 3, 0, 17, 2, 22, 4,206,255,255, 0,147, 0, 0, 3, 79, 5,213, 16, 39, 0, 4,255, 94, 0, 0, 16, 7, 0, 4, 1, 79, + 0, 0, 0, 0, 0, 3, 0,147, 0, 0, 3,176, 5,240, 0, 23, 0, 27, 0, 36, 0, 0, 1, 35, 17, 6, 7, 6, 7, 53, 62, 1, + 51, 50, 22, 21, 20, 6, 15, 1, 14, 1, 7, 14, 1, 21, 3, 51, 21, 35, 19, 17, 55, 62, 1, 53, 52, 39, 38, 2, 76,191, 31, 32, + 90, 97, 94,193,103,184,223, 72, 90, 88, 47, 39, 8, 6, 6,197,203,203,197, 45, 57, 51, 65, 37, 1,145, 3,173, 8, 13, 35, 67, +188, 57, 56,194,159, 76,137, 86, 86, 47, 53, 25, 21, 60, 52,254,242,254, 5, 66,254, 82, 45, 53, 94, 49, 89, 55, 31, 0, 0, 0, +255,255,255,236, 5,124, 4, 20, 6, 11, 16, 7, 0, 66, 0, 0, 7, 95, 0, 0, 0, 1,255,167,254, 27, 6,199,255,133, 0, 13, + 0, 37,179, 4, 15, 10, 14, 16,196,212,196,179, 7, 0, 15, 14, 17, 18, 57, 57, 49, 64, 7, 11, 3, 10, 4, 7, 0, 14, 0, 16, +212,220,220, 60,204, 50, 48, 1, 50, 36, 55, 21, 6, 4, 35, 34, 36, 39, 53, 22, 4, 3, 54,231, 1,197,229,235,254, 58,224,223, +254, 60,236,230, 1,194,254,181,104,104,126,118,118,117,119,126,105,103, 0, 0, 0, 1,255,167, 6, 4, 6,199, 7,110, 0, 13, + 0, 37,179, 4, 15, 10, 14, 16,196,212,196,179, 7, 0, 15, 14, 17, 18, 57, 57, 49, 64, 7, 10, 4, 11, 3, 0, 7, 14, 0, 16, +212,220,220, 60,204, 50, 48, 1, 50, 4, 23, 21, 38, 36, 35, 34, 4, 7, 53, 54, 36, 3, 54,224, 1,198,235,229,254, 59,231,231, +254, 62,230,236, 1,196, 7,110,118,118,126,104,104,103,105,126,119,117, 0, 0, 0, 1,255,170,254, 29, 2, 73, 1,213, 0, 7, + 0, 0, 1, 51, 9, 1, 35, 11, 1, 35, 1,231, 98,254,226, 1, 30, 98,237,237, 99, 1,213,254, 36,254, 36, 1,138,254,118, 0, +255,255, 0, 61,255,197, 7,195, 6,131, 16, 35, 0, 13, 0, 0,253,123, 16, 35, 0, 13, 4, 0,253,123, 16, 3, 0, 13, 2, 0, + 0,147, 0, 0,255,255, 0,221, 2,129, 3, 51, 3, 95, 18, 67, 2, 34, 0, 8,250,110, 64, 0, 96, 0, 0, 0, 0, 1,254,137, +255,227, 2,205, 5,240, 0, 3, 0, 43, 64, 19, 0, 15, 1, 2, 1, 2, 15, 3, 0, 3, 66, 2,140, 0,145, 4, 1, 3, 4, 16, +212,204, 49, 0, 16,228,228, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 89, 34, 1, 51, 1, 35, 2, 45,160,252, 92,160, 5, +240,249,243, 0, 0, 1, 0,176,254,242, 2, 88, 6, 20, 0, 11, 0, 0, 1, 17, 51, 21, 33, 17, 33, 21, 35, 17, 51, 21, 1,104, +240,254, 88, 1,168,240,240, 2, 94,253, 35,143, 7, 34,143,253, 35, 74, 0, 0, 0, 1, 0,176,254,242, 2, 88, 6, 20, 0, 11, + 0, 0, 19, 53, 51, 17, 35, 53, 33, 17, 33, 53, 51, 17,176,240,240, 1,168,254, 88,240, 2, 94, 74, 2,221,143,248,222,143, 2, +221, 0, 0, 0,255,255, 0, 73, 0, 0, 7, 23, 5,240, 16, 38, 0, 34,182, 0, 16, 7, 0, 34, 3,102, 0, 0,255,255, 0,147, + 0, 0, 5, 74, 5,240, 16, 38, 0, 34, 0, 0, 16, 7, 0, 4, 3, 74, 0, 0,255,255, 0,147, 0, 0, 5, 74, 5,240, 16, 39, + 0, 4,255, 94, 0, 0, 16, 7, 0, 34, 1,154, 0, 0, 0, 0, 0, 1, 0,111, 0, 0, 3,161, 4,132, 0, 19, 0, 0, 37, 51, + 21, 35, 53, 7, 35, 19, 35, 53, 33, 19, 33, 53, 33, 21, 3, 51, 21, 35, 1,254,169,209, 3,180,224,249, 1, 36,168,253,157, 3, + 50,195,165,208,102,102, 7, 7, 2, 15,102, 1,139,132, 67,254, 52,102, 0, 0, 0, 1, 0,236,255, 59, 4,135, 5,213, 0, 13, + 0, 0, 1, 33, 17, 51, 17, 51, 17, 51, 17, 62, 1, 53, 52, 36, 2,172,254, 64,141,190,142,215,235,254,252, 5,213,249,102, 6, + 31,249,225, 3, 78, 17,221,184,190,232, 0, 0, 0, 2, 0,216, 1,194, 3, 40, 4, 18, 0, 3, 0, 11, 0, 0, 1, 51, 17, 7, + 43, 1, 34, 38, 53, 52, 54, 51, 2,121,175,175,118, 2,125,172,173,126, 4, 18,253,177, 1,172,125,124,171, 0, 0, 2, 0,216, + 1,194, 3, 40, 4, 18, 0, 3, 0, 11, 0, 0, 1, 39, 17, 59, 1, 50, 22, 21, 20, 6, 43, 1, 1,135,175,175,118,126,173,172, +125, 2, 1,194, 1, 2, 79,171,124,125,172, 0,255,255, 0, 61,255,197, 3,195, 3,107, 18, 3, 0, 13, 0, 0,253,123, 0, 0, + 0, 2, 1, 29,255, 18, 2, 66, 4, 35, 0, 3, 0, 9, 0, 0, 1, 35, 21, 51, 17, 35, 21, 19, 51, 3, 1,240,211,211,211,164, +129, 82, 4, 35,254,253,217,172,254,192, 1, 64,255,255,255,167,254, 27, 6,199, 7,110, 16, 38, 5,172, 0, 0, 16, 6, 5,173, + 0, 0, 0, 0,255,255, 0, 61,255,242, 3,195, 7,111, 18, 35, 0, 13, 0, 0,253,168, 16, 3, 0, 13, 0, 0, 1,127, 0, 0, +255,255, 0,145,255, 66, 3, 67, 5,213, 16, 35, 0, 18, 0,145, 0, 0, 16, 35, 0, 17, 1,142, 0, 0, 16, 3, 0, 17,255,217, + 4, 72, 0, 0,255,255, 0,217, 1,211, 5,219, 3, 49, 18, 2, 0, 97, 0, 0,255,255,255,167,254, 20, 6,199,255,126, 16, 7, + 5,173, 0, 0,248, 16, 0, 0, 0, 1, 1, 56, 0,200, 5,124, 5, 13, 0, 23, 0, 0, 1, 17, 35, 17, 7, 39, 55, 33, 53, 33, + 39, 55, 23, 17, 51, 17, 55, 23, 7, 33, 21, 33, 23, 7, 3,170,160,249,113,249,254,159, 1, 97,250,113,250,160,250,113,250, 1, + 97,254,159,250,113, 2, 41,254,159, 1, 96,249,114,249,160,250,114,251, 1, 98,254,158,250,113,250,160,249,114, 0, 3, 0,250, + 1, 50, 3,182, 4,182, 0, 3, 0, 7, 0, 11, 0, 0, 19, 53, 51, 21, 1, 53, 51, 21, 3, 53, 51, 21,250,200, 1, 44,200,200, +200, 2,144,200,200,254,162,200,200, 2,188,200,200, 0, 0, 0,255,255, 0, 40, 4, 96, 5, 36, 5,213, 16, 39, 5,159, 1, 44, + 0, 0, 16, 38, 5,159, 0, 0, 16, 39, 5,159, 3,132, 0, 0, 16, 7, 5,159, 2, 88, 0, 0, 0, 4, 1,102, 1, 0, 5, 78, + 4,232, 0, 3, 0, 7, 0, 11, 0, 15, 0, 0, 1, 53, 51, 21, 33, 53, 51, 21, 1, 53, 51, 21, 3, 53, 51, 21, 1,102,200, 2, + 88,200,253,168,200,200,200, 2,144,200,200,200,200,254,112,200,200, 3, 32,200,200, 0, 0, 0, 0, 5, 1,102, 0,246, 5, 78, + 4,222, 0, 3, 0, 7, 0, 11, 0, 15, 0, 19, 0, 0, 1, 53, 51, 21, 19, 53, 51, 21, 3, 53, 51, 21, 1, 53, 51, 21, 3, 53, + 51, 21, 2,246,200,200,200,200,200,252, 44,200,220,200, 2,134,200,200,254,112,200,200, 3, 32,200,200,252,244,200,200, 3, 12, +200,200, 0, 0, 0, 2, 0,219, 0, 0, 1,174, 5,213, 0, 3, 0, 7, 0, 0, 19, 51, 21, 35, 17, 51, 21, 35,219,211,211,211, +211, 5,213,254,252, 39,254, 0, 0, 4, 0,100,254,229, 5,253, 6,239, 0, 3, 0, 7, 0, 11, 0, 15, 0, 0, 19, 51, 21, 35, + 37, 51, 21, 35, 1, 51, 21, 35, 17, 51, 21, 35,100,211,211, 4,198,211,211,253,157,211,211,211,211, 3,105,254,254,254, 4,132, +254,249,242,254, 0, 5, 0,112, 0, 0, 6, 68, 5,213, 0, 3, 0, 7, 0, 11, 0, 15, 0, 27, 0, 0, 37, 53, 51, 21, 3, 53, + 51, 21, 1, 53, 51, 21, 3, 53, 51, 21, 1, 17, 35, 17, 33, 53, 33, 17, 51, 17, 33, 21, 4,134,200,200,200,252, 44,200,220,200, + 1,124,160,253,102, 2,154,160, 2,154,246,200,200, 3, 32,200,200,252,244,200,200, 3, 12,200,200,254,132,253,102, 2,154,160, + 2,155,253,101,160, 0, 0, 0, 0, 3, 0,219, 0, 80, 1,174, 5, 62, 0, 3, 0, 7, 0, 11, 0, 0, 19, 51, 21, 35, 17, 51, + 21, 35, 17, 51, 21, 35,219,211,211,211,211,211,211, 5, 62,254,253, 14,254, 2,246,254, 0, 0, 0, 4, 0,219, 0, 17, 1,174, + 5,119, 0, 3, 0, 7, 0, 11, 0, 15, 0, 0, 19, 51, 21, 35, 17, 51, 21, 35, 17, 51, 21, 35, 17, 51, 21, 35,219,211,211,211, +211,211,211,211,211, 2,137,254, 3,236,254,252,150,254, 3,240,254, 0, 0, 0, 0, 2, 0, 87, 2,141, 2,238, 5,240, 0, 13, + 0, 25, 0, 0, 0, 34, 7, 6, 21, 20, 23, 22, 50, 55, 54, 53, 52, 47, 1, 50, 22, 21, 20, 6, 35, 34, 38, 53, 52, 54, 2, 8, +202, 50, 51, 51, 50,202, 50, 51, 51,151,161,170,170,161,162,170,170, 5,151, 86, 86,172,173, 86, 86, 86, 86,173,172, 86,175,222, +211,212,222,222,212,211,222, 0, 0, 2, 0,121, 2,156, 0,238, 6, 4, 0, 3, 0, 7, 0, 31, 64, 6, 9, 5, 1, 4, 0, 8, + 16,220, 60,220, 60,204, 49, 0, 64, 6, 4, 7, 0, 3, 0, 8, 16,212,196, 16,220,204, 48, 19, 51, 17, 35, 17, 51, 21, 35,122, +116,116,116,116, 5, 15,253,141, 3,103,130, 0, 0, 2, 0, 63, 2,156, 2,244, 5,223, 0, 2, 0, 13, 0,212, 64, 22, 0, 3, + 11, 7,221, 5, 1, 9,247, 3,145, 14, 1, 12, 10, 0, 93, 6, 8, 4, 12, 14, 16,220,212, 60,196,236, 50, 17, 57, 49, 0, 16, +244,252,212, 60,236, 50, 18, 57, 48, 1, 75,176, 14, 84, 75,176, 15, 84, 91, 75,176, 16, 84, 91, 75,176, 17, 84, 91, 75,176, 11, + 84, 91, 75,176, 10, 84, 91, 88,189, 0, 14, 0, 64, 0, 1, 0, 14, 0, 14,255,192, 56, 17, 55, 56, 89, 0, 75,176, 17, 84, 75, +176, 14, 84, 91, 88,189, 0, 14,255,192, 0, 1, 0, 14, 0, 14, 0, 64, 56, 17, 55, 56, 89, 64, 84, 11, 1, 29, 1, 47, 1, 57, + 1, 73, 1, 70, 3, 89, 3,105, 3,139, 3,171, 3,187, 3, 11, 1, 0, 15, 1, 15, 2, 15, 5, 15, 6, 15, 7, 15, 8, 15, 11, + 15, 12, 15, 13, 19, 0, 31, 1, 31, 2, 31, 5, 31, 6, 31, 7, 31, 8, 31, 11, 31, 12, 31, 13, 34, 0, 53, 0, 71, 0, 75, 13, + 83, 0, 91, 13,101, 0,132, 0,165, 0,181, 0, 30, 93, 1, 93, 9, 1, 33, 3, 51, 17, 51, 21, 35, 21, 35, 53, 33, 53, 1,221, +254,203, 1, 53, 22,166,135,135,144,254, 98, 5,102,254, 93, 2, 28,253,228,109,186,186,121, 0, 0, 1, 0,102, 2,141, 2,211, + 5,223, 0, 32, 0, 0, 19, 33, 21, 33, 21, 54, 55, 54, 51, 50, 23, 22, 21, 20, 7, 6, 35, 34, 38, 39, 53, 22, 23, 22, 51, 50, + 54, 52, 38, 35, 34, 6, 7,142, 1,254,254,121, 28, 29, 28, 28,161, 94, 94, 97, 96,176, 60,126, 66, 57, 62, 62, 69,111,130,130, +111, 52,104, 54, 5,223, 95,204, 9, 4, 4, 77, 76,131,135, 75, 74, 18, 18,113, 27, 14, 13,102,174,102, 20, 21, 0, 2, 0, 92, + 2,141, 2,243, 5,240, 0, 15, 0, 47, 0, 0, 1, 34, 7, 6, 21, 20, 23, 22, 51, 50, 55, 54, 53, 52, 39, 38, 19, 21, 38, 39, + 38, 35, 34, 7, 6, 7, 54, 55, 54, 51, 50, 23, 22, 21, 20, 7, 6, 35, 34, 38, 53, 52, 55, 54, 51, 50, 23, 22, 1,179, 88, 51, + 51, 51, 51, 88, 87, 51, 51, 51, 51,171, 49, 50, 50, 49,128, 68, 68, 10, 38, 57, 58, 68,145, 84, 84, 88, 87,145,167,176,108,108, +182, 49, 50, 50, 4,109, 52, 53, 91, 90, 52, 53, 53, 52, 90, 91, 53, 52, 1, 98,103, 20, 10, 11, 75, 76,153, 49, 26, 26, 76, 77, +132,127, 79, 78,222,212,198,117,118, 8, 9, 0, 0, 1, 0,108, 2,156, 2,213, 5,223, 0, 6, 0, 0, 19, 33, 21, 1, 35, 1, + 33,108, 2,105,254,164,136, 1, 72,254, 51, 5,223, 48,252,237, 2,228, 0, 0, 0, 3, 0, 89, 2,141, 2,236, 5,240, 0, 12, + 0, 42, 0, 58, 0, 0, 0, 34, 7, 6, 21, 20, 22, 51, 50, 55, 54, 52, 39, 37, 38, 39, 38, 53, 52, 54, 32, 23, 22, 21, 20, 7, + 6, 7, 22, 23, 22, 21, 20, 7, 6, 35, 34, 39, 38, 53, 52, 55, 54, 55, 20, 23, 22, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 7, + 6, 2, 0,186, 53, 53,106, 93, 92, 54, 53, 53,254,236, 84, 46, 47,164, 1, 30, 82, 81, 46, 47, 83, 90, 56, 53, 85, 86,158,159, + 85, 86, 53, 54, 45, 47, 46, 85, 81, 49, 48, 48, 47, 83, 83, 48, 47, 4, 42, 44, 43, 75, 76, 86, 44, 43,150, 43, 93, 18, 49, 50, + 72,100,116, 58, 58,100, 74, 48, 49, 18, 18, 58, 55, 80,121, 65, 65, 65, 65,121, 78, 57, 56,198, 63, 38, 37, 37, 36, 65, 63, 38, + 37, 37, 36, 0, 0, 2, 0, 83, 2,141, 2,233, 5,240, 0, 31, 0, 46, 0, 0, 19, 53, 22, 23, 22, 51, 50, 55, 54, 55, 6, 7, + 6, 35, 34, 38, 53, 52, 55, 54, 51, 50, 23, 22, 21, 20, 7, 6, 35, 34, 39, 38, 19, 50, 54, 53, 52, 39, 38, 35, 34, 7, 6, 21, + 20, 23, 22,145, 49, 50, 50, 48,129, 68, 67, 10, 35, 60, 57, 69,144,168, 87, 88,145,167, 87, 88,107,108,182, 49, 50, 50,204, 88, +102, 51, 51, 88, 85, 53, 52, 52, 51, 2,174,103, 20, 11, 10, 75, 75,154, 47, 27, 26,152,132,129, 77, 78,111,111,212,198,117,118, + 8, 9, 1,114,104, 92, 90, 52, 53, 53, 52, 90, 92, 52, 52, 0, 0, 1, 0,137, 2,156, 3,176, 5,107, 0, 11, 0, 0, 1, 17, + 33, 21, 33, 17, 35, 17, 33, 53, 33, 17, 2, 81, 1, 95,254,161,105,254,161, 1, 95, 5,107,254,200, 95,254,200, 1, 56, 95, 1, + 56, 0, 0, 0, 0, 1, 0,137, 3,212, 3,176, 4, 51, 0, 3, 0, 0, 19, 33, 21, 33,137, 3, 39,252,217, 4, 51, 95, 0, 0, + 0, 2, 0,137, 3, 97, 3,176, 4,165, 0, 3, 0, 7, 0, 0, 19, 33, 21, 33, 21, 33, 21, 33,137, 3, 39,252,217, 3, 39,252, +217, 4,165, 94,135, 95, 0, 0, 0, 1, 0,111, 2, 5, 1,144, 6, 2, 0, 13, 0, 0, 1, 14, 1, 16, 22, 23, 35, 38, 39, 38, + 52, 55, 54, 55, 1,144, 84, 82, 82, 84,101, 94, 47, 47, 47, 46, 95, 6, 2,129,252,254,254,254,128,131,128,127,250,127,126,132, + 0, 1, 0,103, 2, 5, 1,136, 6, 2, 0, 15, 0, 0, 19, 51, 22, 23, 22, 20, 7, 6, 7, 35, 54, 55, 54, 16, 39, 38,103,101, + 95, 47, 46, 46, 47, 95,101, 84, 41, 42, 42, 41, 6, 2,132,126,127,250,127,128,131,128,127,127, 1, 2,126,126, 0, 1, 0,117, + 2,156, 2,197, 5, 31, 0, 19, 0, 48, 64, 7, 21, 0, 3, 14, 10, 11, 20, 16,212,220, 60, 47,204,204, 75,176, 13, 81, 88,177, + 21, 64, 56, 89, 49,178,127, 21, 1, 93, 0, 64, 6, 6, 17, 12, 2, 11, 20, 16,212, 60,196,212,204, 48, 1, 17, 35, 17, 52, 38, + 35, 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 22, 2,196,116, 78, 78, 94,108,117,117, 41,113, 74,121,125, 4, 23,254,133, + 1,119, 89, 89,107, 92,254,158, 2,115, 97, 56, 56,134, 0, 0,255,255, 0, 87,255,241, 2,238, 3, 84, 16, 7, 5,204, 0, 0, +253,100, 0, 0,255,255, 0,137, 0, 0, 2,197, 3, 67, 16, 7, 0,123, 0, 0,253,100, 0, 0,255,255, 0, 94, 0, 0, 2,180, + 3, 84, 16, 7, 0,116, 0, 0,253,100, 0, 0,255,255, 0, 98,255,241, 2,205, 3, 84, 16, 7, 0,117, 0, 0,253,100, 0, 0, +255,255, 0, 63, 0, 0, 2,244, 3, 67, 16, 7, 5,206, 0, 0,253,100, 0, 0,255,255, 0,102,255,241, 2,211, 3, 67, 16, 7, + 5,207, 0, 0,253,100, 0, 0,255,255, 0, 92,255,241, 2,243, 3, 84, 16, 7, 5,208, 0, 0,253,100, 0, 0,255,255, 0,108, + 0, 0, 2,213, 3, 67, 16, 7, 5,209, 0, 0,253,100, 0, 0,255,255, 0, 89,255,241, 2,236, 3, 84, 16, 7, 5,210, 0, 0, +253,100, 0, 0,255,255, 0, 83,255,241, 2,233, 3, 84, 16, 7, 5,211, 0, 0,253,100, 0, 0,255,255, 0,137, 0, 0, 3,176, + 2,207, 16, 7, 5,212, 0, 0,253,100, 0, 0,255,255, 0,137, 1, 56, 3,176, 1,151, 16, 7, 5,213, 0, 0,253,100, 0, 0, +255,255, 0,137, 0,197, 3,176, 2, 9, 16, 7, 5,214, 0, 0,253,100, 0, 0,255,255, 0,111,255,105, 1,144, 3,102, 16, 7, + 5,215, 0, 0,253,100, 0, 0,255,255, 0,103,255,105, 1,136, 3,102, 16, 7, 5,216, 0, 0,253,100, 0, 0, 0, 1, 0, 86, + 0, 0, 6,174, 5,214, 0, 35, 0, 0, 1, 14, 1, 35, 34, 0, 16, 0, 51, 50, 22, 23, 21, 46, 1, 35, 34, 6, 16, 22, 51, 50, + 54, 55, 17, 33, 21, 33, 17, 33, 21, 33, 17, 33, 21, 33, 3,221, 79,178, 99,254,254,219, 1, 37,254,101,177, 78, 76,173, 98,192, +204,204,192, 98,173, 76, 2,196,253,211, 2, 22,253,234, 2, 58,253, 47, 1,184, 54, 54, 1, 55, 2, 28, 1, 55, 53, 54,159, 71, + 70,234,254, 68,234, 70, 71, 2, 10,128,254,181,128,254,107,128, 0, 3, 0,115,255,166, 4,190, 6, 57, 0, 39, 0, 46, 0, 52, + 0, 0, 1, 22, 23, 55, 51, 7, 22, 23, 21, 38, 39, 1, 51, 50, 54, 55, 21, 14, 1, 35, 34, 39, 7, 35, 55, 38, 39, 7, 35, 55, + 38, 39, 38, 17, 16, 55, 54, 37, 55, 51, 7, 6, 7, 6, 17, 20, 23, 1, 38, 39, 1, 22, 23, 3,104, 65, 62, 30,155, 47, 40, 37, + 58, 64,254,193, 18,119,211, 93, 97,216,121, 27, 26, 18,155, 25, 65, 57, 38,155, 65, 19, 17,178,178,160, 1, 8, 21,156,227,145, + 88,125, 82, 2, 52, 62, 67,254,193, 53, 65, 5,235, 8, 19,105,165, 22, 28,213, 60, 41,251,151, 94, 95,211, 72, 72, 2, 63, 87, + 18, 30,135,230, 18, 21,207, 1,103, 1,104,208,185, 20, 75,252, 31,112,157,254,216,238,148, 3,203, 19, 4,251,149, 40, 21, 0, + 0, 1, 0, 96,255,228, 4,179, 5,240, 0, 44, 0, 0, 37, 54, 55, 54, 55, 21, 14, 1, 35, 32, 0, 17, 16, 0, 33, 50, 22, 23, + 21, 46, 1, 35, 34, 2, 17, 16, 23, 22, 23, 17, 51, 21, 62, 1, 51, 50, 22, 31, 1, 46, 1, 35, 34, 6, 21, 3, 46, 97, 88,106, + 93, 97,217,121,254,202,254,155, 1,101, 1, 54,123,217, 95, 93,212,119,234,249,124, 94,153,152, 48,154,110, 15, 38, 23, 1, 26, + 60, 36,128,139,138, 7, 39, 47, 95,211, 72, 71, 1,158, 1,103, 1,104, 1,159, 71, 71,213, 95, 94,254,199,254,216,254,217,156, +117, 30, 3, 93,157, 92, 89, 4, 5,170, 16, 15,182,171, 0, 0, 0, 1, 0,133, 0, 0, 4,203, 5,213, 0, 17, 0, 0, 1, 17, + 33, 21, 33, 17, 33, 21, 33, 17, 51, 21, 35, 17, 35, 17, 35, 53, 1,113, 3, 90,253,112, 2, 80,253,176,250,250,202,236, 1,126, + 4, 87,170,254, 72,170,254,181, 69,254,199, 1, 57, 69, 0, 0, 0, 1, 0,129, 0, 0, 4, 98, 5,240, 0, 35, 0, 0, 1, 17, + 33, 21, 33, 53, 51, 17, 35, 53, 51, 53, 35, 53, 51, 53, 16, 54, 51, 50, 22, 23, 21, 46, 1, 35, 34, 6, 29, 1, 33, 21, 33, 21, + 33, 21, 2, 53, 2, 45,252, 31,236,191,191,199,199,214,232, 61,151, 79, 76,136, 61,148,116, 1,135,254,121, 1,143, 1,236,254, +190,170,170, 1, 66,143,143,143, 95, 1, 5,243, 31, 29,182, 41, 41,155,212, 72,143,143,143, 0, 0, 1, 0,186,255,189, 7, 29, + 4,171, 0, 42, 0, 0, 1, 22, 23, 62, 1, 51, 50, 22, 21, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 17, 52, 39, 1, 35, 1, + 38, 35, 34, 6, 21, 17, 35, 17, 51, 21, 62, 1, 51, 50, 23, 55, 51, 3,204, 61, 32, 69,192,130,175,190,185,114,117,143,166,185, + 14,254,240,128, 1, 59, 53, 81,141,166,185,185, 63,176,121, 74, 60, 22,128, 4, 33, 59, 93,124,118,245,226,253, 92, 2,158,161, +156,190,164,253,135, 2,158, 82, 60,252,145, 3,250, 36,191,163,253,135, 4, 96,174,103, 98, 23, 71, 0, 0, 0, 0, 5, 0,117, + 0, 0, 5,135, 5,213, 0, 2, 0, 6, 0, 34, 0, 38, 0, 41, 0, 0, 1, 39, 21, 19, 39, 35, 21, 3, 33, 19, 51, 17, 51, 17, + 51, 21, 35, 21, 51, 21, 35, 17, 33, 3, 35, 17, 35, 17, 35, 53, 51, 53, 35, 53, 51, 5, 23, 51, 53, 3, 23, 53, 2, 75, 79,182, + 56,126,196, 1, 16,211,229,196,195,195,195,195,254,240,211,229,196,195,195,195,195, 2, 18, 56,126, 79, 79, 3,175,206,206,254, +242,147,147, 3, 52,253,218, 2, 38,253,218,123,147,123,253,218, 2, 38,253,218, 2, 38,123,147,123,123,147,147,254,242,206,206, + 0, 2, 0,201,255,227, 9,206, 5,213, 0, 8, 0, 80, 0, 0, 1, 17, 51, 50, 54, 53, 52, 38, 35, 1, 6, 7, 6, 43, 1, 17, + 35, 17, 33, 50, 23, 22, 23, 51, 17, 51, 17, 33, 21, 33, 17, 20, 22, 59, 1, 53, 30, 1, 51, 50, 54, 53, 52, 38, 47, 1, 46, 1, + 53, 52, 54, 51, 50, 22, 23, 21, 46, 1, 35, 34, 6, 21, 20, 22, 31, 1, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 35, 34, 38, 53, + 17, 1,135,239,133,145,145,133, 1,221, 6,113,122,236,239,190, 1,173,236,122, 87, 24, 81,174, 1,101,254,155, 71,108,171, 96, +187, 91,122,132, 95,161, 60,161,143,211,194, 96,169, 72, 74,158, 85,129,129, 93,139, 59,185,155,233,203, 85,183,102,171,201,152, + 5, 47,253,207,146,135,134,146,254,204,200,106,113,253,168, 5,213,113, 82,136, 1, 62,254,194,143,253,160,137, 78, 35, 53, 53, + 89, 81, 75, 80, 37, 15, 36,149,130,158,172, 30, 30,174, 40, 40, 84, 84, 64, 73, 33, 14, 42,153,137,156,182, 35, 35, 1,159,210, + 2, 96, 0, 0, 0, 2, 0,201,255,227, 8, 51, 5,213, 0, 7, 0, 69, 0, 0, 1, 17, 51, 50, 54, 16, 38, 35, 1, 23, 35, 3, + 46, 1, 43, 1, 17, 35, 17, 33, 32, 22, 21, 20, 6, 7, 30, 1, 31, 1, 22, 23, 22, 51, 50, 54, 53, 52, 38, 47, 1, 46, 1, 53, + 52, 54, 51, 50, 22, 23, 21, 46, 1, 35, 34, 6, 21, 20, 22, 31, 1, 30, 1, 21, 20, 6, 35, 34, 39, 38, 1,147,254,146,149,149, +146, 2,191, 4,217,191, 74,139,120,220,202, 1,200, 1, 0,252,131,125, 65,123, 62, 91, 98, 96, 99, 97,130,140,101,171, 64,171, +152,224,206,102,180, 76, 78,168, 90,137,137, 98,148, 63,196,165,247,216, 90, 97, 44, 5, 47,253,238,135, 1, 6,133,250,216, 7, + 1,127,150, 98,253,137, 5,213,214,216,141,186, 36, 22,144,126,180, 51, 25, 27, 89, 81, 75, 80, 37, 15, 36,149,130,158,172, 30, + 30,174, 40, 40, 84, 84, 64, 73, 33, 14, 42,153,137,156,182, 18, 8, 0, 0, 0, 0, 6, 0, 59, 0, 0, 7,174, 5,213, 0, 31, + 0, 34, 0, 38, 0, 41, 0, 45, 0, 49, 0, 0, 19, 39, 35, 53, 51, 39, 51, 23, 33, 55, 51, 23, 33, 55, 51, 7, 51, 21, 35, 7, + 51, 21, 35, 3, 35, 3, 35, 3, 35, 3, 35, 53, 5, 27, 1, 1, 23, 33, 55, 1, 27, 2, 7, 51, 39, 33, 23, 33, 55,182, 30, 93, + 58, 49,204, 48, 2, 19, 48,227, 48, 2, 19, 48,205, 49, 57, 93, 29,122,158,225,254,218,195,220,254,224,159, 4,192,165,165,254, +117, 29, 1,145, 29,251, 32,165,165,229, 29,125, 28,253, 76, 29, 1,145, 29, 4, 15,117,143,194,194,194,194,194,194,143,117,143, +252,128, 3,128,252,128, 3,128,143,143,253,103, 2,153, 1, 4,117,117,254,252,253,103, 2,153, 1, 4,117,117,117,117, 0, 0, + 0, 2, 0, 95,255,227, 5,241, 5,213, 0, 13, 0, 27, 0, 0, 19, 37, 32, 0, 25, 1, 35, 17, 52, 38, 35, 33, 17, 35, 41, 1, + 34, 0, 25, 1, 51, 17, 20, 22, 51, 33, 3, 51, 95, 2, 7, 0,255, 1, 6,184,157,176,254,177,184, 5,142,253,253,255,254,250, +184,157,176, 1, 83, 4,184, 5,210, 3,254,214,254,220,254,145, 1, 86,240,211,250,178, 1, 42, 1, 36, 1,111,254,170,240,211, + 5, 78, 0, 0,255,255, 0,129,254,192, 5, 4, 6, 20, 18, 34, 0,211, 16, 0, 16, 3, 2, 38, 0,138, 0, 0, 0, 1, 0, 0, +255,227, 4,143, 5,240, 0, 49, 1, 28, 64, 58, 32, 18,211, 34, 16, 43, 7,211, 9, 25,161, 26,174, 22,149, 29, 1,161, 0,174, + 4,149, 47,145, 29,140, 41, 9, 50, 43, 34, 33, 41, 35, 38, 18, 16, 10, 3, 13, 9, 17, 8, 44, 32, 38, 19, 7, 17, 8, 17, 13, + 28, 25, 0, 38, 42, 33, 47, 60,212,196, 50,252,196,196, 18, 57, 57, 18, 57, 57, 17, 18, 57, 17, 23, 57, 18, 57, 57, 17, 57, 57, + 49, 0, 16,196, 50,228,244,236,244,236, 16,238,246,238, 16,238, 50,221, 60,238, 50, 48, 1, 75,176, 9, 84, 75,176, 12, 84, 91, + 75,176, 13, 84, 91, 75,176, 15, 84, 91, 75,176, 23, 84, 91, 75,176, 24, 84, 91, 88,189, 0, 50,255,192, 0, 1, 0, 50, 0, 50, + 0, 64, 56, 17, 55, 56, 89, 64,122, 14, 0, 14, 1, 11, 2, 11, 49, 84, 20,105, 12,108, 14,110, 15,111, 16,111, 17,111, 18,111, + 19,105, 20,107, 31,111, 32,111, 33,111, 34,111, 35,110, 36,108, 37,105, 39,105, 45,159, 7,159, 8,159, 9,159, 10,159, 11,159, + 12,159, 13,159, 14,159, 15,159, 16,159, 17,159, 18,159, 19,150, 31,159, 32,159, 33,159, 34,159, 35,159, 36,159, 37,159, 38,159, + 39,159, 40,159, 41,159, 42,159, 43,159, 44,157, 45, 50, 0, 8, 0, 9, 16, 8, 16, 9, 32, 8, 32, 9, 85, 21, 83, 30,106, 21, +103, 31, 10, 93, 0, 93, 1, 21, 46, 1, 35, 34, 6, 7, 33, 7, 33, 14, 1, 21, 20, 22, 23, 33, 7, 33, 30, 1, 51, 50, 54, 55, + 21, 14, 1, 35, 34, 0, 3, 35, 55, 51, 52, 38, 53, 52, 54, 53, 35, 55, 51, 18, 0, 51, 50, 22, 4,143, 91,169,102,157,202, 32, + 2, 65, 55,253,230, 2, 1, 1, 2, 1,190, 56,254,138, 32,202,157,102,169, 91, 89,185, 96,237,254,203, 40,211, 55,139, 1, 1, +194, 55,156, 40, 1, 54,236, 98,185, 5, 98,213,105, 90,200,187,123, 24, 46, 35, 32, 46, 24,123,187,202, 90,105,211, 72, 72, 1, + 34, 1, 3,123, 23, 47, 32, 35, 47, 23,123, 1, 1, 1, 34, 71, 0, 1, 0, 40, 0, 0, 5, 22, 5,213, 0, 17, 0, 0, 19, 17, + 51, 17, 1, 51, 1, 33, 21, 33, 1, 35, 1, 17, 35, 17, 35, 53,191,189, 2,117,243,253,128, 1,170,254, 88, 2,176,249,253, 95, +189,151, 3, 84, 2,129,253,137, 2,119,253,127,115,253, 31, 2,207,253, 49, 2,225,115, 0, 0, 0, 1, 0, 20, 0, 0, 5, 3, + 5,213, 0, 23, 0, 0, 1, 17, 33, 53, 33, 21, 33, 17, 55, 23, 5, 21, 55, 23, 5, 17, 35, 17, 7, 39, 37, 53, 7, 39, 2, 38, +253,238, 4,239,253,238,229, 80,254,203,230, 80,254,202,203,231, 77, 1, 52,232, 77, 3,141, 1,158,170,170,254,241,161,111,216, +136,162,111,217,253,184, 1,186,161,110,217,136,162,110, 0, 0, 0, 4, 0, 27,254,117, 8, 90, 5,200, 0, 23, 0, 35, 0, 48, + 0, 59, 0, 0, 51, 55, 51, 54, 55, 19, 34, 6, 29, 1, 7, 16, 55, 54, 33, 51, 50, 0, 21, 16, 3, 6, 4, 33, 55, 51, 32, 0, + 17, 52, 38, 43, 1, 3, 2, 6, 1, 19, 26, 1, 51, 32, 17, 16, 0, 35, 34, 39, 3, 19, 22, 51, 50, 18, 53, 52, 35, 34, 3, 7, + 28,148, 56,116, 42,172,130,150,194,160,160, 1,138, 64,226, 1, 4,238,124,254,172,254,212, 48,118, 1, 24, 1, 68,150,128, 80, +134, 52, 74, 2,140,160, 74,230,192, 1, 72,254,178,224, 52, 92, 86,124, 74, 74,132,176,150,156, 68, 26,160, 82,211, 3, 95,166, +145, 24, 94, 1, 17,159,161,254,234,241,254,119,254,218,152,122,160, 1,168, 1,110,174,208,253, 88,254,255,161,253,139, 3, 44, + 1,115, 1, 66,254,165,254,206,254, 55, 35,254, 82, 2,109, 78, 1, 67,246,245,254,185,130, 0, 0, 4, 0, 68, 0, 0, 4,162, + 5,213, 0, 29, 0, 36, 0, 43, 0, 49, 0, 0, 19, 53, 35, 53, 51, 17, 33, 50, 23, 22, 23, 51, 21, 35, 22, 20, 7, 51, 21, 35, + 6, 7, 6, 43, 1, 17, 35, 17, 35, 53, 5, 33, 21, 51, 50, 55, 54, 1, 33, 38, 39, 38, 43, 1, 5, 33, 21, 33, 54, 52,151, 82, + 82, 1,200,251,129, 76, 31, 92, 72, 1, 1, 71, 90, 31, 77,129,251,254,202, 83, 3, 28,254, 1,254,141, 77, 23,254, 17, 1,255, + 16, 23, 77,141,254, 2, 35,253,221, 2, 35, 2, 3,236, 86,116, 1, 31,113, 68,106,116, 21, 44, 21,116,107, 68,113,253,168, 3, +120,116,116,122, 73, 22, 1, 89, 27, 21, 73,237, 86, 21, 44, 0, 0, 1, 0,117,255,227, 5,188, 5,240, 0, 54, 0, 0, 1, 54, + 55, 54, 55, 33, 53, 33, 54, 55, 54, 53, 52, 38, 35, 34, 6, 7, 53, 62, 1, 51, 50, 4, 21, 20, 7, 51, 21, 33, 6, 15, 1, 33, + 21, 33, 6, 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 32, 36, 53, 52, 55, 35, 53, 1, 92, 4, 22, 74,128,254, 53, 3,146, 12, + 13, 59,179,165, 95,204,115,114,218,105,245, 1, 23, 25,175,254,253,103,216, 67, 2,133,252, 83, 49,188,173,114,236,123,128,239, +106,254,231,254,221, 18,168, 2,161, 7, 22, 74, 44,123, 8, 9, 43,107,118,128, 54, 55,197, 38, 38,228,198, 85, 66,123, 92, 42, + 13,123, 59, 94,126,136, 70, 69,208, 47, 48,224,217, 75, 63,123, 0, 2, 0,170,254,211, 4,119, 6, 20, 0, 33, 0, 44, 0, 0, + 1, 21, 38, 39, 38, 35, 17, 50, 55, 54, 55, 21, 6, 7, 6, 7, 17, 35, 17, 38, 39, 38, 17, 53, 16, 55, 54, 55, 53, 55, 21, 22, + 23, 22, 1, 3, 6, 7, 6, 7, 6, 23, 22, 23, 22, 4,119, 91, 84, 85,101,101, 85, 84, 91, 89, 92, 89, 91,100,185,115,212,212, +121,178,101, 93, 89, 92,254,138, 1, 91, 67,118, 15, 14, 14, 25,108, 67, 4,164,213,105, 45, 45,251,241, 45, 45,105,211, 72, 36, + 34, 2,254,240, 1, 21, 23,117,214, 1, 57, 17, 1, 66,203,116, 23,230, 2,226, 2, 34, 35,251,163, 3,249, 23, 66,117,170,161, +102,180,108, 67, 0, 1,252, 61, 4,122,255,203, 6, 20, 0, 8, 0, 0, 3, 33, 23, 35, 39, 55, 51, 7, 33, 53,253, 27,132,126, +175,175,126,132, 2,229, 5, 21,155,205,205,155, 0, 1,252, 61, 4,122,255,203, 6, 20, 0, 8, 0, 0, 1, 53, 33, 39, 51, 23, + 7, 35, 55,252, 61, 2,229,132,126,175,175,126,132, 5, 21,100,155,205,205,155, 0, 4, 0, 67,255,207, 7,216, 6, 4, 0, 10, + 0, 36, 0, 40, 0, 66, 0, 0, 1, 34, 6, 21, 20, 22, 51, 50, 54, 61, 1, 55, 17, 35, 53, 14, 1, 35, 34, 38, 53, 52, 54, 51, + 23, 52, 38, 35, 34, 6, 7, 53, 62, 1, 51, 50, 22, 37, 51, 1, 35, 1, 21, 46, 1, 35, 34, 6, 21, 20, 22, 51, 50, 54, 55, 21, + 14, 1, 35, 34, 38, 53, 52, 54, 51, 50, 22, 2, 15,160,112, 83, 72,102,127,188,188, 3,153,109,141,166,205,198,169,111,103, 68, +129, 99, 92,148, 71,194,193, 2,176,216,252, 68,216, 5,169, 94,111, 56,121,137,137,121, 56,111, 94, 73,130, 73,202,236,238,209, + 67,128, 3,246, 66, 82, 67, 73,148,130, 10, 77,254, 13, 62, 5, 79,158,129,150,155, 6, 87, 92, 32, 55,178, 36, 30,202,250,249, +203, 3,132,178, 52, 30,156,148,147,157, 31, 52,177, 34, 27,250,209,212,249, 27,255,255, 0,195,255,240, 8,140, 5,240, 16, 38, + 0,114, 0, 0, 16, 71, 0, 38, 3, 70, 0, 12, 65,117, 62, 82, 0, 2,255,214, 0, 0, 5, 24, 5,213, 0, 8, 0, 43, 0,153, +184, 0, 44, 47,184, 0, 45, 47,184, 0, 21,220,184, 0, 0,220,184, 0, 44, 16,184, 0, 40,208,184, 0, 40, 47,184, 0, 4,220, + 65, 27, 0, 22, 0, 4, 0, 38, 0, 4, 0, 54, 0, 4, 0, 70, 0, 4, 0, 86, 0, 4, 0,102, 0, 4, 0,118, 0, 4, 0,134, + 0, 4, 0,150, 0, 4, 0,166, 0, 4, 0,182, 0, 4, 0,198, 0, 4, 0,214, 0, 4, 0, 13, 93, 65, 5, 0,229, 0, 4, 0, +245, 0, 4, 0, 2, 93,184, 0, 0, 16,184, 0, 9,208,184, 0, 21, 16,184, 0, 11,208,184, 0, 21, 16,184, 0, 31,208,184, 0, + 0, 16,184, 0, 35,208, 0,184, 0, 10, 47,186, 0, 33, 0, 34, 0, 3, 43,184, 0, 33, 16, 48, 49, 1, 6, 7, 6, 21, 20, 23, + 22, 23, 17, 53, 51, 21, 22, 23, 22, 23, 21, 38, 39, 38, 39, 17, 54, 55, 54, 55, 21, 6, 7, 6, 7, 21, 33, 21, 33, 53, 38, 39, + 38, 17, 16, 55, 54, 1,119, 73, 51, 99, 99, 51, 73,202, 56, 54, 81, 76, 78, 78, 55, 56, 56, 55, 78, 78, 77, 82, 52, 56, 2,215, +252, 95,161,107,149,151,105, 4,179, 29, 58,114,205,205,113, 59, 29, 3,212,122,110, 4, 11, 18, 35,172, 43, 22, 15, 4,252,164, + 4, 16, 21, 43,170, 36, 18, 11, 4, 42,170,222, 32,114,159, 1, 14, 1, 18,157,110, 0, 0, 0, 0, 4, 0, 60,255,207, 7,229, + 6, 4, 0, 25, 0, 29, 0, 40, 0, 50, 0, 0, 1, 21, 46, 1, 35, 34, 6, 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, + 53, 52, 54, 51, 50, 22, 37, 51, 1, 35, 1, 34, 6, 21, 20, 22, 51, 50, 54, 16, 38, 36, 32, 22, 21, 20, 6, 32, 38, 53, 52, 3, + 6, 94,111, 56,121,137,137,121, 56,111, 94, 73,130, 73,202,236,238,209, 67,128, 2,221,216,252, 68,216, 4,107, 97,118,118, 97, + 96,119,119,254,223, 1,130,218,218,254,126,217, 5,151,178, 52, 30,156,148,147,157, 31, 52,177, 34, 29,252,209,212,249, 27, 75, +249,203, 3, 4,158,146,145,159,160, 1, 32,160,157,248,213,212,248,248,212,213, 0, 3, 0, 60,255,207, 8, 77, 6, 4, 0, 19, + 0, 45, 0, 49, 0, 0, 1, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, 35, 53, 14, 1, 35, 34, 38, 1, 21, 46, 1, 35, 34, + 6, 21, 20, 22, 51, 50, 54, 55, 21, 14, 1, 35, 34, 38, 53, 52, 54, 51, 50, 22, 37, 51, 1, 35, 5, 92,188, 81, 80, 99,117,188, +188, 6,144, 96,158,161,253,170, 94,111, 56,121,137,137,121, 56,111, 94, 73,130, 73,202,236,238,209, 67,128, 2,221,216,252, 68, +216, 1, 76, 2, 16,253,245,114,105,129,117, 1,240,252,144, 68, 9, 80,193, 4,255,178, 52, 30,156,148,147,157, 31, 52,177, 34, + 29,252,209,212,249, 27, 75,249,203, 0, 0, 0,255,255, 0,195, 0, 0, 7, 38, 5,240, 16, 34, 0,114, 0, 0, 16, 3, 0, 41, + 3, 3, 0, 0, 0, 1, 0, 72, 0, 0, 4,135, 6, 20, 0, 25, 0, 0, 1, 3, 35, 19, 62, 1, 53, 52, 38, 35, 34, 6, 7, 3, + 35, 1, 51, 3, 62, 1, 51, 50, 22, 21, 20, 6, 4,117,131,185,131, 9, 10,106, 95,148,217, 32,121,184, 1, 47,184,119, 70,218, +120,148,163, 9, 2,164,253, 92, 2,157, 47, 72, 21, 84, 94,200,166,253,147, 6, 20,253,156, 94,109,160,145, 36, 82, 0, 0, 0, + 0, 1, 0, 34, 0, 0, 4, 98, 6, 20, 0, 29, 0, 0, 1, 54, 55, 54, 51, 50, 23, 22, 7, 3, 35, 19, 54, 38, 35, 34, 6, 7, + 3, 35, 19, 35, 55, 51, 55, 51, 7, 33, 7, 33, 1,148, 85, 99,100,117,193, 76, 75, 45,131,184,130, 31, 93,124,149,209, 32,123, +185,249,154, 25,154, 28,185, 28, 2, 64, 25,253,192, 3,178,101, 50, 50,119,120,232,253, 92, 2,158,159,158,190,164,253,135, 5, + 4,125,147,147,125, 0, 0, 0, 0, 2, 0,106,255,227, 5, 70, 5,240, 0, 33, 0, 50, 0, 0, 63, 1, 54, 51, 50, 23, 22, 51, + 50, 55, 54, 53, 52, 39, 38, 53, 52, 63, 1, 6, 21, 20, 23, 22, 21, 20, 7, 6, 35, 34, 39, 38, 35, 34, 19, 54, 51, 50, 23, 22, + 51, 50, 55, 7, 6, 35, 34, 38, 35, 34, 7,106,140,111,117, 57,132,144, 33,121,100, 71, 62, 80, 80,213, 80, 80, 53,202,186,242, + 54,129,133, 56, 94,110,109,141,123,127,122,128,125,125,200,139,111,143,214,143,122,128, 90,165, 39, 80, 86,137, 97, 75,126,112, +146,109,100,160,140,139,121,107,148, 98,188, 94,242,222, 79, 80, 5, 54, 56, 49, 47, 58,170, 58, 98, 58, 0, 0, 0, 2,255,228, +255,227, 2,210, 5,240, 0, 28, 0, 38, 0, 0, 1, 22, 51, 50, 55, 51, 6, 7, 6, 35, 34, 39, 7, 35, 54, 55, 38, 53, 52, 55, + 18, 55, 54, 51, 50, 21, 6, 7, 2, 1, 18, 19, 54, 53, 52, 35, 6, 3, 6, 1, 48, 41, 87, 58, 75,133, 60, 70, 76, 70,156, 63, + 75,156,108, 80, 10, 31,117,104, 72,123,125, 1, 18, 72,254,184,187, 57, 30, 25,109, 97, 27, 1, 12,200,115,102, 53, 57,139,110, +147,137, 78, 85,152,152, 2, 59,117, 81,173, 78, 93,254,131,254,247, 1, 92, 1, 22,147, 38, 69, 87,253,250,145,255,255, 0,201, + 0, 0, 8,240, 5,240, 16, 39, 0,124, 5,140, 0, 0, 16, 6, 0, 49, 0, 0, 0, 4, 1, 27, 0, 0, 6,229, 5,202, 0, 12, + 0, 25, 0, 34, 0, 45, 0, 0, 1, 22, 17, 16, 0, 33, 32, 0, 3, 16, 0, 33, 32, 6, 33, 32, 0, 17, 18, 0, 33, 32, 0, 17, + 16, 39, 5, 17, 51, 50, 54, 53, 52, 38, 35, 37, 33, 50, 22, 21, 20, 6, 43, 1, 17, 35, 6, 11,218,254, 74,254,209,254,207,254, + 82, 6, 1,180, 1, 49, 1, 50, 41,254,247,254,250,254,134, 5, 1,117, 1, 6, 1, 7, 1,121,187,253,211,178, 99,107,107, 99, +254,193, 1, 63,176,180,180,176,178,141, 4,241,219,254,206,254,208,254, 76, 1,180, 1, 48, 1, 48, 1,182,101,254,133,254,249, +254,251,254,135, 1,121, 1, 5, 1, 9,187,119,254,175, 88, 81, 80, 88,100,137,131,133,135,254,152, 0, 0, 0, 0, 2, 0,110, +254, 59, 5, 67, 3,246, 0, 48, 0, 60, 0, 0, 1, 6, 21, 20, 23, 54, 55, 54, 51, 50, 23, 22, 21, 20, 7, 6, 35, 34, 39, 54, + 55, 22, 51, 50, 55, 54, 53, 52, 39, 38, 35, 34, 1, 18, 21, 20, 7, 6, 35, 34, 39, 38, 53, 16, 55, 38, 53, 52, 55, 3, 6, 21, + 20, 23, 22, 23, 50, 55, 54, 53, 52, 2, 53,136, 31, 91,171,219,132,131, 70, 73,156,121,174,101, 76, 18, 9, 41,113,122, 93, 69, + 38, 32, 74,189,254,159,135, 69, 89,131,113, 58, 63,223, 46,232,148,129, 31, 48, 46, 65, 28, 32, 3,198,130,190, 77,107,101,148, +189, 76, 80,171,218,215,167, 60, 43, 29, 40,140,104,195,124, 72, 61,254,121,254,222,124,157,110,142, 61, 66,134, 1, 11,252,158, +127,238,164,252,239,198,123,117, 46, 70, 1, 47, 52, 95, 78, 0, 0, 2, 0, 83,255,227, 6,108, 5,241, 0, 73, 0, 88, 0, 0, + 5, 38, 53, 52, 39, 38, 35, 34, 15, 1, 21, 20, 7, 6, 35, 34, 39, 38, 53, 22, 23, 20, 23, 22, 50, 55, 54, 53, 17, 52, 39, 38, + 35, 34, 7, 6, 20, 23, 22, 51, 23, 34, 39, 38, 53, 52, 55, 54, 51, 50, 23, 22, 23, 55, 54, 51, 50, 23, 22, 21, 20, 7, 6, 7, + 50, 23, 22, 23, 22, 21, 20, 23, 55, 23, 1, 22, 21, 17, 55, 54, 55, 54, 53, 52, 39, 38, 35, 34, 7, 5, 2, 82, 22, 40, 79, 42, + 92,120,103,103,140,141,102,103, 45, 46, 64, 64,144, 63, 64, 64, 63, 92, 81, 65, 64, 64, 64, 83, 54,151,102,103,103,102,151,162, +101, 30, 16,211,187,112, 47, 36,126, 65, 66,125, 58, 49, 36, 27, 32, 45,144, 42,252,164, 21,154,144, 77, 74, 74, 24, 31, 64,102, + 29,183,159,140, 91,166, 43, 56,199,206,118,117,117,118,176, 12, 12,122, 86, 87, 87, 87,150, 2,155,149, 88, 87, 87, 86,202, 86, + 87, 92,117,118,156,157,117,117,117, 35, 32, 98, 87, 14, 49,177, 87,123,124, 94, 49, 36,104,123,131,128,118, 67, 91, 4, 83, 75, + 92,254,149, 71, 67,104,102,121,151, 32, 10, 47, 0, 5, 0,118, 0, 0, 5,225, 5,213, 0, 7, 0, 27, 0, 31, 0, 39, 0, 48, + 0, 0, 1, 22, 23, 19, 51, 3, 38, 39, 32, 43, 1, 17, 33, 17, 33, 32, 22, 21, 20, 6, 7, 30, 1, 23, 19, 33, 3, 38, 1, 17, + 51, 17, 1, 17, 38, 35, 33, 17, 33, 50, 55, 54, 55, 54, 53, 52, 39, 38, 39, 3, 46, 78,102,142,200,142, 96, 90,254,164,120, 20, +254,110, 2,168, 1, 0,252,132,124, 64,124, 62,204,254, 72,190, 74,253,186,198, 1,238, 34, 38,254,194, 1, 62, 38,138, 58, 40, + 94, 94, 38, 60, 2,119, 47,201,254,229, 1, 27,192, 56,253,137, 5,213,214,216,141,186, 36, 22,144,126,254,104, 1,127,150, 3, + 92,250,243, 5, 13,253,110, 2,142, 4,253,106, 27, 21, 37, 84,164,158, 88, 36, 20, 0, 0, 0, 0, 2, 0,169, 0, 0, 6,131, + 5,213, 0, 8, 0, 31, 0,167,184, 0, 32, 47,184, 0, 33, 47,184, 0, 32, 16,184, 0, 14,208,184, 0, 14, 47,184, 0, 13,220, +184, 0, 0,208,184, 0, 33, 16,184, 0, 19,220,184, 0, 5,220, 65, 5, 0,234, 0, 5, 0,250, 0, 5, 0, 2, 93, 65, 27, 0, + 25, 0, 5, 0, 41, 0, 5, 0, 57, 0, 5, 0, 73, 0, 5, 0, 89, 0, 5, 0,105, 0, 5, 0,121, 0, 5, 0,137, 0, 5, 0, +153, 0, 5, 0,169, 0, 5, 0,185, 0, 5, 0,201, 0, 5, 0,217, 0, 5, 0, 13, 93,184, 0, 9,208,184, 0, 9, 47,186, 0, + 30, 0, 14, 0, 19, 17, 18, 57, 0,184, 0, 13, 47,184, 0, 26, 47,184, 0, 29, 47,186, 0, 15, 0, 0, 0, 3, 43,184, 0, 15, + 16,186, 0, 2, 0, 11, 0, 3, 43,184, 0, 2, 16, 48, 49, 1, 17, 51, 50, 54, 53, 52, 38, 35, 1, 6, 43, 1, 17, 35, 17, 33, + 50, 4, 21, 20, 7, 23, 55, 51, 9, 1, 35, 11, 1, 35, 1, 1,115,254,141,154,154,141, 1, 32,115,173,254,202, 1,200,251, 1, + 1, 78,174,190,232,254,205, 1, 67,233,207,212,232, 1, 73, 5, 47,253,207,146,135,134,146,253, 95, 54,253,168, 5,213,227,219, +172,107,219,234,254,134,254,107, 1, 4,254,252, 1,149, 0, 0, 0, 2, 1, 3, 3,139, 6, 40, 5,216, 0, 39, 0, 52, 0, 0, + 1, 21, 46, 1, 35, 34, 6, 21, 20, 22, 31, 1, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 47, 1, + 46, 1, 53, 52, 54, 51, 50, 22, 55, 51, 27, 1, 51, 17, 35, 17, 3, 35, 3, 17, 35, 2,230, 85, 87, 39, 65, 71, 47, 69, 56,112, +105,144,140, 52,115, 71, 91,100, 47, 69, 75, 55, 63, 56,112, 99,138,124, 51,105,208,184,161,162,184,138,140,135,141,137, 5,183, + 89, 34, 19, 42, 47, 40, 32, 11, 9, 18, 86, 65, 79, 91, 19, 21, 96, 42, 24, 44, 50, 44, 42, 10, 9, 18, 77, 61, 72, 92, 15, 5, +254,172, 1, 84,253,200, 1,148,254,216, 1, 40,254,108, 0, 0, 0, 3,255,252, 0, 0, 8, 48, 4, 96, 0, 7, 0, 19, 0, 25, + 0, 0, 3, 33, 21, 33, 17, 35, 17, 33, 5, 33, 21, 33, 17, 33, 21, 33, 17, 33, 21, 33, 1, 51, 17, 33, 21, 33, 4, 3,179,254, +114,152,254,115, 2,224, 2,111,254, 22, 1,213,254, 43, 1,246,253,133, 2,239,133, 1,224,253,155, 4, 96,128,252, 32, 3,224, + 96,102,254,247,102,254,187,102, 3,128,252,230,102, 0, 0, 0, 0, 2, 1, 39, 3,147, 6, 70, 5,213, 0, 12, 0, 20, 0, 62, + 64, 33, 1, 6, 7, 16, 10, 4, 18, 14, 9, 3, 6,201, 13, 2, 0,129, 21, 1, 9, 5, 98, 3, 9, 98, 11, 13, 99, 15, 98, 19, + 99, 17, 21, 16,212,228,252,228,212,236,212,236, 17, 57, 49, 0, 16,244, 60, 60,236, 23, 50,212, 60, 60,196, 17, 57, 48, 1, 27, + 1, 51, 17, 35, 17, 3, 35, 3, 17, 35, 17, 35, 21, 35, 17, 35, 17, 35, 53, 4, 74,174,164,170,113,195, 55,203,114,113,203,114, +201, 5,213,255, 0, 1, 0,253,190, 1,228,254,209, 1, 47,254, 28, 2, 66, 94,254, 28, 1,228, 94, 0, 0, 0,255,255, 0, 78, + 0, 0, 5,207, 5,231, 16, 6, 2,199, 0, 0, 0, 1, 0, 78,255,227, 5,207, 5,202, 0, 30, 0, 0, 1, 53, 33, 21, 22, 18, + 21, 20, 0, 32, 0, 53, 52, 18, 55, 53, 33, 21, 33, 6, 2, 21, 16, 0, 33, 32, 0, 17, 52, 2, 39, 5,207,253,168,177,198,254, +248,254, 80,254,247,199,178,253,168, 1, 63,158,145, 1,127, 1, 49, 1, 47, 1,129,142,161, 5, 24,178,178, 97,254,180,202,240, +254,222, 1, 35,239,202, 1, 76, 97,178,178,139,254,214,184,254,194,254,118, 1,137, 1, 53,194, 1, 40,141, 0,255,255, 0,201, + 0, 0, 5,106, 5,213, 16, 6, 0, 46, 0, 0,255,255, 0, 16, 0, 0, 5,104, 7,109, 16, 6, 0,135, 0, 0, 0, 2, 0,125, +255,231, 6, 89, 5, 45, 0, 26, 0, 41, 0, 0, 37, 22, 23, 22, 32, 55, 54, 55, 51, 6, 7, 6, 32, 36, 2, 53, 52, 18, 36, 51, + 50, 4, 18, 21, 33, 34, 21, 53, 20, 51, 33, 50, 53, 17, 38, 39, 38, 35, 34, 7, 6, 7, 1,144, 67, 93,150, 1, 74,152,106, 77, +111, 95,142,179,254,122,254,155,198,201, 1,103,190,189, 1,103,202,251, 74, 19, 19, 3,144, 20, 70, 95,152,159,160,152, 95, 68, +228, 77, 51, 84, 84, 60, 96,120, 71, 90,179, 1, 65,175,176, 1, 69,174,174,254,187,176, 19, 73, 19, 19, 1,112, 80, 51, 82, 81, + 52, 79, 0, 0, 0, 1, 0,201, 0, 0, 4, 35, 5,213, 0, 9, 0, 0, 41, 1, 53, 33, 17, 33, 53, 33, 17, 51, 4, 35,252,166, + 2,144,253,176, 2, 80,202,170, 1,184,170, 2,201, 0, 0, 0, 0, 2, 0,104,255,231, 3, 74, 3, 41, 0, 11, 0, 23, 0, 0, + 1, 52, 38, 35, 34, 2, 21, 20, 22, 51, 50, 18, 3, 50, 22, 21, 20, 2, 35, 34, 38, 53, 52, 18, 2,169, 87, 79,109,141, 86, 80, +109,141,194,152,203,221,162,152,203,221, 1,247,116,125,254,254,207,116,123, 1, 4, 1,253,216,163,198,254,255,216,163,198, 1, + 1, 0, 0, 0, 0, 1, 0,103,255,227, 5,178, 5,240, 0, 54, 0, 0, 9, 1, 22, 21, 20, 7, 52, 39, 1, 7, 6, 31, 1, 22, + 21, 20, 7, 6, 43, 1, 53, 54, 53, 52, 47, 1, 38, 53, 52, 63, 1, 39, 38, 53, 52, 55, 20, 23, 9, 1, 39, 38, 53, 52, 55, 20, + 31, 1, 22, 21, 20, 7, 52, 47, 1, 3,196, 1,139, 99,144, 50,252,251,155, 62, 66,172,100, 61, 86, 69,245,196, 47, 98, 53,140, +154,241, 99,144, 50, 2,108, 1, 25,116, 99,144, 50,182, 99,144, 50, 18, 2,208,254,117, 99, 49,130, 76, 83, 50, 3, 5,156, 63, + 66,172,100,106,108, 44, 62, 56, 63, 93, 29, 47, 99, 54,103, 85,141,155,241, 99, 49,130, 76, 83, 50,253,150, 1, 25,116, 99, 49, +130, 76, 83, 50,182, 99, 49,130, 76, 83, 50, 18, 0, 4, 0,151, 0, 0, 9, 76, 4, 96, 0, 9, 0, 12, 0, 20, 0, 32, 0, 0, + 19, 33, 21, 33, 17, 33, 21, 33, 17, 35, 1, 3, 33, 1, 51, 1, 35, 39, 33, 7, 35, 1, 51, 27, 1, 51, 9, 1, 35, 9, 1, 35, + 1,151, 2,131,254, 20, 1,188,254, 68,151, 3,131,181, 1,106,255, 0,151, 1,119,138, 90,254, 68, 90,140, 3,214,143,245,246, +144,254,195, 1, 82,144,254,235,254,233,144, 1, 96, 4, 96,128,254,182,127,253,233, 3, 8,254, 67, 2, 53,252,128,230,230, 3, +128,254,179, 1, 77,254, 82,254, 46, 1,125,254,131, 1,222, 0, 0, 2, 0, 59,255,227, 5,184, 5,240, 0, 38, 0, 48, 0, 0, + 9, 1, 14, 1, 7, 35, 54, 18, 55, 1, 51, 23, 62, 1, 51, 50, 0, 21, 20, 6, 7, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 30, + 1, 51, 50, 54, 53, 52, 38, 55, 62, 1, 53, 52, 38, 35, 34, 6, 7, 3,186,254, 4, 59, 66, 6,186, 12,104, 93,254,233,252,143, +104,228,131,241, 1, 50,134,134, 48, 50,222,184, 83,165, 85, 87,158, 68,105,131, 59, 50, 91, 85,212,160, 95,166, 73, 2, 64, 2, + 8, 89,203,114,132, 1, 2,126, 1, 29,147, 89, 87,254,237,215,128,225, 99, 63,125, 60,162,197, 36, 36,182, 47, 49,111, 88, 51, +103,206, 81,161, 88,146,194, 63, 64, 0, 0, 0,255,255, 0,137,255,227, 7, 88, 5,240, 16, 34, 0,123, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 0,117, 4,139,253,100,255,255, 0, 94,255,227, 7, 88, 5,240, 16, 34, 0,116, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 0,117, 4,139,253,100,255,255, 0,137,255,227, 7, 94, 5,240, 16, 34, 0,123, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,207, 4,139,253,100,255,255, 0, 94,255,227, 7, 94, 5,240, 16, 34, 0,116, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,207, 4,139,253,100,255,255, 0, 98,255,227, 7, 94, 5,240, 16, 34, 0,117, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,207, 4,139,253,100,255,255, 0, 63,255,227, 7, 94, 5,240, 16, 34, 5,206, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,207, 4,139,253,100,255,255, 0,137,255,227, 7,126, 5,240, 16, 34, 0,123, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,208, 4,139,253,100,255,255, 0,102,255,227, 7,126, 5,240, 16, 34, 5,207, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,208, 4,139,253,100,255,255, 0,137,255,227, 7,119, 5,240, 16, 34, 0,123, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,210, 4,139,253,100,255,255, 0, 98,255,227, 7,119, 5,240, 16, 34, 0,117, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,210, 4,139,253,100,255,255, 0,102,255,227, 7,119, 5,240, 16, 34, 5,207, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,210, 4,139,253,100,255,255, 0,108,255,227, 7,119, 5,240, 16, 34, 5,209, 0, 0, 16, 39, 6, 90, + 3, 53, 0, 0, 16, 3, 5,210, 4,139,253,100,255,255, 0,137,255,227, 6, 2, 5,240, 16, 34, 0,123, 0, 0, 16, 7, 6, 90, + 3, 53, 0, 0,255,255, 0,201, 0, 0, 1,147, 5,213, 16, 6, 0, 44, 0, 0,255,255, 0,201, 0, 0, 3, 39, 5,213, 16, 38, + 0, 44, 0, 0, 16, 7, 0, 44, 1,148, 0, 0,255,255, 0,201, 0, 0, 4,187, 5,213, 16, 38, 0, 44, 0, 0, 16, 39, 0, 44, + 1,148, 0, 0, 16, 7, 0, 44, 3, 40, 0, 0,255,255, 0,201, 0, 0, 7, 81, 5,213, 16, 38, 0, 44, 0, 0, 16, 7, 0, 57, + 1,233, 0, 0,255,255, 0, 16, 0, 0, 5,104, 5,213, 16, 6, 0, 57, 0, 0,255,255, 0, 16, 0, 0, 6,152, 5,213, 16, 38, + 0, 57, 0, 0, 16, 7, 0, 44, 5, 5, 0, 0,255,255, 0, 16, 0, 0, 8, 44, 5,213, 16, 38, 0, 57, 0, 0, 16, 39, 0, 44, + 5, 5, 0, 0, 16, 7, 0, 44, 6,153, 0, 0,255,255, 0, 16, 0, 0, 9,192, 5,213, 16, 38, 0, 57, 0, 0, 16, 39, 0, 44, + 5, 5, 0, 0, 16, 39, 0, 44, 6,153, 0, 0, 16, 7, 0, 44, 8, 45, 0, 0,255,255, 0,201, 0, 0, 7, 23, 5,213, 16, 38, + 0, 44, 0, 0, 16, 7, 0, 59, 1,220, 0, 0,255,255, 0, 61, 0, 0, 5, 59, 5,213, 16, 6, 0, 59, 0, 0,255,255, 0, 61, + 0, 0, 6,174, 5,213, 16, 38, 0, 59, 0, 0, 16, 7, 0, 44, 5, 27, 0, 0,255,255, 0, 61, 0, 0, 8, 66, 5,213, 16, 38, + 0, 59, 0, 0, 16, 39, 0, 44, 5, 27, 0, 0, 16, 7, 0, 44, 6,175, 0, 0,255,255, 0,201, 0, 0, 4,106, 5,213, 16, 6, + 0, 47, 0, 0,255,255, 0,115,255,227, 5, 39, 5,240, 16, 6, 0, 38, 0, 0,255,255, 0,201, 0, 0, 5,176, 5,213, 16, 6, + 0, 39, 0, 0,255,255, 0,201, 0, 0, 6, 31, 5,213, 16, 6, 0, 48, 0, 0,255,255, 0,193, 0, 0, 1,121, 6, 20, 16, 6, + 0, 76, 0, 0,255,255, 0,193, 0, 0, 2,233, 6, 20, 16, 38, 0, 76, 0, 0, 16, 7, 0, 76, 1,112, 0, 0,255,255, 0,193, + 0, 0, 4, 89, 6, 20, 16, 38, 0, 76, 0, 0, 16, 39, 0, 76, 1,112, 0, 0, 16, 7, 0, 76, 2,224, 0, 0,255,255, 0,193, + 0, 0, 6, 65, 6, 20, 16, 38, 0, 76, 0, 0, 16, 7, 0, 89, 1,194, 0, 0,255,255, 0, 61, 0, 0, 4,127, 4, 96, 16, 6, + 0, 89, 0, 0,255,255, 0, 61, 0, 0, 5,189, 6, 20, 16, 38, 0, 89, 0, 0, 16, 7, 0, 76, 4, 68, 0, 0,255,255, 0, 61, + 0, 0, 7, 45, 6, 20, 16, 38, 0, 89, 0, 0, 16, 39, 0, 76, 4, 68, 0, 0, 16, 7, 0, 76, 5,180, 0, 0,255,255, 0, 61, + 0, 0, 8,157, 6, 20, 16, 38, 0, 89, 0, 0, 16, 39, 0, 76, 4, 68, 0, 0, 16, 39, 0, 76, 5,180, 0, 0, 16, 7, 0, 76, + 7, 36, 0, 0,255,255, 0,193, 0, 0, 6, 74, 6, 20, 16, 38, 0, 76, 0, 0, 16, 7, 0, 91, 1,209, 0, 0,255,255, 0, 59, + 0, 0, 4,121, 4, 96, 16, 6, 0, 91, 0, 0,255,255, 0, 59, 0, 0, 5,212, 6, 20, 16, 38, 0, 91, 0, 0, 16, 7, 0, 76, + 4, 91, 0, 0,255,255, 0, 59, 0, 0, 7, 68, 6, 20, 16, 38, 0, 91, 0, 0, 16, 39, 0, 76, 4, 91, 0, 0, 16, 7, 0, 76, + 5,203, 0, 0,255,255, 0,193, 0, 0, 1,121, 6, 20, 16, 6, 0, 79, 0, 0,255,255, 0,113,255,227, 3,231, 4,123, 16, 6, + 0, 70, 0, 0,255,255, 0,113,255,227, 4, 90, 6, 20, 16, 6, 0, 71, 0, 0,255,255, 0,186, 0, 0, 7, 29, 4,123, 16, 6, + 0, 80, 0, 0, 0, 3, 0,121,255,255, 9,125, 5,213, 0, 13, 0, 22, 0, 31, 0, 0, 1, 32, 0, 17, 16, 0, 41, 1, 32, 0, + 17, 16, 0, 33, 1, 51, 32, 0, 17, 16, 0, 33, 35, 3, 17, 35, 32, 0, 17, 16, 0, 33, 6, 53, 1,178, 1,150,254,104,254, 80, +253,140,254, 80,254,104, 1,150, 1,178, 1,159,244, 1, 53, 1, 31,254,225,254,203,244,202,244,254,203,254,225, 1, 31, 1, 53, + 5,213,254,151,254,128,254,126,254,150, 1,106, 1,130, 1,128, 1,105,250,209, 1, 24, 1, 46, 1, 44, 1, 23,251,119, 4,137, +254,233,254,212,254,210,254,232, 0, 3, 0,201, 0, 0, 5,176, 5,213, 0, 17, 0, 26, 0, 35, 0,251,186, 0, 9, 0, 27, 0, + 3, 43,184, 0, 9, 16,186, 0, 14, 0, 23, 0, 3, 43,184, 0, 14, 16,186, 0, 31, 0, 5, 0, 3, 43,184, 0, 31, 16,184, 0, + 9, 16,184, 0, 0,208, 65, 5, 0,234, 0, 5, 0,250, 0, 5, 0, 2, 93, 65, 27, 0, 25, 0, 5, 0, 41, 0, 5, 0, 57, 0, + 5, 0, 73, 0, 5, 0, 89, 0, 5, 0,105, 0, 5, 0,121, 0, 5, 0,137, 0, 5, 0,153, 0, 5, 0,169, 0, 5, 0,185, 0, + 5, 0,201, 0, 5, 0,217, 0, 5, 0, 13, 93,184, 0, 9, 16,184, 0, 18,208, 65, 5, 0,234, 0, 23, 0,250, 0, 23, 0, 2, + 93, 65, 27, 0, 25, 0, 23, 0, 41, 0, 23, 0, 57, 0, 23, 0, 73, 0, 23, 0, 89, 0, 23, 0,105, 0, 23, 0,121, 0, 23, 0, +137, 0, 23, 0,153, 0, 23, 0,169, 0, 23, 0,185, 0, 23, 0,201, 0, 23, 0,217, 0, 23, 0, 13, 93,184, 0, 31, 16,184, 0, + 37,220, 0,186, 0, 2, 0, 34, 0, 3, 43,184, 0, 2, 16,186, 0, 28, 0, 8, 0, 3, 43,184, 0, 28, 16,186, 0, 19, 0, 0, + 0, 3, 43,184, 0, 19, 16,186, 0, 10, 0, 18, 0, 3, 43,184, 0, 10, 16, 48, 49, 1, 21, 51, 32, 0, 17, 16, 0, 33, 35, 21, + 51, 32, 22, 21, 20, 6, 35, 3, 17, 51, 50, 54, 53, 52, 38, 35, 1, 33, 32, 0, 17, 16, 0, 41, 1, 1,147,244, 1, 53, 1, 31, +254,225,254,203,244, 72, 1, 0,240,241,255, 72, 78,159,147,147,159,254,232, 1,159, 1,178, 1,150,254,104,254, 80,254, 97, 1, + 89,179, 1, 24, 1, 46, 1, 44, 1, 23,178,194,207,208,195, 2,158,253,232,129,140,138,129, 1,222,254,151,254,128,254,126,254, +150, 0, 0, 0, 0, 5, 0,121,255,255, 9,125, 5,213, 0, 17, 0, 26, 0, 40, 0, 49, 0, 67, 0, 0, 1, 51, 32, 0, 17, 16, + 0, 33, 35, 53, 51, 32, 54, 53, 52, 38, 33, 35, 25, 1, 51, 50, 22, 21, 20, 6, 35, 19, 32, 0, 17, 16, 0, 41, 1, 32, 0, 17, + 16, 0, 33, 19, 35, 34, 38, 53, 52, 54, 59, 1, 53, 35, 32, 6, 21, 20, 22, 33, 51, 21, 35, 32, 0, 17, 16, 0, 33, 51, 5, 96, +244, 1, 53, 1, 31,254,225,254,203,244, 72, 0,255,241,240,255, 0, 72, 78,159,147,147,159,135, 1,176, 1,152,254,106,254, 78, +253,140,254, 78,254,106, 1,152, 1,176,213, 78,159,147,147,159, 78, 72,255, 0,240,241, 0,255, 72,244,254,203,254,225, 1, 31, + 1, 53,244, 5, 47,254,233,254,212,254,210,254,232,179,195,208,207,194,253, 98, 2, 24,129,138,140,129,254, 33, 1,106, 1,130, + 1,128, 1,105,254,151,254,128,254,126,254,150, 1,223,129,140,138,129,134,194,207,208,195,179, 1, 24, 1, 46, 1, 44, 1, 23, +255,255, 0,115,255,227, 5, 39, 5,240, 16, 6, 1, 72, 0, 0, 0, 1, 0,100, 0,204, 6, 63, 4, 56, 0, 9, 0,129,180, 2, + 9, 6, 0, 10, 16,212,212,204, 50, 64, 9, 64, 2, 64, 9, 48, 2, 48, 9, 4, 93, 49, 64, 10, 2, 5, 9, 1, 0, 6, 5,156, + 6, 10, 0, 16,212,236, 17, 57, 57,204, 16,204, 48, 64, 12, 8, 9, 9, 0, 8, 7, 8, 7,156, 0, 9, 0, 7, 5, 16,252, 60, + 8, 6, 16, 60, 64, 12, 3, 2, 2, 1, 3, 4, 3, 4,156, 1, 2, 1, 7, 5, 16,252, 60, 8, 6, 16, 60,176, 16, 75, 83, 88, + 0,179, 3, 2, 8, 9, 16, 60, 16, 60,180, 8,156, 9, 9, 0, 7, 5, 16,236,180, 3,156, 2, 2, 1, 7, 5, 16,236, 89, 19, + 53, 1, 23, 7, 33, 21, 33, 23, 7,100, 1,137,120,233, 4,195,251, 61,233,120, 2, 85, 90, 1,137,120,233,170,233,120, 0, 0, + 0, 1, 1,163, 0, 0, 5, 15, 5,220, 0, 9, 0,129, 64, 10, 2, 5, 9, 1, 0, 6, 5,156, 6, 10, 16,212,236, 17, 57, 57, +204, 16,204, 49, 0,180, 2, 9, 6, 0, 10, 16,212,212,204, 50, 64, 9, 79, 2, 79, 9, 63, 2, 63, 9, 4, 93, 48, 64, 12, 8, + 9, 9, 0, 8, 7, 8, 7,156, 0, 9, 0, 7, 4, 16,252, 60, 8, 6, 16, 60, 64, 12, 3, 2, 2, 1, 3, 4, 3, 4,156, 1, + 2, 1, 7, 4, 16,252, 60, 8, 6, 16, 60,176, 16, 75, 83, 88, 1,179, 3, 2, 8, 9, 16, 60, 16, 60,180, 8,156, 9, 9, 0, + 7, 4, 16,236,180, 3,156, 2, 2, 1, 7, 4, 16,236, 89, 1, 51, 1, 7, 39, 17, 35, 17, 7, 39, 3, 45, 90, 1,136,120,232, +170,234,120, 5,220,254,118,120,234,251, 60, 4,196,234,120, 0, 0, 1, 0,117, 0,204, 6, 80, 4, 56, 0, 9, 0,129,180, 2, + 9, 0, 6, 10, 16,212,212,204, 50, 64, 9, 79, 2, 79, 9, 95, 2, 95, 9, 4, 93, 49, 64, 10, 9, 6, 2, 1, 0, 5, 6,156, + 5, 10, 0, 16,212,236, 17, 57, 57,204, 16,204, 48, 64, 12, 8, 9, 9, 0, 8, 7, 8, 7,156, 0, 9, 0, 7, 5, 16,252, 60, + 8, 6, 16, 60, 64, 12, 3, 2, 2, 1, 3, 4, 3, 4,156, 1, 2, 1, 7, 5, 16,252, 60, 8, 6, 16, 60,176, 16, 75, 83, 88, + 0,179, 3, 2, 8, 9, 16, 60, 16, 60,180, 8,156, 9, 9, 0, 7, 5, 16,236,180, 3,156, 2, 2, 1, 7, 5, 16,236, 89, 1, + 21, 1, 39, 55, 33, 53, 33, 39, 55, 6, 80,254,119,120,233,251, 61, 4,195,233,120, 2,175, 90,254,119,120,233,170,233,120, 0, + 0, 1, 1,163,255,249, 5, 15, 5,213, 0, 9, 0,129, 64, 10, 9, 6, 2, 1, 0, 5, 6,156, 5, 10, 16,212,236, 17, 57, 57, +204, 16,204, 49, 0,180, 2, 9, 0, 6, 10, 16,212,212,204, 50, 64, 9, 64, 2, 64, 9, 80, 2, 80, 9, 4, 93, 48, 64, 12, 8, + 9, 9, 0, 8, 7, 8, 7,156, 0, 9, 0, 7, 4, 16,252, 60, 8, 6, 16, 60, 64, 12, 3, 2, 2, 1, 3, 4, 3, 4,156, 1, + 2, 1, 7, 4, 16,252, 60, 8, 6, 16, 60,176, 16, 75, 83, 88, 1,179, 3, 2, 8, 9, 16, 60, 16, 60,180, 8,156, 9, 9, 0, + 7, 4, 16,236,180, 3,156, 2, 2, 1, 7, 4, 16,236, 89, 5, 35, 1, 55, 23, 17, 51, 17, 55, 23, 3,135, 90,254,118,120,234, +170,232,120, 7, 1,138,120,234, 4,196,251, 60,234,120, 0, 0, 0, 1, 0,100, 0,204, 6, 80, 4, 56, 0, 15, 0,218,182, 7, + 10, 9, 2, 15, 0, 16, 16,212,204, 50,212,204, 50, 64, 13, 80, 2, 80, 15, 95, 10, 95, 7, 79, 10, 79, 7, 6, 93, 49, 0, 64, + 15, 7, 2, 4, 10, 15, 0, 1, 8, 9, 4, 13, 4,156, 13, 16, 16,212,236, 17, 23, 57,204, 50, 16,204, 50, 48, 64, 12, 14, 15, + 15, 0, 14, 13, 14, 13,156, 0, 15, 0, 7, 5, 16,252, 60, 8, 6, 16, 60, 64, 12, 3, 2, 2, 1, 3, 4, 3, 4,156, 1, 2, + 1, 7, 5, 16,252, 60, 8, 6, 16, 60, 64, 12, 11, 10, 10, 9, 11, 12, 11, 12,156, 9, 9, 10, 7, 5, 16,252, 60, 8, 6, 16, + 60, 64, 12, 6, 7, 7, 8, 6, 5, 6, 5,156, 8, 7, 8, 7, 5, 16,252, 60, 8, 6, 16, 60,176, 16, 75, 83, 88, 0,183, 11, + 10, 6, 7, 3, 2, 14, 15, 16, 60, 16, 60, 16, 60, 16, 60,180, 14,156, 15, 15, 0, 7, 5, 16,236,180, 3,156, 2, 2, 1, 7, + 5, 16,236,180, 11,156, 10, 10, 9, 7, 5, 16,236,180, 6,156, 7, 7, 8, 7, 5, 16,236, 89, 19, 53, 1, 23, 7, 33, 39, 55, + 1, 21, 1, 39, 55, 33, 23, 7,100, 1,137,120,233, 3,188,233,120, 1,137,254,119,120,233,252, 68,233,120, 2, 85, 90, 1,137, +120,233,233,120,254,119, 90,254,119,120,233,233,120, 0, 0, 0, 0, 1, 1,163,255,239, 5, 15, 5,220, 0, 15, 0,222, 64, 15, + 7, 2, 4, 10, 15, 0, 1, 8, 9, 4, 13, 4,156, 13, 16, 16,212,236, 17, 23, 57,204, 50, 16,204, 50, 49, 0,182, 7, 10, 9, + 2, 15, 0, 16, 16,212,204, 50,212,204, 50, 64, 17, 95, 2, 95, 15, 80, 10, 80, 7, 79, 2, 79, 15, 64, 10, 64, 7, 8, 93, 48, + 64, 12, 14, 15, 15, 0, 14, 13, 14, 13,156, 0, 15, 0, 7, 4, 16,252, 60, 8, 6, 16, 60, 64, 12, 3, 2, 2, 1, 3, 4, 3, + 4,156, 1, 2, 1, 7, 4, 16,252, 60, 8, 6, 16, 60, 64, 12, 11, 10, 10, 9, 11, 12, 11, 12,156, 9, 9, 10, 7, 4, 16,252, + 60, 8, 6, 16, 60, 64, 12, 6, 7, 7, 8, 6, 5, 6, 5,156, 8, 7, 8, 7, 4, 16,252, 60, 8, 6, 16, 60,176, 16, 75, 83, + 88, 1,183, 11, 10, 6, 7, 3, 2, 14, 15, 16, 60, 16, 60, 16, 60, 16, 60,180, 14,156, 15, 15, 0, 7, 4, 16,236,180, 3,156, + 2, 2, 1, 7, 4, 16,236,180, 11,156, 10, 10, 9, 7, 4, 16,236,180, 6,156, 7, 7, 8, 7, 4, 16,236, 89, 1, 51, 1, 7, + 39, 17, 55, 23, 1, 35, 1, 55, 23, 17, 7, 39, 3, 45, 90, 1,136,120,232,232,120,254,120, 90,254,118,120,234,234,120, 5,220, +254,118,120,234,252, 67,234,120,254,118, 1,138,120,234, 3,189,234,120, 0, 0, 0, 1, 1, 32, 0, 52, 5,159, 4,179, 0, 9, + 0, 0, 1, 55, 33, 21, 33, 1, 7, 1, 17, 35, 1, 32, 63, 2, 44,254,182, 3, 94,120,252,162,169, 4,116, 63,169,252,162,120, + 3, 94,254,182, 0, 1, 1, 32, 0, 52, 5,159, 4,179, 0, 9, 0, 0, 1, 23, 17, 35, 17, 1, 39, 1, 33, 53, 5, 96, 63,169, +252,162,120, 3, 94,254,182, 4,179, 63,253,212, 1, 74,252,162,120, 3, 94,169, 0, 1, 1, 32, 0, 52, 5,159, 4,179, 0, 9, + 0, 0, 37, 7, 33, 53, 33, 1, 55, 1, 17, 51, 5,159, 63,253,212, 1, 74,252,162,120, 3, 94,169,115, 63,169, 3, 94,120,252, +162, 1, 74, 0, 0, 1, 1, 32, 0, 52, 5,159, 4,179, 0, 9, 0, 0, 37, 39, 17, 51, 17, 1, 23, 1, 33, 21, 1, 95, 63,169, + 3, 94,120,252,162, 1, 74, 52, 63, 2, 44,254,182, 3, 94,120,252,162,169, 0, 0, 1, 0,100, 0,204, 5, 63, 5, 3, 0, 11, + 0, 0, 1, 33, 23, 7, 1, 53, 1, 23, 7, 33, 17, 51, 5, 63,252, 61,233,120,254,119, 1,137,120,233, 3, 25,170, 2, 45,233, +120, 1,137, 90, 1,137,120,233, 2, 44, 0, 0, 0, 1, 0,217, 2, 45, 5,219, 2,215, 0, 3, 0, 17,182, 0,156, 2, 4, 1, + 0, 4, 16,212,196, 49, 0, 16,212,236, 48, 19, 33, 21, 33,217, 5, 2,250,254, 2,215,170, 0, 0, 2, 0,217, 0, 0, 5,219, + 5, 4, 0, 11, 0, 15, 0, 0, 33, 35, 17, 33, 53, 33, 17, 51, 17, 33, 21, 33, 1, 53, 33, 21, 3,174,168,253,211, 2, 45,168, + 2, 45,253,211,253, 43, 5, 2, 1,131,170, 1,131,254,125,170, 2,215,170,170, 0, 2, 0,217, 0, 0, 5,219, 5,213, 0, 11, + 0, 15, 0, 87,186, 0, 5, 0, 6, 0, 3, 43,184, 0, 5, 16,184, 0, 0,208,184, 0, 6, 16,184, 0, 10,208,184, 0, 6, 16, +184, 0, 12,208,184, 0, 5, 16,184, 0, 13,208, 0,184, 0, 5, 47,186, 0, 13, 0, 14, 0, 3, 43,184, 0, 13, 16,186, 0, 2, + 0, 3, 0, 3, 43,184, 0, 2, 16,184, 0, 3, 16,184, 0, 7,208,184, 0, 2, 16,184, 0, 9,208, 48, 49, 1, 17, 33, 21, 33, + 17, 35, 17, 33, 53, 33, 25, 1, 51, 21, 35, 3,174, 2, 45,253,211,168,253,211, 2, 45,168,168, 4,160,254, 5,170,254, 5, 1, +251,170, 1,251, 1, 53,204, 0, 0, 1,254,137,255,227, 2,205, 5,240, 0, 3, 0, 43, 64, 19, 0, 15, 1, 2, 1, 2, 15, 3, + 0, 3, 66, 2,140, 0,145, 4, 1, 3, 4, 16,212,204, 49, 0, 16,228,228, 48, 75, 83, 88, 7, 16, 5,237, 7, 16, 5,237, 89, + 34, 1, 51, 1, 35, 2, 45,160,252, 92,160, 5,240,249,243, 0,255,255, 1,138,255,146, 4, 60, 6, 37, 16, 3, 0, 63, 1,138, + 0, 80, 0, 0,255,255, 0,190, 0,175, 4, 68, 4, 85, 16, 7, 0, 13, 0,129,254,101, 0, 0,255,255, 1, 68, 1, 71, 3,190, + 3,194, 16, 7, 0,114, 0,129,253,210, 0, 0, 0, 1, 0,219, 2, 72, 1,174, 3, 70, 0, 3, 0, 18,183, 2,131, 0, 4, 1, + 25, 0, 4, 16,212,236, 49, 0, 16,212,236, 48, 19, 51, 21, 35,219,211,211, 3, 70,254, 0, 0, 0, 1, 0, 61,255,215, 5, 25, + 6,125, 0, 10, 0, 42, 64, 24, 10, 9, 8, 7, 6, 5, 11, 2, 4, 2, 0, 11, 10, 9, 7, 6, 5, 4, 3, 0, 8, 1, 8, 11, + 16,212,204, 23, 57, 49, 0, 16,212,204,196, 17, 18, 23, 57, 48, 1, 51, 21, 35, 1, 35, 1, 7, 39, 37, 1, 4, 92,189,115,253, +174, 66,254,193,125, 25, 1, 27, 1, 0, 6,125, 96,249,186, 3,115, 45, 80, 98,253, 59, 0, 0,255,255, 0, 61,255,215, 5, 25, + 7,208, 18, 34, 6, 95, 0, 0, 16, 3, 0,117, 0,115, 1,224,255,255, 0, 61,255,215, 5, 25, 7,191, 18, 34, 6, 95, 0, 0, + 16, 3, 5,206, 0,115, 1,224, 0, 2, 0,221, 0,221, 4,141, 3,238, 0, 11, 0, 37, 0, 0, 1, 46, 1, 35, 34, 6, 21, 20, + 22, 51, 50, 54, 1, 34, 38, 39, 14, 1, 35, 34, 38, 53, 52, 54, 51, 50, 22, 23, 62, 1, 51, 21, 34, 6, 7, 30, 1, 51, 3, 25, + 49,133, 85,102,127,118, 89, 82,134, 1,189, 73,149, 79, 70,157, 94,136,186,167,134, 95,153, 72, 68,158, 97, 43,133, 74, 49,134, + 67, 2,154, 88, 88,132,106,101,134,136,254,232,119,139,135,127,223,166,175,216,126,138,138,131,150,135,162, 88, 90, 0, 0, 0, + 0, 3, 0,221, 0,221, 5,207, 3,238, 0, 11, 0, 23, 0, 47, 0,255, 64, 29, 45, 27, 21, 9, 33, 3, 0, 36, 24, 4, 21, 15, + 39, 33, 21, 27, 15, 33, 48, 12, 0, 36, 24, 18, 6, 42, 18, 30, 48, 16,212,196,212,196, 17, 57, 57, 57, 57, 49, 0, 16,212,196, +212,196, 16,192, 17, 18, 23, 57, 18, 57, 17, 18, 57, 48, 64,190, 5, 2, 5, 3, 5, 4, 0, 5, 0, 6, 0, 7, 5, 8, 5, 9, + 5, 10, 10, 16, 15, 17, 15, 18, 15, 19, 10, 20, 21, 2, 21, 3, 21, 4, 16, 5, 16, 6, 16, 7, 21, 8, 21, 9, 21, 10, 26, 14, + 26, 15, 26, 16, 31, 17, 31, 18, 31, 19, 26, 20, 26, 21, 26, 22, 36, 2, 36, 3, 36, 4, 32, 5, 32, 6, 32, 7, 36, 8, 36, 9, + 36, 10, 42, 14, 42, 15, 42, 16, 47, 17, 47, 18, 47, 19, 42, 20, 42, 21, 42, 22, 53, 2, 53, 3, 53, 4, 48, 5, 48, 6, 48, 7, + 53, 8, 53, 9, 53, 10, 58, 14, 58, 15, 58, 16, 63, 17, 63, 18, 63, 19, 58, 20, 58, 21, 58, 22, 69, 2, 69, 3, 69, 4, 64, 5, + 64, 6, 64, 7, 69, 8, 69, 9, 69, 10, 74, 14, 74, 15, 74, 16, 79, 17, 79, 18, 79, 19, 74, 20, 74, 21, 74, 22, 86,180, 31,176, + 32,176, 33,176, 34,176, 38,176, 39,176, 40,180, 41, 8, 93, 1, 93, 1, 30, 1, 51, 50, 54, 53, 52, 38, 35, 34, 6, 7, 46, 1, + 35, 34, 6, 21, 20, 22, 51, 50, 54, 23, 14, 1, 35, 34, 38, 53, 52, 54, 51, 50, 22, 23, 62, 1, 51, 50, 22, 21, 20, 6, 35, 34, + 38, 3,147, 49,134, 84,101,128,118, 89, 82,133,196, 49,133, 85,102,127,118, 89, 82,134,144, 70,157, 94,136,186,167,134, 95,153, + 72, 68,158, 97,134,188,167,134, 94,149, 2, 47, 88, 90,135,105,101,134,135, 55, 88, 88,132,106,101,134,136, 22,135,127,223,166, +175,216,126,138,138,131,225,167,175,214,119, 0, 0, 6, 0,247, 0, 1, 7, 9, 6, 19, 0, 3, 0, 49, 0, 59, 0, 70, 0, 79, + 0, 89, 0, 0, 1, 33, 17, 33, 17, 21, 20, 6, 32, 38, 53, 52, 54, 59, 1, 17, 35, 34, 38, 53, 52, 54, 32, 22, 29, 1, 33, 53, + 52, 54, 51, 50, 22, 21, 20, 6, 43, 1, 17, 51, 50, 22, 21, 20, 6, 35, 34, 38, 61, 1, 1, 53, 52, 38, 35, 34, 6, 20, 22, 51, + 19, 35, 34, 6, 21, 20, 22, 51, 50, 54, 53, 1, 51, 50, 54, 52, 38, 34, 6, 21, 17, 21, 20, 22, 50, 54, 53, 52, 38, 35, 3,108, + 1, 40,254,216,185,254,252,184,184,127,170,170,127,184,184, 1, 4,185, 1, 40,185,130,131,183,183,128,170,170,128,183,183,131, +130,185,254, 68, 98, 69, 68, 98, 98, 69,166,166, 69, 98, 98, 69, 68, 98, 2, 80,167, 68, 98, 97,138, 98, 98,138, 97, 98, 68, 2, +118, 1, 40,254, 68,170,128,183,184,131,128,186, 1, 40,186,129,130,184,183,128,170,170,128,183,184,130,129,186,254,216,186,128, +131,184,183,128,170, 2, 80,167, 69, 97, 97,138, 98,253,176, 98, 68, 69, 98, 98, 68, 2,247, 98,138, 97, 97, 69,253, 9,167, 68, + 98, 98, 69, 68, 98, 0, 0, 0, 0, 1, 0,217, 1, 31, 5,219, 3, 94, 0, 5, 0, 0, 1, 33, 17, 51, 17, 33, 5,219,250,254, +168, 4, 90, 1, 31, 2, 63,254,107, 0, 0, 0, 0, 2, 0,172, 0, 0, 7, 84, 5,200, 0, 7, 0, 11, 0, 0, 19, 33, 1, 33, + 21, 33, 1, 33, 37, 33, 21, 33,172, 2, 66, 2,154, 1,204,253,188,253,102,254, 54, 3,244, 2,180,253, 76, 5,200,250,204,148, + 5, 52,148,148, 0, 1, 0,183,254,242, 2,123, 6, 18, 0, 5, 0, 0, 19, 1, 51, 9, 1, 35,183, 1, 26,170,254,230, 1, 26, +170, 2,130,252,112, 3,144, 3,144, 0, 0, 0, 0, 1, 0,164,254,242, 2,104, 6, 18, 0, 5, 0, 0, 9, 1, 35, 9, 1, 51, + 2,104,254,230,170, 1, 26,254,230,170, 2,130,252,112, 3,144, 3,144, 0, 0, 0, 3, 0,152,255,236, 6,148, 5,232, 0, 13, + 0, 27, 0, 38, 0,219,186, 0, 14, 0, 6, 0, 3, 43,184, 0, 14, 16,186, 0, 35, 0, 29, 0, 3, 43,184, 0, 35, 16,186, 0, + 0, 0, 20, 0, 3, 43,184, 0, 0, 16, 65, 27, 0, 22, 0, 14, 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, + 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, 0, 14, 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, + 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, 65, 5, 0,234, 0, 20, 0,250, 0, 20, 0, 2, 93, 65, 27, 0, + 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, 20, 0,105, 0, 20, 0,121, 0, 20, 0,137, 0, 20, 0, +153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, 20, 0, 13, 93, 0,186, 0, 17, 0, 3, 0, 3, 43,184, + 0, 17, 16,186, 0, 10, 0, 24, 0, 3, 43,184, 0, 10, 16,186, 0, 36, 0, 37, 0, 3, 43,184, 0, 36, 16,184, 0, 28,208, 48, + 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, 50, 4, 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 1, 51, 17, + 7, 53, 37, 51, 17, 51, 21, 33, 6,148,254, 63,254,194,254,196,254, 63,206, 1,113,190,193, 1,113,205,250, 87, 1,143, 1, 28, + 1, 28, 1,143,182,254,184,173,173,254,184,182, 1,124,217,236, 1, 1,161,218,253,151, 2,234,254,193,254, 65, 1,191, 1, 63, +198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, 28,179, 1, 71,177,177,254,185,253,255, 2,126, 43,152, 47,252,230, +142, 0, 0, 0, 0, 3, 0,152,255,236, 6,148, 5,232, 0, 13, 0, 27, 0, 56, 1, 63,186, 0, 14, 0, 6, 0, 3, 43,184, 0, + 14, 16,186, 0, 51, 0, 38, 0, 3, 43,184, 0, 51, 16,186, 0, 0, 0, 20, 0, 3, 43,184, 0, 0, 16, 65, 27, 0, 22, 0, 14, + 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, + 0,166, 0, 14, 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, + 65, 5, 0,234, 0, 20, 0,250, 0, 20, 0, 2, 93, 65, 27, 0, 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, + 89, 0, 20, 0,105, 0, 20, 0,121, 0, 20, 0,137, 0, 20, 0,153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0, +217, 0, 20, 0, 13, 93,184, 0, 51, 16,184, 0, 29,208,184, 0, 29, 47, 65, 5, 0,234, 0, 38, 0,250, 0, 38, 0, 2, 93, 65, + 27, 0, 25, 0, 38, 0, 41, 0, 38, 0, 57, 0, 38, 0, 73, 0, 38, 0, 89, 0, 38, 0,105, 0, 38, 0,121, 0, 38, 0,137, 0, + 38, 0,153, 0, 38, 0,169, 0, 38, 0,185, 0, 38, 0,201, 0, 38, 0,217, 0, 38, 0, 13, 93,186, 0, 44, 0, 6, 0, 0, 17, + 18, 57, 0,186, 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, 0, 3, 43,184, 0, 10, 16,186, 0, 29, 0, 30, + 0, 3, 43,184, 0, 29, 16,186, 0, 48, 0, 41, 0, 3, 43,184, 0, 48, 16, 48, 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, + 50, 4, 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 1, 33, 21, 33, 53, 54, 36, 55, 62, 1, 53, 52, 38, 35, 34, + 6, 7, 53, 62, 1, 51, 50, 22, 21, 20, 6, 7, 14, 1, 6,148,254, 63,254,194,254,196,254, 63,206, 1,113,190,193, 1,113,205, +250, 87, 1,143, 1, 28, 1, 28, 1,143,182,254,184,173,173,254,184,182, 2, 79, 1,180,253, 92, 82, 1, 6, 33, 62, 47, 95, 78, + 59,132,115, 97,145, 61,163,197, 48, 62, 17,178, 2,234,254,193,254, 65, 1,191, 1, 63,198, 1,114,198,198,254,144,200,254,228, +254,112, 1,144, 1, 28,179, 1, 71,177,177,254,185,253,255,142,129, 77,241, 34, 63, 85, 40, 63, 78, 38, 58,171, 36, 31,151,125, + 58,105, 70, 18,167, 0, 0, 0, 0, 3, 0,152,255,236, 6,148, 5,232, 0, 13, 0, 27, 0, 68, 1,181,186, 0, 14, 0, 6, 0, + 3, 43,184, 0, 14, 16,186, 0, 66, 0, 53, 0, 3, 43,184, 0, 66, 16,186, 0, 0, 0, 20, 0, 3, 43,184, 0, 0, 16, 65, 27, + 0, 22, 0, 14, 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, + 0,150, 0, 14, 0,166, 0, 14, 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, + 14, 0, 2, 93, 65, 5, 0,234, 0, 20, 0,250, 0, 20, 0, 2, 93, 65, 27, 0, 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, + 73, 0, 20, 0, 89, 0, 20, 0,105, 0, 20, 0,121, 0, 20, 0,137, 0, 20, 0,153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0, +201, 0, 20, 0,217, 0, 20, 0, 13, 93, 65, 5, 0,234, 0, 53, 0,250, 0, 53, 0, 2, 93, 65, 27, 0, 25, 0, 53, 0, 41, 0, + 53, 0, 57, 0, 53, 0, 73, 0, 53, 0, 89, 0, 53, 0,105, 0, 53, 0,121, 0, 53, 0,137, 0, 53, 0,153, 0, 53, 0,169, 0, + 53, 0,185, 0, 53, 0,201, 0, 53, 0,217, 0, 53, 0, 13, 93,186, 0, 28, 0, 53, 0, 66, 17, 18, 57,186, 0, 44, 0, 53, 0, + 66, 17, 18, 57,184, 0, 44, 47, 65, 5, 0,234, 0, 44, 0,250, 0, 44, 0, 2, 93, 65, 27, 0, 25, 0, 44, 0, 41, 0, 44, 0, + 57, 0, 44, 0, 73, 0, 44, 0, 89, 0, 44, 0,105, 0, 44, 0,121, 0, 44, 0,137, 0, 44, 0,153, 0, 44, 0,169, 0, 44, 0, +185, 0, 44, 0,201, 0, 44, 0,217, 0, 44, 0, 13, 93,184, 0, 31,220,186, 0, 38, 0, 6, 0, 0, 17, 18, 57,186, 0, 59, 0, + 6, 0, 0, 17, 18, 57, 0,186, 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, 0, 3, 43,184, 0, 10, 16,186, + 0, 41, 0, 34, 0, 3, 43,184, 0, 41, 16,186, 0, 63, 0, 56, 0, 3, 43,184, 0, 63, 16,186, 0, 50, 0, 47, 0, 3, 43,184, + 0, 50, 16,186, 0, 28, 0, 47, 0, 50, 17, 18, 57, 48, 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, 50, 4, 18, 5, 16, 0, + 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 5, 30, 1, 21, 20, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 43, 1, + 53, 51, 50, 54, 53, 52, 38, 35, 34, 6, 7, 53, 62, 1, 51, 50, 22, 21, 20, 6, 6,148,254, 63,254,194,254,196,254, 63,206, 1, +113,190,193, 1,113,205,250, 87, 1,143, 1, 28, 1, 28, 1,143,182,254,184,173,173,254,184,182, 3,185, 13,118,216,195, 64,136, + 88, 91,125, 68,117,115,107, 99,140,145, 90, 88, 92, 91, 52,121,107, 95,136, 61,161,193,104, 2,234,254,193,254, 65, 1,191, 1, + 63,198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, 28,179, 1, 71,177,177,254,185,150, 3,129, 93,141,156, 23, 27, +168, 48, 28, 79, 76, 71, 78,140, 60, 58, 60, 63, 21, 32,151, 24, 20,137,115, 81,114, 0, 0, 0, 0, 4, 0,152,255,236, 6,148, + 5,232, 0, 13, 0, 27, 0, 30, 0, 41, 0,243,186, 0, 14, 0, 6, 0, 3, 43,184, 0, 14, 16,186, 0, 32, 0, 28, 0, 3, 43, +184, 0, 32, 16,186, 0, 0, 0, 20, 0, 3, 43,184, 0, 0, 16, 65, 27, 0, 22, 0, 14, 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, + 0, 14, 0, 86, 0, 14, 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, 0, 14, 0,182, 0, 14, 0,198, + 0, 14, 0,214, 0, 14, 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, 65, 5, 0,234, 0, 20, 0,250, 0, 20, + 0, 2, 93, 65, 27, 0, 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, 20, 0,105, 0, 20, 0,121, 0, + 20, 0,137, 0, 20, 0,153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, 20, 0, 13, 93,184, 0, 32, 16, +184, 0, 36,208,184, 0, 28, 16,184, 0, 38,208, 0,186, 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, 0, 3, + 43,184, 0, 10, 16,186, 0, 34, 0, 35, 0, 3, 43,184, 0, 34, 16,184, 0, 29,208,184, 0, 35, 16,184, 0, 39,208, 48, 49, 1, + 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, 50, 4, 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 37, 1, 33, 3, 51, + 17, 51, 21, 35, 21, 35, 53, 33, 53, 6,148,254, 63,254,194,254,196,254, 63,206, 1,113,190,193, 1,113,205,250, 87, 1,143, 1, + 28, 1, 28, 1,143,182,254,184,173,173,254,184,182, 2,191,254,243, 1, 13, 24,206,141,141,182,254, 67, 2,234,254,193,254, 65, + 1,191, 1, 63,198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, 28,179, 1, 71,177,177,254,185, 79,254,130, 2, 72, +253,184,141,211,211,142, 0, 0, 0, 3, 0,152,255,236, 6,148, 5,232, 0, 13, 0, 27, 0, 57, 1, 75,186, 0, 14, 0, 6, 0, + 3, 43,184, 0, 14, 16,186, 0, 31, 0, 28, 0, 3, 43,184, 0, 31, 16,186, 0, 38, 0, 51, 0, 3, 43,184, 0, 38, 16,186, 0, + 0, 0, 20, 0, 3, 43,184, 0, 0, 16, 65, 27, 0, 22, 0, 14, 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, + 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, 0, 14, 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, + 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, 65, 5, 0,234, 0, 20, 0,250, 0, 20, 0, 2, 93, 65, 27, 0, + 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, 20, 0,105, 0, 20, 0,121, 0, 20, 0,137, 0, 20, 0, +153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, 20, 0, 13, 93,186, 0, 45, 0, 6, 0, 0, 17, 18, 57, + 65, 5, 0,234, 0, 51, 0,250, 0, 51, 0, 2, 93, 65, 27, 0, 25, 0, 51, 0, 41, 0, 51, 0, 57, 0, 51, 0, 73, 0, 51, 0, + 89, 0, 51, 0,105, 0, 51, 0,121, 0, 51, 0,137, 0, 51, 0,153, 0, 51, 0,169, 0, 51, 0,185, 0, 51, 0,201, 0, 51, 0, +217, 0, 51, 0, 13, 93, 0,186, 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, 0, 3, 43,184, 0, 10, 16,186, + 0, 48, 0, 41, 0, 3, 43,184, 0, 48, 16,186, 0, 29, 0, 30, 0, 3, 43,184, 0, 29, 16,186, 0, 35, 0, 54, 0, 3, 43,184, + 0, 35, 16, 48, 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, 50, 4, 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, + 2, 1, 33, 21, 33, 21, 6, 54, 51, 50, 22, 21, 20, 6, 35, 34, 38, 39, 53, 30, 1, 51, 50, 54, 53, 52, 38, 35, 34, 6, 7, 6, +148,254, 63,254,194,254,196,254, 63,206, 1,113,190,193, 1,113,205,250, 87, 1,143, 1, 28, 1, 28, 1,143,182,254,184,173,173, +254,184,182, 1,152, 2, 61,254,111, 3, 63, 31,176,207,213,190, 64,133, 88, 95,119, 68,104,118,118,104, 50,101, 89, 2,234,254, +193,254, 65, 1,191, 1, 63,198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, 28,179, 1, 71,177,177,254,185, 1, 25, +142,171, 1, 10,176,149,152,172, 20, 24,172, 47, 27, 97, 85, 86, 97, 20, 37, 0, 0, 4, 0,152,255,236, 6,148, 5,232, 0, 13, + 0, 27, 0, 39, 0, 64, 1,145,186, 0, 14, 0, 6, 0, 3, 43,184, 0, 14, 16,186, 0, 31, 0, 59, 0, 3, 43,184, 0, 31, 16, +186, 0, 53, 0, 37, 0, 3, 43,184, 0, 53, 16,186, 0, 0, 0, 20, 0, 3, 43,184, 0, 0, 16, 65, 27, 0, 22, 0, 14, 0, 38, + 0, 14, 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, + 0, 14, 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, 65, 5, + 0,234, 0, 20, 0,250, 0, 20, 0, 2, 93, 65, 27, 0, 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, + 20, 0,105, 0, 20, 0,121, 0, 20, 0,137, 0, 20, 0,153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, + 20, 0, 13, 93, 65, 27, 0, 22, 0, 31, 0, 38, 0, 31, 0, 54, 0, 31, 0, 70, 0, 31, 0, 86, 0, 31, 0,102, 0, 31, 0,118, + 0, 31, 0,134, 0, 31, 0,150, 0, 31, 0,166, 0, 31, 0,182, 0, 31, 0,198, 0, 31, 0,214, 0, 31, 0, 13, 93, 65, 5, 0, +229, 0, 31, 0,245, 0, 31, 0, 2, 93, 65, 5, 0,234, 0, 37, 0,250, 0, 37, 0, 2, 93, 65, 27, 0, 25, 0, 37, 0, 41, 0, + 37, 0, 57, 0, 37, 0, 73, 0, 37, 0, 89, 0, 37, 0,105, 0, 37, 0,121, 0, 37, 0,137, 0, 37, 0,153, 0, 37, 0,169, 0, + 37, 0,185, 0, 37, 0,201, 0, 37, 0,217, 0, 37, 0, 13, 93,186, 0, 41, 0, 37, 0, 53, 17, 18, 57, 0,186, 0, 17, 0, 3, + 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, 0, 3, 43,184, 0, 10, 16,186, 0, 34, 0, 56, 0, 3, 43,184, 0, 34, 16,186, + 0, 62, 0, 44, 0, 3, 43,184, 0, 62, 16,186, 0, 50, 0, 28, 0, 3, 43,184, 0, 50, 16, 48, 49, 1, 16, 0, 33, 32, 0, 17, + 52, 18, 36, 51, 50, 4, 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 5, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, + 38, 19, 21, 46, 1, 35, 34, 6, 7, 6, 54, 51, 50, 22, 21, 20, 6, 35, 34, 38, 53, 52, 18, 51, 50, 22, 6,148,254, 63,254,194, +254,196,254, 63,206, 1,113,190,193, 1,113,205,250, 87, 1,143, 1, 28, 1, 28, 1,143,182,254,184,173,173,254,184,182, 2,161, + 78, 92, 92, 78, 78, 92, 92,212, 84, 97, 47,119,127, 5, 9,128, 78,160,186,194,160,185,192,234,200, 53,106, 2,234,254,193,254, + 65, 1,191, 1, 63,198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, 28,179, 1, 71,177,177,254,185,159, 98, 91, 90, + 98, 98, 90, 91, 98, 1,157,156, 35, 22,148, 80, 11, 61,177,148,145,179,253,231,218, 1, 11, 19, 0, 3, 0,152,255,236, 6,148, + 5,232, 0, 13, 0, 27, 0, 34, 0,235,184, 0, 35, 47,184, 0, 36, 47,184, 0, 0,220,184, 0, 35, 16,184, 0, 6,208,184, 0, + 6, 47,184, 0, 14,220, 65, 27, 0, 22, 0, 14, 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, 0,102, 0, 14, + 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, 0, 14, 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, 0, 13, 93, 65, + 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93,184, 0, 0, 16,184, 0, 20,220, 65, 5, 0,234, 0, 20, 0,250, 0, 20, 0, 2, + 93, 65, 27, 0, 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, 20, 0,105, 0, 20, 0,121, 0, 20, 0, +137, 0, 20, 0,153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, 20, 0, 13, 93,186, 0, 32, 0, 6, 0, + 0, 17, 18, 57,186, 0, 33, 0, 6, 0, 0, 17, 18, 57, 0,186, 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, + 0, 3, 43,184, 0, 10, 16,186, 0, 29, 0, 33, 0, 3, 43,184, 0, 29, 16, 48, 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, + 50, 4, 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 1, 33, 21, 1, 35, 1, 33, 6,148,254, 63,254,194,254,196, +254, 63,206, 1,113,190,193, 1,113,205,250, 87, 1,143, 1, 28, 1, 28, 1,143,182,254,184,173,173,254,184,182, 1,107, 2,171, +254,148,193, 1, 81,254, 49, 2,234,254,193,254, 65, 1,191, 1, 63,198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, + 28,179, 1, 71,177,177,254,185, 1, 25, 75,252,163, 3, 26, 0, 0, 5, 0,152,255,236, 6,148, 5,232, 0, 13, 0, 27, 0, 39, + 0, 63, 0, 75, 2, 13,186, 0, 14, 0, 6, 0, 3, 43,184, 0, 14, 16,186, 0, 31, 0, 61, 0, 3, 43,184, 0, 31, 16,186, 0, + 49, 0, 70, 0, 3, 43,184, 0, 49, 16,186, 0, 0, 0, 20, 0, 3, 43,184, 0, 0, 16, 65, 27, 0, 22, 0, 14, 0, 38, 0, 14, + 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, 0, 14, + 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, 65, 5, 0,234, + 0, 20, 0,250, 0, 20, 0, 2, 93, 65, 27, 0, 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, 20, 0, +105, 0, 20, 0,121, 0, 20, 0,137, 0, 20, 0,153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, 20, 0, + 13, 93, 65, 27, 0, 22, 0, 31, 0, 38, 0, 31, 0, 54, 0, 31, 0, 70, 0, 31, 0, 86, 0, 31, 0,102, 0, 31, 0,118, 0, 31, + 0,134, 0, 31, 0,150, 0, 31, 0,166, 0, 31, 0,182, 0, 31, 0,198, 0, 31, 0,214, 0, 31, 0, 13, 93, 65, 5, 0,229, 0, + 31, 0,245, 0, 31, 0, 2, 93, 65, 5, 0,234, 0, 70, 0,250, 0, 70, 0, 2, 93, 65, 27, 0, 25, 0, 70, 0, 41, 0, 70, 0, + 57, 0, 70, 0, 73, 0, 70, 0, 89, 0, 70, 0,105, 0, 70, 0,121, 0, 70, 0,137, 0, 70, 0,153, 0, 70, 0,169, 0, 70, 0, +185, 0, 70, 0,201, 0, 70, 0,217, 0, 70, 0, 13, 93,186, 0, 37, 0, 70, 0, 49, 17, 18, 57,184, 0, 37, 47, 65, 5, 0,234, + 0, 37, 0,250, 0, 37, 0, 2, 93, 65, 27, 0, 25, 0, 37, 0, 41, 0, 37, 0, 57, 0, 37, 0, 73, 0, 37, 0, 89, 0, 37, 0, +105, 0, 37, 0,121, 0, 37, 0,137, 0, 37, 0,153, 0, 37, 0,169, 0, 37, 0,185, 0, 37, 0,201, 0, 37, 0,217, 0, 37, 0, + 13, 93,186, 0, 43, 0, 61, 0, 31, 17, 18, 57,184, 0, 43, 47,186, 0, 52, 0, 70, 0, 49, 17, 18, 57,184, 0, 37, 16,184, 0, + 55,220,184, 0, 43, 16,184, 0, 64,220, 0,186, 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, 0, 3, 43,184, + 0, 10, 16,186, 0, 34, 0, 58, 0, 3, 43,184, 0, 34, 16,186, 0, 46, 0, 73, 0, 3, 43,184, 0, 46, 16,186, 0, 67, 0, 28, + 0, 3, 43,184, 0, 67, 16,186, 0, 52, 0, 28, 0, 67, 17, 18, 57, 48, 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, 50, 4, + 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 5, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 37, 46, 1, 53, 52, + 54, 51, 50, 22, 21, 20, 6, 7, 30, 1, 21, 20, 6, 35, 34, 38, 53, 52, 54, 55, 20, 22, 51, 50, 54, 53, 52, 38, 35, 34, 6, 6, +148,254, 63,254,194,254,196,254, 63,206, 1,113,190,193, 1,113,205,250, 87, 1,143, 1, 28, 1, 28, 1,143,182,254,184,173,173, +254,184,182, 2,175, 84, 95, 95, 84, 84, 95, 95,254,198, 4,106,183,157,157,182,105, 4, 15,118,190,173,173,190,118, 87, 81, 77, + 75, 82, 82, 75, 77, 81, 2,234,254,193,254, 65, 1,191, 1, 63,198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, 28, +179, 1, 71,177,177,254,185,230, 80, 73, 73, 80, 81, 72, 73, 80, 73, 1,118, 83,116,136,136,116, 83,118, 1, 3,131, 92,138,151, +151,138, 92,131,193, 61, 66, 66, 61, 62, 66, 66, 0, 4, 0,152,255,236, 6,148, 5,232, 0, 13, 0, 27, 0, 52, 0, 64, 1,145, +186, 0, 14, 0, 6, 0, 3, 43,184, 0, 14, 16,186, 0, 62, 0, 41, 0, 3, 43,184, 0, 62, 16,186, 0, 0, 0, 20, 0, 3, 43, +184, 0, 0, 16,186, 0, 47, 0, 56, 0, 3, 43,184, 0, 47, 16, 65, 27, 0, 22, 0, 14, 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, + 0, 14, 0, 86, 0, 14, 0,102, 0, 14, 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, 0, 14, 0,182, 0, 14, 0,198, + 0, 14, 0,214, 0, 14, 0, 13, 93, 65, 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, 65, 5, 0,234, 0, 20, 0,250, 0, 20, + 0, 2, 93, 65, 27, 0, 25, 0, 20, 0, 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, 20, 0,105, 0, 20, 0,121, 0, + 20, 0,137, 0, 20, 0,153, 0, 20, 0,169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, 20, 0, 13, 93, 65, 27, 0, 22, + 0, 62, 0, 38, 0, 62, 0, 54, 0, 62, 0, 70, 0, 62, 0, 86, 0, 62, 0,102, 0, 62, 0,118, 0, 62, 0,134, 0, 62, 0,150, + 0, 62, 0,166, 0, 62, 0,182, 0, 62, 0,198, 0, 62, 0,214, 0, 62, 0, 13, 93, 65, 5, 0,229, 0, 62, 0,245, 0, 62, 0, + 2, 93,186, 0, 29, 0, 41, 0, 62, 17, 18, 57, 65, 5, 0,234, 0, 56, 0,250, 0, 56, 0, 2, 93, 65, 27, 0, 25, 0, 56, 0, + 41, 0, 56, 0, 57, 0, 56, 0, 73, 0, 56, 0, 89, 0, 56, 0,105, 0, 56, 0,121, 0, 56, 0,137, 0, 56, 0,153, 0, 56, 0, +169, 0, 56, 0,185, 0, 56, 0,201, 0, 56, 0,217, 0, 56, 0, 13, 93, 0,186, 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, + 0, 10, 0, 24, 0, 3, 43,184, 0, 10, 16,186, 0, 32, 0, 50, 0, 3, 43,184, 0, 32, 16,186, 0, 44, 0, 59, 0, 3, 43,184, + 0, 44, 16,186, 0, 53, 0, 38, 0, 3, 43,184, 0, 53, 16, 48, 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, 50, 4, 18, 5, + 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, 2, 1, 53, 30, 1, 51, 50, 54, 55, 54, 6, 35, 34, 38, 53, 52, 54, 51, 50, 22, + 21, 20, 2, 35, 34, 38, 19, 50, 54, 53, 52, 38, 35, 34, 6, 21, 20, 22, 6,148,254, 63,254,194,254,196,254, 63,206, 1,113,190, +193, 1,113,205,250, 87, 1,143, 1, 28, 1, 28, 1,143,182,254,184,173,173,254,184,182, 1,144, 85, 97, 46,119,127, 5, 10,128, + 79,159,186,194,160,185,191,233,200, 53,107,217, 78, 91, 91, 78, 78, 92, 92, 2,234,254,193,254, 65, 1,191, 1, 63,198, 1,114, +198,198,254,144,200,254,228,254,112, 1,144, 1, 28,179, 1, 71,177,177,254,185,253,139,156, 36, 21,147, 79, 13, 60,175,148,145, +180,253,232,218,254,246, 19, 1,180, 98, 91, 91, 98, 98, 91, 91, 98, 0, 0, 0, 0, 5, 0,152,255,236, 6,148, 5,232, 0, 13, + 0, 27, 0, 38, 0, 50, 0, 62, 1,155,186, 0, 14, 0, 6, 0, 3, 43,184, 0, 14, 16,186, 0, 35, 0, 29, 0, 3, 43,184, 0, + 35, 16,186, 0, 42, 0, 60, 0, 3, 43,184, 0, 42, 16,186, 0, 54, 0, 48, 0, 3, 43,184, 0, 54, 16,186, 0, 0, 0, 20, 0, + 3, 43,184, 0, 0, 16, 65, 27, 0, 22, 0, 14, 0, 38, 0, 14, 0, 54, 0, 14, 0, 70, 0, 14, 0, 86, 0, 14, 0,102, 0, 14, + 0,118, 0, 14, 0,134, 0, 14, 0,150, 0, 14, 0,166, 0, 14, 0,182, 0, 14, 0,198, 0, 14, 0,214, 0, 14, 0, 13, 93, 65, + 5, 0,229, 0, 14, 0,245, 0, 14, 0, 2, 93, 65, 5, 0,234, 0, 20, 0,250, 0, 20, 0, 2, 93, 65, 27, 0, 25, 0, 20, 0, + 41, 0, 20, 0, 57, 0, 20, 0, 73, 0, 20, 0, 89, 0, 20, 0,105, 0, 20, 0,121, 0, 20, 0,137, 0, 20, 0,153, 0, 20, 0, +169, 0, 20, 0,185, 0, 20, 0,201, 0, 20, 0,217, 0, 20, 0, 13, 93, 65, 5, 0,234, 0, 48, 0,250, 0, 48, 0, 2, 93, 65, + 27, 0, 25, 0, 48, 0, 41, 0, 48, 0, 57, 0, 48, 0, 73, 0, 48, 0, 89, 0, 48, 0,105, 0, 48, 0,121, 0, 48, 0,137, 0, + 48, 0,153, 0, 48, 0,169, 0, 48, 0,185, 0, 48, 0,201, 0, 48, 0,217, 0, 48, 0, 13, 93, 65, 5, 0,234, 0, 60, 0,250, + 0, 60, 0, 2, 93, 65, 27, 0, 25, 0, 60, 0, 41, 0, 60, 0, 57, 0, 60, 0, 73, 0, 60, 0, 89, 0, 60, 0,105, 0, 60, 0, +121, 0, 60, 0,137, 0, 60, 0,153, 0, 60, 0,169, 0, 60, 0,185, 0, 60, 0,201, 0, 60, 0,217, 0, 60, 0, 13, 93, 0,186, + 0, 17, 0, 3, 0, 3, 43,184, 0, 17, 16,186, 0, 10, 0, 24, 0, 3, 43,184, 0, 10, 16,186, 0, 45, 0, 57, 0, 3, 43,184, + 0, 45, 16,186, 0, 36, 0, 37, 0, 3, 43,184, 0, 36, 16,186, 0, 51, 0, 39, 0, 3, 43,184, 0, 51, 16,184, 0, 36, 16,184, + 0, 28,208, 48, 49, 1, 16, 0, 33, 32, 0, 17, 52, 18, 36, 51, 50, 4, 18, 5, 16, 0, 33, 32, 0, 17, 52, 2, 36, 35, 34, 4, + 2, 19, 51, 17, 7, 53, 55, 51, 17, 51, 21, 33, 1, 34, 6, 21, 20, 22, 51, 50, 54, 53, 52, 38, 39, 50, 22, 21, 20, 6, 35, 34, + 38, 53, 52, 54, 6,148,254, 63,254,194,254,196,254, 63,206, 1,113,190,193, 1,113,205,250, 87, 1,143, 1, 28, 1, 28, 1,143, +182,254,184,173,173,254,184,182,205,158,172,188,117,159,254, 62, 3, 4, 64, 69, 69, 64, 63, 70, 70, 63,130,136,136,130,131,136, +136, 2,234,254,193,254, 65, 1,191, 1, 63,198, 1,114,198,198,254,144,200,254,228,254,112, 1,144, 1, 28,179, 1, 71,177,177, +254,185,254, 62, 2, 62, 39,137, 42,253, 54,128, 2,222,151,163,162,151,151,162,163,151,123,228,209,208,228,228,208,209,228, 0, + 0, 1, 0,170, 1,119, 6,130, 4, 99, 0, 5, 0, 11, 0,184, 0, 2, 47,184, 0, 5, 47, 48, 49, 19, 17, 37, 5, 17, 5,170, + 1,119, 4, 97,251,159, 2, 50, 1,117,188,188,254,139,187, 0, 0, 1, 0,170, 0, 0, 4,116, 5,217, 0, 19, 0, 31, 0,184, + 0, 5, 47,186, 0, 16, 0, 18, 0, 3, 43,184, 0, 16, 16,184, 0, 18, 16,184, 0, 13,208,184, 0, 13, 47, 48, 49, 1, 22, 21, + 20, 7, 3, 33, 3, 38, 53, 52, 55, 54, 39, 35, 53, 33, 23, 7, 22, 3,126,246, 8,238,254, 34,237, 9,246,127, 7,117, 1,218, + 1,119, 1, 4,224, 66,179, 32, 36,252, 89, 3,167, 38, 34,175, 66, 26,134, 89, 89, 1,135, 0, 0, 1, 0, 47, 0, 0, 5,170, + 6, 20, 0, 36, 0, 72, 64, 19, 38, 0, 7, 9, 5, 8, 12, 33, 24, 13, 30, 8, 17, 12, 33, 16, 20, 76, 37, 16,252, 60,196, 50, +196,252, 60,196, 16, 60,252, 60,196,196,196, 49, 0, 64, 17, 9, 13, 17,169, 18, 2, 26,135, 0, 24,151, 6, 31, 18,188, 11, 15, + 47, 60,230, 50, 50,254, 60,238, 50, 16,238, 50, 50, 48, 1, 21, 35, 34, 6, 29, 1, 33, 21, 33, 17, 35, 17, 33, 17, 35, 17, 35, + 53, 51, 53, 52, 54, 59, 1, 21, 35, 34, 7, 6, 29, 1, 33, 53, 52, 54, 51, 5,170,176, 99, 77, 1, 47,254,209,185,254, 7,185, +176,176,174,189,174,176, 99, 39, 38, 1,249,174,189, 6, 20,153, 80,104, 99,143,252, 47, 3,209,252, 47, 3,209,143, 78,187,171, +153, 40, 40,104, 99, 78,187,171, 0, 2, 0, 47, 0, 0, 4, 74, 6, 20, 0, 21, 0, 25, 0, 67, 64, 17, 27, 70, 0, 23, 8, 22, + 15, 20, 4, 8, 8, 3, 22, 10, 6, 76, 26, 16,252, 60,196, 50,196,252, 60,196, 16,254, 60,236, 49, 0, 64, 18, 8, 3,169, 0, + 16,135, 14, 24,190, 22,177, 14,151, 9, 0,188, 5, 1, 47, 60,230, 50,238,254,238, 16,238, 16,238, 50, 48, 1, 17, 35, 17, 33, + 17, 35, 17, 35, 53, 51, 53, 52, 54, 59, 1, 21, 35, 34, 6, 29, 1, 1, 51, 21, 35, 4, 74,185,254, 7,185,176,176,173,179,185, +176, 99, 77, 1,249,185,185, 4, 96,251,160, 3,209,252, 47, 3,209,143, 78,183,175,153, 80,104, 99, 1,178,233, 0, 1, 0, 47, + 0, 0, 4, 74, 6, 20, 0, 21, 0, 55, 64, 15, 23, 70, 1, 8, 4, 10, 12, 8, 8, 16, 4, 18, 14, 76, 22, 16,252, 60,196,196, +252, 60,196, 16,254,236, 49, 0, 64, 13, 15, 11,169, 9, 4,135, 0,151, 17, 9,188, 13, 2, 47, 60,230, 50,254,238, 16,238, 50, + 48, 1, 33, 17, 35, 17, 33, 34, 6, 29, 1, 33, 21, 33, 17, 35, 17, 35, 53, 51, 53, 52, 54, 2, 74, 2, 0,185,254,183, 99, 77, + 1, 47,254,209,185,176,176,174, 6, 20,249,236, 5,123, 80,104, 99,143,252, 47, 3,209,143, 78,187,171, 0, 0, 0, 2, 0, 47, + 0, 0, 6,252, 6, 20, 0, 41, 0, 45, 0, 90, 64, 24, 47, 70, 23, 43, 8, 42, 16, 27, 21, 8, 26, 42, 9, 0, 31, 6, 8, 36, + 30, 9, 34, 38, 76, 46, 16,252, 60,196, 50,196,252, 60,196, 16,196, 50,252, 60,196, 16,252, 60,236, 49, 0, 64, 23, 27, 31, 35, +169, 36, 17, 1,135, 0, 45,190, 42,177, 16, 0,151, 22, 7, 36,188, 25, 29, 33, 47, 60, 60,228, 50, 50,228, 50,244,236, 16,236, + 50, 16,236, 50, 50, 48, 1, 21, 35, 34, 7, 6, 29, 1, 33, 53, 52, 55, 54, 55, 54, 59, 1, 21, 35, 34, 6, 29, 1, 33, 17, 35, + 17, 33, 17, 35, 17, 33, 17, 35, 17, 35, 53, 51, 53, 52, 54, 51, 5, 51, 21, 35, 2,248,176, 99, 39, 38, 1,249, 87, 28, 39, 78, +131,174,176, 99, 77, 2,178,185,254, 7,185,254, 7,185,176,176,174,189, 3,249,185,185, 6, 20,153, 40, 40,104, 99, 78,187, 85, + 28, 19, 39,153, 80,104, 99,251,160, 3,209,252, 47, 3,209,252, 47, 3,209,143, 78,187,171, 2,233, 0, 0, 0, 0, 1, 0, 47, + 0, 0, 6,252, 6, 20, 0, 38, 0, 78, 64, 22, 40, 70, 13, 8, 16, 22, 24, 20, 8, 16, 9, 0, 28, 6, 8, 33, 27, 9, 31, 35, + 76, 39, 16,252, 60,196, 50,196,252, 60,196, 16,196,252, 60,196, 16,252,236, 49, 0, 64, 18, 24, 28, 32,169, 33, 17, 2,135, 12, + 38,151, 21, 7, 33,188, 15, 26, 30, 47, 60, 60,228, 50, 50,244, 60,236, 50, 16,236, 50, 50, 48, 1, 21, 35, 34, 7, 6, 29, 1, + 33, 53, 52, 54, 51, 33, 17, 35, 17, 33, 34, 6, 29, 1, 33, 21, 33, 17, 35, 17, 33, 17, 35, 17, 35, 53, 51, 53, 52, 54, 51, 2, +248,176, 99, 39, 38, 1,249,174,189, 2, 0,185,254,183, 99, 77, 1, 47,254,209,185,254, 7,185,176,176,174,189, 6, 20,153, 40, + 40,104, 99, 78,187,171,249,236, 5,123, 80,104, 99,143,252, 47, 3,209,252, 47, 3,209,143, 78,187,171, 0, 0, 0, 1, 0, 47, + 0, 0, 5, 76, 6, 20, 0, 45, 0, 0, 1, 53, 52, 39, 38, 43, 1, 34, 7, 6, 21, 17, 35, 17, 35, 53, 51, 53, 52, 55, 54, 59, + 1, 50, 23, 22, 29, 1, 33, 21, 33, 17, 20, 23, 22, 59, 1, 21, 35, 34, 39, 38, 53, 17, 35, 53, 3, 24, 36, 37,101, 34, 99, 39, + 38,185,176,176, 87, 87,189, 30,189, 87, 85, 1,123,254,133, 37, 38,115,189,189,213, 81, 81,135, 4, 96, 99,104, 40, 40, 40, 40, +104,251, 61, 3,209,143, 78,187, 85, 86, 86, 83,189, 78,143,253,160,137, 39, 39,154, 80, 79,210, 2, 96,143, 0, 0, 1, 0,111, +255,227, 6,178, 5,240, 0, 89, 0, 0, 1, 21, 38, 39, 38, 35, 34, 7, 6, 21, 20, 23, 22, 31, 1, 30, 1, 21, 20, 7, 6, 35, + 34, 39, 38, 39, 53, 22, 23, 22, 51, 50, 55, 54, 53, 52, 39, 38, 47, 1, 38, 39, 38, 53, 52, 55, 54, 51, 50, 23, 38, 53, 52, 55, + 54, 55, 50, 23, 22, 29, 1, 33, 21, 33, 17, 20, 23, 22, 59, 1, 21, 35, 34, 39, 38, 53, 17, 35, 53, 51, 53, 52, 39, 38, 7, 34, + 7, 6, 21, 20, 3, 81, 86, 73, 84, 70,117, 63, 59, 49, 49,148, 63,195,166,123,124,216, 96, 92, 97,108,102, 99, 99, 97,130, 70, + 70, 50, 45,177, 64,171, 76, 76,102,112,181, 72, 77, 5, 92, 91,162,140, 98, 94, 1,123,254,133, 37, 38,115,189,189,213, 81, 81, +135,135, 48, 54, 68, 69, 54, 52, 4, 63,174, 43, 17, 20, 42, 39, 87, 64, 37, 36, 33, 14, 43,152,137,156, 91, 91, 17, 18, 35,190, + 53, 26, 27, 45, 44, 81, 75, 40, 35, 42, 15, 36, 74, 75,130,166, 78, 86, 11, 29, 31,135, 95, 93, 1, 96, 92,136, 76,143,253,160, +137, 39, 39,154, 80, 79,210, 2, 96,143, 78, 65, 43, 50, 1, 49, 48, 64, 61, 0, 0, 1, 0,170,255,227, 8,227, 6, 20, 0, 74, + 0, 0, 1, 22, 21, 17, 35, 53, 14, 1, 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 52, 39, 33, 34, 39, 38, 55, 54, + 55, 54, 59, 1, 21, 35, 34, 21, 20, 51, 33, 39, 38, 55, 54, 59, 1, 21, 35, 38, 21, 20, 31, 1, 33, 3, 20, 23, 22, 51, 50, 54, + 53, 17, 51, 17, 35, 53, 14, 1, 35, 34, 38, 53, 17, 4, 79, 9,184, 67,177,117,193,200,184,124,124,149,173, 5,254, 83,149, 94, + 83, 3, 3, 87,115,118, 89, 89,131,131, 1,108, 23, 77, 32, 55,209,236,222, 96, 14, 59, 1,221, 1, 62, 62,124,149,173,184,184, + 67,177,117,193,200, 3,182, 37, 33,252,144,172,102, 99,240,231, 1,102,254,161,159,159,190,164, 1,145, 36, 28, 94, 83,145,131, + 66, 87,175,123,138, 56,186, 72,122,175, 1, 44, 39, 34,145,253, 97,160, 79, 79,190,164, 2,123,251,160,172,102, 99,240,231, 1, +252, 0, 0, 0, 0, 1, 0,174,255,227, 8,227, 6, 20, 0, 58, 0, 0, 1, 33, 38, 21, 20, 31, 1, 22, 21, 17, 35, 53, 14, 1, + 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 52, 47, 1, 38, 55, 54, 51, 33, 17, 33, 21, 33, 17, 20, 22, 51, 50, 55, + 54, 53, 17, 51, 17, 35, 53, 14, 1, 35, 34, 38, 53, 5, 57,254,243, 96, 14, 77, 49,184, 67,177,117,193,200,184,124,124,149,173, + 16, 77, 77, 32, 55,209, 1,211, 2,242,253, 14,124,124,152, 83, 87,184,184, 67,177,117,193,200, 5,101, 1, 44, 39, 34,188,120, + 77,252,144,172,102, 99,240,231, 2,166,253, 97,159,159,190,164, 1,145, 63, 39,188,187, 71,122,254, 76,170,254, 11,159,159, 95, + 98,161, 1, 59,252,224,172,102, 99,240,231, 0, 0, 1, 0,174,254, 86, 8,227, 6, 20, 0, 53, 0, 0, 1, 33, 38, 21, 20, 31, + 1, 22, 21, 17, 35, 53, 14, 1, 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 54, 53, 17, 52, 47, 1, 38, 55, 54, 51, 33, 17, 62, + 1, 51, 50, 22, 21, 17, 35, 17, 52, 38, 35, 34, 6, 21, 17, 35, 5, 57,254,243, 96, 14, 77, 49,184, 67,177,117,193,200,184,124, +124,149,173, 16, 77, 77, 32, 55,209, 1,212, 66,179,117,193,198,184,124,124,149,172,185, 5,101, 1, 44, 39, 34,188,120, 77,252, +144,172,102, 99,240,231, 2,166,253, 97,159,159,190,164, 1,145, 63, 39,188,187, 71,122,253,158,101,100,239,232,253, 92, 2,158, +159,158,190,164,251,221, 0, 0, 0, 2, 0,174,254, 86, 8,227, 6, 20, 0, 53, 0, 60, 0, 0, 1, 33, 34, 39, 38, 55, 54, 55, + 54, 51, 33, 17, 33, 17, 20, 22, 51, 50, 54, 53, 17, 51, 17, 35, 53, 14, 1, 35, 34, 38, 53, 17, 35, 17, 51, 21, 33, 17, 14, 1, + 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 55, 54, 53, 25, 1, 33, 34, 21, 20, 51, 3,160,254,219,149, 94, 83, 3, 3, 87,115, +118, 1,221, 1,153,124,124,149,173,184,184, 67,177,117,193,200,225,213,254,115, 67,177,117,193,200,184,124,124,149, 87, 86,254, +219,131,131, 3,182, 94, 83,145,131, 66, 87,254, 76,253, 97,159,159,190,164, 2,123,251,160,172,102, 99,240,231, 1,252,251, 66, +162, 2, 86,102, 99,240,231, 1,102,254,161,159,159, 95, 95,164, 2,123, 1, 5,123,138, 0, 0, 0, 1, 0,174,254, 86, 11,155, + 6, 20, 0, 72, 0, 0, 1, 33, 38, 21, 20, 31, 1, 22, 21, 17, 35, 53, 14, 1, 35, 34, 38, 53, 17, 51, 17, 20, 22, 51, 50, 54, + 53, 17, 52, 47, 1, 38, 55, 54, 51, 33, 17, 54, 55, 54, 51, 50, 22, 29, 1, 20, 23, 22, 51, 50, 54, 53, 17, 51, 17, 35, 53, 14, + 1, 35, 34, 39, 38, 61, 1, 52, 38, 35, 34, 6, 21, 17, 35, 5, 57,254,243, 96, 14, 77, 49,184, 67,177,117,193,200,184,124,124, +149,173, 16, 77, 77, 32, 55,209, 1,212, 99, 37, 90,107,193,198, 62, 56,110,140,173,184,184, 67,177,108,175, 98,100,124,124,120, +172,185, 5,101, 1, 44, 39, 34,188,120, 77,252,144,172,102, 99,240,231, 2,166,253, 97,159,159,190,164, 1,145, 63, 39,188,187, + 71,122,253,158,129, 22, 50,239,232,227,151, 88, 79,190,164, 2,123,251,160,172,102, 99,120,123,228,228,159,158,190,164,251,221, + 0, 3, 0, 30,255, 84, 8, 22, 7, 76, 0, 3, 0, 7, 0, 42, 0, 0, 9, 4, 21, 51, 53, 39, 53, 52, 54, 55, 54, 55, 54, 63, + 1, 54, 55, 54, 53, 52, 38, 35, 34, 6, 7, 21, 62, 1, 51, 50, 22, 21, 20, 6, 15, 1, 14, 1, 29, 1, 4, 26, 3,252,252, 4, +252, 4, 3,150,203, 6, 6, 6, 8, 19, 23, 44, 88, 92, 34, 36,223,184,103,193, 94, 97,179, 79,108,131, 51, 57, 90, 90, 56, 7, + 76,252, 4,252, 4, 3,252,253,174,254,254,147,123, 52, 60, 21, 25, 26, 31, 43, 86, 90, 64, 69, 76,159,194, 56, 57,188, 67, 70, +110, 89, 49, 94, 53, 89, 86,130,101,154, 0, 0, 0, 0, 0, 1, 0, 0, 60, 2, 0, 1, 9,254, 48, 0, 0, 11, 11,244, 0, 16, + 0, 36,255,211, 0, 16, 0, 37,255,183, 0, 16, 0, 42, 0, 75, 0, 16, 0, 45, 0,114, 0, 16, 0, 50, 0, 57, 0, 16, 0, 52, + 0, 75, 0, 16, 0, 55,255, 68, 0, 16, 0, 57,255,136, 0, 16, 0, 58,255,173, 0, 16, 0, 59,255,154, 0, 16, 0, 60,255, 13, + 0, 16, 0, 82, 0, 38, 0, 16, 0, 89,255,201, 0, 16, 0, 92,255,220, 0, 16, 0,130,255,211, 0, 16, 0,131,255,211, 0, 16, + 0,132,255,211, 0, 16, 0,133,255,211, 0, 16, 0,134,255,211, 0, 16, 0,148, 0, 57, 0, 16, 0,149, 0, 57, 0, 16, 0,150, + 0, 57, 0, 16, 0,151, 0, 57, 0, 16, 0,152, 0, 57, 0, 16, 0,159,255, 13, 0, 16, 0,180, 0, 38, 0, 16, 0,181, 0, 38, + 0, 16, 0,182, 0, 38, 0, 16, 0,183, 0, 38, 0, 16, 0,184, 0, 38, 0, 16, 0,191,255,220, 0, 16, 0,193,255,220, 0, 16, + 0,194,255,211, 0, 16, 0,196,255,211, 0, 16, 0,198,255,211, 0, 16, 0,224, 0, 75, 0, 16, 1, 38,255, 68, 0, 16, 1, 58, +255, 13, 0, 36, 0, 16,255,211, 0, 36, 0, 17,255,220, 0, 36, 0, 29,255,220, 0, 36, 0, 36, 0, 57, 0, 36, 0, 38,255,220, + 0, 36, 0, 42,255,220, 0, 36, 0, 50,255,220, 0, 36, 0, 52,255,220, 0, 36, 0, 55,255, 97, 0, 36, 0, 57,255,125, 0, 36, + 0, 58,255,144, 0, 36, 0, 60,255, 97, 0, 36, 0, 70,255,220, 0, 36, 0, 71,255,220, 0, 36, 0, 72,255,220, 0, 36, 0, 73, +255,183, 0, 36, 0, 82,255,220, 0, 36, 0, 84,255,220, 0, 36, 0, 87,255,220, 0, 36, 0, 89,255,136, 0, 36, 0, 90,255,173, + 0, 36, 0, 92,255,117, 0, 36, 0,109,255,183, 0, 36, 0,130, 0, 57, 0, 36, 0,131, 0, 57, 0, 36, 0,132, 0, 57, 0, 36, + 0,133, 0, 57, 0, 36, 0,134, 0, 57, 0, 36, 0,137,255,220, 0, 36, 0,148,255,220, 0, 36, 0,149,255,220, 0, 36, 0,150, +255,220, 0, 36, 0,151,255,220, 0, 36, 0,152,255,220, 0, 36, 0,159,255, 97, 0, 36, 0,169,255,220, 0, 36, 0,170,255,220, + 0, 36, 0,171,255,220, 0, 36, 0,172,255,220, 0, 36, 0,173,255,220, 0, 36, 0,180,255,220, 0, 36, 0,181,255,220, 0, 36, + 0,182,255,220, 0, 36, 0,183,255,220, 0, 36, 0,184,255,220, 0, 36, 0,191,255,117, 0, 36, 0,193,255,117, 0, 36, 0,194, + 0, 57, 0, 36, 0,196, 0, 57, 0, 36, 0,198, 0, 57, 0, 36, 0,200,255,220, 0, 36, 0,201,255,220, 0, 36, 0,202,255,220, + 0, 36, 0,203,255,220, 0, 36, 0,204,255,220, 0, 36, 0,205,255,220, 0, 36, 0,206,255,220, 0, 36, 0,207,255,220, 0, 36, + 0,209,255,220, 0, 36, 0,211,255,220, 0, 36, 0,213,255,220, 0, 36, 0,215,255,220, 0, 36, 0,217,255,220, 0, 36, 0,219, +255,220, 0, 36, 0,221,255,220, 0, 36, 0,222,255,220, 0, 36, 0,224,255,220, 0, 36, 0,226,255,220, 0, 36, 1, 14,255,220, + 0, 36, 1, 15,255,220, 0, 36, 1, 16,255,220, 0, 36, 1, 17,255,220, 0, 36, 1, 18,255,220, 0, 36, 1, 19,255,220, 0, 36, + 1, 36,255, 97, 0, 36, 1, 37,255,220, 0, 36, 1, 38,255, 97, 0, 36, 1, 39,255,220, 0, 36, 1, 54,255,144, 0, 36, 1, 55, +255,173, 0, 36, 1, 56,255, 97, 0, 36, 1, 57,255,117, 0, 36, 1, 58,255, 97, 0, 36, 1,136,255,220, 0, 36, 1,172,255,220, + 0, 36, 1,173,255,220, 0, 36, 1,174,255,220, 0, 36, 1,175,255,220, 0, 36, 1,220,255, 97, 0, 36, 1,221,255,220, 0, 36, + 1,240,255,220, 0, 36, 1,243,255,220, 0, 36, 1,244,255, 97, 0, 36, 1,245,255,117, 0, 36, 4,252,255,144, 0, 36, 4,253, +255,173, 0, 36, 4,254,255,144, 0, 36, 4,255,255,173, 0, 36, 5, 0,255,144, 0, 36, 5, 1,255,173, 0, 36, 5,106,255, 97, + 0, 36, 5,107,255,117, 0, 36, 5,145,254,248, 0, 36, 5,146,255, 3, 0, 36, 5,147, 0, 47, 0, 37, 0, 38,255,220, 0, 37, + 0, 42,255,220, 0, 37, 0, 50,255,220, 0, 37, 0, 54,255,220, 0, 37, 0, 57,255,193, 0, 37, 0, 58,255,183, 0, 37, 0, 60, +255,144, 0, 37, 0,109,255,193, 0, 37, 0,125,255,220, 0, 37, 0,137,255,220, 0, 37, 0,148,255,220, 0, 37, 0,149,255,220, + 0, 37, 0,150,255,220, 0, 37, 0,151,255,220, 0, 37, 0,152,255,220, 0, 37, 0,159,255,144, 0, 37, 0,200,255,220, 0, 37, + 0,202,255,220, 0, 37, 0,204,255,220, 0, 37, 0,206,255,220, 0, 37, 0,222,255,220, 0, 37, 0,224,255,220, 0, 37, 0,226, +255,220, 0, 37, 0,228,255,220, 0, 37, 1, 14,255,220, 0, 37, 1, 16,255,220, 0, 37, 1, 18,255,220, 0, 37, 1, 28,255,220, + 0, 37, 1, 30,255,220, 0, 37, 1, 32,255,220, 0, 37, 1, 34,255,220, 0, 37, 1, 54,255,183, 0, 37, 1, 56,255,144, 0, 37, + 1, 58,255,144, 0, 37, 1,172,255,220, 0, 37, 1,174,255,220, 0, 37, 1,218,255,220, 0, 37, 1,240,255,220, 0, 37, 4,252, +255,183, 0, 37, 4,254,255,183, 0, 37, 5, 0,255,183, 0, 37, 5,106,255,144, 0, 37, 5,145,255,144, 0, 37, 5,146,255,144, + 0, 37, 5,147,255,173, 0, 38, 0, 60,255,220, 0, 38, 0,109,255,220, 0, 38, 0,125,255,220, 0, 38, 0,159,255,220, 0, 38, + 1, 56,255,220, 0, 38, 1, 58,255,220, 0, 38, 1,244,255,220, 0, 38, 5,106,255,220, 0, 38, 5,146, 0, 38, 0, 39, 0, 36, +255,220, 0, 39, 0, 57,255,220, 0, 39, 0, 60,255,144, 0, 39, 0,109,255,220, 0, 39, 0,125,255,220, 0, 39, 0,130,255,220, + 0, 39, 0,131,255,220, 0, 39, 0,132,255,220, 0, 39, 0,133,255,220, 0, 39, 0,134,255,220, 0, 39, 0,159,255,144, 0, 39, + 0,194,255,220, 0, 39, 0,196,255,220, 0, 39, 0,198,255,220, 0, 39, 1, 56,255,144, 0, 39, 1, 58,255,144, 0, 39, 1,244, +255,144, 0, 39, 5,106,255,144, 0, 39, 5,145,255,211, 0, 39, 5,146,255,201, 0, 39, 5,147,255, 68, 0, 41, 0, 17,254,183, + 0, 41, 0, 29,255, 97, 0, 41, 0, 36,255, 68, 0, 41, 0, 54,255,220, 0, 41, 0, 55,255,220, 0, 41, 0, 68,255, 68, 0, 41, + 0, 72,255,144, 0, 41, 0, 76,255,107, 0, 41, 0, 82,255,183, 0, 41, 0, 85,255,107, 0, 41, 0, 88,255,144, 0, 41, 0, 92, +255, 68, 0, 41, 0,130,255, 68, 0, 41, 0,131,255, 68, 0, 41, 0,132,255, 68, 0, 41, 0,133,255, 68, 0, 41, 0,134,255, 68, + 0, 41, 0,162,255, 68, 0, 41, 0,163,255, 68, 0, 41, 0,164,255, 68, 0, 41, 0,165,255, 68, 0, 41, 0,166,255, 68, 0, 41, + 0,167,255, 68, 0, 41, 0,170,255,144, 0, 41, 0,171,255,144, 0, 41, 0,172,255,144, 0, 41, 0,173,255,144, 0, 41, 0,180, +255,183, 0, 41, 0,181,255,183, 0, 41, 0,182,255,183, 0, 41, 0,183,255,183, 0, 41, 0,184,255,183, 0, 41, 0,187,255,144, + 0, 41, 0,188,255,144, 0, 41, 0,189,255,144, 0, 41, 0,190,255,144, 0, 41, 0,191,255, 68, 0, 41, 0,193,255, 68, 0, 41, + 0,194,255, 68, 0, 41, 0,195,255, 68, 0, 41, 0,196,255, 68, 0, 41, 0,197,255, 68, 0, 41, 0,198,255, 68, 0, 41, 0,199, +255, 68, 0, 41, 0,213,255,144, 0, 41, 0,215,255,144, 0, 41, 0,217,255,144, 0, 41, 0,219,255,144, 0, 41, 0,221,255,144, + 0, 41, 0,241,255,107, 0, 41, 0,245,255,107, 0, 41, 1, 15,255,183, 0, 41, 1, 17,255,183, 0, 41, 1, 19,255,183, 0, 41, + 1, 23,255,107, 0, 41, 1, 25,255,107, 0, 41, 1, 27,255,107, 0, 41, 1, 28,255,220, 0, 41, 1, 30,255,220, 0, 41, 1, 32, +255,220, 0, 41, 1, 34,255,220, 0, 41, 1, 36,255,220, 0, 41, 1, 38,255,220, 0, 41, 1, 40,255,220, 0, 41, 1, 43,255,144, + 0, 41, 1, 45,255,144, 0, 41, 1, 47,255,144, 0, 41, 1, 49,255,144, 0, 41, 1, 51,255,144, 0, 41, 1, 53,255,144, 0, 41, + 1, 57,255, 68, 0, 41, 1,173,255,183, 0, 41, 1,175,255,183, 0, 41, 1,218,255,220, 0, 41, 1,220,255,220, 0, 41, 1,241, +255,183, 0, 41, 1,245,255, 68, 0, 41, 5,107,255, 68, 0, 41, 5,145,255,211, 0, 41, 5,147,254,136, 0, 42, 0, 55,255,183, + 0, 42, 0, 60,255,154, 0, 42, 0,109,255,220, 0, 42, 0,125,255,220, 0, 42, 0,159,255,154, 0, 42, 1, 38,255,183, 0, 42, + 1, 58,255,154, 0, 42, 5,145,255,211, 0, 42, 5,146,255,211, 0, 42, 5,147,255,201, 0, 43, 0, 17,255,220, 0, 43, 5,145, +255,183, 0, 43, 5,146,255,193, 0, 43, 5,147,255,183, 0, 45, 0, 16,255,183, 0, 45, 0, 36,255,220, 0, 45, 0,109,255,220, + 0, 45, 0,125,255,220, 0, 45, 0,130,255,220, 0, 45, 0,131,255,220, 0, 45, 0,132,255,220, 0, 45, 0,133,255,220, 0, 45, + 0,134,255,220, 0, 45, 5,145,255,183, 0, 45, 5,146,255,193, 0, 45, 5,147,255,144, 0, 46, 0, 16,255, 41, 0, 46, 0, 36, +255,220, 0, 46, 0, 38,255,144, 0, 46, 0, 50,255,144, 0, 46, 0, 55,255, 97, 0, 46, 0, 56,255,201, 0, 46, 0, 58,255,183, + 0, 46, 0, 60,255,183, 0, 46, 0, 68,255,220, 0, 46, 0, 72,255,154, 0, 46, 0, 82,255,154, 0, 46, 0, 88,255,154, 0, 46, + 0, 92,255,107, 0, 46, 0,109,255,125, 0, 46, 0,130,255,220, 0, 46, 0,131,255,220, 0, 46, 0,132,255,220, 0, 46, 0,133, +255,220, 0, 46, 0,134,255,220, 0, 46, 0,137,255,144, 0, 46, 0,148,255,144, 0, 46, 0,149,255,144, 0, 46, 0,150,255,144, + 0, 46, 0,151,255,144, 0, 46, 0,152,255,144, 0, 46, 0,155,255,201, 0, 46, 0,156,255,201, 0, 46, 0,157,255,201, 0, 46, + 0,158,255,201, 0, 46, 0,159,255,183, 0, 46, 0,162,255,220, 0, 46, 0,163,255,220, 0, 46, 0,164,255,220, 0, 46, 0,165, +255,220, 0, 46, 0,166,255,220, 0, 46, 0,167,255,220, 0, 46, 0,170,255,154, 0, 46, 0,171,255,154, 0, 46, 0,172,255,154, + 0, 46, 0,173,255,154, 0, 46, 0,180,255,154, 0, 46, 0,181,255,154, 0, 46, 0,182,255,154, 0, 46, 0,183,255,154, 0, 46, + 0,184,255,154, 0, 46, 0,187,255,154, 0, 46, 0,188,255,154, 0, 46, 0,189,255,154, 0, 46, 0,190,255,154, 0, 46, 0,191, +255,107, 0, 46, 0,193,255,107, 0, 46, 0,200,255,144, 0, 46, 0,206,255,144, 0, 46, 0,221,255,154, 0, 46, 1, 38,255, 97, + 0, 46, 1, 48,255,201, 0, 46, 1, 49,255,154, 0, 46, 1, 58,255,183, 0, 46, 5,145,255,193, 0, 46, 5,146,255,193, 0, 47, + 0, 16,255,220, 0, 47, 0, 36, 0, 47, 0, 47, 0, 50,255,183, 0, 47, 0, 55,254,230, 0, 47, 0, 56,255,154, 0, 47, 0, 57, +255, 31, 0, 47, 0, 58,255, 68, 0, 47, 0, 60,254,240, 0, 47, 0, 72,255,220, 0, 47, 0, 82,255,220, 0, 47, 0, 88,255,220, + 0, 47, 0, 92,255, 68, 0, 47, 0,130, 0, 47, 0, 47, 0,131, 0, 47, 0, 47, 0,132, 0, 47, 0, 47, 0,133, 0, 47, 0, 47, + 0,134, 0, 47, 0, 47, 0,148,255,183, 0, 47, 0,149,255,183, 0, 47, 0,150,255,183, 0, 47, 0,151,255,183, 0, 47, 0,152, +255,183, 0, 47, 0,155,255,154, 0, 47, 0,156,255,154, 0, 47, 0,157,255,154, 0, 47, 0,158,255,154, 0, 47, 0,159,254,240, + 0, 47, 0,170,255,220, 0, 47, 0,171,255,220, 0, 47, 0,172,255,220, 0, 47, 0,173,255,220, 0, 47, 0,180,255,220, 0, 47, + 0,181,255,220, 0, 47, 0,182,255,220, 0, 47, 0,183,255,220, 0, 47, 0,184,255,220, 0, 47, 0,187,255,220, 0, 47, 0,188, +255,220, 0, 47, 0,189,255,220, 0, 47, 0,190,255,220, 0, 47, 0,191,255, 68, 0, 47, 0,193,255, 68, 0, 47, 0,221,255,220, + 0, 47, 1, 38,254,230, 0, 47, 1, 48,255,154, 0, 47, 1, 49,255,220, 0, 47, 1, 58,254,240, 0, 47, 5,145,254, 97, 0, 47, + 5,146,253,230, 0, 50, 0, 16, 0, 57, 0, 50, 0, 17,255,173, 0, 50, 0, 29,255,220, 0, 50, 0, 36,255,220, 0, 50, 0, 57, +255,220, 0, 50, 0, 59,255,125, 0, 50, 0, 60,255,144, 0, 50, 0,109,255,220, 0, 50, 0,130,255,220, 0, 50, 0,131,255,220, + 0, 50, 0,132,255,220, 0, 50, 0,133,255,220, 0, 50, 0,134,255,220, 0, 50, 0,159,255,144, 0, 50, 1, 58,255,144, 0, 50, + 5,145,255,211, 0, 50, 5,146,255,220, 0, 50, 5,147,255, 68, 0, 51, 0, 16,255,211, 0, 51, 0, 17,254,193, 0, 51, 0, 36, +255,125, 0, 51, 0, 60,255,211, 0, 51, 0, 68,255,164, 0, 51, 0, 72,255,183, 0, 51, 0, 76,255,211, 0, 51, 0, 81,255,220, + 0, 51, 0, 82,255,183, 0, 51, 0, 85,255,220, 0, 51, 0, 86,255,220, 0, 51, 0, 88,255,220, 0, 51, 0,109,255,220, 0, 51, + 0,130,255,125, 0, 51, 0,131,255,125, 0, 51, 0,132,255,125, 0, 51, 0,133,255,125, 0, 51, 0,134,255,125, 0, 51, 0,159, +255,211, 0, 51, 0,162,255,164, 0, 51, 0,163,255,164, 0, 51, 0,164,255,164, 0, 51, 0,165,255,164, 0, 51, 0,166,255,164, + 0, 51, 0,167,255,164, 0, 51, 0,170,255,183, 0, 51, 0,171,255,183, 0, 51, 0,172,255,183, 0, 51, 0,173,255,183, 0, 51, + 0,179,255,220, 0, 51, 0,180,255,183, 0, 51, 0,181,255,183, 0, 51, 0,182,255,183, 0, 51, 0,183,255,183, 0, 51, 0,184, +255,183, 0, 51, 0,187,255,220, 0, 51, 0,188,255,220, 0, 51, 0,189,255,220, 0, 51, 0,190,255,220, 0, 51, 0,221,255,183, + 0, 51, 1, 10,255,220, 0, 51, 1, 23,255,220, 0, 51, 1, 27,255,220, 0, 51, 1, 33,255,220, 0, 51, 1, 35,255,220, 0, 51, + 1, 49,255,220, 0, 51, 1, 58,255,211, 0, 51, 5,145, 0, 38, 0, 51, 5,146, 0, 38, 0, 51, 5,147,254,183, 0, 52, 0, 16, + 0, 57, 0, 52, 5,145,255,211, 0, 52, 5,146,255,220, 0, 52, 5,147,255,125, 0, 53, 0, 16,255,173, 0, 53, 0, 17,255,183, + 0, 53, 0, 29,255,193, 0, 53, 0, 36,255,173, 0, 53, 0, 38,255,154, 0, 53, 0, 55,255,107, 0, 53, 0, 57,255,144, 0, 53, + 0, 58,255,173, 0, 53, 0, 60,255,125, 0, 53, 0, 68,255,211, 0, 53, 0, 72,255,164, 0, 53, 0, 82,255,164, 0, 53, 0, 88, +255,164, 0, 53, 0, 92,255,144, 0, 53, 0,109,255,144, 0, 53, 0,125,255,220, 0, 53, 0,130,255,173, 0, 53, 0,131,255,173, + 0, 53, 0,132,255,173, 0, 53, 0,133,255,173, 0, 53, 0,134,255,173, 0, 53, 0,137,255,154, 0, 53, 0,159,255,125, 0, 53, + 0,162,255,211, 0, 53, 0,163,255,211, 0, 53, 0,164,255,211, 0, 53, 0,165,255,211, 0, 53, 0,166,255,211, 0, 53, 0,167, +255,211, 0, 53, 0,170,255,164, 0, 53, 0,171,255,164, 0, 53, 0,172,255,164, 0, 53, 0,173,255,164, 0, 53, 0,180,255,164, + 0, 53, 0,181,255,164, 0, 53, 0,182,255,164, 0, 53, 0,183,255,164, 0, 53, 0,184,255,164, 0, 53, 0,187,255,164, 0, 53, + 0,188,255,164, 0, 53, 0,189,255,164, 0, 53, 0,190,255,164, 0, 53, 0,191,255,144, 0, 53, 0,193,255,144, 0, 53, 0,200, +255,154, 0, 53, 0,206,255,154, 0, 53, 0,221,255,164, 0, 53, 1, 38,255,107, 0, 53, 1, 49,255,164, 0, 53, 1, 58,255,125, + 0, 53, 5,145,255,107, 0, 53, 5,146,255,125, 0, 53, 5,147,255,220, 0, 54, 0, 36, 0, 38, 0, 54, 0,130, 0, 38, 0, 54, + 0,131, 0, 38, 0, 54, 0,132, 0, 38, 0, 54, 0,133, 0, 38, 0, 54, 0,134, 0, 38, 0, 55, 0, 16,255, 68, 0, 55, 0, 17, +255, 13, 0, 55, 0, 29,255, 31, 0, 55, 0, 36,255, 97, 0, 55, 0, 38,255,136, 0, 55, 0, 55,255,220, 0, 55, 0, 68,254,173, + 0, 55, 0, 70,254,164, 0, 55, 0, 72,254,164, 0, 55, 0, 76,255,193, 0, 55, 0, 82,254,164, 0, 55, 0, 85,254,211, 0, 55, + 0, 86,254,173, 0, 55, 0, 88,254,201, 0, 55, 0, 90,254,173, 0, 55, 0, 92,254,193, 0, 55, 0,109,255, 68, 0, 55, 0,125, +255,144, 0, 55, 0,130,255, 97, 0, 55, 0,131,255, 97, 0, 55, 0,132,255, 97, 0, 55, 0,133,255, 97, 0, 55, 0,134,255, 97, + 0, 55, 0,137,255,136, 0, 55, 0,162,254,173, 0, 55, 0,163,254,173, 0, 55, 0,164,254,173, 0, 55, 0,165,254,173, 0, 55, + 0,166,254,173, 0, 55, 0,167,254,173, 0, 55, 0,169,254,164, 0, 55, 0,170,254,164, 0, 55, 0,171,254,164, 0, 55, 0,172, +254,164, 0, 55, 0,173,254,164, 0, 55, 0,180,254,164, 0, 55, 0,181,254,164, 0, 55, 0,182,254,164, 0, 55, 0,183,254,164, + 0, 55, 0,184,254,164, 0, 55, 0,187,254,201, 0, 55, 0,188,254,201, 0, 55, 0,189,254,201, 0, 55, 0,190,254,201, 0, 55, + 0,191,254,193, 0, 55, 0,193,254,193, 0, 55, 0,200,255,136, 0, 55, 0,201,254,164, 0, 55, 0,206,255,136, 0, 55, 0,207, +254,164, 0, 55, 0,221,254,164, 0, 55, 1, 23,254,211, 0, 55, 1, 27,254,211, 0, 55, 1, 33,254,173, 0, 55, 1, 35,254,173, + 0, 55, 1, 38,255,220, 0, 55, 1, 49,254,201, 0, 55, 5,146,255,211, 0, 55, 5,147,254,248, 0, 56, 0, 61,255,220, 0, 56, + 1, 63,255,220, 0, 57, 0, 16,255,136, 0, 57, 0, 17,254,248, 0, 57, 0, 29,255, 89, 0, 57, 0, 36,255,125, 0, 57, 0, 50, +255,220, 0, 57, 0, 68,255, 97, 0, 57, 0, 72,255, 97, 0, 57, 0, 76,255,211, 0, 57, 0, 82,255, 97, 0, 57, 0, 88,255,117, + 0, 57, 0, 92,255,201, 0, 57, 0,109,255, 78, 0, 57, 0,125,255,144, 0, 57, 0,130,255,125, 0, 57, 0,131,255,125, 0, 57, + 0,132,255,125, 0, 57, 0,133,255,125, 0, 57, 0,134,255,125, 0, 57, 0,148,255,220, 0, 57, 0,149,255,220, 0, 57, 0,150, +255,220, 0, 57, 0,151,255,220, 0, 57, 0,152,255,220, 0, 57, 0,162,255, 97, 0, 57, 0,163,255, 97, 0, 57, 0,164,255, 97, + 0, 57, 0,165,255, 97, 0, 57, 0,166,255, 97, 0, 57, 0,167,255, 97, 0, 57, 0,170,255, 97, 0, 57, 0,171,255, 97, 0, 57, + 0,172,255, 97, 0, 57, 0,173,255, 97, 0, 57, 0,180,255, 97, 0, 57, 0,181,255, 97, 0, 57, 0,182,255, 97, 0, 57, 0,183, +255, 97, 0, 57, 0,184,255, 97, 0, 57, 0,187,255,117, 0, 57, 0,188,255,117, 0, 57, 0,189,255,117, 0, 57, 0,190,255,117, + 0, 57, 0,191,255,201, 0, 57, 0,193,255,201, 0, 57, 0,221,255, 97, 0, 57, 1, 49,255,117, 0, 57, 5,147,254,230, 0, 58, + 0, 16,255,173, 0, 58, 0, 17,255, 21, 0, 58, 0, 29,255,136, 0, 58, 0, 36,255,144, 0, 58, 0, 68,255,125, 0, 58, 0, 72, +255,136, 0, 58, 0, 76,255,211, 0, 58, 0, 82,255,136, 0, 58, 0, 85,255,164, 0, 58, 0, 88,255,183, 0, 58, 0, 92,255,220, + 0, 58, 0,109,255,144, 0, 58, 0,125,255,220, 0, 58, 0,130,255,144, 0, 58, 0,131,255,144, 0, 58, 0,132,255,144, 0, 58, + 0,133,255,144, 0, 58, 0,134,255,144, 0, 58, 0,162,255,125, 0, 58, 0,163,255,125, 0, 58, 0,164,255,125, 0, 58, 0,165, +255,125, 0, 58, 0,166,255,125, 0, 58, 0,167,255,125, 0, 58, 0,170,255,136, 0, 58, 0,171,255,136, 0, 58, 0,172,255,136, + 0, 58, 0,173,255,136, 0, 58, 0,180,255,136, 0, 58, 0,181,255,136, 0, 58, 0,182,255,136, 0, 58, 0,183,255,136, 0, 58, + 0,184,255,136, 0, 58, 0,187,255,183, 0, 58, 0,188,255,183, 0, 58, 0,189,255,183, 0, 58, 0,190,255,183, 0, 58, 0,191, +255,220, 0, 58, 0,193,255,220, 0, 58, 0,221,255,136, 0, 58, 1, 23,255,164, 0, 58, 1, 27,255,164, 0, 58, 1, 49,255,183, + 0, 58, 5,145,255,220, 0, 58, 5,147,254,248, 0, 59, 0, 16,255,154, 0, 59, 0, 38,255,107, 0, 59, 0, 50,255,125, 0, 59, + 0, 55,255,220, 0, 59, 0, 72,255,164, 0, 59, 0,109,255,144, 0, 59, 0,137,255,107, 0, 59, 0,148,255,125, 0, 59, 0,149, +255,125, 0, 59, 0,150,255,125, 0, 59, 0,151,255,125, 0, 59, 0,152,255,125, 0, 59, 0,170,255,164, 0, 59, 0,171,255,164, + 0, 59, 0,172,255,164, 0, 59, 0,173,255,164, 0, 59, 0,200,255,107, 0, 59, 0,206,255,107, 0, 59, 0,221,255,164, 0, 59, + 1, 38,255,220, 0, 59, 5,145,255, 97, 0, 59, 5,146,255,173, 0, 59, 5,147,255,211, 0, 60, 0, 16,255, 13, 0, 60, 0, 17, +254, 97, 0, 60, 0, 29,254,240, 0, 60, 0, 36,255, 97, 0, 60, 0, 38,255,144, 0, 60, 0, 50,255,144, 0, 60, 0, 68,254,230, + 0, 60, 0, 72,254,240, 0, 60, 0, 76,255,183, 0, 60, 0, 82,254,240, 0, 60, 0, 88,255, 21, 0, 60, 0,109,255, 31, 0, 60, + 0,125,255,107, 0, 60, 0,130,255, 97, 0, 60, 0,131,255, 97, 0, 60, 0,132,255, 97, 0, 60, 0,133,255, 97, 0, 60, 0,134, +255, 97, 0, 60, 0,137,255,144, 0, 60, 0,148,255,144, 0, 60, 0,149,255,144, 0, 60, 0,150,255,144, 0, 60, 0,151,255,144, + 0, 60, 0,152,255,144, 0, 60, 0,162,254,230, 0, 60, 0,163,254,230, 0, 60, 0,164,254,230, 0, 60, 0,165,254,230, 0, 60, + 0,166,254,230, 0, 60, 0,167,254,230, 0, 60, 0,170,254,240, 0, 60, 0,171,254,240, 0, 60, 0,172,254,240, 0, 60, 0,173, +254,240, 0, 60, 0,180,254,240, 0, 60, 0,181,254,240, 0, 60, 0,182,254,240, 0, 60, 0,183,254,240, 0, 60, 0,184,254,240, + 0, 60, 0,187,255, 21, 0, 60, 0,188,255, 21, 0, 60, 0,189,255, 21, 0, 60, 0,190,255, 21, 0, 60, 0,200,255,144, 0, 60, + 0,206,255,144, 0, 60, 0,221,254,240, 0, 60, 1, 49,255, 21, 0, 60, 5,145,255,144, 0, 60, 5,146,255,220, 0, 60, 5,147, +254,248, 0, 61, 0, 16,255,220, 0, 61, 5,145,255,220, 0, 61, 5,146,255,220, 0, 61, 5,147,255,220, 0, 72, 0, 91,255,220, + 0, 73, 0, 16,255,144, 0, 73, 0, 17,255,107, 0, 73, 0, 29,255,183, 0, 73, 0, 87,255,220, 0, 73, 0, 90,255,220, 0, 73, + 0, 92,255,220, 0, 73, 0,109,255,183, 0, 73, 0,125,255,220, 0, 73, 0,191,255,220, 0, 73, 0,193,255,220, 0, 73, 1, 39, +255,220, 0, 73, 5,145, 0, 65, 0, 73, 5,147,255, 21, 0, 78, 0, 68,255,220, 0, 78, 0, 72,255,183, 0, 78, 0, 82,255,183, + 0, 78, 0, 88,255,193, 0, 78, 0, 92,255,183, 0, 78, 0,162,255,220, 0, 78, 0,163,255,220, 0, 78, 0,164,255,220, 0, 78, + 0,165,255,220, 0, 78, 0,166,255,220, 0, 78, 0,167,255,220, 0, 78, 0,170,255,183, 0, 78, 0,171,255,183, 0, 78, 0,172, +255,183, 0, 78, 0,173,255,183, 0, 78, 0,180,255,183, 0, 78, 0,181,255,183, 0, 78, 0,182,255,183, 0, 78, 0,183,255,183, + 0, 78, 0,184,255,183, 0, 78, 0,187,255,193, 0, 78, 0,188,255,193, 0, 78, 0,189,255,193, 0, 78, 0,190,255,193, 0, 78, + 0,191,255,183, 0, 78, 0,193,255,183, 0, 78, 0,221,255,183, 0, 78, 1, 49,255,193, 0, 81, 5,145,255,107, 0, 81, 5,146, +255,144, 0, 81, 5,147,255,164, 0, 82, 0, 16, 0, 38, 0, 82, 0, 17,255,220, 0, 82, 0, 91,255,193, 0, 82, 5,145,255,107, + 0, 82, 5,146,255,183, 0, 82, 5,147,255,125, 0, 85, 0, 16,255,125, 0, 85, 0, 17,255, 68, 0, 85, 0, 29,255,220, 0, 85, + 0, 70,255,211, 0, 85, 0, 71,255,220, 0, 85, 0, 72,255,211, 0, 85, 0, 74,255,220, 0, 85, 0, 75,255,220, 0, 85, 0, 80, +255,220, 0, 85, 0, 81,255,220, 0, 85, 0, 82,255,211, 0, 85, 0, 84,255,220, 0, 85, 0, 85,255,220, 0, 85, 0, 91,255,201, + 0, 85, 0,109,255,183, 0, 85, 0,169,255,211, 0, 85, 0,170,255,211, 0, 85, 0,171,255,211, 0, 85, 0,172,255,211, 0, 85, + 0,173,255,211, 0, 85, 0,179,255,220, 0, 85, 0,180,255,211, 0, 85, 0,181,255,211, 0, 85, 0,182,255,211, 0, 85, 0,183, +255,211, 0, 85, 0,184,255,211, 0, 85, 0,201,255,211, 0, 85, 0,207,255,211, 0, 85, 0,209, 0, 72, 0, 85, 0,221,255,211, + 0, 85, 0,225,255,220, 0, 85, 1, 10,255,220, 0, 85, 1, 23,255,220, 0, 85, 1, 27,255,220, 0, 85, 5,146, 0, 86, 0, 85, + 5,147,254,201, 0, 89, 0, 16,255,201, 0, 89, 0, 17,255, 97, 0, 89, 0, 29,255,144, 0, 89, 0,109,255,220, 0, 89, 0,125, +255,220, 0, 89, 5,146,255,220, 0, 89, 5,147,254,240, 0, 90, 0, 17,255, 68, 0, 90, 0, 29,255,144, 0, 90, 0,109,255,220, + 0, 90, 0,125,255,220, 0, 90, 5,147,255, 41, 0, 91, 0, 70,255,220, 0, 91, 0, 72,255,193, 0, 91, 0, 82,255,193, 0, 91, + 0,169,255,220, 0, 91, 0,170,255,193, 0, 91, 0,171,255,193, 0, 91, 0,172,255,193, 0, 91, 0,173,255,193, 0, 91, 0,180, +255,193, 0, 91, 0,181,255,193, 0, 91, 0,182,255,193, 0, 91, 0,183,255,193, 0, 91, 0,184,255,193, 0, 91, 0,201,255,220, + 0, 91, 0,207,255,220, 0, 91, 0,221,255,193, 0, 92, 0, 16,255,220, 0, 92, 0, 17,254,220, 0, 92, 0, 29,255,107, 0, 92, + 0,109,255,220, 0, 92, 0,125,255,220, 0, 92, 5,147,254,211, 0,109, 0, 37,255,220, 0,109, 0, 38,255,220, 0,109, 0, 39, +255,220, 0,109, 0, 42,255,220, 0,109, 0, 45,255,220, 0,109, 0, 55,255,144, 0,109, 0, 57,255,144, 0,109, 0, 58,255,220, + 0,109, 0, 60,255,107, 0,109, 0, 89,255,220, 0,109, 0, 90,255,220, 0,109, 0, 92,255,220, 0,109, 0,136, 0,151, 0,109, + 0,137,255,220, 0,109, 0,159,255,107, 0,109, 0,191,255,220, 0,109, 0,193,255,220, 0,109, 0,200,255,220, 0,109, 0,206, +255,220, 0,109, 0,208,255,220, 0,109, 0,224,255,220, 0,109, 1, 38,255,144, 0,109, 1, 58,255,107, 0,125, 0, 36,255,183, + 0,125, 0, 37,255,183, 0,125, 0, 38,255,220, 0,125, 0, 39,255,220, 0,125, 0, 45,255,220, 0,125, 0, 50,255,220, 0,125, + 0, 55,255, 68, 0,125, 0, 57,255, 78, 0,125, 0, 58,255,144, 0,125, 0, 59,255,144, 0,125, 0, 60,255, 31, 0,125, 0, 89, +255,220, 0,125, 0, 90,255,220, 0,125, 0, 92,255,220, 0,125, 0,130,255,183, 0,125, 0,131,255,183, 0,125, 0,132,255,183, + 0,125, 0,133,255,183, 0,125, 0,134,255,183, 0,125, 0,137,255,220, 0,125, 0,148,255,220, 0,125, 0,149,255,220, 0,125, + 0,150,255,220, 0,125, 0,151,255,220, 0,125, 0,152,255,220, 0,125, 0,159,255, 31, 0,125, 0,191,255,220, 0,125, 0,193, +255,220, 0,125, 0,200,255,220, 0,125, 0,206,255,220, 0,125, 0,208,255,220, 0,125, 1, 38,255, 68, 0,125, 1, 58,255, 31, + 0,130, 0, 16,255,211, 0,130, 0, 17,255,220, 0,130, 0, 29,255,220, 0,130, 0, 36, 0, 57, 0,130, 0, 38,255,220, 0,130, + 0, 42,255,220, 0,130, 0, 50,255,220, 0,130, 0, 52,255,220, 0,130, 0, 55,255, 97, 0,130, 0, 57,255,125, 0,130, 0, 58, +255,144, 0,130, 0, 60,255, 97, 0,130, 0, 70,255,220, 0,130, 0, 71,255,220, 0,130, 0, 72,255,220, 0,130, 0, 73,255,183, + 0,130, 0, 82,255,220, 0,130, 0, 84,255,220, 0,130, 0, 87,255,220, 0,130, 0, 89,255,136, 0,130, 0, 90,255,173, 0,130, + 0, 92,255,117, 0,130, 0,109,255,183, 0,130, 0,130, 0, 57, 0,130, 0,131, 0, 57, 0,130, 0,132, 0, 57, 0,130, 0,133, + 0, 57, 0,130, 0,134, 0, 57, 0,130, 0,137,255,220, 0,130, 0,148,255,220, 0,130, 0,149,255,220, 0,130, 0,150,255,220, + 0,130, 0,151,255,220, 0,130, 0,152,255,220, 0,130, 0,159,255, 97, 0,130, 0,169,255,220, 0,130, 0,170,255,220, 0,130, + 0,171,255,220, 0,130, 0,172,255,220, 0,130, 0,173,255,220, 0,130, 0,180,255,220, 0,130, 0,181,255,220, 0,130, 0,182, +255,220, 0,130, 0,183,255,220, 0,130, 0,184,255,220, 0,130, 0,191,255,117, 0,130, 0,193,255,117, 0,130, 0,194, 0, 57, + 0,130, 0,196, 0, 57, 0,130, 0,198, 0, 57, 0,130, 0,200,255,220, 0,130, 0,201,255,220, 0,130, 0,202,255,220, 0,130, + 0,204,255,220, 0,130, 0,205,255,220, 0,130, 0,206,255,220, 0,130, 0,207,255,220, 0,130, 0,209,255,220, 0,130, 0,213, +255,220, 0,130, 0,215,255,220, 0,130, 0,217,255,220, 0,130, 0,219,255,220, 0,130, 0,221,255,220, 0,130, 0,222,255,220, + 0,130, 0,224,255,220, 0,130, 0,226,255,220, 0,130, 1, 14,255,220, 0,130, 1, 15,255,220, 0,130, 1, 16,255,220, 0,130, + 1, 17,255,220, 0,130, 1, 18,255,220, 0,130, 1, 19,255,220, 0,130, 1, 36,255, 97, 0,130, 1, 37,255,220, 0,130, 1, 38, +255, 97, 0,130, 1, 39,255,220, 0,130, 1, 54,255,144, 0,130, 1, 55,255,173, 0,130, 1, 56,255, 97, 0,130, 1, 57,255,117, + 0,130, 1, 58,255, 97, 0,130, 1,240,255,220, 0,130, 1,241,255,220, 0,130, 4,252,255,144, 0,130, 4,255,255,173, 0,130, + 5, 0,255,144, 0,130, 5, 1,255,173, 0,130, 5,106,255, 97, 0,130, 5,107,255,117, 0,130, 5,145,254,248, 0,130, 5,146, +255, 3, 0,130, 5,147, 0, 47, 0,131, 0, 16,255,211, 0,131, 0, 17,255,220, 0,131, 0, 29,255,220, 0,131, 0, 36, 0, 57, + 0,131, 0, 38,255,220, 0,131, 0, 42,255,220, 0,131, 0, 50,255,220, 0,131, 0, 52,255,220, 0,131, 0, 55,255, 97, 0,131, + 0, 57,255,125, 0,131, 0, 58,255,144, 0,131, 0, 60,255, 97, 0,131, 0, 70,255,220, 0,131, 0, 71,255,220, 0,131, 0, 72, +255,220, 0,131, 0, 73,255,183, 0,131, 0, 82,255,220, 0,131, 0, 84,255,220, 0,131, 0, 87,255,220, 0,131, 0, 89,255,136, + 0,131, 0, 90,255,173, 0,131, 0, 92,255,117, 0,131, 0,109,255,183, 0,131, 0,130, 0, 57, 0,131, 0,131, 0, 57, 0,131, + 0,132, 0, 57, 0,131, 0,133, 0, 57, 0,131, 0,134, 0, 57, 0,131, 0,137,255,220, 0,131, 0,148,255,220, 0,131, 0,149, +255,220, 0,131, 0,150,255,220, 0,131, 0,151,255,220, 0,131, 0,152,255,220, 0,131, 0,159,255, 97, 0,131, 0,169,255,220, + 0,131, 0,170,255,220, 0,131, 0,171,255,220, 0,131, 0,172,255,220, 0,131, 0,173,255,220, 0,131, 0,180,255,220, 0,131, + 0,181,255,220, 0,131, 0,182,255,220, 0,131, 0,183,255,220, 0,131, 0,184,255,220, 0,131, 0,191,255,117, 0,131, 0,193, +255,117, 0,131, 0,194, 0, 57, 0,131, 0,196, 0, 57, 0,131, 0,198, 0, 57, 0,131, 0,200,255,220, 0,131, 0,201,255,220, + 0,131, 0,202,255,220, 0,131, 0,204,255,220, 0,131, 0,205,255,220, 0,131, 0,206,255,220, 0,131, 0,207,255,220, 0,131, + 0,209,255,220, 0,131, 0,213,255,220, 0,131, 0,215,255,220, 0,131, 0,217,255,220, 0,131, 0,219,255,220, 0,131, 0,221, +255,220, 0,131, 0,222,255,220, 0,131, 0,224,255,220, 0,131, 0,226,255,220, 0,131, 1, 14,255,220, 0,131, 1, 15,255,220, + 0,131, 1, 16,255,220, 0,131, 1, 17,255,220, 0,131, 1, 18,255,220, 0,131, 1, 19,255,220, 0,131, 1, 36,255, 97, 0,131, + 1, 37,255,220, 0,131, 1, 38,255, 97, 0,131, 1, 39,255,220, 0,131, 1, 54,255,144, 0,131, 1, 55,255,173, 0,131, 1, 56, +255, 97, 0,131, 1, 57,255,117, 0,131, 1, 58,255, 97, 0,131, 1,240,255,220, 0,131, 1,241,255,220, 0,131, 4,252,255,144, + 0,131, 4,254,255,144, 0,131, 4,255,255,173, 0,131, 5, 0,255,144, 0,131, 5, 1,255,173, 0,131, 5,106,255, 97, 0,131, + 5,107,255,117, 0,131, 5,145,254,248, 0,131, 5,146,255, 3, 0,131, 5,147, 0, 47, 0,132, 0, 16,255,211, 0,132, 0, 17, +255,220, 0,132, 0, 29,255,220, 0,132, 0, 36, 0, 57, 0,132, 0, 38,255,220, 0,132, 0, 42,255,220, 0,132, 0, 50,255,220, + 0,132, 0, 52,255,220, 0,132, 0, 55,255, 97, 0,132, 0, 57,255,125, 0,132, 0, 58,255,144, 0,132, 0, 60,255, 97, 0,132, + 0, 70,255,220, 0,132, 0, 71,255,220, 0,132, 0, 72,255,220, 0,132, 0, 73,255,183, 0,132, 0, 82,255,220, 0,132, 0, 84, +255,220, 0,132, 0, 87,255,220, 0,132, 0, 89,255,136, 0,132, 0, 90,255,173, 0,132, 0, 92,255,117, 0,132, 0,109,255,183, + 0,132, 0,130, 0, 57, 0,132, 0,131, 0, 57, 0,132, 0,132, 0, 57, 0,132, 0,133, 0, 57, 0,132, 0,134, 0, 57, 0,132, + 0,137,255,220, 0,132, 0,148,255,220, 0,132, 0,149,255,220, 0,132, 0,150,255,220, 0,132, 0,151,255,220, 0,132, 0,152, +255,220, 0,132, 0,159,255, 97, 0,132, 0,169,255,220, 0,132, 0,170,255,220, 0,132, 0,171,255,220, 0,132, 0,172,255,220, + 0,132, 0,173,255,220, 0,132, 0,180,255,220, 0,132, 0,181,255,220, 0,132, 0,182,255,220, 0,132, 0,183,255,220, 0,132, + 0,184,255,220, 0,132, 0,191,255,117, 0,132, 0,193,255,117, 0,132, 0,194, 0, 57, 0,132, 0,196, 0, 57, 0,132, 0,198, + 0, 57, 0,132, 0,200,255,220, 0,132, 0,201,255,220, 0,132, 0,202,255,220, 0,132, 0,204,255,220, 0,132, 0,205,255,220, + 0,132, 0,206,255,220, 0,132, 0,207,255,220, 0,132, 0,209,255,220, 0,132, 0,213,255,220, 0,132, 0,215,255,220, 0,132, + 0,217,255,220, 0,132, 0,219,255,220, 0,132, 0,221,255,220, 0,132, 0,222,255,220, 0,132, 0,224,255,220, 0,132, 0,226, +255,220, 0,132, 1, 14,255,220, 0,132, 1, 15,255,220, 0,132, 1, 16,255,220, 0,132, 1, 17,255,220, 0,132, 1, 18,255,220, + 0,132, 1, 19,255,220, 0,132, 1, 36,255, 97, 0,132, 1, 37,255,220, 0,132, 1, 38,255, 97, 0,132, 1, 39,255,220, 0,132, + 1, 54,255,144, 0,132, 1, 55,255,173, 0,132, 1, 56,255, 97, 0,132, 1, 57,255,117, 0,132, 1, 58,255, 97, 0,132, 1,240, +255,220, 0,132, 1,241,255,220, 0,132, 4,252,255,144, 0,132, 4,254,255,144, 0,132, 4,255,255,173, 0,132, 5, 0,255,144, + 0,132, 5, 1,255,173, 0,132, 5,106,255, 97, 0,132, 5,107,255,117, 0,132, 5,145,254,248, 0,132, 5,146,255, 3, 0,132, + 5,147, 0, 47, 0,133, 0, 16,255,211, 0,133, 0, 17,255,220, 0,133, 0, 29,255,220, 0,133, 0, 36, 0, 57, 0,133, 0, 38, +255,220, 0,133, 0, 42,255,220, 0,133, 0, 50,255,220, 0,133, 0, 52,255,220, 0,133, 0, 55,255, 97, 0,133, 0, 57,255,125, + 0,133, 0, 58,255,144, 0,133, 0, 60,255, 97, 0,133, 0, 70,255,220, 0,133, 0, 71,255,220, 0,133, 0, 72,255,220, 0,133, + 0, 73,255,183, 0,133, 0, 82,255,220, 0,133, 0, 84,255,220, 0,133, 0, 87,255,220, 0,133, 0, 89,255,136, 0,133, 0, 90, +255,173, 0,133, 0, 92,255,117, 0,133, 0,109,255,183, 0,133, 0,130, 0, 57, 0,133, 0,131, 0, 57, 0,133, 0,132, 0, 57, + 0,133, 0,133, 0, 57, 0,133, 0,134, 0, 57, 0,133, 0,137,255,220, 0,133, 0,148,255,220, 0,133, 0,149,255,220, 0,133, + 0,150,255,220, 0,133, 0,151,255,220, 0,133, 0,152,255,220, 0,133, 0,159,255, 97, 0,133, 0,169,255,220, 0,133, 0,170, +255,220, 0,133, 0,171,255,220, 0,133, 0,172,255,220, 0,133, 0,173,255,220, 0,133, 0,180,255,220, 0,133, 0,181,255,220, + 0,133, 0,182,255,220, 0,133, 0,183,255,220, 0,133, 0,184,255,220, 0,133, 0,191,255,117, 0,133, 0,193,255,117, 0,133, + 0,194, 0, 57, 0,133, 0,196, 0, 57, 0,133, 0,198, 0, 57, 0,133, 0,200,255,220, 0,133, 0,201,255,220, 0,133, 0,202, +255,220, 0,133, 0,204,255,220, 0,133, 0,205,255,220, 0,133, 0,206,255,220, 0,133, 0,207,255,220, 0,133, 0,209,255,220, + 0,133, 0,213,255,220, 0,133, 0,215,255,220, 0,133, 0,217,255,220, 0,133, 0,219,255,220, 0,133, 0,221,255,220, 0,133, + 0,222,255,220, 0,133, 0,224,255,220, 0,133, 0,226,255,220, 0,133, 1, 14,255,220, 0,133, 1, 15,255,220, 0,133, 1, 16, +255,220, 0,133, 1, 17,255,220, 0,133, 1, 18,255,220, 0,133, 1, 19,255,220, 0,133, 1, 36,255, 97, 0,133, 1, 37,255,220, + 0,133, 1, 38,255, 97, 0,133, 1, 39,255,220, 0,133, 1, 54,255,144, 0,133, 1, 55,255,173, 0,133, 1, 56,255, 97, 0,133, + 1, 57,255,117, 0,133, 1, 58,255, 97, 0,133, 1,240,255,220, 0,133, 4,252,255,144, 0,133, 4,254,255,144, 0,133, 4,255, +255,173, 0,133, 5, 0,255,144, 0,133, 5, 1,255,173, 0,133, 5,106,255, 97, 0,133, 5,107,255,117, 0,133, 5,145,254,248, + 0,133, 5,146,255, 3, 0,133, 5,147, 0, 47, 0,134, 0, 16,255,211, 0,134, 0, 17,255,220, 0,134, 0, 29,255,220, 0,134, + 0, 36, 0, 57, 0,134, 0, 38,255,220, 0,134, 0, 42,255,220, 0,134, 0, 50,255,220, 0,134, 0, 52,255,220, 0,134, 0, 55, +255, 97, 0,134, 0, 57,255,125, 0,134, 0, 58,255,144, 0,134, 0, 60,255, 97, 0,134, 0, 70,255,220, 0,134, 0, 71,255,220, + 0,134, 0, 72,255,220, 0,134, 0, 73,255,183, 0,134, 0, 82,255,220, 0,134, 0, 84,255,220, 0,134, 0, 87,255,220, 0,134, + 0, 89,255,136, 0,134, 0, 90,255,173, 0,134, 0, 92,255,117, 0,134, 0,109,255,183, 0,134, 0,130, 0, 57, 0,134, 0,131, + 0, 57, 0,134, 0,132, 0, 57, 0,134, 0,133, 0, 57, 0,134, 0,134, 0, 57, 0,134, 0,137,255,220, 0,134, 0,148,255,220, + 0,134, 0,149,255,220, 0,134, 0,150,255,220, 0,134, 0,151,255,220, 0,134, 0,152,255,220, 0,134, 0,159,255, 97, 0,134, + 0,169,255,220, 0,134, 0,170,255,220, 0,134, 0,171,255,220, 0,134, 0,172,255,220, 0,134, 0,173,255,220, 0,134, 0,180, +255,220, 0,134, 0,181,255,220, 0,134, 0,182,255,220, 0,134, 0,183,255,220, 0,134, 0,184,255,220, 0,134, 0,191,255,117, + 0,134, 0,193,255,117, 0,134, 0,194, 0, 57, 0,134, 0,196, 0, 57, 0,134, 0,198, 0, 57, 0,134, 0,200,255,220, 0,134, + 0,201,255,220, 0,134, 0,202,255,220, 0,134, 0,204,255,220, 0,134, 0,205,255,220, 0,134, 0,206,255,220, 0,134, 0,207, +255,220, 0,134, 0,209,255,220, 0,134, 0,213,255,220, 0,134, 0,215,255,220, 0,134, 0,217,255,220, 0,134, 0,219,255,220, + 0,134, 0,221,255,220, 0,134, 0,222,255,220, 0,134, 0,224,255,220, 0,134, 0,226,255,220, 0,134, 1, 14,255,220, 0,134, + 1, 15,255,220, 0,134, 1, 16,255,220, 0,134, 1, 17,255,220, 0,134, 1, 18,255,220, 0,134, 1, 19,255,220, 0,134, 1, 36, +255, 97, 0,134, 1, 37,255,220, 0,134, 1, 38,255, 97, 0,134, 1, 39,255,220, 0,134, 1, 54,255,144, 0,134, 1, 55,255,173, + 0,134, 1, 56,255, 97, 0,134, 1, 57,255,117, 0,134, 1, 58,255, 97, 0,134, 1,240,255,220, 0,134, 1,241,255,220, 0,134, + 4,252,255,144, 0,134, 4,254,255,144, 0,134, 4,255,255,173, 0,134, 5, 0,255,144, 0,134, 5, 1,255,173, 0,134, 5,106, +255, 97, 0,134, 5,107,255,117, 0,134, 5,145,254,248, 0,134, 5,146,255, 3, 0,134, 5,147, 0, 47, 0,136, 5,145,255,173, + 0,136, 5,146,255,164, 0,136, 5,147,255,144, 0,137, 0, 60,255,220, 0,137, 0,109,255,220, 0,137, 0,125,255,220, 0,137, + 0,159,255,220, 0,137, 1, 58,255,220, 0,137, 5,146, 0, 38, 0,146, 0, 36,255,220, 0,146, 0, 57,255,220, 0,146, 0, 60, +255,144, 0,146, 0,109,255,220, 0,146, 0,125,255,220, 0,146, 0,130,255,220, 0,146, 0,131,255,220, 0,146, 0,132,255,220, + 0,146, 0,133,255,220, 0,146, 0,134,255,220, 0,146, 0,159,255,144, 0,146, 0,194,255,220, 0,146, 0,196,255,220, 0,146, + 0,198,255,220, 0,146, 1, 56,255,144, 0,146, 1, 58,255,144, 0,146, 1,244,255,144, 0,146, 5,106,255,144, 0,146, 5,145, +255,211, 0,146, 5,146,255,201, 0,146, 5,147,255, 68, 0,148, 0, 16, 0, 57, 0,148, 0, 17,255,173, 0,148, 0, 29,255,220, + 0,148, 0, 36,255,220, 0,148, 0, 57,255,220, 0,148, 0, 59,255,125, 0,148, 0, 60,255,144, 0,148, 0,109,255,220, 0,148, + 0,130,255,220, 0,148, 0,131,255,220, 0,148, 0,132,255,220, 0,148, 0,133,255,220, 0,148, 0,134,255,220, 0,148, 0,159, +255,144, 0,148, 1, 58,255,144, 0,148, 5,145,255,211, 0,148, 5,146,255,220, 0,148, 5,147,255, 68, 0,149, 0, 16, 0, 57, + 0,149, 0, 17,255,173, 0,149, 0, 29,255,220, 0,149, 0, 36,255,220, 0,149, 0, 57,255,220, 0,149, 0, 59,255,125, 0,149, + 0, 60,255,144, 0,149, 0,109,255,220, 0,149, 0,130,255,220, 0,149, 0,131,255,220, 0,149, 0,132,255,220, 0,149, 0,133, +255,220, 0,149, 0,134,255,220, 0,149, 0,159,255,144, 0,149, 1, 58,255,144, 0,149, 5,145,255,211, 0,149, 5,146,255,220, + 0,149, 5,147,255, 68, 0,150, 0, 16, 0, 57, 0,150, 0, 17,255,173, 0,150, 0, 29,255,220, 0,150, 0, 36,255,220, 0,150, + 0, 57,255,220, 0,150, 0, 59,255,125, 0,150, 0, 60,255,144, 0,150, 0,109,255,220, 0,150, 0,130,255,220, 0,150, 0,131, +255,220, 0,150, 0,132,255,220, 0,150, 0,133,255,220, 0,150, 0,134,255,220, 0,150, 0,159,255,144, 0,150, 1, 58,255,144, + 0,150, 5,145,255,211, 0,150, 5,146,255,220, 0,150, 5,147,255, 68, 0,151, 0, 16, 0, 57, 0,151, 0, 17,255,173, 0,151, + 0, 29,255,220, 0,151, 0, 36,255,220, 0,151, 0, 57,255,220, 0,151, 0, 59,255,125, 0,151, 0, 60,255,144, 0,151, 0,109, +255,220, 0,151, 0,130,255,220, 0,151, 0,131,255,220, 0,151, 0,132,255,220, 0,151, 0,133,255,220, 0,151, 0,134,255,220, + 0,151, 0,159,255,144, 0,151, 1, 58,255,144, 0,151, 5,145,255,211, 0,151, 5,146,255,220, 0,151, 5,147,255, 68, 0,152, + 0, 16, 0, 57, 0,152, 0, 17,255,173, 0,152, 0, 29,255,220, 0,152, 0, 36,255,220, 0,152, 0, 57,255,220, 0,152, 0, 59, +255,125, 0,152, 0, 60,255,144, 0,152, 0,109,255,220, 0,152, 0,130,255,220, 0,152, 0,131,255,220, 0,152, 0,132,255,220, + 0,152, 0,133,255,220, 0,152, 0,134,255,220, 0,152, 0,159,255,144, 0,152, 1, 58,255,144, 0,152, 5,145,255,211, 0,152, + 5,146,255,220, 0,152, 5,147,255, 68, 0,155, 0, 61,255,220, 0,155, 1, 63,255,220, 0,156, 0, 61,255,220, 0,156, 1, 63, +255,220, 0,157, 0, 61,255,220, 0,157, 1, 63,255,220, 0,158, 0, 61,255,220, 0,158, 1, 63,255,220, 0,159, 0, 16,255, 13, + 0,159, 0, 17,254, 97, 0,159, 0, 29,254,240, 0,159, 0, 36,255, 97, 0,159, 0, 38,255,144, 0,159, 0, 50,255,144, 0,159, + 0, 68,254,230, 0,159, 0, 72,254,240, 0,159, 0, 76,255,183, 0,159, 0, 82,254,240, 0,159, 0, 88,255, 21, 0,159, 0,109, +255, 31, 0,159, 0,125,255,107, 0,159, 0,130,255, 97, 0,159, 0,131,255, 97, 0,159, 0,132,255, 97, 0,159, 0,133,255, 97, + 0,159, 0,134,255, 97, 0,159, 0,137,255,144, 0,159, 0,148,255,144, 0,159, 0,149,255,144, 0,159, 0,150,255,144, 0,159, + 0,151,255,144, 0,159, 0,152,255,144, 0,159, 0,162,254,230, 0,159, 0,163,254,230, 0,159, 0,164,254,230, 0,159, 0,165, +254,230, 0,159, 0,166,254,230, 0,159, 0,167,254,230, 0,159, 0,170,254,240, 0,159, 0,171,254,240, 0,159, 0,172,254,240, + 0,159, 0,173,254,240, 0,159, 0,180,254,240, 0,159, 0,181,254,240, 0,159, 0,182,254,240, 0,159, 0,183,254,240, 0,159, + 0,184,254,240, 0,159, 0,187,255, 21, 0,159, 0,188,255, 21, 0,159, 0,189,255, 21, 0,159, 0,190,255, 21, 0,159, 0,200, +255,144, 0,159, 0,206,255,144, 0,159, 0,221,254,240, 0,159, 1, 49,255, 21, 0,159, 5,145,255,144, 0,159, 5,146,255,220, + 0,159, 5,147,254,248, 0,160, 0, 17,255,107, 0,160, 0, 29,255,183, 0,160, 5,145,255,220, 0,160, 5,147,255, 68, 0,161, + 0, 16, 0, 38, 0,161, 5,145,255,144, 0,161, 5,146,255,144, 0,161, 5,147,255,173, 0,170, 0, 91,255,220, 0,171, 0, 91, +255,220, 0,172, 0, 91,255,220, 0,173, 0, 91,255,220, 0,178, 5,145,255,164, 0,178, 5,146,255,144, 0,178, 5,147,255,183, + 0,179, 5,145,255,107, 0,179, 5,146,255,144, 0,179, 5,147,255,164, 0,180, 0, 16, 0, 38, 0,180, 0, 17,255,220, 0,180, + 0, 91,255,193, 0,180, 5,145,255,107, 0,180, 5,146,255,183, 0,180, 5,147,255,125, 0,181, 0, 16, 0, 38, 0,181, 0, 17, +255,220, 0,181, 0, 91,255,193, 0,181, 5,145,255,107, 0,181, 5,146,255,183, 0,181, 5,147,255,125, 0,182, 0, 16, 0, 38, + 0,182, 0, 17,255,220, 0,182, 0, 91,255,193, 0,182, 5,145,255,107, 0,182, 5,146,255,183, 0,182, 5,147,255,125, 0,183, + 0, 16, 0, 38, 0,183, 0, 17,255,220, 0,183, 0, 91,255,193, 0,183, 5,145,255,107, 0,183, 5,146,255,183, 0,183, 5,147, +255,125, 0,184, 0, 16, 0, 38, 0,184, 0, 17,255,220, 0,184, 0, 91,255,193, 0,184, 5,145,255,107, 0,184, 5,146,255,183, + 0,184, 5,147,255,125, 0,191, 0, 16,255,220, 0,191, 0, 17,254,220, 0,191, 0, 29,255,107, 0,191, 0,109,255,220, 0,191, + 0,125,255,220, 0,191, 5,147,254,211, 0,193, 0, 16,255,220, 0,193, 0, 17,254,220, 0,193, 0, 29,255,107, 0,193, 0,109, +255,220, 0,193, 0,125,255,220, 0,193, 5,147,254,211, 0,194, 0, 16,255,211, 0,194, 0, 17,255,220, 0,194, 0, 29,255,220, + 0,194, 0, 36, 0, 57, 0,194, 0, 38,255,220, 0,194, 0, 42,255,220, 0,194, 0, 50,255,220, 0,194, 0, 52,255,220, 0,194, + 0, 55,255, 97, 0,194, 0, 57,255,125, 0,194, 0, 58,255,144, 0,194, 0, 60,255, 97, 0,194, 0, 70,255,220, 0,194, 0, 71, +255,220, 0,194, 0, 72,255,220, 0,194, 0, 73,255,183, 0,194, 0, 82,255,220, 0,194, 0, 84,255,220, 0,194, 0, 87,255,220, + 0,194, 0, 89,255,136, 0,194, 0, 90,255,173, 0,194, 0, 92,255,117, 0,194, 0,109,255,183, 0,194, 0,130, 0, 57, 0,194, + 0,131, 0, 57, 0,194, 0,132, 0, 57, 0,194, 0,133, 0, 57, 0,194, 0,134, 0, 57, 0,194, 0,148,255,220, 0,194, 0,149, +255,220, 0,194, 0,150,255,220, 0,194, 0,151,255,220, 0,194, 0,152,255,220, 0,194, 0,159,255, 97, 0,194, 0,169,255,220, + 0,194, 0,170,255,220, 0,194, 0,171,255,220, 0,194, 0,172,255,220, 0,194, 0,173,255,220, 0,194, 0,180,255,220, 0,194, + 0,181,255,220, 0,194, 0,182,255,220, 0,194, 0,183,255,220, 0,194, 0,184,255,220, 0,194, 0,191,255,117, 0,194, 0,193, +255,117, 0,194, 0,194, 0, 57, 0,194, 0,196, 0, 57, 0,194, 0,198, 0, 57, 0,194, 0,200,255,220, 0,194, 0,202,255,220, + 0,194, 0,204,255,220, 0,194, 0,205,255,220, 0,194, 0,206,255,220, 0,194, 0,209,255,220, 0,194, 0,211,255,220, 0,194, + 0,213,255,220, 0,194, 0,215,255,220, 0,194, 0,217,255,220, 0,194, 0,219,255,220, 0,194, 0,221,255,220, 0,194, 0,222, +255,220, 0,194, 0,226,255,220, 0,194, 1, 14,255,220, 0,194, 1, 15,255,220, 0,194, 1, 16,255,220, 0,194, 1, 17,255,220, + 0,194, 1, 18,255,220, 0,194, 1, 19,255,220, 0,194, 1, 36,255, 97, 0,194, 1, 37,255,220, 0,194, 1, 38,255, 97, 0,194, + 1, 39,255,220, 0,194, 1, 54,255,144, 0,194, 1, 55,255,173, 0,194, 1, 56,255, 97, 0,194, 1, 57,255,117, 0,194, 1, 58, +255, 97, 0,194, 1,240,255,220, 0,194, 1,241,255,220, 0,194, 4,252,255,144, 0,194, 4,254,255,144, 0,194, 4,255,255,173, + 0,194, 5, 0,255,144, 0,194, 5, 1,255,173, 0,194, 5,106,255, 97, 0,194, 5,107,255,117, 0,194, 5,145,254,248, 0,194, + 5,146,255, 2, 0,194, 5,147, 0, 47, 0,196, 0, 16,255,211, 0,196, 0, 17,255,220, 0,196, 0, 29,255,220, 0,196, 0, 36, + 0, 57, 0,196, 0, 38,255,220, 0,196, 0, 42,255,220, 0,196, 0, 50,255,220, 0,196, 0, 52,255,220, 0,196, 0, 55,255, 97, + 0,196, 0, 57,255,125, 0,196, 0, 58,255,144, 0,196, 0, 60,255, 97, 0,196, 0, 70,255,220, 0,196, 0, 71,255,220, 0,196, + 0, 72,255,220, 0,196, 0, 73,255,183, 0,196, 0, 82,255,220, 0,196, 0, 84,255,220, 0,196, 0, 87,255,220, 0,196, 0, 89, +255,136, 0,196, 0, 90,255,173, 0,196, 0, 92,255,117, 0,196, 0,109,255,183, 0,196, 0,130, 0, 57, 0,196, 0,131, 0, 57, + 0,196, 0,132, 0, 57, 0,196, 0,133, 0, 57, 0,196, 0,134, 0, 57, 0,196, 0,148,255,220, 0,196, 0,149,255,220, 0,196, + 0,150,255,220, 0,196, 0,151,255,220, 0,196, 0,152,255,220, 0,196, 0,159,255, 97, 0,196, 0,169,255,220, 0,196, 0,170, +255,220, 0,196, 0,171,255,220, 0,196, 0,172,255,220, 0,196, 0,173,255,220, 0,196, 0,180,255,220, 0,196, 0,181,255,220, + 0,196, 0,182,255,220, 0,196, 0,183,255,220, 0,196, 0,184,255,220, 0,196, 0,191,255,117, 0,196, 0,193,255,117, 0,196, + 0,194, 0, 57, 0,196, 0,196, 0, 57, 0,196, 0,198, 0, 57, 0,196, 0,200,255,220, 0,196, 0,202,255,220, 0,196, 0,204, +255,220, 0,196, 0,205,255,220, 0,196, 0,206,255,220, 0,196, 0,209,255,220, 0,196, 0,211,255,220, 0,196, 0,213,255,220, + 0,196, 0,215,255,220, 0,196, 0,217,255,220, 0,196, 0,219,255,220, 0,196, 0,221,255,220, 0,196, 0,222,255,220, 0,196, + 0,226,255,220, 0,196, 1, 14,255,220, 0,196, 1, 15,255,220, 0,196, 1, 16,255,220, 0,196, 1, 17,255,220, 0,196, 1, 18, +255,220, 0,196, 1, 19,255,220, 0,196, 1, 36,255, 97, 0,196, 1, 37,255,220, 0,196, 1, 38,255, 97, 0,196, 1, 39,255,220, + 0,196, 1, 54,255,144, 0,196, 1, 55,255,173, 0,196, 1, 56,255, 97, 0,196, 1, 57,255,117, 0,196, 1, 58,255, 97, 0,196, + 1,240,255,220, 0,196, 1,241,255,220, 0,196, 4,252,255,144, 0,196, 4,254,255,144, 0,196, 4,255,255,173, 0,196, 5, 0, +255,144, 0,196, 5, 1,255,173, 0,196, 5,106,255, 97, 0,196, 5,107,255,117, 0,196, 5,145,254,248, 0,196, 5,146,255, 2, + 0,196, 5,147, 0, 47, 0,198, 0, 16,255,211, 0,198, 0, 17,255,220, 0,198, 0, 29,255,220, 0,198, 0, 36, 0, 57, 0,198, + 0, 38,255,220, 0,198, 0, 42,255,220, 0,198, 0, 50,255,220, 0,198, 0, 52,255,220, 0,198, 0, 55,255, 97, 0,198, 0, 57, +255,125, 0,198, 0, 58,255,144, 0,198, 0, 60,255, 97, 0,198, 0, 70,255,220, 0,198, 0, 71,255,220, 0,198, 0, 72,255,220, + 0,198, 0, 73,255,183, 0,198, 0, 82,255,220, 0,198, 0, 84,255,220, 0,198, 0, 87,255,220, 0,198, 0, 89,255,136, 0,198, + 0, 90,255,173, 0,198, 0,109,255,183, 0,198, 0,130, 0, 57, 0,198, 0,131, 0, 57, 0,198, 0,132, 0, 57, 0,198, 0,133, + 0, 57, 0,198, 0,134, 0, 57, 0,198, 0,148,255,220, 0,198, 0,149,255,220, 0,198, 0,150,255,220, 0,198, 0,151,255,220, + 0,198, 0,152,255,220, 0,198, 0,159,255, 97, 0,198, 0,169,255,220, 0,198, 0,170,255,220, 0,198, 0,171,255,220, 0,198, + 0,172,255,220, 0,198, 0,173,255,220, 0,198, 0,180,255,220, 0,198, 0,181,255,220, 0,198, 0,182,255,220, 0,198, 0,183, +255,220, 0,198, 0,184,255,220, 0,198, 0,194, 0, 57, 0,198, 0,196, 0, 57, 0,198, 0,198, 0, 57, 0,198, 0,200,255,220, + 0,198, 0,202,255,220, 0,198, 0,204,255,220, 0,198, 0,205,255,220, 0,198, 0,206,255,220, 0,198, 0,209,255,220, 0,198, + 0,211,255,220, 0,198, 0,213,255,220, 0,198, 0,215,255,220, 0,198, 0,217,255,220, 0,198, 0,219,255,220, 0,198, 0,221, +255,220, 0,198, 0,222,255,220, 0,198, 0,226,255,220, 0,198, 1, 14,255,220, 0,198, 1, 15,255,220, 0,198, 1, 16,255,220, + 0,198, 1, 17,255,220, 0,198, 1, 19,255,220, 0,198, 1, 36,255, 97, 0,198, 1, 37,255,220, 0,198, 1, 38,255, 97, 0,198, + 1, 39,255,220, 0,198, 1, 54,255,144, 0,198, 1, 55,255,173, 0,198, 1, 56,255, 97, 0,198, 1, 58,255, 97, 0,198, 1,240, +255,220, 0,198, 1,241,255,220, 0,198, 4,252,255,144, 0,198, 4,254,255,144, 0,198, 4,255,255,173, 0,198, 5, 0,255,144, + 0,198, 5, 1,255,173, 0,198, 5,106,255, 97, 0,198, 5,145,254,248, 0,198, 5,146,255, 2, 0,198, 5,147, 0, 47, 0,200, + 0, 60,255,220, 0,200, 0,109,255,220, 0,200, 0,125,255,220, 0,200, 0,159,255,220, 0,200, 1, 58,255,220, 0,200, 5,146, + 0, 38, 0,206, 0, 60,255,220, 0,206, 0,109,255,220, 0,206, 0,125,255,220, 0,206, 0,159,255,220, 0,206, 1, 58,255,220, + 0,206, 5,146, 0, 38, 0,208, 0, 36,255,220, 0,208, 0, 57,255,220, 0,208, 0, 60,255,144, 0,208, 0,109,255,220, 0,208, + 0,125,255,220, 0,208, 0,130,255,220, 0,208, 0,131,255,220, 0,208, 0,132,255,220, 0,208, 0,133,255,220, 0,208, 0,134, +255,220, 0,208, 0,159,255,144, 0,208, 0,194,255,220, 0,208, 0,196,255,220, 0,208, 0,198,255,220, 0,208, 1, 56,255,144, + 0,208, 1, 58,255,144, 0,208, 1,244,255,144, 0,208, 5,106,255,144, 0,208, 5,145,255,211, 0,208, 5,146,255,201, 0,208, + 5,147,255, 68, 0,210, 0, 36,255,220, 0,210, 0, 57,255,220, 0,210, 0, 60,255,144, 0,210, 0,109,255,220, 0,210, 0,125, +255,220, 0,210, 0,130,255,220, 0,210, 0,131,255,220, 0,210, 0,132,255,220, 0,210, 0,133,255,220, 0,210, 0,134,255,220, + 0,210, 0,159,255,144, 0,210, 1, 58,255,144, 0,210, 5,145,255,211, 0,210, 5,146,255,201, 0,210, 5,147,255, 68, 0,221, + 0, 91,255,220, 0,224, 0, 55,255,183, 0,224, 0, 60,255,154, 0,224, 0,109,255,220, 0,224, 0,125,255,220, 0,224, 0,159, +255,154, 0,224, 1, 38,255,183, 0,224, 1, 58,255,154, 0,224, 5,145,255,211, 0,224, 5,146,255,211, 0,224, 5,147,255,201, + 0,251, 0, 16,255,220, 0,251, 0, 36, 0, 47, 0,251, 0, 50,255,183, 0,251, 0, 55,254,230, 0,251, 0, 56,255,154, 0,251, + 0, 57,255, 31, 0,251, 0, 58,255, 68, 0,251, 0, 60,254,240, 0,251, 0, 72,255,220, 0,251, 0, 82,255,220, 0,251, 0, 88, +255,220, 0,251, 0, 92,255, 68, 0,251, 0,130, 0, 47, 0,251, 0,131, 0, 47, 0,251, 0,132, 0, 47, 0,251, 0,133, 0, 47, + 0,251, 0,134, 0, 47, 0,251, 0,148,255,183, 0,251, 0,149,255,183, 0,251, 0,150,255,183, 0,251, 0,151,255,183, 0,251, + 0,152,255,183, 0,251, 0,155,255,154, 0,251, 0,156,255,154, 0,251, 0,157,255,154, 0,251, 0,158,255,154, 0,251, 0,159, +254,240, 0,251, 0,170,255,220, 0,251, 0,171,255,220, 0,251, 0,172,255,220, 0,251, 0,173,255,220, 0,251, 0,180,255,220, + 0,251, 0,181,255,220, 0,251, 0,182,255,220, 0,251, 0,183,255,220, 0,251, 0,184,255,220, 0,251, 0,187,255,220, 0,251, + 0,188,255,220, 0,251, 0,189,255,220, 0,251, 0,190,255,220, 0,251, 0,191,255, 68, 0,251, 0,193,255, 68, 0,251, 0,221, +255,220, 0,251, 1, 38,254,230, 0,251, 1, 48,255,154, 0,251, 1, 49,255,220, 0,251, 1, 58,254,240, 0,251, 5,145,254, 97, + 0,251, 5,146,253,230, 0,255, 0, 16,255,220, 0,255, 0, 36, 0, 47, 0,255, 0, 50,255,183, 0,255, 0, 55,254,230, 0,255, + 0, 56,255,154, 0,255, 0, 57,255, 31, 0,255, 0, 58,255, 68, 0,255, 0, 60,254,240, 0,255, 0, 72,255,220, 0,255, 0, 82, +255,220, 0,255, 0, 88,255,220, 0,255, 0, 92,255, 68, 0,255, 0,130, 0, 47, 0,255, 0,131, 0, 47, 0,255, 0,132, 0, 47, + 0,255, 0,133, 0, 47, 0,255, 0,134, 0, 47, 0,255, 0,148,255,183, 0,255, 0,149,255,183, 0,255, 0,150,255,183, 0,255, + 0,151,255,183, 0,255, 0,152,255,183, 0,255, 0,155,255,154, 0,255, 0,156,255,154, 0,255, 0,157,255,154, 0,255, 0,158, +255,154, 0,255, 0,159,254,240, 0,255, 0,170,255,220, 0,255, 0,171,255,220, 0,255, 0,172,255,220, 0,255, 0,173,255,220, + 0,255, 0,180,255,220, 0,255, 0,181,255,220, 0,255, 0,182,255,220, 0,255, 0,183,255,220, 0,255, 0,184,255,220, 0,255, + 0,187,255,220, 0,255, 0,188,255,220, 0,255, 0,189,255,220, 0,255, 0,190,255,220, 0,255, 0,191,255, 68, 0,255, 0,193, +255, 68, 0,255, 0,221,255,220, 0,255, 1, 38,254,230, 0,255, 1, 48,255,154, 0,255, 1, 49,255,220, 0,255, 1, 58,254,240, + 0,255, 5,145,254, 97, 0,255, 5,146,253,230, 1, 2, 0, 79,255, 63, 1, 10, 5,145,255,107, 1, 10, 5,146,255,144, 1, 10, + 5,147,255,164, 1, 22, 0, 16,255,173, 1, 22, 0, 17,255,183, 1, 22, 0, 29,255,193, 1, 22, 0, 36,255,173, 1, 22, 0, 38, +255,154, 1, 22, 0, 55,255,107, 1, 22, 0, 57,255,144, 1, 22, 0, 58,255,173, 1, 22, 0, 60,255,125, 1, 22, 0, 68,255,211, + 1, 22, 0, 72,255,164, 1, 22, 0, 82,255,164, 1, 22, 0, 88,255,164, 1, 22, 0, 92,255,144, 1, 22, 0,109,255,144, 1, 22, + 0,125,255,220, 1, 22, 0,130,255,173, 1, 22, 0,131,255,173, 1, 22, 0,132,255,173, 1, 22, 0,133,255,173, 1, 22, 0,134, +255,173, 1, 22, 0,137,255,154, 1, 22, 0,159,255,125, 1, 22, 0,162,255,211, 1, 22, 0,163,255,211, 1, 22, 0,164,255,211, + 1, 22, 0,165,255,211, 1, 22, 0,166,255,211, 1, 22, 0,167,255,211, 1, 22, 0,170,255,164, 1, 22, 0,171,255,164, 1, 22, + 0,172,255,164, 1, 22, 0,173,255,164, 1, 22, 0,180,255,164, 1, 22, 0,181,255,164, 1, 22, 0,182,255,164, 1, 22, 0,183, +255,164, 1, 22, 0,184,255,164, 1, 22, 0,187,255,164, 1, 22, 0,188,255,164, 1, 22, 0,189,255,164, 1, 22, 0,190,255,164, + 1, 22, 0,191,255,144, 1, 22, 0,193,255,144, 1, 22, 0,200,255,154, 1, 22, 0,206,255,154, 1, 22, 0,221,255,164, 1, 22, + 1, 38,255,107, 1, 22, 1, 49,255,164, 1, 22, 1, 58,255,125, 1, 22, 5,145,255,107, 1, 22, 5,146,255,125, 1, 22, 5,147, +255,220, 1, 23, 0, 16,255,125, 1, 23, 0, 17,255, 68, 1, 23, 0, 29,255,220, 1, 23, 0, 70,255,211, 1, 23, 0, 71,255,220, + 1, 23, 0, 72,255,211, 1, 23, 0, 74,255,220, 1, 23, 0, 75,255,220, 1, 23, 0, 80,255,220, 1, 23, 0, 81,255,220, 1, 23, + 0, 82,255,211, 1, 23, 0, 84,255,220, 1, 23, 0, 85,255,220, 1, 23, 0, 91,255,201, 1, 23, 0,109,255,183, 1, 23, 0,169, +255,211, 1, 23, 0,170,255,211, 1, 23, 0,171,255,211, 1, 23, 0,172,255,211, 1, 23, 0,173,255,211, 1, 23, 0,179,255,220, + 1, 23, 0,180,255,211, 1, 23, 0,181,255,211, 1, 23, 0,182,255,211, 1, 23, 0,183,255,211, 1, 23, 0,184,255,211, 1, 23, + 0,201,255,211, 1, 23, 0,207,255,211, 1, 23, 0,209, 0, 72, 1, 23, 0,221,255,211, 1, 23, 0,225,255,220, 1, 23, 1, 10, +255,220, 1, 23, 1, 23,255,220, 1, 23, 1, 27,255,220, 1, 23, 5,146, 0, 86, 1, 23, 5,147,254,201, 1, 26, 0, 16,255,173, + 1, 26, 0, 17,255,183, 1, 26, 0, 29,255,193, 1, 26, 0, 36,255,173, 1, 26, 0, 38,255,154, 1, 26, 0, 55,255,107, 1, 26, + 0, 57,255,144, 1, 26, 0, 58,255,173, 1, 26, 0, 60,255,125, 1, 26, 0, 68,255,211, 1, 26, 0, 72,255,164, 1, 26, 0, 82, +255,164, 1, 26, 0, 88,255,164, 1, 26, 0, 92,255,144, 1, 26, 0,109,255,144, 1, 26, 0,125,255,220, 1, 26, 0,130,255,173, + 1, 26, 0,131,255,173, 1, 26, 0,132,255,173, 1, 26, 0,133,255,173, 1, 26, 0,134,255,173, 1, 26, 0,137,255,154, 1, 26, + 0,159,255,125, 1, 26, 0,162,255,211, 1, 26, 0,163,255,211, 1, 26, 0,164,255,211, 1, 26, 0,165,255,211, 1, 26, 0,166, +255,211, 1, 26, 0,167,255,211, 1, 26, 0,170,255,164, 1, 26, 0,171,255,164, 1, 26, 0,172,255,164, 1, 26, 0,173,255,164, + 1, 26, 0,180,255,164, 1, 26, 0,181,255,164, 1, 26, 0,182,255,164, 1, 26, 0,183,255,164, 1, 26, 0,184,255,164, 1, 26, + 0,187,255,164, 1, 26, 0,188,255,164, 1, 26, 0,189,255,164, 1, 26, 0,190,255,164, 1, 26, 0,191,255,144, 1, 26, 0,193, +255,144, 1, 26, 0,200,255,154, 1, 26, 0,206,255,154, 1, 26, 0,221,255,164, 1, 26, 1, 38,255,107, 1, 26, 1, 49,255,164, + 1, 26, 1, 58,255,125, 1, 26, 5,145,255,107, 1, 26, 5,146,255,125, 1, 26, 5,147,255,220, 1, 27, 0, 16,255,125, 1, 27, + 0, 17,255, 68, 1, 27, 0, 29,255,220, 1, 27, 0, 70,255,211, 1, 27, 0, 71,255,220, 1, 27, 0, 72,255,211, 1, 27, 0, 74, +255,220, 1, 27, 0, 75,255,220, 1, 27, 0, 80,255,220, 1, 27, 0, 81,255,220, 1, 27, 0, 82,255,211, 1, 27, 0, 84,255,220, + 1, 27, 0, 85,255,220, 1, 27, 0, 91,255,201, 1, 27, 0,109,255,183, 1, 27, 0,169,255,211, 1, 27, 0,170,255,211, 1, 27, + 0,171,255,211, 1, 27, 0,172,255,211, 1, 27, 0,173,255,211, 1, 27, 0,179,255,220, 1, 27, 0,180,255,211, 1, 27, 0,181, +255,211, 1, 27, 0,182,255,211, 1, 27, 0,183,255,211, 1, 27, 0,184,255,211, 1, 27, 0,201,255,211, 1, 27, 0,207,255,211, + 1, 27, 0,209,255,220, 1, 27, 0,221,255,211, 1, 27, 0,225,255,220, 1, 27, 1, 10,255,220, 1, 27, 1, 23,255,220, 1, 27, + 1, 27,255,220, 1, 27, 5,146, 0, 86, 1, 27, 5,147,254,201, 1, 32, 0, 36, 0, 38, 1, 32, 0,130, 0, 38, 1, 32, 0,131, + 0, 38, 1, 32, 0,132, 0, 38, 1, 32, 0,133, 0, 38, 1, 32, 0,134, 0, 38, 1, 34, 0, 36, 0, 38, 1, 34, 0,130, 0, 38, + 1, 34, 0,131, 0, 38, 1, 34, 0,132, 0, 38, 1, 34, 0,133, 0, 38, 1, 34, 0,134, 0, 38, 1, 38, 0, 16,255, 68, 1, 38, + 0, 17,255, 13, 1, 38, 0, 29,255, 31, 1, 38, 0, 36,255, 97, 1, 38, 0, 38,255,136, 1, 38, 0, 55,255,220, 1, 38, 0, 68, +254,173, 1, 38, 0, 70,254,164, 1, 38, 0, 72,254,164, 1, 38, 0, 76,255,193, 1, 38, 0, 82,254,164, 1, 38, 0, 85,254,211, + 1, 38, 0, 86,254,173, 1, 38, 0, 88,254,201, 1, 38, 0, 90,254,173, 1, 38, 0, 92,254,193, 1, 38, 0,109,255, 68, 1, 38, + 0,125,255,144, 1, 38, 0,130,255, 97, 1, 38, 0,131,255, 97, 1, 38, 0,132,255, 97, 1, 38, 0,133,255, 97, 1, 38, 0,134, +255, 97, 1, 38, 0,137,255,136, 1, 38, 0,162,254,173, 1, 38, 0,163,254,173, 1, 38, 0,164,254,173, 1, 38, 0,165,254,173, + 1, 38, 0,166,254,173, 1, 38, 0,167,254,173, 1, 38, 0,169,254,164, 1, 38, 0,170,254,164, 1, 38, 0,171,254,164, 1, 38, + 0,172,254,164, 1, 38, 0,173,254,164, 1, 38, 0,180,254,164, 1, 38, 0,181,254,164, 1, 38, 0,182,254,164, 1, 38, 0,183, +254,164, 1, 38, 0,184,254,164, 1, 38, 0,187,254,201, 1, 38, 0,188,254,201, 1, 38, 0,189,254,201, 1, 38, 0,190,254,201, + 1, 38, 0,191,254,193, 1, 38, 0,193,254,193, 1, 38, 0,200,255,136, 1, 38, 0,201,254,164, 1, 38, 0,206,255,136, 1, 38, + 0,207,254,164, 1, 38, 0,221,254,164, 1, 38, 1, 23,254,211, 1, 38, 1, 27,254,211, 1, 38, 1, 33,254,173, 1, 38, 1, 35, +254,173, 1, 38, 1, 38,255,220, 1, 38, 1, 49,254,201, 1, 38, 5,146,255,211, 1, 38, 5,147,254,248, 1, 48, 0, 61,255,220, + 1, 48, 1, 63,255,220, 1, 58, 0, 16,255, 13, 1, 58, 0, 17,254, 97, 1, 58, 0, 29,254,240, 1, 58, 0, 36,255, 97, 1, 58, + 0, 38,255,144, 1, 58, 0, 50,255,144, 1, 58, 0, 68,254,230, 1, 58, 0, 72,254,240, 1, 58, 0, 76,255,183, 1, 58, 0, 82, +254,240, 1, 58, 0, 88,255, 21, 1, 58, 0,109,255, 31, 1, 58, 0,125,255,107, 1, 58, 0,130,255, 97, 1, 58, 0,131,255, 97, + 1, 58, 0,132,255, 97, 1, 58, 0,133,255, 97, 1, 58, 0,134,255, 97, 1, 58, 0,137,255,144, 1, 58, 0,148,255,144, 1, 58, + 0,149,255,144, 1, 58, 0,150,255,144, 1, 58, 0,151,255,144, 1, 58, 0,152,255,144, 1, 58, 0,162,254,230, 1, 58, 0,163, +254,230, 1, 58, 0,164,254,230, 1, 58, 0,165,254,230, 1, 58, 0,166,254,230, 1, 58, 0,167,254,230, 1, 58, 0,170,254,240, + 1, 58, 0,171,254,240, 1, 58, 0,172,254,240, 1, 58, 0,173,254,240, 1, 58, 0,180,254,240, 1, 58, 0,181,254,240, 1, 58, + 0,182,254,240, 1, 58, 0,183,254,240, 1, 58, 0,184,254,240, 1, 58, 0,187,255, 21, 1, 58, 0,188,255, 21, 1, 58, 0,189, +255, 21, 1, 58, 0,190,255, 21, 1, 58, 0,200,255,144, 1, 58, 0,206,255,144, 1, 58, 0,221,254,240, 1, 58, 1, 49,255, 21, + 1, 58, 5,145,255,144, 1, 58, 5,146,255,220, 1, 58, 5,147,254,248, 1, 63, 0, 16,255,220, 1, 63, 5,145,255,220, 1, 63, + 5,146,255,220, 1, 63, 5,147,255,220, 5,133, 0, 36,255,211, 5,133, 0, 37,255,183, 5,133, 0, 42, 0, 75, 5,133, 0, 45, + 0,114, 5,133, 0, 50, 0, 57, 5,133, 0, 52, 0, 75, 5,133, 0, 55,255, 68, 5,133, 0, 57,255,136, 5,133, 0, 58,255,173, + 5,133, 0, 59,255,154, 5,133, 0, 60,255, 13, 5,133, 0, 82, 0, 38, 5,133, 0, 89,255,201, 5,133, 0, 92,255,220, 5,133, + 0,130,255,211, 5,133, 0,131,255,211, 5,133, 0,132,255,211, 5,133, 0,133,255,211, 5,133, 0,134,255,211, 5,133, 0,148, + 0, 57, 5,133, 0,149, 0, 57, 5,133, 0,150, 0, 57, 5,133, 0,151, 0, 57, 5,133, 0,152, 0, 57, 5,133, 0,159,255, 13, + 5,133, 0,180, 0, 38, 5,133, 0,181, 0, 38, 5,133, 0,182, 0, 38, 5,133, 0,183, 0, 38, 5,133, 0,184, 0, 38, 5,133, + 0,191,255,220, 5,133, 0,193,255,220, 5,133, 0,224, 0, 75, 5,133, 1, 38,255, 68, 5,133, 1, 58,255, 13, 5,145, 0, 36, +254,248, 5,145, 0, 37,255,193, 5,145, 0, 38,255,183, 5,145, 0, 39,255,193, 5,145, 0, 41,255,193, 5,145, 0, 42,255,183, + 5,145, 0, 43,255,193, 5,145, 0, 45,255,193, 5,145, 0, 46,255,193, 5,145, 0, 47,255,193, 5,145, 0, 50,255,183, 5,145, + 0, 51,255,193, 5,145, 0, 52,255,183, 5,145, 0, 53,255,193, 5,145, 0, 59,255,136, 5,145, 0, 61,255,220, 5,145, 0, 73, +255,183, 5,145, 0, 81,255,144, 5,145, 0, 82,255,107, 5,145, 0, 85,255,144, 5,145, 0, 89,255,183, 5,145, 0, 90,255,183, + 5,145, 0, 92,255,183, 5,145, 0,130,254,248, 5,145, 0,131,254,248, 5,145, 0,132,254,248, 5,145, 0,133,254,248, 5,145, + 0,134,254,248, 5,145, 0,136,254,125, 5,145, 0,137,255,183, 5,145, 0,148,255,183, 5,145, 0,149,255,183, 5,145, 0,150, +255,183, 5,145, 0,151,255,183, 5,145, 0,152,255,183, 5,145, 0,160,255,193, 5,145, 0,161,255,193, 5,145, 0,178,255,183, + 5,145, 0,179,255,144, 5,145, 0,180,255,107, 5,145, 0,181,255,107, 5,145, 0,182,255,107, 5,145, 0,183,255,107, 5,145, + 0,184,255,107, 5,145, 0,191,255,183, 5,145, 0,193,255,183, 5,145, 0,200,255,183, 5,145, 0,206,255,183, 5,145, 0,208, +255,193, 5,145, 0,224,255,183, 5,145, 0,251,255,193, 5,145, 0,255,255,193, 5,145, 1, 10,255,144, 5,145, 1, 22,255,193, + 5,145, 1, 23,255,144, 5,145, 1, 26,255,193, 5,145, 1, 27,255,144, 5,145, 1, 63,255,220, 5,147, 0, 36, 0, 38, 5,147, + 0, 37,255,183, 5,147, 0, 38,255,144, 5,147, 0, 39,255,183, 5,147, 0, 41,255,183, 5,147, 0, 42,255,183, 5,147, 0, 43, +255,183, 5,147, 0, 45, 0, 47, 5,147, 0, 46,255,183, 5,147, 0, 47,255,183, 5,147, 0, 50,255,144, 5,147, 0, 51,255,183, + 5,147, 0, 52,255,144, 5,147, 0, 53,255,183, 5,147, 0, 55,254,230, 5,147, 0, 57,254,136, 5,147, 0, 58,255, 3, 5,147, + 0, 59,255,183, 5,147, 0, 60,254,136, 5,147, 0, 73,255,220, 5,147, 0, 81,255,183, 5,147, 0, 82,255,183, 5,147, 0, 85, +255,183, 5,147, 0, 89,255, 21, 5,147, 0, 90,255, 60, 5,147, 0, 92,255,144, 5,147, 0,130, 0, 38, 5,147, 0,131, 0, 38, + 5,147, 0,132, 0, 38, 5,147, 0,133, 0, 38, 5,147, 0,134, 0, 38, 5,147, 0,136, 0, 38, 5,147, 0,137,255,144, 5,147, + 0,148,255,144, 5,147, 0,149,255,144, 5,147, 0,150,255,144, 5,147, 0,151,255,144, 5,147, 0,152,255,144, 5,147, 0,159, +254,136, 5,147, 0,160,255,183, 5,147, 0,161,255,183, 5,147, 0,178,255,183, 5,147, 0,179,255,183, 5,147, 0,180,255,183, + 5,147, 0,181,255,183, 5,147, 0,182,255,183, 5,147, 0,183,255,183, 5,147, 0,184,255,183, 5,147, 0,191,255,144, 5,147, + 0,193,255,144, 5,147, 0,200,255,144, 5,147, 0,206,255,144, 5,147, 0,208,255,183, 5,147, 0,224,255,183, 5,147, 0,251, +255,183, 5,147, 0,255,255,183, 5,147, 1, 10,255,183, 5,147, 1, 22,255,183, 5,147, 1, 23,255,183, 5,147, 1, 26,255,183, + 5,147, 1, 27,255,183, 5,147, 1, 38,254,230, 5,147, 1, 58,254,136, 0, 0, 0, 0, 0, 61, 2,226, 0, 1, 0, 0, 0, 0, + 0, 0, 0,152, 1, 50, 0, 1, 0, 0, 0, 0, 0, 1, 0, 11, 1,227, 0, 1, 0, 0, 0, 0, 0, 2, 0, 4, 1,249, 0, 1, + 0, 0, 0, 0, 0, 3, 0, 11, 2, 22, 0, 1, 0, 0, 0, 0, 0, 4, 0, 11, 2, 58, 0, 1, 0, 0, 0, 0, 0, 5, 0, 11, + 2, 94, 0, 1, 0, 0, 0, 0, 0, 6, 0, 10, 2,128, 0, 1, 0, 0, 0, 0, 0, 8, 0, 17, 2,175, 0, 1, 0, 0, 0, 0, + 0, 11, 0, 29, 2,253, 0, 1, 0, 0, 0, 0, 0, 13, 18,157, 40, 87, 0, 1, 0, 0, 0, 0, 0, 14, 0, 52, 59, 95, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 24, 59,148, 0, 1, 0, 0, 0, 0, 1, 1, 0, 9, 60, 27, 0, 1, 0, 0, 0, 0, 1, 2, 0, 18, + 60, 76, 0, 1, 0, 0, 0, 0, 1, 3, 0, 9, 60,139, 0, 1, 0, 0, 0, 0, 1, 4, 0, 17, 60,167, 0, 1, 0, 0, 0, 0, + 1, 5, 0, 16, 61, 22, 0, 1, 0, 0, 0, 0, 1, 6, 0, 14, 61,125, 0, 1, 0, 0, 0, 0, 1, 7, 0, 7, 61,207, 0, 1, + 0, 0, 0, 0, 1, 8, 0, 18, 61,245, 0, 1, 0, 0, 0, 1, 1, 0, 0, 24, 59,173, 0, 1, 0, 0, 0, 1, 1, 1, 0, 9, + 60, 37, 0, 1, 0, 0, 0, 1, 1, 2, 0, 23, 60, 95, 0, 1, 0, 0, 0, 1, 1, 3, 0, 9, 60,149, 0, 1, 0, 0, 0, 1, + 1, 4, 0, 31, 60,185, 0, 1, 0, 0, 0, 1, 1, 5, 0, 18, 61, 39, 0, 1, 0, 0, 0, 1, 1, 6, 0, 15, 61,140, 0, 1, + 0, 0, 0, 1, 1, 7, 0, 21, 61,215, 0, 1, 0, 0, 0, 1, 1, 8, 0, 22, 62, 8, 0, 1, 0, 0, 0, 2, 1, 0, 0, 33, + 59,198, 0, 1, 0, 0, 0, 2, 1, 1, 0, 9, 60, 47, 0, 1, 0, 0, 0, 2, 1, 4, 0, 23, 60,217, 0, 1, 0, 0, 0, 2, + 1, 5, 0, 17, 61, 58, 0, 1, 0, 0, 0, 2, 1, 6, 0, 17, 61,156, 0, 1, 0, 0, 0, 2, 1, 8, 0, 16, 62, 31, 0, 1, + 0, 0, 0, 3, 1, 0, 0, 21, 59,232, 0, 1, 0, 0, 0, 3, 1, 1, 0, 8, 60, 57, 0, 1, 0, 0, 0, 3, 1, 4, 0, 17, + 60,241, 0, 1, 0, 0, 0, 3, 1, 5, 0, 19, 61, 76, 0, 1, 0, 0, 0, 3, 1, 6, 0, 13, 61,174, 0, 1, 0, 0, 0, 3, + 1, 8, 0, 18, 62, 48, 0, 1, 0, 0, 0, 4, 1, 0, 0, 28, 59,254, 0, 1, 0, 0, 0, 4, 1, 1, 0, 9, 60, 66, 0, 1, + 0, 0, 0, 4, 1, 2, 0, 19, 60,119, 0, 1, 0, 0, 0, 4, 1, 3, 0, 7, 60,159, 0, 1, 0, 0, 0, 4, 1, 4, 0, 18, + 61, 3, 0, 1, 0, 0, 0, 4, 1, 5, 0, 28, 61, 96, 0, 1, 0, 0, 0, 4, 1, 6, 0, 18, 61,188, 0, 1, 0, 0, 0, 4, + 1, 7, 0, 7, 61,237, 0, 1, 0, 0, 0, 4, 1, 8, 0, 17, 62, 67, 0, 3, 0, 1, 4, 9, 0, 0, 1, 48, 0, 0, 0, 3, + 0, 1, 4, 9, 0, 1, 0, 22, 1,203, 0, 3, 0, 1, 4, 9, 0, 2, 0, 8, 1,239, 0, 3, 0, 1, 4, 9, 0, 3, 0, 22, + 1,254, 0, 3, 0, 1, 4, 9, 0, 4, 0, 22, 2, 34, 0, 3, 0, 1, 4, 9, 0, 5, 0, 22, 2, 70, 0, 3, 0, 1, 4, 9, + 0, 6, 0, 20, 2,106, 0, 3, 0, 1, 4, 9, 0, 8, 0, 34, 2,139, 0, 3, 0, 1, 4, 9, 0, 11, 0, 58, 2,193, 0, 3, + 0, 1, 4, 9, 0, 13, 37, 58, 3, 27, 0, 3, 0, 1, 4, 9, 0, 14, 0,104, 58,245, 0, 67, 0,111, 0,112, 0,121, 0,114, + 0,105, 0,103, 0,104, 0,116, 0, 32, 0, 40, 0, 99, 0, 41, 0, 32, 0, 50, 0, 48, 0, 48, 0, 51, 0, 32, 0, 98, 0,121, + 0, 32, 0, 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 44, 0, 32, 0, 73, 0,110, 0, 99, 0, 46, + 0, 32, 0, 65, 0,108, 0,108, 0, 32, 0, 82, 0,105, 0,103, 0,104, 0,116, 0,115, 0, 32, 0, 82, 0,101, 0,115, 0,101, + 0,114, 0,118, 0,101, 0,100, 0, 46, 0, 10, 0, 67, 0,111, 0,112, 0,121, 0,114, 0,105, 0,103, 0,104, 0,116, 0, 32, + 0, 40, 0, 99, 0, 41, 0, 32, 0, 50, 0, 48, 0, 48, 0, 54, 0, 32, 0, 98, 0,121, 0, 32, 0, 84, 0, 97, 0,118, 0,109, + 0,106, 0,111, 0,110, 0,103, 0, 32, 0, 66, 0, 97, 0,104, 0, 46, 0, 32, 0, 65, 0,108, 0,108, 0, 32, 0, 82, 0,105, + 0,103, 0,104, 0,116, 0,115, 0, 32, 0, 82, 0,101, 0,115, 0,101, 0,114, 0,118, 0,101, 0,100, 0, 46, 0, 10, 0, 68, + 0,101, 0,106, 0, 97, 0, 86, 0,117, 0, 32, 0, 99, 0,104, 0, 97, 0,110, 0,103, 0,101, 0,115, 0, 32, 0, 97, 0,114, + 0,101, 0, 32, 0,105, 0,110, 0, 32, 0,112, 0,117, 0, 98, 0,108, 0,105, 0, 99, 0, 32, 0,100, 0,111, 0,109, 0, 97, + 0,105, 0,110, 0, 10, 0, 0, 67,111,112,121,114,105,103,104,116, 32, 40, 99, 41, 32, 50, 48, 48, 51, 32, 98,121, 32, 66,105, +116,115,116,114,101, 97,109, 44, 32, 73,110, 99, 46, 32, 65,108,108, 32, 82,105,103,104,116,115, 32, 82,101,115,101,114,118,101, +100, 46, 10, 67,111,112,121,114,105,103,104,116, 32, 40, 99, 41, 32, 50, 48, 48, 54, 32, 98,121, 32, 84, 97,118,109,106,111,110, +103, 32, 66, 97,104, 46, 32, 65,108,108, 32, 82,105,103,104,116,115, 32, 82,101,115,101,114,118,101,100, 46, 10, 68,101,106, 97, + 86,117, 32, 99,104, 97,110,103,101,115, 32, 97,114,101, 32,105,110, 32,112,117, 98,108,105, 99, 32,100,111,109, 97,105,110, 10, + 0, 0, 68, 0,101, 0,106, 0, 97, 0, 86, 0,117, 0, 32, 0, 83, 0, 97, 0,110, 0,115, 0, 0, 68,101,106, 97, 86,117, 32, + 83, 97,110,115, 0, 0, 66, 0,111, 0,111, 0,107, 0, 0, 66,111,111,107, 0, 0, 68, 0,101, 0,106, 0, 97, 0, 86, 0,117, + 0, 32, 0, 83, 0, 97, 0,110, 0,115, 0, 0, 68,101,106, 97, 86,117, 32, 83, 97,110,115, 0, 0, 68, 0,101, 0,106, 0, 97, + 0, 86, 0,117, 0, 32, 0, 83, 0, 97, 0,110, 0,115, 0, 0, 68,101,106, 97, 86,117, 32, 83, 97,110,115, 0, 0, 86, 0,101, + 0,114, 0,115, 0,105, 0,111, 0,110, 0, 32, 0, 50, 0, 46, 0, 56, 0, 0, 86,101,114,115,105,111,110, 32, 50, 46, 56, 0, + 0, 68, 0,101, 0,106, 0, 97, 0, 86, 0,117, 0, 83, 0, 97, 0,110, 0,115, 0, 0, 68,101,106, 97, 86,117, 83, 97,110,115, + 0, 0, 68, 0,101, 0,106, 0, 97, 0, 86, 0,117, 0, 32, 0,102, 0,111, 0,110, 0,116, 0,115, 0, 32, 0,116, 0,101, 0, + 97, 0,109, 0, 0, 68,101,106, 97, 86,117, 32,102,111,110,116,115, 32,116,101, 97,109, 0, 0,104, 0,116, 0,116, 0,112, 0, + 58, 0, 47, 0, 47, 0,100, 0,101, 0,106, 0, 97, 0,118, 0,117, 0, 46, 0,115, 0,111, 0,117, 0,114, 0, 99, 0,101, 0, +102, 0,111, 0,114, 0,103, 0,101, 0, 46, 0,110, 0,101, 0,116, 0, 0,104,116,116,112, 58, 47, 47,100,101,106, 97,118,117, + 46,115,111,117,114, 99,101,102,111,114,103,101, 46,110,101,116, 0, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 32, 0, 97, 0, +114, 0,101, 0, 32, 0, 40, 0, 99, 0, 41, 0, 32, 0, 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, + 32, 0, 40, 0,115, 0,101, 0,101, 0, 32, 0, 98, 0,101, 0,108, 0,111, 0,119, 0, 41, 0, 46, 0, 32, 0, 68, 0,101, 0, +106, 0, 97, 0, 86, 0,117, 0, 32, 0, 99, 0,104, 0, 97, 0,110, 0,103, 0,101, 0,115, 0, 32, 0, 97, 0,114, 0,101, 0, + 32, 0,105, 0,110, 0, 32, 0,112, 0,117, 0, 98, 0,108, 0,105, 0, 99, 0, 32, 0,100, 0,111, 0,109, 0, 97, 0,105, 0, +110, 0, 46, 0, 32, 0, 71, 0,108, 0,121, 0,112, 0,104, 0,115, 0, 32, 0,105, 0,109, 0,112, 0,111, 0,114, 0,116, 0, +101, 0,100, 0, 32, 0,102, 0,114, 0,111, 0,109, 0, 32, 0, 65, 0,114, 0,101, 0,118, 0, 32, 0,102, 0,111, 0,110, 0, +116, 0,115, 0, 32, 0, 97, 0,114, 0,101, 0, 32, 0, 40, 0, 99, 0, 41, 0, 32, 0, 84, 0, 97, 0,118, 0,109, 0,106, 0, +117, 0,110, 0,103, 0, 32, 0, 66, 0, 97, 0,104, 0, 32, 0, 40, 0,115, 0,101, 0,101, 0, 32, 0, 98, 0,101, 0,108, 0, +111, 0,119, 0, 41, 0, 10, 0, 10, 0, 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 32, 0, 86, 0, +101, 0,114, 0, 97, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 32, 0, 67, 0,111, 0,112, 0,121, 0,114, 0,105, 0, +103, 0,104, 0,116, 0, 10, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, + 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, + 45, 0, 45, 0, 10, 0, 10, 0, 67, 0,111, 0,112, 0,121, 0,114, 0,105, 0,103, 0,104, 0,116, 0, 32, 0, 40, 0, 99, 0, + 41, 0, 32, 0, 50, 0, 48, 0, 48, 0, 51, 0, 32, 0, 98, 0,121, 0, 32, 0, 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0, +101, 0, 97, 0,109, 0, 44, 0, 32, 0, 73, 0,110, 0, 99, 0, 46, 0, 32, 0, 65, 0,108, 0,108, 0, 32, 0, 82, 0,105, 0, +103, 0,104, 0,116, 0,115, 0, 32, 0, 82, 0,101, 0,115, 0,101, 0,114, 0,118, 0,101, 0,100, 0, 46, 0, 32, 0, 66, 0, +105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 32, 0, 86, 0,101, 0,114, 0, 97, 0, 32, 0,105, 0,115, 0, + 10, 0, 97, 0, 32, 0,116, 0,114, 0, 97, 0,100, 0,101, 0,109, 0, 97, 0,114, 0,107, 0, 32, 0,111, 0,102, 0, 32, 0, + 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 44, 0, 32, 0, 73, 0,110, 0, 99, 0, 46, 0, 10, 0, + 10, 0, 80, 0,101, 0,114, 0,109, 0,105, 0,115, 0,115, 0,105, 0,111, 0,110, 0, 32, 0,105, 0,115, 0, 32, 0,104, 0, +101, 0,114, 0,101, 0, 98, 0,121, 0, 32, 0,103, 0,114, 0, 97, 0,110, 0,116, 0,101, 0,100, 0, 44, 0, 32, 0,102, 0, +114, 0,101, 0,101, 0, 32, 0,111, 0,102, 0, 32, 0, 99, 0,104, 0, 97, 0,114, 0,103, 0,101, 0, 44, 0, 32, 0,116, 0, +111, 0, 32, 0, 97, 0,110, 0,121, 0, 32, 0,112, 0,101, 0,114, 0,115, 0,111, 0,110, 0, 32, 0,111, 0, 98, 0,116, 0, + 97, 0,105, 0,110, 0,105, 0,110, 0,103, 0, 32, 0, 97, 0, 32, 0, 99, 0,111, 0,112, 0,121, 0, 10, 0,111, 0,102, 0, + 32, 0,116, 0,104, 0,101, 0, 32, 0,102, 0,111, 0,110, 0,116, 0,115, 0, 32, 0, 97, 0, 99, 0, 99, 0,111, 0,109, 0, +112, 0, 97, 0,110, 0,121, 0,105, 0,110, 0,103, 0, 32, 0,116, 0,104, 0,105, 0,115, 0, 32, 0,108, 0,105, 0, 99, 0, +101, 0,110, 0,115, 0,101, 0, 32, 0, 40, 0, 34, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 34, 0, 41, 0, 32, 0, 97, 0, +110, 0,100, 0, 32, 0, 97, 0,115, 0,115, 0,111, 0, 99, 0,105, 0, 97, 0,116, 0,101, 0,100, 0, 10, 0,100, 0,111, 0, + 99, 0,117, 0,109, 0,101, 0,110, 0,116, 0, 97, 0,116, 0,105, 0,111, 0,110, 0, 32, 0,102, 0,105, 0,108, 0,101, 0, +115, 0, 32, 0, 40, 0,116, 0,104, 0,101, 0, 32, 0, 34, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0, +116, 0,119, 0, 97, 0,114, 0,101, 0, 34, 0, 41, 0, 44, 0, 32, 0,116, 0,111, 0, 32, 0,114, 0,101, 0,112, 0,114, 0, +111, 0,100, 0,117, 0, 99, 0,101, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,100, 0,105, 0,115, 0,116, 0,114, 0,105, 0, + 98, 0,117, 0,116, 0,101, 0, 32, 0,116, 0,104, 0,101, 0, 10, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0, +102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 44, 0, 32, 0,105, 0,110, 0, 99, 0,108, 0,117, 0,100, 0,105, 0,110, 0, +103, 0, 32, 0,119, 0,105, 0,116, 0,104, 0,111, 0,117, 0,116, 0, 32, 0,108, 0,105, 0,109, 0,105, 0,116, 0, 97, 0, +116, 0,105, 0,111, 0,110, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,114, 0,105, 0,103, 0,104, 0,116, 0,115, 0, 32, 0, +116, 0,111, 0, 32, 0,117, 0,115, 0,101, 0, 44, 0, 32, 0, 99, 0,111, 0,112, 0,121, 0, 44, 0, 32, 0,109, 0,101, 0, +114, 0,103, 0,101, 0, 44, 0, 10, 0,112, 0,117, 0, 98, 0,108, 0,105, 0,115, 0,104, 0, 44, 0, 32, 0,100, 0,105, 0, +115, 0,116, 0,114, 0,105, 0, 98, 0,117, 0,116, 0,101, 0, 44, 0, 32, 0, 97, 0,110, 0,100, 0, 47, 0,111, 0,114, 0, + 32, 0,115, 0,101, 0,108, 0,108, 0, 32, 0, 99, 0,111, 0,112, 0,105, 0,101, 0,115, 0, 32, 0,111, 0,102, 0, 32, 0, +116, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0, +101, 0, 44, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,116, 0,111, 0, 32, 0,112, 0,101, 0,114, 0,109, 0,105, 0,116, 0, + 10, 0,112, 0,101, 0,114, 0,115, 0,111, 0,110, 0,115, 0, 32, 0,116, 0,111, 0, 32, 0,119, 0,104, 0,111, 0,109, 0, + 32, 0,116, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0, +114, 0,101, 0, 32, 0,105, 0,115, 0, 32, 0,102, 0,117, 0,114, 0,110, 0,105, 0,115, 0,104, 0,101, 0,100, 0, 32, 0, +116, 0,111, 0, 32, 0,100, 0,111, 0, 32, 0,115, 0,111, 0, 44, 0, 32, 0,115, 0,117, 0, 98, 0,106, 0,101, 0, 99, 0, +116, 0, 32, 0,116, 0,111, 0, 32, 0,116, 0,104, 0,101, 0, 10, 0,102, 0,111, 0,108, 0,108, 0,111, 0,119, 0,105, 0, +110, 0,103, 0, 32, 0, 99, 0,111, 0,110, 0,100, 0,105, 0,116, 0,105, 0,111, 0,110, 0,115, 0, 58, 0, 10, 0, 10, 0, + 84, 0,104, 0,101, 0, 32, 0, 97, 0, 98, 0,111, 0,118, 0,101, 0, 32, 0, 99, 0,111, 0,112, 0,121, 0,114, 0,105, 0, +103, 0,104, 0,116, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,116, 0,114, 0, 97, 0,100, 0,101, 0,109, 0, 97, 0,114, 0, +107, 0, 32, 0,110, 0,111, 0,116, 0,105, 0, 99, 0,101, 0,115, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,116, 0,104, 0, +105, 0,115, 0, 32, 0,112, 0,101, 0,114, 0,109, 0,105, 0,115, 0,115, 0,105, 0,111, 0,110, 0, 32, 0,110, 0,111, 0, +116, 0,105, 0, 99, 0,101, 0, 32, 0,115, 0,104, 0, 97, 0,108, 0,108, 0, 10, 0, 98, 0,101, 0, 32, 0,105, 0,110, 0, + 99, 0,108, 0,117, 0,100, 0,101, 0,100, 0, 32, 0,105, 0,110, 0, 32, 0, 97, 0,108, 0,108, 0, 32, 0, 99, 0,111, 0, +112, 0,105, 0,101, 0,115, 0, 32, 0,111, 0,102, 0, 32, 0,111, 0,110, 0,101, 0, 32, 0,111, 0,114, 0, 32, 0,109, 0, +111, 0,114, 0,101, 0, 32, 0,111, 0,102, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, + 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,116, 0,121, 0,112, 0,101, 0,102, 0, 97, 0, 99, 0, +101, 0,115, 0, 46, 0, 10, 0, 10, 0, 84, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0, +102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,109, 0, 97, 0,121, 0, 32, 0, 98, 0,101, 0, 32, 0,109, 0,111, 0, +100, 0,105, 0,102, 0,105, 0,101, 0,100, 0, 44, 0, 32, 0, 97, 0,108, 0,116, 0,101, 0,114, 0,101, 0,100, 0, 44, 0, + 32, 0,111, 0,114, 0, 32, 0, 97, 0,100, 0,100, 0,101, 0,100, 0, 32, 0,116, 0,111, 0, 44, 0, 32, 0, 97, 0,110, 0, +100, 0, 32, 0,105, 0,110, 0, 32, 0,112, 0, 97, 0,114, 0,116, 0,105, 0, 99, 0,117, 0,108, 0, 97, 0,114, 0, 10, 0, +116, 0,104, 0,101, 0, 32, 0,100, 0,101, 0,115, 0,105, 0,103, 0,110, 0,115, 0, 32, 0,111, 0,102, 0, 32, 0,103, 0, +108, 0,121, 0,112, 0,104, 0,115, 0, 32, 0,111, 0,114, 0, 32, 0, 99, 0,104, 0, 97, 0,114, 0, 97, 0, 99, 0,116, 0, +101, 0,114, 0,115, 0, 32, 0,105, 0,110, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, + 32, 0,109, 0, 97, 0,121, 0, 32, 0, 98, 0,101, 0, 32, 0,109, 0,111, 0,100, 0,105, 0,102, 0,105, 0,101, 0,100, 0, + 32, 0, 97, 0,110, 0,100, 0, 10, 0, 97, 0,100, 0,100, 0,105, 0,116, 0,105, 0,111, 0,110, 0, 97, 0,108, 0, 32, 0, +103, 0,108, 0,121, 0,112, 0,104, 0,115, 0, 32, 0,111, 0,114, 0, 32, 0, 99, 0,104, 0, 97, 0,114, 0, 97, 0, 99, 0, +116, 0,101, 0,114, 0,115, 0, 32, 0,109, 0, 97, 0,121, 0, 32, 0, 98, 0,101, 0, 32, 0, 97, 0,100, 0,100, 0,101, 0, +100, 0, 32, 0,116, 0,111, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 44, 0, 32, 0, +111, 0,110, 0,108, 0,121, 0, 32, 0,105, 0,102, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,102, 0,111, 0,110, 0,116, 0, +115, 0, 10, 0, 97, 0,114, 0,101, 0, 32, 0,114, 0,101, 0,110, 0, 97, 0,109, 0,101, 0,100, 0, 32, 0,116, 0,111, 0, + 32, 0,110, 0, 97, 0,109, 0,101, 0,115, 0, 32, 0,110, 0,111, 0,116, 0, 32, 0, 99, 0,111, 0,110, 0,116, 0, 97, 0, +105, 0,110, 0,105, 0,110, 0,103, 0, 32, 0,101, 0,105, 0,116, 0,104, 0,101, 0,114, 0, 32, 0,116, 0,104, 0,101, 0, + 32, 0,119, 0,111, 0,114, 0,100, 0,115, 0, 32, 0, 34, 0, 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0, +109, 0, 34, 0, 32, 0,111, 0,114, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,119, 0,111, 0,114, 0,100, 0, 10, 0, 34, 0, + 86, 0,101, 0,114, 0, 97, 0, 34, 0, 46, 0, 10, 0, 10, 0, 84, 0,104, 0,105, 0,115, 0, 32, 0, 76, 0,105, 0, 99, 0, +101, 0,110, 0,115, 0,101, 0, 32, 0, 98, 0,101, 0, 99, 0,111, 0,109, 0,101, 0,115, 0, 32, 0,110, 0,117, 0,108, 0, +108, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,118, 0,111, 0,105, 0,100, 0, 32, 0,116, 0,111, 0, 32, 0,116, 0,104, 0, +101, 0, 32, 0,101, 0,120, 0,116, 0,101, 0,110, 0,116, 0, 32, 0, 97, 0,112, 0,112, 0,108, 0,105, 0, 99, 0, 97, 0, + 98, 0,108, 0,101, 0, 32, 0,116, 0,111, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 32, 0,111, 0,114, 0, 32, 0, + 70, 0,111, 0,110, 0,116, 0, 10, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,116, 0,104, 0, + 97, 0,116, 0, 32, 0,104, 0, 97, 0,115, 0, 32, 0, 98, 0,101, 0,101, 0,110, 0, 32, 0,109, 0,111, 0,100, 0,105, 0, +102, 0,105, 0,101, 0,100, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,105, 0,115, 0, 32, 0,100, 0,105, 0,115, 0,116, 0, +114, 0,105, 0, 98, 0,117, 0,116, 0,101, 0,100, 0, 32, 0,117, 0,110, 0,100, 0,101, 0,114, 0, 32, 0,116, 0,104, 0, +101, 0, 32, 0, 34, 0, 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 10, 0, 86, 0,101, 0,114, 0, + 97, 0, 34, 0, 32, 0,110, 0, 97, 0,109, 0,101, 0,115, 0, 46, 0, 10, 0, 10, 0, 84, 0,104, 0,101, 0, 32, 0, 70, 0, +111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,109, 0, 97, 0,121, 0, + 32, 0, 98, 0,101, 0, 32, 0,115, 0,111, 0,108, 0,100, 0, 32, 0, 97, 0,115, 0, 32, 0,112, 0, 97, 0,114, 0,116, 0, + 32, 0,111, 0,102, 0, 32, 0, 97, 0, 32, 0,108, 0, 97, 0,114, 0,103, 0,101, 0,114, 0, 32, 0,115, 0,111, 0,102, 0, +116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,112, 0, 97, 0, 99, 0,107, 0, 97, 0,103, 0,101, 0, 32, 0, 98, 0,117, 0, +116, 0, 32, 0,110, 0,111, 0, 10, 0, 99, 0,111, 0,112, 0,121, 0, 32, 0,111, 0,102, 0, 32, 0,111, 0,110, 0,101, 0, + 32, 0,111, 0,114, 0, 32, 0,109, 0,111, 0,114, 0,101, 0, 32, 0,111, 0,102, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, + 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,116, 0,121, 0, +112, 0,101, 0,102, 0, 97, 0, 99, 0,101, 0,115, 0, 32, 0,109, 0, 97, 0,121, 0, 32, 0, 98, 0,101, 0, 32, 0,115, 0, +111, 0,108, 0,100, 0, 32, 0, 98, 0,121, 0, 32, 0,105, 0,116, 0,115, 0,101, 0,108, 0,102, 0, 46, 0, 10, 0, 10, 0, + 84, 0, 72, 0, 69, 0, 32, 0, 70, 0, 79, 0, 78, 0, 84, 0, 32, 0, 83, 0, 79, 0, 70, 0, 84, 0, 87, 0, 65, 0, 82, 0, + 69, 0, 32, 0, 73, 0, 83, 0, 32, 0, 80, 0, 82, 0, 79, 0, 86, 0, 73, 0, 68, 0, 69, 0, 68, 0, 32, 0, 34, 0, 65, 0, + 83, 0, 32, 0, 73, 0, 83, 0, 34, 0, 44, 0, 32, 0, 87, 0, 73, 0, 84, 0, 72, 0, 79, 0, 85, 0, 84, 0, 32, 0, 87, 0, + 65, 0, 82, 0, 82, 0, 65, 0, 78, 0, 84, 0, 89, 0, 32, 0, 79, 0, 70, 0, 32, 0, 65, 0, 78, 0, 89, 0, 32, 0, 75, 0, + 73, 0, 78, 0, 68, 0, 44, 0, 32, 0, 69, 0, 88, 0, 80, 0, 82, 0, 69, 0, 83, 0, 83, 0, 10, 0, 79, 0, 82, 0, 32, 0, + 73, 0, 77, 0, 80, 0, 76, 0, 73, 0, 69, 0, 68, 0, 44, 0, 32, 0, 73, 0, 78, 0, 67, 0, 76, 0, 85, 0, 68, 0, 73, 0, + 78, 0, 71, 0, 32, 0, 66, 0, 85, 0, 84, 0, 32, 0, 78, 0, 79, 0, 84, 0, 32, 0, 76, 0, 73, 0, 77, 0, 73, 0, 84, 0, + 69, 0, 68, 0, 32, 0, 84, 0, 79, 0, 32, 0, 65, 0, 78, 0, 89, 0, 32, 0, 87, 0, 65, 0, 82, 0, 82, 0, 65, 0, 78, 0, + 84, 0, 73, 0, 69, 0, 83, 0, 32, 0, 79, 0, 70, 0, 32, 0, 77, 0, 69, 0, 82, 0, 67, 0, 72, 0, 65, 0, 78, 0, 84, 0, + 65, 0, 66, 0, 73, 0, 76, 0, 73, 0, 84, 0, 89, 0, 44, 0, 10, 0, 70, 0, 73, 0, 84, 0, 78, 0, 69, 0, 83, 0, 83, 0, + 32, 0, 70, 0, 79, 0, 82, 0, 32, 0, 65, 0, 32, 0, 80, 0, 65, 0, 82, 0, 84, 0, 73, 0, 67, 0, 85, 0, 76, 0, 65, 0, + 82, 0, 32, 0, 80, 0, 85, 0, 82, 0, 80, 0, 79, 0, 83, 0, 69, 0, 32, 0, 65, 0, 78, 0, 68, 0, 32, 0, 78, 0, 79, 0, + 78, 0, 73, 0, 78, 0, 70, 0, 82, 0, 73, 0, 78, 0, 71, 0, 69, 0, 77, 0, 69, 0, 78, 0, 84, 0, 32, 0, 79, 0, 70, 0, + 32, 0, 67, 0, 79, 0, 80, 0, 89, 0, 82, 0, 73, 0, 71, 0, 72, 0, 84, 0, 44, 0, 32, 0, 80, 0, 65, 0, 84, 0, 69, 0, + 78, 0, 84, 0, 44, 0, 10, 0, 84, 0, 82, 0, 65, 0, 68, 0, 69, 0, 77, 0, 65, 0, 82, 0, 75, 0, 44, 0, 32, 0, 79, 0, + 82, 0, 32, 0, 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, 82, 0, 73, 0, 71, 0, 72, 0, 84, 0, 46, 0, 32, 0, 73, 0, + 78, 0, 32, 0, 78, 0, 79, 0, 32, 0, 69, 0, 86, 0, 69, 0, 78, 0, 84, 0, 32, 0, 83, 0, 72, 0, 65, 0, 76, 0, 76, 0, + 32, 0, 66, 0, 73, 0, 84, 0, 83, 0, 84, 0, 82, 0, 69, 0, 65, 0, 77, 0, 32, 0, 79, 0, 82, 0, 32, 0, 84, 0, 72, 0, + 69, 0, 32, 0, 71, 0, 78, 0, 79, 0, 77, 0, 69, 0, 10, 0, 70, 0, 79, 0, 85, 0, 78, 0, 68, 0, 65, 0, 84, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 66, 0, 69, 0, 32, 0, 76, 0, 73, 0, 65, 0, 66, 0, 76, 0, 69, 0, 32, 0, 70, 0, 79, 0, 82, 0, + 32, 0, 65, 0, 78, 0, 89, 0, 32, 0, 67, 0, 76, 0, 65, 0, 73, 0, 77, 0, 44, 0, 32, 0, 68, 0, 65, 0, 77, 0, 65, 0, + 71, 0, 69, 0, 83, 0, 32, 0, 79, 0, 82, 0, 32, 0, 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, 76, 0, 73, 0, 65, 0, + 66, 0, 73, 0, 76, 0, 73, 0, 84, 0, 89, 0, 44, 0, 32, 0, 73, 0, 78, 0, 67, 0, 76, 0, 85, 0, 68, 0, 73, 0, 78, 0, + 71, 0, 10, 0, 65, 0, 78, 0, 89, 0, 32, 0, 71, 0, 69, 0, 78, 0, 69, 0, 82, 0, 65, 0, 76, 0, 44, 0, 32, 0, 83, 0, + 80, 0, 69, 0, 67, 0, 73, 0, 65, 0, 76, 0, 44, 0, 32, 0, 73, 0, 78, 0, 68, 0, 73, 0, 82, 0, 69, 0, 67, 0, 84, 0, + 44, 0, 32, 0, 73, 0, 78, 0, 67, 0, 73, 0, 68, 0, 69, 0, 78, 0, 84, 0, 65, 0, 76, 0, 44, 0, 32, 0, 79, 0, 82, 0, + 32, 0, 67, 0, 79, 0, 78, 0, 83, 0, 69, 0, 81, 0, 85, 0, 69, 0, 78, 0, 84, 0, 73, 0, 65, 0, 76, 0, 32, 0, 68, 0, + 65, 0, 77, 0, 65, 0, 71, 0, 69, 0, 83, 0, 44, 0, 10, 0, 87, 0, 72, 0, 69, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, + 73, 0, 78, 0, 32, 0, 65, 0, 78, 0, 32, 0, 65, 0, 67, 0, 84, 0, 73, 0, 79, 0, 78, 0, 32, 0, 79, 0, 70, 0, 32, 0, + 67, 0, 79, 0, 78, 0, 84, 0, 82, 0, 65, 0, 67, 0, 84, 0, 44, 0, 32, 0, 84, 0, 79, 0, 82, 0, 84, 0, 32, 0, 79, 0, + 82, 0, 32, 0, 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 87, 0, 73, 0, 83, 0, 69, 0, 44, 0, 32, 0, 65, 0, 82, 0, 73, 0, + 83, 0, 73, 0, 78, 0, 71, 0, 32, 0, 70, 0, 82, 0, 79, 0, 77, 0, 44, 0, 32, 0, 79, 0, 85, 0, 84, 0, 32, 0, 79, 0, + 70, 0, 10, 0, 84, 0, 72, 0, 69, 0, 32, 0, 85, 0, 83, 0, 69, 0, 32, 0, 79, 0, 82, 0, 32, 0, 73, 0, 78, 0, 65, 0, + 66, 0, 73, 0, 76, 0, 73, 0, 84, 0, 89, 0, 32, 0, 84, 0, 79, 0, 32, 0, 85, 0, 83, 0, 69, 0, 32, 0, 84, 0, 72, 0, + 69, 0, 32, 0, 70, 0, 79, 0, 78, 0, 84, 0, 32, 0, 83, 0, 79, 0, 70, 0, 84, 0, 87, 0, 65, 0, 82, 0, 69, 0, 32, 0, + 79, 0, 82, 0, 32, 0, 70, 0, 82, 0, 79, 0, 77, 0, 32, 0, 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, 68, 0, 69, 0, + 65, 0, 76, 0, 73, 0, 78, 0, 71, 0, 83, 0, 32, 0, 73, 0, 78, 0, 32, 0, 84, 0, 72, 0, 69, 0, 10, 0, 70, 0, 79, 0, + 78, 0, 84, 0, 32, 0, 83, 0, 79, 0, 70, 0, 84, 0, 87, 0, 65, 0, 82, 0, 69, 0, 46, 0, 10, 0, 10, 0, 69, 0,120, 0, + 99, 0,101, 0,112, 0,116, 0, 32, 0, 97, 0,115, 0, 32, 0, 99, 0,111, 0,110, 0,116, 0, 97, 0,105, 0,110, 0,101, 0, +100, 0, 32, 0,105, 0,110, 0, 32, 0,116, 0,104, 0,105, 0,115, 0, 32, 0,110, 0,111, 0,116, 0,105, 0, 99, 0,101, 0, + 44, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,110, 0, 97, 0,109, 0,101, 0,115, 0, 32, 0,111, 0,102, 0, 32, 0, 71, 0, +110, 0,111, 0,109, 0,101, 0, 44, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 71, 0,110, 0,111, 0,109, 0,101, 0, 10, 0, + 70, 0,111, 0,117, 0,110, 0,100, 0, 97, 0,116, 0,105, 0,111, 0,110, 0, 44, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0, + 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 32, 0, 73, 0,110, 0, 99, 0, 46, 0, 44, 0, 32, 0, +115, 0,104, 0, 97, 0,108, 0,108, 0, 32, 0,110, 0,111, 0,116, 0, 32, 0, 98, 0,101, 0, 32, 0,117, 0,115, 0,101, 0, +100, 0, 32, 0,105, 0,110, 0, 32, 0, 97, 0,100, 0,118, 0,101, 0,114, 0,116, 0,105, 0,115, 0,105, 0,110, 0,103, 0, + 32, 0,111, 0,114, 0, 10, 0,111, 0,116, 0,104, 0,101, 0,114, 0,119, 0,105, 0,115, 0,101, 0, 32, 0,116, 0,111, 0, + 32, 0,112, 0,114, 0,111, 0,109, 0,111, 0,116, 0,101, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,115, 0, 97, 0,108, 0, +101, 0, 44, 0, 32, 0,117, 0,115, 0,101, 0, 32, 0,111, 0,114, 0, 32, 0,111, 0,116, 0,104, 0,101, 0,114, 0, 32, 0, +100, 0,101, 0, 97, 0,108, 0,105, 0,110, 0,103, 0,115, 0, 32, 0,105, 0,110, 0, 32, 0,116, 0,104, 0,105, 0,115, 0, + 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 10, 0,119, 0, +105, 0,116, 0,104, 0,111, 0,117, 0,116, 0, 32, 0,112, 0,114, 0,105, 0,111, 0,114, 0, 32, 0,119, 0,114, 0,105, 0, +116, 0,116, 0,101, 0,110, 0, 32, 0, 97, 0,117, 0,116, 0,104, 0,111, 0,114, 0,105, 0,122, 0, 97, 0,116, 0,105, 0, +111, 0,110, 0, 32, 0,102, 0,114, 0,111, 0,109, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 71, 0,110, 0,111, 0,109, 0, +101, 0, 32, 0, 70, 0,111, 0,117, 0,110, 0,100, 0, 97, 0,116, 0,105, 0,111, 0,110, 0, 32, 0,111, 0,114, 0, 32, 0, + 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 10, 0, 73, 0,110, 0, 99, 0, 46, 0, 44, 0, 32, 0, +114, 0,101, 0,115, 0,112, 0,101, 0, 99, 0,116, 0,105, 0,118, 0,101, 0,108, 0,121, 0, 46, 0, 32, 0, 70, 0,111, 0, +114, 0, 32, 0,102, 0,117, 0,114, 0,116, 0,104, 0,101, 0,114, 0, 32, 0,105, 0,110, 0,102, 0,111, 0,114, 0,109, 0, + 97, 0,116, 0,105, 0,111, 0,110, 0, 44, 0, 32, 0, 99, 0,111, 0,110, 0,116, 0, 97, 0, 99, 0,116, 0, 58, 0, 32, 0, +102, 0,111, 0,110, 0,116, 0,115, 0, 32, 0, 97, 0,116, 0, 32, 0,103, 0,110, 0,111, 0,109, 0,101, 0, 32, 0,100, 0, +111, 0,116, 0, 10, 0,111, 0,114, 0,103, 0, 46, 0, 32, 0, 10, 0, 10, 0, 65, 0,114, 0,101, 0,118, 0, 32, 0, 70, 0, +111, 0,110, 0,116, 0,115, 0, 32, 0, 67, 0,111, 0,112, 0,121, 0,114, 0,105, 0,103, 0,104, 0,116, 0, 10, 0, 45, 0, + 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, + 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 45, 0, 10, 0, 10, 0, 67, 0, +111, 0,112, 0,121, 0,114, 0,105, 0,103, 0,104, 0,116, 0, 32, 0, 40, 0, 99, 0, 41, 0, 32, 0, 50, 0, 48, 0, 48, 0, + 54, 0, 32, 0, 98, 0,121, 0, 32, 0, 84, 0, 97, 0,118, 0,109, 0,106, 0,111, 0,110, 0,103, 0, 32, 0, 66, 0, 97, 0, +104, 0, 46, 0, 32, 0, 65, 0,108, 0,108, 0, 32, 0, 82, 0,105, 0,103, 0,104, 0,116, 0,115, 0, 32, 0, 82, 0,101, 0, +115, 0,101, 0,114, 0,118, 0,101, 0,100, 0, 46, 0, 10, 0, 10, 0, 80, 0,101, 0,114, 0,109, 0,105, 0,115, 0,115, 0, +105, 0,111, 0,110, 0, 32, 0,105, 0,115, 0, 32, 0,104, 0,101, 0,114, 0,101, 0, 98, 0,121, 0, 32, 0,103, 0,114, 0, + 97, 0,110, 0,116, 0,101, 0,100, 0, 44, 0, 32, 0,102, 0,114, 0,101, 0,101, 0, 32, 0,111, 0,102, 0, 32, 0, 99, 0, +104, 0, 97, 0,114, 0,103, 0,101, 0, 44, 0, 32, 0,116, 0,111, 0, 32, 0, 97, 0,110, 0,121, 0, 32, 0,112, 0,101, 0, +114, 0,115, 0,111, 0,110, 0, 32, 0,111, 0, 98, 0,116, 0, 97, 0,105, 0,110, 0,105, 0,110, 0,103, 0, 10, 0, 97, 0, + 32, 0, 99, 0,111, 0,112, 0,121, 0, 32, 0,111, 0,102, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,102, 0,111, 0,110, 0, +116, 0,115, 0, 32, 0, 97, 0, 99, 0, 99, 0,111, 0,109, 0,112, 0, 97, 0,110, 0,121, 0,105, 0,110, 0,103, 0, 32, 0, +116, 0,104, 0,105, 0,115, 0, 32, 0,108, 0,105, 0, 99, 0,101, 0,110, 0,115, 0,101, 0, 32, 0, 40, 0, 34, 0, 70, 0, +111, 0,110, 0,116, 0,115, 0, 34, 0, 41, 0, 32, 0, 97, 0,110, 0,100, 0, 10, 0, 97, 0,115, 0,115, 0,111, 0, 99, 0, +105, 0, 97, 0,116, 0,101, 0,100, 0, 32, 0,100, 0,111, 0, 99, 0,117, 0,109, 0,101, 0,110, 0,116, 0, 97, 0,116, 0, +105, 0,111, 0,110, 0, 32, 0,102, 0,105, 0,108, 0,101, 0,115, 0, 32, 0, 40, 0,116, 0,104, 0,101, 0, 32, 0, 34, 0, + 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 34, 0, 41, 0, 44, 0, + 32, 0,116, 0,111, 0, 32, 0,114, 0,101, 0,112, 0,114, 0,111, 0,100, 0,117, 0, 99, 0,101, 0, 10, 0, 97, 0,110, 0, +100, 0, 32, 0,100, 0,105, 0,115, 0,116, 0,114, 0,105, 0, 98, 0,117, 0,116, 0,101, 0, 32, 0,116, 0,104, 0,101, 0, + 32, 0,109, 0,111, 0,100, 0,105, 0,102, 0,105, 0, 99, 0, 97, 0,116, 0,105, 0,111, 0,110, 0,115, 0, 32, 0,116, 0, +111, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 66, 0,105, 0,116, 0,115, 0,116, 0,114, 0,101, 0, 97, 0,109, 0, 32, 0, + 86, 0,101, 0,114, 0, 97, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0, +114, 0,101, 0, 44, 0, 10, 0,105, 0,110, 0, 99, 0,108, 0,117, 0,100, 0,105, 0,110, 0,103, 0, 32, 0,119, 0,105, 0, +116, 0,104, 0,111, 0,117, 0,116, 0, 32, 0,108, 0,105, 0,109, 0,105, 0,116, 0, 97, 0,116, 0,105, 0,111, 0,110, 0, + 32, 0,116, 0,104, 0,101, 0, 32, 0,114, 0,105, 0,103, 0,104, 0,116, 0,115, 0, 32, 0,116, 0,111, 0, 32, 0,117, 0, +115, 0,101, 0, 44, 0, 32, 0, 99, 0,111, 0,112, 0,121, 0, 44, 0, 32, 0,109, 0,101, 0,114, 0,103, 0,101, 0, 44, 0, + 32, 0,112, 0,117, 0, 98, 0,108, 0,105, 0,115, 0,104, 0, 44, 0, 10, 0,100, 0,105, 0,115, 0,116, 0,114, 0,105, 0, + 98, 0,117, 0,116, 0,101, 0, 44, 0, 32, 0, 97, 0,110, 0,100, 0, 47, 0,111, 0,114, 0, 32, 0,115, 0,101, 0,108, 0, +108, 0, 32, 0, 99, 0,111, 0,112, 0,105, 0,101, 0,115, 0, 32, 0,111, 0,102, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, + 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 44, 0, 32, 0, 97, 0, +110, 0,100, 0, 32, 0,116, 0,111, 0, 32, 0,112, 0,101, 0,114, 0,109, 0,105, 0,116, 0, 10, 0,112, 0,101, 0,114, 0, +115, 0,111, 0,110, 0,115, 0, 32, 0,116, 0,111, 0, 32, 0,119, 0,104, 0,111, 0,109, 0, 32, 0,116, 0,104, 0,101, 0, + 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,105, 0, +115, 0, 32, 0,102, 0,117, 0,114, 0,110, 0,105, 0,115, 0,104, 0,101, 0,100, 0, 32, 0,116, 0,111, 0, 32, 0,100, 0, +111, 0, 32, 0,115, 0,111, 0, 44, 0, 32, 0,115, 0,117, 0, 98, 0,106, 0,101, 0, 99, 0,116, 0, 32, 0,116, 0,111, 0, + 10, 0,116, 0,104, 0,101, 0, 32, 0,102, 0,111, 0,108, 0,108, 0,111, 0,119, 0,105, 0,110, 0,103, 0, 32, 0, 99, 0, +111, 0,110, 0,100, 0,105, 0,116, 0,105, 0,111, 0,110, 0,115, 0, 58, 0, 10, 0, 10, 0, 84, 0,104, 0,101, 0, 32, 0, + 97, 0, 98, 0,111, 0,118, 0,101, 0, 32, 0, 99, 0,111, 0,112, 0,121, 0,114, 0,105, 0,103, 0,104, 0,116, 0, 32, 0, + 97, 0,110, 0,100, 0, 32, 0,116, 0,114, 0, 97, 0,100, 0,101, 0,109, 0, 97, 0,114, 0,107, 0, 32, 0,110, 0,111, 0, +116, 0,105, 0, 99, 0,101, 0,115, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,116, 0,104, 0,105, 0,115, 0, 32, 0,112, 0, +101, 0,114, 0,109, 0,105, 0,115, 0,115, 0,105, 0,111, 0,110, 0, 32, 0,110, 0,111, 0,116, 0,105, 0, 99, 0,101, 0, + 10, 0,115, 0,104, 0, 97, 0,108, 0,108, 0, 32, 0, 98, 0,101, 0, 32, 0,105, 0,110, 0, 99, 0,108, 0,117, 0,100, 0, +101, 0,100, 0, 32, 0,105, 0,110, 0, 32, 0, 97, 0,108, 0,108, 0, 32, 0, 99, 0,111, 0,112, 0,105, 0,101, 0,115, 0, + 32, 0,111, 0,102, 0, 32, 0,111, 0,110, 0,101, 0, 32, 0,111, 0,114, 0, 32, 0,109, 0,111, 0,114, 0,101, 0, 32, 0, +111, 0,102, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0, +119, 0, 97, 0,114, 0,101, 0, 10, 0,116, 0,121, 0,112, 0,101, 0,102, 0, 97, 0, 99, 0,101, 0,115, 0, 46, 0, 10, 0, + 10, 0, 84, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0, +114, 0,101, 0, 32, 0,109, 0, 97, 0,121, 0, 32, 0, 98, 0,101, 0, 32, 0,109, 0,111, 0,100, 0,105, 0,102, 0,105, 0, +101, 0,100, 0, 44, 0, 32, 0, 97, 0,108, 0,116, 0,101, 0,114, 0,101, 0,100, 0, 44, 0, 32, 0,111, 0,114, 0, 32, 0, + 97, 0,100, 0,100, 0,101, 0,100, 0, 32, 0,116, 0,111, 0, 44, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,105, 0,110, 0, + 10, 0,112, 0, 97, 0,114, 0,116, 0,105, 0, 99, 0,117, 0,108, 0, 97, 0,114, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, +100, 0,101, 0,115, 0,105, 0,103, 0,110, 0,115, 0, 32, 0,111, 0,102, 0, 32, 0,103, 0,108, 0,121, 0,112, 0,104, 0, +115, 0, 32, 0,111, 0,114, 0, 32, 0, 99, 0,104, 0, 97, 0,114, 0, 97, 0, 99, 0,116, 0,101, 0,114, 0,115, 0, 32, 0, +105, 0,110, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 32, 0,109, 0, 97, 0,121, 0, + 32, 0, 98, 0,101, 0, 10, 0,109, 0,111, 0,100, 0,105, 0,102, 0,105, 0,101, 0,100, 0, 32, 0, 97, 0,110, 0,100, 0, + 32, 0, 97, 0,100, 0,100, 0,105, 0,116, 0,105, 0,111, 0,110, 0, 97, 0,108, 0, 32, 0,103, 0,108, 0,121, 0,112, 0, +104, 0,115, 0, 32, 0,111, 0,114, 0, 32, 0, 99, 0,104, 0, 97, 0,114, 0, 97, 0, 99, 0,116, 0,101, 0,114, 0,115, 0, + 32, 0,109, 0, 97, 0,121, 0, 32, 0, 98, 0,101, 0, 32, 0, 97, 0,100, 0,100, 0,101, 0,100, 0, 32, 0,116, 0,111, 0, + 32, 0,116, 0,104, 0,101, 0, 10, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 44, 0, 32, 0,111, 0,110, 0,108, 0,121, 0, + 32, 0,105, 0,102, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,102, 0,111, 0,110, 0,116, 0,115, 0, 32, 0, 97, 0,114, 0, +101, 0, 32, 0,114, 0,101, 0,110, 0, 97, 0,109, 0,101, 0,100, 0, 32, 0,116, 0,111, 0, 32, 0,110, 0, 97, 0,109, 0, +101, 0,115, 0, 32, 0,110, 0,111, 0,116, 0, 32, 0, 99, 0,111, 0,110, 0,116, 0, 97, 0,105, 0,110, 0,105, 0,110, 0, +103, 0, 32, 0,101, 0,105, 0,116, 0,104, 0,101, 0,114, 0, 10, 0,116, 0,104, 0,101, 0, 32, 0,119, 0,111, 0,114, 0, +100, 0,115, 0, 32, 0, 34, 0, 84, 0, 97, 0,118, 0,109, 0,106, 0,111, 0,110, 0,103, 0, 32, 0, 66, 0, 97, 0,104, 0, + 34, 0, 32, 0,111, 0,114, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,119, 0,111, 0,114, 0,100, 0, 32, 0, 34, 0, 65, 0, +114, 0,101, 0,118, 0, 34, 0, 46, 0, 10, 0, 10, 0, 84, 0,104, 0,105, 0,115, 0, 32, 0, 76, 0,105, 0, 99, 0,101, 0, +110, 0,115, 0,101, 0, 32, 0, 98, 0,101, 0, 99, 0,111, 0,109, 0,101, 0,115, 0, 32, 0,110, 0,117, 0,108, 0,108, 0, + 32, 0, 97, 0,110, 0,100, 0, 32, 0,118, 0,111, 0,105, 0,100, 0, 32, 0,116, 0,111, 0, 32, 0,116, 0,104, 0,101, 0, + 32, 0,101, 0,120, 0,116, 0,101, 0,110, 0,116, 0, 32, 0, 97, 0,112, 0,112, 0,108, 0,105, 0, 99, 0, 97, 0, 98, 0, +108, 0,101, 0, 32, 0,116, 0,111, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0,115, 0, 10, 0,111, 0,114, 0, 32, 0, 70, 0, +111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,116, 0,104, 0, 97, 0, +116, 0, 32, 0,104, 0, 97, 0,115, 0, 32, 0, 98, 0,101, 0,101, 0,110, 0, 32, 0,109, 0,111, 0,100, 0,105, 0,102, 0, +105, 0,101, 0,100, 0, 32, 0, 97, 0,110, 0,100, 0, 32, 0,105, 0,115, 0, 32, 0,100, 0,105, 0,115, 0,116, 0,114, 0, +105, 0, 98, 0,117, 0,116, 0,101, 0,100, 0, 32, 0,117, 0,110, 0,100, 0,101, 0,114, 0, 32, 0,116, 0,104, 0,101, 0, + 32, 0, 10, 0, 34, 0, 84, 0, 97, 0,118, 0,109, 0,106, 0,111, 0,110, 0,103, 0, 32, 0, 66, 0, 97, 0,104, 0, 32, 0, + 65, 0,114, 0,101, 0,118, 0, 34, 0, 32, 0,110, 0, 97, 0,109, 0,101, 0,115, 0, 46, 0, 10, 0, 10, 0, 84, 0,104, 0, +101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0, +109, 0, 97, 0,121, 0, 32, 0, 98, 0,101, 0, 32, 0,115, 0,111, 0,108, 0,100, 0, 32, 0, 97, 0,115, 0, 32, 0,112, 0, + 97, 0,114, 0,116, 0, 32, 0,111, 0,102, 0, 32, 0, 97, 0, 32, 0,108, 0, 97, 0,114, 0,103, 0,101, 0,114, 0, 32, 0, +115, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,112, 0, 97, 0, 99, 0,107, 0, 97, 0,103, 0,101, 0, + 32, 0, 98, 0,117, 0,116, 0, 10, 0,110, 0,111, 0, 32, 0, 99, 0,111, 0,112, 0,121, 0, 32, 0,111, 0,102, 0, 32, 0, +111, 0,110, 0,101, 0, 32, 0,111, 0,114, 0, 32, 0,109, 0,111, 0,114, 0,101, 0, 32, 0,111, 0,102, 0, 32, 0,116, 0, +104, 0,101, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0,111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, + 32, 0,116, 0,121, 0,112, 0,101, 0,102, 0, 97, 0, 99, 0,101, 0,115, 0, 32, 0,109, 0, 97, 0,121, 0, 32, 0, 98, 0, +101, 0, 32, 0,115, 0,111, 0,108, 0,100, 0, 32, 0, 98, 0,121, 0, 10, 0,105, 0,116, 0,115, 0,101, 0,108, 0,102, 0, + 46, 0, 10, 0, 10, 0, 84, 0, 72, 0, 69, 0, 32, 0, 70, 0, 79, 0, 78, 0, 84, 0, 32, 0, 83, 0, 79, 0, 70, 0, 84, 0, + 87, 0, 65, 0, 82, 0, 69, 0, 32, 0, 73, 0, 83, 0, 32, 0, 80, 0, 82, 0, 79, 0, 86, 0, 73, 0, 68, 0, 69, 0, 68, 0, + 32, 0, 34, 0, 65, 0, 83, 0, 32, 0, 73, 0, 83, 0, 34, 0, 44, 0, 32, 0, 87, 0, 73, 0, 84, 0, 72, 0, 79, 0, 85, 0, + 84, 0, 32, 0, 87, 0, 65, 0, 82, 0, 82, 0, 65, 0, 78, 0, 84, 0, 89, 0, 32, 0, 79, 0, 70, 0, 32, 0, 65, 0, 78, 0, + 89, 0, 32, 0, 75, 0, 73, 0, 78, 0, 68, 0, 44, 0, 10, 0, 69, 0, 88, 0, 80, 0, 82, 0, 69, 0, 83, 0, 83, 0, 32, 0, + 79, 0, 82, 0, 32, 0, 73, 0, 77, 0, 80, 0, 76, 0, 73, 0, 69, 0, 68, 0, 44, 0, 32, 0, 73, 0, 78, 0, 67, 0, 76, 0, + 85, 0, 68, 0, 73, 0, 78, 0, 71, 0, 32, 0, 66, 0, 85, 0, 84, 0, 32, 0, 78, 0, 79, 0, 84, 0, 32, 0, 76, 0, 73, 0, + 77, 0, 73, 0, 84, 0, 69, 0, 68, 0, 32, 0, 84, 0, 79, 0, 32, 0, 65, 0, 78, 0, 89, 0, 32, 0, 87, 0, 65, 0, 82, 0, + 82, 0, 65, 0, 78, 0, 84, 0, 73, 0, 69, 0, 83, 0, 32, 0, 79, 0, 70, 0, 10, 0, 77, 0, 69, 0, 82, 0, 67, 0, 72, 0, + 65, 0, 78, 0, 84, 0, 65, 0, 66, 0, 73, 0, 76, 0, 73, 0, 84, 0, 89, 0, 44, 0, 32, 0, 70, 0, 73, 0, 84, 0, 78, 0, + 69, 0, 83, 0, 83, 0, 32, 0, 70, 0, 79, 0, 82, 0, 32, 0, 65, 0, 32, 0, 80, 0, 65, 0, 82, 0, 84, 0, 73, 0, 67, 0, + 85, 0, 76, 0, 65, 0, 82, 0, 32, 0, 80, 0, 85, 0, 82, 0, 80, 0, 79, 0, 83, 0, 69, 0, 32, 0, 65, 0, 78, 0, 68, 0, + 32, 0, 78, 0, 79, 0, 78, 0, 73, 0, 78, 0, 70, 0, 82, 0, 73, 0, 78, 0, 71, 0, 69, 0, 77, 0, 69, 0, 78, 0, 84, 0, + 10, 0, 79, 0, 70, 0, 32, 0, 67, 0, 79, 0, 80, 0, 89, 0, 82, 0, 73, 0, 71, 0, 72, 0, 84, 0, 44, 0, 32, 0, 80, 0, + 65, 0, 84, 0, 69, 0, 78, 0, 84, 0, 44, 0, 32, 0, 84, 0, 82, 0, 65, 0, 68, 0, 69, 0, 77, 0, 65, 0, 82, 0, 75, 0, + 44, 0, 32, 0, 79, 0, 82, 0, 32, 0, 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, 82, 0, 73, 0, 71, 0, 72, 0, 84, 0, + 46, 0, 32, 0, 73, 0, 78, 0, 32, 0, 78, 0, 79, 0, 32, 0, 69, 0, 86, 0, 69, 0, 78, 0, 84, 0, 32, 0, 83, 0, 72, 0, + 65, 0, 76, 0, 76, 0, 10, 0, 84, 0, 65, 0, 86, 0, 77, 0, 74, 0, 79, 0, 78, 0, 71, 0, 32, 0, 66, 0, 65, 0, 72, 0, + 32, 0, 66, 0, 69, 0, 32, 0, 76, 0, 73, 0, 65, 0, 66, 0, 76, 0, 69, 0, 32, 0, 70, 0, 79, 0, 82, 0, 32, 0, 65, 0, + 78, 0, 89, 0, 32, 0, 67, 0, 76, 0, 65, 0, 73, 0, 77, 0, 44, 0, 32, 0, 68, 0, 65, 0, 77, 0, 65, 0, 71, 0, 69, 0, + 83, 0, 32, 0, 79, 0, 82, 0, 32, 0, 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, 76, 0, 73, 0, 65, 0, 66, 0, 73, 0, + 76, 0, 73, 0, 84, 0, 89, 0, 44, 0, 10, 0, 73, 0, 78, 0, 67, 0, 76, 0, 85, 0, 68, 0, 73, 0, 78, 0, 71, 0, 32, 0, + 65, 0, 78, 0, 89, 0, 32, 0, 71, 0, 69, 0, 78, 0, 69, 0, 82, 0, 65, 0, 76, 0, 44, 0, 32, 0, 83, 0, 80, 0, 69, 0, + 67, 0, 73, 0, 65, 0, 76, 0, 44, 0, 32, 0, 73, 0, 78, 0, 68, 0, 73, 0, 82, 0, 69, 0, 67, 0, 84, 0, 44, 0, 32, 0, + 73, 0, 78, 0, 67, 0, 73, 0, 68, 0, 69, 0, 78, 0, 84, 0, 65, 0, 76, 0, 44, 0, 32, 0, 79, 0, 82, 0, 32, 0, 67, 0, + 79, 0, 78, 0, 83, 0, 69, 0, 81, 0, 85, 0, 69, 0, 78, 0, 84, 0, 73, 0, 65, 0, 76, 0, 10, 0, 68, 0, 65, 0, 77, 0, + 65, 0, 71, 0, 69, 0, 83, 0, 44, 0, 32, 0, 87, 0, 72, 0, 69, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, 73, 0, 78, 0, + 32, 0, 65, 0, 78, 0, 32, 0, 65, 0, 67, 0, 84, 0, 73, 0, 79, 0, 78, 0, 32, 0, 79, 0, 70, 0, 32, 0, 67, 0, 79, 0, + 78, 0, 84, 0, 82, 0, 65, 0, 67, 0, 84, 0, 44, 0, 32, 0, 84, 0, 79, 0, 82, 0, 84, 0, 32, 0, 79, 0, 82, 0, 32, 0, + 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 87, 0, 73, 0, 83, 0, 69, 0, 44, 0, 32, 0, 65, 0, 82, 0, 73, 0, 83, 0, 73, 0, + 78, 0, 71, 0, 10, 0, 70, 0, 82, 0, 79, 0, 77, 0, 44, 0, 32, 0, 79, 0, 85, 0, 84, 0, 32, 0, 79, 0, 70, 0, 32, 0, + 84, 0, 72, 0, 69, 0, 32, 0, 85, 0, 83, 0, 69, 0, 32, 0, 79, 0, 82, 0, 32, 0, 73, 0, 78, 0, 65, 0, 66, 0, 73, 0, + 76, 0, 73, 0, 84, 0, 89, 0, 32, 0, 84, 0, 79, 0, 32, 0, 85, 0, 83, 0, 69, 0, 32, 0, 84, 0, 72, 0, 69, 0, 32, 0, + 70, 0, 79, 0, 78, 0, 84, 0, 32, 0, 83, 0, 79, 0, 70, 0, 84, 0, 87, 0, 65, 0, 82, 0, 69, 0, 32, 0, 79, 0, 82, 0, + 32, 0, 70, 0, 82, 0, 79, 0, 77, 0, 10, 0, 79, 0, 84, 0, 72, 0, 69, 0, 82, 0, 32, 0, 68, 0, 69, 0, 65, 0, 76, 0, + 73, 0, 78, 0, 71, 0, 83, 0, 32, 0, 73, 0, 78, 0, 32, 0, 84, 0, 72, 0, 69, 0, 32, 0, 70, 0, 79, 0, 78, 0, 84, 0, + 32, 0, 83, 0, 79, 0, 70, 0, 84, 0, 87, 0, 65, 0, 82, 0, 69, 0, 46, 0, 10, 0, 10, 0, 69, 0,120, 0, 99, 0,101, 0, +112, 0,116, 0, 32, 0, 97, 0,115, 0, 32, 0, 99, 0,111, 0,110, 0,116, 0, 97, 0,105, 0,110, 0,101, 0,100, 0, 32, 0, +105, 0,110, 0, 32, 0,116, 0,104, 0,105, 0,115, 0, 32, 0,110, 0,111, 0,116, 0,105, 0, 99, 0,101, 0, 44, 0, 32, 0, +116, 0,104, 0,101, 0, 32, 0,110, 0, 97, 0,109, 0,101, 0, 32, 0,111, 0,102, 0, 32, 0, 84, 0, 97, 0,118, 0,109, 0, +106, 0,111, 0,110, 0,103, 0, 32, 0, 66, 0, 97, 0,104, 0, 32, 0,115, 0,104, 0, 97, 0,108, 0,108, 0, 32, 0,110, 0, +111, 0,116, 0, 10, 0, 98, 0,101, 0, 32, 0,117, 0,115, 0,101, 0,100, 0, 32, 0,105, 0,110, 0, 32, 0, 97, 0,100, 0, +118, 0,101, 0,114, 0,116, 0,105, 0,115, 0,105, 0,110, 0,103, 0, 32, 0,111, 0,114, 0, 32, 0,111, 0,116, 0,104, 0, +101, 0,114, 0,119, 0,105, 0,115, 0,101, 0, 32, 0,116, 0,111, 0, 32, 0,112, 0,114, 0,111, 0,109, 0,111, 0,116, 0, +101, 0, 32, 0,116, 0,104, 0,101, 0, 32, 0,115, 0, 97, 0,108, 0,101, 0, 44, 0, 32, 0,117, 0,115, 0,101, 0, 32, 0, +111, 0,114, 0, 32, 0,111, 0,116, 0,104, 0,101, 0,114, 0, 10, 0,100, 0,101, 0, 97, 0,108, 0,105, 0,110, 0,103, 0, +115, 0, 32, 0,105, 0,110, 0, 32, 0,116, 0,104, 0,105, 0,115, 0, 32, 0, 70, 0,111, 0,110, 0,116, 0, 32, 0, 83, 0, +111, 0,102, 0,116, 0,119, 0, 97, 0,114, 0,101, 0, 32, 0,119, 0,105, 0,116, 0,104, 0,111, 0,117, 0,116, 0, 32, 0, +112, 0,114, 0,105, 0,111, 0,114, 0, 32, 0,119, 0,114, 0,105, 0,116, 0,116, 0,101, 0,110, 0, 32, 0, 97, 0,117, 0, +116, 0,104, 0,111, 0,114, 0,105, 0,122, 0, 97, 0,116, 0,105, 0,111, 0,110, 0, 10, 0,102, 0,114, 0,111, 0,109, 0, + 32, 0, 84, 0, 97, 0,118, 0,109, 0,106, 0,111, 0,110, 0,103, 0, 32, 0, 66, 0, 97, 0,104, 0, 46, 0, 32, 0, 70, 0, +111, 0,114, 0, 32, 0,102, 0,117, 0,114, 0,116, 0,104, 0,101, 0,114, 0, 32, 0,105, 0,110, 0,102, 0,111, 0,114, 0, +109, 0, 97, 0,116, 0,105, 0,111, 0,110, 0, 44, 0, 32, 0, 99, 0,111, 0,110, 0,116, 0, 97, 0, 99, 0,116, 0, 58, 0, + 32, 0,116, 0, 97, 0,118, 0,109, 0,106, 0,111, 0,110, 0,103, 0, 32, 0, 64, 0, 32, 0,102, 0,114, 0,101, 0,101, 0, + 10, 0, 46, 0, 32, 0,102, 0,114, 0, 46, 0, 0, 70,111,110,116,115, 32, 97,114,101, 32, 40, 99, 41, 32, 66,105,116,115,116, +114,101, 97,109, 32, 40,115,101,101, 32, 98,101,108,111,119, 41, 46, 32, 68,101,106, 97, 86,117, 32, 99,104, 97,110,103,101,115, + 32, 97,114,101, 32,105,110, 32,112,117, 98,108,105, 99, 32,100,111,109, 97,105,110, 46, 32, 71,108,121,112,104,115, 32,105,109, +112,111,114,116,101,100, 32,102,114,111,109, 32, 65,114,101,118, 32,102,111,110,116,115, 32, 97,114,101, 32, 40, 99, 41, 32, 84, + 97,118,109,106,117,110,103, 32, 66, 97,104, 32, 40,115,101,101, 32, 98,101,108,111,119, 41, 10, 10, 66,105,116,115,116,114,101, + 97,109, 32, 86,101,114, 97, 32, 70,111,110,116,115, 32, 67,111,112,121,114,105,103,104,116, 10, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 67,111,112,121,114,105,103,104, +116, 32, 40, 99, 41, 32, 50, 48, 48, 51, 32, 98,121, 32, 66,105,116,115,116,114,101, 97,109, 44, 32, 73,110, 99, 46, 32, 65,108, +108, 32, 82,105,103,104,116,115, 32, 82,101,115,101,114,118,101,100, 46, 32, 66,105,116,115,116,114,101, 97,109, 32, 86,101,114, + 97, 32,105,115, 10, 97, 32,116,114, 97,100,101,109, 97,114,107, 32,111,102, 32, 66,105,116,115,116,114,101, 97,109, 44, 32, 73, +110, 99, 46, 10, 10, 80,101,114,109,105,115,115,105,111,110, 32,105,115, 32,104,101,114,101, 98,121, 32,103,114, 97,110,116,101, +100, 44, 32,102,114,101,101, 32,111,102, 32, 99,104, 97,114,103,101, 44, 32,116,111, 32, 97,110,121, 32,112,101,114,115,111,110, + 32,111, 98,116, 97,105,110,105,110,103, 32, 97, 32, 99,111,112,121, 10,111,102, 32,116,104,101, 32,102,111,110,116,115, 32, 97, + 99, 99,111,109,112, 97,110,121,105,110,103, 32,116,104,105,115, 32,108,105, 99,101,110,115,101, 32, 40, 34, 70,111,110,116,115, + 34, 41, 32, 97,110,100, 32, 97,115,115,111, 99,105, 97,116,101,100, 10,100,111, 99,117,109,101,110,116, 97,116,105,111,110, 32, +102,105,108,101,115, 32, 40,116,104,101, 32, 34, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 34, 41, 44, 32,116,111, 32, +114,101,112,114,111,100,117, 99,101, 32, 97,110,100, 32,100,105,115,116,114,105, 98,117,116,101, 32,116,104,101, 10, 70,111,110, +116, 32, 83,111,102,116,119, 97,114,101, 44, 32,105,110, 99,108,117,100,105,110,103, 32,119,105,116,104,111,117,116, 32,108,105, +109,105,116, 97,116,105,111,110, 32,116,104,101, 32,114,105,103,104,116,115, 32,116,111, 32,117,115,101, 44, 32, 99,111,112,121, + 44, 32,109,101,114,103,101, 44, 10,112,117, 98,108,105,115,104, 44, 32,100,105,115,116,114,105, 98,117,116,101, 44, 32, 97,110, +100, 47,111,114, 32,115,101,108,108, 32, 99,111,112,105,101,115, 32,111,102, 32,116,104,101, 32, 70,111,110,116, 32, 83,111,102, +116,119, 97,114,101, 44, 32, 97,110,100, 32,116,111, 32,112,101,114,109,105,116, 10,112,101,114,115,111,110,115, 32,116,111, 32, +119,104,111,109, 32,116,104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 32,105,115, 32,102,117,114,110,105,115, +104,101,100, 32,116,111, 32,100,111, 32,115,111, 44, 32,115,117, 98,106,101, 99,116, 32,116,111, 32,116,104,101, 10,102,111,108, +108,111,119,105,110,103, 32, 99,111,110,100,105,116,105,111,110,115, 58, 10, 10, 84,104,101, 32, 97, 98,111,118,101, 32, 99,111, +112,121,114,105,103,104,116, 32, 97,110,100, 32,116,114, 97,100,101,109, 97,114,107, 32,110,111,116,105, 99,101,115, 32, 97,110, +100, 32,116,104,105,115, 32,112,101,114,109,105,115,115,105,111,110, 32,110,111,116,105, 99,101, 32,115,104, 97,108,108, 10, 98, +101, 32,105,110, 99,108,117,100,101,100, 32,105,110, 32, 97,108,108, 32, 99,111,112,105,101,115, 32,111,102, 32,111,110,101, 32, +111,114, 32,109,111,114,101, 32,111,102, 32,116,104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 32,116,121,112, +101,102, 97, 99,101,115, 46, 10, 10, 84,104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 32,109, 97,121, 32, 98, +101, 32,109,111,100,105,102,105,101,100, 44, 32, 97,108,116,101,114,101,100, 44, 32,111,114, 32, 97,100,100,101,100, 32,116,111, + 44, 32, 97,110,100, 32,105,110, 32,112, 97,114,116,105, 99,117,108, 97,114, 10,116,104,101, 32,100,101,115,105,103,110,115, 32, +111,102, 32,103,108,121,112,104,115, 32,111,114, 32, 99,104, 97,114, 97, 99,116,101,114,115, 32,105,110, 32,116,104,101, 32, 70, +111,110,116,115, 32,109, 97,121, 32, 98,101, 32,109,111,100,105,102,105,101,100, 32, 97,110,100, 10, 97,100,100,105,116,105,111, +110, 97,108, 32,103,108,121,112,104,115, 32,111,114, 32, 99,104, 97,114, 97, 99,116,101,114,115, 32,109, 97,121, 32, 98,101, 32, + 97,100,100,101,100, 32,116,111, 32,116,104,101, 32, 70,111,110,116,115, 44, 32,111,110,108,121, 32,105,102, 32,116,104,101, 32, +102,111,110,116,115, 10, 97,114,101, 32,114,101,110, 97,109,101,100, 32,116,111, 32,110, 97,109,101,115, 32,110,111,116, 32, 99, +111,110,116, 97,105,110,105,110,103, 32,101,105,116,104,101,114, 32,116,104,101, 32,119,111,114,100,115, 32, 34, 66,105,116,115, +116,114,101, 97,109, 34, 32,111,114, 32,116,104,101, 32,119,111,114,100, 10, 34, 86,101,114, 97, 34, 46, 10, 10, 84,104,105,115, + 32, 76,105, 99,101,110,115,101, 32, 98,101, 99,111,109,101,115, 32,110,117,108,108, 32, 97,110,100, 32,118,111,105,100, 32,116, +111, 32,116,104,101, 32,101,120,116,101,110,116, 32, 97,112,112,108,105, 99, 97, 98,108,101, 32,116,111, 32, 70,111,110,116,115, + 32,111,114, 32, 70,111,110,116, 10, 83,111,102,116,119, 97,114,101, 32,116,104, 97,116, 32,104, 97,115, 32, 98,101,101,110, 32, +109,111,100,105,102,105,101,100, 32, 97,110,100, 32,105,115, 32,100,105,115,116,114,105, 98,117,116,101,100, 32,117,110,100,101, +114, 32,116,104,101, 32, 34, 66,105,116,115,116,114,101, 97,109, 10, 86,101,114, 97, 34, 32,110, 97,109,101,115, 46, 10, 10, 84, +104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 32,109, 97,121, 32, 98,101, 32,115,111,108,100, 32, 97,115, 32, +112, 97,114,116, 32,111,102, 32, 97, 32,108, 97,114,103,101,114, 32,115,111,102,116,119, 97,114,101, 32,112, 97, 99,107, 97,103, +101, 32, 98,117,116, 32,110,111, 10, 99,111,112,121, 32,111,102, 32,111,110,101, 32,111,114, 32,109,111,114,101, 32,111,102, 32, +116,104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 32,116,121,112,101,102, 97, 99,101,115, 32,109, 97,121, 32, + 98,101, 32,115,111,108,100, 32, 98,121, 32,105,116,115,101,108,102, 46, 10, 10, 84, 72, 69, 32, 70, 79, 78, 84, 32, 83, 79, 70, + 84, 87, 65, 82, 69, 32, 73, 83, 32, 80, 82, 79, 86, 73, 68, 69, 68, 32, 34, 65, 83, 32, 73, 83, 34, 44, 32, 87, 73, 84, 72, 79, + 85, 84, 32, 87, 65, 82, 82, 65, 78, 84, 89, 32, 79, 70, 32, 65, 78, 89, 32, 75, 73, 78, 68, 44, 32, 69, 88, 80, 82, 69, 83, 83, + 10, 79, 82, 32, 73, 77, 80, 76, 73, 69, 68, 44, 32, 73, 78, 67, 76, 85, 68, 73, 78, 71, 32, 66, 85, 84, 32, 78, 79, 84, 32, 76, + 73, 77, 73, 84, 69, 68, 32, 84, 79, 32, 65, 78, 89, 32, 87, 65, 82, 82, 65, 78, 84, 73, 69, 83, 32, 79, 70, 32, 77, 69, 82, 67, + 72, 65, 78, 84, 65, 66, 73, 76, 73, 84, 89, 44, 10, 70, 73, 84, 78, 69, 83, 83, 32, 70, 79, 82, 32, 65, 32, 80, 65, 82, 84, 73, + 67, 85, 76, 65, 82, 32, 80, 85, 82, 80, 79, 83, 69, 32, 65, 78, 68, 32, 78, 79, 78, 73, 78, 70, 82, 73, 78, 71, 69, 77, 69, 78, + 84, 32, 79, 70, 32, 67, 79, 80, 89, 82, 73, 71, 72, 84, 44, 32, 80, 65, 84, 69, 78, 84, 44, 10, 84, 82, 65, 68, 69, 77, 65, 82, + 75, 44, 32, 79, 82, 32, 79, 84, 72, 69, 82, 32, 82, 73, 71, 72, 84, 46, 32, 73, 78, 32, 78, 79, 32, 69, 86, 69, 78, 84, 32, 83, + 72, 65, 76, 76, 32, 66, 73, 84, 83, 84, 82, 69, 65, 77, 32, 79, 82, 32, 84, 72, 69, 32, 71, 78, 79, 77, 69, 10, 70, 79, 85, 78, + 68, 65, 84, 73, 79, 78, 32, 66, 69, 32, 76, 73, 65, 66, 76, 69, 32, 70, 79, 82, 32, 65, 78, 89, 32, 67, 76, 65, 73, 77, 44, 32, + 68, 65, 77, 65, 71, 69, 83, 32, 79, 82, 32, 79, 84, 72, 69, 82, 32, 76, 73, 65, 66, 73, 76, 73, 84, 89, 44, 32, 73, 78, 67, 76, + 85, 68, 73, 78, 71, 10, 65, 78, 89, 32, 71, 69, 78, 69, 82, 65, 76, 44, 32, 83, 80, 69, 67, 73, 65, 76, 44, 32, 73, 78, 68, 73, + 82, 69, 67, 84, 44, 32, 73, 78, 67, 73, 68, 69, 78, 84, 65, 76, 44, 32, 79, 82, 32, 67, 79, 78, 83, 69, 81, 85, 69, 78, 84, 73, + 65, 76, 32, 68, 65, 77, 65, 71, 69, 83, 44, 10, 87, 72, 69, 84, 72, 69, 82, 32, 73, 78, 32, 65, 78, 32, 65, 67, 84, 73, 79, 78, + 32, 79, 70, 32, 67, 79, 78, 84, 82, 65, 67, 84, 44, 32, 84, 79, 82, 84, 32, 79, 82, 32, 79, 84, 72, 69, 82, 87, 73, 83, 69, 44, + 32, 65, 82, 73, 83, 73, 78, 71, 32, 70, 82, 79, 77, 44, 32, 79, 85, 84, 32, 79, 70, 10, 84, 72, 69, 32, 85, 83, 69, 32, 79, 82, + 32, 73, 78, 65, 66, 73, 76, 73, 84, 89, 32, 84, 79, 32, 85, 83, 69, 32, 84, 72, 69, 32, 70, 79, 78, 84, 32, 83, 79, 70, 84, 87, + 65, 82, 69, 32, 79, 82, 32, 70, 82, 79, 77, 32, 79, 84, 72, 69, 82, 32, 68, 69, 65, 76, 73, 78, 71, 83, 32, 73, 78, 32, 84, 72, + 69, 10, 70, 79, 78, 84, 32, 83, 79, 70, 84, 87, 65, 82, 69, 46, 10, 10, 69,120, 99,101,112,116, 32, 97,115, 32, 99,111,110,116, + 97,105,110,101,100, 32,105,110, 32,116,104,105,115, 32,110,111,116,105, 99,101, 44, 32,116,104,101, 32,110, 97,109,101,115, 32, +111,102, 32, 71,110,111,109,101, 44, 32,116,104,101, 32, 71,110,111,109,101, 10, 70,111,117,110,100, 97,116,105,111,110, 44, 32, + 97,110,100, 32, 66,105,116,115,116,114,101, 97,109, 32, 73,110, 99, 46, 44, 32,115,104, 97,108,108, 32,110,111,116, 32, 98,101, + 32,117,115,101,100, 32,105,110, 32, 97,100,118,101,114,116,105,115,105,110,103, 32,111,114, 10,111,116,104,101,114,119,105,115, +101, 32,116,111, 32,112,114,111,109,111,116,101, 32,116,104,101, 32,115, 97,108,101, 44, 32,117,115,101, 32,111,114, 32,111,116, +104,101,114, 32,100,101, 97,108,105,110,103,115, 32,105,110, 32,116,104,105,115, 32, 70,111,110,116, 32, 83,111,102,116,119, 97, +114,101, 10,119,105,116,104,111,117,116, 32,112,114,105,111,114, 32,119,114,105,116,116,101,110, 32, 97,117,116,104,111,114,105, +122, 97,116,105,111,110, 32,102,114,111,109, 32,116,104,101, 32, 71,110,111,109,101, 32, 70,111,117,110,100, 97,116,105,111,110, + 32,111,114, 32, 66,105,116,115,116,114,101, 97,109, 10, 73,110, 99, 46, 44, 32,114,101,115,112,101, 99,116,105,118,101,108,121, + 46, 32, 70,111,114, 32,102,117,114,116,104,101,114, 32,105,110,102,111,114,109, 97,116,105,111,110, 44, 32, 99,111,110,116, 97, + 99,116, 58, 32,102,111,110,116,115, 32, 97,116, 32,103,110,111,109,101, 32,100,111,116, 10,111,114,103, 46, 32, 10, 10, 65,114, +101,118, 32, 70,111,110,116,115, 32, 67,111,112,121,114,105,103,104,116, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 67,111,112,121,114,105,103,104,116, 32, 40, 99, 41, + 32, 50, 48, 48, 54, 32, 98,121, 32, 84, 97,118,109,106,111,110,103, 32, 66, 97,104, 46, 32, 65,108,108, 32, 82,105,103,104,116, +115, 32, 82,101,115,101,114,118,101,100, 46, 10, 10, 80,101,114,109,105,115,115,105,111,110, 32,105,115, 32,104,101,114,101, 98, +121, 32,103,114, 97,110,116,101,100, 44, 32,102,114,101,101, 32,111,102, 32, 99,104, 97,114,103,101, 44, 32,116,111, 32, 97,110, +121, 32,112,101,114,115,111,110, 32,111, 98,116, 97,105,110,105,110,103, 10, 97, 32, 99,111,112,121, 32,111,102, 32,116,104,101, + 32,102,111,110,116,115, 32, 97, 99, 99,111,109,112, 97,110,121,105,110,103, 32,116,104,105,115, 32,108,105, 99,101,110,115,101, + 32, 40, 34, 70,111,110,116,115, 34, 41, 32, 97,110,100, 10, 97,115,115,111, 99,105, 97,116,101,100, 32,100,111, 99,117,109,101, +110,116, 97,116,105,111,110, 32,102,105,108,101,115, 32, 40,116,104,101, 32, 34, 70,111,110,116, 32, 83,111,102,116,119, 97,114, +101, 34, 41, 44, 32,116,111, 32,114,101,112,114,111,100,117, 99,101, 10, 97,110,100, 32,100,105,115,116,114,105, 98,117,116,101, + 32,116,104,101, 32,109,111,100,105,102,105, 99, 97,116,105,111,110,115, 32,116,111, 32,116,104,101, 32, 66,105,116,115,116,114, +101, 97,109, 32, 86,101,114, 97, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 44, 10,105,110, 99,108,117,100,105,110, +103, 32,119,105,116,104,111,117,116, 32,108,105,109,105,116, 97,116,105,111,110, 32,116,104,101, 32,114,105,103,104,116,115, 32, +116,111, 32,117,115,101, 44, 32, 99,111,112,121, 44, 32,109,101,114,103,101, 44, 32,112,117, 98,108,105,115,104, 44, 10,100,105, +115,116,114,105, 98,117,116,101, 44, 32, 97,110,100, 47,111,114, 32,115,101,108,108, 32, 99,111,112,105,101,115, 32,111,102, 32, +116,104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 44, 32, 97,110,100, 32,116,111, 32,112,101,114,109,105,116, + 10,112,101,114,115,111,110,115, 32,116,111, 32,119,104,111,109, 32,116,104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, 97, +114,101, 32,105,115, 32,102,117,114,110,105,115,104,101,100, 32,116,111, 32,100,111, 32,115,111, 44, 32,115,117, 98,106,101, 99, +116, 32,116,111, 10,116,104,101, 32,102,111,108,108,111,119,105,110,103, 32, 99,111,110,100,105,116,105,111,110,115, 58, 10, 10, + 84,104,101, 32, 97, 98,111,118,101, 32, 99,111,112,121,114,105,103,104,116, 32, 97,110,100, 32,116,114, 97,100,101,109, 97,114, +107, 32,110,111,116,105, 99,101,115, 32, 97,110,100, 32,116,104,105,115, 32,112,101,114,109,105,115,115,105,111,110, 32,110,111, +116,105, 99,101, 10,115,104, 97,108,108, 32, 98,101, 32,105,110, 99,108,117,100,101,100, 32,105,110, 32, 97,108,108, 32, 99,111, +112,105,101,115, 32,111,102, 32,111,110,101, 32,111,114, 32,109,111,114,101, 32,111,102, 32,116,104,101, 32, 70,111,110,116, 32, + 83,111,102,116,119, 97,114,101, 10,116,121,112,101,102, 97, 99,101,115, 46, 10, 10, 84,104,101, 32, 70,111,110,116, 32, 83,111, +102,116,119, 97,114,101, 32,109, 97,121, 32, 98,101, 32,109,111,100,105,102,105,101,100, 44, 32, 97,108,116,101,114,101,100, 44, + 32,111,114, 32, 97,100,100,101,100, 32,116,111, 44, 32, 97,110,100, 32,105,110, 10,112, 97,114,116,105, 99,117,108, 97,114, 32, +116,104,101, 32,100,101,115,105,103,110,115, 32,111,102, 32,103,108,121,112,104,115, 32,111,114, 32, 99,104, 97,114, 97, 99,116, +101,114,115, 32,105,110, 32,116,104,101, 32, 70,111,110,116,115, 32,109, 97,121, 32, 98,101, 10,109,111,100,105,102,105,101,100, + 32, 97,110,100, 32, 97,100,100,105,116,105,111,110, 97,108, 32,103,108,121,112,104,115, 32,111,114, 32, 99,104, 97,114, 97, 99, +116,101,114,115, 32,109, 97,121, 32, 98,101, 32, 97,100,100,101,100, 32,116,111, 32,116,104,101, 10, 70,111,110,116,115, 44, 32, +111,110,108,121, 32,105,102, 32,116,104,101, 32,102,111,110,116,115, 32, 97,114,101, 32,114,101,110, 97,109,101,100, 32,116,111, + 32,110, 97,109,101,115, 32,110,111,116, 32, 99,111,110,116, 97,105,110,105,110,103, 32,101,105,116,104,101,114, 10,116,104,101, + 32,119,111,114,100,115, 32, 34, 84, 97,118,109,106,111,110,103, 32, 66, 97,104, 34, 32,111,114, 32,116,104,101, 32,119,111,114, +100, 32, 34, 65,114,101,118, 34, 46, 10, 10, 84,104,105,115, 32, 76,105, 99,101,110,115,101, 32, 98,101, 99,111,109,101,115, 32, +110,117,108,108, 32, 97,110,100, 32,118,111,105,100, 32,116,111, 32,116,104,101, 32,101,120,116,101,110,116, 32, 97,112,112,108, +105, 99, 97, 98,108,101, 32,116,111, 32, 70,111,110,116,115, 10,111,114, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, + 32,116,104, 97,116, 32,104, 97,115, 32, 98,101,101,110, 32,109,111,100,105,102,105,101,100, 32, 97,110,100, 32,105,115, 32,100, +105,115,116,114,105, 98,117,116,101,100, 32,117,110,100,101,114, 32,116,104,101, 32, 10, 34, 84, 97,118,109,106,111,110,103, 32, + 66, 97,104, 32, 65,114,101,118, 34, 32,110, 97,109,101,115, 46, 10, 10, 84,104,101, 32, 70,111,110,116, 32, 83,111,102,116,119, + 97,114,101, 32,109, 97,121, 32, 98,101, 32,115,111,108,100, 32, 97,115, 32,112, 97,114,116, 32,111,102, 32, 97, 32,108, 97,114, +103,101,114, 32,115,111,102,116,119, 97,114,101, 32,112, 97, 99,107, 97,103,101, 32, 98,117,116, 10,110,111, 32, 99,111,112,121, + 32,111,102, 32,111,110,101, 32,111,114, 32,109,111,114,101, 32,111,102, 32,116,104,101, 32, 70,111,110,116, 32, 83,111,102,116, +119, 97,114,101, 32,116,121,112,101,102, 97, 99,101,115, 32,109, 97,121, 32, 98,101, 32,115,111,108,100, 32, 98,121, 10,105,116, +115,101,108,102, 46, 10, 10, 84, 72, 69, 32, 70, 79, 78, 84, 32, 83, 79, 70, 84, 87, 65, 82, 69, 32, 73, 83, 32, 80, 82, 79, 86, + 73, 68, 69, 68, 32, 34, 65, 83, 32, 73, 83, 34, 44, 32, 87, 73, 84, 72, 79, 85, 84, 32, 87, 65, 82, 82, 65, 78, 84, 89, 32, 79, + 70, 32, 65, 78, 89, 32, 75, 73, 78, 68, 44, 10, 69, 88, 80, 82, 69, 83, 83, 32, 79, 82, 32, 73, 77, 80, 76, 73, 69, 68, 44, 32, + 73, 78, 67, 76, 85, 68, 73, 78, 71, 32, 66, 85, 84, 32, 78, 79, 84, 32, 76, 73, 77, 73, 84, 69, 68, 32, 84, 79, 32, 65, 78, 89, + 32, 87, 65, 82, 82, 65, 78, 84, 73, 69, 83, 32, 79, 70, 10, 77, 69, 82, 67, 72, 65, 78, 84, 65, 66, 73, 76, 73, 84, 89, 44, 32, + 70, 73, 84, 78, 69, 83, 83, 32, 70, 79, 82, 32, 65, 32, 80, 65, 82, 84, 73, 67, 85, 76, 65, 82, 32, 80, 85, 82, 80, 79, 83, 69, + 32, 65, 78, 68, 32, 78, 79, 78, 73, 78, 70, 82, 73, 78, 71, 69, 77, 69, 78, 84, 10, 79, 70, 32, 67, 79, 80, 89, 82, 73, 71, 72, + 84, 44, 32, 80, 65, 84, 69, 78, 84, 44, 32, 84, 82, 65, 68, 69, 77, 65, 82, 75, 44, 32, 79, 82, 32, 79, 84, 72, 69, 82, 32, 82, + 73, 71, 72, 84, 46, 32, 73, 78, 32, 78, 79, 32, 69, 86, 69, 78, 84, 32, 83, 72, 65, 76, 76, 10, 84, 65, 86, 77, 74, 79, 78, 71, + 32, 66, 65, 72, 32, 66, 69, 32, 76, 73, 65, 66, 76, 69, 32, 70, 79, 82, 32, 65, 78, 89, 32, 67, 76, 65, 73, 77, 44, 32, 68, 65, + 77, 65, 71, 69, 83, 32, 79, 82, 32, 79, 84, 72, 69, 82, 32, 76, 73, 65, 66, 73, 76, 73, 84, 89, 44, 10, 73, 78, 67, 76, 85, 68, + 73, 78, 71, 32, 65, 78, 89, 32, 71, 69, 78, 69, 82, 65, 76, 44, 32, 83, 80, 69, 67, 73, 65, 76, 44, 32, 73, 78, 68, 73, 82, 69, + 67, 84, 44, 32, 73, 78, 67, 73, 68, 69, 78, 84, 65, 76, 44, 32, 79, 82, 32, 67, 79, 78, 83, 69, 81, 85, 69, 78, 84, 73, 65, 76, + 10, 68, 65, 77, 65, 71, 69, 83, 44, 32, 87, 72, 69, 84, 72, 69, 82, 32, 73, 78, 32, 65, 78, 32, 65, 67, 84, 73, 79, 78, 32, 79, + 70, 32, 67, 79, 78, 84, 82, 65, 67, 84, 44, 32, 84, 79, 82, 84, 32, 79, 82, 32, 79, 84, 72, 69, 82, 87, 73, 83, 69, 44, 32, 65, + 82, 73, 83, 73, 78, 71, 10, 70, 82, 79, 77, 44, 32, 79, 85, 84, 32, 79, 70, 32, 84, 72, 69, 32, 85, 83, 69, 32, 79, 82, 32, 73, + 78, 65, 66, 73, 76, 73, 84, 89, 32, 84, 79, 32, 85, 83, 69, 32, 84, 72, 69, 32, 70, 79, 78, 84, 32, 83, 79, 70, 84, 87, 65, 82, + 69, 32, 79, 82, 32, 70, 82, 79, 77, 10, 79, 84, 72, 69, 82, 32, 68, 69, 65, 76, 73, 78, 71, 83, 32, 73, 78, 32, 84, 72, 69, 32, + 70, 79, 78, 84, 32, 83, 79, 70, 84, 87, 65, 82, 69, 46, 10, 10, 69,120, 99,101,112,116, 32, 97,115, 32, 99,111,110,116, 97,105, +110,101,100, 32,105,110, 32,116,104,105,115, 32,110,111,116,105, 99,101, 44, 32,116,104,101, 32,110, 97,109,101, 32,111,102, 32, + 84, 97,118,109,106,111,110,103, 32, 66, 97,104, 32,115,104, 97,108,108, 32,110,111,116, 10, 98,101, 32,117,115,101,100, 32,105, +110, 32, 97,100,118,101,114,116,105,115,105,110,103, 32,111,114, 32,111,116,104,101,114,119,105,115,101, 32,116,111, 32,112,114, +111,109,111,116,101, 32,116,104,101, 32,115, 97,108,101, 44, 32,117,115,101, 32,111,114, 32,111,116,104,101,114, 10,100,101, 97, +108,105,110,103,115, 32,105,110, 32,116,104,105,115, 32, 70,111,110,116, 32, 83,111,102,116,119, 97,114,101, 32,119,105,116,104, +111,117,116, 32,112,114,105,111,114, 32,119,114,105,116,116,101,110, 32, 97,117,116,104,111,114,105,122, 97,116,105,111,110, 10, +102,114,111,109, 32, 84, 97,118,109,106,111,110,103, 32, 66, 97,104, 46, 32, 70,111,114, 32,102,117,114,116,104,101,114, 32,105, +110,102,111,114,109, 97,116,105,111,110, 44, 32, 99,111,110,116, 97, 99,116, 58, 32,116, 97,118,109,106,111,110,103, 32, 64, 32, +102,114,101,101, 10, 46, 32,102,114, 46, 0, 0,104, 0,116, 0,116, 0,112, 0, 58, 0, 47, 0, 47, 0,100, 0,101, 0,106, 0, + 97, 0,118, 0,117, 0, 46, 0,115, 0,111, 0,117, 0,114, 0, 99, 0,101, 0,102, 0,111, 0,114, 0,103, 0,101, 0, 46, 0, +110, 0,101, 0,116, 0, 47, 0,119, 0,105, 0,107, 0,105, 0, 47, 0,105, 0,110, 0,100, 0,101, 0,120, 0, 46, 0,112, 0, +104, 0,112, 0, 47, 0, 76, 0,105, 0, 99, 0,101, 0,110, 0,115, 0,101, 0, 0,104,116,116,112, 58, 47, 47,100,101,106, 97, +118,117, 46,115,111,117,114, 99,101,102,111,114,103,101, 46,110,101,116, 47,119,105,107,105, 47,105,110,100,101,120, 46,112,104, +112, 47, 76,105, 99,101,110,115,101, 0, 65,108,108, 32, 84,121,112,111,103,114, 97,112,104,105, 99, 32, 70,101, 97,116,117,114, +101,115, 0, 70,111,110, 99,116,105,111,110,115, 32,116,121,112,111,103,114, 97,112,104,105,113,117,101,115, 0, 65,108,108,101, + 32,116,121,112,111,103,114, 97,102,105,115, 99,104,101,110, 32, 77,154,103,108,105, 99,104,107,101,105,116,101,110, 0, 70,117, +110,122,105,111,110,105, 32, 84,105,112,111,103,114, 97,102,105, 99,104,101, 0, 65,108,108,101, 32,116,121,112,111,103,114, 97, +102,105,115, 99,104,101, 32,107,101,110,109,101,114,107,101,110, 0, 76,105,103, 97,116,117,114,101,115, 0, 76,105,103, 97,116, +117,114,101,115, 0, 76,105,103, 97,116,117,114,101,110, 0, 76,101,103, 97,116,117,114,101, 0, 76,105,103, 97,116,117,114,101, +110, 0, 67,117,114,115,105,118,101, 32, 99,111,110,110,101, 99,116,105,111,110, 0, 67,111,110,110,101, 99,116,105,111,110, 32, +100,101,115, 32, 67,117,114,115,105,118,101,115, 0, 67,117,114,115,105,101,118,101, 32,118,101,114, 98,105,110,100,105,110,103, + 0, 70,114, 97, 99,116,105,111,110,115, 0, 70,114, 97, 99,116,105,111,110,115, 0, 66,114,101,117,107,101,110, 0, 65,108,108, + 32, 84,121,112,101, 32, 70,101, 97,116,117,114,101,115, 0, 84,111,117,116,101,115, 32,102,111,110, 99,116,105,111,110,115, 32, +116,121,112,111,103,114, 97,112,104,105,113,117,101,115, 0, 65,108,108,101, 32, 65,117,115,122,101,105, 99,104,110,117,110,103, +115, 97,114,116,101,110, 0, 84,117,116,116,101, 32,108,101, 32, 70,117,110,122,105,111,110,105, 0, 65,108,108,101, 32,116,121, +112,101,107,101,110,109,101,114,107,101,110, 0, 67,111,109,109,111,110, 32, 76,105,103, 97,116,117,114,101,115, 0, 76,105,103, + 97,116,117,114,101,115, 32, 85,115,117,101,108,108,101,115, 0, 78,111,114,109, 97,108,101, 32, 76,105,103, 97,116,117,114,101, +110, 0, 76,101,103, 97,116,117,114,101, 32,112,105,157, 32, 67,111,109,117,110,105, 0, 71,101,109,101,101,110,115, 99,104, 97, +112,112,101,108,105,106,107,101, 32, 76,105,103, 97,116,117,114,101,110, 0, 82, 97,114,101, 32, 76,105,103, 97,116,117,114,101, +115, 0, 76,105,103, 97,116,117,114,101,115, 32, 82, 97,114,101,115, 0, 83,101,108,116,101,110,101, 32, 76,105,103, 97,116,117, +114,101,110, 0, 76,101,103, 97,116,117,114,101, 32, 82, 97,114,101, 0, 90,101,108,100,122, 97,109,101, 32,108,105,103, 97,116, +117,114,101,110, 0, 67,117,114,115,105,118,101, 0, 80,108,101,105,110,101,109,101,110,116, 32, 99,111,110,110,101, 99,116,142, +101,115, 0, 67,117,114,115,105,101,102, 0, 68,105, 97,103,111,110, 97,108, 32, 70,114, 97, 99,116,105,111,110,115, 0, 70,114, + 97, 99,116,105,111,110,115, 32,101,110, 32, 68,105, 97,103,111,110, 97,108,101, 0, 68,105, 97,103,111,110, 97,108,101,114, 32, + 66,114,117, 99,104, 0, 70,114, 97,122,105,111,110,105, 32, 68,105, 97,103,111,110, 97,108,105, 0, 68,105, 97,103,111,110, 97, +108,101, 32, 98,114,101,117,107,101,110, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,255,171, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,163, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, + 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, 20, 0, 21, 0, 22, 0, 23, 0, 24, + 0, 25, 0, 26, 0, 27, 0, 28, 0, 29, 0, 30, 0, 31, 0, 32, 0, 33, 0, 34, 0, 35, 0, 36, 0, 37, 0, 38, 0, 39, 0, 40, + 0, 41, 0, 42, 0, 43, 0, 44, 0, 45, 0, 46, 0, 47, 0, 48, 0, 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 54, 0, 55, 0, 56, + 0, 57, 0, 58, 0, 59, 0, 60, 0, 61, 0, 62, 0, 63, 0, 64, 0, 65, 0, 66, 0, 67, 0, 68, 0, 69, 0, 70, 0, 71, 0, 72, + 0, 73, 0, 74, 0, 75, 0, 76, 0, 77, 0, 78, 0, 79, 0, 80, 0, 81, 0, 82, 0, 83, 0, 84, 0, 85, 0, 86, 0, 87, 0, 88, + 0, 89, 0, 90, 0, 91, 0, 92, 0, 93, 0, 94, 0, 95, 0, 96, 0, 97, 0,172, 0,163, 0,132, 0,133, 0,189, 0,150, 0,232, + 0,134, 0,142, 0,139, 0,157, 0,169, 0,164, 1, 2, 0,138, 0,218, 0,131, 0,147, 0,242, 0,243, 0,141, 0,151, 0,136, + 0,195, 0,222, 0,241, 0,158, 0,170, 0,245, 0,244, 0,246, 0,162, 0,173, 0,201, 0,199, 0,174, 0, 98, 0, 99, 0,144, + 0,100, 0,203, 0,101, 0,200, 0,202, 0,207, 0,204, 0,205, 0,206, 0,233, 0,102, 0,211, 0,208, 0,209, 0,175, 0,103, + 0,240, 0,145, 0,214, 0,212, 0,213, 0,104, 0,235, 0,237, 0,137, 0,106, 0,105, 0,107, 0,109, 0,108, 0,110, 0,160, + 0,111, 0,113, 0,112, 0,114, 0,115, 0,117, 0,116, 0,118, 0,119, 0,234, 0,120, 0,122, 0,121, 0,123, 0,125, 0,124, + 0,184, 0,161, 0,127, 0,126, 0,128, 0,129, 0,236, 0,238, 0,186, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 0,253, + 0,254, 1, 9, 1, 10, 1, 11, 1, 12, 0,255, 1, 0, 1, 13, 1, 14, 1, 15, 1, 1, 1, 16, 1, 17, 1, 18, 1, 19, 1, 20, + 1, 21, 1, 22, 1, 23, 1, 24, 1, 25, 1, 26, 1, 27, 0,248, 0,249, 1, 28, 1, 29, 1, 30, 1, 31, 1, 32, 1, 33, 1, 34, + 1, 35, 1, 36, 1, 37, 1, 38, 1, 39, 1, 40, 1, 41, 1, 42, 1, 43, 0,250, 0,215, 1, 44, 1, 45, 1, 46, 1, 47, 1, 48, + 1, 49, 1, 50, 1, 51, 1, 52, 1, 53, 1, 54, 1, 55, 1, 56, 1, 57, 1, 58, 0,226, 0,227, 1, 59, 1, 60, 1, 61, 1, 62, + 1, 63, 1, 64, 1, 65, 1, 66, 1, 67, 1, 68, 1, 69, 1, 70, 1, 71, 1, 72, 1, 73, 0,176, 0,177, 1, 74, 1, 75, 1, 76, + 1, 77, 1, 78, 1, 79, 1, 80, 1, 81, 1, 82, 1, 83, 0,251, 0,252, 0,228, 0,229, 1, 84, 1, 85, 1, 86, 1, 87, 1, 88, + 1, 89, 1, 90, 1, 91, 1, 92, 1, 93, 1, 94, 1, 95, 1, 96, 1, 97, 1, 98, 1, 99, 1,100, 1,101, 1,102, 1,103, 1,104, + 1,105, 0,187, 1,106, 1,107, 1,108, 1,109, 0,230, 0,231, 1,110, 1,111, 1,112, 1,113, 1,114, 1,115, 1,116, 1,117, + 1,118, 1,119, 1,120, 1,121, 1,122, 1,123, 1,124, 1,125, 1,126, 1,127, 1,128, 0,166, 1,129, 1,130, 1,131, 1,132, + 1,133, 1,134, 1,135, 1,136, 1,137, 1,138, 1,139, 1,140, 1,141, 1,142, 1,143, 1,144, 1,145, 1,146, 1,147, 1,148, + 1,149, 1,150, 1,151, 1,152, 1,153, 1,154, 1,155, 1,156, 1,157, 1,158, 1,159, 1,160, 1,161, 1,162, 1,163, 1,164, + 1,165, 1,166, 1,167, 1,168, 1,169, 1,170, 1,171, 1,172, 1,173, 1,174, 1,175, 1,176, 1,177, 1,178, 1,179, 1,180, + 1,181, 1,182, 1,183, 1,184, 1,185, 1,186, 1,187, 1,188, 1,189, 1,190, 1,191, 1,192, 1,193, 1,194, 1,195, 1,196, + 1,197, 1,198, 1,199, 1,200, 1,201, 1,202, 1,203, 1,204, 1,205, 1,206, 1,207, 1,208, 1,209, 1,210, 1,211, 1,212, + 1,213, 1,214, 1,215, 1,216, 1,217, 1,218, 1,219, 1,220, 1,221, 1,222, 1,223, 1,224, 1,225, 1,226, 1,227, 1,228, + 1,229, 1,230, 1,231, 1,232, 1,233, 1,234, 1,235, 1,236, 1,237, 1,238, 1,239, 1,240, 1,241, 1,242, 1,243, 1,244, + 1,245, 1,246, 1,247, 1,248, 1,249, 1,250, 1,251, 1,252, 1,253, 1,254, 1,255, 2, 0, 2, 1, 2, 2, 2, 3, 2, 4, + 2, 5, 2, 6, 2, 7, 2, 8, 2, 9, 2, 10, 2, 11, 2, 12, 2, 13, 2, 14, 2, 15, 2, 16, 2, 17, 2, 18, 2, 19, 2, 20, + 2, 21, 2, 22, 2, 23, 2, 24, 2, 25, 2, 26, 2, 27, 2, 28, 2, 29, 2, 30, 2, 31, 2, 32, 2, 33, 2, 34, 2, 35, 2, 36, + 2, 37, 2, 38, 2, 39, 2, 40, 2, 41, 2, 42, 2, 43, 2, 44, 2, 45, 2, 46, 2, 47, 2, 48, 2, 49, 2, 50, 2, 51, 2, 52, + 2, 53, 2, 54, 2, 55, 2, 56, 2, 57, 2, 58, 2, 59, 2, 60, 2, 61, 2, 62, 2, 63, 2, 64, 2, 65, 2, 66, 2, 67, 2, 68, + 2, 69, 2, 70, 2, 71, 2, 72, 2, 73, 2, 74, 0,216, 0,225, 2, 75, 2, 76, 2, 77, 2, 78, 2, 79, 2, 80, 2, 81, 2, 82, + 2, 83, 2, 84, 2, 85, 2, 86, 2, 87, 2, 88, 2, 89, 2, 90, 0,219, 0,220, 0,221, 0,224, 0,217, 0,223, 2, 91, 2, 92, + 2, 93, 2, 94, 2, 95, 2, 96, 2, 97, 2, 98, 2, 99, 2,100, 2,101, 2,102, 2,103, 2,104, 2,105, 2,106, 2,107, 2,108, + 2,109, 2,110, 2,111, 2,112, 2,113, 2,114, 2,115, 2,116, 2,117, 2,118, 2,119, 2,120, 2,121, 2,122, 2,123, 2,124, + 2,125, 2,126, 2,127, 2,128, 2,129, 2,130, 2,131, 2,132, 2,133, 2,134, 2,135, 2,136, 2,137, 2,138, 2,139, 2,140, + 2,141, 2,142, 2,143, 2,144, 2,145, 2,146, 2,147, 2,148, 2,149, 2,150, 2,151, 2,152, 2,153, 2,154, 2,155, 2,156, + 2,157, 2,158, 2,159, 2,160, 2,161, 2,162, 2,163, 2,164, 2,165, 2,166, 2,167, 2,168, 2,169, 2,170, 2,171, 2,172, + 2,173, 2,174, 2,175, 2,176, 2,177, 2,178, 2,179, 2,180, 2,181, 2,182, 2,183, 2,184, 2,185, 2,186, 2,187, 2,188, + 2,189, 2,190, 2,191, 2,192, 2,193, 2,194, 2,195, 2,196, 2,197, 2,198, 2,199, 2,200, 2,201, 2,202, 2,203, 2,204, + 2,205, 2,206, 2,207, 2,208, 2,209, 2,210, 2,211, 2,212, 2,213, 2,214, 2,215, 2,216, 2,217, 2,218, 2,219, 2,220, + 2,221, 2,222, 2,223, 2,224, 2,225, 2,226, 2,227, 2,228, 2,229, 2,230, 2,231, 2,232, 2,233, 2,234, 0,159, 2,235, + 2,236, 2,237, 2,238, 2,239, 2,240, 2,241, 2,242, 2,243, 2,244, 2,245, 2,246, 2,247, 2,248, 2,249, 2,250, 2,251, + 2,252, 2,253, 2,254, 2,255, 3, 0, 0,155, 3, 1, 3, 2, 3, 3, 3, 4, 3, 5, 3, 6, 3, 7, 3, 8, 3, 9, 3, 10, + 3, 11, 3, 12, 3, 13, 3, 14, 3, 15, 3, 16, 3, 17, 3, 18, 3, 19, 3, 20, 3, 21, 3, 22, 3, 23, 3, 24, 3, 25, 3, 26, + 3, 27, 3, 28, 3, 29, 3, 30, 3, 31, 3, 32, 3, 33, 3, 34, 3, 35, 3, 36, 3, 37, 3, 38, 3, 39, 3, 40, 3, 41, 3, 42, + 3, 43, 3, 44, 3, 45, 3, 46, 3, 47, 3, 48, 3, 49, 3, 50, 3, 51, 3, 52, 3, 53, 3, 54, 3, 55, 3, 56, 3, 57, 3, 58, + 3, 59, 3, 60, 3, 61, 3, 62, 3, 63, 3, 64, 3, 65, 3, 66, 3, 67, 3, 68, 3, 69, 3, 70, 3, 71, 3, 72, 3, 73, 3, 74, + 3, 75, 3, 76, 3, 77, 3, 78, 3, 79, 3, 80, 3, 81, 3, 82, 3, 83, 3, 84, 3, 85, 3, 86, 3, 87, 3, 88, 3, 89, 3, 90, + 3, 91, 3, 92, 3, 93, 3, 94, 3, 95, 3, 96, 3, 97, 3, 98, 3, 99, 3,100, 3,101, 3,102, 3,103, 3,104, 3,105, 3,106, + 3,107, 3,108, 3,109, 3,110, 3,111, 3,112, 3,113, 3,114, 3,115, 3,116, 3,117, 3,118, 3,119, 3,120, 3,121, 3,122, + 3,123, 3,124, 3,125, 3,126, 3,127, 3,128, 3,129, 3,130, 3,131, 3,132, 3,133, 3,134, 3,135, 3,136, 3,137, 3,138, + 3,139, 3,140, 3,141, 3,142, 3,143, 3,144, 3,145, 3,146, 3,147, 3,148, 3,149, 3,150, 3,151, 3,152, 3,153, 3,154, + 3,155, 3,156, 3,157, 3,158, 3,159, 3,160, 3,161, 3,162, 3,163, 3,164, 3,165, 3,166, 3,167, 3,168, 3,169, 3,170, + 3,171, 3,172, 3,173, 3,174, 3,175, 3,176, 3,177, 3,178, 3,179, 3,180, 3,181, 3,182, 3,183, 3,184, 3,185, 3,186, + 3,187, 3,188, 3,189, 3,190, 3,191, 3,192, 3,193, 3,194, 3,195, 3,196, 3,197, 3,198, 3,199, 3,200, 3,201, 3,202, + 3,203, 3,204, 3,205, 3,206, 3,207, 3,208, 3,209, 3,210, 3,211, 3,212, 3,213, 3,214, 3,215, 3,216, 3,217, 3,218, + 3,219, 3,220, 3,221, 3,222, 3,223, 3,224, 3,225, 3,226, 3,227, 3,228, 3,229, 3,230, 3,231, 3,232, 3,233, 3,234, + 3,235, 3,236, 3,237, 3,238, 3,239, 3,240, 3,241, 3,242, 3,243, 3,244, 3,245, 3,246, 3,247, 3,248, 3,249, 3,250, + 3,251, 3,252, 3,253, 3,254, 3,255, 4, 0, 4, 1, 4, 2, 4, 3, 4, 4, 4, 5, 4, 6, 4, 7, 4, 8, 4, 9, 4, 10, + 4, 11, 4, 12, 4, 13, 4, 14, 4, 15, 4, 16, 4, 17, 4, 18, 4, 19, 4, 20, 4, 21, 4, 22, 4, 23, 4, 24, 4, 25, 4, 26, + 4, 27, 4, 28, 4, 29, 4, 30, 4, 31, 4, 32, 4, 33, 4, 34, 4, 35, 4, 36, 4, 37, 4, 38, 4, 39, 4, 40, 4, 41, 4, 42, + 4, 43, 4, 44, 4, 45, 4, 46, 4, 47, 4, 48, 4, 49, 4, 50, 4, 51, 4, 52, 4, 53, 4, 54, 4, 55, 4, 56, 4, 57, 4, 58, + 4, 59, 4, 60, 4, 61, 4, 62, 4, 63, 4, 64, 4, 65, 4, 66, 4, 67, 4, 68, 4, 69, 4, 70, 4, 71, 4, 72, 4, 73, 4, 74, + 4, 75, 4, 76, 4, 77, 4, 78, 4, 79, 4, 80, 4, 81, 4, 82, 4, 83, 4, 84, 4, 85, 4, 86, 4, 87, 4, 88, 4, 89, 4, 90, + 4, 91, 4, 92, 4, 93, 4, 94, 4, 95, 4, 96, 4, 97, 4, 98, 4, 99, 4,100, 4,101, 4,102, 4,103, 4,104, 4,105, 4,106, + 4,107, 4,108, 4,109, 4,110, 4,111, 4,112, 4,113, 4,114, 4,115, 4,116, 4,117, 4,118, 4,119, 4,120, 4,121, 4,122, + 4,123, 4,124, 4,125, 4,126, 4,127, 4,128, 4,129, 4,130, 4,131, 4,132, 4,133, 4,134, 4,135, 4,136, 4,137, 4,138, + 4,139, 4,140, 4,141, 4,142, 4,143, 4,144, 4,145, 4,146, 4,147, 4,148, 4,149, 4,150, 4,151, 4,152, 4,153, 4,154, + 4,155, 4,156, 4,157, 4,158, 4,159, 4,160, 4,161, 4,162, 4,163, 4,164, 4,165, 4,166, 4,167, 4,168, 4,169, 4,170, + 4,171, 4,172, 4,173, 4,174, 4,175, 4,176, 4,177, 4,178, 4,179, 4,180, 4,181, 4,182, 4,183, 4,184, 4,185, 4,186, + 4,187, 4,188, 4,189, 4,190, 4,191, 4,192, 4,193, 4,194, 4,195, 4,196, 4,197, 4,198, 4,199, 4,200, 4,201, 4,202, + 4,203, 4,204, 4,205, 4,206, 4,207, 4,208, 4,209, 4,210, 4,211, 4,212, 4,213, 4,214, 4,215, 4,216, 4,217, 4,218, + 4,219, 4,220, 4,221, 4,222, 4,223, 4,224, 4,225, 4,226, 4,227, 4,228, 4,229, 4,230, 4,231, 4,232, 4,233, 4,234, + 4,235, 4,236, 4,237, 4,238, 4,239, 4,240, 4,241, 4,242, 4,243, 4,244, 4,245, 4,246, 4,247, 4,248, 4,249, 4,250, + 4,251, 4,252, 4,253, 4,254, 4,255, 5, 0, 5, 1, 5, 2, 5, 3, 5, 4, 5, 5, 5, 6, 5, 7, 5, 8, 5, 9, 5, 10, + 5, 11, 5, 12, 5, 13, 5, 14, 5, 15, 5, 16, 5, 17, 5, 18, 5, 19, 5, 20, 5, 21, 5, 22, 5, 23, 5, 24, 5, 25, 5, 26, + 5, 27, 5, 28, 5, 29, 5, 30, 5, 31, 5, 32, 5, 33, 5, 34, 5, 35, 5, 36, 5, 37, 5, 38, 5, 39, 5, 40, 5, 41, 5, 42, + 5, 43, 5, 44, 5, 45, 5, 46, 5, 47, 5, 48, 5, 49, 5, 50, 5, 51, 5, 52, 5, 53, 5, 54, 5, 55, 5, 56, 5, 57, 5, 58, + 5, 59, 5, 60, 5, 61, 5, 62, 5, 63, 5, 64, 5, 65, 5, 66, 5, 67, 5, 68, 5, 69, 5, 70, 5, 71, 5, 72, 5, 73, 5, 74, + 5, 75, 5, 76, 5, 77, 5, 78, 5, 79, 5, 80, 5, 81, 5, 82, 5, 83, 5, 84, 5, 85, 5, 86, 5, 87, 5, 88, 5, 89, 5, 90, + 5, 91, 5, 92, 5, 93, 5, 94, 5, 95, 5, 96, 5, 97, 5, 98, 5, 99, 5,100, 5,101, 5,102, 5,103, 5,104, 5,105, 5,106, + 5,107, 5,108, 5,109, 5,110, 5,111, 5,112, 5,113, 5,114, 5,115, 5,116, 5,117, 5,118, 5,119, 5,120, 5,121, 5,122, + 5,123, 5,124, 5,125, 5,126, 5,127, 5,128, 5,129, 5,130, 5,131, 5,132, 5,133, 5,134, 5,135, 5,136, 5,137, 5,138, + 5,139, 5,140, 5,141, 5,142, 5,143, 5,144, 5,145, 5,146, 5,147, 5,148, 5,149, 5,150, 5,151, 5,152, 5,153, 5,154, + 5,155, 5,156, 5,157, 5,158, 5,159, 5,160, 5,161, 5,162, 5,163, 5,164, 5,165, 5,166, 5,167, 5,168, 5,169, 0,178, + 0,179, 5,170, 5,171, 5,172, 0,182, 0,183, 0,196, 5,173, 0,180, 0,181, 0,197, 5,174, 0,130, 0,194, 0,135, 5,175, + 5,176, 5,177, 0,171, 5,178, 0,198, 5,179, 5,180, 5,181, 5,182, 5,183, 5,184, 5,185, 5,186, 0,190, 0,191, 5,187, + 5,188, 5,189, 5,190, 5,191, 5,192, 5,193, 5,194, 5,195, 0,188, 5,196, 5,197, 5,198, 5,199, 5,200, 5,201, 5,202, + 5,203, 5,204, 5,205, 5,206, 5,207, 5,208, 5,209, 5,210, 5,211, 5,212, 5,213, 5,214, 5,215, 5,216, 5,217, 5,218, + 5,219, 5,220, 5,221, 5,222, 5,223, 5,224, 5,225, 5,226, 5,227, 5,228, 5,229, 5,230, 5,231, 5,232, 5,233, 5,234, + 5,235, 5,236, 5,237, 5,238, 5,239, 5,240, 5,241, 5,242, 5,243, 5,244, 5,245, 5,246, 5,247, 5,248, 5,249, 5,250, + 5,251, 5,252, 5,253, 0,247, 5,254, 5,255, 6, 0, 6, 1, 6, 2, 6, 3, 6, 4, 6, 5, 6, 6, 6, 7, 6, 8, 6, 9, + 6, 10, 6, 11, 6, 12, 6, 13, 6, 14, 6, 15, 6, 16, 6, 17, 6, 18, 6, 19, 6, 20, 6, 21, 6, 22, 6, 23, 6, 24, 6, 25, + 6, 26, 6, 27, 6, 28, 6, 29, 6, 30, 6, 31, 6, 32, 0,140, 6, 33, 6, 34, 6, 35, 6, 36, 6, 37, 6, 38, 6, 39, 6, 40, + 6, 41, 6, 42, 6, 43, 6, 44, 6, 45, 6, 46, 6, 47, 6, 48, 6, 49, 6, 50, 6, 51, 6, 52, 6, 53, 6, 54, 6, 55, 6, 56, + 6, 57, 6, 58, 6, 59, 6, 60, 6, 61, 6, 62, 6, 63, 6, 64, 6, 65, 6, 66, 6, 67, 6, 68, 6, 69, 6, 70, 6, 71, 6, 72, + 6, 73, 6, 74, 6, 75, 6, 76, 6, 77, 6, 78, 6, 79, 6, 80, 6, 81, 6, 82, 6, 83, 6, 84, 6, 85, 6, 86, 6, 87, 6, 88, + 6, 89, 6, 90, 6, 91, 6, 92, 6, 93, 6, 94, 6, 95, 6, 96, 6, 97, 6, 98, 6, 99, 6,100, 6,101, 6,102, 0,239, 6,103, + 6,104, 0,188, 6,105, 6,106, 6,107, 0,195, 0,165, 6,108, 6,109, 6,110, 0,146, 6,111, 6,112, 6,113, 6,114, 6,115, + 6,116, 6,117, 6,118, 6,119, 6,120, 6,121, 6,122, 6,123, 6,124, 6,125, 6,126, 6,127, 6,128, 6,129, 0,192, 0,193, + 6,130, 6,131, 6,132, 6,133, 6,134, 6,135, 6,136, 6,137, 6,138, 6,139, 6,140, 6,141, 6,142, 6,143, 6,144, 6,145, + 6,146, 6,147, 6,148, 6,149, 6,150, 6,151, 6,152, 6,153, 6,154, 6,155, 6,156, 6,157, 6,158, 6,159, 6,160, 6,161, + 6,162, 6,163, 6,164, 6,165, 6,166, 6,167, 6,168, 6,169, 6,170, 6,171, 9,115,102,116,104,121,112,104,101,110, 7, 65, +109, 97, 99,114,111,110, 7, 97,109, 97, 99,114,111,110, 6, 65, 98,114,101,118,101, 6, 97, 98,114,101,118,101, 7, 65,111,103, +111,110,101,107, 7, 97,111,103,111,110,101,107, 11, 67, 99,105,114, 99,117,109,102,108,101,120, 11, 99, 99,105,114, 99,117,109, +102,108,101,120, 10, 67,100,111,116, 97, 99, 99,101,110,116, 10, 99,100,111,116, 97, 99, 99,101,110,116, 6, 68, 99, 97,114,111, +110, 6,100, 99, 97,114,111,110, 6, 68, 99,114,111, 97,116, 7, 69,109, 97, 99,114,111,110, 7,101,109, 97, 99,114,111,110, 6, + 69, 98,114,101,118,101, 6,101, 98,114,101,118,101, 10, 69,100,111,116, 97, 99, 99,101,110,116, 10,101,100,111,116, 97, 99, 99, +101,110,116, 7, 69,111,103,111,110,101,107, 7,101,111,103,111,110,101,107, 6, 69, 99, 97,114,111,110, 6,101, 99, 97,114,111, +110, 11, 71, 99,105,114, 99,117,109,102,108,101,120, 11,103, 99,105,114, 99,117,109,102,108,101,120, 10, 71,100,111,116, 97, 99, + 99,101,110,116, 10,103,100,111,116, 97, 99, 99,101,110,116, 12, 71, 99,111,109,109, 97, 97, 99, 99,101,110,116, 12,103, 99,111, +109,109, 97, 97, 99, 99,101,110,116, 11, 72, 99,105,114, 99,117,109,102,108,101,120, 11,104, 99,105,114, 99,117,109,102,108,101, +120, 4, 72, 98, 97,114, 4,104, 98, 97,114, 6, 73,116,105,108,100,101, 6,105,116,105,108,100,101, 7, 73,109, 97, 99,114,111, +110, 7,105,109, 97, 99,114,111,110, 6, 73, 98,114,101,118,101, 6,105, 98,114,101,118,101, 7, 73,111,103,111,110,101,107, 7, +105,111,103,111,110,101,107, 2, 73, 74, 2,105,106, 11, 74, 99,105,114, 99,117,109,102,108,101,120, 11,106, 99,105,114, 99,117, +109,102,108,101,120, 12, 75, 99,111,109,109, 97, 97, 99, 99,101,110,116, 12,107, 99,111,109,109, 97, 97, 99, 99,101,110,116, 12, +107,103,114,101,101,110,108, 97,110,100,105, 99, 6, 76, 97, 99,117,116,101, 6,108, 97, 99,117,116,101, 12, 76, 99,111,109,109, + 97, 97, 99, 99,101,110,116, 12,108, 99,111,109,109, 97, 97, 99, 99,101,110,116, 6, 76, 99, 97,114,111,110, 6,108, 99, 97,114, +111,110, 4, 76,100,111,116, 4,108,100,111,116, 6, 78, 97, 99,117,116,101, 6,110, 97, 99,117,116,101, 12, 78, 99,111,109,109, + 97, 97, 99, 99,101,110,116, 12,110, 99,111,109,109, 97, 97, 99, 99,101,110,116, 6, 78, 99, 97,114,111,110, 6,110, 99, 97,114, +111,110, 11,110, 97,112,111,115,116,114,111,112,104,101, 3, 69,110,103, 3,101,110,103, 7, 79,109, 97, 99,114,111,110, 7,111, +109, 97, 99,114,111,110, 6, 79, 98,114,101,118,101, 6,111, 98,114,101,118,101, 13, 79,104,117,110,103, 97,114,117,109,108, 97, +117,116, 13,111,104,117,110,103, 97,114,117,109,108, 97,117,116, 6, 82, 97, 99,117,116,101, 6,114, 97, 99,117,116,101, 12, 82, + 99,111,109,109, 97, 97, 99, 99,101,110,116, 12,114, 99,111,109,109, 97, 97, 99, 99,101,110,116, 6, 82, 99, 97,114,111,110, 6, +114, 99, 97,114,111,110, 6, 83, 97, 99,117,116,101, 6,115, 97, 99,117,116,101, 11, 83, 99,105,114, 99,117,109,102,108,101,120, + 11,115, 99,105,114, 99,117,109,102,108,101,120, 12, 84, 99,111,109,109, 97, 97, 99, 99,101,110,116, 12,116, 99,111,109,109, 97, + 97, 99, 99,101,110,116, 6, 84, 99, 97,114,111,110, 6,116, 99, 97,114,111,110, 4, 84, 98, 97,114, 4,116, 98, 97,114, 6, 85, +116,105,108,100,101, 6,117,116,105,108,100,101, 7, 85,109, 97, 99,114,111,110, 7,117,109, 97, 99,114,111,110, 6, 85, 98,114, +101,118,101, 6,117, 98,114,101,118,101, 5, 85,114,105,110,103, 5,117,114,105,110,103, 13, 85,104,117,110,103, 97,114,117,109, +108, 97,117,116, 13,117,104,117,110,103, 97,114,117,109,108, 97,117,116, 7, 85,111,103,111,110,101,107, 7,117,111,103,111,110, +101,107, 11, 87, 99,105,114, 99,117,109,102,108,101,120, 11,119, 99,105,114, 99,117,109,102,108,101,120, 11, 89, 99,105,114, 99, +117,109,102,108,101,120, 11,121, 99,105,114, 99,117,109,102,108,101,120, 6, 90, 97, 99,117,116,101, 6,122, 97, 99,117,116,101, + 10, 90,100,111,116, 97, 99, 99,101,110,116, 10,122,100,111,116, 97, 99, 99,101,110,116, 5,108,111,110,103,115, 7,117,110,105, + 48, 49, 56, 48, 7,117,110,105, 48, 49, 56, 49, 7,117,110,105, 48, 49, 56, 50, 7,117,110,105, 48, 49, 56, 51, 7,117,110,105, + 48, 49, 56, 52, 7,117,110,105, 48, 49, 56, 53, 7,117,110,105, 48, 49, 56, 54, 7,117,110,105, 48, 49, 56, 55, 7,117,110,105, + 48, 49, 56, 56, 7,117,110,105, 48, 49, 56, 57, 7,117,110,105, 48, 49, 56, 65, 7,117,110,105, 48, 49, 56, 66, 7,117,110,105, + 48, 49, 56, 67, 7,117,110,105, 48, 49, 56, 68, 7,117,110,105, 48, 49, 56, 69, 7,117,110,105, 48, 49, 56, 70, 7,117,110,105, + 48, 49, 57, 48, 7,117,110,105, 48, 49, 57, 49, 7,117,110,105, 48, 49, 57, 51, 7,117,110,105, 48, 49, 57, 52, 7,117,110,105, + 48, 49, 57, 53, 7,117,110,105, 48, 49, 57, 54, 7,117,110,105, 48, 49, 57, 55, 7,117,110,105, 48, 49, 57, 56, 7,117,110,105, + 48, 49, 57, 57, 7,117,110,105, 48, 49, 57, 65, 7,117,110,105, 48, 49, 57, 66, 7,117,110,105, 48, 49, 57, 67, 7,117,110,105, + 48, 49, 57, 68, 7,117,110,105, 48, 49, 57, 69, 7,117,110,105, 48, 49, 57, 70, 5, 79,104,111,114,110, 5,111,104,111,114,110, + 7,117,110,105, 48, 49, 65, 50, 7,117,110,105, 48, 49, 65, 51, 7,117,110,105, 48, 49, 65, 52, 7,117,110,105, 48, 49, 65, 53, + 7,117,110,105, 48, 49, 65, 54, 7,117,110,105, 48, 49, 65, 55, 7,117,110,105, 48, 49, 65, 56, 7,117,110,105, 48, 49, 65, 57, + 7,117,110,105, 48, 49, 65, 65, 7,117,110,105, 48, 49, 65, 66, 7,117,110,105, 48, 49, 65, 67, 7,117,110,105, 48, 49, 65, 68, + 7,117,110,105, 48, 49, 65, 69, 5, 85,104,111,114,110, 5,117,104,111,114,110, 7,117,110,105, 48, 49, 66, 49, 7,117,110,105, + 48, 49, 66, 50, 7,117,110,105, 48, 49, 66, 51, 7,117,110,105, 48, 49, 66, 52, 7,117,110,105, 48, 49, 66, 53, 7,117,110,105, + 48, 49, 66, 54, 7,117,110,105, 48, 49, 66, 55, 7,117,110,105, 48, 49, 66, 56, 7,117,110,105, 48, 49, 66, 57, 7,117,110,105, + 48, 49, 66, 65, 7,117,110,105, 48, 49, 66, 66, 7,117,110,105, 48, 49, 66, 67, 7,117,110,105, 48, 49, 66, 68, 7,117,110,105, + 48, 49, 66, 69, 7,117,110,105, 48, 49, 66, 70, 7,117,110,105, 48, 49, 67, 48, 7,117,110,105, 48, 49, 67, 49, 7,117,110,105, + 48, 49, 67, 50, 7,117,110,105, 48, 49, 67, 51, 7,117,110,105, 48, 49, 67, 52, 7,117,110,105, 48, 49, 67, 53, 7,117,110,105, + 48, 49, 67, 54, 7,117,110,105, 48, 49, 67, 55, 7,117,110,105, 48, 49, 67, 56, 7,117,110,105, 48, 49, 67, 57, 7,117,110,105, + 48, 49, 67, 65, 7,117,110,105, 48, 49, 67, 66, 7,117,110,105, 48, 49, 67, 67, 7,117,110,105, 48, 49, 67, 68, 7,117,110,105, + 48, 49, 67, 69, 7,117,110,105, 48, 49, 67, 70, 7,117,110,105, 48, 49, 68, 48, 7,117,110,105, 48, 49, 68, 49, 7,117,110,105, + 48, 49, 68, 50, 7,117,110,105, 48, 49, 68, 51, 7,117,110,105, 48, 49, 68, 52, 7,117,110,105, 48, 49, 68, 53, 7,117,110,105, + 48, 49, 68, 54, 7,117,110,105, 48, 49, 68, 55, 7,117,110,105, 48, 49, 68, 56, 7,117,110,105, 48, 49, 68, 57, 7,117,110,105, + 48, 49, 68, 65, 7,117,110,105, 48, 49, 68, 66, 7,117,110,105, 48, 49, 68, 67, 7,117,110,105, 48, 49, 68, 68, 7,117,110,105, + 48, 49, 68, 69, 7,117,110,105, 48, 49, 68, 70, 7,117,110,105, 48, 49, 69, 48, 7,117,110,105, 48, 49, 69, 49, 7,117,110,105, + 48, 49, 69, 50, 7,117,110,105, 48, 49, 69, 51, 7,117,110,105, 48, 49, 69, 52, 7,117,110,105, 48, 49, 69, 53, 6, 71, 99, 97, +114,111,110, 6,103, 99, 97,114,111,110, 7,117,110,105, 48, 49, 69, 56, 7,117,110,105, 48, 49, 69, 57, 7,117,110,105, 48, 49, + 69, 65, 7,117,110,105, 48, 49, 69, 66, 7,117,110,105, 48, 49, 69, 67, 7,117,110,105, 48, 49, 69, 68, 7,117,110,105, 48, 49, + 69, 69, 7,117,110,105, 48, 49, 69, 70, 7,117,110,105, 48, 49, 70, 48, 7,117,110,105, 48, 49, 70, 49, 7,117,110,105, 48, 49, + 70, 50, 7,117,110,105, 48, 49, 70, 51, 7,117,110,105, 48, 49, 70, 52, 7,117,110,105, 48, 49, 70, 53, 7,117,110,105, 48, 49, + 70, 54, 7,117,110,105, 48, 49, 70, 55, 7,117,110,105, 48, 49, 70, 56, 7,117,110,105, 48, 49, 70, 57, 10, 65,114,105,110,103, + 97, 99,117,116,101, 10, 97,114,105,110,103, 97, 99,117,116,101, 7, 65, 69, 97, 99,117,116,101, 7, 97,101, 97, 99,117,116,101, + 11, 79,115,108, 97,115,104, 97, 99,117,116,101, 11,111,115,108, 97,115,104, 97, 99,117,116,101, 7,117,110,105, 48, 50, 48, 48, + 7,117,110,105, 48, 50, 48, 49, 7,117,110,105, 48, 50, 48, 50, 7,117,110,105, 48, 50, 48, 51, 7,117,110,105, 48, 50, 48, 52, + 7,117,110,105, 48, 50, 48, 53, 7,117,110,105, 48, 50, 48, 54, 7,117,110,105, 48, 50, 48, 55, 7,117,110,105, 48, 50, 48, 56, + 7,117,110,105, 48, 50, 48, 57, 7,117,110,105, 48, 50, 48, 65, 7,117,110,105, 48, 50, 48, 66, 7,117,110,105, 48, 50, 48, 67, + 7,117,110,105, 48, 50, 48, 68, 7,117,110,105, 48, 50, 48, 69, 7,117,110,105, 48, 50, 48, 70, 7,117,110,105, 48, 50, 49, 48, + 7,117,110,105, 48, 50, 49, 49, 7,117,110,105, 48, 50, 49, 50, 7,117,110,105, 48, 50, 49, 51, 7,117,110,105, 48, 50, 49, 52, + 7,117,110,105, 48, 50, 49, 53, 7,117,110,105, 48, 50, 49, 54, 7,117,110,105, 48, 50, 49, 55, 12, 83, 99,111,109,109, 97, 97, + 99, 99,101,110,116, 12,115, 99,111,109,109, 97, 97, 99, 99,101,110,116, 7,117,110,105, 48, 50, 49, 65, 7,117,110,105, 48, 50, + 49, 66, 7,117,110,105, 48, 50, 49, 67, 7,117,110,105, 48, 50, 49, 68, 7,117,110,105, 48, 50, 49, 69, 7,117,110,105, 48, 50, + 49, 70, 7,117,110,105, 48, 50, 50, 48, 7,117,110,105, 48, 50, 50, 49, 7,117,110,105, 48, 50, 50, 50, 7,117,110,105, 48, 50, + 50, 51, 7,117,110,105, 48, 50, 50, 52, 7,117,110,105, 48, 50, 50, 53, 7,117,110,105, 48, 50, 50, 54, 7,117,110,105, 48, 50, + 50, 55, 7,117,110,105, 48, 50, 50, 56, 7,117,110,105, 48, 50, 50, 57, 7,117,110,105, 48, 50, 50, 65, 7,117,110,105, 48, 50, + 50, 66, 7,117,110,105, 48, 50, 50, 67, 7,117,110,105, 48, 50, 50, 68, 7,117,110,105, 48, 50, 50, 69, 7,117,110,105, 48, 50, + 50, 70, 7,117,110,105, 48, 50, 51, 48, 7,117,110,105, 48, 50, 51, 49, 7,117,110,105, 48, 50, 51, 50, 7,117,110,105, 48, 50, + 51, 51, 7,117,110,105, 48, 50, 51, 52, 7,117,110,105, 48, 50, 51, 53, 7,117,110,105, 48, 50, 51, 54, 8,100,111,116,108,101, +115,115,106, 7,117,110,105, 48, 50, 51, 56, 7,117,110,105, 48, 50, 51, 57, 7,117,110,105, 48, 50, 51, 65, 7,117,110,105, 48, + 50, 51, 66, 7,117,110,105, 48, 50, 51, 67, 7,117,110,105, 48, 50, 51, 68, 7,117,110,105, 48, 50, 51, 69, 7,117,110,105, 48, + 50, 51, 70, 7,117,110,105, 48, 50, 52, 48, 7,117,110,105, 48, 50, 52, 49, 7,117,110,105, 48, 50, 53, 57, 7,117,110,105, 48, + 50, 54, 50, 7,117,110,105, 48, 50, 55, 48, 7,117,110,105, 48, 50, 55, 53, 7,117,110,105, 48, 50, 57, 50, 7,117,110,105, 48, + 50, 66, 48, 7,117,110,105, 48, 50, 66, 49, 7,117,110,105, 48, 50, 66, 50, 7,117,110,105, 48, 50, 66, 51, 7,117,110,105, 48, + 50, 66, 52, 7,117,110,105, 48, 50, 66, 53, 7,117,110,105, 48, 50, 66, 54, 7,117,110,105, 48, 50, 66, 55, 7,117,110,105, 48, + 50, 66, 56, 7,117,110,105, 48, 50, 66, 57, 7,117,110,105, 48, 50, 66, 65, 7,117,110,105, 48, 50, 66, 66, 9, 97,102,105,105, + 53, 55, 57, 50, 57, 9, 97,102,105,105, 54, 52, 57, 51, 55, 7,117,110,105, 48, 50, 66, 69, 7,117,110,105, 48, 50, 66, 70, 7, +117,110,105, 48, 50, 67, 48, 7,117,110,105, 48, 50, 67, 49, 7,117,110,105, 48, 50, 67, 50, 7,117,110,105, 48, 50, 67, 51, 7, +117,110,105, 48, 50, 67, 52, 7,117,110,105, 48, 50, 67, 53, 7,117,110,105, 48, 50, 67, 56, 7,117,110,105, 48, 50, 67, 57, 7, +117,110,105, 48, 50, 67, 65, 7,117,110,105, 48, 50, 67, 66, 7,117,110,105, 48, 50, 67, 67, 7,117,110,105, 48, 50, 67, 68, 7, +117,110,105, 48, 50, 67, 69, 7,117,110,105, 48, 50, 67, 70, 7,117,110,105, 48, 50, 68, 48, 7,117,110,105, 48, 50, 68, 49, 7, +117,110,105, 48, 50, 68, 50, 7,117,110,105, 48, 50, 68, 51, 7,117,110,105, 48, 50, 68, 52, 7,117,110,105, 48, 50, 68, 53, 7, +117,110,105, 48, 50, 68, 54, 7,117,110,105, 48, 50, 68, 55, 7,117,110,105, 48, 50, 68, 69, 7,117,110,105, 48, 50, 68, 70, 7, +117,110,105, 48, 50, 69, 48, 7,117,110,105, 48, 50, 69, 49, 7,117,110,105, 48, 50, 69, 50, 7,117,110,105, 48, 50, 69, 51, 7, +117,110,105, 48, 50, 69, 52, 7,117,110,105, 48, 50, 69, 53, 7,117,110,105, 48, 50, 69, 54, 7,117,110,105, 48, 50, 69, 55, 7, +117,110,105, 48, 50, 69, 56, 7,117,110,105, 48, 50, 69, 57, 7,117,110,105, 48, 50, 69, 67, 7,117,110,105, 48, 50, 69, 68, 7, +117,110,105, 48, 50, 69, 69, 7,117,110,105, 48, 50, 70, 51, 7,117,110,105, 48, 50, 70, 55, 9,103,114, 97,118,101, 99,111,109, + 98, 9, 97, 99,117,116,101, 99,111,109, 98, 7,117,110,105, 48, 51, 48, 50, 9,116,105,108,100,101, 99,111,109, 98, 7,117,110, +105, 48, 51, 48, 52, 7,117,110,105, 48, 51, 48, 53, 7,117,110,105, 48, 51, 48, 54, 7,117,110,105, 48, 51, 48, 55, 7,117,110, +105, 48, 51, 48, 56, 13,104,111,111,107, 97, 98,111,118,101, 99,111,109, 98, 7,117,110,105, 48, 51, 48, 65, 7,117,110,105, 48, + 51, 48, 66, 7,117,110,105, 48, 51, 48, 67, 7,117,110,105, 48, 51, 48, 68, 7,117,110,105, 48, 51, 48, 69, 7,117,110,105, 48, + 51, 48, 70, 7,117,110,105, 48, 51, 49, 48, 7,117,110,105, 48, 51, 49, 49, 7,117,110,105, 48, 51, 49, 50, 7,117,110,105, 48, + 51, 49, 51, 7,117,110,105, 48, 51, 49, 52, 7,117,110,105, 48, 51, 49, 53, 7,117,110,105, 48, 51, 49, 54, 7,117,110,105, 48, + 51, 49, 55, 7,117,110,105, 48, 51, 49, 56, 7,117,110,105, 48, 51, 49, 57, 7,117,110,105, 48, 51, 49, 65, 7,117,110,105, 48, + 51, 49, 66, 7,117,110,105, 48, 51, 49, 67, 7,117,110,105, 48, 51, 49, 68, 7,117,110,105, 48, 51, 49, 69, 7,117,110,105, 48, + 51, 49, 70, 7,117,110,105, 48, 51, 50, 48, 7,117,110,105, 48, 51, 50, 49, 7,117,110,105, 48, 51, 50, 50, 12,100,111,116, 98, +101,108,111,119, 99,111,109, 98, 7,117,110,105, 48, 51, 50, 52, 7,117,110,105, 48, 51, 50, 53, 7,117,110,105, 48, 51, 50, 54, + 7,117,110,105, 48, 51, 50, 55, 7,117,110,105, 48, 51, 50, 56, 7,117,110,105, 48, 51, 50, 57, 7,117,110,105, 48, 51, 50, 65, + 7,117,110,105, 48, 51, 50, 66, 7,117,110,105, 48, 51, 50, 67, 7,117,110,105, 48, 51, 50, 68, 7,117,110,105, 48, 51, 50, 69, + 7,117,110,105, 48, 51, 50, 70, 7,117,110,105, 48, 51, 51, 48, 7,117,110,105, 48, 51, 51, 49, 7,117,110,105, 48, 51, 51, 50, + 7,117,110,105, 48, 51, 51, 51, 7,117,110,105, 48, 51, 51, 52, 7,117,110,105, 48, 51, 51, 53, 7,117,110,105, 48, 51, 51, 54, + 7,117,110,105, 48, 51, 51, 55, 7,117,110,105, 48, 51, 51, 56, 7,117,110,105, 48, 51, 51, 57, 7,117,110,105, 48, 51, 51, 65, + 7,117,110,105, 48, 51, 51, 66, 7,117,110,105, 48, 51, 51, 67, 7,117,110,105, 48, 51, 51, 68, 7,117,110,105, 48, 51, 51, 69, + 7,117,110,105, 48, 51, 51, 70, 7,117,110,105, 48, 51, 52, 48, 7,117,110,105, 48, 51, 52, 49, 7,117,110,105, 48, 51, 52, 50, + 7,117,110,105, 48, 51, 52, 51, 7,117,110,105, 48, 51, 52, 52, 7,117,110,105, 48, 51, 52, 53, 7,117,110,105, 48, 51, 52, 54, + 7,117,110,105, 48, 51, 52, 55, 7,117,110,105, 48, 51, 52, 56, 7,117,110,105, 48, 51, 52, 57, 7,117,110,105, 48, 51, 52, 65, + 7,117,110,105, 48, 51, 52, 66, 7,117,110,105, 48, 51, 52, 67, 7,117,110,105, 48, 51, 52, 68, 7,117,110,105, 48, 51, 52, 69, + 7,117,110,105, 48, 51, 53, 49, 7,117,110,105, 48, 51, 53, 50, 7,117,110,105, 48, 51, 53, 51, 7,117,110,105, 48, 51, 53, 55, + 7,117,110,105, 48, 51, 53, 56, 7,117,110,105, 48, 51, 53, 67, 7,117,110,105, 48, 51, 53, 68, 7,117,110,105, 48, 51, 54, 48, + 7,117,110,105, 48, 51, 54, 49, 7,117,110,105, 48, 51, 54, 50, 7,117,110,105, 48, 51, 55, 52, 7,117,110,105, 48, 51, 55, 53, + 7,117,110,105, 48, 51, 55, 65, 7,117,110,105, 48, 51, 55, 69, 5,116,111,110,111,115, 13,100,105,101,114,101,115,105,115,116, +111,110,111,115, 10, 65,108,112,104, 97,116,111,110,111,115, 9, 97,110,111,116,101,108,101,105, 97, 12, 69,112,115,105,108,111, +110,116,111,110,111,115, 8, 69,116, 97,116,111,110,111,115, 9, 73,111,116, 97,116,111,110,111,115, 12, 79,109,105, 99,114,111, +110,116,111,110,111,115, 12, 85,112,115,105,108,111,110,116,111,110,111,115, 10, 79,109,101,103, 97,116,111,110,111,115, 17,105, +111,116, 97,100,105,101,114,101,115,105,115,116,111,110,111,115, 5, 65,108,112,104, 97, 4, 66,101,116, 97, 5, 71, 97,109,109, + 97, 7,117,110,105, 48, 51, 57, 52, 7, 69,112,115,105,108,111,110, 4, 90,101,116, 97, 3, 69,116, 97, 5, 84,104,101,116, 97, + 4, 73,111,116, 97, 5, 75, 97,112,112, 97, 6, 76, 97,109, 98,100, 97, 2, 77,117, 2, 78,117, 2, 88,105, 7, 79,109,105, 99, +114,111,110, 2, 80,105, 3, 82,104,111, 5, 83,105,103,109, 97, 3, 84, 97,117, 7, 85,112,115,105,108,111,110, 3, 80,104,105, + 3, 67,104,105, 3, 80,115,105, 12, 73,111,116, 97,100,105,101,114,101,115,105,115, 15, 85,112,115,105,108,111,110,100,105,101, +114,101,115,105,115, 10, 97,108,112,104, 97,116,111,110,111,115, 12,101,112,115,105,108,111,110,116,111,110,111,115, 8,101,116, + 97,116,111,110,111,115, 9,105,111,116, 97,116,111,110,111,115, 20,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115, +116,111,110,111,115, 5, 97,108,112,104, 97, 4, 98,101,116, 97, 5,103, 97,109,109, 97, 5,100,101,108,116, 97, 7,101,112,115, +105,108,111,110, 4,122,101,116, 97, 3,101,116, 97, 5,116,104,101,116, 97, 4,105,111,116, 97, 5,107, 97,112,112, 97, 6,108, + 97,109, 98,100, 97, 7,117,110,105, 48, 51, 66, 67, 2,110,117, 2,120,105, 7,111,109,105, 99,114,111,110, 3,114,104,111, 6, +115,105,103,109, 97, 49, 5,115,105,103,109, 97, 3,116, 97,117, 7,117,112,115,105,108,111,110, 3,112,104,105, 3, 99,104,105, + 3,112,115,105, 5,111,109,101,103, 97, 12,105,111,116, 97,100,105,101,114,101,115,105,115, 15,117,112,115,105,108,111,110,100, +105,101,114,101,115,105,115, 12,111,109,105, 99,114,111,110,116,111,110,111,115, 12,117,112,115,105,108,111,110,116,111,110,111, +115, 10,111,109,101,103, 97,116,111,110,111,115, 7,117,110,105, 48, 51, 68, 48, 6,116,104,101,116, 97, 49, 8, 85,112,115,105, +108,111,110, 49, 7,117,110,105, 48, 51, 68, 51, 7,117,110,105, 48, 51, 68, 52, 4,112,104,105, 49, 6,111,109,101,103, 97, 49, + 7,117,110,105, 48, 51, 68, 55, 7,117,110,105, 48, 51, 68, 56, 7,117,110,105, 48, 51, 68, 57, 7,117,110,105, 48, 51, 68, 65, + 7,117,110,105, 48, 51, 68, 66, 7,117,110,105, 48, 51, 68, 67, 7,117,110,105, 48, 51, 68, 68, 7,117,110,105, 48, 51, 68, 69, + 7,117,110,105, 48, 51, 68, 70, 7,117,110,105, 48, 51, 69, 48, 7,117,110,105, 48, 51, 69, 49, 7,117,110,105, 48, 51, 69, 50, + 7,117,110,105, 48, 51, 69, 51, 7,117,110,105, 48, 51, 69, 52, 7,117,110,105, 48, 51, 69, 53, 7,117,110,105, 48, 51, 69, 54, + 7,117,110,105, 48, 51, 69, 55, 7,117,110,105, 48, 51, 69, 56, 7,117,110,105, 48, 51, 69, 57, 7,117,110,105, 48, 51, 69, 65, + 7,117,110,105, 48, 51, 69, 66, 7,117,110,105, 48, 51, 69, 67, 7,117,110,105, 48, 51, 69, 68, 7,117,110,105, 48, 51, 69, 69, + 7,117,110,105, 48, 51, 69, 70, 7,117,110,105, 48, 51, 70, 48, 7,117,110,105, 48, 51, 70, 49, 7,117,110,105, 48, 51, 70, 50, + 7,117,110,105, 48, 51, 70, 51, 7,117,110,105, 48, 51, 70, 52, 7,117,110,105, 48, 51, 70, 53, 7,117,110,105, 48, 51, 70, 54, + 7,117,110,105, 48, 51, 70, 55, 7,117,110,105, 48, 51, 70, 56, 7,117,110,105, 48, 51, 70, 57, 7,117,110,105, 48, 51, 70, 65, + 7,117,110,105, 48, 51, 70, 66, 7,117,110,105, 48, 51, 70, 67, 7,117,110,105, 48, 51, 70, 68, 7,117,110,105, 48, 51, 70, 69, + 7,117,110,105, 48, 51, 70, 70, 7,117,110,105, 48, 52, 48, 48, 9, 97,102,105,105, 49, 48, 48, 50, 51, 9, 97,102,105,105, 49, + 48, 48, 53, 49, 9, 97,102,105,105, 49, 48, 48, 53, 50, 9, 97,102,105,105, 49, 48, 48, 53, 51, 9, 97,102,105,105, 49, 48, 48, + 53, 52, 9, 97,102,105,105, 49, 48, 48, 53, 53, 9, 97,102,105,105, 49, 48, 48, 53, 54, 9, 97,102,105,105, 49, 48, 48, 53, 55, + 9, 97,102,105,105, 49, 48, 48, 53, 56, 9, 97,102,105,105, 49, 48, 48, 53, 57, 9, 97,102,105,105, 49, 48, 48, 54, 48, 9, 97, +102,105,105, 49, 48, 48, 54, 49, 7,117,110,105, 48, 52, 48, 68, 9, 97,102,105,105, 49, 48, 48, 54, 50, 9, 97,102,105,105, 49, + 48, 49, 52, 53, 9, 97,102,105,105, 49, 48, 48, 49, 55, 9, 97,102,105,105, 49, 48, 48, 49, 56, 9, 97,102,105,105, 49, 48, 48, + 49, 57, 9, 97,102,105,105, 49, 48, 48, 50, 48, 9, 97,102,105,105, 49, 48, 48, 50, 49, 9, 97,102,105,105, 49, 48, 48, 50, 50, + 9, 97,102,105,105, 49, 48, 48, 50, 52, 9, 97,102,105,105, 49, 48, 48, 50, 53, 9, 97,102,105,105, 49, 48, 48, 50, 54, 9, 97, +102,105,105, 49, 48, 48, 50, 55, 9, 97,102,105,105, 49, 48, 48, 50, 56, 9, 97,102,105,105, 49, 48, 48, 50, 57, 9, 97,102,105, +105, 49, 48, 48, 51, 48, 9, 97,102,105,105, 49, 48, 48, 51, 49, 9, 97,102,105,105, 49, 48, 48, 51, 50, 9, 97,102,105,105, 49, + 48, 48, 51, 51, 9, 97,102,105,105, 49, 48, 48, 51, 52, 9, 97,102,105,105, 49, 48, 48, 51, 53, 9, 97,102,105,105, 49, 48, 48, + 51, 54, 9, 97,102,105,105, 49, 48, 48, 51, 55, 9, 97,102,105,105, 49, 48, 48, 51, 56, 9, 97,102,105,105, 49, 48, 48, 51, 57, + 9, 97,102,105,105, 49, 48, 48, 52, 48, 9, 97,102,105,105, 49, 48, 48, 52, 49, 9, 97,102,105,105, 49, 48, 48, 52, 50, 9, 97, +102,105,105, 49, 48, 48, 52, 51, 9, 97,102,105,105, 49, 48, 48, 52, 52, 9, 97,102,105,105, 49, 48, 48, 52, 53, 9, 97,102,105, +105, 49, 48, 48, 52, 54, 9, 97,102,105,105, 49, 48, 48, 52, 55, 9, 97,102,105,105, 49, 48, 48, 52, 56, 9, 97,102,105,105, 49, + 48, 48, 52, 57, 9, 97,102,105,105, 49, 48, 48, 54, 53, 9, 97,102,105,105, 49, 48, 48, 54, 54, 9, 97,102,105,105, 49, 48, 48, + 54, 55, 9, 97,102,105,105, 49, 48, 48, 54, 56, 9, 97,102,105,105, 49, 48, 48, 54, 57, 9, 97,102,105,105, 49, 48, 48, 55, 48, + 9, 97,102,105,105, 49, 48, 48, 55, 50, 9, 97,102,105,105, 49, 48, 48, 55, 51, 9, 97,102,105,105, 49, 48, 48, 55, 52, 9, 97, +102,105,105, 49, 48, 48, 55, 53, 9, 97,102,105,105, 49, 48, 48, 55, 54, 9, 97,102,105,105, 49, 48, 48, 55, 55, 9, 97,102,105, +105, 49, 48, 48, 55, 56, 9, 97,102,105,105, 49, 48, 48, 55, 57, 9, 97,102,105,105, 49, 48, 48, 56, 48, 9, 97,102,105,105, 49, + 48, 48, 56, 49, 9, 97,102,105,105, 49, 48, 48, 56, 50, 9, 97,102,105,105, 49, 48, 48, 56, 51, 9, 97,102,105,105, 49, 48, 48, + 56, 52, 9, 97,102,105,105, 49, 48, 48, 56, 53, 9, 97,102,105,105, 49, 48, 48, 56, 54, 9, 97,102,105,105, 49, 48, 48, 56, 55, + 9, 97,102,105,105, 49, 48, 48, 56, 56, 9, 97,102,105,105, 49, 48, 48, 56, 57, 9, 97,102,105,105, 49, 48, 48, 57, 48, 9, 97, +102,105,105, 49, 48, 48, 57, 49, 9, 97,102,105,105, 49, 48, 48, 57, 50, 9, 97,102,105,105, 49, 48, 48, 57, 51, 9, 97,102,105, +105, 49, 48, 48, 57, 52, 9, 97,102,105,105, 49, 48, 48, 57, 53, 9, 97,102,105,105, 49, 48, 48, 57, 54, 9, 97,102,105,105, 49, + 48, 48, 57, 55, 7,117,110,105, 48, 52, 53, 48, 9, 97,102,105,105, 49, 48, 48, 55, 49, 9, 97,102,105,105, 49, 48, 48, 57, 57, + 9, 97,102,105,105, 49, 48, 49, 48, 48, 9, 97,102,105,105, 49, 48, 49, 48, 49, 9, 97,102,105,105, 49, 48, 49, 48, 50, 9, 97, +102,105,105, 49, 48, 49, 48, 51, 9, 97,102,105,105, 49, 48, 49, 48, 52, 9, 97,102,105,105, 49, 48, 49, 48, 53, 9, 97,102,105, +105, 49, 48, 49, 48, 54, 9, 97,102,105,105, 49, 48, 49, 48, 55, 9, 97,102,105,105, 49, 48, 49, 48, 56, 9, 97,102,105,105, 49, + 48, 49, 48, 57, 7,117,110,105, 48, 52, 53, 68, 9, 97,102,105,105, 49, 48, 49, 49, 48, 9, 97,102,105,105, 49, 48, 49, 57, 51, + 7,117,110,105, 48, 52, 54, 48, 7,117,110,105, 48, 52, 54, 49, 9, 97,102,105,105, 49, 48, 49, 52, 54, 9, 97,102,105,105, 49, + 48, 49, 57, 52, 7,117,110,105, 48, 52, 54, 52, 7,117,110,105, 48, 52, 54, 53, 7,117,110,105, 48, 52, 54, 54, 7,117,110,105, + 48, 52, 54, 55, 7,117,110,105, 48, 52, 54, 56, 7,117,110,105, 48, 52, 54, 57, 7,117,110,105, 48, 52, 54, 65, 7,117,110,105, + 48, 52, 54, 66, 7,117,110,105, 48, 52, 54, 67, 7,117,110,105, 48, 52, 54, 68, 7,117,110,105, 48, 52, 54, 69, 7,117,110,105, + 48, 52, 54, 70, 7,117,110,105, 48, 52, 55, 48, 7,117,110,105, 48, 52, 55, 49, 9, 97,102,105,105, 49, 48, 49, 52, 55, 9, 97, +102,105,105, 49, 48, 49, 57, 53, 9, 97,102,105,105, 49, 48, 49, 52, 56, 9, 97,102,105,105, 49, 48, 49, 57, 54, 7,117,110,105, + 48, 52, 55, 54, 7,117,110,105, 48, 52, 55, 55, 7,117,110,105, 48, 52, 55, 56, 7,117,110,105, 48, 52, 55, 57, 7,117,110,105, + 48, 52, 55, 65, 7,117,110,105, 48, 52, 55, 66, 7,117,110,105, 48, 52, 55, 67, 7,117,110,105, 48, 52, 55, 68, 7,117,110,105, + 48, 52, 55, 69, 7,117,110,105, 48, 52, 55, 70, 7,117,110,105, 48, 52, 56, 48, 7,117,110,105, 48, 52, 56, 49, 7,117,110,105, + 48, 52, 56, 50, 7,117,110,105, 48, 52, 56, 51, 7,117,110,105, 48, 52, 56, 52, 7,117,110,105, 48, 52, 56, 53, 7,117,110,105, + 48, 52, 56, 54, 7,117,110,105, 48, 52, 56, 56, 7,117,110,105, 48, 52, 56, 57, 7,117,110,105, 48, 52, 56, 65, 7,117,110,105, + 48, 52, 56, 66, 7,117,110,105, 48, 52, 56, 67, 7,117,110,105, 48, 52, 56, 68, 7,117,110,105, 48, 52, 56, 69, 7,117,110,105, + 48, 52, 56, 70, 9, 97,102,105,105, 49, 48, 48, 53, 48, 9, 97,102,105,105, 49, 48, 48, 57, 56, 7,117,110,105, 48, 52, 57, 50, + 7,117,110,105, 48, 52, 57, 51, 7,117,110,105, 48, 52, 57, 52, 7,117,110,105, 48, 52, 57, 53, 7,117,110,105, 48, 52, 57, 54, + 7,117,110,105, 48, 52, 57, 55, 7,117,110,105, 48, 52, 57, 56, 7,117,110,105, 48, 52, 57, 57, 7,117,110,105, 48, 52, 57, 65, + 7,117,110,105, 48, 52, 57, 66, 7,117,110,105, 48, 52, 57, 67, 7,117,110,105, 48, 52, 57, 68, 7,117,110,105, 48, 52, 57, 69, + 7,117,110,105, 48, 52, 57, 70, 7,117,110,105, 48, 52, 65, 48, 7,117,110,105, 48, 52, 65, 49, 7,117,110,105, 48, 52, 65, 50, + 7,117,110,105, 48, 52, 65, 51, 7,117,110,105, 48, 52, 65, 52, 7,117,110,105, 48, 52, 65, 53, 7,117,110,105, 48, 52, 65, 54, + 7,117,110,105, 48, 52, 65, 55, 7,117,110,105, 48, 52, 65, 56, 7,117,110,105, 48, 52, 65, 57, 7,117,110,105, 48, 52, 65, 65, + 7,117,110,105, 48, 52, 65, 66, 7,117,110,105, 48, 52, 65, 67, 7,117,110,105, 48, 52, 65, 68, 7,117,110,105, 48, 52, 65, 69, + 7,117,110,105, 48, 52, 65, 70, 7,117,110,105, 48, 52, 66, 48, 7,117,110,105, 48, 52, 66, 49, 7,117,110,105, 48, 52, 66, 50, + 7,117,110,105, 48, 52, 66, 51, 7,117,110,105, 48, 52, 66, 52, 7,117,110,105, 48, 52, 66, 53, 7,117,110,105, 48, 52, 66, 54, + 7,117,110,105, 48, 52, 66, 55, 7,117,110,105, 48, 52, 66, 56, 7,117,110,105, 48, 52, 66, 57, 7,117,110,105, 48, 52, 66, 65, + 7,117,110,105, 48, 52, 66, 66, 7,117,110,105, 48, 52, 66, 67, 7,117,110,105, 48, 52, 66, 68, 7,117,110,105, 48, 52, 66, 69, + 7,117,110,105, 48, 52, 66, 70, 7,117,110,105, 48, 52, 67, 48, 7,117,110,105, 48, 52, 67, 49, 7,117,110,105, 48, 52, 67, 50, + 7,117,110,105, 48, 52, 67, 51, 7,117,110,105, 48, 52, 67, 52, 7,117,110,105, 48, 52, 67, 53, 7,117,110,105, 48, 52, 67, 54, + 7,117,110,105, 48, 52, 67, 55, 7,117,110,105, 48, 52, 67, 56, 7,117,110,105, 48, 52, 67, 57, 7,117,110,105, 48, 52, 67, 65, + 7,117,110,105, 48, 52, 67, 66, 7,117,110,105, 48, 52, 67, 67, 7,117,110,105, 48, 52, 67, 68, 7,117,110,105, 48, 52, 67, 69, + 7,117,110,105, 48, 52, 68, 48, 7,117,110,105, 48, 52, 68, 49, 7,117,110,105, 48, 52, 68, 50, 7,117,110,105, 48, 52, 68, 51, + 7,117,110,105, 48, 52, 68, 52, 7,117,110,105, 48, 52, 68, 53, 7,117,110,105, 48, 52, 68, 54, 7,117,110,105, 48, 52, 68, 55, + 7,117,110,105, 48, 52, 68, 56, 9, 97,102,105,105, 49, 48, 56, 52, 54, 7,117,110,105, 48, 52, 68, 65, 7,117,110,105, 48, 52, + 68, 66, 7,117,110,105, 48, 52, 68, 67, 7,117,110,105, 48, 52, 68, 68, 7,117,110,105, 48, 52, 68, 69, 7,117,110,105, 48, 52, + 68, 70, 7,117,110,105, 48, 52, 69, 48, 7,117,110,105, 48, 52, 69, 49, 7,117,110,105, 48, 52, 69, 50, 7,117,110,105, 48, 52, + 69, 51, 7,117,110,105, 48, 52, 69, 52, 7,117,110,105, 48, 52, 69, 53, 7,117,110,105, 48, 52, 69, 54, 7,117,110,105, 48, 52, + 69, 55, 7,117,110,105, 48, 52, 69, 56, 7,117,110,105, 48, 52, 69, 57, 7,117,110,105, 48, 52, 69, 65, 7,117,110,105, 48, 52, + 69, 66, 7,117,110,105, 48, 52, 69, 67, 7,117,110,105, 48, 52, 69, 68, 7,117,110,105, 48, 52, 69, 69, 7,117,110,105, 48, 52, + 69, 70, 7,117,110,105, 48, 52, 70, 48, 7,117,110,105, 48, 52, 70, 49, 7,117,110,105, 48, 52, 70, 50, 7,117,110,105, 48, 52, + 70, 51, 7,117,110,105, 48, 52, 70, 52, 7,117,110,105, 48, 52, 70, 53, 7,117,110,105, 48, 52, 70, 54, 7,117,110,105, 48, 52, + 70, 55, 7,117,110,105, 48, 52, 70, 56, 7,117,110,105, 48, 52, 70, 57, 7,117,110,105, 48, 53, 48, 48, 7,117,110,105, 48, 53, + 48, 49, 7,117,110,105, 48, 53, 48, 50, 7,117,110,105, 48, 53, 48, 51, 7,117,110,105, 48, 53, 48, 52, 7,117,110,105, 48, 53, + 48, 53, 7,117,110,105, 48, 53, 48, 54, 7,117,110,105, 48, 53, 48, 55, 7,117,110,105, 48, 53, 48, 56, 7,117,110,105, 48, 53, + 48, 57, 7,117,110,105, 48, 53, 48, 65, 7,117,110,105, 48, 53, 48, 66, 7,117,110,105, 48, 53, 48, 67, 7,117,110,105, 48, 53, + 48, 68, 7,117,110,105, 48, 53, 48, 69, 7,117,110,105, 48, 53, 48, 70, 7,117,110,105, 48, 53, 51, 49, 7,117,110,105, 48, 53, + 51, 50, 7,117,110,105, 48, 53, 51, 51, 7,117,110,105, 48, 53, 51, 52, 7,117,110,105, 48, 53, 51, 53, 7,117,110,105, 48, 53, + 51, 54, 7,117,110,105, 48, 53, 51, 55, 7,117,110,105, 48, 53, 51, 56, 7,117,110,105, 48, 53, 51, 57, 7,117,110,105, 48, 53, + 51, 65, 7,117,110,105, 48, 53, 51, 66, 7,117,110,105, 48, 53, 51, 67, 7,117,110,105, 48, 53, 51, 68, 7,117,110,105, 48, 53, + 51, 69, 7,117,110,105, 48, 53, 51, 70, 7,117,110,105, 48, 53, 52, 48, 7,117,110,105, 48, 53, 52, 49, 7,117,110,105, 48, 53, + 52, 50, 7,117,110,105, 48, 53, 52, 51, 7,117,110,105, 48, 53, 52, 52, 7,117,110,105, 48, 53, 52, 53, 7,117,110,105, 48, 53, + 52, 54, 7,117,110,105, 48, 53, 52, 55, 7,117,110,105, 48, 53, 52, 56, 7,117,110,105, 48, 53, 52, 57, 7,117,110,105, 48, 53, + 52, 65, 7,117,110,105, 48, 53, 52, 66, 7,117,110,105, 48, 53, 52, 67, 7,117,110,105, 48, 53, 52, 68, 7,117,110,105, 48, 53, + 52, 69, 7,117,110,105, 48, 53, 52, 70, 7,117,110,105, 48, 53, 53, 48, 7,117,110,105, 48, 53, 53, 49, 7,117,110,105, 48, 53, + 53, 50, 7,117,110,105, 48, 53, 53, 51, 7,117,110,105, 48, 53, 53, 52, 7,117,110,105, 48, 53, 53, 53, 7,117,110,105, 48, 53, + 53, 54, 7,117,110,105, 48, 53, 53, 57, 7,117,110,105, 48, 53, 53, 65, 7,117,110,105, 48, 53, 53, 66, 7,117,110,105, 48, 53, + 53, 67, 7,117,110,105, 48, 53, 53, 68, 7,117,110,105, 48, 53, 53, 69, 7,117,110,105, 48, 53, 53, 70, 7,117,110,105, 48, 53, + 54, 49, 7,117,110,105, 48, 53, 54, 50, 7,117,110,105, 48, 53, 54, 51, 7,117,110,105, 48, 53, 54, 52, 7,117,110,105, 48, 53, + 54, 53, 7,117,110,105, 48, 53, 54, 54, 7,117,110,105, 48, 53, 54, 55, 7,117,110,105, 48, 53, 54, 56, 7,117,110,105, 48, 53, + 54, 57, 7,117,110,105, 48, 53, 54, 65, 7,117,110,105, 48, 53, 54, 66, 7,117,110,105, 48, 53, 54, 67, 7,117,110,105, 48, 53, + 54, 68, 7,117,110,105, 48, 53, 54, 69, 7,117,110,105, 48, 53, 54, 70, 7,117,110,105, 48, 53, 55, 48, 7,117,110,105, 48, 53, + 55, 49, 7,117,110,105, 48, 53, 55, 50, 7,117,110,105, 48, 53, 55, 51, 7,117,110,105, 48, 53, 55, 52, 7,117,110,105, 48, 53, + 55, 53, 7,117,110,105, 48, 53, 55, 54, 7,117,110,105, 48, 53, 55, 55, 7,117,110,105, 48, 53, 55, 56, 7,117,110,105, 48, 53, + 55, 57, 7,117,110,105, 48, 53, 55, 65, 7,117,110,105, 48, 53, 55, 66, 7,117,110,105, 48, 53, 55, 67, 7,117,110,105, 48, 53, + 55, 68, 7,117,110,105, 48, 53, 55, 69, 7,117,110,105, 48, 53, 55, 70, 7,117,110,105, 48, 53, 56, 48, 7,117,110,105, 48, 53, + 56, 49, 7,117,110,105, 48, 53, 56, 50, 7,117,110,105, 48, 53, 56, 51, 7,117,110,105, 48, 53, 56, 52, 7,117,110,105, 48, 53, + 56, 53, 7,117,110,105, 48, 53, 56, 54, 7,117,110,105, 48, 53, 56, 55, 7,117,110,105, 48, 53, 56, 57, 7,117,110,105, 48, 53, + 56, 65, 9, 97,102,105,105, 53, 55, 51, 56, 56, 7,117,110,105, 49, 69, 48, 48, 7,117,110,105, 49, 69, 48, 49, 7,117,110,105, + 49, 69, 48, 50, 7,117,110,105, 49, 69, 48, 51, 7,117,110,105, 49, 69, 48, 52, 7,117,110,105, 49, 69, 48, 53, 7,117,110,105, + 49, 69, 48, 54, 7,117,110,105, 49, 69, 48, 55, 7,117,110,105, 49, 69, 48, 56, 7,117,110,105, 49, 69, 48, 57, 7,117,110,105, + 49, 69, 48, 65, 7,117,110,105, 49, 69, 48, 66, 7,117,110,105, 49, 69, 48, 67, 7,117,110,105, 49, 69, 48, 68, 7,117,110,105, + 49, 69, 48, 69, 7,117,110,105, 49, 69, 48, 70, 7,117,110,105, 49, 69, 49, 48, 7,117,110,105, 49, 69, 49, 49, 7,117,110,105, + 49, 69, 49, 50, 7,117,110,105, 49, 69, 49, 51, 7,117,110,105, 49, 69, 49, 52, 7,117,110,105, 49, 69, 49, 53, 7,117,110,105, + 49, 69, 49, 54, 7,117,110,105, 49, 69, 49, 55, 7,117,110,105, 49, 69, 49, 56, 7,117,110,105, 49, 69, 49, 57, 7,117,110,105, + 49, 69, 49, 65, 7,117,110,105, 49, 69, 49, 66, 7,117,110,105, 49, 69, 49, 67, 7,117,110,105, 49, 69, 49, 68, 7,117,110,105, + 49, 69, 49, 69, 7,117,110,105, 49, 69, 49, 70, 7,117,110,105, 49, 69, 50, 48, 7,117,110,105, 49, 69, 50, 49, 7,117,110,105, + 49, 69, 50, 50, 7,117,110,105, 49, 69, 50, 51, 7,117,110,105, 49, 69, 50, 52, 7,117,110,105, 49, 69, 50, 53, 7,117,110,105, + 49, 69, 50, 54, 7,117,110,105, 49, 69, 50, 55, 7,117,110,105, 49, 69, 50, 56, 7,117,110,105, 49, 69, 50, 57, 7,117,110,105, + 49, 69, 50, 65, 7,117,110,105, 49, 69, 50, 66, 7,117,110,105, 49, 69, 50, 67, 7,117,110,105, 49, 69, 50, 68, 7,117,110,105, + 49, 69, 50, 69, 7,117,110,105, 49, 69, 50, 70, 7,117,110,105, 49, 69, 51, 48, 7,117,110,105, 49, 69, 51, 49, 7,117,110,105, + 49, 69, 51, 50, 7,117,110,105, 49, 69, 51, 51, 7,117,110,105, 49, 69, 51, 52, 7,117,110,105, 49, 69, 51, 53, 7,117,110,105, + 49, 69, 51, 54, 7,117,110,105, 49, 69, 51, 55, 7,117,110,105, 49, 69, 51, 56, 7,117,110,105, 49, 69, 51, 57, 7,117,110,105, + 49, 69, 51, 65, 7,117,110,105, 49, 69, 51, 66, 7,117,110,105, 49, 69, 51, 67, 7,117,110,105, 49, 69, 51, 68, 7,117,110,105, + 49, 69, 51, 69, 7,117,110,105, 49, 69, 51, 70, 7,117,110,105, 49, 69, 52, 48, 7,117,110,105, 49, 69, 52, 49, 7,117,110,105, + 49, 69, 52, 50, 7,117,110,105, 49, 69, 52, 51, 7,117,110,105, 49, 69, 52, 52, 7,117,110,105, 49, 69, 52, 53, 7,117,110,105, + 49, 69, 52, 54, 7,117,110,105, 49, 69, 52, 55, 7,117,110,105, 49, 69, 52, 56, 7,117,110,105, 49, 69, 52, 57, 7,117,110,105, + 49, 69, 52, 65, 7,117,110,105, 49, 69, 52, 66, 7,117,110,105, 49, 69, 52, 67, 7,117,110,105, 49, 69, 52, 68, 7,117,110,105, + 49, 69, 52, 69, 7,117,110,105, 49, 69, 52, 70, 7,117,110,105, 49, 69, 53, 48, 7,117,110,105, 49, 69, 53, 49, 7,117,110,105, + 49, 69, 53, 50, 7,117,110,105, 49, 69, 53, 51, 7,117,110,105, 49, 69, 53, 52, 7,117,110,105, 49, 69, 53, 53, 7,117,110,105, + 49, 69, 53, 54, 7,117,110,105, 49, 69, 53, 55, 7,117,110,105, 49, 69, 53, 56, 7,117,110,105, 49, 69, 53, 57, 7,117,110,105, + 49, 69, 53, 65, 7,117,110,105, 49, 69, 53, 66, 7,117,110,105, 49, 69, 53, 67, 7,117,110,105, 49, 69, 53, 68, 7,117,110,105, + 49, 69, 53, 69, 7,117,110,105, 49, 69, 53, 70, 7,117,110,105, 49, 69, 54, 48, 7,117,110,105, 49, 69, 54, 49, 7,117,110,105, + 49, 69, 54, 50, 7,117,110,105, 49, 69, 54, 51, 7,117,110,105, 49, 69, 54, 52, 7,117,110,105, 49, 69, 54, 53, 7,117,110,105, + 49, 69, 54, 54, 7,117,110,105, 49, 69, 54, 55, 7,117,110,105, 49, 69, 54, 56, 7,117,110,105, 49, 69, 54, 57, 7,117,110,105, + 49, 69, 54, 65, 7,117,110,105, 49, 69, 54, 66, 7,117,110,105, 49, 69, 54, 67, 7,117,110,105, 49, 69, 54, 68, 7,117,110,105, + 49, 69, 54, 69, 7,117,110,105, 49, 69, 54, 70, 7,117,110,105, 49, 69, 55, 48, 7,117,110,105, 49, 69, 55, 49, 7,117,110,105, + 49, 69, 55, 50, 7,117,110,105, 49, 69, 55, 51, 7,117,110,105, 49, 69, 55, 52, 7,117,110,105, 49, 69, 55, 53, 7,117,110,105, + 49, 69, 55, 54, 7,117,110,105, 49, 69, 55, 55, 7,117,110,105, 49, 69, 55, 56, 7,117,110,105, 49, 69, 55, 57, 7,117,110,105, + 49, 69, 55, 65, 7,117,110,105, 49, 69, 55, 66, 7,117,110,105, 49, 69, 55, 67, 7,117,110,105, 49, 69, 55, 68, 7,117,110,105, + 49, 69, 55, 69, 7,117,110,105, 49, 69, 55, 70, 6, 87,103,114, 97,118,101, 6,119,103,114, 97,118,101, 6, 87, 97, 99,117,116, +101, 6,119, 97, 99,117,116,101, 9, 87,100,105,101,114,101,115,105,115, 9,119,100,105,101,114,101,115,105,115, 7,117,110,105, + 49, 69, 56, 54, 7,117,110,105, 49, 69, 56, 55, 7,117,110,105, 49, 69, 56, 56, 7,117,110,105, 49, 69, 56, 57, 7,117,110,105, + 49, 69, 56, 65, 7,117,110,105, 49, 69, 56, 66, 7,117,110,105, 49, 69, 56, 67, 7,117,110,105, 49, 69, 56, 68, 7,117,110,105, + 49, 69, 56, 69, 7,117,110,105, 49, 69, 56, 70, 7,117,110,105, 49, 69, 57, 48, 7,117,110,105, 49, 69, 57, 49, 7,117,110,105, + 49, 69, 57, 50, 7,117,110,105, 49, 69, 57, 51, 7,117,110,105, 49, 69, 57, 52, 7,117,110,105, 49, 69, 57, 53, 7,117,110,105, + 49, 69, 57, 54, 7,117,110,105, 49, 69, 57, 55, 7,117,110,105, 49, 69, 57, 56, 7,117,110,105, 49, 69, 57, 57, 7,117,110,105, + 49, 69, 57, 65, 7,117,110,105, 49, 69, 57, 66, 7,117,110,105, 49, 69, 65, 48, 7,117,110,105, 49, 69, 65, 49, 7,117,110,105, + 49, 69, 65, 50, 7,117,110,105, 49, 69, 65, 51, 7,117,110,105, 49, 69, 65, 52, 7,117,110,105, 49, 69, 65, 53, 7,117,110,105, + 49, 69, 65, 54, 7,117,110,105, 49, 69, 65, 55, 7,117,110,105, 49, 69, 65, 56, 7,117,110,105, 49, 69, 65, 57, 7,117,110,105, + 49, 69, 65, 65, 7,117,110,105, 49, 69, 65, 66, 7,117,110,105, 49, 69, 65, 67, 7,117,110,105, 49, 69, 65, 68, 7,117,110,105, + 49, 69, 65, 69, 7,117,110,105, 49, 69, 65, 70, 7,117,110,105, 49, 69, 66, 48, 7,117,110,105, 49, 69, 66, 49, 7,117,110,105, + 49, 69, 66, 50, 7,117,110,105, 49, 69, 66, 51, 7,117,110,105, 49, 69, 66, 52, 7,117,110,105, 49, 69, 66, 53, 7,117,110,105, + 49, 69, 66, 54, 7,117,110,105, 49, 69, 66, 55, 7,117,110,105, 49, 69, 66, 56, 7,117,110,105, 49, 69, 66, 57, 7,117,110,105, + 49, 69, 66, 65, 7,117,110,105, 49, 69, 66, 66, 7,117,110,105, 49, 69, 66, 67, 7,117,110,105, 49, 69, 66, 68, 7,117,110,105, + 49, 69, 66, 69, 7,117,110,105, 49, 69, 66, 70, 7,117,110,105, 49, 69, 67, 48, 7,117,110,105, 49, 69, 67, 49, 7,117,110,105, + 49, 69, 67, 50, 7,117,110,105, 49, 69, 67, 51, 7,117,110,105, 49, 69, 67, 52, 7,117,110,105, 49, 69, 67, 53, 7,117,110,105, + 49, 69, 67, 54, 7,117,110,105, 49, 69, 67, 55, 7,117,110,105, 49, 69, 67, 56, 7,117,110,105, 49, 69, 67, 57, 7,117,110,105, + 49, 69, 67, 65, 7,117,110,105, 49, 69, 67, 66, 7,117,110,105, 49, 69, 67, 67, 7,117,110,105, 49, 69, 67, 68, 7,117,110,105, + 49, 69, 67, 69, 7,117,110,105, 49, 69, 67, 70, 7,117,110,105, 49, 69, 68, 48, 7,117,110,105, 49, 69, 68, 49, 7,117,110,105, + 49, 69, 68, 50, 7,117,110,105, 49, 69, 68, 51, 7,117,110,105, 49, 69, 68, 52, 7,117,110,105, 49, 69, 68, 53, 7,117,110,105, + 49, 69, 68, 54, 7,117,110,105, 49, 69, 68, 55, 7,117,110,105, 49, 69, 68, 56, 7,117,110,105, 49, 69, 68, 57, 7,117,110,105, + 49, 69, 68, 65, 7,117,110,105, 49, 69, 68, 66, 7,117,110,105, 49, 69, 68, 67, 7,117,110,105, 49, 69, 68, 68, 7,117,110,105, + 49, 69, 68, 69, 7,117,110,105, 49, 69, 68, 70, 7,117,110,105, 49, 69, 69, 48, 7,117,110,105, 49, 69, 69, 49, 7,117,110,105, + 49, 69, 69, 50, 7,117,110,105, 49, 69, 69, 51, 7,117,110,105, 49, 69, 69, 52, 7,117,110,105, 49, 69, 69, 53, 7,117,110,105, + 49, 69, 69, 54, 7,117,110,105, 49, 69, 69, 55, 7,117,110,105, 49, 69, 69, 56, 7,117,110,105, 49, 69, 69, 57, 7,117,110,105, + 49, 69, 69, 65, 7,117,110,105, 49, 69, 69, 66, 7,117,110,105, 49, 69, 69, 67, 7,117,110,105, 49, 69, 69, 68, 7,117,110,105, + 49, 69, 69, 69, 7,117,110,105, 49, 69, 69, 70, 7,117,110,105, 49, 69, 70, 48, 7,117,110,105, 49, 69, 70, 49, 6, 89,103,114, + 97,118,101, 6,121,103,114, 97,118,101, 7,117,110,105, 49, 69, 70, 52, 7,117,110,105, 49, 69, 70, 53, 7,117,110,105, 49, 69, + 70, 54, 7,117,110,105, 49, 69, 70, 55, 7,117,110,105, 49, 69, 70, 56, 7,117,110,105, 49, 69, 70, 57, 7,117,110,105, 49, 70, + 66, 70, 7,117,110,105, 49, 70, 70, 68, 7,117,110,105, 49, 70, 70, 69, 7,117,110,105, 50, 48, 48, 48, 7,117,110,105, 50, 48, + 48, 49, 7,117,110,105, 50, 48, 48, 50, 7,117,110,105, 50, 48, 48, 51, 7,117,110,105, 50, 48, 48, 52, 7,117,110,105, 50, 48, + 48, 53, 7,117,110,105, 50, 48, 48, 54, 7,117,110,105, 50, 48, 48, 55, 7,117,110,105, 50, 48, 48, 56, 7,117,110,105, 50, 48, + 48, 57, 7,117,110,105, 50, 48, 48, 65, 7,117,110,105, 50, 48, 48, 66, 9, 97,102,105,105, 54, 49, 54, 54, 52, 7, 97,102,105, +105, 51, 48, 49, 7, 97,102,105,105, 50, 57, 57, 7, 97,102,105,105, 51, 48, 48, 7,117,110,105, 50, 48, 49, 48, 7,117,110,105, + 50, 48, 49, 49, 10,102,105,103,117,114,101,100, 97,115,104, 9, 97,102,105,105, 48, 48, 50, 48, 56, 7,117,110,105, 50, 48, 49, + 54, 13,117,110,100,101,114,115, 99,111,114,101,100, 98,108, 13,113,117,111,116,101,114,101,118,101,114,115,101,100, 7,117,110, +105, 50, 48, 49, 70, 7,117,110,105, 50, 48, 50, 51, 14,111,110,101,100,111,116,101,110,108,101, 97,100,101,114, 14,116,119,111, +100,111,116,101,110,108,101, 97,100,101,114, 7,117,110,105, 50, 48, 50, 55, 7,117,110,105, 50, 48, 51, 49, 6,109,105,110,117, +116,101, 6,115,101, 99,111,110,100, 7,117,110,105, 50, 48, 51, 52, 7,117,110,105, 50, 48, 51, 53, 7,117,110,105, 50, 48, 51, + 54, 7,117,110,105, 50, 48, 51, 55, 7,117,110,105, 50, 48, 51, 56, 7,117,110,105, 50, 48, 51, 66, 9,101,120, 99,108, 97,109, +100, 98,108, 7,117,110,105, 50, 48, 51, 68, 7,117,110,105, 50, 48, 51, 69, 7,117,110,105, 50, 48, 51, 70, 7,117,110,105, 50, + 48, 52, 48, 7,117,110,105, 50, 48, 52, 49, 7,117,110,105, 50, 48, 52, 50, 7,117,110,105, 50, 48, 52, 51, 7,117,110,105, 50, + 48, 52, 53, 7,117,110,105, 50, 48, 52, 54, 7,117,110,105, 50, 48, 52, 55, 7,117,110,105, 50, 48, 52, 56, 7,117,110,105, 50, + 48, 52, 57, 7,117,110,105, 50, 48, 52, 65, 7,117,110,105, 50, 48, 52, 66, 7,117,110,105, 50, 48, 52, 67, 7,117,110,105, 50, + 48, 52, 68, 7,117,110,105, 50, 48, 52, 69, 7,117,110,105, 50, 48, 52, 70, 7,117,110,105, 50, 48, 53, 48, 7,117,110,105, 50, + 48, 53, 49, 7,117,110,105, 50, 48, 53, 50, 7,117,110,105, 50, 48, 53, 51, 7,117,110,105, 50, 48, 53, 52, 7,117,110,105, 50, + 48, 53, 53, 7,117,110,105, 50, 48, 53, 54, 7,117,110,105, 50, 48, 53, 55, 7,117,110,105, 50, 48, 53, 56, 7,117,110,105, 50, + 48, 53, 57, 7,117,110,105, 50, 48, 53, 65, 7,117,110,105, 50, 48, 53, 66, 7,117,110,105, 50, 48, 53, 67, 7,117,110,105, 50, + 48, 53, 68, 7,117,110,105, 50, 48, 53, 69, 7,117,110,105, 50, 48, 55, 48, 7,117,110,105, 50, 48, 55, 49, 7,117,110,105, 50, + 48, 55, 52, 7,117,110,105, 50, 48, 55, 53, 7,117,110,105, 50, 48, 55, 54, 7,117,110,105, 50, 48, 55, 55, 7,117,110,105, 50, + 48, 55, 56, 7,117,110,105, 50, 48, 55, 57, 7,117,110,105, 50, 48, 55, 65, 7,117,110,105, 50, 48, 55, 66, 7,117,110,105, 50, + 48, 55, 67, 7,117,110,105, 50, 48, 55, 68, 7,117,110,105, 50, 48, 55, 69, 7,117,110,105, 50, 48, 55, 70, 7,117,110,105, 50, + 48, 56, 48, 7,117,110,105, 50, 48, 56, 49, 7,117,110,105, 50, 48, 56, 50, 7,117,110,105, 50, 48, 56, 51, 7,117,110,105, 50, + 48, 56, 52, 7,117,110,105, 50, 48, 56, 53, 7,117,110,105, 50, 48, 56, 54, 7,117,110,105, 50, 48, 56, 55, 7,117,110,105, 50, + 48, 56, 56, 7,117,110,105, 50, 48, 56, 57, 7,117,110,105, 50, 48, 56, 65, 7,117,110,105, 50, 48, 56, 66, 7,117,110,105, 50, + 48, 56, 67, 7,117,110,105, 50, 48, 56, 68, 7,117,110,105, 50, 48, 56, 69, 7,117,110,105, 50, 48, 65, 48, 13, 99,111,108,111, +110,109,111,110,101,116, 97,114,121, 7,117,110,105, 50, 48, 65, 50, 4,108,105,114, 97, 7,117,110,105, 50, 48, 65, 53, 7,117, +110,105, 50, 48, 65, 54, 6,112,101,115,101,116, 97, 7,117,110,105, 50, 48, 65, 56, 7,117,110,105, 50, 48, 65, 57, 9, 97,102, +105,105, 53, 55, 54, 51, 54, 4,100,111,110,103, 4, 69,117,114,111, 7,117,110,105, 50, 48, 65, 68, 7,117,110,105, 50, 48, 65, + 69, 7,117,110,105, 50, 48, 65, 70, 7,117,110,105, 50, 48, 66, 49, 7,117,110,105, 50, 48, 66, 52, 7,117,110,105, 50, 48, 66, + 53, 7,117,110,105, 50, 48, 68, 54, 7,117,110,105, 50, 48, 68, 55, 7,117,110,105, 50, 49, 48, 48, 7,117,110,105, 50, 49, 48, + 51, 7,117,110,105, 50, 49, 48, 52, 9, 97,102,105,105, 54, 49, 50, 52, 56, 7,117,110,105, 50, 49, 48, 54, 7,117,110,105, 50, + 49, 48, 57, 7,117,110,105, 50, 49, 48, 69, 7,117,110,105, 50, 49, 48, 70, 8, 73,102,114, 97,107,116,117,114, 9, 97,102,105, +105, 54, 49, 50, 56, 57, 9, 97,102,105,105, 54, 49, 51, 53, 50, 7,117,110,105, 50, 49, 49, 55, 11,119,101,105,101,114,115,116, +114, 97,115,115, 8, 82,102,114, 97,107,116,117,114, 7,117,110,105, 50, 49, 49, 68, 12,112,114,101,115, 99,114,105,112,116,105, +111,110, 7,117,110,105, 50, 49, 50, 48, 7,117,110,105, 50, 49, 50, 49, 7,117,110,105, 50, 49, 50, 54, 7,117,110,105, 50, 49, + 50, 55, 7,117,110,105, 50, 49, 50, 65, 7,117,110,105, 50, 49, 50, 66, 9,101,115,116,105,109, 97,116,101,100, 7,117,110,105, + 50, 49, 51, 50, 7,117,110,105, 50, 49, 51, 52, 5, 97,108,101,112,104, 7,117,110,105, 50, 49, 51, 66, 7,117,110,105, 50, 49, + 52, 66, 8,111,110,101,116,104,105,114,100, 9,116,119,111,116,104,105,114,100,115, 7,117,110,105, 50, 49, 53, 53, 7,117,110, +105, 50, 49, 53, 54, 7,117,110,105, 50, 49, 53, 55, 7,117,110,105, 50, 49, 53, 56, 7,117,110,105, 50, 49, 53, 57, 7,117,110, +105, 50, 49, 53, 65, 9,111,110,101,101,105,103,104,116,104, 12,116,104,114,101,101,101,105,103,104,116,104,115, 11,102,105,118, +101,101,105,103,104,116,104,115, 12,115,101,118,101,110,101,105,103,104,116,104,115, 7,117,110,105, 50, 49, 53, 70, 7,117,110, +105, 50, 49, 54, 48, 7,117,110,105, 50, 49, 54, 49, 7,117,110,105, 50, 49, 54, 50, 7,117,110,105, 50, 49, 54, 51, 7,117,110, +105, 50, 49, 54, 52, 7,117,110,105, 50, 49, 54, 53, 7,117,110,105, 50, 49, 54, 54, 7,117,110,105, 50, 49, 54, 55, 7,117,110, +105, 50, 49, 54, 56, 7,117,110,105, 50, 49, 54, 57, 7,117,110,105, 50, 49, 54, 65, 7,117,110,105, 50, 49, 54, 66, 7,117,110, +105, 50, 49, 54, 67, 7,117,110,105, 50, 49, 54, 68, 7,117,110,105, 50, 49, 54, 69, 7,117,110,105, 50, 49, 54, 70, 7,117,110, +105, 50, 49, 55, 48, 7,117,110,105, 50, 49, 55, 49, 7,117,110,105, 50, 49, 55, 50, 7,117,110,105, 50, 49, 55, 51, 7,117,110, +105, 50, 49, 55, 52, 7,117,110,105, 50, 49, 55, 53, 7,117,110,105, 50, 49, 55, 54, 7,117,110,105, 50, 49, 55, 55, 7,117,110, +105, 50, 49, 55, 56, 7,117,110,105, 50, 49, 55, 57, 7,117,110,105, 50, 49, 55, 65, 7,117,110,105, 50, 49, 55, 66, 7,117,110, +105, 50, 49, 55, 67, 7,117,110,105, 50, 49, 55, 68, 7,117,110,105, 50, 49, 55, 69, 7,117,110,105, 50, 49, 55, 70, 7,117,110, +105, 50, 49, 56, 48, 7,117,110,105, 50, 49, 56, 49, 7,117,110,105, 50, 49, 56, 50, 7,117,110,105, 50, 49, 56, 51, 9, 97,114, +114,111,119,108,101,102,116, 7, 97,114,114,111,119,117,112, 10, 97,114,114,111,119,114,105,103,104,116, 9, 97,114,114,111,119, +100,111,119,110, 9, 97,114,114,111,119, 98,111,116,104, 9, 97,114,114,111,119,117,112,100,110, 7,117,110,105, 50, 49, 57, 54, + 7,117,110,105, 50, 49, 57, 55, 7,117,110,105, 50, 49, 57, 56, 7,117,110,105, 50, 49, 57, 57, 14, 99, 97,114,114,105, 97,103, +101,114,101,116,117,114,110, 7,117,110,105, 50, 50, 49, 51, 7,117,110,105, 50, 50, 49, 52, 7,117,110,105, 50, 50, 49, 54, 12, + 97,115,116,101,114,105,115,107,109, 97,116,104, 7,117,110,105, 50, 50, 49, 56, 7,117,110,105, 50, 50, 49, 66, 7,117,110,105, + 50, 50, 49, 67, 12,112,114,111,112,111,114,116,105,111,110, 97,108, 7,117,110,105, 50, 51, 49, 56, 7,117,110,105, 50, 51, 49, + 57, 7,117,110,105, 50, 51, 50, 53, 9, 97,110,103,108,101,108,101,102,116, 10, 97,110,103,108,101,114,105,103,104,116, 7,117, +110,105, 50, 52, 54, 48, 7,117,110,105, 50, 52, 54, 49, 7,117,110,105, 50, 52, 54, 50, 7,117,110,105, 50, 52, 54, 51, 7,117, +110,105, 50, 52, 54, 52, 7,117,110,105, 50, 52, 54, 53, 7,117,110,105, 50, 52, 54, 54, 7,117,110,105, 50, 52, 54, 55, 7,117, +110,105, 50, 52, 54, 56, 7,117,110,105, 50, 52, 54, 57, 7,117,110,105, 50, 54, 66, 48, 7,117,110,105, 50, 54, 66, 49, 7,117, +110,105, 50, 56, 48, 48, 7,117,110,105, 70, 66, 48, 48, 7,117,110,105, 70, 66, 48, 51, 7,117,110,105, 70, 66, 48, 52, 7,117, +110,105, 70, 66, 48, 53, 7,117,110,105, 70, 66, 48, 54, 7,117,110,105, 70, 66, 49, 51, 7,117,110,105, 70, 66, 49, 52, 7,117, +110,105, 70, 66, 49, 53, 7,117,110,105, 70, 66, 49, 54, 7,117,110,105, 70, 66, 49, 55, 7,117,110,105, 70, 70, 70, 68, 9,100, +108, 76,116, 99, 97,114,111,110, 8, 68,105,101,114,101,115,105,115, 5, 65, 99,117,116,101, 5, 84,105,108,100,101, 5, 71,114, + 97,118,101, 10, 67,105,114, 99,117,109,102,108,101,120, 5, 67, 97,114,111,110, 12,117,110,105, 48, 51, 49, 49, 46, 99, 97,115, +101, 5, 66,114,101,118,101, 9, 68,111,116, 97, 99, 99,101,110,116, 12, 72,117,110,103, 97,114,117,109,108, 97,117,116, 11, 68, +111,117, 98,108,101, 97, 99,117,116,101, 11,117,110,105, 48, 51, 48, 56, 48, 51, 48, 52, 11,117,110,105, 48, 51, 48, 52, 48, 51, + 48, 56, 11,117,110,105, 48, 51, 48, 55, 48, 51, 48, 52, 11,117,110,105, 48, 51, 48, 56, 48, 51, 48, 49, 11,117,110,105, 48, 51, + 48, 56, 48, 51, 48, 48, 11,117,110,105, 48, 51, 48, 52, 48, 51, 48, 49, 11,117,110,105, 48, 51, 48, 52, 48, 51, 48, 48, 11,117, +110,105, 48, 51, 48, 51, 48, 51, 48, 52, 11,117,110,105, 48, 51, 48, 56, 48, 51, 48, 67, 11,117,110,105, 48, 51, 48, 51, 48, 51, + 48, 56, 11,117,110,105, 48, 51, 48, 67, 48, 51, 48, 55, 11,117,110,105, 48, 51, 48, 51, 48, 51, 48, 49, 11,117,110,105, 48, 51, + 48, 50, 48, 51, 48, 49, 11,117,110,105, 48, 51, 48, 50, 48, 51, 48, 48, 11,117,110,105, 48, 51, 48, 50, 48, 51, 48, 51, 11,117, +110,105, 48, 51, 48, 54, 48, 51, 48, 51, 11,117,110,105, 48, 51, 48, 54, 48, 51, 48, 49, 11,117,110,105, 48, 51, 48, 54, 48, 51, + 48, 48, 11,117,110,105, 48, 51, 48, 54, 48, 51, 48, 57, 11,117,110,105, 48, 51, 48, 50, 48, 51, 48, 57, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 20,108, 0, 0, 0, 16, 0, 0, 0, 7, 0, 1, 0, 2, 0, 0, 0, 1,255,255,255,255, + 0, 1, 0, 3, 0, 0, 0, 0,255,255,255,254, 0, 1, 0, 2, 0, 0, 0, 1,255,255,255,255, 0, 1, 0, 3, 0, 0, 0, 0, +255,255,255,254, 0, 1, 0, 4, 0, 0, 0, 2,255,255,255,255, 0, 1, 0, 5, 0, 0, 0, 0,255,255,255,253, 0, 1, 0, 4, + 0, 0, 0, 2,255,255,255,255, 0, 1, 0, 5, 0, 0, 0, 0,255,255,255,253, 0, 1, 0, 4, 0, 0, 0, 2,255,255,255,255, + 0, 1, 0, 5, 0, 0, 0, 0,255,255,255,253, 0, 2, 0, 2, 0, 0, 0, 4,255,255,255,255, 0, 2, 0, 0, 0, 0, 0, 0, +255,255,255,251, 0, 11, 0, 2, 0, 0, 0, 8,255,255,255,255, 0, 11, 0, 0, 0, 0, 0, 0,255,255,255,247, 0, 0, 0, 0, +255,255,255,255,255,255,255,255, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,176, 64, 0, 0, 1, 0, 0, 0, 4, + 0, 0, 0, 6, 0, 0, 0, 20, 0, 0, 0,242, 0, 0, 1, 34, 0, 0, 1, 98, 0, 4, 0, 6, 0, 10, 0, 48, 0, 3, 0, 12, + 2, 92, 2, 72, 0, 78, 2, 97, 2, 94, 0,120, 2,104, 2,100, 0,128, 2,110, 2,107, 0,138, 2,123, 2,113, 0,146, 2,138, + 2,129, 0,168, 2,140, 2,140, 0,188, 2,154, 2,142, 0,190, 4,123, 4,123, 0,216, 5,253, 5,252, 0,218,255,255,255,255, + 0, 0, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, + 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 4, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 0, 3, 0, 3, 0, 4, 0, 3, 0, 5, 0, 4, 0, 6, 0, 6, 0, 7, 0, 6, 0, 5, + 0, 7, 0, 0, 0, 0,255,255,255,255, 0, 2,128, 0,255,255, 0, 0, 0, 1, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 1, +255,255, 0, 2, 0, 0,255,255,255,255, 0, 3,128, 0,255,255, 0, 2, 0, 0, 0, 0, 0, 3,255,255, 0, 3, 0, 0,255,255, +255,255, 0, 0, 0, 16, 0, 0, 0, 28, 0, 0, 0, 40, 0, 0, 0, 52, 0, 4, 0, 6, 0, 0, 0, 0,255,255, 0, 0, 0, 4, + 0, 6, 0, 0, 0, 0,255,255, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0,255,255, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0,255,255, + 0, 0, 0, 0, 0, 0, 4, 52, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 22, 0, 0, 0, 28, 0, 0, 0,160, 0, 0, 2,132, + 0, 0, 3, 38, 0, 0, 3,186, 0, 0, 4, 4, 0, 4, 0, 6, 0, 13, 0, 48, 0, 3, 0, 30, 0, 3, 0, 3, 0, 96, 0, 17, + 0, 17, 0, 98, 0, 41, 0, 41, 0,100, 0, 81, 0, 81, 0,102, 0,114, 0,114, 0,104, 2, 21, 2, 21, 0,106, 2, 73, 2, 73, + 0,108, 2, 76, 2, 75, 0,110, 2, 80, 2, 78, 0,114, 2, 83, 2, 82, 0,120, 2,112, 2,111, 0,124, 5,159, 5,159, 0,128, + 5,162, 5,162, 0,130,255,255,255,255, 0, 0, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, + 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 3, 0, 4, 0, 7, 0, 8, + 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 17, + 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 18, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 19, 0, 0, 0, 3, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 20, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 6, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, + 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 22, 0, 23, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 24, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, + 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 25, 0, 26, 0, 0, 0, 0, 0, 0, 0, 2,128, 0, 0, 0, + 0, 3,128, 0, 0, 0, 0, 5,128, 0, 0, 0, 0, 6,128, 0, 0, 0, 0, 7,128, 0, 0, 0, 0, 9,128, 0, 0, 0, 0, 0, +160, 0, 0, 0, 0, 0,160, 0, 0, 2, 0, 0,160, 0, 0, 4, 0, 0,160, 0, 0, 6, 0, 0,160, 0, 0, 8, 0, 0,160, 0, + 0, 10, 0, 0,160, 0, 0, 12, 0, 0,160, 0, 0, 14, 0, 0,160, 0, 0, 16, 0, 0,160, 0, 0, 18, 0, 4,128, 0, 0, 0, + 0, 0,160, 0, 0, 20, 0, 0,160, 0, 0, 23, 0, 0,160, 0, 0, 25, 0, 8,128, 0, 0, 0, 0, 0, 96, 0, 0, 27, 0, 0, +160, 0, 0, 29, 0, 10,128, 0, 0, 0, 0, 0, 96, 0, 0, 32, 0, 0,160, 0, 0, 34, 63,255,253,183,191,255,255,254, 63,255, +253,183,128, 0, 0, 0, 63,255,253,184,128, 0, 0, 2, 63,255,253,184,128, 0, 0, 4, 63,255,253,185,128, 0, 0, 6, 63,255, +253,186,128, 0, 0, 8, 63,255,253,186,128, 0, 0, 10, 63,255,253,187,128, 0, 0, 12, 63,255,253,161,128, 0, 0, 14, 63,255, +253,162,128, 0, 0, 16, 0, 0, 0, 3, 0, 0, 0, 4,128, 0, 0, 5, 63,255,255,238,191,255,255,166, 63,255,255,200,191,255, +254, 5, 63,255,250,124,191,255,250,125, 63,255,250,126, 63,255,250,127,191,255,250,128, 63,255,250,126,191,255,250,127, 63,255, +250,128, 63,255,250,129,191,255,250,130, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, + 0, 5, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 12, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 16, 0,118, 2, 53, 0,113, 2, 49, 2, 50, 0,106, + 2, 51, 2, 54, 0,122, 2, 52, 5,155, 6, 3, 1, 11, 5,160, 5,161, 5,163, 5,164, 0, 0, 0, 0, 0,144, 0, 0, 0, 2, + 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 28, 0, 0, 0, 62, 0, 0, 0, 98, 0, 0, 0,116, 0, 0, 0,124, 0, 0, 0,128, + 0, 4, 0, 6, 0, 2, 0, 12, 0, 1, 0, 0, 4, 86, 4, 86, 0, 30, 4,115, 4,115, 0, 32,255,255,255,255, 0, 0, 0, 4, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 2, 0, 0, 0, 0, 0, 0, 0, 2,128, 0, 0, 0, 0, 0,160, 0, 0, 0, 63,255,251,141,191,255,251,171, + 0, 0, 0, 0, 4,120, 0, 0, 0, 0, 1, 48, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 28, 0, 0, 0, 94, + 0, 0, 0,174, 0, 0, 0,222, 0, 0, 1, 6, 0, 0, 1, 26, 0, 4, 0, 6, 0, 6, 0, 24, 0, 2, 0, 12, 4, 86, 4, 86, + 0, 54, 4, 92, 4, 92, 0, 56, 4, 94, 4, 94, 0, 58, 4,101, 4,101, 0, 60, 4,103, 4,103, 0, 62, 4,111, 4,111, 0, 64, +255,255,255,255, 0, 0, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 4, 0, 5, 0, 1, 0, 6, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 2,128, 0, 0, 0, 0, 3,128, 0, 0, 0, 0, 0,160, 0, 0, 0, 0, 0,160, 0, 0, 2, + 0, 0,160, 0, 0, 4, 0, 0,160, 0, 0, 6, 0, 0,160, 0, 0, 8, 63,255,251,170,191,255,251,156, 63,255,251,166,191,255, +251,158, 63,255,251,166,191,255,251,160, 63,255,251,159,191,255,251,162, 63,255,251,161,191,255,251,154, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 6,126, 6,127, 6,129, 6,125, 6,128, 0, 0, 4,228, 0, 0, 0, 2, + 0, 0, 0, 2, 0, 0, 0, 23, 0, 0, 0, 28, 0, 0, 0,162, 0, 0, 3, 84, 0, 0, 3,246, 0, 0, 4,122, 0, 0, 4,188, + 0, 4, 0, 6, 0, 13, 0, 48, 0, 3, 0, 30, 0, 18, 0, 18, 0, 96, 0, 36, 0, 36, 0, 98, 0, 41, 0, 40, 0,100, 0, 48, + 0, 47, 0,104, 0, 55, 0, 53, 0,108, 0, 59, 0, 59, 0,114, 0, 68, 0, 68, 0,116, 0, 70, 0, 70, 0,118, 0, 73, 0, 73, + 0,120, 0, 76, 0, 76, 0,122, 0, 79, 0, 79, 0,124, 0, 82, 0, 82, 0,126, 0, 88, 0, 86, 0,128,255,255,255,255, 0, 0, + 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, + 0, 20, 0, 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, + 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, + 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 10, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, + 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, + 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 14, 0, 0, 0, 2, 0, 3, + 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, + 0, 5, 0, 16, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, + 0, 7, 0, 0, 0, 0, 0, 18, 0, 8, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 20, 0, 21, 0, 22, 0, 0, 0, 8, 0, 0, 0, 0, 0, 23, 0, 23, + 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 23, 0, 24, + 0, 25, 0, 23, 0, 23, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, + 0, 3, 0, 4, 0, 0, 0, 5, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, +128, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 5,128, 0, 0, 0, 0, 6,128, 0, 0, 0, 0, 8,128, 0, 0, 0, 0, 10,128, 0, + 0, 0, 0, 12,128, 0, 0, 0, 0, 14,128, 0, 0, 0, 0, 3,128, 0, 0, 0, 0, 0,160, 0, 0, 0, 0, 0,160, 0, 0, 3, + 0, 0,160, 0, 0, 5, 0, 7,128, 0, 0, 0, 0, 0,160, 0, 0, 7, 0, 9,128, 0, 0, 0, 0, 0,160, 0, 0, 10, 0, 11, +128, 0, 0, 0, 0, 0,160, 0, 0, 13, 0, 0,160, 0, 0, 16, 0, 13,128, 0, 0, 0, 0, 0,160, 0, 0, 19, 0, 0,160, 0, + 0, 21, 0, 0, 96, 0, 0, 23, 0, 0,160, 0, 0, 25, 0, 0,160, 0, 0, 28, 0, 0,160, 0, 0, 31, 63,255,255,197, 63,255, +255,221,191,255,255,217, 63,255,255,173,191,255,255,207, 63,255,255,213,191,255,255,208, 63,255,255,216, 63,255,255,224,191,255, +255,210, 63,255,255,196, 63,255,255,249,191,255,255,200, 63,255,255,187, 63,255,255,252,191,255,255,201, 63,255,255,184, 63,255, +255,255,191,255,255,204, 63,255,255,199,191,255,255,203, 63,255,255,198,191,255,255,205, 63,255,255,206,191,255,255,207, 63,255, +255,205, 63,255,255,209,191,255,255,210, 63,255,255,205, 63,255,255,212,191,255,255,213, 63,255,255,200,191,255,255,202, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, + 6, 25, 5,241, 6, 14, 6, 15, 5,254, 6, 1, 6, 2, 6,119, 6,120, 6,118, 6,121, 6,122, 6,124, 0, 0, 0, 0, 0,220, + 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 28, 0, 0, 0, 62, 0, 0, 0,110, 0, 0, 0,152, 0, 0, 0,184, + 0, 0, 0,200, 0, 4, 0, 6, 0, 2, 0, 12, 0, 1, 0, 0, 0, 4, 0, 4, 0, 30, 0, 34, 0, 34, 0, 32,255,255,255,255, + 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 2,128, 0, + 0, 0, 0, 3,128, 0, 0, 0, 0, 0,160, 0, 0, 0, 0, 0,160, 0, 0, 2, 0, 0,160, 0, 0, 4, 0, 0,160, 0, 0, 6, + 63,255,255,252,191,255,255,253, 63,255,255,224,191,255,255,255, 0, 0, 0, 0,191,255,255,227, 63,255,255,228,191,255,255,229, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 5,169, 5,182, 5,181, 5,180, 0, 0, 6, 56, 0, 0, 0, 2, + 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 28, 0, 0, 0, 84, 0, 0, 2,132, 0, 0, 3,182, 0, 0, 5, 46, 0, 0, 5,234, + 0, 4, 0, 6, 0, 3, 0, 12, 0, 1, 0, 6, 0, 18, 0, 18, 0, 36, 0, 27, 0, 20, 0, 38, 5,177, 5,177, 0, 54,255,255, +255,255, 0, 0, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 2, 0, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 0, 2, 0, 3, + 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 8, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, + 0, 14, 0, 9, 0, 15, 0, 9, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 17, 0, 18, 0, 19, 0, 20, 0, 21, 0, 16, + 0, 22, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 25, 0, 4, 0, 26, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 27, 0, 4, 0, 28, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 2, 0, 3, 0, 31, 0, 32, 0, 0, 0, 6, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, + 0, 34, 0, 35, 0, 0, 0, 6, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, + 0, 0, 0, 6, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 39, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 40, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 43, 0, 6, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 45, 0, 6, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 1, + 0, 2, 0, 3, 0, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, + 0, 4, 0, 5, 0, 0, 0, 6, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, + 0, 0, 0, 6, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,128, 0, 0, 0, 0, 5,128, 0, 0, 0, 0, 8,128, 0, 0, 0, + 0, 11,128, 0, 0, 0, 0, 14,128, 0, 0, 0, 0, 17,128, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 3,128, 0, 0, 0, 0, 0, + 96, 0, 0, 0, 0, 0,160, 0, 0, 2, 0, 0,160, 0, 0, 5, 0, 0,160, 0, 0, 8, 0, 0,160, 0, 0, 11, 0, 0,160, 0, + 0, 14, 0, 0,160, 0, 0, 17, 0, 0, 96, 0, 0, 20, 0, 0,160, 0, 0, 22, 0, 0,160, 0, 0, 25, 0, 0,160, 0, 0, 28, + 0, 0,160, 0, 0, 31, 0, 0,160, 0, 0, 34, 0, 0,160, 0, 0, 37, 0, 7,128, 0, 0, 0, 0, 6,128, 0, 0, 0, 0, 0, +160, 0, 0, 40, 0, 0,160, 0, 0, 43, 0, 0,160, 0, 0, 46, 0, 0,160, 0, 0, 49, 0, 10,128, 0, 0, 0, 0, 9,128, 0, + 0, 0, 0, 0,160, 0, 0, 52, 0, 0,160, 0, 0, 55, 0, 0,160, 0, 0, 58, 0, 0,160, 0, 0, 61, 0, 0,160, 0, 0, 64, + 0, 0,160, 0, 0, 67, 0, 13,128, 0, 0, 0, 0, 12,128, 0, 0, 0, 0, 0,160, 0, 0, 70, 0, 0,160, 0, 0, 73, 0, 16, +128, 0, 0, 0, 0, 15,128, 0, 0, 0, 0, 0,160, 0, 0, 76, 0, 0,160, 0, 0, 79, 0, 0,160, 0, 0, 82, 0, 0,160, 0, + 0, 85, 0, 19,128, 0, 0, 0, 0, 18,128, 0, 0, 0, 0, 0,160, 0, 0, 88, 0, 0,160, 0, 0, 91, 63,255,250, 79,191,255, +255,237, 63,255,255,237, 63,255,250, 82,191,255,255,240, 63,255,255,239, 63,255,250, 85,191,255,255,243, 63,255,255,241, 63,255, +250, 88,191,255,255,246, 63,255,255,243, 63,255,250, 91,191,255,255,249, 63,255,255,245, 63,255,250, 94,191,255,255,252, 63,255, +255,246, 63,255,250, 97,191,255,255,255, 0, 0, 0, 2,128, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 5,128, 0, 0, 4, 0, 0, + 0, 3, 0, 0, 0, 8,128, 0, 0, 7, 0, 0, 0, 5, 0, 0, 0, 11,128, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, 14,128, 0, + 0, 13, 0, 0, 0, 9, 0, 0, 0, 17,128, 0, 0, 16, 0, 0, 0, 10, 0, 0, 0, 20,128, 0, 0, 19, 0, 0, 0, 18, 63,255, +250,120,128, 0, 0, 21, 0, 0, 0, 19, 63,255,250,123,128, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 29,128, 0, 0, 27, 0, 0, + 0, 25, 0, 0, 0, 32,128, 0, 0, 30, 0, 0, 0, 29, 63,255,250,132,128, 0, 0, 32, 0, 0, 0, 31, 63,255,250,135,128, 0, + 0, 35, 0, 0, 0, 31, 63,255,250,138,128, 0, 0, 38, 0, 0, 0, 38, 0, 0, 0, 44,128, 0, 0, 41, 0, 0, 0, 40, 0, 0, + 0, 47,128, 0, 0, 44, 0, 0, 0, 40, 0, 0, 0, 50,128, 0, 0, 47, 0, 0, 0, 46, 63,255,250,150,128, 0, 0, 49, 0, 0, + 0, 49, 0, 0, 0, 56,128, 0, 0, 52, 0, 0, 0, 51, 63,255,250,156,128, 0, 0, 54, 0, 0, 0, 52, 63,255,250,159,128, 0, + 0, 57, 0, 0, 0, 57, 0, 0, 0, 65,128, 0, 0, 60, 0, 0, 0, 58, 0, 0, 0, 68,128, 0, 0, 63, 0, 0, 0, 61, 63,255, +250,168,128, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 74,128, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 18, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 31, 6, 39, 0,127, 6, 27, 0,126, 6, 29, 6, 33, 6, 35, 6, 39, 0,127, + 6, 27, 0,126, 6, 29, 6, 33, 6, 35, 6, 28, 6, 30, 6, 28, 6, 30, 0,128, 6, 31, 6, 36, 0,128, 6, 31, 6, 36, 6, 32, + 6, 32, 6, 34, 6, 37, 6, 34, 6, 37, 6, 38, 6, 38, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 60, 0, 0, 1, 0, 0, 1, 0, 2, 0, 0, 0, 64, 0, 0, 1, 1, 0, 2, 0, 1, 0, 0, 0, 72,192, 0, 1, 2, + 0, 11, 0, 1, 0, 0, 0, 76,192, 0, 1, 3, 0, 0, 1, 4, 0, 2, 1, 5, 0, 4, 1, 6, 0, 2, 1, 7, 0, 2, 1, 8, + 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 6, 0, 97, 1,128, 0, 6, 0,198, 0, 3, 0, 3, 0, 10, 0, 5, 0, 4, 0, 11, + 0, 8, 0, 6, 0, 5, 0, 10, 0, 9, 0, 11, 0, 11, 0, 11, 17, 11, 0, 12, 0, 12, 31, 11, 0, 13, 0, 13, 0, 11, 0, 14, + 0, 14, 0, 4, 0, 15, 0, 15, 0, 7, 0, 16, 0, 16, 0, 4, 0, 18, 0, 17, 0, 7, 0, 28, 0, 19, 0, 3, 0, 29, 0, 29, + 0, 7, 0, 30, 0, 30, 0, 11, 0, 31, 0, 31, 18, 11, 0, 32, 0, 32, 0, 11, 0, 33, 0, 33, 30, 11, 0, 35, 0, 34, 0, 11, + 0, 62, 0, 62, 18, 11, 0, 63, 0, 63, 0, 11, 0, 64, 0, 64, 30, 11, 0, 67, 0, 65, 0, 11, 0, 94, 0, 94, 18, 11, 0, 95, + 0, 95, 0, 11, 0, 96, 0, 96, 30, 11, 0, 97, 0, 97, 0, 11, 0, 98, 0, 98, 0, 7, 0, 99, 0, 99, 0, 11, 0,103, 0,100, + 0, 5, 0,107, 0,104, 0, 11, 0,113, 0,109, 0, 11, 0,115, 0,114, 0, 5, 0,117, 0,116, 0, 3, 0,118, 0,118, 0, 11, + 0,122, 0,120, 0, 11, 0,123, 0,123, 0, 3, 0,129, 0,125, 0, 11, 0,153, 0,153, 0, 11, 0,185, 0,185, 0, 11, 2, 19, + 2, 18, 0, 11, 2, 40, 2, 27, 0, 11, 2, 56, 2, 43, 0, 11, 2, 68, 2, 62, 0, 11, 2, 71, 2, 70, 0, 11, 2,154, 2, 72, +128, 11, 2,156, 2,155, 0, 11, 2,160, 2,157,128, 11, 2,162, 2,161, 0, 11, 2,166, 2,164, 0, 11, 2,168, 2,168, 0, 11, + 3, 19, 3, 19, 0, 11, 3,163, 3,160,128, 11, 3,165, 3,164, 0, 11, 4,122, 4,122, 0, 11, 4,123, 4,123, 0, 7, 5,116, + 5,114, 0, 11, 5,127, 5,117, 0, 10, 5,130, 5,128, 0, 11, 5,132, 5,131, 0, 10, 5,156, 5,133, 0, 11, 5,161, 5,157, + 0, 5, 5,165, 5,162, 0, 11, 5,166, 5,166, 17, 11, 5,167, 5,167, 31, 11, 5,176, 5,168, 0, 11, 5,177, 5,177, 0, 7, + 5,178, 5,178, 17, 11, 5,179, 5,179, 31, 11, 5,203, 5,180, 0, 11, 5,204, 5,204, 0, 3, 5,211, 5,206, 0, 3, 5,213, + 5,212, 0, 4, 5,214, 5,214, 0, 11, 5,215, 5,215, 17, 11, 5,216, 5,216, 31, 11, 5,227, 5,218, 0, 3, 5,229, 5,228, + 0, 4, 5,230, 5,230, 0, 11, 5,231, 5,231, 17, 11, 5,232, 5,232, 31, 11, 5,251, 5,233, 0, 5, 5,253, 5,252,128, 11, + 6, 3, 5,254, 0, 11, 6, 10, 6, 8, 0, 11, 6, 16, 6, 13, 0, 11, 6, 18, 6, 18, 0, 11, 6, 21, 6, 21, 0, 5, 6, 22, + 6, 22, 0, 11, 6, 39, 6, 25, 0, 11, 6, 86, 6, 76, 0, 11, 6, 87, 6, 87, 0, 4, 6, 88, 6, 88, 0, 5, 6,102, 6, 89, + 0, 11, 6,103, 6,103, 17, 11, 6,104, 6,104, 31, 11, 6,116, 6,105, 0, 11, 6,130, 6,130, 0, 1,255,255,255,255, 0, 0, +}; + diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c new file mode 100644 index 00000000000..c8fb9ec7a7a --- /dev/null +++ b/source/blender/editors/datafiles/blenderbuttons.c @@ -0,0 +1,2020 @@ +/* DataToC output of file */ + +int datatoc_blenderbuttons_size= 64418; +char datatoc_blenderbuttons[]= { +137, 80, + 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 0, 0, 0, 1, 0, 8, 6, 0, 0, 0,197,144,206,103, 0, + 0, 0, 1,115, 82, 71, 66, 0,174,206, 28,233, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0, + 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,215, 11, 26, 20, + 59, 43, 0,186, 29, 9, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,125,121, 92, 84, 85,255,255,251,220,217,217, 23, 1, 21,151, +193,125, 95,201, 37, 55, 40, 53,243,155,153, 6,148,154,100,101, 98,137,218,147,166, 61,101,143,250,211, 71,197,164, 50, 53,161, +167,210,172, 52, 5,115,201, 45, 81, 7,245, 81, 82,113, 47, 23, 20, 69, 4, 69,150, 97, 22,102,187,115,151,223, 31, 51, 67, 3, + 2,179,128, 91,207,188, 95,220,215,229,222,123,238,103,206, 61,219,103, 61,231,144, 30, 61,122,240,240,192, 3, 15, 60,240,192, + 3, 15,254,167, 64,121,138,192, 3, 15, 60,240,192, 3, 15,254,119,112,230,236, 1, 0, 0,241, 88, 0, 60,240,192, 3, 15, 60, +240,192, 99, 1,240,192, 3, 15, 60,240,192, 3, 15, 60, 2,128, 7, 30,120,224,129, 7, 30,120,224, 17, 0, 60,240,192, 3, 15, + 60,240,192,131,191, 5,132,246, 23,231,206,157, 35,238, 18,170, 41,150,192, 67,207, 67,175, 54,164,166,166,242,107,215,174,125, +100,249, 27, 55,110, 28,191,105,211, 38,226,169,143, 39,154, 30,234, 65, 15,158,242,243,208,251, 59,211,115, 89, 0,248, 31, 71, +245, 2, 36,143,115, 62, 83, 82, 82, 48,117,234, 84,226,169, 54,247,235,120,216,176, 97,149,215, 25, 25, 25,127,139,178, 28,253, + 82, 66,157, 3,193,142,237,169,127,235, 54, 35, 11,220, 6,169,177, 13, 34, 64,163, 2,123,145, 99,152,247, 56,183, 69, 79,255, +245,224,241,177, 0, 60,140,198, 58,122,244,232,168, 29, 59,118, 40,236,174,163,119,236,216,145,249, 88,244, 72,222, 50,118, 18, +242,216,246, 75, 62, 47, 47, 15, 0, 32,151,203,159,164, 65,196,105,233,116,220,184,113, 78,167,221,180,105,147, 43,130, 26,191, +101,203,150,202,139,109,219,182, 97,216,176, 97, 85,158, 63, 42, 33, 32, 59, 59,155, 7,128,200,200, 72,210, 16,233,118,108, 79, +125,160,245, 23, 30,209, 28, 0,112,207,104, 4, 99, 48, 89,110,170, 52, 0,128,216,216, 88,164,165,165,213,154,191,222,185,189, +249,182,119,219,186,244,227, 63, 15,252,217,137,122,145, 33,240,221,139, 48,238,216,134,242,242, 49, 40, 7,208, 75,246, 41,230, +201, 78,163,185, 20, 40, 49,230, 98,158, 33,206,165,223,141,141,141,141, 74, 75, 75, 83, 84,187, 23,157,150,150,150,249,152,245, +173, 6,105,183, 79,200,247, 54, 56,154, 4, 75,136,143,200,159,152,164, 98,222,164, 50, 80, 21, 6, 13,167, 51,153,255, 39,102, +199, 57, 20, 0,172, 12,219,118,174,111, 67,224,119,236,216,129,133, 91, 22,195,167,185, 63, 42,110,171, 49, 63,110,158,226, 49, +215,184, 31, 39, 16,185, 92,206,231,229,229, 33, 47, 47, 15,251,246,237,195,212,169, 83, 31, 87, 33,192,214,129, 72,106,106,170, + 40, 33, 33,193,188,124,249,242, 83, 0, 48,103,206,156,167,234,122,113,204,152, 49,149,255, 51, 12, 11,218,108, 2,109,162, 65, +211,150,131, 97, 24,204,153, 51,199,165,188,216, 51,255,154, 96, 21, 6,248, 71,105, 9,112, 69,248,121,100, 26,126,128, 31, 46, +220,248, 25, 50, 52, 3,139, 99, 40,254,230, 12,206,231,150, 97,236,178,117, 78,189,222,246,110, 91, 39, 25,186, 5,175,254,247, + 85,135,101, 34, 27, 57, 15, 65,163,223, 66,225,123,189, 0, 67,121,229,253, 51,134, 15,112, 6, 0, 12,192, 96, 89, 44, 14, 6, +158, 70, 0,128,222,229,189,157,106, 51,105,105,105,247,221,180, 99,144,228, 49,234, 99, 13, 49, 6, 60, 9,223,219,160, 24,208, +173, 7,121, 45, 60, 66,168,106,209, 72, 16,218, 49,156, 18,146, 80,162, 87,171, 57, 41,194, 88,170,103, 51,246,245, 81,195, 89, + 39, 73,221,113,225,103,155, 58,145,102,150, 11,244,146, 31,168, 0,176, 99,199, 14,197,150, 79, 62, 66,220,162, 37,138,122, 54, + 2,222,198,248, 1,160, 84, 95, 6, 4, 3,255, 60,184, 0,154, 27,229, 88,243,246,202,199,141,145,213, 54,240, 60,234, 60, 86, + 10, 1, 35, 70,140, 64, 94, 94, 30,228,114,249, 99, 87,118, 10,133,101,220,136,142,142,230, 1, 80,169,169,169,225, 9, 9, 9, +133,203,151, 47, 63,237, 44, 17,134, 97, 64,211,230, 74,198,111,207,252,179,179,179, 17, 25, 25,233, 82,166,226,226,226,236,153, + 45, 50, 50, 50,170, 11, 0, 13,209, 86, 92,174,135,200,200, 72, 50,110,220, 56,126,248,240,225,247, 61,219,191,127,191,205,210, + 97,179,122, 56, 77,191, 33,221, 1,225, 17,205, 81, 88,174,198, 47, 83, 95, 70, 48, 25,128,220,255,204, 70,171, 49,173,144,225, + 2,243,175, 44, 44,171,169,141, 52,128,169, 45,124,203, 49,232,111, 85,160, 48, 33,162,206,116, 23,165, 7,176,176,235, 61, 44, +189,248,113,125,235,179, 33,152,110, 67,210, 64, 3,211,122, 16,223,219, 32,136,143,143,247, 2,240, 52, 0, 31,187,219, 42, 0, + 23, 54,108,216,160,116,150,206, 23,107,191,160,232, 82,147,136, 54, 25,165,229, 48, 75, 69, 34,161, 80, 99,148, 82, 98,177,129, + 19,248,121, 51,180,204,108, 22, 22,221, 49,125,255,205,122,227,235,147, 39,177,206,124,183, 74,165,250,183,237,255,156,156,156, + 82,111,111,111, 74,167,211,113,246,105,250,244,233,243,121, 3, 51,246, 89,245, 45, 83,161, 35,237,255,242,229,203,104,235,227, +103,111, 13,112,199, 10, 80,201,252, 75,245,101, 88,250,236,130,202, 7,111,236,120, 23, 8, 5,198, 44,143,195,182, 57, 91, 92, +105,100,117, 13,110,245,110,168,183,111,223, 6, 0, 52,111,222,188,202,255,112,193,156,221,128,130, 8,169, 77, 8, 48,155, 25, + 91, 60, 64,131,104, 1, 13, 80,150,246,204, 31, 0, 72, 66, 66, 2, 0,220, 73, 77, 77, 13, 76, 72, 72, 40,119,154,249,155,205, +160,105, 19, 76, 52, 13,115, 53,230,207,115,174, 85, 67, 92, 92, 28,178,179,179,255,234, 93,201,201,136,137,137,169,188, 78, 79, + 79,175,183,176, 99, 39,240,212,187,253,217, 51,254,113,227,198,161,103,207,158, 54, 1,192, 85,139, 64,131, 52,194,130, 27,249, +208,109,251, 23,124,222, 92,137,240,136,230, 8, 11,150,225,198,182, 27, 22,230, 31,224,103,113, 1,136, 4,206, 73,176, 13,228, + 99,107,119,233, 58,110,207, 95, 12, 67,218,250,186, 45, 4, 50, 25,140, 70, 35,114,115,115, 81,108,188,138,118, 8,175, 53,173, +213, 12, 94, 87,219, 39,182,126, 98, 77,155,233, 70,255, 34,118,253,154,119,179,159,145, 58, 24,183,211,109,176,166,239,141,137, +137,225, 9, 33, 54, 87, 78,125,190,215,214,151,121,161, 80, 88,175, 58,143,143,143,247, 7, 48,230,224,193,131,255,226, 56,206, +100,215,150,132, 2,129,192, 59, 62, 62,126,242,134, 13, 27,246, 56,228,152,115,103, 9, 75,239,148, 72, 69, 34,137, 55, 37, 36, +126,188, 64,226,197, 9, 4, 66,142, 80,224,136,144,229, 5, 2,147,128, 35, 70,157,128,213,123,139, 69,228,155, 99,123,140,137, + 73,147, 56,228, 59,206, 99,121,121,185, 70,175,215, 51, 0,160,211,233,184,143, 62,250,168,146,225, 47, 89,178,228, 31,245,109, +239, 67,135, 14,157,106,251,255,192,129, 3, 41, 13,209,135, 40, 71,218,255,226, 87, 98, 96, 44, 41,193,236,206, 29, 96,239,187, +119, 90, 11, 25, 61, 58, 10, 64, 21,230, 63,122,244,232,104, 0,100,244,232,209,209,235, 70,127,101,177, 44,182,111, 84, 37,189, + 51,152,179, 38, 7,115,214,228, 96,218,138,203,120,125,209, 31, 24,251,207,115,245, 31,232, 10, 10,156, 18, 12, 30, 22,243,183, +250,252,249, 90, 44, 1, 48,211, 52,250,246,233,211, 16, 66, 6,191,101,203, 22,108,217,178, 5, 10,133,162,242,112, 81,224,225, + 21, 10, 5,162,163,163, 43,153,191,253,195,132,132, 4,149, 51, 3, 19,195,176, 22,205,223,100, 49,253, 87,103,254, 44,203, 66, +103,208,185,244,129, 54,139, 65,117,171, 65,122,122, 58,210,211,211,171, 8, 3, 46,125,111,102,213,241,208,122, 93, 47, 33,209, +198,252,199,141, 27,135,229,203,151, 87, 50,127,145, 80,228, 42,243,183, 13,224,181, 29, 78,195,128,124, 84,140,233, 11, 62,109, + 54, 10,110,228,131, 31,211,241,175, 66, 72,155, 13, 97,147, 16, 32, 32,224,161, 74,198,186,210, 92, 24,210,214,131,231,121, 92, +188,120, 17,131, 7, 15,134, 76, 38,171,194,248, 3, 3, 3, 97, 48, 24, 96, 48, 24, 80, 88, 88,136,241,134, 25,248, 38,240,189, + 90,105, 58,105,242, 38,213,210,186,202,184, 27, 74, 89, 33,181, 48,127,167,219, 96,245,239,141,137,137,225,211,211,211,145,150, +150,134,216,216, 88,190,190,223,107,101,254, 96, 24,198,237, 62, 17, 31, 31, 47, 5,240,246,129, 3, 7, 62, 90,180,104,209, 9, + 66,136,220,118, 0,104, 22, 28, 28,236,117,232,208,161,181,241,241,241,131,235,162,243, 85,202, 90,129,128,136, 36, 52,195,251, +153, 76,230, 80,150,227,154,177, 28, 23,193, 18,210, 2, 2, 65, 48, 33, 36, 0, 68,224,199,241, 8,226,105, 46, 64, 99, 48,123, +135,250, 49, 2,170,143,214,169, 58,210,235,245, 76,117,173,255,113, 7, 85, 23,227,110,215,174, 29,218,250,248, 65, 95,116, 23, +207,247,236,229, 50,131,182, 9, 17, 11,183, 44, 6,128, 74,230,111,179, 34,236,216,177, 35,211, 38, 4, 20,104,238,160,215,156, +126, 46, 9, 25, 58, 3, 11,157,129,197,221, 50, 19, 10, 75,140,184,125,207,232, 22,227,179,117, 22, 71,204,255, 81,161, 14, 33, + 0, 70,218, 4,163,209, 88, 31,242,188, 66,161,128,205, 71, 30, 18, 18, 98,175,205,194,133,193,164,138, 38, 92,135, 41,209,225, +160, 71,155, 77, 22,205,223, 68,131, 54, 87,101,254,102,179, 25, 58,157, 14, 90,141,246, 81, 87, 11,191,101, 75, 90,213, 79,178, +252,193,122,223,173, 1,207,158,249,219, 24, 63, 69, 81,144, 74,165,240,246,241,170, 87,134, 71,191,148,192,215,118, 56,122,119, +223, 63, 23, 32, 24, 3,192, 12,157, 14, 0,240,201,186,142,243,185,101,150, 65,126,232,116,152, 47, 46, 4, 74,203, 92, 43, 64, + 43,220,253, 30,111,148, 2, 0,214,175, 95,143, 29, 59,118,224,211, 79, 63,197,201,147, 39, 97, 50,153, 80, 92, 92,108,211,202, + 42,211,135,135,135,195, 0, 64,128,155,143,164,189,212,209,238, 73, 61,132, 70, 82,135, 5,207,101,154,246,150,176,154, 98, 2, +220, 97,254, 0,224,174, 16, 16, 31, 31,223,216,202,252,167,124,255,253,247,151,230,205,155,247,210,198,141, 27,209,174, 93, 59, + 0, 64,203,150, 45,161, 86,171, 37, 11, 23, 46, 60,125,232,208,161, 31,227,227,227,229,181,150, 18,199, 19,112,140,148,101,153, + 32,150, 97,155,153, 89,115, 27, 1, 69,154,138,133,148, 72, 42, 18, 24,132, 94, 98,149,183,175, 64, 35,144,242,140, 84, 32,240, + 22, 50,180,223,205, 51,103, 37, 19, 67,190,112,152,239,156,156,156, 82,157, 78,199,213,100,230,239,222,189,251, 85,154,166, 27, +172, 33,117,239,222,189,193,104, 9,235, 98,220,255,153,242,214, 95,204,182,224, 54,102,119,238,128, 21, 22, 6,237,146,212,106, +211,254,109, 76,191,218,239, 84, 94, 7,119,109,236, 82,230, 43, 12, 44,180,122, 6, 26, 29, 3,117, 5, 3,149,150,113,189, 87, +214, 16,249,111,175,229,219,255,127,227,198, 13,168, 84,170,135, 54, 98,164,164,164, 64, 46,151,195, 22,244, 87,205,215,207,167, +164,164,192,104, 48,212, 71, 0,224,215,173, 91,135,130,194, 66,136, 4, 2,132, 53,110, 92,133,249, 63,251,236,179, 56,120,240, +160,179,131, 19,137,142,142,174, 46, 4, 84,177,100, 56, 27,171, 64,155,104,208, 38, 19,204,102, 26, 12,195, 86, 50,127,147,201, + 4,189, 94,143,138,138, 10,104,181,174, 11, 0,246, 46, 0, 27,220,213,252,183,164,109, 1,120,160,212,202,104,172, 78,109, 16, +158,183, 8, 1,105,105,136,179,104, 80, 46,245,149,234,204, 95, 36, 18, 65, 34,145, 64, 42,149, 66, 42,149,214,187, 77,213,230, + 18,168,105, 94,188, 61,198,166,108, 5,255, 98, 4,238,245,239,133, 96, 12,128,236,229, 85, 96,238,150, 0, 1,126, 16,150,109, +194,174, 47, 78, 3, 2,129, 75,121,169,175, 43, 64, 39,176,140, 41, 75,151, 46, 69, 73, 73, 9,214,174, 93,139,238,221,187, 99, +209,162, 69,232,213,171, 23, 12, 6, 67,117, 13,205, 38, 82, 63,108,198,239, 44,131,118,215, 29, 80,155, 32,225, 50, 29,235, 44, +142,202,190,225,174,107,204,158,249, 87, 50, 27,171, 16,224,162, 59,192,247,194,133, 11, 95,190,243,206, 59, 71,186,118,237,234, + 7, 0, 11, 22, 44, 64, 78, 78, 14, 0,160, 95,191,126,248,229,151, 95, 48,112,224, 64,239,241,227,199,231,102,102,102, 30,120, +227,141, 55,198,159, 61,123,246,190,146, 13, 10, 14,226,110,220,200,101, 50, 21, 7,247,182,105,211, 54, 51,162,165,252,146,192, + 87, 86, 44, 32, 98, 29, 37, 17,233, 41,169,151,150, 22, 10,104,240,102, 1, 39, 53,251,106, 11,203,124, 78, 30, 58,215,167, 81, + 96,216, 47, 14,133, 81, 59,159,255,182,109,219, 94, 31, 51,102,204,247, 54,179,191, 70,163,161,196, 98,113,189, 27,146,205,236, +127,224,192,129, 7,107, 1,176,105,249,145,173,219,194, 88, 82, 2, 93,129,133, 9, 14,182,106,135,174, 90, 1,110,252,113,253, + 62,218, 53, 93,151, 93, 44,114, 41,243,245,101,254,246,140,159,231,121,155,143,191, 18,102,179,185,242, 80,169, 84,208,233,116, + 80, 42,149, 15,109,228,176,205,243,223,183,111, 95,117, 75, 0,159,146,146,130,110,221,186,193,104, 52, 84, 14,116, 41, 41, 41, + 46,153,235,215,124,181, 6,102,179, 25,205,194,195, 97,102,217,218,152,191, 43, 3, 9,169,193,244, 95, 57,117,177, 46, 75,198, +125, 2, 0,109,174,100,254,167, 78,158,130,222, 96,128, 86,171,133, 90,173,134, 74,165,170,162,217,185, 10,155, 27,160, 30,126, +127,148,149,150,161,172,172, 20,165,101, 74,148,150,149,161,172,172, 12,101,165, 22,141,180, 67,199,142, 80, 90,255,119, 85,251, + 7,128,158, 61,123,254,165,245,123,123,195,199,199, 23,190, 62,190,208,106,181,209,245,100,254,110,187, 3,114, 63,157, 2,209, +203,171, 16,140, 1, 16,102,173,130,121,235,116, 32,192, 15, 59,223,141,193,173,157, 55, 49,106,249, 6, 64,248,144,151, 21, 49, +222,130, 44, 92, 6,157, 78, 7,163,209, 8,189, 94,143,172,172, 44, 44, 91,182,172,198,228, 94, 94, 54, 11,202,117,119,152,183, +187, 90,181,125,249, 18, 39,175,235, 35,100,184,218,103,171,208, 73, 75, 75, 35,177,177,177, 54,230,239,182,101, 66, 40, 20, 18, +134, 97,170, 11, 5,112, 53, 22, 96,195,134, 13,215, 98, 99, 99,187,111,220,184,113,240,209,163, 71,125,135, 14, 29,122,210,198, +252,173, 10, 36, 36, 18, 9,127,235,214, 45,209,222,189,123,219, 7, 6, 6,158, 26, 48, 96, 64,110, 77,180, 94,125,229, 85,174, +109, 68, 59,109,191,126,253, 98, 46, 93,250,243, 25,141, 78,219,152,103,204, 12, 40,152, 25, 19,101, 50,153, 76, 6, 13,138, 52, +156,201,168, 45,204, 47, 98,118,237,222,147,212, 40, 56,164,152,166,245, 14,213,247,154,180,255,242,242,114, 33, 0,248,249,249, + 61,182,110, 1,170, 54,237,127,203, 39, 31, 89,164,230,162,187, 85,158,185, 26, 11, 48,122,244,232,232, 53,111,175, 4, 96, 9, +248,219,177, 99,135,194,198,244,109,107, 2, 12,251,225, 37, 0,192,153,229,191,219,226, 3, 30, 22, 42, 27, 99, 65, 65, 65,165, +182,111, 99,250,118,149, 11,173, 86, 11,163,209,104, 55,136, 60,188, 60, 78,157,106,137,253, 48, 51, 12, 46, 93,186,132,179,103, +206,160,123,183,238, 48, 26,141, 48, 24,140, 48, 26, 12,248,241,135, 31, 96, 75,231, 76, 71, 79, 78, 78, 70,167,142,157, 96, 54, +155,113,237,218, 53, 48,102, 26,133, 5,133, 13, 90,166,182,107,235,154, 5,182,181, 11, 28, 91, 0,204, 38, 48,172,197,236,127, +226,196,239,208, 25,116,168,208,106,160, 86,171, 81,174, 82,161,188, 92, 89, 47, 65,204,102, 9,112, 83,251, 7, 0, 28, 57,114, + 4, 90,173, 22, 90,173,198,122,214,162, 81,112, 48, 58,116,236,136, 43,151, 47,227,240,145, 35, 46,211,180,105,255, 66,161, 8, + 94, 94, 94,240,241,241,129,175,143, 15,124,124,188,160, 44, 87, 70, 39, 36, 36,100, 58,213,231,234, 97,234,175, 13,231,115,203, + 96,190,184, 16,101, 56, 6, 50,114, 5,200,128,127, 33,247,211, 41,120,113,249,247,144,138, 40, 64, 36,180, 28,238,112, 29, 55, + 93, 1,133, 47,124,133,160, 77, 47, 64,175,215, 35, 40, 40, 8,229,229,229, 40, 47, 47,199,241,227,199,113,247,238,221, 74, 51, +113,101,250,194, 66,188, 27, 40, 67, 35,175,146,186, 52,224,104,123,166, 26, 27, 27, 27,101,247, 44,170,218,179,104, 23,251, 5, + 95, 7, 3,111,136, 25, 5, 46,107,254, 53,125,111, 90, 90, 26, 73, 79, 79, 39,245,252,222, 42, 66,128, 59,204,223,134,143, 63, +254,248,194, 75, 47,189, 52,126,233,210,165,237,207,159, 63, 63, 64, 38,147, 9, 94,124,241, 69, 34,145, 72,192,113, 28, 25, 57, +114,228,133,153, 51,103,118,235,210,165,203,206,201,147, 39,191, 62,121,242,228, 90,125, 81, 9,211, 18,184, 63, 47, 95, 59,213, +165,107,183,215, 78,157, 60, 57,118,231,238, 95,151,100,159, 60,217,248, 82,206, 21,233,181,194, 92,254,199,149,155,101, 75,147, + 63,237,116, 96,247,238,228, 54,173,219,236,242, 9,243, 62,178, 97,195, 6,214,217, 18, 29, 58,116, 40, 78,157, 58,213, 35, 37, + 37,101,161,209,104, 20, 45, 90,180,232,179,157, 59,119,142, 43, 44, 44,124,232,140,195,169, 58,170,237, 65,240,205, 60, 40,129, + 74,237,223,134,193, 33, 33, 88,129, 43,206,107, 29, 86, 19,255,149,211,151, 16,208,190, 17,134,253,240, 18,118, 76,220,174,176, + 73,111, 54,230,111,211,254, 93,153,101,240,203,210, 30, 13,195, 97, 9,193,229,203,151, 97,107,172,213,205,203, 34,145, 8, 34, +145, 8, 37, 37, 37, 24, 57,114,228,163,168, 39, 34,151,203,249,148,148, 20,244,233,211, 7, 70,147, 9, 6,163, 1, 70,107,112, +147,193,104,113, 3,172, 94,189, 26,137,137,137,142, 6, 19,126,249,242,229, 96, 89, 22,167, 79,159,129, 72,104, 49,219,182,109, +219, 22, 55,243,242, 80, 88, 88,136, 77,155,126,198,184,113,175, 2, 0, 95,205, 18, 80,235, 0,148,154,154, 42, 6,192, 36, 36, + 36,112, 53,105, 64,174, 76, 85,180,105,254, 89, 89, 89,208, 85,232, 43, 5, 48,141, 86, 3,141, 70, 13,141,198, 61, 23,128,189, +246, 63,110,220,184, 74, 11,128,171,130,192,184,113,227,170, 92, 71,200,229,232,208,209, 18, 20,119,229,242,101,220,180, 90, 60, +198,141, 27,231,114,212,126,255,167,251, 67, 34,150, 64, 38,147, 65, 42,149, 66, 34,145,160,168,168,200,105,230,111,167,237, 55, +104, 3, 28,187,108, 29,126, 1, 48, 98,233,255,129, 79,155, 13, 18,151,140,243,185,101, 32, 65,129,184, 94,160,177,104,255, 46, +186, 0,236,250, 31,177, 9, 2,246,215, 14, 97, 48, 0, 2,139,178,247,151,121,223,194,232,205,102, 51,190,249,230, 27, 12, 30, +252, 87, 92,216,193, 73,225, 64,177, 30,237,247,148,163, 71, 72,203, 26, 73,214, 16,229,110,239,242, 84, 56, 72,235, 44,195, 38, +245,176, 40,212,101,141,112, 89,144,120,208,223,107, 21, 2,234, 61, 11, 96,233,210,165,155,102,204,152, 17,114,238,194,133, 56, +131,193,208, 77,161, 56, 36,147, 72, 37, 66,138, 80, 56,116,232,144,111,167, 78,157, 54,196,198,198,254,107,236,216,177, 14,181, +245,204, 67,251,185, 81, 47,141, 58,220,189,123,207, 57, 52, 99, 26,113, 61,231,218, 18, 46, 47,151, 1,192, 75, 65,153,187,182, +105,159, 22, 26, 26,178, 71, 32, 20,255,248,239,121, 73,244, 23,139, 62,119, 88, 75,125,250,244,249,124,232,208,161, 0,128,146, +146, 18, 28, 56,112,192,239,187,239,190, 91, 2, 0,167, 78,157,234,211,185,115,231,125, 79,132, 0, 96, 91,248,231,217, 31, 55, + 58,210,236, 93,153, 18, 72,182,205,217,194,247,154,211, 15,193, 93, 27, 87, 50,253, 74,115,234,197, 34,156, 89,254,187,171,102, +171,134,154,147, 74, 0,240, 29, 59,118,196,197,139, 23,171, 48, 22,149, 74,149, 11,160,181,139,210,252,131,180, 4,220,247,155, + 63,254,240, 35,140, 70, 35, 76,180, 9, 52, 77, 99,249,242,229,117, 45,146,195, 47, 95,190,188,242,130,227, 88, 72,101, 62, 48, + 24,140,184,124,233, 18,132, 34, 17,204, 52, 13, 47,111, 47,108,218,180, 9, 2,129, 0,113,113,113,120,246,217,103,249,178,178, +218, 3,188,150, 47, 95,190, 47, 33, 33,129, 78, 77, 77, 13,181,149, 77,181,117, 0, 92, 50,109,206,153, 51, 7,199,142, 29, 67, + 69, 69, 5, 42,116, 58,104, 53, 26, 43,243,215, 64,171,209,162, 66, 91, 1,157,221,128,239, 76,217, 69, 70, 70,242,217,217,217, +149,218,127, 77,211, 0,157, 93, 4,200, 58, 23,191, 74, 93,216,152,190,205,247,232,202, 42,133,182, 21,254, 0,192,199,203, 7, + 82,153, 20, 90,173, 54,218,230,218,113,131,249, 63,144,249,218, 54, 33, 96,204,210,239,192,111, 5, 26, 77, 74, 69,230,123, 49, + 24,152,244, 19, 32, 18,193, 91, 90, 63, 63,103,117, 65, 0, 0,198, 29, 27,231,224,173,123,232,186,207, 11, 69,191,234, 81,190, +248,175,187,102,179, 25,131, 6, 13, 2, 0,132, 7,202,240,223,212,230,248,116,217,109,124,117,198,224, 72, 35,182,159, 22,135, +218,254,183, 75,155,233,198,152,213, 80,115,235, 27,194,231,255, 32,191,183, 82, 8,104,136,246,247,229,151, 95,126,249,198,164, + 55,246, 62,213, 59,178,143, 86,163, 9, 98, 88,198, 20, 22, 22, 86, 18, 30, 30, 94,164,209,104,206,143, 29, 59,214,233, 65,225, +215,237,191,114, 0, 54,189, 54,225,173,172, 1, 3, 7,110,151,201,100,254, 4, 60, 71, 8, 1,199,241,106,131,174, 92,113,245, + 66,190,214, 91, 34,118,106,156,183, 49,127,192, 18, 72, 93, 61, 80,111,217,178,101,255,122, 34, 4, 0, 43, 83,119, 88, 97, 59, +118,236,112,185,177,158, 89,254, 59, 15, 0, 54, 65,192,142,241, 55, 36, 67,119,187, 35,117,237,218, 21,167, 78,157, 66, 73, 73, +165,137,176, 53, 0,216,152,223,196,137, 19, 31,117,125, 85, 41,163,148,148, 20,254,181,137,175, 97,245,234, 53, 86,159, 57,131, + 57,115,230,212, 57,125,201,197, 21,244, 44,154,211,193,131,142, 54,155,232,184,124,249,242,107, 9, 9, 9,197,169,169,169,130, +132,132,132,202,128, 64,235,180, 64,167, 7, 58,155,198, 60, 96,192,128, 6, 47,187,200,200, 72,222, 94,139,183,143, 1,112, 99, + 5, 64, 2,128,223,180,105,211,125, 90,190,213, 66,224,114,123,222,180,105, 19,113,213, 98,224, 12,234, 50,253,187, 42, 44,140, + 93,182, 14,176, 91,248,103,200, 71,127, 77, 71,214, 53, 84, 69,217, 89, 0, 28,173, 4, 88, 56,160, 16,133, 0,122,125, 26,136, +197,167,219, 33, 4, 64, 73,174, 14,109,218,180,177, 48,141,197,129,120,238,169, 16, 68, 60,151,227,172, 70,236,180,123,211,154, +150,184, 59,222, 52,208,152, 87, 47, 90, 15,233,123, 27, 12,235,214,175,187, 6,224, 90, 67,209,251,241,167,111,243,208, 0, 81, +161, 13, 25,152,103,197,172,135, 81,158, 15,123, 51, 32, 50,122,244,232,168, 29,203, 31,203,189, 0, 8, 0,254,169,167,158,194, +158, 61,123,140, 86,166,207, 1,240,122, 64,150,135,122,195, 22, 36,152,152, 56,141,183,106,254,143, 36,111,115,230,204,105, 89, +147, 89,210,110, 26,161, 43,218, 14,121,192,117, 92,153,159,250, 46,251, 91,219,170,124,174, 50,113, 71,107,251, 55, 4,234,227, + 18,152, 59,119, 46,110,220,184,209, 96,121,113,102,121, 95, 87,113,230,131,114,156,129, 37, 48,116,112,172, 12,191,157,104,135, + 48, 47, 31,252,153,125, 15,237,157,100,254, 78,180,191,199,117, 57, 92,242,128,222,245, 44,207,238, 28,154, 54, 48,189,228,135, +149,241,135,190, 27, 96,117, 11,131, 27,150,132, 7, 46, 4,140, 28, 57, 82,250,132, 53, 64,183, 52,251,134,250,237,212,212, 84, +219, 10, 53, 76, 66, 66, 66,125,167, 50,121,208,240,204,191, 94,117,145,148,148,212, 32,117,153,154,154, 42, 76, 24,152,240,192, +219,197,145, 52, 3,142,164,229, 60,246,125,214,211, 50, 61,120,228,141,208,221,125,132, 61,240,192, 3, 15, 60,240,192,131, 39, + 23,148,167, 8, 60,240,192, 3, 15, 60,240,192, 35, 0,120,224,129, 7, 30,120,224,129, 7, 30, 1,192, 3, 15, 60,240,192, 3, + 15, 60,240, 8, 0, 30,120,224,129, 7, 30,120,224, 1, 0,156, 4, 80, 98, 61, 63,145,168, 50, 11,224,220,185,115,110, 71,166, +214, 20, 76,232,161,231,161,231,161,231,161,231, 36,189, 58,167,137, 62, 6,244, 60,245,235,161, 87,133,249,159, 61,123,118, 24, + 96,217, 96,146, 16, 98,124,220,190,215, 99, 1,240,192, 3, 15,224,239,239, 79,249,251,251, 19,127,127,127, 17, 0,193,227,150, + 63,219,190,243,118,251,207,215, 23, 53,173,143,239,193, 99,132,255,251,191,255,139,122,194, 63,161, 15, 0,219,178,195,162, 39, +245, 35, 60, 2,192,223, 28,245,216,110,221,101, 12, 27, 54, 44,202, 58,232, 86, 30,214,123,127, 75,122,143, 57, 72,203,176, 48, + 2, 0,106,181,154, 83,171,213,188, 90,173, 54, 3, 96,221, 33,246,246,115, 93, 11,166,140,232, 58, 26, 0,166,140,232,250,195, +219,207,117, 93, 3, 0,115,198, 60, 69,230,188, 28, 41,122,123,120, 23,183,214, 20,177, 95,138, 54, 45, 45,173,202,230, 59,245, + 97,254,118,237,190, 33,215,218,175, 47,205,134,166,247,196, 50,255, 61,123,246, 40,254, 6,159,194,160,225, 86,116,172, 21, 77, +130, 37,164,109,227, 80,170,133,188, 25, 9, 11, 8, 22,120, 75, 68, 13,246,123,194,191, 73,155,162, 0,200, 96, 49,199,112,240, +160,138, 0,224,196,222, 42, 38, 0,146,250,254, 84, 70, 70, 6,146,147,147,171, 44,255, 55,107,214, 44, 91, 71, 39,238,208,227, + 54, 7, 86,173,232, 87, 50, 30, 23,122,143,125,213, 71,120,203,248,136, 86,114, 0, 64, 17,205, 76,104, 44, 22,254,100,123,120, + 69, 83, 33, 41, 42, 45,165,157, 33, 52,121,120,151, 28,150,229,195,159,238,223,200,175,125,251, 1,251, 37, 18,234,214,180,164, + 62,255,254, 15,185,136,123,106,253,255,137,132,228, 87,128, 92, 2,208,217,213, 76, 86, 95,138,182,158,203,205, 86, 97,254,118, +109,223,221, 65,154,184,120,255, 97,211,123, 98,153, 63,199,113, 32,132, 96,240,224,193,252,145, 35, 71,136,139,117, 44, 6, 96, +110,136,252, 4, 5, 5, 77, 81, 42,149, 95,187,249,186, 4,128,209,206, 18,208,160, 24,208,173, 7,121, 45, 60, 66,168,106,209, + 72, 16,218, 49,156, 18,146, 80,162, 87,171, 57, 41,194, 88,170,103, 51,246,245, 81,195,217,250,254,134,179, 2, 64, 8,128, 72, + 0,217,176, 4, 61, 60, 78,240, 3, 48, 20,192, 24, 0,219, 0, 28, 0,160,105, 0,186, 63, 3,120,181,129, 24,236,163,147,140, + 40,135, 70,158, 62,214, 14, 21, 10,160,216,221,129,119,230,204,153,104,209,162,197,125,219,133, 38, 39, 39, 71,231,231,231, 43, + 86,174, 92,233,202, 32,204,175,159,238,141,248,129,247,111, 46,195,109, 14,196,134,255,210,152,180, 74,247,200,232, 45, 95,190, + 60,234,195, 15, 63, 84,196,197,197,225,231,159,127, 38, 0,240,206, 59,239, 68,173, 93,187, 86,209,162, 69, 11,112, 28, 7,131, +193,128,168,168, 40,108,221,186,213, 33,205,117,203, 63,139,106,255,225, 22, 69, 70,175,102,209,243,179,211, 51, 1, 96,205,194, + 53, 81, 87,231, 51, 10,182,133, 31, 52,156, 55,202, 13,126, 40,246, 63, 21,125,242,198, 39,153,142,232,181,106, 22,214,184,133, + 88,118,119,250,180,137,166, 48,153, 88,172, 81, 26,200,242,239, 54,254,244,209,212,215, 16, 40,147,241, 70, 51,203,127,178,250, + 59, 83, 81,105, 41,105,220, 56, 88, 88, 84, 84, 86,107, 35, 57,179,237,229,182, 59,118,222, 14, 24,240,116, 72,114,207,222, 65, +162,245,235,175,203, 67, 26,201, 74, 63,127,239, 68,242,140,151,122,176, 79,247,111,148,149,115, 77,155, 63, 41,190,245,200,111, +246, 95,172, 15, 83,172,175, 38,197,215,100,241,170,167, 16, 80,219, 59,238,230,181,161,233, 61,177,204,127,214,172, 89, 24, 60, +120, 48,255,223,255,254,215, 29, 82, 52, 44,102,119,166, 1,178, 85, 20, 20, 20, 52, 70,169, 84,110,115,227, 93,127,171,210, 25, + 8,224,110,124,124,124, 0,128, 41,214,107, 27,238, 1,248,117,195,134, 13,185,206, 18,253, 98,237, 23, 20, 93,106, 18,209, 38, +163,180, 28,102,169, 72, 36, 20,106,140, 82, 74, 44, 54,112, 2, 63,111,134,150,153,205,194,162, 59,166,239,191, 89,111,124,125, +242, 36,182, 62,109,199, 25, 23, 64,115, 0, 63, 0,136,177,158,155, 63, 70,109, 42, 24,192, 38, 0,207, 3, 56, 14, 96,132,245, + 58,184, 1,104,191, 2, 39,252,165, 15,211,196,254,128,208, 15,192, 85, 0, 17,238,104, 35, 54, 19,186, 61,243,159, 53,107,150, +194, 78,243,175,124,230,140,185,221,150,198,158, 89, 83,175,148,131,122,165,188,242,218,246,236, 81,208, 3,128, 19, 39, 78, 40, +164, 82, 41,178,178,178,238, 19,182,242,243,243, 73, 65, 65, 1,233,215,175, 95,244,238,221,187,157, 42,195,198, 39, 46, 41,120, +169, 8,221, 74,196, 85,180, 97, 66,241, 88,147,255, 6,249,161, 32,142,200, 71, 92,140,102,238,188,224,208,108, 26,213, 74,206, +183, 16,203,238,190,255,238, 4, 83, 51, 31,177, 88,125,233, 24,241, 42,190,128, 25,131,218,162,105,128, 12,197,103,142,146,123, +167,143, 81,179,166, 76,164,163, 90,201,249, 14, 94,190,230,186, 52,152, 70,141,196, 67,196, 98, 74,122,252,248,221,153,167, 78, +222,233, 24,214,172,149, 57,160, 81, 51,226,235, 11,175, 86, 17, 94, 17, 65, 65,146, 54, 28,207,155,118,157, 44,214, 61,194, 54, +204,219, 51,123,219, 81, 67, 31,229,157,165, 85,237, 92,253,168, 41,221,195,162,247,196, 50,255,221,187,119, 43, 8, 33,160, 40, + 10,217,217,217, 56,122,244,168, 91,180, 88,150,189, 96,181, 0, 52, 68, 60,139, 76,169, 84,110, 11, 10, 10,122,217,141,119,205, +214,250, 50,197,199,199,135, 1, 88,113,240,224,193,127,103,100,100,188,111, 59, 14, 28, 56,176, 92,161, 80,228,196,199,199,207, +119,134,224,172,185,179,132,165,119, 74,188, 12,188, 41,128, 23,146, 80, 94, 34,105,204,137,196,141, 57, 66,133,114, 68, 24,194, + 8, 4, 65, 28, 71,252,117,132,245, 97,196,148,236,155, 99,123,132,210, 23, 67, 31,168, 0,240, 5,128,131, 0,102, 88,207, 95, +212,163,176, 3, 1, 44, 0,176,219, 90,112,187,173,215,129,110,210, 59, 2, 96, 15,128, 4, 0,107, 1,252,195, 74,243, 72, 61, + 27,133,191,245,236,221, 0, 26, 54,172, 26,246, 2,235,249,113,195, 83, 0,142, 1,104,108, 21,158, 94,115,229,229,140,140, 12, +133,189,217,127,214,172, 89,138,228,228,228,232,228,228,228,104,123, 33, 32, 57, 57, 57, 58, 35, 35, 67,225, 12, 61,123, 51, 61, +245, 74, 57,174,237,153,136,107,123, 38, 86, 97,218,220,230, 64,184, 75,207, 42,228, 16,119,232,165,164,164, 68, 29, 63,126, 28, + 19, 38, 76, 64,126,126, 62, 18, 18, 18,162,106, 74, 35,149, 74, 21, 77,154, 52,113, 88,126,169, 41, 41, 81, 77,142,255,129,130, + 9, 3, 32,206, 87,227,235, 5,159, 71, 85, 87,142, 83, 82, 82,163, 68,198, 22,138,160, 38, 6,135,204,127,202,228, 87,232, 79, +102, 78,228,197,183,206,136, 3,239, 93, 36, 23,239,106, 16, 30,226,141,167, 59,133,161,169,234, 42,110,104, 13, 16,114, 60, 2, +136, 64,244,207,183, 38,240,211,223,121,243,106, 84, 43,121,173, 76,167, 92,165, 13,234,211,199, 39,185,107,191,231,205,190, 65, +173, 37, 62, 1,161,156,204,199,219, 20,212, 40,216, 24, 18,222, 92, 88,174,212, 74, 52,106, 6,229,106,147,211,131,144,213,207, +239,144,113, 58, 25, 15,112,159,230, 95,147, 80,238,130, 16, 64,106, 56, 87, 63,106, 74,231, 20, 61,126, 75,224,125,135,139,244, +158, 56, 80, 20,197,239,221,187, 87,193,113, 28,222,123,239, 61, 16, 66,112,244,232, 81, 88,182,222,229,136, 27,244, 64,211,244, + 89,171, 5,160,190,110,108, 37, 0, 40,149,202,173, 65, 65, 65,209,238,240, 79,154,166,133, 0,190, 62,112,224, 64,252,162, 69, +139,238, 16, 66,196,182, 3,128, 40, 56, 56,152, 28, 58,116,104, 94,124,124,252,116, 71, 4, 5, 68, 36,161, 25,222,207,100, 50, +135,178, 28,215,140,229,184, 8,150,144, 22, 16, 8,130, 9, 33, 1, 32, 2, 63,142, 71, 16, 79,115, 1, 26,131,217, 59,212,143, + 17, 80,125,180, 15, 76, 0, 8,183,106,252,159,194,178,219,231,167,214,235,112, 55,126,107, 34,128,124,107, 3,159, 11, 32,200, +122, 38,214,251,174,238,181,251, 47, 0,215, 1,172,177,154,131, 36,214, 6,241,149,245,126,125,246, 95, 30, 12,139,171, 99, 72, + 3,245,129, 55, 1,204,183,158, 31, 55,116, 6,176, 29,192,179, 86, 75, 74,103,119, 9,217,152,191, 61,211,183, 23, 2, 92,110, +156, 86,230,111, 67,117, 33,192, 29,122,213, 6, 88,226, 42,189,195,135, 15,131,166,105,244,238,221, 59,186, 67,135, 14,200,203, +203,171,252, 62,142,227, 32,151,203,249,121,243,230, 41,142, 31, 63,142,145, 35, 71, 58, 28, 80,140, 89,167, 64,209, 12, 84,189, +229,209,166, 14,193,184,190,238,240, 95, 76,139,227, 49, 77,190,142, 63, 60, 47, 88,113,243,184, 63,134,189,113,205,241, 0, 69, + 9, 42, 74, 46,102,113, 69, 42, 35,202, 42,104, 62,166, 71, 11,222, 95, 38,198, 29,149, 14, 37,106, 3,226,122,182,224, 41, 66, +248,223,127,221, 7,245,145, 19,252,153,109,187,110,213, 69, 46,235,108,211,105, 33,161,126,173,155,182,136, 96,188,100, 92,235, +193,207,199,249,180,234,157,240, 66,227,118, 47, 14, 11,106, 26,217, 93, 89,209, 56,198, 76,155,205, 55,114,117,126, 78, 50,127, +222,217, 45,104,211,210,210, 20, 14,102, 6,212,248,204, 9,151,156,103,118,192, 67,212,252,121,158,135,217,252,151,203,126,224, +192,129,182,254,226, 46,227, 50,139, 68, 34, 51,199,113,199,173, 90,120,125,132,128,208, 74, 73, 64,169, 84, 4, 5, 5, 37,184, +240,110,185, 74,165,146, 28, 62,124,248,181, 3, 7, 14, 60,255,253,247,223,151,205,155, 55,175,197,198,141, 27,209,174, 93, 59, + 0, 64,203,150, 45,161, 86,171,201,194,133, 11,139, 15, 29, 58,244,121,124,124,252,192, 58, 41,114,140,148,101,153, 32,150, 97, +155,153, 89,115, 27, 1, 69,154,138,133,148, 72, 42, 18, 24,132, 94, 98,149,183,175, 64, 35,144,242,140, 84, 32,240, 22, 50,180, +223,205, 51,103, 37, 19, 67,190,112,187, 61, 59, 18, 0,158,179,106,135,246, 56,102,189,239, 10,198, 3,120, 15,128,220,202, 8, +255, 0, 80,110, 61,207,183,222,127,207,154,206, 25,120,193,226,107,137,183, 94,155,236, 14, 88,239, 79,193,253, 91,249, 58,139, + 87, 0,124,103, 61,215, 23,111, 0,152,102, 45,179,105,214,235,199, 5,109, 96, 9,154,220, 5, 32, 17,192, 84, 0, 81,158, 97, +171,118, 20, 22, 22, 42,250,246,237,139,169, 83,167,102,246,237,219, 23, 39, 78,156,192,218,181,107,163, 26, 55,110,172,160, 40, + 10,121,121,121,164,180,180,148, 76,159, 62, 61,250,200,145, 35,138,201,147, 39,215,217, 57,251,223,188,163, 40,234,219, 17, 9, + 83,167,102,254, 25,198, 70,119, 86, 7, 41, 82,215,166, 70, 89,164, 19, 96, 77,222, 27,100, 83,105, 12, 25, 60,189, 48,250,104, +154, 92, 17,253,244,167,181,214, 79, 1,205,172,248,250,235,141, 65, 91, 47, 20,222,222,120, 38, 95,181,238,248, 13,221,205, 34, + 35, 79,241, 20,140,122, 22, 37, 37, 52,178,243,203,217, 29,121,133,218,221,119,138, 84,191,220, 42,184,114,172,168,120,248,109, +147,249,179,218,104,250, 5,134, 55, 51, 84,148, 55,237, 20,249, 12, 69,147,150,131, 11,175,108, 55, 4, 6,121,203, 90,117,236, + 81,194, 51, 37, 23,136,192, 47,132,227, 56,193,189,123, 6,103,172,120,188, 45,226,223,142, 17, 87, 55,131,219, 95,195,154,158, +119, 66,195,174,212,244,109,135, 51,233, 61,120,176,168,168,168, 80, 0,128, 80, 40,196,236,217,179,145,157,157, 13, 55,253,254, +246, 48, 1, 48,153, 76, 38, 83, 97, 97, 97, 6,234, 23, 16,168,173, 98, 14, 80, 42, 83,131,130,130, 70, 57,249,174,212,104, 52, +134,207,153, 51, 39,249,157,119,222,209,119,237,218, 85, 2, 0, 11, 22, 44, 64, 78,142,101, 55,202,126,253,250,129,227, 56, 12, + 28, 56, 80, 50,126,252,120,237,149, 43, 87, 14,189,241,198, 27,125,188,188,106,102, 77, 28,199, 51,153, 7, 15,238,205,203,187, + 49,158, 53,179,141, 4, 34,153, 73, 64,164, 58, 74, 34,214, 83, 82, 47, 45, 45,242,170, 0, 37, 81,115, 82,214,172, 85,151,249, + 40,118,158, 27,197,158, 58,235,118, 0,183, 35, 1, 96, 56,128, 67,213,238, 29,178,222,119, 22, 2, 0, 31, 1,136, 3, 80, 86, + 75,154, 50,235,243,143,224,156, 95,103, 60,128,253, 0,212,181, 60, 87, 91,159,143,119,163, 76,158,129, 37,134, 96,153,245,252, + 76, 61, 26, 87,140,213,106,210,207,154,159,126,214,235, 24, 23,233, 4, 2, 8,112,226,112,213,149,210, 31,150, 85,172,108, 65, + 72,183,172,150, 30,183,226, 60,170,107,252,213, 45, 2,174,130,219, 28,136,182, 35,127,168,188,110, 59,242,135,251,162,248, 93, +165, 87,141,153,240,174,208, 91,189,122, 53,159,157,157,192,140, 1,163, 0, 0, 32, 0, 73, 68, 65, 84,141,211,167, 79,163, 89, +179,102,252,111,191,253, 6,141, 70,131,203,151, 47,223,167,209,126,244,209, 71,153,157, 58,117,138,222,178,101, 75,173,244,190, + 89,189,154,111,158,125, 17,161,167,115,160,104, 54,146,239,122,149, 81, 80, 26, 51,216,203, 21,247,165,125,255,163,183, 50, 91, + 68,158,142,190,245,199, 43,181,106,207,215, 11, 10, 62, 40,160,153, 21, 37,165, 6, 57,109, 96, 3,115,238,104,124,118, 95, 41, + 44, 51,181,236,142, 78,161, 65, 0,128,221,231,238, 9,115,139, 42,252, 0, 4, 22,209,198, 78,183, 77,230,216,220,194,194, 15, +106,163, 57,228,133, 56,170,195,224, 37, 93, 25,221, 31,249, 45, 58, 14,149,137, 68, 44,125,253,143, 12, 85, 97,254,229,123,197, +249,191,231,107,148,133, 0, 69, 17,165,150,246,159, 18,215,211, 81,187, 33,177,177,177,213,153,113,117,179,186,253, 53,172,233, + 31, 86, 52,190, 7, 13,136,193,131, 7,243,135, 15, 31, 6,183, 57, 0, 60,207,227,243,207, 63,199,145, 35, 71,108,130,154,219, +117, 80, 94, 94,110, 34,132, 12, 58,117,234,148, 49, 60, 60,124, 88, 61,173, 58, 1,128,101, 54,128,245, 60, 17, 0, 23, 20, 20, +228,140,162,102,108,220,184,177,122,223,190,125,111,110,220,184,209,255,232,209,163,226,161, 67,135,170,109,204, 31,176,108,119, + 47,145, 72,112,235,214, 45,106,239,222,189,126,129,129,129,119, 7, 12, 24,144,203,113, 53, 79, 86,107, 27,209, 78,219,175, 95, +191,152, 75,151,254,124, 70,163,211, 54,230, 25, 51, 3, 10,102,198, 68,153, 76, 38,147, 65,131, 34, 13,103, 50,106, 11,243,139, +152, 93,187,247, 36, 53, 10, 14, 41,166,105,189,219,179, 16,168, 26, 58, 6,101, 61,154,194,226, 23, 62,108,119,143,178, 94, 55, +182, 62,183,221,171,171,131,206,128, 37, 64,239,102, 53, 58,213,143,155,214,116, 51, 28,208,163, 0,140, 5,240,189, 3,122,223, + 91,211, 81, 78,208,179, 29,173, 96,137,115,248, 24,150,153, 4, 31, 91,175, 91, 85, 75,231, 12,189,241, 0,222,177, 50, 89,131, +245,158,193,122,253,142,245,185, 51,244,226, 97,137,115,112,246,136,119, 34,127,159, 1,248, 15,128, 81,214, 50,167, 0, 72, 1, +156,176, 90,101,250, 2, 72,178, 62,175, 43,127, 24, 54,108,216,125,190,126, 91, 16, 96,245,216,128, 97,195,134, 57, 20, 6,134, + 13, 27, 22, 93,221, 55,223,118,228, 15,247, 49,127,234,149,114,184, 75,207,166,101,186, 74,239,220,185,115,104,209,162, 5,238, +221,187, 71, 10, 10, 10,200,221,187,119, 73,255,254,253,239, 11, 6,172, 52, 83,121,121, 41,164, 82,105,173,244,228,231,206, 65, +213,162, 9,122,220, 59, 65,162, 11,246,144,151,238,110, 38,103,125,138,163,217, 44,117,141, 76, 62, 63,135,134, 68, 90,183,178, +115,189,160, 96, 78, 1,205,196, 20,208,204,138,219,180,249,243,115, 55, 75, 66,244, 12, 3,181,209, 98, 28,187, 84, 82,130,155, + 70,122,195,109,147,121,205,109,154,249, 34,183,176, 48, 29,117, 76,157,109, 42,239, 48, 39,160,105,191,208,210,252, 3, 90,134, + 49,149, 23, 22, 73,155, 93, 56,113,202,255,242,185,243,109,242,110,177, 61,111,223,188, 13,177, 72, 24,218, 57,204,123,188, 74, +107,110,227,168, 62,210,210,210, 72,108,108,172, 83, 66, 97,108,108,108,116, 90, 90,154,203,140,194, 62, 16,240,113,158,161,243, +119,198,144, 33,131,249,204,204,204,202, 24,135,253,243,124,193,243, 60, 6, 15, 30, 92, 31,211, 63,172, 76, 58, 26, 0,158,126, +250,105,125, 53,193,209, 45,121, 34, 40, 40,104,130,157,114,106, 82, 42,149,187,149, 74,229,186, 58,222,177,165,229, 0, 84,132, +133,133, 93,120,233,165,151, 86, 47, 93,186,212,235,252,249,243,254, 50,153, 12, 47,190,248, 34, 36, 18, 9, 56,142,195,200,145, + 35, 43,102,206,156, 25,208,165, 75,151, 43,147, 39, 79,238, 60,121,242,228, 50,163,177,230,133, 3, 19,166, 37,112,127, 94,190, +118,170, 75,215,110,175,157, 58,121,114,236,206,221,191, 46,201, 62,121,178,241,165,156, 43,210,107,133,185,252,143, 43, 55,203, +150, 38,127,218,233,192,238,221,201,109, 90,183,217,229, 19,230,125,100,195,134, 13,110, 79, 7, 20,214,160,173, 71, 2, 24, 0, + 96, 17,128,233,214,193,210,187,154,217,238, 7, 88,252,236,159,192,226, 18,200,174, 67,192,120,202,170,253, 58, 99,142, 63,110, +181, 46, 80,117,208, 11, 1,208, 18,192,105, 7, 52, 79, 91,211,133,162,246,169,139, 20, 44,129,121,129, 86,198,249, 18, 44, 83, +255,114,172,180,115,172,215, 27, 97,241,147,111,128,197,117, 65, 59,160,247, 10,128,111, 0,116, 0, 80, 84, 45,159,119, 97, 9, + 90,188, 98, 77,187,217, 1,189,247, 96,153,221,160,119,162,252,188, 0,236, 3,240,147,131,250,120, 25,192,191,173,231,179,118, +249, 19, 89,235, 50, 13,192, 42, 0,139,173,207,239,214,246,131, 25, 25, 25,153, 0,144,159,159,175,176, 69,251, 87,215,250,243, +243,243, 21,246,105,235,130, 45,205,134,255,210,149,209,249,213,181,244, 13,255,165,241, 40,232,101,101,101, 97,208,160, 65,184, +114,229,202, 95, 76, 92, 46,143,222,178,101,139,162, 85,171, 86,209, 28,199, 41, 90,182,108,201,219,166, 1,238,218,181, 11,145, +145,145,209,123,247,238,173,145, 94,251,172, 44,252, 28, 28, 90,165,172, 58, 38, 14,135,238,211,219,192,179,161,224, 57, 96, 90, +203,239,248, 10,206, 7, 74,131, 31,148, 57, 65,232, 62,104,103,244,229, 95,234, 54,179, 95, 47, 40,216, 10, 96,107,235, 22, 77, +219, 3,248,135,137,229,144,126, 33, 15,131,194, 44,238, 78,194,243, 90, 45,195, 44, 42, 46, 46,190,231, 4, 51,253,148,231,121, +239,156, 43,202,215, 84,167,183, 52, 42,190,171, 68,241, 61, 45,132,194, 50,239,138,114, 30, 42, 13,203,135,134,136, 3,132, 28, +198, 24, 76,236,207,139,222,123, 58,224,147, 47,142,171, 28, 8, 1,153, 78, 12,216,164,154,187,192, 53, 12,181, 90, 94, 14,196, +185,250,166,205, 26,230, 40, 42,223, 62, 29,113,150, 30,137, 43, 71, 61,233, 61, 9,224, 51,167, 93, 4,210, 45,147,177,246, 95, + 96,176, 78, 97,233, 99, 46,206,249,175,181,109, 8, 4,130, 16,161, 80, 88,124,252,248,241,111,159,126,250,233,250,148, 89, 11, +165, 82,185,198, 42, 88,188,162, 84, 42, 55,219,206,117,188,179, 9, 22,151, 41,111, 29,187, 43,150, 46, 93, 58,125,198,140, 25, + 77,207, 93,184, 48,212, 96, 48,248, 42, 20,135,136, 68, 42, 1, 69, 40, 28, 58,116, 72,212,169, 83,167,179,177,177,177, 35,199, +142, 29, 91,225, 40, 67,153,135,246,115,163, 94, 26,117,184,123,247,158,115,104,198, 52,226,122,206,181, 37, 92, 94, 46, 3,128, +151,130, 50,119,109,211, 62, 45, 52, 52,100,143, 64, 40,254,241,223,243,146,232, 47, 22,125,238,118, 65,214, 36, 0,252,195, 42, +225,188, 0,224, 50, 0,159, 26,222,219, 99,213,216, 99, 96,153, 71, 30, 95,135,249,191,173,181,192,156, 17, 0,202,172,233, 5, +117,208,139, 2,112,205, 73,122,215,172,233,127,169,131,222, 20, 0,147, 0, 92, 4, 48,211,250, 93,246,180, 21, 0,242, 96,241, +223,239, 6,176, 30,150, 25, 7,181,209,155,104, 45,143, 30, 86, 43, 66, 77,249,212, 88,159,167, 88,133,128,245,117,208,251,222, +218,208,188,156, 28,188,190,119, 80,126,159, 89, 45, 27,251,173, 66, 13,170,209,254, 13, 64, 39,107, 93,228, 88, 5, 41,135,166, + 93,235, 60,127, 69, 3, 45, 4, 68, 38,173,210,241,147, 86,233,106, 88,184,167, 28,143,138,222,159,127,254, 73,254,252,243,207, + 42,247,126,250,233,167, 76, 0,100,243,230,205, 0, 64,110,221,170, 26, 83, 87, 27,243, 7,128,230,127,254, 73,128,170,244,222, + 94, 50,203,194, 28,151, 89,243, 84, 61, 68,239, 23, 23, 70, 97,150,207,131, 16, 16, 84,160,146,249, 91,185,250, 61,169, 84,234, +148,217,144,231,121, 66, 8, 89, 48, 39,174,179, 87, 88,179,150,163, 56,120,181, 45,200, 47, 18,152,141, 42,190,113,168, 15,241, +241, 22, 17,198,204,161, 92, 69, 51, 68, 70,100,106, 45,211,166, 14,133,160,182, 54, 91,253,255, 71,201, 0,237,221, 17,206,204, +219, 39, 15,153,222, 99,207,252,185,205,129,216,127,193, 50, 69,127,189,130,198,207,199,105, 91, 76, 6,105,168,250, 97, 89,182, + 12, 0,122,245,234, 85,175, 5,129,108,204,223,138, 82,235,217, 81,223, 72,180, 27, 79,205, 0, 10, 0,224,203, 47,191,124,249, +141, 73,111, 12,123,170,119,228, 24,173, 70, 19,194,176,140, 49, 44, 44,172, 48, 60, 60, 60, 87,163,209,108, 27, 59,118,108,169, +179,249,250,117,251,175, 28,128, 77,175, 77,120, 43,107,192,192,129,219,101, 50,153, 63, 1,207, 89,102, 78,240,106,131,174, 92, +113,245, 66,190,214, 91, 34,174, 87, 64,107,117, 1,128,133, 37, 72,205, 25, 63,252, 41,235,193,162,246,229, 69, 89, 88, 34,234, +157,157,175,169,128,101, 33,159,186,232,237,128, 37,104,205, 25,188,230, 68,254,190, 6,240,173,163,177, 31,192,187,118,239,212, + 69,239, 7,171,197,192, 17,242,172,154,189, 51,249,115,101,190,235,215, 14,232, 61,235, 4, 61,155,181, 97,189,181,108,156, 49, + 49,145, 97,195,134, 69, 85,143,250, 31, 54,108, 88,180, 51,154,122,109,244,236, 86,234,123,220,232, 61,246,184, 81,120,215, 68, + 53,107,182,254,157, 79, 83, 38,217,238,209, 34,234, 39,163,158,219, 87,148,159,175,117,170,208, 8,225,255, 61,165, 31,249,248, +235,223,231,236, 90, 21,186,237,196,201,187, 83, 67,252,185, 23,169, 32,191, 0,158, 7, 8,225, 77, 38,134, 43,226,128, 82,218, +196, 5, 20,222, 53,184,228,143,180,154,249, 21,213,174, 31,151, 34,244,172, 4,232, 38,158, 91,172,125,208,223,200, 1,104, 34, +149, 74,239,246,234,213,235,217, 51,103,206,212,155,160, 82,169, 60, 24, 20, 20, 52, 73,169, 84,174,119,242, 21,129, 53, 31,149, +227,233,186,245,235, 50, 0,100, 52,212, 71,254,248,211,183,121, 86, 94,241, 64, 80,147, 0, 96,116,131, 14, 95, 71, 37,153, 60, +244,254,182,244,170,192,202, 72, 73,181,123,110, 55,206,199,157,222,147, 0,165, 94,255, 38,224,101, 6, 16,194,129, 47, 52, 26, +233,141, 69, 69, 37,231,225,194, 42,106, 31,127,253, 59,191,253,179, 17,228,133,233,251,178, 0,100,197,246,109,255,143,160, 32, +201, 92,161,128,240,119,203,140, 87,239,210,204, 6,153,136,146,202,132, 2,129,153,225,164,174,228, 47, 45, 45, 45, 51, 54, 54, +214,182, 15,128,205, 61,224, 58,103,173,238,235,183, 51,253,215, 35, 14,192,179, 18,160, 27,160, 94, 41, 7, 33, 4, 47,142,158, + 82,227, 24,178, 99,123,106, 67,125,107, 17, 0,210, 16,204,223, 78, 8, 88,239, 66,114,153,117, 76,165,159,212,186, 18,214,208, + 16, 27,114,142,172,135,222,223,155,158, 7,143,187, 0,160, 84,242, 74,165,114, 74,125,233,188,244,254, 62, 30, 0, 94, 27,220, +137,252,120,228,210,231, 6,126,218,170,233,227,142,119,162,117, 36, 34, 72, 36,108, 4, 66,244, 62, 50, 97, 73,151, 14,126, 57, +233,251, 93,163,109, 13,244,227,221, 9,248,123,192, 26,180,199, 2,224,198, 55,166,166,166,240, 9, 9, 83,201,142,237,169,127, +247,238,229,111, 21,164, 37,110, 42,206,143,190,178,220,221, 71,216, 3, 15, 60,120, 2, 37,126, 1,224, 37, 33,224, 56, 30, 32, + 4, 21, 6, 79,247,247,192,131,255,217,241,192, 83, 4, 30,120,240,191, 3,134, 5, 52,250,191,245,178,243, 30,120,224,129,147, +160, 60, 69,224,129, 7, 30,120,224,129, 7, 30, 1,192, 3, 15, 60,240,192, 3, 15, 60,240, 8, 0, 30,120,224,129, 7, 30,120, +224,193,223, 17, 85, 98, 0,206,157, 59,231,118, 52,106, 77,193,132, 53,209,123,225,153,200,168, 46,221,218, 40,154, 52, 11,143, +214, 26,116,138,195,138,172,232,140, 67,231, 51,221,165,215,181,239,240,168, 30,221,250, 42,238, 21, 22,194, 91,230,141,219, 5, +185,209,217, 39,246,184, 77,175,161,191, 55,113, 60, 21,213,175,111, 43,133,204, 91, 0,161,128, 2,145, 18,188, 56,238, 18,113, +151, 94,194,255,203,138,122,170,239, 83, 10,127, 31, 1, 32, 4, 98,251,214, 60,199,233, 81,125,175,135,222, 99, 75,175,206,169, +102,143,251,247,182,234,245, 50,239,199,229, 62,208,252,157,253,232,150,219, 3,105,207, 37, 45,239,187,247,121,163, 66,183,233, +253,163,244,254, 13, 87, 61,237,249,161,208, 19,162,134, 41,178, 79,226,247,186, 44, 0,212,134,149, 81,104, 11,203,122,248, 44, +128,220,153,153,184,233,236, 15, 12, 31,216, 42,138,128, 67, 72, 64, 16,178, 14,159, 81,124,152, 56, 17, 3,134, 14, 0,163,211, + 43, 58,117, 24, 12,142,131, 98,198, 91, 79, 71,247,236,217, 13,215,175,223,130, 90,165,195,234,245, 71, 50,107,163,215,123,208, +171, 81, 60, 8, 90,182,105,165, 72,120,127, 49,222,124,245, 57,252,240,159,175, 0, 72,177,231,124, 1, 40, 10,138,149, 11,230, + 33, 39,231, 42,228,242,150,144,200,132,184, 83,144, 19, 13,125,205, 89,158,251, 92,119, 94, 44, 22, 67, 38,147, 33, 55, 55, 23, + 77, 67,253,208, 72,232,131,166, 45, 2, 16, 40,243,135, 55, 97, 65, 81, 20,120,142,133, 94, 34,132,250,158, 26, 99,254,147,225, +176,162,150,207,233,198,251,202,212,240, 11, 16,195,199, 91, 8,177,140,130, 80, 0, 80, 98, 33, 50,119, 69,242,102, 94,128, 97, +163, 78, 56, 93,225, 93, 95, 90, 25, 21, 30, 30,142,102,173,155, 41, 12, 70, 19, 40,137, 12, 48, 3,211,146, 79, 69, 25,244, 58, +124,247, 73, 84,230, 35, 20, 36,255, 86,243,152,159,112,184, 90, 23, 78,167,143,253,112,174, 55,128,167, 26,203,188,254, 93, 88, + 88,216, 65, 36,149,128,243,242, 90, 6, 96,109,218,178,164,138,199,165, 0, 34, 58, 13,137,186,121,233,112, 77,251, 41,252, 45, +218,104,106,106, 42,249, 97,195,134, 43, 18,177, 88,198,113,156,191,183,143,143,207,168, 23, 95,244, 2, 64, 39, 36, 36,240,143, +105,158, 41, 0, 72, 72, 72,224, 26,128,156,159,191,191,255,172,246,237,219,143,149, 72, 36,205, 10, 10, 10, 10, 10, 11, 11, 79, +210, 52,189, 4, 64,174, 27,244, 2, 2, 3, 3, 23, 63,243,204, 51,207,135,133,133,201, 79,157, 58,117,239,226,197,139,199,141, + 70,227, 66, 88, 86,136,253,223,176, 0,212,194,252, 5,222, 18,225, 83, 19, 7,182, 94,193,241,188,241,232,213,123, 95,174,140, + 82,239,159,153,137, 75,142,222, 85,222, 61,200,155, 42,148, 48, 87,168, 32,100, 41,252,113,233, 42, 94,127,125,102,229,115,138, + 2,126,207, 90,143, 70, 45,194, 21, 92,133, 6, 52, 71,112,232, 80, 86,244,234,245, 71,106,161,216,146, 63,125,226, 18,136,151, + 31,206, 92,202,199,249, 75,111,224,187,159,127,171,124,202,113,192,136,254,253,129,138, 34, 0,190,200,189,120, 25,162, 70, 1, + 24,208,175,139, 66,165,175, 67,102, 33, 20, 64, 40,244,232,214, 11,141,189,197,104,218, 72, 10,191,224, 32, 4, 74,124, 17, 40, + 21, 64, 36, 16,192,204,178, 80, 49, 28, 78,149,158,118, 88,168, 11,223,109,206,203, 4,229,240,243,242, 66, 72,163, 96,248,249, +121,129,167, 88, 48, 92, 5, 88,176,240,241,241, 66,163,198,205,144,123,165, 29,223,186,195, 15,117, 14, 74, 61, 99, 86,241,254, +190,222,240, 15, 8, 68, 72,163, 96,232,116, 58,136, 37, 82,136,140,150,197,249, 34,228, 45, 21,202,114, 21,158,121,107,125,116, +126,193, 29,148, 23,221, 66,217,249, 84, 71,194,128,211,131,196,208, 73, 67,163, 15,172, 63,144,233, 4,173, 7, 42, 4,228,229, +229,241, 0, 32,151,203,201,227, 66, 47, 60, 60,252,117,154,166,215, 3,192,216,232,104, 42,117,203, 22,119, 6, 95,203, 26,169, +118,134, 28,158,231, 65, 8,169, 60,219,238,217,210, 57,216, 73,205,149,245,228, 93, 97,254,157,188,205,204, 86,223, 0,255, 14, + 0, 32,150, 73, 65, 27,140,224,116,250,229,199,143, 28, 94, 16,251,225,220,142,105,203,146,242, 29,209,249,242,163, 68,222,170, + 97, 49,176,184, 32, 57,235, 56, 84,227, 88,212,125,200,243, 24,242,220,255,185, 84, 71, 55, 47, 29, 86,180,233, 18, 21,125,253, +143, 76,215,133,226, 88,165, 75,201,227,226,226,176, 37,246, 64,157,105,162, 15, 84,221,138,164, 83,128,229, 83,139,141, 28, 12, +140,165, 94,117,214,115,106,223, 0,180,243, 21,213, 73,111,197,138, 21,153, 31,189, 55, 59,116,244,216, 49, 62, 70,163, 1, 43, + 63,255,140, 90,189,122,181, 49, 49, 49, 49, 28,192,157,134,238,123, 99,198,140, 25,186,109,219,182, 12, 87,133,168, 73,147, 38, +241,121,121,121, 40, 43, 43,195,210,165, 75,225,235,235,139,168,168, 40,200,229,114,172, 95,191,222,221,126, 55,184, 87,175, 94, + 27,222,127,255,253,235,237,219,183, 95,223,179,103,207,203,247,238,221,107,150,149,149,213,235,205, 55,223,220,173,209,104,150, +195,178,149,187,179,136, 30, 59,118,108, 90, 82, 82, 82,176,217,108,134, 76, 38,131,183,183,119, 19,157, 78,247,242,232,209,163, + 71, 93,184,112, 33, 17,150,141,211,158, 56,156, 59,119,174,186,149,192, 57, 1, 96,101, 20,154, 3,104, 13,203, 18,135,172,206, +196,220,206,186, 86,252, 69,255,182,161, 51,159,233,212,100, 65, 99,127, 89,211,149, 40,218, 4,224,234,204,204,218, 55,169, 49, + 85, 40,209,184,205,179, 88,252,193, 88,172,183,227, 73,135,143,167, 64,167, 55, 97,228,208,153,120,122,192, 36,188, 26,247, 12, +100, 50, 9,104,150,129, 86, 79, 43,106,111,100,183, 0, 26, 24, 59, 97, 45,222,126,127,106,229,221, 17, 79, 71, 65, 42,149, 96, +251,161,223,176,231, 88, 22, 54,172,251, 10, 70,131, 9, 98,129, 16, 62, 94, 98,232,202, 10,162, 85, 5,168,113,135, 53,158,231, + 1,158,179, 28, 20, 7,158,231, 97,162, 37,149,203, 59,240, 52, 11, 86, 0,176, 96,193,210, 28, 24,182,110, 1,118,206, 91,114, + 62,208,143,129,159,175, 55,194,155, 69,160, 67,215, 54,240,245,145, 65, 93, 81,130,162,146, 34,148,171,239,193,108, 36,240,242, +242, 66, 72,200, 0,148, 22,135,240,141, 66, 63,171,217,140, 63,120, 30,207, 24,244, 48, 8, 1,177, 84, 12,131, 94, 12, 90, 47, +134, 81, 42,129,144, 48,224, 33,128,209, 80, 1,131, 94,139,102,205,154, 42,196, 2, 33,148,208, 32,148,158,128,234,107,204, 87, +199,167, 27, 62,117,216,128, 62,136,255,160,238,177, 50, 54,182,202,254,238,177,177,177,189,131,130,130,114, 8, 33, 70,158,231, +133,129,129,129, 94,185,185,185,193,214,213,221,154,186,219,144, 19, 19, 19,199,217,253, 70,148,187,171,197,213,200, 45, 9,225, +167, 77,155, 22,189,122,245,106,151,104,134,135,135, 39,244,233,211,103,201,192, 30, 61, 96,150, 72,144,156,156,204, 77,125,229, +149, 97, 41,155, 55, 31,112,241,247,177, 98,193,130,202,235, 89,243,231, 35,121,225,194, 58,175,157, 33, 91,141,185,243,189,123, +247, 6, 0,126,232,208, 86,157, 1,220, 72, 74, 74, 51,184,200,252,179,186,118,238,236,103,235, 51,222, 82, 25,238,150, 20, 67, + 83,174, 66,175, 62,125,189,118,125,183,238, 64,236,135,115, 59,167, 45, 75,114,180, 54, 59, 51, 99,201,106,225,107, 47,143, 18, +182,149,203, 57,171, 16,128,249,201,171,170, 10,209,179,166, 3, 0, 62,122, 47,209,173,237,164,221, 98,254, 54,164, 5,185,144, +120,168, 75,164,189,133, 4,231, 23,190, 5,226,215, 8,236,141,243, 48,221,248, 19, 57, 74, 29, 34,247, 22, 59,245,126,207, 94, +189,142, 78, 25, 31,223, 50,126,242,155, 1,105, 63,253,204,201,229,114,106,113,210,114,248, 46, 88,140,237,219,183, 23,166,166, +166, 82, 13,101, 5, 24, 51,102,204,176,109,219,182,237,223,182,109,155,237,122,184,237,127, 7, 2, 74,212,254,253,251, 21,183, +110,221, 66,235,214,173, 49,104,208, 32,248,251,251, 67,165, 82,225,206,157, 59,184,121,243, 38,134, 15, 31,206, 15, 31, 62, 60, +122,246,236,217,174,212,211,152,103,158,121,102,229,138, 21, 43, 54,245,236,217,115, 37, 33,228,142,221, 56, 78, 98, 98, 98,124, + 0,100, 89, 15,167,232, 37, 38, 38,166, 79,155, 54,141, 58,125,250, 52, 8, 33, 8, 14, 14,174, 60,246,238,221, 43,238,215,175, +223, 87,183,111,223, 62,241,164, 51,127,219,189,234, 66,128,176, 6,230, 31, 28, 25, 17, 28,223,163,101,208, 4, 66,136,136,231, +121, 51,103, 57,104,214,108, 52,136, 41,174,105,215,198,210, 15, 26,249,181,110,179,237,212,205,159, 87, 70,113, 71,103,102,214, +190, 91, 28, 32, 70,167,142,237, 65, 81,153,200, 81,149, 1,184, 12,117,225, 53,136,164, 18,236,216,253, 37,244,165, 44, 38,188, +241, 15,112, 28,240,226,168,254, 96,133, 62, 14, 63, 46, 39,231, 50, 56, 14, 24,217,157, 88,249, 74, 75, 24, 77, 52, 98, 70, 12, +135, 52,128,194,134,141,251, 64, 81, 64,250,207,235, 81,120,227,207,232,189,155, 86,100,214, 36,253, 0, 0,199, 3, 28,199,129, +227, 56,176, 44, 11,147,136,135,153,152, 65,211, 52,244, 94, 70,128,147,130,226, 89,176, 98, 30, 21,180, 17, 58,141,186,206,188, +133,248,152, 32, 20,202, 16, 28, 28,140, 54,109,218, 32,172,113, 95, 64, 64,129,101, 79,131,226, 85, 48,234, 24,176,156, 14, 69, +119,148, 8, 9, 46, 69,112,192, 0, 44, 91,177, 43,234,231, 31,239,167, 37, 51, 50,224, 77,165,128, 81, 2,154, 50, 67, 39, 22, +162, 66, 38,130, 80, 36, 6, 56,111, 16, 1, 65,133, 78,143,242,162, 91,200, 61,125, 12,202,252,124,112, 28, 7,138, 23,184,213, +104,190, 91,251,151,224,252,230, 59,111, 58, 30, 39,171,174,217,110, 76, 75, 75,155,251,254,251,239, 79,205,207,207,167, 8, 33, + 33,169,169,169, 63,195,178,185,147,151,187, 13,121, 74,108,172,104,205,154, 53, 27,239,221,187,135,244,244,116, 68,182,111, 47, +104,136, 14, 34,151,203, 73, 92, 92, 92, 20,207,243,138,213,171, 87,187,188, 97, 17, 77,211, 41, 3,173,109, 74, 44, 22,163, 93, +187,118,216,122,232, 80, 70, 72, 72, 8, 74, 74, 74,156,166, 99,211,236, 31, 0, 72,239,222,189,249,211,167, 45, 22, 43,187,243, +159, 67,134, 12, 41,156, 59, 55,214, 63, 41,201,241,154,251,177, 31,206,245,246, 54, 51, 91,187,118,238,236, 39,160, 40,188,251, +218, 4, 24,140, 38, 36,127,251, 45,188,100, 50, 24,141, 70, 24, 13, 6,116,239,217,163,237,111, 63,253, 52, 13,192, 23,142,172, +142, 11,103, 77,231, 0, 80,215,242,242,168,234, 12,191,122,247,116,231,195,155,119, 24, 28,125,251,202, 17,126,216,139,111, 69, +103,236,252,214, 45, 65,192,126,215, 62,219,150,182,117,221,119,132, 78, 1, 66,220,170, 96,113,120, 88, 8, 68, 51, 83,161,153, + 16, 1, 97, 96,168, 75,204, 63, 46, 46,174,200,172,211,223,153,252,238,212,230, 31,254, 99, 14, 86,175, 75,185,212,167, 87,175, + 86, 41,171, 82,188,222,155, 51, 27, 63,245,239,139,141, 27, 55, 78,132,101,215,210,250, 48,254,168,109,219,182, 41,108,204, 62, + 53, 53, 53, 23,150,109,218, 15, 58, 35, 0,236,223,191, 95, 17, 18, 18,130,158, 61,123, 50, 20, 69, 9, 45,214, 89, 14, 34,145, + 8, 65, 65, 65,104,220,184, 49,110,222,188,137,253,251,247, 43, 92,232,115,177, 47,188,240,194,103, 43, 86,172, 88,213,190,125, +251,181,132, 16, 14,192, 87, 0,158, 3,112,132, 16,178, 16,150, 53,243,103, 3, 88,232, 12,189, 21,137,137,155, 7,198,198,146, +157, 59,119, 66, 40, 20, 66,161, 80,224,252,249,243,104,211,166, 13, 22, 45, 90,132, 46, 93,186, 96,234,212,169,194,143, 63,254, +120,197,147,200,252,167,204, 93, 86,121,239,235,164, 15,107, 20, 2,106,154, 5, 64, 9, 5,148,144,225,120,173,193,204,220, 33, +132, 72,124, 36,130,110,126, 98, 68,202, 58, 15,105,141,232,183,129, 14,131,208,196,155, 31, 51,113, 64,196,135, 65,126, 94,195, + 86, 70,193,191,246,236,112, 16, 8,108, 99,182, 31,128,102,240, 15,127, 1, 6,214,136,181,169,235,240,195,198,116, 12,143, 30, + 0, 0,208,235, 1,129,176,118, 82, 50,175,246, 0, 0,150,181,223,155,166, 8, 64, 22, 40,129, 4,241,175,191,133,152,184, 56, +236,218,109, 97,100, 94,222,128,174,226,110,157,133,101,134,160,146,249,155, 25, 22, 38,141, 25,122,149, 30, 42, 51, 13,165,158, + 70,185, 73, 11,149,182, 2,229,197, 90, 40, 85, 70, 40, 43,106, 95, 66,253,221, 87, 91,241,132, 16, 8, 4, 4,132,146,128,101, +121, 48,250,124,232, 84,215, 80, 88,164,134,178,188, 2,106, 45, 11,101,185, 17, 5, 5, 69,184,116,229, 28, 84,234,115,232,219, +171,183,162, 54,154, 2, 0,148,214, 8,195,245, 59, 40,251,227, 50,202,242,111, 65,163, 86, 66,163, 86,226,214,165,211, 56,158, +246, 29,178,182,108, 64,201,245,235, 96,105,206,210,155, 4, 15,205, 13,104,219,135,155,142,137,137,233,184,120,241,226,247,155, + 52,105,162, 75, 79, 79,239,150,150,150,246, 43,128,158,214, 74,119,123,193, 41,113, 88,216, 44, 0,232,215,165, 11,166, 77,155, + 86,124,234,202,149, 3, 79,117,232, 16,213, 16,153,223,178,101, 75, 38, 0,146,152,104,209, 50, 19, 19, 19, 93,162,107,150, 72, + 0, 0, 91,183,110, 69,104,104, 40, 62, 76, 76,196,172, 89,179, 16, 18, 18,242, 88,248, 97,109, 76, 63, 53, 53,181,242, 0,128, +195,135, 15,135, 3, 24,229, 36,153,167, 2, 2, 3, 59, 8, 40, 10,111,196,196, 64,165,214,160,224,238, 29,136, 68, 66, 8,133, +150, 67, 36, 18, 65, 34,243, 66,107,185,252,243,158, 67,135, 58,165,177, 95,203,203,195,143, 91,127,173, 60,108,152,159,188, 10, +243,147, 87, 97,143,226,176,203,223, 59, 52,246,227, 40, 0,184,125,229, 72,230, 80, 11,243, 87,224, 49, 89,237,232,194,247, 95, +160,248,237, 94, 24,146, 81,130, 78, 1, 66, 8,252,130,192,148, 23, 35,114,111, 49,188,133, 22, 30, 40,112, 48, 39,235,230,245, +235,101, 95,167,254,167,253,247,255,249, 30, 95,126,251,213,173,175, 86,124, 54,255,253,233, 51, 70, 45, 94,178, 24, 50, 95,111, + 12,234, 55, 0,167, 78,158,250,254,181,248,215,220,254,102, 27,243,183, 93,239,220,185, 19, 79, 61,245, 84,107, 0, 19,156, 53, +251,155,205,102,244,234,213,139, 99, 89, 86,168, 86,171, 97, 50,153, 96, 50,153,112,229,202, 21, 40, 20, 10, 28, 59,118, 12, 77, +154, 52,129,217,108,198,164, 73,147,156,201,235,184,184,184,184, 47,198,142, 29,235,183,118,237, 90, 63, 66,136, 24,192, 97, 0, +106, 0,189, 0,252,106, 39,120, 30, 4,208,197, 17,189,109,239,191,191,121, 84,247,238,228,167,152, 24, 20,158, 61,139,207, 62, +251,140,219,181,107,215,255,187,125,251,118,168, 66,161,120,123,238,220,185, 48,155,205, 24, 48, 96, 0,188,189,189,251,227, 9, +135,189, 48, 80,167, 5, 96,102, 38, 74, 86,162, 36,229,247,235, 37, 25,145, 17,193,209,189,229, 65,150,117,196, 95, 88,132,223, +125,134,227,224, 31,197,232,223, 57, 16,207,200,119,193,247,183, 37, 61, 71,244,144, 79,216,120,228,210, 31, 53, 17,111,210, 54, +150,240,124, 1, 63,250,245,153,152, 53,253, 43, 0, 74, 0,190, 0, 76,104,217,190, 23,164, 18, 33, 12, 58, 19, 64, 91, 4, 4, + 95, 95, 95, 20, 43,107,221, 47, 27, 6,253, 85, 2,128,191,244,251,183,160,168,213, 85,148, 4,206,240, 39,140, 38, 51,100, 62, + 82, 64,108, 17, 16,180, 26, 13,250,247,239,143, 35,191,254, 84,187, 58,194,209,224, 56, 33, 24,134,129,201,100, 66,133, 80, 0, + 33, 77, 1,119, 53, 96,188, 24,176, 98, 14,188, 72, 0,189, 64, 8, 70,167,135,202, 84,123,172,147,175,143, 14, 12, 67, 96,162, + 89,168,212, 26,228, 92,207, 71,193,221, 82, 24,104, 51, 52, 21, 74, 84,104, 85, 48,178, 52,136,144, 64,167, 87, 67,163,191,137, + 91,133,106,148,105,117,181,210,100,237,164, 52, 70,173, 67,193,185,203,184,119,249, 38, 52,218,235,208,170, 84,224, 33,132, 72, + 64,192, 19, 17, 40,202, 98,245,117,197,185,246, 65,252, 7, 78,185, 3, 28,224, 30,128,123,243,230,205, 51, 0,192,220,185,115, + 79, 37, 37, 37,121, 91,179,110, 4,144,239, 46,225, 53,107,214, 44,141,137,137, 1, 0, 68,132,132,132, 90,125,226,130,134,236, + 28, 54,243,191,213, 18,224,176,248,194,195,195,135,210, 52,141,228,228,100,188,252,242,203, 24, 59,124,248, 95, 3,253,133, 11, + 22, 75, 80, 72, 8,239,108, 92,192,172,249,243, 43,125,254, 0, 48,123,193,130, 42,150, 1, 39,205,254, 85, 96,211,254,109, 76, +223,134,212,212, 84, 36, 36, 36,224,192,129, 27, 63, 2,248,201, 17,157, 0,161,240,223, 70,218, 4,129, 64,128, 43, 55,114,193, +243, 60, 46,229, 92, 3, 77,155, 65,129, 64, 40, 20,130, 16, 2,142,101, 97,208,233,113,237,247,223, 15, 57, 81,134,148, 61,211, +127,237,229, 81,246, 26, 63, 5, 0, 39,206, 92, 64,219,136,150, 46, 77, 83, 62,144,246,239, 74,109,255,128, 69,243,183,185, 66, +248,231,199,188, 21,189,119,155,123,214,128, 6,129,242, 46,196, 45,218,161,120,154, 20,146,103,198,129,205,222, 7, 86, 99,137, + 55, 40,158,246, 52, 90,166,102,129,229,234,110, 42,237,219,182,111,234,229,229,237,245,229, 55,107,140,209, 67,134,136,251,246, +239,247,211,254, 61,191, 61,127,229,122, 14,192,241,144, 74, 36, 24,208,123, 0,118,239,220,141, 17, 35, 70,240,251,246,237,115, +122, 40,168,174,245,239,223,191, 31, 55,110,220,160, 1,136, 79,158, 60, 73, 79,157, 58,117,124,106,106,234,107,142,232,228,229, +229,161,117,235,214, 0, 64,229,229,229,225,252,249,243,104,217,178, 37, 34, 34, 34, 80, 94, 94,142,236,236,108,180,106,213, 10, +161,161,161,104,217,178, 37,242,242,242,234,110, 40, 20, 21, 31, 23, 23,183,100,240,224,193, 62,167, 78,157,242, 99, 24,102,178, + 76, 38, 27,109, 48, 24, 86,192,178,245, 57,172, 2,192, 42, 88,182, 86,167, 81,199,244,118,145, 72, 20,159, 54, 99,198,250,167, + 67, 66, 72,201,156, 57,232,207,113, 88,181,115, 39, 95,168,215,191,133,191,182,101, 95,127,233,210,165,181, 12,195, 8,125,124, +124, 16, 30, 30,238, 99, 54,155, 33, 18,137,240,119, 67, 77, 46,128, 48, 0,173,199, 68,182,120,183,121,176,247, 4,152, 13, 64, +251, 97, 56, 19, 50, 6,207, 36,126, 7, 67,169, 10, 2, 63, 95, 40, 86,198, 99, 80,167,223, 17,116, 33, 99, 48,128, 22,181,253, + 64, 27,191,102,248,227,194, 47,118, 6, 7, 29, 44, 91, 40,155, 1,179, 9, 66, 78, 0,202,202,196,183,109,119,188,139,200,190, +139, 60, 70,244,236, 82, 77, 9, 21, 2, 16, 1, 34, 41, 24,194,194,170, 7,227,149, 9, 51, 0, 64,145,244, 81, 98,173, 29,129, +229,120, 48, 28, 5,138, 97, 64,209, 38,232, 41, 75,219, 49, 8, 4,240,102, 12,208, 24,120, 16, 17, 1,203,178,208,179, 64,177, +174,246,141,159, 24,154,131, 81, 36, 0,167,103,192,112,106,104, 43,204, 16, 16, 17, 76,140, 25, 52, 79,131, 49,211,128,152, 3, + 69, 0, 34,225,160, 54,176, 40, 42,209, 67,103, 98,106, 84,146, 41,194, 86,238,195, 75,200, 95, 46, 93,179,209, 0,181, 82, 9, +138, 8, 32, 20,242, 0, 47,132,128,184,175,234, 92,189,117,149,110,223,178,189,216, 25,179,127,109,178, 25,236,118,196, 74, 74, + 74, 26, 5,224,246,220,185,115,123,250,251,251, 7,168,213,234, 91, 73, 73, 73, 46, 19, 77, 76, 76,124,115,205,154, 53,104,220, +184,177,253, 61,213,170, 85,171, 14, 60,213,161,195,208, 83, 87,174, 28,108,168,142,144,152,152, 24,109,231, 10,168,139,249, 71, +245,233,211, 39,124, 96,143, 30, 32,190,190, 72, 74, 74,194,156, 57,115, 32, 18,137, 96, 46, 47,135,191,191, 63, 62, 76, 76,172, +140, 11, 72,136,139,115, 40, 4, 84,247,241, 59,138, 9,168,203,163, 80, 93,251,119, 96, 29,112,216,100,202,149,202, 14, 62,190, +190, 40, 45, 47,135,226,196, 9, 8, 41, 1, 76,102, 51,244, 6, 3, 56,142,171, 20, 92, 24, 51, 13,218,100,114,198,165,193, 1, +160,172,110, 0,206,174,225, 27,173,247, 49, 63,121,149, 24, 0,218,202,229,197, 55,107,214, 45, 92,178, 82, 53,107, 29, 25,181, +119,219,183,174,152,155,107, 47, 96, 23,204,254, 85,204,178, 91,254,131, 30,175,255, 3,146,136,110,150,177,162,244, 46,114,148, + 22,193, 95,210,255, 5,228,179, 12,188, 86,215,237,106,214,104, 52, 1, 18,153, 20,109, 34, 34,164, 55, 11,110, 55, 41, 43, 41, +195, 43,175, 77, 80,236, 57,152,129,149,203,146,211,183,237,217, 25,211, 54,162, 45,226, 95,158,136,172, 51,199, 48, 98,248,112, +126,223,254,253, 14,191,217, 94,235,223,191,127, 63,134, 13, 27,102, 19, 22,197,119,238,220,193,212,169, 83,197, 0,224, 76,108, + 65, 89, 89, 25, 6, 13, 26, 4,150,101,145,151,151,135, 99,199,142,161, 83,167, 78,240,247,247, 71,243,230,205,209,163, 71, 15, + 80, 20, 5,138,162,208,164, 73, 19, 71,237,180, 83,151, 46, 93,190,232,223,191,191,224,194,133, 11,126, 44,203, 22,109,221,186, + 85, 99, 48, 24,146, 0,216, 59, 77,223,125,254,249,231,243,247,236,217, 19, 65, 8,185,139,218, 55,230,233,153, 48,112,224,250, +190, 66, 33, 41, 89,178, 4,188,217, 12,133, 64,192,101,233,245,147, 96,217,198,221,134,119,230,205,155, 39,164, 40, 10, 74,165, + 18, 55,110,220, 40,238,210,165, 75, 40,254,134, 16, 86, 99,254,109,195,252,101, 3,159,239, 30, 62,213, 79, 38,234,195,176, 92, +185,144,103,253, 16,208, 68,112, 87,101,132,161, 84, 13,136,133, 96, 85, 90, 20,148,211, 64,112, 11, 80, 28, 45,173,203,196,123, + 93,163, 65,187, 0, 63, 48, 38,224,122,230,143,104, 19,245, 92,165, 2,103,166,205, 16,129, 66,133,209,178, 67,237,136,168, 94, +144, 5,135, 99,197,250, 95,107,205,240,136,174, 4,123,206,243, 16, 73, 1,113,139,231, 64,231, 31,173,180, 2,136,196, 18,152, + 97,132,143,204,178, 35,233,206, 61,155,240,199,201,204, 58, 77,146, 28,199, 65, 76, 27, 96,134, 24, 20,197, 0, 70,203,192,102, + 54,155, 97, 50,138, 32, 16,138, 0, 35,192,115, 22, 23, 65, 75,121, 4,144, 85,243,140, 2,189,145,131, 64, 64, 96,102,204, 48, +154, 56,104,180,150,118,104,230,120,208, 38, 14, 16, 2, 2,145, 0, 66, 41, 64, 12, 44, 56,194,128,131, 1, 90, 3, 0, 56, 30, + 88, 88, 0, 20, 7,240, 4,160, 40, 14,132, 8,192,241, 4, 20,101, 85,156, 56, 10, 28, 69,129,112,206, 41,200,118, 65,126,226, +122,182, 35,111, 0, 33,115,231,206, 45, 78, 74, 74,138, 6,240,210,220,185,115,135, 39, 37, 37,233, 0,148,185,101,178,138,141, + 21,175, 89,179,230,219,152,152, 24,200, 27, 53,170,188, 47,111,212, 40,192,106, 5, 8,121, 20, 29,134,166,105,133,205,247,207, +107,181,248,228,147, 79, 96, 42, 43,131, 45,242,173,141, 85, 88, 17,153, 76, 24, 53,106, 84,113, 97,113,241,120,103, 52,237, 6, +116,201, 84,177, 0,212, 97, 33,192,233,211,167, 73, 77,194, 67, 21,161,214, 68, 67, 69, 43, 97, 52, 26, 17,224,239, 15,169, 88, + 2, 51,203,128,231,121,176, 44, 11,154,166, 97, 54,155,193, 49,172,179,241, 12,220,181,188, 60,170,173, 92,110,211, 8,184,107, +121,121,212,143, 91,127,149,218, 91, 4,218,202,229,170,134, 50,223, 23,228,102, 55,152,230,239,110, 12,192,144,140, 18, 20,203, +211, 33,110,209, 14, 36,162, 27, 90,174, 59,139, 82, 35, 7,111, 33, 1,253,223,237,184,122,227, 38, 28,237, 90,108, 96,104,156, +206, 58,137, 47, 86,124,142,167,163, 6, 98,222,255, 91,128,223,246,254,134,159, 54,252,128,254,131, 7,198, 52,151,183,128,208, + 75,132,131, 71, 15, 98,227,247, 63,224,151,237, 91, 33,150, 74,249,157, 59,119,214,185, 62,196,182,109,219,170, 48,126, 27, 84, + 42,149,203,229,163,213,106,225,239,239,127, 2, 64, 95,185, 92,142,222,189,123, 67, 32,176,184, 89, 91,182,108, 9,137, 68, 2, +181, 90, 13,185, 92, 14, 95, 95,223, 91, 90,173,182,101, 29,228, 46, 93,184,112, 97,233, 47,191,252, 50,178,109,219,182, 29,182, +110,221, 90, 81, 94, 94,190, 16,192, 70,123,249,101,200,144, 33,239,175, 91,183,110, 11,128, 98, 0,177, 0,126, 7,208,189, 6, +122,103, 87, 43, 20, 75, 3,178,179, 63,122,149, 97,240, 57,192,125, 91, 81, 49,177, 26,189,151,102,204,152,241,249,148, 41, 83, +112,243,230, 77,236,222,189, 27, 12,195, 28, 2,240,234,147,194,212,123,244,232,129,115,231,206, 85,250,253,235,180,176, 84,187, +110, 53, 38,178,197, 98, 63,153,168, 79,137,198,248,219,241,107, 37, 73, 16, 72,128,171, 71,241,172,156,199, 63,167,143, 66,239, +206,114,204, 72,120, 30, 47,182,166,129,139,251,193,139,100, 12,234, 12,214, 81, 33, 71,149, 15,161, 4, 24,241,226, 63,176,241, +203,101, 22,101, 81,111, 2,107, 0,182, 43,206,225,192, 41,203,140,194,102, 45, 34, 64, 9, 29, 51,175,145,221, 9,204, 70, 96, +231,238,125,136, 28, 62,221,162,253, 67, 4,129, 12,136,123, 33, 22, 35, 7,143,182,116,252, 91,185, 96,140,117,111,213,204,243, + 60, 24, 98, 97,240, 38,218, 18,252,103, 50, 26,160,215,235, 81, 81, 81, 1,173, 70, 13,173, 86, 11,141,202,162,101,189, 0, 0, + 32, 0, 73, 68, 65, 84,182, 2,198,138, 10, 24, 12,134,218, 27,127, 5,129,193,200,194, 96,100,161,211,155,161,173, 48,161, 92, +107,130, 74, 67, 67,173, 53, 67,165,178,156,149,101, 12,148,229, 12,148,106, 6,165, 74, 26,247, 74,107,207, 35,197,243, 96, 1, + 16,150,128, 80, 28,120,194, 3, 60, 15,158, 23,128,229,254,170, 62,206, 58,122,184,106, 27,239,216,191, 35,142,237, 57,134,223, + 14,253, 86, 41, 20, 92,189,117,213,213, 54, 23, 14,160,245,242,229,203,207, 3, 88,253,225,135, 31,190,215,170, 85, 43, 38, 53, + 53,149, 36, 39, 39,187,172,117, 77,137,141, 37,226,176,176,109, 0, 16, 22, 22,118,223,243,105,211,166, 49,217, 87,175,110,106, +168, 88, 0,155,249,223,217,125,227,109,190,127, 0,216,188,121, 51,174, 23, 21, 1, 0,118,101,102, 86,121,118,245,234,213,208, +144,144,144,242, 71, 49, 8, 12, 29,218,202, 54,239,186,202,125,219,181,237,185, 35,120,249,249, 94,225, 88, 22, 26,101, 57, 74, + 75, 75, 81,166, 42,135, 78,175,135, 78,175,135,182,162, 2, 58,181, 6, 90,149, 10, 70,131, 30,180,209, 8,142, 97, 29,142, 57, +109,229,114,219,152,193, 1,160,237,221, 1, 0,240,227,214, 95, 49, 63,121, 85, 0,128, 48,151, 27, 98,235,200,168,234,130, 67, + 68,167, 33, 81,143,122, 80,190,251,138, 28, 45,215,157, 5,137,232, 6,211,225,116,220,122,163, 39,188,133, 4, 71,135,133,128, + 81,151, 32,114, 95, 49,132, 14,154, 95, 70, 70, 6,121,123,230, 59,184,126,245, 42,178, 50,143,194,223,215, 31,227, 94, 25,135, +128,224, 32,156, 57,153, 13, 31,177, 20,222,222,222,104, 34,111,138, 77, 63,111,194,135, 31,127,132, 10, 55,152,184, 13,189,122, +245,114,249, 29, 95, 95, 95,168,213,234,190, 20, 69,209,205,155, 55, 71,159, 62,125,208,185,115,103, 52,106,212, 8, 82,169, 20, +114,185, 28,221,187,119, 71, 64, 64, 0,180, 90,109, 75, 95, 95, 95, 71, 36, 63, 61,124,248,112,198,134, 13, 27, 68,229,229,229, +243,170, 49,235,216, 65,131, 6,125,177,110,221,186,239,194,194,194,150, 16, 66,124, 0,124, 8,160, 46, 51,217,199,139,181,218, + 79,223, 98, 24,246, 91,131, 97,124, 53,122, 49,175, 38,252,235,151,233,239,205, 18, 92,189,122, 21, 39, 78,156,192,186,117,235, + 42, 0,252,243, 73,211,236,171, 7,189,215, 22, 4, 95,125, 16,144, 8, 40,226,155, 95,166,251,105, 83,214,205,127,158,187,165, + 60,105, 96,201,117,148,222,132,244,151,119,177,100,128, 22,217, 11,251, 96,101,116, 5,188,183, 79, 3,148, 5,168,224,165, 23, +173,146, 87, 45,248, 43,170,255,252,133, 95,241,175,127,109, 64, 27,191,174,248,243,248,121,236, 87, 92, 70,116,255,206, 24, 54, +200,210,208,120,129, 16, 52,235,252, 71,142,232,217, 1,139, 63, 93,134,125, 23, 53,240,145,119,194, 11, 47,140,194,111,135,182, + 97,247,111,155, 44, 31,199,154, 33, 17,213, 61,206,241, 28, 11,150,179,104, 51,176,106, 51, 52, 77,195,104, 52,194, 96, 48, 64, +167, 55,192,160,215,193,160,215, 65,111, 50,130, 54,213,190,237,115,153,193, 23,234, 10, 22, 26, 3, 7,141,129,179,252,175,229, + 80,161, 99, 80,161,103, 80,174,100, 81,166, 52,163,172,220,140,178, 50, 51, 74, 75,105,220, 43, 53,215, 41, 0,252,101,254,191, + 95, 85, 19, 10,120, 8, 8, 1, 95, 45,234,159, 39,142, 21,167, 15,226, 63, 64,199,254, 29, 43,175, 15,172, 63, 80,105, 17, 56, +182,231, 24,174,222,186,122,211,149, 6,151,158,158,254, 95,158,231,187,196,196,196,196, 71, 68, 68,132, 0,160, 56,142,147,152, +205,230,192,153, 51,103,250,213, 98, 10,174, 17,226,176,176,249,107,214,172, 25, 25, 19, 19,131,136,144, 16,167, 92, 87,245, 52, +255, 71, 1, 64,100,135, 14, 14, 3,216,218, 54,110, 28,157,156,156,140, 63,111,221,210,252,178,127, 63,174, 92,185, 82,169,245, +183,111,223, 30,214,103,244, 47,251,247,227,214,173, 91,184,154,157,109,112, 68,115,214,252,249,152,189, 96, 65,165,121,223,246, +191,237,218,246,191, 43,177, 0, 73, 73,105,252,144, 33, 67,222,181,103,250,182,115,239,222,189,145,148,148,230,148,118,125,237, + 74,110, 54,195, 48,160,105, 19,148,247,138, 81,114,183, 8,165, 69,247, 80, 90,116, 15,202,226, 18,168,202,202, 96,210,233, 44, +241, 51, 42, 21,156, 8, 2,100,230, 39,175, 18,206, 79, 94, 37, 4,160, 1,192,245,237,213,237,190, 68,118,113, 1, 78,163,105, +235,200,168,194,220,108, 69,247, 62,127,229,161,117,207, 23,163, 84, 37, 55, 20,245,105, 31, 36,174,188,138,230,239, 14,114,148, + 58,228, 79,126, 10,252,205, 11, 8,253,207, 25,120,175, 61,141,187,175,200,209,123, 95, 49,136, 72, 2, 33, 1,132,148, 99, 1, +244,194,197,139,228,147,101,139, 49, 99,246,251, 48,115, 44,174,228, 93,195,132,113,227, 33,150, 74,177, 99,251, 78,192,204,194, +100, 52,225,104,246,113, 24, 12, 21,152, 50,105,210,225,183,223,126,187,174,186, 38, 99,198,140,137, 30, 62,124, 56, 8, 33,200, +200,200,184,207,164,255,193, 7, 31, 56,253,157,193,193,193,184,115,231, 14, 0, 8, 83, 82, 82, 80, 82, 82,130,174, 93,187, 34, + 32, 32, 0, 20, 69,225,228,201,147,160, 40, 10,132, 16,220,185,115, 7,193,193,193,206,144, 93, 66,211,244, 96, 0,155,237,238, +141, 27, 52,104, 80,242,228,201,147, 3, 83, 82, 82,164,132, 16, 10,192, 54, 88,102, 1,220,115, 64,111,206, 9,179, 57,178, 58, +189, 87,231,254,178,229,229,241,211,200,200,119, 82,144,121,226, 18,146,147,147, 57,141, 70,243, 38, 44,179, 11,158, 56,244,232, +209,163,242,112,202, 5, 0, 32,119,211,241,155,137, 74,157,233, 52,128, 28, 0, 77,178,174,149,124, 61,184, 67,216,199,194,155, + 39,130,176,110, 34, 32,241, 6, 76, 58,128,231, 97, 22, 72,239, 29,253,243,238,183,168, 99,245,165,141, 63,125, 21, 61,126, 66, +188, 2, 0,116,156, 25,215, 85,249, 0, 88,180,241,139, 64,116,116, 55,132, 53,106,140, 50,181,198, 98, 43,160, 25,220, 85,233, +234,252,168,102, 45,250,163, 32,223, 58,205,147, 8, 49,162,187, 37, 6, 96,223, 69, 51,126,219,149,142,123,165,119, 16, 28, 96, +153, 73, 16, 32, 22,161, 91,100, 15, 40,182,215, 97,210,133, 16, 98,142, 1, 11, 1, 56, 66, 64,177, 28, 96,102,192,138,132, 0, +161, 96,235,147, 28, 15,203, 90, 1,117, 96,175,226, 38,121,126,160, 47,239, 37,230, 33, 20,217, 89, 24,204, 0,195, 3, 70, 26, + 96, 77, 44, 8, 33, 32, 98, 2,134, 5,116, 38,224,100,150,154,244,232,209,156,175,209,228,111,227,150, 20, 7, 98, 53,255, 91, +132, 2, 2,150,163, 64, 9,172, 51, 5, 0,240, 2, 30,224,157,179, 2,216, 51,255,154,174,143,237, 57, 22,225,108, 67,139,137, +137,233,156,158,158,254, 57,128, 30,233,233,233,251,210,211,211,143,198,196,196, 36,182,110,221,218, 76, 8, 9, 94,185,114,229, +254, 15, 63,252,112,194,178,101,203, 14,215, 33,124,218,180,127,225,236,217,179,231,207,158, 61, 27,251,246,237,131,238,222,253, +125, 57, 34, 36, 4, 55,111,222, 4, 0,133, 51, 11,249,212,182,232, 79, 98, 98, 98,212,154, 53,107, 20,171, 87,175, 70,100,251, +246,209,167, 46, 95,118,104, 42, 62,126,241, 98,230,128,255,207,222,151,199, 53,121,108,239, 63,147,141, 0, 42,130,187,104, 85, +172,168, 85,235,130, 21, 80, 43,137,162,181, 90,187,252,106,212,234,181,245,171, 45, 65,237,117,235,130,182,182,118,209,170,189, + 23,181,171,196, 46, 87,187, 88, 37, 88, 91,183,186,160, 9, 42, 34,136, 86,235, 10, 8, 42,130, 11, 74,194,150, 0,217,230,247, + 71,242,198, 16, 3,121, 19, 80,180,125,159,207, 39, 31,222, 45,135,201,204,188,243,156,115,230,204,153,190,125,159,186,112,236, + 88,103, 0, 62, 0, 62, 55,250,248, 64, 88, 93,141,110,237,218, 97,193,130, 5, 72, 77, 77, 93, 25, 26, 26,154,146,154,154,186, +191,160,160,192,141,114,119,119, 30,128,122,196, 0,212,208, 3, 83, 82, 82, 72, 92,156,236,216,209,163, 69,169,114,185, 92, 4, + 0,113,113,178,193, 43, 87, 42,211,192, 50, 9, 80,231,190,143,189, 83,121,253,198, 40,139,201,220, 67, 87, 90,138,210,219,183, + 64, 8, 15,148, 90, 80, 85, 85, 5, 74, 41, 40,165,184,116,238, 60,140,134,106,252,153,156,236,174, 14, 29,199,156,230, 0,120, + 99,164, 81,150, 49,210, 40, 56, 46, 11,180, 77, 17,176, 70,135,110,131, 36, 5, 57, 25, 42, 0,232,220,169, 19, 78,101, 88,245, +228,220, 63,183, 1, 0, 90, 61, 50, 64,122, 43,255, 68,163, 13,198, 3,255, 40, 66,230,211, 64,191,176,104, 20,205, 30,140,182, + 95, 31, 65,182, 70,135, 64, 17, 65,177, 70, 11, 1, 33,110, 61, 0,246,119, 51, 53,181,198,147, 93,187,118,165, 99,198, 62,141, + 29,219,118, 32, 49, 49, 17, 31,188,251, 30,246,170,247,131, 47,224, 35,184, 67,112, 84,105,105,221, 75,151,183,110,221,170,182, + 41, 2,146, 81,163, 70,213,136, 5,216,183,111, 31, 46, 94,188, 88,165, 80, 40,218, 57,123,147, 92,246,151,206,157,145,151,151, +135,199, 30,123,204, 52,111,222, 60,209,166, 77,155, 16, 16, 16,128, 11, 23, 46,220,229,121,205,203,203, 67,103,246,237,236,152, +120,110,234, 19, 79, 60,241,209, 75, 47,189, 20,144,153,153,217,180,170,170,234,255,124,125,125,159,177, 5, 6,254,206, 82,158, +227, 66,249,169,207,252,123,211,134,161, 35, 94, 32,159, 38, 3,164,253,179,248,100,205, 59, 84,147,115, 97, 58, 0, 37,254,198, +168,161, 0,204, 85,227,236,103,146,234,236,185,106,251,148,102,254,103,146,146, 63,202,171, 76,186,240, 71, 91,142, 9,242,227, + 63,193,175,174,242, 55, 81, 94,121,113,185,225,104,218,197, 27,123, 10, 53,250,148,185,106, 92,175, 77,201,152,242,175,197,234, +131, 71,210,164, 0, 84, 22, 62, 51,205,199,199,197,178,235,120,255,245,233,208,235,171, 81, 86,105,141, 1, 48,240,124,176,121, +107,221,105,118, 11,242,211,200, 11,207,254,219, 74,150,102,198,114, 54, 97,116, 31,130, 73,179, 86,193,207,207, 7,205,124,197, + 82, 0,170,156, 51, 39,164,235,191,216, 90,231,128, 36,160, 38, 24,136, 85, 9, 0, 33, 48, 83,106, 85, 4, 76,182,229,126,132, + 7,129,197, 2,147, 45, 56,208,157, 18, 80, 82,217, 28,149,213,197, 16, 9,120,246, 52,103, 38, 11, 96, 52, 82, 24, 77, 20, 21, +149, 22, 16, 62,129, 25, 4, 70,203, 29,215,189, 43,152, 45, 60,240,136, 25,196, 76, 64,121,212,238,254, 39,181, 24,207,140,164, +179, 23, 54, 17,119,185,161,207,167,157,175,111,223,177,187, 45,250,244,233,115, 61, 36, 36,228,133,203,151, 47,119, 75, 76, 76, +204, 0,240, 92, 82, 82,210,115,142, 15,175, 88,177, 66,189,112,225, 66,233,138, 21, 43,220, 17,132,189, 66, 98, 99, 99,107,125, +232,197, 87, 94,177,250, 0, 61, 75, 12, 68,157,220,254, 0,128, 65, 61,123, 74, 51, 88,144,191,125, 0, 62,117,202, 30,173, 58, +184, 79, 31, 75,124,124,252,151,227,198,141, 51,101,101,101, 9,174, 92,185,130,206, 45, 90,164,237,216,177,131, 85,128,226, 61, +202, 3,224, 72,238, 55, 83, 82, 82, 28, 99, 60, 78, 59,212,179, 91, 37, 64,185, 98,165, 78,182, 48,238,197, 11,251, 15,164, 53, +247,247,111, 86,166, 45,129,201,100, 2,181,189, 7,218,155, 69, 40,211,106, 65, 41, 69,255,232,104,233,159,201,110,243, 32,153, +112, 39,230,132,103, 91, 14,200, 11, 31,240, 56,198, 72,163,236,171, 0,114, 46, 95,102,173, 4, 68,143,125, 73,146,188,243, 23, +187,149,255,187,242, 59, 21, 0,180, 10, 25, 34,189,149,151,170, 6,128,198, 33,127,122,183, 18,128,111,208, 47,246,125,220,176, + 88,208,119,125, 6, 50, 70,183, 65,175, 29, 55, 33, 32, 64, 83,161,119,123,179,237,216,177,131, 76,124,105, 34, 29, 62,114, 4, +182,109,249, 13, 31,175, 92,129,184,210, 82, 80,139, 5,155, 55,111, 65, 97, 97,225, 51, 0,118,184,147,227, 74, 17, 0,128, 23, + 94,120,225, 36,128,114, 54,101, 89,191,126, 61, 25, 53,106, 20, 61,113,226,132,104,192,128, 1, 24, 49, 98, 4, 84, 42, 21, 30, +121,228, 17, 84, 87, 87, 35, 42, 42, 10,148, 82,203,137, 19, 39,120, 66,161,208,155,140,128,143, 5, 4, 4,172,158, 56,113,162, +240,220,185,115,205,170,171,171,107, 11, 12,100,139,254,193,253, 38,108,232, 55,108, 34,249, 46, 5, 40,171, 4, 12,151,118, 91, + 52, 57,170,105,168, 25, 24,248,208,128,201, 3,224,104,249,187,186,230,210,149,234, 64,254,204,249,249,207, 36, 21,249, 87,110, + 87,164, 1,104,103,123,121,171, 1, 20, 2,200,155,171,134, 91, 23,167,226,235,157,234,161, 67,251, 72,205,180,137,202,241,229, +168,208,149, 89,215,253,243,252,144, 91, 14,178,230,235,141,172,126,224,214,109, 95,144, 91,154, 60, 9,120,122,149, 35, 23, 54, +105, 18, 0,179, 81, 11, 80, 29, 70,247, 97, 55,161,107, 4, 31,160,212, 74,212,224, 67, 68,109,138,128,141,252,173, 57, 0, 1, +152,217,205, 77,164, 29,191, 74,194,122,183,163, 38,163, 6, 2,219,194, 94, 74, 41,204, 38,138, 42, 35, 80, 86,110,130, 17, 20, + 38,202,131, 64, 72,112,251,166,177,214,114, 30, 59,182,146, 0,192,224,200,183, 40, 49, 90,173,127, 10,128, 82, 2, 80,155,197, + 64,249, 32,124, 11, 44, 22, 1,178,115,182,176,250,205,175,126,252,170,244,114,238,229,186, 8, 88, 8,235, 82,141,186,216,201, + 94,243, 75,150, 44, 97,252,163,167,108, 86,241, 29,162,126,241, 69,201,150, 45, 91, 84, 54, 37, 64,229, 78, 9, 88,167, 84, 26, +255, 60,125, 90,214,185, 79, 31,243, 19, 61,122,232,108,125,180,218,230, 16,177, 67, 54,122,180,213,226,232,211,199,253,116,199, + 91,111, 73, 1, 96, 96,247,238,119,221,203,204,202, 82,103,156,247, 94, 25,234,211,179,231,215, 60, 30,207,124,225,216, 49,255, + 54,109,218,220, 78, 45, 40,216,224,206,234,191, 15,172,227,216, 15,116,182,128, 63,102,106,160,194,169,173,217, 40, 1,231,100, + 11,227,194,183,125,251,221,150,144, 46,157, 31,171,174,174,130,217,104,130,197, 98, 65,211,192, 64,148,106, 52, 12,249,179, 81, +162, 74, 62,124,227,223,173, 1, 24,114, 46, 95, 22, 49,243,255,233, 39,254,194, 24,105,148,101, 73,252, 23,238,146, 3,217, 49, +107, 78, 28,189,144,117, 65,234, 72,254, 0, 48,252,169,231,164, 7,246,252,174,190,149,151,234,125, 37,214, 18,224,231,250, 58, +123, 14, 27,248, 71, 17,240,199,235,246,243, 71,127,191, 97, 63, 46, 53,154,189, 46,239,230, 95, 54,147, 33, 67,134, 60, 61,106, +236,232, 93,175, 77,157,113,248,241,190,125,134,110,251,125, 59,210, 78, 30,199,241,227,199,119,214,229, 6,174, 67, 17,152,177, +117,235,214,111,183,110,221, 26,177,117,235, 86,214,133, 27, 53,106,212,240,189,123,247, 30,216,177, 99, 7, 66, 66, 66, 48,114, +228, 72, 4, 4, 4,100,151,150,150,134,158, 61,123, 22,121,121,121, 60,161, 80,136, 81,163, 70, 69,239,221,187,215,211,159,122, +174,180,180,116,229,246,237,219,235, 10, 12,244, 4,127, 22,158, 76, 92,254, 91,210,179,239, 84, 6, 79, 65,229,177,197,150,107, +135,150, 77,173,135,188, 7, 78, 17, 96,237, 1,168, 13,115,213,208, 1,248,203,246,241, 10,135, 15,159, 86,199,198, 46,148, 38, + 40, 62, 86, 5,119,234, 6,160, 26, 66, 31, 49, 10,174,151, 97,227,142, 84,226,185,188,157,234,105,175,206,199,250,239,127, 5, + 44, 87, 0, 8, 96,170,170, 68,112,187, 0,233,178,183,102,176,182,230, 96,182, 64,192,179,192, 72, 4, 16, 82,211, 29, 69, 0, + 38,128,154,193, 54, 48,204, 17,199,207, 92, 39, 0,208, 54,136, 71,133, 2,171,181,111,178, 88, 19, 24,149,148, 83,152, 77, 0, + 95, 96,129,217,196,110,228, 56,146,246, 31, 2, 0,225,131, 22, 80, 48, 57,225,121,128,133, 88,221,253, 89, 57,219, 61, 42,228, +183,239,125,171,110,128,254,197,202, 92, 97,200,223,193, 19,224,118, 57,214,177, 11, 23,146,142, 57,185, 12,235,120,214,237, 51, + 13,153, 58,248, 46,229,214,186,196, 47,193,106, 91,123,183,111, 72, 3,231, 1,112,174, 91,157,155,165, 86,172,250,142,114,197, +202, 11,178,133,113,189, 1,240, 47,164,164, 24,171,244,149,176,152,205,232, 25, 22, 38,109, 23,250, 24,142,253,177,157, 93, 29, + 83, 50,113,207, 31, 59,237,167,131, 31, 11,177, 31,239,249, 99,231, 93,231,117,133,198,127,253,185, 85, 65, 30,241,212,243,210, +115, 23,114,113,253,202,105, 21, 0, 28,216,243,187,170,205, 35,189,165, 55,243,207,120,220,238, 19, 38, 76,128,167,233,125,205, +196,167,206,251,249, 47,180,197, 31,215,170,238,249,128,159,154,154,250,135, 66,161,224,101,102,102, 90,246, 31, 77, 65,139,150, + 45,156, 87,122,120,132,173, 91,183,126,167, 80, 40,126,144,203,229, 70, 79,190,247,230,155,111,170, 0,144,105,211,166,209,220, +220, 92,100,100,100,160,188,188, 60,180,105,211,166,104,209,162,133,125, 47, 0, 47,200,159,193,127, 82, 82, 82,132,105,105,105, +125, 12, 6,195, 98,212,156,203,247, 6,239,158,217,252, 47, 97, 64,215, 31, 22,148,230,238,157,210, 0,242, 26, 21,204, 42, 0, + 87,215,189, 82, 0,220, 14,130, 10,133, 96,237,218,181,238, 93, 85,123,142,168, 59,116, 30, 65,110, 22,164,209,214,193, 29,161, + 41, 55, 97,227,182,195, 94,119,208,245,223,174,182,125,183, 13, 5,110, 34,176,169, 0,203, 22,189,230,209, 75,255,205,209,156, +123,182,129,205, 13,141,133, 0,128,216, 87, 72, 13,149, 70, 88, 0,248,249,249, 65,111,210, 19,179,201,115,121,233, 25,214, 61, + 3,194,159,152, 79, 45,148,143,203,151,118, 53,230,238,102,108,151, 14,114,187, 4,178,168, 31, 71,194,111,224,105, 1, 67, 92, +156,204, 7,128,121,229, 74,165,185, 62,130,148, 43, 86, 50, 27,249,216,219, 52,247,140,103,235,244,231, 44,255,194, 43,101,204, +121, 43, 96, 71,236,223,243,155,218,185,175,221,204,247, 46,127,128,187,141,125,156,117, 96, 19,241, 65, 37,175,238, 21,169,185, +229, 38,132, 54, 21,220,151, 87,197,182, 86,191,193,222, 57, 79,201,191,198,248,236,253,134, 63,108,240,137,193, 96,248, 13,112, +191, 41, 29, 75,188, 93,154,187,119, 35,106,198, 6, 60,212, 74, 0,171,193,199,219,125,132, 57,112,112, 68,183,110,221,144,147, +147,195, 85, 4, 7, 14, 28, 56, 60, 36,224,113, 85,192,161, 33,192,145, 63, 7, 14, 28, 56,112, 10, 0, 7, 14, 28, 56,112,224, +192,129, 83, 0, 56,112,224,192,129, 3, 7, 14,156, 2,192,129, 3, 7, 14, 28, 56,112,104,116,212, 8, 77, 61,121,242,164,215, + 81,155,174,130, 9, 57,121,156, 60, 78,222, 3, 35,175,206,232,112,174,254, 56,121,156,188,191,151, 60,143, 21, 0,135,129,194, + 83,184, 27,120, 26, 82, 30,135, 7, 19,148,107,183,135,178, 29, 88, 63,175, 80, 40,252, 1, 60,113,248,240,225,101,124, 62,127, +176,143,143, 15,244,122,253,145,161, 67,135,190, 11, 32, 67, 46,151,235, 31,132, 10,176,101,135, 84,253,147,199, 21, 74, 41, 61, +115,230, 12,250,244,233,195,189,147, 28, 60, 82, 0, 60, 90,135,204, 38, 81,142, 43,121,142,137, 79, 60,149,247, 15, 28,208, 89, +225,169,167,158,146,238,217,179, 71,205, 86,102,112,112,240, 93, 55, 10, 11, 11,157, 7, 83, 40,149, 74,194,178,140,247, 76, 9, +168, 45,159,127, 99,201, 91,181,106,213,136, 45, 91,182, 36,103,103,103, 3, 0, 66, 66, 66,158, 77, 79, 79,223,238,109,251, 58, +246,123, 74,169,253,253, 96,174, 51,239,138,237, 58,113,163, 60,179,109, 7, 79,200,255,177, 51,103,206,108, 41, 43, 43,235,209, +169, 83, 39,220,190,125, 27, 85, 85, 85, 0, 48,120,203,150, 45, 42,127,127,255, 11, 10,133,226,121,185, 92, 94,231, 86,146,103, +206,156,241,200, 32, 72, 77, 77,149,202,229,114,181, 39,223, 81, 42,149, 42,153, 76, 38,245, 38, 1, 20,245, 48, 9,195,132, 9, + 19, 60,121, 63, 0, 0,157, 58, 89,119,192, 45, 47, 47, 71,117,181, 53, 13,186, 78,167,243,228,125,171, 19,167, 79,159,166,131, + 7, 15, 70,207,158, 61,225,227,227, 83, 84, 93, 93,253, 8, 55,140,254,243,224,156, 12,232,158, 37, 2,226,172,216,123,139,223, + 19, 70,187,125,230,249,153,187, 61,146,169, 82,221, 49,144,178,179,179,225,239,239,111, 31,132, 24,176,217,252, 67, 38,147, 81, +165, 82,233,124, 78,106,121,198,171,186,141,138,186,179,157,171, 43,249,245, 1, 33,132, 14, 27, 54, 76,154,146,146,226, 17, 89, +108,217,178, 37,185,117,235,214,120,249,229,151,161,213,106, 45,241,241,241,219, 86,172, 88, 49,105,225,194,133,155, 61,252,255, +248,227,143, 63,236,231,163, 71,143,198,238,221,187,235, 60,103, 35,214,169, 47,211,176,176, 48, 0,160, 14,153,225, 60, 34,255, +210,210,210,180,174, 93,187, 54, 3, 0,177, 88, 12, 95, 95, 95, 20, 21, 21,161,164,164, 4, 1, 1, 1, 40, 42, 42,234,177,123, +247,238, 12,133, 66,209, 93, 46,151,223,168, 75, 94,239,222,189, 33,147,201, 16, 18,114, 39,235,223,202,149, 43,107, 60, 19, 23, + 23, 7, 0, 56,122,244,168,202,155,126, 83,159,236,143,107,214,172,169,237,150,125,175, 2,111,225,239,239,143,115,231,206, 65, + 40, 20,194, 96, 48, 96,247,238,221,200,201,201,193,162, 69,245,219,113, 54, 48, 48,144, 15, 32,250,224,193,131,187,163,162,162, +110, 62,255,252,243,109,146,147,147,193,231,243, 91, 53,111,222,156, 15, 14,255,104,242,103,174, 57, 43, 1,127,155, 32,192,240, +240,112,201,253,182,184, 27, 19,193, 3,151,218, 63,222, 66,171,213,218, 45,126,157, 78,135,117,235,214,217, 63, 30, 12,180, 46, +207,199,143, 31, 79,101, 50, 25, 5, 64,157,159,241, 20, 7, 15, 30, 84,189,245,214, 91,232,210,165, 75,131,213, 95,231,206,157, +201,219,111,191, 13, 74, 41, 82, 82, 82, 84,158,182,123,118,118, 54, 70,143, 30,109, 1, 0,145, 72,196, 11, 13, 13, 69,124,124, +252,166, 86,173, 90,209,240,240,240, 49, 30, 88,156,247,170,139,144,176,176, 48,202,252,174,227,199,143, 51,251, 1, 48,237,194, +218,237,175,213,106,183,136, 68,162,102, 0, 48,123,246,108, 76,153, 50, 5, 34,145, 8,190,190,190, 16,139,197, 32,132,128,207, +231,163,180,180,180, 25,128,120,133, 66, 81,167,236,184,184, 56,132,132,132, 32, 47, 47,207,254,137,139,139,171,241,169, 15,100, + 50,153,212,246, 59,189, 30, 19,230,207,159,111,255, 56,142,151, 78,215, 45,108,229,117,234,212, 9,254,254,254, 88,188,120, 49, +252,253,253,177,109,219, 54, 84, 86, 86, 54, 8,249,219,222,101,170,213,106,255,111,234,212,169,232,214,173, 91,155,221,187,119, +227,230,205,155,184,122,245, 42, 74, 74, 74, 12,247,115,108, 82, 40, 20,146,130,130, 2,170, 80, 40, 36,174,238,229,228,228,208, +139, 23, 47,114, 9,232,238, 3,249,199,196,173, 64, 76,220,138, 90, 21,131,251,162, 0, 16, 23,168,235,186, 55, 72, 79, 79, 87, + 53,132, 18, 48,101,202,148,135, 70, 9,168, 47,244,122,253, 93, 86,191, 55,205,203,144,201,248,241,227,237, 86,126, 82, 82, 18, +234, 75,252,142,214,191, 82,169, 36,195,134, 13,147, 42,149,202, 26, 30,129,250, 32, 49, 49,145, 0, 32, 81, 81, 81, 82,103, 79, + 3,203, 65,215,100,243, 6,160,117,235,214, 88,186,116,105,213, 27,111,188, 97,200,203,203,219,185, 98,197,138,145,141,221,190, + 14,123, 0, 16,199,118,242,176, 93,158,200,201,201,233, 1, 0, 51,102,204, 64,105,105, 41,174, 93,187, 6,161, 80, 8,129, 64, + 0,129, 64, 0,161, 80, 8, 95, 95, 95, 84, 86, 86, 34, 57, 57,121, 50,128, 64,119, 66,243,242,242,160, 84, 42,237, 31, 71, 79, +192,202,149, 43,145,156,156,236,245,239, 86, 42,149,106,219, 20,128,170,129,222,229,218, 18,119,179, 30, 63, 47, 95,190,140,157, + 59,119, 98,233,210,165,232,212,169, 19, 90,182,108,137,148,148, 20, 44, 90,180, 8,254,254,254, 0, 0, 62,191, 94,134,122,187, +233,211,167, 79,252,207,127,254,131,244,244,116, 92,187,118, 13, 38,147,233,229, 22, 45, 90, 4, 2, 48,222,239,190, 23, 28, 28, +140,152,152, 24, 85,110,110, 46,117, 36,255,152,152, 24,213,163,143, 62, 10,179,217, 12, 14,247, 22,142,196,239,120,220, 24, 30, + 0,234,226, 83,215,245, 70, 83, 2,198,140, 25,211, 16, 74, 0,245,224,195, 26, 47,190,190,167,193, 26, 36, 59, 59, 27, 58,157, +174, 86, 55,255,145, 35, 71, 26, 66, 49,168, 55, 14, 30, 60,168,178, 41, 22, 72, 73, 73, 81, 19, 66,208,186,117,107, 85, 67,118, + 78,198,253,111,243, 4,212,137, 85,171, 86,141, 25, 50,100, 8, 5,128,248,248,120,209,247,223,127,143,151, 95,126,153,113,205, +139,255,250,235, 47,145,237,222,222,240,240,240,231,216,252,255,209,163, 71,227,233,167,159,182,187,247,153, 99,230,156, 57,102, +233,254, 7, 0,216,172,127, 87,237, 64,156,238,215,137,221,187,119, 47,107,217,178, 37, 0,224,226,197,139,200,207,207,199,137, + 19, 39, 96, 48, 24, 64, 8,129, 64, 32, 0, 33, 4,102,179, 25,122,189, 30, 91,183,110, 5,128,190,158,120,142,100, 50,153, 75, +229, 37, 47, 47,175, 94, 74,128,195,111,175,151, 55, 0, 13, 48, 85,106, 52, 26, 49, 96,192, 0,168,213,106, 92,190,124, 25, 3, + 7, 14,180,223, 83,171,213, 8, 10, 10,178, 43, 2, 94,160,253,244,233,211, 11,190,251,238, 59, 68, 71, 91, 55, 50,106,223,190, + 61,204,102,243,143, 0, 74,238, 55,241,200,229,114, 53,163,124,134,132,132,224,216,177, 99,148, 33,127, 70,249,235,222,189, 59, +155,241, 97, 16,128, 31, 96,221,243,172, 46,140, 5, 16, 3,160, 21, 71,251,247,185, 99,179, 98,195,251, 24, 4,104, 83, 2,164, +233,233,233,106,111,101,116,238,220, 25, 83,166, 76,193,207, 63,255,236,109, 76, 0, 1, 64,127,254,249,103,151, 55,119,237,218, + 5,219, 61,143,101, 31,189,244, 24, 34,186,156, 67, 97,230,226,122,213,147,227,156,127,114,114, 50,162,163,163, 17, 19, 19, 99, + 39,255,142, 29, 59, 54,132,210, 87, 47, 69, 32, 42, 42, 74,114,240,224, 65,220,190,125, 91,202, 92,147, 72, 36, 82,165, 82,169, +138,138,138,146,120, 58,111,239,230,127, 73,217, 40, 0, 91,182,108,217,201,204,253,235,116, 58,172, 92,185, 18, 21, 21, 21, 16, + 10,133,240,241,241,193,165, 75,151,176,116,233, 82,104,181, 90,196,199,199,255,182, 98,197,138,225, 11, 23, 46, 84,185, 33,217, + 26,202,128,187,152, 0, 22,117, 14, 55, 59, 0,218,167, 3,220,253,222,160,160,160,193,213,213,213, 48,153, 76, 56,114,228, 8, +248,124, 62, 12, 6, 3, 42, 43, 43, 97,177, 88,236,239,177,209,104, 68,117,117, 53,243, 78,247,118, 39,183, 54, 55,127, 92, 92, +156, 61, 30, 32, 36, 36, 4, 69, 69, 69,245, 86, 68, 29, 86, 5,176,237,139, 26, 0, 65,174,110,172, 94,189,218,171, 66,196,199, +199,227,173,183,222, 66,255,254,253,237, 30, 16, 38,125,118,255,254,253,145,149,149,133,214,173, 91,123, 35,186,211,244,233,211, + 47,127,247,221,119,142,227,103,240,181,107,215,174, 53, 38,177, 12, 28, 56,144, 48,164, 63,112,224, 64, 12, 28, 56, 80, 5, 0, + 89, 89, 89,232,209,163, 7,219,118, 56, 9,192, 23,192, 38, 0,147,224,180, 37,184, 13,175, 3,248,194,118,252, 46,128, 30,128, +251, 45,234,255,206, 96,118, 3, 92,183,114,161,221,242, 95,183,114,161,253,222,125, 87, 0,238, 55, 30, 20, 37, 96,202,148, 41, +244,221,119,223,189,203, 21,232, 13,249, 55,164,245, 15,192,165,245,207, 88,253, 66,161, 16, 55,110,220,104, 84,242,119,180,254, + 29, 3,186, 84, 42,149,163, 23,224,190, 7,108,102,103,103,227,229,151, 95,214, 3,240,243,247,247,199,123,239,189, 7,161, 80, +104,191, 63,109,218, 52, 0, 64, 96, 96, 32,198,141, 27,135,195,135, 15, 31,184,143,229, 36,142, 30,128,186,148,128,176,176, 48, +231,173, 98, 93, 42, 3, 6,131, 1, 26,141, 6, 85, 85, 85, 8, 8, 8,128,143,143, 15, 76, 38, 19, 40,165, 48,155,205, 48, 24, + 12, 48, 26,141, 48,155,205,142, 10,253,237,186, 10,153,151,151, 87, 35, 0,144,153, 14,112,244, 8, 56,222,175, 47,188, 8, 8, + 20,215,118,195, 49, 38,192, 19,101, 96,233,210,165, 24, 59,118, 44, 58,119,238, 12, 63, 63, 63, 72, 36, 18,104, 52, 26,248,251, +251, 67,171,213, 98,253,250,245,224,241, 60,118,200,118,152, 62,125,250,229,121,243,230, 97,219,182,109,120,238,185,231, 0,160, + 45,128,155, 15,194, 56, 44,151,203,213, 1, 1, 1,210,137, 19, 39,170, 0, 96,243,230,205,210, 73,147, 38,121,210, 22, 6, 0, + 83, 0,252, 92,135, 18,224, 56,213,246, 8,128, 62, 0, 50, 56,219, 30, 53,136,191, 54,252, 45, 51, 1,214,151,252, 25,120,107, +165, 59, 14,200,203,150, 45,171, 55,249, 51, 24,208,191, 31,246, 31, 80, 97,227, 1, 63,187, 82,112,244,210, 99,245,250,141, 97, + 97, 97,200,203,203, 67, 82, 82, 18, 58,118,236,136, 13, 27, 54,120,108,117, 41, 20, 9, 18, 7, 15, 78,131,144, 63, 51, 31, 95, + 84, 84, 36,117,190, 55,108,216, 48,105, 82, 82, 82,131,197, 2, 0, 86,247, 63, 91,239,147, 86,171, 61, 15,235,188,176,101,243, +230,205, 88,191,126, 61, 0, 96,211,166, 77,208,106,181,204, 99,166,172,172, 44,180,106,213, 56, 94, 73,167,104,255,187,148, 51, +182,251,196,231,229,229, 29, 49,155,205,208,106,181,184,125,251, 54,180, 90, 45,244,122, 61,244,122, 61, 42, 42, 42, 80, 86, 86, +134,210,210, 82, 84, 86, 86,162,186,186,154,153,219, 77,171, 75,166, 51,185,187, 10, 36,117, 94, 21,192, 22, 54, 87, 63,117,113, +205, 19,248, 53,116,123,108,216,176, 1, 18,137, 4,126,126,126, 56,119,238, 28,212,106, 53,252,253,253,241,254,251,239,227,240, +225,195, 88,180,104,145,167, 10, 64,219,233,211,167, 95,157, 52,105, 18,126,253,245, 87,134,252,219, 63, 40,228,111, 29, 23, 20, + 18,134,252, 1, 96,226,196,137,170, 11, 23, 46,120, 58,181,202, 40, 1,176, 41, 1,206,211, 1, 23, 29,142,243, 1,156,230,104, +255, 14,156,131, 0, 27, 69, 1,184, 31, 65,128, 13, 77,254, 54,226,110, 8,203,141, 44, 91,182,172, 94,228,255,226,235,123, 48, +160,255, 29,215,205,150, 95,183,218, 61, 2,251, 15,168,188, 82, 2,228,114, 57,108, 75,195,160,215,235,177,111,223, 62, 44, 93, +106, 93, 81,112,250,244,105,152, 76, 38, 15,100,197,170, 1,107,224, 31,165,148, 9, 6,172, 23,249, 51,214,127, 93,110,254,134, +138, 5, 96, 20, 9,137, 68, 34,117,247,108, 72, 72,200,168,248,248,248,176,244,244,116,193, 15, 63,252,192,187,112,225, 2,166, + 77,155,102, 98,234, 49, 62, 62, 30,233,233,233,248,225,135, 31, 4, 87,174, 92, 65,120,120,184, 91,153,247, 34, 6,128,177,164, +157,148, 0,202, 40,125,108, 17, 26, 26,154,105, 50,153, 96, 48, 24,112,235,214, 45,220,184,113, 3, 55,111,222,196,205,155, 55, +113,235,214, 45,104, 52, 26,232,245,122, 84, 87, 87,163,180,180,148,249,159, 5,117,201,100, 2,253, 28,149,208, 58,202,238, 17, +249, 51, 57, 0,156,175,213,167,127,184, 88, 13, 96, 87,242,216,202,200,201,201, 65, 86, 86, 22,244,122, 61, 34, 35, 35,209,183, +111, 95,108,216,176, 1,239,188,243, 14, 68, 34, 17,248,124, 62, 4, 2,214, 14,217, 14,211,167, 79,191, 62,105,210, 36,100,100, +100,224,131, 15, 62, 96,172,223,235,120, 64,150, 49,103,102,102, 82,102,206,255,196,137, 19, 88,183,110,157, 20, 0,186,119,239, + 14,199,192,192,122, 42, 1,115, 97,157,255, 31, 15, 96, 22,128,112,252,195,221,255,192,157, 72,127, 87, 65,128,206,171, 0,238, +215, 20, 0,245,240,250,223,133,252,237, 74, 64, 61,166, 18,106,144,191,171,243,253, 7, 60, 31,223, 28, 7, 93, 63, 63, 63,244, +236,217,179,198,253,244,244,116,143,228,141, 31, 63, 30, 73, 73, 73, 96, 20, 1, 0,212,118,205,227,117,231, 27, 54,108, 80, 1, +192,238,221,187,165,174, 34,214, 83, 82, 82,212,151, 47, 95,118,105, 61,186, 66,109, 73,127, 24, 69, 35, 37, 37, 5, 81, 81, 81, + 82,149, 74,229,182,239,164,167,167,239, 91,190,124,249,136,212,212,212,253,161,161,161,200,206,206,134, 86,171, 21, 4, 6, 6, + 98,250,244,233,208,104, 52, 87, 82, 83, 83, 59,133,134,134, 34, 53, 53,149,196,198,198,186, 83,142,239,154,243,175, 71, 12, 64, +141,119,139,201,151, 96,203,157, 96,247,204, 56,204,255,187,109,143,136,136,136,119,212,106,245, 28,179,217,140,178,178, 50, 24, +141, 70,251,188,127, 85, 85, 21, 40,165,160,148, 34, 43, 43, 11, 6,131, 1,209,209,209, 47,201,229,114,147,171,164, 35,181, 33, + 58, 58, 26,209,209,209, 53,130,254, 60,157, 2,112, 36,122,155,203,159, 58,246, 15,219,170,128,134, 30,215, 88,143,159,204, 82, +191, 55,222,120, 3,106,181, 26, 82,169, 20, 57, 57, 57,104,210,164, 9,242,243,243,193,231,243,217,122, 0,200,244,233,211,175, + 78,157, 58, 21,135, 14, 29,194,251,239,191, 15, 0,193, 0,174,225, 78,254,135, 70,183,252,153,241, 37, 47, 47, 15, 97, 97, 97, + 76, 63,147,198,196,196,168, 66, 66, 66,144,149,149, 69, 89, 6, 2, 58, 42, 1,147,108, 10,192, 38, 0, 71, 0,200, 1, 72, 0, +220, 0,135,134,235,192, 13,157,141,207, 85,192,207,202,149, 43,107,189,222,152,228,111, 91, 1,112, 47,180,104,175,101, 94, 45, +112,223,191,125,125, 61,243, 90,186, 11, 18,243, 20,209,209,209,210,164,164, 36,245,132, 9, 19,104, 98, 98, 98, 13, 69,192, 73, +225, 99, 93, 15,177,177,177,110, 53, 27, 15, 19, 3, 81, 39, 69,194, 58, 42, 73,165,172,200,223, 97, 48,183,207,235,135,135,135, +255, 43, 62, 62,254,199,113,227,198, 33, 43, 43, 11, 87,174, 92,233,180,120,241, 98,105,108,108, 44, 43,121,247, 40, 15, 64,141, +122,174,133,248, 88,101, 12,148,203,229,186,132,132,132, 37,187,118,237,250,208,100, 50,161,164,164,196, 30, 3, 0, 0,183,110, +221, 66, 73, 73, 9, 40,165,140,213,238, 17,203, 50,243,255, 97, 97, 97,246, 8,118,230, 58, 91, 37,192,133,149,127,215, 52,212, + 61, 32,127,143,193, 40, 1, 11, 23, 46, 68, 74, 74, 10,198,141, 27,135,229,203,151,227,205, 55,223,132, 64, 32,128, 88, 44,118, + 59,134, 80, 74, 45, 51,102,204,192,143, 63,254,136,239,191,255, 30, 0, 58,218,200,191,193, 13,170,250,160,176,176, 16, 59,119, +238,172,145,197,209,118, 44, 29, 62,124,184,202,203, 37,143,102,155, 18,176,195,102,253, 71,112,228, 95, 59, 92, 5, 1,178, 82, + 0, 60, 73,196,225, 45, 97, 55, 52, 26,130,252,235, 75,212,247, 2,115,231,206,149, 94,184,112,161, 65,101,218, 92,164, 13,186, +148,142, 33, 60,219,218,122,198, 43, 64, 9, 33,176, 88, 44,216,178,101, 11,107, 37,224,173,183,222, 98,202,121, 87, 12, 0,143, +199,131,197, 98,193,219,111,191,173, 98, 75,158,117,201, 75, 73, 73, 81, 59,102, 69,244,162,223,253,180,124,249,242, 91,169,169, +169,187,217, 90,253,247,193,219, 70,156,189, 61,181, 40,124,172,148,128,216,216,216,143, 20, 10, 69,210,207, 63,255,124, 86, 36, + 18,129, 89, 21, 96,177, 88,208,188,121,115,104,181, 90,200,100, 50, 68, 71, 71,251,201,229,114,183, 11,188,153,241,197, 49,248, +239,248,241,227,136,142,142,174, 49,158,184, 27,135,226,226,226,104, 94, 94,158,212,217,197,239,109, 26, 96, 71,184, 8,240, 51, + 1, 48,173, 94,189, 90,108,179, 70,121, 14, 31,143,148, 0,199,196, 63,179,102,205,178, 31,151,149,149,185, 29,155, 8, 33,100, +250,244,233,244,135, 31,126,120, 30,192,239, 15, 34,241,216,136,158,120,122,143,141,210,238,132,235, 15,195, 24,126,191,193,172, + 2,112, 69,252,172, 86, 1, 52, 52,169,215, 38,239, 65, 81, 30, 30,228,142,243,217,103,159,169, 27, 90,166,211, 26,233,123, 6, + 39,247, 63,219,151,154,109, 46,116,226,193,239,189,167,191,117,209,162, 69,123,234, 83,159,163, 71,143,174,177, 44,246,233,167, +159,174,225, 25,240,112,238,159,120,232,237, 97, 85,110,185, 92,126, 78,161, 80, 52,217,187,119,239, 39,249,249,249,115, 42, 43, + 43, 97, 54,155,209,175, 95, 63, 12, 28, 56, 48, 62, 58, 58, 58,142, 13,249, 3,192,209,163, 71,237,199, 81, 81, 81, 53,174, 59, +159,187, 25, 87,136,163, 66,203, 40, 19,182, 56, 0,175,218,125,194,132, 9,181,221, 18, 56,140,151,162,123, 53,174,184,241, 84, + 88, 0,224,251,239,191,231, 54, 76,225,192, 90, 9,168,141,252,107, 83, 0, 26,186,115,113,157,149, 3,241, 80,179,255,199,213, +141, 35,225,223,131,105,129, 6,121, 7,229,114,185, 14, 86,215,235, 92,230,218,249,243,231,217, 16,151, 29,189,123,247,110,240, +241,192,149, 66,235,173,203,255, 94, 43,139, 28, 56,254,184,159, 74,128,219,202,245,118, 31, 97, 14, 28, 56,112,224,192,129,195, +195, 11, 30, 87, 5, 28, 56,112,224,192,129, 3,167, 0,112,224,192,129, 3, 7, 14, 28, 56, 5,128, 3, 7, 14, 28, 56, 60,132, + 48,193,131,237,138, 57,255,124,202,173, 0, 0, 32, 0, 73, 68, 65, 84,252, 51, 33,224,170,128, 3, 7, 14, 28,184,177,157,195, + 63,188,147,156, 60,121,210,235,136, 75, 87,193,132,110,228,213,185,254,216, 11,121, 13, 93, 62, 78, 30, 39,239, 31, 45,239,207, +119,174,120, 61,176,244,255,164, 19,238,181,188,227,139,188,151, 23,182,252,110,121, 76,253, 41, 20, 10,137,209,104,196,165, 75, +151, 84, 6,131, 1, 2,129, 0, 5, 5, 5,120, 41,160, 51,246,100,102,162,242,241,142,136,136,136,144,242,249,124,102, 93,123, +163,181,175, 66,161,120, 12, 64,235,179,103,207,238,108,223,190, 61, 79,163,209,136,219,183,111,191,212,215,215,119,173, 92, 46, +191, 6, 0, 9, 9, 9,188,132,132, 4,115,109,242, 18, 18, 18,154,218,188, 5,250,216,216, 88, 10, 0,139,255,253,228, 55,242, + 39,243,167,111,204, 12,189, 36,104, 61, 42,162, 73,211,102, 21, 0, 40,165, 84, 0, 32, 48, 33, 33,225, 42,247,190, 61,216,242, +238,181,150,200,118,211, 23, 79, 83,224,122,156, 50,119,101,228, 83, 18, 65, 80,128, 42, 55,251,162,244, 81,159, 38, 88,112,230, +160,250, 65,210,178,234,200, 71,206, 45,113,105,100,140, 29, 59, 86,178,107,215, 46, 85,252, 59,214,243,223, 14, 61,137,131, 7, + 15,178,106,151,127, 77,123, 69,194, 35, 68,149,117,225, 2,180, 90, 45, 58,117,234,132, 38, 77,155, 98,107,210, 22,214,237, 58, +126,252,248, 26, 47,110, 82, 82, 82,157,123, 41,216,178, 43,122,213,111,152,141,154, 40,165,245,235,119, 50, 77,205, 87, 85, 25, +228,189,172,176,213, 64,200, 43,214,227,188,245,192,241, 5,245,111,212,241,183,107,150, 47,169, 37,171,175, 41, 20, 10,170,211, +233,164, 91,183,110, 85,229,229,229, 65, 38,108,129,182, 29, 91,161, 74, 87, 9, 95,189, 9, 67,222,124, 13,195,198, 77,196,142, +239, 18,176,125,255,126,213,168, 81,163,164, 15, 64, 23,206, 54,155,205,237,242,242,242, 44,125,251,246, 21,133,134,134,226,196, +137, 19,239, 84, 85, 85,141, 85, 40, 20,209,114,185, 92, 19, 27, 27,107,169,107, 73, 88,108,108,108,185,227,249, 87, 95,125,197, +219,253, 83, 92,183, 14, 51,250,227,237, 65,189, 90, 29,221,251,223,196, 45,167, 37, 39,187,245, 30,190,156, 16,162,145,203,229, + 5,253,250,245,179,216,148, 6,206,211,240, 15,115, 19,121,170,105,176,202, 54,230, 13,249,127, 29,245,172, 36,178, 85, 7, 21, + 1, 69, 78, 69, 9,218,181,239,172, 50, 90,204, 88,212,103, 48,138, 58,181,146,126,183,227,119, 86,138, 64,204, 36,208, 30, 93, +153, 51, 62,182,238,181,224,208, 49,138,152, 73, 64,143,174,192,130,101,245, 35,110,102,131,146,250,102, 39,115,165, 76, 52,148, +220,250,128, 82, 74,177,132,128,124, 84,231, 51,192, 18,130, 9,231,101, 15,204, 90,235, 59,228, 79,109,228, 63, 12,135, 15, 31, +102,245,221,180,163, 47, 82,147,177, 7,148,202,235, 72, 79,179, 38,172,201,190,144, 5, 0,216,185,147,208,172,139,227,165, 11, +230,178,107,151,145, 35, 71, 90,246,237,219,199, 75, 74, 74,194,129, 3, 7,106, 36,195,113,134,151, 41, 84,237,205,228,162, 35, + 83,234,133, 66,193,164, 11,175,119,206,130,144, 87,236, 27,237,172, 94,189,186, 97, 20, 0,135,122,178,237, 78,200, 10,185,185, +185, 80, 39, 38,170, 62,138,158,128,126, 83,102, 65,212, 38, 16, 16,216,146,253, 89, 40, 96, 17,194, 82, 77, 49,230,149, 24,228, +127,190, 2, 71,142, 28, 81, 41, 20,138, 26,233,110, 27, 1,102, 30,143,215,186,101,203,150, 80,171,213,130,190,125,251, 98,208, +160, 65,188, 27, 55,110,244, 63,117,234,212, 25,133, 66, 49, 64, 46,151,223,176,145, 53,143,101,221, 53, 25, 49,124,100,200,242, + 85,219,120,113,211, 78, 55,139, 24, 61, 83, 26, 17,158,252,228,155, 95, 20, 60, 19,250,196,203, 97, 0,202, 97,141, 49,224,213, +198, 15,142,137,173,220,245,163,122, 43,164, 28,156, 61, 9,238,188, 5,246, 99, 79,130, 0, 41,211,184,253, 94,238, 3,133, 66, +193,243,128, 8,157, 55,169,160, 97, 97, 97, 8, 11, 11,243, 58, 79,188, 98,114,140,100,114,255, 72, 85,247,118,193,232,218, 46, + 24,143,183,106,143, 96,223, 38, 16, 91,128, 46, 62, 77, 16,144,115, 77, 53,253,153,231, 36,108,100,245,232, 10, 92,200,229,225, +252, 69, 63,156,201,109,134,231, 71,250, 99,213,187,124,244,232, 74, 26,204, 72,175, 47, 73, 51,219,156,134,132,132,168, 50, 51, + 51,145,153,153,137, 15,127, 58,133, 71,199,196,169, 0, 80, 15,183, 60,165,108, 63, 50,153,204,253, 91,188,196, 90, 71, 97, 97, + 97,144,201,100, 46, 63,204, 51,158, 98, 92,223, 15, 36,142,229, 25,219,103,137,164, 33,218, 99,236,216,177,146,157, 59,119,170, + 8, 33,120,227, 19,130,223, 14, 13,195,161, 67,135, 88,125, 55, 49,113,138, 36, 34, 60, 22, 67,135, 94,199,231,159,127, 94,227, +222,228,201,192,152, 49,192,252, 57, 73,170, 85,159,177,107, 19,134,252,213,106, 53,120, 60, 30, 38, 78,156, 8, 62,159, 95, 31, +178,191,203,242,119, 53, 32, 19,226, 29,249, 55, 24,194, 86, 1, 0,214,172, 89,131, 53,107,214, 88,175, 13,136,111,180,226, 28, + 56,112, 0, 95,189, 16,131,129,207,201, 32,104, 17, 4, 34,228,131, 39,228,131, 47, 22,129,231, 43, 6, 64, 65,205, 38, 80,131, + 1,175,189, 50, 11,101,251, 51,145,155,155,171, 82, 40, 20, 18, 52, 30, 72,102,102,102,100,199,142, 29, 69, 22,139, 5, 41, 41, + 41,216,182,109, 27, 2, 2, 2, 16, 25, 25,217,110,243,230,205, 31,219,158, 99, 21, 16,168, 80, 40,248,135,247,255,242,191, 71, +252, 10,218,232,202,249,152,188,164, 2, 95,254,247, 51,160,105,111,193,127,227, 90,119,201, 61,241,243,100, 7,238,224,213,162, + 24, 18, 7, 82, 39,214,203,196,126,236,120,253, 30,237,133,193,161,129, 61, 0,246, 86,218,184,251,231,146,174,143,118,109, 46, +255,232, 53,139,135,236, 72,194,194,194, 40,147,150,212, 33, 61, 41,245, 52,109,167,226,133, 87, 36, 79,117,124, 84, 37,170, 50, +193,247,191,111,193,164, 55, 64,252,198, 50, 4,136,196,168, 18, 86, 66, 87, 85, 9, 95, 16, 84, 95, 45, 82,125,250,233,167,210, +183,223,126,187, 78,242,189,144, 11,172,219,100, 1,160,183,125,128, 39,159,224,225,133, 81,164,198,123, 19, 51, 9, 88,183,201, + 43,242,150, 42,149, 74,234,173,181,206, 88,253,153,153,153,119,234,224,176, 17,149, 6, 29, 0, 96, 68,220, 62, 40, 87,142,244, +200,203,144,187, 34, 23, 66,146,115,167, 35,144, 66,144,150, 61, 28,206,139,208,234,255, 94, 96,215,176, 31,217,243,205,147,218, +210,206, 18,155,210,119,252, 56,187,118,150, 63,251,165,100,221,182,127,171,182,159,250, 0,203,231,253,134,112, 73, 40, 54,126, +125, 8,223,238,181,110, 16, 52,243, 95, 31, 72,215,254,244,129, 87, 74, 85,252, 59,160,192, 78, 40,127, 56, 11, 74, 41,154,182, +126, 28,135, 14, 29,130,109,223,130, 58,203,183,234, 51,153, 68, 38,107,161, 2,190, 2,240, 27,210,211,129,240,240, 59,247, 63, +254,248,206,241,252, 57, 73, 42, 95,191,197,210,153,175, 45,173,179,156, 12,249, 71, 69, 69,193, 98,177,224,203, 47,191,108, 80, + 7, 13, 0, 88, 44,150,187,201,159,214,253,254,242, 38,104,107,188,252,204, 16,110,145,185,120,206,238,231,179, 30,244,237,123, +247, 28, 59,111,162,182,134,154,111,177, 76,195,188,121,243,236,247,231,205,155,135, 53,107,214,128,215,109,198,157,255,106,123, +222,149, 60,193, 68,215,229,115,222,201, 90, 48,145, 93,249,170,170,170,208,182, 83,103,192, 98, 0,207, 7, 32, 2, 62, 76,229, +165,168,202,187,132, 91, 5,133,232, 48, 88, 2, 34,106, 14, 98, 52, 0,124, 30, 86,206,124, 19, 35,215,125,128, 5, 11, 22, 52, +244,184,204,138, 21, 21, 10, 5,161,148, 54,175,172,172, 28, 28, 20, 20,132,172,172, 44, 88, 44, 22, 92,186,116, 9,235,215,175, + 71,207,158, 61, 17, 28, 28,252, 50,128,215,156,200,186, 86,111, 0,165,180,101, 39, 94,186,164,221, 35,163, 69, 37, 41,167, 81, +170,245,193,143, 59, 76,216,117,244, 39,204,145,249, 10, 4,122, 75,152, 45,166,192,165, 2,192, 17,122,227,163,182,233, 30, 87, +158, 1, 30,139,142,200,204, 27, 66,178,104, 24,214,165, 40,154,231, 94,204,197,201, 31, 78, 67,161, 80,120,100, 61, 48,228,160, +215,255, 12,189,126, 35, 52,154,104,198, 58,246,232, 7, 14,242,105,166,106, 93,101,134,120,201, 44,152,111,107, 96,186,120, 25, + 2,145, 16,126,132, 15,127,194,135, 63, 95,128, 32,161, 24,180, 92,135,235, 7,142,184,221,233,197, 21,169, 31, 58,102,177,191, +135,171,222, 37,136, 95, 76,108, 30, 1,239,172,127, 27, 57,171,224, 69, 10, 92,103,242,135,128,143,188,235, 21,184, 94,108, 64, +250, 57,235, 6, 34,221,166,109,135, 39,251,158, 11, 73, 14, 4,164, 16, 62,188, 83,214,191,173, 9, 2, 39, 95, 67,192,164, 51, +240,121,126, 9, 16,236,239,153, 39,151,197,206,109,158,108,241,170,216,246,186, 42, 34,232, 93, 28, 63,120, 9,255,111,252, 56, + 4,183,236,142, 89,255,126, 21, 95, 44,222,139,136,192,197, 88,251,211,135, 94,239,224, 67, 8, 16,187,224,140,221, 98, 25, 58, +116,168,141,144, 44,110, 27,120,202, 36,161, 10, 56, 0,224, 55,148,220,108,130,110,143, 52,193, 55,223, 88, 45,255, 37, 75,128, +144, 16,171,136,146,155, 77, 80,114,179, 9,250,245, 57,175,114, 71,254, 7, 14, 28,128,197, 98,177,147,244,230,205,155, 97, 54, +155, 61,114, 95,215,225,225,185,139,252,173,239,179,123,229,157, 2,100,173, 66, 33,101, 44, 53, 11,165,176, 88,238,238,190,204, +117, 11,165, 88,155,144, 32, 77,176,126,199,229,255,164, 0,161, 20, 36, 33, 65, 33,165,148,226,179,207, 62,179,223,103,142, 19, + 18, 18,164,148, 90,159,163, 0,169, 77, 94,130, 66, 1,219, 61, 98, 54,155, 97, 50,155, 97, 50,221, 93,103,204,117,147,217,140, +175,215,174,149,174, 77, 72,168,165,124, 20,130,166, 77, 1, 33, 31,102,125, 5,206,110, 73,194,251,175,202,209,225,117, 57,250, +175,248, 8,151,254, 60, 1,190,175, 24,198,226,155, 56,125, 84,141,237,135,246,160,244,198, 13,156, 57,115,166,193, 54,214,138, +140,140,100,229, 77, 80, 40, 20, 1,148,210, 65,153,153,153,191,191,247,222,123,189,206,158, 61, 43, 50, 24, 12,224,243,249,104, +218,180, 41, 76, 38, 19, 50, 50, 50, 64, 8, 17,185, 27,235, 19, 18, 18,252, 21, 10,133,111, 66, 66, 66,112, 73, 65,234,159, 31, +254, 47, 63,232,175, 67, 59,160,209,241, 32, 18,240,208, 33, 80,140,210,219, 34,200, 63, 53,225,244,237,254,254,238,120,195, 22, +107, 66, 29,251,162, 77, 49,184,235, 58, 71,215,247, 7, 12,249, 59, 43, 7, 60,119, 90, 40,179,223,119, 13, 55,231,232, 41,158, +123,251,108,238,126,189,126, 35, 0,130,170,170,239, 33, 62,118, 25,250, 61,143,214,184,239, 14,111, 15,136,146, 4,104,202, 97, + 17, 9, 96, 56,126, 22,213,231,243, 80,181,247, 16, 80, 89, 13, 17,165,240, 3, 31, 2, 16, 84, 91, 76,208, 84, 87,225,235,125, + 59,220,202, 92,245,174,213,186,119,132,245,156, 49, 87, 40,178, 46, 82, 44, 88,230,125,127,117,202, 87,206,218,101, 47,147,201, +236,123,107, 51,120,105, 77, 1,246, 31,215, 34,255,102, 21, 0, 32,255,102, 21,114, 10, 42,129,232, 68,102, 99, 20,247,174, 31, + 82,104, 85, 4,202, 79,195,223,255, 34,124,196,229,176, 88, 52, 48, 26,143,131,207, 15,129, 65, 87,220,104,157,117,194,232,127, + 75, 0,130, 47,127,155,129, 38,188, 71, 0, 0,215,179, 40, 6,140,227,227,223, 75, 71, 98,232,200, 94, 0,168,237, 57,207, 16, + 21, 21, 69,223,248,132,160, 73,171, 62,160, 0, 70,191, 48,147,245,188,255,218,111, 22,211,214,173,255, 2,112, 6, 37, 55,155, +160,188,216,186, 5,115,223,190, 64,183,110,192,203, 47,223, 33,255,242, 98, 95,148, 23,251, 34,200,239,122,157, 50,199,143, 31, + 15,169, 84,138,225,195,135,215,112,253, 59,126,188,153, 18,112,245,222,122,131, 88,135,249,109, 66,136,253, 83,219,181, 88,185, + 92, 45,143,113, 63, 39, 30, 19, 19,163,114,101, 57,207,155, 55, 15, 49, 49, 49, 53, 8,181, 54,121,191, 41, 20, 56,115,230,140, +221, 5,239, 88,103, 12,156,175,205,140,141, 85,199,202, 93,111,213, 44,162, 20, 60, 63, 31, 24,111, 92,129, 98,241, 98,172,215, +149, 64, 27, 21, 97,191,255,221, 79,235,241,193,155,175, 34,116,193, 75,248,232,244, 1, 36,106, 47, 97,228,179,207, 34, 36, 36, +196,227, 96, 64, 27,209,211,240,240,240, 26,125,248,232,209,163,170,186,182, 99, 87, 40, 20, 66,133, 66, 49,240,244,233,211,249, + 41, 41, 41,234, 55,222,120, 35,226,203, 47,191, 20, 87, 84, 84,216,183,105,174,170,170, 66,147, 38, 77,114, 38, 76,152,208,125, +200,144, 33,143,184, 81, 36,120,132,144, 78,167,211,182, 20,101,239, 89,112,121,193,162,248,118,219,151,180,199,249, 66, 1, 74, + 43,248,176, 16,160,184,194, 0,218,162,107,213,252,119,150,245,122,230,249,127,189, 6, 55,241, 4, 54,247,127, 13, 87,191,155, + 99, 14,141, 64,254,181, 77, 1, 80,182,174, 28,185, 92,238,238, 33,234,108,253, 91, 93,109,223,215,230, 29,112,251, 79,123,181, +108,163,210, 80, 35, 68,197, 26,136,127, 59, 0, 34,224, 1, 85, 6,208,114, 29,136,201, 4, 33, 0, 51,181,160,202,108, 66,185, +201, 0, 88,220, 91, 81, 76,144,223,170,119,107,213,105, 97, 13, 18,108, 16,133,149, 56, 4,242,185,125, 1,238,178,254, 1,252, +242,122,187, 26,231, 3, 23,230, 65, 72,111,195, 72, 90, 66,169, 84, 30, 96,251, 98,137, 43, 84, 8,250,232, 39,220,122, 35, 22, +183, 53,190,104,111, 60, 11,179, 57, 15, 0,112,229,100,219, 70,235,176,137,187,191, 80,189, 58, 74, 81,131,252, 25, 68, 4, 46, +198,224, 94,227, 17, 25,116, 22,137,187,151,170, 60, 25, 68,134, 13, 27, 70, 83, 82, 82, 80, 92, 60, 2, 45, 90,236, 71,147,150, +189, 65, 41, 5,143,199, 99, 21,136,148,159, 15,228,229,157,177,157, 85, 0,226, 10,104,116,192,160, 65,214, 43, 57, 57,192, 87, + 95, 1,229,101,128,174, 2,168,208, 1,254,129,101,172,202, 86,155,181,159,155,155, 11, 0,248,228,147, 79, 0, 0,161,161,161, +247,194,205,204,170, 14,231,206,157, 91,195, 98,119, 38,110,214,222, 29, 27, 97,219,231,253, 29,240,217,103,159, 97,205,154, 53, + 80, 40, 20, 18,119,193,117, 51,130, 67,145,125,246, 28, 10, 3, 3, 85, 60, 30, 15,115,230,204,185, 43, 38,195,147,242, 61, 89, +221, 28,212, 82,129, 87, 63,121, 23,125,198,143,135,226,147, 79,192,227,221,225, 57, 69,206,153, 59, 30,194, 67,135,176,111,223, + 62, 92,186,116, 73, 42,151,203,213,108, 54, 94,113, 36,255,180,180, 52, 21, 0,100,100,100,168, 34, 35, 35,165,105,105,105,234, +240,240,112, 73,122,122, 58, 34, 35, 35,165,149,149,149,170, 90,198, 92,227,180,105,211,250, 76,153, 50,165, 89,151, 46, 93,176, +107,215, 46,125,105,105,169,160,178,178,210,234,237,176,205,127,108,221,186, 53,116,244,232,209,190,114,185,188,210,133, 24,158, + 3, 89,243,242,178, 78,174,249,224,237,233, 77, 90,116, 83,226, 79,229, 43,248,235, 42, 65,254, 77, 1, 64,121,168, 54, 24,161, +161, 45, 10,103,207,152, 21, 65, 8, 41,100,198,124, 79,126,175, 11, 15, 1, 55, 85,240,128,160, 86, 45, 46, 37, 37,229,174, 79, + 73,161, 22, 37,133, 90,143,218,154,249,220,177, 98,173, 13, 47, 62,118, 25, 62,103, 10, 33, 40,208, 50, 30,128, 26,207,215, 38, +240, 92, 65, 62,142,221,190,134,179,151,242,112,243,210,101,148, 93, 46, 64,249,213, 66,152,244,149, 48, 26, 77, 40, 55, 27,160, + 55,155, 80, 77,205, 48,131,130, 18,246, 74,166, 99,180,255,133, 92,235,249,130,101,140,229,207, 67,252,187, 13,179,226,197,211, + 56,128, 56,165, 22,113, 74,109, 13,194,103, 62,145,113, 25, 16,210,219, 16, 80, 45,126,153, 97, 54,177,158, 2,184,121, 12,102, + 93, 19, 0,192,127, 5, 1,168,190,121, 5,153,159,182, 67,246,207, 99,113,236,211,126,200,201,186,214,168, 29,179,239,160, 16, +232,180,128, 78, 11,232,125,207, 1, 0,126,253,208,136,183,231, 45, 1, 0, 12,137,238,229,177,229,255,194,176,131,208,104,162, + 17,120,116, 63, 86,191,107, 85,114,135, 13, 27,198,202,245, 15, 0,203, 63, 94, 74,186,118, 5, 28, 63, 23, 46, 88,221,255, 0, +208,173, 27,197,154, 53, 64,167,238, 21,120, 44,226, 22, 6,141,184,133,231, 95, 50,178, 46,163,163,197,207,156,135,134,134, 34, + 52, 52, 20,115,230,204,105,232, 42,118,251,174, 57, 98,221,186,117, 82, 87,132,109,247,162,173, 90,133,117,235,214,177,178,132, + 95,123,237, 53, 21, 19,249,239, 10,243,231,207,191,203, 11,224, 10, 7,207,229, 99,250,140,217, 56,190,113, 35, 22, 45, 90, 84, +171,114,194,148,111,255,254,253,168, 43, 96,111,216, 99,143,224,251,239,190, 66,216,228,201, 88,190,124, 57,234, 42,227,188,121, +243, 48, 98,196, 8,120,179, 2, 32, 45, 45, 77,229, 16, 44,135,163, 71,143,170, 0, 32, 61, 61, 93, 69, 8, 65, 90, 90, 90,157, + 50,245,122,125,243, 29, 59,118,224,220,185,115,200,201,201,241,211,233,116, 48, 26,173,253,204, 96, 48, 96,247,238,221,196,166, + 44, 84,178, 40,142,165,186,186, 90,116,124,203,100, 84,101,127,129, 61, 41,185,184,116,157,143, 50, 29, 15,102, 10, 20,234,124, + 49,123,193,187,145,177,177,177, 5, 44, 12, 62,187, 94,193, 44, 57,101, 57, 29,192,161, 17,172,255,218, 20, 0, 2,128, 72, 36, + 18, 72, 36, 18,156, 58,117,202,254,201, 59,118, 5,165,149,165,104, 49,200,243,117,191,199,143, 31, 39, 0,224,231, 55, 5,226, + 99,151, 33,188, 82, 12, 74, 8, 68, 51,138,107,220,119, 75, 92, 34, 62,204, 20, 40,208,149, 32,191, 84,131, 91,101, 90,148, 86, + 85, 65,107,168,196,173,234, 74, 92,175,210,163,176,170, 2, 26, 99, 53,180, 22, 35, 12, 22,247,193,175, 79, 62,225, 98,192,115, +136, 11,120,117, 98, 19, 80,136, 64, 61,222, 6,252, 78,244,190,139,107,172,145,127,179, 10,251,143,107, 49,112, 97, 94,205,186, +160,183,225, 99,185, 2, 31,203, 21,124,240,148, 0,249,249,249, 6,182, 50,183, 92,178,160, 85,124,130,253,252,146,206,140,130, +220, 66,100,165,158,197,141,203, 37,141,222,113, 55,126,157, 2, 0, 40, 43,162,240,171,124, 12,146, 25, 2,252,191, 37, 66,251, + 39, 62,113, 50, 8,123,227,159, 62, 55, 52, 5,175, 44,176,146, 63, 33, 4,191,167, 90,155,128,237,154,127, 6,161, 61,186,215, + 44,231, 70,224,203, 47,129,139, 23,173,158,128, 15, 63,164,118,247, 59,165, 20,129,129,129,238, 71, 96, 91, 31,101,230,253, 63, +249,228, 19,228,230,230, 34, 59, 59, 27,217,217,217, 72, 78, 78,198,155,111,190,137,252,252,252, 70,107, 15,134,232, 92, 89,210, +115,231,206, 5, 33,132, 53, 25, 18, 66, 80,151, 50, 81,215, 61, 71, 28,242, 41, 1,225, 53,193,183,239, 44, 67,147, 29,201,136, +137,137,193,100, 70, 27, 3, 32,239,214, 27,115,195, 6,195,207,207, 15,195,134, 13,195,123,239,189,135,228,228,100,213,242,229, +203, 93,190,127,223, 21,102,227,122,175,199, 16, 28, 28, 44,181, 88, 44,117, 42, 20,117,221, 99, 65,142,118,143, 83,100,100,164, +212,129, 40, 17, 17, 17, 33,117,227, 61, 25, 62,108,216,176,102,249,249,249, 56,116,232, 16, 30,125,244, 81, 8, 4, 2,251, 20, + 71,112,112, 48,219,233, 8,139,237,255,146,174, 61,250,199,173,219,219, 28,127,237, 90,130, 39, 35,123,194, 95,204,131,191,159, + 25,190, 62,213,120,250,185, 9, 22, 0, 26,199, 47, 38, 36, 36,184,155,139,178,175, 2, 96, 57, 29,192,225, 65,243, 0, 0, 32, + 10,133,162,233,220,185,115, 49,119,238, 92, 0, 48,124, 28,251, 49,140, 69, 38,248,250,138,225, 77,227,201,100,214,240, 97,191, +167, 46,130,242,121,120,239, 87,189,163,245,207, 10,126,193,193, 82, 83, 19, 63,104,169, 25,231,116, 90,156, 41, 45,198,217,178, +219, 56, 91,166,193, 57,157, 6, 23,245, 90, 20, 87, 87,161,194,100,194, 53,189,206,254, 63,235,194, 11,163, 8, 86,189,203,199, +170,119,249,160,224,131, 18, 30, 98, 38, 17,188, 54, 73,132, 25, 19, 91,161,107,215, 54,176, 64,232,241, 79,102, 92,253,142,243, +242,117, 36, 5,170, 77,134, 52,167,192,170,200,103,174,176, 6,209,237,121, 43, 0, 0, 32,160, 90,240,169, 14,213, 60,107, 68, +179, 70,163,241,147,201,100,209,158,148, 49, 44, 44, 12,201,201,201,216, 88,161, 67,165,129,135, 87, 54,125,139, 34,177, 47, 42, + 13,141,183, 77,196,184,190, 31, 72,211, 52,203,176,241,199, 68,251,181, 95, 63, 52, 34, 34,112,177,253, 60,230,153,175,164, 20, +172,214, 15,211,213,139,129,105, 11, 70,160,249,209,100, 72, 63,141, 2,111, 44,160, 86,171,189,234,195,157, 58,213,140, 30, 31, + 62, 28,104,222, 28, 8, 9, 1,194,251, 54,133, 88,196, 7,159,119, 71,172,216,215,215,237,128,204,227,241,236,150,127,110,110, +174,221,234,103, 62, 31,125,244, 17, 62,250,232, 35, 92,187,198,222, 43,227,106,190,190,230,125,207,173,175,117,235,214, 73, 87, +175, 94,237,146,176,217, 90,255, 14,174,231,187,226, 20,152,115,139,133, 93, 10,123, 3, 33,176,232,171, 33,108,219, 9,242,165, + 75, 49,205,191, 57,154,171,211,236,247,103,252,107, 26, 62,248,239,183,200, 89,245, 11,222,239, 51, 28, 19, 2,187, 96,223,182, +109,200,203,203,115,249,254, 61, 31, 43, 71,175,222,189,165, 22, 91,153, 24,133,204,113,122,198,213,181,218, 48,115,230, 76, 74, + 8,161, 76, 96, 31, 51,223,239, 72,242,105,105,105,234,136,136, 8, 41,165, 20,204, 84,128,155,122, 75, 17, 10,133,143, 62,255, +252,243,185,165,165,165,208,106,181,240,245,245, 69,171, 86,173,208,188,121,115, 52,111,222,220, 93,229, 89,156, 20, 59,179,143, +143,143,254,197,216,207,165,235,143, 13,196,229,171,101,104, 19,192, 71,100,119,130,199,187, 80,248, 55,107, 86, 2,192, 92, 7, +111,112,251, 13, 60,164,214, 63,224,102, 25,160, 92, 46,175, 80, 40, 20, 62, 0,252,229,114,185, 93, 11,236, 16,213,222, 43,205, +151, 89,234, 39,147,201,168,104,134, 61,242,159, 56,204,255,187, 29,144,223,217,153,168,254, 36,250, 57,232, 77,213, 40,211,233, +145,107, 52, 66,104,177,126,185,212, 88, 5, 11,165,160, 0,118,221,188, 4,157,201, 8, 0, 44, 6, 38,130, 5,203,106,246,113, +107, 60,128, 5,102, 84,227,252,197,114,124,191,185,204,163, 31,235, 72,244, 54,151, 63,181, 29,219,137,157,205,234, 7,235,119, +149, 16,142,248, 26, 64, 8,138,139,239, 4,231,137, 44,215, 97,224,181,195,236, 62,217,184,126,221,110, 57,237,103, 83,190,216, + 95,215,213, 80,188,148, 74, 37,152,210,108, 58,125, 4,209,209,209,141,214,113,183,159,178, 46,239, 75, 77, 62, 11, 0, 24,220, +203,154, 25,239,237,121, 75,112,228,108, 47,252, 55,113, 50, 20, 59,102,177,158,255,127,101, 65, 52,130,130,146,109,103,106,155, +178, 20, 13, 74,173,214, 24, 64, 17, 20,148,204, 74,214,190, 61,123,237, 57, 45, 38, 79, 6,164, 82,130,219, 87, 3,160,211,138, + 81, 89, 38,194,166, 13, 4,115,231, 82, 92, 41, 42, 71,120,100, 4, 82, 14,168, 88, 89,197,102,179,217, 62,223,159,156,108, 45, +171, 35,225, 23, 21, 21,161,168,168,136, 53,255, 59, 16, 6,229,241,120,119,145, 42,165, 32,158, 38, 1,146,203,229,234,215, 94, +123,173, 70, 44, 0,227, 17,240,196, 21, 78, 28,180, 18,139,211,178, 2, 66,216,207,217, 17, 66, 96, 42, 47,135,176,101, 16,248, +126, 77,208,235,197,241,248,104,212, 72,188,195, 44,219,235, 63, 0,230,202, 42, 8, 91,180, 65,159, 8, 9, 58,119,232,130,207, +207,167,161,119,239,222,210, 99,199,142,221,165, 4,196,202,229, 0,136, 10, 0,102,197,198,218,151, 14,154,156,200, 94, 32,224, + 3,244,206, 66,197,218, 10,188,118,237, 90, 2,128,218, 92,252, 36, 35, 35,195,165,139, 63, 45, 45, 77,205,134,252, 19, 18, 18, + 8, 33,100,113,243,230,205,123, 69, 68, 68,116,189,112,225, 2, 78,156, 56, 1,179,217, 12,127,127,127,232,245,250,162,160,160, +160,203,158, 24,125, 10,133,130,215,166, 77,155,125,207, 61,247, 92,155,163,135, 51,176, 70,185, 15,205,136, 8,221,219, 84,227, +226,109,127, 12,237,110,188, 4,192,121, 30,203, 92, 87,155, 56,102,156, 34,132, 56,158, 58,231,125,225,208,200, 16,176,120,233, + 13, 0, 12, 14,131, 10, 45, 72,241,120,126,184, 6,185,215, 66,124,172, 51, 6,150,105,180, 82,163,159, 88, 85,202,179,224, 70, + 85, 5, 96, 52,194,108, 91,215,116,190,162, 4,133,250, 50, 80, 74, 97,203, 47,160,102, 83,188,152, 73, 4,235, 54,221,233,147, + 23,114,129, 30, 93, 77,224, 67, 87, 47,242,119,234,236,238,234,160, 86, 47,128, 82, 57, 75, 5,100, 66,163,209, 24,242,243,243, + 5, 43, 71,130, 23,183,111, 24,230,245, 62, 98,183,194,216, 42, 21,174,188, 46,206,231, 12, 9,177,181,230,176,132, 96,160,109, + 37,135,171,229,126,137,137,137,214, 76,128, 50, 25,101,147,243, 33,118,220,215, 82,197,246,217,170,180, 68,138,200,160,179, 24, + 18,221, 11,135,247,157,197, 81,237, 82, 16, 16,200,199,125, 37, 77,216, 62,155, 85,249,130,130,146, 65, 8,193, 11, 47,188,128, +111,190, 41, 3, 67, 49,214,191,148, 81, 8,104, 77,203,254,118,173,242,162,134, 75,165, 41, 7, 84,170,225,195, 1,195,141,142, +184, 90,226, 3,139,109,182,181,157,174, 13,222,138, 41,199,190,163,221,209,180, 67,119, 41,147, 37,176, 46, 48,196, 95, 80, 80, + 0, 0,184,113,227,134,221, 51,112,243,230, 77,251,192,234, 37,136,131,219,217,249,165, 36,108,242, 1, 56,226,155,111,190,145, +174, 89,179, 70,197, 40, 0,171, 87,175,246,216,250,119, 38, 12,111, 33, 22,139,113,227,202,101,116,233,218, 13, 22, 83, 53,136, +201, 12, 65,211,102,104, 58, 96, 32,154,244,127, 2, 22,157, 9,102,125, 53,168,201, 12,152, 45,136, 91,251, 95, 76,156, 60, 17, + 98,177,216,165, 60,211,166, 64, 86,255,215,213,115, 97,203, 93, 63, 27, 25, 25, 41,181, 41, 0,148, 82,138, 33, 67,134, 72, 83, + 83, 83,239,122,206, 29,249,219,234,202, 2, 96,119,247,238,221,251,127,241,197, 23,134, 91,183,110, 85,141, 28, 57,242,185,204, +204,204,247,245,122,125,113,203,150, 45,229,159,127,254,185,134,109,253, 41, 20, 10, 33,128, 71, 34,194,195, 91,197,206,136,197, +165,130, 75,154,169, 51, 98,159, 76,223,183, 33,254,122,185,102,240,192,168,145,150, 54, 29, 66,255,159,179,149, 95, 87,106, 97, + 91, 31, 35, 14,250, 39,113,193, 1,206,199, 28, 30, 84, 5,160, 46,235,194, 27,242,103,200,166,150,132, 49,172,148,128, 21, 39, + 14,170, 1,144, 73, 3, 34, 41,124,197,208, 82, 19, 12, 38, 19, 44,212,130, 22, 1, 1, 40,208,149,194,147,228, 66,174,150,247, +221,137, 1,240,108, 45,182, 43, 23,127,125,211,245,218,242, 8,140, 27, 56,112,224,246,184,184, 56, 81, 80, 80,144,229,250,245, +235,152,215,251,186, 51,249,179,254, 31,181, 37,236,241, 10,182, 44,127, 46,146, 60,221,245, 12, 91, 36,108,159,165, 6, 64,198, +246, 89, 34,217,121,250, 67, 85, 90, 34, 64, 64, 48,174,239, 7,210,237,167, 62, 80,179, 37,127,166, 47, 21, 23,143,160, 64, 25, + 99,253,194, 21,239,172,143,223,207,244, 7, 82,215,230, 26, 54,171,158, 20,107,123, 75,204,229,229, 42,194, 7,244, 85,190, 32, +229, 38, 8,120, 2,232,121, 98,233,168, 9,175, 98,118, 76,172,219,246, 72, 74, 74, 34, 73, 73, 73,244, 30,190,127,160,148, 18, + 66, 8,117,140,104,119,244, 4,120, 34, 75, 46,151,171, 99, 98, 98, 48,111,222, 60,187, 66,209, 88,169,112,135, 15, 31,142,217, +137,235,240, 81,121, 9,250, 69, 13, 5,175, 77,160,181, 76, 70,106, 77,221, 11, 33, 8, 95, 0, 34,226,227,155,132, 85,104, 54, + 98, 32,186,118,237,234,113,212,126,125,224, 96,221,171,194,195,195,165,169,169,169,245,170,171,220,220,220,232,253,251,247, 95, +225,243,249,219,158,124,242,201,143,103,205,154,117,107,237,218,181, 41,128,117,202,193, 3, 81, 60, 0,201, 39, 78,156, 24,244, +195,250, 13, 60, 17,223,231,234,248,151,198,247,157, 61,123,182,246,235,175,191, 30, 11, 32,192, 70,252,229,204, 6, 65,108, 60, + 10, 28, 30, 12,176,113,255,123,171, 0,212, 91, 97,112, 67, 62,172, 7,164, 77, 39,210,136,108,188, 76, 98,201,202, 81,233,170, + 13, 48,153,205,232, 58,104, 0, 66, 77,225,158, 18,110,131, 5,163, 48, 73,127, 0,168, 24,107,220, 22, 7, 80,175, 28,248, 74, +165,114,135, 66,161, 16, 36, 39, 39, 47, 88,185,114,229,167, 14,202,197,112,199,255,197,214,163, 0,160,193,146,151, 76, 56,207, +196, 89,212,254,251, 38,156,151,121,165,233,239, 60,253,161,154,105, 31, 10,138,237,167, 62,240,170,140, 86,114, 39,120,101,193, +240, 59,102, 47,185,115,111,193, 50,207,243,145,199,189,117, 70, 29, 7,144,181,223, 44,150, 84,234,173,251, 0,220,201,255, 31, +235,241, 59, 98,179,200,204,114,185,188,193,231, 85, 25, 37,160, 33,100,217, 98, 1, 84,204,113, 3,148,205,171,239,117,237,218, + 21,109,231,204,145,174,217,187, 87,149,247,241,111,144, 9, 91,160,185,109,243,158, 74,189, 9,115,223, 92, 4,190, 95, 16,118, +109, 80,224, 84, 75,130, 81,131, 7,123,157,183,223,108, 54,121, 61, 76,176,117,241,179, 80,190,200,243,207, 63,127,139, 82, 26, +223,163, 71,143,255, 21, 23, 23,235,188, 32,126,199,122, 31,150,145,145, 1,139,137, 96,240,144,190, 31,204,158, 61, 91, 11, 0, +179,102,205,178, 0,208,214,167, 73, 29, 60, 78, 53,142, 93,120, 69, 57, 60,100, 30,128,123,162, 20,120, 77,140, 73, 53, 18,236, + 32, 35, 55,171,209, 43,213, 41,233, 15,115,173,222,114,229,114,185, 25,192,127,108, 31,175,229,186, 42, 95, 61,127, 47,105,136, +103,238, 37,172, 4, 79,177, 96, 89,114,131,203,118,151,234,215,131,246, 53,222,203, 58,104,168, 77, 87,228,114,185, 90, 46,151, + 55,136, 44, 82,143, 57, 0,166, 12, 10,133, 2,182,237,123,145,239,176,125,111,234,254,125,246,237,123, 71, 68,140,128, 77,233, +173,245,255,241, 39,106,137,121,115,224,221,196,196,114, 55, 65,119, 74, 64, 67,212,215, 19, 79, 60, 81,109, 50,153, 82, 0,232, +222,123,239,189,122,145,104,108,108, 44,121,239,189,247,168,193, 96, 0,128,189,181, 61,183, 98,197, 10,178,112,225, 66,251,255, +178,165, 2,174,115,108,119, 14,238,228,112,127,193,214,195, 69,188,221, 71,152, 3, 7, 14, 28, 56, 52, 10, 76, 0,170, 0,136, + 27,216,136,115,183, 99, 32,235, 29, 5, 57, 60, 28,224, 26,147, 3, 7, 14, 28, 30, 46, 8, 0, 52, 97, 65,254,122, 88, 3,184, + 27,138, 15, 44,224,150,253,253,237, 58, 18, 7, 14, 28, 56,112,248,251,193,143,227, 11, 14,156, 7,128, 3, 7, 14, 28, 56,112, +224,192, 41, 0, 28, 56,112,224,192,129,195, 63, 29, 53, 92, 58, 39, 79,158,244, 58, 34,215, 85, 48,225,131, 46, 47,100,128, 15, +124,125,110, 64, 40, 42,129,197, 98, 93, 22,198,231,243,192, 35,124,235, 95, 30, 1, 33, 60, 80, 34, 0, 33, 4, 60,152,176,125, +167, 16,148, 82, 4,241, 90,192,147,242,217, 50, 42,182,132, 53,128,167, 28,214, 4, 3, 70,102,201,215,195, 88,127,156, 60, 78, + 30, 39,143,147,199,201,123, 48,229,113, 30, 0, 55, 56,120,248, 34,180,165, 90, 24,141, 20,183,110, 19,236, 73,246,197,222,125, +254,224, 17, 33,246,169,218, 98,239,129,118,216,171,106,135, 67,199, 90, 65, 0, 1,120, 16, 99,104, 36, 15, 62, 34, 31,214,255, + 99,210, 43, 83,233,164, 87,166,210,195,169,170, 42, 35,143,164,158, 61,147,121, 80,117,228,176, 46, 57, 57,185, 10, 64, 83, 78, + 7,125,248, 49,242,169,161,146, 89,179,166, 82, 79, 55,121,122, 88,161, 80, 40, 36,212,134,186,118,215, 99, 11,234, 4,174, 71, +113,224,208, 8, 30, 0, 6,131,135, 12, 98,253, 18, 30, 73,205,112,171,181, 52,180,188,134, 68, 70,166, 16,163, 71,154,113,234, + 47, 95,136,132, 2, 8,248, 2, 8,133, 20, 62,124, 35, 32,104, 10, 1, 42, 49,168,151, 9, 98,145, 15, 40,128,118,109,128,103, +199, 88,176,127, 27, 59,242,191,120, 62, 27,143, 62,214, 21,237,131,155,163,224,202,133, 78, 1,109,187,160,101,123, 51,254,248, +253,119, 36, 39, 39,151,160,145,119,196,146,201,100, 99,148, 74,229, 78,135,243,103, 28,207, 57,212,142,217,179,100,212, 84,117, + 86, 58, 40, 44, 80,101,177, 20,163,180,125,165,170, 67,219, 17,168,168,110,135,111,214,253,244,183,221,233, 44, 38, 38, 70, 53, +111,222, 60, 16, 66,176,122,245,106, 85, 67,228, 4, 96,210, 1,112,252,127,255,225,145,210, 69, 41, 8,143, 87, 87,123, 83,199, +246,100,218,244, 78,242,173,154,237,236,184, 51, 34,135,134, 5,147, 13,208,193, 75,192, 78, 1,104, 44,240,238, 51, 23,142, 25, +101, 4, 5, 31, 2,190, 16,131,195, 9, 90,183,226, 65, 32,224,193, 71,200, 71,143, 80, 30,174, 92, 53, 97, 80, 24, 15, 45,130, +196,248,227, 64, 51, 0, 0,159, 86,130, 82, 11,220,165, 8,158,244,202, 84,250, 87,102, 38, 58,183,239,128,191,210,142, 34,221, + 96,132,246,182, 22, 34,159,166,232,217,127, 8,250, 14, 25, 5,213,118, 37,100, 44,115,227,223, 3,226, 31,174, 84, 42,247,135, +132,132, 32, 51, 51,147,233, 48, 37, 0,230, 40,149,202, 29, 50,153, 44, 90,169, 84,238,255,187,189, 20, 51, 99,101,212, 71,160, +129,128,103, 64, 85,149, 25,165, 58, 95,252,248,243,126,143,234,127,196,200, 33,146,102,190, 26, 12, 31, 34, 66,231, 78,207,170, +154, 53, 11,128,209,100,194,173, 91,183,209, 38,255, 42,114,114,243,240,202,203, 99,232,134, 31,118,121,213,174, 97,182, 61, 21, + 0,246,219,100,223, 79,235, 31,184,179, 29,238,234,213,171,161, 80, 40, 36,141,149, 14,248, 62,190, 47,116,203,150, 45,119,239, +167,208, 72,228,165, 80, 36, 72, 8, 8, 98, 26,160,222,105,254,175, 32,233,175, 58,114,188, 45, 75,166,125,223, 43, 59, 94, 77, +208,185, 85,228,254,248,227, 15,251,249,232,209,163,177,123,247,238, 58,207, 57,220,123,242,119,188,230,168, 8,212,169, 0,164, + 30, 78,199,144,161,225,247,173,208, 22,207,178, 67, 58, 62,236,213, 75,200, 19,240,161,213, 8,208,182,181, 16,109, 91,139, 80, + 81, 33,132, 88, 40,128, 89,224,131, 1,125, 8,250, 61,206, 7,143, 8, 65, 8,129,143, 80, 4, 33,175, 26, 68, 44,130, 73, 15, +152,160,171,147,252, 15, 31,216,143, 46,237, 90,225,204,169, 51,200, 47,186,126,167,124,229, 21, 16,159, 61, 70,121,124,130, 1, + 97, 3,240,199,110,207, 56,118,237,218,181,146,204,204, 76,213,197,139, 23,225,235,235, 11, 95, 95, 95,233,214,173, 91,213, 30, + 14,102, 82,165, 82,185,159, 33,126,135,206,209, 28,192,168,111,191,253,246,246,171,175,190,154, 44,147,201, 70, 42,149,202,228, + 7,177,131,135,135,135, 75,210,211,211, 89,255,110,201,240,193,146,222,161, 77, 85, 29,218, 21, 33,160,153, 15,120, 60, 63, 84, + 86,154, 80,172,169,196,100, 89, 79, 42,110, 54, 0,223,127,247, 51,171,126, 36,196, 13,188,240,204,227,170, 94,189,122,226,250, + 13, 45,142,255,121, 2, 21, 21, 58, 4, 4, 52, 69, 72, 72, 39,240,248, 66,152,205,249,136,157, 57,149, 38,172,253,241,111,101, +221,196,196,196,168,230,207,159,111, 63,159, 55,111, 94,131,121, 1, 30,100, 15,128, 82,169, 36, 50,153,140, 38, 37, 37,193,213, +198, 74,247,219,104,151,203, 99, 65, 8,193,186,117, 10,105, 76, 76,253,148, 0, 94,167, 23,237,228,157,177,188,137,203,193,180, +109,115, 30,130,131,120, 15,109,251,253, 83,225, 72,246,174,148, 2,183, 30,128,212,195,233, 0, 80,111, 69,224,240,156,156, 58, +239, 15,253,188,155,215,131,133, 67,142,115,143, 6,161,100,117,107, 8, 5, 66,116,108, 95,129,242,114, 33,142,159,233, 8, 62, +159, 15, 62,225, 67, 36, 52,161, 87, 55, 61,186,119,227,131,128, 7,145,208, 7, 34, 62, 65,216,227, 6, 4, 5, 90,176,241,127, +117,203,238,217,165, 13,174,228, 22,213, 36,127, 27,242,175, 93, 33,132, 39,160,237, 34, 31, 71, 96,243,166, 40,209,222,102, 85, +222, 53,107,214, 72, 86,172, 88,161,186,114,229,138,227,101,213,152, 49, 99,176,107, 23,123,107, 83,169, 84, 30,112, 36,127, 23, +104, 25, 31, 31, 95,242,198, 27,111,236, 67, 35, 79, 81,212, 65,254, 42, 79,202, 22, 26, 18,164, 10,110, 83,134,150, 45,252,209, + 33,184, 45,252,252,253,112,229, 74, 33,204,102, 11,130,219, 55,197,217,243,105,136, 28, 58, 72,146,118, 56,163,206,193,244,245, +215,167,210,199, 67,181,120,228,145, 14, 56,119,254, 10,142, 31, 63,143, 91,183,203, 65, 41, 16, 24,232, 11,189,190, 2,253,251, +247, 66, 73, 73, 41, 10,143,255,137, 33, 79,134, 75, 82, 15,177, 87, 84,107,134, 60,189, 0, 0, 32, 0, 73, 68, 65, 84, 30,100, + 48,214,191,109,219,105, 48,158,128, 53,107,214,120,236, 5, 96,166,251,157, 51, 1,187,216, 78,182,222,253,175, 67,135, 14,180, + 99,199,142,245,206,197,175, 84, 42,201,132, 9, 19,104, 98, 98, 34,152,141,149,234, 34, 60,219, 86,184,119,149, 63, 50, 50, 82, +194,108, 14, 84,139, 18, 75,221,200,180,255,111,185, 60, 86, 85,159,119,212, 89,222,160, 69, 21, 56,182,188, 73, 13,226,231,240, +112, 90,255,206, 46,255,122, 77, 1,212, 87, 17, 24,250,121,183, 90,149, 0,111,200,159, 65, 74, 74, 10, 10, 11, 11, 1, 0,193, +193,193,212,147,151,129, 79, 43, 33, 32,102,136,132, 66,252,121,166, 21,248, 2, 1,154, 10,117,214, 56,128, 38, 60, 20, 22, 54, +197,227,189, 44, 32,132, 64,246,172, 9,212,194, 3,136, 15, 8, 40,172,129,252,174,161, 47,185,138, 27,154, 10,100, 23, 22,214, + 90,150,146, 82, 13,180,183,110,216,100,177, 30,128,156,201, 31, 0,176,107,215, 46, 60,245,212, 83,146, 61,123,246,184, 29,224, +100, 50,217,240,188,188, 60,151, 29,166,180,180,212,241,114,243, 37, 75,150,224,220,185,115, 35, 30,164,169, 0, 7,242,103, 13, +201,240,193, 18,177,224, 58,124,125,155, 67,236, 35, 66,151, 46,157,209,177,115,103,148,149,169,161,209, 84, 64, 36,226, 35, 40, + 80, 12,129,111,115,183,131,169,128, 22,162,105,147, 22,208, 87,154,112,230, 76, 14,174,221, 40,197,245, 27, 21,168,172, 22,227, +145, 96, 19,196, 62,124,228,100,231,225,209,174, 93,113,237,122, 25, 42, 77,205, 88, 13,208,142,110,255,218,174,123, 58, 29, 80, +155, 76,111,100, 49,214,255,188,121,243,238,186, 62,127,254,124,175,188, 0,174,118, 39,116,158, 59,110, 40,175, 66, 90, 90,154, +170,190, 27,242, 76,152, 48,129, 42,149, 74,200,100, 50,184,154, 14, 96,227,169, 98,200, 31, 0, 50, 50, 50,238, 42,147,237,190, + 91,163,135,217, 97,176,161, 60, 46,137,243,253, 49, 97,181,206, 37,241, 7, 7,241,108,163, 20,187,230, 29, 61,122,116, 13, 47, +201,211, 79, 63, 93,163,174, 56,183,255,131, 3,143, 99, 0, 26,202, 35,208,144,200,201,177, 42, 22,133,133,133, 30, 41, 1, 2, +129, 0, 66,190, 16, 66, 33,193,176, 33,128, 94, 87,141, 75,185, 34, 8, 5, 66, 8,204, 2, 68,132, 83,136,132, 66,240,249, 60, +128, 18,104,180,192,177, 19, 2, 88, 44, 22, 0,183,106,149,123,226,207, 92, 84, 84,212,158,129,179, 75,219,182, 84,103, 34,168, +172, 44,133,217, 98, 98,253, 59, 79,156, 56, 81,187,210,161,215,179, 34, 26,103,215,191, 43,205,112,251,246,237,142,207, 39, 55, +134, 23,192,149,139,223,145,252,109, 3, 32, 59, 11, 48,184,141,138,199,187, 10,147,217, 2,131,209,132, 91,183, 53, 16,138,196, +168,174, 54,194,104, 50,195,100,178,192,100,166,172, 60, 49, 34,161, 14, 98,223, 14, 40, 46, 46, 69, 89,185, 30, 26,109, 37,154, +181,232,139,193,143, 63,142,140,212,221,104,111, 48,161,180,172, 20,221,187,119,133,143, 72, 0, 93,185,230,111, 49, 80,216, 34, +255,237,115,255, 78,158, 41,175, 98, 1,230,205,155, 87,195,155,224,124,143,173, 2,160,209, 68,219, 31,140,141, 13, 66, 98, 98, + 98,141,254,202, 24, 8,249,249,249, 94,239,202, 41,147,201,104, 98, 98,162,125,155,241,218, 98, 2,156,201,213,217, 83,149,150, +150,166, 98, 2,223, 40,165,244,232,209,163, 53,238, 31, 61,122, 84,229,206,233,193, 40, 13,140, 18,224,104,197,215,102,232,187, +249,109, 24, 31,153,140,205, 0, 38,174,214,225,137, 69, 21,245, 82,190,156,231,248,221,197, 4,112,184,247,222,128,218, 60, 0, +247,213,191,227,202,210,175,143,245,239,100,177, 34, 39, 39,135, 25, 80, 88,245, 94, 62, 95,128,136, 65, 22,240,121, 2, 28,203, + 20, 35, 43, 71,140,177, 79, 1,207, 60, 13,140, 27, 77,208,174,141, 8, 98,145, 15,196, 34, 31,248,138,125, 16,220,206, 7, 98, +145, 24, 98, 55,203, 0, 11,242,175,146, 18,205, 77, 82,219, 64,210,181, 75, 39, 4, 52,247,135,216, 98, 64,133,222,120,223, 59, +197,225,195,135,247, 31, 62,124,184, 6,225, 59,126, 0,160,184,184, 24,227,198,141,107, 52, 43,223,102, 29, 73,156,175,217,142, + 61,178,228,204,102, 64,167, 55, 66,167, 51,160,172,172, 26, 55,111,106,113,237,218,109,148,151, 87,163,162,194,136,138, 10, 3, +116, 58, 35, 74, 75, 74,221,202,170,174, 54,161,170,202, 12,163,209,128,166, 77, 69,232, 24,220, 12,126,254,254, 0,128,144,174, +157,209,161,125, 51, 4, 52, 19,131, 82, 51,140, 38, 11,170,171,117,127,139,129, 36, 38, 38, 70,181, 96,193,130, 58,201, 60, 38, + 38,134,181, 69,106,219, 82,184,214,251,171, 87,175,198, 55,223,124,227,241, 86,195, 14,219,206,218, 63, 12,161, 22, 22, 22, 50, +187,103,122,196,110, 19, 38, 76,160, 73, 73, 73,112, 84, 30,148, 74, 37, 25, 63,126,124,157,223,155, 57,115, 38, 8, 33, 96,250, +113,120,120,184, 4, 0, 34, 34, 34,164, 12,145, 51, 86, 63,115,159, 82,106,191,207,226,215,214,176,226, 93, 41, 14,108,102, 80, + 90,182,108, 9,226,160, 37,212, 87, 30,135, 7,143,252, 93,157,123,229, 1,120,144, 44,255, 59, 3,188, 25,124, 62,223,227,239, + 13, 25,100, 65,235, 86, 62, 40, 43, 19,192, 71, 96,130,143,136, 15,117,186, 8, 99,165, 66,136,132, 66,148,149, 9,145,154,233, +143,102, 98, 2, 30,143,135,209,209, 6, 60, 55,150,130,199,163, 88,122,210,243,114,202,100, 50,202,247, 19, 67, 35,108, 9, 63, + 99, 1, 46, 22, 82, 12,151, 12, 99,189,165,111,255,254,253,113,228,200, 17,151,247,252,252,252, 88, 15,150, 90,173,118, 4, 0, +172, 95,191, 30,211,166, 77,179, 95, 47, 46, 46,182, 31, 79,155, 54, 13, 69, 69, 69,141,210,158,233,233,233,106, 66, 8,152,121, + 82, 30,143, 7,198,221, 89,199,188,105,173,200,191,122, 77,218,170,153, 94,229, 35,226,195, 96,180,160,170,186, 0, 87, 11,138, +161,209,150, 65,163,209,163, 88, 83,137, 98, 77, 37,154, 7,117, 6,144, 91,167,172,155,183, 41,110,220,188,141,158, 61,187,162, + 68,171,133, 80,192, 67, 89,121, 1,116, 37, 22, 60,246,168, 14,109, 90,181,130,159,159, 31,124,124,124,113,253, 70, 57, 8, 63, +144, 85, 25, 29, 93,242, 13,181, 10,160,161, 87, 16,212,102,173, 3,119, 98, 1,216, 66, 46,151,171, 99, 98, 98, 48,119,238,220, +187,188, 10,204, 52,131,183, 43, 11, 38, 76,152, 80,195,130,101,222, 47, 66, 8, 94,124,241, 69, 36, 37, 37, 17,182, 74,128,179, +229,239,120,207,217,211,224,140,181,107,215, 18, 0,118, 43, 63, 35, 35, 67,101,235,215,106,155, 55,128,249,171, 2, 64,210,211, +211,237,247,235,218,206, 53, 45, 45, 77, 53,100,200, 96,233,145, 35,214,119, 98,230,204,153, 56,121,242, 79, 41, 67,225, 71,143, + 30, 85, 49,191, 63, 34, 34,194,173,167,108,237,218,181,248, 74, 26,136,137,107,244,214,223, 53,223,191,198,253,137,107,244,246, +250,156, 46, 21,226,187, 3, 6,112,120, 8,148,246,184, 21, 53,149,238,149, 11,113,242,228, 73,246,171, 0,238, 5,241, 59,198, + 2,212,199,250,175,105,201,215, 36,127,155,155,201,237, 84, 64,203,150,124,240, 8, 31,173, 90,242,209,173, 43,197,181,107, 2, +240,248, 4, 66,129, 0, 66,129, 16,127,157,246, 71,144,191, 16,124, 62, 31, 67,194,205,240,245,245,129,197, 66, 1,106,246,138, +252,155,180,233,136,155, 21, 20,186,139,106, 8, 8, 31, 23,175,229,147,139, 44,201,223, 54,176, 73,175, 94,189,170,186,122,245, +170,171,223,171,102, 89,142,145,197,197,197,251, 24,146, 7,128,113,227,198, 97,253,250,245,246,103,202,202,202, 80, 84, 84,132, + 29, 59,118, 48,203, 5,239,123,231,181, 13, 92,170,140,140, 12, 21, 19, 44,102,187,230, 49, 41,164, 30, 74, 87, 75, 37, 97,160, +133,101,208, 87, 26,161,245,169, 2,133, 22, 85, 85, 38,148,149, 85,163,232,182, 30,215,174, 87,224, 73,105, 39, 0,169,117,202, +170, 52,180, 68,222,165, 91, 8,233,242, 8,186,116,233,128,226,226,219, 8,108,110, 70,183,110, 1,104,221, 42, 4, 98, 95, 95, +148,148, 84,224,248,137, 11, 40, 40, 44, 67,219, 14,189, 30,218, 1, 36, 65,161,160,132, 64,202,112,169, 35,169,214,181,110, 63, + 65,161,144, 36,172, 93,203,202, 11,176,102,205, 26,149,179, 2,176,106,213, 42,172, 91,183, 78,234, 78, 94, 66, 66, 2,141,141, +141, 37,114,121,160, 67,153,168, 43, 98,166, 0, 48,126,252,120, 86,238,127,199, 41,133, 22, 45,146,224,237,180, 1, 99,229,219, + 20, 0, 74, 41,197,144, 33, 67,164,169,169,169,181,222,119, 71,216,204,220,122,106,234, 17, 21, 33, 4,132, 16,244,235,215, 87, +186,118,237, 90,245,221,207,222, 81, 50,220,201,227, 77,208,130,145, 39, 27,222,185,134,126, 52, 97,245, 57,187, 60, 54,224, 98, + 0, 30, 30,184, 85, 0, 30, 68,139,159,193,164, 73,147,234,245,125, 30,143, 7, 62,223,250,233, 25,202, 67,255, 62,102,248,136, +196, 86, 5, 64, 40,196,224,112,192,199, 7, 16,242,125,208,178,165, 24,124,190, 14,102,179, 5, 22,139,231,110,123,189,230, 6, +196, 29,122,224, 82,242, 79,104, 37,224,225,112,254, 21,143, 7,148,121,243,230,169,215,174, 93, 43,173,207, 50, 64,102, 89,223, +235,175,191,110,191,198, 88,250,101,101,101,208,235,245,152, 62,125, 58, 0,224,235,175,191, 6, 0, 85, 99,180,109, 90, 90,154, +218,102,237,171, 0, 96,208,160, 65,245, 10,224,234,208,169, 59, 50,143,238, 65,235,150,126,240,243,179,118,251,234,106, 51,202, +202, 13,208,104, 43,209,177, 75, 47,252,184, 97,163,219, 54,249,253,247,189,228,197,231, 35,232,209,140,179,120,114, 72, 95,116, +234,212, 9, 70, 67, 21,250,247,123, 28,254, 1, 1,184,146,151,143,194,107, 37, 72, 77, 59, 15,109,121, 0,118,175,223,248,208, +250, 76,103,198,202,109,237, 79, 48, 83, 46,183, 47, 11,183, 56,145, 62,143, 71, 0,106,167, 12, 58, 83, 46, 71, 95, 23, 22, 44, + 33,160,112, 80,203, 99, 99, 99,225,236, 5,152, 59,119, 46, 8, 33,136,141,149,171,108,124,142,153,177,114,244,237,123,183,188, +216,216, 88,187, 59,222, 29,201,177, 37,127,103,140, 31, 63, 30, 35, 70,140,144,122,171, 4, 59,206,213,135,135,135, 75, 83, 83, + 83,213,181,221,103, 19,164,104, 91, 85, 64, 25,229, 43, 50, 50, 82, 42,151,199,170,157,149, 14, 7,249,240, 68, 94,226,252, 38, +214, 83,113,155, 59,158,142,249,249,118,133, 96,207,169,186,199, 62, 87,121, 0,184, 24,128,135, 84, 1, 24, 60,100,208, 61,153, +243,105, 40,203,223,177, 35,121, 3,141,150,160, 93, 27, 30, 8,225,129,240,120,216,187,223, 58,191,239,227, 35,134,143,200, 7, +227,158, 38, 16,251,136,224, 43, 38,208, 20,243,145,113,188, 41,204, 22, 51, 58,118,240,108, 94, 87, 38,147,209,107, 5,151,160, +205,220,133,110, 29,133, 56, 83,232,253,188,240,204,153, 51,213,168,103, 80,158, 76, 38,147,126,249,229,151, 42,198,205, 95, 92, + 92, 60, 49, 60, 60,188, 98,223,190,125, 59,159,123,238,185, 81,197,197,197,100,234,212,169,123,108,249, 2, 26,173,115,166,167, +167,171,195,195,195,165,204,113,125,100,253,184, 97, 35,153,250,202,100,154,125,225, 28,174,229, 93, 1,143, 71, 96, 54, 83,136, +125,131, 16,218,179, 55,118,255,145,204,186, 78,175,221,178, 72, 53,197,215, 84, 85, 85, 38,244,233, 29,130,224,246, 45,145,127, +245, 38,180,167,115,145,149,157,143,253, 7,254,194,149, 66,138, 99,153,103,188,106,167, 7, 37,249,143,101,115,160,215,207,245, +255,132,165,188,220,255, 97,205,154, 53,118, 5, 96,205,154, 53, 64,222,250,187,158,117, 37,143, 45, 40,165,164, 62,253, 56, 54, + 54,182, 94,125,207,129,228,213,222,220,119,229, 85,112,252,174, 43,121, 30,181,243,149, 45, 72, 90,243,178,117,108, 24,254, 72, + 13,242, 7, 0,217,152, 39,172, 7,218,147,110, 21, 0, 46, 15,192,131,131,117, 43, 23,222, 53, 13,224,145, 2,240,128, 7,124, +212,187,112,153, 39,124, 32, 22,137, 48,110, 12, 1,143, 16, 12, 26,104,194,233, 51,190,224, 17,235,156,127, 73, 9, 15,237,219, +242,193, 35, 34,156, 58, 45,130,216, 7, 48, 24, 13,184,146,239,235, 17,249,231,102,255,137,240, 17,207, 64,208, 50, 28,185,217, + 25, 16,220, 72, 66, 64,179, 32, 90, 90,166,105,148, 10, 86, 42,149,106,153, 76, 38, 29, 56,112,160, 42, 46, 46, 14,189,123,247, + 46,210,106,181, 24, 56,112,160, 84,171,213, 98,206,156, 57, 42, 27,249,171, 27,187,145,235, 75,252,206, 74, 0, 0, 68, 14, 29, + 36,105,215,182,157,202,223,223, 31, 63,110,216, 72,206,156,205,245,108, 64, 79,205, 80, 3, 32,102,180,164,231,178,210,209,174, + 77, 19,136,197, 66, 84, 84, 24, 80,120,189, 12, 68,208, 17,199, 50, 83,185,104, 41, 54, 56,241, 6,208,245,255, 80, 99,121,225, +241, 5,141, 90,164,216,216, 32,135,180,181, 13, 67,104,238, 72,217, 19,210,174,111, 62, 3, 87,227,188, 44,210,199,250, 91, 43, +175, 91, 63, 28, 30, 90,244,235,215,207, 30,240,183,110,229,194,187,238,185, 85, 0, 26, 58, 31,255,253,206,239,239,153, 22, 65, +160,213, 18,248,181, 37,104, 17, 68, 48,112,128, 17, 98, 17, 31, 62, 34, 35, 90, 4,137,109,131, 0, 65,196, 64, 51, 50, 78, 8, +173,222, 2,150,138,145, 76, 38,163,189,186, 55,195, 27,115, 63, 66,165,168, 3,126, 77, 46, 68,215,208, 65, 0,128, 38,199,118, + 32, 59, 31,180,162,188,241,148, 0, 0, 36, 47, 47, 79,178,114,229, 74,149,163,119, 0, 0,105, 76,203,255, 94,195,150,236,167, +222,245,126,240,208, 9, 50,245,149,201,244, 86,241, 45, 84,222,208, 67, 44,110,129, 14, 93, 30,103, 53,149,240,176,195,154, 14, +187,129,126,102,222,122,216, 87, 4,228,109,104,244,223,230, 46,184,239,239,134, 81,207, 76,108, 80,203,157,139, 1,120,176,148, +128,218,200,223,173, 7,224,159, 0, 10,107, 84, 63,225, 81, 80, 80, 4, 53,167, 72, 57, 44,128, 88, 36,132,143, 72,128,103,199, + 80, 80,106, 65, 96, 11, 19, 76,102, 2,139,197,108, 27,252,220,227,241,206, 21, 24,251,162, 12, 21,130,110,104,221,196, 31,147, + 95, 8,194,198,173,167,237, 74,128,209,252, 43, 78, 95,104,220,117,226,140, 34,224,112,206,189, 61, 94,120, 21,254,142, 32, 19, +180,132, 38, 6,222,205, 12,202, 32,175,228,173,211,174, 64, 76,224,194,187,111, 28, 95,208,232, 86,255, 63, 25,251,254, 50, 54, +100, 31, 38, 86, 5,145, 58, 40,139,220,180, 64, 99, 41, 1,110, 27,203,219,125,132, 57,112,224,192,129, 3, 7, 14, 15, 47,184, + 68,207, 28, 56,112,224,192,129, 3,167, 0,112,224,192,129, 3, 7, 14, 28, 56, 5,128, 3, 7, 14, 28, 56,112,224,192, 41, 0, + 28, 56,112,224,192,129, 3,135,191, 7,106,172, 2, 56,121,242,164,215,209,160,174,130, 9, 27, 90,222,148,233,177,110,191,167, +211,220,176, 31,251, 7,181,181, 31,255,252,125,194, 93,207,182,146,190,234, 86,222,190,213,119, 50,230,141,156,255,165,253,248, +150,234, 91,120, 83,190,218,224,109,249,106,131,171,242, 61, 63, 85,238,246,123,153,170,157,232,220,185, 51, 46, 95,190,140,129, +210,177,246,235,191,253,168,184,231,245,231,174,191,196, 7, 7, 75,222, 40, 44,116,204, 76, 72,238,103,255,115,150, 55,118,236, + 88,201,174, 93,187,106,100, 74, 28, 51,102,140,116,231,206,157,234,198,120, 63, 30,100,121,245,145,245,119,174,191,168,168,168, +151,250,244,233,179,241,244,233,211, 47,166,164,164,252,218, 0,229,163, 15,202,251,193,201,107, 92,121, 30, 43, 0,206,248,234, +171,175, 36, 85, 85, 85, 32,124, 33, 8, 33, 48,155,140, 16, 9, 5,152, 51,103,142,186,190,154,199, 87, 95,125, 37, 1,128,217, +179,103,215, 75,150, 78,115, 3,254, 65,109,237,196,223,182, 99,103, 0,192,141,171,151,189,146,183,111,245,235, 24, 57,255, 75, + 59,113,125,181, 45, 3, 0, 48,251,217, 65,127, 75, 13, 48, 83,181, 19, 3,165, 99,145,169,218,105, 37,181,241, 83, 0, 0,151, + 47, 55,126,253,133, 2,146,108, 64, 21, 10, 72,179, 1,213, 27,133,133,200,136,123, 27, 0, 48,104,229,167,141, 90,111, 47,189, +244, 18,221,180,105, 19,170,170,170,106, 92, 23,139,197,170,151, 94,122, 9,191,252,242,203,131,186, 60,112,104,247, 46,193, 27, +168,217,172,207,206,191,177, 8,192, 14,206, 14,170, 29,159,127,254,249,240, 63,255,252,179,217,181,107,215,218, 6, 5, 5, 53, + 15, 11, 11, 43,124,243,205, 55,127,244, 86, 94, 84, 84,212,136,201,147, 39,167,108,220,184,241, 85, 0, 1,147,254, 47,118, 58, + 0,203,233,211,167, 95, 86, 40, 20,191,201,229,114,139,135, 34,153,228,202,180, 1,198, 43,103, 18,105,168, 62, 76,239,129, 76, + 14, 13,237, 1,112,196,127,254, 27, 47, 9,232,216, 71, 21,213,167, 7,252,124,132,160,148,194,108,166, 56,147,115, 5,241,171, + 63,147,250,250, 8, 49,107,214, 44,175,200,251,231, 13,139, 36,189,186, 29, 84,157,201, 14,145,122, 91,112,134,240,125, 3, 90, + 64,167,185, 97, 39,254,186, 60, 2,108, 44,213, 65, 83, 22, 98,223,234,215,237, 47, 82,109,207,213,181,198,210,249,127,138, 68, + 34,235, 91, 64, 41, 44, 22,235,251,109, 54,155,237,229,231,241,133,172,173,104, 0,104,215,218,154,170,211, 80, 86,130,106,147, + 9, 0, 80, 97,178,202,235, 50,106, 6, 30,237,213,159, 21,241, 3, 64,223,193, 35,144,169,218,105, 39,254,218,158,187,159,245, +199, 12, 26,217, 0,158,242,247,199, 30,157, 78,197, 16, 63, 0,100,237,221, 87,215,160, 85, 39, 62,253,105,153,228,248,237, 99, + 40,204, 63,133,110,157, 34,240,191,185,191,120,220,135,199,142, 29,251,220,230,205,155, 25,242, 55, 1,168, 2,224, 7,192, 82, + 85, 85, 37,240,245,245,197,216,177, 99, 37,174, 60, 1,141,140, 54, 79,244,235,243,199,158, 95, 18,154,232, 10,207, 99,168,108, +230,198, 43, 90,227,203, 0,126,123,208, 6, 38,153, 76, 70,189,221,128,199,137, 24,189,194,151, 95,126, 41,201,200,200, 80,109, +216,112, 39, 49,209,237,219,183,145,157,157,141,103,158,121,230, 7,137, 68, 34,125,243,205, 55, 89,181,175, 66,161,224,109,220, +184,241, 67, 0,255,159,189, 47,143,111,162,234,222,127, 38, 73,211,116,223,217,247,150,202, 78,161, 8,200,154, 0,165, 66, 1, +101, 41, 90,208, 87, 68,104, 64, 69, 1, 81,180,175,223,159,190, 46, 8,138, 20,101, 13,139,226,171,101, 43,136, 82, 40, 20, 10, + 41,101,211, 74, 41,101,183,180,165,116,163,116, 79,151,236,153,249,253,145, 76, 76, 67,210, 76,210,176,190,243,124, 62,243,105, +231,206,228,100,114,231,222,251,156,115,238,185,231, 62, 55, 34,242, 69,183,157, 59,119,182,126,249,245, 5, 94, 0,116, 0,218, + 26,110,123, 6, 0,103,244,232,209,163,128,251,183, 58,183, 70,170,131,103,127,136,140,132,149,148,181,254,102, 71,255,160,210, +207,103,128,203,229, 65,167,211, 66, 86,223,128, 89,211, 95,160,234,235,235, 91, 74,216,148, 51,223, 11, 11,219,176,180,237,175, +137,167,192,182, 2,176,102,237, 58,161,112,226, 12,105,199, 86, 62,112, 23,240, 64,146, 36,116, 36,192,227, 18,240,247,233,129, +222,221, 59, 73, 83, 83, 14,139, 54,110,220, 40,180, 87, 9, 88,183,110,157,176,103,240, 89,105,255, 30,183,193,229,232,164,235, +214,175, 23, 45,122,251,109,187,100, 52, 86,151,193,205, 39, 0, 62,222, 94, 0, 96,252,107,233,190, 54, 29,187,216,244, 6, 28, +143,127, 27,131,103,127,136,215, 94,154, 6, 0,198,191,150,238,219,112, 48,195, 46,237,154,203,229,162, 67,135, 14,224,114,185, + 80,171,213,104,108,108,132, 78,167, 67, 77, 77,141, 67, 47,215,147,199,197, 15,107, 15,192,213, 7,184, 87, 0,252,213, 80,130, +138,178, 92,252, 28,255,145, 93, 86,127,255, 97, 99,209,161,157,126,138,164,131, 5,242,239,210,165,139,113, 58, 0, 0,138,139, +139,157, 82,127, 12,147,171, 82,145, 30, 30,248,252,237,183, 0, 0,159,155, 16,255, 47, 57, 57, 77, 7, 19, 59,178,181,206,250, +104,164,176,102,112,170,244,195, 78,175, 64, 69,142,131, 43, 73, 33,226, 5, 29,126,252,102,175,232,248, 6, 48, 29,204,121, 11, + 22, 44,248, 77,161, 80, 96,199,142, 29,202, 57,115,230, 8, 0,120, 2, 32,119,236,216,161,158, 51,103, 14, 79,161, 80, 64, 32, + 16, 72, 91, 58,208, 69, 70, 70, 10,143, 29, 59, 38, 53,108,216,210, 98,120,242, 57,255,111,221,231, 31,184,249, 94,223, 5,183, +191, 79,226,211, 49,126, 94,239, 36, 85,124, 86,175,166, 30, 43, 5,128,222,130,183,166, 38,130,242,247, 79,181,251,183, 15, 25, + 50, 68,248,231,159,127, 58, 76, 54,107,214,172, 17,238,219,183, 79, 90, 95, 95,111,241,250,221,187,119,177,111,223, 62,233,235, +175,191, 46,250,241,199, 31,211,108,180, 23, 98,231,206,157, 63,143,136,124,113,102, 78,214, 57, 94,135,118,109,180, 47,191,190, +160,201,184,123,242,240,175,232,219,183,111,143,157, 59,119, 78,232,219,183,239, 65, 0, 56,115,230, 76,179,253,131, 73,127,211, +247, 15, 2,176,145,136,103,192,128, 1,212,145,148,227,200,186,122,221, 88,166, 84,170,240,245,186, 45, 13, 11,231,196,176,132, +253, 20,227,190, 32,192,213,171, 87, 11, 71,140,159, 42,237,209, 41, 0,174, 46, 28,144, 36,137,178,178, 50, 92,201,206,130, 90, + 75,130, 36, 41, 4,248,184, 99,252,132, 73, 82,133, 74,107,247, 23,186,186,148, 35,184, 83, 25,192, 37,208,171,123, 17, 92,121, +247,236,182,252, 77,201,223, 28,178,186,122,148, 21, 21,192,205, 39,192,170, 87,160, 57,242, 50,199, 79,123,126,197, 91, 83, 6, + 99,240,236, 15,209,140,150,125, 31,248,124, 62,184, 92, 46,188,189,189,145,159,159,143,154,154, 26,189, 34,229, 32,249,183,109, +213, 26,158, 60, 46,166, 46,250, 2, 19,102, 13,195,161,171, 37, 40, 83,160,197,228,111,142,226,210, 50, 92,187,112, 22, 65,126, +222,122,242,231,113,157, 82,127,207, 79,127, 13, 0,224,199,115,177,139,252, 1,224,255,214,111,192,255,173,223, 96, 36,255,148, +198, 70,188, 63,126,146,254, 98, 16,159,209,239, 30, 22,215, 85, 56,255,189,231,164,175,119,126, 19, 46, 28, 79,120,192, 29, 28, +112,209,190,245,112,188,253,249, 82,233,242,164, 30,140,212,136,180,180, 52, 13, 0,252,244,211, 79,114, 0, 2,122, 27,229, 29, + 59,118,144, 0,220, 77,183, 85,142,137,137,113,104, 94, 46, 62, 62, 94,104, 79, 57, 3,140, 24, 52,160,191, 60,241,215, 3,226, + 1,125, 66,185,141,215, 79,160,160,188, 30,119,107,229, 32, 41,202,161, 64, 96,138,162,168,234,234,113,212,168, 81,163,156,154, + 72,204,132,252,225,239,159,234,144,140,140,140, 12, 41, 0,130, 32, 8, 12, 25, 50,196,238, 58, 75, 77, 77,189,143,252, 47, 92, +184,128, 89,179,102, 25,207, 53, 26, 13,110,222,188, 41,141,143,143,111,214,139,185,115,231,206,183, 71, 68,190, 56,233,203,184, + 37,188,196,196, 68,108, 91,183,154,103,240, 24, 25,201, 63, 49, 49, 17,235,215,175, 71,223,190,125, 15,218,234,111,230,228,111, +173,191, 77, 24,110,240, 2,122,121,216,148,247,237,186, 77, 70,242, 47,175,172, 66,121,101, 21,100,245, 13,112,113,225,121,110, +218,177, 75, 9,103,109,136,192,226,161, 34, 44, 44,236,190,163, 89, 5, 96,227,198,141, 84, 64,151,126,232,210,198, 23, 74,141, + 14, 4, 1,164,164, 28,197,127,127,218,129,203,217,217,120,127,233, 98,112,185, 28,144, 58, 18,222,238,174,232,210,111,132,116, +237,218,181,140, 59,216,250,245,235,133,189,187,223,145,122,123,202,241,195, 79,229,224, 16, 20, 6,247,253, 91,186,126,253,122, +187, 58,169, 37,242,167,137, 95, 33,171,106,162, 32,200,234,234,109,202,179,212,153,232,142,148,145,176,178, 9,193,253,180,231, + 87, 70,207, 24, 28, 28,140,128,128, 0,212,213,213,129,207,231,131,195,225, 64,161, 80,160,166,166, 6, 92,174,190,147,219,179, +217,210,254,223, 14, 96,241,218, 99, 56,176,238, 99,180,109,213, 26,238, 30,254, 40,210,149,224,231,248,143,224,105, 24, 52,184, + 12,229, 89, 34,127,154,248,101,165,121,232,209,161, 21,234,229, 74,184,186,187, 2, 58,157,205,120, 0, 91,245,247,209,214, 67, +184,118,241, 60,250,116,235, 5,153,206,182,210, 72,147,255,223,199,142,227,255,214,111, 48,150,167, 52, 54, 34,165,177, 17,249, +226,255,224,216,245,203,232, 61,184, 27, 80,101,123,107,230,209,203,186, 9, 23,190, 51, 86, 26,228,209, 19, 10,170, 30, 80,149, +131,175,170,134, 74, 87, 15, 37,169, 0,201,247, 68,251,145,131, 16,177,176, 51,101,203,154,163,231,253,197, 98,177,187, 88, 44, + 6,244, 83, 0, 16,139,197, 48,156, 27, 44, 40, 37,118,239,222,109,119,167, 93,178,100,137,112,233,210,165,210, 94,189,122, 81, + 4, 65, 72, 1,224,149, 87, 94,161, 58,119,238, 76,125,252,241,199, 14,109,205,236,229,202,217,177,225,195,215,221, 34,219,171, +184,231,110,150,225, 80, 1, 7, 31, 30,185,167,250, 79, 90,131,172, 81,131,215, 28,145, 89, 83, 19,241, 32, 45,127,248,251,167, + 98,246,236,217,118, 79, 17,154, 18, 62, 69, 81, 4,189,157, 52, 83,188,246,218,107,194,123,247,152, 25, 37,106,181, 26, 87,174, + 92, 57,217, 92,123, 1, 32,236,208,174, 13, 63, 58, 58, 26, 0,144,153,153,137,147,135,127, 21, 20,151,150,145, 52,249, 27,126, +187,177,191, 93,185,114, 37,190, 37,253,237,235, 57,147,112, 53,175, 8,109,186,181, 5, 26,229,140,127,123,121,101, 21, 52, 26, +173, 65,193,209, 66,163,209,162,232, 78,129,160,133,175,149,176,113,206,226, 17,162,137, 43, 74,165, 82, 97, 64,143, 30, 82,119, + 55, 23,144, 36, 5, 29, 9,156, 61,125, 6,255,249,252, 11,144, 20,112, 43, 55, 23,151,179, 47,161, 79,159,254,224,114, 9, 60, +211,173, 3,242, 47, 50,247, 2,240,121,229, 8,237, 82, 10,240, 8, 20,221,213, 0, 60, 2,253,122,220, 65,198,149,114,135,127, +128,169,123,223,146,103, 64, 33,171,106,178, 26,192, 22, 76,221,251,150, 52,237,140,132,149,136, 88,178,222, 98, 20,187, 41,180, + 90, 45,220,221,221,193,225,112,224,231,231, 7,185, 92,142,198, 70,253, 54,192, 65, 65, 65,168,170,170,178, 43, 71,182,178, 6, + 24,236,230,134,247,215,157, 70, 68,127,224, 78, 22,240,151,225,218,251,235, 78,227,251, 37, 34,232, 72,157,221,245,119,237,194, + 89,227,255, 99,195,123,128,231,197, 65, 74,218,117, 12,232,209, 17,222,158,174,248,105, 95, 42, 6,137,162, 80,108, 97, 21,128, +173,250, 59,120,157, 2,238, 2, 83,198, 18,216,122, 40, 31, 1,126, 93, 49,109, 56,193,168,254,104,119,127, 74,227, 63, 91, 39, + 83,159,198, 3,237,101, 32,230,127, 2,234, 63,159, 3, 28, 5,136,140, 21,244,160, 98,181, 50,131,167,123, 74, 59,251,134,163, + 78,215, 0, 85, 77, 46,126, 46,220,137, 51, 83,106,208,107,158, 8,227, 23,121,194,205,239, 25, 8,120,126,224, 77,145, 97,158, +118, 30,181,109,235, 54,139,131,148, 88, 44,166,104,165,141,195,225,128,162, 40,181, 65,137, 86,114, 56, 28, 57, 69, 81,254, 0, + 72,180, 96,121,109,124,124,124, 90,100,100,164,168,170,170, 74,154,146,146,162, 87,124, 82, 82,208,179,103, 79,244,232,209, 67, + 68,151,217,131,122, 21,249,206,220,255,251, 62,233,155,168, 54, 28, 74, 41,195,252,132, 28,141, 86,163, 89,175,210, 97, 5, 0, +135, 54,163,120,241, 69,245, 3, 39,255,132,132,132, 52, 71,172,127,211, 41, 19,130, 32, 48,120,240, 96, 33,211, 93, 37,117, 58, +157, 93, 10,195,237,219,183, 33,145, 72,136, 77,155, 54, 89,186, 44, 0,208, 11, 0,111, 76,212,180,218,252,252,124,223,204,204, + 76, 36, 38, 38, 34, 60, 63,159,147,153,153, 9, 0, 8, 15, 15,199,243,163, 7,193,219,211, 21,235,127, 60, 80, 62,107,214,172, +184, 77,155, 54, 45,177,183,191,221,253,109, 37,188,122, 11,224,217,125, 49,246,174,156,135,254,125,218,224,153, 73, 95,216,236, + 31,178,186,122, 8, 4,174, 0, 0, 23, 23, 30,228,114,165,179,121,134, 37,253, 71, 0, 38,155, 1, 53, 25,168, 72,146,132,187, + 43, 31,106, 45, 5,146, 2, 56, 4,240,201,103, 95, 64, 71, 2, 13, 13, 13, 40, 43,187,139,214,173,219,128,162, 72,104,181, 58, + 8, 92,120,224,186, 48,115,193,110,216,176, 65,216,189, 75,177, 52,208,175, 78,223, 28, 12, 7, 65, 80, 24,216,251,150,148, 94, + 21, 96, 15,104,235,158,118,247,155,147, 63, 19,235,223, 92,139,166,137,127,195,193,140,251,200,159,169,245, 15,232, 3,134, 92, + 93, 93,225,227,227, 99,116, 25,210,129,127, 62, 62, 62,104,211,166, 13,180, 90,230,202,211,143,169,167,224,211, 5, 16,134,234, +207,115,180,122,247, 63,160, 47,251,248, 11, 41,106,213,246, 77,201, 20,151,234,131, 21, 59,181,242,135,151,143, 7,120,222, 92, + 40, 43, 21, 0,135,131,182,157, 59,224,108,118,129, 67,245,247,218,123, 95, 98,212,208, 49,224,149, 1, 13,173, 1,119, 14, 7, + 67,187,116,133,120, 74,107, 70,114,204,231,250,127,121,105, 30,166,190, 56, 18, 8, 81, 2,151,121,128, 39, 15,152, 28,142, 14, +155,183, 50,243,198,180,247,135, 90, 93, 13, 66, 85,133,159, 11,119,226,252, 28, 31,140,154, 58, 7, 35, 90, 61, 47,186,122, 76, + 11, 45,217, 8, 23,117, 35,180, 61, 72, 84,220, 99, 22, 52,106, 80,222,148,115,230,204,225, 0,168,161, 12, 59, 68, 25,206, 91, +132,148,148,148,180,158, 61,123,138,220,221,221, 17, 24, 24, 8,119,119,119,164,167,167, 19, 41, 41, 41,105, 14,136,107, 51,105, +210,164,173, 27,182,252,192,249, 36,173,129,220,119, 46, 23, 42,181,166, 81,169,195, 50,123,200,223,220,229,159,158,158, 78,208, +199,227, 66,254,150,220,253,246,122, 1, 26, 26, 26,140,255, 95,184,112,193,120, 0,192,210,165, 75,155,156,155,220,239,106, 69, + 92, 59, 0, 93, 12, 74,161,251,243,211, 95, 81,154,122, 2,104,203,255,185,225,195, 77,251,219, 33,177, 88,172,180,167,191,197, + 78, 30,133,126,225, 61,224,213,223, 11, 37, 39, 10, 1,129, 43,166, 47,250, 23, 6,191,250, 61,163,223,172,213,234, 80,114,247, +158,150,182,252,105, 20,221, 41,104,233,171,165,172, 28, 44, 30, 3,133, 0,150, 44, 21,202, 48,184,145, 20,160, 35,245, 74, 0, + 65, 0,191,238,223,135,169,211,102, 32, 48,168,149,113, 0,164,236,120,151, 92, 78, 57,122,135, 20, 25,207,251,245,113, 55,234, +134, 3,123,229,131,203,177,223, 11, 96,238,238,183,116,221, 30,235,223,220,221,111,233,186,233, 90,246,230, 80, 87, 87,135,250, +250,122,168, 84, 42,144, 36,137,138,138, 10,163,251, 95, 46,151,163,161,161,193,174, 41,128, 3,235, 62, 70,218, 85, 64, 86, 0, +104, 20,192,247,203, 69, 70,247,255,197, 44,224,210,221,179,224,218, 89,127,178,210, 60,248,251,120, 32,192,223, 3,207,132,246, + 68,254,237, 10,228,148, 84,161, 83,128, 15, 84,247,202,145,123, 43,183, 73, 46, 0, 38,245, 55, 76,248, 2, 70,136, 98,112, 32, +105, 47,164,233,123,177,115,205,123,152,254,222, 10, 92,214, 0, 21, 85,229,140,234,207,116,174,255,245, 97, 67, 48,187, 87,103, +236, 61,112, 18,151, 47, 23, 96,205,149, 76,236,142,248, 23,176,253, 28, 74, 74, 42, 24, 89, 23, 29,148,174,208,169, 43,161, 86, +235, 35,171, 91,183,239,136, 30, 61,123,138,234,220,244,177, 24, 10, 82, 14,142,170, 17,110,141, 92,220,187,219,188, 2, 64,191, + 51,165, 82, 9,165, 82, 41, 0,160, 6,224,165, 84, 42,189,205,151, 4,182,192, 11, 32, 76, 79, 79,151,246,236,217, 19,175,188, +242,138,168,178,178, 18,211,166, 77,179,103,224, 28,193,231,243, 27, 60, 61, 61,181, 17, 17, 17,119,151, 47, 95,222, 46, 46, 46, + 46,255,175,172,203, 19,119, 95, 83,221,212,144,176,123, 63,214, 7,225,242,119, 38,249,155, 91,255,180,194, 66,191, 51,166,177, + 0, 46, 46,255,196,168,172, 89,179,198,120, 88, 58, 7,140, 43,124,172,189, 27,190,225,224, 0,224,201, 74,243, 44,186,211,233, +254,150,117, 49,235,246,172, 89,179, 98,237,233,111, 35,159,125, 6,227,134,135,226,203,207, 86,227,219,181,201,248,127,191,156, +196,130, 49,131, 80,246,123, 50,100, 53,117, 76,250, 7, 17, 61,229,121,104, 52,218, 44,141, 70,171, 53, 85, 0, 0, 96,197, 39, + 31,181,196,130,103, 45,255, 71, 8, 75,115,255,230, 74, 64, 19, 5,128,195,225, 64,214, 32, 7,151, 67, 64,171,213,129,164, 40, +104, 73,125, 16,105,246,165, 44,140, 25, 27,169,119,147, 81, 20,184, 28, 46,234,229,106,104,213, 42,219,214,255,198,141,194,174, +237,239, 74,131,252,101, 70, 45, 99,216, 96, 79, 67,140, 46, 1,130,160, 48,160,103,174,116,195,198,141,140,189, 0,180,117,223, + 92, 48,160, 67,214,107, 51,193, 53,246,192,207,207, 15, 21, 21, 21,112,117,117, 69,125,125, 61,130,130,130,140, 65,129, 74,165, + 18,181,181,181,118, 41, 0,177, 95,238,198,247,203, 69,240,233, 2,164, 93, 5,222, 89, 37,133, 39,143,139,105,239,126,133, 98, +178, 12, 9,107, 62, 0,151,195, 92, 30,109,253,135,135,135, 34,168, 91, 23,180, 10, 10, 4,159, 67, 64, 75, 80,168,104, 84,160, +166, 94,233, 80,253,125,187,242, 55,188,216,179, 43,188,189, 3,224, 30,212, 14,154,234, 26,100, 29,218,133,218,234, 66,135, 26, +241, 15, 43,223, 6,150,140, 3, 79,171, 70,151, 70,160,156, 91,135,239,239,254, 5,240,189, 25,203,184,152,244,135,168,146,163, + 64, 33, 95,142, 65, 33, 34,244,250,151, 39,242,253,210,164, 65, 65, 89,210,142, 67,243, 33,227,212, 67, 69, 41, 32,255,133,132, +192,211,139,137,229,111, 58,192,211,171, 0,248,206,234,184, 71,143, 30, 5, 0,204,158, 61, 91, 20, 31, 31,159, 54,117,234, 84, +163,197,200,132,252,131,130,130,142,108,221,186,213, 67, 34,145,112,151, 44, 89,130,197,139, 23, 83,231,206,157, 27, 10, 32, 69, +161, 69, 79, 0,127,218,251, 76, 98,177,159, 85,183,191,163, 1,129,206, 36,127,115,130, 55, 85, 88, 40,138, 34, 12,129,129,182, +251, 69,113,241, 57,250,255,157, 59,119, 26, 15,243, 50, 26,254,254,254, 16,139,197,214, 6,193, 98, 0,181, 0, 56,197,165,101, + 56,127,254,188,113,206, 63, 60, 60, 28,128,126,251,237, 61, 7,147, 81, 83,175,148, 3, 88, 33, 22,139,117,246,244,183,223, 15, +124,138,200,229,139, 48,113,226, 88, 4,186,114, 81, 79, 80, 72,201, 41,194,249,171, 37,118, 17,245,194, 57, 49,207,230,231,230, +242,138,238, 20,128, 62, 12,228, 15,214,106,127, 50,137,223,188,204, 18,154,196, 0,184,186,186,226,214,245,203,162, 46,237,252, +165,110, 46, 60,232,116, 36, 8,130, 0, 65, 0,177,226,183, 64, 81, 36,116,134,124, 0,114,165, 18, 55,114,242,193,231,219,140, +234,134, 86, 83,141, 1,189,110,155,142, 24,120,115,201,109,236,255,165,187,177,105, 13,234,147,135, 63,178,123,218,109,253, 91, + 34,126,133,172, 10, 0, 28,178,254, 45,117,180,140,132,149, 0,192,216,250, 7,244,235,252,219,180,105, 3,149, 74,133,123,247, +238, 65,167,211, 33, 48, 48, 16, 85, 85, 85, 8, 12, 12, 52,212, 43,115,194,174, 40,203,197,199, 95, 72, 33, 43, 0,190,121,111, + 36, 26,180, 58, 44, 93,149,136,239,150, 71,227,189, 53,135,192, 35, 8,216,193,255,144,149,230,161,109,160, 47, 92,224, 2, 29, + 8,220,189,125, 13,119,202,101, 8, 14,242,199,239, 23,207,225,198,117,216,109,253, 79,159,187, 20, 46,254, 0,135, 11,236, 72, +190,141,253, 27,223,199,220,149, 18, 44,157,220, 31,111,141,237,108, 87,253,165, 52, 54,226,219, 41, 51,129, 90, 1, 64,184, 0, +223,174,198,140,191, 78,227,216,216,133, 32,190, 90, 4,226,143, 15, 24, 91, 24,151,238, 6, 96,136, 66,134, 6, 55, 46,228, 2, + 1,130,167,187, 64, 69, 41, 32,227,184, 64,139, 80, 80, 58, 57, 52,149,119,113,118,157, 12,179,103, 5, 35, 77, 42,125,232,157, + 54, 54, 54,150, 2,128, 45, 91,182,208,174,126, 98,201, 18,253, 52,240, 47,191,252,194,244,205, 14,111,215,174,221,209,175,190, +250,202,227,214,173, 91,112,113,113,129,183,183, 55, 46, 95,190,172, 1, 80,209,146,231,107,110, 77,190, 35,222, 1,103,146,191, +185,245,175, 39,230,251,151, 15, 26,150, 7,166,217,120,174, 91,123,246,236, 25,198,116,122, 78, 32, 16,204,181,174, 52,137,235, + 71,143, 30,125, 27, 64,120, 78,214, 57,152,206,249,191, 57,119, 38,142,118,235,134,196,196, 68,100,102,102,226, 72,183,110,238, +179,102,205,250,241,212,169, 83,140,251,219, 75,227,134,192,135,244,131, 28, 46,216, 31,191, 8, 27, 15, 93,194,251,207,143,192, +156, 53, 59, 49, 99,197,207,246, 90,224,196,138, 79, 62,178,148, 8,136, 50, 81, 2, 88,139,254, 41, 67, 19, 15,192,155,111,190, + 73,212,222,205, 69, 94, 81, 21,120, 46, 92,104,117, 36, 52, 90, 29, 46, 94,204,196,127,255,251, 35,212, 58, 10, 26, 29, 74,253, +203,119, 0, 0, 32, 0, 73, 68, 65, 84, 9, 62,143,131,242,154, 6,148,220, 56, 47, 90,188,120,113,179, 29,106,227,198,141,194, +158,193,119,254,177,254, 13,237,106,255, 47,161,250,246,196,161, 0, 14, 5, 14,135,196,208,254, 55,164, 27, 25,120, 1, 44, 89, +255,166,171, 0, 60,252,219,216, 69,254,150,172,127,211,168,218,136, 37,235,237, 34, 47,253,160, 88,131,134,134, 6,184,184,184, + 24,173,127,146, 36,141,127,237, 85, 0,126,142,255, 8, 23, 75, 78,193,179,141, 62,232,207,139,199, 69, 69, 89, 46,188, 93, 93, + 80, 91, 93, 12, 46,135, 0,143,195,108,250,153,182,254, 59,250,123,225,122,254,109,104,213,106,184,242,248,104,104, 80,226,119, +233, 57, 12, 18, 69,217, 69,254,116,253,189,240,246,231, 72,248,254, 59,200, 73,160, 99,112, 7, 92,189,246, 7,150, 78,238,239, + 80,253, 1,192,210,224, 65, 72,186,117, 18,144,105, 1, 65, 32,142,103, 92, 7,241,213, 34,122, 96, 98, 92,121,167, 86,231,167, +157, 61,158, 1,168,235,209, 64,212,163,134,211, 0, 25, 79, 3,141,174, 14,174, 74, 57, 4,165,183,177, 59,238, 22,186,132,133, +194, 90, 0,160, 57,220,220,220, 76, 73, 0, 2,129,192,226, 53,166,216,186,117, 43,182,110,221,218,162,206,236,229,229,245, 78, +110,110,174,135,183,183, 55,220,220,220,224,239,239,143,138,138, 10, 16, 4, 33,119,230,160, 65, 91,252,209,209,209, 20,160, 15, + 8,180, 39, 40,208,217,228, 63,100,200, 16,161,173,128, 90,166,177, 0, 30, 30, 30,177, 60, 30, 47,207,188,124,205,154, 53, 77, + 44,127, 0,232,220,185, 51,198,141, 27,183,195,150,253, 83, 92, 90,214, 36,218,255,227,255, 91, 2, 87, 30, 31,173, 91,183, 6, + 29, 19, 96,184,238, 97, 79,127,155, 39,236,135,197,171,191, 67,253,189,114, 4,121,183,194,181,235,133,152,179,102,167,221,253, +195,140,240, 9,179,207,155,202, 97, 61, 1, 79, 0, 46, 93,186,212,108, 50, 32,171, 30, 0, 0, 88,182,108, 89,218, 55,171, 9, + 17, 69, 77,145,118,105, 23, 0, 47,119, 87,244,234, 19,134, 94,189,251,131,199, 1, 26, 20, 58, 20,222,173, 70, 70,218, 97,145, +167,135,187,205, 47,104,148,203, 17,218,249, 46,148, 42,129, 33,107,139,190, 25,185, 9,148,160, 40,160,186,214, 21, 32, 0, 47, + 15, 45,250,134, 22,224,244, 5,219, 89,236, 76,173,127, 83,139,223,205, 39, 0, 46,148, 6,208,254, 51,222,233,120,182,159,209, +212,250, 55,181,248,233,178,220,107, 89,198,123,153,100,217, 51, 85, 2, 0,160, 77, 27,189, 50, 82, 93, 93, 13,111,111,111,163, +251,223, 30, 5,128, 86, 2,128,175,176, 48,122, 52,240,253,105,108,252,119, 20,102,188,247, 29,118,174,124, 11, 60,130, 0,223, +149,217,138, 29,218,250,191, 94, 88,142,144,142,129,216,190,109, 55,186,116,233, 2,159,118,193,232,223, 46, 24, 26,213, 63,238, +127, 23, 6, 50,105,235,255,139,185, 99,241,206, 39, 59,208,177, 27,209,162,250,163,173,255,241, 7,126,192,177,217, 49, 32, 58, + 12, 5,160,207, 10, 8, 0,183, 27, 27,141, 74, 98, 14,152, 37,240,217, 48, 39,143, 24,189,140, 18, 6, 79,171,151,118,233,222, + 7,117,110,192,109,220, 65,125, 65, 5, 42, 86,232,208, 80,211, 1, 55,207,230, 48,126, 33, 36, 73, 18,110,110,110,148, 66,161, +128,137,229, 73,185,185,185,129, 36, 73,226, 81, 12,150,245,245,245,223,188,245,214, 91, 83,182,110,221, 42,240,241,241,129, 84, + 42,197,218,181,107,235,212,106,245,243,206,252, 30,218,226,167,151,203,217, 27, 8,152,152,152, 72, 24,146,252,180,152,252, 1, +192,132,216,109,214,185,173, 12,131, 98,177, 88, 45,145, 72,134,238,221,187,247,114, 99, 99, 99, 91,141, 70,191,204,212,156,252, +123,245,234,133,161, 67,135, 78, 18,139,197,182,190,147, 39, 43,205,195,151,159,126,140, 95,147,142, 32,114,196, 64,156, 72,253, + 67,111,192,180, 11,134, 79,187, 96,132,231,231,227,249,233,175, 84, 22, 86,201,199, 3,216,199,212,250, 95,188, 37, 9,113,111, +140, 71,187, 54, 66,163,114, 97, 94, 15, 45,204,166,200,122, 2,158, 34,165,128,145, 2, 0, 0,239, 47,123, 47,237,155,111, 72, +209,237, 14,207,160, 91,247,158, 82,111, 15, 55,144, 20,160, 80,169,145,159,159,143,138,252, 75, 34, 47, 79, 15, 44, 92,184,208, +102,199,117, 19, 8,176,247,232,104, 17, 29, 1,223,172, 59,130,195,129,135, 7,115,235,137, 94, 2,232,225,223, 6,164, 78,163, + 39,127, 3, 52,132,139,205, 20,187,230,160,151,212, 68, 44, 89,223,132,180, 28, 33,127, 83, 37,192, 52,241, 79,117,117,181,237, + 23, 96, 67, 9,248,217,100,149,240,214, 21,111,254,115,162,105,128, 39, 67, 57, 29,253,189,176,247,194, 37, 92,189,249, 55, 6, +137,162,154,144,190, 61,228, 79,227,133,183, 63,199,254,129, 30,120,123,106, 15,167,212,223,210,224, 65,120,239,224, 94, 16, 95, +126,130, 35,173,135, 96,109,195,213, 38,215,167,249,248, 98,165,172,214, 46,226, 56,181, 58, 63,205,143, 23,129,226,154, 60, 84, + 84,221,197,189, 28, 79,112,117,222, 24,222,111, 36,118,159,221,253, 72, 7, 53, 39,101,251,187,240,227,143, 63, 70, 16, 4,113, +252,187,239,190, 19,188,248,226,139,117,114,185,124, 60, 28,152,243,111, 14,206, 88, 2, 40, 22,251, 57,133,252, 45, 88,169,182, +148, 15, 6,207, 38,174,148, 72, 36,193,245,245,245, 95,102,102,102, 46, 41, 41, 41, 65, 99, 99, 35,248,124, 62,218,182,109,139, +160,160,160, 23, 37, 18,201,239, 63,255,204,104, 75,128, 27, 0,194, 59,250,123,225,185,231,158,195,165, 91, 37, 8,236,218,187, + 73,127,123,126,250, 43,114, 0,235,190,140, 91,178,143,233,239,152, 39,236,135,136,212, 63, 49,251,147,255, 98,212,168, 81,104, +221,186,181, 69, 69,203,137,175,157,112,128,252,169,102,202, 89, 37,226, 17,144, 62,163, 84,192, 0,240,254,251,239,167,109,216, +176, 65,120, 49, 45, 71, 4,232, 35,105, 41,138,130,171,171, 43, 62,120,127, 25,227, 78,251,182,157,105,126,153,130,118,245,115, +181,114, 64, 43, 55, 70,192,211,196,111,239, 90, 44,218,213,159,123, 45, 11,185,215,178, 16, 20, 20,132,138,138, 10,135,136,223, + 39,168, 29,212, 12,130, 35,153, 98,246,231, 63,227,220,105,231, 85, 99, 65, 65,129,113,183, 63,141, 74,121, 31,249,219, 67,252, + 52,254, 53,208,195,105,245, 7, 0, 68,252, 7, 70,226,167,201,255,118, 99,163,104,154,143, 47, 82,128,180,149,178, 90,135,126, +251,111, 43,143,155, 12, 60, 10, 0,192,238,107,204, 19,246, 80, 20, 69,184,186,186, 26,189, 0,244,255, 0,224,234,234, 74, 88, +250,255, 33,227,204, 15, 63,252, 48,106,223,190,125, 75,235,234,234,226, 1,100, 56,251, 11,156,177,244,207,201,228,228,116,136, +197, 98, 5,128,165,134,163, 69,239,227,202,149, 43,195, 1,116, 13,236,218, 91,174, 81, 41,221, 13,253,173, 14,128, 12,192,141, + 78, 1,238, 47,137,197, 98,187, 26,116,196,199, 91, 31, 22,241, 59,164,104, 57,120, 63, 11, 39, 32, 44, 44,140, 17,249,219, 52, + 64, 91,186, 83,223,131, 0, 61,183, 79, 19, 63, 90, 72,252,244,220,180,172,188, 24,178,242, 98, 4, 5, 5,181,200,226, 7, 0, +173,142,180,219,251,208, 28,202,171,101, 14, 63,139, 57,232,185,125,103, 17,255, 3,168, 63, 2, 0, 34, 61, 60, 40, 83,171,127, + 0,207,165, 69,196,255, 63,134,191,234,234,234, 98,216,106,120,244, 56,117,234,148, 68, 34,145,252,183,176, 74, 46,215,168,148, +166,243,145,222,157, 2,220,253, 28,216,253,143, 0,244, 83, 25, 79,154, 82,197,226,225, 42, 1,140, 26,147,163,251, 8,179, 96, +193,130, 5, 11, 22, 44,158, 92,112,216, 42, 96,193,130, 5, 11, 22, 44, 88, 5,128, 5, 11, 22, 44, 88,176, 96,193, 42, 0, 44, + 88,176, 96,193,130, 5, 11, 86, 1, 96,193,130, 5, 11, 22, 44, 88, 60, 21,104,178, 10,224,210,165, 75, 14, 71,145, 90, 10, 38, +100,229,177,242,156, 37,207,176,183, 58, 7, 0,105, 41,249, 10, 91,127,214,229,133,133,133,209,117, 71,175,229,166, 46, 93,186, + 68,178,245,199,202, 99,229, 61,189,242,236, 86, 0,158, 18,180, 40,201, 68,116,116,180, 16,128,105,202, 80, 81, 98, 98, 98, 26, +171, 43, 62, 26,124,253,245,215,175, 94,185,114,165,255,249,243,231,223,115,117,117,133, 92, 46,255, 64, 34,145,172,102,144,129, +141,197, 63, 3, 11, 5, 64,199,214,196,227,141,168,168, 40,225,225,195,135,211, 28,252,172, 40, 57, 57,249,164,147, 18, 74, 33, + 42, 42,234,165,228,228,228,221,155, 55,111,246, 7, 80, 15, 64,199,246,185,167, 15, 79,213, 20,128,129,188, 91,244,249,189,123, +247,154,231, 11,151,182, 68,110,116,116,180,208,176,102,151,138,142,142,166,236,149, 69,217, 9, 75,235,131, 91, 40, 79,248, 40, +222,165, 68, 34, 33, 22, 45, 90,180,250,218,181,107,223,119,238,220,249, 61,129, 64, 0,149, 74, 5, 0, 95,239,223,191,159,156, + 58,117,170,232, 17,117, 25,202,254,227, 97,202,179,186, 7,187,233, 94,236, 14,237,207, 30, 29, 29, 45,164, 40,138,162,254,159, +101,217,244, 53, 91,109,208, 18, 10, 10, 10,168,130,130, 2,167, 17, 76,117,245,184, 38,251, 21, 56,155,168, 9,130,176, 75, 46, + 73, 82,148, 78, 71, 81, 36,105,249,136,138,138, 18, 38, 39, 39, 59,180, 11,213,150, 45, 91,198, 28, 57,114,228,228,232,209,163, + 65, 16, 4,181,107,215,174,113,246, 62,155,249,113,228,200,145,221, 47, 15,227, 67,188, 64, 92,157,231,153,191,111,254,252, 88, +146,190,102, 75, 94, 99, 99, 35,213,216,216,216,108, 59,164,239,121, 16,239,135,133, 85, 67,224,190, 4, 65, 60, 27, 29,222, 98, +222,108, 91,249,180, 31, 33, 90,180,141,219,222,189,123,165, 51,103,206, 4,160, 79,170, 97,210, 56,165,142,120, 21,104,133,130, +206,249,111, 72, 67, 42,141,142,142,182,207,171,144,232,111,199,183,218,238,251,141,147,223,100, 46,206,254,125,109,172,117,104, +198,245, 39,145, 72, 8,153, 76,182,167, 79,159, 62,211, 1,112, 40,138,130,155,155, 27,202,203,203, 81, 91, 91, 11, 31, 31, 31, +148,151,151,159,156, 58,117,170,232,192,129, 3,105,118,190, 19,138, 78, 7, 75, 16, 4,166, 79,159,142,113,227,198,137, 22, 44, + 88,192, 88,206,193,131,191, 25,255,159, 50,229, 69,155,231,182,160, 56,247,246, 63,213, 61,108,125,147,115,243, 50,183, 97,182, + 55, 85,162,183, 19, 54, 69,122,122, 58, 86,172, 88,113,223,187, 24, 57,114, 36,117,250,244,105, 70,109, 57, 49, 49, 81,138, 79, + 8,250,252,254,196, 51,159, 16, 45, 30,204, 31,227,177,165,137,165, 45,145, 72, 68,177,177,177, 24, 53,106, 20,117,230,204, 25, + 70,159, 61,103, 37, 39,227,129,196,247,144,156,156, 44,165, 55, 9, 27, 53,106, 20, 85, 87, 87,215, 28,225, 11, 99, 99, 99,141, +237,245,247,223,127,119, 39, 8, 2, 49, 49, 49,247, 0,180,158, 53,107,214,113,137, 68,194,177,199, 98, 95,125,124,181,241,255, +178,148,187, 32, 8, 2, 59,223,117, 7, 64,224,155, 87,190,126, 33, 48, 48, 16, 0,176,235,167,157,140,235, 42, 60, 60, 28,221, +186,117, 99,153,247, 49, 33,127,123, 61, 0, 84, 98, 98, 34,194,195,195, 41, 43, 3, 40,229, 64,231,118,170, 53,105, 46, 47, 49, + 49,209,116, 67, 12,187, 65, 16, 4,145,152,152, 72,208, 3,144,225,175,195,150, 38, 77,254,134,103, 34, 76,158,205,110, 69,133, +152, 89, 99, 60,152,148,219,130,231,161, 77,198,131, 73,185, 61,228, 79, 81, 20,232,221,217, 40,202,190,102, 34,145, 72, 56, 53, + 53, 53,255,245,241,241,153, 14,128, 51,119,238, 92,204,158, 61, 27,124, 62, 31,110,110,110, 16, 8, 4, 32, 8, 2, 92, 46, 23, + 50,153,140,113, 61, 70, 68, 68, 8, 1, 80,251,246,237, 3,253, 78, 40,138,194,254,253,251,177, 96,193, 2,169,225,250, 99, 7, + 75, 10,193,163,240,172, 37, 38, 38, 74, 1, 16, 47,221,156,137,153, 55, 44,246, 49,106,230,141,104, 17,241,153, 67,253,142,122, +255,253,247,209,181,107, 87,167, 60, 47, 65, 16,148, 88,236,135,128,128, 19, 78,173,135, 9, 19, 38,140, 77, 77, 77, 61, 73, 81, + 20, 17, 27, 27,155,102, 15,249, 91,195,129,196,247, 16, 31, 31, 15,146, 36,241,222,123,239, 49, 82, 40, 76,201, 31, 0,142, 28, + 57,146, 52,106,212, 40, 0,240,139,137,137,209,142, 30, 61, 26, 98,177,152, 52,196,205, 48,241, 50, 54, 57, 95,187,118, 45, 94, +122, 78,111, 27,238,124,215, 13, 47, 15,227,227,131,200,247, 25,255, 38, 15, 15, 15,140, 26, 53, 10,153,153,153,198,241,212,252, +160,239, 97,179, 23, 62, 58,242,111, 86, 1,160,201, 42, 51, 51,211,152,118,210,212,122,178,151,104, 77, 6, 17,103, 15, 74,230, +202,128, 83, 93,195, 22,166, 4,236,134,169, 66, 97,176,254,159,198,118, 70,153, 14, 38, 37, 37, 37,198, 11,197,197,197,140, 21, + 70,153, 76,246,149, 92, 46,127,133,195,225,112,102,205,154, 5,153, 76,134,210,210, 82,184,184,184,128,199,227,129,199,227,193, +197,197, 5,110,110,110, 80, 40, 20, 96,226, 66,220,188,121,179,240,248,241,227, 82,130, 32, 48, 99,198, 12, 80, 20, 69, 43,121, +196,140, 25, 51, 0, 0,169,169,169, 82,118,168,104,158,252, 13,239, 87,100,170, 36,211,239,222,212,171,229,200,160,158,152,152, + 72, 24,222, 11, 54,111,222,236, 20,101,236,163,143, 62,162,141,130, 22,123, 38, 34, 35, 35, 35, 46, 92,184,144,218,165, 75, 23, +132,132,132, 80,195,135, 15, 55,122, 78, 12,187, 63, 58, 68,254,107,214,172, 1, 65, 16,224,112, 56,184,112,225, 2,152,120, 99, +204, 60, 18, 47, 16, 4,129,151, 95,126, 89,107, 40, 82,199,196,196,212, 9,133, 66, 44, 88,176,128,156, 56,113,162,205,223,110, +186, 43,105, 89,202, 93,128, 0, 18,222,249, 39,107,241,206,119,221, 17, 51,220, 21,203,159,255,128,241,115, 49,177,252, 89,239, +192,195, 35,255,216,229, 43, 45, 94,231, 53,215, 33,195,195,195,169,204,204, 76,208,158, 0,154,184,194,195,195,237,234,228, 15, +154,252, 77,173,234,199, 61, 96,207,116, 74,224,169,211, 0, 40, 10, 37, 37, 37, 40, 43, 43, 51,150,153,159,219,176,254,185, 71, +143, 30,157, 24, 26, 26, 10, 46,151,139,220,220, 92, 80, 20,133,191,255,254, 27,106,181, 26, 4, 65,128,199,227,129, 32, 8,232, +116, 58,200,229,114, 28, 56,112,192,166,220, 19, 39, 78, 72, 1, 96,198,140, 25,247,181, 91,122,170,135, 38, 10, 38,237,218,220, +173,111,235,156,137,149, 79,195,218,116, 0, 19,215,191, 57,210,211,211, 97,176, 12, 91,166, 0,127, 66,128,248, 76,175,192,153, + 42,175, 20, 69, 1,159, 16,152,121, 35,218,225, 64, 89,130, 32, 40,195,123, 49,146,145,225,125, 17, 45,145,215,189,123,247,251, +200,205, 81,184,186,186, 82,215,174, 93, 67, 69, 69, 5, 81, 81, 81,129,176,176, 48,170,160,160, 0, 92, 46, 23, 90,173,214,161, + 47, 24, 61,156, 75, 43, 15, 88,182,108, 25,214,174, 93,139,211,167, 79,131, 32, 8, 76,158, 50, 31,119, 10,152,109,224,120,228, +200,145,223, 12,239, 88, 9,128, 52, 28,136,137,137,169, 5,224,155,156,156,140,168,168, 40,161,169, 66,222, 28,244,214,255,253, +251,152,232,167, 3,128, 93, 59,179,236,146,199,226,241, 37,255,102, 61, 0, 6,235,159, 48,245, 4,208,150,127,102,102,102, 75, +200,223, 86,128,146, 67,242, 76, 60, 19, 66, 56, 16,224,244, 0, 44, 39,202,100,240, 49, 62, 15, 93,230,172,224, 23,106,175,159, +241,112, 6, 26, 38, 45, 52, 30,118, 88,254, 20, 61,216,118,232,208, 1,131, 6, 13,194,160, 65,131, 0,192,120,110,126,175, 21, +248,250,251,251,247, 81,169, 84,168,174,174,198,185,115,231,144,145,145,129,138,138, 10, 40, 20, 10,208,115,164, 20, 69, 65,163, +209, 64,165, 82, 49,154, 98,160,219,134, 53,114, 79, 76, 76, 36, 8,130, 0, 83,207,204,193,131,191, 25, 15, 38,231,182,160, 56, +247,118, 19,162,167, 15,211,115,211,123,152, 98,212,168, 81, 72, 79, 79,111, 89,131, 48,153,243,135,126, 26, 75,100, 32,103,130, +190,134, 22,198,222,152,190, 23,218, 11,224, 44, 56,195, 11,208,190,125,123, 20, 23, 23, 19,230,202,174,163,228,127, 32,241, 61, + 99, 27,166, 49, 98,196, 8, 0,192,169,179,204, 23,107, 68, 69, 69, 69, 26,230,254,175, 3,144, 27,198,115,250, 48,106,221, 76, +131, 11,155,206,253, 91, 80,174,236,148,199,226,241, 7,143, 73,231,164, 61, 1,246, 90,254,203,151, 47,167, 86,173, 90,229,180, +135,181, 37,207, 48, 72, 57,173,113, 50,157, 67,107,142,116, 76,100, 53,136,197, 98, 79,107,215, 29,133,233,220,191, 51,148, 0, +211,185,127,166, 74,192,236,217,179,225,225,225, 1, 79, 79, 79,120,121,121,193,199,199,135,244,243,243,227, 36, 39, 39,227,213, + 87, 95, 53,222, 39, 16, 8, 48,126,252,120, 52,163, 4, 4,168,213,106, 84, 87, 87, 67,169, 84,194,199,199, 7,174,174,174,208, +106,181,160, 40, 10, 58,157, 14,106,181, 26, 26,141, 6, 58,157,206,174,248, 2, 67,208,154,213,235,166, 86,232,163,132,173,128, + 64,123,209, 82, 37,128,248,204,250,116,223,204, 27,209, 6,114,117, 80,182,153,245,111, 82,142, 25, 51,102,216, 29, 12,104,110, +253,155,202,115, 20,225,225,225,148, 78,167, 67, 88, 88, 24,117,233,210, 37, 34, 44, 44,140,210,104, 52,144,201,100, 14,203,164, +141, 41, 30,143,135, 37, 75,150,224,194,133, 11,248,103,222,159,121,155, 62,122,244,232,209,145, 35, 71, 2,128,151,129,244,229, + 0,176,123,247,238, 86,167, 78,157,242, 54,244, 15,194,240,215,166,224,181,223,173,197,203, 67,239,183,254,103,127, 47,199,238, +115, 26, 80, 20,133, 1,179, 6, 32,107,103, 22,241, 40,141, 43, 22,206,177,254,109,122, 0,104, 75,149,110,176,166,241, 0, 76, +176,106,213, 42,218, 98,112, 10, 24,200,115,120,126,221,176, 68,175,201,145,154,154, 74,210,171, 2, 90,106,177,199,198,198,122, + 62,205, 13,110,203,150, 45, 88,179,102, 77,147,118, 69,147,255,148, 41, 83, 48,101,202, 20,189,133,115,234, 84,115, 98,252,243, +243,243,149, 58,157, 14, 53, 53, 53,168,172,172, 68, 77, 77, 13,228,114, 57,228,114, 57, 26, 26, 26, 80, 87, 87, 7,153, 76, 6, +133, 66, 1,149, 74, 5,157,206,182,197, 68, 16, 4,246,237,219,103,151,194,246, 36, 35, 61, 61,189,201, 97,138, 37, 75,150, 8, + 77,207,153,204, 57, 91,152,243,111, 98,185,183, 36,144,203,210,103, 41,138, 34,246,237,219,231,212, 88,128,125,251,246,217,221, +135, 7, 14, 28, 72,233,116, 58, 99,130,150,176,176, 48,138, 36, 73,220,187,119, 15,141,141,141, 14,253,230,127, 47, 31,141, 83, +167, 78,129,220,227, 11,138,162, 16, 31, 31,111,124, 71,233,231, 72, 48,157,249,136,138,138,122, 17, 0, 98, 98, 98, 74, 12, 10, +128,106,215,174,132, 86, 11, 23, 46,108,117,234,212, 41, 76,152, 48, 33,194,158,156, 0,101, 41,119, 65,128, 64,130,137,245, 63, +235, 59, 57,184, 47,203,176,235,156, 26,139, 23, 47,198,170,163, 95,179,204,250, 20,145,191, 77, 15,128,249,188,191,105, 60, 0, +211,105,128,196,196,196, 52, 67,128,144,212,204,147,228,232,128,113,159, 60,122, 90,192, 48, 15,233,148, 9,246,113,227,198, 93, + 77, 77, 77,237,243, 56,190, 96,218,234,119,150,219,159,182,250,237,112,251, 55, 65, 66, 66,130,241,255,255,252,231, 63,248,241, +199, 31, 1, 64, 13,128, 79, 19, 63, 0,140, 31, 63,222,150, 2,160, 8, 13, 13,133, 92, 46,135, 90,173, 70, 69, 69, 5, 92, 93, + 93,193,227,241,140, 30,128,198,198, 70,200,229,114,168, 84, 42,200,100, 50, 76,159, 62, 93,180,127,255,254,102,159,143,182, 50, +109, 44,107,197,140, 25, 51,108, 42, 10,122,133,230,193,197, 0, 56,114,221, 28, 38,203,253,238, 67,124,124,188,116,201,146, 37, +162,248,248,248,180, 71,218,134,173, 88,255,166,176, 39, 22,192,154,245,239, 40, 6, 14, 28, 72, 93,188,120,145, 8, 11, 11,251, +148,110,218, 58,157,238, 19, 15, 15, 15, 84, 86, 86, 58, 52,198,124,252,225,104,164,165,165,129,216, 23, 0, 0, 56,246,177, 23, +198,127, 81,143, 81,163, 70,225,203, 85,167, 64, 81, 20, 99,111,197,145, 35, 71, 14,140, 30, 61, 26, 0, 42,118,239,222,217,254, +212,169,211,190, 20, 65, 97,226,132,137, 83, 14, 31, 62,156,116,248,240, 97, 70,114,104, 47,231,218,181,107,241,242, 48,151,166, + 22, 63, 40, 44, 89,188, 4,173,199,183,193,211, 26,183,244, 84, 27,101,171, 62,180,170, 32,132,133,133, 53,175, 0,152, 70,252, + 27,200,223, 24, 44, 69,123, 2,152,106,254, 22, 72,187, 69,176, 32,207,233,115, 82,177,177,177,125, 82, 83, 83,157, 57,224, 61, +173,237,140,128, 62, 10,220,104, 73,191,254,250,235, 0,192, 55,105, 75,198,107,134, 65,203, 26,174, 13, 29, 58,244,213,180,180, +180, 68,157, 78,135,186,186, 58,104, 52, 26,227,188,191, 82,169, 52, 46, 49,164, 3, 3,247,239,223,159,198,160,189, 16, 48, 44, + 1, 52,111,183,209,209,209, 20, 77,250,227,198,141, 19, 49, 81, 0, 30, 84, 30, 0,211,185,127, 83,242, 55,159, 22, 96,240, 62, +154, 3, 21, 31, 31, 47,125,233,165,151,176,103,207, 30, 71,189,101, 66, 83,207, 9,125, 78, 7, 12,206,188, 17, 77,221,186,117, +203,234,231,233,132, 63, 71,143, 30,181,234,177,187,125,251, 54, 99,207, 76,117,245, 56, 10, 0, 34, 34,242,145,159,159,111, 49, +186,188,170,106, 44,128, 26, 0,182,199,173, 94,189,122, 81, 23, 47, 94, 36, 12,131,229,167, 0,192,225,112, 62,185,115,231, 14, +106,106,106, 28,234,200, 28, 14,161, 87,216,105,242,191,172,197,143, 82, 53, 0,224,203, 85,167,236, 30, 35,232, 62,177,112,225, +194, 48,138,162, 16, 53, 41,106,250,161,164, 67,191, 50, 37,126, 83, 81, 47, 78,125,225, 58, 65, 16,189, 40, 10,224,190, 44, 3, + 69, 81, 88,178,116, 9,218,140,111,219,194,188,170,250,101,189,116,187, 99, 51, 9, 62,126,104,110, 21,128,113,240, 54, 91,198, + 70, 37, 38, 38,218,237, 50, 53, 33,109,167, 60,184,169, 60,122,253,255, 83,186,188,238,137,128, 89,221, 55, 89, 34,102,229,218, +125,131,129, 88, 44,214, 74, 36,146,253,163, 71,143, 94,148,156,156,188, 78,171,213,162,182,182,214, 24, 3, 0, 0, 21, 21, 21, +168,173,173, 5, 69, 81,176,167, 61, 69, 68, 68,136,142, 31, 63, 46, 77, 76, 76,108, 98,125,210,159,143,136,136,176, 43, 25,208, +131,128,226,220,219,142, 16,254,125, 4,111, 99,200, 38, 8,130,160, 28, 33,127,131,167, 45,205, 82, 95, 4, 0,147,160, 64, 70, + 88,176, 96,129,148,193,119, 50, 54, 52, 76,167, 42,239, 39, 34,102,201,241,186,118,237, 74, 93,191,126,157,118,249,127, 10,224, + 19,149, 74,133,188,188, 60,200,100, 50, 71,169,144, 34,247,248,225,216,101,253, 74,189, 29, 82, 53,118,159, 83,131,162, 40,156, + 62,239, 56, 39,166,167,167, 99,194,132, 9,162,195,135, 15,167, 29, 74, 58,228,168, 24, 14, 73,146, 46, 0,176,231,188, 6,139, + 23, 47, 70,155,200,182,204,213, 73, 11,104,108,108, 4, 0,228,231,231, 83, 91,182,108, 49, 42,100,166,177, 36, 59,118,236, 48, + 29, 31, 88,247,130, 19, 65, 91,247,150, 44,127,243,235,205, 77, 1, 16,134, 41,128,251,150, 77,217, 51, 5, 96,113,160,112, 30, +233,152,202,115,234,250,127,122,238,223, 81,216, 82, 72,236, 85, 88,172,185,251, 29,157, 6,176,230,238,119,112, 26,192, 52, 40, +136,176,227, 26, 44, 40, 1, 20,128,245, 18,137,100,115, 66, 66,130,134,207,231, 67,165, 82, 65,171,213,130, 36, 73,248,250,250, +162,166,166, 6,246,102, 83, 60,126,252,120, 26,244,235,254,169,125,251,246,193,160, 8, 24,151, 6, 30, 63,126,252,127, 98,112, +120,233,165,151,168,198,198, 70, 28, 58,116,200,222,246, 44,180, 81,223,212,204, 27,209, 34, 38,222,184,247,223,127,255, 62,227, +194, 28, 31,124,240, 1,197, 52,200, 83, 44,246,179, 41, 79, 44,246, 99, 36,204,205,205,141, 30, 36, 41,138,162, 32,151,203, 81, + 90, 90,234,240,156,191, 41, 34,191,168,111,114,222, 18,242,215,233,116, 4, 0, 56, 96,241,155,131, 60,248,123, 82,119,211, 76, +128,206, 66,115, 10,153,137, 2,192,226,113,244, 0, 24, 94, 28, 97, 79,249, 35,182, 64,211, 30,179,231, 33,236,176,152,109, 40, + 34,227,156,246, 92, 51,103,206, 20, 57,144,222,183, 89, 11,205,130, 5,218,156,117,202, 40,104, 76, 44, 22,107, 1, 16,211,167, + 79, 23, 22, 22, 22, 74, 21, 10, 5,116, 58, 29,122,245,234, 37, 26, 52,104,144,195,239,123,223,190,125,166, 75,206, 28,242, 26, + 61,232, 24, 0, 91,231, 76,244, 69, 67,116,120, 83,194, 57,125,218,110,183,191, 97,173, 63, 53,243,198,253, 10, 28, 69, 81, 20, +157, 35,192, 68, 33, 51, 6,204, 57,218, 55, 0, 96,239,222,189,132,179,250, 26,211,123, 0,160,186,186, 26, 93,187,118,165,234, +234,234,208,185,115,103,100,103,103, 59,101,172,227,188, 84, 3,130, 32, 48,229,133, 88,218, 13,131,213,171, 22, 24,255,183, 55, + 99,166,179, 32, 22,139,201,205,167, 54, 59, 85,230,156, 57,115, 12, 94, 23,137, 39, 0,173,225,160,196, 98, 49,105,114, 15, 59, + 29,240,184, 43, 0, 79, 16, 90,220, 73, 31, 87, 55,148,179,159,235, 1,120, 97, 30,104,189, 25,230,248,141,223,113,227,198,141, + 71,252, 70, 72,226,241,150,167,175, 43,123, 51,202, 89,197, 39, 77,246,177,160, 44, 93, 51, 88,222,105, 79,195, 64, 82, 86, 86, +102,124, 31,249,249,249, 78,123, 39, 18,201,102, 74, 44, 94, 64,252,254,155,132,209, 7, 28,221,222,213, 17, 24,150,245, 57,125, + 76,104, 78,185,102,221,254, 15, 31,150,166, 6,136,135,217,208, 88,176, 96,193,130, 5, 11, 22,143, 7, 56,108, 21,176, 96,193, +130, 5, 11, 22,172, 2,192,130, 5, 11, 22, 44, 88,176, 96, 21, 0, 22, 44, 88,176, 96,193,130, 5,171, 0,176, 96,193,130, 5, + 11, 22, 44,158, 10, 52, 89, 5, 64,231,188,118, 4,150,130, 9, 89,121,172, 60, 86,222,195,147, 23, 23, 23,215, 84,187,231,112, +140,217,229, 76,151,154,209,217, 20, 77,151,158, 89, 74, 31,236,233,233, 9,129, 64, 96,252, 60,135,195, 1,151,203,189, 79, 30, +189, 49, 19, 73,234, 87,121, 89,219, 44,135,125,191,214, 33,145,108, 17,114,121,174,160, 72, 45,230,207,127, 35,205, 17,121,155, + 55,111, 22,101,103,103,243,194,194,194, 82,205,179,238, 57, 40, 79,152,157,157,141, 77,155, 54,165,177,253,237,201,147,103,183, + 2,240,191,136,192,192, 55,154, 84, 92,101,229,118,226,177,146,247, 70, 32, 5, 0,149,219, 43, 9,211,255, 91, 32,178,133,201, + 61, 31,184,188,255, 89,108, 93,183, 70, 88,113,245, 28, 70,249, 85, 72,219,107,139,144, 67,117,197,133, 70,127,145,119,232, 16, + 44, 90,186, 44,205,214,231,207,156, 57,131, 17, 35, 70, 24,137,159, 38,108,130, 32,238, 35,108,146, 36,141,199,157, 59,119, 44, +202,187,120,241, 34,194,195,195,225,230,230, 6, 30,143, 7, 46,151,219, 68, 38, 77,250, 58,157,206,120,168, 84, 42,100,102,102, + 34, 36, 36,228,169,123, 63, 18,137,132, 16,139,197,212,230,205,155,133,127,255,253, 55,110,221,186, 37,245,245,245,197, 47,191, +252,210,162,246,191,101,203, 86,161,171,192, 31,190,126,207, 72, 27, 27, 74, 68, 91,182,108, 19,110,220,104, 95,238,135, 77,155, + 54, 9, 19, 19, 19, 79,230,228,228,224,208,161, 67, 8, 13, 13,197,123,239,189,199, 53, 93,123,239,128, 60,105,126, 94, 46, 66, +130,187,129,239,234,138,197,139,151,140,137,141,141,101,183, 2,126, 90, 61, 0, 79, 18, 34, 34, 34,108,106, 60,199,143, 31,183, +217, 49,105,130, 54, 39,110, 71,225,108,121, 15, 0,132,157,164,109, 51,181,172,147,229, 49,249,188,249,247, 63,217,196,178,121, +179,240,250,153, 99, 40,220,253,141, 84, 46, 87, 65, 51,132, 3,183, 14, 4,186, 23, 94,198,179, 94,148,180,166,226, 47,180,219, +252,255, 68,211, 23,124,214,172, 18,112,253,250,117,112,185, 92,140, 28, 57, 18, 60, 30,207,120,208, 10, 1,109,245,107,181, 90, +232,116, 58,104, 52, 26,220,185,115, 7, 39, 79,158,180, 40, 79, 46,151, 35, 43, 43, 11, 67,135, 14, 5,159,207,135,139,139, 75, + 19,153, 36, 73, 66,171,213, 66,171,213, 66,163,209, 64,161, 80, 32, 43, 43, 11, 13, 13, 13,143, 3, 89,115, 12,109,131, 3, 64, +219,146, 60,244, 18,137,132,136,139,139, 35,227,226,226, 16, 16, 16,128,127,255,251,223,152, 49, 99, 6,234,235,235, 17, 16, 16, +224, 80, 6,210,128,128, 0,227,243,124,244,209,135,248,121,103, 38,220,220, 90,129,203,229, 75, 27,234,139,236,150,153,145,145, +129,134,134, 6, 12, 29, 58,244,206,184,113,227,218, 86, 85, 85,225,216,177, 99,186,249,243,231, 99,235,214,173,205,246, 17, 85, + 65,238,125,117,115,229,230, 77,164,121,185, 99,105,252,103, 69, 3, 6,246,233,120,183,184, 28,199,146,211, 78,238,218,181,123, + 92, 76,204,203, 39, 88,234,124,252, 65,167,254, 53,243, 20, 48, 82, 0,204, 83,183,218, 58,127,232,228,255,230,155,111, 54,123, + 79, 77, 77, 13, 0, 80, 76,148, 0,154,172, 91,106,173, 63, 8,121,166,150,191, 19,172,127,123, 73,155, 41, 89, 59, 91,158,233, +189,166,127, 1, 0,213,213,250,204,136,254,254,169, 79, 69, 71, 45,248, 51, 21, 33, 69, 82,105,145,156,196,180, 16, 46,158, 9, +210,130,244,167,224,226,207, 69,125, 21, 31,110,245, 10,244,204, 94, 47,253, 57, 62, 78,244,234,146, 21, 86,149, 0,130, 32,112, +227,198, 13,240,249,124,140, 25, 51,198, 72,218, 46, 46, 46,224,112, 56,160, 40, 10, 26,141, 6, 90,173, 22, 42,149, 10, 69, 69, + 69,144, 74,165, 86,183, 84,230,112, 56,208,104, 52,200,206,206,198,200,145, 35,225,230,230, 6, 87, 87, 87,163, 60, 90, 1, 80, +169, 84,104,104,104,192,149, 43, 87,160, 84, 42,141,211, 4, 76, 16, 19, 19, 35,228,114,185,210,250,250,122,240,249,124,148,151, +151,191, 61,109,218,180,122,129, 64,240,179, 35,164, 29, 19, 19, 51,147,203,229,238, 73, 78, 78,166,229,229, 76,155, 54,237,111, +137, 68, 50, 67, 44, 22,171, 29,177,132,227,226,226,164, 43, 86,172, 40, 7,208, 10,208, 79,181, 92,191,126, 29,173, 90,181, 66, + 88, 88, 24,126,250,233, 39,187,201,255,135,185,115, 49,113,192, 0, 0, 64,155, 69,139,224,230,222, 26, 13,117,133,168,147,229, +137, 98, 99,231,165, 89,203,231,110, 13,253,250,245, 67,121,121, 57,206,156, 57,211,153,195,225,224,202,149, 43,240,247,247, 71, +122,122, 58, 94,123,237, 53, 42, 59, 59,187,217,207, 87,125,181,180,201,185,167, 90,131,118, 90, 37, 22,191,255, 73,199,248,213, +255,193, 55,171, 55,162, 61, 71,135,141,171,215,164,190,246,218,107,176, 37,143,197,227, 71,254,116, 57,211,189, 0,238,203,255, +109,235,252, 97,194,153, 59,245, 61, 9, 48, 85, 2, 30,146, 39,192, 94, 75,157,176, 97,157, 59, 34,207,210,223,167, 42,113,213, +119,171,190, 20,134,102,255, 32, 45,231,234, 16,226, 3,116,238, 68,129,219,143, 15, 94,183,110,224,171,148, 80,157, 45,130, 74, +198, 3,151,116,129, 50,245,103,233,214, 13,171, 69,243,223,178, 60, 29, 64,187,231,115,115,115,225,231,231, 7,145, 72, 4,129, + 64, 0, 62,159, 15, 30,143,103,180,250,149, 74, 37, 74, 75, 75,113,234,212, 41,112, 56, 28,112, 56, 28, 52, 39, 79,167,211,225, +218,181,107, 24, 49, 98, 4,188,189,189, 33, 16, 8,192,229,114,161,213,106,161, 86,171, 81, 87, 87,135,191,254,250, 11, 42,149, + 10, 60, 30,207, 24, 11, 96, 11, 35, 71,142, 20,222,188,121, 83,122,251,246,109,212,213,213,129,207,231,163, 77,155, 54,235, 79, +159, 62,141, 97,195,134,241, 36, 18,201,143,246, 40, 1, 35, 71,142,156,122,243,230,205, 61,102,242, 66, 79,159, 62, 29, 58,108, +216,176, 93, 6, 37,128,145,188, 77,155, 54, 9,213,106, 53,202,202,202,104,151,183,177,146, 86,172, 88, 81, 18, 23, 23,215,126, +198,140, 25, 99,222,125,247, 93,187,198,191,173,219,126, 20,126,184,124, 89,147,178,178,117,235,208,230,197, 14,248,230,155,239, + 68,115,231,190,226,208,120,122,230,204, 25,233,159,127,254,137, 15, 63,252,176,142,203,229,122, 11, 4, 2, 12, 27, 54, 12, 82, +169, 20,201,201,201,104,223,190,189, 29, 61,143,192, 47,185,119,177,255, 86, 9, 14,254,254, 19,184, 92, 2, 75, 23,189, 74,246, +111, 19,200,217,178,248, 19,108,181, 87, 30,139, 71, 66,254,230, 74,164, 37,165,192,225, 85, 0,143,122,123,219,110,221,186,137, +108, 29, 15,219, 90,127, 16,242,156,104,245, 51, 37,109, 71,200, 26,166,214, 57,109,161, 27,228, 80, 14,202,179, 58, 80,251,251, +167, 58,100,253,111,216,176, 65, 56,111,222, 60,202, 90,153,249, 53,107, 48,189,127,195,134, 13, 66,243,107,230,101,205,214,215, +181,139,210,210,146, 58,180,242,226,161,155, 23, 5, 94, 32, 9,222,115,207,195,163,255,207,112, 27,248, 45, 92,125,220,192,111, + 80, 64, 46,215,161, 19, 87,142,244, 4,235,169,100, 57, 28, 14,120, 60, 30, 92, 92, 92,112,235,214, 45, 92,185,114, 5,222,222, +222, 8, 8, 8, 64, 64, 64, 0, 2, 3, 3,225,235,235, 11,153, 76,134,244,244,116,112,185, 92,227,220,190, 37,208,215,249,124, + 62,116, 58, 29,114,114,114,224,238,238,142,192,192, 64,180,106,213, 10, 65, 65, 65,240,244,244, 68, 78, 78, 14, 52, 26,141,113, +138,192,154, 66, 97,110,249,223,187,119, 79,154,151,151,135,174, 93,187, 34, 50, 50, 18,131, 7, 15,134, 92, 46,199,201,147, 39, +145,157,157,189, 93,169, 84,190, 98,135,229, 47,186, 87, 94,241,107,254, 93, 25,188, 66,134, 34, 52,242, 13,180, 31, 60, 5, 53, + 42, 14,142,167,158, 64,118,118,246, 52,165, 82, 57,159, 41,249,215,213,213,225,242,229,203,210, 51,103,206,160, 95,191,126,136, +139,139, 11, 4, 64, 26, 60, 0,237, 1, 64, 32, 16, 48, 38,235,173,219,126, 20,254,146,144, 36,244, 15,232, 35, 77,216,125, 25, +115,127,248, 1,201, 89, 89, 72,206,202, 66,155, 69,139, 0, 0, 26, 77,227, 41, 71,250,220, 11, 47,188, 64, 29, 60,120, 16,211, +167, 79,191,227,229,229,197,113,119,119,207,204,200,200,192,153, 51,103, 80, 89, 89,137,208,208, 80,251,148,210,172, 91, 88,253, +199, 85,108, 93,253,209,101, 30, 87, 1,142,174, 30, 95,175,253,129,179, 39, 61, 19,165, 28, 30,158,121,230, 25,150,101,159, 18, +240, 28, 37,248, 71,181,121,197, 3,179,176,255,183, 21,129, 7, 50,175,222, 66, 87, 61, 97,163,220, 46,165, 98,245,234,213,194, + 19, 39, 78, 72,115,115,115,173,150,101,100,100, 48,146, 69,223,151,145,145,129,234,234,106,233,234,213,171, 69,203,150,233,173, +114, 75,101,205,193, 91, 89,133,228, 66, 37,218,215,112, 49,192,155, 64, 80, 5, 16,194,243, 1,135, 8, 0,165,188,135,198,123, + 4,174, 21,146, 40,107, 84,130,199,225,160,175,191,171,212,218,239, 54, 85, 0, 92, 93, 93,145,151,151,135,246,237,219, 35, 34, + 34, 2, 92, 46, 23, 36, 73,162,170,170, 10,103,206,156,129,139,139, 11,248,124, 62,212,106,181, 85, 5,128,246, 14,208, 74, 0, + 69, 81,200,207,207, 71, 72, 72, 8,124,124,124,208,208,208,128,172,172, 44,232,116, 58,184,186,186, 66,165, 82, 65,165, 82, 89, + 29, 59,232, 32, 58, 0,168,168,168,144, 22, 23, 23,163,127,255,254, 16, 10,133,232,208,161,131,168,177,177, 17, 65, 65, 65,210, +212,212, 84,156, 63,127, 30,190,190,190, 67, 37, 18,201, 78,177, 88,172,179, 85,143, 21, 21, 21, 39,239, 85,203,224, 31, 58, 20, +221, 70,190, 4,223, 14,161, 80, 53,214,162,240,207,195,184,117,226, 39, 90, 30,163,247,107,136,125,144,150,150,150,162,117,235, +214, 16, 8, 4,162,203,151, 47, 75,227,226,226, 56, 6, 15, 0, 0,220,140,139,139, 35,153,180,193,109,219,127, 18,250,250, 61, + 35,245,245,127, 6, 28,142, 11, 52,154, 70,108,255, 81,138,185,175,139,104,143, 2,230,207,159,143,160,160, 32,210,222,190,247, +234,171,175, 82, 9, 9, 9, 24, 57,114, 36, 6, 14, 28,216, 25,128,246,196,137, 19,225, 5, 5, 5,112,115,115,131,155,155, 27, +162,162,162,198,236,221,187,247, 36, 19,121, 59,255, 46,194,183,127,221,196,182,149,203,171, 59, 60,211,185, 95, 99, 67, 13,126, + 63,242, 23, 46, 95,249, 27,190, 20, 9,126,217, 61, 68,189, 61,123,220,158, 61,123,255,183, 92,176, 79, 16, 44, 77, 31, 89,243, + 10, 88, 83,213,137, 25, 51,102,152, 90,208, 68,116,116,116,115,231, 79, 44, 42, 43,183, 19,166,199,227, 38, 15,120, 32,238,255, +230,172,246, 22, 61,179,163,214,185, 61, 30, 0,123, 17, 19, 19, 35, 76, 74, 74,106, 66,254,150,202, 28, 65,110,110, 46,146,146, +146,164, 49, 49, 49,194,230,202,172, 18, 87,101, 17,206,221, 85, 64,174, 35,113,186,136, 68,153,150, 7,157, 42, 19, 53,215,223, +196, 79,139, 98,113,232,152, 12, 87,170, 40, 92,170,208,226, 90,149, 22, 85,165,101,205,122,229, 76,149, 0,129, 64,128, 59,119, +238,224,230,205,155, 0,244,113, 49,127,100,194, 62, 90, 0, 0, 32, 0, 73, 68, 65, 84,252,241, 71,147,185,252,230,230,235, 9, +130, 48,122, 1,104,121, 20, 69,161,168,168, 8,157, 58,117, 66,105,105, 41, 72,146,132, 64, 32, 48,202,106,110, 74,193, 20,133, +133,133, 80, 42,149, 8, 15, 15, 71,135, 14, 29, 68, 92, 46, 23,222,222,222, 24, 50,100,136,200,211,211, 19,133,133,133,168,171, +171,187,194,180, 29, 20, 22, 22,130,228,240,209, 62,108, 28,124, 59,132,130,195,117,129,155,119, 16, 58, 13,137, 2,223,195,143, +150, 87, 96, 75,206,230,205,155,133,181,181,181,210,146,146, 18,116,236,216, 17, 34,145, 72,244,243,207, 63,167, 85, 85, 85, 17, + 0, 48,116,232, 80,173,225,214, 80, 31, 31, 31, 72, 36, 18,155, 1, 15, 2, 65, 0, 2,130,250, 67,167, 85,161,252,110, 6,202, + 74,206,140,173,172,200,250,200, 32, 15, 0,112,175,172, 12, 6,121, 46, 76,219,158, 88, 44,158,145,144,144,128,217,179,103, 99, +214,172, 89, 0, 64, 30, 59,118,140,151,148,148,132,185,115,231,142,191,120,241, 34,113,246,236, 89, 34, 46, 46,142, 81,228,126, + 78,157, 28,203, 79, 93,194, 87,239,197, 98,228,164,113,254, 58, 74,139,189,191,158,194,247,235,127,198,145, 37,175, 97,107,255, + 78,232,228,195,195, 71, 31,197,177, 65,128, 79, 8, 46, 93,186,100,149,252,155,245, 0,152,207,237,219, 58,127, 26,241, 0,150, +224, 57,132, 47,158,253, 66,180, 96,193,130, 39,161,190,155, 76, 41, 60,224, 32, 61, 70,239, 33, 42, 42, 74,120,235,214, 45,169, + 90,173,110,182,172, 37,168,169,169, 65, 99, 99,163, 52, 42, 42, 74, 84, 84, 84,116, 95,217,225,195,135,173,190,187,236,106, 5, +100,106, 18,217, 21, 90,148,214,106,209,250, 15, 30,250,237,205,197,157,130,107,248,251, 79, 53,180, 60, 46,212, 36,160, 84, 83, +168,161, 72, 4, 53,179,173, 61,189,220,143,158,187,167, 35,246,239,221,187,135,206,157, 59,163,160,160,192,232,242,231,241,120, +198,251,237,157,206, 51,205, 33, 64,255,125, 64, 83,130,181,112,110,204,135, 77,178, 38, 73, 18,141,141,141,250,193,145,199, 19, +189,249,230,155, 77,222, 93,125,125, 61,239,224,193,131,152, 50,101, 10,103,249,242,229,247, 86,173, 90,165,181,213, 22, 9, 66, +175, 16, 41,228,247,208, 80, 95, 36,154, 55,239,181, 52,137, 68,146, 14,224,171,250,250,122, 28, 60,120,208,168, 56,134,132,132, +168,153,180,237,149, 43, 87, 78,249,230,155,111, 18,163,162,162, 48, 98,196, 8, 0, 32,207,158, 61,203,249,237,183,223, 32, 20, + 10, 39,109,216,176,225,184, 61, 21,115, 87,174,194,171,201,127, 96,241,204, 40,204,120,117, 58,228,202, 58, 28, 56,152,134,181, + 27,119,226,191,227,159, 69,183,242, 98,150, 77,159, 2,101,128,169, 7,192,217,160,204, 58,178,173,115, 22, 38,120,208,228,239, + 68,171,221,154, 71,193,209,249,255,230,218, 5,163,246,114,248,240,225,180,238,221,187,139,252,252,252,154, 45,107, 9,252,252, +252,208,189,123,247, 38, 68,111,169,204, 18, 20, 58,111,104, 8,224, 66,165, 10,229, 58, 29, 78,228, 43,177, 55, 81,137,147,197, + 65,200,229,251,160, 88,166, 65, 81, 61,137, 70, 45, 32,215, 82,112, 13,104, 99,147,152,233,245,253, 58,157, 14, 90,173, 22, 1, + 1, 1,240,244,244, 68,231,206,157,161,209,104,140,229,150, 18, 2,153,203,163,215,247,107,181, 90, 40, 20, 10, 80, 20,133,142, + 29, 59,162,164,164, 4,109,219,182, 5,143,199,131, 74,165,130, 90,173, 54,126, 47,147,233,193, 78,157, 58, 65, 32, 16, 32, 51, + 51, 19,197,197,197, 82,157, 78,135,186,186, 58,226,207, 63,255,148, 54, 52, 52,160, 83,167, 78,240,246,246,126,158,233, 24,213, +169, 83, 39,112, 72, 53, 74,178, 82, 81, 91,156, 3, 82,167,129,162,174, 2,133,127, 30,134,186,177,134,150,215,133,137,114, 67, + 35, 32, 32, 64,186,105,211, 38,163, 23,167,170,170,138,184,118,237, 26, 12,164, 77, 2,104,109, 41,225,145, 57,180, 90, 5,180, +154, 6,184,121,180,129,192,205, 31, 18,201, 22,161, 88, 44,214,174, 88,177, 34,192, 68, 30,182,110,221, 10,153, 76, 70, 47, 97, +188, 15, 43, 86,172,160,134, 15, 31, 78, 13, 28, 56,144,250,236,179,207,126,159, 50,101, 10, 38, 77,154, 4, 0,184,120,241, 98, + 93, 82, 82, 18,102,204,152, 49,229,196,137, 19,135,153,212,217,138, 21, 43,168, 17, 35, 70, 80, 47,191,249, 54,198,236, 59,133, +101,255,154,134,119, 62, 88, 8,165,186, 1,183,243,138, 32,145,236,197,111,147,135, 65,216,177,149,195,125, 99,194,132, 9,236, +184,254, 8, 17, 22, 22,214,132,244,205, 3, 1, 31,106, 42,224,232,232,104,161, 61,231, 15,205,210,183,178,102,223,220,218,103, +106,253, 91,147,247, 70, 96, 32,245, 70,224, 63,238,124,243,115, 91,158, 8,103,201,179, 98, 73, 59, 66,212, 15, 12,102, 74,132, +195, 30, 0, 0,216,181,107, 87,218,228,201,147, 69,166,201,105, 44,149, 57,130,144,144, 16, 76,158, 60, 89,180,107,215,174,180, +230,202,172,126,190,123, 8,186,123,112,225, 69, 0, 26,138,194,141, 26, 53, 18,114, 85,216,117,174, 20,127,229, 85,163, 84, 1, + 84, 41,117,200,107,160,112, 87, 69,161, 65,173, 17, 53, 71, 94,244,210, 60,181, 90, 13,133, 66,129,182,109,219,162, 79,159, 62, + 6, 69,207, 31,131, 7, 15, 54, 18, 54, 77,218,214, 8,155, 38,116,141, 70, 3,181, 90, 13,130, 32, 16, 28, 28,140,218,218, 90, + 20, 21, 21,161,186,186, 26, 93,186,116, 1,135,195,129, 90,173,134, 74,165, 50,126,198, 22,130,130,130, 68, 29, 58,116,192,181, +107,215,112,244,232, 81, 28, 58,116, 72,122,232,208,161,147,167, 79,159, 6,151,203,197,115,207, 61,135,110,221,186, 41, 96, 8, +188, 99, 32,111, 74,107,127, 31, 84,229, 95,194,223,199,127,196,181,195,155,112,227,176, 4,119,206,255, 6, 87, 14, 73,203, 43, +177, 37,231,173,183,222, 74,107,221,186,181,200,219,219, 27,217,217,217, 40, 46, 46,150,198,199,199, 11, 77, 21, 1,131, 39,128, +147,144,144,128,222,189,123,219,124, 54,181, 74, 6, 89,109, 46, 92, 92, 60,224,235,223, 67,234,225,217, 30, 63,252,240,139,144, + 32, 56, 67,233,123,188,106, 83, 33,253,239, 59,136,232,209, 96,181,109, 31, 62,124, 24,110,110,110,232,221,187, 55,186,116,233, + 66, 79, 31,104,107,106,106, 26,246,237,219,231, 27, 22, 22, 54,101,207,158, 61, 73, 76,219,110,114,242, 97,120,123,123, 98,212, +232, 33,242,176,129,253, 48,245,205,185,144, 19, 90, 84,148, 87, 99,193,162,207,177,106, 80, 8, 6,182,114, 92, 73,158, 48, 97, + 2,245,245,215, 95,179, 74,192, 99,162, 8, 88,194, 99,179, 23,192,163, 94, 85,224, 8, 1,219,139,237,149,122, 5,194,148,168, +233,178,199, 65,222,227,234, 81, 48,243, 4, 80,246,120, 0,104, 44, 91,182, 44,109,236,216,177,162,193,131, 7, 91, 45, 51,189, +214, 28, 76,239, 31, 59,118,108,147, 96, 63, 75,101,205, 90,135,174, 30,162,190,109, 3, 49, 60,192, 21,207,250,241,209, 78,192, +129, 43, 69, 65,160,210,162,147, 39, 15, 53, 20,133,171, 13, 90,228, 52,106,209,190, 85, 0,186, 60, 59,218,170, 44,218,234,167, +151,250,117,234,212, 9,253,251,247, 71, 77, 77, 13,106,107,107, 81, 91, 91, 11, 47, 47, 47, 12, 29, 58, 20,106,181,218,152, 19, +192, 26, 97,211,202,132, 70,163, 1, 65, 16, 8, 13, 13,133, 66,161, 64, 69, 69, 5,202,203,203, 81, 81, 81,129,198,198, 70,132, +134,134,130,199,227, 25,229, 89,203, 43, 96,174,148,181,110,221, 90, 20, 28, 28,140,219,183,111, 35, 37, 37, 5, 25, 25, 25,112, +119,119,199,152, 49, 99,208,191,127,255,195, 2,129, 96, 41,211,101,123,187,118,237, 74,106,221, 42,232,149,224,182,190,104,200, +251, 19, 57, 41,219, 81,146,241, 59,252, 92,117, 24, 55,118, 12,250,247,239, 63,231,221,119,223, 61,200, 68,150,183,183, 55, 6, + 14, 28, 8,138,162,112,238,220, 57,100,102,102, 74, 75, 74, 74,164, 95,125,245,149, 48, 46, 46, 78, 68,103, 78, 28, 52,104, 16, +210,211,211,109,202,155, 63,127,110,154,172, 38, 87, 84, 93,113, 5,174, 2,127,180,105,247,156, 52,168,205, 96,169,151,119,151, +195,223,172,254,126, 50, 45,111,215,187,238,216,125, 86, 5,107, 74, 79, 78, 78, 14, 2, 3, 3, 49, 98,196, 8,242,217,103,159, +133, 92, 46, 71, 99, 99, 35,214,175, 95,239,217,163, 71,143, 23,165, 82,105,146, 61,125,226,239,191,115,208,185, 83, 7,188,252, +242, 20,247,143,255,189, 24, 85,245, 50, 84, 86, 85, 34,246,157,207,241,249,212,177, 24,219,169,117,139,200,127,237,218,181,232, +211,167, 15,214,173, 91,199, 42, 1, 15, 17,166,243,254,182,240,208, 50, 1, 58,115, 85,129, 33,185,143, 83, 50, 1,218,130,121, + 34, 30,103, 40, 1,206, 36,107,103,203,115,198,171,134, 19,210, 3,155, 41, 16,132, 21,143,133, 93,120,235,173,183,210,204, 63, +103, 90,182,109,219, 54, 70, 50,233,251, 44,221,207, 84, 6,141, 29,187,246,164, 45,127,117, 38,180, 25,201, 40,144, 1,158,132, + 11, 58,123,114, 80,162, 35,192,117,229, 33,189, 92, 7, 37, 9, 4,185,114, 17, 60,104, 20,222, 93,189, 53,173, 57, 5, 64,163, +209,128,203,229,162,107,215,174, 24, 56,112, 32,234,234,234,160, 84, 42,141,235,243,213,106, 53,252,253,253, 49, 98,196, 8, 36, + 37, 37, 25,167, 4, 44, 65,167,211, 25,179, 8,246,236,217, 19, 6, 55, 61,148, 74,165,177, 63,211,158,132,158, 61,123,162,186, +186, 26, 13, 13, 13, 86,251,178, 57,153,159, 62,125, 58, 45, 38, 38,102, 76,239,222,189, 79,154, 36, 2,170, 29, 57,114,228, 73, +129, 64, 48, 91, 44, 22, 43,237,169,203,211,167, 79, 39,196,196,196,212,245,238,221,251,160,137,188,202,145, 35, 71,174,127,247, +221,119, 25,103,235, 89,184,112, 97,218,166, 77,155, 68,145,145,145,184,125,251,182,244,230,205,155, 40, 44, 44,132,151,151,151, +212,215,215, 23, 17, 17, 17,216,182,109, 27, 6, 13, 26,196,248,217,222,120,227,213,180,109,219,118,136,148,202,106,248,250,133, + 74, 61,189, 58,194,203,187, 19, 26,235, 75,146, 86,174,218,142,152,151,199, 97,215,187,238,198,122,178,100,177, 77,156, 56, 17, +201,201,201, 40, 46, 46,230, 84, 87, 87, 67,169, 84, 34, 61, 61,157,103, 80, 58,235,206,158, 61,107, 87,127,136,138,154,136, 3, + 7,146, 80, 87, 91,133,226,210,187,120,247,173,127,169,223,255,112, 5,127,234,152, 97, 24,161,170, 3, 92, 28,163,135, 9, 19, + 38, 80,159,126,250,169, 49, 29,116,112,112, 48,190,254,250,107, 0,160,142, 28, 57,194,166, 13,127, 68, 74,193,163, 84, 0,136, + 25, 51,102,152,186,208, 8, 51,119, 63, 97,175,251,223, 25,228,110, 36,249,202,237,176,149,109,207,158,224,191,202,202,237, 48, +117,197,155, 18,179,185,203,158, 9,105, 87,110,175,116,170,188, 39, 0,255, 83,131, 68,151, 97, 34,209,101,149, 86, 90,113,242, + 4, 92,180, 10, 92,174,167,144, 90,175, 5,159, 32, 16, 64, 81, 16,181,245,133, 95,155, 32, 81,135, 33, 66, 96,199, 30,155, 30, +128, 46, 93,186, 96,240,224,193, 80, 40, 20,208,104, 52,224,243,249, 70,194,166,173,244,160,160, 32, 12, 31, 62, 28, 41, 41, 41, +205,122, 0,120, 60, 30,250,247,239, 15,130, 32, 32,151,203,141,222, 5, 90,105,167,179, 11,146, 36,137,190,125,251,226,143, 63, +254,128, 61,193,149,187,118,237,146, 2, 32, 36, 18, 9, 1,192, 19,250,108,123,133, 98,177, 88,227, 72, 93,238,218,181, 43,201, + 32,207, 19,128, 63,128,106,177, 88,108,119,110,226,133, 11, 23,166, 1,192,134, 13, 27, 68, 46, 46, 46,200,207,207,135,191,191, +191, 20, 0, 74, 74, 74, 48, 97,194, 4,172, 89,179,198, 46,153,243,230,205, 73,147, 72,182, 8,213,106,153,200,173,174, 64,234, +237, 27, 12,119,207,118,112,247,108,135, 99, 39,238,129, 24,219,188,197,253,211, 79, 63, 17,243,231,207,167,170,171,171, 49,113, +226, 68,117, 64, 64, 0,159, 36, 73, 20, 22, 22,218,237, 17, 3,128, 29, 59,126, 34,196,226, 88,202,251,122, 38,222,122,235, 13, +116, 8,237,206,255,122,241, 27,228,142,141, 63,113,214,115,149, 14,181,229, 9, 19, 38, 80,203,151, 47,135,175,175, 47, 74, 75, + 75,225,230,230, 6,146, 36,225,225,225,129, 47,191,252,146, 85, 2, 30, 2,194,194,194,172,122, 1,152,166, 2,118, 58, 30,243, + 85, 5, 68,229,246, 74,139, 23, 28,180,254,137,237,149,247,203, 51,183,212,105,215, 61, 3,210,118,182, 60, 22,143, 17, 12,100, + 67,188, 20, 53, 65,232,163, 85, 73,185,119,242, 17,162,185, 11,175,128,214, 24,214,183, 7, 2,218, 7,138, 62,216,180, 51,109, +119,198, 66,155, 94,180,174, 93,187, 98,196,136, 17,198,249,120, 46,151, 11,149, 74,101, 76,221,107, 58, 77,208,177, 99, 71, 12, + 31, 62, 28,105,105,150,187,158,155,155, 27,194,194,194,192,227,241,160, 86,171,141,159, 51, 93, 58,104,186, 17, 16,135,195,193, +128, 1, 3,144,153,153,105,119, 29, 24,188, 3,245,134,163,197, 48,144,126,139, 55, 37, 48,120,136,140,253,112,211,166, 77, 66, +185, 92, 14,149, 74,133, 30, 61,122, 32, 62, 62, 94,106,223,115,197,166, 1,128, 68,178, 69,164, 80, 84,192,213,213, 15, 46,124, + 47, 41,135,195,195, 47, 9,135, 69,175,204,142,106, 86,222,214,173, 91, 9,137, 68, 66,124,251,237,183,164, 66,161, 0, 0,132, +134,134,218,149,126,217, 20, 18,201, 22, 98,219,182,173, 19,230,126,250,109,178, 94, 30,197, 9, 13,125, 6,161, 47,190,248,202, + 91,111,189,149,224,136,204, 85,171, 86,177,157,250, 49, 81, 2,154, 35,255,135,170, 0, 60,169,112,230,178, 63,115, 98,110, 41, + 81, 59, 81,158,179, 21, 6, 86, 1,113, 0,123, 14, 31, 73,107, 82,119,117,133, 56,125,187,144,241,231,163,163,163,225,231,231, +103,140,240, 39, 73,210,232,194,167, 61, 0,116,208, 31,189, 35, 96,112,112, 48, 8,130,192,238,221,187,239,147,183,118,237, 90, + 36, 38, 38, 26,239,213,233,116, 54,183, 3,230,243,249, 24, 52,104, 16,152, 68,199, 63,193,202, 90,139,219, 58,173, 8,232, 73, +125, 59,244,225, 88,164,148,137, 60,131,178, 68, 0,192,166, 77,155,168,133, 11, 23, 18, 39, 78, 56,190, 52,127,222,188,249, 71, + 12, 94, 19, 14, 73,146, 58, 14,135,227,102,239,244, 11, 13,214,186,127,188,148, 0,155, 3,181,163,251, 8,179, 96,193,130, 5, + 11, 22, 44,158, 92,112,216, 42, 96,193,130, 5, 11, 22, 44, 88, 5,128, 5, 11, 22, 44, 88,176, 96,193, 42, 0, 44, 88,176, 96, +193,130, 5, 11, 86, 1, 96,193,130, 5, 11, 22, 44, 88, 60, 21,104,178, 10,224,210,165, 75, 14, 71,112, 90, 10, 38,100,229,177, +242, 88,121, 79,165, 60,234,133, 23,197,248,253, 55, 9, 36, 18, 9,199, 82,182, 62,182,254, 88,121,157, 58,117, 50,222, 83, 88, + 88, 72,176,245,247,112,229,217,173, 0,208,157,187,153,251, 29,121,192, 39, 89,158, 35, 50, 31,247,223,219, 4, 18,137,132, 15, +192, 27,128,187,161, 61,144, 0, 42, 29, 73,158,242,128, 65, 57,235, 55, 91,169,211, 71,178,124,105,245,234,213,194,115,231,206, + 73, 79,157, 58, 5, 0, 24, 61,122, 52,134, 13, 27,198, 56,149,240,163,120, 15, 47,188, 40,198,196, 9, 3,181,128,152, 39, 22, +139, 73,176,203, 62, 89,152,161, 83,167, 78,212,228,201,193,198,243,164, 36, 80,182,148, 0, 22,143,216, 3, 96,236,225,123,239, +223, 0,130,152, 89,211,146,239, 33, 28, 32,222,135, 38,207,210,239,109,225,111,126,172,127, 47, 77,252,215, 46,159,254,113,239, +174,245, 99,219,180, 15,110, 45,147,105,224,227,227,130,178,146, 60,178,119,239,254,213, 18,137,100,176, 88, 44,190,109,143, 76, +241,156,254, 84,126, 94, 14,242, 10,148, 40,186, 75,161, 99, 91, 2,193, 93, 4,232, 22, 28, 10,201,142,236,199,165,243, 91, 82, + 36,232,189, 6, 30,250, 51, 94,185,114, 69, 26, 22,118, 20,155, 55,203,145,150, 6,124,242,201, 49, 20, 21, 21, 73, 39, 79,158, + 12,129, 64,128,210,210, 82,209,212,169, 83,225, 12,133,224,149, 87, 94,161,100, 50,153, 40, 34, 34, 2,239,188,243, 78,154, 3, +109,134, 35, 22,139, 49,113,194, 64, 50, 54, 54,150, 7,108,193,239,191, 1, 18,137,132, 96,154,179,159,197,255, 14,212,234,229, + 72, 73,137, 69,100,228, 22, 76,158,188, 10, 73, 73,250,190,199, 42, 2, 15, 7,108, 34, 32,123, 24,214,132,236, 9, 2, 32,247, +248, 61,181,191,117,253,186, 53,175, 30, 58,248, 67, 92, 72, 72,247, 30,211, 94, 28,141,142,237,189,225,235,227,138,154, 90, 37, + 74,238,118,228,220,202,175, 9, 60,116,240, 7,233,250,117,107,190,125,123,209,210,117,182,228,189,251,246, 44,225,237,156, 67, +210,242,210,108,188, 20, 5, 12, 15, 7,130, 59, 3,185, 5, 20,206, 92, 80, 32, 89,154,141, 41,227,189,169,174,161,147, 68,223, +173,223,233, 40,145, 57,211,242, 39, 44,200,126, 36, 74, 64,117,117, 53,222,121, 71,142,160, 32, 32, 58, 26, 88,185,178, 1, 89, + 89, 89,208,106,181, 16, 8, 4,104,213,170,149,244,208,161, 67,152, 63,127,190,104,235,214,173,118,213,221,194,133, 11,133, 87, +175, 94, 69,235,214,173,165,251,246,237, 35,126,249,229, 23, 0,144,166,166,166,226,141, 55,222,192,246,237,219,237,253,173,124, + 0, 72, 62,114,145, 3,108, 33,245,127,239,207,241,207,130,181,254, 1, 96,250,244,253, 72, 73,209,255,141,141,205, 3,237, 17, + 96,189, 1, 15,151,248, 77,203,205,149, 0, 54, 8,208,130, 23,224,105, 38,127,137, 68,194, 59,158,178,247, 99,209,168,129, 61, +166, 69,133,162,127,239, 86, 8,240,115, 3, 1, 2,222,158,174, 8, 13,246, 71,196,232, 46, 24, 61, 98, 64,231,227, 41,123, 63, +150, 72, 36,109,108,201,188,157,115, 72, 58, 50,188, 14,123,215, 3,115,163,129, 30, 6,207,159,135, 59,208, 51, 4,248,108, 9, + 48,180,127, 29,110,231, 28,146,182,228, 21,181,212,235, 97, 67,145,120, 36, 3,146,191,191, 63, 14, 29,114, 67, 69, 5,144,152, + 8,212,212,240, 16, 18, 18,130, 73,147, 38,209,219,189, 34, 45, 45, 13,153,153,153,210,213,171, 87, 11,153,202,141,140,140, 20, + 94,187,118, 77,202,231,243,165, 53, 53, 77, 61, 89, 10,133, 2,219,183,111,135, 72, 36,178,183, 62, 73, 0,248,253, 55, 9,146, +143, 92,228,252,254,155,164, 69,191,125,222,188,121, 20,125, 52, 87,198,176, 93, 80, 14,148, 53,139, 45,155, 55, 11,183, 44, 89, + 34,188, 52,127, 62, 85, 52,113, 34,117,126,206, 28,106,195, 59,239, 8,183,108,222, 44,108,201,111,110,105,155,177, 36,131,105, +217,131,150, 71,187,254, 39, 79, 14, 70,108,108, 74,147,191, 52, 38, 79, 14,110, 18, 31,192,226,193, 32, 44, 44,172,201, 97, 73, + 57, 96, 21,128,199,129, 5, 30, 34,174, 93, 62,189, 50, 36, 36, 36,116,240,192,182, 77, 27, 2,135, 0,159,207,133,155,128, 7, + 23, 23, 14,130,187,250, 33, 56, 56,164,213,181,203,167, 15, 73, 36, 18,171,158, 34,241,156,254, 20, 23,117, 88, 50, 23, 80,170, +128,219, 69, 64,141, 12,168,173, 3,118, 30, 4, 22,125, 10,196,173, 6,134, 13, 4, 56, 84, 29,196,115,250,179, 29,223, 4,125, +251,246, 21,253,254,123, 79,180,106, 5,204,154,197, 67,155, 54,207, 98,244,232,209,162, 67,135, 14, 17,147, 38, 77, 18, 69, 70, + 70,162,117,235,214,184,120,241, 34,246,236,217, 35,157, 62,125,186,240,251,239,191,111,150,128, 70,142, 28, 41, 84,169, 84, 82, + 23, 23,151,102,191, 91, 42,149, 98,236,216,177, 76,200,140,154, 61,123, 54, 37, 22,139,213,134,152, 17,152,144, 63, 1, 0,179, +103,207,182, 91, 65,203,200,200, 48, 30,205,149, 57,216,109,137,150,116,239, 45,155, 55, 11,187,221,188, 41,157,122,233,146,180, + 99, 78, 46,248,117,117,104,155,115, 19,194, 63,206, 75,131,178,179,165, 18, 7,149,128,140,140, 12,204,155, 55,143, 90,180,104, +145,195, 74, 4, 45,131, 73, 25, 83,121,230, 68,207,164,204, 22,104,210,167,255,170, 39,135,176, 29,254, 33, 18, 63, 19, 60,169, + 10, 0,101,225,112,154,224, 7,248,124,148,147, 31,147,178,183, 46,174, 93,207,158, 16, 26,236,111, 36,125, 75,219, 52, 11, 92, +121,208,106, 73,132, 6,251,227,218,245,236, 96, 0, 62,214,228,229,231,229, 32,106,140,254,255,163,233,192, 27, 31, 2,155,119, + 2,165,247,128,155,185, 64,214, 53, 10,169,103,129, 19,231,128,200,209,250,251, 91,160,155, 17, 15,240, 21, 63, 18,197,100,217, +178,101,105, 13, 13,250,120,203, 89,179,102,225,252,249,243,132, 68, 34, 73,163,175, 85, 87, 87,139,122,246,228, 97,254,124, 96, +192,128, 11,208,233,110, 74,139,139,139,173,122, 82, 22, 46, 92, 40, 36, 8, 66,202,116,115,152,242,242,114,155, 94,153,217,179, +103, 35, 33, 33, 1, 0,168,244,244,116,181,201,187, 32,104,226, 79, 72, 72,192,236,217,179, 31,229,120,224,104,153, 69,168,174, + 94, 69,215, 63,255, 52,108,130,164,134,150, 36, 65,106,116, 32, 53, 90, 4,157, 78, 71, 29,195,253,214,173, 17,238, 95,127,253, + 37,125,238,185,231, 30,184, 18,224,136,119,161,165,228,175,158, 28, 98,241, 72,137, 77, 97,217,249, 49,131, 69,203,174,153,224, + 55,202, 65,195,153,114,162, 60,226, 49, 24, 92,154,125, 6, 27, 65,133,148, 51,234,207,145,192, 69,137, 68,194, 75, 79, 63,210, +171, 93, 27, 79, 80, 20,112,250,124, 17,228, 10,253,174,171, 3,251,183, 65, 80,128, 27,138, 74,234,201,220,219, 53, 28, 30,143, +131,238,221,252,208,174, 93,136, 47,244, 91,180, 90, 68, 94,129, 18,195,195, 1,149, 6, 56,114, 10,144,158,167,208,174, 53,129, +110,157,128,177, 35,128, 30,193, 4,120, 92,253,214,226, 67,195,128,111, 36, 74,166,245, 77,216,249, 63, 83, 37,130,194,253,177, + 0,212, 35,106, 91, 0, 64,111,231,138,126,253,250,137,204,175,113,185, 92,105,175, 94,229,136,139,211, 63,230,138, 21, 57, 40, + 40,232,109, 85,150, 82,169,180,105,249,155,162,160,160,192,230, 61, 9, 9, 9, 70, 43,159, 86, 4, 76,174,209, 10, 2, 97,184, +246, 56, 56,237,136,150,142, 27,221, 43,171,164,106,141, 6, 28, 14, 7, 20,151, 11,146, 36,161, 33, 73,144, 58, 29,116, 58, 18, + 29,238,222,149,182,164,189,200,229,114, 0,144,206,155, 55, 15, 4, 65,216, 29,223, 97, 74,248,219,182,109, 35,154, 43,123,152, +228, 15, 0, 41,177, 41,136,220, 18,137,233,251,129,216, 20,253,255, 52,249,171, 39,135,128,159,148,203, 50,239, 67,132,169,219, +159,209,118,192,214, 86, 1,180, 96,117,128,181, 40,118, 71,162,219, 41, 27,131,187,195, 74,131, 21, 82, 37, 28,177, 34,154, 9, + 42,116, 68,158,213,207,208,223, 67, 0, 32,247,218,140, 93, 32,245,209,254,174, 0,128,162,210, 58, 40, 20, 90, 0, 64, 72, 55, + 63, 4, 5,184, 33,251, 90, 57,231,239, 91,213, 16, 8,184, 8,238,234,139, 26,153, 26, 0,172, 10, 46,186, 75, 33,184,179,254, +251,159, 31, 5,132,245, 34,224,202, 7,180, 90, 96,252, 72,192,215, 11,200, 47, 4, 34, 71, 1,157, 59,232,239,127,196, 32,204, +188, 39,143, 74,177,124, 32, 40, 47, 47,183,171, 31,214,215, 51,223,125, 55, 33, 33,129, 48, 81, 2, 76,189, 3,143,188,238,186, +117,235, 70,229,231,231, 19,142, 94, 55,135, 75, 94, 46, 84, 26, 53, 8, 46, 15, 58,138, 2, 1, 64,171, 35,161,209,146,160,116, + 58, 16,183,254,118,202,115, 95,189,122, 21,129,129,129,210,175,191,254, 90,244,193, 7, 31, 56,172, 4,152, 79,163,216, 75,220, +206, 34,255,194,194, 66,162, 83,167, 78,212,244,253, 77, 21, 2, 0,136,220, 18, 9,126, 82, 46,146,146,242,140, 43, 1,216, 88, +128, 71, 71,254, 86, 21,128, 39, 0,205,145,168,221, 4,219,194, 37,142,214,229, 62,224,213, 4,196,204, 26,123,191,131,240,241, +113, 65, 77,173, 18,129,254,238,136,158,210, 3, 90, 29, 9, 87, 87, 46,184, 28, 14, 40,138,194,164,241,193,136,138, 8, 6, 65, + 0, 85, 53, 10,248,248,184, 0, 64,181, 53,129, 29,219, 18,200,187, 67,161, 71, 48, 48,230, 57,125,101,223,204, 5,250,245, 0, +252,188,129, 9, 66,128, 36, 1, 30, 23,200,185,173,191, 63,191,136, 98,250,110,237,249,191,165, 3,201, 35, 89, 6,184,105,211, + 38,225,234,213,171,145,151,151,135,244,244,116,233, 55,223,124, 35,242,244,244, 52,110, 59,171,211,233, 68,215,175,183,146,254, +231, 63, 37, 32, 8, 2,229,229,161, 8, 13,237,130,156, 28,203, 83, 41, 36, 73, 90, 44, 31, 59,118,236,253, 94, 36,138,194,201, +147, 39,237,250,205,166, 74,192,227, 68,254,206, 80, 18, 76, 81,221,161, 61,248, 55,255, 6,229, 2,240, 73, 10, 4, 1,104,116, + 90,168, 41, 29,228, 90, 45, 20, 33, 61,128,235, 55, 91,252,236,125,250,244, 1, 65, 16, 14,145, 63, 0, 12, 30, 60, 24,219,182, +109, 35,250,245,235, 71, 53, 87,102, 11,219,182,109, 35,204, 9,223, 82,153, 61,136, 77,249,135,248, 1,220,103,249,211, 1,131, + 73, 73,121, 44, 83, 63, 2,242, 7,216, 32, 64, 83, 18, 49, 63, 90,108, 21, 82, 20,192,121,169,230,129, 61, 52,181,215, 79,255, + 29,204, 21, 24, 94, 89, 73, 94,101, 81,137,222,234, 91,179,233, 47, 92,186, 90, 14,141,134, 4, 73, 82, 6,165,133, 48,198, 6, + 20,149,212,163,172, 36,239, 54, 0,171,102,101,112, 23, 1,206,102,234,255, 15, 12, 7,178,174, 1,177, 49, 64, 72,103,189,219, +255,139,245, 0,223, 5,224,112,128,179,153,250,251, 91, 64,208,206,142,161, 48,127,223, 15,221, 26,185,126,253, 58, 4, 2,125, +157, 28, 62,124, 24, 9, 9, 9,210,180, 52, 61, 23,172, 94,189, 90,232,239,239, 47,189,113, 67,139,173, 91,129,172,172, 65,224, +114,123,136, 58,116,232, 32,178, 38,207,195,195,131,241,119,107,181,218, 39,190,227,154,146,127,183,110,221, 40,107,135,189,202, + 66, 94, 80, 43, 81,141, 90,133, 58,181, 26, 10,181, 6, 42,173, 22, 26, 74, 7,185, 70,131,122,181, 26,165,237,218,137, 90,242, +220,238,238,238,240,240,240, 16,109,219,182,141,112,196,253,111, 74,244,182,202,236, 81, 2, 6, 15, 30,108,179,140,137, 23,192, + 26,249,155, 90,255, 44, 30, 45,249,179, 10,192, 67,192,131, 94, 82, 72,237,245, 3, 5,198,138,134,182,119,239,254,165,185,183, +107, 64,146, 20, 62,124,119, 40,114,114,171,113, 35,167, 10, 4,129, 38, 1,129, 36, 73, 33,247,118, 13,122,247,238,127, 21,128, + 85, 63,113,183,224, 80, 28, 62, 9,232,116, 0,149, 15, 72,207, 3, 73, 39,128, 9,175, 3,162, 89, 64,218, 31,250,251,116, 58, +224,240, 73,253,253,143, 16,150,230,255,225, 12,101,207, 81, 84, 87, 87, 75,123,246,188,141,140, 12,224,252,121, 29, 58,116,184, +140,172,172, 44,233,228,201,147,169, 67,135, 14, 73, 83, 82, 82,112,239,222, 61, 12, 28, 56, 16, 47,189,244,146,104,255,254,253, +105,205, 37,241,161, 40, 74,100,205, 11, 96, 14, 90,241,176, 23,244, 20,192, 35,154,243,111, 2, 83,139, 62, 63, 63,159,176,118, + 88,186,191, 57,248, 13, 24,128,170,145,163, 80,173, 80,162, 70,163,130, 82,171, 69,131, 70, 7,153, 90,141,250, 49, 99, 17, 24, + 30,238,160, 87,144,192,224,193,131,209,183,111, 95,209,249,243,231,211, 90, 34,195,148,232, 45,149,181, 68, 9, 48, 29, 11, 44, +149, 49,129, 37,242,167, 45,127,243, 76,129, 44, 30, 62,249,179, 10,192,147,238,182,152, 89, 99,215, 52,128, 88, 44,214,245,238, + 55,114, 76, 94, 94,238,205, 63, 51, 75, 65,146, 20, 38,140,235,134,203,215,202,241,229,154,243,248,226,219,115, 70,242,255, 51, +179, 20,121,121,185,119,122,247, 27,249,182, 88, 44,214, 88,147, 41,217,145, 77,232,224,141,248, 31,244, 36,191,249, 11,224,191, +191, 2,162,161,192,128, 94, 64,218, 46,125,121,252, 15,128, 14,222, 45,201, 8,216,210, 85, 0,148, 13, 57,143,100, 46,178,177, +177, 17,125,251, 42,241,236,179,192,179,207, 2,131, 6, 81,200,207,207, 71, 82, 82, 18,254,248, 67,175, 61, 9,133, 66,132,135, +135, 51, 74, 15,188,127,255,254, 52, 38,196,174,213,106,225,229,229,101,183, 21,107,136,250, 55, 70,252,211,231,142, 90,176,244, +209, 92,153, 61, 74,128, 51,238, 3, 0,241,194,133,105,234, 33, 67, 68, 55,198, 71,136,202,158,121, 6,101, 46, 46, 40,235,209, + 3, 57,145,145, 34,221,115, 67, 69, 98,195, 20,141,189,120,246,217,103,209, 18,171,223, 84,134,173, 50,166,117,104,201,234,127, +246,217,103,109,150, 57, 2, 58, 71,192, 63, 73,129, 88,143,192,131, 2,147,165,128,108, 38,192, 7,104,153, 63,142,223, 33, 22, +139,171,214,175, 91,179, 54,229,232,158,247,139,239,214, 7,135,116,245, 67,212,248, 96,248,249, 10,240,255,219,187,246,248, 38, +170,109,253, 77,146,166,105,105,121, 83, 94, 90,105,121, 40,130,128,130, 88, 69,165, 81, 16, 99, 27, 64,218,136, 23,245,130,200, +105,229,120, 16,181, 66,208,123,188,162,247,120, 33, 28, 42, 92,185, 30, 72, 21,161,222,115, 84, 76, 11,150,242,176, 90, 78,234, +241, 40,120,160, 10,200, 67, 45, 45, 90,164, 64,161,208,119,210,100, 50,251,254,145, 76,153,166,121,204, 36, 83, 90,112,127,191, +223,252, 50,179,103,102,101,102,246,204,254,214, 90,123,237,181, 47,213,218,241,221,247,231,112,226,228, 37,148,151,159,248,122, +218,131,179,183, 2, 56, 21, 76,102,194,136, 84,237,151,165, 59,172, 95,151,214, 35,229, 62,224,157, 21,238, 76,128,229,191, 0, + 27, 63,118, 91,254, 46,116, 71,194,136, 84, 45, 62,251, 64, 14, 2,151,251,220, 78, 27, 5,112,230,204, 25,109,175, 94,125,173, + 7, 14,156, 7, 0,252,244, 83,119,220,126,251,205,232,211,167, 15, 52, 26, 13,206,156, 57,163, 77, 77, 77,149,148, 10,120,200, +144, 33,218, 31,127,252,209,234,207, 98, 99, 89, 22,195,134, 13,195,198,141, 27, 37,145,144,119,223,191, 96,155,132, 18, 11,224, +203, 90, 13,213,130, 13, 70,238, 82,200, 95,168, 4,180,121, 47, 14, 31, 14,187,190,195,181,208,165, 60, 55,177,255, 37,183,188, + 64,228, 47,132, 67, 63, 12,160,253,255, 87,196, 19,224, 79, 49,144, 52, 12, 48,140, 96, 57,185,199, 94,147, 16,247, 93,145,235, + 11,242,156,100,185,190,112, 2, 23,255,176,232, 5,179,217,108,254,232,232,225, 47,255,178,173,224,139,196, 1,131,135, 38, 9, +230, 2,216, 55,106,212,216,127,165, 78,159,255,114,102,102,102,147, 24,121,158,244,190, 76,230,188,177,100,203,206,159,240,223, +111,251,153, 11, 32,116,242,151,197, 97,210,213,200, 31, 0, 30,125,244, 81, 28, 58,116, 8, 79, 62,121, 0, 0, 48, 97,194, 4, + 60,242,200, 88,237,243,207, 63,223, 74,206, 95,125,245,149, 36,153,235,215,175, 47, 1,192,164,164,164, 36, 55, 52, 52, 88,149, + 74, 37, 20, 10, 5, 88,150,133, 90,173, 70, 76, 76,140, 54, 92,242, 7, 32,139, 18, 64,113,109,162,178,178,146, 41,202, 40, 34, +131, 22, 13,210, 98,136,239, 99,170, 50,138,172,212,250,239, 92,168, 36, 52,148,114, 55,188, 29, 33,143,233,226,215,215, 21,228, +241,158,128, 58,179,217,252,248,168, 49,247,240, 25, 99, 98, 0,244, 5,112, 6,128,205, 51,203,155, 36,120,187,247, 43, 78, 17, + 84,156,178, 1, 95, 30,234,236,231,208,149,242, 74,180,129,135,232, 91,175,225,200,145, 35,178,201,222,185,115,103,137, 92,247, + 39,232,247,103,188,202, 25,120, 18, 1, 81, 80,120, 43, 1,149, 75, 42,209, 85,191,189,107, 21, 98,179, 0, 2, 0, 19,234, 60, +194, 20, 20, 20, 20, 20, 20, 20, 87, 47,104, 16, 32, 5, 5, 5, 5, 5, 5, 85, 0, 40, 40, 40, 40, 40, 40, 40,168, 2, 64, 65, + 65, 65, 65, 65, 65, 65, 21, 0, 10, 10, 10, 10, 10, 10,138,107, 3,109, 70, 1, 28, 60,120, 48,228,168, 76, 95,193,132, 84, 94, +135,201, 11, 58,137, 77,103,202, 51, 24, 12,201, 0,172, 22,139, 69, 22,121,179,103,207, 78,230, 56, 78, 54,121,244,253,235, 28, +121, 11, 23, 46,156,157,153,153,249,113, 71, 94,159,217,108,142, 0,160,241,188,211,118, 0, 28, 0,146,153,153, 73,104,125, 80, +121,191, 37,121,114,121, 0,136,136, 69, 10,228,150,119,197, 64, 46,174, 34,164,113,173,232,235,243, 16,161,108,247, 43,144,135, +236,236,108,109,128,231, 41, 89,222,145,183,187, 35, 92,121, 60,102,222,190,203,154,208,189, 16, 0, 48,126,252,248,176,235,115, + 68,255, 45,184,161,223, 30, 68, 69, 69, 97,202,148, 41,157,253,126,144, 16,150,171, 89, 94,176,255,145,130,189, 29, 85, 41, 57, + 57, 57, 15,189,251,238,187, 47, 70, 68, 68,108, 83,171,213,165,106,181,250, 7, 0,102,165, 82,105, 97, 24,230, 47,102,179,185, +175,217,108,166,195,206, 40, 40,252,121, 0,124,125,228,132,248,255,198, 37,230,134, 38, 30,129,114,201,147,100,193,202,137,244, +244,116,114,226,196,137,160,228,106,177, 88,172, 70,163, 17,113,113,113, 62, 83,174,102,101,101, 89,165,144,181,197, 98,177,102, +103,103,107,179,178,178,172,251,246,237,179,122, 41, 2, 33,201,227,142,253, 39, 20, 55,191,142,247,255,238, 0, 0,112,199,254, +243,178,118,120,243,235,146,158,203,135,127,238, 70, 56, 2,124,244,169, 91,150,110,114, 4, 70, 13, 59, 10,192,173, 4,148,150, +150, 74,170,155, 85,111,107,147,107,127,174, 65,163,163,151,181,169,165, 27,116,211,106, 49,120, 0,131,132,132,185,164,190,222, +142, 45, 91,182,116, 86,131,206,132,248,110, 94, 17,121,129,190, 49, 25,191,185, 80,224, 16,190,127,121,121,121,214, 89,179,102, +105,243,243,243, 75,194, 17,250,238,187,239,234, 84, 42,213,189, 42,149,234, 81,165, 82,217, 75,161, 80,196,152, 76, 38,197,146, + 37, 75,230,187, 92, 46,176,110, 60,234,114,185,244,102,179,249, 43,143, 55,192,225,105,255, 58,188, 27,116,250,244,233, 68,236, +179, 47, 40, 40,144, 84, 33, 51,102,204, 32,225,156, 79,113,237,131,207, 8, 40,117, 58,224,160,228, 63,126,252,120,148,150,150, + 74,106,176, 2, 53, 56, 34,229,181,147,111, 52, 26, 81, 81, 81, 1,143,139, 88,182,105, 93, 73,213,120,130,168, 17, 96,122,125, +200, 0, 0,211,123, 41,147,158,158, 30,180,117, 21,146,117,117,117,181,213, 31,249, 27,141, 70,152, 76, 38, 73,228,239,217, 70, + 82, 82,146, 54, 41, 41, 41, 44,121, 60,217,243,191, 43,255, 11,109,200,127,105,154, 6,171,242,237,162,158,213, 71,107, 99,200, +232, 4, 5,154,108, 4, 47, 60,161,193,190,163, 44,108, 77, 4,205, 14, 64, 59,238, 40,142,254,228,194,248,241,227,137, 88, 37, +192,248,199,155, 72,249,119,245,136,237,174,198,128,129, 49,232,215,127, 24,126, 41,119, 96,200,205, 78, 68,104,170, 81,188,237, + 2, 30,124,240, 65,242,233,167,159,210, 6,239,234, 65,235,244,131, 22,139,197,170,215,235,145,159,159,111,245,245,189,238,223, +191,159,188,246,218,107,216,177, 99, 71,192,250,221,184,113,227,125,106,181,122,180, 90,173, 94,164, 86,171,163, 79,157, 58,133, +225,195,135, 67,169, 84, 34, 54, 54, 22, 39, 78,156, 64, 76, 76,140,106,255,254,253, 61,247,238,221,251,229, 51,207, 60, 51, 4, +192, 47, 0,212,112,119, 15,248,109,248,132,237,159,176,221,226,203, 25,134, 1, 35, 66,131,218,190,125,187, 95, 25,194,114, 41, +138,155,128,240,195, 58,191, 35,177,112,225,194,100, 79, 86, 74,138, 78, 34,253, 80, 61, 0,162,200, 95, 44,140, 70, 99,208, 99, +196, 16,151, 63,242, 95,185,114, 37,150, 45, 91,230,173,116,132, 68, 12,228,192,120,130, 62, 35,192, 36,124,200, 8, 45,254,188, +188, 60, 6, 0,248, 95,127,125, 46,222,100, 29,136,252, 61,158,129,160, 86,187,197, 98,177,122, 91,248,124,153,240, 25, 75,149, + 23,200,194, 95,154, 38,126,166,184,252,181,221,200,240, 27, 20,136,138,100,112,195, 32, 37, 46, 92,226,224,100,149,168,169, 37, +168,107, 36, 56,241, 43, 7, 40,128,190,209,135,249,231, 19,176, 81,120,249, 63,110, 76, 30, 49, 52, 17,123,207,158, 67, 66,124, + 63,140, 30,147, 8,101,100,111,220,144,112, 9,151,108,118, 84,159,117,225,215,115,118, 68,171, 42, 68,201,187, 2, 32, 50, 88, +246,178,203,243,199, 77,157, 72, 20,156,192,250,135, 70,163,209, 2,176,122,215,225,129, 3, 7, 68,145, 63, 0, 68, 68, 68,244, +212,104, 52,243, 46, 92,184, 16, 61, 98,196, 8,220,122,235,173, 80,169, 84,120,235,173,183,224,114,185,112,203, 45,183, 96,235, +214,173,216,191,127, 63, 14, 31, 62, 12,165, 82,249, 23,179,217, 60, 99,253,250,245,129,172,234,214,231, 39,135,199,210,108, 54, +107, 7, 12, 24, 96, 37,132, 4, 60,231,236,217,179,218,204,204, 76, 73, 15,148,151, 29,234,249, 60, 81, 31, 63,126, 60, 96,187, + 49,114,228, 72,173, 84, 50, 63,126,252,184,117,206,156, 57,232,209,163,135,150, 42, 2, 93, 19, 42,127,141, 79, 48, 75,189,171, +160,162,162, 2,203,150, 45, 11, 85,129,240,139,244,244,116,194, 12,202, 99,210,211, 19,136, 37,103, 34,176,249,110,194,196, 60, + 23,244,139,247, 69,214,222,164, 28,168, 91,192, 31,132, 10,197,190,125,251,172, 73, 73, 66,237, 17,236, 0, 0, 26,206, 73, 68, + 65, 84, 73,109, 92,255, 82,229,125,176, 36,198,111,227,246,216,234, 38,209,114,214,175, 95,159, 28,169, 92, 2,133, 2,136,142, + 2,106,235, 57,180, 16,130,110, 81, 12,236, 28, 96,107, 33,184,174,159, 2, 28, 11,148,157,114,161,162,162,194, 26,136,200, 22, + 63, 59, 53, 57,225,134,104,171, 90, 77,240,187,121,119,192,229, 34, 56, 91,237, 64,229,233, 90, 32,226, 20,162,122,181,224, 76, +245,207, 80,168,235,112,236, 88, 45,122,244, 10, 44,239, 10,130,241,241, 29,133,204,180,222, 19, 61,121,230,126,144, 44,239,226, +197, 41,109,182,123,247, 46, 14, 74,108, 18,149, 18, 34, 65, 73,113,241,223, 72,106,106, 42,120,210,183,217,108,173,117,200, 91, +254,133,133,133,162,234, 52, 50, 50,242,174,166,166,166,155, 70,142, 28, 9,173, 86,139,172,172, 44, 60,245,212, 83, 0, 0,167, +211,137,205,155, 55,163,180,180, 20,223,126,251, 45,182,108,217, 2,155,205, 54,140,227, 56, 93, 16,139, 93,214,247,105,231,206, +157,162,186,230, 24,134,145,252, 46, 11,101,135,114,190,231, 27, 46,153, 51,103, 14,170,170,170,124,238, 31, 52,104, 16, 66, 37, +240,170,170, 42, 84, 85, 85, 81, 69,224, 10, 67,232,238, 15,228, 13, 80, 73,181,216,229, 38,218,112,225,113,251,135,110,186,141, + 7,193, 64,128,217,225,254,112,152, 9,165, 76,122,122, 66,107,163,150,151,151,199, 32,103, 34,241,246, 4,136, 37,235,234,234, +234, 54,228, 28, 10, 89,139,133, 64,233,144,165,159, 88,224,254,247,121,240,134, 13, 27,200,249,163,207, 99,224, 8, 37,154,108, +151, 15,177,185, 8,236, 14,192,233, 41,115,178, 4, 68,225, 94,255,254,112, 41, 12, 6, 67,114, 89, 89,153,207,255,140,141,173, +179, 54,217, 20,232,219,187, 39,106, 47, 54,163,182,174, 22,251, 14,156,197,233,115, 4,234,110,205, 24, 60,172, 17,182,230, 11, + 24, 62,198,137, 33, 35, 91,176,229,157, 82, 60,252,240,195,201, 39, 79,158,164, 95,253, 85, 0,222,250,103, 24, 6,169,169,169, + 4, 0,118,236,216, 1,131,193,144,108, 52, 26,173, 82,200,223,108, 54, 71,214,214,214,206,117, 58,157,138,232,232,104,220,123, +239,189, 88,189,122, 53, 34, 34, 34,144,153,153,137,220,220, 92,148,150,150, 98,223,190,125,216,179,103, 15,190,255,254,123,244, +237,219,183, 47,203,178, 55,192,143,251, 95,232, 2, 13,214, 5,160, 80, 40, 68, 93,103, 71,118, 1,108,223,190, 93,150, 46,128, + 30, 61,122,104,171,170,170,172,254,246,133, 91,239, 84, 17,184,122, 60, 0, 87, 19, 24, 63,228, 36, 89, 11, 78, 79, 79, 39,150, +101, 39, 1,165, 26,232, 25, 1,244, 28, 2, 38,207, 35, 76,100,223,127, 7,128, 8,173,126, 0, 16, 90,254, 62, 26, 87, 36, 37, + 37,105, 3, 4, 3, 74,190,135,191,189,216,205,175, 71, 32,182, 62, 11, 63, 59, 8,206, 94,224, 0, 40, 16, 19,237,118,113, 58, + 89, 2,123, 11, 96,119, 0,246, 22,192,225, 4,236, 54,192,209,114,217, 75,226, 43, 32,229,111,111,119, 35,197,251, 26,112,125, + 66, 12, 72,132, 10, 23,108, 54, 88,191, 56,133, 99, 39, 78,227,226,197, 70,140, 26,239, 66,147,157,133,189,197, 5, 91, 51,135, +179,149,128,173, 9,216,182,109,155, 85,202, 4, 24, 20,178,121, 56,164,126,107,132,183,254, 53, 26,141,214, 98,177,148,240, 67, + 70,109, 54,155,117,194,132, 9, 82,100,177, 0,134, 1,224,198,141, 27,199,105, 52, 26, 69,110,110, 46,230,207,159,143, 21, 43, + 86,128, 16,130,111,190,249, 6, 95,124,241, 5, 14, 31, 62,140,186,186, 58, 12, 31, 62, 28,245,245,245,209, 10,133, 34, 46,152, +240,153, 51,103,250, 37, 84,169, 30,148,174,222, 5, 16,200, 11, 16,142,245, 79, 21, 1,170, 0,116, 8, 41, 26, 12, 6,173,160, +207,208, 91, 9, 96,132,214,134,199, 37, 31,146, 75,143, 39,253,188,188, 60,198,146, 51, 17, 80,171,193,228,229, 93,209,155,229, +163,254, 45, 22, 11, 99, 48, 24, 72, 48,111,136,119,108,128, 20, 66,247,133, 64,199,206,125,169, 9,131,250, 43, 48, 71,175,134, +189, 5,232, 17,203, 64,193,120,172,126, 16,216,155,129, 38, 7, 65,147,141,160,201, 78,192, 17, 64, 17, 32,230,122,238,226, 38, +220, 50,182, 2, 3,110,186,136,207,119, 87,227,226, 69, 59,198,221, 89,143, 49,189, 27,129,136, 22,216,155, 57, 84,159, 38,104, +106, 98,192,178, 12,122,247,101, 0,134,163, 95,241, 85,244,237, 10,222,213, 18,225, 47, 15,189, 94,223, 46,254,200, 71, 44, 0, + 95,233,195, 0, 28, 92,186,116,233, 93, 42,149, 42,230,253,247,223,199,166, 77,155,240,228,147, 79, 98,229,202,149, 96, 24, 6, + 63,255,252, 51,108, 54, 27,140, 70, 35, 88,150,197,211, 79, 63,205, 49, 12, 19,244, 3,144, 51,154,190,171,119, 1, 4,242, 2, +200, 97,253, 83, 80, 5, 64, 86,248,232, 71,102, 2, 28, 39,222,196,153,224,142, 80, 79, 79, 31, 76,128, 50, 88,222, 58, 9, 68, +141,104,245, 4,240, 74,129,152,110, 0,185,192, 91,243, 6,131,129, 8,173,127,222, 35, 32,220, 54, 24, 12, 16, 36,203, 33, 82, + 9,221, 27,130, 81, 0, 62,229,177, 46,160,169,153,160,197,225, 14,246,107,113, 16,168, 34, 47,239,179, 55, 3, 54, 39, 65,205, + 69,130,243,151, 8,190, 61,198,130,227, 0,131,193,160, 45, 43, 43,107, 87, 55, 44, 11, 84,157,114,224, 84,249, 37,252,115,239, + 37, 16,194,224,216, 15, 28, 82,231,176, 80,171, 8,206,159, 3,254,249, 25, 80, 95, 79, 64, 56,224,238,251, 24,104, 52,128, 78, + 55, 3,191,252,242,139,168,123,210,221, 9,178,123,111,135,196, 12,200,234, 33,242,244,249,135,141,222,189,139,187,156, 39, 97, +199,142, 29,237,202, 94,125,245, 85,178, 99,199, 14, 20, 22, 22,138,149,163, 0,112, 4,192,193,236,236,236,177, 61,123,246,140, + 1,220,110,240,247,222,123, 15,243,231,207,199,166, 77,155, 90, 45,245,236,236,108,212,214,214,162,190,190,190,177,185,185,185, +194,227, 65, 80, 7,250, 3,142,227,218,196, 67,241, 22, 60, 33, 68,180,251, 31,184, 58,186, 0,124,121, 1,228,182,254,121,153, +212,242,167, 10, 64, 88, 40, 45, 45, 13, 26,253,237,217, 47, 78, 96,100, 55, 88,134,252, 3,120, 59,129, 32,161, 27, 48,180, 5, +204,141,133, 12,222, 26,223,218,247, 31, 78, 55,128,247, 80, 64,127, 67, 3,125, 53,150,124,123,193,147,191,119, 0,160,199,138, +106, 45, 11,226, 1, 96,100, 38, 43,230,238,201,211,147, 79,159,217,109,229,250,113, 80,168,128, 8, 79,187,232,228, 8, 88, 22, +104,104, 32,112, 56, 1,214,233, 86, 10,102,204,116,123,111,252,184,236,153,164, 59,167, 39,183, 92,216,101, 29, 53,138,195,151, + 95,184,192, 40,128,243,103, 25,104,162,128, 47, 62, 5, 28, 54, 6, 12, 1,198,220, 22,129,170, 74, 14,147, 39,167,160,160,160, + 64,212,180,214,186, 59, 65, 86, 61,227,190,127,153,149, 0, 70,102, 5, 64, 22,121,193, 92,206,157, 65,254,190, 10,249,168,127, +225, 49,188,247, 46, 45, 45, 77,155,159,159,239, 79, 94, 35,128,147,223,125,247, 93,227, 61,247,220,211, 15,130, 49,253,239,189, +247, 94, 43, 33, 58,157, 78,184, 92, 46,148,149,149,161, 95,191,126, 23, 56,142, 19,165, 45,206,156, 57,211,159,165, 46,233,166, +175,134, 46, 0, 95, 94, 0, 57,173,127, 74,252,215,160, 2,224, 25,179,127, 69, 91, 24,222,202,181, 88, 44,188,197,203,248, 56, +134,240,228, 47,176,138, 37, 65, 56, 10,128, 47,147,106,249,123, 7, 0,122,208, 90,150,149,149,101,245,116,103,136,146, 39, 36, +127, 95, 49, 1, 82,229, 5,195,170,124, 59,130,201, 43, 40, 40, 40,233,211,147,193,253, 73, 17,224, 0, 56, 29, 28, 34,213,238, +199,212,208, 68,208,226, 36, 96, 93, 64,233, 17, 23, 92, 28, 65,176, 33,123, 5, 5, 5, 37,253,251, 49,152,156,172,196,195,143, + 41,209,216, 64,208, 80, 7, 52, 53, 48, 72, 24, 78,224,114, 50, 80, 41, 52,168,189,200,161,234, 87, 7,202,126, 16, 23, 48,166, +187, 19,100,237, 98, 96, 68, 60,176,238, 5, 96,209,155, 29,162, 4,200,233, 25,144, 69, 94, 7, 14,249, 11,229,217,113,190,200, +127,249,242,229,237,220,252,121,121,121,124,158,128, 18, 63,214, 63,224, 78,230,115,240,198, 27,111, 44,183,219,237,131,149, 74, +165, 38, 58, 58, 26, 0,144,159,159,143,180,180, 52,216,108, 54,216,237,118,180,180,180, 32, 38, 38,198,238,114,185, 10, 8, 33, +103, 69, 90,215,178,188, 31, 87, 75, 23,128,208, 11,192,175, 83,226,167, 10,192, 21, 35,127, 49, 50, 61,132, 79, 60,235, 0, 64, +132,195, 18, 75, 75, 75,219, 16,190, 47, 5,161, 29,148, 12,160, 86, 0, 81, 74, 32, 70, 5,180, 52,192,178, 34, 2, 88,251, 20, + 65, 84,111, 32,170,183,228,190,127, 63,228, 15, 31,100, 45,234,195,240, 38,127,239,152, 0,169,242, 36,144,127, 80,121, 53,181, +132,217, 89,226, 36, 26, 13,192,113,192, 45, 55, 42, 47,215,199,247, 46, 56, 93, 4, 46, 78,137, 89,179,102,137, 82, 78,206,157, + 39,204,238, 79, 93,132,101, 1,135,147,192,197, 2, 10, 6, 72, 78, 1, 26,106, 25,252,112,200, 6,155, 93,129,233,250, 89,216, +186,117,171, 40,242, 95,254, 20, 48,236, 58,247,246,208,193, 64, 7,121, 2, 40, 36, 32, 64,178, 31,146,146,146, 34,102, 52,128, +178,103,207,158, 7,109, 54,219, 95, 43, 42, 42,134,140, 29, 59, 54,145,101, 89, 85, 68, 68, 4, 10, 10, 10, 48,117,234, 84,216, +237,118, 52, 55, 55,163,172,172,172,190, 87,175, 94,127,183,217,108,239,115, 28,215, 4,145, 25, 0,133, 1, 9, 82, 93,255, 2, + 69,162,157,231,160, 43,118, 1, 8,189, 0,114,200, 9, 37,119, 0,197, 85,160, 0,116,134,229,239,195,250, 32, 94,215, 35,151, +149,226,215, 35, 32,214, 3, 32, 55,249,243,202,142,151,123,159, 8,203,164,202, 11, 22, 11, 32, 85, 94,147,157, 48, 77,118, 16, +133, 2,248,103,169,187,175,159, 15,248,115,247,251,207,146, 36,175,161,129, 48,140,194,147,147, 66,225,150,241,175,127, 0, 77, +141, 28, 8, 7, 76,159,158,130,173, 91,183, 6,173, 15,221,157, 32,198,199,129,158, 49, 64,213, 5, 32, 42, 18,224, 8,208, 77, + 3,188,145, 73,149, 0,137, 32, 34,190, 75,209,240, 69,254, 12,195,144,148,148, 20, 0, 64,106,106, 42, 97, 24, 38,144, 34, 16, +227,112, 56, 26, 21, 10, 69,241,160, 65,131,174,107,104,104,120,230,192,129, 3, 3,111,189,245, 86,142,101,217,230,186,186,186, +115,135, 14, 29,250, 57, 33, 33,161,188, 79,159, 62, 21, 54,155, 45,159,101,217,115, 25, 25, 25, 77,227,198,141, 19,165, 0,240, + 73,129,194,129,217,108, 22, 77,168,161,116, 1,132,115,190, 63, 47,128, 28, 47, 11, 37,255,171, 84, 1, 16, 49,214, 95,210,135, + 46, 33,119,128, 20,185,140, 32,202, 63,100,242, 98, 74,193,164, 39, 60, 72,240, 19,128,159,188,247,214,121, 22,105, 99,204, 61, +247,107,149,139, 92,189,158, 11,225,243, 12,120, 2, 4, 25,129, 55, 36, 36,121,127,123,177,155, 80, 41, 8, 69, 94,171,220,180, +180,203,117,194, 7,252, 89, 44,150,146, 80,228, 17,174,109, 29, 55,214, 3, 41, 41, 41,216,185,115, 39,195, 91, 85,162,234,227, +175, 87,156, 8, 59, 85, 94, 23,235,247,111, 99,177, 11, 55,188,201,159,143,219, 17, 6, 9,234,245,250, 64,242, 42, 29, 14, 71, + 36, 33,164,129,227, 56,179,195,225,248, 38, 62, 62,190,111,109,109, 45,243,202, 43,175,212,215,213,213,213, 12, 30, 60,184,161, +177,177,177,201,225,112,212, 59,157,206,150, 5, 11, 22,216, 36, 90,216, 97, 63,204,204,204,204, 14, 35,194,142,148, 77,241,219, + 84, 0,228,110, 61, 58,172, 53,242,144, 40,227,203, 90,150, 2,153,163,250,197,100, 11, 12,235, 15,164, 76,250, 35,135, 55, 32, +132, 58,241,187, 29,174,188,157, 59,119, 74,170,171, 14,176,238,127,107,242,228,148,205, 0, 64, 78, 78, 14, 81, 40, 20,224, 23, +161, 11, 91,167,211,129,227, 56,112, 28,135,140,140, 12, 38,200,168, 0,134,101,217,104, 66,136,139,227,184, 22,167,211,249, 15, +165, 82,201, 40, 20,138, 72, 0,145, 28,199,193,229,114, 41, 89,150, 85,179, 44, 59,112,193,130, 5,199, 5,231,118,248, 36, 64, + 20, 20, 93, 1,129,114,164, 48,161,206, 35, 76, 65, 65, 65,209, 5,208, 44, 32,116, 78, 96,216,168, 4,229,103, 0,244, 0,160, +161,196, 79, 65, 17,216, 3, 64, 65, 65, 65,113,181, 64,227, 81, 2, 56, 1,241, 43,112,121,230, 65, 21,128,129,158,117,154, 53, +138,130,130, 42, 0, 20, 20, 20,215, 8, 20, 0, 98, 4,219, 60,241,171, 5,164,207,121,142,163,214, 63, 5, 5, 85, 0, 40, 40, + 40,126, 35,109, 26, 37,125, 10,138, 0,218, 51, 5, 5, 5, 5, 5, 5,197,111, 89, 91, 62,120,240,160,112, 34, 29,226,149, 68, +135,160,237, 68, 59,149, 22,139, 37,158,223,246, 21, 76, 40,148, 39, 21,215,162, 60, 31,195, 22, 25,250,252,104,125, 92, 45,242, +226,227,227, 91,143,169,172,172,100,164,202, 91,184,112, 33, 50, 51, 51, 25,250,254,133, 38,147,126,191, 84,158, 20,121,146, 21, + 0,137,232, 39,242, 56, 98, 48, 24, 36,103,150,242, 55, 95, 60,218,143,153,246, 53, 27,160,175, 99,174, 56,120,130,241,140,133, +183, 90, 44,150,214,108, 93, 93,101,172,182, 94,175, 79, 46, 44, 44,108, 37,193,148,148, 20,237,206,157, 59, 75,174, 69,109,215, + 87,125, 28, 63,238, 30, 25, 54,114,228,200,206,190, 60, 50, 99,102, 38, 10, 62, 49,251,124,103,103,204,204, 36,158,125,126, 95, +156, 25, 51, 51, 3, 54, 2, 5,159,152, 67,126,233,226,227,227,137, 94, 63,180,117,187,176, 16, 36,152, 18, 16, 12,171,179, 87, + 39,111,255,108, 59, 18, 71, 37, 90,193, 0,199,191, 59,166,189,115,220, 93, 88,251,230, 90, 73,239,223,220,185,115,219,221,119, +110,110, 46, 77,238, 68, 65,209,129, 10,128, 90,236,129, 73, 73, 73,146,133, 7, 80, 0,124,146,168,247, 68, 27, 18,136, 54, 20, +205, 73, 76,227, 66, 44, 22, 11,140, 70, 35, 76, 38,147, 53, 64,154, 78, 49,255,223,230,152,193, 9,215, 3, 0,206,217,237, 96, +109, 45,238,194,218,122,158,228,196,165, 63,110,109,200, 11,219,228, 20,240,228, 22,151, 52,199,187,130,113,103,215,227,127,129, +160,235,157,209, 56,183,169, 15,158,248,195,168, 15, 57,239,129,204,152,153,137,135,116,183,217,129, 76,141,135,232, 67,250, 15, +129, 2, 33, 59, 28, 14, 35,138,138, 50, 48,109, 90, 14,244,122, 19, 10, 11,221,207, 42, 20, 69,224,137,103,159, 32,181,189, 47, + 98,141,121, 53,122, 69,247, 2,199,186, 96, 39, 45,214, 79,191,249,108,218,108,215, 35,228,174,196, 73,218,197,139, 23, 7, 85, + 4,230,206,157, 75, 22, 46, 92,232,243,153, 82, 37,128,226,183,140,131, 7, 15,122,123, 9,218, 29, 19, 78, 12,128,164,115,189, +167,175,149, 11, 27,204,230,228,176, 91, 95, 66, 68, 47, 98, 69, 26,141, 70, 16, 66,176,114,229,202, 64,231, 17,201,249,187,123, +118,199,225,138,143, 80, 86,241, 79, 92,170,250, 31,148,255, 57, 3, 91,159, 78,235,212, 23,237,240,247, 71, 90, 73,254,200, 17, +247, 58,112,121, 93, 88,206, 17,209,117, 34, 10, 82,234,227,248,241,227,152, 55,111, 30, 2,146,191, 8,133,241,254,251,119,135, +170, 56,250,197, 67,186,219,154, 51, 50, 50, 52, 15,233,110, 11,153,216, 61, 22,126,160, 37,100,235, 31, 0,210,210,220,179,242, +165,165,229,163,176,176, 28,122,253, 80,232,245, 67,219,116, 13, 4,253, 94, 55,108, 72,158,253,252, 35,228,119,127,152,143,151, +103, 46,197,109,241,183, 99, 72,247, 33, 24,210,107, 8, 70,197,221,130, 63, 76,249,125,209, 75, 47, 44,195,222,234,175,173,107, +214,172, 17,245,109, 95,184,112,161,205,114,199, 72, 27, 54, 47,254, 10,179,103,207, 38,194, 37,156,250,209,233,116,178,214,183, +220,242, 58, 18, 11, 23, 46, 76,150, 67,134, 12,114,250, 0, 24, 15,224, 37, 0,107, 1, 20, 1, 48, 1,248, 47,207,114, 19,165, +125,223,228,239,175,172,141, 7,192,104, 52,146,138,138, 10, 0, 64, 98, 98, 34,132,147,205, 88, 44,150, 54,219,222,251, 3, 89, +236,213,213,213, 86,139,197, 34,218, 19, 16, 76, 89, 16, 90,245, 79,123, 82, 97,122, 91,250, 82, 93,236, 57, 57, 57, 65,143, 41, + 46, 22, 53,183, 58, 49, 24, 12, 88,185,114,165,207,157,203,150, 45,131,201,100,130,209,104,244,123,140, 47, 12, 78,184, 30,167, + 47,213, 97,235,211,105,232,195, 76, 66,249, 59, 47, 34,241,225, 68,124, 94, 94,131, 89, 43, 55,117,234,203, 54,230,150,209,173, +235,163, 71,143,110, 83,206,123, 6,132,229,114, 91,246, 65,200,141, 24, 12, 6,204,155, 55,207,231,206,205,155, 55,195,100, 50, + 65, 55,233, 86,236,254,234, 59, 32,182, 27, 80,223,120,197,159,225,174,221,223, 70, 3, 57,216,181,251, 91, 89,228,157,251,115, +159,128, 4,211,127, 73,141,168, 15, 68,232,250,207,200, 40,130, 94, 63,180,245,151,135, 94, 63, 84,116,151,192, 59, 31,190,131, + 21,111,255, 9,247, 12, 79,134,171,165, 5,172,139, 5,163, 98, 0, 40, 65,192,225,220,249, 42,140,236,119, 19, 94,126,250,101, +252,105,213,159, 68,121,163,188, 27,182,148, 65,155, 1, 0, 91,182,108,105,115,238,236,217,179,137,119,153, 88,178,222,245,202, +110, 60, 4, 29,217,189,123,119,216, 94, 5,157, 78, 71, 86,173, 90, 5, 0,178,200,235, 72,226,175,171,171,227,189,101, 97, 93, +103, 93, 93, 29,223,166,135, 42, 39, 6,192,191, 1,248, 14,192,251, 0,166, 2,120, 16,192,239,225,158, 21, 18, 0, 46, 80,234, +111,139, 12,163,155, 99,114, 76,203,130, 91,241, 38,147,137,177, 88, 44,140,197, 98, 97, 42, 42, 42,192,175,243, 46,101,225,182, +175,253,254,192, 43, 21, 89, 89, 89,214,234,234,106,171, 47, 5, 65,184, 29, 36, 85,174, 47,171, 38,208,246, 21,255,192, 62,254, +248, 99,159,196,207, 48, 76, 59,242, 95,182,108,153, 40,153,191, 86, 84,162,241,189,197,152,181, 33, 31,131, 19,174, 71,255, 62, + 81,168,216, 86,225, 38,255,158,221,221, 7, 69, 40, 37, 95,171, 94,175,215, 6,218, 22, 3,142, 0,215, 69, 3,219, 51,129,184, + 72, 96, 84,175,203,110,255,248,110,192, 39, 25,151,203,165,130, 97, 24,159,139, 20,188,254,250,235, 62,137,127,228,200,145, 48, +153, 76, 88, 53, 47, 21, 71,202, 79, 97, 64,226, 64,160,169, 89,140,245, 15,145, 94, 0,209, 86, 94,193, 39,102,236,218,253,173, + 79, 75, 95,208,183, 47,233,198, 87,125, 64,252, 46,161,128, 39,125,254,215,161, 31, 38,233,252,102, 91, 51, 38,205,190,203,154, + 52,240, 14,180, 52, 53, 1, 74, 37, 84, 42, 21,148, 74, 37,148, 74, 21, 78,158, 60,137,173,219, 10, 78,219,157,205, 24, 18, 25, +143, 91, 39,143,155, 50,255,119,243, 37, 91,141,111,236,154,135, 7,140, 9,237,202,183,108,217,194, 72,245, 4,240,228,143, 33, +107,176,235,149,221, 97, 91,238, 58,157,142,172, 93,187, 22,163, 71,143,198,186,117,235,186,164, 39, 96,225,194,133,201,115,230, +204, 33,199,143, 31,183, 86, 85, 85,201, 34,175,170,170, 10, 85, 85, 85,225,120, 19,180, 0, 38, 3, 56, 4,224, 52,128, 1, 0, +126, 4,240, 11,128, 83,158,197, 6,138, 86,133,152, 39,127,225,186,183,178,124, 69,242, 0, 8,250, 94, 81, 81, 81,129,184,184, +184,118, 10, 2, 95,230, 75, 65, 16,217,184,134, 28,252,247,200, 35,143,116,216,189, 11,201,202,151,213,239,153, 56,136, 9, 70, + 22, 54, 84,162,241,225, 59, 64, 98, 95, 4,166,188,130, 70,124, 8,188,235,182, 22,137,229, 69, 68,252,251, 58,176,172,244, 68, +103,133,133,133, 37,194,231, 20, 36,247,186,111, 15,207,123,192,107, 27,128,235,175, 3,206,237, 80, 35,119,163, 3,243, 62,242, + 95, 46,201,188,151,121, 62,123, 97,176,223,153, 79, 86, 34,118,148, 6, 49,195,159,195,199, 43, 23, 96,236,232, 1,184, 49,245, + 79,162,234, 67,204,165,223,127,255,110,236,217,163, 19,211,151,207, 0, 32, 94,228,207,240,129,127,161,244,235,139,181,240,197, +192, 31,209, 23,121,121, 2,130,225, 76,245, 25, 60, 96,120, 0,177,221,123,193,197,176,248,242,139,127,160,161,177, 17,250,233, +211,113,190,186, 26,121,249, 91,241,212,147,243, 6, 71,106, 34,161, 32, 17,152,118,219,180,226, 31,173,235, 66,178, 26, 47, 93, +186, 20,246,125, 11,201, 31,128, 71, 9,120, 62,100, 79,128, 78,167, 35,203,151, 47,199,176, 97,238,231, 57,116,232, 80,116, 37, + 79,128,151,197, 47, 27, 4,214, 63,191, 30,202,189,222,236,249, 38, 35, 0, 68, 3, 24, 5,224, 24,128,193, 0,234, 1,212, 66, +254, 73,186,174,121, 92,177, 68, 64,113,113,113, 90,131,193,208,174, 43,192, 51,183, 61, 0,180,206,119, 47,149, 28, 66, 12,254, + 19,235,113, 8, 25,188,117,239,207,221, 47,214,250, 7,128, 79, 95, 90, 14,253,138, 55,193, 78,153, 4, 21,128,152,189, 39,240, +121,121, 13, 0,128,157,178, 8,206,239,251,130,233,247,123,201, 36, 21,128,144, 68,163,102,230,135, 88,244,228, 41,252,244,244, + 82, 52,237,113, 96, 64,223,192,229,161, 42, 80,225, 42, 7,155, 55,111,118,107,195,250,123,177,175,170, 26,177, 99, 99,113,186, +168, 28,208, 68, 34,109,209,191,163,247,117,169,157,249, 45,250,139,250, 15,169, 78, 2,120, 17,124,121, 31, 2,202, 46,202, 40, +194,180,156,105, 72,203, 7, 50,138,220,235, 69, 25, 69,173,202,129,186,240,132,168,107,104,180, 55,160,111, 84, 31,176,246,102, + 16, 5,193,237, 19, 39, 98,219,182,109,246,181,111,190,169,225, 8,193, 99,143, 63,134,222,125,122,163,185,177, 17,172,139, 69, +108, 68,119, 56, 21,206,144,238,183,182,182,182,205,232, 0,169, 1,129,237,200,159, 71,136, 74,128, 78,167, 35, 70,163, 17, 19, + 39, 78,108, 83, 62,122,244,104,188,241,198, 27,157,170, 4,116, 20,241,243,178,133,114,121, 47, 64, 8, 83, 5,127, 3,224,160, +135,236, 31, 4,240, 0,128, 50, 0, 99, 0, 20, 0,216, 4,192, 9,138,176, 20, 0,226, 69,138, 68,226,254,128, 72, 76, 76,108, + 37,253,164,164, 36, 45, 31, 27,192,123, 7, 18, 19, 19,173,124,119, 65,103, 53,188,114, 34, 88, 95,191,192,250, 15,138, 89, 27, +242, 65,166, 39,224,220,157,183,161, 15, 38, 33, 42,109, 29,216, 51,231,129,158,221,161,170,249, 16, 59,214,150, 2, 74,101, 40, +247, 30,182,214,124,232,133,127,195,132,113, 64,226,162, 35, 24, 21,243, 36,126,188,193, 0,252,239, 82,191,229,157,229, 1, 48, +153, 76,184,231,246, 27, 49,101,210, 8,232,111, 89,138,236,181,235,113,172,244, 52,158,190,111, 2,206, 22,236, 66,221,165,122, +185,222,135, 54, 93, 5, 30, 47, 64, 80,130, 22, 18,190,156,228,239, 71,166, 40, 84, 86, 86, 50,241,241,241,196, 19,255,215,170, + 16, 0,192,180,156,105, 80, 23,158, 64, 97, 97,121,235, 72,128,192, 1,129, 12, 56,142,131,139, 3, 8,199, 34, 50, 74,131,199, +159,120, 66,243,218,171,175,162,127,255,254,220,224, 1, 3, 20,246,166, 70,184, 8, 64, 56, 23, 56, 46,184, 71, 43, 55, 55,151, +153, 58,117, 42,169,169,169, 65,125,125,125, 27,197,209,107,116,128,232, 81, 1, 58,157,142,100, 47, 56, 10,104,134, 1,103,223, +110,127,128,102, 24,178, 23, 28, 5, 68, 42, 1, 58,157,142,204,152, 49, 67, 59,122,244,104,107, 77, 77, 77,187,253,241,241,241, +152, 49, 99,134, 22, 93, 60, 38, 32, 92,235, 63, 76, 47,128, 80, 97, 24, 8,119, 87,192,195, 0,154, 64, 33,155, 2, 32, 37, 17, +144,175,253, 62, 97, 48, 24,124,122, 1,120,178,143,139,139,211, 26,141, 70,171,135, 16, 97, 48, 24, 2, 6, 21, 6,178, 14, 67, + 24, 95,223, 33,195, 0,121,235, 62, 80, 48,160, 20,148,255, 57, 3, 17,105,235, 96,171,250, 9,170,189,235,224,204, 95, 4,230, +161,213,216,254,251,116,252,178,253, 36,244,171,222, 7, 84,157,147,217,121,169, 5, 40, 90,181, 13,163,126,153, 6, 92,104,194, +146,169, 75, 3,150,203,225, 1, 8,213,250, 47,216,182, 28,202,193, 55, 35, 6, 35, 80,249, 69, 14, 26, 24,130,127,253,116, 10, + 83,142,156, 22,117, 57,123,246,232,252,146, 61, 0,120,246,251, 60, 78, 44,249,251,121, 71,195, 34,134,112,114, 0,240,200, 40, +186, 76,252, 0,218, 89,254,124,192, 96, 97, 97,185,207,243, 99,163, 98, 81, 85, 87,133,137, 67,238,128,173,197, 14,216,236, 96, + 29, 78,188,108, 52,130, 81, 64,209,220,212, 8,142,115,129,117, 17, 68,170, 34,112,190,241, 60, 34, 92,193, 71, 27,127,254,249, +231,173,247, 54,119,238, 92,194,183, 55, 23, 46, 92,142, 9, 59,115,230,140,232,251,116,147,176, 91, 9, 24,153,208,254,255,143, +159,116, 32,235,221, 81, 16, 75,214,158,227,200,196,137, 19, 17, 31, 31,223,110,255,145, 35, 71, 80, 80, 80, 96,237, 44,242,247, + 88,227, 12,239, 9,144,163,223,223,151,245, 47,131, 23,128,199, 3, 30,133,160,133, 82,184,188, 10, 64,135,128,183,252, 1, 32, + 41, 41, 73,107,177, 88,172,188,235,223,143,114,160, 45, 43, 43, 11, 22, 11,192,200,101,205, 75, 33, 19,177, 10, 6,111,253,251, + 34,126, 94,209,145,114,189,135,202,107,224,252,254, 53,156,195, 87, 24,240,208,106,160,174, 30,229, 57, 47, 98,232,194, 53, 56, +187,233, 69, 32, 66, 5, 40, 58, 39,179,115,101, 19, 48, 50,238, 97,209,229,157,225, 1, 48,153, 76,141,179,167,220,113,166, 7, +215,235,250,102, 68,104,242,215, 44,194, 95,118, 28,196,146, 7,239,198,188, 55, 63, 64,250,127,255, 95,135,122,131, 2,221, 98, +193, 39,102,120,146, 0, 49,225, 42,167,225,184,250, 3,121, 1, 50,138,138,136, 47,242, 23, 90,255,193, 48, 40,110, 16, 62,253, +178, 8,119, 93,127, 23,162,187,197,128,227, 8, 20,132, 5,199, 48, 32,132,192, 69, 0,150, 35, 96, 89, 22,182,186, 38,236,220, +191, 19,106,151, 90,114, 80,170,119,160,211,127, 44,154,132,148, 65, 21, 96, 62, 19, 47,195,159, 18, 32,149,252,189,149,128, 85, +171, 86, 97,224,192,129,151, 21,251,242,114,152, 76, 38,116, 5,203, 95,110, 69,192,151,245, 31,166, 23, 0, 0,146, 1,220, 0, +224,143,184, 60,241, 19, 69, 87, 86, 0,226,226,226,180,222, 30, 1,190,223, 93,168, 28, 8,215,195,180,224, 37,191, 88, 50, 14, + 3,244,105,253,135, 74,252, 60,102,173,220,132,173, 0, 30, 92,145, 2, 98,121, 17,204, 35,217, 56, 84, 94, 3,166,119, 47,156, +248,181,222,109,253, 75,239, 2,144, 5, 71,142, 28,105, 29,242, 39,102, 93, 14, 15,128, 20,229, 96,243,230,205, 14, 0, 13, 11, +146,199,212, 63,183,250,127, 28, 47,189,108,180,247,235, 30, 87,115,244, 88,101,255,121,199, 62,136,233, 36,226, 23, 67,206,194, + 46, 26,209, 94,128,142, 74, 6,228,139,252,121,203, 31, 64,208,128,192,197,139, 23, 51,119,221,127,215,116,235,164,146, 2,195, + 45,233,168,183,215,131, 81, 0,238,193, 72, 28, 92, 46, 2,142,101,209, 45, 50, 22, 95,215,125,135,178,189, 39,144,103,206, 43, + 9,251,194,203,127, 7, 64,250, 48,192, 54, 74,192,192, 74, 28, 63, 19, 31, 18,249,123, 43, 1,235,214,173, 67,207,158, 61, 81, + 83, 83,131,229,203,151,163,171,185,253,229, 80, 4,252, 89,255, 33,122, 1,250,195, 29,245,175, 0,112, 43,128, 44, 0,229,148, +190,101, 86, 0, 58, 42, 15,128, 63,143, 64,118,118,182,214, 91, 81, 48, 24, 12,146, 19, 6, 9,137,160, 43,164,216, 21, 90,255, + 66,226, 55, 26,141,124,183,135,240,185,138,190, 96, 94, 9,120,120,197,123, 32,249, 64,223,121,102,148, 60,151,142,187, 77,127, + 3, 34, 34,208, 77,163,238,148,251, 21,142,241,247,181, 30, 98, 30, 0, 22,128,194, 83,183,138, 48,235,227,220,236, 41,119, 84, + 61,151, 83,152,240,242, 83, 15,116, 31, 52, 32,217, 1,224,176,193, 96,232, 1,247,248,226,144,234,131,127,229,246,236,209,241, + 17,255,161, 40,119, 76, 48, 11, 94, 10,161,203,225,234,151, 2,111,210,231, 61, 2,189,123,247,246,169,157,125,189,231,235,237, +241, 55, 93, 15,215,108,246,240,228,235, 39,143,233, 19,219, 7,118,167, 29,132, 16,168, 85,106,212,218,154,177,239,215, 61,216, +252,215, 92,104,111,214,106,243,144, 23,246, 53,190,177,107, 30,114,115,115, 81, 86, 38, 61, 7,192,101, 37, 0, 97,145,191, 80, +222,162, 69,139,200,170, 85,171,176,116,233, 82,116,229, 62,127,161, 34, 80, 82, 82, 18,210,185,129,142,145, 32,115, 6,220,227, +253,237, 0, 94, 0,176, 31,128,139,210,183,111,140, 27, 55, 14, 7, 15, 30, 68,142,105, 89,187, 60, 0,222,217, 0, 85, 94, 13, +101,192, 62,126,225,182,247,126, 41,147, 17, 4, 34,250, 16,189, 0, 97,161,163,134, 1,242,202,136,217,108, 70,113,113, 49, 87, + 81, 81, 33, 36, 50,173,197, 98,145,108,221,204, 90,185, 9, 16, 36,254,153,252,242,134,214,245, 78,138,134, 9,218,128,113, 36, +164,103,183, 22,192, 69,184,135,255, 60, 30,230, 53,158, 93,144, 60,166,101,106,241, 55,221, 31,123,245,125,152,205,102,117,113, +113,241, 64,180, 77,103, 29, 82,125,116,180, 39, 32, 88,126,255,160, 45,103, 7,116, 9,248, 35,127,135,126, 24, 80, 24,220, 48, +251,232,237, 45, 76, 55,101, 12,217, 27,191, 15,147,238,152,132,193,177,131, 1,142,224,188,189, 6, 95,127,251, 53,206, 30, 61, +139,251, 70,222,167,125,246,217,103, 59,189, 62,132, 74,128, 92,100,205,123, 2,174,150,128,191, 48,250,234,229, 66,142,103,161, +144,250,224, 76,203,196,123, 0, 58, 10, 89, 89, 89, 62,201,222,107, 38, 54, 33,172,190,242, 22, 7, 35,218, 80,209, 17,195, 0, + 77, 38, 19,204,102, 51, 91, 92, 92,172,242,116, 29,240,228,127, 95,128,251,246, 9,207,100, 74, 29,145, 74,153, 4, 40,239,148, +198,201,108, 54, 71,122,222,203, 87, 60, 69,174,204,204,204, 39,194, 20, 27, 57,245,143,239,148,154,205,230,123,139,139,139, 81, + 92, 92,108, 7,160,241, 44,114, 16, 63, 35,114,188,191,100,146,246,236,111, 83, 95, 82,137, 91,142, 46,129,202,202, 74,166, 40, +163,136, 12, 90, 52, 72,139, 33,190,143,169,202, 40,178,138,141, 7,216,248,214, 70,102,205,154, 53,201,155, 86,108, 66,252,176, + 27,172, 0,240,227,145, 31,180,169, 83,245, 88,187,126,109,201, 71,248, 40,164,235,204,205,205,101, 30,120,224,129,118,163, 2, +156,206,240, 70,136,201, 77,214,215, 90,180, 63, 69,215,244, 2,120,151,137, 86, 0,130, 89,226, 18, 44,245, 80, 95,116,210,193, +242,229, 58,223,167, 60,131,193, 64,138,139,139, 85,194,231, 37,244,176, 72, 84, 80, 74, 58,136,144,187, 98, 35, 20, 11,160, 17, + 32, 4,238,196,252, 81, 8,111,124, 47, 95, 31, 63, 23, 23, 23,243,227,202,234, 19, 19, 19,251,153, 76,166,200,174,240, 44, 59, +210,109, 47,167,236,202,202, 74,166,114, 73,165,108,207,224,249,231,159, 47,241, 62,239,235,191,239, 13,251, 58, 63,251,236, 51, + 74,174, 20, 84, 9, 16, 97, 68, 51,161,206, 35, 76, 65, 65, 65, 65, 65, 65,113,245, 66, 65, 31, 1, 5, 5, 5, 5, 5, 5, 85, + 0, 40, 40, 40, 40, 40, 40, 40,126, 3,248,127, 37, 93,196,116, 64, 61,103,188, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, +}; + diff --git a/source/blender/editors/datafiles/splash.jpg.c b/source/blender/editors/datafiles/splash.jpg.c new file mode 100644 index 00000000000..c1ca8b575e6 --- /dev/null +++ b/source/blender/editors/datafiles/splash.jpg.c @@ -0,0 +1,2483 @@ +/* DataToC output of file */ + +int datatoc_splash_jpg_size= 79258; +char datatoc_splash_jpg[]= { +255,216,255,224, 0, 16, 74, 70, 73, 70, 0, 1, 1, 1, 0, 72, 0, 72, 0, 0,255,225, 0, 22, 69,120, +105,102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,255,219, 0, 67, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,255,219, 0, 67, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,255,192, 0, 17, + 8, 1, 15, 1,245, 3, 1, 34, 0, 2, 17, 1, 3, 17, 1,255,196, 0, 31, 0, 0, 1, 3, 5, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 7, 10, 3, 5, 6, 8, 9, 2, 1, 11,255,196, 0,103, 16, 0, 1, 3, 3, 2, 4, 3, 4, 6, 4, 7, + 11, 5, 9, 13, 9, 1, 2, 3, 4, 5, 6, 17, 0, 7, 8, 18, 33, 49, 19, 65, 81, 9, 20, 34, 97, 10, 21,113,129,145,240, 35, + 50,161,193, 22, 23, 24, 66,177,209,225, 25, 26, 36, 40, 51, 56, 73, 82, 98,232,241, 72,104,105,136,168, 41, 52, 57, 67, 84, 88, +120,150,178, 37, 38, 68, 83, 87,115,130,135,147,152,181,200,210, 54, 89, 99,114,146,184,213,214,215,255,196, 0, 29, 1, 0, 0, + 6, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5, 6, 7, 1, 4, 8, 9,255,196, 0, 80, 17, 0, 2, 1, + 2, 4, 4, 3, 4, 6, 7, 5, 7, 0, 7, 9, 0, 1, 2, 3, 4, 17, 0, 5, 18, 33, 6, 19, 49, 65, 7, 34, 81, 20, 97,113, +240, 8, 35, 50,129,161,209, 21, 66, 82,145,177,193,210, 36, 51, 98,162,225, 9, 67, 83, 84,114,130,241, 52, 56, 68, 85,116,148, +211, 22, 23, 24,115,131,146,147,180,181,255,218, 0, 12, 3, 1, 0, 2, 17, 3, 17, 0, 63, 0,159,198,150,150,150,134, 6, 22, +150,150,190,100,122,143,199, 67, 3, 31,116,203,220, 60, 68,108,181,171,123, 70,219,170,254,224,209, 41,183,140,167, 25,101, 20, +135,189,241, 73,101,249, 28,165,136,243,170, 77, 69, 84, 74,116,149,133,163,149,185, 15,180,226,185,211,132,158, 97,151,159, 35, +212,126, 35, 92,108,227, 63,131, 43,145, 85,251,143,120, 54,213, 18,235,236, 86, 37,191, 87,185,237,148,243, 72,170, 67,146,224, + 11,147, 81,162,128, 57,167, 69, 42, 5, 75,143,213,230,242, 75, 94, 34, 50,148, 86,158, 42,113, 39, 27,112,159, 14, 38,119,193, + 60, 55, 23, 19,212, 81,204,173, 89, 4,134, 67, 34,209,128,198, 87,130, 56,138,188,146, 2, 0,242,151, 49,169, 50,114,101, 1, +128,179,188, 40,225,158, 7,226,222, 37,108,143,142, 56,150,110, 23,166,172,133,150,142,120,196, 98, 54,173, 44,162, 36,158, 73, + 85,146, 56,200, 44,124,193, 4,140, 4,124,232,139, 41, 61,145,109,196, 58,132,173,181, 37,104, 80,200, 82, 72, 32,131,243, 26, +247,174, 11,240,211,199, 61,219,180,206, 66,179, 55, 36, 79,186,108,118, 29, 68, 54,166, 58, 92,122,228,181,217, 65, 13, 22,219, + 47, 30,106,157, 61,174, 95,242, 14, 16,243, 97, 37, 45, 44,128,150,181,219,219, 46,247,181,247, 6,129, 2,231,180, 43, 48,171, +148,106,139, 65,216,211, 33, 58, 29, 65,232, 57,219,113, 63,172,203,233, 86, 66,219, 88, 74,208,160, 66,146, 14,147,240,211,197, +174, 19,241, 67, 46, 53, 25, 37, 79,179,102,180,202, 13, 86, 95, 49, 2,166,156,244, 38,219, 9, 97,213,178,207, 29,212,220, 7, + 17,201,120,194,158, 38,248, 69,197,190, 22,102, 66,159, 60,166,246,156,166,165,136,165,204, 33, 4,210,212,142,160, 95,115, 12, +218,119,104, 36,179, 11, 18,134, 72,237, 33,202,244,180,180,181,103,226,173,194,210,210,210,208,192,194,210,210,210,208,192,194, +210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210, +215, 13,125,163,254,220, 13,158,224,130,240,159,178,214, 5,156,238,249,111,173, 45,150, 21,116, 81,219,173,155,110,200,219,199, + 39,194, 98,116, 8,215, 53,192,138,116,167,170,213,245, 68,151, 17,255, 0,171, 32,177,132, 50,233, 76,186,132, 39,249, 26, 91, +214, 67,195,217,207, 19,102, 9,149,228,116, 47, 95, 90,224,177, 85, 42,161, 80, 16, 11,200,238, 85, 35, 64, 72, 5,157,128,185, + 10, 46,204, 1, 98,226, 46, 38,200,248, 79, 45,124,219,136, 51, 20,203,104, 81,130, 6, 96,204,206,237,114,169, 28,104, 26, 73, + 28,128, 78,148, 86, 58, 85,152,128,170,196,119, 43, 75, 80,124, 63, 73,159,141,131, 84, 83,195,103, 56, 94, 20, 82,242,212,138, +127,240,103,117, 13, 77, 44, 20,171,195,105, 85,127,227,115,194, 91,193,101, 37, 75, 16,146, 20, 1, 1,180,147,204, 58,247,192, + 39,183,219,102,184,168,189,173,253,156,222,171, 32,236, 38,233,221, 18,227,210,109, 58,154,110, 6,238, 13,182,188,107,111,132, +162, 53, 29,138,204,184,113, 36,218,181,233,114, 84, 26,131, 10, 91, 82, 88,144,233, 68,118,234,107,152,244,120,206,205,115,175, + 7,248,243, 35,161,151, 49,169,202, 86,166,150,157, 75,200,105,230,142,102,141, 64,185,102,140, 17, 33, 10, 55, 98,138,225, 64, + 44,108,160,156, 64,178, 47, 27,188, 58,226, 12,194, 28,174,151, 57,106, 90,186,150, 9, 16,169,134, 72, 82, 71, 38,202,171, 35, + 3, 26,179, 27, 5, 18, 50, 22, 36, 42,130,196, 12, 72, 35, 75, 94, 80,180,173, 41, 90, 8, 82, 84, 1, 73, 29, 65, 7,204, 29, +122,213, 97,139,107, 11, 75, 75, 94, 29,117,182, 91,113,231,156, 67, 76,180,133, 56,235,174, 41, 40,109,182,208,146,165,184,226, +212, 64, 66, 2, 65, 36,147,128, 6, 78,134, 6, 61,233,107,140, 28, 63,123, 94,236,238, 39,253,160,119,151, 9,219, 61,108,210, + 43,219, 63,103, 88,247, 29, 77,157,231, 77, 86, 91,178,239, 43,178,215,171, 80,169,213, 69,219, 84,214,227,166, 57,178,252,106, +195,236,197,150, 92,117, 83,126,173,247,214, 23,238,178, 89, 3,231,181,219,218,129,127,123, 56, 15, 15,137,177,182,194,209,220, +115,188,169,221, 85, 85, 13,213, 86,172,210,254,165,254, 47, 78,219,136, 94,225,245, 74, 79,188,123,199,240,222, 95,139,226,126, +167,184,183,201,250,202,212,182, 30, 7,226,105,179,220,183,134,191, 71,242,179,156,218, 1, 81, 12, 50, 72,136,121, 70, 41, 38, + 5,203, 48, 17,183, 46, 39, 37, 28,171,130, 52,149, 12,109,136, 92,222, 32,240,164, 60, 61,154,241, 87,233, 46,118, 69,147, 78, +105,167,158, 56,228,145,121,162,104,160, 34, 48,170, 90, 84,230,202,138, 36,140, 50, 48, 58,149,138,139,227,180, 26, 90,134, 23, +247,207,155,251,255, 0,155, 30,209,127,235, 93,227,255, 0,232,210,254,249,243,127,127,243, 99,218, 47,253,107,188,127,253, 26, +152,127,247, 29,226, 55,254,233,139,255, 0,155,166,255, 0,234, 98, 19,255, 0,226, 11,194,239,253,245, 55,255, 0, 37, 87,255, + 0,210,196,207,116,181,166,252, 3,241, 57, 89,226,255, 0,133,157,171,223,235,138,219,165,218, 85,203,250,153, 89,157, 81,183, +232,178,101,204,165,211,157,166, 93, 53,202, 3,109,195,147, 56,120,175, 33,108, 82,154,113, 69,125, 66,221, 80, 29, 0,214,228, +106,172,174,163,168,203,171,107, 50,250,180, 17,213, 80, 75, 36, 50,168, 33,128,146, 39, 40,224, 48, 36, 16, 25, 72,184, 36, 30, +160,219, 22,246, 95, 93, 77,154, 80, 80,230, 84,110,100,163,204, 97,138,120,152,130,165,163,153, 22, 68, 37, 88, 6, 82, 85,129, + 32,128, 71, 66, 47,133,165,165,165,173, 92,110, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105, +105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,107, + 3,168,110, 45, 6, 60,249,116,122, 75, 21,123,182,183, 5,239,118,155, 75,181, 41,174, 85, 12, 9, 92,174,168,197,170, 85,150, +166,169,212,105, 67,194, 32,183, 54,108,117,130,164,229, 32, 40, 29, 12, 12,103,154, 90,104,166,239, 21, 38,143, 91,167,219,119, + 13,169,123,209, 43,245,152, 83, 39,208,233, 9,165, 83, 46,121,213,134, 41,225,159,126, 83, 12, 88,181,170,177,130,134,188, 97, +151, 38,251,171, 42,228, 95, 35,139,228, 86, 47,143, 95, 53, 54,130,157,111,109,119, 6, 76, 70,208, 28,118, 91, 44, 90, 40, 45, +183,221,106, 77, 58, 85,222,220,217, 43, 74,114, 75,108,197,113,213, 99,149,182,214,178, 18, 70, 6, 28, 29, 45, 88,232, 23, 37, + 18,231,136,236,202, 36,244, 76,110, 60,135, 33,205, 97, 77,191, 18,125, 54,115, 56, 47, 83,234,212,201,141, 55, 38,149, 80, 64, + 82, 10,216,146,211, 78,164, 45, 36,160, 5, 2,111,154, 24, 24, 90, 90, 90, 90, 24, 24, 90, 90, 90, 90, 24, 24, 99,120,143,168, +110,117, 51,103,174,233, 91, 65, 29,201, 23,200,138,203,116,255, 0,119,109,167,170, 12, 69,114, 67,104,169, 72,165, 50,240, 40, +118,166,136, 69,226,200, 32,144,175,137, 0,184, 17,174, 20, 60,223, 25, 18, 95,121,199,215,190,238, 72, 83,138, 83,202, 92,139, +187,156,186,165, 18,178,175,210,126,183, 54,117, 36,133, 36, 40, 16,160, 8, 61, 8, 35, 32,253,218,208,158, 40, 56,198,176, 54, + 85,185,246,165,163, 22,151,119,238,105, 66,153, 92, 54,212,151,168,214,187,171, 78, 67,245,249, 12, 43,244,179, 83,148,148,194, +109, 65,206,185,121,108,167,148, 47,157, 60,116,224,190, 27,204, 99,139,140, 56,175,196,124,203,131,114,188,170, 14, 66,193, 75, + 56, 17, 77, 38,167,144,114, 96,182,185, 42,165,190,146, 16, 51, 50, 70,132,233, 84,102,199, 72,120, 15,198,220, 77,151, 75, 55, + 7,112,151,134,185,103, 26,102,153,172,252,246,158,170, 2,101,134, 61, 49,198,121,211,223, 68,116,145, 17,172, 23,210,170,242, + 53,139, 51,170,227,143,215, 53,223,196,133,153,238,191,194,219,167,117,237,195, 59,196,247, 52,214,107,151, 20, 5,201, 13, 99, +196, 83, 45,200,148,149, 45, 41, 42, 0,144, 49,147,140,231, 88,195, 91,199,188,114, 93,109,134, 55, 39,112,100, 60,226,194, 90, +101,171,158,186,235,142, 44,159,133, 40,109, 50,201, 90,179,216, 0, 78,177,155,198,244,186,247, 18,225,151,114, 93,181,137,181, +218,221, 69,209,207, 34, 82,202,131,105, 39, 13, 68,134,194,112,136,145, 17,156, 33,166,210,148, 36,118, 25, 36,157,221,188, 47, + 45,145,246,104,112,186,239, 19, 59,221, 70, 93,217,123,214,159,133, 73,179,173, 8,106,140,213,106,227,187, 42,177, 94,153, 78, +181,233, 18, 37,182,177, 72,167,177, 22, 51,207,212,167,150,214, 25,110, 59,132, 37,229,170, 52,119,121, 7,194,159, 15,120,203, +198,222, 60,159,134,248, 23,136, 51,106,108,146, 23, 75,212, 85,212,201, 45, 66,164,141,162, 37, 49,195, 36, 81, 52,243,178,187, + 44, 97,214, 56,145, 92,188,204,177,150,110,196,241,107,196,110, 10,240, 51,128, 32,226,126, 62,225,252,162,167, 58,153, 28,251, + 61, 37, 52,112,211, 51, 70,161,230, 97, 36,209,203, 42,211,192,172,138,210, 20,105, 37,118,141, 82, 21,105, 2,174,163, 72,218, +189,222,170,162, 69,126, 85,135,123,206, 76,183, 23, 46, 77, 77,218, 13, 81,227, 33,199,137, 91,146, 29,120,199, 37,106, 82,148, + 73, 81,238, 73, 58,203,118, 91,127, 55, 47,135,155,149,114,173,233, 18, 19, 1,201, 8, 23, 5,159, 86, 18, 27,166,212,210,217, +229, 80,122, 50,192, 84, 10,130, 81,144,135,219, 1,196,246, 80, 91,101, 77,171,150, 85, 47,164,143,198, 35,151, 97,170, 81,118, +183, 97,169, 54,130, 37,133,179,102, 61,111, 92, 53, 14,120, 40, 95,195, 22, 93,192,171,133,185, 46, 62,166,176, 22,235, 65,161, +204, 74,144,218, 6, 18, 59,121,195,151, 16, 59, 31,237,121,225,250,232,188,108,251, 74, 62,216,241, 35,181,232,138,205,221,106, + 37,246,165,173,185,210, 97,201,126,152,244, 42,139,108,182,186,213,159, 85, 16,103, 34, 50,222,109, 50, 33,200,136,182, 92, 7, +194, 14,201,234,207, 16,126,128,222, 38,248, 71,147,143, 16,120, 59,138,106, 38,207, 50,127,174,217,162, 46,210, 29,204,124,216, +156,104,105,141,227, 9, 42, 77, 79, 51,176,134, 89, 64,146,237,200,222, 28,127,180, 43,194,191, 25, 51,195,225,207, 24,112,181, + 60, 89, 30,113,245, 32, 50,202, 17, 98, 29, 36, 17, 76,191, 88,176,139, 72,205, 19,193, 81, 10, 35, 77, 20, 76, 99, 32,118, 27, + 96,248,137,177,183,250,218, 21,123,106, 66,161,213,225, 37,166,235,214,228,213,160, 84,232,242,156, 78, 64,113, 41, 56,147, 13, +101, 43,240,159, 71,192,224, 65, 7,149,105, 90, 19,106,226, 39,139,222, 29,184, 78,110,198,145,196, 38,229, 82,246,206, 6,226, +214, 42, 20, 27, 86,171, 91,137, 84, 93, 38, 85, 78,151, 17,153,211, 89,157, 82,131, 5,214,105, 13,162, 43,237,171,196,148,182, + 91, 86, 72, 74,138,129, 26,224,102,199,110,133,115, 99,247, 86,135,116,199, 84,134, 26,129, 81,250,170,231,166, 5,148, 9,180, +119, 95, 17,234,144,223,108, 28, 41,230,185, 75,173,103, 33, 47,197, 65,236, 8, 56,167,210,118,170,198,173,240,251,194, 53, 82, + 35,168,126, 52,237,202,189, 36,178,235,106, 10,109,214,222,179,169,238, 54,226, 20, 58, 41, 37, 10, 4, 31, 67,171, 87,232,151, +199,112,248,245, 61, 22, 67,196,119,203,243,234, 9,141, 61,127,179,133, 66,234,105,230,150, 10,168,209,213,213, 57,175, 11,164, +177,216,133,120,223, 78,133,116, 11, 85,125, 48,120, 26,127,163,229, 30, 99,196, 92, 52, 23, 49,200,107, 97, 90,156,188, 84,150, +112,140, 42, 96,138,162,146, 87, 70, 70,147,148,147, 35,197, 32, 96, 89, 36,143, 86,182, 71, 38, 80,214, 61,247,102,238,101,169, + 68,190,118,250,231,162, 94, 86,117,203, 5,186,157, 2,229,183,106, 17,170,180, 90,196, 7, 74,146,220,186,125, 66, 35,138,110, + 83, 5, 72, 80,230, 66,136,202, 72,238, 8,214, 89,168, 64,112,175,237,189,221,253,134,225,159,102,120,123,225,163,133,105,251, +189, 82,218,155, 26, 53, 58,249,186, 43,172, 93, 53, 88,104,168, 59, 62,163, 61,244, 83, 40, 54, 52,101, 57, 18,156,216,146, 0, +149, 42, 82, 84,242,185,200,142,216, 71, 50,250, 53,193,103,210, 48,176, 55,151,114, 45,253,161,226,123,106,154,216,235,138,230, +171,179,111,210,175,154, 45,102, 69, 70,198, 98,189, 45,246,226, 66,166, 92,208, 43, 49,218,153,107, 54,228,197,120, 94,244,183, +101, 50,219,175, 32, 72, 17,218, 11,121, 61, 57,156,120, 63,198,153,119,233, 74,154,108,168,214, 80, 80, 73, 45,180,205, 3,212, +154,116,102,229,204,244,233, 33,144,107,140, 7,210, 20,181,143,217, 29,185,103, 35,241,187,128,243, 63,209, 20,149, 89,184,162, +204,179, 40,225, 7, 84, 53, 9, 74, 42, 93, 19,153, 2, 84,188, 98, 35,203,145,140,122,139,232,184,251,102,226,253,250,171,113, + 37,195,245, 6,251,107,107,171, 91,211,182, 52,173,200,122,165, 79,163, 51, 98,207,189,104, 17,110,183,106,213,101, 50,154, 93, + 53, 20, 39,167, 9, 42,157, 33, 82, 99,134, 90, 13,243,184, 95, 72, 64, 60,195, 47, 80, 32,128, 65, 4, 17,144, 71, 98, 53, 2, +158, 50, 84,211,191, 72, 26,128,243, 1, 10, 14,113, 65,195,147,232, 82, 80,159,137,193, 34,193, 91, 78,246,248,156, 5, 45,144, +174,224,164, 16,122, 13,118, 87,143, 15,111, 68, 62, 31,247, 89,238, 25,120, 83,218,134, 55,231,120,232,117, 24,214,189,203, 90, +170, 59, 86,145,107, 83,239, 39, 22, 24,122,204,183,168, 86,222, 39,222, 53,230, 36, 56,219, 82, 84,212,136,236,177, 41, 11,138, +145, 33,196, 56, 91, 91, 48,240,167, 51,118,225, 88,120,116,201,154,212,103,249,106,102, 51,243, 57,112,197, 76,172, 19, 86,169, + 89,130, 8,193,123, 6, 98, 25,182, 0, 19,182, 17,203, 60, 97,202,145, 56,190,163,137,196,121, 61, 47, 14,230,178,101,148,252, +190,100,210,213,186,151,211,162, 37, 82,237, 35, 4,185, 84, 5, 84, 92,179, 1,190, 36,133,165,168,139,220,190,218,255, 0,106, +111, 13,237, 80,239,190, 41,184, 29,183,169, 27, 89, 90,168, 69,138,228,225, 66,187,237, 23, 16,167,193,117, 20,246, 46, 35, 90, +169, 70,163, 85,156,101, 14,120, 77, 84, 34,149,172,182,172, 54, 74, 84, 7, 85, 46,223,109,143, 13, 22,231, 5,182, 47, 26,148, +171,102,247,187,237, 43,183,112,233,251, 83, 88,178, 40,166,138,205,225,100, 95, 50, 40, 85,218,228,250, 85,194,221, 66,123,108, +120, 76, 51, 65,115,145,214,150,161, 37,154,132, 89, 13, 39,195,116,242,177,215,248,105,197,180, 35, 47,120,168,226,205,105,243, + 57,189,158, 25,168,170, 33,169,137,167,177, 60,146,241,185, 8,246, 6,193,244,130, 65, 0,146, 8,196,131, 46,241, 91,131, 43, +206,100,147, 87, 77,147,212,229, 48,251, 76,240,215,211, 79, 73, 50,211,220, 14,112,142, 68, 5,227,187, 45,202,106, 32, 16, 72, + 0,223, 29,148,210,212, 92,183, 35,233, 31,162,243,160,209,233,124, 25,112,161,184,187,163,185, 51, 34, 63, 58,227,131,120, 83, +170,147,233,118,147, 44,202,113,150,152,250,163,111,196,153,119, 10,221,142, 27,116,188,153, 48,153, 96,159, 12,248,202, 37, 72, +198,248, 54,250, 69,151,109,251,190,214,214,200,241,107,178, 86,230,220,166,238,185, 96,217,113, 46,235, 45, 87, 21, 53,219, 86, +231,169,204, 77, 62,159, 26,239,181,110,153, 50, 30, 76, 37,212, 94,142,195,174,178,251, 78, 69, 46,135, 23, 29,196,133, 99,108, +248, 71,199,171, 65, 85, 94,249, 46,143, 99, 86,119,128,205, 7,180,136,210,247,113, 0,144,200, 87, 98, 84, 91, 83,129,116, 86, + 4, 95, 68,120,211,225,211,102, 52,121,116,121,233,147,219,157, 99,142,160, 83,212,123, 33,145,237,166, 51, 80, 99, 17,134,243, + 0,198,250, 99, 38,210, 50,144,109, 43, 29,120,113,198,217,109,199,157, 90, 91,105,164, 45,199, 28, 89, 9, 67,109,161, 37, 75, + 90,212,122, 37, 33, 32,146,124,128,215, 14,253,164,222,219,221,157,224, 86,233, 59, 61,101,218, 15,111, 86,249, 34,155, 14,165, + 92,161, 49, 88, 69, 18,210,176, 89,169,199,110,101, 41,155,170,176,220,103,222,151, 90,126, 19,172,190,154,124, 86,130,209, 30, + 75, 79, 63, 37,143, 17,182,220,230, 77,175,244,142, 56,132,142,220,122,222,253,112, 91,245, 86,205, 92,140,191, 79, 85,221,100, + 38,245,165, 74,102, 61, 69,151, 99,183, 46,153, 83,187,226,187, 77,174,184,128,224, 80,100, 59, 27,198, 13,148,165,214,201,230, + 8,229, 94, 22,113,190,113,150, 83,230,244,153, 69,168,170,198,168,121,147, 65, 20,147,169, 23, 6, 24,228,145, 93,245, 13,211, + 97,172, 88,173,193, 4,175,156,120,191,192, 25, 38,109, 81,146,214,231,119,174,163, 58,103,229, 65, 81, 52, 84,237,123, 17, 52, +177, 70,232,133, 78,207,185,229,155,135,210, 65, 2, 71,219, 95,199,191, 8,187,217,187,147,118, 59,104, 55,194,208,220,189,198, +166,208,234, 87, 13, 70,153,102, 59, 46,189, 76,133, 76,164,205,137, 79,158,183,238, 88, 81, 85, 78, 18, 91,151, 54, 58, 11, 41, +148,167, 73, 89, 33, 4, 37, 68,109,254,160, 19,244,127,110,123,126,214,227,115,113,175, 26,237, 82, 45, 14,212,183,182, 43,113, + 46, 74,213,102,160,164,196,131, 73,183,233, 85,139,126,167, 62,165, 57,121, 34, 52, 86, 32, 48,235,174, 30,161, 9,104,247,198, +186,103,185, 63, 72, 83,125,183,147,120, 38,237, 23,179,215,133,198,183, 45,182,164, 77, 98,145,112,222, 16,174, 10,229,197,113, +192,167, 58, 82,245,199, 30,212,183,230, 68,102,215,162, 45, 1, 42, 11,168, 75,116,161,181,165, 79,248, 14, 57,225, 53, 36,226, + 95, 8,115, 26, 94, 38,172,201,120,104, 61, 93, 6, 89, 75, 4,245, 53,117,114,195, 4, 81, 25, 67,146,100,145,185,104,163,202, + 74,160,212,224, 2, 73, 32, 18, 34,220, 41,227, 94, 89, 89,194,148, 57,247, 21,178, 81,102, 57,181,101, 69, 61, 45, 29, 20, 83, +212, 77, 48,132,160, 2, 56,151,153, 35,155,184, 12,231, 66, 18, 85, 64, 4,128,101,135,165,168,156,219,158,223, 30, 44,184,114, +221, 75,123,111,253,161,252, 36, 55,183,244, 42,247,131, 37,117,235, 78,155, 93,160, 92, 80,232,239,201, 68,119,171,244,186,109, +102,169, 54,159,121,211,227, 40, 44, 58,212, 57,113,220,230, 73, 71,139,226, 0,218,186, 89,198, 87,182,211,135, 30, 14,235, 27, + 75, 6,163,102,223, 59,171, 70,222, 93,176,167,238,197,161,117, 88, 18, 40, 31, 82,200,182,106,181, 25,180,248, 5, 70,177, 61, +135,125,225,126,226,183, 10,124, 49,200,151, 18,149,128,224, 82, 83, 20,171,240,211,140,105,171,114,250, 40,178,177,152,182,106, +143, 37, 52,148,179, 67, 60, 19,172, 66,242, 24,230, 71,208, 74, 13,202,146, 26,219,128, 70,248,152,209,120,173,192,245,116, 57, +149,124,217,177,202,215, 39,120,227,171,138,178, 9,169,234, 41,218, 83,166, 46,100, 14,156,192, 28,236, 25, 67, 45,246, 36, 29, +177,217,173,112,163,112,253,133, 28, 55, 95,188,105,212,248,162,173,202,171,215,108,187,186,163, 93,190, 47,125,152,175,202,157, + 87,160,214,183, 90,175, 85,141, 82,118,228,122,179, 46,114,165,201,181,228, 73,126,179, 50,101, 17,245, 57, 25,115, 93,105,180, + 56, 41, 5,116,160,202,240,191,237,190,220,158, 50,248,231,219, 77,158,218, 29,130,147,111,112,189, 93,145,119,193,184,247, 10, +229,165,214,170, 87,151,189,209,182,206,237,185,233,142,205,168,210,100,170,143,106, 52,237,203, 71,166, 71,110, 59,134, 83,174, +180,249, 30, 48,117,228, 33,185, 31,161, 92,200, 74,187,115, 37, 42,199,166, 64, 58, 74,170, 30, 49,240,218,181,169, 26,169,242, + 74,252,226,140, 25, 82, 41, 81,156, 65, 43,200,129, 36, 40, 91,149, 48,104,217,133,136,150, 59,130, 25, 75, 17,133,169, 38,224, +127, 20,232, 22,181,105, 35,207,242,236,146,184,136,164,154, 23, 84, 53, 16,164,110, 94, 33, 32, 83, 44, 44,178,170,155,131, 20, +182, 33,149,130,131,134,126,151,176,123, 71, 74,180, 27,176,226,237,253,162,205,158,136,126,226, 45,102,173,218, 59, 86,224,136, + 80, 27, 49, 69, 13,184, 98, 40,143,200, 0,228, 13,114,224, 99, 24,212, 4,189,180, 92, 57,109,223, 10,156,122, 93,182,174,205, +192,141,105,218,119, 45,169,102,238,133, 50,218,161,145, 14,159,102,213,171,255, 0, 88, 69,169,211,168,140,199,193,165, 66, 53, +106, 19,243,227,176,217, 74, 34,138,178, 89,140,150,163, 54,195, 77,254,136, 21, 90,173, 54,133, 75,169, 86,235, 51,225,210,168, +244,120, 19, 42,149, 90,165, 66, 67, 81, 32, 83,105,180,248,238, 75,157, 62,108,183,214,148, 70,136,204, 86, 93,113,199, 22,160, +132, 33,181, 41, 68, 0, 78,191, 57, 62, 35,175,107,151,218,161,237, 50,184, 37,109,235, 50,196, 29,229,220,202, 77,141,183,190, + 43, 14,184,170, 30,215, 90, 80,163, 80, 97,220,243, 97, 43, 10,140,219,118,133, 14,117,126,160,198, 73,109,217, 50,144,146,162, + 19,155, 39,192, 39,174,139, 62,226, 12,218,122,167,135, 34,160,161,145,235, 29,217,140, 69,217,213,208,184, 38,197,194, 71, 52, +154,236, 88, 42,184,189,156,131, 86,125, 35,211, 47,155,135,120,111, 38,167,164, 73,184,135, 50,204, 35,142,133, 17, 84, 74, 17, + 81,146, 64,132, 0, 66, 51,201, 4,122, 1, 10, 89,144,218,233,113, 61,206, 11,119, 14,189,187, 28, 40,240,239,185, 23, 75,138, +118,228,190,118, 83,107,110,250,243,171, 32,173,202,197,203, 99,208,235, 85, 53,168,134,209,146,102,205,124,159,129, 61, 79,234, +167,176,217,253, 55, 59, 75,100,210,182,231,110,237, 11, 38,133, 20, 65,162,218,246,245, 30,223,164, 66, 7,152, 68,165, 81,169, +241,233,212,232,193, 88, 25, 13,196,142,210,123, 15,213,211,141,170, 34,178, 72,102,172,170,154,158, 62, 77, 60,178, 59, 34,126, +202, 51, 18,171,255, 0,106,144, 62,236,116, 69, 12, 83,193, 69, 71, 5, 76,188,250,152, 98,141, 36,127,219,117, 64, 29,191,238, + 96, 79,223,133,168,165,123,119,125,170,238,209, 91,175,240, 39,195,117,192,235,151, 29, 77, 14, 81,120,135,190, 40, 15,243,187, + 74,135, 49, 41,105,123, 57,111, 76,138,162,181,214,165, 33,194, 46, 23, 26, 41, 49,152, 90, 40,225, 78, 63, 38,166,204, 61,237, +246,205,251, 82,224,240, 79,182,174,108,238,209, 85,161,203,226,135,116, 40,142,253, 82,227, 78, 37,255, 0,226,146,206,156,167, +161,191,184, 53, 54, 18, 8, 53,247,252, 41,108, 80, 99, 56, 82, 61,229,165,212,159, 75,177,161, 8,147,185, 93,236,136,246, 94, +213,106,214,149,199,198,255, 0, 17,212,217,179,238, 10,173,173,115,221, 27, 61, 64,185, 22,228,217,136, 85, 70,147, 62,106,247, + 98,229, 19,146,183,100,220, 18,214,234,221,164,120,203, 82,154,110, 66,170,174, 5,201,122, 11,177,110, 14, 3,225,236,179,135, +178,212,241, 23,140, 33,215, 71, 11,133,202,168,154,193,235,170,175,228,151, 73,191,212,196,192,178,146, 8, 37, 76,132, 21, 68, + 89,105, 31, 17,120,151, 54,226,108,214, 79, 12, 56, 34,126, 93,116,209,151,206, 43,214,229, 40, 41, 45,231,132, 50,145,245,242, +169, 10,202, 8, 32, 50,196, 8,105, 29,161,210,223,163,211,255, 0,132, 11,255, 0,169, 75,243,255, 0,199,236,141,116, 43,233, + 74,255, 0,148,224, 99,255, 0,154,226, 91,255, 0,107, 96, 53,207, 95,163,211,255, 0,132, 11,255, 0,169, 75,243,255, 0,199, +236,141,116, 43,233, 74,255, 0,148,224, 99,255, 0,154,226, 91,255, 0,107, 96, 53,106,102,159,250,197,112,231,255, 0, 5, 39, +255, 0,208,175,197, 59,147,255, 0,234,195,197, 95,252,124,127,255, 0,161,150,227,167,222,201,206, 30,246, 78,244,224, 27,134, +234,253,209,181,155,125, 93,172,206,219,232,206,205,170, 85,108,219,118,161, 80,150,239,214, 85, 36,151,101, 76,151, 78, 91,146, + 29,229, 74, 71, 50,212, 78, 0,235,174,142,127, 36,254, 28,127,249, 20,218,239,253, 65,181,127,255, 0, 21,168, 67,236,206,242, +251,107,106, 27, 11,183,118,135, 14,118,230,248,218,123, 35, 96,219, 49,169,246,138,246,239,108,225, 81, 63,132, 20,246, 12,185, + 95, 92,181,113, 85,232,203,170, 93,234,124,188,224,255, 0, 4,146,236, 21, 45,180,166, 60,100, 57,144,172,147,102,189,184,158, +209,254, 22,247, 41, 54,175, 17, 19,170,123,167, 72,160, 84, 35,193,188,246,187,121,108,216, 86,109,253, 75, 99,149,165,201, 68, + 43,134, 21, 2, 5, 86,143, 93, 49, 75,106,105, 85, 86,234, 49,190, 62,117, 68, 87,136, 87,168, 78,113,225, 63, 21,230,217,158, +127, 91,147,241, 53, 5,117, 75, 84,212,207,236, 81, 87, 72,103, 68,121,153,145, 24, 4,229,164,150,101, 82,174,202,138,219,115, + 58, 98,193,200,252,101,224,252,151, 41,225,202, 12,239,133, 51, 44,186,145, 41,105, 96,246,233,178,248,197, 59,201, 28, 17,171, +186,157,124,201, 35,186,179, 6, 68,121, 25, 70,174, 95,164,237,173, 75, 62,218,177,233, 17,168, 22,157, 22,153,111,209, 33, 37, +105,135, 73,163,193,139, 77,167, 68, 67,142,173,231, 17, 26, 20, 54,144,211, 9, 83,206, 56,178, 16,144, 10,156, 82,143, 82, 78, +178, 93, 49, 28, 53,113, 19,183, 28, 85,108,189,139,190,123, 87, 80,118,125,159,125,210, 5, 74, 19,114,219,105,138,157, 46, 99, + 18, 31,167,214, 40, 85,152,204,188,226, 34,214, 96, 85,226, 78,135, 45,180, 56,227,105,126, 18,252, 55, 93,108,161,197, 62,250, +231,250,168,106, 41,170,106, 41,234,227,104,170,224,119, 73, 85,193, 14,178, 43, 21,117,112,119, 12, 24, 16,215,222,247,190, 58, + 70,146,122, 90,170, 74,106,154, 41, 18,106, 58,136,209,225,120,200, 40,209, 58,134,141,144,141,138, 50,144, 84,141,172, 69,176, +180,180,180,180,134, 54, 48,180,180,180,180, 48, 48,180,180,181,192,111,104, 5,251,125, 80, 56,143,220,198, 45,253,213,169, 89, + 9,183, 54,167,110,238, 27,118, 11,123,151,122, 90, 50,220,172,139,138,158,153, 72,178, 45,251,125,102, 37,197,116, 63, 9, 82, + 82,182, 38, 6, 89, 68,111, 26, 95,138, 30,142,216, 47, 57, 30, 78,249,221, 99, 81,164,226, 6, 84, 47,168,169,111,215, 68,181, +129, 7,171,130, 78,246, 0,236, 78,216,215,169,168, 20,209,243, 10,234, 23,181,175,110,196,255, 0, 44,119,231, 75, 81,244,103, +138, 29,229,219,186,190,226, 38,204,169, 55,100, 67,220,238, 34,247, 45,250,213,217,125, 65,164,205,147,104,206,165,216,118, 61, + 94,129,106,212, 95,186,100,197,162, 91,207, 73,151, 86,156,153, 30, 59,169, 82,141, 53,244,196,109,181, 55,135,114,241,198,191, + 22, 21,107, 15,123,247, 58, 21,239,182, 80, 41,252, 61,195,225,246, 85, 90,221,164,217,177,110, 10,125,254,238,232, 42, 29, 18, +168, 34,221, 38,172, 62,174,129,245,162, 36,204, 82,163, 52,225, 82,101,134, 98,190,203,109, 37,110, 59,183, 5,230, 62, 70, 90, +152, 57,114,114,192, 44,206, 14,169, 36, 72,144, 16,168,246,213, 43,132, 6,228, 91,204,218, 84,223, 8, 12,198, 29,193, 70,184, +191, 64, 58, 0, 88,157,200,232,162,231,111,112,185,199,119, 52,181, 31,219,163,138, 13,215,187,247, 63,109,175,153, 87,125, 18, +185,126,217, 23,151, 19, 82,104,252, 60,211, 45,201, 52,233,150, 71,240, 34,193,174,162,217,167,220,143,211,222, 93, 66,233,145, + 84,147, 75,108,134,220, 72,230,113,130,136,203, 97, 74,115,194,187,218, 60,116,241, 71, 94,159,183, 22,253, 63,112, 54,166,175, + 63,117,119, 39,104,237,104,115,229, 80,109,233,245, 11, 49,235,225,117,154,109,106,149, 86,182, 45, 90,232,117,138, 91, 85, 35, + 79, 91,126,254,228,106,167, 37, 61,109,158, 66,226,214,144,220, 23,153, 8,213,214,162, 27,132,212,225,139,174,147,174, 69, 33, + 78,131,172, 1, 25,109,118, 10,194,252,179, 32, 1,136, 25,140, 58,136, 42,221,108, 45, 99,125,129,245,219,115,107,117, 29,237, +142,245,233,107,147,209,223,222, 43, 46,151,189,123,171, 87,168, 91,247, 45,193, 96,238,236,107, 86,163,184, 18,175, 13,204,135, + 26,223, 51,155,219,155,122,229,185,225,109, 4,121,171,160, 11, 66,149, 6,229,173, 86, 75, 18,101,144,211, 81, 94, 47, 30, 86, +130,245,116,153,197,253,205,104,175,125,224,212,119, 98,196,186,104,182, 78,217,238,236,253,159,220, 25, 80,109,250, 84, 61,204, +189,109, 75,111,110,106,180, 88,240, 28,129, 37, 16, 46,122,140, 59,158,240,173,209,164, 71,165, 4,181, 37,202, 9,253, 10, 30, + 67,199, 90, 31,253,157,169,144,255, 0,100,153, 42,109, 96,108, 24, 93,173, 25, 33,108, 27, 96, 37, 66, 3,232,144,141, 71,151, +101, 98, 20,246,180, 31,222, 41, 75,252, 58,110, 5,250,122, 30,151, 3,109,247, 24,234,110,150,185,121,125,113, 27,190,246,141, + 14,226,220,138, 85,122,149, 95,137, 79,221, 29,192,219, 42, 86,219,187,104, 69,247, 57, 66,135,195,181,213,186,212,122,171,149, +122,104, 85, 74, 93, 76, 92,212, 56,173,120, 13,169,182, 94,140,242,153, 95,134,178, 36,161,188,127,125,171, 86,214,225,238, 11, + 22,199, 16, 84,107,178,163,121, 39,108,124, 29,207, 68,141,169,183,108, 72,233,163,237,245,233, 92,170,211,106, 53,186,204, 89, + 52,202, 39, 35,139,138,182, 99, 49, 2,101, 90, 83, 81,212,194,240,184,239, 73, 25,143,134,171, 36, 66,194,104,254,198,161,110, + 97, 23, 14,138,202,199, 64, 11,164, 54,162,119, 6,214, 93, 86, 98,161,171, 35, 6,218, 79, 91,118,238, 9, 4, 11,239,126,158, +238,246,218,253,134,210,215, 23,168,252, 66,238,173,122,152,237,253, 54,243, 85,110,231,171, 76,225,138,243,161,236,203, 18,102, +193,102,123,213,219, 34,129, 34,173, 62,218,133, 2,172,137,173,218,242, 46,180,203,140,244, 86, 80,236, 39,101,213,208,220,211, + 33,228,132,186,236, 80,248,135,221,139,146,237,218,187, 18,214,222,123,102,243,129,185, 51,246,200,220,219,133,110,217,182,220, +151, 54,246,175,118, 89, 27,207,114,220, 59,126,196, 88,238, 61, 5,154,162,127,128,148, 71,161,179, 83, 67,181, 56, 13,161,255, + 0,172, 27,152,151,144, 18,105,120, 98,178, 37,118, 51,199,104,151, 83,147,204, 1,108,138,237,184, 67,125, 33,173,125,181, 16, + 66,106,107,129,133,173,141,136, 1, 79,155,167, 77,247, 32,119,239,248,119,182, 58,147,171, 69,118,187, 74,182,233,114,107, 21, +153,105,135, 2, 47,132,149,185,225,188,251,206,189, 33,212, 71,139, 18, 28, 72,205,173,217,211,223,148,235, 45, 49, 29,148, 45, +231,222,121, 13, 52,133,184,180,164,182, 60, 63, 94, 23, 13,249,180,118,173,203,117,202,141, 58,225,125,219,146,149, 84,168, 68, +134,221, 57,154,140,139,106,235,174,219, 34,165,238, 12,168,183, 13,217, 13, 81,219,121,198,219,253, 26, 28,125, 73,108, 37, 1, + 41, 13, 62,232,111,214,218, 88, 87, 53,221, 90,189,235,241,103, 84, 54,214, 35,223,192,237,191,166,243,212, 43,146,234,168,162, +210,230,214,174, 85,210,219,108, 4, 84, 20,139,146, 5, 54, 10,228, 56,219,108, 55,239, 43,109,212,137,238, 41, 44, 50,192,240, +207, 45, 59, 88,201, 19,178, 27,116,186,146, 13,137,182,215, 29, 72, 27,117,198,210,176,101, 86, 29, 24, 3,251,247,199,221,233, +222,106,181,159, 75,167, 84,174,234, 93, 66,210,177,231, 69,184,235,115,168,180, 74,161,155,188,183, 37,187,104, 81,151, 91,175, + 70,163, 80, 40,200, 81,166, 32, 83, 84,169, 82,149, 18, 91,178,216,139, 78, 83, 11,126,159, 42,107, 42,103,136,187,179,237, 34, +226,147,119,235, 63,197,223, 8,251,124,189,158,219,184, 97, 16, 40,176,233,212,196, 92,251,157, 84,166,150,212,167,102,185, 76, +180, 34, 77,106,221,117,114, 22, 2, 25,135, 45, 15, 52,181, 45,110,204,125, 71,175,108,182, 23,109,174,187,130,169, 84,222,157, +223,125,186,149,249,123, 65,247,101,210, 60,100,212,104, 54, 69,155, 36, 7,224,237,133,176,149, 2,203,148,166,146,166,158,173, +205,109, 3,235,170,160, 43, 86, 98, 69,134,211, 59, 51,104,216,150, 77,129, 77,110,141, 99, 90, 54,213,159, 74,109, 41, 66,105, +246,205, 18,155, 68,137,132,126,169, 91, 20,232,205,165,197,117, 57, 82,129, 81, 36,146, 73, 39, 78,217,109, 94, 95,150, 60,146, + 85, 80,254,145,169, 22,208, 11, 40,141, 58,223, 82,180,114, 93,186, 91, 96, 71, 98,164, 27,234,212,195, 81, 80, 21, 35,159,217, +227,223, 81, 0,150, 61, 45, 98, 25,108, 58,223,168,247, 17,136,175,109,165,111,136, 46, 22,110, 90,253,251,188, 55,190,238, 65, +226, 39,118,227, 73, 22,188, 43,214,173, 93, 15,170,216,230,151, 29, 53, 11,198, 13, 89,199, 26,118,108,119, 24,169, 38,135, 69, + 37,232,207,174, 19,213,119,127,239, 68, 64,213, 43,151,138,189,231,148,233, 93,203,191,247,220,103, 10,148,232,142,246,226, 85, +105, 32, 96,149, 21, 51, 79,141, 84,100, 37, 35,175, 68, 55,129,142,128,107,190, 92, 81,109,158,214,113, 35, 67,184,108,237,202, +102, 60, 43, 2,198,163,212, 42,247, 21,248,211, 49,155,173, 80, 37,183,202,252,118,173,218,155,209,221, 83, 79,170,117, 53,160, +227, 77, 36,169,228, 67,121, 32,178,242,233,207, 57,194,234, 71, 15,220, 39, 90, 75,109,193, 77,191,119, 2,124, 94, 96,220,151, +161,219,182,108,103,243,144, 18,185, 21,119,174, 89,106,100,163, 0,129,224,171,201, 60,131, 83,252,135, 54,165,204,160,150,105, + 50,197,106,184,152, 41, 60,176,194,223,170, 17,180, 5, 22, 29, 67, 58,155,146,119,189,240,193, 93, 73, 45, 59,170, 45, 73,228, +176,184, 26,172,111,176, 36,139,220,223,181,129,216, 91,107, 91, 29, 21,246,100,113, 47,186, 91,235,125,110, 4, 59,162, 92, 75, +222,214,164, 89,244,136,116,189,196,146,195,109, 87,221, 69, 6,164,227, 77, 68,157, 83,101,164,170,228,142,252,250,245, 93,166, + 94,150, 12,132,127, 7, 30, 90, 93,113,183, 73, 87,102,245,197, 62, 8,247, 59,106,118,179,113, 23,103, 90,182, 36, 75, 2, 30, +235, 85,168,116, 25, 13,199,172,212,107, 14, 87, 43,209,216,152,205,189, 33,239,126, 9,109,170,147,105,114, 75, 75, 16,216,138, +219,177, 93, 46, 62,219,134, 27, 74, 71,107, 53, 4,226,104,132,121,180,197, 40,197, 20,114, 5,101, 80, 0, 13,113,230,112, 20, +149, 23,107,139, 2,109,109,247,185, 47,153,107, 22,165, 75,205,206,101,184, 39,115,107,116, 27,128,122, 88,239,235,233,133,165, +165,165,168,254, 55,240,180, 29, 66,161, 2,147, 6, 93, 78,169, 50, 45, 58,157, 2, 59,178,166,206,154,251,113,162, 68,140,194, + 11,143, 72,147, 33,229, 4,178,202, 80,149, 21, 41, 68, 0, 6, 73,209,154,212,158, 53,182,250,255, 0,220,189,141,169,219,187, +118,235,139,169,181, 89,166,213,106,148,134,158, 12, 59,113, 81, 32, 51, 52,201,162,180,181, 16,149, 58,102, 59, 6, 74, 80,165, + 0,225,167, 6,243,149, 0, 88,184,159, 52,173,201, 56,123, 58,205,242,220,170, 76,242,191, 45,166,150,104,105, 34,254,242,162, + 68, 66,203, 18,216, 19,118, 35,162,171, 57, 23, 8,172,214, 82,253,194,249, 85, 14,121,196, 89, 38, 79,153,230,209,228, 89,126, +101, 83, 12, 51, 86, 75,253,221, 60,114, 56, 87,149,174, 85,108,160,245,102, 84, 6,197,221, 86,236, 52,131,138, 95,104, 4,186, +199,214, 54, 22,197, 77,122, 13, 40,151,161,213,183, 5, 41, 91, 51,234, 13,245,109,214,109,116, 44, 5, 64,138,174,191,225,138, + 1,245,164,254,133, 45,116,112,232,102,217,108,157,245,187,134,183, 88,166,198,146,138, 37, 30, 21, 78,171, 88,184,102, 54,243, +205,188,244, 72,207, 77,118, 44,101, 40,243, 79,168,186,180, 97, 88, 36, 32,185,206,226,129, 32, 43,100, 54, 19,129,203,238,248, +173,181, 55,114, 41,115,173, 91,118, 27,233,241,105,111,225,154,189, 85, 72, 80,230,100,242, 40,251,132, 63, 37, 44,159, 21, 64, +225,180,167, 62, 34,123,107,102,109,165,171,100,219,108, 91, 52,106, 68, 40,116,214, 97, 24, 34, 35, 12, 33,184,233,142,182,203, +107,104, 54, 7, 80,164,169, 92,196,228,168,168,149, 18, 73, 58,227, 46, 26,240,155,196, 15, 27,243,131,198,254, 48,212, 79,148, +100,169,175,216,178,205, 50, 64,197, 79,217, 84,129,142,186, 74, 91,129,173,223,251, 93, 72, 91,234, 0,172,216,237, 78, 38,241, +115,195,223, 3, 50, 97,192,254, 13, 83, 65,156,103,114, 20, 53,217,166,164,168, 64, 71,218,103,168, 81,162,174,168,169,109, 8, +159,217, 41, 75, 17,164,144,208,226, 44, 52,185, 13,195,169,211,165,188,142,118, 98,207,137, 33,212, 30,203,109,137, 13,184,226, + 8,249,165, 36,125,250,127,189,191, 59, 1,126,241, 15,193, 94,202,238,238,208,211,167, 93,244,109,151,184,170,119,101,215, 68, +161,176,236,233,235,179,175, 10, 4, 24,142, 93, 76, 66,140, 20,185, 76,211, 95,167, 69, 50, 66, 18,165,179, 30,166,244,130, 3, + 76, 60,164,211,226,127,101, 42, 59, 29,186,181,187,117,109, 62,187,118,168,251,213,155, 78,162,182,200,106, 93, 34, 91,202, 95, +186,135, 57, 66, 85, 38, 43,203, 84,119, 64,193,253, 26, 87,128,151, 18, 75,183,195, 79, 26, 53,221,151,166,139, 34,240,164,187, +122,109,226,148,224,141, 17, 46,182,154,189, 13,183,212,165, 72,102, 2,165, 31, 10,109, 61, 74, 90,213,238,238,148, 4, 41,106, + 40,113, 41, 37, 5,151,232,189,226,236,127, 70,191, 20,115,188,175,140,233,189,135,151, 83, 26, 73, 43,163, 50, 69, 61, 47, 62, + 45, 50,104, 12,254,207, 83, 5, 76,154, 39,141, 95, 65, 49, 74, 20,198,204,234,241,244,170,240,114, 79,164,247,132,249, 46, 99, +193,117, 94,220, 37,165,149,227,137, 29, 21,229,130,168,211,204, 26, 46, 97, 84,246,154, 89,233,163,215, 79, 35, 71,204, 2, 88, +139, 9, 21, 81,160, 87,169,110,253, 27, 78, 31,247, 14,201, 78,246,241, 53,120, 64,159,107,237,173,207,108, 82,237,139, 90, 69, + 85,167,160,179,114, 68,163, 76,149, 92,175,220,241,144,248, 79,137, 70,138, 26,139, 29,153, 56, 45,188,228,137, 73,109, 71,193, + 94,122, 95, 89,143,236,147,185,110, 37,110, 61,103,134,205,190,118,245,118, 71,214, 47,186,246,201, 80, 28,168, 63, 81,230,241, + 76,135,214,152, 94,233, 38,103,139,215,198,113, 69,124,221,121,181,134,239,223, 25, 43,190,109,119, 54,195,105,109,159,226,243, +110, 28, 97, 16,106, 24, 17,153,172,214,169,236, 0,134,169,158, 5, 63,244, 20,106, 55, 34, 82, 21, 29,165, 56,167, 82, 2, 22, +180,183,204,210,189, 25,241,187,233,237,225,100,220, 3,152, 80,112,253, 92, 57,166, 99,153, 70,182,130, 10,152,234,164,119, 86, + 89, 18, 33,201, 5, 97, 70,145, 87,153, 52,237, 25, 88,195,132,133,228, 42, 7,154, 94, 3,127,179,211,197,122, 79, 17,114,220, +207,136,233,166,203, 50,220,174, 70,250,249,233,164,165,141, 17,213,163,121,155,158,193,230,117,141,219,151, 5, 58,200, 30, 82, +133,230, 72,149,201,211,219,222,171, 18,185,121,221,181,168, 8, 8,131, 86,185,107,149, 40,105, 74,121, 64,139, 58,167, 42, 76, +127,132,143,135,244, 78, 35,167,207, 77, 71,183,193, 83,207, 4, 92, 7,166,161,226,120,232,185,171,137, 62, 46,121,194, 5,131, + 73,240, 82,160,174,160,134, 66, 7,221,173,145,216,173,173,169,238,230,227,208,109,120,108, 60,170,120,148,204,234,252,180, 33, + 69,184,116,136,238,161, 82, 57,156, 72,194, 30,120,132,178,214,123,173,224,113,202,149, 17,210, 31,105, 23,179, 6, 31,180, 15, +107, 54,119,111,211,186, 82,118,157, 59, 83,112, 85,238, 6, 95,131,103, 71,187, 17, 86, 21,122, 52,122, 72,130, 99,187,113, 83, +133, 57, 44,166, 58, 86,149,165, 78,133, 5, 20, 20, 12, 5,107,144,127,217,239, 11,228,156,117,155,248,159,196, 50, 53, 6, 69, + 81, 49,167, 14, 35,118, 89, 36,209, 81, 36,238,145,198, 25,217, 98,121, 98,141, 74,171, 13, 82, 58,223,200,246,236,191,246,140, +186,241, 7,135,185, 87,133,124, 53, 18,230, 60, 67, 79, 0,168, 49,153, 35, 86,142, 62,101, 52,112, 70,242, 72,200,138,210,199, + 20,210,176,118, 83,166, 56,218,223, 88,151,102,125,130,112,118, 42,169,192, 62,220,155, 3,248, 58,253,211, 14, 69,121,189,216, +141, 20,197,250,250, 61,248,229,122,168, 93,114,229,109, 39,197, 75,206, 82, 17, 78, 84, 37, 57,240,170, 2, 88, 75, 71, 8, 80, + 17,173,246,250, 13,156, 87,180, 78,224,103,100, 28,162, 63, 88,110,202,179, 25,220,245,218, 78, 69,118, 49,221,175,121,170, 25, +141,184,237, 53, 69,181,220, 41,161, 42,215, 76,222, 83,227, 38, 98, 92, 68,140, 74, 75,192,117, 38,227,250, 54,119,189,161, 79, +164, 73,216, 46, 46,110,123, 78,180,253, 25,154,101,232,154,149, 18,165, 73,135, 95,154,143, 16, 72,168,192,114,215,185, 18,237, + 62, 19,168, 82, 1,129, 35,223, 2, 20,149, 45, 50,202, 86, 27, 67,243,193,111,209,227,219,173,146,220,107,127,118,119,231,112, +164,239, 85,205,109, 84,218,174, 81,173,207,169, 81, 69,178, 35, 87, 35, 60,153, 16,234,149,118, 37,204,149, 42,232,125,153, 9, + 75,205, 33,229,199,142, 93, 0,191, 29,240,156, 31, 80, 50,110, 36,240,255, 0,133,248,167,136,120,250,159,140,167,206,102,204, +197, 81,139, 47, 20,147,199, 51, 60,242, 9, 52, 75, 52,159, 86,209,161, 80, 35, 44, 16, 5,210,199,204,186, 91,202,188,243,133, +252, 73,226,222, 17,225,159, 14,106,120, 26,159, 34,131, 42, 52,130,108,204,214,211, 75, 2,165, 60, 92,190,100, 48, 71,245,171, + 35,134, 38, 64,165,201,109,106, 60,175,173,120,101,186,226,227, 30,216,222, 31,145,113,169,212,222, 13,238, 7, 6,204,215,213, + 43,196, 18, 19,114,181,106,109,123, 85, 19, 47,197,202,132,164,212,146,231,141,205,215,196, 74,201,235,211, 90,121,178,118,150, +251, 86,248,244,118,209,176, 55, 14,149,181, 28, 67, 63,187,123,137, 77,165, 94, 87,124,150,160,183, 79,191, 68,251,137,138,172, + 71,101, 79,167,202, 75, 85,121,111,253, 99, 25,144,182,148,167, 95,150,150,144,124, 71, 18, 12,191, 55,139,216,145, 27,114,184, +246,164,241,181, 23,126,103,210, 85, 77,220,141,186,220, 36,237,202,118,242, 36,168,229, 86, 2,232,107, 69, 32, 92,230,240,109, + 65,169, 66,136,128, 94,247, 2,166,125,229, 68, 33,194,145,159,188,127,251, 8,246,135,139,155,230, 86,246,237,181,237, 81,216, +221,230,170,248, 18,174,153,244,186, 83, 85,171, 78,238,170, 68,109,180, 49, 90,169, 81, 81, 50, 35,244,171,136,165,166,146,236, +232,146,128,119,194, 75,143, 69,117,254,103, 75,214, 91,226,215, 8, 67, 22, 85,150,205, 86, 35,138,175, 35,134,138,121,205, 36, +147, 69, 73, 85, 26,176,229,203, 3,162,251, 69, 57,230, 48, 97, 30,180,109, 10,167,202,197,149,139, 52,240,103,141,106, 37,205, +243, 72,104,140,147, 80,241, 4,245,244,244,226,182, 40, 37,173,163,149,163, 60,200,170, 35,145,189,154,161,121, 42, 80,203,203, +117,214,204, 6,181, 8,220,174,226, 71,130,207,107,101, 91,105,167,218,220, 83,113,207,179,208,246,122,238,169,208,173,233,177, +183, 54,243,164,208,173,170,181,102,101, 69,135,109,234, 98,103,201,178, 88, 45,207, 85, 69,134,150,209, 67,168, 82, 61,221, 78, +173, 73,109,181,173, 58,117,197, 87, 1,155,253,192,167,179,178,235,160,238,229,199,101,215,173,141,200,226,147,102,174,107, 61, + 22, 93, 90,117, 86, 35,117, 8, 59,103,187,240,170,243,222, 92,168, 76,160, 38, 69, 61,202, 40,109,109,115,248,137,137,146,174, + 80,141,116,161,143,163,193,196, 46,228,213,168, 20,254, 34,120,219,187,111,155, 38,221,113,180,211,233, 77,199,185,174, 25,241, + 97,167, 8,114, 37, 29,203,202,228,122, 53,190,165, 48, 57, 82,234, 35,200, 8, 29, 60, 21,142,154,234,183, 19,126,200,187, 31, +124, 56, 36,218,238, 11,108,125,198,175,109,125,165,181, 87,181, 22,242,163, 87, 39,211,158,220,106,188,245,210,168,215, 85, 46, + 68, 42,129,170,215,224,171,196,147, 34,233,147, 37,110,182,234, 91,105, 81,195, 44, 70,109,146,148, 54,214,158, 34,228,185, 53, + 87, 15, 81, 71,196,212, 85,249,107, 87, 71, 81, 94,180, 57, 43, 81, 65, 18, 68, 85,227,149, 89,109, 43, 77,170, 53, 86, 9, 12, +154,144,144, 89, 2,128,238,210,120, 95,158,231,148,156, 75,152, 73,194,149,249,118,106,153,124,148,217,123,102, 25,242,215, 84, + 77, 36,193,146, 72,157, 90,240,164, 26,100,118, 66,243, 71,165,192, 96,175,172,152,216,127,163,207,182, 54, 85, 63,129, 26, 5, +213, 18,131, 1,186,245,225,121, 94,117, 27,146,168, 35, 51,239,213,105, 84,250,195,212,170,127,190, 73, 8, 11,121,152,244,248, +205, 54,202, 20, 74, 90, 10, 95, 32, 5,107, 39,133, 62,218,203,122,129,108,123, 96,109,245,210, 41,177,105,109,213,209,195,221, +118,176, 97,180,134, 12,218,147,149, 56,208,159,168, 62, 91, 3,158, 81,133, 78,134,130,179,241, 17, 25, 57, 61, 53, 47, 47,103, +175, 7, 75,224,115,135,139,127, 97,141,234,237,254,138, 5, 74,189, 81, 77,202,253, 13,187,113,201,102,185, 84,122,164,166,141, + 41,170,164,208,194, 90, 47,114, 3,239, 11, 42, 8,230, 56,206, 53,160, 92,119,251, 21,218,227, 43,139,138, 79, 20,201,223,169, +214, 59,244,232, 27,125, 4,217,141,109,212,106,251, 11, 22, 36,247, 38,120,191, 94,185,121,196, 82, 76,164, 44, 39,151,221, 15, +128, 83,205,151,129,228, 17,110, 24,227,108,134,131,196,238, 46,226, 60,195, 51,120,242,140,217, 51, 4,134,110, 92,238, 92, 77, + 42, 52, 0,198,177,153, 20,104, 81, 96,232, 2, 5, 0,233,176, 24,151,241,111, 0,241, 22, 99,225, 63, 5,112,190, 91,148,164, +153,214, 76,249,107,207, 8,150,157, 4,109, 4, 46,181, 12, 36,105, 22, 38, 58,216,234, 40,236, 92,177, 35, 85,201,196, 94,166, +255, 0, 4,227,251,102,171,138,226,141, 80,145,106,127, 43,106,227,151,155,183,111,130, 40, 41,134,253,197, 45,203,106, 77,100, +206, 72,103,248, 45,250, 74, 26,201, 88, 17,189,203,148,159,208,106,118,219,255, 0, 77,225,202, 23, 11,155,155, 59,120,151,101, +141,146,115,108, 43,142,220,242,235, 79, 83, 77, 2, 85,186,237, 13,231, 25, 76, 37,173, 94, 28,153, 78, 35,192,250,189, 49,242, +243,146, 21, 28, 67, 5,242,214,185,225,237, 10,246, 37,236,223, 28, 51,160,110, 93, 50,230,159,180,155,231, 14,139, 6,141, 84, +188,169, 20,168,245,170, 53,231, 14,149, 20, 69,166, 34,238,183, 93,151, 24,202,168, 48,195,108,176,204,230, 36,178,250, 35, 54, +134, 94, 76,166,217,142,134,185,163, 99,253, 27,221,214,159, 80,165, 91,187,205,197,181,110,187,181,116,121, 33,246,109, 11, 90, +155, 92, 73,125,180,171, 33,152,105,184, 43,142,194,160,169, 67,169,117,184,146, 84,156, 20,165, 25, 60,195,123, 59,206,248, 23, +142, 41, 56, 79, 52,204, 56,182,110, 23,174,225,202,104,160,154,140, 82, 79, 49, 38, 34,167, 93, 35,197,104,209,156,173,149,152, +146, 20, 70, 93, 84,165,153,191, 32,200, 60, 65,240,254,183,140,178,156,183,130,224,226,234, 14, 40,171,154,162, 10,227, 91, 4, + 0, 9,129, 81, 29,108,114,131, 35,162, 6,187,162,128, 11, 25, 66, 51,137, 46,188, 20,224,130, 37,122,161,107,241,207, 22,205, + 68,229,213,151,193,189,253, 34, 59,113,121,149, 53, 84, 40, 55,206,223, 79,185,147,150,134, 72, 22,172,106,177,123, 29, 60, 36, + 57,159,135, 58,112,125,151, 27,107,197,206,231,238,109,253, 66,224,219,124,109,173,154,220,132, 90,144,164, 85,209, 87,159, 18, + 13, 86,231,182,219,170,182,183,153,164,123,205, 6,114,159,102, 44,244,195,114, 64,108, 32,164, 58,218,149,148,246,148,183, 0, + 30,195,186,103, 4, 59,219, 95,221, 41, 91,210,238,236, 81,174, 43, 18,191, 97, 78,179,235, 27,115, 6,133, 5,234,101,126, 92, + 7,229, 25,178,149,117,212, 19, 61,159,118,131,224,173,133,199, 8,117, 50, 23,206,113,240,235, 95,184,128,250, 57, 52, 5,238, + 92,237,211,224,251,126,238,109,132,155, 34,168,253, 90,157,107, 61, 18,125, 66, 21,175, 38, 90,150,227,236,218, 87, 93, 26,179, + 18,165, 71,166,165, 75, 33,152,239, 9,107,109, 10, 40, 18,121, 2, 82, 39,213,158, 45,112, 93,125,119, 19,229,145,230,113,193, + 73,155,199, 76,244,245,181, 20, 18,212,211,115,163, 69, 71,134,162,150, 72,214, 70, 81,203, 66,172, 80,165,217,219, 82,178,174, +170,226,135,193,142, 59,203,114,254, 18,205,101,202,100,158,183, 36,150,174, 58,154, 26, 92,198, 42, 74,174, 68,178, 51,199, 61, + 45, 92, 82, 52,106,228, 72,225,215,152, 30,200,138, 85,149,155, 79, 63,120,152,246,113,123, 73,247,246,235,219,109,167,226,139, +140,141,138,188,175,178,213,122,187,181,118, 29,241,126, 64,166,221,115, 99, 73, 93, 54,159,112, 78,182, 41,145,237, 56,210,106, + 13, 56,228,106,115,110, 33, 60,254, 41,132, 84,218, 23,238,207, 41,173, 31,246,169,108, 70,229,240,207, 70,224,147, 98,119,114, +163, 71,170,222,187,125,195,213,118,150,252,234, 12,137, 18,233, 70,139, 43,118,239, 89,244, 56,177,164,203, 97,167, 29, 12, 68, +146, 91, 60,200, 72, 79, 32, 74, 71, 40, 26,238, 94,204,253, 30, 26,228,253,212,164,238,167, 22,156, 77, 94,219,207, 82,164, 79, +131, 56,192,167, 63, 93,167, 79,170,174,154,224,118, 27, 85, 91,234,181, 93,149, 83, 76, 20,173, 8, 10,106, 34, 99, 59,203,144, +220,182,137,206,183, 63,218, 81,236,103,137,199,254,225,237,141,254,141,242,159,182, 63,197,206,219,177,183,108, 80,227,216, 76, + 93,200,157, 30, 61,114,165, 89,102,162,106, 82,110,248, 10,142,176,154,138,153, 45, 22,157,230, 12, 37,207, 23, 42, 41,211, 54, + 91,226,118, 67,149,113, 15, 14, 82, 84,113, 37, 61,110, 65,151, 37, 76,179, 61, 46, 80,244,112, 67, 83, 36, 82,198,139, 2, 70, + 26, 87, 71,230,182,191,169, 81,168, 7, 46,218,138,163,238,105,225, 55, 17,103, 28, 53,197, 21,180,220, 43, 85, 67,196,121,172, +148,176,195, 29,102,117, 29,117, 68,244,145,205, 12,142,213, 15, 41, 72, 99,120,249, 43,203,250,242,218, 47, 24,141,116,134,125, +234,246,125,236,206,223,237,103, 9,155, 11, 64,179,173,250,125, 38, 3, 59, 97,100,212, 92, 17,163, 54,202,230, 85,234,214,237, + 54,167, 88,172, 76, 82, 19,151,234, 82,234, 82,100, 72,125,213,100,173,199,207,100,132,164,111, 48, 24, 24, 29,135, 65,166,203, +102,236, 37,237,126,216, 88,187,122,185,202,169,155, 50,212,183,173,113, 82, 83, 9,138,169,233,160, 82, 33,210,147, 53, 81,146, +234,196,117, 58,152,129,101,176,181,132, 21,242,133, 40, 12,150, 11,143, 78, 49,236,142, 6, 56,109,189,119,206,237,247,106,133, + 98, 35, 63, 80,109,189,164,235,165,183,175,125,198,171, 71,147,252, 28,183,209,200,180,173, 16, 18,168,242, 38, 84, 93, 65,230, +143, 77,165,203,121,176,183, 80,219, 78,115,121,134,183, 63,207, 30, 26, 53,122,250,236,222,165,132, 99,114,242,188,210, 27, 18, + 91,123,146,215, 98,214,176,185,107, 0,113,212, 98,122, 30, 27,225,232,231,174,100,203,178,252,150,145, 76,135, 96,145, 71, 12, + 64, 48, 1,118,178,133,178,170,222,230,193, 65, 36, 12,113, 23,233, 10,251, 69,127,139,219, 56,240, 51,180,149,207, 14,246,220, + 58, 76, 90,158,253,213,105,238,225,251,107,110,170, 45,166, 69, 35,111,195,236,175,154, 61, 90,224, 64, 68,138,131,100,165, 72, +161,165,182, 28,109,216,245,192,166,197,250, 63, 62,207,199, 44, 27, 45,238, 46,247, 46,142,166,111, 45,207,164, 38, 30,218,192, +168, 71, 90, 31,183,118,209,231,218,148, 43,105,105,228, 15, 10,125,126, 68,104,146, 26, 88, 10, 34,147, 18, 26,217,112, 38,161, + 37,189,113, 27,217,255, 0,195, 62,227,251, 81,184,218,174,223,155,197, 50,161,115,219, 13, 92,234,221, 61,253,186, 37, 37,214, +218,174, 63, 83,168,185, 34,149, 99, 68, 49,148,129, 0, 85, 37, 71,114, 43, 76, 50,166,145, 6,141, 74,151,238,188,134, 52,102, +151,250, 18,218,182,237, 58,213,161,211,168,148,168,145,160,194,167,196,143, 18, 60, 88,140,183, 30, 52,118, 35,180,150,153,143, + 29,134, 82, 16,203, 8,109, 41, 74, 16,144, 18,148,164, 37, 32, 0, 53,117,113,253,101, 39, 0,112,165, 23,134, 89, 44,193,243, + 42,197, 90,140,226,116,234,236,225, 88, 67,126,160, 61,151,202,108, 86,153, 34, 86,213,206,123,208,254, 27, 80,214,248,145,198, + 53,254, 44,103,208, 52,121, 85, 11, 61, 54, 73, 76,251,132, 68, 44,166,123,116, 38, 59,183,152, 92, 53, 84,146,178,149,228, 32, + 25, 10, 82, 18,144,148,140, 4,128, 0,244, 3,160,215, 62, 61,164, 30,208, 29,190,246,125,108, 68,221,193,174,166, 21,195,185, +183, 74,103,208,246,111,110, 92,144, 91,126,238,186,153,142,218,156,168, 84,144,203,169,118, 61,155, 75, 18,162, 72,171, 73, 65, + 65, 8,121,152,108,172, 76,155, 21, 42,223,186,157, 78,157, 69,167, 84, 43, 21,138,132, 42, 77, 34,147, 10, 85, 74,169, 84,169, + 74, 98, 13, 58,155, 78,130,195,146,166,207,159, 54, 83,137,106, 28, 38, 99, 52,235,142,186,226,146,134,208,218,150,181, 4,130, + 71, 9,184,174,225,239,128,223,109, 5,235,103,196,178,120,186,133, 90,187,118, 26,145,116,193, 93,191,180, 87, 53,159, 80,147, + 34,153,115,212,232,158,253, 88,147, 10,183, 72,146,245, 74,148,212,218, 52, 38,155,157, 7,154, 22,102, 37, 42,117, 74,117,156, +212,252, 35, 69,149,207,156, 82,213,241, 20, 21, 13,195, 52, 45,174,178, 72, 34,146, 64,163, 75, 24,163,145,145, 78,133,154, 64, +177,177,184,109, 37,180,144, 64, 34,228,227, 92,195, 55,166,201, 42,232,248, 98,122,101,226,188,193,116, 80,199, 81, 52, 81, 22, + 98,202, 37,146, 53,145,135, 49,160,137,154, 69, 91, 50,235, 85, 12, 10,155, 24,223,112, 43, 69,217,158, 45,184,165,187,120,165, +246,138,241, 35,182,116,170,123, 23, 91,119, 61, 74,223,220,203,198,221,164,212,247, 82,240, 90,154,145, 18, 4,155,122, 83,169, + 76, 13,179,165,195,106, 27, 94,232,150, 88,134,243,109, 69,164,194,109, 80,163,204,105,153,125,220, 94,209,127,103,156, 61,184, +186,232, 52, 94, 47, 56,125,117,247,237, 26,244, 24,113, 99,110, 45,186, 93,145, 37,234, 60,166, 35,176,203,104,151,241, 45, 78, + 41, 9, 74, 64,234, 84, 0,215, 43,127,189,146,225,251,255, 0,151,141,236,252,108, 47,255, 0,212,117, 98,186, 62,141, 70,193, + 80,109,171,134,184,206,250,111, 75,206,209,168,117,106,171, 77, 58,108, 79, 9,215, 41,240, 31,150,134,220,228,180,193,240,212, +166, 64, 56, 32,224,156, 28,234,227,226,156,231,194,238, 48,205, 41, 42,234,248,179, 49,165,167,161, 88,226,165,164,134,136, 37, + 61, 52,107,164,104,141, 76,102,218,138,130,204,119, 54, 10, 44,136,138, 40,222, 15,200,252, 93,224,124,162,178,142,139,131, 50, +202,202,154,247,146,106,202,201,235,245,213, 85, 72,218,137,121, 92, 72, 47,160, 51, 4, 81,176,187, 49,187,187,179,241,151,216, +125,188,123, 87,177,188,108,155,223,120,111,251, 87,109,173, 15,226,150,243,164,127, 8,239, 10,196, 74, 37, 35,235, 57,181,155, + 69,248,144, 61,246,107,137, 71,189, 56,212, 57, 74, 66, 51,149, 6, 20, 64,192, 58,156, 37,241,179, 92, 40,241,203,106,237, 46, +225,220,246,214,221,239,165,175,107, 85,218,191,118,150,241,196,122,245, 54, 52,165,184,202, 93,157, 69,169, 68,120, 38,161, 71, +146,245, 54, 31,189, 67,112,189, 2,106,233, 81,140,168,239, 42, 43, 5,184, 0,123, 51,184, 59,180,120,227,226, 73,123, 35,122, + 92,215, 45,167, 72,254, 47,238, 75,185, 21, 91, 80,210,133, 79,223,104,181, 43,126, 19, 17,149,245,197, 62, 75, 62,234,182,234, +239, 21,254,143,159,153,164,114,168, 12,131,250, 11,240,185,177,214,207, 9,155, 29,181,187, 7, 78,186,100,213, 41,118,141, 53, + 54,133,175, 62,230,151, 77, 98,183, 95,122, 59, 21, 90,234,227,165,168,172,176,212,202,144,167,198,170, 72, 83,113,218, 4, 70, +167, 60,241, 64,109,167, 22, 49,227,201,203,105, 56,158,154,191, 47,204,234, 97,226,113, 20, 74,241,160, 40,145,211,114,230, 28, +196,153, 44,218,218,229, 29,117,125,130,110, 45,140,253, 29, 23, 52,173,225, 42,188,187, 50,202,105,103,225, 38,158,102, 73,100, + 43, 36,146, 85,137, 41,207, 41,224,123,174,133, 0, 58, 57, 91,243, 2,216,220, 12, 63,180,219,118,145, 74,138,212, 72,144,152, + 67, 77, 33, 40, 72, 13,164, 97, 41, 24, 0, 0, 58, 12, 1,168,214,125, 36,238, 26, 44,170,175, 15, 59,113,196,205, 42,137, 14, + 22,224,216, 59,137, 73,176,171, 53,136,200, 98, 51,213, 75, 2,242,167, 86,221, 76, 42,145, 5, 42,168, 46, 29,213, 78,163, 42, + 16, 60,230, 50, 42,243,249, 18, 18,251,170, 18,111, 4, 30,160,228,122,141, 71, 19,233, 42,111, 69,183,107,112,145,182,219, 37, +239,241,156,189,119, 91,118,169,119, 3, 20,143, 17,179, 37,155, 43,111,169, 53,105, 85,170,210,208, 57,148,210, 5,199, 87,180, +163, 53,144,128,239,189,200, 40, 89,247,119, 16,170,219,194,167,174, 95, 16,120, 99,216, 11, 9, 94,160, 7,211,125,224, 42,220, +240,214,234,188,157,100,223,109,175,219, 22,175,140, 41,151,191,134,156, 91,250, 68, 41,133, 41,137,143, 85,182,168, 14,158,207, +166,253, 27,157,160, 45,183,222,221,240,212,253, 25, 45,199,171,212,118,115,136, 29,176,151, 33,247,169, 54,142,229, 80,110,122, + 75,110,168, 41,184,138,190, 45,181, 67,159, 26, 49, 42, 42, 67, 62, 61,152,135,139,120, 8, 14, 76, 91,137,202,221,112,234, 82, + 58,139,207,209,155,219, 90,149, 31, 99,247,187,115,230, 71,118, 60, 91,231,115,160,208,105,106,117,183, 80, 38,192,177,109,214, + 20,185,241,212,165,114,187, 24,213,110,170,156,110,100,164, 31, 22,152,242, 20,163,202, 2,101, 13,163,120,178,105,219,196, 78, + 41, 52,214,229,243,208, 27,116,230, 8, 34, 19,125,252,208,250,189,247,193, 60, 25, 90,149,240,199,132, 5, 93,249,190,206,228, + 95,175, 40,212, 76, 97,251,185, 38, 61, 63,225,181,182,194,210,210,210,213,119,139, 59, 11, 75, 75, 75, 67, 3, 11, 86,231,168, +244,137, 50,219,159, 34,151, 78,126,123, 74,105,109, 77,122, 12,103,101,180,182, 20, 20,202,155,146,182,138,208,164, 40, 2,146, + 20, 10, 72,200,193,213,199, 75, 89, 4,141,193,177,247, 96, 98,222,186, 77, 45,198,165,199,114,155, 79,113,137,239,123,196,230, + 87, 14, 50,154,153, 32, 41, 11, 15,203,109, 77,226, 67,220,237,182,121,150, 10,178,128,115,144, 52,195, 92,219,245,176,182,149, +122,185,103,220,245, 58,117, 38,177, 14,165, 62,137, 88,166,205,183,100,165, 18, 94,180,182,226, 54,233, 43,153,126,224, 91,159, + 5,155, 45,232,238,197, 88, 82,208,167,241, 10, 62,100,128,214,182, 39, 90,175,186,220, 34,237,174,239, 92, 87,189,203,114,202, +174,179, 62,249,180,173,155, 70,114, 96, 73, 97,182,233,177,104, 55, 4, 90,205, 74,117, 39,196, 97, 70, 44,234,189, 58,155, 70, +165,212,213,146,151,233,244,134, 89,229, 24, 36,239,229,230,133,166, 97,152,203, 44,112, 21,216,197, 98,193,245, 40, 4,130, 13, +194,173,216,141,137,210, 0, 32,219, 9, 75,204, 10, 12, 42,165,129,253,111, 75, 29,135,199, 97,247,227,225,226,159,135, 84, 56, +170,163,213, 95,119,172, 38, 13,219, 88,247,105, 22,125, 85,171,145, 66,203,155, 66,162,214, 18,136,138,166,123,195,149, 5, 46, +227,166, 8,173,167, 43,148,194,220,113,158,102,153,112,164,250, 39, 17,220, 62, 92, 21, 58, 93, 58,145, 81,141, 34,185, 94,151, + 97,212,226,211,133,167, 80,106,170,170,149,249,112,215, 45,203,118, 92,198, 28,166,133,197,168, 51, 86,164, 85,125,241,199,121, + 87, 1,181,165,233, 10,109, 15,161, 74,182,220, 60, 32,109,125,201,123,215, 47,185,174, 86, 27,170, 87, 55, 43,109, 55, 45,216, +204, 61, 29, 48, 33,205,219,106, 84,138, 75, 84, 24, 49,212,193, 12, 91,213, 70,167, 84,156,170,176, 58,201,118,122,151,204, 20, +134,139,116,232, 92, 31,109,165,187,120,209,239,138, 92,218,235, 53,202, 30,226,110,142,227, 66,113, 79, 68,117,145, 63,115,169, +177,233,206, 81,214,211,177,136, 85, 10,144,168, 20,183,233, 12,118,138,245, 57, 11,202,185,222, 14, 56,145,195,220,178, 86,106, +161, 46,139,128, 74,144, 27, 78,161, 30,201,246, 67,125, 94,175,251,237,109,176,143,246,189, 67,202,133,111,239,189,175,107,245, +235,111, 53,190,235,247,192,151, 23, 20,214,213,149,120,238,245,161,112, 90,149, 90,123,118, 93,223,110,218,116,155,146, 37, 34, +165, 34,213,175, 92, 87,142,216, 91,119,181, 10, 5,199, 93,102, 0, 98,139, 83,155, 86,172,154, 91, 40,230,144, 74,145, 17, 79, +169,147, 50, 58, 23,100,166,241,143,176,110, 91,118,252,155,150, 60,202,122, 85,111, 48,244,196,211,236,186,197,114,218,166, 92, +206, 88,209,239, 59,138,199,163,207,137, 73, 87,214, 85,120,214,244,153,202, 90, 88,103,194,117, 48,100, 69, 14, 42, 91,110,197, + 77,226,167,194, 53, 62,224,168,214,164, 92,187,177,184,117,202, 93,207, 86,176,238,171,166,132,252, 75, 34, 52, 75,138,247,219, +171, 22,218,178,232, 23,101, 70,124, 75, 81, 19, 90,146,100, 90,180,154,171,241, 99, 73, 98, 19,149, 8,201,195, 8,139,207, 29, +204, 89,174, 3, 54,230, 28, 89, 84,218, 93,213,112, 83,169, 85, 8, 13,183, 62, 50,109,173,179,153, 84,126,170,109,166, 45,137, +213, 38,111, 9,246, 59,149,202,124, 73, 44,199, 68,199, 96,199,169,183, 24, 77, 91,133, 9, 76, 55, 93,134,181,227, 28, 52, 99, + 65, 52,210, 44,161, 35,212, 99, 50, 88,176,141, 85,236, 90, 50, 67, 23,214,214,210, 86,214,179,139,144, 10, 77,101,201, 85, 4, + 92,245,183, 75,220,116, 61,133,133,239,123,246, 56,201,110, 78, 45, 54,210,143, 71,187, 69, 26,206,190,106, 23,221,159, 10,239, +174, 77,176,164,109,229,114,157, 93,162,200,181,109, 26, 5,194,253,122,230, 66,160, 17,111,208,220,164,222, 86,170, 68,245, 41, + 75, 91, 85,192,134, 91,117,109,188,218, 1,107,139,222, 30, 41,208,160, 38,182,212,154, 96, 81, 98, 34,164, 83,236,138,173, 86, +132,229,233, 73,143, 2, 77, 86,210,160,202,167, 82,150,229,102,224,167, 57, 85,155,240,177, 28,130,105,117, 4, 48,181,191, 26, + 67, 73,200,239, 78, 20,232,247, 93,227,184,151,181, 59,113,239,187, 58,175,186, 16,107, 20, 59,177, 20, 6,109, 25, 81, 38, 91, + 85,235, 26,194,177,234,148, 36, 49,113, 91, 83, 67, 13,174, 54,221, 80,228,162, 75,124,147, 24,118, 76,180,176,251,104,120,114, + 97, 71,129, 29,185,102, 75,134,157,116, 87,233,212,215,107,237,221,142,192,102,217,219, 23,234, 46,220,107,153, 26,125, 70, 66, +175, 41, 86, 50,235,200,165, 73,156,220,169, 11,130,138,162, 26, 67,243,150, 16, 68, 68,166, 32,196, 67,134,204, 81,243,102,154, + 55, 96, 25,172, 90,225,180,141, 75,126, 89, 22, 86,190,141,141,197,203, 50,155, 12, 6,246,205, 70,202,164, 3,177,176,251,143, +218,190,227,175,167, 96,112,231, 92,188, 65,108,253,156,237, 21, 85,234, 37,205, 77,117, 54,204, 75,162,127,188,109,197,114, 52, +173,190,178,220,185,255, 0,131,148,235,130,242,141, 38,152,219,246,149, 21,117,198, 37, 41,160,227, 97,192,213, 50, 76,191, 5, + 44,199,113,212,227,232,226,211,100, 21, 21,169,244,186, 61,249, 82, 97,202,109,126,252,241,169,187, 81,118,165, 40,183,173,245, + 24,119, 77,250, 28,149, 70,101, 47, 81,162,201,144, 35, 61, 61,165, 56, 94,122, 73,102, 57,144,174,112,155,149,235,194,253, 54, +254,147, 62, 77,127,114,247, 1, 75,185,109,201,150, 53,252,136,169,180, 27, 69,243,183,234,190,107,183,181, 30,208,169,151,173, +119, 21, 76,139, 79, 23, 21, 86,150,196,154,122,162,203,114,155, 49,212, 72,121,217, 74, 76,164, 52,251,165,194,237,235, 26,209, +179,173,109,147,172, 76,141, 81,133,182, 87,238,208, 87, 46,106,213,219, 71,163, 71,122,208,188,167,211, 39,166, 53,106,131, 47, +109,107,104,172, 50,153,222,250,242,158,167, 46,147, 80, 97,184,166, 59, 47,172,204, 15, 66, 37, 60, 57, 12,220,152,228,168,144, + 77, 35, 16,197,159, 68,106,161, 88,234,102,104,191,104, 88, 1,114, 84,173,192,114,193,114,237, 84,161,152, 32, 33, 64,176, 2, +228,155,141,128, 13,233,248,131,216, 12,110,107,245,216,236,216,210,174,155,102, 19, 51, 24,254, 12, 74,185,104,144, 74,126,174, +102,127,139, 76,118,175, 5,151, 65,108,123,159,142,181,183,206, 74,121,146, 94, 82,148, 50, 14,180,215,116,165,219,144, 32,213, +182,215,234, 10, 53,122,167, 42,135, 42,149,118,221,213, 70,214,169, 21,107,134,188,202,229, 86,106, 18, 4, 96,219,174,148,212, + 36,135,144,147, 32, 54,202,144, 24,109,164, 55, 29,160,157,199,135,107, 57, 22,193,139,100,166,162,160,236,107, 61,139, 88, 85, +154, 99,195, 80,113,154, 42,105, 34,162,212,101, 58,174, 69,115, 39,197, 74, 10,206, 14, 19,204,123,235,144, 59,209, 19,116,167, + 75,115,110,234, 52,115,107,213, 46,219,210,159, 99,220,151,204, 58,236, 73,212,214, 41,117,135,213, 18,124,250, 47,142,152,243, + 99,207,171, 72, 8,129, 8,201,140,219, 77, 59, 90,111,154, 74,212,166,148,189, 76,174, 26,121,106,106, 29,239, 34, 68, 9, 80, +110, 46, 9,181,201,219,183, 91,237,190,248, 60,236,234,136, 7,148,183, 95,203, 29, 10,217,141,236,135,113,237,133,155, 34,137, +104, 94, 55, 7,131, 64,143, 79,110,109, 18,136,236,138, 4,185, 20, 96,229, 38, 91, 17,174, 7,228, 6, 36,186,204,216, 18, 99, +188,239, 63, 35,146, 34,186,166, 84,235, 74,109,197,229,117,203,231,113,228, 81, 38, 76, 27,115, 80,181,169, 66, 35,130,109, 86, +161, 91,167,203,170,192,109,238,102,132,198,233, 52, 53, 63, 33,184, 44,146,133,204,125, 1, 82, 99, 70,241, 95,139, 22, 83,173, + 37,181,115,182,167,188,183, 37,129, 6,159,182,219, 79, 95,118,221,177,236,232, 45,208,224,166,152,212, 39, 19, 54, 68, 95,130, + 92,184,146,164, 69, 83,145,233,254, 40, 83,113,195,107, 72,113,182, 68,151, 7,140,251,152,109,170, 91,157,184,213,165,133, 85, + 47,171,178,127, 33,230, 75,114,171,213, 23, 35,250,156,199, 84,159, 15,147, 25,200, 41,229,229,200, 61, 52,228,156, 45, 83, 33, + 46,213, 9, 12,109,184,184, 98,214, 61, 46, 54,177,183, 93,246,239,141,118,204, 17,118,208, 89,135, 93,192, 23,247,125,248,187, +241, 61,191, 16,171, 20,120, 91, 43,100, 59, 38, 45, 50,223,155,227,110,163,143,165,182,103,212,183, 14, 41,104,204,160,206,247, + 98, 91,122,157, 79, 90, 99, 41,149, 50,183, 97,190,216,132,184, 46, 57, 2, 52, 39,156,210, 5, 41, 40, 66,220, 89, 66, 27,109, + 42, 90,220, 95,192,219,105, 72,202,150,226,212,112,218, 7, 82, 73, 32, 0, 59,247,214,204, 79,218,105, 60, 77, 67,171,238, 54, +206,186,245, 31,112, 40,173, 83,169, 53,218, 12, 24,116,183,153,221, 11,113,130,220, 51,122, 91, 76, 85, 22,150, 26, 76, 26,164, +146,195, 50, 28, 10, 83,241,203,235,111,199,134,228, 45,102,150, 23,179, 43,113,174,103,163, 78,220,186,172, 10, 83, 3,192,117, +104,185,234,127,195, 25,237, 41, 32,164,174, 53,175, 72, 83, 84,104,143,114, 21,146,164,150,212, 20,190,185,198, 4,179, 46,173, +203, 50,156,190, 58,121,100, 74, 87,131,103, 86, 97,169,159, 98, 92, 0, 11,184,125,138,176, 91,105, 32,109,107, 6,154,136,106, +106,106, 25,213, 76,161,250, 16, 54, 3,176, 36,216, 2, 58, 17,126,183, 62,252, 48, 60, 43,109,125, 79,127,119,214,218,118,158, +185, 44,218, 22,100,195, 85, 21,152, 78,173,176, 24,129, 33,164,215, 46, 72, 51, 89, 87,232,220,113,192,221, 34,148,242, 50,174, +121,115,101, 55,205, 29,104,115, 82, 78,211, 25,177, 59, 3,102,236, 21,187, 50,139,108,185, 46,165, 62,173, 33,153, 53,170,245, + 73, 17,145, 54,114,162,180, 89,135, 17,150,162,180,148, 67,165,176,133, 61,224,176, 57,202, 21, 37,197, 41,197,149,100, 62,122, +131,113, 6,106,185,165, 96,104,175,236,208, 11, 33, 34,197,137,182,166, 35,168,189,128, 0,244, 85, 23,220,156, 61, 80,210,154, +104,136,127,239, 28,220,251,189, 7,243, 39,212,156, 45, 45, 45, 45, 48,227,119, 11, 95, 8, 4, 16, 70, 65,232, 65,215,221, 45, + 12, 12, 83, 67, 45, 53,146,219,104, 65, 61,202, 82, 1, 63,128,213, 77, 45, 45, 12, 12, 51,123,215,177,246, 78,250, 90,142,219, + 55,132, 15, 17, 77,169, 82, 41, 53, 88,229, 45, 85, 40,211,185, 57, 19, 46,159, 36,164,248,107,198, 2,208,160,166,221, 72,229, +113, 10, 24,199, 21, 55, 95,128,189,229,176,101,201,126,218,136,213,251, 65, 75,139, 49,164, 82,249, 99, 86, 27,103, 36,161, 50, +233, 82, 22, 57,221, 9,192,203, 14, 59,205,140,242,163, 60,162, 65,250,242,180, 33,192, 82,180,165, 96,247, 10, 0,143,219,170, +147,196,127, 5, 56, 23,196,226,149, 89,229, 28,148,121,204, 74, 17, 43,169, 25, 98,168,208, 62,202, 73,169, 94, 41,209,127, 84, + 75, 27, 50, 11,136,217, 1, 55,183,188, 54,241,191,143, 60, 47, 87,165,200,171, 99,172,201,165,114,239, 65, 86,173, 45, 54,179, +246,158, 61, 46,146,192,237,250,198, 41, 21, 92,216,200,174, 64,180, 88,213,177,251,198,219,222, 2,182,186,252, 11, 10,228,255, + 0,246, 90,178, 91,207,151,233,189,211,147, 31, 62,108,117,239,167,207,108,248, 36,222, 91,238,100,115, 87,165,127, 3,105, 10, +113, 62, 60,170,176,241,106, 37,172,142,111,119,166, 48,172,135, 49,156,120,203,100, 12,103,174, 48,100, 58,105,148,245, 30, 99, + 13,130,123,231,195, 26, 33,168,236, 50, 48,211, 77,182, 63,217, 72, 31,208, 53, 83,100,223, 67,239, 15,232,107, 82,167, 52,206, +115, 28,238,154, 50, 15,179,179, 69, 4,111, 99,246,100,120, 99, 18,149, 61,249,111, 17,244, 97,139,115, 58,250, 99,248,133, 95, + 67, 37, 46, 85,146,229,217, 29, 76,128,143,104, 85,150,162, 68,184,251, 81,164,210, 24,131, 14,220,200,229, 95,240,156,107,150, +193,112,227,103,236,125, 9,184, 52,136,161,218,131,220,143, 84,106,146,130, 29,168, 84,101, 37, 56, 15, 74,120, 32, 14, 80, 10, +130, 27, 64, 13,182, 9, 8, 72,201, 39,100,244,180,181,212,185, 94, 87,151,100,153,125, 38, 85,148,209, 71,151,101,180, 40, 35, +134, 24,148, 36,113,160,232, 21, 70,221,110, 73,234,204, 75, 49, 36,147,142, 85,205,115, 92,203, 59,204,106,243,108,222,182, 76, +199, 50,175,115, 36,211,204,197,228,145,207, 82,204,119,233, 96, 7, 69, 80, 21, 64, 0, 0,180,180,180,181,191,134,252, 45, 45, + 45, 45, 12, 12, 45, 45, 45, 45, 12, 12, 45, 45, 45, 45, 12, 12, 45, 45, 45, 45, 12, 12,104, 15, 16,151, 95, 24, 54,239, 17,123, + 83,103,109, 12, 84,212, 54, 75,118, 69,182, 47, 27,216,219,148, 90,131,187, 24,189,180,184,101, 92,219,132, 23, 42, 76, 82, 37, +139,234,202,151, 77,160,210,125,241,138,135,213,181, 58,116,137,140,248, 9, 90, 64,231,117, 43,136,239,106,117,199, 89,185,105, +117, 10, 52,219, 42, 68,189,220,218,235, 50,177, 79,135,177,151,213,106,118,216, 64,186,248,146,182,109, 10,197, 94,196,168,220, + 27, 33, 79,182,247, 3,109, 33,236,132,171,166,163, 88,171, 53,117,221,106,132,229, 62, 29, 72,212, 41,241, 36, 73,106, 28,131, + 84,132, 47, 28,201, 10,199,108,140,227, 84, 76, 88,197, 69, 69,150,202,143,115,203,215,203,250,134,165, 20, 60, 69, 77, 73, 4, +113, 75,195,212, 85,111, 18,196, 57,143, 18,150,102,142, 70, 98,238, 24, 50,182,184,244, 70,234, 2,130, 99, 89, 13,218, 73,249, +209, 44,195,134, 42,235,106, 36,154, 46, 37,175,163,142, 87,148,152,210,102, 8,171, 36,106,161, 35, 42,200,203,203,148, 73, 42, + 49, 44, 87,154,209,139, 36,116,252,158, 18,111, 54,228,113,174,250,120,178,217,207,122,222, 77,206,102,216,218,235, 50,169,182, +183,141, 11, 96,170,118,165,187, 86,174, 81, 46, 93,174,102,187,109,151, 87,181,116,241,125,223,117,200,235,187,229, 59, 34,206, +174, 87,232,109, 83,149, 52, 24,150,188,232,144,226,189,121,221,222, 37,189,160,182,229,237,191,208,108, 59, 58,250,169,203,183, +173,190, 38,157,179,108,216,155, 3, 85,170, 88,180,107, 78,206,216,154,213,197,195,166,226,216,251,164,154, 35,177,247, 99,117, + 46, 45,225,139,109,211,166, 90,113,234, 19,223, 67, 85,233,113, 87,111, 66, 52,228,205,149,220, 51, 22, 58,149,204, 89, 65, 80, + 24, 4,167,168, 30,131,211, 95, 12, 72,196,133, 22, 91, 42, 29, 1,229, 25, 3,211, 75,197,197, 20,136,176,163,240,229, 36,235, + 18,176, 33,145, 44,210, 60, 84,241,180,133, 86, 48,170, 73,131,152, 2, 42,144,206,124,197, 76,130, 93,105,120, 70,177,218,103, +143,138, 43, 96,121, 93, 72, 43, 36,132,172,105, 45, 76,169, 24,102,149,157,128, 21, 28,178,100,103, 82,136, 60,129,132, 70, 29, + 28,224,214,249,226, 54,181, 83,222,219, 55,136, 39, 43, 85,241,100, 94,246,107, 27,119,127, 86,246,245,141,190,145,120, 91, 23, +102,204,109,181,247, 91,109,168,212,184, 17,169,213,150, 40,215,245,201,118,208,253,234, 19, 64,161,116, 5, 67,154,165,207,141, + 37, 70, 41, 62,217,106,175, 29, 60,104,113, 79, 93,164, 80,248, 84,226,128,108,102,199,212,235,214, 38,211,193,135,178, 27,169, + 46,147,113, 46, 44,255, 0,115,185,183, 61, 15,199,182, 20,196,245, 87, 38,211,216, 92, 23,154, 60,130,143, 6,156,148,254,148, +200,113,217,206, 33,150,155, 57, 67,105, 73,237,144, 49,211,211, 67,187, 77,128,242,138,221,136,195,139, 61,212,180, 5, 19,247, +157,111,240,175, 28,175, 11,103,243,113, 12, 25, 5, 53, 85, 91, 66,177, 70,164,152,227,133,180, 34, 75, 44,105, 26,133, 87,155, + 75, 19,164, 5, 65, 35,170, 0,166,216,110,227, 15, 15,159,139,248,110, 14, 25,168,226, 74,186, 58, 36,153,165,149,192, 89,101, +157, 4,143, 36, 48,202,242,146,204,144,234, 80, 53, 18,206, 99,141,156,150, 92,126,116,252, 63,207,246,190,240,179,111, 84, 45, +109,128,218, 78, 44,118,210,133, 86,172, 61, 95,169,195,163,240,195,113, 77,114,125, 93,248,145, 32,174,108,185,213,189,175,149, + 33,245,136,112, 98,182,132,169,210,134,210,214, 16,148,229, 89,216, 95,229,123,244,129, 63,242,126, 52, 63,251,173,204,255, 0, +254, 61,169,231,253, 81, 76,255, 0,200, 99,127,246, 73,254,173, 47,170, 41,159,249, 12,111,254,201, 63,213,169,173, 79,140,244, +149,147,203, 85, 89,225,206, 77, 85, 85, 49,212,242, 73, 10,188,142,118,221,157,162, 44,199,110,164,147,211,211, 16, 58, 95, 2, +107,104,105,226,164,162,241, 71, 60,163,164,128,105, 72,162,157,227,141, 23,246, 81, 18, 80,170, 58,236, 0, 27,226, 37,155,115, +253,212,126, 49,125,153,188,113,237,174,247,198,222,153, 59,193, 46,175, 96, 72,219,250, 22,228,109,202,182,202,225,187,172,138, + 21, 82,137,114,222,246,157,180,203,246,205, 29, 85, 20,205,129, 74,154,216, 8, 67,198, 83,220,180,197, 40, 34, 90,211,174,108, +123, 29, 56, 93,226,149, 28,122,109, 85,237, 78,219,189,198,219,219,123,106,234,245,201,187,145,114,220,214,181,114,217,129, 10, +149, 34,223,173, 81,102, 90, 18, 69,110, 36,113, 58,173, 81,126, 98, 97,251,154, 2,223,101, 46, 57, 49, 77,165, 17, 22,226, 63, + 64, 22, 96,195,143,159, 6, 51, 45,115, 12, 43,145, 0,100,124,245, 69,170, 85, 61,151,140,134,162, 50,135,137, 36,184,148, 36, + 40,147,243,198,154,161,241,114,174,151, 42,226,204,162,135,135, 40,168,169, 56,157,157,130, 68,186, 35,166,230,211, 71, 75, 40, + 72,213, 66, 72,165, 35, 14,129,130,132,145,152,182,181, 58,112,239, 63,130,212, 85,153,191, 6,103, 85,252, 79, 95, 95, 91,194, + 43, 26,151,149,181,201, 87,201,170,146,174, 18,242,179, 23,141,131,202, 81,202,150, 47, 18,162,175, 45,134,178, 91, 28,254, 11, + 94, 39,235,248,104,231,255, 0,249,185, 70,127,110,177,109,192,143, 34, 93,135,122,196,136,195,210,165, 74,180,238, 40,241,163, + 71,105,111, 72,145, 33,234, 68,198,217, 97,134, 91, 73, 83,175, 45,197, 37, 41, 74, 65, 82,148,160, 0, 36,235, 46,210, 35, 32, +131,216,244, 58,169, 35,115, 27,163,129,114,132, 31,220,111,139,166, 68, 18, 35,161, 54, 14, 8,253,226,216,132, 15,176,167,134, +142, 35,182,159,142,131,114,110,159, 15,251,217,182,150,232,218, 43,214,152,107,251,129,181, 87,213,153, 69,250,202, 85,110,207, +118, 45, 59,235, 91,142,131, 25,143,127,113,168,178, 84,219, 62, 39,136,180,199,112,165, 36, 33, 68,117, 47,219,205,195, 55, 28, +251,238, 54, 30,243,225,142, 29, 70,225,177,182, 89, 85,139,166,109,187, 96,220, 82, 40,155,167, 77,220,121,146, 24,110, 13,239, + 72,138,151, 99, 46,172,220, 26, 44, 70, 24,129,245,108,167, 42,145,159,169,206, 83,113, 11, 78,151, 83, 34,132,192,132,135, 60, +100,198,101, 46,147,146,224, 64, 11,207,219,162, 84,132,172, 20,173, 41, 82, 79,112,160, 8, 63,113,213,149,152,120,159,153, 87, +113,173, 39, 27,140,170,149, 43,105, 34, 16,136, 36, 15, 44, 37,116, 73, 27, 19,114,172, 24,164,140, 1, 7,202,108,119,232,106, +156,179,194, 76,171, 47,224, 42,222, 1,108,226,174, 74, 26,217,140,230,162, 50,144,206,175,174, 41, 20, 11, 43,161, 85,120,148, +144, 65,212, 46, 54,216,136, 25,208, 61,170, 30,218,237,168,164, 39,110,107,112,119, 42,161, 86,167,180,154,124, 73,123,145,195, +123,147,175,152, 73, 79, 52,102, 82,236,185, 86,131, 14,213,229, 7, 80,172, 61, 80,106, 99,238,173, 39,196,113,206,163, 77,149, +151,192,119,180,211,218, 97,189, 44,110, 46,255, 0, 64,220,170, 74,107, 38, 36, 90,246,237,239,133, 26, 85,175, 26,139,111, 48, +234,221,106,157,101, 88, 47,198,128,235,144, 71,143, 49,200,112, 41, 20,248,116,144,252,135, 28,117,248,190, 58,222, 95,232, 6, +237, 2,142,250,185,220,129, 29, 74,245,240,211,253, 90, 50, 61, 62, 20, 79,251,222, 43, 45, 99,205, 8, 0,254, 56,212,132,120, +202,153,122,212, 79,195, 92, 13,149,240,246,109, 84,165, 90,170, 40,213,156,106,234, 81, 86, 56,128,223,205,165,153,208,176, 5, +209,237, 99, 26, 62, 5,190,100,244,176,113, 87,136, 57,191, 19,100,212,110,174,148,114,202,202,135, 79, 64,238,210,202, 78,215, + 82,200,169, 32, 82, 66, 58, 94,248,215,190, 20,248,114,178,184, 89,217, 43, 15,102, 44, 56, 70, 37,191,100,208,163,210,163, 45, +222, 85, 76,168, 74, 82,220,153, 87,173, 84,156, 72, 1,218,172,250,188,153,211, 37, 41, 41, 74, 21, 34,123,133,180, 33, 28,168, + 78,200,105,105,106,151,168,168,158,174,121,234,170,101,105,234, 42, 93,164,145,216,221,157,220,150,102, 98,119, 44,204, 73, 39, +185, 56,189,233,169,169,232,233,169,232,233, 97, 90,122, 90, 84, 88,227,141, 5,149, 35, 69, 10,136,160,108, 21, 84, 0, 7, 96, + 48,180,180,180,180,142, 23,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194, +210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,214, 53,117,217,246,213,239, 67,171,219,183, 69, 34, 21, + 94,149, 91,165, 79,163, 84, 24,146,195,107,113,112, 42,113, 93,135, 45,182, 95, 41,231,142,178,203,206,114,173, 5, 42, 66,136, + 82, 72, 80, 7, 89, 46,150,178, 24,169, 5, 77,136,238, 48, 8, 7, 98, 46, 49,196,171,235,133,221,241,219,202,252,170, 5, 5, +186,133,255, 0,110, 54,227,142, 91,183, 24,180, 43, 87, 5, 89,218, 66,156, 34, 28, 91,130,109, 22,174,210, 93,171,176,128, 27, +113,199, 24,105,215,249, 3,170, 47, 40,169,247, 49, 56,124, 52,111,189,235, 81,137, 67,173, 91, 85,184,244, 57,175, 52,212,250, +127,240, 58,177,105,211,231, 52,181, 0, 89,174,220, 21,122,163,202, 77, 11,186,164,199, 97, 13, 46, 66, 17,224,173,197,178,183, + 24,123,188, 58, 90,146,167, 20, 85,172, 74,141, 2, 59,168,182,162, 91,115,107, 92,168, 54,223,184,232,119,216, 13,176,222,114, +248,203, 92, 57, 11,126,155,126, 7,249,225,157,217,141,156,160,236,245,178,138, 85, 60, 53, 50,183, 53, 12, 57, 94,173,134, 82, +202,230,190,210, 57, 90,139, 21,176, 63,193,105, 44, 36,169, 17,217, 29, 0, 37,106,202,214,163,167,139, 75, 75, 81,233,166,150, +162, 87,154,103, 50, 73, 33,185, 39,231, 96, 58, 0, 54, 3, 97,182, 55,149, 85, 20, 42,139, 42,244,194,210,210,210,210, 88, 54, + 22,150,150,150,134, 6, 32,111,253,251,111,253, 25,127,246,206,255, 0,117, 13, 84, 31, 77,167, 61,189,153,157,251,127,142,111, +251,168,234, 6,201, 25, 61, 71, 79,216,116, 66, 7, 92,227,160,237,253, 29,191, 61,180,202,213,149, 2,195, 94,231,220,191,150, + 52,249,178,126,215,224, 63, 44, 79, 25, 63, 77,151, 39,255, 0, 6,119,218,127,150,103,111,251, 41,107,223,247,236, 95,244,103, +255, 0,219, 47,253,212,245, 4, 4, 2, 7, 95, 63, 47,223,170,169, 25, 61,186,122,250, 31, 81,243,210,126,219, 83,255, 0, 19, +240, 95,203, 24,230,201,127,181,183,192, 98,119,163,233,176,103, 24,246,104, 30,163,167,248,229,121,231, 24,255, 0, 53, 62,250, +168, 62,154,225, 35,175,179, 71, 31, 47,229,149,254,234,154,130, 42, 65,207, 67,215,212,255, 0, 96,209, 9,238, 1, 57,207, 66, +113,249,198,136,213,245, 67, 97, 37,143,253, 43,249, 99, 60,217, 45,187,126, 3,242,196,238, 7,211, 87,201,199,247, 52,251,255, + 0,207, 39,240,255, 0,146,174,190,171,233,171,114,130,127,185,167,159,151,242,200,255, 0,117, 93, 65, 69, 9,235,159,151, 79, +207,231,190,171, 4,115, 15,151,207,215,229,233,211, 26, 76,230, 21,118, 63, 93,254, 85,254,156, 37,237, 18,245,215,248, 15,203, + 19,165, 79,211, 89, 73, 4,159,102,170, 83,233,158, 50,135,207,254,106,191, 45, 18,215,211, 80,241, 19,205,253,205, 94, 80,123, +127,142, 62,115,255, 0,101,109, 65, 56, 67,100,168, 18,128,163,223,185,239,242, 25,237,223, 87, 54,211,203,202, 0, 0,118, 29, + 49,229,158,131,238,210,103, 49,173, 22,250,254,191,225, 79,233,198, 13, 68,189,155,240, 31,150, 39, 74,159,166,146, 79,127,102, +191, 47,111,249, 99,122,255, 0,213, 99, 85, 71,211, 69,207,250, 54, 71, 94,199,249, 98,244,199,175,249,172,106, 11,137, 0,145, +159, 63, 79,199,240,209, 41, 7,203, 0,118, 57,237,143, 77, 96,230, 85,191,241,191,202,159,211,140,123, 76,223,183,248, 15,203, + 19,158,254,253, 11,254,141,175,251, 98,127,186,206,189,143,166,127,144, 15,247, 54,241,159,249,225,255, 0,186,214,160,208,144, + 8,234,123,244,199,237,253,218, 36, 39, 29,124,250,119, 29,189,116,145,205, 43,199,251,255, 0,242, 39,187,252, 56,199,180,205, +109,218,196,123,135,229,137,201,143,166,116, 79,250, 55, 15,111,252,240,187,127,217,107, 94,199,211, 56, 39,191,179,119, 29, 51, +254,120, 95,111,127,241, 91,233,219, 80,111, 66,135,111, 60,254, 7, 24,209, 8,238,125, 72,239,223, 31,119,231,182,138,115, 90, +253,254,190,214,255, 0, 10,127, 78, 11,237, 51,116, 50, 88,250,233, 31,150, 39, 26, 62,153,166,112, 71,179,131, 57,237,142, 48, + 63,221,115, 94,135,211, 49, 57, 0,251, 55,241,156,227,252,112, 51,219,254,171,154,131,194, 82, 70, 48, 64,232, 51,143, 33,242, +252, 52, 66, 49,158,191, 96,244,255, 0,142,136,115,108,195,114, 42, 46, 7,248, 19,250, 48, 95,107,159,246,255, 0, 5,252,177, + 56, 65,244,203, 15,159,179,135, 31,245,191,207,255, 0,149,221,122,254,252,175,166,127,185,197,246,143,229,127,219,211,254, 75, +218,132, 10,112, 10,114,160, 9, 29, 7,168, 61,127,167, 94,243,144, 72,238,122,100,244,207,207, 69,253, 47,152,255, 0,204,127, +146, 63,233,198, 13, 93, 64,255, 0,121,248, 47,229,137,189,127,126, 89,255, 0, 71, 16,255, 0,239,127,229,235,254,107,186, 95, +223,150,127,209,197,255, 0,107,255, 0,247, 93,212, 32,130, 70, 78, 83,156,121,142,227,167, 97,235,175,129, 39, 36, 96,158,227, +228, 15,174,116, 63, 75,230, 63,243, 31,228, 79,233,198, 61,174,163,175, 50,254,235, 47,229,137,191,255, 0,126, 86,112, 79,247, + 56,187, 99, 63,227,127,235,216,255, 0,154,238,144,250,101,100,228, 15,103, 9,200, 56,255, 0, 59,241,143,159, 95,228,189,168, + 65, 28, 19,201,158,160, 12,125,189, 71, 93,124,228, 56, 61, 58,142,199,215,215, 67,244,190, 96,127,246,143,242, 39,244,227, 34, +170,163,188,157, 61,195,242,196,224, 26,250,101, 42,117,105, 66,125,155,238,173, 74, 90, 16,134,216,226,229,114, 31,117,110, 45, + 45,180,204,120,237,112,184, 87, 34, 67,142,173, 8,109,180, 2,183, 28,113, 40, 64, 42, 80, 26,145,125,139,237, 28,187,106,123, +107, 97, 92,219,161,195,163, 59, 99,184,215, 61,173, 2,228,186,182,189,141,220, 55,106,172, 25, 85, 68,137, 81,173,154,141,204, +118,206,154,106, 53,248,244,231,225,154,131,105,167, 50,136,178,214,252, 70,220,146, 35,151,215,249,251,123, 18,120, 79,167,111, +111, 18,114,247,186,251,163, 49, 85,218,222, 24,163,210,111, 53,194,156,128,245, 62,228,222, 74,163,175, 29,169,183,157, 96,172, + 9,108, 83,222,131, 80,184,101, 52,174,132,209, 41,225, 89, 75,196, 25,105, 85,110, 39,101, 73,126,161, 41,197,174, 75,239,169, +114,139,171,241, 63,239,176,162,251,170, 86,121,157, 65, 89,113, 67, 7, 35,169, 4, 18,115, 82,113,247,137,217,238, 79, 87, 22, + 91,147,230, 34, 26,136,198,185,156, 69, 79, 33, 23,221, 80, 44,145, 56, 6,222, 98,116,157,153,122,110, 71, 99,125, 27, 60, 13, +161,241, 3, 47,175,226,174, 50,162,122,236,146, 71, 48, 81, 64, 36,150, 14,107, 70,214,150,114,244,239, 20,133,117,222, 36, 93, + 65,110,172, 77,203, 45,186,186,215,180, 61,151,139, 72, 78,210, 40, 56,230, 50,147,125, 47,149, 37, 77,151, 65,231,254, 5, 97, + 72, 9,229,201,242,231, 29, 51,240,235, 38,139,199, 80,146,160,145,181,193, 5,104, 75,168,255, 0,223,202, 78, 90, 39,195, 82, +214, 13,164, 11,120,116,164, 96,142,161, 65, 94,120,215, 37, 97,212,227,199,149, 78, 9,151, 17,105,146, 42, 43,109,228,184,158, + 66,150,152, 96,162, 49, 81, 60,133,229, 15, 16,124, 93, 73, 25,192,198,117,127,135,119,198,133, 85,181,154, 92,152,232, 50, 28, +186,224, 45, 77,133,168,134,145, 77,106,160,134,156, 25,228,241,210,136, 43, 91,107, 60,205,168,199, 90, 80, 50,188, 26,248,120, +191,199, 91,223, 62,222,224, 91,217,168,122, 27,111,255, 0,163,123,205,183,183,173,183,183, 70,215,125, 26,252, 47,211,253,139, +131,216, 17, 28,143,189,110,104,215, 17,164,174,118, 53,123,111, 17, 95, 80, 78,224,219, 29,102,143,198,144,125,124,131,109, 74, + 72, 74, 85,145,120,165,105,198, 84,135, 7, 50,109,142,133, 46,164,167, 31,102,112, 78, 53,145,195,226,200, 74,117, 13, 42,195, + 67, 36,164, 41,197, 27,185, 11, 13, 21, 41, 73,194,147,252, 30, 10, 94, 8, 28,197, 41, 32, 5,103, 39,166,121,115, 2,240,167, + 70, 20, 80,180,187,134,229,185, 73,145, 29,134,150,242,101, 73,157, 30, 64, 97,134,152, 42,230,117,245, 61, 19,152,140,164, 39, + 42, 42, 1, 32,105,211,165, 85, 16,235,177,228, 37,200,205, 55, 48,170, 47,130,211,169,144,168,175,186,194,157, 76, 57, 13,129, +240,203, 11,104,243,140, 39,147,168, 74, 84, 64,202,195,197,222, 56, 99,182,126, 45,113,183,178,209,131, 98, 7, 66,105,253,247, +233,115,110,128, 3,138,247, 55,240, 35,129, 40,195, 21,225,118,129, 72,107, 19, 85, 94,119, 82,194,219,213, 27,146,171,175, 96, + 71,152,124, 11,113,237, 58,246,213,110,191,179,158,220,176, 55, 74, 7, 3, 3,126,182, 34,238,121,155,106,229,220,202, 87, 17, + 78, 89, 19,118,199,113,165,190,239,212,246,205,239,105,183,176,245,193, 6,220,171, 67, 74, 62,167,174,138,129,141, 46,106, 28, +166,201,143, 6, 89,138,153,124,121, 63, 76,188,131,211,217,192, 8,233,212,113,129,228,124,255, 0,205,115,211, 93,240,187,108, + 11, 23,121, 44, 27,215,104,183, 62,212,167,238, 22,218,110, 61,183, 91,177,239,203, 66,160,208, 85, 46,224,160, 85, 98, 2,253, + 61,213,161,121,131, 48, 56,162,244, 73, 72, 34, 68, 57,212,248,242,227, 45,183,153,109, 73,252,231,120,230,246,106,239,183, 6, + 60, 82, 94,220, 62, 83,108,205,193,221, 91, 81,182, 13,241,179, 87,213,187,104,220, 55, 36,155,231,104,106,242,164, 10, 21, 78, +166,154, 13, 41,239, 10,232,165,186,219,212,154,235,124,169,228,168,210, 87, 32, 1, 30,100,114,171, 79,131, 60, 72,204,115,136, + 37,165,205, 43, 2, 87, 83,141, 66, 67, 28, 72,146,161, 61,172,129, 53,165,192,178,216, 50, 16, 84, 54,151,115,201,126, 41,240, + 67,240,133, 90, 87,229,108, 70, 77, 84,193, 66, 19,169,160,115,246, 86,238, 90, 66,143,111, 41,114, 72,109,181, 29, 64, 44,156, +255, 0,191, 47,234, 71,247, 56, 71, 65,159,243,192,245,237,255, 0, 37,221,124,254,252,192,255, 0,251,184, 58,127,233,129,251, +191,146,230,161, 89, 94,176, 47,187, 81,114, 17,117,216,247,149,174, 99,171,195,147,252, 35,181,171,244, 20,198,115,152,128,219, +235,171,211, 88, 13, 56, 84, 8, 9, 81, 4,144, 64, 7, 88,123, 74, 75,159, 19, 69, 14,164, 21, 0,180, 45, 46, 36, 20,146, 20, + 9,109, 68, 2, 15,124,246,212,249, 51,218,185, 55,142,181, 92,123,132,103,248, 46, 42, 15,110,150,246, 51, 0,111,208,133,191, +238,181,241, 56, 81,244,203,137,239,236,225,192, 29,201,226,255, 0,215,254,171,186,248,126,153,120, 29, 15,179,135,175,203,139, +254,159,143,242, 93,212, 32, 71,158, 48, 9,235,223,204,253,191,118,188,167, 39,161,193,199, 83,242, 36,159,221,165,127, 75,230, + 63,243, 31,228, 79,233,193,189,170,162,223,222,111,255, 0, 72,252,177, 56, 1,244,203,201, 56, 30,206, 14,191,250, 95,255, 0, +186,238,190, 43,233,152, 4,128,127,185,195,159, 80, 56,191,234, 62,223,241, 93,212, 32,142,124,128,239,248,116,243,251,245,224, + 2, 84,115,211, 3,186,122,117, 63,111,200,157, 15,210,249,143,252,199,249, 19,250,113,159,106,159,254, 39,224, 63, 44, 78, 11, +251,242,241,128,127,185,197,247,127, 43,254,191,183,133,221, 47,239,203,198, 79,253,206, 35,129,231,252,175,186,125,255, 0,226, +187,211, 80,130, 66, 58,149, 12,115,116, 4,159, 63,159,111,206, 53,240,167,226,206, 58,142,135, 29,189, 58,232,126,151,204,127, +230, 63,200,159,211,129,237,117, 31,183,248, 47,229,137,190, 15,166, 96, 9, 35,251,156, 36, 99,204,241,125,223,236,255, 0, 21, +237,123, 31, 76,184, 28,127,220,226,239,156,127,141,247,167,127,249, 47,106, 16, 24,207,151,108,247,244,199, 92,126,124,181,244, +117,192,232, 61, 63,183,166,135,233,124,199,254, 99,252,145,255, 0, 78, 49,237, 85, 23, 31, 89,248, 47,229,137,191,143,166, 88, + 79,250, 56,122,245,233,252,175,255, 0,163,252, 87,122,235,233,250,101,100,119,246,112,227, 63,243,191,235,248,127, 37,221, 66, + 19, 3,190, 50, 71, 94,159,213,159,150,190,247, 32,249,119,193, 25,253,190, 93,244, 63, 75,230, 63,243, 31,228,143,250,112, 61, +170,163,254, 39,224,191,150, 38,238,126,153,113, 31,232,224, 56,245,254, 87,248,253,159,201,119,166,169, 43,233,153, 17,254,141, +252,140,227, 63,203, 3, 30, 93,255, 0,205,115, 80,137, 32,156,156, 0, 51,142,224,117,245, 61,123,245,213, 5, 32, 17,128, 51, +158,253,127, 63,145,172,254,151,204, 44,127,180,111,255, 0, 68,127,211,140,251, 84,255, 0,183,248, 15,203, 19,121, 63, 76,212, +130,113,236,221, 39, 7, 31,231,129,248,255, 0,201,111, 95, 15,211, 55, 35,183,179,120, 30,153,255, 0, 60, 47,217,254,107,125, +245, 7,245,128, 51,129,133,119,198, 14, 62,255, 0, 77, 10,172,140,244, 29,122,244,245, 31,111,111,237,209,151, 54,175,239, 83, +123,255, 0,129, 63,167, 25,246,169,251,191,224, 63, 44, 78, 33, 95, 76,228,167,253, 27,185, 30,191,203, 11,253,214,245, 72,253, + 51,220, 28,127,115,115, 63,245,194,255, 0,117,175, 77, 65,216,247,233,128,113,149, 30,227, 30,127,111,150,188, 16,112,114, 0, +207, 92, 14,248,249,244,232, 59,232,227, 53,175, 32, 30,127, 95,240,167,244,224,235, 81, 49, 23, 50,126, 3,242,196,226, 85,244, +208, 57,127,209,181,145,235,252,176,255, 0,221,103, 84,207,211, 67, 35,253, 27, 63,135, 24,191,238,177,168, 57, 45, 35, 56,193, +193, 29,252,191, 31, 95,234,208,235, 73, 57,230, 30,125,255, 0,163, 74, 46,103, 90,127,223,127,149, 63,167, 0,212,205,183,155, +175,184,126, 88,156,137,250,105, 24,200,254,230,199,108, 99,252,113,123,255, 0,217, 99, 84,213,244,210,249,127,209,175,159,250, +227,126,239,228,175,168, 52, 41, 61, 72, 62, 89,255, 0,142,168, 41, 56, 62,164,103, 31,126, 58,232,227, 50,173,255, 0,141,127, +251, 83,250,113,145, 81, 41,232,255, 0,128,252,177, 57,179,244,211,113,219,217,173,147,233,252,177,255, 0,221, 95, 94, 15,211, + 80,198,127,238,106,246,242,254, 88,253,127,254,213,181, 6, 5,142,164,147,229,220,116,200,251, 71, 97,211, 84,150, 6, 51,159, +179,211,246,104,227, 48,172,218,243, 94,253,244,175,244,227, 62,209, 55,237,254, 3,242,196,231,207,211, 85, 32,103,251,154,121, +199,252,242,113,255, 0,229, 87, 84,149,244,214, 72,255, 0, 70,150, 71,254,153, 61,191,236,169,168, 45,169, 56,237,219,247,143, + 95,191, 67, 44,117, 35, 3,175, 92,104,195, 48,171,190,242,237,255, 0, 74,254, 88, 56,158, 75,253,187,253,195,221,238,196,233, +215,244,215,249, 15,254, 13, 12,143, 95,229,149,251,191,146,159,174,168, 31,166,202, 57,185, 71,179, 56,159, 60,255, 0, 44,190, +159,179,133, 62,250,130,147,205,243,116, 35,207,203,167,159, 76,103,203,250,244, 42,153, 60,221,200, 3,183,150, 62,206,158,154, + 88, 86,212,216,125,109,255, 0,237, 95,203, 6,231, 73,183,159,240, 24,157,183,247,236,196,140,143,102,104,199,110,188,102,224, +231,211, 31,201, 71, 94, 15,211,105,229,239,236,204,199,253,115,191,221, 71, 80, 71, 82, 0,206, 51,208,227,167, 94,222,154, 25, +105, 72, 7, 35,174,124,242,122,252,243,246,104,235, 89, 57, 27,203,191,192,126, 88,199, 58, 77,183,189,253,195, 19,188,254,253, +183,254,140,191,251,103,127,186,134,150,160,120, 80, 60,142, 63,111,239,210,209,253,170,163,254, 39,224,191,150, 13,205,147,246, +191, 1,249, 99,234, 65, 0, 3,249,235,162,146, 15, 64,123,244, 31,156,106,138, 70, 79,203,207,243,246,232,132, 12,159,179,175, +223,157,105, 22,185,191, 75,116,194,120,174, 1, 61,189,113,249,249,106,176, 0, 96,121,121,254,253, 83, 70,122,244,200, 36, 12, +231,183,231, 58,174,144, 14,115,158,131, 61, 52, 76, 12,123, 74, 74, 73,234, 49,249,252, 52, 66, 7, 76,250,254,204,106,130, 50, + 71, 92,224,158,153,235,223,231,231,253,154, 41,180,246, 7,203,169,252,253,186, 65,141,205,241,131,176,191,166, 43,163, 29,135, +197,143, 79,159,217,162,144,140,142,131, 3,207,237,253,231, 84, 17,208,244, 3,175,125, 20,140,253,223,191, 68, 98, 69,192,194, + 36, 91,248,227,210, 7, 98, 79, 83,230,122,244,253,253,180, 72,193, 3,207,211,167,159,110,218,164,145,147,246,117,209, 9,237, +140,128, 1,200,251, 71,223,219, 73, 49,185,233,108, 99, 21, 18, 0,193,193,235,223, 61,241,233,162, 83,140, 14,157, 60,134,124, +191,118,168,164,115, 31,219,247,116,237,162, 80,158,163,167, 65,235,162,147, 97,115,219, 4,244, 23,177,255, 0,199,207,250, 98, +170, 64,242, 3,229,162, 82, 9,192,249,119,249,252,245,118,183, 45,171,130,238,172, 83,173,203, 86,135, 85,184,238, 26,180,164, +196,164, 80,104, 52,233,117,122,213, 90, 99,129,106, 68, 58,109, 46,158,203,143,206,146,164,161,100, 33,180, 40,242,182,165, 16, + 2, 73,213,222,187, 99, 94,182,156,151, 98, 93, 54,117,215,108, 74, 96,148, 63, 30,227,182,235,180, 39, 90, 90, 78, 20, 28, 77, + 82,158,215, 41,230, 7, 90,109, 60, 43, 32,137,165, 81, 43, 11,133, 36,106,181,237,123,117,183,107,224,250, 36,229,180,162, 54, + 49, 41,179, 56, 83,164, 27, 94,197,173,164, 27, 88,218,247,182,248,198, 80,144,123,128, 8,207, 65,220,156,249,122,157, 86, 70, + 62, 33,143,179,215,239,252, 63,110,188, 32, 18, 50,217, 14, 1,220,161, 73,115,211,185, 65, 56,237,162, 27, 73, 86, 58,128,125, + 7,127, 95, 61,101,136,223,126,191,127,195, 26,250,131, 11,131,127,120,239,138,168, 73, 56,233,212, 12, 30,190, 64,234,179,125, + 79,108,128, 65, 3,191,221,251, 53,245, 40,236, 58,103,190,122,253,191,187, 85,144,140, 43,169, 3,207,228,114, 15, 95,217,164, +240, 49, 84, 39, 42,193,232, 59,129,129,148,140,118,207,225,175, 74,108,245, 4,242,143, 47, 81,233,175,160,149,103, 24, 10,245, + 30, 99,243,231,175, 67,174, 2,178, 51,230, 48,123,121,159,195,246,235, 24,199,195,174, 40,165, 56,206, 85,212,156,142,157,254, +204,246,215,148,164, 2, 50,163,223,238,235,242,243, 58,172,224,201, 29,122,122,142,157, 51,140,159,151, 93, 92,168,148, 58,189, +195, 84,167, 81, 40,116,202,141,102,177, 88,152,213, 58,145, 73,165, 65,153, 85,171, 85,170, 18, 20, 16,196, 10, 77, 42, 3, 46, + 72,169,206, 90,136, 8,101,134,214,226,179,209, 58,195, 50,162,150,118, 10,171,185, 39, 96, 48, 91,133, 2,231, 97,181,254, 54, +183,239,197,153, 93,240, 57, 64, 30,106, 3,174, 51,128, 61, 53,233, 88, 67, 69,215, 84, 27,101, 56,241, 29, 89, 8,105, 40,238, +165, 21,172,129,140,103, 82, 39,224,247,232,242,113, 5,186, 44,209,175,126, 45,110,120,252, 41,109,245, 65, 45, 76, 98,212,168, +192,137,115,111,205,126, 34,210,167, 80,219, 22, 95,189, 38, 13,132,167, 80,143,133, 85,151,221,152, 18,178, 69, 47,152, 99, 82, + 25,217,126, 4,125,158,220, 32, 70,111,248,177,225,226,214,187,174,202, 84,112,204,221,208,222,132,198,220,171,212,205,121,104, + 12, 72,241,238, 54,151, 77,163,211,164, 45, 56,103,220,169,241,154,109, 74,229, 79, 82, 64,134,103, 28,115,148,101,101,145, 24, +213,204,187, 89, 14,215,247,144, 9,248, 27, 91,212,226,216,224,191, 5,184,251,142, 12,111,150,229, 38,134,142, 80, 8,158,164, + 20, 4, 18, 0,100,140,217,216, 94,195,204, 99,185,176, 23, 36, 3,170,254,203, 46, 26, 46, 77,165,224, 39,102,233,180,203, 98, +123, 55, 94,240,135,247,210,247,144,229, 50, 82, 28,149, 42,249, 17,191,130, 80, 39,169,184,229, 79,197,133, 96,194,183,154,100, +100, 99,197,117, 73, 37, 43, 81, 86,234, 87,236,203,238,132,204, 33, 46,221,170, 32,138,139, 45, 45,243, 6, 98, 99, 20,165,137, +143,123,195,179, 60, 34, 27, 65,240,249, 15, 57, 79, 42,214, 17,130, 72, 35, 99,155,223, 42,234,221,136,202,101,194,143, 66,171, +184,105,112,211, 76, 5,132,211,101,181, 28,123,180,100, 71, 82, 83,238,168, 82, 80,227, 9, 67, 73, 8, 14, 54,132, 97,180, 20, +130, 37, 39,125, 42,234,171,170,153, 34,124,151,131,206,170, 19, 32, 54, 57,101,207,141,200,137,172, 48, 57,190, 37, 8,222, 27, +165, 60,170, 39, 42, 9, 10,109, 42, 35,158,243, 89,104,243,106,250,186,249, 38,156,203, 86,236,231,104,202,139,157,149, 87, 85, +236, 1, 10,190,110,130,198,230,248,244,231,129,168,248,183,129,184,107, 38,225,202, 14, 30,163,155, 47,200,105, 99, 77, 38, 89, +121,146,114,215, 68,146, 59, 8,236,178, 22, 87,121, 1, 82, 69,181, 95, 73, 7, 26, 81, 90,169, 61, 79,168,208,167,204, 91, 44, +184,170,148,168, 83, 66, 11,141, 70,124, 78,167, 84, 35, 51, 29,198, 66,130, 11, 8,121,168,165, 36,146,181, 41, 14, 44, 21, 40, +224, 88,100, 92,178, 84,252, 41, 12, 58,134,169,236,223, 20, 56, 17, 31, 91,158, 31,213,209,106, 45, 85,162,212, 38, 53,239, 67, +159,220,194,222,100,171, 9, 37, 41,111, 45,133, 37,120,214,238,238, 21,145,110,110,237, 53,104,141, 18,147, 65,187,160,213,226, + 84,226, 75, 44, 52,154, 77, 70,163,111,200,247,152,240,235,208,227,114,167,192,113, 14, 20, 25, 44,164, 59, 28,191,226, 56,135, +145,206,141,115, 74,240, 69, 70,139, 58,226, 93, 94,157, 42,151, 38,217,171,209,163,191, 18, 75, 72, 91,241,167,211,107,148, 86, +235, 13,120,141,225, 15,143,117,147,200,218,176,158,118,242,164,158, 78,241, 42,202,121,105,230, 69, 46, 37,138, 83,229, 96, 54, + 39, 96, 53, 11, 27, 48,191,217, 61,150,247, 32, 99,163,184, 11, 53,202,248,178,154, 72,228,131,244,126,105, 66,170,147,211, 72, +202,218, 17,229, 26, 94, 18, 8, 15, 27, 23,116, 14,187, 34, 6, 89, 17, 67,170, 54,206, 82,238,185,177,160,198, 76,229,153, 13, +208,110, 74, 4,198,235, 44, 56,149,128, 69,106, 35, 41,155, 33, 8,201, 46, 37,233,173,153, 1,226, 91, 60,203, 41, 39,176,223, +221,171,219,215,238, 40,178, 42,213,233, 10,163,209,233,181, 8,142, 38,114, 84,251,110,185, 54, 35,209, 31, 13,197, 91,138, 79, +143,206,150,212, 57,242,124, 38,229, 16, 84, 73,240,213,204, 75, 50,143, 87,173, 84,164, 89, 20,181,168, 46,225,151, 26,159, 71, +109, 65, 14,184,229,111,223,226,166, 53, 41,224,179,148, 64,114, 79,132, 90,113, 73,200,104,184,146,174,118,146, 79,101,175,201, +205,219,204,155,102,128,180, 26,125, 18, 28,150, 98,195,105, 10, 14, 85, 92,139, 49, 44, 74,113, 69,160, 66,149, 34, 98, 36, 58, + 20, 83,202,178,235,104, 56, 3, 26,125,225,170,120,167,231,215, 85,141,112,211,105, 68, 66,108, 25,200, 98, 1, 35,204, 2,129, +118, 32,139,221, 73,211,171, 88,164, 60,112,168,124,170,167, 38,200,178,103, 72, 51, 44,237,231,149,166, 81,253,213, 50, 10, 79, +172, 10, 67, 42,201, 44,175, 42,128,126,168, 90, 67,176, 82, 27, 44,157,124, 91, 86,163,172,210, 40,209, 33, 66,112,182,149, 48, +228,143, 4,186,243,202,144,134,136, 71, 50, 71, 59,195,196, 43,253, 81,128,121,143, 54, 9,213, 9,123,191, 49,153,245, 55, 35, +206,109,168,116,233,113, 41,236,173,165,115,203,126,108,150, 24,126, 66, 34,165,149,164, 32, 41,215,163,182,233, 78, 22,166,155, + 90,143, 48,108,145,165, 85, 75,154, 37, 70,161, 46,164,219,243,155,165,183, 95,162, 83, 41,204,184,183, 31,120, 38, 3,190, 45, +101,232,203,231, 40, 76,115, 83, 50,127, 74, 20,164,143,112, 40,242, 9, 31, 98, 92, 79, 79,129, 78,140,203, 11,121,138,245, 72, +215,101,185, 49,196, 39,158, 19, 18, 21, 36,165,158, 84,115,163,196,105,234,116,116, 44,252, 60,143,172,114,249,234,105,237,243, +234, 88,226,151,149, 96, 84, 34, 93, 22,215, 29,128, 4, 3,181,141,183,216,168,177,185,166,163,240,166,136, 67, 12,245,145, 53, + 84,238, 0,153,166,177, 96,204, 18, 87, 55,144,155,186, 70,146, 43, 45,216,107,212, 1, 59, 91,122,169, 91,167, 70,186,227,184, +197,203, 10,131, 87,163,189, 10, 69, 85,214,171,148, 90, 69,113,166, 35, 70, 56,136,137, 81,234,204,184,151,100,173,214,164,200, +104, 6,254, 24,254, 26,193, 30, 33,214,177,238,127, 2, 62,206, 30, 34,208,151,119,167,131, 14, 31,170, 51,171, 76, 70,150,170, +189, 2,208,133,100, 93, 16,152,156,135, 92, 15,166,232,176, 13, 54, 74,101,165,135, 57,220, 33, 69, 97,249, 39,169,192, 0, 26, + 93,210, 95,153, 46,142,195, 48,212,207,240,138, 76,170,188,247,144, 86,212,166, 41,209, 88, 17,109,147,200,217,240, 91,113,230, + 10, 86,128,162,166, 98,165, 96, 97,201, 9, 78,178,250, 69, 65,249,177,152,150,228,245, 53, 78,141,239,234,159, 40,211,220,125, +234,189,102,123,128,204,166,210,121, 79, 70,152, 89, 40,114, 90,121,185, 11, 65,166,199,232,221,121,189,200,179, 42,152, 93, 92, + 75,230,181,135,235, 18,204, 69,152,107,221, 75, 2, 72,234, 69,174, 46, 14, 32, 60, 65,225, 38, 67, 80,102,246,156,185, 96,142, + 64,186, 65, 26,216, 43, 6, 40, 6,149,221,157,212, 46,150, 93, 69, 68,110,116,131, 41,199, 40, 55,231,232,175,112, 39,186, 52, +233,149,158, 27,247,143,120, 56,116,174,173,153, 18, 34,210,174, 57,144,247,130,194,102, 74,185,149, 26, 52,200, 23, 10,162, 86, + 96,176, 86,182,130,146,213, 93,197,161,183, 1, 8, 39,149, 38, 53, 60,110,123, 1,189,162, 92, 20, 64,171,222, 82,246,226, 47, + 16,123, 65, 75, 15, 72,127,116,120,126, 77, 82,239, 20,202,115, 40, 46,174,117,219,183,111, 65, 69,126,215, 97, 8,232,243,169, +139, 58, 27, 74, 74,185,166,114,142, 99,250, 18,209, 46,181,183,224, 68,113,102, 52,106,107,177, 37,200, 76, 89,105,113,113,218, + 56,118, 12, 55,101, 50, 10,230, 23, 86, 85, 37,215,208, 22,167,192, 67, 77,169, 69,206,125,108,205,177,123,137, 81,132,228, 77, +240,230, 79,154,105,244,170, 68,172, 70,170, 45, 44,243, 23,229,205,128,165,133,198, 42, 67,110, 60,176,176,144,220, 86,155, 75, +156,175,184, 82, 37,249,111, 22, 85, 64,218, 42, 36, 46,150,235,171, 86,247,176,186,185, 5,172, 47,228,140,198, 46, 44, 72,234, +121,147,139, 60, 39, 92,176,153,168,117, 68,140,198,218, 71,144, 3, 98,138, 64,212,159,103, 84,140,214, 0, 32, 12, 28,131,124, +126, 50,105,198, 21,146, 20, 2,150,143,132,228, 7, 26, 81,109,214,212, 65,248, 92, 74,194,146,164,156, 20,169, 37, 42, 0,131, +165,219,161,234, 58, 18, 58,228,124,254, 71, 95,166,111,180,163,216, 17,194, 7, 31,240,238, 45,193,218,248,212,110, 26,248,173, +144,137, 82,206,229, 89, 52, 54, 25,176,183, 2,186,219, 40,113, 49,183,135,111,169, 74,106, 53, 73,215,223,228, 75,245,122,111, +187,214,152, 50, 20,235,206, 84, 2, 61,217,127,158,255, 0, 24,156, 20,241, 33,192,134,239,206,217, 30, 38, 54,238,125,139,118, +182,211,245, 43,118,166,211,159, 90,217,123,137,109, 53, 37,113,155,187,182,234,235,101,180,177,115, 80,148,226, 64,116, 0,220, +200, 46,171,221,234, 49, 34, 72, 30, 25,177,178,252,214,159, 48,137, 36,141,135,159,161, 6,234, 78,231, 77,251, 48, 0,221, 90, +199,202,197,117, 32,214,105,170,234, 26,172,186, 65, 29, 84,101, 65, 54, 87,177, 10,215, 32, 13,141,138,150,236, 14,199,245, 75, +111,141, 87,232, 7, 78,223, 46,186,240,164,147,156, 28, 3,215, 4,145,249,235,175, 68,129,142,189, 7, 76, 99,191,151,125, 32, + 65, 39, 61, 71, 76, 36,140,103,167,252,116,233,141, 78,248,166, 18, 9,199, 92,122,143, 95,234,239,175,161, 36,250,244,200, 30, + 93,115,158,191,142,170,121,127,171,248,116,215,196,144, 1,202,147,156,231,167, 92,228,232, 96,111,143,129, 56, 33, 89,201, 25, +230,243,242,215,164,117, 4,143,135, 25, 61,115,251, 63, 29,125,233,140,254,206,216,252,245,215,209,215,246, 12, 1,220,121,253, +253, 52, 48, 58,123,176,136,207, 68,245,233,231,142,164,103,246,106,130,219,198, 9,242, 61, 70,124,244, 78, 14, 58,140,121, 2, + 70, 49,246,252,191,175, 84,207,110,131, 39,246,103, 63,212,127,167, 88, 6,255, 0, 17,140,224, 37,160,224,249,103,215,184,207, +168,252,247,208,170, 64, 0,231, 36, 18,123,250,252,190, 90,184, 57,205,158,184, 61, 58,231,190,125, 58,121,245,208,238, 32,242, +231, 4,117,232, 58,231,175,203,236,214, 65,232,122, 99, 32,158,221, 78, 45,197, 1, 39, 32,245, 29, 49,158,152,199,174,188, 20, +231, 36, 28,121, 28,159,179,207,240,209, 42, 73,234, 20, 7, 79,245,123,146,126,126, 67,174,168,242, 12, 40,100, 99,166, 0,243, +235,158,231, 75,169,184,235,131,168, 34,219,109,243,243,111,195, 3, 40, 3,212,147,129,248,125,186,160, 70, 70, 63, 35, 70, 41, + 35, 56, 30,153, 63, 44, 13, 12,180,144, 73, 3,167,246,126,206,186, 81, 79,108, 24,216,116, 23,254, 71, 0,184, 0, 32,116,206, +122,159,217,215, 31,158,154,162,160, 78, 58,100,103,175,175,221,163, 20,147,230, 7,221,216,158,250, 25, 89,201,230, 56, 39,183, +207,211, 31,119,244,105, 92, 1,208, 95,113,129, 22,128,114, 64,199,200,249,250,140,104,117, 35,166, 6, 1,239,246,103,200,244, +209,138,206, 65, 56,207,160,242,208,199,169,200,207, 95, 92, 14,221, 63,118,149, 7,160, 39,167,207, 95,158,248, 54, 5, 87, 76, +228,103, 25,253,159,187, 66,172,116,206, 15, 78,216,253,164,244,237,211, 70,172,100,142,152,235,220, 30,253,124,255, 0, 62,122, + 25,196,228,156,100, 1,208,227,182, 79,228,104,248, 50,250, 91,127, 92, 91,215,128,112, 14, 73, 39,167,161, 29,123,232,115,223, +168,235,158,191,184,104,199, 19,144, 83,211, 62,126,189, 61, 63, 13, 12, 80, 70, 78,114,125, 15,225,223, 58, 89,122, 97, 81,107, + 3,210,216, 29,105,243, 25,206,133, 90, 72, 39,183,153,251, 62,223,150,116,105, 25,251,186,250,103,228,126, 90, 25,105,206, 73, +200, 62,126,125, 59,253,250, 85, 79, 91,157,176, 69,216,144,119,183,250, 96, 34, 48,113,165,175,107, 73, 39, 35,175,224, 52,180, +174, 15,113,220,216,227,234, 49,143,233,209, 40, 24, 3,231,215,243,247,106,128,198, 6, 1, 31, 35,223, 85,211,204, 59,128, 49, +233,223, 61, 58,233, 18,118, 3,231,221,140,226,178, 60,250,253,223,191, 85,209,220,253,157,189,127, 63,191, 84, 81,143, 33,215, +204,234,178, 6,122,231,177,237,249,242,254,173, 16,157,137,190, 6, 8, 78,112,112, 70, 7,124,143,196,244,243,233,162, 27,234, +126,239,234,213, 4,125,189,188,191,126,189, 18, 64, 86, 14, 8, 30,125, 1,207,244,255, 0,102,181,216,133,193, 78,224,142,199, + 7, 54,115,211, 61, 62,206,158,126, 99, 69,164, 14,128, 16,123, 15,151,236,213,189,146,233, 74, 78, 19,142,153,251,112, 63,171, + 71, 55,223,162,122,140, 28,224,246,249,233, 34,215,194, 71,174, 43,165, 61, 65, 57,232,123, 99,191,167,237,209, 9, 0,142,169, +249,103, 39,175,175,217,170, 64, 18, 71,145,233,231,230,123,231,229,170,232,200, 36,116, 29,135,203,168,243, 62,103,182,176, 73, + 61,123, 96,167, 21,209,156, 1,208, 14,195,241,243,249,104,148, 3,216,156,228,224,103,250,117, 65,160, 72, 29, 58, 3,231,163, + 16, 58,231,175,203,211,211, 73,191,175,207,108, 99,107,145,181,206, 58,159,236,114,180, 36,215,120,223,178,238,166, 92,121,134, + 54,178,207,191,175,249, 50,154, 42, 65,101,248,212, 39,104, 52,196,151, 17,213,181, 46,101, 96,132,144, 65,248, 62,103, 82,170, +147,119, 79,171, 52, 99,214, 12, 27,130, 56,200, 92, 43,154,147, 73,175,197,113, 32,149, 96,181, 85,136,238, 83,215,166,114, 61, +117, 30,111, 98, 93, 13, 12,206,226,110,249, 80, 74, 93,129,102,217,118,147, 11, 61, 22,147, 89,172,205,170, 73, 66, 84, 58,128, +180, 66,104, 17,242,215,110, 85, 89, 62, 34, 74, 78, 18,162, 18,178, 78, 2, 72, 24,243,252, 53,207,158, 33,214, 52,188, 67, 60, + 91,218,146, 56,163, 6,254,160, 73,191,190,242, 16, 55,233,143, 67,190,140,252, 57, 24,240,222, 10,185, 97, 89, 6,113, 87, 87, + 57, 12, 1, 4, 44,130,152, 2, 8,181,138,211,143,223,140, 91,113,184, 80,224,223,122, 90,127,248,197,225,195,111,141, 78, 74, + 74, 28,185,236, 6,100,109,189,210,202,149,255, 0,194, 25,155,109, 45,182, 30,116, 14,184,114, 58,193, 35, 36, 29,114,235,126, + 61,136,232,153, 30,101,195,194, 78,234, 11,142, 74, 18,167, 81,180, 59,192,184, 84, 27,145,224,126, 38,225,219, 27,129, 13, 41, +129, 85,124,254,171,109, 79,106, 42,220, 56, 5,240, 78, 79, 93,141,126, 51,110,161,151, 93, 72, 82,213,250, 21,147,128,162,159, +242,172,156,116, 75,192, 96,143,245,128,214,109,101, 34,179,125, 87, 98,219,150,188, 73,117, 58,171,235, 8, 75,113, 88,113,228, +190,130,160,148, 6,130, 7,194,176,163,212,158,137, 41,207,108,226, 37, 67,197, 89,254, 85, 44,107, 65, 92,242,128,109,202,127, +172,140,251,130, 53,244,131,234,154, 77,174, 21,133,241,105,113, 79,128,254, 26,113,109, 13, 76,249,182, 65, 22, 83, 80, 16,177, +174,164, 11, 73, 52,123,127,120,210, 70,162, 57,108,123, 78,146,165,250,169,223, 16,133,191,246,226,251,218,171,186,173, 97,110, + 77,165,112,216,183,165, 5,229, 49, 86,182,110,106,115,212,202,172, 69, 5, 40, 7, 80,219,163,150,100, 37,129,150,164, 48,167, + 88,117, 63, 19,110, 40, 29, 97,233,193,243, 24, 29,250,143,184,116,215,232,143,190, 62,204, 45,147,226, 95,110, 34,219, 28, 90, + 85,225, 64,173,211, 34, 4,217, 87, 45, 7,192,123,116,108, 57, 14, 35,197, 13,193,172,182,131,239, 52,194,172,248,180,249,101, +232,171,201,194, 80,172, 40,106, 85,157,236, 48,246, 94, 89, 49, 96, 11,150,111, 16, 59,185, 80, 43, 83, 18, 93,168,222, 84,251, + 54,159, 41,214,155,241, 92, 81,129, 64,166,133,196, 36,117, 74, 67,170,207,108,116,206,173,202, 63, 17, 40,214,142, 55,205,233, + 13, 21,112,217,227, 87,141,135,185,128, 46, 29, 67,117,210,202, 74,244,212,246,213,142, 20,207,126,143,124, 95, 14,119, 61, 31, + 6,200, 56,195, 36, 55,104,107, 68,114, 83, 2, 59,199, 46,168,204, 70, 69,177,250,200,100,120,157,124,223, 84, 73,137, 96,225, +130, 70,121, 22, 8,237,202,133, 96,250, 28,227, 72,168, 32, 0, 58,146,113,140, 31, 63,151,222, 53, 61,230,125,146,190,201, 76, + 62,208,225,254,252, 87,128,217,112,248,251,193,118,173,197, 4, 39,152,242,173, 11, 29,115,211, 32,117,193,211, 69,186, 94,193, +159,103, 5,247, 75, 55, 6,222,220,187,247,177,170,142,168,178, 84,212, 27,150,141,124,210, 39, 70, 74,144,228,182,226,199,187, +233,222, 60, 23, 11, 1,196, 7, 82,242,195,107,113, 42,240,151,142, 83,177, 77,226, 46, 75, 83, 47, 41, 81,193,177, 55,242,216, + 0, 46, 73,185, 22,183,223,238,190, 25,235,190,143,254, 42,229,177,123, 69, 87, 14,170,171, 21, 80, 22,161, 11, 51, 57, 1, 84, + 2,160, 93,137, 3,114, 63,142, 35, 1,192, 79,179,155,127,248,252,190,165,208,246,210,151, 26,220,219,219, 90, 68, 49,185,187, +209,119,179, 45,157,189,219,184,210,112,227,112,228, 57, 29, 33,219,162,244,145, 27,153, 80, 40, 80, 57,165, 61,128,236,151, 33, +196, 10,146, 38,173,194, 71, 5, 92, 32,251, 61,109,198,127,137, 11, 71,248,111,187,134, 47,186, 92,156, 68, 95,208,233,213, 77, +203,169,188,166,210,220,230, 45,176,210, 20,198,221, 91, 60,222, 42,147, 78,163,161, 14,132, 16,169, 50,102, 40, 41,100,251, 2, + 70,221,108,222,222,208,118, 35,135,219, 98,141,182,187, 99,183, 80,221, 22,253,169, 5,240, 28,175,120,202,109,117, 43,158,224, +172,168, 42, 69,193,113,212,166, 35,154,109, 86, 73,117,239,122, 88, 75,220,172, 22,219, 70, 15, 39,112, 35,202,153, 34,108, 9, + 83, 16,228,242,167, 30,167,205, 67,209,101, 60,247, 40, 75,203,132,133,184, 16,103,115, 6,213,204,193,117,183,249,130, 73, 35, + 5, 53, 87, 20,120,131, 91,154, 84, 73, 73, 68,198,158,137, 73, 10, 65,221,198,214,239,181,250,134,185,234, 8, 61,113,217, 30, + 12,253, 20, 41, 50,184,169,243,158, 45,133,115, 76,244, 44,114,114,236, 90, 10,109,118,101, 69, 7,109, 69,110, 68,166,247, 32, +244, 91, 5,122, 46, 93,207,151,112,185, 82, 84,201,237, 85,196,152,174,184, 88,241, 23,239,197, 8,146,129,239,112,210,195,217, +143, 82, 97,220,134,151,240, 7,148,160,230, 82, 64, 42,108, 46, 11,170, 52,200,142, 42,108,229, 75,154, 25, 10,128,251,176,220, + 69, 62,231,164,248,160, 73,129, 34, 43, 32,148, 79,109,191, 21,101,149, 97,198,164, 54, 36, 52,149, 5,184, 19, 97,136,251,117, +212, 9,207, 47,222, 75, 83,204, 70,166,198,109, 84,203,178,149, 49, 96, 25, 28,237,178,132,166, 28, 66,181,167, 45,188,144, 84, +217, 47, 45,181,163,161,199,231,178,168,238, 61, 67,174,165, 50, 30, 68,210,138,101, 69, 41, 66,226,214, 24,154,175, 18, 68, 23, + 25,200, 16, 43,237, 53,206, 89, 40, 41,101,229, 18,227, 11, 67,153,107, 85,228,149, 94,103,214, 88,177,181,218,251, 49,190,198, +219, 19,126,194,199,107,117, 59, 14,220,202, 56,115, 41,161,100,166,134, 46, 65,164,220,199, 24, 80,202, 6,149, 99, 29,208, 93, + 86,200,179, 38,148,109, 12,205,160, 36,107, 36, 87,151,170,161,165, 46,223,113,167,151, 78,170, 42, 43,148,218,139,143,133, 60, +212,244, 50,100,136,203,150,242,135,136,250, 60, 22,164,198,112,144,183, 19, 29, 76, 58,165, 45, 0,185,112,131, 94,118, 83,239, + 68, 41,110,145, 84,110, 85, 61, 77, 75,109,178, 94,166,215,169,104, 8, 67,209,226,188, 8,118, 28,136,175, 69,146,129,147,227, +180,167,144,130,160, 73, 24,237, 74,148, 41,180,184,241,225,200,118,224,181,231, 71,136, 98, 84,161,159, 30,183,110, 75,101,207, +122,101,135, 67,139, 34,171, 78, 67,173,161, 72,116, 98, 92, 85,128,204,132, 60,193,241, 18, 44,199,101, 84, 85,252, 43,112,177, + 42, 84, 4, 52, 95, 52,245, 4,179, 84,167,160, 46, 60,163,202, 84, 82,137,173,158,119, 35, 43, 36, 50,180, 41,160, 2, 22, 0, + 48,114,196,178,177, 80, 55,211,178,238, 64,223,114,118,234, 70,226,196,234,190,160,112,250, 40,232,234, 98, 13, 29,180, 72, 74, +135, 58,129, 51,142, 88, 77,113,191,149, 76,133, 66, 76,142, 54, 49,137, 46,240,201,115,180,187,121,113,159,112,167, 74,168,126, +134,164, 39, 75, 21,246,192, 76,150, 24,152,101, 59, 6,160, 22,251,164, 23, 22, 86, 34,169, 37, 64, 41, 77,186,215,114,156,150, + 43,139, 43, 97,169, 85,218,101,105,162, 25, 69,219,106, 92, 52,234,159, 51,106,114, 59,213,187, 98, 11,114, 96,186,162,129,133, + 58,105, 47, 71, 91,228,165, 74,112,210, 83,241, 18,146, 11,135,106,214, 98, 78,172, 73,102, 43,177,164, 67,184,105,116,249, 76, +184,164, 4, 42, 59,240, 23,245, 98,155,113,151,208, 49, 37,216,174, 66, 88, 82,250, 45,200,200,202,137, 72, 26,161,196, 82,249, + 44,237,191,114,123, 77,202,228,191, 13, 50,108,176,183, 27, 75,109,213, 41, 83,161, 73, 7, 42, 42, 37,230,219,111,224, 71, 41, + 82,129, 72, 56, 26, 82,178,211, 80,176, 96,117, 33, 87, 27,130, 65, 15,123,139,250, 43, 17,247,133,176, 59,154,251, 35,230,229, + 30, 34,101,181, 84,209,154,121,115, 5,168,137,162, 38,222, 89,169,228,145, 35,177, 23,211, 13, 74, 42,128,222, 98,209, 33, 93, +247, 45,207, 13,114,155,103,122, 54,250,161, 33,214, 94,250,215,234,202,139,111,115, 54,235, 9,117,115, 33, 84, 25,247,117,161, + 36,186, 75,171,142,226, 92, 32,132,169, 8,234, 2,250,244,178,232,151, 46, 85, 85, 97, 46,180,218,152,141, 41,185, 10, 82,146, +133, 56, 87, 49,135, 28, 75,206, 54,128, 82,149,182,149,114,148,252, 73, 40, 42, 25, 63,173,202,173,165,149,245, 27, 59,105, 37, +133,198,106, 75, 46,199, 11,153,201,226, 56,179, 68,204,101, 51,206,133, 4,148,184,138,122, 64,229,229,233,145,221, 56, 61, 81, +185, 75, 51, 27,159, 80,109, 41,125,186,148, 24,239, 53, 37,180,135, 92,106, 52,136,171,113, 78,165, 68,140, 37, 16,223, 89, 4, +156,167,195, 25, 30,171,240,236,165,105,234,169,128, 26,161,150,226,251, 18, 25,116,220,216,131,250,167,125,192, 39,222,113, 12, +241,161, 4,252, 89,144,102,166, 63, 45, 69, 19,211,173,192, 32, 52, 53, 5, 73,183,217, 0,172,167, 96,196,253, 93,251,227, 89, +170,116,137,115, 41,150,180, 88,239, 52,228,155,128,190,219,171,105, 45,132, 20, 84,125,242,101,110, 97,109,192, 60, 15, 6, 4, +169, 41, 7,205,101, 42, 4, 30,100,235, 48, 98,100,183,170,109, 55, 77,129, 26, 53, 90, 77, 38,159, 64,165, 69,109,165, 59, 30, + 52,118, 31, 90,205,199, 80, 1,144, 68, 88,139, 74, 3, 44,182, 0,117, 80,218,100,243, 23, 20, 81,245,170, 20,128,229,191, 57, +231, 18,227,180,170, 21, 94, 83,170,231,105, 13,211, 41, 41,129, 19,194, 45,180, 74, 72,152,162,162,165,171, 24, 90,155, 91,121, + 64, 1, 10,190, 89,208,106, 49,147, 38,123,140,190, 42,215, 59,205, 63, 4, 41, 77, 7,232,116,248, 77, 39,221, 90,229, 3, 45, + 60,220, 25, 11,121, 77,164,169,180,203,154, 2,178,180,171, 50, 56, 55,242,106, 47,163,123,251,137,182,215, 39,127,128, 23, 32, +147,183, 70, 90,252,198, 22,163,102,103,142,115, 15, 52,168, 39, 72, 47, 37, 68,133,131, 88,139,196,145, 68,178, 49, 42, 54, 4, + 38,158,106, 17,126,147, 14,157, 74,146,213, 34,214,106,160, 3,145, 23, 72, 93, 65,214,154,147, 60, 45,214,208,171,150,181,227, + 40,145, 58,176,135, 20, 0, 88, 40, 71,191, 85, 50,133, 16,199, 40,204,233,149,217, 16, 81, 74,106,213,167,196, 41,166, 68, 93, + 61,218,202,202,222,163, 83, 36,180,202,163, 63,224, 83, 73, 82,235, 51,209, 30, 63, 41, 12,169, 45,248,223, 4,213,169, 74, 90, + 53,128,211,101, 42, 82,164, 55,109,135, 89,147, 41, 74,163,196,152,181, 2,229, 14,132,196,169,105,114, 84,194,235, 37, 15,213, +165,203, 74,222,142,144, 8, 75,184,116,146, 25,235,123, 77,126, 53, 26,159, 50,222,163, 82, 34, 87,170,209, 34,199,165,211, 98, +196,145, 42, 52, 27, 97,182,148, 76,169,143,206,119,244, 45, 5, 21,254,145, 74, 46, 58,167, 16,167, 2, 71, 51,139,214,220,104, + 21,172, 65, 37,238, 69,201, 58,119, 82, 55, 23, 34,254, 81,127, 40,177, 82, 54, 23, 48,154,250, 57, 42, 21,105,164,129,171,170, + 20,141, 98, 87, 0,144,254, 73, 38,170, 44,234,129, 19, 88,176,146, 78, 89, 34,103,179,171,162, 77,157, 81,164,143,123,163, 8, + 73,114, 60, 56, 14, 56, 25,153, 92, 82, 27, 64,113,230,129,159,116,212,234,141,165, 30, 35,232,150,149, 34, 26,138, 67, 35,195, +229,195, 64,160,161,215,163,214,229, 61,114,193,118, 3, 18,169,144,234,116,244, 83,105,213, 73,128, 42,170,162,244,180, 53, 84, +173, 73,139, 52,114,195,114, 72, 17,209, 13, 46,130, 91, 66,252, 80,144,164,132,233,150,102,139, 89,170,162, 58, 42, 11,109, 2, +156,194, 86,221, 33,181,251,181, 38, 42,218, 67, 77,174, 97,127,153, 78,214, 92, 14, 2,191, 29,239, 13,182, 62, 55, 80,210, 57, +121,206,113, 74,153, 54,127,189, 8,203, 67,140,225,184,143, 85,220,123,222,211, 87,121,197,162, 59, 80,232,138, 96,225,196, 37, +231, 93,231,158,158,124,173,226,166, 18,183, 1,113, 59,104,206, 7,217,212,166,214, 54, 39,125,193,177,184,189,190,201, 2,219, +129,115,109, 36, 64,115,202, 58,106,133,145,131,199, 51,172,111, 27,220,150, 84, 18, 57, 32,181,236, 38,119,102,187, 2,172,173, +245,138,161,227,115, 42,109, 53,183, 89,113,151,211, 75,165,167, 49, 32,171,220, 30, 90, 20,243,205, 83,164, 33,100, 75, 87,189, +190,190,121, 21, 18,250, 71, 48, 94, 91,105, 75, 43,121, 74,230,229, 45,103, 23,124, 32,112,213,237, 11,217, 74,166,193,241, 37, +103,179,117, 80, 93,247,138,133,163,115, 83, 94, 17,183, 11,108, 46,100,165,216,113, 47, 43, 30,236, 12, 41,116, 27,141,183,211, +202, 18,144,184,181, 22,208, 98,204,139, 46, 18,220,104,135, 30,225, 76, 56, 81,105,212,133, 48, 41,180,229, 70,162,206,126, 38, + 92, 98,148,206, 66,164,193,166,164, 45,105,171,200, 68,140,120,203, 37, 97, 47, 60,174,114,244,144, 80, 29,171, 42,165, 30,155, + 49, 51, 37,181, 81, 79,132, 15,185,196,151,151,234,114, 30, 44,248, 41,113,104, 4,248,238,184,148,190,180,184, 74,188, 52,182, + 16,234,154, 81, 58,124,203,115, 9,169, 39, 2, 57, 12,104,246, 82,172, 26,204,163, 72, 34,253, 44, 52, 92, 91,236,149, 12,133, +109,183, 62,241,103, 9, 69, 81, 77, 83, 52,208,150, 44, 27, 66,145,121, 36, 63,181, 37,206,204,250,129, 61,116,169,212, 89,131, + 43,201,249,104,123, 74,253,155,155,225,236,203,226, 10,102,204,110,202, 63,132, 86,125,198,138,149,127,100,183,134,155, 1,112, +237,173,219,177,225,202, 67, 75,152,211, 60,203, 77, 6,247,167,123,204, 54,107,180, 85,184,167, 33, 62,251,114, 35,170, 69, 54, + 84, 73, 46,115,200, 36,167, 25,234, 60,137, 61, 71,217,242,198,191, 92,191,104, 95, 2, 27, 99,237, 47,225, 82,247,225,235,116, +208,197, 6,191, 47, 55, 54,209,110, 43, 17, 27,149, 84,218, 45,211,165,197,120, 90,215,101, 56,171, 11,149, 13, 70, 66,225,214, + 96,115,165, 21, 26, 85, 74, 92, 66,166,214,227, 79, 55,249, 64,239, 46,206,238, 55, 15,155,187,185,155, 17,187,212, 5, 91, 27, +163,180, 55,157,106,194,190,104,165,101,216,241,171,116, 57, 30, 18,166,211, 37, 16, 5, 70,131, 54, 18,226, 79,167, 74, 70, 81, + 42, 5, 78, 52,132, 18, 28, 26,183,178,186,229,171,129, 84, 73,169,212,119, 35, 85,129, 0,134,181,188,202, 72, 5,128,210,110, +164,121,139, 34,115,126, 99,150,201,150, 78,208,177,215, 21,236,173,125, 91,218,250, 75,126,181,187, 55,113,190,246, 44, 91, 95, +135,148,129,156,147,147,205,212, 31,144,244, 3, 58,243,202,158,132, 96,121,118,234, 51,223,167,152,213, 84,132,144, 83,212,144, +122,231,250, 71, 93,121,229, 7,168,206, 61, 58,103,231,212,233,216,126,242, 48,223,133,202,123,243, 12,118,207,203,183,111, 61, + 32, 14,126, 17,140, 14,161, 90,245,202, 0,199,235, 2,114, 60,191,110,190, 5, 15,139, 57,201, 32,114,253,216,239,161,239,192, +233,108,123, 39,162,135, 78,189, 62,195,246,249,106,136, 10, 78,112, 73, 80, 61,113,230, 62, 64,254,122,234,166, 18, 83,202,122, +103,184,207, 81,130, 49,223,236,215,174, 80, 6, 9,201,199, 47,111, 46,189, 71,203, 89,192, 63, 27, 96, 53, 1,149, 31, 49,140, +143,183,211, 84, 10,122,103,152,159, 49,204,115,211,229,233,253,186, 57,109,140, 0, 0, 42, 35,161, 61,188,137,207,221,161, 86, + 58,145,216,118,198, 58,231, 30, 93,116, 48, 63,158, 1,112, 96,228,246, 63,119,203, 84, 21,220, 28,101, 35,160,235,242,245, 31, +102,138, 90, 22,121, 72,232, 51,231,247,231,247,104,117, 39, 61, 58, 2, 59, 96,249,104,234, 64,191,160,198, 65, 55,247,255, 0, + 60, 14,160, 50, 60,137, 24,206, 58,103,203, 61, 58,234,146,135,124,156,121, 99,160, 31, 51,219,236,252,116, 73,206, 49,128, 51, +231,231,251,123,106,130,209,216,142,152, 32,159, 63,195, 75, 14,184, 84, 94,215, 29, 79,250, 96, 55, 19,215, 9, 7,190, 79,166, +113,212,157, 10,180,231,174, 51,219, 30,163,230, 61,124,245,112, 94, 8, 35, 56,199,150, 58,254, 63, 97,208,174, 36,246, 79, 78, +132,250,231,203,175,160,237,165,148,155, 11,141,240, 1, 23,176,233,128,148,158,253,122,158,192,247,206,126,126, 93,116, 42,219, + 61,126, 33,142,248, 29,128,238, 64,251,180, 98,130, 72,235,144,115,140, 99, 39,215, 61,190, 90, 29,105, 56, 32,252,142,124,190, +223,195, 58, 58,223,238,254, 95, 39, 6,192,106, 72, 24,199,207,169,245, 30, 90,160,176, 6, 79, 92,227,183,145,249,118,249,104, +165,167, 61,148, 78, 62, 93,254,239, 93, 12,179,220, 30,157, 60,198,115,242,249,127,110,150,193,148,246,192, 42, 80,207, 64,115, +230, 7, 95,188,250,119,213, 21, 12,100, 99, 63,179,231,162,150,129,220, 12,103, 57, 35,191,246,104,101, 2, 7, 81,158,249, 35, +174,127,183, 74, 39,124, 40,187,129,129,212, 62, 68,122,250,125,199, 84, 23,140,143, 92,117,213,117, 19,215,184, 4,231,175, 66, + 79,245,106,130,251,142,158, 93,255, 0,118,149, 29,122, 95, 24, 34,198,227,107,126,239,159,158,216, 20,140, 18, 59,227, 75, 95, + 85,250,199, 75, 75, 13,192, 56, 53,129,222,221,113,224, 31, 34, 70,125, 6,170,115,117, 4, 36,146,112,146, 71,252, 62, 67, 84, + 57, 57,156, 74,190, 46,131,167,126,189, 72,198, 14,138, 73, 72, 0,249,103,174,123,247,243,198,181,201, 39,189,191, 44, 27,238, +190, 43,164,129,129,211, 63,236,245,233,243, 58, 32, 97, 35, 36,140, 31, 65,231,246,249,232,100,242,133, 16, 14, 78, 58,158,157, + 7,144, 58, 37, 4, 36, 28,167,155, 7,168,239,223,182,147, 44,119, 29,113,140, 86, 9, 88, 80, 33, 67,148,142,189, 58,147,229, +223,183,125, 16, 27, 14, 36, 37, 73,206, 14, 71,113,233,215, 84,146,114, 59, 96,121,126,113,162,219, 33, 61, 20,122,227,203, 61, +135,228,105, 51,107,111,211, 4, 38,221, 6,253,190,126, 24,172,132,132,167, 25,192, 31, 46,167,238,209,141,168,114,132,252,186, + 31, 95,234, 58, 17, 41, 24, 32,168,146,115,128, 59,159,179,174,138,108, 18,115,203,216, 12,131,215, 0,103,174,144,194, 71,174, + 42,227,160,207, 92,117,206, 62,223, 33,242,209, 40,194,176, 79, 64,124,186,245, 61,190,239,236,213, 16, 1, 81, 29, 64,242,237, +249,245,209, 45,130, 6, 1,237,228,113,147,251, 59,104, 99, 7,241,193, 13,224,100, 14,158,159,183, 68, 33,125,121,112,122,103, + 36,117, 25,207,111,219,170, 8,237,156, 12,250,116,207,217,159, 61,101, 86,165,169,113,222,213,218, 85,175,104,208,234,151, 29, +199, 92,154,205, 58,143, 67,162, 64,145, 83,170,213,103, 62,174, 86,162,193,129, 17,181, 57, 37,226, 79, 92, 12, 36, 30,101, 16, +144, 78,144,150, 68,141, 93,157,130, 34,110, 73, 54, 0, 1,212,158,192, 96, 14,194,219,159, 78,228,237, 97,234, 73,216,119, 56, +239, 95,177,184, 52,198,205,241, 34,250, 82,145, 37,219,203,111,154,116,243, 97, 74,140,138, 52,229,161, 36,121, 36, 56,165, 99, + 62,127,102,186,125, 58,178,168,165,224,240,108,180,227,106, 45,243,168,133, 3,219,224, 41,253, 99,156, 28,124,181,130,123, 43, + 61,153,123,231,176,246, 46,230, 76,226, 66, 69, 19,109, 99,238,172,123,102, 85,189,105, 61, 82,102,161,115, 83, 77, 53, 47, 41, +114,110, 56,241, 22, 91,166,201, 83, 79, 37, 41, 96, 41, 78, 35, 7,156,131,211, 91,183,187, 60, 21, 87,216,164,202,171,216, 55, + 44, 43,172,211, 80,185, 34,157, 13,254, 73,133,108,167,153, 73,110, 58,212,124, 76,167,200,119,206,185,175,140,211,219,115,250, +250,186,121,150,106, 87, 41,102, 86, 4,217, 99, 69, 62, 95,180, 64, 96, 69,237, 98, 6,161,177, 7, 30,160,125, 30, 51, 92,167, + 42,240,231,133, 50, 92,240,205,148,102, 10, 42, 3,172,240, 74,138,188,202,201,222, 50,206,202, 2,106, 70, 70,243, 90,193,183, +223, 26, 33, 89,187, 38, 56,211,173, 73, 82, 68,134, 29,100, 33,180, 43,195,241,146,165,129, 30,115, 42, 79, 82,234, 84, 82, 20, + 61, 53,220,158, 22,104,113,246,115, 98,169, 87, 66,163,180,230,226,223, 48,159,157,245,162,217,109,215,233, 84,130, 15,134,212, + 53,167, 42, 99,197, 78, 84,181,167,226,199, 98, 53, 30, 10,163,245, 54,234,111,196,144,202,209, 82,166, 75, 80,109,137, 72, 83, + 78, 49, 38, 59,153,147, 79,146,210,250,165,126, 35,100, 96,227, 24,215,127,118,138,242,164,110, 62,192,109,157,106,149, 47, 30, +229, 76, 54,197, 89, 17,150, 68,186,101, 86, 23, 51,106, 97,104, 7, 45,130, 23,217, 88,202,117, 28,118, 20, 81, 23,136,105,153, +198,204, 58,139,149,189,143,111, 45,236, 65,254, 3, 29, 5,199,185,104,158, 14, 29,203,164, 80,217,101, 77, 86,170,133, 93,209, +180,199,170, 20, 96, 14,241,187, 6, 37,127, 93,148, 45,136,181,242,106,229,223, 42,176, 31,122, 91,235, 11,114, 43,173, 63, 43, +152,169,199,159,143,135,153, 45,243, 30,101,243,182,162,159,187,215, 88,194,171,109, 42, 52, 22,155,105,229, 73,168, 62, 22,203, +206, 5, 45,198,219, 49,203, 37, 62, 31, 54,124, 70,223, 9,248,135, 92, 47,174,172,242, 97, 74,133, 54,150,235,136, 92,152,237, + 58,252, 89, 13, 45, 92,139, 46, 50,219,136, 74, 20, 9,248, 28, 41, 32,143, 62,190,122,188, 83, 18,164, 54,242,101, 71, 65,114, + 44, 22,132, 53, 40,114,187, 30, 75,239, 23, 82, 65, 72,234,224, 65, 70,125,121,117, 30, 87, 45,172,129,168,158,155,237,126,135, +115,211,189,187,236, 62, 56,127,142,130,130,138,154, 49, 79, 24,120,134,234,170,193,123,180, 96, 91,169, 10, 66, 18, 15,151, 77, +128, 4,226,231, 71,140,106,110,203,144, 95, 44, 50,131, 42, 92,249, 46, 56,161,202,196, 32,136,201,141, 24, 96, 36,190,183,201, +194, 51,149, 21, 28,117,214,187,111,102,251,181, 33,243,106, 81,228, 61, 14, 37, 33, 97,130,251, 50, 21, 30, 63, 51,105,194,152, + 98,106,148, 82, 95, 81,200, 60,195,245,138,142, 20, 14, 19,125,222, 75,250, 78,218,216,238,219,180,169,142, 42,187, 85,231,169, +204, 91,107,109, 14,183, 50,106, 86,182, 24,105,167,112,133,173,168,202, 43, 80,230, 79,199, 45, 56, 33, 67, 58,228,228,187,229, +250,132,217, 47, 75, 67,178, 96, 58,242, 83, 61,164, 56,226,208,226,208,181,175,198,125, 46,167,157, 35,226,117, 68, 43,152, 40, + 32, 32, 40,140,101,246, 58, 73, 18,147,146,135, 76,211,128,242,145,107,170,177,186,198, 9,237,250,205,184,185,216,218,219,233, +112,238, 72, 56,183, 63,169,204,229, 28,252,143,135,165, 49, 82, 40, 35,235,170, 18,203, 36,204,173, 96,202,132, 24, 98, 13,183, +146, 66,118, 56,218,122,181,245, 81,114,145, 37,110, 60,103,198, 97,207,125,165, 84, 31, 79,131, 90,163,190,219, 97, 10,108, 48, + 26, 9,169, 66, 90, 80,227, 47,128, 80,181, 33,204,169, 42, 79, 34,145,144, 27,238, 36,202, 77, 46, 61, 71,146,158, 91, 77, 34, + 80,129, 80,121,196,192,149, 37,107, 67,234,250,134,230,105, 96,211,223,104,169, 92,205,169, 77, 58,128, 83,145,140, 41, 90,141, + 75,174,173, 77,251,204, 9, 44,170,156,220,176,219,244,224,164,200,165, 79,117,183, 20,184,138, 75,160,173,218,100,118, 89, 33, + 75, 40,230, 73, 95, 94, 82, 7, 38,179,218,117,105, 35,154,151, 61,164,211, 34, 50,180, 74,121,186,147,237,205,163, 21, 60,162, + 29,110, 35,204,164, 37,216,238, 48,180,134,146,248, 5,180,189,243,232,211, 62, 92,169,112,162,228, 27,221,109,123,121,123, 16, +109,110,225, 46, 44,215,186, 62,199,161,242,220,190,156, 36,113,114, 47,203,109,107,162,234,192,145,231, 26, 47,177,110,190, 75, + 27, 13, 65,145,137, 24,220,138, 82,100, 86,167, 67, 85, 85, 5,217, 21, 54, 83, 26,153, 91,143, 41, 84,218,173, 77,175, 19,157, + 16,100, 78,167,184,142,105,169, 96,169, 46,243, 41,104,121,178, 22,223, 34,202,155, 23,250,140,137, 20,138,148,138,125, 82, 20, +234,253, 56, 69,122, 35,244,247, 86,135, 43,244,199,152,112, 33,197, 60,228, 96,159,173,226,132, 50, 84,121,113, 53,165,176,135, + 82,167, 71,194, 53,242, 20, 11,121, 84,166, 35,198,155, 38, 4, 37,169, 19, 41,142,209, 42, 19,225,165,233, 62, 34, 25,142,226, + 80, 30,113, 17,157, 66,149,252,196,164, 18,216, 82, 84,115,167, 38,148,205,126,152,227, 49, 97,220, 38,171, 81, 86, 91, 68, 26, +187, 13,248, 14, 69, 97, 62, 35,143,138,156,112, 22,101, 41, 15, 18, 22,226, 10,194,136,230,230,233,134,127, 42, 6, 37,206,199, +117,101, 43,181,186,143,180, 75, 2,110, 73, 96, 5,128,176, 42, 44,157, 77, 28, 1,181, 71, 86,166, 56,195,160,133,227,150, 34, + 10, 48, 60,200,165, 70,147,146,168,163,204, 71, 45, 85,148, 2,193, 25,163,195,167,111,214, 86,203,172,196,137, 45,186,155,174, +161, 10,167, 73,203, 62,227, 94,136,211,232, 33,202,160, 82,127,192,238, 54, 24, 88, 10,120, 37, 1,208,149, 43,151,151,153,182, +170,166, 34,105,117, 25,181, 40,161, 79,194,159, 53, 78,221,148, 2,130,244,202, 62, 11,173,203,168,196,140,210,177,239,188,139, + 79,188, 52,148,143, 25, 25,113,159,210,140,171, 8,167, 26, 85, 94, 65,131, 35,235, 11,102,226,130, 87, 49,132, 48,166, 27,155, + 34,167, 24, 20, 49, 81,133, 37, 81,151, 26,170, 90,112, 31, 21,124,188,252,170, 13,201, 72, 73,201,204,105,149, 74,157, 57,200, +147,110, 38,154,139, 18, 67,205,195,153,115, 70,104, 51, 79,155, 83, 70, 23, 21, 85, 85, 0,161, 70,146,242,249, 2, 78, 76,126, +101,128,219,173,128,148,235, 34, 80,196, 0,231, 83, 92, 1,220, 90,204, 10,145,112, 0,185, 42, 1, 2,236,108, 45, 99,136,197, +109, 57,134, 90,147, 78, 60,243,173,165,136,149, 15, 48,189,215,148, 86,241,202,190, 93, 81,152,134,165,148, 13, 11,202,242, 35, +169,110,248,110,177, 16, 67, 42,158,104,128,170, 20,215, 22,194,141,110,142,176,131, 25,131,225, 54, 11,133, 84,196,180, 99,164, + 18, 82,252, 36, 58, 2, 73, 90,181,243,137,137,169, 94,219, 91, 8,140,165,159, 30,241,143, 84, 66,139,156,202,240, 96,192, 62, + 18,156, 82,206,124, 78, 89,140,129,203,241, 21, 30, 76, 19,163,109,106, 99,148,203,129,215,161, 22,149, 70,170, 36, 45,108,171, + 31,224, 53, 5,243, 58,217,101,215, 79,193, 25, 79,185, 33, 32, 39, 1,165,190, 66, 50,135, 15, 45,187,123,227, 46,167, 87,178, + 45,198, 26,115,194,143, 66,171,214,144, 26, 91,156,200,171, 26,148,118, 84,145, 31,151, 10, 8,167,198, 11, 4, 31,135,197,207, +235, 37, 39, 74,201, 56, 20,179, 48,220, 2,160, 89,137, 27, 48,218,251, 92,218,224, 27,108,182,181,237,189, 90,213,112,199,197, +185, 37, 66, 63, 50, 26, 82,245, 33,186, 21, 2, 41, 29,149,214,224, 41, 89,127, 85, 64, 0,155,129,164,168,195,121,106,210,157, + 49, 16,180, 67,123,221,105, 23,132,151, 98,143, 8,133,181, 9,233, 2,160,114,132,149, 41,152,202, 77, 80, 0,122, 20,224,133, +140, 19,174,145,216, 85, 22,174,139, 58,117, 20,167,255, 0,116, 45,215,218,183, 92,253, 48,116, 59, 66,168, 71,135, 84,162,201, + 91,137, 33, 46,115, 83,165, 76,101, 96,101, 41, 92, 44,103,200,106,117,145,110,169,112,231, 15, 1,196,123,195, 84,153, 12,178, + 20,148, 41, 94, 28, 38,226,200,119,157,100,120, 95,165,138, 1,112,228,146,114,114,161,173,186,219, 8, 70,145, 86,150,137, 9, + 45, 70,158,138, 76, 55,148,216, 65,109, 45,150, 86,152,239,128, 57, 65, 12, 75,229,234,122,225,213,148,244,209,114,119,104,171, + 4,128,125, 92,254, 87,191, 96,110,192,158,223,104, 2,109,189,142,214,189,197,123,226,102,115, 14,101,151,130,175,170,167, 41, +126,116, 54, 59,220, 24,181, 41, 23,243, 93, 94, 65, 97,177,125, 39,160, 56,182, 92, 20, 69, 77,185,225,210,208,218, 12,121,177, +214,245,101,132,175,147, 20,200,207,169, 77, 67, 12,161, 64,187,239, 14, 55, 24, 58, 82,112,164,176,232,229, 32,231, 94, 29, 77, + 69,138,133, 70, 29, 29,163, 30,174,236, 24, 12, 74,171,176,182, 29, 93, 18,157, 80, 46,135, 10, 99,172, 22,209, 86,126, 34, 28, +247, 86, 74,249, 90, 42, 50,212,149, 37,164,133, 61,149, 74, 50, 96,174,108,231,227,148, 73,104, 70, 98, 34, 90,232,251,142, 52, +174, 65, 30, 63, 46, 28,230,126, 90,201,119, 25, 60,138,113, 64,225,189, 82,183,173,152,148,155,102,178,203,203, 68,215,166, 72, +114,183, 95,156,227,173,149, 84,171, 51, 30, 74, 27, 67, 12,173, 36, 52,203, 81,219,102, 60, 68,130,144,203,109,165, 36,133,120, +138,212,193, 31, 77,212,144, 72, 34,198,251, 27,245, 44, 15,154,214, 6,230,224,239,182,149, 3, 21, 18,113, 76, 43, 65, 3, 50, +137,214, 49, 12, 40,135,117,121, 29,209,158, 71,223, 75, 42, 46,136,204,108, 8,145,132, 74,193,144, 72, 75, 74,213, 54, 21, 45, + 76, 91,246,218, 94,139, 17,193, 28, 86, 29, 14, 46,115,208,212,249, 67, 77, 64,167, 72,144, 20,185,149,135,226,180,158,101,145, +202,195, 40, 83,141,144,227,200, 2,245, 21,216, 52, 92,248, 96, 70,161, 83,252,103, 98,197,145, 15,156,115, 78,109, 49, 66,157, +109, 1,110,205,152,167, 16,175,119, 65,203,206,130,172,229, 69, 42, 23, 85,184,213, 38,116,122, 77, 49, 30,243,112, 48,191,122, +156,175, 0,120, 52,218,131,205, 97, 18,106, 83,146,149, 4,194, 76, 0,146, 91, 88,241,164,101, 41,109,188,184, 10,126, 34,216, + 84, 0,137,213,234,155,149, 73,236,160, 76, 76,164,176,212,104,116,198,150,183, 7,131, 18, 42, 93,229,167,198,253, 69, 23,214, + 76,149,151, 57, 71,195,200,157,109, 69, 33, 82,243, 60,133,180,234,176,248,250,244,211,107, 91,226, 72,211,167,112,188,181,209, + 76,160,213,204,197,106, 0, 96, 24,179, 79, 82,204, 72, 51,121,144,128, 10,249, 98,149,218,225, 28,149, 89, 27,152,205, 94,144, +220,249, 80,209, 79,171, 70, 91, 20,181,184,135, 92,141, 50, 72, 14, 84, 76,118, 19, 36, 34,177, 25,151, 21,138,119,187,114, 19, + 21, 68, 12,117,150,149,132,150,213,150, 54, 98,220,136, 16,188,119,163, 67,101, 5,113,196,105, 72,165,185, 82,119,197, 5,126, +248,228,114,219,144,233,141, 70, 67,104,106, 56, 82,124, 82, 79,136,218, 88, 9,105, 88,156,247,222,169, 82,227,191, 45,232,212, +218, 11, 78, 71, 98, 59,143,161,113, 39, 84, 75, 46,153, 13, 76,172, 45,229,243, 37,135, 29,104,251,180, 52,101,110, 6,210,236, +148,169, 74, 12,138,140, 74,153, 50, 51,206, 33,177, 76,164,162, 59, 73,171, 73, 72,104, 78,168,197,125,231,124, 63, 6, 48,109, +102,142,200, 60,234, 28,229, 82, 93, 7,244,104,105, 39, 91,241,105,141, 99, 37,254,169,195, 11, 90,214,220,144, 53, 30,151,233, +216, 2, 62,226,207, 81, 79, 37, 64, 53, 1,150,150,100,144,129,164,144,145, 57, 33,117, 0, 73,102,157,197,144,162,146,201,229, +185, 91, 7,133,199,163,200,101, 79,198,131, 70,106, 76,183, 83, 33, 17, 40,212,166, 60, 24,241,189,234, 27,101,247,106, 85,121, + 13, 51,138, 77, 9,190, 85, 34, 58,146,217, 82,185,213,225,182,227,202,108, 33,244,163, 51, 30,132, 13,122,179, 61, 46,206,167, +178,218,106, 21, 83, 17,198,105,113, 16,255, 0,130,203, 84,152, 48,121,220,112, 58, 60, 70,144,219, 72, 14,202,154,226, 91, 75, +137,117,229,164, 37,133,166, 84,233, 54,205, 18,152, 42, 78, 72, 74,100, 38,109, 70,157, 75,167,176,101,215,110,185, 45,168,183, + 26, 21, 45,132, 58, 22,233, 81, 25, 47, 73, 45, 70,101, 9, 42,121,228, 37, 28,165,217,183, 32,206,171, 85,105,149,250,165, 82, +149, 14, 75, 94, 12,218, 69,174,167, 26, 93, 42,136,182,199, 51,171,157, 33,213,135,234, 53, 63, 17,100,187, 57, 41,104, 33, 40, + 8,142,218, 24, 74,121,221,169, 86, 22, 72,193,212,205, 96,202, 46, 67, 48,184, 22, 31,101,130,133,184, 4, 88, 49, 35, 72,181, +216, 86, 28, 81, 1,116,150, 73, 25,169,242,225,205, 66,229, 73,146,164,163,105,104,209,130,181,131, 0, 76,135, 75, 68,143,118, +149,228,145, 98,129, 95,138, 36,233,202,152,138,141, 93,169,141, 69, 80, 30,227, 5,244, 43,222, 82,165, 36,243, 74,171,176,208, + 41,106,160,226,222, 82, 83, 28,169, 98, 40, 10, 73, 90,220,201, 68, 52,254,150,111, 2,144,225,187,179,158,209,187, 10,132,211, + 79,213,165, 82,118, 15,137, 25, 20,246,210,148, 75, 91,140,190,246,200, 95,117, 36, 32,115, 57, 41, 10,102,175,109,202,146,122, + 41, 18,232,108, 40,225,134,134,166, 17, 71,172, 75,173,183,254, 28,202,224,136, 19,125,223,220,189,237,247, 37, 21,179, 37,214, + 81, 80,121,191, 1, 45, 16,166,130, 31,105, 33,106, 75, 76,149, 56,163,206,177,200,205,113,141,195,133, 51,141, 78, 12,248,147, +225,150,176,148, 59, 23,119,182,166,230,182,237, 57, 15, 97,150,105,151,140, 70, 87, 85,176,107,200, 50, 27,253, 3,177,111, 58, + 93,191, 49,181, 28, 41, 2, 57, 60,193, 74,200,158,100,149,102, 22,210,191, 88,166,198,203,123,107, 2,250, 84, 17,179, 17,170, + 37, 36, 88, 6, 45,176, 1,135, 60,241, 94, 80,210,197, 55, 50, 52,167,146, 27, 38,149,177,141,119,250,189, 44, 46, 13,254,219, + 16,222,117, 4,220,220,223,242, 16, 41, 10, 0,121,103, 35, 29, 63, 35,174,144, 0,146,129,231,232,122,252,251,246,242,213,103, +105,213, 58, 52,201,244, 90,252, 69,192,174,208,170, 53, 26, 21,114, 3,128,135, 96, 86,232,211, 30,166, 85,233,238,115, 96,133, +177, 82,139, 41,165,103,205,147,175, 33, 3, 57, 79,194, 14, 78,124,199,203,236,212,253, 72, 96, 25, 78,160, 70,198,251, 27,216, +220, 31, 76, 83,251,247, 22, 56,241,142, 65,215,160,207, 76,143, 35,229,243,210, 78, 79,144, 72, 39,250,186,145,142,218,250, 74, +136, 25,198,115,208,129,220,124,245,247, 36,146,124,191,217,244,236,126,205,103,127,191, 3, 30, 72,200,230,229,206, 58,121, 15, +199,215,251,117,236, 5, 31,245, 72,242, 7,190, 62,223, 76,233,114,133,144,114,164,245,198, 7, 65,219,215,238,215,190, 92,127, + 56,224,103, 31, 47,191,211, 67,221,233,129,138, 43, 71,124,156, 15,196, 14,221,186,244,208,171, 3, 3,191,166, 64,201,249,119, +249,234,232,212, 41,147, 22,132, 71,105, 74, 46,186,134, 91, 32, 16, 29,125,194, 18,211, 12,249,188,250,213,209, 40, 72, 43, 89, + 56, 72, 39,166,186, 71,195,191,178, 43,142,110, 36, 99,196,171,219, 27, 61, 83,178,237, 25, 97,151, 26,188,247, 98, 90, 54,206, +131, 38, 59,229, 63,225, 52,182,171,241,205, 66,178,148, 52,175, 16,166, 60, 5,115, 36, 97, 43,202,147,157,121,171, 41,169,236, + 37,148, 43, 55, 69,234,199,224,162,228,159,112,198,205, 37, 29, 93,124,188,138, 26, 89, 43, 38, 29, 86, 36,103, 32,122,182,144, +116,143,123, 88,123,241,204, 5,140,156, 36,231, 29,252,135,224,124,251,232,117, 0, 14, 70, 1, 7, 7,183,159,203,207,166,117, +177,124, 80,240,223,126,112,157,189,183,214,195,110,107, 49,211,119,216, 53, 54, 96,207,155, 77, 84,151,104,213,200,115,224,199, +169,209,174, 75,118, 76,184,204,185, 50,223,157, 79,148,219,177,157,113,166,212, 74, 28, 66,144, 20,218,181,174,203,234, 48, 7, +159, 79, 94,255, 0,111, 83,141,108, 83,203, 28,200,146,198,218,163,144, 2, 58,142,190,160,216,223,220, 69,240,155,199, 36, 18, +203, 12,200, 98,158, 22,100,116, 59, 50,178,157, 44,164, 14,132, 16, 65,247,140, 12,160, 58, 18,122, 12,253,253, 63,179, 67,171, +168,200, 61, 58,140,249,227,207,167,231,182,138, 63,173,208, 17,223,167,203, 25,201,252, 53, 69, 64, 1,142,253,115,246, 15, 67, +173,144,108, 65,244,198, 70,227,125,199,254, 48, 26,129,245, 28,189,186,140,125,224,250,245,208,171,192,201, 25, 7,255, 0,104, +122,103, 69,184, 70, 72, 57, 0, 30,195, 29,124,186,126, 31,179, 66, 47, 62,163, 30,158,121,249,116,210,202, 73, 23, 56, 0,108, + 61, 54,192,202,193,193,193, 4,247,206,116, 58,199,159,175, 67,233,162, 87,235,229,140,122, 96,250,252,244, 58,129,201,200,200, +251,113,131,219, 56,209,199,198,216, 54, 6, 88, 0,100, 39,175,203,167,231,251, 52, 43,131, 39, 36, 2, 64,236, 58,254, 63, 61, + 22,231, 76,100,244,201,251, 60,134,132, 80, 30,188,221,127,104,193,245,251, 52,170,155,223,107, 91, 25, 22,223, 2, 44, 12, 18, + 70, 49,219,212,117,237,161, 87,243,234, 15,111, 44, 31, 92,249,249,232,197,140,103,249,222,127,105,251, 6,133,115, 24,236,123, +246,244,239,223,229,165,147, 10,139, 27,123,190,126,126,252, 12,188,246,199, 76,103, 62,152,254,142,154, 13,206,249,201, 78, 51, +156,140,231,211, 31, 46,250, 49,194, 2,122,244,243,207,151, 79, 93, 90,212,167,148,162, 20, 50,159, 34,158,248, 35,184,244,210, +152, 2,247, 55,232, 48, 59,171, 82, 85,220,156,231,177,199, 79,179, 75, 84,137, 89, 82,129, 64,192, 61, 9,238,125,123,157, 45, + 11,159, 92,102,195,211, 7, 1,145,228, 49,230,115,215,175,153,251,245, 85, 41,199, 65,212,158,255, 0,159, 77, 82, 78,114, 7, +145,207, 79, 35,223,203,237, 26, 37, 0,231, 61, 49,231,219,242, 53,130, 1,198,113, 85,164, 37, 39, 24, 29, 70, 51,230,123,121, +232,129,156,245, 31, 8, 29,193,235,233,231,223,190,169,163, 29,176, 58,117, 7, 26,244,121,242, 2, 82, 20, 60,250,224,142,189, +251,246,210, 76, 0,248,223, 3, 5, 39, 29, 51,146, 59,252,240,123,103,174,138, 64,206, 8, 35, 31,183,240,208,109, 54, 70, 78, + 78, 73,235,147,144, 6, 78, 6, 51,215, 70,163, 57,233,142,157,199,203,229,162, 27,218,255, 0,203,124, 17,187,155,224,134,240, +161,156,231,174, 64,235,211, 29, 63,164,104,132,168,143, 60, 14,199, 24,243,245,249,127, 86,168,160, 96,103,207,203,243,246,141, + 16,132,224,228,245, 7,174, 63,160,231,215, 73, 16, 5,253,223, 39, 9, 28, 86, 71,127, 62,223,143,231, 58, 44, 1,220,122, 99, +160,192,252, 52, 58, 82, 7,219,143,207,238,213, 86,242,162, 60,134,112, 57,142, 0,243, 42, 62,128, 12,232,167, 5, 97,182,231, +108,101, 54,149,175, 93,188,238, 42, 37,171,108, 82,103,215,174, 43,142,169, 10,139, 68,162,210,216, 92,170,133, 82,169, 80,121, + 49,225, 64,134,195, 96,151, 31,113,229,164,118,194, 70, 84, 72, 0,157, 78, 55,217,195,236,235,180, 56, 5,219,136,183,189,229, + 6,143,114,241,101,120,210,144,245,197,112,186,195, 83, 99,109,101, 38,115, 41,113, 22, 77,152,167, 82, 66, 42, 9, 66,147,245, +132,212, 0,227,174,130,132,144,210, 64, 58, 65,236, 48,224, 78,145,183,150, 91, 28,115,238,229, 25, 47, 93, 23, 10,101,211,120, +127,163, 84,163,165, 73,163,211, 57, 87, 30,165,184, 46, 48,226, 73, 76,201, 4, 45,184,107, 35, 40,101, 37,105, 33, 78,103, 93, +206,171,207,168, 77,158,242,214,234,165,120,206, 45,240,239, 57, 83,188,203, 36,252, 62,157, 9,239,170, 51,196, 46, 48,105, 37, +147, 42,160,151, 76, 16,146, 37, 96,109,169,129, 27, 92,118, 83,208,119, 32,181,143,145,135,112,125, 25,188, 13,143, 54, 16,113, +223, 19, 82,137, 17,172,244, 16, 72, 60,170,157,125,165,213,191, 93,246, 49,126,194, 16,247,212,254, 92,102,175, 95,155, 82, 46, +162,100,151,208,236,151, 84, 86,135,157, 83,143, 45, 96,146, 94,142,181, 28,149, 31,231, 39, 61,245, 66,141,115,205,137, 57,175, + 1,247, 75, 76, 35,195, 76,148, 41, 72,125, 46, 37, 67,149, 50, 80, 63, 89,178,122,100,246, 29,245,245,218, 59,147,164, 45, 78, + 62,215, 50,202,148,134,101,254,133,244, 62,145,140,180,188,124, 11, 56,232, 71, 67,171, 83,148,233, 49,170, 13,190,247,248, 44, +245,182, 90,104, 56,144,150, 39, 33, 63, 10,154,125, 67,225,241, 20,158,202,245,193,243,213, 56,106, 88,146,193,203,105,235,239, + 59, 19,191,201,199,127,158, 23,202,218,157,233,146, 24,236, 81,136, 80, 46, 1, 43,107,143, 46,174,130,197,183, 3,169,212, 47, +102, 23,138, 45,142,166,222, 16, 42, 27,183,108,211, 81, 10,232,163, 70,247,155,186,155, 13,174, 83, 92,132, 0, 8,170,165,134, +192, 6,115, 39, 5,106, 72,203,136, 86, 73,233,166,207,131,205,208,115,108,174, 89,118,133,206,234,163,216, 59,146,166, 20,169, + 42, 82,136,161, 93, 77,252, 49, 42, 33, 4,225,182,215,204,148,185,216, 20,171, 61,198,186, 27,110,114,132,166, 53, 69,148, 59, + 30, 90, 23, 25,101,236,171,154, 43,201,240,223,133, 36, 17,241, 35,145, 74,229, 39,161,215, 63,238,253,167,145,106,238,109,193, +110,177, 27,154,158,103,166,165, 71,109,208, 75, 65,135,207,188, 66,117,149,227,252,159, 41,228,233,219, 3, 75,181, 66,188,109, + 27,157, 72,221, 61,223,199, 99,123,219,220, 65,219,108, 51,192, 88,210, 85,228, 53,174, 76,116,104, 30,157,201,185,229, 35, 0, + 2, 19,125,224,147, 75, 37,239,101, 33, 13,213, 69,250,103,114, 80, 10,102,173, 46, 58,164,199,113,180,212,163,184,159,141, 18, + 38,180,144, 27,150,219,136,255, 0, 40,194,218,193,244,234, 52, 13, 53,152, 76, 85,228, 75,126, 75,175, 83,218,112,212,170, 11, +111, 28,170,135, 77,132,169, 78,242,115, 15,209,175, 45,242,143,153,236,117,227, 97,231, 85,171,148, 38,109,155,155,154, 91, 20, +248,232,126,139, 84, 87,199, 38, 34, 85,134,223,163, 74, 82,186,185, 28, 40,126,141, 95,205, 7, 30, 67, 69,110,125, 33,219, 19, +109,119, 58,172, 90, 66, 93,116, 66,166,211,214,225, 63,160,250,214, 82, 3,169, 64,233,241,150, 27,112, 39,168, 3,155, 62, 88, + 58,244,144,243,106,233,148, 11,197, 35,128,123,129,109,205,246,238, 6,199,184,235,108, 71, 42,184,155,216,242,188,198,154,162, + 95,237,180,208,232,140, 11, 90, 66,236,136,172,189,245, 3,160,145,212, 16,122,249, 73,227,159, 17,187,137, 50,231,190,101, 63, + 18,112,228,140,252,162,176, 30, 62, 10,228, 73, 82,164, 22, 95, 72, 63, 2, 91, 10, 66, 22,112, 8, 82, 66,185,126, 28, 29, 79, +145, 81, 80,168, 42, 68,213, 63, 12, 37,188, 63, 45,130,209,128,132,156,150, 26, 75,203, 73, 74,254, 39, 10,138, 92, 67,124,164, +229, 42, 25, 25,186,221,245, 35, 87,185, 43, 18,155, 90,227, 77,126,164,251,143, 7,129,118, 51,188,178, 11,120,144,148,242,135, + 91,232, 71, 50, 10, 92, 36, 36, 39,211, 88,139,213,131, 77,117,196,212, 27, 16,219, 83,220,225,196,169, 47,211,101,161, 71,194, + 11, 92,133, 4,174, 9, 66,203,105,113,183,145,240,248,193,124,202,108,130, 38, 34, 59,179, 29,137,125,253,230,246, 63,127,165, +250, 13,186, 11,218,248,225,108,186, 60,159, 36,202,104, 33, 80,239, 79, 18, 6,232, 36, 44,108,206, 88,216,171,134,102, 58,137, +189,193,232,183,182, 51,138,107,197,167, 35,145, 32,194, 75,137, 45,162,170,204,129, 26, 59,172, 0, 57, 16,250, 88, 42, 67,173, +168, 44,132, 33, 97,105, 81, 89,194,193,192, 15, 21,183, 34, 93,189, 17,133,173,196,213, 88,150,133,188,239, 51, 44,199,149, 29, + 45,142, 86,210, 82,135, 2, 38, 68,112,144,144,148,168, 41, 39, 32,133, 0, 2, 89,200, 80,154,117,109,186,212,100,199,139, 80, +101, 13, 33,216, 78,199,114, 51,238, 37, 74, 91, 78,189, 27,148,178,231, 80,164,172,130, 9, 41,201,238, 14,179,250, 11, 83,227, +182,194,154,145, 2,161, 25,212,187, 44,196, 66,213, 18,124,111, 5,107,100,166, 20,148,169,198,211, 12,115,175,153, 42, 74, 80, + 70, 78, 78, 51,166,186,192,172,178, 6,109,136,220,117,189,189,227,117,177, 30,160, 27,119,233,139, 14,158,162, 39,142, 0,101, + 66, 93,128, 10,247, 70,216,130,108,214,176, 96,108, 65,243, 95,175,187, 27, 7,111,210, 27,168,182,211,116,199,151, 78, 75,232, +110, 83,209,169,177, 26,125, 10,125, 72, 91,143,187, 34, 34,142, 34,172, 0,129,128,132, 45, 73, 72, 9, 43, 56, 80,206,163,202, +184,216,125,223, 26,158,154,225, 56, 80,114,142,180, 69,150,162,178,150,227, 46, 61, 62,106,200, 76,129,146, 74, 91,146, 28, 87, + 54, 67,121, 73,211, 37, 69,159, 9, 83, 19, 42,175, 34,171, 13,106, 74,227,154,156, 84,200, 79,185,120,108,229,135, 25,169, 81, +213,250, 96,176,134,208,128, 65, 64,248,130,145,141, 58,116, 74,219,236,148,159,175, 97, 86, 33,180,182, 20, 87, 17,108,199,169, +180,216, 91,106, 47, 79,130,128, 61,245,230,208,113,204,207, 34,215,156,148,247,212, 94,170, 25,163,109,148, 76,140, 5,245, 41, +218,254,142, 8,213,107,116, 44, 47, 97,229, 55,198,205, 75, 85, 29, 71,255, 0, 73, 68, 85, 96,178,164,159,111, 98,202,179, 71, +229, 98, 69,134,130,202, 77,238, 0, 83, 96,239, 82,107, 84,106,164,152,205,214, 16,245, 17, 75,247,101, 22, 43, 1,232, 83,105, +203,136,165, 50,229, 98, 34,151,202, 17,226, 61,202,145,202,178, 48,162,146,142,250,216,251,105,128,186, 36,170,100,211, 22, 67, + 77,176,209,122, 60,214,153,145, 30,167, 10, 65,240,214,164,164,158, 79, 13, 73, 45,115, 37,224,181, 33,120, 81,230, 79, 42,131, + 59, 69, 16,106,201,139, 50, 64,129, 87,142,243,161,150,146, 80,211,168, 90, 71,134,148, 54,236, 25, 3,150, 43,129, 5,101,229, + 41, 92,199,162, 51,130,112,245,208,236,136, 14, 52, 88,165, 63, 50,139, 34, 51,197,246, 98, 51,239, 14, 83,216, 91,139,113,121, + 76, 73,110,172, 58,223, 48, 72, 13,160,134,135,112,144, 6,154,194, 70, 23,117,229,143,129,216,236, 71, 80, 47, 96,118,184, 4, +222,231,114, 6, 41,222, 44,205,105, 4, 73, 28,205, 45, 7, 45,193,177,250,212,141,149,187, 31, 44,137,107,144,124,172,109,102, +184,117, 1,243, 59, 82,158,154, 90, 88,167,200,142,181,210,164,169,181, 70, 81, 89,144,237, 61,164, 97, 8,142, 95, 89, 89,114, +156,227,128, 6,143, 58,148,202,185,146,172,161, 73, 41, 58,230,163,187, 82,190,163,190,164, 15,240, 15,170, 97, 12,245, 79, 47, +184,169, 46, 41,174,193, 14,169,111,140,231,161, 40,198,122,227, 89, 5, 18, 3,176,154,143, 6,166,202, 9, 1, 73,143, 61,174, +116,199,117, 99, 11,126, 47,134, 18, 84,193,229, 10, 37, 10, 37,180,225, 64, 40, 28, 13,100,168,166,120,245,217, 15,133,120,168, +146,220, 87,219, 46, 28,171, 6, 52,112,158,128,225, 60,175, 70, 87,197,205,140, 40, 16,112, 64,214, 42,193, 90,101, 10,126,211, +169,184,233,123, 31,188,110, 72,220, 3,125,207, 67,138, 55, 49,206,155,219,234, 42,132,129,216,197, 32, 46, 15,145,195, 50, 2, +235,191, 86, 80, 85,250, 18, 70,227, 86,166, 57,149,157,109,178,148,183,224, 71, 1,183, 35,200,142,217, 40, 25, 72,109,212,201, + 82,185, 20,122,144,165,158,100,158,128,171, 25,198, 50,253,209, 40,136, 75,137, 56, 90, 16,244,102,139,216, 60,229, 92,174, 20, +160, 14,224, 59,241,225, 62,105,200,244,214, 51,107,195,108,165,151, 16,146, 22, 20,133, 20, 2, 74, 64,121, 60,138, 65, 87, 76, + 96,117,207,114, 8,243, 3, 79, 5, 53,182,146, 64, 57,193,111,145, 35,178, 84, 80,226, 28,232,165,126,162,177,219, 31,234, 19, +220,105,223, 44,132,121, 88,223, 77,198,253,250,119, 62,253,247,252,113, 75,113, 30,119, 60,175, 32, 4,249,186,239,191, 91,252, + 54,176,222,214,184,191,174, 50, 89, 20,195, 81,143, 72,144,180,173, 79,134, 84,226,176, 3,206, 10,131, 10, 49,156,120,149, 12, +182, 3, 33,100, 31, 37,188, 73,238, 14,172, 46, 81, 36,215,106, 78,136, 82, 13, 46,159, 29,244,173,218,140, 98, 3,147, 86,130, +148, 42,159, 79,101,212,148,184, 90, 82, 9,117,242, 64, 39,157,182, 86, 64, 39, 89,163,142, 4,210, 26,113,106,112, 18,169,104, +109, 13,148, 32,151, 20,219, 9, 95, 85,156,163, 43, 88, 5, 64, 16, 3,157, 50, 73,215,199, 43, 45, 65, 83,113, 91, 14,161,136, +145, 25, 84,196,198, 1,231, 22, 91, 74, 20,150,219,107, 33, 42,116,156, 18,165, 16, 57, 84, 58,142,131, 82, 86,141,140,129, 80, + 14, 99, 42, 29,250, 93,128, 39, 98, 55,238, 64,233, 99,214,219, 98,176,130,186,186, 61, 66,153, 3,200, 12,138,151, 0,172,107, +174,228,216,130, 24,139,170,168, 32,128, 73,218,246, 35, 9,159, 71,167,209,161,120, 20,248,236,194,134,100,203, 91,178, 29, 95, +186,251,203,202, 90, 28,149, 81,118, 76,215,143,188, 39,196, 74,202,151, 33, 97, 35,155,151,196, 40, 72,195, 37, 84,174, 73,169, + 84,154,106,129, 77, 18,105, 49, 10,229, 68,157, 80,241,218,102,167, 32,224, 55, 84, 90, 25,111,222,102,198, 15, 5,251,154, 64, +109, 11,229, 46,180,231, 39, 33, 15,133, 74, 59,117,246,189,234,168,242, 95,136,212,199, 36,199,182,218,105,167,105,241,249, 74, +146,211,181,151, 92, 73, 53, 87, 2,149,206,150, 9, 76, 54,221, 64, 80,109,197, 32, 43, 88,189, 94,149, 6, 43,205,191, 86,230, +247,217,135,221,162,211,216,142,170,140,185,124,205,173, 45, 70,131, 10, 58,124,106,140,226, 75,124,160, 0,202, 50, 8, 82, 18, + 57,198,220, 72,224,134,210, 45,176,191, 96,122, 95,208, 6,189,206,219,216, 29,247,196,207, 33,174,134,153,155,219, 85,171,171, +156, 48,220,187, 89,207, 83, 96, 67, 75, 32, 91,221,193, 17, 45,216,175, 48, 50,178,224, 84, 74, 44,154,236,184,109, 72,113,234, +237,116,165,197,177, 54, 82,143,185,194,138,164,184,249, 16,105,241,143, 44,103,208,121, 50,164,146,226,240,182,220,119, 4,235, + 37,164, 65,153, 92, 80,137,106, 70,139, 82,125,151,164,197,155, 93,168,123,196,123, 46,150,251, 8,240,252, 17,238, 40, 42,185, +170,222, 34,155, 80,141, 16,150, 88,230, 75,114,101, 51,130,141,103,113,118,222, 84,228,199,126,232, 95,240,106,136, 16,215,189, +218, 86,235,201, 53,185, 52,220,146, 81,114, 92,236, 97, 49, 90,112,128, 36,194,166, 1,146,181, 52,236,199,138, 84, 53,147, 85, +149, 73,182, 92,129, 6,223,109, 81,169,207,198,147, 79,163, 83, 41,232, 5, 82, 81, 29,145,152,108,180,165, 54, 91,134,211,156, +200,113,210, 18,218, 3,193,103,153, 99, 39,101,145,165, 85,144, 39, 49,211,208,128,187,218,251,146, 58, 53,134,171, 94,215, 4, + 88,173,147,175,226,120,170,103,246,122, 6, 21,149, 44, 27, 66,168,189, 44, 37, 67, 23, 6, 68, 33, 36, 54, 58,210, 58,127,236, +202,171,173,165,149, 12,145, 11, 77, 10,223,167, 90, 47,203,153, 93,154, 39,203,117,178,229, 86,225,153, 22, 43, 10, 90,217, 97, +108,173,148, 73,109,194,197, 34,138,149,128, 98,176,158, 86, 18,160,180, 32,169,197, 18,171,243, 12, 71,188, 39, 42,174,205, 61, + 18, 45, 72,169, 45, 52,144,181, 82, 30,158,238, 86,184,179,219,134,160,218,163, 82,146,160,225,109, 14, 58,219,178, 20, 76,135, +249, 18, 91,109, 56,227,176, 25,153, 75,137, 81,185,166,184,212, 78, 68,193,165, 81, 33, 56, 20,195, 85, 39, 10, 11, 82,165, 48, +193, 47, 87,234,137,240,209,202,128,158, 72,168, 70, 91, 66, 74,214,240,187,209,162, 25,147, 29,241, 80,243, 20, 40, 45,185, 21, +234,107,146, 57,170,243,146,235,172,178,227, 19,125,225,132, 36,196, 91,197, 42, 68,112,151, 28, 82, 94, 80,113,210, 62, 13, 58, +210,106, 66,183, 75, 35, 17,168,117, 97,109,198,228, 16,111,212,237,190,224, 90,197,113, 23,172,103,117,158,190, 74,182,147, 48, + 80, 99,105, 64,211, 10, 1,101,209, 78,168, 99, 38,107,105,141, 52, 17, 20, 68,221,110,162, 55, 14,212, 81, 18,171, 73, 69, 54, +151, 80,170,193,183,229,135,231, 85, 42,149, 41, 47, 79,143, 80,247, 20, 52,203, 16, 98,229,240,126,168,115,170, 31,125, 39,149, +208,202, 26, 10, 40,231,230,113,232, 15, 68,139, 87,166, 53, 26, 60,198, 94,122, 51, 68, 71,148,250,148, 25,103, 63,162, 83,229, + 41, 41, 99, 37, 69, 44,160, 37, 60,201,103,152,129,206, 20, 27,135, 43, 8,141, 22,153, 2,220,110, 28,171,174,170,134, 89,142, +153,169, 66, 35,209, 88,108,174, 57,126, 80,125, 99,220, 96,135, 91,113, 92,141,161, 33,199, 27, 75,101, 92,216, 34,241, 2, 53, + 62,152,134,101, 34,161, 49,233,206,169,137,117, 56,178,156, 90,231, 45,245,190, 29,112,130,215,199,159, 17, 9,113, 10, 64, 72, +240,130, 80, 82, 83,212, 76,105, 31,217,222, 25, 64,230,104, 8,110,162,224, 1,102,223, 85,193, 99,246,172,183, 96, 73,103, 47, +101, 81, 84,230, 84,205, 52, 18,164,134, 72,163,156,202, 35,140,221,164,118, 98, 85,165,150,214,109, 39, 74,162, 72,246, 71,229, + 5, 65, 26,139,159,203,207,219, 83,176,204,240,223,237, 79,227, 35,111, 41,204, 69,139, 67,175,238, 80,222, 59, 98, 36, 38,195, +113,161,208,183,162,149, 7,112,132, 52,182,144, 3,101,170,213,102,182,215, 40,232,148,176,158,221,135, 48, 73, 36,100, 96, 99, +184, 61,250,246,212,159, 62,150, 45,137, 6,222,246,135,108,254,224, 66, 67,137,123,117, 56, 94,183,220,168,135, 22,209, 74,230, + 88, 87,181,215, 66,109,109,161,180, 2,209, 52,250,172, 0,176,165, 45, 68,165, 61, 64, 1, 34, 48, 64,228, 21, 18, 15,251, 56, +236,115,211, 86, 37, 3,171, 82, 68, 23,236, 70, 90, 53,182,195, 76,108,209,131,111, 66, 22,227,189,136,190,247,199, 60,230, 49, +152,171,170, 80,253,162,193,143,184,200,162, 66, 62,237, 86,255, 0, 76,120, 41,206, 48,160,113,145,142,217,207,150, 15,125,123, + 0,227,148, 14, 92,116, 63,209,247,244,215,220, 39, 25, 35,191, 83,230, 71,159,125, 87,109,178,242,146,134, 70, 92, 87, 96,172, + 36, 4,128, 84,165, 45, 71,162, 80, 0, 36,146,112, 0,201,233,173,195,210,228,218,223,187, 26, 93,174,118,199,134, 90,117,213, + 33,166,208,167, 28, 90,185, 80,132, 2,165, 40,158,192, 1,174,165,240, 33,236,163,226, 11,141,133,195,187,161,181, 31,108, 54, + 57,185,170,102,161,188,215,148, 9, 46,210, 42,138,140,234, 81, 54,157,182,214,243, 78, 53, 39,113, 42,232,234,133, 62,203,140, + 81,226,186,164,251,205, 65, 68, 45,141,111,127,178,155,217, 11, 7,117,232,244, 30, 38,184,174,161,203,107,103,231,248, 21,109, +173,218, 73,190,241, 78,168,239, 51, 13,168,169,155,182,242,228, 90, 36, 81,246,136,186,131,238,144,210, 90,151,113,134,203,171, + 91, 20,149, 36,203,150,181, 2, 36, 72,241, 41,180,202,125, 62, 5, 42,149, 74,131, 14,149, 68,162, 82,162, 70,166,209,168,180, +168,109, 37,152, 52,202, 93, 50, 19, 72, 98,155, 79, 98, 58, 66, 90, 97,150,208,219,105, 24, 66, 83,166, 25,243, 9, 42, 36, 48, +211, 63, 42, 59,216,200, 44, 75, 90,215, 17,131,112, 7, 91,187, 2, 54,178,171, 92,178, 89,124, 43,192, 18,102, 49, 69,153,103, + 74,240,208,200, 3, 69, 2,157, 18, 76,166,196, 60,141,179, 69, 19, 15,178, 22,210, 56, 58,131, 70,186, 89,244,203,132,143,102, + 23, 8,220, 37,199,165,207,176,182,222, 37,237,184,240,218, 71,188,239, 38,234, 68,167,221, 55,203,178, 8, 5,199,104, 48,157, +143,245,101,141, 16,184, 57,155,143, 75,138,210,217, 36,230, 83,228,243,158,151, 69,160,187, 49,126, 36,133, 58,235,129, 35, 46, + 60, 86,226,143, 94,131,153, 68,246, 24, 3,200,118,213,202,135, 74,248, 27, 28,132,168,164, 41, 71, 3, 60,167,178,137,239,204, +123, 15, 64, 52,232,211,232,248, 74, 64, 64, 35, 29, 71,146, 73,235,146,113,212, 96,254,205,107, 90, 40, 75,114,198,159, 86, 38, +236,109,251, 76, 73, 38,219,253,162,109,208, 91, 22,226, 81, 83,208,192,148,180,116,233, 71, 78,189, 18, 53, 84, 94,219,144,182, +187, 30,236,110,205,212,155,226, 36,191, 73,131,133,184, 14,237,254,198,241,107, 70,166, 37,170,205, 10,172,246,199,238, 12,230, + 90, 72, 51,232,213, 6,101, 92, 59,127, 50,122,210, 50,227,241,167, 51, 87,134,218,213,158, 86,166, 6,193, 0, 1,168,116,169, + 41, 33, 39,204,245,237,215, 39,203,251,117,250, 82,251,111,182,226,159,122,123, 47,248,158, 68,212,183,205,103,209,237,109,192, +166, 56,164,149,248, 53, 59, 98,234,166, 45,165,183,223,145, 74, 98,100,132,103,253, 85,145,219, 95,154,217, 61, 0, 4, 2, 74, +134, 8, 61, 7, 49,198, 52,227,147, 73,255, 0,165, 66, 15,216,112,195,220, 36, 0,159,222,225,201,223,169,197, 33,199,180,137, + 77,196, 45, 34, 0, 5,116, 17, 74, 69,250,190,167,136,155,109, 98,194, 32,222,246, 36,247,192,206,116, 56, 35,174, 1,207,238, +253,186, 25, 65, 61,243,212,246,243, 7, 26, 53,192, 0,199, 55, 83,220,158,189,254, 95,142,132, 88, 87, 83,128, 65,237,142,152, +192,193, 56,199,174,159,241, 15,192, 46, 18, 50, 66,124,241,246,227,185,249,232, 98, 58,147,216,252,251, 39,236, 30, 90, 53,207, + 47,191, 65, 58, 65,207,175,110,189,250, 16, 14, 52,178,244, 30,252, 20,218,254,159,207,182, 5,112,227, 39,190, 51,142,131, 31, +120,199, 78,154, 17, 68,242,243, 31,159, 40,251,126,126,154, 37, 72, 61,249,137,198,122,121,118,238,122,245,213, 5,161, 68,100, + 16,191, 34,124,135,231,247,232,227,183,207,254, 48,111,134, 5, 42, 36, 16, 71,124,114,231,182, 61,126,122, 29, 68,103, 25,234, + 1,232, 6, 0,235,229,162, 84,147,145,215,246,116, 0,106,130,240, 62,121,237,229,142,217,251,124,180,162,141,133,183, 31, 63, + 61,177,144, 1, 62,151,192,138, 73, 25,229, 57,201, 57,255, 0,103,240,208,221,251,232,197, 2, 50, 70, 0,235,156, 30,227, 61, + 50, 61,116, 50,192, 29,129,245, 39,203,236,252,116,170,117,249,219, 10, 40, 4,116,183,200,197,185,230,249,199, 41, 42,198, 70, + 82, 58,103, 25,238, 71,150,116, 51,141,184, 1,235,202, 2,112,144, 0, 36,143,159,167,158,174, 42, 0, 30,132,158,249,207,174, +132,121,178,164,158, 85,169, 7, 39, 24,254,119,219,234, 51,165,176,110,158,235,226,222, 82,148,255, 0,148, 36,147,212, 99,211, +208,244,239,165,175, 69,181,182, 0, 82,148,225, 61, 73,192,233,242,239,165,161, 99,233,140,227,210, 7, 92,249, 15,233,252,157, + 20,130, 49,129,223,185,251,245, 65, 32,224, 12,117,234, 63, 19,255, 0, 13, 86, 64,238,124,199, 76,122,104, 96, 96,148,167, 3, +175, 66,127, 28,126,227,253, 90,168,210, 0,200, 56, 61,207, 79,158, 58,231,243,223, 84,210, 73,233,142,131,166,126,239,219,162, + 91, 73, 57,233,223,215,207,166,147,112, 55, 61,255, 0,241,129,143, 96,121,224,159,199,161,251,180, 91, 63, 23,113,203,215, 25, +238,123, 13, 83,109, 35,160,235,215,175,223,141, 18,148,131,208,116,233,158,223,102,147,193, 77,141,238,118,193, 72, 79,216,122, +118,249,250,227,203,207, 85,146, 1, 56, 61, 61, 49,251, 7,109, 14,216,230,198,125, 50,122, 99, 68,160, 2, 64,198,125, 63,225, +164, 90,192,144, 62,122, 97, 28, 86, 29, 14, 58,140,121,159, 62,158,186,218,174, 11,120,121,159,197, 23, 18,123, 87,179,145,130, +147, 79,185,110, 40,206,220,178, 66, 73, 76, 27, 74,150,164,207,184,229,172,143,213, 6,158,202,219, 7,253,105, 35, 90,172, 1, +206,113,144, 59,143,159,245,234, 71,254,193,173,178, 98,146,141,245,226, 34,165, 22, 63,188, 82,169,144,118,234,211,150,250, 66, +158, 98, 93, 83, 19,235,142, 70,200,253, 26,253,223,221, 91, 42, 24, 61,198,152, 56,151, 50, 57, 86, 77, 91, 84,173,166, 80,186, + 80,142,161,155,107,143,122,130, 91,254,220, 76, 56, 7,134, 79, 24,113,142, 65,195,218, 75, 67, 95, 58,243,173,255, 0, 2, 48, +101,152, 92,116,213, 26, 20, 7,179, 48,196,149,103,214, 45,203,102,139, 77,179,109,136,172, 83,237,139, 54,149, 2,215,182,224, + 65, 9,106, 37, 62,145, 72,142,136, 76,165, 49,147,211, 5, 45,100,145,212,231, 39, 86,118,235, 42,143,200,227, 47, 37,210,234, + 18, 24, 83,124,167, 5,120, 37, 7, 39,169, 39, 31,142,154, 22,235,241,228,173,213, 7, 98,188,149,229,164,178,233,228, 89, 82, +186, 30,101,122, 21,107, 39,167, 33,181,182,204, 85, 70,113,109, 7, 2,195,161,204,169,167, 50, 20, 18,130, 15,196, 61, 53,201, + 85,114,187,206,236,205,119,148,147,111,221,239,252,122, 91,240,246,231,132, 50, 26, 12,191, 43,166,165,142, 30, 84, 80,168, 93, + 32, 13, 58, 85, 84,105,177,176, 1,109,176, 91, 3,211, 99,135,136,196,145, 38, 52,105,210, 76,121, 79,186, 10, 76,117,169, 45, +200, 65, 31,170,160, 65,233,140,104,132,199, 66,144,161, 62, 50,221,107,148,150,150,164,248,168,109, 67, 33, 74, 86, 6, 71,200, +131,160, 41,209,224, 56, 99,202,116, 72, 15, 50,217, 66,222,125, 75, 64,192, 24, 0,163,205, 35,215,229,172,162, 35,108, 56,218, +125,222,104, 97,121,193, 42, 81,113, 50, 18,162, 73, 1,181,118, 3, 58, 69,199,148,148, 66,227,107,244,216,237,190,219,127, 28, + 18,170, 83, 9, 43,230,178, 30,161, 74, 4,185, 54, 11,164,181,128, 27, 95, 77,200, 59,139, 97, 81,169,202,247,134,228, 67, 90, + 39, 71, 36, 55, 34, 19,199, 15, 6,193, 24, 91, 89,234,160, 7,109, 86,220,221,191, 69, 90, 85,181,115, 68, 96, 46, 68, 6,140, + 7,138,147,149,150, 82,160,166,208,188,140,168, 39, 39, 25,242,233,167, 58,137, 71,166,201,142,194,201,142,212,216,196, 6,229, + 50,121, 11,153, 61, 65, 3,161,199,207, 78,207,240,125,201,244,162,195,141,165,106, 65, 67,236,188,216,248, 92, 90, 48, 74, 84, + 7, 98, 83,144,126,221,106,152,228,100,145, 44, 64,101, 22,223,184,183, 79,141,173,235, 98,111,138,187,136,120,137, 99,171,130, +101, 58, 30, 38,100,109, 86, 82,202,195, 78,228, 88, 56, 32,141,236,172, 58, 16,109,124, 91,182, 90,193,101,183,152, 82, 35,165, + 30,248,200,113, 65, 41, 9, 79,140, 82, 57,198, 49,211,152,245,251, 78,155,223,104, 77, 33,251, 91,135,122,140,200,202, 44, 42, + 69,199, 77,109, 75, 9, 39,197,247,120, 85, 7, 27,105,208, 6, 86,128,176,147,145,219,151, 56, 58,220,141,174,167, 53, 29,232, +216, 70, 58, 14,152,232,133,143,214, 72, 31,205, 26, 97,253,170,148,143, 23,133, 86,229, 70, 46,101,187,202, 15, 56,105, 57, 89, + 75,148,154,162, 84, 79, 78,191,171,143, 92,159, 93, 75, 50, 90,104,205, 42,203,166,242, 70,111,241,189,135,243,239,235,142,124, +204,184,154,105,248,255, 0, 33,161,119,211, 75, 85, 83, 4,100,118,176,147, 86,254,237,133,254, 24,136, 5, 65,227, 38, 82,145, +202,226, 39, 41,110,184,151,185,156,241, 27, 46, 17,149,180,210, 23,200,250, 75,169,109, 32, 45, 42, 64,235,207,202,174,244,225, + 84,213, 6, 69, 67,223,225,189, 84,158,167,131,113,207,129, 29,150,216,138, 80,148,182,153,212,240,151, 19, 0,248,133,126,240, +180,243,120,152, 79,110,128, 7, 61,166, 95, 74, 93, 83,147, 93,247,105, 92,175, 73,101,190, 69, 71,105, 74,202,153, 10,108,130, +212,142,100,163, 40, 88,230, 36,130,160, 83,202, 52, 77, 26, 68,232,229, 30, 27, 79,123,184, 37, 79,205,166,196,101, 85,116,182, + 73, 71, 35,108, 72, 90, 68,166,220, 46, 4, 56,180, 23, 84,209, 5, 97, 7, 3,149,225,214,234,123,129,216,253,221,239,113,176, + 23, 3,174,219, 95,167,161,116,245, 3,200,177,221,159,162,132,176, 97,182,229, 73, 27,128, 53, 11,223,179, 1,176, 39, 14, 61, +179,110, 49, 87, 92,138,164, 73,146,233,178,165,150, 16,227, 84, 69, 42, 50, 94,109, 10, 71, 71, 96,168, 22, 37,159,133,105, 75, +193, 9, 83,132,168, 41, 95, 14,158, 74, 45, 26,235,147, 34, 76,184,244,134,171, 40,104,204, 83,146, 41,175, 68,162, 76,140, 26, +117, 76,161, 51,233,207, 31, 0,115,161,149,165, 62, 10,135, 57, 87,234, 12,157, 54,148,138,123, 5, 81,133,159, 38,108, 39, 22, +195,242,231, 68, 66,152,157, 2, 68,128,208, 83,174, 57, 5,247, 3,144, 18,140,142,105, 41, 91,107, 89, 89, 79,134, 84,158,109, +108,157,156,170,253, 2, 24,110, 77, 1, 74, 65,106, 28,151,106, 52, 57, 77,206,132,236,118,255, 0, 72,150,159,167,169, 41,148, +219,202,116, 37,124,170,241, 18,165, 16, 50, 10,136,212,110,190, 89, 0,102, 91, 57, 54, 10,173, 96,125, 45,246,150,247,176,217, + 88,139,245,185,184,195,137,205,164,100, 34,153, 99,169,146, 43, 14, 92,202, 82, 66,118,230,106, 62, 73, 25, 71, 75,134,111, 41, + 23, 70, 4, 1,238,148,138, 91, 79,179, 2,163, 42,161,107, 43,221,217,145, 13, 23, 52, 5,211, 28, 76,196,148,190, 35,243,188, +223,129, 37,188,163,195,105,198, 94, 1,193,212, 37, 68,105,199,141,108,212,103, 60,153,146,233, 80,100,164, 73,113, 42,158,134, +163,128, 66,210,128,223, 59,193,178, 90, 87, 40, 29, 82, 74,185, 79, 84,231,174,179,235, 33,170, 93, 82, 77, 65,154,147, 17, 46, + 76,178,176, 41, 85, 40,140, 45,104,144,248, 64, 74, 13, 62,115,105,115, 41,101, 46,164,185,225,171,144, 31,132,142,153,120,104, +155, 91,103, 58,196,127,118,165, 59,108,201,150,211, 50,140,139, 86,167, 83,165,188,209, 10, 66, 17, 17,112, 22,243,140, 60, 16, + 72, 81,231, 97,105,115,147,153, 93,245, 22,146,172,134,180,138,209, 72, 58,244, 55,189,174, 71,217, 35,212,143, 54,251,139, 30, +173,181,252,117, 14, 86,239, 28,240, 77, 72,225, 81,117, 42, 44,182, 50, 45,220,171, 22,130, 84,251, 42, 72, 28,237, 90, 65, 85, + 58, 66,227, 1,178,236,216, 17,129,148,194,170,116,121,146, 79,188, 38, 93, 38, 95,133, 10, 82,217, 78, 91, 18, 24,229,114, 60, +196,167,194, 87,134, 28,105, 10,115,149, 65, 71, 7, 26,218,107,126,109, 90, 10,162,154,132,152, 21, 33, 32, 55,133, 48,201,165, +212, 26, 80, 33, 63, 20,102,159,113,167,222, 82, 65, 82,130, 11,105, 73, 39,225,199, 46,172,180, 45,177,175,198,113,230,233,151, +117, 62,124, 98,178,148,183, 92,183,144,196,137, 9, 81,248,202,103, 82, 28, 65,109, 73,194,146, 20, 24,229, 74,149,158, 83,170, +151,157, 90, 22,218, 91,117,139,187,113, 17, 73,181,172,155, 85,134,101,215,110,181,213, 99,253, 77, 72, 98, 68,134,161, 70, 15, +171,149, 18, 12,199,165, 63, 30, 59, 44, 48,211,146,228, 58,240, 75, 8,112,149, 16,164, 80,243, 60,247, 50, 62,199,125,199,193, + 73, 23,219, 99,125,143, 82, 0,239, 80,241, 39, 21, 71,196,149,209, 83, 82,212,174,107, 81, 80,226, 56,226, 80,230,162, 70,147, +234,226,138, 33, 50, 71, 80,238,238, 21, 99,138, 13,122,152,170,128,194,195, 15, 28,122,147,162, 40,105,244, 58,132, 37,223, 18, + 3,231,194,234,242, 86, 28,114, 59,165, 43, 30, 26,249,214,164,228,128,219,188,202,202,185,192,213,242, 37, 81,151, 30,143, 37, +197, 57,226, 48, 3, 43, 43, 9, 11, 44,184,174,102,157, 83, 95,206, 90, 22, 66, 70, 64,200, 86,124,137, 13, 21,189,112, 82, 46, + 11,114,151,114, 91,117,216,119, 21,175,113, 83, 33, 86,232,117,120,238,174, 76,106,173, 26, 82, 67,145,101, 66,125,192, 11,141, + 45, 4,130,146,128,164, 41, 37,183, 57, 92, 66,210, 3,147,114,251,147,205, 46, 54, 83,202,178, 2, 20,226, 80,132,161, 96,169, + 73, 10, 36,120,173,129,204,140,147,204, 20, 64,198, 59,150,162, 37,117, 42, 5,134,194,253,108, 65,216,110,125, 71, 75, 11,250, + 92,139, 85, 45, 11, 75, 83, 85, 72,209,180, 51,196,206,140,172, 25, 25, 24, 29, 14,146, 35, 0,209,184, 32,134, 82, 46, 24, 18, + 55, 26, 78,240, 90,213, 31,208,130, 86, 9, 4, 18,130, 72, 73,229, 80, 42,230,108,126,177,199, 46,112, 65, 25,207, 93, 58,209, + 39,130, 16,145,159,214, 81, 60,157, 65,194, 72, 0,114,156,158,128, 96, 14,165, 71, 30,128,234, 46,217,220,212,153,116,202,237, +193,112,215,105,214,197,177,108, 64,126,171, 91,175,213, 37,166, 53, 46,151, 79,136, 18,100, 76,145, 41, 67,244, 76, 39, 45,163, +148, 5, 41,199, 22,134,154, 11, 82,210,147,121,177, 56,210,225,140,221, 20,202, 80,185, 43,180,231, 43, 85, 4,209,236,251,142, +240,181,165,219, 54,109,110,224,123,244, 52,198,233,213,121,111, 56,150,164,191, 39, 34, 8,154,220, 70,223,145,203,133,133,114, + 37, 82, 44,159, 40,174,158,140, 87,178, 8,168, 83,237, 72, 72, 38,202, 69,200, 91,220,219, 97,125,133,250,145,136, 77,103, 11, +113, 14, 98,249,179,100,188, 59, 93,159, 12,160, 94,161,169,105,165,154, 56,137, 78, 96, 87,150, 53,100, 83,203, 28,198, 91,150, + 88,129,148,174,133, 36,110,229,114, 79,128,205, 58,148,133, 31, 26, 20,100, 59, 45, 60,196,132,212, 39, 20,202,122, 50, 84, 70, + 84, 27, 10,142,218,188,129,109, 73,206, 70, 5,137,201, 14, 46, 63, 35,110,172, 30, 98,236,137, 60,136, 43, 66,208, 65, 73, 5, +196,225,111,114,171,166, 73,229, 9, 25,193, 3, 88, 95,215,200,158,183, 30, 67,206, 41, 43,116,248,202,117,107,231, 82,249,143, + 62, 86,165,101, 75, 43, 42,230, 4, 2, 9, 87, 55,198, 14,178, 38, 92, 98, 67, 32, 20,251,201, 8, 88,240, 16,146,164, 41, 67, +178,192, 65,194,147,145,216,231, 10,198,125,116,226,139,237, 51,153,109,101,216, 45,137,176, 85, 0, 40, 38,219,249, 64,243, 91, +246,186, 2, 70, 32,113, 80,251, 44, 81, 44,131, 83,130, 89,141,129,187, 49,212,196,131,181,139, 18, 64, 38,192, 90,228,140, 52, + 23, 71, 18,155, 27,182,247,133, 23,109,175,221,230,219,141,180,184,238, 72,209,228,209,169,247,213,194,220, 10,181, 86, 20,201, + 78, 65,135, 62, 60,103,163,251,172, 38, 37, 75,102, 75, 81,164,214, 36, 66,142,250,153, 91,141,169,214,146, 84,119, 30,147, 66, +165, 80,195,147, 41,232, 38,166,235,108, 25,149,121, 74, 76,250,173, 65, 50, 26, 67,141,184, 37,252, 94, 36, 34,194,208,182,218, +140, 81, 20,180, 82, 89, 10,109, 73, 89,131, 15,180, 99,113, 31,190,120,217,226,105,247, 21, 37, 48,237,189,193,122,201,132,220, +231, 27, 90,216,183,172, 58, 52, 11, 98, 37, 40,182,149, 41, 9,140,210,225,202, 12,167,155,149,105,150,162,177,158,154,222,143, +101, 55,180,158,109,129,120, 91, 92, 38,241, 1,118, 84,165,108,197,201, 83,133, 67,218, 59,194,177, 84,117, 3,105,238, 58,130, +145, 22,145,102,215, 42, 78,168,190, 54,130,167, 53,198, 99,180,128,239,129, 65,155, 33,153, 40, 74, 41,207, 76, 66, 18,163,204, + 18,106,169,105,103,136, 44,113,146,169, 37,205,135,152, 11, 55, 64, 21,137,251, 98,218, 65, 1,129, 26,156,119,103,137,223, 65, + 12,230,155,192,222, 23,241, 67,129,120,142,163, 57,207,166,202,105,115, 92,243, 34,120, 80,201, 36, 83,210, 71, 89, 57,203, 94, + 45, 47, 81, 37, 18,146,173, 69, 62,179, 89,161,231,164,145, 39, 16,209, 79, 40,202,229,206,203, 50, 92,167,210,208,107, 18,249, + 17,239,226, 44,119,234, 17,224,182,163,206,183, 36, 8,104, 87,141, 37, 68, 5, 37,149,169, 33,190,156,196,116, 73, 21, 52,233, + 79,123,195,137,167, 34,158,186,130, 89,101,234,213, 77, 81,234, 87, 35, 64,168, 41,152,136,167, 35, 45,198,233,144,132,186,180, +161,158,159,161, 42, 57,214,118,211,109, 82,144, 99,162, 60,122,107, 81,146,184,210, 98, 6,209, 25, 12,173,165,168, 41,185, 13, +180,145,149,165,224,224, 89, 57, 61,193, 61, 53,141, 63,114, 33,233, 11, 85, 22, 2,170, 6, 42, 84,212,185, 46,120, 80,168,201, +117, 77,148,182, 88,156,160,181, 73,125, 4,163, 41,105, 11, 32, 40,146,226, 20, 64,212,177, 40,249,104,218,136, 93, 29, 1,247, +238, 71,235, 92,237,232, 58, 18, 54,181,252,231,165,168, 98,130, 44,186,134,201, 24, 5,166,121, 54, 99,112, 87, 94,233, 10,130, +202,186, 81,249,136, 78,144,193,201, 44, 84,122, 5, 38, 28, 86,234,113,156,144,169,205,161,212, 57, 82,170,201, 76,201, 45, 60, +163,153,137,113,197,182,159,113,143,202,130, 20,219, 0, 33, 33, 33, 36,173, 0,232, 37,215, 92,148,250,153,181,195,113, 24,204, + 83,252, 40,144,178,220,218,116,212, 96,205, 77,188,203,169,196,146,181,168, 6,221,112, 41,150,139,220,205,165, 69, 32,139, 44, +136,107,113,106,122,179, 49,215,100, 48,241,113, 20,248,234,113,186,107, 6, 70, 20,166,155,136, 28,230,125, 10, 89, 0,151, 66, +148,164,164,149, 30,184, 24,253,199,122, 66,165, 47,234,152,208, 81, 88,170, 60,133,169,134,151, 37, 17, 89,142,182,144,160,195, +138,116, 16,184,175,115,146, 26,228, 35,152, 2,144, 10, 70,182, 97, 64, 14,163,229,113,223,173,246,245,220,141,236, 46,119,233, +208,144,112,239, 75,150, 79, 93, 50,162,150,205,103,109, 68,106,254,230, 52,186,181,201,144,170,200,168, 55, 28,194,177, 0, 89, + 74, 58, 49,195,130,197, 46,151, 71,143, 89,156,136, 50, 16,226,147,239, 45,220,146,230, 75, 91,181, 22,228,134, 85, 46, 53, 65, + 42,116,169,215, 27, 81,116, 21,143,136, 56,176, 83,223, 69,209,101,194,118,104,120,212,188,105, 41,116,182,242, 25, 83,206,149, + 54,218,214,160,181,186,242,194,131,168,108,182, 83,205,250,200,108, 3,147,240,233,134,126, 83,142,181, 21,235,160,213, 20,137, +105,109,136,245, 1, 33,149, 69,131, 86, 73, 74,228,162, 18,225, 47,194, 98, 66,176,143,133,208, 29, 73, 36,133, 44,128, 52,237, + 91, 17,157, 91,145, 84,244,169,143,180,227, 68, 21, 75,109,133,243, 33,111,129, 20, 74,114, 56,241, 39,182, 84,174, 82, 70, 20, +165,173, 69, 57,239,167,120,101, 42,241,198, 6,146, 55,181,138,219,126,164, 14,187, 16, 5,245, 16, 5,201, 45,115,133, 51, 76, +165,169, 40,229,154,170,189,170,102,150,227, 88, 37,145,130, 42,169, 88,221,140,154,183, 83,169, 71, 40, 43,236,138, 6,155,195, +227,233,107,174,155, 39,136,190, 10, 30, 97,107,118,164, 56,127,220, 70,158,146,160, 16,217,132,155,246,143,200,210,154, 35,155, +222, 4,191,120, 37, 71, 9, 82, 86, 10, 64,235,168,152,132,228, 28,164,164, 19,215,231,143, 77, 73,155,233, 79, 95,204, 87,248, +240,217,189,185, 66,217,147, 47,105,120,111,164,154,148,182,157, 83,138,126, 70,226,221,245,186,220, 86,150,133,146, 80,148, 83, +104,144,212,158,249, 18,186,147,129,168,234,237,246,223,222, 27,165,119,219,150, 21,133,110, 86,174,219,186,237,172, 68,160, 91, +118,213,189, 79,122,169, 91,174, 86, 39, 44, 34, 53, 58,153, 1,128, 75,239, 43,226, 82,212, 74, 91,101,180, 45,231,150,219, 72, + 90,211, 98,229, 79,202,203,150, 89, 92, 34,171, 76, 88,147,176, 28,199, 55,185,216, 11,111,185,252, 49,198, 60, 76,139,250,126, +189, 32, 28,197,102,132, 46,145,114,196,195, 16, 0, 0, 1, 44, 73,181,128, 4,182,214, 7,108, 96,193, 42, 89, 72, 66,114, 71, +100,165, 36,149, 99,176, 0,119, 58,237,167,177,211,217,215, 3,138,221,197,169,239, 54,241,210, 85, 43,135, 45,155,171,194, 77, +122,148,248, 83,108,110,166,227, 37, 13, 84,169, 27, 94,149,140, 21,219,145, 99, 42, 44,251,145, 77,156,169,135,162, 82,185,144, +185,207, 4,246, 39,129,175,163,187,181, 22, 69, 46,141,184, 92,116,214,164,223, 87,121,101,186,140,141,132,177,171,110,211,108, + 90, 17, 41, 14, 34,153,125,223, 20,181,162,117,229, 60, 3,201, 42, 45, 53,216, 84,224,161,200,151,229, 4,149, 43,177, 76, 91, + 27,113,181,244, 24,150, 14,210, 88, 54,166,216,237,189,188,185, 31, 81,216,214, 37, 26, 21, 6,221,166, 25,110,243, 75,144,204, + 24,141,132,174,107,238,225,201, 18, 29, 43,126, 67,129, 42,121,215, 23,130, 27,243, 44,205,164,167, 43, 26, 24,161, 39,118, 99, +165,220,118, 10,191,105, 84,157,152,182,150,181,202,117, 86, 19,158, 18,240,238,182,106,218, 90,236,242, 5,138,150, 59, 56,166, + 62,103,145,133,180, 9, 71,217, 84,185, 12,200, 75, 22,182,135, 80, 11, 12,100, 74,154,169,242,176,132, 54,203,109, 54,195, 44, + 71,140,203, 81,226, 70,137, 29,164,179, 10, 4, 72,236,165, 45,195,134,212,102, 91, 75,109,182,148,182,219, 76,161, 8, 74, 80, + 18,144,232, 90,112, 2,249, 93,117, 25, 66,146,209, 71, 66, 22,162,163,134,241,211,245,150,177,159,152, 58,106,104,113, 92, 82, +188, 39, 22, 57,159,117,107,144,172,114,134,208,144, 20,235, 77,249,242, 37, 62, 27, 96,249,156,159,144,217, 59, 62,158, 23, 33, +162,160,146, 26, 67, 60,168,236,129, 33,209,134,130,134, 48, 2, 26, 35, 31, 51,211, 77,180, 46,116, 52,199,224, 54,176, 30,128, + 14,214, 29,134,219,219, 98, 14, 47,113, 78, 21, 72, 3, 87,123,254,238,135,222,126,240, 59, 91, 14,157, 22,158, 26,105,164,172, + 5,168, 4,243,159,213,231,121,125,145,208, 99, 30, 93, 60,129,211,139, 26, 35,109, 54, 49,133, 17,220, 16, 79, 83,232, 60,250, +246, 31,187, 86,138,100, 68,165, 73, 8,229, 81,142, 64, 42, 86,112,183, 22,144, 21,130, 15, 85, 36, 19,242, 28,218,203,218, 78, + 49,240,169, 41, 70, 66, 74,122,165, 68,142,170,207,160, 57, 72,251,254, 88,216, 14, 90,230,251, 15,244,249,254,125, 48,211, 87, +166, 54,210, 5,205,133,251,123,192,239,235,247, 3,211, 99,142, 83,123,105,234,144, 40, 62,204, 78, 45,213, 56,172, 10,158,223, +193,161, 68,109,166,214,234,222,168,213,110,106, 44,120, 49,210,219,105,230, 42, 83,161,103,253,144,131,228, 53,249,148, 74,163, + 86, 33,178, 31,157, 73,168, 68, 97, 73, 37, 15, 75,136,244,102,150,130,114, 10, 29,117,176,149,119,242, 39, 7,166,117,250,228, +239, 21, 54,139,113, 81,162, 91, 21,234, 77, 58,187, 2,167, 53,185, 83, 41, 53,168, 81, 42,144, 36, 71,167, 16,227,102, 68, 9, +141, 45,167,146, 37,173,178,146,164,171, 5, 25,232, 70,154, 39,182,131,105, 43,148,145, 68,173,237, 86,217, 86,168,230, 58,226, +138, 93, 86,195,181,102,211,147, 24,131,204,194, 99,191, 75, 41,109,188, 19,219,175, 94,132, 30,186,205, 29,108,244,181, 21, 13, + 12,113,200,178,104, 7, 83, 48, 55, 91,237,178,176,177,213,114,119, 55,218,198,215,196, 43,137,120, 6,163,136,230,167,205,151, + 49, 90, 53, 72, 22, 32,134, 2,250,180,203, 43,106, 45,205, 75, 41, 46, 64,178,159,179,125,239,183,228,250,227,101, 60,188,224, +140,142,128,244,207,144,199,168,198, 48,126,122, 21,192, 0, 3,155, 35, 57,233,215,215,166,191, 65, 78, 47,125,129,220, 19,241, + 21, 2,167, 90,218,170, 35,252, 48,110, 99,233,144,252, 74,205,131, 29,202,134,222,212,103,172, 18,132, 92, 59,119, 53,242,134, + 99, 45,220,115, 59, 76,122, 43,169, 25, 41,109, 88,229, 48,230,227,131,217,183,196,255, 0, 1,119, 35,112,119,146,205, 19,108, + 74,180,247, 33,217,251,193,104,151,171, 59,105,118,144,165,248, 44, 49, 88, 13, 5,219,245,162,132,229, 84,234,138, 35,202, 73, +200,108, 58,145,204,100,244,217,164, 82,178,199, 50, 26,105, 9, 0, 92,221, 24,250, 43,250,158,193,130,177,236,164, 11,226,164, +206,184, 91, 56,200, 65,146,174, 1, 45, 32,219,159, 17, 47, 24,222,195, 93,194,188,123,216, 93,212, 33, 36, 42,187, 28,115,229, +210,158,163,169, 24, 62, 96,119,253,255, 0,215,160,212, 66,187,167, 24,232, 58,249,116,198, 49,219,174,141,117, 3,152,133,229, + 39, 56, 41,199, 80,122,227, 65,120, 97,165,169, 73,201, 43,238, 14, 79, 41,235,146, 61, 52,244, 14,192, 1,182, 35,160, 31, 92, + 14,231, 32, 73, 74,186,231,203, 24,251,137,244,208,101, 3,148, 32, 40,165, 57,236, 60,201,209,133, 63, 26,186,168,231,201, 71, +225, 29,187,121, 13, 81, 86, 50,122, 16,115,246, 12,124,177,163,142,222,236,103, 3, 40, 3,211, 29,186, 30,189,241,215, 57,208, +203, 24, 36, 15, 67,140,252,199,207,203, 69, 47,208,103,166,115,229,147,129,215, 62,186, 25, 64,244,230, 29,124,143,175,113,215, +212,233, 85,189,129,245,235,243,240,198, 69,172,126,125, 48, 42,129,193, 30,127,147,161, 85,246,156, 17,215,204, 2, 8,199,217, +162,148, 58,146, 20,122,103,207,167,159, 83,161, 92, 42,235,233,230, 71,159, 95,232,210,139,215,173,176,170,143, 95,157,176, 50, +206, 15, 76, 31, 80, 71,224,126,220,104, 85,168,227, 28,189,125, 61,126,206,154, 37,100,103, 3,200,156,244,243,249,232,117,227, + 57,235,233,242,251,180,182, 50,126, 54, 56, 25, 99,175,159, 81,231,229,242,210,215,178,172,119,200,244,198, 14,127, 31, 61, 45, + 40, 47, 97,229,191,200,255, 0, 79,155,224,126, 56,162,144, 64, 30,191,143,158,170,163, 62,125,137,232,115,220,250,106,159,236, +213, 69, 35,156,131,204, 71,166, 63, 63,156,233, 54,219,160,220, 99, 35,227,108, 20,131,208, 14,228,121, 99,231,251,116, 80, 56, + 35,184,249,250,104, 22, 57,146, 8, 81,234, 59, 31, 80, 60,243,247,232,209,216,117,207,207, 68,223, 77,200,244,254, 88, 24, 45, + 24,207, 92,231,203, 69, 35,207,183,239,208,173,124,207, 92,126,127,118,138, 64,232, 79,221,249,252,249,105, 44, 16,142,190,251, + 15,145,130, 80, 58,103,215,250,244, 66, 49,140,129,215,212,247,207,245,106,146, 48, 57, 79,150, 7,252,116, 64,193,232, 49,223, + 31, 97,210, 44, 79, 91,236,127,211,253, 48,153,183, 97,138,128, 40, 5,103,208,224,119,235,169,123,123, 41,104,112,173, 78, 2, +173,121, 73,134,167,220,191,111,139,158,183, 80,116, 97, 14, 1, 26, 65,131, 29, 41,199,146, 91,142, 0, 58,136,106, 65,193, 4, +140,224,156,227,211,175, 77, 75,111,217,163,113,199,172,240, 9,183,233,105,231,146,187, 86,241,187, 45,249,133,131,143, 9,213, + 78,114, 75, 97,196,121, 2,219,168, 32,158,224,244,213,121,226, 65,147,244, 28, 33, 13,148,206,186,191,254, 57, 45,142,131,250, + 49, 71, 12,158, 42,209,137,118,101,162,169, 41,214,225,249,148,226,226,196, 27,233, 45,211,181,251, 99,118,128, 83,114,214,210, +153,146,220,116,144,235,125, 10,212,129,205,144, 20,161,156,249,105,224,180,100,161, 50, 35, 25,130, 74, 80, 57, 85,206, 20,176, + 26,230,198, 22,164, 30,253,198,153, 40,181, 49,238,232, 92,122,195, 47, 73, 82,210,211, 81,100, 39,149,110,184,178, 82,218, 1, + 61,252,180,248,219,242,107, 80,222,162, 71,155, 77, 98,169, 61,192,124,102, 35, 56,130, 91,108,254,170, 94, 72,254,110, 58,245, +215, 54,213, 70,193,217,152,217,148,130,111,182,219,117,233,112,127, 28,123, 9,151,215,172, 84,113,194,236,164,181,215,237,232, +114,116,222,246,144, 11,142,228,222,194,248,216, 58, 84,210,135, 89,145,227, 49, 81,108,184, 26, 12,189,132,132,180,123, 21,146, + 58,249,103, 78, 29, 49,216,145,157, 46,202,141, 0, 50,165, 99,153,162,151, 0, 10,255, 0, 80, 14,216,207, 93, 55, 22,253, 58, +116,249, 14,180,186, 68,194,162,227,110, 41, 40,100, 22,154, 72,236,208, 41,238, 63,167, 78,237, 50,222,105,197, 50,210,160,203, + 5, 43,248,209,238,139, 82, 16,172,254,170, 84, 6, 15, 64,123,246,209, 97,137,100, 58,121,100, 21, 38,219,129,125,253,251,159, +203,124, 66, 51,202,138, 53, 13,169,202,221,119, 10,203,112,189, 71,216, 96, 1, 27,139,233,177,239,124, 60, 54,123, 86,252,196, +161, 45,162, 50,155,229, 7,170, 74, 10,129,238, 6, 71,112,116,252,211,104,240,209, 29, 41,140,174, 68, 20,228, 53,207,204,217, + 24,234, 19,232,174,250,105,109, 74, 83,112,209, 24, 57, 24, 70, 14, 44, 8,200,152, 24,136,167,206,112,124, 36,200, 90, 75,189, + 71,243,115,233,167,174,148,195,204, 73,247,101,182,182, 20,172, 18,219,237, 41, 33, 67,200,161, 67,203,168,237,167,136,114,230, +101,187, 11,252, 13,192,191, 66,125,255, 0,150, 57,147,139,234,195, 84,202, 96,169,114,138, 75, 0,206, 26,224,108, 77,134,219, +119, 54,216,237,113,131,109,233, 2,149, 48,165, 68,165, 30, 38, 65, 7,177,206, 58, 19,172, 11,142,250,104,187,248, 72,189,156, +100,243,201,160,212,173,234,211, 33, 37, 75, 0, 55, 52,196,120,156,116, 8,228,153,212,158,131, 26,214,142, 52, 56,200,162,240, +178,104,182,149, 18,205,170,110, 30,239, 93,144, 68,251,106,214,167,179, 37,200,145,162, 56,240,138,204,250,159,186, 52,167, 29, + 74,229, 97, 13,180,210, 74,150, 65,201, 72, 25,215, 24,110,255, 0,109,214,236, 89,181,169,123, 63,196,206,212,209,225,216,219, +139, 33, 54,133,121,152,140,200,163, 86,236,207,172, 95, 67, 44,213, 92, 50, 29, 90, 28,247, 39,220,142,243,241,228,161, 37,109, + 48,160, 22,133, 16,160,237,150,210, 77, 74, 30, 57, 24, 4,148, 29, 42, 55,123,122,233, 0,155, 3,252,176,190, 77,224,151, 30, +113,173, 21, 7, 27,228,116, 52,241,195,151,149,172,136, 84,213,193, 77, 53, 92, 16, 72,162, 73, 41,163,149,129,100, 44, 12,107, + 36,134, 56,222, 75, 34,185, 39, 28,240,171, 81, 92, 18,235, 15,189, 50, 83, 15,182,251,205,242,193, 1,135, 11,172,188,227,129, +215, 90,116, 41, 15,167,152, 55,128,160,127, 87,190,113,171,197,186,251, 84,199, 27,110,231, 91, 11, 8,109,105,102,164,211,204, +152, 75, 4,120,205, 50,166, 93, 67,142, 51, 33,194, 84,147,146,190, 85, 0, 82,178, 59,103,187,207, 96, 84,168,155,135, 92,164, +148,251,168,139, 80,118, 74,101, 49,206,195,115, 26, 83,165,196,200, 97,164,164,165, 44,172,160, 41, 39, 56, 83,110, 36,144, 0, +213, 45,183,165,251,180,225, 57,214, 41,211,231, 46, 59,134, 32,155, 57,137, 75, 47, 56,165, 48,251,207, 7, 20,216, 97,211,207, + 28, 22,210,121,212,147,204,148,242,228,105,122,137, 21, 98, 46,198,247, 22, 0, 1,112,118, 0, 3,218,222,150,216,220,157,247, +199, 91,101, 89,173, 61, 78, 87, 77, 84, 36, 38, 42,136, 21,215, 65,180,182, 96, 28, 89,154,203,123,157,181, 30,246, 5,126,214, + 30, 11, 94,207,114,229,117,201,237, 69,164,202,120,197,143, 54, 85, 82,157, 37,183,147, 22, 59,235,108, 65,134,165, 70,194,224, + 61,226, 33, 45,144,231, 55, 47,196,226,209,149,116,219,107, 39,110,107,207,161,154, 43, 53, 69,192,105,220, 59, 45, 51,224, 51, + 86, 64,151,226,135,152,104,200, 64, 67,211, 90, 7, 24, 74, 94, 41,111, 9,230, 0,233,156,176,182,201, 77,169, 18,170,137,115, +223, 42,193,152,112, 99, 91,243,158,143, 35,199, 74,144,226, 36, 74,147, 13,192,137,144, 80,224, 4,151, 2,137, 82,194, 64, 37, + 56, 27,217,102, 90,215,133, 41, 49, 27,133, 84, 98,165, 57,224,159,142,189, 5,146, 26,113, 35,153,236,152,138,109, 46,169, 69, + 25, 87,137,133,140,117, 36, 18, 53, 10,175,145,203, 5,138, 80,109,208, 48, 59, 17, 96, 8,190,160,123,246, 0,108, 20, 27, 91, + 12, 57,247, 17, 10,106,116,134,130,190,154, 78, 89, 80,156,196, 87, 1,193, 91, 30, 97, 18,163,152,205,238,197, 65, 6,218, 88, + 22,108, 90,237,237,189,152,234,185, 95,164, 89,245,210,228,149, 56,245, 82,107, 53, 74,100,246, 35, 52,164,165,243, 25, 77,135, +115,204,242, 70,121, 29, 74,177,211,148, 96, 43, 79, 29,187, 98, 95,172, 58,106, 17,164, 80, 67, 45, 56, 12, 74,109, 70,100,217, +240, 85, 24,171,153, 44, 69,113,113, 82,236, 53, 20, 4,149, 21, 41, 69, 5, 39, 41, 86, 6,179,123,118,157, 92,141, 29, 16,156, +183,161,203,117,169, 45, 41, 85, 8,181, 70, 27,109, 47,173,212,248,236, 71,106, 84, 99,132,175, 36, 36,133,242,100,225, 68, 4, +141, 58,241, 37,169, 36,181, 81,162,206,163,163,196, 75,109,173,245,177, 34, 3, 69, 39,152,189,239,177, 10,146,225, 89, 79,232, +208,128, 73,194,129, 72, 61,117,169, 79, 70,103, 39,152, 2,179,118,234, 61,230,215,211,210,196,129, 98, 64, 29,141,241, 79,103, +220,101,153, 30,114, 70,144, 85, 43, 2, 13,228, 73, 14,130, 64, 58, 33,230, 2,133,252,192,233,140, 21,185, 0,130, 72,108,110, +143, 14,191, 8,188, 39,209, 80,234, 30, 65,115,252, 6,171, 17,212, 71, 73, 7,149, 40, 68,198,155,113,192, 74, 65, 61,137, 39, +175,124,235,131,126,216,205,247,152,111,141,190,225,194,146,243,176,233,118,141, 10,155,186,215,228, 17, 33,165,138,133,245,119, + 54,244,107, 38, 20,208,210,212, 86,213, 50,201, 6, 83, 77, 44,254,130, 77,220,242,193, 10, 9, 34, 68, 98,167, 69,113,239,115, + 98,162,209,150,227,169,100,164, 50,250, 30,142,153, 10, 67,104, 47,161,113,185,149,250,217,193,234, 7,124,117, 58,132,167,180, + 11,114,157,191, 56,207,226,110,235, 91,220,193,123,191,119, 82,161,167, 35, 13,210,109, 57,205,218, 52,134, 80,174, 65,250, 54, +233,246,252,102,210, 48, 48,150,250,247, 58,147, 81,229,101, 16,136,212, 49,107,111,110,151,247,223,215,107,145,238, 29,206, 45, + 63,161,246, 88,153,247,139,149,156, 79,155,208, 8,233,184, 47, 46,150,174, 32,203, 38,147, 89, 80,241, 82,211,189,164,119, 95, + 36, 18,213,200,157, 74, 75, 28,114, 11, 50,130, 59,157,236,172,221, 24,215,231, 13, 23, 37,147, 81,118, 25,168,236,189,253, 46, +152,218, 93,144,151,101, 53,102,223,141,191,116, 91,190, 19,107, 28,209, 97, 71,172, 69,186,152, 65,253, 80,165, 4,167, 7, 26, +218,107,158,228,161,191, 61,218,125, 49, 94,245, 40,172, 37,210,202,148, 67, 42, 11,229, 81,117,224, 57, 60,114, 15, 92, 2,160, +149, 14,100,228,234, 49,124, 2,239,229, 79,110, 55,233,155, 77,234,234,233,116, 45,237,130,141,181,173,200,114, 66, 99, 70,106, +181, 46,104,159, 98, 79,117,194,147,225, 52,221,203, 17,152,171,112, 17,134,171,110,142, 96, 9,204,138,108,186, 50,226,248, 65, +230, 94, 18,210,234,138,218,116, 40, 56,144,201,253, 42,228, 2,144, 82,232,125, 39,155,155,185, 24,199,163, 70,113, 75, 61, 53, + 66,211, 24,192,102, 80,250,173,177, 4,158,128,236,109,107, 27,244,244, 55,216,120,245,195,212, 92, 51,226,119, 20,241, 60, 83, + 51,208,241, 68,223,164, 41, 96, 4,170, 44,179, 42,251,111, 53,134,197,189,176, 77, 41,141,108,170,146,160, 98, 5,181, 97, 28, + 75,220,181, 26, 38,200,211,104,247, 69, 74,235,183,182,170,177,190,251, 65, 11,117,110,107, 14,159, 10,179,117, 91,182, 75,207, +220, 78,183, 82,133, 14,168, 4, 79,171,216,186,153,183, 21, 41, 82,210, 98, 36, 41, 9,115, 46,170, 58, 78,196,185,236,244,224, +218,187,107, 59,115,220,156, 71,239,126,228,237,173, 2,138,187,170,107, 84,230, 45, 75, 86, 5,193, 65,109,135,229, 52,252, 91, +142,223,106, 82,213, 70,114, 67,192,198,106, 35, 40,154,243,242, 91,140,151, 91,112,244,112,233,245, 17, 14, 44,120,174, 52,203, +140, 76,104,179, 45,183, 16,135, 25,122, 52,130,142,120,210,155,117, 36, 60,203,137, 64, 5,181,165, 73, 88, 7, 57,232, 53,131, +111, 20,122,181,183,183, 23,101,181,105,248, 52,138, 5, 74, 76, 74,251,148,250,116, 97, 1, 16,222,167, 60,106, 47, 70,165, 53, + 21, 77,181, 6,159, 41,244,182,244,150, 67,100, 56,236,116,184, 10, 10,220, 42, 89, 95, 56,135, 46,142, 10, 39,138, 88, 81,180, +202, 38, 14, 74,164,134,226, 72,138, 50,168,146, 61,200, 73, 86, 72,223,161, 85,177,213, 91,112,255, 0,139,220, 97, 77, 6, 89, +195,156, 53,196, 21, 60, 22,207,152, 77, 60,242,208,138, 52, 21, 75, 82,148,144,150,121, 38,162,154,174,158,178, 4,129,185,117, + 52,245, 41,169, 36, 80, 81, 94, 4,118, 96,232,187,243,188, 52, 58, 53,183, 22,179,113, 84,169, 53,196, 81,160,251,245, 41,201, + 62,244,245, 37, 30, 24, 17,105,181, 9, 10,121,208,245, 77,152, 9,140,153, 37,110, 58,225,146,151,148,235,139,112, 41,106,217, +189,151,227, 46,253,131,118,219,180,250,252,122,125,201, 79,118,165, 17,114,150,164, 24,178,216,166,197,117, 15,212, 36, 41,109, +252, 46,145, 13,149,146, 84,156, 16,146,163,211, 58,229, 18,107,239, 62,242,147, 37,199, 31, 91,206,242,186,241,117,192,165, 58, +115,211, 39,155,149,210,121, 78, 15,117, 43,161,198,175,245,237,208,133,180,123, 77,185, 27,181, 83,195,175,211, 41, 12,109,245, +155, 17,197,165, 15, 85, 55, 47,117, 95, 93,149,109, 82, 48,149,164,169,198,162, 73,174, 84, 86, 89,234,134,109,247, 20,190, 92, +115, 20, 34,161,174,138,166, 35, 73, 52,177, 73, 35, 11, 42,177, 35,177,251, 38,224,129,110,227,176,216, 3,139, 63, 49,225,124, +159, 58,137,168,171, 50,122, 67, 83,155,200,176,199,104,150, 37, 89,170,228, 17, 68, 21,129,214,136, 36,145, 64, 37,137, 84, 80, + 88,147,124,113, 55,116,247, 70, 69,253,187,251,165,124,248,206, 6,183, 3,113, 47,219,205,230,124,103, 29,108, 53,115, 87, 43, + 21, 40,234, 47,172,146,232, 75, 18, 90, 9, 39, 39, 13, 39, 9,232, 14,172, 14,214,153,120, 48,183, 78, 92,152, 57,157, 10, 37, + 43,109,167, 26, 13,184,150,207, 80,131,206,176,172, 30,169, 9, 5, 24, 32,105,155,145, 77,159, 79,177, 55,214,248,122, 99,102, + 14,214,238, 37, 54,195,167, 33,244, 45,181,207,144,221, 5,213,204, 44, 21, 16,151,138, 88,241,164,244, 32,167,198, 64, 82, 64, + 41,200, 53, 27,141, 40,118,147, 76, 15, 45,169, 62, 12, 25,243, 2, 86, 20,234, 16,197, 62, 19, 65,165,164,117,229,247,167,138, + 73, 61, 22,177,202, 7, 66, 69,171, 7, 12,211, 48,141, 68, 97,196, 42, 34,118,176,243,125, 68, 82, 27,237,230, 26,101, 64, 77, +183, 59, 94,221,125, 38,200,188, 76,203,114,202, 54,165,142, 67, 20,116, 65, 22, 8,217,183, 68, 90,250,204,182, 21, 7,236,171, + 60,153,116,228, 2, 70,148, 58,202,134,186, 15,209, 95,217,213,187,149,126, 36, 56, 44,216,253,206,187,174, 26,157,110,227,126, +218,126,193,186,149,240,199, 84,155,163,109, 39,191,101, 84, 39,204,125,144, 23, 80,149, 50,149, 75,163, 76,121,231, 85,202,227, +245, 23,148, 15, 58,213,173,192,169,181, 57,184,233, 69, 62, 75, 17,217,117,148, 54, 25,157, 8, 41, 77,184, 20, 57, 18, 85, 21, +196, 40, 55,148, 36,167, 33,106,235,158,185, 26,226,103,176,146,232,171, 73,224,105,202, 90,107, 52,248, 49, 97,111,182,232,183, + 25,185,145,221,148,239,233,169,118, 36,151, 91, 74,223,144,136,236, 44, 74, 46, 41, 40,108,169, 68,173,101, 73,230, 86,187, 41, + 49,154,218,209,205, 42,173, 52, 52,180,165, 74, 68, 70, 98, 69,116,182, 9, 42, 83, 15,150, 84, 82,172,173, 43,228, 0,100, 3, +231,140,166,170, 86,154, 21,107,179,160, 10, 88,238,110,160,139,147,114, 77,254, 59,238,122,227,195,207, 25,248,114,151,135,188, +100,241, 27, 44,203,158, 10, 60,158,155, 59,204, 26,142,156, 69,166, 56,105,158,169,228,130, 24,163, 88,121, 65, 97,137,146, 53, + 32,147,100, 5,141,201,182, 5, 94, 69,230, 10, 94,145, 46,158,251, 79, 45,104,148,212, 6, 23, 14, 74,219,229, 12, 45,182, 36, + 58,225, 37,149, 97, 25,231, 83,121, 7,151,152,115,103, 88,171,145,168,116,244,134, 97,194,115,222,240,219,142,210,234,106,145, + 26, 99, 65,211,209,246,222,146, 74,159,116, 16, 64, 41,113, 93,130, 80,224, 61, 53,146,220, 18, 42,169, 71,189, 65,175, 23,224, + 43,196,110,100,138,180, 52, 73,141, 20,132,150,219,121,201, 49,146,211,140, 32,184, 66, 20, 84, 8, 65, 74, 73,198,117,138, 87, + 28,148,234,162, 34,187, 74,117,192,134,195,141, 85,221,124,204,165, 74, 66, 64, 8,106, 33,105, 1,113,212,225, 81, 86, 31, 66, + 49,205,221, 67, 11,214,189,142,171, 48,185,237,109,186,218,221,251, 94,219,220,117, 0,118,198,190, 89,205,228, 83,161,104,226, +136,234,212,180,224,194,199, 64, 4, 7,140,136,249,140,128,157,144,137, 21, 72,107,233, 54, 57, 45, 21,111, 50,239,128,212,167, +155,106, 99,237, 53, 50, 5, 82, 58,170,112,130, 22,133,248,114,226,201, 82, 20, 84,194, 84,162, 75, 79,133, 20,150,202,144,180, +144, 70,158,219, 70,151, 29,231,155,118, 60,104,204, 22, 63,193,222,142,151, 20,169, 10,146,203,194, 58,208,195,190, 63,232,220, + 83,255, 0, 26, 27, 64, 12,165, 9, 10,230, 9, 32,105,148,162, 91,141, 33,248, 83, 89,126, 99, 48,230,182, 20,180,198,150,244, +129, 79,113, 60,188,170,101,153,170,115,222, 32,173, 37, 93,149,240, 99,149,124,169, 9, 89,109,184,249,226, 98, 31, 5,220, 21, +239,191, 17, 15,200,136,155,150,213,178,166,210,246,246, 59, 73,141, 4, 86, 55, 54,239,228,181,236, 42, 83, 8, 90,185, 31,124, +220, 21, 40,178,202, 18,149,144,213, 45,220,101, 41, 86,157,232,209,181,169, 10,100,111, 40, 23, 59,177, 54,181,129, 23, 4,146, + 58, 1,212,220, 92, 98, 11,198,117,212,212,212,243, 58,213, 20, 77, 12,210, 54,146, 52,132, 30,109, 96, 29,244,170,155,187, 57, + 42, 0, 96,197, 77,204, 4,253,172,219,203, 47,139, 95,105,175, 18,183,101,176,204,138,245, 61,141,200,141,179, 22, 18, 41, 9, + 93, 86, 93,102,147,182,162, 46,222,210,152,166, 51, 24, 19, 62,108,219,142, 29, 80,176,134,211,151, 87, 57, 0, 2, 78, 76,168, +189,147, 30,205, 59,119,129,141,189,137,185,219,145, 71,167,212,120,177,191,168, 72,110,225,150,239,131, 57,157,155,182, 42,104, +109,241,183, 54,188,132,130,150,171,238,183,225,154,253, 69,162, 22,251,224,192,105, 98, 36,114, 29,230,127,176,159,128, 53, 76, +144,190, 60,247,198,152,229, 94,166,106,149, 39, 54, 34, 21,106, 58, 84, 43, 87,116,135,159, 77,209,188,211,162, 60,140, 58,227, + 18,159,150,197, 29,103, 9, 19, 37, 74,154,140,150,153, 34, 80,232,121,231, 86, 94,194,151,206, 84,165,229, 89, 83,132,156,149, +100,255, 0, 59,169,238,117, 52,214,174,144,192, 15,246,106, 75, 42,129,210, 73, 19,102,115,254, 20, 96,116, 95,171,221,172, 52, +163, 53, 11,192,252, 48,106,170,102,226,204,206, 29, 53, 57,147,188,180,145, 48,254,234, 41, 9,101,148,237, 96,238,166,209,126, +196, 86, 97,188,158, 91,213,199, 90, 49,104, 79,128,238, 30,144,121, 9, 61,192,192,201, 10,245,242,251,181,174, 71,196,148,241, +192, 74,219,247,143, 25,101,101, 88, 83,109,158,100, 32,143,231,159, 20,183,140,231,245,116,231,222,179, 3,236,178,194, 18,160, +158, 67,240,159,214,231, 63, 8,200,245,230, 7,246,107, 16,183,233,171,125,220,148, 41, 94, 26,193, 82, 72, 56, 30, 24, 42, 25, + 7,182, 93, 82,127,254,159,144,211, 69, 97,106,138,152,227, 83,176,254, 38,222,238,150,252, 15, 81,139, 78, 53, 68, 46, 72,176, + 83,107,124, 58,253,247,191,243,198,113,108,211, 19,227,169,194,215, 63,134,203, 99, 5, 93, 27,101,146, 22,246, 14, 62, 37, 45, +242, 7,255, 0, 71, 91, 55,104, 83,196, 88,200, 91,141, 21, 62,226,125,225,196,142,201,144,233, 1,182,178,161,208, 1,200, 7, +158, 18,112, 52,218,218, 20, 34, 11, 72, 82, 48,167, 29, 66, 86,162, 9, 37,168,227,198,115, 36,249,169,100, 15,158,126,122,216, + 74, 93, 56,165,176,160, 48, 80,160,230, 79, 96,234,193,228, 24,207, 80,150,250,245,243, 58,216,145,194,132,133, 59,122,123,247, +233,252, 61, 58,123,176,171,188,113,197,169,205,134,223,126,214, 23,251,250,216,250, 19,223, 23,184, 45, 45, 45,164,250,130,146, + 81,130,165, 58, 79,198,161,205,211,205, 71, 39, 29,135,217,171,242, 82,161,202,146, 14, 66, 64, 79, 92, 18,112, 18,132, 16, 7, + 82, 71,151,110,167,174, 79, 64,225, 49,204, 6, 74,148, 8,194, 60,151,142,203, 80, 0,244,206, 50, 62, 95,110,173, 87,197, 93, + 84, 74, 17, 76,101,242,212,170,171, 93, 62,154, 51,254, 77,126, 25, 50,166, 56,148,245, 8,102, 57, 81, 78, 59,184,180, 13, 2, +252,184,139,157,194,142,158,167,111,226,127,215, 17,237, 18, 87, 87, 69, 75, 8, 13, 45, 67,233, 30,130,251,146,127,194,160, 22, +111, 64, 9,233,134, 94,191, 60,214,174, 57,178,155, 80, 92, 88,138,250,178, 34,146, 73, 75,205,197, 89,247,133,181,215,245, 87, + 40,172, 41, 93,185, 91, 30, 93,117,113,101,178,148, 36, 20,167, 60,185, 33, 32,115,124,125,242,123, 32, 17,235,228, 58,103, 58, + 6,155, 5, 49,217, 1, 3, 41, 72, 72, 43, 80,202,251,124, 13,167, 57,231,230, 87,116,142,188,202,202,181,122,119,157,164,242, +182,128, 48,114, 74,210, 29, 82,148,174,231,149, 4, 14,112,122, 96,156, 36, 12,232, 82,130, 20, 22,181,207, 83,241,235,252,127, +134, 38,117,241,198,136,144, 66, 60,145, 40, 65,126,182, 80, 5,205,187,158,167,191,125,177,107,145,209, 56, 56, 42,192, 31, 7, + 50,136, 81, 39,245,114, 6,113,145,215,212,143, 62,186,109,183, 18,195,178,183, 58,203,185,118,235,114, 45, 74, 13,245, 98, 93, +244,185, 20,123,178,204,185,224,179, 84,161,215, 41,210,208, 90, 83, 50,227,188,143,209,202, 66, 15, 51, 50, 26, 45,202,140,234, + 80,244,119, 91, 90, 65, 46, 20,133,132,149, 18,121, 66, 82,146,158,167,227, 3, 9, 11,231,233,205,133, 28,116,233,240,231,231, +171, 4,167,130,146, 70,115,130, 7, 41,230, 1,190, 97,133,140,168,119,230, 25, 87, 47,167, 66,115,128,228,164, 50,233, 32, 21, + 35,161, 23, 7,226, 15, 81,234, 45,238,196, 78,170, 0,218,129, 93, 72,247, 12, 8, 22, 32,141,193, 7, 98, 10,220, 16,110, 45, +112,118,216,254,127, 62,215,111,101, 5,107,129, 75,173,157,208,218,223,173, 46,126, 22, 47,170,217,166,219, 21, 73,139,114,161, + 95,218,219,154, 98, 29,148,206,220,223, 83, 66, 63,194, 24, 91, 77,191,245, 45, 81, 88, 76,246, 99,150, 29,196,198,148, 28,226, + 11,202,192,207,250,185,206, 65,252, 7,207,183,227,175,213, 99,121,118,187,111,119,183,109,239,125,163,221, 75,114, 53,215,183, + 27,137, 66,147,110, 93,212, 9, 73, 66,132,168, 18, 70, 89,155, 1,197, 28,211,235,208,230, 33,137,116,249, 72, 41, 92,105,113, +154, 90, 84, 7, 50, 85,249,178,113,225,194, 13,235,193, 55, 17,215,238,197, 93,238,191, 80,167, 82,159, 69,111,111,238,242,201, +110, 45,251,182,117,197,186,245,165,117,196,233,203,239, 75,138,218,226,212, 26, 24, 84,122,141, 58, 75, 74, 74, 64, 71, 51,238, + 85, 86,192,138, 57,152,176,223,150,204,110, 72, 29, 81,137,234,203,216,159, 51, 46,237,118, 86, 99, 65,113,143, 12,174, 75, 50, +215, 81, 41, 25,101, 83,105, 43,215,145, 46,237,160, 27,127,116,226,230, 50,126,201, 86, 67, 97,203,213,166, 30, 57, 89, 86, 50, + 57, 63, 91, 35,175,110,154,250,115,156,144,122,249,254,255, 0,158,190,132, 99,161, 63, 14, 7, 46, 51,204,122,121,244,234,117, +245, 72,229, 29, 50,113,234,114, 6,127,226, 52,254, 46,118,196, 36, 11, 11,116,192,142, 40,231,160, 24, 29,207,175,231,166,135, + 82,137,238, 64,232,124,241,143,179, 68, 44, 19,211, 24,237,156, 99,160,245, 31,126, 52, 50,128,235,212,121,128, 78, 49,215,207, +246,105, 68, 59, 91,211, 6,181,253,109,251,240, 59,128, 1,240,171,174,122,121,121,246,207,159,246,104,101,244,200,243, 35,246, + 1,147,162, 21,140, 28,140,254,113,161,148,112, 8,235,215, 56,237,248,125,154, 85,112,176,189,136, 39, 3,168, 0, 15,145, 62, + 99,204,143, 35,249,242,208,203,229,235,235,211,242,126,225,162, 87,140,117,249,224,122,159,158,135, 88,233,231,247,118,251,254, +237, 44, 58,142,248,193,237,183, 67,243,247, 96, 69, 12, 31,183,175,217,165,175,171,198,113,140,126,255, 0,187,241,210,210,202, + 77,133,197,207,221,131, 99,202,112, 72, 7,242,117, 92, 15, 35,128, 60,190, 67,250,245, 69, 3, 39,236, 25,209, 40,239,246, 15, +207,219,164,143,175,174, 6, 42,164,124, 64, 14,131,166, 15,207,236,243,242,209, 35,215, 56,198, 62,220,124,191, 62,122,164,143, + 51,208,255, 0, 72,235,253, 31,213,170,160,100,227, 56,233,145,243,252,254,237, 17,175,109,186,223, 3, 4,160,140,231, 62, 93, +207, 79, 77, 22,130, 49,143, 63,233,251, 52, 26, 72, 30, 64,143,179,183,217,162, 1, 74,146, 72, 61, 65,252,115,142,159,159, 93, + 35,140, 48,184,235,108, 20,140, 18, 1,239,158,135,203,239,209,169, 7,166, 14, 79,145,253,186, 1,158,132, 17,149, 14,196, 19, +140,124,243,251,180,122, 72, 79, 76,145,211,160,233,147,164, 9, 36,220,225, 54, 29,199,206,216, 33, 4,224,142,153, 29, 85,219, +183,166,164, 73,236,110,220, 31,173,246,111,125,182,170, 68,175, 13,251,106,189, 68,191,169,177,199,196,183, 33, 84,227, 24, 21, + 2,134,250,229, 41,151, 17, 57, 35, 63,229, 6,117, 29,198,252,179,144,122, 1,230, 79,219,211, 93, 44,246, 85,110,228, 13,175, +226,214,210,164,215,229, 24,246,198,234,192,168,237,157, 95,227,228,108, 75,174, 32, 59,111,188,224, 39, 4, 38,172,195,104, 4, +246,247,157, 70,120,186,135,219,242, 26,232,130,234,146, 37,230, 46,215,221, 14,166,255, 0, 32, 97,247,226,198,240,131,136,227, +225, 95, 18, 56, 87, 54,157,180, 83,123, 64,167,148,237, 97, 29, 72, 48,220,223,107, 43,186, 57,255, 0,166,248,146, 36, 30,101, +188, 76,200, 92,160,148,190,196,228, 14, 82,218,114, 10, 92, 8,242, 87, 93,108,205,136,136, 94, 60,105,208,170, 83, 26,151, 9, +191, 29, 82,222, 74,157, 92,231, 64, 7,195, 90, 79, 64,192,244,244, 26,103, 63,131,149,104,117, 26,148, 68,184,195,109, 83,228, +173,134,209, 44, 2,226,202, 22, 82, 16,178, 79,234,114,242,159,179, 79,213,149, 33,113, 88, 77, 61,112, 27,121,229,248,106,149, + 58, 39, 41,101,148, 19,213, 63, 32, 79, 66, 62,237,115, 51,211,150,121, 6,155,219,175, 91,109,181,133,253,226,219,123,241,235, + 75,241, 11, 79, 76,188,137, 11, 48, 93,149, 89,118, 13,107,151, 89, 1,176, 11,212, 3, 98, 79, 75,219, 27, 67,183,181, 74,244, +214,231, 56,229, 74,158,135, 38, 41, 14, 18,160,166,156, 74, 16,156, 36, 32,118, 65, 62,159,191, 89,190,241,113, 11,110,112,191, +176,215,206,245, 95, 6, 20,202, 61,145, 74, 92,138,101, 45, 18,130,100, 92,247, 68,212,150, 40,116, 70,185,198, 84, 94,156,164, +120,132, 3,202,211,110, 40,118,198,137,219,165, 83,139, 76,133, 80, 28, 90,114,210,212,240,109, 10,241, 74, 15, 76,167,253, 94, +159,126,117,202, 47,164, 21, 92,174, 69,225,135,102, 32,209,169,178,160, 90,181,125,216,152,229,206,180, 71, 8,142,167,224, 81, + 11,148,102, 36,173,177,132,143, 17,201, 42, 66, 85,208,148,156,117, 26,113,203,168, 3, 58,157, 54,103, 33,125,118, 36, 94,196, +237,222,227,213,182,195, 70, 89, 79, 69,197, 92, 91,144,112,245,125, 61,168, 43,234, 1,157,252,177,147, 20, 49, 60,207, 26,149, + 58,245, 75, 28, 77, 18,149, 55, 93, 87, 27,139,227,130,123,191,198,175, 16, 27,247,184, 53, 45,208,191,119, 70,231, 85, 90,163, + 41,199,233,180,154, 61,106,117, 46,133,107,211, 84,247, 52, 26, 77, 22,153, 17,228, 34, 20,118, 27, 40, 72, 87, 47, 57, 41, 37, +106, 42, 36,235,167, 28, 15,251,109,119,107, 98,106,116,123, 7,136,169,179,119,107,102, 31,113,136, 72,172, 74, 90,101,223,214, + 83, 75, 33,180, 78,165,212, 93, 60,213,120,109,143,137,113,159, 82,138,146,217, 13,173, 11,198,163,142,186,235,108,188,164,169, +213,165,121, 56, 0,143,231, 19,148, 16, 58,242,145,159, 46,186, 6,109,204,220, 84,151,229, 73, 75, 76,165, 69, 13,186,181,124, + 13,149,252, 65,167, 20,122, 32, 43,175, 41, 61, 51,208, 28,156, 25, 60, 92, 63, 80, 37, 67, 1, 49, 19,208,129,189,141,182,255, + 0, 21,246,184, 55, 7,184, 56,236,142, 32,151,195,140,255, 0,133,223,133,248,147,134,104, 42, 50, 10, 88,196,113,162,172,112, +123, 24, 69,210,178, 83, 74,129,100,164,145, 7,247,111, 27, 39, 75, 54,164, 44,167,244, 98,220,125,244,218,109,207,181, 44, 93, +211,218,219,134,218,187, 42, 87, 53, 36, 51, 69,220, 10, 51, 17,100, 76, 69,191, 35,149,215, 40, 82,159,113, 5,234, 52,228, 57, +209,198, 86, 27,121,151, 16,161,243, 44, 38,219,240, 59,195,109,247,187, 50,119,219,118,236,200,251,153,118, 75,170, 65,173, 67, +182,174,118,154,153,103,210,171, 16,188, 32,197, 90, 69, 61,192, 77,102, 97, 83, 13, 41, 94, 54, 91, 36,117, 74,129, 58,135, 95, + 6,188,107,223,252, 45,110, 43, 52,233, 52,170,149,203, 96,222, 20,101,215, 83,103, 60,250,190,174,187,227,193, 5,199, 38, 91, +143, 44,148,196,174,178,208,123,149, 72,234,165, 37, 41, 87, 50, 84, 70,166, 95,193, 71, 19,251, 57,196,190,221, 82,183, 35,102, +111, 8,119, 37, 13,224,211, 21,170, 59,206,165,155,154,207,170,129,201, 34,143,114, 82,138,185,226,186,219,193, 72, 75,184,240, +221, 9,202, 85,215, 26,134,231,185, 70,123, 75,158, 38,105, 42,145, 71,202, 88,163,146, 50, 90, 29, 18, 16,197, 88, 92,133,119, +146, 38,219,245,140,108,190,102, 70, 11,198, 92, 75,194, 16,120, 95, 13,105,224,204,246,176, 46,111, 21, 85, 20,213, 74,239, 79, + 89,200,142, 74,121, 30,138,165, 99, 8,209,242, 82,106, 70, 89, 32,229,195, 52, 53, 48, 77, 24, 84,168, 68, 26,105,237, 7,217, + 19, 64,220,153,215, 20, 88,210,156,133, 88,145, 38,124, 79,119,101, 69,163, 18,166,128,243,109, 37, 40, 1, 44,161,169, 41,117, +174,100,245, 74, 25, 74, 0, 3, 3, 90, 51, 69,177,226,173,138, 60,234,204,122, 85, 38,221,129, 41, 51,103,211,161,176, 94,110, + 91,208,250,114, 84,204,148,115, 56,210,150,121,194, 65, 70, 22, 18, 73, 35, 82, 72,226, 42,210,160,110,117,160,197,162,168,115, + 29,188,213, 74,168, 86, 45, 9, 77, 65,126, 76, 10,156,120,126, 17,171,208,229, 78,105, 60,176,167,150, 84,151,226,161,194, 60, +101, 71,113,182,200, 89, 26,226, 82, 54,226, 82, 43,245, 56, 55, 19,146,165, 82,168,173,189, 53,234,122,121,219,167,174, 92, 53, + 21,161,215,162,173,172, 60,148, 33, 24, 82, 73, 88,113, 92,185,201,201, 27,117,108,244,241,194, 26, 80, 4,200,175,177, 5,212, +177, 33,144,129,246, 88,144, 74,234,211,113,184,242,225,135,128,248,146,174,159, 42,143, 44,172,115, 72,249,120, 15, 20,146, 35, + 63, 50,152, 72,218, 26, 20, 93,164,179,172,144,173,201, 8,234, 67,105,179, 12, 29,182,244,136,190,236,139,162, 43,211, 44,218, + 8,144,234,232,245, 56, 11, 17,235, 21,134,156,116,152, 20,134, 80,176,164, 56,209, 72, 43,143,200,135, 22,133,101, 74,113, 57, +214,238,237,187,251,130,203, 76, 67,151, 72,167, 84, 98,133,170, 91,213, 42,148,233, 12, 76,138,192, 82,148,219,210, 68,113,202, +170,138,219,193, 89, 73, 67,106, 72, 42, 40,200,248,181,222,133, 7,252, 38, 61, 94,168,236, 48,218, 34,198,106,222,121,215, 12, + 42, 5,177, 73, 72,109,202,131, 44, 54,165, 4,166,172,236,131,241, 5,128, 23,219,155,149, 1, 39,109, 54,169, 47,214,159,141, + 78, 48, 42, 53, 11, 73,106,126, 99,142,173,244,196,145,119,169,196,182,166,100,201, 84,167, 3,137,162,161,194, 72,100, 6,202, +154, 9, 82,143,134, 60, 50,195, 58,115, 25,121,138, 2, 2, 5,250,155,236, 2,134,216,220, 95,168,238, 13,133,186, 73,115,220, +216,213, 80, 74,207, 75, 13, 76, 72,128,234,144,106, 49, 40, 80,161, 99,149, 74, 52,149, 4,141,198,181, 87,112,116,142, 90,187, +151,130,212,169,221, 85,192, 81, 71,162, 69,143, 17,233,177, 66,234,213,121,210, 29,109,249,104, 83,136, 47,211, 99,197,142,149, + 42, 58, 27, 13,132,100,161, 42, 4, 36, 14,234,214,192, 82,168,207, 6,100, 72,146,243,115, 36,115, 37,223,120, 83, 66, 40,134, +150,151,200,182,225, 67,103,224,109,191, 19,152,143,214, 95, 97,205,166,202,221,175,203,122,100, 42,117, 14, 27, 48, 96, 45,217, +109,187, 93,144,132, 73,164,149, 65, 11,113,200,212, 8,170, 80, 21,149,224, 37, 41,120,242, 70, 10, 10, 9, 83,160, 99, 78, 43, +116,232,146, 18,162,237, 86,169, 54, 43, 79, 52,133, 63, 42,172,182,163, 42, 83,190, 32,120,165,166, 16,210, 27, 75, 65, 69,178, + 18,158, 64,162, 82, 50, 81,157,111, 81, 68, 21,129, 8, 22,227,101,189,237,123,109,114, 1,185,236,109,232, 47,107,226,137,226, +141, 77, 41, 30,203, 30, 87, 20,158, 96,168, 26,121,138, 19,111,172,118,118,179, 18,159,221,137, 20, 88,110,150, 85,193, 53, 73, +145,226,170, 46,101,196, 76,164,184, 28,240, 12,134,153, 95, 43, 10, 74,155, 46,181,207,144,121,194, 7, 62, 9, 82,143, 47,108, +234, 4, 62,210, 58, 72,219,158, 58,184,155,183, 37, 40,183, 29,237,225,189,234, 44, 58, 57,127,200,220,181, 35,117,198, 37, 8, + 56,229,118,159, 89, 74,128,242, 87, 67,131,157, 78,142,170,138, 83,209,158, 69, 30, 52, 6,160, 54,228,136,114, 46, 38, 99, 50, +181,206,146,133,248, 78, 67,166, 72,113, 37, 82, 16,149,149, 37,199,134, 91, 66,242, 26, 11, 88, 90,147, 16,207,164, 3,178,234, +161,113, 5,183,251,173, 73,167,134,104, 59,189, 97,210,168, 85, 9, 52,211,200,236, 43,223,109,162, 38,218,168,185, 41,231, 21, +137, 21, 23,168, 70,202,152,128, 87,226, 56, 92, 95,235,114,171, 51, 28,157, 98,150,190, 8,100,110, 92, 83,221, 79,199, 69,239, +185,177,177, 27, 15,128,189,142, 45, 63,163,127, 17,212,112,127, 20,113, 29, 53, 38,185,106,243,156,177,196, 81, 58,133,230,212, + 82, 85, 83, 84, 44,108,169,172,160, 52,166,171, 97,169,163, 3, 91,114,200, 24,226, 4,154,196,244,219,106,220, 88, 18, 36,123, +230,213,238,117, 58,151,184,116,120,110,184,212,168,118,117, 66, 76, 20,196,186,144,180, 43,157,136,145,234, 12,197, 91,146, 81, +132, 70,114, 83, 75, 43, 75,110,100, 74,151,217,207,198,213, 39,137, 54,238, 61,133,221, 10,180, 42,127, 21,123, 72,167,219,169, +193,146,168,241, 90,223,139, 2, 44,118,170, 52, 45,207,178, 66, 74, 81, 80,184, 88,183,166,211,141,199, 76,103,157,106, 33, 53, +232,129,216,210,102,162, 20, 59,161,215,121,234, 81, 43, 84, 91,170,177,103,222,204, 45,171, 98,241,138,155,114,161, 89, 69, 74, +148,180, 59, 78,143, 92,122,151, 17,151, 83,112, 82,132, 69,184,196,200,129,133, 59, 38, 25,125,133,176,243,141,180,149,244, 87, +132,222, 13,248,140,184, 47,203, 39,113,120,121,171,199,191,238, 93,185, 98, 53,251,111, 91,251, 99, 85,166,215,175, 87, 41,240, + 42,241,155,165,214,182,154, 47,191, 41, 91,145,104,211,234, 42, 83, 92,148,103, 83, 85,163,199,117, 84,250,197, 33,136,225, 97, +185,206,113,194,121,109,101, 27, 45,125, 80,163,171, 2, 95, 99, 38, 41,121,134,115,162, 78, 66,144,133, 38,141,138,205,202, 84, +102,150,120,231,139,150,134, 90,104,163,158, 75,196,249,142,105,226,180,212, 89,118, 93,165,163,138,170,138, 74,220,202, 74,236, +184,209, 80,208,200,239, 65, 46, 97, 87, 27,213, 71, 85, 72,252,182,203, 23, 53,133,225,134, 42, 12,195, 41,170,210,211, 69,154, +203, 85,150,205,166,227,165, 61, 6, 5, 54, 97, 74,156, 18,227, 69,110, 35,140,180,165,169,249, 82,156, 67, 13, 71,138,218, 85, +241,185,226,184,218, 91, 31, 9, 82,214, 50,122,244, 11,114,111, 27,114,131,182,251,199, 34,255, 0,136,154, 45,247,176,245, 58, + 22,218,111, 22,216,181, 81,143, 85,184, 45,221,195,188, 89,183,161, 89, 20, 42,100,159,117, 96, 92,148,187,141,187,194,223,118, +133, 84,102, 59,113,170, 72,126, 72,105, 41,114, 12,164, 55, 75, 99,119,122,224,174, 51,245, 7, 19,219, 89,112,112,215,186,220, + 60,220,144,175, 61,215, 77,193,108, 87,174,237,159,151,101,211,226, 77,189, 33,110,173,151, 93,162, 70,144,154,221,142, 81, 76, +164, 63, 80,165, 60,241,153, 77, 68,215, 72,114,100, 8,147, 31,135,146,113, 71,183, 59,103, 34, 92, 13,253,110,235,173,110,165, +205,184,176,173,202,147,143,193,221, 91, 86, 92, 45,209,191,156,186,104, 59,129,181, 86,205,199,245, 20,121, 48,102,109,181,175, +123,214, 32, 86,104, 82, 40,181, 28,208,209, 13, 52, 53,191, 38,135, 86,101,109,214, 19, 84,229,188, 53, 74,207,159,161,161,167, +175,150, 56, 86,121,140,113,211, 67,100, 55, 51,107,101,157, 73,146, 72,180,145, 11, 42,168,147,153,162,197,146,162,201, 56,112, +210,113,141, 46, 79,196, 20,245, 18, 53, 58,173, 84, 67, 46, 95,106,106,245, 73, 41,170, 2,208,207, 24, 52,245, 80, 86, 80, 37, + 72,165,150,158,114, 90,122,170, 9,135,212,151, 87,227, 20,104, 45, 87, 24, 85, 86,218,241, 42,148, 71,110, 43,170,211, 76,212, + 52,150,132,106,245,151,114, 85,109, 11,162,129, 84,104,168,251,149,106,157,112,209, 42,113,229, 48,188, 58,218,227,142,108, 33, + 77,169, 90, 21,237, 94,168,222, 22,133,223,195,254,202, 10, 93, 82, 93,177,180, 43,183,183,154,236,164, 81, 20,153,146, 98,238, +125,229, 73,129, 91,163,213,175,116, 52,191, 22, 53, 66, 29,188,253,173, 71,167, 81, 57, 76,150,133,213, 81,149, 33, 81,220,148, +211, 74,150,182,225,218, 92, 50,112,247,195,165,153, 77,165, 90,219,117, 99, 91,150, 60, 43,174,244,174,223, 49,109, 27,134,228, +218,202,205,255, 0,107,212,149, 18,116,251,243,114,104,207,201,168, 51,121, 72,220, 7,211, 38,169, 13,184,115,170,215,251,244, +217,244, 88,238, 70,155, 37,169, 49,121, 20,212, 93,185,118,222,225, 46,203,225,223, 98,183, 23,120,253,160,252,116, 84, 55,118, +117,213,191, 91,223, 72,247, 69,219,219,105,184, 23,221, 98, 20,254, 44,230,237,204, 42,236,138,109, 42, 84,217,212,251,153,118, + 17,144, 93, 52,138,101,143, 85,175,174, 58,252, 58,125, 67, 79,254, 28, 54, 93,153,214,174,113, 79, 20,121,133, 44, 97,185,112, + 9,150,105,100, 73, 41, 86, 94, 92, 38, 35, 21,167, 43, 81, 29, 57,169,144, 44, 20,142, 37,170,101,154, 49, 70,106,111,238, 14, +168,151,137,248,115,244,207, 19,210,215,101,116,144,212,140,186,131, 48,134,146, 36,164,139, 59,164,121,107,219, 53,204, 26,181, +229,163,139, 38,160,162,201,235, 36,205,169, 85,235,234,125,154,190, 36,140, 9,162,154, 90, 72,169,213, 45,253,208,118,151, 97, + 90, 91,181, 38, 13,167,103, 94,215,213,102,231,174, 55, 49,215, 31,172,238, 77,247, 17,216,119, 14,228, 45, 49,233,233, 9, 77, + 46, 21, 66, 69,159, 70, 41,134,135, 99,193,140,211, 84,180,200,231,102, 82,155, 18,155, 83,131,120, 85,111,219,154, 3, 50,105, +148,169, 19,160,193,160,214,170,113,194,103,214, 98,211,229,168,183, 62,159, 72, 66,178, 89,147, 84, 14,152,173,252, 45,248, 13, + 54,178, 84,149,147,169,133,123, 64,189,146, 86,255, 0, 13,187,109,182,187,145, 64,219,248,219,185, 14,215,178,234,116, 13,218, +222, 42,148,217, 2, 53, 42,184,204, 22,226,237,117,131, 14,206,132,240,114,194,225,222,157, 83, 53,138,149,106,161, 29, 14, 73, +171, 86, 42,171,153, 89,124,169,230,121, 34,177,182, 91, 65,116,111, 46,243,196,218,253,171,247,251,206,183,116,213,106,146,228, +110, 45, 77,182, 89,136,139,118, 28,148,197,186,119, 9, 54,243, 47, 6,109,107, 54,152,143, 26, 45, 38, 35,139,255, 0, 5,141, + 9, 78,190, 85, 41,232,140,170,115, 83, 86,212,245, 25,140, 21,212, 63,162,231,161,141, 36,125, 43,202,166, 45, 35,172,211, 73, + 10, 63,152,169, 40,176, 6,149,220,186,195,120,162,104,238, 34,191,184, 15, 62,224,252,219,132,178,206, 51,225,190, 45, 60, 75, +193,102,174,190, 55,168,174,180,249,164,116,185,109, 52,249, 86, 93, 75,153, 84,195, 32,246,103,141,107, 43,115,158, 82,101,249, + 74,150,205,227,150,183, 49,167,173,118,253, 35, 52,143, 98,189, 5, 54,159,179,243,109, 77,101, 98, 4,221,196,190,119, 71,112, + 90,102,181, 21, 8,139, 91,164,212,174, 88,182,196, 10,140, 85, 56, 18,219,240,220,254, 9,200, 41,115, 33, 74,231, 82,146,146, +218,155, 42,234,187,209, 27,163,184,237, 90, 72,168, 42,130,200,240,165, 64,143, 38, 82,158,160,173, 74, 13, 9, 84,182,157,124, + 46, 93, 57, 73, 90, 10,152, 73, 43,100,172, 41,160,180,115, 32, 49, 27, 9, 77,177,109, 93,139,217,139, 99,111,227, 72,143,183, +214,214,217,218,118,173,163, 6,173,153, 19, 88,131,108,210, 99,208,101, 65,174,135, 83,148,212,157,159, 79,150,244,181, 20,148, +123,204,229, 43,177, 57,114,208,124, 17, 57,202, 83, 14,170, 36, 5,137, 85, 10, 36,185, 75, 84, 55, 96,202, 71, 42,132,120,171, +113,106,241,219,116,146,219,173, 15, 11,186, 85,148,168,114,194,132,136,200,173, 31,158, 54, 80, 65, 3,168, 34,224,129,232, 65, +213,184,220,116, 23,199, 0,113,150,101, 55, 20,241,127, 20,113, 19,235,165, 25,245,125, 85, 67,198,196,108,179, 84,182,152,185, +133,129, 73,145, 89, 34, 14,220,203, 72, 8,103,229,150, 86,247, 81,110, 91, 49,167, 78,161,215, 37,212,219,113,213,165,218, 85, + 69,240,244, 26,132, 54,129, 11, 49,228,181, 29, 46, 66,168,140,245, 75,156,193,124,161,183, 27, 28,201, 86,190, 81,155,125,104, +135, 34, 12,114,220,121, 41, 40, 98,157, 53,228,170, 35,114, 20,230, 86,221, 26, 80,200,167, 40,169,103,158, 59,169, 8,202,112, +128,131,144, 60,211,163, 71,152,183,230, 83,229,191, 4,133,169,153, 76,134,179, 60,198, 89,109,232, 14,212,225, 62, 86,221, 65, + 13,185,148,165,196,101, 78, 32,243, 37,209,130, 19,153,208,146,134, 81, 41, 19, 11, 49,214, 86, 24,121,165,178,165, 69,168, 40, + 31,135, 1, 64,169, 46,149, 41, 36, 40,254,144, 5, 36,146,188,100, 38,134, 48, 25,152,141,172, 46, 77,136,220, 27,250,141,253, +222,226,122,130,193, 89, 80, 41,169,164,139, 72,146, 84, 43,112,200, 85,236, 84, 40, 87, 84, 1, 94,219, 21,144, 93,244,155, 22, + 69,101,209,125,183,168,209, 97,190,250,204, 70,152, 5, 64,200,140,166,150,203,176, 87,241,151, 94,136,160,178,134,218, 89,230, + 82,128,202,114,162,164,100, 2, 53, 28,111,107, 60, 59,251,143, 63,104, 23, 11,126,205,170, 3, 53,106, 46,201,109,173, 53, 27, +255, 0,189,117,166,249,216,137, 90,147, 49, 18,105,172,202, 66,146,174, 71, 98, 81, 45,102,106, 49, 24, 42,193, 53,155,189,229, +160, 5,197, 73,215,123, 47,141,211, 98,142,167,173,155, 89,193, 42,229, 25,106, 76,148,165, 47, 71,180, 91,112, 5,120,181, 23, + 14, 83, 34,182, 58,174, 44, 18,162,180, 43,149,249, 92,173,165, 40,113,184,160,218,118,243, 51,158,189,219,161, 64, 93,228,170, + 58,109,137, 55, 99,177,210,229,194,253,186,103, 61, 86, 93, 46, 69, 85,196,248,174,194, 85, 90, 68,169, 42, 65, 86, 20,243,235, + 89,234,113,167, 76,190, 73, 36,154, 36, 66, 2,174,204,196,216,168, 96, 86,235, 97,187,142,171,113,179, 0, 79, 96, 43, 78, 39, +200,167,207,168, 64,172,169, 48,195, 60,176,243, 35, 59,153,169,213,129,145, 9,184, 40,178,128, 35,189,201,120,217,238, 72, 33, +152, 74, 45,191,110,218, 20, 10, 5,159,104, 82,163, 80,109, 43, 50,145, 78,182,173,138, 20, 36, 37,152,116,202, 37, 38, 58, 33, + 65,136,219,104, 24, 24, 97,176,165, 43,186,214,165, 45, 89, 82,137,214, 66,192, 44, 56, 50, 64, 66,255, 0, 84,246, 74, 22,174, +188,167,230, 79,109,121, 92,114, 87,226,132,243, 5, 16,162,145,156, 45, 62, 69, 56,238,161,231,246,106,239, 2, 58, 29,109,109, +140, 45, 4,158,231,170, 65, 29, 58, 31, 49,251,181, 41, 93,150,200, 52, 42,216, 5,236,161, 64, 0, 1,233,167,107, 95,107, 15, +118, 6,132,133, 20,133,242, 45,129, 0, 88, 1,181,128, 29, 5,187, 14,150,219,160,198, 15, 92,140,185,115,138, 64, 42, 71,192, + 48, 51,148,245, 42, 81, 7,237,199,237,198,179, 75, 74,130,162,174,110, 64,124, 66, 48,124,213,215,155,149, 64,142,249, 35,240, +215,148, 83, 60, 73,124,161, 36,156,132,103,190,121, 71, 64,125,124,254,243,173,128,177,237,177,134,150,166,134, 7, 42,186,224, +143, 44, 12,121, 14,154, 67,202,160,201,111, 49,218,255, 0, 63,127,239,196,120,213, 0, 90,237,117,185, 55,251,239,238,249,252, + 47,182,197,185,224,181,226,148, 36, 57,202,148, 5,148,228,167,152, 5, 58, 79, 79, 76, 14,157,180,226, 8,126,236,203,104,229, + 60,234, 39, 41, 0,168,144,160, 20,178, 64, 31,173,203,129,242,206,178,138, 93, 27,145,148, 5, 35,225, 35, 39, 61,212, 7,196, + 78, 60,251, 1,143, 61,123,145, 19,153, 69, 69, 4, 41,106, 8, 66, 83,212,227, 32, 37, 32,103,190, 59,159, 85,124,134,144,177, +221,137,249,239,127,225,134,106,140,228, 77, 49,141, 79,213,198,127,211,243, 54,237,139, 84,118, 89,109, 14, 61, 41,212, 70,139, + 13,135, 37,204,148,176, 18,212,104,172, 36,184,227,206, 40,246,108, 37, 56,249,146, 7,158,181,250,179, 86,126,239,172,200,171, +165,165, 49, 78,105, 40,133, 70,101,239,129, 48, 41,109,171,225, 88, 0,126,146, 83,234,203,139, 61, 57, 66,130,124,177,167, 30, +243,170, 10,151, 53,173, 13,126, 37, 62, 51,173,185, 94,117, 25,228,155, 49,165, 7, 24,164,151, 19,254, 82, 35, 74, 8, 47, 36, +116, 83,129, 32,146, 1, 26,196,209, 13,152,192,120,189, 72, 36,248,109,160, 56, 2,128, 5, 63,163, 79, 92,103, 3, 39,160,236, + 58,233, 61, 70,161,194,166,241, 70,119, 63,180,195,227,217,127, 22,248, 41,196,175,135,160, 90, 56,228,204, 39, 66,107,106,150, +209, 41, 6,241,194,108, 75, 91, 99,174, 91, 3,191,217,140, 1,191, 54, 69,192, 76, 50, 27,111, 13, 54, 73, 64, 9, 75,139, 82, +155, 0, 43,169, 44,128, 9, 62, 93, 64,193, 61,206,129,152, 95, 41, 82,138,208, 22, 65, 72, 12,164, 32,165, 0, 36,148,163,152, +144,217,234,147,145,223, 36,228, 96, 13, 93,159, 83,174,103,149, 32, 40,182,126, 55, 51,206,132,145,201,240,161, 7, 35, 62, 99, + 32,129,158,249,214, 55, 45,212, 37, 96, 41, 41,120,167,152, 0,148, 0,129,149,167, 39,148,225, 32,224,247, 61, 71,166,116,224, +158, 91,109,185, 27,219,231,253,127,117,240,237, 35,179,146, 77,153,143,253,199,183,115,176,223,225,139, 75,238,163,147,144, 21, + 40, 96,142,116,142,164,165, 71,170,222, 82,187, 31,136, 4,140,243, 1,229,215, 88,252,183, 65, 72, 11, 82, 74,126, 16, 8, 28, +184, 82, 72, 9, 66, 86,188, 18, 18,124,176, 62,100,224,157, 92, 39, 56,224, 82,146, 23,204,162,174, 95, 9, 9, 79, 55, 83,240, + 40,169, 64,252, 33, 36,252, 92,160,245,192,214, 45, 49,208,142,112, 21,241,171,170, 65, 78, 85,128, 50, 82, 74,129,229, 60,160, +143,187,169,234, 53,176,135,175,112, 15,243, 31,187,175,201,195, 45, 82, 13,247,235,252, 62,255, 0,187,182,253,175,139, 84,247, + 82,160,163,130, 9, 39, 36,167,159,175,196, 10,138, 66,176, 19,215,191,145, 57, 25,215, 6, 61,188, 92, 35, 69,226, 19,132,201, + 91,199,110, 82,195,187,161,195, 10,102, 93,241, 28,140,192,126,125,115,105,170, 47, 48,214,226,219,142,184,128, 86,242, 33, 44, +195,173,196, 64,207, 34,224, 76,242,116,235,186,178,222, 24, 37, 41, 81,237,144, 82,160, 20, 48, 84, 0, 3,162,199, 82, 58,245, + 31,127, 70,250,191, 79,164,215, 96, 84, 40, 85,216,173, 79,160,215, 96, 84, 40, 53,232, 14,182,151, 35,203,161,214, 98, 61, 73, +173, 66,121,165,116,117,135,105,115,166, 54, 71,126, 85,224, 28,246,216, 14,203,105, 35, 63, 89, 25, 12,191, 17, 98, 47,238, 61, + 15,184,145,176, 59,197,243, 92,186, 44,214,138,175, 46,156,218, 42,180, 41,114, 7,145,137, 5, 36,183,172,110, 22, 65,210,229, +109,238,199,229,128, 82, 2,137,239,143, 49,212, 31,152,199,126,154,248,172,145,219,166, 51,147,251,191, 13, 61,188, 74,237, 67, +251, 7,196, 22,245,108,212,198, 21, 21, 91,103,185, 87,117,161, 21,133,168,173, 72,164, 83, 42,242, 5, 1, 65, 71,170,194,232, + 46, 83, 92, 10,235,144,230,114,115,146,198,169,106, 88, 4, 43,155,166, 71, 76,119,245, 30,186,153,211,202,179,197, 12,202,124, +178,168, 97,235, 98, 1,254,120,230,119,142, 72,157,226,149,116, 75, 17, 42,227,209,212,233,101,251,152, 17,138, 46, 16, 70, 51, +235,156, 28, 99,251,116, 42,177,142,195,148,103, 30,125,187,147,243,213,117,168, 30,224, 12,142,248,206, 79,217,161, 87,208, 31, + 60,156,126,255, 0,221,173,192, 44, 0,244,192, 29,190, 56, 29, 89,193,233,255, 0, 14,253, 52, 34,142,113,223,207,184, 3,240, +209,107,237,223, 29, 71,231,243,233,161,156, 32, 2, 51,147,231,142,191, 62,154, 85, 7,124, 42, 44,119,192,171, 35,203, 63,126, +113,231,228,117, 69,125,179,147,255, 0, 31, 93, 87, 95, 55,158, 49,229,249,245,208,235,199,207, 62, 94,159,126,149, 2,228, 99, + 29, 0, 3,231,255, 0, 24, 21,103,175,216, 49,159, 93, 45, 37,254,183,221,211, 75, 74,139,128, 0, 31,142, 13,143,168,198, 79, +124,227,238,199, 79,219,162,145,140,118,235,230,113,251,254,205, 8,223, 83,147,145,208,244,251,241,215, 69, 35,177,235,231,219, +247,232,141,107, 47,108, 12, 18,142,199,167,223,235,249,253,250,169,158,221,250,124,254,126, 94,154,164,140,245,233,211,215,247, +124,245,237, 36, 40,144, 15, 99,131,223,161,210, 78, 54,248, 96, 99,223,140,142,249, 24, 0,103, 25,202, 78,139,108,149,129,212, + 0,124,241,215,168,233,211,239,253,154, 16,180, 1, 56, 0, 36,228,159, 79, 44,147,243,254,189, 86,109, 65, 36, 14,184,198, 2, +143,203,212,253,218, 64,155,117,192,193,237, 39,151, 3,175, 66,123,119, 63, 63,144,209, 8, 95, 51,137, 73, 78, 57,115,241, 30, +221, 60,178,126,122, 8, 60,140,148,130, 85,216,224,117, 87,159,124,253,167,240,209, 63, 11,137,248,186, 28,252, 35,168,207,219, +248,233, 22,234,113,131,235,243,233,139,187, 64, 43,162,136, 63, 49,147,235,233,247,106,247, 70,169,212,104, 85, 90,117,110,145, + 41,200, 53, 90, 68,248,117, 58, 92,198,148, 80,236, 90,141, 62, 75, 82,225, 74,109, 67,170, 84,137, 44,180,175,184,141, 88,152, + 10,229, 79, 96, 48, 57,177,219, 35,167, 79,219,162,211,156, 40,118, 30, 71,184,249,245,242,233,162,144, 24, 21, 97,112,118, 32, +239,132, 15,196,169, 30,155, 16, 71,112, 71, 67,137,193,240,233,185, 20, 62, 44,120,124,219, 61,240,167, 76, 71,191, 84,105,140, + 81, 55, 14,155, 5, 64, 73,165,223,148, 54,155,135, 89,139, 53, 8, 57,103,197,121,191, 25, 25,253,100, 72, 65, 4,131,173,161, +180,210,245, 40,183, 10, 44, 52,248, 14,171,153,247, 36, 40,150,208,211,100, 16,181,171,201, 93, 7, 79, 83,168,161,123, 40,248, +226,137,194,214,237,191, 97,110, 76,199, 6,196,111, 20,202,117, 42,239,113,106, 82,155,179,174, 82, 83, 18,135,123,178,146,127, + 69, 25, 42,113, 12, 78,199,254, 43,149,211,158, 67,169,140, 46,220,104,182,207,128,184,210,104, 79,178,197, 70,159, 80,128,226, + 36, 70,171, 65,146,132,189, 18, 92,121, 77,168,165,248,174, 52,182,212, 10, 73, 7,155, 84, 39, 16,240,233,203,115, 25, 99, 88, +201,130, 67,170, 35,216,169, 61, 47,220,173,244,155,247,243, 17,102, 24,239,143, 11, 60, 80,110, 39,225,218, 88,107,103, 15,152, +229,170,144,213, 33, 98, 60,234, 0, 89,236, 55, 34,117, 93, 98,219,115, 3,198, 8,209,135, 82,196,175,212,218,113,133,198, 84, +117, 38, 71, 32, 67, 78,101, 4,182,142,157, 7,255, 0, 22,125,124,255, 0, 13,121,226,147, 97,169,220,100,236, 45,251,195,253, +214, 96, 83, 89,184, 96, 55, 58,221,184,156, 71,138, 45,139,210,151,207, 34,220,169,161, 93,196,113, 36,248, 82,113,221,137, 11, +244,198,172,116, 62,102,100,181, 29,160, 61,231,149, 60,142, 99,224,101,164,246, 3, 29,128, 25,233,173,128,164, 74, 18, 99,198, + 73,116,183, 25,181,114, 60,178, 57, 76,151, 16, 50,162,162, 14,124, 60,129,246,235, 82,158, 2,165,118,210,203, 98, 45,216,245, +190,219, 94,253, 7,223,139, 66,108,214,122, 57,232,179, 76,177, 18,150,182,141,214,104,102,243, 49, 73, 35, 33,209,244,220,171, +217,133,180,176,210,230,225,188,151,199,230,211,196, 86,208,238, 55, 15,155,153,121,237, 22,231, 81,100,219,215,221,143, 82,149, + 79,168, 71,125,106,110, 52,230, 88, 90,132,122,157, 46,106,128, 76,202,124,136,220,143, 71,121, 63, 11,141,186,146, 8, 36,141, +107, 90,238,137,210, 99,242, 84,194, 39,208,228,243, 69,156,165,101, 50, 16,209, 35,156,184, 17,212, 56,158,138, 66,198, 72,229, + 26,253, 19,125,160,126,206, 29,169,246,133, 88,112,226,214,219,129,100,111, 5,191, 18, 68, 91, 19,116,219,132, 28,148,220, 38, +208,181, 53, 65,186, 99,180, 66,170,182,233,119, 30, 25, 39,198,138, 86,165, 50,121, 74,144, 97, 29,196,223,179,219,138,238, 14, +171, 85, 42, 30,238,109, 69,202,253,158,137,146, 26,165, 95,150,229, 61,202,229,149, 91,134,219,133, 41,155, 18,173, 13,165, 6, + 91, 82, 48,172, 57,202,180,231, 5, 26,179,178, 42,250, 57,225, 72,106,149, 86,169, 74,233, 44,116,220, 29,175, 27,118,123,216, +133,216,130, 59,142,146,250,158, 42,173,226,215, 74,204,190,189,178,218,167,133,214,182,141,111, 32, 18,142,242, 68,219, 84,208, +202,162, 69,119,250,199, 68, 58, 38, 17,181,158, 86, 98,205, 98,245,184,155,179,246,190,133,117, 81, 43,212, 69,205, 93,107,111, +171,201,247,180,220, 22,125, 75,170,221,143, 77,172, 67, 70, 41, 51,212, 66,147,225, 62,180,195,146,121,152,117, 41, 82,145,153, + 39,123, 14, 56,116,186,118,163,136, 57,119,139, 91,231,181, 82,105,117, 56,211, 85,187, 59, 81, 50,174,154, 46,225, 86, 41,142, +178,236, 71, 96, 81, 44, 39,154, 15, 79,169,138,138,154,146,169,140,169,198,154,240,202,146,121, 8,214,156,123, 19,246,162,147, +184,219,245,181,214,173, 74,157,114, 91,212, 68, 94,177, 46, 9, 87,209,164, 82, 35,166,152,213, 40, 26,147,148,152, 53,249, 12, +182,135,161, 77, 92,118,163,188,212,150,221, 87, 43,171, 72, 10, 95, 41,212,194,248,217,224, 59, 96,239,203,211,110,184,157,163, +220,219,119,195,142,224,236,189, 90, 53,199,112,238,141,180,213, 54,131, 86,184,173, 90, 80,241,158,162,204,105,137, 44, 68,247, +146,216,120, 38, 83,136, 82,185, 95, 91,106, 14, 36,132,105, 42,177, 85, 95, 69,196, 84,180,235, 13, 45, 13, 59, 8,229, 63, 84, +100,153,228, 44,254,209,101,229, 8,180, 29, 45, 34, 57,120,102, 98,238, 84, 54,248,177,115, 46, 32,224,110, 24,171,225,142, 26, +226,122,217,198,119,199, 25, 21, 76,116,245,242, 71, 93, 93, 67,144, 67, 83, 72,217,122,208,154, 38,146,170, 74,254,122,137, 97, +203,171, 80,123,126, 86, 13, 50,114,230,134, 52, 43,104,160,110, 52,106,229, 82,239,218, 10,165,197, 42,143, 92,155,112, 63, 79, +182,109,170,172, 86, 42, 53, 42,212, 72,110,166, 83, 17, 83, 38, 18,137,166,133, 50,164,172, 60, 85,240,145,228,123, 92,248,153, +225, 90,117,139, 14,223,186,217,144,212,184,247, 13, 37,217,245,234, 50, 30, 68,154,188, 47,118, 5,245,153, 13, 36, 5, 84,225, +248, 64, 45,114, 16,133, 4,120, 5,183,210,145,135, 23,170, 17,120,166,246,122,210,239, 8,251,245, 73,221, 42,108,202,125, 54, + 85,110, 12,136,116, 25,110, 42,164,252,181,186,183, 36, 84,100, 71,157,200,243,176,212,251, 97, 40,154,128, 27, 80, 87, 42, 0, + 73,215, 28,248,248,246,138,238,223, 31, 27,209,100, 13,189,190,175, 61,174,217, 13,133,184,168,247,110,220, 46,215,168, 72,182, + 43, 50,175, 26, 23,136,134,174, 58,133, 66, 41, 14,213, 96, 61,144,143,113,148, 85, 17,198,121,155,117,149,165, 68, 30, 78,240, +151, 41,171,203,168,248,214,139,140,242,218,147, 61, 39, 46,146,154,176, 74, 94, 58,115, 70,238,237,110,102,210,194,237, 49, 74, +101,167,176,152,106,242, 71,253,233, 17,120, 7,226,111,137,188, 85,195,180,126, 29,112,252,188, 55,150, 71, 72,245, 89,147,103, +144, 54, 91, 11,230, 13, 18, 65,236,212,236,144, 84, 78,202,220,184,170, 37,144,199, 57,137, 21,156, 76,199,149, 3,245, 94,101, +153, 14, 91, 11,118,106, 60, 38, 42, 50, 98,248, 52,232,255, 0,224, 76,210,169,176,210, 23, 58, 67, 75, 75,170,196,215, 65, 90, + 66,200, 82,134, 70, 57,121,122,190,116, 74, 93, 58,224,113, 52,104,137,117, 22,180, 38, 41,236, 84,166,201,117,250,127,189,196, +138,202,165, 63, 77,135, 61,213, 5, 70,128,166,194, 12,199, 18,144,165,140,160, 16,130,179,166,155,101, 55,170,133,187,214,166, +214,220, 55, 67, 20, 74, 22,231,223,150, 76, 91,182, 85,181, 1,133, 66,160,215,231,197,159, 82,164,204,170, 90, 80,221, 39,244, + 42,118,154,185, 47,211,155, 89,114, 42,164,175,221,144,228, 84, 39,195,216, 74,124, 72,107, 67,204, 60,133,205, 66,221, 76,153, +140,248,200,105, 21,106,162,212,144,195,107,125, 39,244,116,228, 20,254,149, 32,124, 73, 74, 16, 82,160,149, 5, 73,200, 40,225, + 8, 33,133,138,157,182, 82, 3, 95, 73,181,137,216,116,212, 13,238,110, 49, 90,230,167, 55,225,188,207, 50,225,188,237,100,164, +205,114, 10,186,138,102, 10, 67, 66,181, 20,181, 15, 75, 52,145, 56, 33,102, 11, 36, 14,177,206, 9, 14, 84, 59, 29,188,174, 84, + 59,173,112, 93,143, 85,131, 21,160,229,114, 44, 58, 45,153, 66, 12, 7, 27,139, 74, 91,136,101,170,139,205, 35,148, 83,216, 89, +109, 47,175,160, 45,198, 97,150, 17,149, 40,129,153,191, 33,138, 45, 46, 76, 10,157, 73, 53,234,220,249, 45, 83,233,211, 28,109, + 44, 82,226, 34,114,131, 18, 43, 40,129, 31,153, 48, 97, 70, 47, 36,186,181,120,174, 58,242, 82,209, 95, 50,212, 18,208, 73, 83, + 80, 80,204,199,127,194, 85, 21,242, 79,187, 56,168,170,169,212,221,108, 50, 91,138,234,193,240,227,178,130, 24,101, 57,229,108, + 41, 75, 86, 74, 20, 9,139,172, 74,165, 58,245,126,172,220, 89,142, 26,131,177,226,196,130, 86,202, 30,125,154,122,189,198,155, + 17,167, 0, 8,166,198,149,239, 78, 60,238, 79,139,135, 31, 80, 75,139, 70,183,210, 72,208, 37,152, 14,131,107,157,246,216,129, +183, 77,134,221,141,183, 54,195, 12,185,100, 85,145,194,212,139,125, 68,121, 69,150, 73, 36, 70, 28,168,213,141,221, 80, 38,242, +239,121, 25,155,153,118, 55,137,194,174, 84, 41,148, 85,183, 64,162,120, 21, 9, 84,184, 49,145, 29, 46, 45, 79, 64,165, 64,110, + 50,132,154,165, 69,214,148, 82,194,220, 74,138,147, 28,101,231,150,232,192, 66, 9, 86,185, 17,237, 36,216, 24,156, 79,108, 45, + 91,106,157,145, 17,119,146,170, 52,251,163,110,235,115,214,150, 35,192,191,179, 38, 60, 55, 42, 47,160, 19, 2,219,168,211, 29, +118,157, 56,164, 20, 50,202,227,203, 3,158, 10, 73,232,220,233,143,193,167,180,203, 82, 67,210, 37,192,145, 88,170, 20, 52,150, +230, 54,253, 90,120,113, 41,119,149, 69, 38,115,235, 1, 12,182, 7,193, 25, 9, 82,185,130, 82,117,175,119,139, 85,218,217,157, +245,121, 66, 42,143,213, 32,176,154,170,185, 28,143, 69, 75, 2,115,178,106, 74,141,250,175, 22, 25,108,248, 12, 35, 8, 91,142, + 54,181,252, 5,122, 88,213,203, 28,145, 75, 78,229, 37,167, 97, 34,183,236,148, 33,148,223, 96, 69,197,183,176, 63,102,214,216, + 58,240,190, 68,114,250,243,152, 23, 19,199, 8,114,242, 72, 72,231, 22,188,108,205,176,101,137,213,157,138,160, 37,149,131,121, +245, 2, 96,171,183, 20,137,123, 31,191,149, 91, 47,123,232, 85, 27, 62, 93, 6,181, 34,220,190,237,155,214,132,186,220, 88,179, +217,150,220, 71,128,149, 75,125,138,149,169, 90, 75,203, 96,211,110, 42, 91,143,176,165,184,194,229,195,126, 59,201,121, 83,127, +216,175,102,198,192,241,189,192, 78,211, 93,151,173, 66,131, 11,121,110, 27,122,109, 78,202,226,103,134,152,244,170, 29,255, 0, +106, 75, 77, 80,127, 7,147,118,200,183,170, 81,169, 27,137,124, 65,102, 20, 38,171, 53, 4, 24,110,205,241, 18,226,164,123,227, + 13,202,211, 37,186,124, 33,108, 79, 16, 66,211,103,113,182,182,139,118, 84,173, 7,156,166,216,183, 99,192, 67,187, 32,202, 95, + 52,202,236,231,238, 88,201, 46,213,173,214,193, 83,203,133, 49, 50, 99,173,245,243, 52,203, 11,115,159, 93, 2,225, 42,126,233, +240,185,105, 84,108, 74, 45, 95,108, 43, 59, 35, 69, 97,250,141, 10,138,230,217, 90,251, 48,139, 9,233, 47,173, 83,167, 92, 23, +133,177, 85, 69, 46,182,212,244, 48,183, 86,228,216,112,223, 43,138, 95,241, 29,230,228, 19,170, 78, 41,201,115, 12,218,154,183, + 54,203,228, 66,244,207, 79, 57, 83,174, 48,118,211, 36,113,139, 51,236,182,144,200,197,209, 89, 4, 74, 66, 18,100,220, 71,196, + 25,253, 47,135,176,101, 60, 41,197, 99, 32,207,114, 92,228,102, 52,138,194,116,168,154, 25, 34,146, 41,169,214,165, 68,180,176, +199, 36,210, 6,122, 3, 28, 20,213, 45, 28,143, 83, 37, 84,238, 34,143, 74,120, 89,225,111,121,247,111,121,238, 89,155,225,184, +220, 82,237,142,251,112,146,253, 17,207,229,239, 14,200,188, 40,150,199, 16, 91, 53,100,203,106,223,161,219, 59,177,105,238, 28, + 8,141,191,184, 84,122,123,188,237, 86, 66, 93,102,187, 65,135, 61,155,146,157, 54, 68,117, 85,170, 29, 5,246,132,237, 76,171, + 94,215,181, 54,235,103,182,227, 99,237,219, 50,147,100,221,151,117,186,253, 38,155, 38,143,114, 90, 87, 4,106,212, 53,220,242, +118,242,194,180,160,179, 75,166, 81, 39, 84,235,112, 68,217,140, 61,226, 50,212,247, 22, 89,118, 35, 77,235, 83,184,202,246,199, +112,111, 70,219,122,181, 6,171,108, 65,226,231,125,105,213,122,204, 75, 11,108,236, 27,130,252,141,176,118,155, 98, 2, 33,193, +175,238,213,251, 13, 81, 98,223, 52,197,206, 75,206,187, 71,165, 38,170,196,168,241,155,138, 85, 9,111, 46, 98, 52, 47,111,189, +188,183, 37,209,109, 10,103, 17, 22, 2,110,109,194,146,227,138,131,118,219,246,163,116, 11, 98,132,235,103, 52,122, 75,118,253, +157, 38, 77, 80, 90, 17,210,101,178,248,116,206,118, 75, 83,212, 28,101,175, 1,149,162, 45,226,190, 70,185,231, 0,203,149,228, +121,123,231,153,198,105, 91, 28,230, 88, 16, 36,112,211, 70,154,212, 24, 39,149,165, 18, 74,198, 72, 89, 35,105,100, 12, 41,231, +158,112, 57,145,137,231, 10,100, 94, 51,241, 87, 23,112,111, 30,211,112, 52,153, 38, 73,225,242, 10, 90,124,155, 50,146, 42,116, + 99, 45, 52,112,243,178,218,153, 12, 21, 85, 52,171, 42,205, 88,212,181,201, 75,149,209, 37, 91, 81,100,148, 51, 81, 75, 49, 50, + 6,217,173,183,155,188, 84,118,173,158, 32,172,235, 87,118, 54,166,179,183,149,203,134,222,225,242, 30,215, 80,233, 54,151,241, +165,100,213,106,245,122,156,138,221,227, 2,160,150, 46, 42,164,235,130,161, 57, 86,251,132, 51, 77,169, 64,173,174,167, 38, 59, + 85, 4, 56, 26, 3,109,118,123,135, 41,252, 96,110,135, 23,245,109,254,221,189,165,168,219,173, 91,123, 97, 87,216,251,190,175, +183,219, 85, 99,219,212,155,126,209,183,217,137,183, 10,131, 66,169, 76,169,205,176,225, 70,165,194, 83,180,116,125, 88,219,175, +148,178,243,175,199, 75,173, 59, 29, 61,249,246,206,238, 94,228,237, 61,211,181,155,117, 97, 50,205, 62,247,110,151, 14,183,114, + 57, 71,149,102, 55,111,211, 40,145,161,125, 74,213, 25, 54,141,222,227,180,202,188,130,169, 82, 23, 30,151, 57,136, 16,218, 83, +108, 72, 50, 38, 25, 64,114, 67,110, 47,253,229,176,174, 10,205,199,103,238,253,237, 99, 85,238,119,154,122,231,157, 75,174,215, + 74,238, 7, 25, 46,152,207,214,220,157, 58, 73,170, 74,109, 18, 30, 75,110,190, 29,121,180, 44,165, 42, 9,232, 21,240,162,151, + 56,225, 46, 16,143, 36,205,178, 88,214,186,130,176,206,181, 50,212,206, 37,168,141, 97,228, 37, 63, 46, 9,201, 90, 37, 96,103, +142, 25,155, 74,243, 26,157, 97,150, 33,237, 83,203,114,127,162,199,141,220, 86,188, 75, 85,151,241,125, 31, 2,167, 23,193, 83, +150, 54, 91, 79, 78,166,152,101, 85,109, 75, 81, 85, 61, 59, 60, 98,150,158,166,174,122, 58, 72, 42,106,150,136,102, 51,123, 10, + 85,205,152, 73, 43, 44, 16,206,123,218, 61,196,127, 12, 59,235,177, 53, 46, 29,169, 86,189, 55,136,234,109,215, 88,166, 26,197, + 38, 53,233,116,109,198,223, 91,198,222, 80,171,209,234,119, 5,221, 67,164, 25,151, 10, 5, 85,136, 33,154, 93, 49, 37, 18, 15, +233,100,202, 97,150,139,131,132,251, 87,179,251, 79,179,194,224,147,101,216,244,202, 5, 90,229,159, 17,119,149,211, 72,110, 69, + 46,248,110,163, 29,217, 43,129, 66,171, 79,122,116,167, 35, 90, 76, 72,147, 37,216,236, 37,215, 98,203,117,126,245, 45, 50,100, +114,186,222,133,219, 60, 77,113, 16,220,102, 29,123,136, 11,214,170, 86,194,217,230,148,229, 46, 98, 20,211,128,115, 50,125,254, +146,190,100,228,116,200, 4, 30,163, 7,187,151, 72,226,234,249,165, 72,105,119,173, 54,145,119,199, 91,105,138, 42,209,169,240, +173,203,214, 44,100,188,211,178, 16,205,110,152,208,135,112, 48,176,215,197, 10,171, 13,109,124, 69,109,200, 97, 95, 24,214,226, +126, 46,204,248,131, 53,169,253, 34,207, 26, 53,144, 71, 4, 79, 21, 56, 17,133, 22,229,150,231, 57, 26, 1, 47, 34,187, 2, 44, + 52,198,170,139, 50,202,126,130,126, 47,120,111,192,109,194,252, 57,154,229,220, 65,148, 9,205,116,180,137,154,214, 10,186,170, +162, 10,137,109, 91, 69, 71,150,198,235, 25, 10, 22, 25,169,163,100, 69,105,125,166,116, 70,126,237,240,173,188,242,233, 18,100, +237, 93,235, 42, 60,202,109,114, 92,138,190,220,221,209,196,104,148,181, 76, 74, 16,170,157,149, 92,105,110,132,210, 43,242, 74, + 19, 42,158,164,115,198,158,234, 36, 48,143, 6, 66,144,210,247,177, 85,202,124, 85, 41, 50, 23,238,234, 96,171,220, 84,131,201, + 81,167,186,242, 66,220,103,194,112,116,136,167, 49,204,218,135, 38,114,149, 36,142, 82,142, 24,109,205,249,100,111,109,188,154, +141,169, 87,121,132, 69,149, 25,154,133, 12, 70,102, 35,244,170,162,202,228,211,227,215,160,171,156, 70, 90,220,109,197,198,112, + 60, 25,150,134, 86, 98, 60,242,193, 74, 54, 70, 21,203,185,137, 49, 41,209, 55, 38,242,181,228,211, 26, 17,157,129, 46,114, 42, +180,121, 76,135,128,240,207,214,112,156,148,134, 86, 18, 75, 79, 49, 33, 50,163,165,120,248,146, 57, 73,105,106,159,147, 26, 7, + 37, 20,121, 74,249,129, 29,199, 81,176, 38,192,147,176,176, 11,229, 39, 28,113,196, 92, 57, 81,148,103, 21,249,110,121, 69, 46, + 69,155, 81,200,201, 87, 73, 60,114, 67, 44, 19, 46,155,235,139, 65,117, 46,165, 73, 11, 30,131,175, 80,250,185, 64,199, 74,170, +247,117,187,111, 83,215, 94,171,203,137, 65,135, 79, 67,143,174,161,207, 41, 13, 62,140, 15, 16, 83, 24,105,167, 37, 84, 28, 81, + 82,130,227, 69,105,245, 45, 71, 41, 66,191, 91, 76,133, 87,124,171,187,130, 29,167,217, 76,213,237,251,106, 66,189,205,119,162, + 28, 98, 37,199, 86,142, 16,162,185, 54,235, 12, 41,106,181,161,242, 45, 99,199,119,154,162, 48, 80, 81, 16,158,154,182,205, 62, +117, 86,178,221, 66,238,151, 81,166,214,156, 82,227, 66,168, 73,171, 77,171,198,152, 82,188,180,236, 27,145,222, 95,115, 36,148, +242, 70, 81,136,160, 29, 56, 67,138, 29, 54, 42,202,179,153,139, 37,154,143, 44,138, 93, 90,115, 13,179, 42, 84, 55, 84,228, 58, +130,154, 32,177, 34,167, 76,116,248, 83,164,158, 85, 21, 58, 66, 29,194,202, 84,242,134, 53,191, 74, 37,168,148, 34, 92,139,239, +126,187,219,125,133,150,228,146, 47, 98, 55,179, 1,136, 86,103, 62, 91, 69, 8, 36,153,106, 8, 60,182,111, 58, 40,216,157, 54, + 98, 36, 0,234,243,171, 58, 3,101,229,106,179, 43,139,104, 91, 70, 44,120,176,217, 45, 59, 21,146,164, 50,232, 71, 43,133,111, +117, 90,230,100,144,252,149, 40,149, 41,210, 74,150,181, 21, 44,149,171, 39, 97,160,209,196, 74, 98,138,211,204, 1,101, 39, 41, +232,160, 84, 80, 91, 86,122, 5,117,207,217,171, 93,167, 74,230,109,190,118,227,151, 50, 18, 67, 73, 80,101,207,212, 10, 45,182, +190,169, 65, 32, 16, 14, 72, 61, 50,113,157, 59,206,211,128,167,184,215,134, 84,218,139, 67, 9,202,136, 9, 81,207,134, 79,235, + 28, 17,243,252,113,169,165, 53, 56,166, 68,176, 35, 72, 23,245, 29, 5,183,191, 78,155,254, 24,174,234,171, 13, 76,138,146,157, +228,111, 49,216, 94,228,111,219,173,201, 22,181,250,250,130,207, 61, 76, 83, 78,129,201,136,206, 30,102,214, 63,241, 74, 61,219, + 81,242, 79, 81,141, 92, 33, 83, 11, 11, 43, 74, 70, 79,235,128, 48,146,159, 95,183, 89,187, 48, 16,248,113,190, 78,100,130, 82, +160,176, 65, 32, 28, 5, 99,215,168,252, 53, 65,216,162, 34,146,199,235, 39, 31, 2,200,193,233,215,144,231, 79, 81,206,164,117, +233,252,125,253,240,213, 89,206, 82,241,176,243, 14,190,132,117, 7,227,110,189,143, 94,183,197,134,155, 9, 14, 77, 73, 35,160, +115, 31,105,236,123,140,118,214,207,217,208, 91, 67, 45, 2, 19,212, 36, 12, 14,163,212,156,142,135,247,233,135,163, 69, 10,155, +158, 95,135,196,200, 0,103, 57,200,252,115,173,138,183, 84,150, 18,214, 79, 47, 42, 82, 64,200,200,192, 25, 63, 34, 51,173,102, +107,129,181,255, 0,158, 33, 53,234,201, 4,224,108,194,246,251,207,207,175,124, 57,232,109,180, 51,202, 72,248,130,113,142,248, + 78, 0, 31, 35,235,246,233,191,188, 42,206, 66,108,193,167,132,253,103, 41,181, 0, 71,255, 0, 2,140,174,134, 73, 35,245, 92, + 39, 33, 30,121,235,229,171,141, 90,228,106, 11, 32, 52, 80,236,183, 73, 12, 70, 4,229, 74, 7, 30, 43,152, 63, 3, 41, 29, 84, +123, 28,224,100,235, 5, 13,173,197, 57, 46, 67,138,125,249, 46,120,146, 95, 88,253,117,156, 97, 40, 39,245, 91, 0,225, 35,176, + 29,180,142,179, 80,220,168,205,149,126,211, 15,223,164, 16,122,250,158,195,208,145,134,108,155, 45,116,149,107,106,210,241, 41, +186,161,255, 0,120,194,221, 71,236, 47,127,218, 35, 79, 77, 86,176, 66,163, 8,205,225,197, 43, 56, 37,105, 65, 56, 36,252, 75, + 82,212,174,171,112,149, 28,156,245,207, 93, 15, 45,216,241, 57,146, 57, 27, 56,200, 72,192, 89, 78, 15, 85,168,159,128, 99, 39, +226, 63, 33,223, 89, 20,167,114,130, 10,130, 80, 72,248, 26, 31, 30, 65, 0, 16,165, 3,208,231,174, 61, 61, 53,129,212,188, 52, + 7, 20, 82,214, 78, 74,148,226,186,164,228, 18, 84,181,103, 36,244,238,122, 30,157, 53,185, 26, 44,106,170,160, 1,238,236, 54, +253,214,249,247,206,169,100,122,153, 25,234, 36,251, 71,160,233,212,122,216,124,236,119,197,146,116,196, 43,156, 23, 20,234,176, + 66, 83, 24, 44, 50, 18, 79, 66,235,132,167,159, 61, 50, 50, 18, 9,206, 15, 83,172, 58,116,165, 37, 64, 4,182,218, 73,199, 59, +139, 10, 82, 73, 66,186, 33, 13, 30, 94, 96,174,108,228,231,168,198,123,139,140,202,131, 79, 30, 70,148,227,238, 33, 74, 65,102, + 43, 97,196, 54,147,211,226, 81, 41, 74,129, 0,103,226, 56,236, 70, 51,172, 78,114,228,243, 5, 43,193,100,115,243, 36,120,134, + 75,201,194,128, 42, 71, 54, 17,204, 60,206, 74,114,122, 18,116,112,214,210, 59,223,241,219,240,190,226,251,116,251,158,201,176, + 10, 23, 73, 61,143, 95,141,182, 61, 58, 16,167,226,118,197, 23,220, 24, 42, 82,202,147,250, 50,234,130,146,217, 45, 36,168,133, + 45, 94, 71,175,197,215,174, 49,223,174,177,233, 50,208, 66,131,105, 61,214, 66, 64, 78,114, 64, 32,244, 61, 27, 42, 36,100, 30, + 80, 0, 29,250,232,185,104, 66, 49, 33,199, 21,150,220, 43, 66,158, 90,158, 9, 94, 72,229, 74, 84,180,165, 36,173, 63,234,146, +156,146, 6,173,114, 20, 80,180,165, 72, 80,112, 20,145,206,164, 41, 92,139, 1, 96,182,144,172, 56,130, 20, 14, 50, 0, 39, 56, +233,141, 46,141, 98, 54,244,254, 95, 29,247,198,133, 76, 90,206,166, 58,175,233,178,237, 97,238,254, 93,189,215,178,204, 42, 33, + 93, 64, 42,248,136, 81, 57,235,147,209, 95,205, 61, 51,156,117,229,239,140,107, 16,158, 7, 42,147,206, 74,138, 85,241,171,148, + 17,140, 96,145,216, 96, 12,125,253, 6,178,233, 89, 1, 42, 89, 0,224,140, 40, 16,146,179,204,164, 55,201,216, 60,158,153, 29, +114, 59,100,118,197,106, 10,207, 40, 35,170, 73,230, 36,114,149,103,155,161, 9, 87, 86,241,147,231,213, 88,193, 58, 92, 49,218, +223,135,110,159,187,221,238,253,216,103,145, 0, 34,219,123,186,124,143,147,136, 13,251,114,237,134,237,143,105, 46,242, 73, 13, + 22,133,233,109,109,125,248,227,197, 1, 40,126, 69,118,199,166,197,148,182,249, 0,241, 0,122,146,174,101, 31,136,168,158, 98, + 78,117,200,194,180,168,126,137,101, 88,239,233,246,107,183,127, 72, 24,180,175,104, 99,158, 27,161,215, 19,195,254,205, 37,246, +129,255, 0, 34,180,195,184,124, 52,148, 17,150,202,152, 45,175,169,201, 11, 7, 0, 99, 92, 70, 83,105,199, 81,140,246,229,242, +249, 29, 75,178,155,181, 13, 41, 59,217,109,211,176, 36,116,235,219,242,199, 51,241, 50, 44,124, 69,158, 34,159, 47,181,212, 31, +255, 0,116,172,199,247, 18,113, 76,168, 40,116, 72, 29, 62, 47, 63,188,117,208,235, 35, 24,207, 92,244,254,221, 86, 40, 35, 62, +152,207, 95,232,251,116, 51,133, 67,168, 78, 71, 81,243,251,244,236, 6,194,221, 48,206,160, 29,173,211,161,253,216,162,179,229, +143,191,211,175,217,170, 11, 0,227,176,245,245,199,175,207,160, 58,244,188,254,177,201, 82,124,188,177,231,246, 29, 81, 39, 39, + 58, 93, 70,194,221, 63,158, 20, 24,164,230, 60,136,232, 72,244, 39,183,109, 12,178, 9, 61,242, 59,122, 30,223,214,116, 74,241, +130, 73, 3, 7,167,246,245,213,189,240,234,136,240,212,148, 97, 95, 22, 70, 74,128,236, 58,249,233, 68,235,140, 3,126,155,227, +193, 36,156,254,113,165,175, 10, 63,237, 99,238,206,116,180,125, 62,182,191,207,191, 25,199,180,146, 15, 65,159,151,174,171,165, + 93,142, 58,142,227, 61, 70,135, 31,120,254,145,251,117, 92, 96,245, 30,127, 46,250, 37,188,191, 15,195,231,231,124, 12, 86,241, + 19,156,117,235,231,142,159,126,136,111, 10,193, 74,187, 28, 99, 24,201, 62,191,136,252, 53, 65, 9, 0,131,220,244,251, 58,232, +164,225, 61,178, 7, 94,221,254,236,246,210, 76, 24,139,124,252,223, 25,219,239,197, 69,160,168,119,233,221, 93, 78, 6, 49,216, +125,186, 33,164,115, 36, 40,247, 29, 66, 71,160,233,235,170, 64,133, 15,207,113,215, 69, 36,242,224,244,244, 35,208,105, 34, 0, + 39,190, 49,143,104,101, 42,238, 57, 85,215,168,198, 72,251,188,244,123,104, 72, 72, 24,201, 79, 78,191,187,166,132, 65, 39,226, + 72, 25,244, 39,167,152,251,180, 90, 22,144, 1, 87,195,147,231,252,236,250,124,244,153, 23,216,158,159,233,140, 17,124, 28,214, + 58,114,244, 24, 61, 62, 93,191,167, 70, 32, 12,103, 39,230, 60,137,199, 94,154, 13,178, 23,215,168, 29,253, 59, 99,250,245, 93, + 11, 73, 95, 47,114, 62,127,102,127,103,150,147,194, 39,221,190, 13,108,129,145,140,228, 16,160, 70, 82,164,158,133, 36,121,130, + 9,200,212,133,253,149, 30,214, 40,187, 66,197,191,195, 39, 20,245,169, 15,236,235,143,162, 14,220,110,140,213,189, 54,163,181, +211,100,184, 17, 30,135,114, 58,162,165,203,177,148,226,240,211,164,149, 65,206, 21,150, 70, 83, 30,118,242, 14,122,121,126,206, +218, 33, 39, 37, 68,227,168,229, 32,128, 82, 65,232, 65, 7,184, 56,237,231,157, 55,102, 89,109, 54,103, 78,208, 84, 37,251,171, + 11,106, 86,236, 71,240, 32,236, 71, 81,211, 14,249, 22,123,153,112,230, 99, 22,103,149,205,202,158, 63, 43, 43, 92,199, 44,100, +130,209, 74,160,141, 72,214, 29,195, 41, 1,144,171, 0, 71,233,189, 78,163,199,149, 6, 5,118,137, 50,159, 88,161, 86, 97,179, + 50,145,112,209,228,179, 81,164,214, 32,202, 66, 93,106,101, 62,161, 25, 74,109,214,150,210,146, 82, 66,186,115,105,198,165,210, +220, 45, 54,156, 0,210, 18,130, 16,156,144,132,160,130,113,234,163,215, 63,102,191, 63,142, 13, 61,168,188, 90,112, 88, 35, 91, +187,121,119,179,119,109,106,165, 54,185,123, 83,184, 1,218,213,172,195, 74,112, 25, 31,193,231,222,112,191,110, 58,164, 21,224, + 48,176,215, 49, 7,195,198,117, 59, 45,161,226,130,149,124,109,157,131,126, 59,105, 34, 25,190,109, 42, 53,196,184,241, 30, 15, +198,138,237, 78, 35, 82, 31,140,211,167,245,219, 66,220, 41, 7,190, 19,170,167, 56,203,165,200,101,140, 85,149,104,230,213,203, +101,189,155, 78,155,220,117, 82, 3, 46,198,227,123, 43,181,137,199, 98,248,121,226, 4, 60,107, 28,144, 81,211, 52, 25,134, 94, +168,243,195, 33, 13,165, 88,233, 15, 20,151, 2, 68,212, 8, 23, 84,117,184,212,128, 27,157,174,166,211,138,218,110, 68,166,202, + 12,226,136,177,129,232,166,216, 72,248,148, 83,159,213, 41, 3, 58,199,247,101,136,115, 44,202,189,191, 58, 53, 62,165, 75,147, + 13,232,255, 0, 85, 84,225, 70,168,193,124, 22,212, 1, 92, 57,109,173, 42, 25,207, 92,107, 7, 94,247, 82,222, 44,120, 49, 37, + 54,166,153, 62, 27, 97,162,180,183,147,212, 19,228,122,244,251, 53,166, 60, 82,241,139, 69,219,203, 98, 69, 54,140,180, 86,247, + 30,234,150,139, 66,201,183, 25,149, 29,233,234,185, 42,196, 70,134,169,113,219, 89,247, 70,154, 91,161,107, 46,114,242,132,100, +244,206,153,205, 97,168, 2,158, 4, 44,100,219,125,135, 64, 78,228,219,222, 73,244,222,221,174, 76,131, 35,204,179,124,218,130, +135, 45,164, 51, 85,202,227, 76,106, 62,206,255, 0,109,219,126, 90, 70,190,103,145,136, 84, 93, 78, 72, 23,191, 48,247,123,113, + 54,107, 98,106,146,105, 9,180, 41, 21,123,162,141, 80,151, 62,153,110, 91,228, 81,105,212,218,178,156,241, 34, 77,169, 72,130, +226, 75, 2, 57,229, 90, 91, 71, 95, 19, 25, 61, 49,174,102,239,183, 16, 27,245,196,245, 64, 82,110,171,182,181, 46,217, 96, 6, + 35,218,212,137, 51, 32,219,108,198,105, 92,201, 85, 69,199, 30, 6,166,164,128, 10,220,112,144, 72,251, 53,214,202, 31,178,178, +163,118, 58,154,214,227,110,196,250,141,229, 94, 90,234,215, 82,232,240, 89,168, 70,166, 84,170, 4,190,168, 41,121,249, 0, 76, + 90, 29,119,151, 56, 9,248, 73, 25,214,146,202,219, 91, 51,104,184,161,111,104, 55, 2,101, 83,114, 54,198,194,191,169, 77,110, + 68,221,177,164, 63, 85,175,214,237, 88,241,211, 82,147, 76,141, 78,128, 22, 91, 87,142,150, 98,205, 74, 85,132,248,171,248,142, + 53,173,150, 83, 84, 83,203, 81, 44,142,139,160, 27, 2,160,233, 3,114,117, 16, 12,141,127, 70, 80, 9, 35,125,241,233,239,130, + 41,224, 38,103, 13,117, 54, 67,153,205,226, 87, 28,112,190, 95, 45,125, 92,210, 83, 86,187,242,226, 42,178,174, 80,149,113,165, + 44, 65,229,100,134, 4,141,150,122,141, 81, 51, 73,162,237, 30,168,196,225,210,109,131,180,183,158,251, 93,182,173, 90, 77,131, + 96, 89,181, 75,242,173, 86, 98, 49,102, 9,183, 41, 18, 99, 82,213, 61,169,147, 28,108, 26,115,213,233,208, 41,241,139, 73, 89, +155, 50, 88, 98, 57, 82,144,225, 71, 44,173,110, 47,174,107,174,254, 98, 13, 58,249, 85, 6,131, 87,171, 39,220, 44,241,181,244, +153,180,166, 32, 5,149,154,122, 42,162,227, 19, 75,165,128, 71,188, 56,178,174,115,204, 82,145,128, 36, 3,237,235,223,234,222, +215,112, 55,182,219, 31, 86, 98, 61,181,187,220,112, 95,208,183,126,253,180, 97, 54,220, 21,109,191, 13,155, 89, 33,113, 54, 95, +106,218,165, 50, 18, 40,148,150,231,154,107,198, 55, 42, 67,242, 41,179, 93,113, 42,113, 74, 86,162, 97,177, 48,209, 39,113,161, + 58, 64, 13,211,225, 75,148, 51,140, 36,165,190, 84,143,159, 65,171, 75,135,178,168,107,242, 90,172,214,180, 51, 59,234, 16,134, + 17,190,133, 64, 20, 55,158, 54, 2, 70,146,225,136, 0,174,157, 43, 97,185,243, 63,233, 63,244,231,241, 66,159,196,102,225, 15, + 14, 51, 37,224,188,143,132, 9,142,161,114,156,207, 55,165,122,154,211,180,201, 83, 95,148,230, 89,116,181,212,212,192, 8,224, + 5,150, 25,142,186,190, 84,124,245,138, 25,117,109,141,230,157,201,225, 47, 99,174,184,147, 81, 37,251, 42,185,185, 27,109,239, +116,234,109, 66,219,122, 4,155, 82,247,170, 85, 97,120, 77, 63, 82,121,198, 42, 45, 83,110,106, 65,247,182, 36,165, 14,184,226, +150,194, 25, 9,113, 3,110,182,151,139,125,212,183,132,104, 23,139,113, 55, 18,137, 24, 33, 42,171,202,150,138, 77,231, 10, 58, + 80,148, 41,215,106,105,101,113,238, 23, 2, 0,109, 6, 99, 41,127,224, 0,190, 84,115,174, 89,251, 50,110,182,111,109,161,226, + 3,101, 36, 58,211,149,138, 21, 94,218,222,203, 78, 35,202, 81, 46, 82,231,199, 69,129,126,193,167,180, 63, 93,214,103,194,179, +170, 50, 48, 15, 42,103, 21,168, 17,147,174,130,217,182, 49, 51,154, 91,177,188,102,144,164, 58, 35,144,191,242,169, 25, 99,159, +148,124, 72, 7,226,207, 80, 49,207,131,216, 83, 92, 69, 69, 29, 6, 99, 95, 73, 34,235, 8,250,148,236, 9, 14, 17,197,138,133, + 2,215,210,116,217,110,164, 91, 97,105,119,134, 62, 33,208,248,151,225,118, 89,196, 28, 81, 28, 85,249,213, 91,213,189, 89, 99, + 36,143,237,143, 83, 41,169,117,146, 89,165,169, 6,105,139, 75,170, 73,228,145,245,134,150, 73, 9, 44,122, 97,110,111,221,149, +120, 67,165,189, 58,161, 34,214,201,105,134,233, 55,148, 69, 83, 11, 50,221, 90, 92, 68, 40,213, 72,110,200,135, 46, 73, 41,108, +171, 14,167,245, 84,130, 65,200,211,166, 94,171, 84,102, 51, 47,194,143, 89,131, 9, 5,184,240,105, 85, 40,147,218, 74,222, 40, + 89, 97,227, 2, 67,137, 97, 78,252, 5,254,110, 85,114,132, 39, 9, 72, 32,233, 93, 14,201,122, 65,143, 22,156,212, 69, 86,100, + 46, 44,135, 38, 57,135, 33,219,180,231, 22,234, 83, 60,161,192, 10,170,170, 8,144, 33,178, 71,233, 29, 30,242,191,208,181,133, +191,182,125,129, 22,137, 24,184,219, 16,105,244,122,116,229, 24,172,196,140,227, 51,106, 82, 37,172, 0, 92,153,226, 37,249,213, + 57, 83, 22,165, 18,225, 82,222,113, 69, 74, 9, 71,234, 68, 9,208,198,209, 94,219,218,228, 15, 83,112, 65,184, 62,227,110,189, +109,178,169, 62, 83, 5,218,149,249, 37,181, 42,198, 87, 89, 80,199,253,217, 86, 70, 70, 98,204, 20,146, 89,197,201,101, 22,230, + 59,242, 41,215, 69, 77, 73,128,236, 67, 18, 58,167,154,138,231, 60, 4,102,158,150, 80, 82,130,218,157,115, 45,198,101,174, 84, +165, 1, 68,114, 52,130,156, 99, 89, 45, 34,212,134,228, 73, 16,146,227,205,181, 1,201, 78, 77,171, 38, 42,218,143,227,144, 4, +201, 12,201,115, 36, 71, 12, 32,165, 43, 3,226,248,212,144, 10,146, 53,126,180,172,233, 73,154,154,212,168,202, 93,197, 80, 97, +136,104,140,211,242,100,192,162,196,109,194,166, 41,208,221,148,163,201,135, 23,227, 62,232, 78, 95,127, 36, 0,218, 27, 1,238, +160, 90,138,170,136,112, 34,196,122,116, 24,179, 26, 97,224,201, 66,151, 91,158, 22,121, 26, 8,112, 2,184,136,155,133, 28, 30, + 89, 15, 32, 1,204,132,117,220,138, 25,100, 69,141, 33, 42, 95,185,185, 36,108, 64,216, 41, 3,125, 76,119, 96, 54,234,214, 58, + 53,249,220, 11, 78,232,142,144,194,128, 23,101, 1, 6,175,214, 62,103,112,219,249, 82,197, 84,238,108, 17,110, 52,139,118, 47, + 29,184,225,215,110, 42,187,173,184,204,207, 72, 80, 85,167,183,182, 36, 9,173, 70,184,111,106,192, 66,170,116,219,106,146,227, +200, 80,164, 50,235, 10, 77, 66,191, 84,117, 10,106,153, 79,228, 73,241, 36,174, 36,119,184, 21,190, 59,243,185,156, 69, 84,159, +170,238, 77,125,233,212, 64,224,114,153, 96, 80,157,149, 74,219, 91,113,168,200, 9,139, 79,161,218,173,191,225,204,247,118,130, + 18,103,207, 18,106, 18, 92, 10,125,231,194,214, 80,151,139,218, 61,196, 11, 91,199,196,197,237, 22,149, 81, 84,157,189,217,229, +191,180,182, 2, 88, 11, 17,100, 68,160,212, 84,221,239,112,178,210, 9,241,102,214,111,225, 52,151, 48, 84,168,148,168, 76,161, + 74,109,180,160,115,231,137,235,103,118, 56,127,147,104,217, 55,156,251,107,111,175,235,178,220,141,117, 86,109, 75,154,123,113, +238, 29,183,163, 87, 2, 87,106,211,239, 74, 50,150,145, 64,189,234,148,231, 29,158,154, 36,149,174,165, 75,167,166, 52,138,188, + 24,138,159, 21,133,236, 83,112,252,185,180,169, 8,169, 20,176,234, 0, 18, 88, 7,176, 39, 89,211,114,119, 4, 70,189, 44,161, +148, 22,190,159, 75,188, 43,225,207, 12,190,140,158, 22,229, 62, 49,120,177, 11,207,199,124, 79, 74, 43, 96,166,138,138, 92,199, + 54,166,167,120, 99,153, 50,252,166,134, 37,121,162,150, 40, 36,137,243,154,231,228, 65, 75, 44,172,185,141,117, 61, 12, 49,202, + 64,184,109,119,103,132,181, 74,129, 79,134,194,135, 43,190,237, 21,191, 29,100, 96, 37, 40,117, 73, 82, 99, 35, 32,124, 88, 42, + 63,170, 53,226,221,219, 54,154,144,210,159,144,184,110,188,191, 9,111, 50,130,176,158,110, 80, 84,251,171,202,128, 1, 93, 73, +229, 25, 56, 37, 0,140,233,155,215,238,236,178, 81,245, 6,230,196,184, 38, 72,117,114,146,204, 10,157, 18,124,222, 68, 55,238, +229, 13,192, 85, 62, 51,171,139,134,207, 35, 41,140,233,231,202,146,147,144,117, 96,166,239,230,251, 91, 78,170, 52,187,154,100, +238, 69,175,198,143, 95,161, 83,106, 18,154,101, 79,165,231,152,117,164, 67,133, 45,134,212, 82, 91,194,156, 5, 45, 44,164, 2, + 66, 84,155, 34,147,133,243, 36,165, 20,116,217,188, 35,151,238,126, 97, 4,254,177,125, 68,239,211, 82,223,173,172, 0, 24,167, +179, 47,246,170,125, 30,232,243,104, 31,139,124, 24,227,142, 30,161,169,102,142,147, 50,172,203, 50,121, 41,229, 42, 69,218, 3, + 30,118,241,202, 0,243,200, 41, 94,165,129, 22, 42, 88,227,163,116,203, 17, 8,185, 93,183,106,208,252, 38,221, 75,239, 69, 82, +148,212, 98,226, 86,217,118, 44,165,167, 9, 65,101,223, 60,148,144,181, 96,168, 43, 0,252,174, 91,214,181,183, 10,117, 86,179, + 50,153, 73,166, 83,194,214,252,233, 83,209, 26, 43, 44,162, 64,140,219,206, 58,234,210,112,235,191, 11, 64,100, 44,244, 4,168, +145,172,123, 98,119,186,189,184,148,118,141, 70,148,197, 50,191,111,207, 66,201,167,161,249, 52,249,241, 42,212,229, 7,204, 15, +126, 66, 92,110, 3,140,161, 73,118, 19,202, 81, 97,108,148,161,199, 27, 91, 78,107, 86,119,238,216,221, 43,230,252,250,182, 13, + 58,183, 46,147, 70, 13, 38, 4, 56,116,185,179,162, 69, 46,180,223,141, 81,142,184,140, 41,147, 41,114, 84,242, 75,171, 82, 84, +194, 91, 72,230, 64, 90,214,181, 33,200,201,170, 43, 89, 94,208, 24,128, 15,166, 66, 20,216, 3,112,111, 96, 88,110, 78,159,118, +155,220, 99,160, 60, 98,250, 99,112,207,134,255, 0, 71, 46, 29,250, 64,120, 83,195, 50,248,169,148,241,245, 69, 30, 93,144,193, + 67, 79, 83, 28, 82,215, 85,189,122,153,115, 32,105,154,178,134, 26,105,168,101,163,146,156,211,189, 75,102,130, 44,173, 68,114, + 77,207, 71,110, 15, 18, 59, 61, 18,251,183, 45,234,180,107,233,187, 1,250,171, 17,238,235,214,213,164, 83,170,247, 53, 22,146, +247, 59,114, 43, 22,149,141, 85,159, 17,119,100,134, 63, 68,234,163,187, 34, 18,164, 53,206,152,138,117,244,161,183, 58,193, 87, +225, 15,135,235,154,206,165, 93,187, 71,198, 37,215,186, 16,174, 74, 84,106,197,183,252, 7,217, 27,135,115, 66,233,111,133,248, + 82,110, 88, 27,108,185, 18, 44, 98,226,138,217, 76, 74,176, 98,168,211,208, 31, 14, 67,113, 0, 40,199,138, 77, 58,219,219, 50, +244,105,201,133,114, 94, 12, 56,227, 82,225, 41,246,106, 20,107,126, 74, 1, 10, 21,105,145, 29, 83, 87, 29,105,183,135, 90, 99, + 14, 24,108,168,230,161, 33,210,145, 21,121,134,197,241,157,196,167, 13,119,204,187,239,101,247, 94,228,180,103, 85, 93, 74,238, +122, 27,239, 11,130,196,190, 89, 74, 3, 65,139,247,111,234,106, 52,187,152, 37,129,200,203,193,152,211, 98, 54, 3,112,101,197, +108, 4,133,235, 56, 58, 10,228, 87,202, 71,178,152,134,242, 75,119, 19, 27,222,225, 88,150, 31,254, 96, 54, 34,214,141,213,129, + 30, 77, 63,251, 74,190,146, 28, 63,196,245, 21, 94, 41,241, 81, 90,138,137,238,120,103,135,232,114, 90, 51,145,166,250,161,204, + 42,243, 28,191, 56,115, 80,172, 17, 36,201,106, 30,171, 49,165, 99, 58,215,215,101, 85,180,199, 46,155,165, 84,250,206,231,112, +167,186, 84,202,229, 58, 84, 41,147,169,133,248,238,197,175, 91,119, 93, 18,221,187,232,146, 84,224,168,218,183,125,171,122, 80, +169,146, 69, 62, 91, 77,165,197, 50,182,199,186,202, 90, 37,197,125,153, 76,161,221, 73, 67,102,161,181,186, 27, 75, 97,238,133, +149, 75,174, 53,111,223, 86,211, 87,109, 54,213,185, 35, 77,146,237, 17,137, 14,200,167, 84,169, 77, 86, 23, 24,190,212,104, 85, + 56,114,217, 98, 72, 75,241,159,101,166,228, 0, 16,240, 9,226,206,213,123,125,246,154,253,183, 26,179,248,203,225,125,202,139, + 46,178,168,179,235,251,104,229, 22,255, 0,179,166, 52, 82,164, 41,247,246,211,115,158,110,161, 69,150,180,149,143, 14,155, 84, +150,134,210,172, 54,180,249,236,206,213,123, 69, 61,143,214,236,216, 85,123,123,115, 55,238,195,166,195,122, 53,197, 19,108, 46, + 26, 79, 16, 44,236,253, 26,226,128,250,223,131, 85,141,183, 84,234,188,232,106,173,199, 90,212, 89,142,137, 15, 83, 81,144,125, +209,101, 40,228,141, 47, 10,102,180,149, 86,154,156, 24, 92, 29,108,129,135,154,226,204, 2, 44,137,115,111, 54,226,254, 93,182, + 24,147,120,185,244,188,240,119,233, 7,195,249, 54,103, 93, 17,224,159, 17,114, 33,203,106,209, 45, 37, 92,121,173, 8, 71, 34, +150,170, 58,150,200,101,166,150, 41,220, 61, 44,139, 5, 76,112,171,213, 71, 20,136, 39, 4,118, 6, 29,186,134,194, 27,148,195, +193, 62, 44, 68,187, 21,106,102, 84, 30, 70, 85,205,142, 80,158, 87,201, 81, 7,153,192, 0,192, 80, 64,211,149, 66,165,180,203, +136, 67,104,240, 27, 90,130,130, 17,226, 37,166,148,162, 1, 67, 73, 94, 66, 83,252,227,140, 39, 39,160,215, 35, 46,223,110, 95, +179,178,219,105,233,244,219,195,120, 47,233,139, 89,112, 67,182,118,102,191, 77,247,149, 21,115, 41,196,213,175, 41,244,200,241, + 80, 85,142,139,201,194,137, 9,207, 77,115,159,136,255, 0,164,222,229,137, 30,163, 15,134,190, 13,228, 85,153, 9, 87,213, 91, +165,191, 87,204,167, 45, 40,174, 45, 76,182,204,169, 86, 14,216,198,101,228,255, 0,133,202,109,178,212,219,137,132, 41,194,148, +158, 96,180,131, 37,202,248,118,182, 90,133,138, 42,118,185,221,117,133, 75,133, 32, 29,216,168,185,189,236, 14,163,109,129, 0, +219,143,243, 63, 16,184, 90,150, 55,105,115,232, 42,165, 31,169, 77, 42,212,177, 32, 14,130, 18,226,224, 0, 53, 57, 0,216,238, + 55,196,195, 45, 68, 22,211,205,146,176,133, 54,151, 20,132, 15,133,229,231,144, 40,224, 37, 5, 65, 39,151,155,148, 18,158,152, +235,167, 48, 77, 75,205,166, 35, 10,241, 36,158, 64,164, 52, 60, 79, 9, 9,207, 48, 83,160,114,149,103,148, 96,103,182, 73,215, +230, 7, 43,219,203,237, 79,157,190,246,230,253, 61,196,180,212, 75,181, 94,156,213, 51,101,233,182,221, 22,223,225,210, 69, 2, +168,227, 11,169,218,181,125,167,162,176,212,122,212, 25, 8,142,218,126,176,154,244,170,211, 68, 7, 88,168,182,234, 82,177,213, +203,167,233, 12,113,211,199,133,235,182,188, 54,240, 99,176,227,101,238,251,254, 37, 46,135, 81,183,246,214,113,190,247, 95,112, + 47, 39, 98, 37,203,129, 54,157,199, 86,136,195, 22, 53,140,193,106, 91,252,225,149,204, 98, 19, 75,118, 84,180,165, 7, 18,169, +178, 74,170, 69, 51, 56, 73,209, 23, 81,210,224, 42,219,115,204, 50, 5,109, 34,219,149, 87, 3,115,219, 16, 36,241, 71, 32,204, + 22, 85,167,138,163,219, 12,129, 32,128, 37,228,152,177, 1,116, 88,216, 92,246,107, 17,218,230,195, 19,125,171, 92,246,205, 30, + 90, 32, 84,171,244,168,149, 5, 16, 61,205, 83, 89,247,180,147,216, 56,218, 23,148,121,247,198,178,122,125, 22, 5,114, 40,154, +138,154, 22,210,134, 80, 99,180,183,112, 79,162,136, 1, 95,118,123,235,152,220, 17,123, 63,247, 3,103,237, 26, 77,219,197, 85, +255, 0, 51,114,119,174,160,202, 42, 21, 90, 12, 74,180,170,149,181,104,202,120, 37,197,211,222,171, 73, 81,114,229,171,182,181, + 40, 63, 37, 88,100,184,149,120, 41,228,194,143, 75,153,101, 48,185, 91,107,153,134,155, 1, 8,109,165, 41, 41, 74, 64, 1, 32, + 4,224, 99, 3, 80,103, 78, 51,204,101,157,185,180, 57, 21, 10,146, 34, 81, 20,149, 19,184,236,206, 95,148,177,131,216,104, 15, +110,168,167,108, 60,209,182,123, 57,246,138,169,146,133, 91,117,142, 38,105,152,127,215, 43, 89, 24,145,251, 10, 7,241,197, 84, +154,117, 14, 91, 72, 18,147, 35, 46,114, 97,104, 83,107, 42, 39, 25, 0,249,254,115,167, 66, 11,229, 77,120,141, 0,191,209, 21, + 33, 25,229,241, 84, 82, 74, 83,146, 59,103, 90,221, 94, 77, 82,101,118,154,148,130,244, 86,221,202,228,255, 0, 60, 39,160,229, + 89,254,119,200,247,211,203, 6,164, 88,105,150, 65,236,148,131,147,213, 56, 24,206, 62,221, 45,195,237,153,206, 43,169, 51,119, + 73,100,164,125, 34, 72,211, 64, 97, 96,110, 1,191, 81,243,214,210, 12,210,138, 24, 41, 40,102, 89, 57,178,213, 33,105, 1, 32, +244, 32,111, 96, 45,125,246,219,221,139,140, 97, 48, 58,236,154,131, 46,153, 46,146, 87,204,146, 82,132, 15,242,109, 36,167,167, +132, 6, 59,119,206,190,200,170,100,132,160, 21, 41, 56, 1, 36,134,210,133,100,156,114,158,195,191,225,170,166,170,211,105,248, +149,212,255, 0, 59, 56, 36,156,100, 15, 64,113,246,235, 24,171,213,226, 60, 10,142, 60, 84,244, 75,137,232,164,103,245, 65, 82, + 71, 80, 58,100,117, 7, 79,209, 82,242,147, 69, 59,116,245, 27,159, 93,250,111,240,235,241,195,116, 85,144, 77, 56, 50,195,229, + 27,121,122, 40, 22, 2,202,123, 1,254, 33,247,226,229, 38, 74,212,210,138,159, 75, 96, 2, 2, 89, 3,156,146, 72,192, 46,118, +242,234, 6,176,138,131,208,130,143, 59,105,144,180,243, 97,114, 84,183, 74, 71,117, 30, 85,124, 41, 72, 32,103,160,201,234, 15, + 82, 53,100,169,214,165, 52,218,131, 78,182, 91, 7, 5,229,115, 43, 41, 62,101, 9,253, 85, 99, 29,115,128,122, 16, 53,132, 78, +168,190,250,242,169,137, 87, 33, 4, 48, 26, 80,111, 0, 28,172,132,175,226, 56, 4,128,162, 71,159, 77, 32,237, 34, 54,153, 1, + 86, 59,239,247,110, 15,243,248,219,221, 40,164,162, 89, 84,201, 21, 66,136,191,195,112,122,116, 32, 11,143,131, 90,221, 78,196, + 28, 93,170, 53, 86,220, 45,182,214,121,193, 56, 75, 24,202, 63,156,175,242,120, 8, 79,194, 49,147,208,172,140,107, 28,144,185, + 14,165,196,243, 54,128,227,107, 95, 40, 1,247,148, 10, 82,160,148, 36,114,161,156, 18,146,126, 53, 99, 7,225,193, 26, 21,201, +165,223,209,170, 87, 43, 69,196,145,224,199,109, 32, 21,142, 84, 37, 68,147,135, 50, 73, 61, 7,235, 99, 61,180, 42,150, 9, 83, +110, 45,199,193, 66,138, 91, 83,156,173,178, 57, 84,149, 20,132, 36, 4, 47, 4,158,234, 33, 74, 7,212,107, 34, 85, 36, 91,174, +195,111,187, 14, 2, 4,136, 88, 88, 50,239,114, 9,216,252, 64,239,107,131,210,253,111, 96,106,135, 9,241, 91, 90,152,154,224, + 81, 10,117,183, 66,150,132,132, 32,132,199, 90, 18, 18,211, 62, 25,202,136,229, 86, 80, 71, 55, 78,180, 86,211,138, 90,218,109, +210,132,173, 42, 40,195, 97,226,160,188,146,149, 61,202, 17, 24,252, 7, 4,147,128,148,146,114,179,143,162, 72, 66, 20, 93, 82, + 91, 32,243,151, 0, 13,184,226,121, 87,250, 54,210,216, 3, 57, 40,248,112, 84, 48,188,119,233,112,142, 86,234, 29, 75,124,173, +161,158,235,112,133, 50, 75,156,174, 56,246, 66,135, 48, 3, 10, 10, 0,128, 64, 10, 4, 29,108, 70,250,118,191,227,252,183,237, +110,134,223,125,175,163, 80,140,221,139, 15, 94,194,214,251,186,251,205,239,140,110,108, 82,150,189,228, 33,212, 54,225, 10,142, + 29,108, 40,168, 1,209, 40, 65, 63, 3, 28,169, 5, 42,200,193, 95, 80, 71,124, 14,168, 18,210, 86, 21,203,202, 82,160, 8, 0, +169, 41, 24, 9, 81, 60,184, 87,196,165,224, 12, 28, 28,231,190,156,202,203, 43,100, 60,180,187, 46, 83,142,128, 90, 68,167, 20, + 70, 74,148,144,167, 1,235,149, 35,157, 71,249,216, 72, 0, 37, 61,155,106,154, 76,153, 41,136,149, 4,169,231,163,196, 66,202, +129, 9,117,245, 33,158, 98,160,112, 71,136,224, 32,158,132,126, 26, 84, 48, 2,250,134,223,233,191,126,157,125,253,112,216,241, + 18,202,161, 65, 55, 29, 0,222,246,181,135,238, 29,126,252, 64, 99,219,127,112,181,112,123, 74,183,173,166, 28, 82,255, 0,130, +214,206,212, 89,178, 82,176, 66, 90,159, 67,176,105, 47, 75, 67, 68,147,204,215,137, 82, 24, 35,204, 30,154,228,170,206, 51,216, +231,166, 58, 99,237,251, 53,183, 60,121,238, 60, 93,220,227, 99,138,189,200,132,233,122,157,114,111,133,244,154,114,249,150,180, +154,125, 6,168,171, 94, 25,104,172,228, 50, 89,161,161, 72, 29,130, 92, 0,116, 26,212,101,246, 56, 61, 59, 96,227, 63,241,212, +247, 43,140,165, 5, 18,176,179, 8,144,144,122,130, 84, 18, 62, 32,155, 28,114,150,121, 50, 85,103,185,197, 66, 29, 81,207, 87, + 80,202,123, 21, 51, 57, 82, 15,189,108,126,252, 8,178, 15, 79, 76,232,117,245, 36,142,192,224,252,191,179, 85,214,174,254,137, +207,231,246,104,101,224, 28,231,161,235,248,233,200,126,252,104, 1,220,109,129,221,230,199, 97,142,189,189, 51,215, 63,159, 61, + 14, 64, 0, 96,247, 29,126, 71, 68,169, 89, 62,120,252,245,208,202,238, 79,204,253,154, 92,108, 5,240, 48, 58,192,202,135, 67, +215,243,231,249,198,133, 81, 3, 57,249,224,119,237,229,162, 28, 39,169,249,249,126,125, 52, 26,200,251,199,127,179, 74, 45,198, +227,126,216,200,253,248,160,178, 50, 58, 3,211,207, 63,184,253,186, 90,240,163,147,159,195,236,210,210,184, 24,175,170,168, 61, + 49,215,167,225,161, 16,112,122,156,116,213, 97,248,103,161,251, 51,164,216, 90,227,174,173,255, 0, 60,100,245, 38,214,190, 14, + 73, 56, 0,142,152,239,145,247,116,213, 66,176, 7, 82,172,142,216,249,246,207,222, 52, 58, 84, 83,211, 29, 7,111,236, 58,242, + 80,162,174,101, 47, 8, 61,128,206, 71,222, 7,174,116,131,222,222,236,101, 69,254,127,150, 46,141,168, 96, 0, 57,137,206, 73, +254,145,243,192,215,213, 44,173, 73, 8, 39, 9, 56, 87,124,103,247,245,254,141, 80,105,188,242,146,174, 81,158,128,117, 61, 49, +215, 25,244,209,205,167, 57,192,206,127,164,117,237,249,237,164,172, 79,207,166, 48,109,219, 21, 90, 56, 35, 35, 32,143, 46,221, + 61,125, 15,125, 28, 57, 72, 79,160, 62,127,205,251, 62,125,244, 50,121,112, 0,252,253,190,154, 37,176, 85,142,192,124,135,244, +231,207,166,177, 97,123,227, 24,184,178, 15, 76,159, 82, 63,163,247,234,184, 24, 57, 24,201, 57, 7, 31,135,219,161, 16,175, 35, +231,219,250, 49,162,146,113,220,245,232, 65,198, 59,246,199,175,246,233, 22, 22, 36, 97, 50,187,220,155,223,231,255, 0, 56, 37, + 43, 8,199, 58,186,159, 32, 59,244,249,104,146,238, 70,113,140,249,250,227,183,159, 77, 4,113,144,190,153, 63, 44,227,184,200, +252, 53, 81, 36,116, 32,231, 29,201,251,125, 7,150,146, 98, 58,223,225,130,219,221,123,117,193, 41,119, 24,248,249, 64, 32,224, +227,175, 94,160,122,244,206,167, 39,236,166,220,118,247,115,129,157,165,148,252,148, 73,171, 88, 74,169,237,245, 93, 33, 73, 46, + 54,186, 44,133, 38, 1,113, 61, 74, 65,132,228,126, 92,227, 35,168,212, 42,118,215,108,110,189,211,185, 98,219, 86,181, 49, 83, +231, 73, 5,229,186,227,137,139, 78,167,194, 66,128,145, 85,173, 84, 93, 79,135, 74,164,183,252,247,156,234,162, 66, 26, 67,174, +148,160,203, 23,217, 2,214,215,112,241,106,238,110,209,215,119,102,143, 34,181, 87,151, 2,239,168, 76,172, 75,110,139,108, 53, + 53,136,201,133, 34, 21,179,239,238, 5,184,218, 82,218, 11,139,119,149,215, 15,196, 91, 66,126, 17, 4,227, 9,104,167,142,154, +137,228, 6,169, 95, 86,155, 95, 74, 21, 96, 75,158,136, 11, 5, 3, 81, 26,142,194,230,246,184, 60, 26,124,214,135,136,167,204, + 41,105,100,124,178, 88, 36,167,158, 80, 44,129,137, 73, 35, 0,159,180,193,212, 2, 20, 18,129,238,218, 65, 23,235,214,231, 75, +174,219, 59, 83,184, 21,235, 93,151, 30,184,224, 91,147, 13, 27,193,104,188,236,105,178, 18, 35, 38,162,134, 82, 50,234,163, 33, +213,188, 0,207, 86, 70,181,171,102,120, 8,183,217,222,155,115,124, 46, 59,138, 53,229,105,208,108, 90,123, 86, 21, 10, 66,223, +155, 42,179,121,215, 33,166, 69,211,124,221,210, 95,234,244,211, 45,231, 83, 25,177,128,216,198,122,164,107,107,162,239,150,195, + 32,148, 57,188,187,110,233,193, 75,141, 34,227,167, 60,130,146, 48,180, 45, 33,226, 20, 8, 39, 35,207, 26, 14,226,227, 7,134, + 29,183,182,107,183, 12,173,200,163,213,169,246,180, 23, 39,205,163, 89,141,125,115, 86, 84,102,186,172, 83,169,144,129, 84,133, +127,178,128,126,237, 65,225,142,150,158, 82,226,162, 33,169,116, 0, 89,111,114, 69,200, 23, 59,157,133,183, 61,135, 91, 99,179, +242,190, 62,226, 28,135, 33,205,114,204,161,165,203, 70,109,205,246,202,132, 82, 30, 74, 87,138, 56,249, 76,250,117, 70,177, 5, +155, 76,136,234,116, 85, 84, 45,129,101, 97,144,207,224,179,103,238,181, 56,183, 81,123,208,158,152,250,158,156,245,169,125,220, + 20,116, 60,235,202, 42,121,197, 48,137, 42, 66,150, 73, 60,184, 78, 0, 56,244,208, 91,129,114,240,113,236,166,216,187,155,114, +235, 20,202,117,183, 21,229,201,153, 69,162,189, 37,138,222,236,111, 13,232,227, 74, 84, 26, 29, 62,109, 77, 74,149, 44, 56,247, + 39,140,233, 40,139, 17,165, 41,231,112, 0,207, 27,248,128,250, 66,114,226, 82,170, 52,190, 16,184,115,190, 43, 19, 3, 14, 52, +141,201,220,155,106,174, 41, 84,247,112, 66,100,195,183, 41,209, 86,185, 78,160, 14, 96, 30,113, 8, 56,248,186,103, 81,143,226, + 11,136,157,247,226,127,114,100,238, 30,253,238, 45,126,244,188,158,105,214,162,199,173, 62,168,205, 81,169,238, 40,172,211,168, + 86,223,192,221, 6,154, 50, 7, 43, 76,160,168, 1,206,181,158,186,127,203, 56,124,207, 46,161, 18,211, 34,253,166, 54, 14, 6, +215,180,103,204, 24,247, 50, 42,129,179, 89,197,215, 20,239, 27,253, 36,248,135,244, 13, 71, 12, 80,113, 94, 97,196, 20,179,105, + 38, 7,168,168,108,188, 50,127,118,243,135, 96,181, 38, 34,111, 20, 96, 58,169,220, 60,100, 95, 24, 39,180,115,137,253,201,226, +247,127,170,251,223,186, 82, 27,254, 16, 94, 74,118,124, 26, 44, 87, 92,118,155,105, 91, 81,121,162, 91, 54,141, 31,196, 63, 13, + 58, 13, 59, 9,230,192, 47, 62,243,210, 23,241,186,117,175, 92, 57,196, 97,202,237,211, 57,208,178,252, 42, 34,147, 24, 1,211, + 46,149, 5, 18, 60,253, 6,173,251,228,231, 53,219, 29,128, 65,247, 42, 12, 6, 79, 41,200, 5, 73, 4,129,215,191,174,178, 14, + 26,216,118, 93,122,230,134,202,121,164,204,167, 68,139, 29, 9,238,183,223,119,194,101, 41,207,153,113,104, 31,126,172,212,141, + 41,120,124,197, 24,209, 26, 34,128, 46,118, 28,192,119, 59,147,183, 82, 73, 39,169, 36,239,142, 53, 53,117, 21,115,214, 86, 85, + 74,211,213, 84,180,178, 72,231,118,103, 42,204, 73,176,238,123, 0, 0,232, 0, 27, 98,109, 63, 71,223,128,234,125,203,195, 15, + 16,156, 74,220,244,174,123,199,114, 99,200,218,237,155,145, 45,177,136,116,123, 98, 92, 90,221,217, 83,134,149,167,225, 85, 82, +187, 18, 29, 56,186, 15,197, 30,152,164, 14,138, 57,216,168,246, 17,161,213, 31,142,228,117, 50, 90,146,235, 97, 10,230, 75,225, + 8, 56,228,115,185, 67,169,229, 41,229,239,204,112, 8, 58,236,151, 0,219, 99, 15, 98,184, 76,225,239,107,105,113, 83, 17,187, + 99,109,109,231,167,180,148,132, 41, 85,138,164, 38,234,181,105, 14,116, 28,206,174,124,199,201, 39,174,123,233,168,226, 23,134, +171,150, 93,110,226,220, 91, 38, 61, 58,161, 65,144,255, 0,214,146,168, 44, 62,182, 43,237,206,148,240,247,152, 52,168, 9,103, +146,167,207, 53,197, 58,202, 3,136, 63,166, 80, 94, 2, 65, 52,151, 19,209, 54, 99, 28, 89,138, 38,170,131,118,127, 82,142,117, + 40, 61, 55,137, 74,160,247, 13,239,215, 29,145,225,180,210,240,102, 89, 6, 69, 36,194, 24, 42,163, 73,100,212,214, 95,105,101, + 94,110,228,237,169,174, 22,254,128,108, 0, 3, 82,108,234, 84,116, 52,134,210,201, 41,147, 33, 50, 29, 8,240,203,143,186, 2, + 0, 83,220,201,207, 58, 67, 40, 7, 36, 0, 19,132,156,107, 99,104, 52, 8,210, 93, 98,116,150,210, 36,193,113, 47, 65, 13,129, +225,199,203,101,135,198, 79,235, 74,113,133, 41, 10, 89, 5, 32, 16,148,242,167, 36,170, 87, 15, 59,203, 71, 82, 20,230,223, 76, +148,128,134,151,205, 74,153, 75,168, 33,105,194, 64, 39, 19,144,162, 0, 37, 71, 41, 4, 99, 28,189,244,241,218,123, 83,186, 79, + 41,180, 35,109,238,133, 20,114,133, 45,113,162, 37, 61, 14, 28, 74,221,114,104, 72, 79, 81,147,216,245,198,162, 81,100,213, 74, + 64,146,146, 66, 91,182,134,244, 22,232, 13,237,215,211,210,214, 24,178, 78,125, 70,186,229,108,198, 24,237,177,102,158, 32, 0, + 54, 4, 18, 91, 96, 64, 3,222, 5,177,113,161,208, 12,134, 16,211, 10, 90, 34,143,242,202,115,224,151, 49,158,230, 50, 29, 74, +147,238,236, 18,160, 10,191, 89, 64,114, 35, 1, 74, 86,178,171,163,112,237,237,158, 85,185, 95,170,208,239,234,203,242, 38,132, + 82,227,109,214,216,222,251,153, 34, 51,212,224,196,176,253,106,153, 99,209,229, 46,149, 79, 64,228, 45, 41,208,217,144,176, 88, +142,149,168, 40, 7,150,209,216, 45,211,158,164, 57, 54,149, 73,183,217, 80,229, 46,213,234, 77, 72,113, 41, 0,142,127,114,166, +182,234,138,136, 63, 8,231, 66,124,250,119,214,136,251,111,106,123,151,194, 15,179, 87,116,183, 91,103,247, 82,225,178,183, 81, + 55, 54,223, 91, 16,111, 43,121,168,212,249,212,202,101,201,112,177, 6,177, 22,136,227,168,117,112,106, 47,198, 43, 67,115,185, +253,229,144, 74,152, 83, 75,194,132,166,147,135,179, 55,167,146,177,104,218, 8,163, 49,131, 44,171,101, 82,242, 36,105,101, 37, + 93,174,238, 0,210, 13,137,213,184,190, 34, 25,199,137,124, 27,150, 48, 25,157, 89,207,105, 98, 73,154, 90, 74, 25,209,101,153, + 68, 78,197, 69, 87, 38,162, 8,201, 42, 11,115, 17,137, 23, 64, 22,225,150, 51,124,116,238, 62,206,240, 93,121,221, 53,125,139, + 98,254,183,183,166,236,173,213, 46,123, 18,139,190, 78, 91,107,223,205,183,143,115, 74,157, 85, 27,132,254,217,209, 34,200,137, +176,244,148, 57, 59,154,223,149,118,189, 34,254,168, 6,195,212,202, 37, 1,178,229,101, 17,220,184, 46,123,134,236,174, 85,110, +107,134,183, 87,184,110, 58,228,233,117, 42,229,201, 93,156,253, 74,191, 90,168,206,125,114, 39, 77,169, 84,100,184, 86,235,239, + 72, 90,214,224, 4, 37, 74, 86, 72, 39, 36,218, 42,181, 73,149,138,165, 74,181, 92,157, 58,167, 88,172,212,165, 86, 43, 53,106, +148,217, 85, 42,173, 98,179, 80,115,198,159, 87,171,212,230,186,183,234,149, 55,158, 37, 78,200,125,199, 29,112,245, 90,142, 6, +128,109,101,110, 97, 36, 6,179,241,128, 71, 49, 62,185,242, 26,176,114, 30, 31,163,201, 33,178, 14,117, 76,191,106, 66, 5,197, +194,141, 9,251, 40, 52,128, 22,229,136, 85,214,206, 85, 72,164,252,120,250, 73,120,157,244,128,204,169, 36,227, 28,238, 99,195, +217, 60,113, 67, 69,150,137,165,120, 17, 41,193, 88,102,171,119, 98,213,213,195, 83,191,180, 77,245,112, 73, 61, 64,160,130,138, + 25,228,133,136, 90,148,234, 57, 93, 9,121, 9, 80, 90, 91,144,148,188,144,176,114,149,165, 14, 2, 18,224, 80, 4, 40, 96,130, + 50, 8, 58,204,169,155,143,113,209,211, 21,169,110,192,185,160, 68, 11, 17,232,183,173, 53,187,170,154,198, 82, 82, 61,205,249, +174, 9,212,229, 15,255, 0,131, 48, 54, 63,248,163,211, 24, 96,228, 10, 88,201, 41, 7,162,137,244,238, 63, 57,213, 53,164, 43, + 36, 14,185,200,252,159,150,159, 39,166,130,161, 52, 77, 10,202,163,166,160, 13,137,238, 13,174,167,222, 44, 71, 99,138,111,135, +120,167,136,248, 74,170,106,190, 27,206,170, 50,105, 42,192, 74,133,134, 66,176,213, 68, 13,249, 53,148,230,244,245,180,228,253, +170,106,184,166,129,255, 0, 94, 54, 24,116,231,239,189,238,150, 89,133, 64,254, 15,237,252, 36,248,206,123,141,131, 77, 48, 29, +151, 33,230,210,209,151, 80,170, 84,195,206,184,250, 26, 64,229, 8, 74, 50,160,149, 45,107, 8,109, 8,177,171,117,119, 10,108, + 7,169,170,189,110,207,170,159, 74,208,253, 57, 21,201,173, 71,113, 46,161, 40,144,133, 73, 74,196,165, 54,232, 78, 92,111,222, + 60, 37,149,168,148,124, 74,206, 0,166,219,230, 33,120, 36,117,206,124,251,143,219,175,170, 91, 74, 90, 19,207,241, 32, 19,200, +147,240,156,250,254,205, 37, 29, 21, 36, 32,133,167, 64, 24,223,236,130,111,182,228,145,114, 71, 98, 73, 54,218,248,156,102,190, + 58,120,209,157,242, 99,172,241, 87, 62,130,146,154,148, 80,197, 71, 69,153,213,101,153,108, 20, 34, 40,225, 52, 84,185, 86, 89, + 37, 30, 91, 75, 70,241, 68,139, 37, 45, 45, 36, 84,242,232, 13, 44,108,196,177,172,227,188,193, 37, 92,169, 75,105, 8,109,150, +208, 16,219,109,131,209, 13,161, 0, 37,180,228,147,128, 7, 82, 79,114,117, 72,146,163,205,129,140, 14, 81,216,140,129,158,184, +237,223, 94, 84,177,158,216, 4,224, 31, 32, 73,237,246,107,233, 9, 80, 79, 50,129,198, 79,194, 64, 35,215, 61,126,205,109, 95, +111, 47,109,189,216,170, 85, 2,233, 91,105, 10, 6,221, 0, 3,160, 30,158,131,165,177,229,212,133,160,131,128,125,112, 51,211, +236,243,208,105, 11,230, 60,201, 8,109,191,139,226,248, 78, 71,159,207,251,116,122, 20, 20, 50, 7,145,200, 61,199,151, 95,191, + 67,169, 36, 55,151, 49,215,161,201, 4,252,137, 0,246,233,161,179,111,219, 6,177, 6,221,251,126,255, 0,227,138,110,123,186, +192, 82,130,150, 8,200,194, 73, 3,182, 73, 31, 61, 75,227,232,215,112,195, 99,223,219, 35,198, 38,227,110,133,131,105,238, 13, +175,184,202,183,248,125, 93,173,121, 80, 32, 92, 54,253,118,207, 69, 45,203,170,246,167, 78,131, 84, 97,109,174, 60,137,213,122, + 35, 78,132,242,171, 48, 16,160,164,173,180, 40, 68, 24,149,143, 8, 54,158,138, 74,147,205,144,144,181, 99, 24, 3, 29, 15,109, + 77,123,217,103,184,103,103,189,143,246,187,116, 6,164, 81,171,123,149,186,219,227, 85,173,205, 79, 52,105,170,164, 82,174,168, +214,139, 78,199,144,180,167,195,143, 48, 82, 93, 67, 79,160,169, 10,102, 26,210,135, 57,138,185, 98,156, 99,155,193,146,101, 73, + 89, 80, 12,138, 37, 10,177,139, 6,150, 66,173,201,141, 9,232, 76,161, 9, 36, 16,136, 25,200, 33, 72,197,129,225,126, 86,115, +110, 47,162,164, 72,185,210,136,228,101, 7,117,187, 20,132,234,244, 26,101,111,190,214,223, 28,193,223, 63, 97, 79, 4,115,184, +194,185,209,179, 27,239,185, 54,175, 14,116,135,150, 47, 93,165,163, 83,105,149,186,237,191,122,205, 66,164,162,196,218,237,215, +185, 31,144,220,155, 36, 48,243, 62, 60,137,208, 39,207,167, 56,164, 69,140,229, 65, 78,120,204,111, 6,212,251, 26,125,155,123, +125, 58,216,185,109,203, 55,136,138,110,227, 80, 37,198,122,216,220, 26, 55, 21,119,221,175,121,219,245,200,177,194,145,114, 81, +170, 86,149, 42, 2,105, 21,166,212, 60, 80,227, 40, 75, 45,172,132,134,150,223,194,108, 27, 71,113,203,157, 91,184, 42,197, 34, + 81,147,122, 93, 21, 71, 34,115, 36, 46, 82,152,170, 10,100, 82,181,243,128,150,154, 17, 84,177,200, 6, 11,105, 81, 80, 1, 58, +222,155, 74,229,118,163, 38,164,121, 90,136,212, 8,204, 83, 34,180,202,131,110,158, 98, 36, 84,159, 83, 97, 28,172, 45, 43, 91, +109, 37, 72,230, 95, 43, 74, 4,164,144, 53, 71,103,220, 99,198,175, 58,200,217,245, 68, 48,132, 0,197, 3,242, 22,221, 8, 44, +154,100,147,169, 93, 83,188,174, 86,218,156,144,111,212,220, 79,225, 79, 9,228, 78,100,161,201,225, 89, 2,172,143, 33, 82, 89, +164,178,130,234, 9,180,107,204, 58,149, 35, 85, 80,157, 55, 14,113,212,219, 99,136,234,228,106,101, 18,155, 87, 66, 43,171,106, + 35, 20,230,230,213, 86,165, 86,106, 81,233,145,219,143,245,157, 94,162,202, 82, 39,213,158, 8, 74,228, 72,240,144, 31,125,213, +185,225,160,171,151, 78,181,189,187, 22,141,226,232,140,220,143,169,234, 75,115,193,110, 28,247, 27, 75, 82, 94,236, 27,137, 40, + 30, 71, 22, 72,232,147,202,162,122, 0, 78,185, 81, 30,244,240, 36, 85, 11, 97, 75,143, 66,134,205, 38, 36,144,114,151,170,110, +182,100, 75, 96, 4,171,162,144,234,163,165, 65, 32,245, 74,178, 8, 26, 10, 61,219, 41,136, 17,203,239, 31,124,142,204,154,156, +175, 13,210,158, 95,136, 52,201,108,142,169, 62, 50,148,126, 69,191,150,148,202,184,199, 54,167,208, 37,169, 53,106, 7,153,101, +243, 27, 0,162,250,143,152, 27,234, 59,146, 0,182,199, 21,248,142,186,130, 68, 16, 73,204, 22, 91,197, 37,200, 58,148,200, 0, + 63,105,108,186, 23, 99,179, 29,212,244, 27,233,106,113,119,182,151,183, 20,183,231, 10, 22, 90, 95,184,110,205,174,179, 85,117, +110, 45,213, 17,214, 92,183,173,234,168,126, 51, 38,204, 66,193,230,145, 91,105, 50,153,247,130, 7, 35, 78, 18,214, 74,210,172, +108,130,235,136, 99,157,106, 88,230, 57, 24,206,126, 30,184, 29,122, 99, 35,174,184,239,193,253,153,180, 27, 99,196,214,228,110, +244, 17, 42,218,187,248,132,179, 97,219,181,104, 40,144,201,180,230,222, 73,172,174,167, 38,226,195,235, 46,192,175,213,208,195, +104,125, 33, 94,236,228,180, 23,194, 91,114, 74,129,232,125,205,113, 42, 50,221, 64,113, 73, 41, 74,147,200, 62, 21,165,105, 39, + 60,201, 61,142, 2,178, 62, 90,181,184,106,180,102,212,111, 59, 48, 18, 60,132, 50, 0, 46,130,202, 66,144, 55,247,134, 61, 71, +223,105,215, 25, 75,194, 85,210,100,173,193,144,212,211,209, 46, 91, 68,149,130,172,222, 99,154, 8,239, 94,118,188, 98, 35, 41, + 2, 1, 17,229,242, 66,157,152,184, 14,149, 74,248,109,178, 71,136, 2,123,168,115, 2, 14, 14, 57,186,118, 32,228, 31, 62,191, + 45, 97, 51, 47, 98, 23,151, 29, 87,134,165, 30, 85, 12,144, 73, 56, 9, 36, 28,115,140,128, 50, 48,190,217,242,214,190, 84,238, +181,120,174, 53,206, 10,138, 20,251,121, 81,248,208, 14, 28,111, 62,153, 35,167,145, 94,177,148, 93,188,217,104,175,152, 41, 36, +165, 46, 12,115, 32, 15,137, 25, 36, 18,180, 96,127,181,202,144,175, 93, 74, 99,129, 80,108,110,126, 63, 15,221,249,252,113, 22, +167,164, 88,198,195, 87, 75,254, 23,239,215,227,252,142, 54,149,187,161, 46,158,100,184, 10, 85,203,158,101, 4,148,156,144,121, +194,199,192,114, 21,229,141, 90, 42,114,158, 91,107,145, 76, 8,113,208, 10,213, 17, 74, 45,161,212,100,229, 76, 41, 32,144,224, +234,174, 78,161, 92,159, 14, 20,113,166, 18, 37,213,201,202, 92,120, 40, 0, 57, 92, 36, 41, 65, 39, 56, 67,160,145,146, 15, 76, +158,152, 57, 32, 19,157,102,144,110, 4,175,225, 82,207, 50, 70, 72, 4,148,117, 57,200,207, 83,144, 6, 64,237,203,243,234,149, + 69, 58, 78,154, 36, 23,244, 61,193,236,111,235,211,249,140,110, 67, 81, 45, 20,162,104, 13,237,177, 83,114,174, 63,101,198,215, + 30,253,136,189,193, 83,190, 47,109,215,101,185,200,130,228,102,194, 92, 90, 75,164, 58,231, 42,146, 73,229, 80,113, 35, 60,189, +138,136,248, 74,128, 86, 58,234,234,212,199,221, 1, 78,200, 88, 33, 68, 16,142,102, 27, 82, 21,132,242, 40, 55,146, 82,112, 59, + 17,133, 39, 33, 64,231, 88, 13,198,183, 11, 6,169, 79, 9, 91,204, 2,185,108,130,176,149,181,132,149,201, 71,135,250,206,161, +180,146,226,123,173, 0,158,139, 29,113,232,181,233,174, 28,169, 77,128,142, 71, 27, 45,169,120, 83, 43, 79, 55, 50,121,143,249, + 64, 84,147,211,161, 24,193,202,134, 98,211, 43, 81,204, 98,153,246,107,216,216, 88,131,109,238, 59,250,223,241, 6,248,157, 80, +188,121,165, 42,212, 83, 34, 68,192,217,212,145,169, 24,117,235,185,235,117, 35,175,186,197, 67,227, 22, 64, 10, 60,141,168,243, +128, 10,146, 74,212, 91, 65, 32, 37, 74, 41, 42, 91, 32,227,252,152,234, 9,207, 49, 35, 87,149, 84, 92,140,217, 90, 25, 74, 60, +117, 4, 33, 47,165,213,199,195,201, 42,109,160,129,149,198,144,226,142, 19,206, 49,147,240,163,148,243,105,158,139, 82, 82,138, + 1,113, 92,142, 19,203, 33,183,156,229, 70, 87,204,203,109,242,184,163, 29,174,101,225, 33, 28,203, 82,148,148,148,231, 35, 87, +196, 84,214,134,138,188, 73, 40,112,151,217, 83,209,203,109,180,180,164,252, 94, 34, 22,162,183,100,103, 28,223,168, 83,130,148, +143,136,157, 47, 28,195,190,192, 88, 95,247,119,235,183,190,247,177,191, 77,244, 42,224,209,114, 95, 93,183,232,119,183,196,245, + 29, 59, 16, 63, 12,178,167, 82,117,101,214,158,116,143, 5, 24, 90, 23,206,135,176,149, 30,171, 28,152, 67,133,148, 37, 68,130, + 72, 82,136,233,216,106,111, 20,187,199, 75,216, 78, 31,183,187,123,107, 14, 3, 11,107, 54,178,243,187,194, 90, 57,118, 69, 74, + 29, 37,232,118,227, 17, 80,181, 15, 26, 67,151, 45, 70,140,218, 83,159,252, 98,186,121,105,253,153, 86, 47, 7, 9,115, 32, 43, + 45, 41,124,222, 48,200, 88, 62, 39, 83,200,159,140,117, 57, 42,192,233,231,168,229,253, 33,126, 36,209,101,112,247,183,156, 51, + 81,166, 20,220,123,253,118,139,190,234,105, 14,114,189, 19,107, 54,170,107, 47, 14,101, 54,172, 24,245, 77,192,149, 76,140,166, + 92,229,230,106,223,125, 65, 36, 5, 99,118,157, 26,170,122,122, 52, 39, 85, 75, 0,125, 66,117,118, 29, 62,202, 6, 59,122,116, +190,198, 41,159, 87,166, 83,147,230, 89,163, 16,134,138, 38,100,189,183,152,128,144,169, 29,124,210,178, 41,223, 96, 73,219, 16, +244, 92,153, 82,150,236,202,131,161,234,140,247,159,157, 80,125, 32, 97,234,132,215,151, 38,107,224, 96,116, 92,167, 94, 87,207, +155, 66,172,131,211,207, 61,115,246,127,110,136,115,169, 29,135,115,161, 87,230,174,152,245,239,216,121,254,124,181,105,160, 0, + 11,108, 63, 45,182,199, 34, 42,236, 13,205,207,174,253, 14, 6, 86, 50,113,249, 63, 47,150,135, 81, 10,242,192,235,159,159,204, +250,104,133,250,130, 20, 72,252,244, 26, 21, 71,161, 62,125, 79,223,165, 20, 18, 70, 21,192,234, 32,117,249,224,103,231,246,124, +180, 51,131, 57,234, 1, 4,245,209, 90, 17,194, 14,122,247, 57,199,203,231,165,199, 81,129,129, 85,211,167, 82, 79,115,242,244, +199,166,116, 42,200,207,108,117,199,219,215,207, 68,185,242,238, 7,159,111, 95,223,160,150, 79,126,152, 61,193,243, 61,127, 63, +118,148, 65, 97,210,247,249,255, 0, 92, 12, 82, 36, 2,122,129,247,254,255, 0, 61, 45, 81, 95,235,119,242,252, 62, 95,159, 93, + 45, 31, 3,108, 86, 29,251,103,229,162, 52, 42, 87,219, 61, 15,145,199, 76,131,229,170,129, 68,158, 94,108,116,207,111,159, 94, +190,189,244, 71, 2,221,108, 70, 14,195,173,190, 63,195, 7, 54,123, 21,125,223, 63, 67,162, 7, 95, 35,246,121,232, 38,240, 58, +100,147,243,252,247,254,173, 22,149,245,244, 62, 94,126, 95,102,146,193, 58,116, 56, 41,161,203,212,156, 99,200,252,243,216,104, +214,200,243, 0,253,248, 39, 64,165, 89, 29,191, 17,231,231,131,157, 86,108, 20, 44,168,172, 16,172, 1,159, 47,179,238,210,109, +233,109,135,242,198,113,112, 10,193, 1, 67, 4,249,129,223,237, 35,243,215, 68,167, 3,168,200, 39,161, 29,191,102,122,118,208, +169, 81, 32, 12, 12,140,119,237,140, 1,140,143, 60,232,128,172,100,156,100, 96,228, 96,147,246, 99,229,253, 58, 79, 24,193,141, +168,119, 61,113,211,239,233,131,248,104,132, 28,224,245, 56,235,243,233,235,143, 45, 0,133,103, 3,168, 4,250, 14,255, 0,105, +213,126,108, 17,133, 41, 57,207,234,250,255, 0,195, 72, 55, 94,183,198, 45,251,240, 96,194,212, 65,206, 15, 99,156, 99,167, 83, +223,166,178,107, 86,133, 46,228,174, 83,168, 84,230,131,242,231,203,102, 43, 41, 89,195, 69,215, 20,122,190,224,255, 0, 37, 29, + 13,165,110, 56,175,230,182,210,136,235,140,226,141,149,172,148, 40,242,164,140,243, 0,115,229,231,167, 83,107,106,201,163,215, + 27,102, 59,168,106,161, 80, 68,168, 17,165,168, 14,120,254,244,202,121,148,223, 55,119,212,203,110,165, 63, 53,159, 44,231, 74, +177,164,138,154,105, 34, 0,200,138, 72,248,250,159,147,183, 77,240,231,146,208,195,153,231, 25, 94, 91, 81, 57,166,167,174,158, + 24,157,199, 85, 87,117, 86, 43,125,181, 16,108,183,219, 81, 23,218,248,222,138,101,205,111,109, 53,188,139, 14,206, 6, 92,185, +106, 97,219,158,165, 20, 33,169,181,218,147,105,229, 75,211,229, 39,172,106,107, 74, 42, 76, 88,249,229,105,177,148,165, 78,169, +197,168,202, 52, 58,189,201, 45,107,152,251,134, 43,136,241, 26,136,133, 56,212, 96, 73,206, 22, 82,160,183,187,255, 0, 56,129, +159,230,233,172,181,109,231,101, 77,113,174, 96, 84,151, 11,234, 90,143, 58,214,238,114,165,184,181, 28,173,106, 39,185,234,115, +211,167, 77,109, 61,163, 22, 44, 22, 27, 91,137, 83,171, 74,128, 82, 1,207,234,158,188,201, 56, 29,255, 0, 15,232,173, 43,102, +142,152, 57, 86,230,207, 39,153,152,245, 98,109,185,219,238, 30,131, 97,176,176,238, 92,135,135, 96,160,165,130,158,154,139,217, +233,169,194,164, 80, 40,217, 20, 91,173,247,102, 39,119, 98,117, 51, 18,204, 75, 18,113,157, 88, 27, 77, 6,162,243, 10, 91, 45, +173,210, 17,204,134,249,192, 79, 80, 63,214,237,246,249, 13,116,123, 98,182, 58, 4, 74,205, 30,167, 79,136,195, 21, 8,242, 27, +109,110,132, 5, 41, 73, 87,235,167, 43, 4, 56,130,140,228, 96,131,208, 99, 90,225,182, 40, 67,142, 48, 16,148,176,211,139,108, +165, 13,164, 41,196,146, 1, 0, 28, 0,122,103,200,227, 93, 65,218,186,205,175,107,194, 23, 45,203, 58, 29, 22,218,182, 96, 72, +174,220,149,170,131,237,177, 22,155, 74,165,199, 84,185,211,101,200,116,132,182,210, 35, 52,242,142, 78,112,156, 0, 78, 6,171, + 12,238,173,234,222, 88,228,156,164,106, 9, 35,215,160, 2,195,177, 61,189, 58, 92,224,103,185,230,105,150, 32,167,167,102, 26, +193, 82, 7,165,183, 6,219, 90,219, 1,190, 56,205,197,103,181,207,127,173, 13,203,184,118,215,133,170,141, 31,104,108,203, 18, +227,169,219,114,110, 38,173, 59,114,175,120,222, 85,138, 12,199, 41,181,154,156,153, 53,154,123,241,232,148,133, 84,163, 74,110, + 60, 86, 88, 82,220,105,176,227,238,146,190, 68,232,182,233,123, 64,184,141,223,154, 60,154, 6,249, 57,181,123,167, 78,146, 84, +227, 18,107,187, 67, 98, 81,110, 42,116,165, 0,145, 34,159,117,218,148,120,114, 99,114,227,163,101, 42, 70, 84,115,229,173, 86, +221,155,170, 61,231,185, 27,133,121, 69, 66, 4, 43,174,251,188, 46,104, 37,150,148,210, 87, 78,184, 46,106,173, 86,152,226, 26, + 95, 86,138,160, 76,140, 84,147,241, 37, 74, 32,128, 65, 26,194,202,138, 27, 72, 66, 66,146,164,249,147,216,250,231,207, 87, 69, + 31, 7,240,224,142,134,170,163, 33,165,108,202, 5, 70, 19,180, 17,154,132,144, 1,186,205,167,154,132, 27,219, 75, 46,158,139, +101,216,113, 46,113,196, 25,150,101,152,213,213, 75, 88,211,164,146,185, 69, 33, 74, 4,212,116, 0, 45,109,150,194,253, 77,174, +196,146, 78, 25, 29,226, 14, 57,121,205,113,232,130, 3,142,211,225,184, 35,161,210,251, 60,158, 24,194,153,113, 74, 39,194,232, + 48, 51,240,246,211,245,236,251,162,194,185,248,143,179, 45,121, 83, 19, 21,250,213,203,107,181, 9,165, 71,118, 87,191,186,213, +102, 27,130, 3, 81,152, 66,148,243,239, 41, 41,105, 3, 24, 5,238,101,124, 41, 58,101,247,161,159, 22,181, 69,168, 39, 42,110, +109, 13,166,193,234, 48,228,124, 36,164,245,239,145,174,129,251, 9,174,186, 5,165,237, 66,225,233,203,134,153, 75,169,179, 93, +122,232,183,105,102,171, 29,185, 77,211,107,245, 27,114,161,245, 77, 90, 19,110,130,148, 84,153,121,149, 6, 86, 70, 82, 94, 37, + 63, 16, 4, 76,106,145,166,225,202,216,163,115, 19,154,118, 0,141,244, 17,182,175, 48,111,179,107,216,131,211,124, 55,240,245, + 50,102,121,237, 29, 36,238, 33, 74,218,128,140, 64, 27,115, 13,172,189, 64, 38,246, 91,130, 3, 17,112, 70,216,253, 60,108,203, +170, 61, 38,218,163, 69,169,210,215, 6,123, 52,168, 12, 42, 18, 30, 74,149, 13, 45,197,109, 30, 2,136,232, 84,156, 96,142,195, + 24,211,173, 99,205,135, 95, 67,163,195, 82,216,105,226,174, 71,124,148,149, 2, 51,235,129,141,105, 44, 90,227,175,203,110, 58, +159, 60,234,145,200,227,139, 86,113,133,225, 74, 81,201,236,156,159,187,231,170, 28, 4,113, 50,246,254,220,188, 78,211, 27,167, +174,157, 67,217,253,200, 98,198,160, 62,226, 84,149,213,154,110, 59,134, 85, 65, 74, 80,193, 38, 67, 46,128,145,156, 36,167, 56, +206,171,117,160,130,138,122, 97,237, 82,206,210, 2,164, 74,193,245,233, 0,234, 42, 2,170,144,127,100, 1,189,173,233,213,116, + 57, 94,103,152,229, 89,246,102,140,213, 17,228,201, 12,179, 73, 36,128, 58, 9,234, 18,153, 52, 40,182,162,210, 72,183, 8, 0, + 85, 5,141,128, 24,234, 84, 22, 97,190,160,211,140,160, 37, 73, 9, 37, 39,151, 35,203, 4,118, 61, 53,114,153, 78,153, 71,107, +235, 40, 14, 61, 50,158,222, 60, 88,104, 36,186,207,108, 43,161,248,155, 29, 63, 29, 97, 20,201,202, 47,103,152,116,235,202, 79, +126,158, 94,167,229,242,211,203,110,200,247,142, 86,186, 45, 43, 28,139, 74,199, 69, 36,140, 40, 28,142,185,211,232,142, 26,149, +210,124,143,250,172, 54, 32,246,233,212,123,143,108, 87, 57,193,168,203, 88, 74,126,186, 30,174,140,110, 24, 27, 95,115,186,183, +163, 11, 88,251,182, 38, 90,149,147, 81,103, 43,113, 42, 36,101, 41, 4, 97, 63,236,131,246,106, 57,159, 74,191,116, 98, 90,254, +207, 59, 39,109,189,229, 13,212,183,107,126, 44,232,173, 70, 10, 79,139, 34,151,103,194,170,220, 21, 37, 33, 4,228,182,151, 83, + 3,152,129,211,196, 79, 81,158,178, 30,102,146,109,219,145, 41, 96, 40, 65,169, 43,197,142,145,209, 8,117, 68, 7, 25, 3,237, + 80, 32,127,181,168, 24,253, 41,190, 42,105,187,177,198, 54,217,240,225,110, 85, 81, 54,139,195,101,145, 34,125,214,152,206, 7, + 99,181,184,187,128,182, 37, 59, 9,124,170,199,189,197,183, 98, 83,146,176,122,161, 83, 8, 58, 74, 58,202,145, 17,201,101, 26, +102,168,170,131, 88,244, 90,105, 22,173,158,223,176,226, 5,136,155, 90,243, 32,234,192, 98, 1,158, 71, 76,139, 85, 95, 79,189, + 36,176, 18,155, 91,205, 48,228,232,235,246,147, 91,189,183, 39,148,198,196, 2,113, 23,105, 12,224,142, 92,114,128, 57,115,230, + 60,193, 31,158,218,166,220,116, 96,148,167, 35,185, 0, 30,135,231,131,219, 70, 58, 91,112,228,147,129,219,200,129,212,245, 26, +163,239, 1,162,164,182, 58, 16, 2,148, 48,123,246,233,248,234, 69,123,110, 78,199,253, 49, 95,238,192, 91,182, 41,184,218,146, +112, 2, 85,145,205,128,115,240,232,117,175,166, 2,185, 84,122,144,123,252,146, 48, 58,249,126, 26,246,165,183,205,207,226,242, + 41, 68, 0,146,160, 57,188,186,141, 8,236,164,182,248, 10, 66, 79, 40,192, 24,234, 78, 51,205,246,235, 5,182,178,131,140,233, + 61,206, 62, 37, 37,100,130, 84,143, 85, 20,247,251, 9,215,196, 52,218, 22, 28,108, 23, 20, 73, 10, 73, 32, 16, 58,117, 3, 29, +117,111, 83,203,146,247, 41,116,161,190, 96,162,140,245, 64, 79,113,246,247,209,173,134,220,112, 58,130,174, 68,156, 21, 96,167, + 56, 29,142,124,186,235, 23, 38,226,214,237,108, 24, 0, 8,223,231,108, 84,202, 80,181, 45, 75, 37, 10,236,140, 14, 84, 19,208, + 21, 19,249,206,145,240, 91, 89, 35, 4,168, 2,181, 39, 36, 1,143, 63,207,219,175, 14,180,248, 91,135,225, 44, 44, 19,203,230, +113,158,202, 35,190,147, 72, 75,188,184, 10, 97,180,167,149, 94,101, 68,116,193,200,235,219, 67,113,176,234, 62,253,255, 0,241, +140, 88, 27,158,199,247, 99,223,138,128,176, 16, 74,202,192,200, 64,234, 51,216,159,151,174,144, 56,112,168,255, 0,226,210, 65, + 39,211,169,193, 30,191,219,161,201, 91, 97,101, 11,229, 33,124,169,112,164, 97, 67, 25, 41,193, 29, 62,221, 18,149, 30, 64, 28, + 41, 83,138,201, 81,233,203,131,211, 7,167, 95,158,178,160,129,238,248, 99, 4, 11,219,211,111,159,187, 23, 91,122,216,174,223, +151, 45,171,103, 91, 30, 48,173, 94, 23, 45, 2,211,161,169,134,124,101,166,185,117,214,160,219,116, 71, 18,206, 63, 72,148,213, +170,176,202,135,110, 84,156,234,116,188, 70, 90, 86,214,200,237,141,191,195,253,145, 22, 45, 26,196,217,203, 30,212,219, 59,118, +140,216, 15, 52,105,182, 85, 52,210,220,144,228,146, 7,188, 57, 58,187, 14,173, 81,121,213,101,199,100, 86,221,117,213, 5,175, + 81, 5,246,122, 41,151,120,231,225, 49,165, 45,167, 25, 70,253,237,171,138,109, 68, 6,138,152,185, 35, 72, 66, 58,164,128, 60, + 86, 81,140,142,248, 24,212,167,184,174,185,213, 80,146,133, 73, 46,189, 42,116,101,176,243,171,116,136,206,165, 92,181, 24,242, + 29, 66,122, 56,175,137,244, 12,128,174,102,202,115,202, 19,170, 83,197, 9,101,168,206,184,107, 46, 36,242, 99,215, 57,177, 27, +176, 33,119, 7,246, 0,242,159,241,145,183,126,148,250, 56,229,176,205,157, 87,230, 36, 3, 52, 82, 67, 18,237,186, 42,142,113, + 96, 78,222,114, 22,253,238,138, 65,198,134,236,221,125, 48,227, 85,230, 51, 33,182, 20, 46,139,193, 78, 71,146, 11,172,173, 49, +107,213, 39, 22,218,176, 65,104, 45,181, 17,240, 28,231, 10, 57,192,214,224, 91, 87, 56, 52,186,124, 87, 37, 60,195, 17, 27,114, +181, 86,168, 52,165, 33,208,211,232, 84,135, 35,180, 82,172, 45,194,149, 57,206, 62, 17,225,181,156,149, 19,174,110, 88, 21,191, +119,114,244,165,183,202, 67, 27,155,118,199, 87, 58,178, 4, 89, 50, 96,212,208,176,140,117, 30, 4,208, 18, 6,122, 47,168, 24, +193,216,148,220,233, 17, 19, 8, 58,234,126,185,152,195,115,214,218,208, 94, 77, 49, 13,178,244,133,248,196, 0,223,193, 29,180, + 33, 36,116, 68,133,242,242,101, 71, 81,250,188,185,106, 15, 67,113, 99,239,183,107,245,232, 9,183,107,219,224, 58,227, 63,165, +142,190,158, 48, 77,158,254, 98, 55,217,118, 36, 14,246, 5,200, 7,112, 64, 22, 35,166,219,210, 47,185, 82,233, 80,131,107,114, + 60,217, 83, 30,159, 55, 1, 97, 10,126, 99,143, 59,200, 93, 39, 36,248, 79, 52,216, 74,146, 85,208,149, 28,227, 87, 58,150,229, + 67,154,202, 4, 96, 35, 72,171, 77,110, 44, 73,100, 36,180,229, 58,157,136,136, 91,136, 10,230,111,157,193, 37,215, 17,208,101, +244,168,228,117,214,181, 64,187,158,122, 93, 82, 99, 15, 54,251, 37,214,153,128, 31,117, 72,105,199, 39,177,225, 23,146,164,156, + 48,194, 20,135,157, 91,128,140, 41,148,243,100, 17,156, 82,117,230,220,185,110, 46,150,234,204, 86,210,213, 38, 18,207, 68,178, +246, 20,194,221,232, 57,159, 45, 69, 67,133, 75, 72, 8, 74,217, 4,243, 28,107, 65,114,134, 28,192, 19, 72,150,215,216,116,216, +247, 29,143,240, 35,215, 20,246,103,146, 44,245, 78,252,176,174,237,171, 80, 54,208, 8, 14, 67, 30,182, 4,169, 0,130, 8,141, +150,215, 27,108,165, 82,240, 65, 91,130, 60,226,182,132,167,101,192,151, 29,238, 83, 25, 20,197,120, 81,158, 74,218, 87,253,240, + 30, 74,156, 5, 56, 40, 82,144, 70, 78, 52,237, 90, 94,211,206, 31,238, 61,215, 87, 13,251,187,120,211,246, 99,125,216,166,219, + 53, 27, 46, 70,225,213,169,180,173,188,223,218, 29,126, 20,116,211,238, 11, 14,254,117,214,224,219,183,114,235, 2,165, 77,157, +110,215,151, 5,255, 0,172, 41,143, 26,124,233,201, 95,132,215, 47,235,155,134,253, 49,169,137,139, 33, 17,217, 13,120,112, 82, + 15, 49,240, 35, 44,163,195,112,169, 32,252,110,120,100, 14,255, 0, 6, 84, 78,117,197,111,105,134,220,238, 93,231, 65,219, 45, +247,167,109,213,197, 90,217,251, 58,155,114,237,149,225,186, 16,105,102,169,111,209,111, 26,133,206,237,223, 6,220,186, 37, 68, + 46, 57, 71, 74,105,117,120,239,199,126, 99, 76,195, 90,234,170,101,153, 10,125, 14,182,139, 3,128,178,227, 14,113,200,102, 49, +197, 94,146, 41, 26,186, 58, 14,100, 76, 1, 54,102, 4, 50,105,239,205,107, 48,109,241, 25,226,106, 58,222, 29,225,154,236,230, +154,152, 85, 54, 88,209,177,136, 41, 60,216,218,101,137,193, 42, 24,198,232,143,175, 85,138,168,137,139, 93, 73, 6,112,183, 37, + 78,163, 2, 75,208,150,135,161,212, 82,216,153, 17,169,141,173,151,176,166,195,172,115, 50,232, 25,142,243, 42,192, 88,248, 20, +135, 67,169, 82,146, 1,214, 30,110,102,229, 6,164, 37,229,248, 15,167,153, 14, 21,167,199,131, 45,149, 41,178,218,193,232,133, + 37,208,234, 20,133, 14,138, 74,146,161,200,172,136, 53,240,131,237,106,226,159,133, 24, 84, 59, 53,218,219, 59,239,178, 52,133, +176, 33,109, 62,233,213, 42,115, 87,110, 83,210, 19,207, 27,108,183, 21,133,187, 86,176, 89, 90, 16,222, 98,161, 83,232,235, 9, +248,233, 74,207, 48,145,223, 13,254,212,238, 15,184,152,159, 78,162,209, 47,183, 54,118,249,175,188,219, 14,237, 94,249, 74,164, +218,245, 37, 92, 79,169, 49, 99, 27, 63,112,216,112, 91,183,164,105,106, 74, 80,226, 84,253, 38,123,107, 83, 14,125, 94,162,183, + 66,108,186,204,183, 48,166,102,149, 71, 62,156, 30,169,168,233, 30,174,159,105, 0, 23, 14,192, 50,168, 43,245,131, 77,196, 95, +135,248,215,135,243,244,142, 40, 42,125,147, 48, 63,251, 60,246, 73, 9, 31,170,141,253,220,164,236, 80, 35,107,102, 86, 28,176, + 93, 65,235,149, 54,227,231, 82,252, 98,143,120,111, 30, 50, 3,153, 10, 74,242,148,190,207, 95,141,149, 1,219,201, 64,160,158, +157, 92, 10, 45,120, 41, 72, 30, 42,210,211,129, 60,138, 36, 39,194, 40, 56, 9,201,199, 34, 15,194, 82,125, 71, 47, 98, 51,173, + 78, 57, 42, 4,150,225, 74, 68,136, 85, 24,204, 38, 66, 27,148,194,153, 91,140, 60,112,210,188, 53,165, 42, 92, 71, 18,144, 65, + 31, 2,199, 43,141, 41, 93, 9,204,232,245,213, 45, 41,192, 82, 28, 24, 15, 5,245, 67,125, 1,240,211,143,214, 37, 36, 97, 93, +148, 8, 56, 7, 58,212, 89, 53, 45,155,126,155,250,244,189,247,220,131,214,195,222, 7, 80, 36, 83, 0,111,109,143, 66, 55,176, +233,219,176,244,244,232,113,182,208,103, 41,109, 2,130, 8, 28,170, 10, 7, 24, 72, 25,194,155, 35,170,130,179,216, 16,115,215, + 3, 58,111, 43, 10,114,143, 57, 62, 8, 83,116,247,138,158,104, 35, 42,247, 7, 50, 75,237, 35, 36,226, 62, 87,206, 17,241, 16, + 21,132,140, 32, 1,125,182,231,180,168, 76, 58, 9, 40, 84,116,130,133, 30, 98,133, 5, 4,164,144,145,213, 29,122,131,213, 61, + 0, 36, 29, 13,118, 6,157,142,165,164,161, 74, 66,131,137, 36, 16, 75,137, 11,198, 66, 58, 1,225,133,117, 7,177,199, 76,105, +179, 52,167, 21, 20,206, 20, 94, 88,188,203,247, 14,159,247, 13,175,219, 99,141,204,138,188,229,245,233,172,222,154,164,132,144, +123,143, 71,223, 96, 84,155,244, 59,106, 94,135,127, 84,218,177, 40, 8,109, 77,171,152, 21,173,176,163,224,169, 71,153, 72,125, + 10, 73,232,160, 71, 80,122,228,147,140,224,235, 37,102,160, 10, 82,164,185,132, 45, 57, 74,215,202,149, 96,228, 37, 5, 93, 73, + 30, 65, 68,115, 96,128, 73,233,134, 98,157, 41, 13, 56, 75, 78,101, 30, 32, 41,200, 60,139,109,106, 31,174,223, 79,137, 36, 30, +189,207, 76,140,117,214, 72,221,101, 45,182,162,165, 36, 32,100,243, 41, 75, 81, 70,115,204, 0,245,193,235,219, 60,157,117, 24, +134, 67,166,254,131,225,214,223,195,240,185, 63, 9,141,122, 6,118, 85, 58,239,247, 92,246,191,191,212,255, 0,166, 51, 26,229, +207, 71,161, 82,171, 21,250,253, 86, 21, 10,222,160,210,170, 53,218,245,110,162,164,183, 78,161,208,104,176,228, 85, 43,117,153, +206, 45, 73, 9,137, 18,151, 18, 91,238,228,225, 72,142,160,158,165, 57,252,241,248,236,226,198,175,198,143, 19,187,139,190,210, +211, 34, 37,167, 54, 67, 54,134,209, 80, 36, 40,149, 91,187, 67,106, 59, 42, 29,153, 29,224, 82, 63,247, 86,123, 78,203,172, 84, + 21,128,163, 54,224,117, 10,232,210,117,219,143,110, 55, 31,168,247, 9,220, 13,237, 45,117,106,153, 60, 65,155,196,245,118,153, + 33, 73,250,186,148,129, 22,167,110,108,123, 50,218, 88,204,249,174, 8,181, 59,157,180,158,102, 99, 49, 2,144,247, 42,222,154, +216,140, 58,201, 42, 87, 55, 92,245, 24,242, 62, 93, 51,208, 99, 86, 23, 10,101,174,168,115, 74,133,179,204,161, 98, 4,110, 35, +184, 38, 79,255, 0, 83,109, 63,224, 1,129, 34, 76,115,135,139, 28, 75, 29, 69, 68,124, 51, 69, 46,168,168, 95, 93, 91, 41,184, +105,192,178, 67,126,252,133, 36,200, 55,250,214,208, 64,120,119,164,226,207, 66, 6, 58, 99, 61,253,127,110,168, 40,146, 14, 79, +145, 3,176,234,117,236,175, 32,140,119,245,254,173, 14,178, 50, 7,166,115,251, 53, 54,197, 56, 6,195,215,223,143, 26, 25,222, +163,190,112,127,103, 95,199,190,136, 80, 4, 28,249,117,233,242,208,171,236, 62,223,191, 74,170,144, 55, 30,252, 27, 3,172, 12, + 19,233,219,241, 26, 21,194,122,100, 96, 15, 50,122, 99,167,203, 68, 45, 88, 7,168,198,127, 12,119,207,207, 39,246,104, 39, 14, + 65,238,122,244,207, 92,117,243,209,240, 49, 73,194,122,158,135,167, 78,221,191,225,160,214, 70, 49,230,127,175, 85,214,124,179, +246,254,237, 12,162,115,131,131,230, 15,203, 74,168,176, 3,231,255, 0, 56, 24,164,161,156,124, 57,251,241,165,175, 42, 81, 4, +128,123,105,104,248, 61,215,161,234, 61,195, 9, 4, 17,131,140,142,223,159,183, 85, 65,193, 7,254, 56,208,233, 56, 57,252,117, + 84, 28,245,242,237,243,207,245,104, 16, 14,221,176,115,176,176,216,246,251,173,130,144,113,212,117, 31,209,147,251, 52, 64, 81, + 7, 3, 57,199, 92, 12,227,237,208,169, 35,151, 56,237,220,122,227,174,171,161, 97, 64, 96, 17,233,247, 31,233,206,144, 35,125, +251,225, 50, 15,218,181,186,127, 44, 28,217, 61,137,207, 79,219,211, 69,160,115, 4,228,115, 96,228, 12,227,183,110,191,142,129, + 66,176,164,143, 53, 1,246,117,209,136, 61,199,167, 81,162,144, 13,182,219, 5,193,232, 56,201, 61,187,103,231,233,170,157, 57, +128,201,237,219,190,122,158,195, 61,244, 58, 14, 70, 85,219,229,220,254, 78,137, 78, 6, 9,248,142, 58, 30,199,229,215, 73,176, + 32,251,176, 49, 85,178, 80, 71, 49, 24, 29,179,128,122,159,234,206,170,161,228,172,227, 5, 63, 51,208,106,130,129, 57, 36, 12, + 43,246, 12,103,250, 53,245, 33, 41, 28,169, 39,168,200, 39,169,243, 62,154,215,113,110,214,192,193, 69, 75, 80, 41, 11, 40, 72, +242, 79,235, 44,117,198, 14,142,138, 84,193, 74,208,181,165,208, 82,164,172, 44,165,214,212,133, 5,182,227,107, 79, 84, 56,149, + 0, 82, 71,108,122,116,213,184, 21,116, 32, 12, 36, 16,175, 92,121, 99,240, 58, 41, 11, 82,192,198, 50,156, 1,158,159,143,207, + 73,144, 8, 32,238, 14, 5,200, 32,131, 98, 8, 32,251,198,227,247, 28,108, 53,141,190,213,107,108,134, 43,180,182,171,204,124, + 41, 19, 35, 60,136, 85, 18,145,128, 11,205,175, 13,186,160, 60,210,164,149, 28,156, 13,108,141,181,197, 54,220, 70, 82,197, 66, +151,116,195,121, 72,202,146,221, 49,185,109,229, 32,244, 75,141, 75, 60,221,199, 95, 93,115,201, 4,164,124, 94,189,207, 82, 7, +168,253,186, 37,176, 66,144, 22, 84,164,142,169, 32,227,161,236, 8,243,244,251,245, 28,174,225,188,174,181,153,164,137,162,103, +235,203,114,160,244,191,151,117, 31,114,140, 91,121, 55,141,220,125,147,211,199, 74,107,169,243, 88,225, 80,170,107, 41,214, 89, + 52,139, 90,242,161,142, 87, 35,177,119,115,110,248,235,133,191,199,206,218,219, 45, 52,170,125,157,118,214,229, 55,146,132,186, +136,148,166,213,201,219,244,179,102,224, 18, 71,250,170, 3, 29,180,196,241, 5,199, 86,232,111,197, 1,251, 8, 50,221,147,182, +143, 56,211,211,237, 58, 60,167,100, 74,185,156,140,226, 94,138,213,215, 87, 83,109,251,229, 61,183,144,219,158,226,195,104,140, +227,141,161,111,151,249, 82,145,162, 3,148,130, 92, 5,192, 20, 20,148,231,148, 55,212,227, 4, 14,186, 61,162, 86,176,146,225, + 80, 56,228,194,113,201,219,161,207,235,116, 56,211,117, 47, 5,112,245, 21, 84,117,201, 69,207,170,132,134, 71,149,218, 77, 12, + 8, 33,149, 73,229,134, 82, 46,173,163, 82,145,169, 72, 32, 28, 53,241, 15,138,188, 97,196,116,243, 82,213, 84,195, 69, 77, 80, + 10,200,180,176, 44, 69,212,245, 83, 35, 25, 38, 10,219,134, 85,145, 85,193, 42,192,169, 32,158,135, 75,235,241, 20,165,243,156, +130,149,228,227,191,234,252,191,175, 69, 53,226, 20,169,146, 9, 42, 80, 87, 50,134, 0, 79, 79,192,118,208,142, 44, 52,130, 84, +175,137, 56,248,146, 49,143, 64,122,117,233,170,145,222, 81, 66, 66, 73,248,178, 73, 87, 82, 79,108, 12,246, 29, 53, 36, 61, 54, + 29, 62, 70, 43, 94,183, 35,123, 91,175,205,241,136,238,148, 54,166, 91, 20,250,139, 88, 47,209,166,170, 59,233, 79,254, 76,255, + 0, 80,172, 99,160,230, 39,240, 58,198,120,103,221, 57,187, 25,196,150,199,238,244, 21,134, 94,176, 55, 62,210,175,186,181, 28, + 15,112,143, 87,142,138,146, 84,113,217, 84,215,101, 39,255, 0,165,167,117,218,108,106,205, 62,177, 68, 90, 2, 93,157, 79,120, +165, 71,245, 68,134, 82, 86,218,243,228,123,254, 61,245,167, 85, 38, 11,109,188,210,135,233,152, 91,140,184,160,122,120,145,212, + 83,145,142,255, 0,171,251,117,187, 66, 18,104,170, 41, 36,251, 18,234, 83,255, 0, 68,162,196,254,253, 93,251,227, 20,149, 82, +101,249,133, 45,100, 91, 73, 4,145,202,189, 62,212,108,174, 63, 16, 49,250,180,211,238,200,245, 37, 67,171,211,156, 15,194,174, + 65,129, 89,167, 45, 4, 20,189, 10,173, 21,153,145,214,133,121,160,178,242,122,249,231,190,180,239,217, 89,188,242,168, 28,101, +113,223,195, 53, 74,165, 21,248,241,110,200, 59,151,105, 48,148, 54,212,150, 99, 85, 66, 25,171, 70, 90,211,133, 72, 8,121,198, +149,215, 37, 35, 61,129,214,138,112,241,237, 18,181,246,247,217, 85,195,199, 23, 55,221,185, 92,188, 87,110,170,222,216,155,158, +135, 70,113,168, 85, 74,133,213, 66,154,237,182,137,209,228,212, 2, 90,247, 81, 18, 12,119,150,178,172, 40, 40,165, 36,172, 99, + 92, 76,225,195,218, 43,112,108,191,180, 68,241,163, 87,137, 53,218, 13,213,121, 85, 13,251,109, 69,117, 79, 59,252, 93,220,210, + 61,214, 85, 57,148,140, 9,179,169,240, 12, 87, 90, 24,253, 35,176,207, 39, 85,140,213, 94,201, 95, 89, 89, 81, 50, 68, 88,229, + 41, 44, 77, 97,114,211,137, 33, 50, 70,130,251,177,141, 24, 11,126,210,130,124,216,234, 92,247,139,178,110, 30,135,135, 86, 26, +240,171,156,212, 69, 53, 68, 96, 18, 70, 89, 60, 14, 18, 89, 46, 45,161,102,104,166, 0, 18,247,167,107, 0, 6,255, 0,166, 5, + 42,103, 57, 65, 82,185, 64, 32,133,247,194,134, 58, 28,253,191,183, 79,189,167, 40,130,133, 15,136,130, 15, 48,207, 92,244,234, + 62,127,191, 90,215,182,213,122, 45,249,108, 90, 55,197,175, 49, 85, 11, 94,248,160,211,110, 91,114,123,145,228,195, 92,170, 77, + 82, 51,114,163, 41,232, 51, 90,109,232,174,134,220, 0,165,196, 37, 67, 29,181,181, 22,173, 32,176,218, 22,172, 0, 58,144, 15, + 48, 35,161,232, 51,211,182,149,165,204, 0,210,250,182, 96, 8, 55,216,131,107, 17,234, 8,177, 7,208,223, 12,252,106,244,209, + 69, 44, 79,229,112, 89, 74,158,160,131,165,148,142,161,131, 2, 8,234, 8, 32,216,139, 99, 84,189,166, 92, 73, 94, 92, 36,240, + 71,190, 60, 72,109,253,170,139,190,243,218,251, 81,202,181, 6,152,247, 63,185,197,151, 53,246,105,136,172, 84, 2, 7, 50,224, + 67, 84,180,200,117, 35, 4,165,140, 2,158,227,242,123,220, 13,193,188,183,102,246,187, 55, 70,255, 0,174,202,185,175,125,193, +184,106,119,117,217, 95,154,225, 92,154,165,106,179, 33, 82,165,200, 61,127, 70,202, 74,130, 26, 64,248, 91,109,180, 33, 32, 37, + 35, 95,176,103, 17, 91, 65, 79,226, 3, 96, 55,155,100,106, 73,104,195,221, 29,180,188, 44,162,167,194, 11, 49,228,215,104,147, + 33, 65,146,176,160, 71, 43, 83, 28, 97,207,145,107, 58,252,126,111,173,183,174,109,101,223,114,237,205,200,243, 14, 87,172,107, +134,183,104, 86, 21, 21,196,191, 31,235, 27,118,163, 34,153, 41,108, 62,142,143, 50,181,199, 42, 74,135,250,248,242,211,205, 11, + 23,205,103,169,168,185,146,170,158, 46, 83,159, 68,102, 90,132, 67,211,202, 69, 43,202,122,183, 50, 37, 98,121,105,106, 87, 55, + 74,198,201,233,231,141, 79,232,234, 57,204, 82, 16, 6,132,158, 85, 50, 83,153, 27,174,169, 99, 74,129, 10, 55,149, 68, 19,180, +118, 47, 41, 56, 67,100,168,171,151,155, 61, 79, 95, 60,122, 15, 61, 35,130,164,243, 43,195,200,232, 85,144,149, 30,190,103,160, +235,163,138, 10, 81,148,161, 61, 1, 57,207,196, 1,237,229,215, 58,179, 73, 73,100, 1, 32,169,109,175, 10,108,133,117, 65, 61, + 64, 35,211,190,164, 33, 71, 78,184,138, 6, 12,221,108,127,211,249, 99,203,205, 18,188,146,148,164, 30,157,114,114, 49,212,122, +121,235,227,237, 45,212, 2, 7, 84,167,184, 57,230,251,255, 0,214,210,105,196,231,225,201, 72, 78,112, 71,161,193,239,249,235, +162,163, 54,227,231, 9,229,102, 56, 25, 86,126, 37, 18, 58,142,158,154, 26, 64,223,165,177,147,211,115,112, 58,252,252,223, 22, +213, 70,117,150,146,176,201, 81, 88,230, 39, 35,152, 1,253, 61,115,159,248,104,168,146,144,231,232,202,255, 0, 85, 56, 40,229, + 0, 30,157, 78,124,245,114, 83, 5, 65, 72, 11,202,122,142,131, 4, 30,196,245,208, 41,136,220, 55, 57,130, 80,160,172,229, 74, + 5, 71, 24, 57,192, 61,188,255, 0, 13,102,195,174, 10, 13,246,245,219,231,231,243,194, 75,106, 66,138,139,202,121, 62, 73, 39, + 41, 64,244,249,235,195,175,165, 29, 16,164,129,215, 3,176, 10,244,237,242, 58, 13,247, 86, 20,162,210,241,205,219, 9,199, 76, +118, 57,252,252,244, 57,121,183, 22, 18,162,114, 8, 46, 36,167,166,122, 30,132,122,147,160, 1, 61,122,224,218,109,176, 59,124, +252,244,193, 73, 62, 42,249,210,160,160, 6, 10, 58, 4,243,117,237,215,174,169,202,116,144,148,163, 9, 35, 41,232,112, 73, 35, + 26,244,226,149,225, 44, 52,218, 83,202, 50, 6,112, 73, 3,166, 20, 60,186,106,200, 38, 56, 22,159, 25, 41, 42, 74,136,229, 35, + 39,237,230, 7, 25, 25,253,154,205,172, 79, 99,140,129,115,240,254,120,124,184,115,189,156,218,173,243,217,253,196,140,226,154, +114,201,221, 29,189,186,157,144, 2, 28, 76,104,148, 91,202,137, 62,170,234,144,226,146, 10, 19, 71,106,164, 78, 72,192,235,229, +214, 89,252, 84, 79,135, 38,165, 91,167, 64,144,125,222, 21, 90, 83,212,194, 9,203,148,103,102,202,149, 75,147, 29,226,231,198, +199,134,165,180, 86,174, 83,250, 48, 82,145,204,117, 12,134, 36, 32, 58, 89,144,219,141, 68,148, 28, 97,215, 25,112,135,124, 41, + 13,150, 30, 13,148,156,182,191, 13,197,224,142,160,224,143, 93, 73,106,193,222, 9,123,221,195,158,213,110, 37, 84, 5,220,177, +173,145, 99,221,170, 9, 90, 82,245,211, 97, 33,139, 66,186,235,106,113, 41, 18, 89,144,221, 38,151, 80,109,206,169,241,170, 79, + 3,133,165, 68,213,126, 32,229,133,243, 12,131, 53, 81,228,136,205, 3,157,175,169,213, 36,139,223,107, 71, 40,244, 5,135, 82, +109,142,146,250, 55,230, 49,199,158,230,217, 92,205,165,166,142, 42,152,199,111,171, 99, 12,173,241,188,212,235,255, 0,117,239, +229,177,215, 10, 45,116,211,119, 43,112,233,170, 37,182,230, 76,183, 43,177, 16, 48, 67,141,212,104,203,167, 84, 84,210, 85,250, +200,247,186, 39, 42,135, 76,169,127, 17,201, 25,126, 41,181,229, 37, 94,246,130,227,139, 83, 98,158,134,210,180,160,134,139,132, +169, 8,228,234, 57,157, 60,196,119, 33,160, 58, 3,173, 54,220,106,162,232,187,147, 64,173, 32,128,221,114,157, 86,182,101,168, + 2,112,236, 98,110, 58, 71, 42, 0,200, 82,156,139, 85,108,168, 12, 37, 47, 14, 99,215, 89,237, 42,241,122, 42, 89,121,149,120, +143, 68,240,228, 71, 67,193, 97, 42,112, 20,248,104, 82,146, 14, 81,149, 36, 43, 61,130,149,202, 79, 77, 54,154, 98,201, 79, 48, + 93,157, 23,215,245, 64,140,254,242,183,247, 3,113,214,216,234,185,107, 85, 90,190,153,200,103,134, 73, 8,185,181,196,141,207, + 0,122,217, 95, 77,199,166, 54, 18,161, 94,151, 79,143,238,201, 90,156, 74, 11,144,195, 67, 45,167,222,100,242,185, 41,107, 79, + 47, 68,161,128,211, 94, 17, 4,143,139,237,214, 33, 94,188,163, 65,166, 48,194, 95, 91,117, 54,202,144,132, 54,165,128,183, 95, +199,188,184,162,159,133, 33, 12,114, 39, 3,184,113, 99, 62, 90,108,110,125,200,155, 57,192,243,237, 54,135, 98, 37, 65,105,104, +184, 83, 38, 67,170, 74,157,117,106, 82, 65,231, 43, 42, 36,158,164, 28,103,182,152, 91,179,113, 22,203, 82, 31,144,227,141,177, + 29,133, 60,243,188,138,117,126, 27,202,229, 79,134,132,140,173,213,186,224, 64,230, 35, 28,249, 82,146,156,168,109, 83, 80,180, +133, 70,155,131,247,250, 91,173,253,215,233,123,143,190, 31,153,230, 40,116,234, 94, 76,155, 11, 13,199,112,250,136, 0, 48,181, +193, 30,164,142,215, 14, 21,209,121,205, 91,172,198,128, 37,214, 37,203,151, 18,147, 71,162, 69, 74,158,159, 91,173, 84, 31, 76, + 74, 61, 38, 10, 82, 57,149, 46, 76,199,210,132, 36,116, 79,141,204,122, 13, 72,111,103,182,153,253,140,217, 59, 59,105,234,166, + 43,245,214, 40,146,102,238, 75,165,136,243,169,213, 75,230,241,120, 86, 47, 54, 36,211,230,178,227, 21, 26, 75, 53, 55, 26,167, + 24,207,180,236,119, 35,210, 16, 22,218,146,117, 21, 91, 99,137, 58,134,192,111, 54,211,110, 76,122, 84, 42,181,197,100,221,246, +174,224,205,167, 84,216, 19,169,212,123, 66, 37, 89, 42,151, 77, 97,181, 39,195,159,114, 79,128,212,245,169,240, 22,212,111,116, +105, 13,225, 69, 58,152,173,218,236, 42,179,108, 87,233, 14,186,253, 46,181, 6,157,112, 82, 30,120, 56,211,238,209,110, 10,124, +106,204, 5, 62,219,128, 41, 18, 61,194,107, 60,193, 64, 44, 45, 4, 30,186,117,106,119,163, 48,188,177,253, 92,232,116, 31,218, +177, 26,182, 29, 0, 5,108,118, 44, 24,145,181,142, 35,114,231,116, 85,239,152,101,148,181,162, 92,195, 43,146, 35, 87, 18,135, +188, 13, 42, 22,128, 23, 42, 35, 98, 66,200, 24, 35, 57,137,208,164,161, 30,202,120, 41,197,183,177,147, 96, 55,194,117, 82,245, +225,250,163, 11,134,125,197,158,169, 14,206,182,216,166, 75,169,236, 93,114,190,156,248,141,189,108,196, 90,166,237,169,121,196, +181,250,106, 40,147, 79, 30, 49,116, 81,219, 78,117, 26, 30, 33,248, 90,223,142, 22,238, 53, 90,251,235,183, 21, 75, 77,169,146, +228, 66,162, 92,232, 13, 87,118,250,239,240, 22,241, 75,150,189,233, 78, 11,167,214, 10,153, 99,198, 17,203,141,204,109,181,161, + 79, 69,104,144, 53, 62, 58,210, 27,142,235,239, 21,135, 25, 12,160, 78,108, 32,130, 2, 20,150,218,156,215,108, 60,148,173, 41, + 88, 7, 42, 65, 24, 28,201, 25,193,174,203,122,131,116,219,213,139,110,241,182,232, 55,173,161,112, 70, 84, 43,170,207,186,169, + 84,234,253,183,113,211,152,109, 97, 46, 84,104,245, 86, 28,142,237, 70, 59, 5,226,196,128,132,200, 66, 22,182,154,125,146, 80, +180,201,178,222, 38,170,167,211, 29, 71,246,200, 86,223,104,218, 69, 29, 1, 87,177,189,186,233, 96,214, 30, 85, 40, 0, 56,170, +184,143,195,156,143, 60, 18, 84, 69, 23,232,156,193,247, 18,194,160, 70,237,183,247,176,221, 84,146, 79,219, 83, 27,110, 29,203, +146,109, 13, 30, 23, 61,163, 28,100,240,219, 38,149,107,237,182,228, 73,189,236,148, 58,150,218,218, 61,216, 67,151,221,136,166, +144,210, 25,240, 41, 6,169, 45, 53, 11, 53, 66, 58, 57, 80,186, 76,248, 97,190, 98,160,218,142,164,109,178,158,214,237,167,175, + 65,161,127, 41,109,181,191,248, 74,174, 85,212,196, 72,247,141,118,159, 86,189,184,118,184, 38, 56,243,200, 67, 20,205,205,163, + 65, 92,187,103,244,108,243,134, 42,113, 37,120, 42,121, 41,114,160, 80, 84,117,167,220, 73,251, 19,182,242,247,150,245,217,194, + 29,220,173,162,186,165, 45,185,180,237,176,187,166,214,235, 27,115, 85,154,242,203,141, 53,105,221,169,247,138,213,131, 33,111, + 58, 60, 24,243, 19, 85,132,218, 80, 19,227,198, 71,195,173, 7,218,190, 57,120,161,246,121,238,117,107,135, 46, 42, 54,246,212, +222,125,182, 66,215, 76,220,221,149,190,133,155,115,191, 81,182,165,170, 84, 41, 82,173,155,198,146,212,216, 50,159,240,155,121, +200,241,235, 44, 76, 97,206, 80,135,152,140,178,151, 90,121,170,146, 44,222, 17, 46, 79, 77, 21,101, 90,144,210, 68,210, 26, 90, +141, 23, 26,157, 24, 36,177, 72,226,224,221,193, 66, 60,166,100, 39,106,230,105,184,247,129,158, 20,172,144,102, 25, 56, 96,130, + 73, 11, 77, 13,172, 72, 85,114, 4,208,176, 63,238,220,198, 0, 12,193, 90,219,205,107,111, 55, 22,222,185,109,106, 77,203,105, + 92,212, 27,170,209,172,183,227,209, 46,123, 90,179, 79,185, 45,186,219, 47,160, 44, 55, 78,175, 80,230, 63, 25,215,130, 20, 20, +227, 72,116,188,206, 64,121,180, 19,141,103,175, 87,204,134,148,133, 47,152,148,124, 42, 90,135, 81,202, 0, 79, 42,142, 57,128, +233,159,246, 64, 39, 57, 58,138, 47, 16, 27, 71,120,112, 95, 98,211, 61,164, 94,203, 13,207,174,217,124, 50,238, 29,187,102,110, + 70,229,240,243,119,189, 42, 85,155, 77,162,222,245, 72, 16, 41,117, 22,108,155,169,231, 90,184,109, 7,235, 46,162,151, 58,152, +243,203,175,208,101,130,245, 6,171, 58,144, 89,145, 18, 68,155, 3,127,214,247,155, 98,118,115,120,231, 91,109, 90,114,247, 99, +108,236,173,194,145,108,177, 83, 77, 90, 45,188,253,219, 67,139, 87,122,147, 14,164,243,190, 44,248, 45,185, 37, 98, 59,143,101, +242,194,155, 18, 15,188, 7, 73,143,214,196, 35,167,138,170, 9,185,212,211, 51, 37,153,116, 75, 28,128, 41, 49, 75, 29,205,152, + 95,170,150, 83,177,218,235,123, 43,134,115,213,207,218, 72,189,141,233,170,169,213, 93,148,221,209,145,142,149,120,220, 40,189, +200,177, 4, 41, 27, 0, 8,185,198,215,109,149, 22, 37,219,112, 75,167, 73,165, 92, 21,191,118,183,110, 26,195, 20,107, 85,228, + 68,174, 84,165, 82,105,206,202, 98, 44, 87, 92,162,212, 48,165, 45,180,169,192,152,142,168,161, 4, 36, 36,229, 99, 64, 56,226, +223, 77,219,218,203, 74,243,176,184,111,131,100,212,184,131,106,210,106,188,182,174,237,198,176,104,236,108,117, 26,191,107,238, + 45,231, 67,159,114, 83,238, 42,188, 53,220, 59,203, 46,201,218,125,206,169,219, 54,146, 99,166,100,164,216,146,234, 18,227,161, + 2,157, 2,167,204, 14, 62, 61,170,123,199,195,134,245,239, 23, 13,187,105,102,194,182,165, 83,246,238,171,105, 84,183, 81, 53, +244,170,245,137, 87,220,107, 45,183,233,117,187, 54, 41,166, 73,133, 64,143, 76,250,217,135,130,156, 67,211,229, 61, 20,165, 50, + 32,160,164,235,150,155,127,199,229, 2,218,166,220, 17, 47,141,155,184,239,201,213, 27, 39,106,105,180,122,212,125,229,250,134, +170,214,227,109, 78,199,111,230,200, 68,190,174,249,149,109,181,172,187,121, 82,106, 16, 56,129,184, 42,147, 41, 97,218,124,229, + 79,183,224, 36,215,213, 28,203,110, 70,206, 69,195,144, 85, 69, 5, 70, 98,154,105,203, 23, 84, 82, 9,145, 88, 2,188,203, 43, + 29, 22,223, 64,107,155,217,130, 11,134,211,227, 63, 18,206, 91, 83, 89,150,100, 83,153,115, 5, 2, 9,166,100,112, 41,101, 77, + 75, 50,195,172,141, 83, 43,150, 83, 39, 47, 66,149,186, 60,183, 82,141,110,225,240, 39,196,221,155, 81,191,231,222,141, 89,213, + 55,237, 88,247,245,205,127,221,171,222,173,181,185, 61,226,240,182,175, 86,237, 91,186,211,159, 89, 98,236,113,202,246,245, 75, +190,106,209,152,110,218,100, 61,112, 84, 36,212, 28, 91, 16, 22,220,105,170,139,127,159,236,242,222,186, 77, 26,239,166, 87,232, +112,233,215,213,183,115, 90,106,118,188, 55, 27,106, 92,217,154, 61,128,237, 3,137,199,119, 10,177,114,223, 77,221,139, 75, 53, +122, 53,223,195, 53,253, 73,112, 71,241, 98,181, 54,200,172, 83,221,113,115,223,163, 51, 57,230,147,199, 5,183,187,182,199, 20, +139,188,118,233,203, 98,159, 84,186,183,115,137, 91, 34, 52, 27,238, 84,170,188, 61,236,220, 94, 32, 44,203,171,108, 40,237, 75, +107,110, 95,141, 88,160, 80,145, 95,186, 77, 97,137,205, 83, 25,174,211,162,188, 99, 84, 40,149, 52, 64,143, 46,157, 75,218, 83, +101, 77,186,105, 19,162,236, 45,249,108,218, 84, 43,254,198,220, 58,109, 34,211,226, 14,155, 2,237, 19,173,203,215,141, 77,199, +186,173,217,247,125, 99, 98,170, 16,170,182,125,110,232,227, 78,236,167,187, 2, 77, 5,212,166,211,181,219,161, 84, 87, 88,151, + 81,153, 91, 22, 42,173, 58,216, 2, 66,109,243,176,249,247,227,159,188,172,197,153,181, 23,220,146, 73, 36,158,189,183, 55,238, +119,191, 83,134, 79,133, 94, 26, 54,163,119, 40, 23,245, 15,114,220,191,142,226,213, 56,139,225,227,133,189,165,172,237,181,249, + 97,155, 30,221,191,119,242,131,196, 96,167, 93,151,172, 39,236,250,202, 55, 62,208,102,241,218,107, 53,128,138, 37,126,130,149, + 83,107, 53, 9,204, 84,230, 17, 17,189, 55,212,190, 3,248,146,172,211,160,212,169,214,189,181, 33,186,142,219,211,247, 54, 44, + 95,227, 14,196,106,162,186,125, 98,181,178,180, 58, 45,166,105,207, 92, 9,120,110,100,217, 28, 70,108,107,177,109,190, 79,173, +221, 99,115, 41,203, 76, 94, 97, 37, 17,242,109,137,226,246,211,217,104,251,163, 81,127,101, 62,187,186,171,187,235,180,188, 70, +108,210,237,235,249, 22, 93,137,180,219,153,179, 84,221,245,137,101, 55, 93,179, 23, 99,212,230,110, 13,155, 14,126,244, 71,153, + 30,155, 22,183,110, 58,135, 44,136,172,191, 58, 84,105, 79,178,151,218, 87,181, 90,244, 52,109,183, 49,108, 26,164,171,191,110, + 45, 11, 30,153, 2,181,115,110, 83,149,219, 97,171,198,196,221, 46, 9,183, 14, 21,126,223,177, 98,217, 80,152,183,109,137, 17, +184, 39,182,216,149, 73,247,169,115, 94,157,126,212, 38,174,188,170,109, 62,145, 66,136,100, 17, 21, 93, 71,204, 47,211,227,220, +219,115,111,195,225,108, 1,107, 11,252,252,239,134,106, 63,179,199,115,133,155,125,215,171,187,135,179,118,237,197,106,110,150, +201,109,205, 10,223,153,185,246, 52,250, 21,249, 15,122,172, 61,215,189,169, 23, 85,173,123,210,110, 87,226, 85,161,161,221,180, + 69, 50, 35, 16,154,153,245,133, 70,101, 86, 39,143, 18,101,191, 50, 43,173, 61,131,193, 94,250,238,142,241,110, 54,200, 89,144, +172,105,247,150,215, 94, 63,197,253,209, 54,126,230, 88,150,253,156,245,230,245,238,157,187,165, 91,118,205,231,112, 87,162,211, +175, 26,213, 74,234, 15,179, 73,139, 75,126, 92,138,179, 48,164, 75,167,183, 38, 43, 46, 58,157,172,107,218, 71,106,187,184,205, + 93,151, 6,202,110, 37,197,110,209,175, 29,134,190,172,246, 39,241, 13, 5,253,203,160, 93, 60, 62,109,135, 18,118,213,139,112, + 73,220, 10,142,200, 73,165, 84,170,177,119, 63,136, 8, 23, 60, 70,218,180,225,210,217,143,182,241, 40,114,169,117, 3, 80,155, + 86, 12, 7, 9,252, 89,216,124, 52,223,247, 21,199, 92,217,203,159,115,109, 71,183, 27,106,119, 94,200,183,218,221,216, 86, 93, +205,110,222, 91, 37,184,134,249,219,247, 46, 91,196,109, 93, 86, 53,227, 71, 49,101, 84,161,213,227,179, 69,164, 59, 61,217, 13, + 76,139, 38,154,150, 85, 17,245,109, 21,212, 94,194,230,253,122,118,237,252, 63,118, 51,229,219,231,249, 97,202,188, 61,155,155, +199,118,239,117,185,183,155, 45,111,219, 48,169,151,253,165,181,247, 29,144,197,255, 0,186, 86, 69,154,185,177,175,167, 54,191, +110,233, 53, 41,149, 43,218,189, 9,184,108,215,247,190,249,155, 69,160, 50,234,210,253, 65,250, 53, 77,200,172, 42,159, 74,151, + 45,166,227,134, 30, 29,118,127,120,246,186,191, 46,244, 59,148,198,229, 93, 91,162,198,209,109, 69, 98,214,187, 45,122, 85,145, +109,220,147, 54,155,112,111,218, 69, 66,255, 0,180,170,251,125, 80,157,121, 82,101,220,150,181, 18,154,240,167,215,104, 46, 83, +162, 85, 36,212, 19,245,147,172, 55, 5,237,158,182,189,170,118,111,241,175,183,251,177,186, 92, 50,213, 47,138,213,133, 67,216, + 27,113, 74,181,183,186, 14,223, 84,174,122, 47, 11,119,174,202,223, 59, 29, 14,226,170,191,178,245,148,204,114,158,230,219,222, + 52, 89,210, 61,212, 74,157,109,221,244, 74,100,119,233,207,218,140,207,171,105,175, 15, 60, 86,219, 59, 19,183, 23, 37,185, 55, +107, 42,215,157,246,197,244,141,202,218,155,189,189,196,135,110,218,246, 85,232,222,219,222,187,117, 26,163,120, 88,142,109,229, + 70, 70,225, 69,136,139,192, 85, 33, 71,143, 94,160, 33, 53, 10, 36,116,205, 53, 8, 43,126, 27,135, 2, 45, 74,111,229,107,222, +224,251,173,219,227,235,252,241,159, 47, 99,243,255, 0,140,109,229,209,192, 61,139, 67,254, 54, 13, 55,134, 30, 56,238,159,226, +247,134,189,165,221,155, 88, 82,239, 26, 58,127,141, 58,134,224, 29,184,254, 17,110,133,181,238,252, 37, 74,228,217,202, 39,240, +190,165,239, 17, 99,253,100,191,208, 49,227,221, 17,185, 92,241,117, 46,135,178,187, 35, 81, 28, 31,213, 31,183,183,186,171, 31, +122,172,157,204, 93,241,102,218,215,157,151, 58,233,188,119, 54,204,184,111, 91, 90,206,160,237,157, 94,102,218, 53, 31,110,232, + 55, 5,201, 73,181, 97, 62,229, 82, 21,212,253, 17,170,156,202,136, 53,143, 5,170,122,233,238,255, 0, 21,182, 21,251, 73,221, + 38,109, 61,163,187,173, 42,230,243,109,206,204,217,215,189, 66,226,221,186, 53,235, 74,102,187,180, 15, 88,202,106,225,181, 40, +212,205,160,161, 61, 71,164,207,141,102,114, 42,155, 50,125, 77,232,203,169,120,130,166,250, 89,240,157,111,237,173,252,177, 83, + 70,217,139, 67,114,246,121,205,192,178,182,194,199,221,235, 38,179, 78,133,124, 51,107,215,171,138,221, 10,189,205, 93,167, 93, + 54,173,114, 93,149, 85,143,101, 93, 20, 42,173,118, 11,240,157,147, 78,174, 70,121,218, 70, 95,139,225,190, 91,109, 66, 82,230, +223, 59,143,119,166, 50, 8,184, 3,231,127,135,166, 49, 78, 42,118,162,139,177,156, 68,238,246,208, 80, 63,132, 77, 83,182,246, +242,168, 91, 74,166, 93,239, 65,153,117,219,117, 40, 41,100, 86,172,219,150,169, 75,166,194,137, 94,175, 81, 43, 42,159, 72,151, + 83,133, 10, 28, 42,156,138, 35,149, 8, 81, 34,197,146,211, 13,173, 88,184,129,221,147,190, 91,193,122,238,130, 40, 10,181,162, + 92,146,233,172,210,109,231,107, 47, 92,147, 40,244, 11,118,135, 75,181,237,216, 53, 75,142, 68, 40,170,184,107, 72,161, 81,105, +222,253, 60, 68,134,137,147, 11,242, 90,133, 13,183, 81, 21,165,172, 21, 55, 58, 70,221,186,116,193,180,169,223,215, 31,255,217, +}; + diff --git a/source/blender/editors/include/BDR_drawaction.h b/source/blender/editors/include/BDR_drawaction.h new file mode 100644 index 00000000000..28f8af534fb --- /dev/null +++ b/source/blender/editors/include/BDR_drawaction.h @@ -0,0 +1,88 @@ +/** + * $Id: BDR_drawaction.h 11183 2007-07-06 09:59:18Z aligorith $ + * + * ***** 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 BDR_DRAWACTION_H +#define BDR_DRAWACTION_H + +struct BezTriple; +struct Ipo; +struct IpoCurve; +struct gla2DDrawInfo; +struct bAction; +struct Object; +struct ListBase; + +/* ****************************** Base Structs ****************************** */ + +/* Keyframe Column Struct */ +typedef struct ActKeyColumn { + struct ActKeyColumn *next, *prev; + short sel, handle_type; + float cfra; + + /* only while drawing - used to determine if long-keyframe needs to be drawn */ + short modified; + short totcurve; +} ActKeyColumn; + +/* 'Long Keyframe' Struct */ +typedef struct ActKeyBlock { + struct ActKeyBlock *next, *prev; + short sel, handle_type; + float val; + float start, end; + + /* only while drawing - used to determine if block needs to be drawn */ + short modified; + short totcurve; +} ActKeyBlock; + + +/* ******************************* Methods ****************************** */ + +/* Action Generics */ +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); + +/* 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); + +#endif /* BDR_DRAWACTION_H */ + diff --git a/source/blender/editors/include/BDR_drawmesh.h b/source/blender/editors/include/BDR_drawmesh.h new file mode 100644 index 00000000000..1c389799127 --- /dev/null +++ b/source/blender/editors/include/BDR_drawmesh.h @@ -0,0 +1,84 @@ +/** + * $Id: BDR_drawmesh.h 11860 2007-08-28 08:53:36Z blendix $ + * + * ***** 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 BDR_DRAWMESH_H +#define BDR_DRAWMESH_H + +struct Image; +struct MTFace; +struct Object; +struct DerivedMesh; +struct Mesh; +struct EdgeHash; + +/** + * Enables or disable mipmapping for realtime images (textures). + * Note that this will will destroy all texture bindings in OpenGL. + * @see free_realtime_image() + * @param mipmap Turn mipmapping on (mipmap!=0) or off (mipmap==0). + */ +void set_mipmap(int mipmap); + +/** + * Enables or disable linear mipmap setting for realtime images (textures). + * Note that this will will destroy all texture bindings in OpenGL. + * @see free_realtime_image() + * @param mipmap Turn linear mipmapping on (linear!=0) or off (linear==0). + */ +void set_linear_mipmap(int linear); + +/** + * Returns the current setting for linear mipmapping. + */ +int get_linear_mipmap(void); + +/** + * Resets the realtime image cache variables. + */ +void clear_realtime_image_cache(void); + + +void update_realtime_image(struct Image *ima, int x, int y, int w, int h); +void free_realtime_image(struct Image *ima); +void free_all_realtime_images(void); +void make_repbind(struct Image *ima); +int set_tpage(struct MTFace *tface); + +void texpaint_enable_mipmap(void); +void texpaint_disable_mipmap(void); + +void draw_mesh_textured(struct Object *ob, struct DerivedMesh *dm, int facesel); +struct EdgeHash *get_tface_mesh_marked_edge_info(struct Mesh *me); +void init_realtime_GL(void); + +#endif /* BDR_DRAWMESH_H */ + diff --git a/source/blender/editors/include/BDR_drawobject.h b/source/blender/editors/include/BDR_drawobject.h new file mode 100644 index 00000000000..be512c7a154 --- /dev/null +++ b/source/blender/editors/include/BDR_drawobject.h @@ -0,0 +1,82 @@ +/** + * $Id: BDR_drawobject.h 10455 2007-04-04 13:18:41Z campbellbarton $ + * + * ***** 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 BDR_DRAWOBJECT_H +#define BDR_DRAWOBJECT_H + +#ifdef __cplusplus +extern "C" { +#endif + + +struct Object; +struct Nurb; +struct Lamp; +struct ListBase; +struct BoundBox; +struct Base; +struct BPoint; +struct BezTriple; +struct EditVert; +struct EditFace; +struct EditEdge; + +int set_gl_material(int nr); +int init_gl_materials(struct Object *ob, int check_alpha); + +void mesh_foreachScreenVert(void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts); +void mesh_foreachScreenEdge(void (*func)(void *userData, struct EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts); +void mesh_foreachScreenFace(void (*func)(void *userData, struct EditFace *efa, int x, int y, int index), void *userData); + +void lattice_foreachScreenVert(void (*func)(void *userData, struct BPoint *bp, int x, int y), void *userData); +void nurbs_foreachScreenVert(void (*func)(void *userData, struct Nurb *nu, struct BPoint *bp, struct BezTriple *bezt, int beztindex, int x, int y), void *userData); + +void drawcircball(int mode, float *cent, float rad, float tmat[][4]); +void get_local_bounds(struct Object *ob, float *center, float *size); + +/* drawing flags: */ +#define DRAW_PICKING 1 +#define DRAW_CONSTCOLOR 2 +void draw_object(struct Base *base, int flag); +void drawaxes(float size, int flag, char drawtype); + +void draw_object_ext(struct Base *base); +void drawsolidcube(float size); +extern void draw_object_backbufsel(struct Object *ob); +void draw_object_instance(struct Object *ob, int dt, int outline); + +#ifdef __cplusplus +} +#endif + +#endif /* BDR_DRAWOBJECT_H */ + diff --git a/source/blender/editors/include/BDR_editcurve.h b/source/blender/editors/include/BDR_editcurve.h new file mode 100644 index 00000000000..889bf135972 --- /dev/null +++ b/source/blender/editors/include/BDR_editcurve.h @@ -0,0 +1,105 @@ +/** + * $Id: BDR_editcurve.h 12519 2007-11-08 00:06:48Z campbellbarton $ + * + * ***** 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 BDR_EDITCURVE_H +#define BDR_EDITCURVE_H + +struct Object; +struct Curve; +struct Nurb; +struct BezTriple; +struct BPoint; +struct BezTripleNurb; + +short isNurbsel(struct Nurb *nu); +int isNurbsel_count(struct Nurb *nu); +void printknots(void); +void load_editNurb(void); +void make_editNurb(void); +void remake_editNurb(void); +void separate_nurb(void); +short isNurbselUV(struct Nurb *nu, int *u, int *v, int flag); +void setflagsNurb(short flag); +void rotateflagNurb(short flag, float *cent, float rotmat[][3]); +void translateflagNurb(short flag, float *vec); +void weightflagNurb(short flag, float w, int mode); +void deleteflagNurb(short flag); +short extrudeflagNurb(int flag); +void adduplicateflagNurb(short flag); +void switchdirectionNurb2(void); +void switchdirection_knots(float *base, int tot); +void deselectall_nurb(void); +void hideNurb(int swap); +void revealNurb(void); +void selectswapNurb(void); +void subdivideNurb(void); + +int convertspline(short type, struct Nurb *nu); +void setsplinetype(short type); +void rotate_direction_nurb(struct Nurb *nu); +int is_u_selected(struct Nurb *nu, int u); +void make_selection_list_nurb(void); +void merge_2_nurb(struct Nurb *nu1, struct Nurb *nu2); +void merge_nurb(void); +void addsegment_nurb(void); +void mouse_nurb(void); +void spinNurb(float *dvec, short mode); +void addvert_Nurb(int mode); +void extrude_nurb(void); +void makecyclicNurb(void); +void selectconnected_nurb(void); +void selectrow_nurb(void); +void selectend_nurb(short selfirst, short doswap, short selstatus); +void select_more_nurb(void); +void select_less_nurb(void); +void select_next_nurb(void); +void select_prev_nurb(void); +void select_random_nurb(void); +void select_every_nth_nurb(void); +void adduplicate_nurb(void); +void delNurb(void); +void nurb_set_smooth(short event); +int join_curve(int type); +struct Nurb *addNurbprim(int type, int stype, int newname); +void default_curve_ipo(struct Curve *cu); +void add_primitiveCurve(int stype); +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); + +#endif /* BDR_EDITCURVE_H */ diff --git a/source/blender/editors/include/BDR_editface.h b/source/blender/editors/include/BDR_editface.h new file mode 100644 index 00000000000..c9f8bdb589f --- /dev/null +++ b/source/blender/editors/include/BDR_editface.h @@ -0,0 +1,61 @@ +/** + * $Id: BDR_editface.h 12139 2007-09-25 03:31:12Z campbellbarton $ + * + * ***** 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 BDR_EDITFACE_H +#define BDR_EDITFACE_H + +struct MTFace; +struct EditFace; +struct Mesh; +struct MCol; + +struct MTFace *get_active_mtface(struct EditFace **efa, struct MCol **mcol, short sloppy); +void calculate_uv_map(unsigned short mapmode); +void default_uv(float uv[][2], float size); +void make_tfaces(struct Mesh *me); +void reveal_tface(void); +void hide_tface(void); +void select_linked_tfaces(int mode); +void deselectall_tface(void); +void selectswap_tface(void); +void rotate_uv_tface(void); +void mirror_uv_tface(void); +int minmax_tface(float *min, float *max); +void face_select(void); +void face_borderselect(void); +void uv_autocalc_tface(void); +void set_texturepaint(void); +void get_same_uv(void); +void seam_mark_clear_tface(short mode); + +#endif /* BDR_EDITFACE_H */ + diff --git a/source/blender/editors/include/BDR_editmball.h b/source/blender/editors/include/BDR_editmball.h new file mode 100644 index 00000000000..b7b852c4206 --- /dev/null +++ b/source/blender/editors/include/BDR_editmball.h @@ -0,0 +1,56 @@ +/** + * $Id: BDR_editmball.h 10893 2007-06-08 14:17:13Z jiri $ + * + * ***** 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 BDR_EDITMBALL_H +#define BDR_EDITMBALL_H + +void make_editMball(void); +void load_editMball(void); + +/** + * @attention The argument is discarded. It is there for + * compatibility. + */ +void add_primitiveMball(int); +void deselectall_mball(void); +void selectinverse_mball(void); +void selectrandom_mball(void); +void mouse_mball(void); +void adduplicate_mball(void); +void delete_mball(void); +void freeMetaElemlist(struct ListBase *lb); +void undo_push_mball(char *name); +void hide_mball(char hide); +void reveal_mball(void); + +#endif /* BDR_EDITMBALL_H */ + diff --git a/source/blender/editors/include/BDR_editobject.h b/source/blender/editors/include/BDR_editobject.h new file mode 100644 index 00000000000..5aeeb4d5c1b --- /dev/null +++ b/source/blender/editors/include/BDR_editobject.h @@ -0,0 +1,128 @@ +/** + * $Id: BDR_editobject.h 12696 2007-11-27 19:23:26Z campbellbarton $ + * + * ***** 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 BDR_EDITOBJECT_H +#define BDR_EDITOBJECT_H + +struct Object; +struct Tex; +struct Material; +struct Base; +struct HookModifierData; +struct Scene; + +void add_object_draw(int type); +void add_objectLamp(short type); +void free_and_unlink_base_from_scene(struct Scene *scene, struct Base *base); +void free_and_unlink_base(struct Base *base); +void delete_obj(int ok); +void make_track(void); +void apply_obmat(struct Object *ob); +void clear_parent(void); +void clear_track(void); +void clear_object(char mode); +void reset_slowparents(void); +void set_slowparent(void); +void make_vertex_parent(void); +int test_parent_loop(struct Object *par, struct Object *ob); +void make_parent(void); +void make_proxy(void); + +#define EM_WAITCURSOR (1 << 0) +#define EM_FREEDATA (1 << 1) +#define EM_FREEUNDO (1 << 2) + +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); +void movetolayer(void); +void special_editmenu(void); +void convertmenu(void); +void copy_attr_menu(void); +void copy_attr(short event); +void link_to_scene(unsigned short nr); +void make_links_menu(void); +void make_links(short event); +void make_duplilist_real(void); +void apply_object(void); + +/* old transform */ +void apply_keyb_grid(float *val, float fac1, float fac2, float fac3, int invert); +void headerprint(char *str); +/* used for old game engine collision optimize */ +int cylinder_intersect_test(void); +int sphere_intersect_test(void); + + +void std_rmouse_transform(void (*xf_func)(int, int)); +void rightmouse_transform(void); +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 do_single_tex_user(struct Tex **from); +void single_tex_users_expand(void); +void single_mat_users_expand(void); +void single_user(void); +void make_local_menu(void); +void make_local(int mode); +void adduplicate(int mode, int dupflag); /* when the dupflag is 0 no data is duplicated */ +void selectlinks_menu(void); +void selectlinks(int nr); +void image_aspect(void); +void set_ob_ipoflags(void); +void select_select_keys(void); +int vergbaseco(const void *a1, const void *a2); +void auto_timeoffs(void); +void texspace_edit(void); +void flip_subdivison(int); +void mirrormenu(void); +void hookmenu(void); /* object mode hook menu */ + + +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); + +#endif /* BDR_EDITOBJECT_H */ + diff --git a/source/blender/editors/include/BDR_imagepaint.h b/source/blender/editors/include/BDR_imagepaint.h new file mode 100644 index 00000000000..f40e9a3102a --- /dev/null +++ b/source/blender/editors/include/BDR_imagepaint.h @@ -0,0 +1,44 @@ +/** + * $Id: BDR_imagepaint.h 8390 2006-08-27 13:29:00Z blendix $ + * + * ***** 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 BDR_IMAGEPAINT_H +#define BDR_IMAGEPAINT_H + +void imagepaint_redraw_tool(void); +void imagepaint_pick(short mousebutton); +void imagepaint_paint(short mousebutton, short texturepaint); + +void imagepaint_undo(); +void free_imagepaint(); + +#endif /* BDR_IMAGEPAINT_H */ + diff --git a/source/blender/editors/include/BDR_sculptmode.h b/source/blender/editors/include/BDR_sculptmode.h new file mode 100644 index 00000000000..f1b5170f395 --- /dev/null +++ b/source/blender/editors/include/BDR_sculptmode.h @@ -0,0 +1,142 @@ +/* + * $Id: BDR_sculptmode.h 11036 2007-06-24 22:28:28Z 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 ***** + */ + +#ifndef BDR_SCULPTMODE_H +#define BDR_SCULPTMODE_H + +#include "DNA_listBase.h" +#include "DNA_vec_types.h" +/* For bglMats */ +#include "BIF_glutil.h" +#include "transform.h" + +struct uiBlock; +struct BrushData; +struct EditData; +struct IndexNode; +struct KeyBlock; +struct Mesh; +struct Object; +struct PartialVisibility; +struct Scene; +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 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_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(); + +struct BrushData *sculptmode_brush(void); +float tex_angle(void); +void do_symmetrical_brush_actions(struct EditData *e, short *, short *); + +void sculptmode_update_tex(void); +char sculpt_modifiers_active(struct Object *ob); +void sculpt(void); +void set_sculptmode(void); + +/* Stroke */ +void sculpt_stroke_new(const int max); +void sculpt_stroke_free(); +void sculpt_stroke_add_point(const short x, const short y); +void sculpt_stroke_apply(struct EditData *); +void sculpt_stroke_apply_all(struct EditData *e); +void sculpt_stroke_draw(); + + +/* Partial Mesh Visibility */ +struct PartialVisibility *sculptmode_copy_pmv(struct PartialVisibility *); +void sculptmode_pmv_free(struct PartialVisibility *); +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/editors/include/BDR_unwrapper.h b/source/blender/editors/include/BDR_unwrapper.h new file mode 100644 index 00000000000..24f32a11211 --- /dev/null +++ b/source/blender/editors/include/BDR_unwrapper.h @@ -0,0 +1,51 @@ +/** + * $Id: BDR_unwrapper.h 10331 2007-03-22 20:32:20Z blendix $ + * + * ***** 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 BDR_UNWRAPPER_H +#define BDR_UNWRAPPER_H + +struct Mesh; + +void set_seamtface(void); /* set TF_SEAM flags in tfaces */ +void select_linked_tfaces_with_seams(int mode, struct Mesh *me, unsigned int index); + +void unwrap_lscm(short seamcut); /* unwrap faces selected in 3d view */ +void minimize_stretch_tface_uv(void); /* optimize faces selected in uv editor */ +void pack_charts_tface_uv(void); + +/* for live mode: no undo pushes, caching for quicky re-unwrap */ +void unwrap_lscm_live_begin(void); +void unwrap_lscm_live_re_solve(void); +void unwrap_lscm_live_end(short cancel); + +#endif /* BDR_UNWRAPPER_H */ + diff --git a/source/blender/editors/include/BDR_vpaint.h b/source/blender/editors/include/BDR_vpaint.h new file mode 100644 index 00000000000..0bda2010a74 --- /dev/null +++ b/source/blender/editors/include/BDR_vpaint.h @@ -0,0 +1,58 @@ +/** + * $Id: BDR_vpaint.h 8971 2006-11-20 12:08:06Z ton $ + * + * ***** 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 BDR_VPAINT_H +#define BDR_VPAINT_H + +struct Mesh; +struct MDeformVert; /* __NLA */ + +unsigned int rgba_to_mcol(float r, float g, float b, float a); +void do_shared_vertexcol(struct Mesh *me); +void make_vertexcol(int shade); + +void clear_vpaint(void); +void clear_vpaint_selectedfaces(void); +void vpaint_dogamma(void); +void sample_vpaint(void); + +void free_vertexpaint(void); +void vertex_paint(void); +void set_vpaint(void); + +void set_wpaint(void); +void clear_wpaint_selectedfaces(void); +void weight_paint(void); + + +#endif /* BDR_VPAINT_H */ + diff --git a/source/blender/editors/include/BIF_butspace.h b/source/blender/editors/include/BIF_butspace.h new file mode 100644 index 00000000000..dae86df7712 --- /dev/null +++ b/source/blender/editors/include/BIF_butspace.h @@ -0,0 +1,140 @@ +/** + * $Id: BIF_butspace.h 12682 2007-11-26 22:09:57Z blendix $ + * + * ***** 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 BIF_BUTSPACE_H +#define BIF_BUTSPACE_H + +/* all internal/external calls and event codes for buttons space */ +/* should be split in 2 parts... */ + +struct Base; +struct ID; + +/* external, butspace.c */ +extern void do_butspace(unsigned short event); +extern void redraw_test_buttons(struct Object *new); + +extern char *image_type_pup(void); + +/* buttons_editing.c */ +extern void validate_editbonebutton_cb(void *bonev, void *namev); + +/* buts->mainb old */ +#define BUTS_VIEW 0 +#define BUTS_LAMP 1 +#define BUTS_MAT 2 +#define BUTS_TEX 3 +#define BUTS_ANIM 4 +#define BUTS_WORLD 5 +#define BUTS_RENDER 6 +#define BUTS_EDIT 7 +#define BUTS_GAME 8 +#define BUTS_FPAINT 9 +#define BUTS_RADIO 10 +#define BUTS_SCRIPT 11 +#define BUTS_SOUND 12 +#define BUTS_CONSTRAINT 13 +#define BUTS_EFFECTS 14 + +/* warning: the values of these defines are used in sbuts->tabs[7] */ +/* buts->mainb new */ +#define CONTEXT_SCENE 0 +#define CONTEXT_OBJECT 1 +#define CONTEXT_TYPES 2 +#define CONTEXT_SHADING 3 +#define CONTEXT_EDITING 4 +#define CONTEXT_SCRIPT 5 +#define CONTEXT_LOGIC 6 + +/* buts->tab new */ +#define TAB_SHADING_MAT 0 +#define TAB_SHADING_TEX 1 +#define TAB_SHADING_RAD 2 +#define TAB_SHADING_WORLD 3 +#define TAB_SHADING_LAMP 4 + +#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_ANIM 2 +#define TAB_SCENE_SOUND 3 + + +/* buts->scaflag */ +#define BUTS_SENS_SEL 1 +#define BUTS_SENS_ACT 2 +#define BUTS_SENS_LINK 4 +#define BUTS_CONT_SEL 8 +#define BUTS_CONT_ACT 16 +#define BUTS_CONT_LINK 32 +#define BUTS_ACT_SEL 64 +#define BUTS_ACT_ACT 128 +#define BUTS_ACT_LINK 256 + + +/* buttons grid */ +#define PANELX 320 +#define PANELY 0 +#define PANELW 318 +#define PANELH 204 + +#define BUTW1 300 +#define BUTW2 145 +#define BUTW3 93 +#define BUTW4 67 +#define ICONBUTW 20 +#define BUTH 22 + +#define YSPACE 6 +#define XSPACE 10 +#define PANEL_YMAX 210 +#define PANEL_XMAX 310 + +#define X1CLM1 10 + +#define X2CLM1 X1CLM1 +#define X2CLM2 165 + +#define X3CLM1 X1CLM1 +#define X3CLM2 113 +#define X3CLM3 217 + +#define X4CLM1 X1CLM1 +#define X4CLM2 77 +#define X4CLM3 165 +#define X4CLM4 232 + + +#endif + diff --git a/source/blender/editors/include/BIF_cursors.h b/source/blender/editors/include/BIF_cursors.h new file mode 100644 index 00000000000..cdbe5293dc7 --- /dev/null +++ b/source/blender/editors/include/BIF_cursors.h @@ -0,0 +1,103 @@ +/** + * $Id: BIF_cursors.h 7739 2006-06-15 14:22:59Z broken $ + * + * ***** 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 __BLI_CURSORS_DOT_H__ +#define __BLI_CURSORS_DOT_H__ + +void InitCursorData(void); +short GetBlenderCursor(void); +void SetBlenderCursor(short cursornum); + +//typedef struct BCursor_s BCursor; +typedef struct BCursor { + + char *small_bm; + char *small_mask; + + char small_sizex; + char small_sizey; + char small_hotx; + char small_hoty; + + char *big_bm; + char *big_mask; + + char big_sizex; + char big_sizey; + char big_hotx; + char big_hoty; + + char fg_color; + char bg_color; + +} BCursor; + +#define LASTCURSOR -2 +#define SYSCURSOR -1 +enum { + BC_NW_ARROWCURSOR=0, + BC_NS_ARROWCURSOR, + BC_EW_ARROWCURSOR, + BC_WAITCURSOR, + BC_CROSSCURSOR, + BC_EDITCROSSCURSOR, + BC_BOXSELCURSOR, + BC_KNIFECURSOR, + BC_VLOOPCURSOR, + BC_TEXTEDITCURSOR, + BC_PAINTBRUSHCURSOR, + BC_HANDCURSOR, + BC_NSEW_SCROLLCURSOR, + BC_NS_SCROLLCURSOR, + BC_EW_SCROLLCURSOR, + BC_EYEDROPPER_CURSOR, +/* --- ALWAYS LAST ----- */ + BC_NUMCURSORS, +}; + + +enum { + BC_BLACK=0, + BC_WHITE, + BC_RED, + BC_BLUE, + BC_GREEN, + BC_YELLOW +}; + +#define SMALL_CURSOR 0 +#define BIG_CURSOR 1 + +#endif + diff --git a/source/blender/editors/include/BIF_drawimage.h b/source/blender/editors/include/BIF_drawimage.h new file mode 100644 index 00000000000..3d48df0ea31 --- /dev/null +++ b/source/blender/editors/include/BIF_drawimage.h @@ -0,0 +1,74 @@ +/** + * $Id: BIF_drawimage.h 12198 2007-10-03 10:36:04Z campbellbarton $ + * + * ***** 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 BIF_DRAWIMAGE_H +#define BIF_DRAWIMAGE_H + +struct ScrArea; +struct SpaceImage; +struct Render; +struct Image; +struct ImBuf; +struct uiBlock; +struct MTFace; + +void do_imagebuts(unsigned short event); +void calc_image_view(struct SpaceImage *sima, char mode); +void drawimagespace(struct ScrArea *sa, void *spacedata); +void image_changed(struct SpaceImage *sima, struct Image *image); +int draw_uvs_face_check(void); +void tface_center(struct MTFace *tf, float cent[2], void * isquad); +void draw_uvs_sima(void); +void image_set_tile(struct SpaceImage *sima, int dotile); +void image_home(void); +void image_viewmove(int mode); +void image_viewzoom(unsigned short event, int invert); +void image_viewcenter(void); +void uvco_to_areaco(float *vec, short *mval); +void uvco_to_areaco_noclip(float *vec, int *mval); +void what_image(struct SpaceImage *sima); +void image_preview_event(int event); + +void image_info(struct Image *ima, struct ImBuf *ibuf, char *str); +void imagespace_composite_flipbook(struct ScrArea *sa); + +void imagewindow_render_callbacks(struct Render *re); +void imagewindow_toggle_render(void); +void imagewindow_swap_render_rects(void); +void imagewin_store_spare(void); +struct ImBuf *imagewindow_get_ibuf(struct SpaceImage *sima); + +void image_editvertex_buts(struct uiBlock *block); +void image_editcursor_buts(struct uiBlock *block); + +#endif + diff --git a/source/blender/editors/include/BIF_drawoops.h b/source/blender/editors/include/BIF_drawoops.h new file mode 100644 index 00000000000..38c38c1ba04 --- /dev/null +++ b/source/blender/editors/include/BIF_drawoops.h @@ -0,0 +1,41 @@ +/** + * $Id: BIF_drawoops.h 6135 2005-12-16 13:50:45Z campbellbarton $ + * + * ***** 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 BIF_DRAWOOPS_H +#define BIF_DRAWOOPS_H + +void give_oopslink_line(Oops *oops, OopsLink *ol, float *v1, float *v2); +void mysbox(float x1, float y1, float x2, float y2); +void boundbox_oops(short sel); + +#endif + diff --git a/source/blender/editors/include/BIF_drawscene.h b/source/blender/editors/include/BIF_drawscene.h new file mode 100644 index 00000000000..88e0ae906d4 --- /dev/null +++ b/source/blender/editors/include/BIF_drawscene.h @@ -0,0 +1,35 @@ +/** + * $Id: BIF_drawscene.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 ***** + */ + +struct Scene; +void set_scene(struct Scene *sce); + diff --git a/source/blender/editors/include/BIF_drawscript.h b/source/blender/editors/include/BIF_drawscript.h new file mode 100644 index 00000000000..b50f12e836b --- /dev/null +++ b/source/blender/editors/include/BIF_drawscript.h @@ -0,0 +1,41 @@ +/** + * + * + * ***** 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. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BIF_DRAWSCRIPT_H +#define BIF_DRAWSCRIPT_H + +struct ScrArea; +struct SpaceScript; + +void free_scriptspace(struct SpaceScript *sc); + +#endif /* BIF_DRAWSCRIPT_H */ diff --git a/source/blender/editors/include/BIF_drawseq.h b/source/blender/editors/include/BIF_drawseq.h new file mode 100644 index 00000000000..495c99c47d7 --- /dev/null +++ b/source/blender/editors/include/BIF_drawseq.h @@ -0,0 +1,46 @@ +/** + * $Id: BIF_drawseq.h 12177 2007-10-01 08:03:11Z schlaile $ + * + * ***** 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 BIF_DRAWSEQ_H +#define BIF_DRAWSEQ_H + +struct ScrArea; +struct Sequence; + +void drawprefetchseqspace(struct ScrArea *sa, void *spacedata); +void drawseqspace(struct ScrArea *sa, void *spacedata); +void set_special_seq_update(int val); + +void seq_viewmove(SpaceSeq *sseq); +void seq_reset_imageofs(SpaceSeq *sseq); +#endif + diff --git a/source/blender/editors/include/BIF_drawtext.h b/source/blender/editors/include/BIF_drawtext.h new file mode 100644 index 00000000000..e08e67b8052 --- /dev/null +++ b/source/blender/editors/include/BIF_drawtext.h @@ -0,0 +1,54 @@ +/** + * $Id: BIF_drawtext.h 4428 2005-05-13 16:11:28Z ton $ + * + * ***** 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 BIF_DRAWTEXT_H +#define BIF_DRAWTEXT_H + +struct ScrArea; +struct SpaceText; +struct Text; + +void unlink_text(struct Text *text); + +void free_textspace(struct SpaceText *st); + +void txt_write_file(struct Text *text); +void add_text_fs(char *file); + +void free_txt_data(void); +void pop_space_text(struct SpaceText *st); + +void get_format_string(void); +void do_brackets(void); + +#endif + diff --git a/source/blender/editors/include/BIF_editaction.h b/source/blender/editors/include/BIF_editaction.h new file mode 100644 index 00000000000..9fa098bc846 --- /dev/null +++ b/source/blender/editors/include/BIF_editaction.h @@ -0,0 +1,162 @@ +/** + * $Id: BIF_editaction.h 12065 2007-09-17 11:41:12Z aligorith $ + * + * ***** 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): 2007, Joshua Leung, Action Editor Recode + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BIF_EDITACTION_H +#define BIF_EDITACTION_H + +/* some interface related sizes*/ +#define CHANNELHEIGHT 16 +#define CHANNELSKIP 2 +#define NAMEWIDTH 164 +#define SLIDERWIDTH 125 +#define ACTWIDTH (G.saction->actwidth) + +/* Some types for easier type-testing */ +enum { + ACTTYPE_NONE= 0, + ACTTYPE_ACHAN, + ACTTYPE_CONCHAN, + ACTTYPE_ICU, + ACTTYPE_FILLIPO, + ACTTYPE_FILLCON, + ACTTYPE_IPO, + ACTTYPE_SHAPEKEY +}; + +/* Macros for easier/more consistant state testing */ +#define VISIBLE_ACHAN(achan) ((achan->flag & ACHAN_HIDDEN)==0) +#define EDITABLE_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && ((achan->flag & ACHAN_PROTECTED)==0)) +#define EXPANDED_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && (achan->flag & ACHAN_EXPANDED)) +#define SEL_ACHAN(achan) ((achan->flag & ACHAN_SELECTED) || (achan->flag & ACHAN_HILIGHTED)) +#define FILTER_IPO_ACHAN(achan) ((achan->flag & ACHAN_SHOWIPO)) +#define FILTER_CON_ACHAN(achan) ((achan->flag & ACHAN_SHOWCONS)) + +#define EDITABLE_CONCHAN(conchan) ((conchan->flag & CONSTRAINT_CHANNEL_PROTECTED)==0) +#define SEL_CONCHAN(conchan) (conchan->flag & CONSTRAINT_CHANNEL_SELECT) + +#define EDITABLE_ICU(icu) ((icu->flag & IPO_PROTECT)==0) +#define SEL_ICU(icu) (icu->flag & IPO_SELECT) + +#define NLA_ACTION_SCALED (G.saction->pin==0 && OBACT && OBACT->action) +#define NLA_IPO_SCALED (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) + +/* constants for setting ipo-interpolation type */ +enum { + SET_IPO_MENU = -1, + SET_IPO_POPUP = 0, + + SET_IPO_CONSTANT, + SET_IPO_LINEAR, + SET_IPO_BEZIER, +}; + +/* constants for setting ipo-extrapolation type */ +enum { + + SET_EXTEND_MENU = 9, + SET_EXTEND_POPUP = 10, + + SET_EXTEND_CONSTANT, + SET_EXTEND_EXTRAPOLATION, + SET_EXTEND_CYCLIC, + SET_EXTEND_CYCLICEXTRAPOLATION +}; + + +struct bAction; +struct bActionChannel; +struct bPoseChannel; +struct Object; +struct Ipo; +struct BWinEvent; +struct Key; +struct ListBase; + +/* Key operations */ +void transform_action_keys(int mode, int dummy); +void duplicate_action_keys(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); + +/* 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); + +/* 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); + +/* IPO/Handle Types */ +void sethandles_action_keys(int code); +void action_set_ipo_flags(short mode, short event); + +/* Select */ +void borderselect_action(void); +void deselect_action_keys(short test, short sel); +void deselect_action_channels(short test); +void deselect_actionchannels(struct bAction *act, short test); +int select_channel(struct bAction *act, struct bActionChannel *achan, int selectmode); +void select_actionchannel_by_name(struct bAction *act, char *name, int select); + +/* ShapeKey stuff */ +struct Key *get_action_mesh_key(void); +int get_nearest_key_num(struct Key *key, short *mval, float *x); + +void *get_nearest_act_channel(short mval[], short *ret_type); + +/* Action */ +struct bActionChannel *get_hilighted_action_channel(struct bAction* action); +struct bAction *add_empty_action(char *name); +struct bAction *ob_get_action(struct Object *ob); + +void actdata_filter(ListBase *act_data, int filter_mode, void *data, short datatype); +void *get_action_context(short *datatype); + +void remake_action_ipos(struct bAction *act); + +/* event handling */ +void winqreadactionspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt); + +#endif + diff --git a/source/blender/editors/include/BIF_editarmature.h b/source/blender/editors/include/BIF_editarmature.h new file mode 100644 index 00000000000..1b2ad78c881 --- /dev/null +++ b/source/blender/editors/include/BIF_editarmature.h @@ -0,0 +1,142 @@ +/** + * $Id: BIF_editarmature.h 11981 2007-09-09 11:05:21Z aligorith $ + * + * ***** 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 BIF_EDITARMATURE_H +#define BIF_EDITARMATURE_H + +struct Object; +struct Base; +struct Bone; +struct bArmature; +struct ListBase; + +typedef struct EditBone +{ + struct EditBone *next, *prev; + struct EditBone *parent;/* Editbones have a one-way link (i.e. children refer + to parents. This is converted to a two-way link for + normal bones when leaving editmode. */ + void *temp; /* Used to store temporary data */ + + char name[32]; + float roll; /* Roll along axis. We'll ultimately use the axis/angle method + for determining the transformation matrix of the bone. The axis + is tail-head while roll provides the angle. Refer to Graphics + Gems 1 p. 466 (section IX.6) if it's not already in here somewhere*/ + + float head[3]; /* Orientation and length is implicit during editing */ + float tail[3]; + /* All joints are considered to have zero rotation with respect to + their parents. Therefore any rotations specified during the + animation are automatically relative to the bones' rest positions*/ + int flag; + + int parNr; /* Used for retrieving values from the menu system */ + + float dist, weight; + float xwidth, length, zwidth; /* put them in order! transform uses this as scale */ + float ease1, ease2; + float rad_head, rad_tail; + short layer, segments; + + float oldlength; /* for envelope scaling */ + +} EditBone; + + +void adduplicate_armature(void); +void addvert_armature(void); +void add_primitiveArmature(int type); +void apply_rot_armature (struct Object *ob, float mat[3][3]); +void docenter_armature (struct Object *ob, int centermode); + +void clear_armature(struct Object *ob, char mode); + +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 free_editArmature(void); + +int join_armature(void); +void load_editArmature(void); + +void make_bone_parent(void); +void clear_bone_parent(void); +struct Bone *get_indexed_bone (struct Object *ob, int index); + +void make_editArmature(void); +void make_trans_bones (char mode); + +int do_pose_selectbuffer(struct Base *base, unsigned int *buffer, short hits); + +void mouse_armature(void); +void remake_editArmature(void); +void selectconnected_armature(void); +void selectconnected_posearmature(void); +void select_bone_parent(void); +void unique_editbone_name (struct ListBase *ebones, char *name); + +void auto_align_armature(short mode); + +void create_vgroups_from_armature(struct Object *ob, struct Object *par); +void add_verts_to_dgroups(struct Object *ob, struct Object *par, int heat, int mirror); + +void hide_selected_pose_bones(void); +void hide_unselected_pose_bones(void); +void show_all_pose_bones(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); +EditBone *armature_bone_get_mirrored(struct EditBone *ebo); +void transform_armature_mirror_update(void); + +void hide_selected_armature_bones(void); +void hide_unselected_armature_bones(void); +void show_all_armature_bones(void); + +#define BONESEL_ROOT 0x10000000 +#define BONESEL_TIP 0x20000000 +#define BONESEL_BONE 0x40000000 +#define BONESEL_ANY (BONESEL_TIP|BONESEL_ROOT|BONESEL_BONE) + +#define BONESEL_NOSEL 0x80000000 /* Indicates a negative number */ + +#endif + + diff --git a/source/blender/editors/include/BIF_editconstraint.h b/source/blender/editors/include/BIF_editconstraint.h new file mode 100644 index 00000000000..edc1a610694 --- /dev/null +++ b/source/blender/editors/include/BIF_editconstraint.h @@ -0,0 +1,72 @@ +/** + * $Id: BIF_editconstraint.h 12339 2007-10-22 10:49:34Z aligorith $ + * + * ***** 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 BIF_EDITCONSTRAINT_H +#define BIF_EDITCONSTRAINT_H + +struct ID; +struct ListBase; +struct Object; +struct bConstraint; +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 ob_clear_constraints(void); + +void rename_constraint(struct Object *ob, struct bConstraint *con, char *newname); + + +/* a few special functions for PyConstraints */ +char *buildmenu_pyconstraints(struct Text *con_text, int *pyconindex); +void validate_pyconstraint_cb(void *arg1, void *arg2); +void update_pyconstraint_cb(void *arg1, void *arg2); + +/* two special functions for ChildOf Constriant */ +void childof_const_setinv (void *conv, void *unused); +void childof_const_clearinv(void *conv, void *unused); + +#endif + diff --git a/source/blender/editors/include/BIF_editdeform.h b/source/blender/editors/include/BIF_editdeform.h new file mode 100644 index 00000000000..771ee87ab77 --- /dev/null +++ b/source/blender/editors/include/BIF_editdeform.h @@ -0,0 +1,76 @@ +/** + * $Id: BIF_editdeform.h 12697 2007-11-27 21:16:47Z blendix $ + * + * ***** 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 BIF_DEFORM_H +#define BIF_DEFORM_H + +#define WEIGHT_REPLACE 1 +#define WEIGHT_ADD 2 +#define WEIGHT_SUBTRACT 3 + +struct Object; +struct Mesh; +struct MDeformVert; +struct MDeformWeight; +struct bDeformGroup; + +struct bDeformGroup *add_defgroup_name (struct Object *ob, char *name); +void add_defgroup (struct Object *ob); +void del_defgroup_in_object_mode ( Object *ob ); +void del_defgroup (struct Object *ob); +void duplicate_defgroup ( struct Object *ob ); +void assign_verts_defgroup (void); +void remove_verts_defgroup (int allverts); +void sel_verts_defgroup (int select); + +struct MDeformWeight *get_defweight (struct MDeformVert *dv, int defgroup); +struct MDeformWeight *verify_defweight (struct MDeformVert *dv, int defgroup); + + +void add_vert_to_defgroup (struct Object *ob, struct bDeformGroup *dg, + int vertnum, float weight, + 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); + +extern void object_apply_deform(struct Object *ob); + +void vgroup_assign_with_menu(void); +void vgroup_operation_with_menu(void); + +#endif + diff --git a/source/blender/editors/include/BIF_editfont.h b/source/blender/editors/include/BIF_editfont.h new file mode 100644 index 00000000000..64187e46862 --- /dev/null +++ b/source/blender/editors/include/BIF_editfont.h @@ -0,0 +1,73 @@ +/** + * $Id: BIF_editfont.h 5286 2005-09-15 17:32:24Z ton $ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include + +#ifndef BIF_EDITFONT_H +#define BIF_EDITFONT_H + +struct Text; + +extern char *BIF_lorem; +extern wchar_t *copybuf; +extern wchar_t *copybufinfo; + +typedef struct unicodect +{ + char *name; + char *longname; + int start; + int end; +} unicodect; + +void do_textedit(unsigned short event, short val, unsigned long _ascii); +void make_editText(void); +void load_editText(void); +void remake_editText(void); +void free_editText(void); +void paste_editText(void); +void txt_export_to_object(struct Text *text); +void txt_export_to_objects(struct Text *text); +void undo_push_font(char *); +void load_3dtext_fs(char *); +void add_lorem(void); +void paste_unicodeText(char *filename); + +/** + * @attention The argument is discarded. It is there for + * compatibility. + */ +void add_primitiveFont(int); +void to_upper(void); + +#endif + diff --git a/source/blender/editors/include/BIF_editgroup.h b/source/blender/editors/include/BIF_editgroup.h new file mode 100644 index 00000000000..dded79541bc --- /dev/null +++ b/source/blender/editors/include/BIF_editgroup.h @@ -0,0 +1,40 @@ +/** + * $Id: BIF_editgroup.h 7877 2006-06-24 18:37:21Z desoto $ + * + * ***** 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 ***** + */ + +struct Group; +struct Base; + +void add_selected_to_group(struct Group *group); +void rem_selected_from_group(void); +void group_operation_with_menu(void); +void group_operation(int mode); + diff --git a/source/blender/editors/include/BIF_editkey.h b/source/blender/editors/include/BIF_editkey.h new file mode 100644 index 00000000000..760809f7b1e --- /dev/null +++ b/source/blender/editors/include/BIF_editkey.h @@ -0,0 +1,70 @@ +/** + * $Id: BIF_editkey.h 10579 2007-04-25 11:57:02Z aligorith $ + * + * ***** 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 BIF_EDITKEY_H +#define BIF_EDITKEY_H + +struct Key; +struct KeyBlock; +struct Mesh; +struct Object; +struct Lattice; +struct Curve; +struct uiBlock; +struct BezTriple; +struct IpoCurve; + +void mesh_to_key(struct Mesh *me, struct KeyBlock *kb); +void key_to_mesh(struct KeyBlock *kb, struct Mesh *me); +void insert_meshkey(struct Mesh *me, short rel); + +void latt_to_key(struct Lattice *lt, struct KeyBlock *kb); +void key_to_latt(struct KeyBlock *kb, struct Lattice *lt); +void insert_lattkey(struct Lattice *lt, short rel); + +void curve_to_key(struct Curve *cu, struct KeyBlock *kb, ListBase *nurb); +void key_to_curve(struct KeyBlock *kb, struct Curve *cu, ListBase *nurb); +void insert_curvekey(struct Curve *cu, short rel); + +void insert_shapekey(struct Object *ob); + +void delete_key(struct Object *ob); +void move_keys(struct Object *ob); + +void make_rvk_slider(struct uiBlock *block, struct Object *ob, int keynum, + int x, int y, int w, int h, char *tip); + +// FIXME: move me somewhere else +struct BezTriple *get_bezt_icu_time(struct IpoCurve *icu, float *frame, float *val); + +#endif + diff --git a/source/blender/editors/include/BIF_editlattice.h b/source/blender/editors/include/BIF_editlattice.h new file mode 100644 index 00000000000..7b74893c693 --- /dev/null +++ b/source/blender/editors/include/BIF_editlattice.h @@ -0,0 +1,45 @@ +/** + * $Id: BIF_editlattice.h 3405 2004-11-07 21:14:21Z ton $ + * + * ***** 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 BIF_EDITLATTICE_H +#define BIF_EDITLATTICE_H + +void free_editLatt(void); +void make_editLatt(void); +void load_editLatt(void); +void remake_editLatt(void); +void deselectall_Latt(void); +void mouse_lattice(void); +void undo_push_lattice(char *name); + +#endif + diff --git a/source/blender/editors/include/BIF_editmesh.h b/source/blender/editors/include/BIF_editmesh.h new file mode 100644 index 00000000000..1a31ae1ee45 --- /dev/null +++ b/source/blender/editors/include/BIF_editmesh.h @@ -0,0 +1,265 @@ +/** + * $Id: BIF_editmesh.h 12290 2007-10-18 21:47:55Z campbellbarton $ + * + * ***** 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 ***** + */ + +/* External for editmesh_xxxx.c functions */ + +#ifndef BIF_EDITMESH_H +#define BIF_EDITMESH_H + +#include "BKE_mesh.h" + +struct EditMesh; +struct EditFace; +struct EditEdge; +struct EditVert; +struct Mesh; +struct bDeformGroup; +struct View3D; +struct EditSelection; +struct CustomData; + +// edge and face flag both +#define EM_FGON 2 +// face flag +#define EM_FGON_DRAW 1 + +extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs; + +/* ******************* editmesh.c */ +extern void make_editMesh(void); +extern void load_editMesh(void); +extern void free_editMesh(struct EditMesh *); +extern void remake_editMesh(void); + + /* Editmesh Undo code */ +extern void undo_push_mesh(char *name); + +extern void separatemenu(void); +extern void separate_mesh(void); +extern void separate_mesh_loose(void); +extern void separate_material(void); + +/* ******************* editmesh_add.c */ +extern void make_prim(int type, float imat[3][3], int tot, int seg, + int subdiv, float dia, float d, int ext, int fill, + float cent[3] ); +extern void add_primitiveMesh(int type); +extern void adduplicate_mesh(void); +extern void add_click_mesh(void); +extern void addedgeface_mesh(void); +void addfaces_from_edgenet(); + +/* ******************* editmesh_lib.c */ + +extern void EM_set_flag_all(int flag); +extern void EM_clear_flag_all(int flag); + +extern void EM_select_face(struct EditFace *efa, int sel); +extern void EM_select_edge(struct EditEdge *eed, int sel); +extern float EM_face_area(struct EditFace *efa); +extern float EM_face_perimeter(struct EditFace *efa); +extern void EM_editselection_center(float *center, struct EditSelection *ese); +extern void EM_editselection_normal(float *normal, struct EditSelection *ese); +extern void EM_editselection_plane(float *plane, struct EditSelection *ese); + +extern void EM_deselect_flush(void); // vertices to edges/faces (exception!) +extern void EM_select_flush(void); // vertices to edges/faces (exception!) +extern void EM_selectmode_set(void); // when mode changes +extern void EM_selectmode_flush(void); // when selection changes +extern void EM_convertsel(short oldmode, short selectmode); +extern void EM_remove_selection(void *data, int type); +extern void EM_store_selection(void *data, int type); +extern void EM_validate_selections(void); + +extern int EM_nfaces_selected(void); +extern int EM_nvertices_selected(void); + +extern int faceselectedAND(struct EditFace *efa, int flag); +extern void recalc_editnormals(void); +extern void flip_editnormals(void); + +extern void EM_data_interp_from_verts(struct EditVert *v1, + struct EditVert *v2, struct EditVert *eve, float fac); +extern struct EditFace *EM_face_from_faces(struct EditFace *efa1, + struct EditFace *efa2, int i1, int i2, int i3, int i4); +extern void EM_data_interp_from_faces(struct EditFace *efa1, + struct EditFace *efa2, struct EditFace *efan, int i1, int i2, int i3, int i4); + +void EM_add_data_layer(struct CustomData *data, int type); +void EM_free_data_layer(struct CustomData *data, int type); + +/* ******************* editmesh_mods.c */ + +extern void EM_init_index_arrays(int forVert, int forEdge, int forFace); +extern void EM_free_index_arrays(void); + +extern struct EditVert *EM_get_vert_for_index(int index); +extern struct EditEdge *EM_get_edge_for_index(int index); +extern struct EditFace *EM_get_face_for_index(int index); + +extern void EM_select_face_fgon(struct EditFace *efa, int sel); + +extern int EM_init_backbuf_border(short xmin, short ymin, short xmax, short ymax); +extern int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax); +extern int EM_init_backbuf_circle(short xs, short ys, short rads); +extern int EM_check_backbuf(unsigned int index); +extern void EM_free_backbuf(void); + +extern void EM_selectmode_menu(void); + + +extern void vertexnoise(void); +extern void vertexsmooth(void); +extern void righthandfaces(int select); +extern void mouse_mesh(void); + +extern void deselectall_mesh(void); +extern void selectconnected_mesh_all(void); +extern void selectconnected_mesh(void); +extern void selectconnected_delimit_mesh(void); +extern void selectconnected_delimit_mesh_all(void); +extern void selectswap_mesh(void); + +extern void hide_mesh(int swap); +extern void reveal_mesh(void); + +extern void vertices_to_sphere(void); + + /** Aligns the selected MTFace's of @a me to the @a v3d, + * using the given axis (0-2). Can give a user error. + */ +extern void faceselect_align_view_to_selected(struct View3D *v3d, struct Mesh *me, int axis); + /** Aligns the selected faces or vertices of @a me to the @a v3d, + * using the given axis (0-2). Can give a user error. + */ +extern void editmesh_align_view_to_selected(struct View3D *v3d, int axis); + + /* Selection */ +extern void select_non_manifold(void); +extern void select_sharp_edges(void); +extern void select_linked_flat_faces(void); +extern void select_faces_by_numverts(int numverts); +extern void select_more(void); +extern void select_less(void); +extern void selectrandom_mesh(void); +extern void editmesh_select_by_material(int index); +extern void editmesh_deselect_by_material(int index); + +extern void Vertex_Menu(void); +extern void Edge_Menu(void); +extern void Face_Menu(void); +extern void select_mesh_group_menu(void); +extern void editmesh_mark_seam(int clear); +extern void loop_multiselect(int looptype); + + +/* ******************* editmesh_loop.c */ + +#define KNIFE_PROMPT 0 +#define KNIFE_EXACT 1 +#define KNIFE_MIDPOINT 2 +#define KNIFE_MULTICUT 3 + +extern void CutEdgeloop(int numcuts); +extern void KnifeSubdivide(char mode); +extern void LoopMenu(void); + +#define LOOP_SELECT 1 +#define LOOP_CUT 2 + +extern short sharesFace(struct EditEdge* e1, struct EditEdge* e2); + +/* ******************* editmesh_tools.c */ + +#define SUBDIV_SELECT_ORIG 0 +#define SUBDIV_SELECT_INNER 1 +#define SUBDIV_SELECT_INNER_SEL 2 +#define SUBDIV_SELECT_LOOPCUT 3 + +extern void convert_to_triface(int direction); +extern int removedoublesflag(short flag, short automerge, float limit); +extern void xsortvert_flag(int flag); +extern void hashvert_flag(int flag); + +extern void esubdivideflag(int flag, float rad, int beauty, int numcuts, int selecttype); + +extern void extrude_mesh(void); +extern void split_mesh(void); +extern void extrude_repeat_mesh(int steps, float offs); +extern void spin_mesh(int steps,float degr,float *dvec, int mode); +extern void screw_mesh(int steps,int turns); +extern void delete_mesh(void); +extern void beauty_fill(void); +extern void join_triangles(void); +extern void edge_flip(void); +extern void fill_mesh(void); +extern void bevel_menu(); +void mesh_set_face_flags(short mode); +extern void mesh_set_smooth_faces(short event); +extern void mesh_rotate_uvs(void); +extern void mesh_mirror_uvs(void); +extern void mesh_rotate_colors(void); +extern void mesh_mirror_colors(void); +void mesh_copy_menu(void); +void edge_rotate_selected(int dir); +int EdgeSlide(short immediate, float imperc); +int EdgeLoopDelete(void); +void mesh_rip(void); + +struct EditVert *editedge_getOtherVert(struct EditEdge *eed, struct EditVert *ev); +struct EditVert *editedge_getSharedVert(struct EditEdge *eed, struct EditEdge *eed2); +int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve); +int editface_containsVert(struct EditFace *efa, struct EditVert *eve); +int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed); + +void shape_copy_select_from(void); +void shape_propagate(void); + +int collapseEdges(void); +int merge_firstlast(int first, int uvmerge); +int merge_target( int target, int uvmerge); + +void pathselect(void); +void loop_to_region(void); +void region_to_loop(void); + +UvVertMap *make_uv_vert_map_EM(int selected, int do_face_idx_array, float *limit); +UvMapVert *get_uv_map_vert_EM(UvVertMap *vmap, unsigned int v); +void free_uv_vert_map_EM(UvVertMap *vmap); + +int EM_texFaceCheck(void); /* can we edit UV's for this mesh?*/ +int EM_vertColorCheck(void); /* can we edit colors for this mesh?*/ + +void EM_set_actFace(struct EditFace *efa); +struct EditFace * EM_get_actFace(void); + +#endif diff --git a/source/blender/editors/include/BIF_editmode_undo.h b/source/blender/editors/include/BIF_editmode_undo.h new file mode 100644 index 00000000000..b03b4160166 --- /dev/null +++ b/source/blender/editors/include/BIF_editmode_undo.h @@ -0,0 +1,59 @@ +/** + * $Id: + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + + +#ifndef BIF_EDITMODE_UNDO_H +#define BIF_EDITMODE_UNDO_H + +// Add this in your local code: + +extern void undo_editmode_push(char *name, + void (*freedata)(void *), // pointer to function freeing data + void (*to_editmode)(void *), // data to editmode conversion + void *(*from_editmode)(void)); // editmode to data conversion + + +// Further exported for UI is: + +struct uiBlock; + +extern void undo_editmode_step(int step); // undo and redo +extern void undo_editmode_clear(void); // free & clear all data +extern void undo_editmode_menu(void); // history menu +extern struct uiBlock *editmode_undohistorymenu(void *arg_unused); + +/* Hack to avoid multires undo data taking up insane amounts of memory */ +struct Object; +void *undo_editmode_get_prev(struct Object *ob); + +#endif + diff --git a/source/blender/editors/include/BIF_editnla.h b/source/blender/editors/include/BIF_editnla.h new file mode 100644 index 00000000000..3f065d8f6a6 --- /dev/null +++ b/source/blender/editors/include/BIF_editnla.h @@ -0,0 +1,65 @@ +/** + * $Id: BIF_editnla.h 9722 2007-01-12 02:34:47Z aligorith $ + * + * ***** 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 BIF_EDITNLA_H +#define BIF_EDITNLA_H + +struct BWinEvent; + +extern void winqreadnlaspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt); + +/* NLA channel operations */ +void delete_nlachannel_keys(void); +void duplicate_nlachannel_keys(void); +void transform_nlachannel_keys(int mode, int dummy); + +/* Select */ +void borderselect_nla(void); +void deselect_nlachannel_keys (int test); +void deselect_nlachannels(int test); + +/* NLA Strip operations */ +void shift_nlastrips_up(void); +void shift_nlastrips_down(void); +void reset_action_strips(int val); +void synchronize_action_strips(void); +void snap_action_strips(int snap_mode); +void add_nlablock(void); +void add_empty_nlablock(void); +void convert_nla(void); +void copy_action_modifiers(void); + +/* Baking */ +void bake_all_to_action(void); + +#endif + diff --git a/source/blender/editors/include/BIF_editoops.h b/source/blender/editors/include/BIF_editoops.h new file mode 100644 index 00000000000..9f1f8c20ff2 --- /dev/null +++ b/source/blender/editors/include/BIF_editoops.h @@ -0,0 +1,47 @@ +/** + * $Id: BIF_editoops.h 4345 2005-04-30 21:19:19Z ton $ + * + * ***** 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 BIF_EDITOOPS_H +#define BIF_EDITOOPS_H + +void borderselect_oops(void); +void deselect_all_area_oops(void); +void mouse_select_oops(void); +void select_backlinked_oops(void); +void select_linked_oops(void); +void set_select_flag_oops(void); +void swap_select_all_oops(void); +void transform_oops(int mode, int context); + +void clever_numbuts_oops(void); +#endif + diff --git a/source/blender/editors/include/BIF_editparticle.h b/source/blender/editors/include/BIF_editparticle.h new file mode 100644 index 00000000000..d4c6a92b8c8 --- /dev/null +++ b/source/blender/editors/include/BIF_editparticle.h @@ -0,0 +1,92 @@ +/* BIF_editparticle.h + * + * + * $Id: BIF_editparticle.h $ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2007 by Janne Karhu. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BIF_EDITPARTICLE_H +#define BIF_EDITPARTICLE_H + +struct Object; +struct ParticleSystem; +struct ParticleEditSettings; + +/* particle edit mode */ +void PE_set_particle_edit(void); +void PE_create_particle_edit(struct Object *ob, struct ParticleSystem *psys); +void PE_free_particle_edit(struct ParticleSystem *psys); + +void PE_change_act(void *ob_v, void *act_v); + +/* access */ +struct ParticleSystem *PE_get_current(struct Object *ob); +short PE_get_current_num(struct Object *ob); +int PE_minmax(float *min, float *max); +void PE_get_colors(char sel[4], char nosel[4]); +struct ParticleEditSettings *PE_settings(void); + +/* update calls */ +void PE_hide_keys_time(struct ParticleSystem *psys, float cfra); +void PE_update_object(struct Object *ob, int useflag); +void PE_update_selection(struct Object *ob, 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); + +/* 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/editors/include/BIF_editsca.h b/source/blender/editors/include/BIF_editsca.h new file mode 100644 index 00000000000..df636621b99 --- /dev/null +++ b/source/blender/editors/include/BIF_editsca.h @@ -0,0 +1,41 @@ +/** + * $Id: BIF_editsca.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 BIF_EDITSCA_H +#define BIF_EDITSCA_H + +void make_unique_prop_names(char *str); +void do_gamebuts(unsigned short event); +void gamebuts(void); + +#endif + diff --git a/source/blender/editors/include/BIF_editseq.h b/source/blender/editors/include/BIF_editseq.h new file mode 100644 index 00000000000..dc9722aa2fb --- /dev/null +++ b/source/blender/editors/include/BIF_editseq.h @@ -0,0 +1,135 @@ +/** + * $Id: BIF_editseq.h 12524 2007-11-08 13:02:59Z campbellbarton $ + * + * ***** 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 BIF_EDITSEQ_H +#define BIF_EDITSEQ_H + +struct Sequence; + +void add_duplicate_seq(void); +void add_sequence(int type); +void borderselect_seq(void); +void boundbox_seq(void); +void change_sequence(void); +void reload_sequence(void); +void update_seq_ipo_rect(struct Sequence * seq); +void update_seq_icu_rects(struct Sequence * seq); +struct Sequence* get_last_seq(); +struct Sequence* get_forground_frame_seq( int frame ); +void set_last_seq(struct Sequence * seq); +void clear_last_seq(); +void del_seq(void); +void enter_meta(void); +void exit_meta(void); +struct Sequence* find_neighboring_sequence(struct Sequence *test, int lr, int sel); +struct Sequence* find_next_prev_sequence(struct Sequence *test, int lr, int sel); +struct Sequence* find_nearest_seq(int *hand); +int insert_gap(int gap, int cfra); +void make_meta(void); +void select_channel_direction(struct Sequence *test,int lr); +void select_more_seq(void); +void select_less_seq(void); +void mouse_select_seq(void); +void no_gaps(void); +void seq_snap(short event); +void seq_snap_menu(void); +void set_filter_seq(void); +void swap_select_seq(void); +void touch_seq_files(void); +void seq_remap_paths(void); +void transform_seq(int mode, int context); +void transform_seq_nomarker(int mode, int context); +void un_meta(void); +void seq_cut(int cutframe); +void seq_separate_images(void); +void reassign_inputs_seq_effect(void); +void select_surrounding_handles(struct Sequence *test); +void select_surround_from_last(); +void select_dir_from_last(int lr); +void select_neighbor_from_last(int lr); +void select_linked_seq(int mode); +struct Sequence* alloc_sequence(ListBase *lb, int cfra, int machine); /*used from python*/ +int check_single_seq(struct Sequence *seq); + +/* sequence transform functions, for internal used */ +int seq_tx_get_start(struct Sequence *seq); +int seq_tx_get_end(struct Sequence *seq); + +int seq_tx_get_final_left(struct Sequence *seq); +int seq_tx_get_final_right(struct Sequence *seq); + +void seq_tx_set_final_left(struct Sequence *seq, int i); +void seq_tx_set_final_right(struct Sequence *seq, int i); + +/* check if one side can be transformed */ +int seq_tx_check_left(struct Sequence *seq); +int seq_tx_check_right(struct Sequence *seq); + +#define SEQ_DEBUG_INFO(seq) printf("seq into '%s' -- len:%i start:%i startstill:%i endstill:%i startofs:%i endofs:%i\n",\ + seq->name, seq->len, seq->start, seq->startstill, seq->endstill, seq->startofs, seq->endofs) + +/* seq macro's for transform + notice the difference between start/end and left/right. + + left and right are the bounds at which the setuence is rendered, +start and end are from the start and fixed length of the sequence. +*/ +/* +#define SEQ_GET_START(seq) (seq->start) +#define SEQ_GET_END(seq) (seq->start+seq->len) + +#define SEQ_GET_FINAL_LEFT(seq) ((seq->start - seq->startstill) + seq->startofs) +#define SEQ_GET_FINAL_RIGHT(seq) (((seq->start+seq->len) + seq->endstill) - seq->endofs) + +#define SEQ_SET_FINAL_LEFT(seq, val) \ + if (val < (seq)->start) { \ + (seq)->startstill = abs(val - (seq)->start); \ + (seq)->startofs = 0; \ +} else { \ + (seq)->startofs = abs(val - (seq)->start); \ + (seq)->startstill = 0; \ +} + +#define SEQ_SET_FINAL_RIGHT(seq, val) \ + if (val > (seq)->start + (seq)->len) { \ + (seq)->endstill = abs(val - ((seq)->start + (seq)->len)); \ + (seq)->endofs = 0; \ +} else { \ + (seq)->endofs = abs(val - ((seq)->start + (seq)->len)); \ + (seq)->endstill = 0; \ +} +*/ +/* drawseq.c */ +void do_seqbuttons(short); + +#endif + diff --git a/source/blender/editors/include/BIF_editsima.h b/source/blender/editors/include/BIF_editsima.h new file mode 100644 index 00000000000..530c07a2778 --- /dev/null +++ b/source/blender/editors/include/BIF_editsima.h @@ -0,0 +1,112 @@ +/** + * $Id: BIF_editsima.h 12667 2007-11-25 13:43:14Z campbellbarton $ + * + * ***** 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 ***** + */ + +struct Mesh; +struct EditMesh; +struct SpaceImage; +struct EditFace; +struct MTFace; + +/* id can be from 0 to 3 */ +#define TF_PIN_MASK(id) (TF_PIN1 << id) +#define TF_SEL_MASK(id) (TF_SEL1 << id) + +struct Object; + +void object_uvs_changed(struct Object *ob); +void object_tface_flags_changed(struct Object *ob, int updateButtons); + +int is_uv_tface_editing_allowed(void); +int is_uv_tface_editing_allowed_silent(void); + +void get_connected_limit_tface_uv(float *limit); +int minmax_tface_uv(float *min, float *max); +int cent_tface_uv(float *cent, int mode); + +void transform_width_height_tface_uv(int *width, int *height); +void transform_aspect_ratio_tface_uv(float *aspx, float *aspy); + +void mouseco_to_cursor_sima(void); +void borderselect_sima(short whichuvs); +void mouseco_to_curtile(void); +void mouse_select_sima(void); +void snap_menu_sima(void); +void aspect_sima(struct SpaceImage *sima, float *x, float *y); + +void select_invert_tface_uv(void); +void select_swap_tface_uv(void); +void mirrormenu_tface_uv(void); +void mirror_tface_uv(char mirroraxis); +void hide_tface_uv(int swap); +void reveal_tface_uv(void); +void stitch_limit_uv_tface(void); +void stitch_vert_uv_tface(void); +void unlink_selection(void); +void uvface_setsel__internal(short select); +void select_linked_tface_uv(int mode); +void pin_tface_uv(int mode); +void weld_align_menu_tface_uv(void); +void weld_align_tface_uv(char tool); +void be_square_tface_uv(struct EditMesh *em); +void select_pinned_tface_uv(void); + +void sima_sample_color(void); + +#define UV_SELECT_ALL 1 +#define UV_SELECT_PINNED 2 + +void new_image_sima(void); +void reload_image_sima(void); +void save_image_sima(void); +void save_as_image_sima(void); +void save_image_sequence_sima(void); +void replace_image_sima(short imageselect); +void open_image_sima(short imageselect); +void pack_image_sima(void); + +/* checks images for forced updates on frame change */ +void BIF_image_update_frame(void); + +void find_nearest_uv(struct MTFace **nearesttf, struct EditFace **nearestefa, unsigned int *nearestv, int *nearestuv); + +/* face selection check functions */ + +int simaFaceDraw_Check_nolocal( struct EditFace *efa ); +int simaFaceDraw_Check( struct EditFace *efa, struct MTFace *tf ); + +int simaFaceSel_Check( struct EditFace *efa, struct MTFace *tf ); +void simaFaceSel_Set( struct EditFace *efa, struct MTFace *tf ); +void simaFaceSel_UnSet( struct EditFace *efa, struct MTFace *tf ); + +int simaUVSel_Check( struct EditFace *efa, struct MTFace *tf, int i); +void simaUVSel_Set( struct EditFace *efa, struct MTFace *tf, int i); +void simaUVSel_UnSet( struct EditFace *efa, struct MTFace *tf, int i); diff --git a/source/blender/editors/include/BIF_editsound.h b/source/blender/editors/include/BIF_editsound.h new file mode 100644 index 00000000000..e326409af89 --- /dev/null +++ b/source/blender/editors/include/BIF_editsound.h @@ -0,0 +1,87 @@ +/** + * $Id: BIF_editsound.h 12320 2007-10-21 15:42:08Z schlaile $ + * + * ***** 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 BIF_EDITSOUND_H +#define BIF_EDITSOUND_H + +struct bSound; +struct bSample; +struct ListBase; +struct PackedFile; +struct hdaudio; + +void sound_init_audio(void); +void sound_initialize_sounds(void); +void sound_exit_audio(void); +int sound_get_mixrate(void); + +void* sound_get_audiodevice(void); +void* sound_get_listener(void); + +int sound_set_sample(struct bSound* sound, struct bSample* sample); +int sound_sample_is_null(struct bSound* sound); +int sound_load_sample(struct bSound* sound); + +struct bSample* sound_find_sample(struct bSound* sound); +struct bSample* sound_new_sample(struct bSound* sound); + +struct bSound* sound_new_sound(char *name); +struct bSound* sound_make_copy(struct bSound* originalsound); +void sound_end_all_sounds(void); + +void sound_initialize_sample(struct bSound * sound); +void sound_load_samples(void); + +void sound_play_sound(struct bSound *sound); +void sound_stop_all_sounds(void); + +void sound_set_position(void *object, + struct bSound *sound, + float obmatrix[4][4]); + +struct hdaudio * sound_open_hdaudio(char * name); +struct hdaudio * sound_copy_hdaudio(struct hdaudio * c); + +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 */, + int target_rate, + int target_channels, + int nb_samples /* in target */); + +void sound_close_hdaudio(struct hdaudio * hdaudio); + + + +#endif + diff --git a/source/blender/editors/include/BIF_editview.h b/source/blender/editors/include/BIF_editview.h new file mode 100644 index 00000000000..17d7d53ee93 --- /dev/null +++ b/source/blender/editors/include/BIF_editview.h @@ -0,0 +1,61 @@ +/** + * $Id: BIF_editview.h 12682 2007-11-26 22:09:57Z blendix $ + * + * ***** 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 BIF_EDITVIEW_H +#define BIF_EDITVIEW_H + +struct Base; +struct Object; +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 selectall_type(short obtype); +void selectall_layer(unsigned int layernum); +void draw_sel_circle(short *mval, short *mvalo, float rad, float rado, int selecting); +void fly(void); +int gesture(void); +void mouse_cursor(void); +void mouse_select(void); +void set_active_base(struct Base *base); +void set_active_object(struct Object *ob); +void set_render_border(void); +void view3d_border_zoom(void); +void view3d_edit_clipping(struct View3D *v3d); + +#endif + diff --git a/source/blender/editors/include/BIF_filelist.h b/source/blender/editors/include/BIF_filelist.h new file mode 100644 index 00000000000..e2e70054f8b --- /dev/null +++ b/source/blender/editors/include/BIF_filelist.h @@ -0,0 +1,86 @@ +/** + * $Id: BIF_filelist.h 12544 2007-11-10 09:11:42Z elubie $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef BIF_FILELIST_H +#define BIF_FILELIST_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct FileList; +struct direntry; +struct BlendHandle; + +struct FileList * BIF_filelist_new(); +void BIF_filelist_init_icons(); +void BIF_filelist_free_icons(); +struct FileList * BIF_filelist_copy(struct FileList* filelist); +int BIF_filelist_find(struct FileList* filelist, char *file); +void BIF_filelist_free(struct FileList* filelist); +void BIF_filelist_freelib(struct FileList* filelist); +void BIF_filelist_sort(struct FileList* filelist, short sort); +int BIF_filelist_numfiles(struct FileList* filelist); +const char * BIF_filelist_dir(struct FileList* filelist); +void BIF_filelist_setdir(struct FileList* filelist, const char *dir); +struct direntry * BIF_filelist_file(struct FileList* filelist, int index); +void BIF_filelist_hidedot(struct FileList* filelist, short hide); +void BIF_filelist_setfilter(struct FileList* filelist, unsigned int filter); +void BIF_filelist_filter(struct FileList* filelist); +void BIF_filelist_swapselect(struct FileList* filelist); +void BIF_filelist_imgsize(struct FileList* filelist, short w, short h); +void BIF_filelist_loadimage(struct FileList* filelist, int index); +struct ImBuf * BIF_filelist_getimage(struct FileList* filelist, int index); + +void BIF_filelist_readdir(struct FileList* filelist); + +int BIF_filelist_empty(struct FileList* filelist); +void BIF_filelist_parent(struct FileList* filelist); +void BIF_filelist_setfiletypes(struct FileList* filelist, short has_quicktime); +int BIF_filelist_islibrary (struct FileList* filelist, char* dir, char* group); +void BIF_filelist_from_main(struct FileList* filelist); +void BIF_filelist_from_library(struct FileList* filelist); +void BIF_filelist_append_library(struct FileList* filelist, char *dir, char* file, short flag, int idcode); +void BIF_filelist_settype(struct FileList* filelist, int type); +short BIF_filelist_gettype(struct FileList* filelist); +void BIF_filelist_setipotype(struct FileList* filelist, short ipotype); +void BIF_filelist_hasfunc(struct FileList* filelist, int has_func); + +struct BlendHandle *BIF_filelist_lib(struct FileList* filelist); +int BIF_groupname_to_code(char *group); /* TODO: where should this go */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/source/blender/editors/include/BIF_fsmenu.h b/source/blender/editors/include/BIF_fsmenu.h new file mode 100644 index 00000000000..9f1844e34d3 --- /dev/null +++ b/source/blender/editors/include/BIF_fsmenu.h @@ -0,0 +1,76 @@ +/** + * $Id: BIF_fsmenu.h 11920 2007-09-02 17:25:03Z elubie $ + * + * ***** 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 BSE_FSMENU_H +#define BSE_FSMENU_H + + /** Returns the number of entries in the Fileselect Menu */ +int fsmenu_get_nentries (void); + + /** Returns true if the fsmenu entry at @a index exists and + * is a seperator. + */ +int fsmenu_is_entry_a_seperator (int index); + + /** Returns the fsmenu entry at @a index (or NULL if a bad index) + * or a seperator. + */ +char* fsmenu_get_entry (int index); + + /** Returns a new menu description string representing the + * fileselect menu. Should be free'd with MEM_freeN. + */ +char* fsmenu_build_menu (void); + + /** Append a seperator to the FSMenu, inserts always follow the + * last seperator. + */ +void fsmenu_append_separator (void); + + /** Inserts a new fsmenu entry with the given @a path. + * Duplicate entries are not added. + * @param sorted Should entry be inserted in sorted order? + */ +void fsmenu_insert_entry (char *path, int sorted, short save); + + /** Removes the fsmenu entry at the given @a index. */ +void fsmenu_remove_entry (int index); + + /** saves the 'favourites' to the specified file */ +void fsmenu_write_file(const char *filename); + + /** Free's all the memory associated with the fsmenu */ +void fsmenu_free (void); + +#endif + diff --git a/source/blender/editors/include/BIF_gl.h b/source/blender/editors/include/BIF_gl.h new file mode 100644 index 00000000000..3b23e534229 --- /dev/null +++ b/source/blender/editors/include/BIF_gl.h @@ -0,0 +1,82 @@ +/** + * $Id: BIF_gl.h 10455 2007-04-04 13:18:41Z campbellbarton $ + * + * ***** 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 ***** + * os dependent include locations of gl.h + */ + +#ifndef BIF_GL_H +#define BIF_GL_H + + /* Although not really a great idea to copy these defines + * from Windows' winnt.h, this lets us use GL without including + * windows.h everywhere (or BLI_winstuff.h) which is a good thing. + */ +#ifdef WIN32 +#ifndef APIENTRY +#define APIENTRY __stdcall +#endif + +#ifndef CALLBACK +#define CALLBACK __stdcall +#endif + +#ifndef WINGDIAPI +#define WINGDIAPI __declspec(dllimport) +#endif +#endif + +#ifdef __APPLE__ +#include +#include +#else +#include +#include +#endif + /* + * these should be phased out. cpack should be replaced in + * code with calls to glColor3ub, lrectwrite probably should + * change to a function. - zr + */ + +/* + * + * This define converts a numerical value to the equivalent 24-bit + * color, while not being endian-sensitive. On little-endians, this + * is the same as doing a 'naive'indexing, on big-endian, it is not! + * */ +#define cpack(x) glColor3ub( ((x)&0xFF), (((x)>>8)&0xFF), (((x)>>16)&0xFF) ) + +#define glMultMatrixf(x) glMultMatrixf( (float *)(x)) +#define glLoadMatrixf(x) glLoadMatrixf( (float *)(x)) + +#define lrectwrite(a, b, c, d, rect) {glRasterPos2i(a, b);glDrawPixels((c)-(a)+1, (d)-(b)+1, GL_RGBA, GL_UNSIGNED_BYTE, rect);} + +#endif /* #ifdef BIF_GL_H */ + diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h new file mode 100644 index 00000000000..93ca90ce12f --- /dev/null +++ b/source/blender/editors/include/BIF_glutil.h @@ -0,0 +1,225 @@ +/** + * @file BIF_glutil.h + * + * OpenGL drawing utility functions. + * + * $Id: BIF_glutil.h 10207 2007-03-06 03:39:15Z halley $ + * + * ***** 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 BIF_GLUTIL_H +#define BIF_GLUTIL_H + +struct rcti; +struct rctf; + +void sdrawXORline(int x0, int y0, int x1, int y1); +void sdrawXORline4(int nr, int x0, int y0, int x1, int y1); + +void fdrawXORellipse(float xofs, float yofs, float hw, float hh); +void fdrawXORcirc(float xofs, float yofs, float rad); + + /** + * Draw an XOR'd line in the front buffer between + * the given points. + * + * @attention This function also handles flushing the GL + * pipeline, which means it is inappropriate for drawing + * a large number of lines at once. + */ +void glutil_draw_front_xor_line(int x0, int y0, int x1, int y1); + + /** + * Draw a lined (non-looping) arc with the given + * @a radius, starting at angle @a start and arcing + * through @a angle. The arc is centered at the origin + * and drawn in the XY plane. + * + * @param start The initial angle (in radians). + * @param angle The length of the arc (in radians). + * @param radius The arc radius. + * @param nsegments The number of segments to use in drawing the arc. + */ +void glutil_draw_lined_arc (float start, float angle, float radius, int nsegments); + + /** + * Draw a filled arc with the given @a radius, + * starting at angle @a start and arcing through + * @a angle. The arc is centered at the origin + * and drawn in the XY plane. + * + * @param start The initial angle (in radians). + * @param angle The length of the arc (in radians). + * @param radius The arc radius. + * @param nsegments The number of segments to use in drawing the arc. + */ +void glutil_draw_filled_arc (float start, float angle, float radius, int nsegments); + + /** + * Routines an integer value as obtained by glGetIntegerv. + * The param must cause only one value to be gotten from GL. + */ +int glaGetOneInteger (int param); + + /** + * Routines a float value as obtained by glGetIntegerv. + * The param must cause only one value to be gotten from GL. + */ +float glaGetOneFloat (int param); + + /** + * Functions like glRasterPos2i, except ensures that the resulting + * raster position is valid. @a known_good_x and @a known_good_y + * should be coordinates of a point known to be within the current + * view frustum. + * @attention This routine should be used when the distance of @a x + * and @y away from the known good point is small (ie. for small icons + * and for bitmap characters), when drawing large+zoomed images it is + * possible for overflow to occur, the glaDrawPixelsSafe routine should + * be used instead. + */ +void glaRasterPosSafe2f (float x, float y, float known_good_x, float known_good_y); + + /** + * Functions like a limited glDrawPixels, except ensures that + * the image is displayed onscreen even if the @a x and @a y + * coordinates for would be clipped. The routine respects the + * glPixelZoom values, pixel unpacking parameters are _not_ + * respected. + + * @attention This routine makes many assumptions: the rect data + * is expected to be in RGBA unsigned byte format, the coordinate + * (0.375, 0.375) is assumed to be within the view frustum, and the + * modelview and projection matrices are assumed to define a + * 1-to-1 mapping to screen space. + * @attention Furthmore, in the case of zoomed or unpixel aligned + * images extending outside the view frustum, but still within the + * window, some portion of the image may be visible left and/or + * below of the given @a x and @a y coordinates. It is recommended + * to use the glScissor functionality if images are to be drawn + * with an inset view matrix. + */ +void glaDrawPixelsSafe (float x, float y, int img_w, int img_h, int row_w, int format, int type, void *rect); + + /** + * Functions like a limited glDrawPixels, but actually draws the + * image using textures, which can be tremendously faster on low-end + * cards, and also avoids problems with the raster position being + * clipped when offscreen. The routine respects the glPixelZoom values, + * pixel unpacking parameters are _not_ respected. + + * @attention This routine makes many assumptions: the rect data + * is expected to be in RGBA byte or float format, and the + * modelview and projection matrices are assumed to define a + * 1-to-1 mapping to screen space. + */ + + /* only for float rects, converts to 32 bits and draws */ +void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf); + + +void glaDrawPixelsTex (float x, float y, int img_w, int img_h, int format, void *rect); + + /* 2D Drawing Assistance */ + + /** Define a 2D area (viewport, scissor, matrices) for OpenGL rendering. + * This routine sets up an OpenGL state appropriate for drawing using + * both vertice (glVertex, etc) and raster (glRasterPos, glRect) commands. + * All coordinates should be at integer positions. There is little to + * no reason to use glVertex2f etc. functions during 2D rendering, and + * thus no reason to +-0.5 the coordinates or perform other silly + * tricks. + * + * @param screen_rect The screen rectangle to be defined for 2D drawing. + */ +void glaDefine2DArea (struct rcti *screen_rect); + +typedef struct gla2DDrawInfo gla2DDrawInfo; + + /** Save the current OpenGL state and initialize OpenGL for 2D + * rendering. glaEnd2DDraw should be called on the returned structure + * to free it and to return OpenGL to its previous state. The + * scissor rectangle is set to match the viewport. + * + * This routine sets up an OpenGL state appropriate for drawing using + * both vertice (glVertex, etc) and raster (glRasterPos, glRect) commands. + * All coordinates should be at integer positions. There is little to + * no reason to use glVertex2f etc. functions during 2D rendering, and + * thus no reason to +-0.5 the coordinates or perform other silly + * tricks. + * + * @param screen_rect The screen rectangle to be used for 2D drawing. + * @param world_rect The world rectangle that the 2D area represented + * by @a screen_rect is supposed to represent. If NULL it is assumed the + * world has a 1 to 1 mapping to the screen. + */ +gla2DDrawInfo* glaBegin2DDraw (struct rcti *screen_rect, struct rctf *world_rect); + + /** Translate the (@a wo_x, @a wo_y) point from world coordinates into screen space. */ +void gla2DDrawTranslatePt (gla2DDrawInfo *di, float wo_x, float wo_y, int *sc_x_r, int *sc_y_r); + + /** Translate the @a world point from world coordiantes into screen space. */ +void gla2DDrawTranslatePtv (gla2DDrawInfo *di, float world[2], int screen_r[2]); + + /* Restores the previous OpenGL state and free's the auxilary + * gla data. + */ +void glaEnd2DDraw (gla2DDrawInfo *di); + + /** Adjust the transformation mapping of a 2d area */ +void gla2DGetMap(gla2DDrawInfo *di, struct rctf *rect); +void gla2DSetMap(gla2DDrawInfo *di, struct rctf *rect); + + +/* use this for platform hacks. glPointSize is solved here */ +void bglBegin(int mode); +void bglEnd(void); +void bglVertex3fv(float *vec); +void bglVertex3f(float x, float y, float z); +void bglVertex2fv(float *vec); +/* intel gfx cards frontbuffer problem */ +void bglFlush(void); +int is_a_really_crappy_intel_card(void); +void set_inverted_drawing(int enable); + + +/* own working polygon offset */ +void bglPolygonOffset(float dist); + +/* For caching opengl matrices (gluProject/gluUnProject) */ +typedef struct bglMats { + double modelview[16]; + double projection[16]; + int viewport[4]; +} bglMats; +void bgl_get_mats(bglMats *mats); + +#endif /* BIF_GLUTIL_H */ + diff --git a/source/blender/editors/include/BIF_graphics.h b/source/blender/editors/include/BIF_graphics.h new file mode 100644 index 00000000000..3cc4098a7c4 --- /dev/null +++ b/source/blender/editors/include/BIF_graphics.h @@ -0,0 +1,59 @@ +/** + * $Id: BIF_graphics.h 6596 2006-01-29 22:25:53Z broken $ + * + * ***** 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 BIF_GRAPHICS_H +#define BIF_GRAPHICS_H + + /* XXX, should move somewhere else, with collected windowing + * stuff, to be done once the proper windowing stuff has + * been formed. + */ + +enum { + CURSOR_VPAINT, + CURSOR_FACESEL, + CURSOR_WAIT, + CURSOR_EDIT, + CURSOR_X_MOVE, + CURSOR_Y_MOVE, + CURSOR_HELP, + CURSOR_STD, + CURSOR_NONE, + CURSOR_PENCIL, + CURSOR_TEXTEDIT +}; + +void set_cursor(int curs); +int get_cursor(void); + +#endif /* BIF_GRAPHICS_H */ + diff --git a/source/blender/editors/include/BIF_imasel.h b/source/blender/editors/include/BIF_imasel.h new file mode 100644 index 00000000000..b08f6664e2a --- /dev/null +++ b/source/blender/editors/include/BIF_imasel.h @@ -0,0 +1,51 @@ +/** + * $Id: BIF_imasel.h 11920 2007-09-02 17:25:03Z elubie $ + * + * ***** 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 BIF_IMASEL_H +#define BIF_IMASEL_H + +struct SpaceImaSel; +struct ScrArea; + +void free_imasel(struct SpaceImaSel *simasel); + +void clever_numbuts_imasel(void); + +void activate_imageselect(int type, char *title, char *file, void (*func)(char *)); +void activate_imageselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *)); +void activate_imageselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2); + +void activate_databrowse_imasel(struct ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short)); +/* +void activate_databrowse_imasel_args(struct ID *id, int idcode, int fromcode, short *menup, void (*func)(char *, void *, void *), void *arg1, void *arg2); +*/ +#endif + diff --git a/source/blender/editors/include/BIF_interface.h b/source/blender/editors/include/BIF_interface.h new file mode 100644 index 00000000000..d430105ab35 --- /dev/null +++ b/source/blender/editors/include/BIF_interface.h @@ -0,0 +1,331 @@ +/** + * $Id: BIF_interface.h 11429 2007-07-30 15:59:16Z pidhash $ + * + * ***** 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 BIF_INTERFACE_H +#define BIF_INTERFACE_H + +struct ID; +struct ListBase; +struct ScrArea; +struct AutoComplete; + +/* uiBlock->dt */ +#define UI_EMBOSS 0 /* use one of the themes for drawing */ +#define UI_EMBOSSN 1 /* Nothing */ +#define UI_EMBOSSM 2 /* Minimal builtin emboss, also for logic buttons */ +#define UI_EMBOSSP 3 /* Pulldown */ +#define UI_EMBOSSR 4 /* Rounded */ + +#define UI_EMBOSSX 0 /* for a python file, which i can't change.... duh! */ + +/* uiBlock->direction */ +#define UI_TOP 1 +#define UI_DOWN 2 +#define UI_LEFT 4 +#define UI_RIGHT 8 +#define UI_DIRECTION 15 +#define UI_CENTER 16 +#define UI_SHIFT_FLIPPED 32 + +/* uiBlock->autofill */ +#define UI_BLOCK_COLLUMNS 1 +#define UI_BLOCK_ROWS 2 + +/* return from uiDoBlock */ +#define UI_CONT 0 +#define UI_NOTHING 1 +#define UI_RETURN_CANCEL 2 +#define UI_RETURN_OK 4 +#define UI_RETURN_OUT 8 +#define UI_RETURN 14 +#define UI_EXIT_LOOP 16 + +/* uiBlock->flag (controls) */ +#define UI_BLOCK_LOOP 1 +#define UI_BLOCK_REDRAW 2 +#define UI_BLOCK_RET_1 4 +#define UI_BLOCK_BUSY 8 +#define UI_BLOCK_NUMSELECT 16 +#define UI_BLOCK_ENTER_OK 32 +#define UI_BLOCK_NOSHADOW 64 +#define UI_BLOCK_FRONTBUFFER 128 +#define UI_BLOCK_NO_HILITE 256 + + /* block->flag bits 12-15 are identical to but->flag bits */ + +/* block->font, for now: bold = medium+1 */ +#define UI_HELV 0 +#define UI_HELVB 1 + +/* panel controls */ +#define UI_PNL_TRANSP 1 +#define UI_PNL_SOLID 2 + +#define UI_PNL_CLOSE 32 +#define UI_PNL_STOW 64 +#define UI_PNL_TO_MOUSE 128 +#define UI_PNL_UNSTOW 256 +#define UI_PNL_SCALE 512 + +/* warning the first 4 flags are internal */ +/* but->flag */ +#define UI_TEXT_LEFT 16 +#define UI_ICON_LEFT 32 +#define UI_ICON_RIGHT 64 + /* control for button type block */ +#define UI_MAKE_TOP 128 +#define UI_MAKE_DOWN 256 +#define UI_MAKE_LEFT 512 +#define UI_MAKE_RIGHT 1024 + /* dont draw hilite on mouse over */ +#define UI_NO_HILITE 2048 + /* button align flag, for drawing groups together */ +#define UI_BUT_ALIGN (15<<12) +#define UI_BUT_ALIGN_TOP (1<<12) +#define UI_BUT_ALIGN_LEFT (1<<13) +#define UI_BUT_ALIGN_RIGHT (1<<14) +#define UI_BUT_ALIGN_DOWN (1<<15) + + +/* Button types, bits stored in 1 value... and a short even! +- bits 0-4: bitnr (0-31) +- bits 5-7: pointer type +- bit 8: for 'bit' +- bit 9-15: button type (now 6 bits, 64 types) +*/ + +#define CHA 32 +#define SHO 64 +#define INT 96 +#define FLO 128 +#define FUN 192 +#define BIT 256 + +#define BUTPOIN (128+64+32) + +#define BUT (1<<9) +#define ROW (2<<9) +#define TOG (3<<9) +#define SLI (4<<9) +#define NUM (5<<9) +#define TEX (6<<9) +#define TOG3 (7<<9) +#define TOGR (8<<9) +#define TOGN (9<<9) +#define LABEL (10<<9) +#define MENU (11<<9) +#define ICONROW (12<<9) +#define ICONTOG (13<<9) +#define NUMSLI (14<<9) +#define COL (15<<9) +#define IDPOIN (16<<9) +#define HSVSLI (17<<9) +#define SCROLL (18<<9) +#define BLOCK (19<<9) +#define BUTM (20<<9) +#define SEPR (21<<9) +#define LINK (22<<9) +#define INLINK (23<<9) +#define KEYEVT (24<<9) +#define ICONTEXTROW (25<<9) +#define HSVCUBE (26<<9) +#define PULLDOWN (27<<9) +#define ROUNDBOX (28<<9) +#define CHARTAB (29<<9) +#define BUT_COLORBAND (30<<9) +#define BUT_NORMAL (31<<9) +#define BUT_CURVE (32<<9) +#define BUT_TOGDUAL (33<<9) +#define ICONTOGN (34<<9) +#define FTPREVIEW (35<<9) +#define BUTTYPE (63<<9) + + + +typedef struct uiBut uiBut; +typedef struct uiBlock uiBlock; + +void uiEmboss(float x1, float y1, float x2, float y2, int sel); +void uiRoundBoxEmboss(float minx, float miny, float maxx, float maxy, float rad, int active); +void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad); +void uiSetRoundBox(int type); +void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad); + +void uiDrawMenuBox(float minx, float miny, float maxx, float maxy, short flag); +void uiTextBoundsBlock(uiBlock *block, int addval); +void uiBoundsBlock(struct uiBlock *block, int addval); +void uiDrawBlock(struct uiBlock *block); +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); +void uiSetCurFont(uiBlock *block, int index); +void uiDefFont(unsigned int index, void *xl, void *large, void *medium, void *small); +void uiFreeBlock(uiBlock *block); +void uiFreeBlocks(struct ListBase *lb); +void uiFreeBlocksWin(struct ListBase *lb, int win); +uiBlock *uiNewBlock(struct ListBase *lb, char *name, short dt, short font, short win); +uiBlock *uiGetBlock(char *name, struct ScrArea *sa); + +void uiBlockPickerButtons(struct uiBlock *block, float *col, float *hsv, float *old, char *hexcol, char mode, short retval); + + +/* automatic aligning, horiz or verical */ +void uiBlockBeginAlign(uiBlock *block); +void uiBlockEndAlign(uiBlock *block); + +uiBut *uiDefBut(uiBlock *block, + int type, int retval, char *str, + short x1, short y1, + short x2, short y2, + void *poin, + float min, float max, + float a1, float a2, char *tip); +uiBut *uiDefButF(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefButI(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefButS(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefButC(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip); + +uiBut *uiDefIconBut(uiBlock *block, + int type, int retval, int icon, + short x1, short y1, + short x2, short y2, + void *poin, + float min, float max, + float a1, float a2, char *tip); +uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip); + +uiBut *uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip); + +uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip); +uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip); + +typedef void (*uiIDPoinFuncFP) (char *str, struct ID **idpp); +uiBut *uiDefIDPoinBut(struct uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, char *str, + short x1, short y1, short x2, short y2, void *idpp, char *tip); + +typedef uiBlock* (*uiBlockFuncFP) (void *arg1); +uiBut *uiDefBlockBut(uiBlock *block, uiBlockFuncFP func, void *func_arg1, char *str, short x1, short y1, short x2, short y2, char *tip); +uiBut *uiDefPulldownBut(uiBlock *block, uiBlockFuncFP func, void *func_arg1, char *str, short x1, short y1, short x2, short y2, char *tip); + +uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockFuncFP func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip); +uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockFuncFP func, void *arg, int retval, int icon, short x1, short y1, short x2, short y2, char *tip); + +void uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip); + +void uiAutoBlock(struct uiBlock *block, + float minx, float miny, + float sizex, float sizey, int flag); +void uiSetButLink(struct uiBut *but, + void **poin, + void ***ppoin, + short *tot, + int from, int to); + +int uiBlocksGetYMin (ListBase *lb); +int uiBlockGetCol (uiBlock *block); +void* uiBlockGetCurFont (uiBlock *block); + +void uiBlockSetCol (uiBlock *block, int col); +void uiBlockSetEmboss (uiBlock *block, int emboss); +void uiBlockSetDirection (uiBlock *block, int direction); +void uiBlockFlipOrder (uiBlock *block); +void uiBlockSetFlag (uiBlock *block, int flag); +void uiBlockSetXOfs (uiBlock *block, int xofs); + +int uiButGetRetVal (uiBut *but); + +void uiButSetFlag (uiBut *but, int flag); +void uiButClearFlag (uiBut *but, int flag); + +void uiBlockSetButmFunc (uiBlock *block, void (*butmfunc)(void *arg, int but_a2), void *arg); + +void uiBlockSetFunc (uiBlock *block, void (*func)(void *arg1, void *arg2), void *arg1, void *arg2); +void uiButSetFunc (uiBut *but, void (*func)(void *arg1, void *arg2), void *arg1, void *arg2); + +void uiButSetCompleteFunc(uiBut *but, void (*func)(char *str, void *arg), void *arg); + +void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(struct ScrArea *sa, uiBlock *block)); + + +extern void pupmenu_set_active(int val); +extern short pupmenu(char *instr); +extern short pupmenu_col(char *instr, int maxrow); + +extern void uiFreePanels(struct ListBase *lb); +extern void uiNewPanelTabbed(char *, char *); +extern int uiNewPanel(struct ScrArea *sa, struct uiBlock *block, char *panelname, char *tabname, int ofsx, int ofsy, int sizex, int sizey); + +extern void uiSetPanel_view2d(struct ScrArea *sa); +extern void uiMatchPanel_view2d(struct ScrArea *sa); + +extern void uiDrawBlocksPanels(struct ScrArea *sa, int re_align); +extern void uiNewPanelHeight(struct uiBlock *block, int sizey); +extern void uiNewPanelTitle(struct uiBlock *block, char *str); +extern void uiPanelPush(struct uiBlock *block); +extern void uiPanelPop(struct uiBlock *block); +extern uiBlock *uiFindOpenPanelBlockName(ListBase *lb, char *name); +extern int uiAlignPanelStep(struct ScrArea *sa, float fac); +extern void uiPanelControl(int); +extern void uiSetPanelHandler(int); + +extern void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, float maxy); +extern void *uiSetCurFont_ext(float aspect); + +void shade_buttons_change_3d(void); + +typedef struct AutoComplete AutoComplete; + +AutoComplete *autocomplete_begin(char *startname, int maxlen); +void autocomplete_do_name(AutoComplete *autocpl, const char *name); +void autocomplete_end(AutoComplete *autocpl, char *autoname); + +#endif /* BIF_INTERFACE_H */ + diff --git a/source/blender/editors/include/BIF_interface_icons.h b/source/blender/editors/include/BIF_interface_icons.h new file mode 100644 index 00000000000..63ce89eef62 --- /dev/null +++ b/source/blender/editors/include/BIF_interface_icons.h @@ -0,0 +1,72 @@ +/** + * $Id: BIF_interface_icons.h 11920 2007-09-02 17:25:03Z elubie $ + * + * ***** 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 BIF_PREVIEW_ICONS_H +#define BIF_PREVIEW_ICONS_H + +struct Image; +struct ImBuf; +struct World; +struct Tex; +struct Lamp; +struct Material; + +typedef struct IconFile { + struct IconFile *next, *prev; + char filename[80]; // FILE_MAXFILE size + int index; +} IconFile; + + +#define ICON_DEFAULT_HEIGHT 16 +#define PREVIEW_DEFAULT_HEIGHT 96 + +/* + Resizable Icons for Blender +*/ +void BIF_icons_init(int first_dyn_id); +int BIF_icon_get_width(int icon_id); +int BIF_icon_get_height(int icon_id); + +void BIF_icon_draw(float x, float y, int icon_id); +void BIF_icon_draw_preview(float x, float y, int icon_id, int nocreate); + +void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect); +void BIF_icon_draw_aspect_blended(float x, float y, int icon_id, float aspect, int shade); +void BIF_icons_free(); +void BIF_icons_free_drawinfo(void *drawinfo); + +struct ListBase *BIF_iconfile_list(void); +int BIF_iconfile_get_index(char *filename); + + +#endif /* BIF_ICONS_H */ diff --git a/source/blender/editors/include/BIF_keyval.h b/source/blender/editors/include/BIF_keyval.h new file mode 100644 index 00000000000..acc34ddfa11 --- /dev/null +++ b/source/blender/editors/include/BIF_keyval.h @@ -0,0 +1,39 @@ +/** + * $Id: BIF_keyval.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 BIF_KEYVAL_H +#define BIF_KEYVAL_H + +char *key_event_to_string(unsigned short event); + +#endif + diff --git a/source/blender/editors/include/BIF_language.h b/source/blender/editors/include/BIF_language.h new file mode 100644 index 00000000000..a1044101bce --- /dev/null +++ b/source/blender/editors/include/BIF_language.h @@ -0,0 +1,69 @@ +/** + * $Id: BIF_language.h 11725 2007-08-20 01:02:12Z broken $ + * + * ***** 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 BIF_LANGUAGE_H +#define BIF_LANGUAGE_H + +#include "DNA_vec_types.h" + +struct BMF_Font; + +int read_languagefile(void); /* usiblender.c */ +void free_languagemenu(void); /* usiblender.c */ + +void set_interface_font(char *str); /* headerbuttons.c */ +void start_interface_font(void); /* headerbuttons.c */ +void lang_setlanguage(void); /* usiblender.c */ + +char *language_pup(void); +char *fontsize_pup(void); + +int BIF_DrawString(struct BMF_Font* font, char *str, int translate); +float BIF_GetStringWidth(struct BMF_Font* font, char *str, int translate); +void BIF_GetBoundingBox(struct BMF_Font* font, char* str, int translate, rctf* bbox); + +void BIF_RasterPos(float x, float y); +void BIF_SetScale(float aspect); +void refresh_interface_font(void); + +struct LANGMenuEntry { + struct LANGMenuEntry *next; + char *line; + char *language; + char *code; + int id; +}; + +struct LANGMenuEntry *find_language(short langid); + +#endif /* BIF_LANGUAGE_H */ + diff --git a/source/blender/editors/include/BIF_mainqueue.h b/source/blender/editors/include/BIF_mainqueue.h new file mode 100644 index 00000000000..3d87a32119d --- /dev/null +++ b/source/blender/editors/include/BIF_mainqueue.h @@ -0,0 +1,47 @@ +/* + * Central queue handling functions. + * + * $Id: BIF_mainqueue.h 9981 2007-01-31 11:24:13Z artificer $ + * + * ***** 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 BIF_MAINQUEUE_H +#define BIF_MAINQUEUE_H + +#define MAXQUEUE 4096 + +unsigned short mainqtest (void); +unsigned short mainqread (short *val, char *ascii); +void mainqenter (unsigned short event, short val); +void mainqenter_ext (unsigned short event, short val, char ascii); +void mainqpushback (unsigned short event, short val, char ascii); + +#endif /* BIF_MAINQUEUE_H */ + diff --git a/source/blender/editors/include/BIF_meshlaplacian.h b/source/blender/editors/include/BIF_meshlaplacian.h new file mode 100644 index 00000000000..74e4fef0937 --- /dev/null +++ b/source/blender/editors/include/BIF_meshlaplacian.h @@ -0,0 +1,87 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * BIF_meshlaplacian.h: Algorithms using the mesh laplacian. + */ + +#ifndef BIF_MESHLAPLACIAN_H +#define BIF_MESHLAPLACIAN_H + +//#define RIGID_DEFORM + +struct Object; +struct Mesh; +struct bDeformGroup; +struct MeshDeformModifierData; + +#ifdef RIGID_DEFORM +struct EditMesh; +#endif + +/* Laplacian System */ + +struct LaplacianSystem; +typedef struct LaplacianSystem LaplacianSystem; + +LaplacianSystem *laplacian_construct_begin(int totvert, int totface); + +void laplacian_add_vertex(LaplacianSystem *sys, float *co, int pinned); +void laplacian_add_triangle(LaplacianSystem *sys, int v1, int v2, int v3); + +void laplacian_construct_end(LaplacianSystem *sys); +void laplacian_delete(LaplacianSystem *sys); + +void laplacian_begin_solve(LaplacianSystem *sys, int index); +void laplacian_add_right_hand_side(LaplacianSystem *sys, int v, float value); +int laplacian_system_solve(LaplacianSystem *sys); +float laplacian_system_get_solution(int v); + +/* Heat Weighting */ + +void heat_bone_weighting(struct Object *ob, struct Mesh *me, float (*verts)[3], + int numbones, struct bDeformGroup **dgrouplist, + struct bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], + int *selected); + +#ifdef RIGID_DEFORM +/* As-Rigid-As-Possible Deformation */ + +void rigid_deform_begin(struct EditMesh *em); +void rigid_deform_iteration(void); +void rigid_deform_end(int cancel); +#endif + +/* Harmonic Coordinates */ + +void harmonic_coordinates_bind(struct MeshDeformModifierData *mmd, + float (*vertexcos)[3], int totvert, float cagemat[][4]); + +#endif + diff --git a/source/blender/editors/include/BIF_meshtools.h b/source/blender/editors/include/BIF_meshtools.h new file mode 100644 index 00000000000..17bbb2393ef --- /dev/null +++ b/source/blender/editors/include/BIF_meshtools.h @@ -0,0 +1,51 @@ +/** + * $Id: + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BIF_MESHTOOLS_H +#define BIF_MESHTOOLS_H + +struct Object; +struct EditVert; + +extern int join_mesh(void); + +extern void sort_faces(void); +extern void objects_bake_render_menu(void); +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/editors/include/BIF_mywindow.h b/source/blender/editors/include/BIF_mywindow.h new file mode 100644 index 00000000000..56976edaba0 --- /dev/null +++ b/source/blender/editors/include/BIF_mywindow.h @@ -0,0 +1,145 @@ + +/** + * $Id: BIF_mywindow.h 10466 2007-04-05 12:42:07Z broken $ + * + * ***** 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 ***** + * These are the protos for mywindow.c -- an emulation of the + * (obsolete) IrisGL command set + */ + +#ifndef BIF_MYWINDOW_H +#define BIF_MYWINDOW_H + +struct rcti; + +/*---*/ + +typedef struct BWinEvent { + unsigned short event; + short val; + char ascii; +} BWinEvent; + +/*---*/ + +int mywinget(void); +void mywinclose(int winid); +void mywinposition(int winid, + int xmin, int xmax, + int ymin, int ymax); +/*---*/ + + /** Test if there are events available on a BWin queue. + * + * @param winid The ID of the window to query. + * @return True if there is an event available for _qread'ing. + */ +int bwin_qtest(int winid); + + /** Read an event off of the BWin queue (if available). + * + * @param winid The ID of the window to read from. + * @param event_r A pointer to return the event in. + * @return True if an event was read and @a event_r filled. + */ +int bwin_qread(int winid, BWinEvent *event_r); + + /** Add an event to the BWin queue. + * + * @param winid The ID of the window to add to. + * @param event A pointer to copy the event from. + */ +void bwin_qadd(int winid, BWinEvent *event); + +/*---*/ + +void bwin_load_viewmatrix(int winid, float mat[][4]); +void bwin_load_winmatrix(int winid, float mat[][4]); + +void bwin_get_viewmatrix(int winid, float mat[][4]); +void bwin_get_winmatrix(int winid, float mat[][4]); + +void bwin_multmatrix(int winid, float mat[][4]); +void bwin_scalematrix(int winid, float x, float y, float z); + +void bwin_ortho(int winid, float x1, float x2, float y1, float y2, float n, float f); +void bwin_ortho2(int win, float x1, float x2, float y1, float y2); +void bwin_frustum(int winid, float x1, float x2, float y1, float y2, float n, float f); + +void bwin_getsize(int winid, int *x, int *y); +void bwin_getsuborigin(int winid, int *x, int *y); +void bwin_get_rect(int winid, struct rcti *rect_r); +void bwin_getsinglematrix(int winid, float mat[][4]); +void bwin_clear_viewmat(int winid); + +int myswinopen(int parentid, int xmin, int xmax, int ymin, int ymax); +int myswinopen_allowed(void); +void myswapbuffers(void); + +void mygetmatrix(float mat[][4]); +void mymultmatrix(float [][4]); + +void myloadmatrix(float mat[][4]); +void mywinset(int wid); +void myortho(float x1, float x2, float y1, float y2, float n, float f); +void myortho2(float x1, float x2, float y1, float y2); +void mywindow(float x1, float x2, float y1, float y2, float n, float f); +void mygetsingmatrix(float (*)[4]); + +void setlinestyle(int nr); + +void BIF_wait_for_statechange(void); + +#define L_MOUSE 1 +#define M_MOUSE 2 +#define R_MOUSE 4 +short get_mbut(void); +short get_qual(void); +void getmouse(short *mval); + +float get_pressure(void); +void get_tilt(float *xtilt, float *ytilt); +#define DEV_MOUSE 0 +#define DEV_STYLUS 1 +#define DEV_ERASER 2 +short get_activedevice(void); + +void warp_pointer(int x, int y); + +int framebuffer_to_index(unsigned int col); +void set_framebuffer_index_color(int index); + +int mywin_inmenu(void); +void mywin_getmenu_rect(int *x, int *y, int *sx, int *sy); + +void my_put_frontbuffer_image(void); +void my_get_frontbuffer_image(int x, int y, int sx, int sy); + +#endif + diff --git a/source/blender/editors/include/BIF_oops.h b/source/blender/editors/include/BIF_oops.h new file mode 100644 index 00000000000..4de725f3021 --- /dev/null +++ b/source/blender/editors/include/BIF_oops.h @@ -0,0 +1,71 @@ +/** + * $Id: BIF_oops.h 3919 2005-03-09 19:45:59Z lukep $ + * + * ***** 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 BIF_OOPS_H +#define BIF_OOPS_H + +struct Curve; +struct Oops; +struct OopsLink; +struct SpaceOops; +struct Material; +struct Mesh; +struct MetaBall; +struct Object; +struct Lamp; +void add_curve_oopslinks(struct Curve *cu, struct Oops *oops, short flag); +void add_from_link(struct Oops *from, struct Oops *oops); +void add_material_oopslinks(struct Material *ma, struct Oops *oops, short flag); +void add_mball_oopslinks(struct MetaBall *mb, struct Oops *oops, short flag); +void add_mesh_oopslinks(struct Mesh *me, struct Oops *oops, short flag); +void add_object_oopslinks(struct Object *ob, struct Oops *oops, short flag); +void add_lamp_oopslinks(struct Lamp *la, struct Oops *oops, short flag); +struct Oops *add_oops(void *id); +struct OopsLink *add_oopslink(char *name, struct Oops *oops, short type, void *from, float xof, float yof); +struct Oops *add_test_oops(void *id); /* incl links */ +void add_texture_oops(struct Material *ma); +void build_oops(void); +struct Oops *find_oops(ID *id); +void free_oops(struct Oops *oops); /* ook oops zelf */ +void free_oopspace(struct SpaceOops *so); +void new_oops_location(struct Oops *); +int oops_test_overlap(struct Oops *test); +int oops_test_overlaphide(struct Oops *test); +float oopslink_totlen(struct Oops *oops); +void shrink_oops(void); +void shuffle_oops(void); +int test_oops(struct Oops *oops); +void test_oopslink(struct OopsLink *ol); +void test_oopslinko(struct OopsLink *ol); + +#endif + diff --git a/source/blender/editors/include/BIF_outliner.h b/source/blender/editors/include/BIF_outliner.h new file mode 100644 index 00000000000..34ed7950421 --- /dev/null +++ b/source/blender/editors/include/BIF_outliner.h @@ -0,0 +1,106 @@ +/** + * $Id: BIF_outliner.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) 2004 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BIF_OUTLINER_H +#define BIF_OUTLINER_H + +struct TreeStoreElem; + +typedef struct TreeElement { + struct TreeElement *next, *prev, *parent; + ListBase subtree; + float xs, ys; // do selection + int store_index; // offset in tree store + short flag, index; // flag for non-saved stuff, index for data arrays + short idcode; // from TreeStore id + short xend; // width of item display, for select + char *name; + void *directdata; // Armature Bones, Base, ... +} TreeElement; + +/* TreeElement->flag */ +#define TE_ACTIVE 1 +#define TE_ICONROW 2 + +/* TreeStoreElem types */ +#define TSE_NLA 1 +#define TSE_NLA_ACTION 2 +#define TSE_DEFGROUP_BASE 3 +#define TSE_DEFGROUP 4 +#define TSE_BONE 5 +#define TSE_EBONE 6 +#define TSE_CONSTRAINT_BASE 7 +#define TSE_CONSTRAINT 8 +#define TSE_MODIFIER_BASE 9 +#define TSE_MODIFIER 10 +#define TSE_LINKED_OB 11 +#define TSE_SCRIPT_BASE 12 +#define TSE_POSE_BASE 13 +#define TSE_POSE_CHANNEL 14 +/*#ifdef WITH_VERSE*/ +#define TSE_VERSE_SESSION 15 +#define TSE_VERSE_OBJ_NODE 16 +#define TSE_VERSE_GEOM_NODE 17 +/*#endif*/ +#define TSE_PROXY 18 +#define TSE_R_LAYER_BASE 19 +#define TSE_R_LAYER 20 +#define TSE_R_PASS 21 +#define TSE_LINKED_MAT 22 + /* NOTE, is used for light group */ +#define TSE_LINKED_LAMP 23 + +/* outliner search flags */ +#define OL_FIND 0 +#define OL_FIND_CASE 1 +#define OL_FIND_COMPLETE 2 +#define OL_FIND_COMPLETE_CASE 3 + +/* button events */ +#define OL_NAMEBUTTON 1 + +extern void draw_outliner(struct ScrArea *sa, struct SpaceOops *so); +extern void outliner_free_tree(struct ListBase *lb); +extern void outliner_mouse_event(struct ScrArea *sa, short event); +extern void outliner_toggle_visible(struct ScrArea *sa); +extern void outliner_show_active(struct ScrArea *sa); +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_del(struct ScrArea *sa); +extern void outliner_operation_menu(struct ScrArea *sa); +extern void outliner_page_up_down(struct ScrArea *sa, int up); +extern void outliner_find_panel(struct ScrArea *sa, int again, int flags); + +#endif + diff --git a/source/blender/editors/include/BIF_poseobject.h b/source/blender/editors/include/BIF_poseobject.h new file mode 100644 index 00000000000..b427646bffe --- /dev/null +++ b/source/blender/editors/include/BIF_poseobject.h @@ -0,0 +1,71 @@ +/** + * $Id: BIF_poseobject.h 11403 2007-07-28 14:04:02Z blendix $ + * + * ***** 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 BIF_POSEOBJECT +#define BIF_POSEOBJECT + + +struct Object; +struct bPoseChannel; + +void enter_posemode(void); +void exit_posemode(void); + + // sets chan->flag to POSE_KEY if bone selected +void set_pose_keys(struct Object *ob); + +struct bPoseChannel *get_active_posechannel (struct Object *ob); +int pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan); + +/* tools */ +void pose_select_constraint_target(void); +void pose_special_editmenu(void); +void pose_add_IK(void); +void pose_clear_IK(void); +void pose_clear_constraints(void); +void pose_copy_menu(void); + +void free_posebuf(void); +void copy_posebuf (void); +void paste_posebuf (int flip); + +void pose_adds_vgroups(struct Object *meshobj, int heatweights); + +void pose_calculate_path(struct Object *ob); +void pose_clear_paths(struct Object *ob); + +void pose_flip_names(void); +void pose_activate_flipped_bone(void); +void pose_movetolayer(void); + +#endif + diff --git a/source/blender/editors/include/BIF_previewrender.h b/source/blender/editors/include/BIF_previewrender.h new file mode 100644 index 00000000000..0482ee29ebc --- /dev/null +++ b/source/blender/editors/include/BIF_previewrender.h @@ -0,0 +1,94 @@ +/** + * $Id: BIF_previewrender.h 8761 2006-11-06 01:08:26Z nicholasbishop $ + * + * ***** 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 BIF_PREVIEWRENDER_H +#define BIF_PREVIEWRENDER_H + +#include "DNA_vec_types.h" + +struct View3D; +struct SpaceButs; +struct RenderInfo; +struct Image; +struct ScrArea; +struct uiBlock; +struct Render; + +#define PREVIEW_RENDERSIZE 140 + +typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha); + +/* stores rendered preview - is also used for icons */ +typedef struct RenderInfo { + int pr_rectx; + int pr_recty; + short curtile, tottile, status; + rcti disprect; /* storage for view3d preview rect */ + unsigned int* rect; + struct Render *re; /* persistant render */ +} RenderInfo; + +/* ri->status */ +#define PR_DBASE 1 +#define PR_DISPRECT 2 +#define PR_PROJECTED 4 +#define PR_ROTATED 8 + +/* Render the preview + +pr_method: +- PR_DRAW_RENDER: preview is rendered and drawn, as indicated by called context (buttons panel) +- PR_ICON_RENDER: the preview is not drawn and the function is not dynamic, + so no events are processed. Hopefully fast enough for at least 32x32 +- PR_DO_RENDER: preview is rendered, not drawn, but events are processed for afterqueue, + in use for node editor now. +*/ + +#define PR_DRAW_RENDER 0 +#define PR_ICON_RENDER 1 +#define PR_DO_RENDER 2 + +void BIF_previewrender (struct ID *id, struct RenderInfo *ri, struct ScrArea *area, int pr_method); +void BIF_previewrender_buts (struct SpaceButs *sbuts); +void BIF_previewdraw (struct ScrArea *sa, struct uiBlock *block); +void BIF_preview_changed (short id_code); + +void BIF_preview_init_dbase (void); +void BIF_preview_free_dbase (void); + +void BIF_view3d_previewrender(struct ScrArea *sa); +void BIF_view3d_previewdraw (struct ScrArea *sa, struct uiBlock *block); +void BIF_view3d_previewrender_free(struct View3D *v3d); +void BIF_view3d_previewrender_clear(struct ScrArea *sa); +void BIF_view3d_previewrender_signal(struct ScrArea *sa, short signal); + +#endif diff --git a/source/blender/editors/include/BIF_renderwin.h b/source/blender/editors/include/BIF_renderwin.h new file mode 100644 index 00000000000..f73ce53f8dc --- /dev/null +++ b/source/blender/editors/include/BIF_renderwin.h @@ -0,0 +1,67 @@ +/** + * $Id: BIF_renderwin.h 9376 2006-12-20 17:57:56Z ton $ + * + * ***** 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 ***** + */ + +struct Render; +struct ScrArea; +struct RenderStats; + +void calc_renderwin_rectangle(int rectx, int recty, int posmask, int renderpos_r[2], int rendersize_r[2]); + +void BIF_close_render_display(void); + +void BIF_do_render(int anim); + +/** + * @param v3d The View3D space to render. + */ +void BIF_do_ogl_render(struct View3D *v3d, int anim); + +void BIF_renderwin_set_for_ogl_render(void); +void BIF_renderwin_set_custom_cursor(unsigned char mask[16][2], unsigned char bitmap[16][2]); + +void BIF_redraw_render_rect(void); +void BIF_swap_render_rects(void); +void BIF_store_spare(void); +void BIF_toggle_render_display(void); + +void BIF_init_render_callbacks(struct Render *re, int do_display); +void BIF_end_render_callbacks(void); + +/* should not be here, ~WIP~ */ +void make_renderinfo_string(struct RenderStats *rs, char *str); + +/* space for info text */ +#define RW_HEADERY 18 + +/* header print for window */ +#define RW_MAXTEXT 512 + diff --git a/source/blender/editors/include/BIF_resources.h b/source/blender/editors/include/BIF_resources.h new file mode 100644 index 00000000000..96d4cb58f53 --- /dev/null +++ b/source/blender/editors/include/BIF_resources.h @@ -0,0 +1,600 @@ +/** + * $Id: BIF_resources.h 12755 2007-12-02 05:50:38Z aligorith $ + * + * ***** 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 BIF_RESOURCES_H +#define BIF_RESOURCES_H + +/* elubie: TODO: move the typedef for icons to BIF_interface_icons.h */ +/* and add/replace include of BIF_resources.h by BIF_interface_icons.h */ +typedef enum { +#define BIFICONID_FIRST (ICON_VIEW3D) + ICON_VIEW3D, + ICON_IPO, + ICON_OOPS, + ICON_BUTS, + ICON_FILESEL, + ICON_IMAGE_COL, + ICON_INFO, + ICON_SEQUENCE, + ICON_TEXT, + ICON_IMASEL, + ICON_SOUND, + ICON_ACTION, + ICON_NLA, + ICON_SCRIPTWIN, + ICON_TIME, + ICON_NODE, + ICON_SPACE2, + ICON_SPACE3, + ICON_SPACE4, + ICON_TRIA_LEFT, + ICON_TRIA_UP, + ICON_FONTPREVIEW, + ICON_BLANK4, + ICON_BLANK5, + ICON_BLANK6, + + ICON_ORTHO, + ICON_PERSP, + ICON_CAMERA, + ICON_PARTICLES, + ICON_BBOX, + ICON_WIRE, + ICON_SOLID, + ICON_SMOOTH, + ICON_POTATO, + ICON_MARKER_HLT, + ICON_NORMALVIEW, + ICON_LOCALVIEW, + ICON_UNUSEDVIEW, + ICON_VIEWZOOM, + ICON_SORTALPHA, + ICON_SORTTIME, + ICON_SORTSIZE, + ICON_LONGDISPLAY, + ICON_SHORTDISPLAY, + ICON_TRIA_DOWN, + ICON_TRIA_RIGHT, + ICON_BLANK7, + ICON_BLANK8, + ICON_BLANK9, + ICON_BLANK10, + + ICON_VIEW_AXIS_ALL, + ICON_VIEW_AXIS_NONE, + ICON_VIEW_AXIS_NONE2, + ICON_VIEW_AXIS_TOP, + ICON_VIEW_AXIS_FRONT, + ICON_VIEW_AXIS_SIDE, + ICON_POSE_DEHLT, + ICON_POSE_HLT, + ICON_BORDERMOVE, + ICON_MAYBE_ITS_A_LASSO, + ICON_BLANK1, /* ATTENTION, someone decided to use this throughout blender + and didn't care to neither rename it nor update the PNG */ + ICON_VERSE, + ICON_MOD_BOOLEAN, + ICON_ARMATURE, + ICON_PAUSE, + ICON_ALIGN, + ICON_REC, + ICON_PLAY, + ICON_FF, + ICON_REW, + ICON_PYTHON, + ICON_BLANK11, + ICON_BLANK12, + ICON_BLANK13, + ICON_BLANK14, + + + ICON_DOTSUP, + ICON_DOTSDOWN, + ICON_MENU_PANEL, + ICON_AXIS_SIDE, + ICON_AXIS_FRONT, + ICON_AXIS_TOP, + ICON_STICKY_UVS_LOC, + ICON_STICKY_UVS_DISABLE, + ICON_STICKY_UVS_VERT, + ICON_PREV_KEYFRAME, + ICON_NEXT_KEYFRAME, + ICON_ENVMAP, + ICON_TRANSP_HLT, + ICON_TRANSP_DEHLT, + ICON_CIRCLE_DEHLT, + ICON_CIRCLE_HLT, + ICON_TPAINT_DEHLT, + ICON_TPAINT_HLT, + ICON_WPAINT_DEHLT, + ICON_WPAINT_HLT, + ICON_MARKER, + ICON_BLANK15, + ICON_BLANK16, + ICON_BLANK17, + ICON_BLANK18, + + ICON_X, + ICON_GO_LEFT, + ICON_NO_GO_LEFT, + ICON_UNLOCKED, + ICON_LOCKED, + ICON_PARLIB, + ICON_DATALIB, + ICON_AUTO, + ICON_MATERIAL_DEHLT2, + ICON_RING, + ICON_GRID, + ICON_PROPEDIT, + ICON_KEEPRECT, + ICON_DESEL_CUBE_VERTS, + ICON_EDITMODE_DEHLT, + ICON_EDITMODE_HLT, + ICON_VPAINT_DEHLT, + ICON_VPAINT_HLT, + ICON_FACESEL_DEHLT, + ICON_FACESEL_HLT, + ICON_EDIT_DEHLT, + ICON_BOOKMARKS, + ICON_BLANK20, + ICON_BLANK21, + ICON_BLANK22, + + ICON_HELP, + ICON_ERROR, + ICON_FOLDER_DEHLT, + ICON_FOLDER_HLT, + ICON_BLUEIMAGE_DEHLT, + ICON_BLUEIMAGE_HLT, + ICON_BPIBFOLDER_DEHLT, + ICON_BPIBFOLDER_HLT, + ICON_BPIBFOLDER_ERR, + ICON_UGLY_GREEN_RING, + ICON_GHOST, + ICON_SORTBYEXT, + ICON_SCULPTMODE_HLT, + ICON_VERTEXSEL, + ICON_EDGESEL, + ICON_FACESEL, + ICON_PLUS, + ICON_BPIBFOLDER_X, + ICON_BPIBFOLDERGREY, + ICON_MAGNIFY, + ICON_INFO2, + ICON_BLANK23, + ICON_BLANK24, + ICON_BLANK25, + ICON_BLANK26, + + ICON_RIGHTARROW, + ICON_DOWNARROW_HLT, + ICON_ROUNDBEVELTHING, + ICON_FULLTEXTURE, + ICON_HOOK, + ICON_DOT, + ICON_WORLD_DEHLT, + ICON_CHECKBOX_DEHLT, + ICON_CHECKBOX_HLT, + ICON_LINK, + ICON_INLINK, + ICON_ZOOMIN, + ICON_ZOOMOUT, + ICON_PASTEDOWN, + ICON_COPYDOWN, + ICON_CONSTANT, + ICON_LINEAR, + ICON_CYCLIC, + ICON_KEY_DEHLT, + ICON_KEY_HLT, + ICON_GRID2, + ICON_BLANK27, + ICON_BLANK28, + ICON_BLANK29, + ICON_BLANK30, + + ICON_EYE, + ICON_LAMP, + ICON_MATERIAL, + ICON_TEXTURE, + ICON_ANIM, + ICON_WORLD, + ICON_SCENE, + ICON_EDIT, + ICON_GAME, + ICON_PAINT, + ICON_RADIO, + ICON_SCRIPT, + ICON_SPEAKER, + ICON_PASTEUP, + ICON_COPYUP, + ICON_PASTEFLIPUP, + ICON_PASTEFLIPDOWN, + ICON_CYCLICLINEAR, + ICON_PIN_DEHLT, + ICON_PIN_HLT, + ICON_LITTLEGRID, + ICON_BLANK31, + ICON_BLANK32, + ICON_BLANK33, + ICON_BLANK34, + + ICON_FULLSCREEN, + ICON_SPLITSCREEN, + ICON_RIGHTARROW_THIN, + ICON_DISCLOSURE_TRI_RIGHT, + ICON_DISCLOSURE_TRI_DOWN, + ICON_SCENE_SEPIA, + ICON_SCENE_DEHLT, + ICON_OBJECT, + ICON_MESH, + ICON_CURVE, + ICON_MBALL, + ICON_LATTICE, + ICON_LAMP_DEHLT, + ICON_MATERIAL_DEHLT, + ICON_TEXTURE_DEHLT, + ICON_IPO_DEHLT, + ICON_LIBRARY_DEHLT, + ICON_IMAGE_DEHLT, + ICON_EYEDROPPER, + ICON_WINDOW_WINDOW, + ICON_PANEL_CLOSE, + ICON_PHYSICS, + ICON_BLANK36, + ICON_BLANK37, + ICON_BLANK38, + + ICON_BLENDER, + ICON_PACKAGE, + ICON_UGLYPACKAGE, + ICON_MATPLANE, + ICON_MATSPHERE, + ICON_MATCUBE, + ICON_SCENE_HLT, + ICON_OBJECT_HLT, + ICON_MESH_HLT, + ICON_CURVE_HLT, + ICON_MBALL_HLT, + ICON_LATTICE_HLT, + ICON_LAMP_HLT, + ICON_MATERIAL_HLT, + ICON_TEXTURE_HLT, + ICON_IPO_HLT, + ICON_LIBRARY_HLT, + ICON_IMAGE_HLT, + ICON_CONSTRAINT, + ICON_CAMERA_DEHLT, + ICON_ARMATURE_DEHLT, + ICON_SNAP_GEAR, + ICON_SNAP_GEO, + ICON_BLANK41, + ICON_BLANK42, + + ICON_SMOOTHCURVE, + ICON_SPHERECURVE, + ICON_ROOTCURVE, + ICON_SHARPCURVE, + ICON_LINCURVE, + ICON_NOCURVE, + ICON_RNDCURVE, + ICON_PROP_OFF, + ICON_PROP_ON, + ICON_PROP_CON, + ICON_SYNTAX, + ICON_SYNTAX_OFF, + ICON_MONKEY, + ICON_HAIR, + ICON_VIEWMOVE, + ICON_HOME, + ICON_CLIPUV_DEHLT, + ICON_CLIPUV_HLT, + ICON_BLANK2, + ICON_BLANK3, + ICON_VPAINT_COL, + ICON_RESTRICT_SELECT_OFF, + ICON_RESTRICT_SELECT_ON, + ICON_MUTE_IPO_OFF, + ICON_MUTE_IPO_ON, + + ICON_MAN_TRANS, + ICON_MAN_ROT, + ICON_MAN_SCALE, + ICON_MANIPUL, + ICON_BLANK_47, + ICON_MODIFIER, + ICON_MOD_WAVE, + ICON_MOD_BUILD, + ICON_MOD_DECIM, + ICON_MOD_MIRROR, + ICON_MOD_SOFT, + ICON_MOD_SUBSURF, + ICON_SEQ_SEQUENCER, + ICON_SEQ_PREVIEW, + ICON_SEQ_LUMA_WAVEFORM, + ICON_SEQ_CHROMA_SCOPE, + ICON_ROTATE, + ICON_CURSOR, + ICON_ROTATECOLLECTION, + ICON_ROTATECENTER, + ICON_ROTACTIVE, + ICON_RESTRICT_VIEW_OFF, + ICON_RESTRICT_VIEW_ON, + ICON_RESTRICT_RENDER_OFF, + ICON_RESTRICT_RENDER_ON, + + VICON_VIEW3D, + VICON_EDIT, + VICON_EDITMODE_DEHLT, + VICON_EDITMODE_HLT, + VICON_DISCLOSURE_TRI_RIGHT, + VICON_DISCLOSURE_TRI_DOWN, + VICON_MOVE_UP, + VICON_MOVE_DOWN, + VICON_X + +#define BIFICONID_LAST (VICON_X) +#define BIFNICONIDS (BIFICONID_LAST-BIFICONID_FIRST + 1) +} BIFIconID; + +typedef enum { +#define BIFCOLORSHADE_FIRST (COLORSHADE_DARK) + COLORSHADE_DARK, + COLORSHADE_GREY, + COLORSHADE_MEDIUM, + COLORSHADE_HILITE, + COLORSHADE_LIGHT, + COLORSHADE_WHITE +#define BIFCOLORSHADE_LAST (COLORSHADE_WHITE) +#define BIFNCOLORSHADES (BIFCOLORSHADE_LAST-BIFCOLORSHADE_FIRST + 1) +} BIFColorShade; + +typedef enum { +#define BIFCOLORID_FIRST (BUTGREY) + BUTGREY = 0, + BUTGREEN, + BUTBLUE, + BUTSALMON, + MIDGREY, + BUTPURPLE, + BUTYELLOW, + REDALERT, + BUTRUST, + BUTWHITE, + BUTDBLUE, + BUTPINK, + BUTDPINK, + BUTMACTIVE, + + BUTIPO, + BUTAUDIO, + BUTCAMERA, + BUTRANDOM, + BUTEDITOBJECT, + BUTPROPERTY, + BUTSCENE, + BUTMOTION, + BUTMESSAGE, + BUTACTION, + BUTCD, + BUTGAME, + BUTVISIBILITY, + BUTYUCK, + BUTSEASICK, + BUTCHOKE, + BUTIMPERIAL, + + BUTTEXTCOLOR, + BUTTEXTPRESSED, + BUTSBACKGROUND, + + VIEWPORTBACKCOLOR, + VIEWPORTGRIDCOLOR, + VIEWPORTACTIVECOLOR, + VIEWPORTSELECTEDCOLOR, + VIEWPORTUNSELCOLOR, + + EDITVERTSEL, + EDITVERTUNSEL, + EDITEDGESEL, + EDITEDGEUNSEL + +#define BIFCOLORID_LAST (EDITEDGEUNSEL) +#define BIFNCOLORIDS (BIFCOLORID_LAST-BIFCOLORID_FIRST + 1) + +} BIFColorID; + +/* XXX WARNING: this is saved in file, so do not change order! */ +enum { + TH_AUTO, /* for buttons, to signal automatic color assignment */ + +// uibutton colors + TH_BUT_OUTLINE, + TH_BUT_NEUTRAL, + TH_BUT_ACTION, + TH_BUT_SETTING, + TH_BUT_SETTING1, + TH_BUT_SETTING2, + TH_BUT_NUM, + TH_BUT_TEXTFIELD, + TH_BUT_POPUP, + TH_BUT_TEXT, + TH_BUT_TEXT_HI, + TH_MENU_BACK, + TH_MENU_ITEM, + TH_MENU_HILITE, + TH_MENU_TEXT, + TH_MENU_TEXT_HI, + + TH_BUT_DRAWTYPE, + + TH_REDALERT, + TH_CUSTOM, + + TH_BUT_TEXTFIELD_HI, + TH_ICONFILE, + + TH_THEMEUI, +// common colors among spaces + + TH_BACK, + TH_TEXT, + TH_TEXT_HI, + TH_HEADER, + TH_HEADERDESEL, + TH_PANEL, + TH_SHADE1, + TH_SHADE2, + TH_HILITE, + + TH_GRID, + TH_WIRE, + TH_SELECT, + TH_ACTIVE, + TH_GROUP, + TH_GROUP_ACTIVE, + TH_TRANSFORM, + TH_VERTEX, + TH_VERTEX_SELECT, + TH_VERTEX_SIZE, + TH_EDGE, + TH_EDGE_SELECT, + TH_EDGE_SEAM, + TH_EDGE_FACESEL, + TH_FACE, + TH_FACE_SELECT, + TH_NORMAL, + TH_FACE_DOT, + TH_FACEDOT_SIZE, + TH_CFRAME, + + TH_SYNTAX_B, + TH_SYNTAX_V, + TH_SYNTAX_C, + TH_SYNTAX_L, + TH_SYNTAX_N, + + TH_BONE_SOLID, + TH_BONE_POSE, + + TH_STRIP, + TH_STRIP_SELECT, + + TH_LAMP, + + TH_NODE, + TH_NODE_IN_OUT, + TH_NODE_OPERATOR, + TH_NODE_CONVERTOR, + TH_NODE_GROUP, + + TH_SEQ_MOVIE, + TH_SEQ_IMAGE, + TH_SEQ_SCENE, + TH_SEQ_AUDIO, + TH_SEQ_EFFECT, + TH_SEQ_PLUGIN, + TH_SEQ_TRANSITION, + TH_SEQ_META, + + TH_EDGE_SHARP, + TH_EDITMESH_ACTIVE, +}; +/* XXX WARNING: previous is saved in file, so do not change order! */ + +/* theme drawtypes */ +#define TH_MINIMAL 0 +#define TH_SHADED 1 +#define TH_ROUNDED 2 +#define TH_OLDSKOOL 3 + +/* specific defines per space should have higher define values */ + +struct bTheme; + +// THE CODERS API FOR THEMES: + +// sets the color +void BIF_ThemeColor(int colorid); + +// sets the color plus alpha +void BIF_ThemeColor4(int colorid); + +// sets color plus offset for shade +void BIF_ThemeColorShade(int colorid, int offset); + +// sets color plus offset for alpha +void BIF_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset); + +// sets color, which is blend between two theme colors +void BIF_ThemeColorBlend(int colorid1, int colorid2, float fac); +// same, with shade offset +void BIF_ThemeColorBlendShade(int colorid1, int colorid2, float fac, int offset); + +// returns one value, not scaled +float BIF_GetThemeValuef(int colorid); +int BIF_GetThemeValue(int colorid); + +// get three color values, scaled to 0.0-1.0 range +void BIF_GetThemeColor3fv(int colorid, float *col); + +// get the 3 or 4 byte values +void BIF_GetThemeColor3ubv(int colorid, char *col); +void BIF_GetThemeColor4ubv(int colorid, char *col); + +// get a theme color from specified space type +void BIF_GetThemeColorType4ubv(int colorid, int spacetype, char *col); + +// blends and shades between two color pointers +void BIF_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset); + +// get a 3 byte color, blended and shaded between two other char color pointers +void BIF_GetColorPtrBlendShade3ubv(char *cp1, char *cp2, char *col, float fac, int offset); + + +struct ScrArea; + +// internal (blender) usage only, for init and set active +void BIF_InitTheme(void); +void BIF_SetTheme(struct ScrArea *sa); +void BIF_resources_init (void); +void BIF_resources_free (void); +void BIF_colors_init (void); +void BIF_load_ui_colors (void); + +/* only for buttons in theme editor! */ +char *BIF_ThemeGetColorPtr(struct bTheme *btheme, int spacetype, int colorid); +char *BIF_ThemeColorsPup(int spacetype); + + +void BIF_def_color (BIFColorID colorid, unsigned char r, unsigned char g, unsigned char b); + +#endif /* BIF_ICONS_H */ diff --git a/source/blender/editors/include/BIF_retopo.h b/source/blender/editors/include/BIF_retopo.h new file mode 100644 index 00000000000..5cf9b512fc5 --- /dev/null +++ b/source/blender/editors/include/BIF_retopo.h @@ -0,0 +1,110 @@ +/* + * $Id: BIF_retopo.h 9804 2007-01-17 03:57:01Z 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 ***** + */ + +#ifndef BIF_RETOPO_H +#define BIF_RETOPO_H + +#include "DNA_vec_types.h" + +/* For bglMats */ +#include "BIF_glutil.h" + +struct EditVert; +struct Mesh; +struct View3D; + +typedef struct RetopoViewData { + bglMats mats; + + char queue_matrix_update; +} RetopoViewData; + +typedef struct RetopoPaintPoint { + struct RetopoPaintPoint *next, *prev; + vec2s loc; + short index; + float co[3]; + struct EditVert *eve; +} RetopoPaintPoint; + +typedef struct RetopoPaintLine { + struct RetopoPaintLine *next, *prev; + ListBase points; + ListBase hitlist; /* RetopoPaintHit */ + RetopoPaintPoint *cyclic; +} RetopoPaintLine; + +typedef struct RetopoPaintSel { + struct RetopoPaintSel *next, *prev; + RetopoPaintLine *line; + char first; +} RetopoPaintSel; + +typedef struct RetopoPaintData { + char in_drag; + short sloc[2]; + + ListBase lines; + ListBase intersections; /* RetopoPaintPoint */ + + short seldist; + RetopoPaintSel nearest; + + struct View3D *paint_v3d; +} RetopoPaintData; + +RetopoPaintData *get_retopo_paint_data(); + +char retopo_mesh_check(); +char retopo_curve_check(); + +void retopo_end_okee(); + +void retopo_free_paint_data(RetopoPaintData *rpd); +void retopo_free_paint(); + +char retopo_mesh_paint_check(); +void retopo_paint_view_update(struct View3D *v3d); +void retopo_force_update(); +void retopo_paint_toggle(void*,void*); +char retopo_paint(const unsigned short event); +void retopo_draw_paint_lines(); +RetopoPaintData *retopo_paint_data_copy(RetopoPaintData *rpd); + +void retopo_toggle(void*,void*); +void retopo_do_vert(struct View3D *v3d, float *v); +void retopo_do_all(); +void retopo_do_all_cb(void *, void *); +void retopo_queue_updates(struct View3D *v3d); + +void retopo_matrix_update(struct View3D *v3d); + +void retopo_free_view_data(struct View3D *v3d); + +#endif diff --git a/source/blender/editors/include/BIF_scrarea.h b/source/blender/editors/include/BIF_scrarea.h new file mode 100644 index 00000000000..d71fb38c7a2 --- /dev/null +++ b/source/blender/editors/include/BIF_scrarea.h @@ -0,0 +1,54 @@ +/** + * $Id: BIF_scrarea.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 ***** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct ScrArea; + + /** + * Finds the first spacedata of @a type within + * the scrarea. + */ +void *scrarea_find_space_of_type(ScrArea *sa, int type); + +int scrarea_get_win_x (struct ScrArea *sa); +int scrarea_get_win_y (struct ScrArea *sa); +int scrarea_get_win_width (struct ScrArea *sa); +int scrarea_get_win_height (struct ScrArea *sa); + +#ifdef __cplusplus +} + +#endif + diff --git a/source/blender/editors/include/BIF_screen.h b/source/blender/editors/include/BIF_screen.h new file mode 100644 index 00000000000..e221fcace1e --- /dev/null +++ b/source/blender/editors/include/BIF_screen.h @@ -0,0 +1,137 @@ +/* replacement for screen.h */ +/* + * + * Leftovers here are actually editscreen.c thingies + * + * $Id: BIF_screen.h 10543 2007-04-17 18:15:31Z campbellbarton $ + * + * ***** 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 BIF_SCREEN_H +#define BIF_SCREEN_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/* externs in editscreen.c */ +extern int displaysizex, displaysizey; +extern struct ScrArea *curarea; + +struct View3D; +struct bScreen; +struct ScrArea; +struct ScrVert; +struct ScrEdge; +struct ListBase; + +struct View3D *find_biggest_view3d(void); +struct ScrArea *find_biggest_area_of_type(int spacecode); +struct ScrArea *find_biggest_area(void); + +void scrarea_queue_redraw(struct ScrArea *area); +void scrarea_queue_winredraw(struct ScrArea *area); +void scrarea_queue_headredraw(struct ScrArea *area); + +int blender_test_break(void); + +void duplicate_screen(void); +void init_screen_cursors(void); +void set_timecursor(int nr); +void waitcursor(int val); +void wich_cursor(struct ScrArea *sa); +void setcursor_space(int spacetype, short cur); +void set_g_activearea(struct ScrArea *sa); +void getmouseco_sc(short *mval); +void getmouseco_areawin(short *mval); +void getmouseco_headwin(short *mval); +int qtest(void); +int anyqtest(void); +void areawinset(short win); +void headerbox(struct ScrArea *sa); +void defheaddraw(void); +void defheadchange(void); +unsigned short winqtest(struct ScrArea *sa); +unsigned short headqtest(struct ScrArea *sa); +void winqdelete(struct ScrArea *sa); +void winqclear(struct ScrArea *sa); +void addqueue(short win, unsigned short event, short val); +void addafterqueue(short win, unsigned short event, short val); +void add_readfile_event(char *filename); +short ext_qtest(void); +unsigned short extern_qread(short *val); +unsigned short extern_qread_ext(short *val, char *ascii); + +extern void markdirty_all(void); // also sets redraw event +extern void markdirty_all_back(void); +extern void markdirty_win_back(short winid); + +void screen_swapbuffers(void); +void set_debug_swapbuffers_ovveride(struct bScreen *sc, int mode); +int is_allowed_to_change_screen(struct bScreen *newp); +void splash(void * data, int datasizei, char * string); +void screen_delayed_undo_push(char *name); +void screenmain(void); +void getdisplaysize(void); +void setprefsize(int stax, int stay, int sizx, int sizy, int maximized); +void calc_arearcts(struct ScrArea *sa); +void resize_screen(int x, int y, int w, int h); +struct ScrArea *closest_bigger_area(void); +int mywinopen(int mode, short posx, short posy, short sizex, short sizey); +void setscreen(struct bScreen *sc); +void area_fullscreen(void); +int select_area(int spacetype); +struct bScreen *default_twosplit(void); +void initscreen(void); +void unlink_screen(struct bScreen *sc); +void reset_autosave(void); +int area_is_active_area(struct ScrArea *area); +void draw_area_emboss(struct ScrArea *sa); + +void headerprint(char *str); + +/* ******* handlers ****** */ +void add_screenhandler(struct bScreen *sc, short eventcode, short val); +void rem_screenhandler(struct bScreen *sc, short eventcode); +int do_screenhandlers(struct bScreen *sc); +int has_screenhandler(struct bScreen *sc, short eventcode); + + /***/ + +/* return all layers of all 3d windows in a screen */ +unsigned int screen_view3d_layers(void); + +#ifdef __cplusplus +} +#endif + +#endif /* BIF_SCREEN_H */ + diff --git a/source/blender/editors/include/BIF_space.h b/source/blender/editors/include/BIF_space.h new file mode 100644 index 00000000000..2e91568437b --- /dev/null +++ b/source/blender/editors/include/BIF_space.h @@ -0,0 +1,148 @@ +/** + * $Id: BIF_space.h 12177 2007-10-01 08:03:11Z schlaile $ + * + * ***** 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 BIF_SPACE_H +#define BIF_SPACE_H + +struct ListBase; +struct ScrArea; +struct SpaceButs; +struct View2D; +struct BWinEvent; +struct SpaceOops; + +#define REMAKEIPO 1 +#define OOPS_TEST 2 + +#define BUT_HORIZONTAL 1 +#define BUT_VERTICAL 2 + +/* is hardcoded in DNA_space_types.h */ +#define SPACE_MAXHANDLER 8 + +/* view3d handler codes */ +#define VIEW3D_HANDLER_BACKGROUND 1 +#define VIEW3D_HANDLER_PROPERTIES 2 +#define VIEW3D_HANDLER_OBJECT 3 +#define VIEW3D_HANDLER_PREVIEW 4 +#define VIEW3D_HANDLER_MULTIRES 5 + +/* ipo handler codes */ +#define IPO_HANDLER_PROPERTIES 20 + +/* image handler codes */ +#define IMAGE_HANDLER_PROPERTIES 30 +#define IMAGE_HANDLER_PAINT 31 +#define IMAGE_HANDLER_CURVES 32 +#define IMAGE_HANDLER_PREVIEW 33 +#define IMAGE_HANDLER_GAME_PROPERTIES 34 +#define IMAGE_HANDLER_VIEW_PROPERTIES 35 +/*#define IMAGE_HANDLER_TRANSFORM_PROPERTIES 36*/ + +/* action handler codes */ +#define ACTION_HANDLER_PROPERTIES 40 + +/* nla handler codes */ +#define NLA_HANDLER_PROPERTIES 50 + +/* sequence handler codes */ +#define SEQ_HANDLER_PROPERTIES 60 + +/* imasel handler codes */ +#define IMASEL_HANDLER_IMAGE 70 + +/* theme codes */ +#define B_ADD_THEME 3301 +#define B_DEL_THEME 3302 +#define B_NAME_THEME 3303 +#define B_THEMECOL 3304 +#define B_UPDATE_THEME 3305 +#define B_CHANGE_THEME 3306 +#define B_THEME_COPY 3307 +#define B_THEME_PASTE 3308 +#define B_UPDATE_THEME_ICONS 3309 + +#define B_RECALCLIGHT 3310 + + +void scrarea_do_winprefetchdraw (struct ScrArea *sa); +void scrarea_do_windraw (struct ScrArea *sa); +void scrarea_do_winchange (struct ScrArea *sa); +void scrarea_do_winhandle (struct ScrArea *sa, struct BWinEvent *evt); +void scrarea_do_headdraw (struct ScrArea *sa); +void scrarea_do_headchange (struct ScrArea *sa); + +/* space.c */ +extern void add_blockhandler(struct ScrArea *sa, short eventcode, short action); +extern void rem_blockhandler(struct ScrArea *sa, short eventcode); +extern void toggle_blockhandler(struct ScrArea *sa, short eventcode, short action); + +extern void space_set_commmandline_options(void); +extern void allqueue(unsigned short event, short val); +extern void allspace(unsigned short event, short val); +extern void copy_view3d_lock(short val); +extern void drawemptyspace(struct ScrArea *sa, void *spacedata); +extern void drawinfospace(struct ScrArea *sa, void *spacedata); +extern void duplicatespacelist(struct ScrArea *area, struct ListBase *lb1, struct ListBase *lb2); +extern void extern_set_butspace(int fkey, int do_cycle); +extern void force_draw(int header); +extern void force_draw_all(int header); +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 init_v2d_oops(struct ScrArea *, struct SpaceOops *); +extern void initipo(struct ScrArea *sa); +extern void newspace(struct ScrArea *sa, int type); +extern void set_rects_butspace(struct SpaceButs *buts); +extern void test_butspace(void); +extern void start_game(void); +extern void select_object_grouped(short nr); +extern void join_menu(void); + +extern void BIF_undo_push(char *str); +extern void BIF_undo(void); +extern void BIF_redo(void); +extern void BIF_undo_menu(void); + +#if 0 +//#ifdef _WIN32 // FULLSCREEN +extern void mainwindow_toggle_fullscreen(int fullscreen); +#endif + +extern void mainwindow_set_filename_to_title(char *title); +extern void mainwindow_raise(void); +extern void mainwindow_make_active(void); +extern void mainwindow_close(void); + +#endif + diff --git a/source/blender/editors/include/BIF_spacetypes.h b/source/blender/editors/include/BIF_spacetypes.h new file mode 100644 index 00000000000..eb4608f91cf --- /dev/null +++ b/source/blender/editors/include/BIF_spacetypes.h @@ -0,0 +1,67 @@ +/** + * $Id: BIF_spacetypes.h 12177 2007-10-01 08:03:11Z schlaile $ + * + * ***** 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 ***** + */ + +struct ScrArea; +struct BWinEvent; + +typedef struct _SpaceType SpaceType; + +typedef void (*SpacePrefetchDrawFP) (struct ScrArea *sa, void *spacedata); +typedef void (*SpaceDrawFP) (struct ScrArea *sa, void *spacedata); +typedef void (*SpaceChangeFP) (struct ScrArea *sa, void *spacedata); +typedef void (*SpaceHandleFP) (struct ScrArea *sa, void *spacedata, struct BWinEvent *evt); + + /***/ + +SpaceType* spacetype_new (char *name); + +void spacetype_set_winfuncs (SpaceType *st, SpacePrefetchDrawFP prefetch, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle); + + /***/ + +SpaceType *spaceaction_get_type (void); +SpaceType *spacebuts_get_type (void); +SpaceType *spacefile_get_type (void); +SpaceType *spaceimage_get_type (void); +SpaceType *spaceimasel_get_type (void); +SpaceType *spaceinfo_get_type (void); +SpaceType *spaceipo_get_type (void); +SpaceType *spacenla_get_type (void); +SpaceType *spaceoops_get_type (void); +SpaceType *spaceseq_get_type (void); +SpaceType *spacesound_get_type (void); +SpaceType *spacetext_get_type (void); +SpaceType *spacescript_get_type (void); +SpaceType *spaceview3d_get_type (void); +SpaceType *spacetime_get_type (void); +SpaceType *spacenode_get_type (void); + diff --git a/source/blender/editors/include/BIF_tbcallback.h b/source/blender/editors/include/BIF_tbcallback.h new file mode 100644 index 00000000000..4e92b3c32b0 --- /dev/null +++ b/source/blender/editors/include/BIF_tbcallback.h @@ -0,0 +1,42 @@ +/* $Id: BIF_tbcallback.h 206 2002-12-20 09:41:25Z mein $ +*/ +/* + * ***** 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 *****/ + +/* defines callback structure for toolbox menu */ +typedef struct _TBcallback { + char *desc; + char *key; + void (*cb)(int v); /* callback function takes value */ + int val; +} TBcallback; + +typedef TBcallback * (*Tbox_callbackfunc)(int l, int x); +void tboxSetCallback(Tbox_callbackfunc f); + diff --git a/source/blender/editors/include/BIF_toets.h b/source/blender/editors/include/BIF_toets.h new file mode 100644 index 00000000000..2885d325a27 --- /dev/null +++ b/source/blender/editors/include/BIF_toets.h @@ -0,0 +1,41 @@ +/** + * $Id: BIF_toets.h 6568 2006-01-28 18:33:28Z hos $ + * + * ***** 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 BIF_TOETS_H +#define BIF_TOETS_H + +int blenderqread(unsigned short event, short val); +void persptoetsen(unsigned short event); /* dutch rules man */ +int untitled(char *name); + +#endif + diff --git a/source/blender/editors/include/BIF_toolbox.h b/source/blender/editors/include/BIF_toolbox.h new file mode 100644 index 00000000000..46e81719aec --- /dev/null +++ b/source/blender/editors/include/BIF_toolbox.h @@ -0,0 +1,68 @@ +/* toolbox (SPACEKEY) related + * $Id: BIF_toolbox.h 10571 2007-04-22 22:08:19Z campbellbarton $ + * + * ***** 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 BIF_TOOLBOX_H +#define BIF_TOOLBOX_H + +/* toolbox.c */ +void asciitoraw (int ch, short unsigned int *event, short unsigned int *qual); + +void toolbox_n(void); +void toolbox_n_add(void); +void reset_toolbox(void); + +void notice (char *str, ...); +void error (char *fmt, ...); + +void error_libdata (void); + +int saveover (char *filename); +int okee (char *fmt, ...); + +short button (short *var, short min, short max, char *str); +short fbutton (float *var, float min, float max, float a1, float a2, char *str); +short sbutton (char *var, float min, float max, char *str); /* __NLA */ + +int movetolayer_buts (unsigned int *lay, char *title); +int movetolayer_short_buts (short *lay, char *title); + +void draw_numbuts_tip (char *str, int x1, int y1, int x2, int y2); +int do_clever_numbuts (char *name, int tot, int winevent); +void clever_numbuts_buts(void); +void add_numbut (int nr, int type, char *str, float min, float max, void *poin, char *tip); +void clever_numbuts (void); +void replace_names_but (void); + +void BIF_screendump(int fscreen); +void write_screendump(char *name); + +#endif diff --git a/source/blender/editors/include/BIF_transform.h b/source/blender/editors/include/BIF_transform.h new file mode 100644 index 00000000000..9c8798a54ee --- /dev/null +++ b/source/blender/editors/include/BIF_transform.h @@ -0,0 +1,110 @@ +/** + * $Id: BIF_transform.h 12682 2007-11-26 22:09:57Z blendix $ + * + * ***** 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 BIF_TRANSFORM_H +#define BIF_TRANSFORM_H + +/* ******************** Macros & Prototypes *********************** */ + +/* MODE AND NUMINPUT FLAGS */ +#define TFM_INIT -1 +#define TFM_DUMMY 0 +#define TFM_TRANSLATION 1 +#define TFM_ROTATION 2 +#define TFM_RESIZE 3 +#define TFM_TOSPHERE 4 +#define TFM_SHEAR 5 +#define TFM_WARP 7 +#define TFM_SHRINKFATTEN 8 +#define TFM_TILT 9 +#define TFM_LAMP_ENERGY 10 +#define TFM_TRACKBALL 11 +#define TFM_PUSHPULL 12 +#define TFM_CREASE 13 +#define TFM_MIRROR 14 +#define TFM_BONESIZE 15 +#define TFM_BONE_ENVELOPE 16 +#define TFM_CURVE_SHRINKFATTEN 17 +#define TFM_BONE_ROLL 18 +#define TFM_TIME_TRANSLATE 19 +#define TFM_TIME_SLIDE 20 +#define TFM_TIME_SCALE 21 +#define TFM_TIME_EXTEND 22 +#define TFM_BAKE_TIME 23 + +/* TRANSFORM CONTEXTS */ +#define CTX_NONE 0 +#define CTX_TEXTURE 1 +#define CTX_EDGE 2 +#define CTX_NO_PET 4 +#define CTX_TWEAK 8 +#define CTX_NO_MIRROR 16 + +void initTransform(int mode, int context); +void Transform(void); +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) + * (if 0 is returns, *vec is unmodified) + * */ +int calculateTransformCenter(int centerMode, float *vec); + +struct TransInfo; +struct ScrArea; + +struct TransInfo * BIF_GetTransInfo(void); +void BIF_setSingleAxisConstraint(float vec[3], char *text); +void BIF_setDualAxisConstraint(float vec1[3], float vec2[3], char *text); +void BIF_setLocalAxisConstraint(char axis, char *text); +void BIF_setLocalLockConstraint(char axis, char *text); + +/* Drawing callbacks */ +void BIF_drawConstraint(void); +void BIF_drawPropCircle(void); +void BIF_drawSnap(void); + +void BIF_getPropCenter(float *center); + +void BIF_TransformSetUndo(char *str); + +void BIF_selectOrientation(void); + +/* view3d manipulators */ +void initManipulator(int mode); +void ManipulatorTransform(); + +int BIF_do_manipulator(struct ScrArea *sa); +void BIF_draw_manipulator(struct ScrArea *sa); + +#endif + diff --git a/source/blender/editors/include/BIF_usiblender.h b/source/blender/editors/include/BIF_usiblender.h new file mode 100644 index 00000000000..bdc12053861 --- /dev/null +++ b/source/blender/editors/include/BIF_usiblender.h @@ -0,0 +1,54 @@ +/** + * $Id: BIF_usiblender.h 12552 2007-11-11 15:18:53Z campbellbarton $ + * + * ***** 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 BIF_USIBLENDER_H +#define BIF_USIBLENDER_H + +typedef struct RecentFile { + struct RecentFile *next, *prev; + char *filename; +} RecentFile; + +void exit_usiblender(void); + +void BIF_init(void); + +void BIF_read_file(char *name); +int BIF_read_homefile(int from_memory); +void BIF_read_autosavefile(void); + +void BIF_write_file(char *target); +void BIF_write_homefile(void); +void BIF_write_autosave(void); + +#endif + diff --git a/source/blender/editors/include/BIF_verse.h b/source/blender/editors/include/BIF_verse.h new file mode 100644 index 00000000000..be4f73ccd54 --- /dev/null +++ b/source/blender/editors/include/BIF_verse.h @@ -0,0 +1,142 @@ +/** + * $Id: BIF_verse.h 9683 2007-01-09 11:50:45Z jiri $ + * + * ***** 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. + * + * Contributor(s): Jiri Hnidek. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifdef WITH_VERSE + +#ifndef BIF_VERSE_H +#define BIF_VERSE_H + +#include "BKE_verse.h" +#include "DNA_meshdata_types.h" + +struct Object; + +struct EditMesh; +struct EditVert; +struct EditFace; +struct Mesh; +struct MVert; +struct Mface; + +/* verse_object.c */ +void unsubscribe_from_obj_node(struct VNode *vnode); +void unsubscribe_from_geom_node(struct VNode *vnode); +void unsubscribe_from_bitmap_node(struct VNode *vnode); + +void test_and_send_idbutton_cb(void *obj, void *ob_name); + +struct Object *create_object_from_verse_node(struct VNode *vnode); + +void b_verse_pop_node(struct VNode *vnode); +void b_verse_unsubscribe(VNode *vnode); +void b_verse_push_object(struct VerseSession *session, struct Object *ob); +void b_verse_delete_object(struct Object *ob); +void b_verse_ms_get(void); + +void post_transform_pos(struct VNode *vnode); +void post_transform_rot(struct VNode *vnode); +void post_transform_scale(struct VNode *vnode); + +/*void post_transform(struct VNode *vnode);*/ +void post_link_set(struct VLink *vlink); +void post_link_destroy(struct VLink *vlink); +void post_object_free_constraint(struct VNode *vnode); + +void b_verse_send_transformation(struct Object *ob); + +/* verse_mesh.c */ +void b_verse_send_vertex_delete(struct EditVert *eve); +void send_versevert_pos(struct VerseVert *vvert); + +void b_verse_send_face_delete(struct EditFace *efa); + +void sync_all_versefaces_with_editfaces(struct VNode *vnode); +void sync_all_verseverts_with_editverts(struct VNode *vnode); + +void createVerseVert(struct EditVert *ev); +void createVerseFace(struct EditFace *efa); + +void b_verse_duplicate_object(struct VerseSession *session, struct Object *ob, struct Object *n_ob); +struct VNode *create_geom_vnode_from_geom_vnode(struct VNode *vnode); +struct VNode *create_geom_vnode_data_from_editmesh(struct VerseSession *session, struct EditMesh *em); +struct VNode *create_geom_vnode_data_from_mesh(struct VerseSession *session, struct Mesh *me); + +void destroy_unused_geometry(struct VNode *vnode); +void destroy_binding_between_versemesh_and_editmesh(struct VNode *vnode); + +void destroy_versemesh(struct VNode *vnode); + +void unsubscribe_from_geom_node(struct VNode *vnode); + +void create_edit_mesh_from_geom_node(struct VNode *vnode); +struct Mesh *create_mesh_from_geom_node(struct VNode *vnode); +void create_meshdata_from_geom_node(struct Mesh *me, struct VNode *vnode); + +/* geometry post callback functions */ +void post_layer_create(struct VLayer *vlayer); +void post_layer_destroy(struct VLayer *vlayer); + +void post_vertex_create(struct VerseVert *vvert); +void post_vertex_set_xyz(struct VerseVert *vvert); +void post_vertex_delete(struct VerseVert *vvert); +void post_vertex_free_constraint(struct VerseVert *vvert); + +void post_polygon_set_uint8(struct VerseFace *vface); +void post_polygon_create(struct VerseFace *vface); +void post_polygon_set_corner(struct VerseFace *vface); +void post_polygon_delete(struct VerseFace *vface); +void post_polygon_free_constraint(struct VerseFace *vface); + +void post_geometry_free_constraint(struct VNode *vnode); + +/* verse_common.c */ +struct VerseSession *session_menu(void); +char *verse_client_name(void); + +void post_tag_change(struct VTag *vtag); +void post_taggroup_create(struct VTagGroup *vtaggroup); + +void post_node_create(struct VNode *vnode); +void post_node_destroy(struct VNode *vnode); +void post_node_name_set(struct VNode *vnode); + +void post_connect_accept(struct VerseSession *session); +void post_connect_terminated(struct VerseSession *session); +void post_connect_update(struct VerseSession *session); +void post_server_add(void); + +/* verse_image.c */ + +void sync_blender_image_with_verse_bitmap_node(struct VNode *vnode); +void post_bitmap_dimension_set(struct VNode *vnode); +void post_bitmap_layer_create(struct VBitmapLayer *vblayer); +void post_bitmap_layer_destroy(struct VBitmapLayer *vblayer); +void post_bitmap_tile_set(struct VBitmapLayer *vblayer, unsigned int xs, unsigned int ys); + +#endif + +#endif diff --git a/source/blender/editors/include/BIF_writeavicodec.h b/source/blender/editors/include/BIF_writeavicodec.h new file mode 100644 index 00000000000..842c2eade1a --- /dev/null +++ b/source/blender/editors/include/BIF_writeavicodec.h @@ -0,0 +1,44 @@ +/** + * Functions for writing windows avi-format files. + * + * $Id: BIF_writeavicodec.h 6589 2006-01-29 17:46:19Z bjornmose $ + * + * ***** 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 ***** + * + */ + +#ifdef _WIN32 + +void start_avi_codec(RenderData *rd,int rectx, int recty ); +void append_avi_codec(int frame,int *pixels,int rectx, int recty); +void end_avi_codec(void); +int get_avicodec_settings(void); + +#endif + diff --git a/source/blender/editors/include/BIF_writeimage.h b/source/blender/editors/include/BIF_writeimage.h new file mode 100644 index 00000000000..0a71da0ba50 --- /dev/null +++ b/source/blender/editors/include/BIF_writeimage.h @@ -0,0 +1,45 @@ +/** + * $Id: BIF_writeimage.h 9376 2006-12-20 17:57:56Z ton $ + * + * ***** 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 BIF_WRITEIMAGE_H +#define BIF_WRITEIMAGE_H + +struct ImBuf; +struct EnvMap; + +void BIF_save_rendered_image(char *name); +void BIF_save_rendered_image_fs(void); +void BIF_save_envmap(struct EnvMap *env, char *str); +void save_image_filesel_str(char *str); + +#endif + diff --git a/source/blender/editors/include/BIF_writemovie.h b/source/blender/editors/include/BIF_writemovie.h new file mode 100644 index 00000000000..2ba28a88448 --- /dev/null +++ b/source/blender/editors/include/BIF_writemovie.h @@ -0,0 +1,41 @@ +/** + * $Id: BIF_writemovie.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 BIF_WRITEMOVIE_H +#define BIF_WRITEMOVIE_H + +void start_movie(void); +void append_movie(int fnum); +void end_movie(void); + +#endif + diff --git a/source/blender/editors/include/BPI_script.h b/source/blender/editors/include/BPI_script.h new file mode 100644 index 00000000000..9fef7ae74a8 --- /dev/null +++ b/source/blender/editors/include/BPI_script.h @@ -0,0 +1,71 @@ +/** + * include/BPI_script.h (jan-2004 ianwill) + * + * $Id: BPI_script.h 4590 2005-06-11 05:30:14Z ianwill $ + * + * Header for BPython's script structure. BPI: Blender Python external include + * file. + * + * ***** 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. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BPI_SCRIPT_H +#define BPI_SCRIPT_H + +//#include "DNA_listBase.h" +#include "DNA_ID.h" + +typedef struct Script { + ID id; + + void *py_draw; + void *py_event; + void *py_button; + void *py_browsercallback; + void *py_globaldict; + + int flags, lastspace; + +} Script; + +/* Note: a script that registers callbacks in the script->py_* pointers + * above (or calls the file or image selectors) needs to keep its global + * dictionary until Draw.Exit() is called and the callbacks removed. + * Unsetting SCRIPT_RUNNING means the interpreter reached the end of the + * script and returned control to Blender, but we can't get rid of its + * namespace (global dictionary) while SCRIPT_GUI or SCRIPT_FILESEL is set, + * because of the callbacks. The flags and the script name are saved in + * each running script's global dictionary, under '__script__'. */ + +/* Flags */ +#define SCRIPT_RUNNING 0x01 +#define SCRIPT_GUI 0x02 +#define SCRIPT_FILESEL 0x04 + +#endif /* BPI_SCRIPT_H */ diff --git a/source/blender/editors/include/BSE_drawimasel.h b/source/blender/editors/include/BSE_drawimasel.h new file mode 100644 index 00000000000..6e95bcca2f9 --- /dev/null +++ b/source/blender/editors/include/BSE_drawimasel.h @@ -0,0 +1,60 @@ +/** + * $Id: BSE_drawimasel.h 11920 2007-09-02 17:25:03Z elubie $ + * + * ***** 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 BSE_DRAWIMASEL_H +#define BSE_DRAWIMASEL_H + + +/* button events */ +#define B_FS_FILENAME 1 +#define B_FS_DIRNAME 2 +#define B_FS_DIR_MENU 3 +#define B_FS_PARDIR 4 +#define B_FS_LOAD 5 +#define B_FS_CANCEL 6 +#define B_FS_LIBNAME 7 +#define B_FS_BOOKMARK 8 + +/* ui geometry */ +#define IMASEL_BUTTONS_HEIGHT 60 +#define TILE_BORDER_X 8 +#define TILE_BORDER_Y 8 + +struct ScrArea; +struct SpaceImaSel; + +void drawimaselspace(struct ScrArea *sa, void *spacedata); +void calc_imasel_rcts(SpaceImaSel *simasel, int winx, int winy); +void do_imasel_buttonevents(short event, SpaceImaSel *simasel); + +#endif /* BSE_DRAWIMASEL_H */ + diff --git a/source/blender/editors/include/BSE_drawipo.h b/source/blender/editors/include/BSE_drawipo.h new file mode 100644 index 00000000000..e0ab9e18acb --- /dev/null +++ b/source/blender/editors/include/BSE_drawipo.h @@ -0,0 +1,76 @@ +/** + * $Id: BSE_drawipo.h 5523 2005-10-20 14:41:10Z ton $ + * + * ***** 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 BSE_DRAWIPO_H +#define BSE_DRAWIPO_H + +#define IN_2D_VERT_SCROLL(A) (BLI_in_rcti(&G.v2d->vert, A[0], A[1])) +#define IN_2D_HORIZ_SCROLL(A) (BLI_in_rcti(&G.v2d->hor, A[0], A[1])) + +#define SELECT_REPLACE 1 +#define SELECT_ADD 2 +#define SELECT_SUBTRACT 4 +#define SELECT_INVERT 16 + +struct ScrArea; +struct EditIpo; +struct View2D; +struct rctf; + +void calc_ipogrid(void); +void draw_ipogrid(void); + +void areamouseco_to_ipoco (struct View2D *v2d, short *mval, float *x, float *y); +void ipoco_to_areaco (struct View2D *v2d, float *vec, short *mval); +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 test_view2d (struct View2D *v2d, int winx, int winy); +void calc_scrollrcts (struct ScrArea *sa, struct View2D *v2d, int winx, int winy); + +int in_ipo_buttons(void); +void draw_view2d_numbers_horiz(int drawframes); +void drawscroll(int disptype); +void drawipospace(struct ScrArea *sa, void *spacedata); + +void center_currframe(void); +void scroll_ipobuts(void); +int view2dzoom(unsigned short event); +int view2dmove(unsigned short event); +void view2dborder(void); + +struct EditIpo *select_proj_ipo(struct rctf *rectf, int event); + + +#endif /* BSE_DRAWIPO_H */ + diff --git a/source/blender/editors/include/BSE_drawnla.h b/source/blender/editors/include/BSE_drawnla.h new file mode 100644 index 00000000000..b04bde8de7c --- /dev/null +++ b/source/blender/editors/include/BSE_drawnla.h @@ -0,0 +1,52 @@ +/** + * $Id: BSE_drawnla.h 5478 2005-10-10 18:05:30Z ton $ + * + * ***** 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 BSE_DRAWNLA_H +#define BSE_DRAWNLA_H + +struct ScrArea; +struct Base; +struct gla2DDrawInfo; +struct Object; + +void drawnlaspace(struct ScrArea *sa, void *spacedata); +void do_nlabuts(unsigned short event); + +int count_nla_levels(void); +int nla_filter (struct Base* base); + + /* changes the gla2d system to map the strip transform */ +void map_active_strip(struct gla2DDrawInfo *di, struct Object *ob, int restore); + + +#endif /* BSE_DRAWNLA */ + diff --git a/source/blender/editors/include/BSE_drawoops.h b/source/blender/editors/include/BSE_drawoops.h new file mode 100644 index 00000000000..e00e02fa6f7 --- /dev/null +++ b/source/blender/editors/include/BSE_drawoops.h @@ -0,0 +1,50 @@ +/** + * $Id: BSE_drawoops.h 6135 2005-12-16 13:50:45Z campbellbarton $ + * + * ***** 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 BSE_DRAWOOPS_H +#define BSE_DRAWOOPS_H + +struct ScrArea; +struct Oops; + +void boundbox_oops(short sel); +void give_oopslink_line(struct Oops *oops, struct OopsLink *ol, float *v1, float *v2); +void draw_oopslink(struct Oops *oops); +void draw_icon_oops(float *co, short type); +void mysbox(float x1, float y1, float x2, float y2); +unsigned int give_oops_color(short type, short sel, unsigned int *border); +void calc_oopstext(char *str, float *v1); +void draw_oops(struct Oops *oops); +void drawoopsspace(struct ScrArea *sa, void *spacedata); + +#endif /* BSE_DRAWOOPS */ + diff --git a/source/blender/editors/include/BSE_drawview.h b/source/blender/editors/include/BSE_drawview.h new file mode 100644 index 00000000000..f26856f76ac --- /dev/null +++ b/source/blender/editors/include/BSE_drawview.h @@ -0,0 +1,88 @@ +/** + * $Id: BSE_drawview.h 12747 2007-12-01 19:29:50Z blendix $ + * + * ***** 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 BSE_DRAWVIEW_H +#define BSE_DRAWVIEW_H + +struct Object; +struct BGpic; +struct rctf; +struct ScrArea; +struct ImBuf; + +void default_gl_light(void); +void init_gl_stuff(void); +void circf(float x, float y, float rad); +void circ(float x, float y, float rad); + +void do_viewbuts(unsigned short event); + +/* View3DAfter->type */ +#define V3D_XRAY 1 +#define V3D_TRANSP 2 +void add_view3d_after(struct View3D *v3d, struct Base *base, int type); + +void backdrawview3d(int test); +void check_backbuf(void); +unsigned int sample_backbuf(int x, int y); +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, float winmat[][4]); + +int update_time(void); +void calc_viewborder(struct View3D *v3d, struct rctf *viewborder_r); +void view3d_set_1_to_1_viewborder(struct View3D *v3d); + +int view3d_test_clipping(struct View3D *v3d, float *vec); +void view3d_set_clipping(struct View3D *v3d); +void view3d_clr_clipping(void); + +void sumo_callback(void *obp); +void init_anim_sumo(void); +void update_anim_sumo(void); +void end_anim_sumo(void); + +void inner_play_anim_loop(int init, int mode); +int play_anim(int mode); + +void make_axis_color(char *col, char *col2, char axis); + +/* SMOOTHVIEW */ +void smooth_view(struct View3D *v3d, float *ofs, float *quat, float *dist, float *lens); +void smooth_view_to_camera(struct View3D *v3d); +void view_settings_from_ob(struct Object *ob, float *ofs, float *quat, float *dist, float *lens); +void object_view_settings(struct Object *ob, float *lens, float *clipsta, float *clipend); + +#endif /* BSE_DRAWVIEW_H */ + diff --git a/source/blender/editors/include/BSE_edit.h b/source/blender/editors/include/BSE_edit.h new file mode 100644 index 00000000000..bd693e0c521 --- /dev/null +++ b/source/blender/editors/include/BSE_edit.h @@ -0,0 +1,55 @@ +/** + * $Id: BSE_edit.h 10524 2007-04-14 13:18:24Z campbellbarton $ + * + * ***** 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 BSE_EDIT_H +#define BSE_EDIT_H + +struct Object; +struct rcti; + +int get_border(struct rcti *rect, short col); +void countall(void); +void snapmenu(void); +void mergemenu(void); +void delete_context_selected(void); +void duplicate_context_selected(void); +void toggle_shading(void); +int minmax_verts(float *min, float *max); + +void snap_sel_to_grid(void); +void snap_sel_to_curs(void); +void snap_curs_to_grid(void); +void snap_curs_to_sel(void); +void snap_to_center(void); + +#endif /* BSE_EDIT_H */ + diff --git a/source/blender/editors/include/BSE_editaction_types.h b/source/blender/editors/include/BSE_editaction_types.h new file mode 100644 index 00000000000..48f0bc39ffc --- /dev/null +++ b/source/blender/editors/include/BSE_editaction_types.h @@ -0,0 +1,77 @@ +/** + * $Id: BIF_editaction.h 10519 2007-04-13 11:15:08Z aligorith $ + * + * ***** 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): 2007, Joshua Leung (major Action Editor recode) + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BIF_EDITACTION_TYPES_H +#define BIF_EDITACTION_TYPES_H + +/******************************************************* */ +/* FILTERED ACTION DATA - TYPES */ + +/* types of keyframe data in ActListElem */ +#define ALE_NONE 0 +#define ALE_IPO 1 +#define ALE_ICU 2 + +/* This struct defines a structure used for quick access */ +typedef struct bActListElem { + struct bActListElem *next, *prev; + + void *data; /* source data this elem represents */ + int type; /* one of the ACTTYPE_* values */ + int flag; /* copy of elem's flags for quick access */ + int index; /* copy of adrcode where applicable */ + + void *key_data; /* motion data - ipo or ipo-curve */ + short datatype; /* type of motion data to expect */ + + void *owner; /* will either be an action channel or fake ipo-channel (for keys) */ + short ownertype; /* type of owner */ +} 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 */ + +/* Action Editor - Main Data types */ +#define ACTCONT_NONE 0 +#define ACTCONT_ACTION 1 +#define ACTCONT_SHAPEKEY 2 + +#endif diff --git a/source/blender/editors/include/BSE_editipo.h b/source/blender/editors/include/BSE_editipo.h new file mode 100644 index 00000000000..bc181743dac --- /dev/null +++ b/source/blender/editors/include/BSE_editipo.h @@ -0,0 +1,179 @@ +/** + * $Id: BSE_editipo.h 12703 2007-11-28 12:11:06Z ton $ + * + * ***** 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 BSE_EDITIPO_H +#define BSE_EDITIPO_H + +struct TransVert; +struct IpoCurve; +struct BezTriple; +struct Ipo; +struct EditIpo; +struct ID; +struct ListBase; +struct Object; +struct IpoKey; +struct TransOb; +struct Tex; +struct TransInfo; + +void remake_object_ipos(struct Object *ob); +char *getname_ac_ei(int nr); +char *getname_co_ei(int nr); +char *getname_ob_ei(int nr, int colipo); +char *getname_mtex_ei(int nr); +char *getname_tex_ei(int nr); +char *getname_mat_ei(int nr); +char *getname_world_ei(int nr); +char *getname_seq_ei(int nr); +char *getname_cu_ei(int nr); +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); + +struct EditIpo *get_active_editipo(void); + +void boundbox_ipocurve(struct IpoCurve *icu, int selectedonly); +void boundbox_ipo(struct Ipo *ipo, struct rctf *bb, int selectedonly); +void editipo_changed(struct SpaceIpo *si, int doredraw); +void scale_editipo(void); + +unsigned int ipo_rainbow(int cur, int tot); + +void test_editipo(int doit); +void get_status_editipo(void); +void update_editipo_flags(void); +void set_editflag_editipo(void); +void ipo_toggle_showkey(void); +void swap_selectall_editipo(void); +void swap_visible_editipo(void); +void deselectall_editipo(void); + +void move_to_frame(void); +void do_ipowin_buts(short event); +void do_ipo_selectbuttons(void); + + +/* gets ipo curve, creates if needed */ +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); +void insert_vert_icu(struct IpoCurve *icu, float x, float y, short fast); +void add_vert_ipo(void); + +void add_duplicate_editipo(void); +void remove_doubles_ipo(void); +void clean_ipo(void); +void clean_ipo_curve(struct IpoCurve *icu); +void smooth_ipo(void); +void join_ipo_menu(void); +void join_ipo(int mode); +void ipo_snap_menu(void); +void ipo_snap(short event); +void ipo_mirror_menu(void); +void ipo_mirror(short event); +void mouse_select_ipo(void); +void sethandles_ipo(int code); +void select_ipo_bezier_keys(struct Ipo *ipo, int selectmode); +void select_icu_bezier_keys(struct IpoCurve *icu, int selectmode); +void set_ipotype(void); +void borderselect_ipo(void); +void del_ipo(int need_check); +void del_ipoCurve ( struct IpoCurve * icu ); +void free_ipocopybuf(void); +void copy_editipo(void); +void paste_editipo(void); + +void set_exprap_ipo(int mode); + +void set_speed_editipo(float speed); +void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, short fast); +void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, int adrcode); +void insertkey_editipo(void); +void common_insertkey(void); +void free_ipokey(struct ListBase *lb); +void add_to_ipokey(struct ListBase *lb, struct BezTriple *bezt, int nr, int len); +void make_ipokey(void); +void make_ipokey_spec(struct ListBase *lb, struct Ipo *ipo); +void make_ipokey_transform(struct Object *ob, struct ListBase *lb, int sel); +void update_ipokey_val(void); +void set_tob_old(float *old, float *poin); +void set_ipo_pointers_transob(struct IpoKey *ik, struct TransOb *tob); +void nextkey(struct ListBase *elems, int dir); +void movekey_ipo(int dir); +void movekey_obipo(int dir); +void nextkey_ipo(int dir); +void nextkey_obipo(int dir); +void filter_sampledata(float *data, int sfra, int efra); +void sampledata_to_ipocurve(float *data, int sfra, int efra, struct IpoCurve *icu); +void ipo_record(void); + +void make_ipo_transdata(struct TransInfo *t); +void remake_ipo_transdata(struct TransInfo *t); +void transform_ipo(int mode); + +void actstrip_map_ipo_keys(struct Object *ob, struct Ipo *ipo, short restore, short only_keys); + +void sethandles_ipo_keys(struct Ipo *ipo, int code); +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_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); +void duplicate_ipo_keys(struct Ipo *ipo); +void borderselect_ipo_key(struct Ipo *ipo, float xmin, float xmax, int val); +void borderselect_icu_key(struct IpoCurve *icu, float xmin, float xmax, + int (*select_function)(struct BezTriple *)); +int insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int adrcode); +void insertfloatkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, float floatkey); +void select_ipo_key(struct Ipo *ipo, float selx, int sel); +void select_icu_key(struct IpoCurve *icu, float selx, int selectmode); +void setexprap_ipoloop(struct Ipo *ipo, int code); + +/* callbacks */ +int select_bezier_add(struct BezTriple *bezt); +int select_bezier_subtract(struct BezTriple *bezt); +int select_bezier_invert(struct BezTriple *bezt); + +#endif /* BSE_EDITIPO_H */ + diff --git a/source/blender/editors/include/BSE_editipo_types.h b/source/blender/editors/include/BSE_editipo_types.h new file mode 100644 index 00000000000..1a409f53f1e --- /dev/null +++ b/source/blender/editors/include/BSE_editipo_types.h @@ -0,0 +1,53 @@ +/** + * $Id: BSE_editipo_types.h 2747 2004-07-05 09:15:02Z jesterking $ + * + * ***** 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 BSE_EDITIPO_TYPES_H +#define BSE_EDITIPO_TYPES_H + +struct BezTriple; + +typedef struct IpoKey { + struct IpoKey *next, *prev; + short flag, rt; + float val; + struct BezTriple **data; +} IpoKey; + +typedef struct EditIpo { + char name[32]; // same length as keyblock->name + IpoCurve *icu; + short adrcode, flag; + short disptype, rt; + unsigned int col; +} EditIpo; + +#endif /* BSE_EDITIPO_TYPES_H */ diff --git a/source/blender/editors/include/BSE_editnla_types.h b/source/blender/editors/include/BSE_editnla_types.h new file mode 100644 index 00000000000..d63e373d085 --- /dev/null +++ b/source/blender/editors/include/BSE_editnla_types.h @@ -0,0 +1,41 @@ +/** + * $Id: BSE_editnla_types.h 5478 2005-10-10 18:05:30Z ton $ + * + * ***** 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 BSE_EDITNLA_TYPES_H +#define BSE_EDITNLA_TYPES_H + +#define NLAWIDTH 196 +#define NLACHANNELHEIGHT 16 +#define NLACHANNELSKIP 1 + +#endif /* BSE_EDITNLA_TYPES_H */ + diff --git a/source/blender/editors/include/BSE_filesel.h b/source/blender/editors/include/BSE_filesel.h new file mode 100644 index 00000000000..0fdfde7c976 --- /dev/null +++ b/source/blender/editors/include/BSE_filesel.h @@ -0,0 +1,66 @@ +/** + * $Id: BSE_filesel.h 11920 2007-09-02 17:25:03Z elubie $ + * + * ***** 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 BSE_FILESEL_H +#define BSE_FILESEL_H + +struct SpaceFile; +struct direntry; +struct ID; +struct ScrArea; +struct BWinEvent; + +void filesel_statistics(struct SpaceFile *sfile, int *totfile, int *selfile, float *totlen, float *sellen); +void test_flags_file(struct SpaceFile *sfile); +void sort_filelist(struct SpaceFile *sfile); +void read_dir(struct SpaceFile *sfile); +void freefilelist(struct SpaceFile *sfile); +void parent(struct SpaceFile *sfile); +void swapselect_file(struct SpaceFile *sfile); +void drawfilespace(struct ScrArea *sa, void *spacedata); + +void activate_fileselect(int type, char *title, char *file, void (*func)(char *)); +void activate_fileselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *)); +void activate_fileselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2); + +void activate_databrowse(struct ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short)); +void activate_databrowse_args(struct ID *id, int idcode, int fromcode, short *menup, void (*func)(char *, void *, void *), void *arg1, void *arg2); + +void filesel_prevspace(void); +void free_filesel_spec(char *dir); +void winqreadfilespace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt); +void main_to_filelist(struct SpaceFile *sfile); + +void clever_numbuts_filesel(void); +#endif + diff --git a/source/blender/editors/include/BSE_headerbuttons.h b/source/blender/editors/include/BSE_headerbuttons.h new file mode 100644 index 00000000000..7c7ca0957de --- /dev/null +++ b/source/blender/editors/include/BSE_headerbuttons.h @@ -0,0 +1,158 @@ +/** + * $Id: BSE_headerbuttons.h 10893 2007-06-08 14:17:13Z jiri $ + * + * ***** 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 BSE_HEADERBUTTONS_H +#define BSE_HEADERBUTTONS_H + +struct uiBlock; +struct ScrArea; +struct ID; +struct SpaceIpo; +struct Ipo; + +/* these used to be in blender/src/headerbuttons.c: */ +#define XIC 20 +#define YIC 20 + +int std_libbuttons(struct uiBlock *block, + short xco, short yco, int pin, short *pinpoin, + int browse, short id_code, short special, struct ID *id, struct ID *parid, + short *menupoin, int users, + int lib, int del, int autobut, int keepbut); + +char *windowtype_pup(void); + +int GetButStringLength(char *str); +void load_space_sound(char *str); +void load_sound_buttons(char *str); +/* end of declarations moved from old headerbuttons.c */ + +void update_for_newframe_muted(void); +void update_for_newframe_nodraw(int nosound); +void free_matcopybuf(void); +void clear_matcopybuf(void); +void write_vrml_fs(void); +void write_dxf_fs(void); +void write_stl_fs(void); +int buttons_do_unpack(void); +struct Scene *copy_scene(struct Scene *sce, int level); + +void buttons_active_id(struct ID **id, struct ID **idfrom); + +int start_progress_bar(void); +void end_progress_bar(void); +int progress_bar(float done, char *busy_info); + +void update_for_newframe(void); + +void action_buttons(void); +void buts_buttons(void); +void file_buttons(void); +void image_buttons(void); +void imasel_buttons(void); +void info_buttons(void); +void ipo_buttons(void); +void nla_buttons(void); +void oops_buttons(void); +void seq_buttons(void); +void sound_buttons(void); +void text_buttons(void); +void script_buttons(void); +void view3d_buttons(void); +void time_buttons(struct ScrArea *sa); +void node_buttons(struct ScrArea *sa); + +void do_global_buttons(unsigned short event); +void do_global_buttons2(short event); + +void do_action_buttons(unsigned short event); +void do_buts_buttons(short event); +void do_file_buttons(short event); +void do_image_buttons(unsigned short event); +void do_imasel_buttons(short event); +void do_info_buttons(unsigned short event); +void do_ipo_buttons(short event); +void do_layer_buttons(short event); +void do_nla_buttons(unsigned short event); +void do_oops_buttons(short event); +void do_seq_buttons(short event); +void do_sound_buttons(unsigned short event); +void do_text_buttons(unsigned short event); +void do_script_buttons(unsigned short event); +void do_view3d_buttons(short event); +void do_time_buttons(struct ScrArea *sa, unsigned short event); +void do_node_buttons(struct ScrArea *sa, unsigned short event); + +void do_headerbuttons(short event); + +/* header_ipo.c */ +void spaceipo_assign_ipo(struct SpaceIpo *si, struct Ipo *ipo); + +/* header_text.c */ +void do_text_editmenu_to3dmenu(void *arg, int event); +void do_text_formatmenu_convert(void *arg, int event); + +/* header_info.c */ +void do_info_add_meshmenu(void *arg, int event); +void do_info_add_curvemenu(void *arg, int event); +void do_info_add_surfacemenu(void *arg, int event); +void do_info_add_metamenu(void *arg, int event); +void do_info_add_lampmenu(void *arg, int event); +void do_info_addmenu(void *arg, int event); + +/* header_node.c */ +void do_node_addmenu(void *arg, int event); + +/* header_view3d.c */ +void do_view3d_select_objectmenu(void *arg, int event); +void do_view3d_select_object_groupedmenu(void *arg, int event); +void do_view3d_select_object_linkedmenu(void *arg, int event); +void do_view3d_select_object_layermenu(void *arg, int event); +void do_view3d_select_object_typemenu(void *arg, int event); +void do_view3d_select_faceselmenu(void *arg, int event); +void do_view3d_select_meshmenu(void *arg, int event); +void do_view3d_select_curvemenu(void *arg, int event); +void do_view3d_select_metaballmenu(void *arg, int event); +void do_view3d_edit_snapmenu(void *arg, int event); +void do_view3d_edit_mirrormenu(void *arg, int event); +void do_view3d_transform_moveaxismenu(void *arg, int event); +void do_view3d_transform_rotateaxismenu(void *arg, int event); +void do_view3d_transform_scaleaxismenu(void *arg, int event); +void do_view3d_object_mirrormenu(void *arg, int event); +void do_view3d_edit_mesh_normalsmenu(void *arg, int event); +void do_view3d_edit_mesh_verticesmenu(void *arg, int event); +void do_view3d_edit_mesh_edgesmenu(void *arg, int event); +void do_view3d_edit_mesh_facesmenu(void *arg, int event); +void do_view3d_edit_curve_segmentsmenu(void *arg, int event); +void do_view3d_edit_curve_showhidemenu(void *arg, int event); + +#endif /* BSE_HEADERBUTTONS_H */ diff --git a/source/blender/editors/include/BSE_node.h b/source/blender/editors/include/BSE_node.h new file mode 100644 index 00000000000..171a277e8e6 --- /dev/null +++ b/source/blender/editors/include/BSE_node.h @@ -0,0 +1,137 @@ +/** + * $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 opt ion) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL BLOCK ***** + */ + +#ifndef BSE_NODE_H +#define BSE_NODE_H + +/* ********** drawing sizes *********** */ +#define NODE_DY 20 +#define NODE_DYS 10 +#define NODE_SOCKSIZE 5 +#define BASIS_RAD 8.0f +#define HIDDEN_RAD 15.0f + + +struct SpaceNode; +struct bNode; +struct bNodeTree; +struct Material; +struct ID; +struct Scene; +struct Image; +struct ImageUser; + +/* ************* API for editnode.c *********** */ + + /* helper calls to retreive active context for buttons, does groups */ +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 snode_tag_dirty(struct SpaceNode *snode); + +void snode_set_context(struct SpaceNode *snode); + +void snode_home(struct ScrArea *sa, struct SpaceNode *snode); +void snode_zoom_in(struct ScrArea *sa); +void snode_zoom_out(struct ScrArea *sa); + +void node_deselectall(struct SpaceNode *snode, int swap); +void node_border_select(struct SpaceNode *snode); + +void node_delete(struct SpaceNode *snode); +void node_make_group(struct SpaceNode *snode); +void node_ungroup(struct SpaceNode *snode); +void snode_make_group_editable(struct SpaceNode *snode, struct bNode *gnode); +void node_hide(struct SpaceNode *snode); +void node_read_renderlayers(struct SpaceNode *snode); +void clear_scene_in_nodes(struct Scene *sce); + +void node_transform_ext(int mode, int unused); +void node_shader_default(struct Material *ma); +void node_composit_default(struct Scene *scene); + +int node_has_hidden_sockets(struct bNode *node); + +struct bNode *node_add_node(struct SpaceNode *snode, int type, float locx, float locy); +void node_adduplicate(struct SpaceNode *snode); + +void snode_autoconnect(struct SpaceNode *snode, struct bNode *node_to, int flag); +void node_select_linked(struct SpaceNode *snode, int out); + +struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree); + +void imagepaint_composite_tags(struct bNodeTree *ntree, struct Image *image, struct ImageUser *iuser); + + + +/* ************* drawnode.c *************** */ +struct SpaceNode; +struct bNodeLink; +void node_draw_link(struct SpaceNode *snode, struct bNodeLink *link); + +void init_node_butfuncs(void); + +/* 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); +//void node_texmap_cb(void *texmap_v, void *unused_v); +//void node_new_mat_cb(void *ntree_v, void *node_v); +//void node_browse_mat_cb(void *ntree_v, void *node_v); +//void node_mat_alone_cb(void *node_v, void *unused); + + +//void node_browse_image_cb(void *ntree_v, void *node_v); +//void node_active_cb(void *ntree_v, void *node_v); +//void node_image_type_cb(void *node_v, void *unused); +//char *node_image_type_pup(void); +//char *layer_menu(struct RenderResult *rr); +//void image_layer_cb(void *ima_v, void *iuser_v); +//void set_render_layers_title(void *node_v, void *unused); +//char *scene_layer_menu(struct Scene *sce); +//void node_browse_scene_cb(void *ntree_v, void *node_v); + + +//int node_buts_curvevec(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_curvecol(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_rgb(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_texture(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_valtorgb(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_value(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_mix_rgb(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_group(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_normal(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr); +//int node_buts_math(struct uiBlock *block, struct bNodeTree *ntree, struct bNode *node, struct rctf *butr) ; + + +/* ************* Shader nodes ***************** */ + + +#endif + diff --git a/source/blender/editors/include/BSE_seqaudio.h b/source/blender/editors/include/BSE_seqaudio.h new file mode 100644 index 00000000000..985c4be73d2 --- /dev/null +++ b/source/blender/editors/include/BSE_seqaudio.h @@ -0,0 +1,53 @@ +/** + * ***** 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) 2003 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 BSE_SEQAUDIO_H +#define BSE_SEQAUDIO_H + +#include "SDL.h" +/* muha, we don't init (no SDL_main)! */ +#ifdef main +# undef main +#endif + +#include "DNA_sound_types.h" + +void audio_mixdown(); +void audio_makestream(bSound *sound); +void audiostream_play(Uint32 startframe, Uint32 duration, int mixdown); +void audiostream_fill(Uint8* mixdown, int len); +void audiostream_start(Uint32 frame); +void audiostream_scrub(Uint32 frame); +void audiostream_stop(void); +int audiostream_pos(void); + +#endif + diff --git a/source/blender/editors/include/BSE_seqeffects.h b/source/blender/editors/include/BSE_seqeffects.h new file mode 100644 index 00000000000..f76906bec50 --- /dev/null +++ b/source/blender/editors/include/BSE_seqeffects.h @@ -0,0 +1,96 @@ +/** + * $Id: BSE_seqeffects.h 9554 2006-12-31 15:38:14Z schlaile $ + * + * ***** 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): Peter Schlaile < peter [at] schlaile [dot] de > + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * + */ + +#ifndef BSE_SEQUENCE_EFFECTS_H +#define BSE_SEQUENCE_EFFECTS_H + +/* Wipe effect */ +enum {DO_SINGLE_WIPE, DO_DOUBLE_WIPE, DO_BOX_WIPE, DO_CROSS_WIPE, + DO_IRIS_WIPE,DO_CLOCK_WIPE}; + +struct Sequence; +struct ImBuf; + +struct SeqEffectHandle { + /* constructors & destructor */ + /* init & init_plugin are _only_ called on first creation */ + void (*init)(struct Sequence *seq); + void (*init_plugin)(struct Sequence * seq, const char * fname); + + /* number of input strips needed + (called directly after construction) */ + int (*num_inputs)(); + + /* load is called first time after readblenfile in + get_sequence_effect automatically */ + void (*load)(struct Sequence *seq); + + /* duplicate */ + void (*copy)(struct Sequence *dst, struct Sequence * src); + + /* destruct */ + void (*free)(struct Sequence *seq); + + /* returns: -1: no input needed, + 0: no early out, + 1: out = ibuf1, + 2: out = ibuf2 */ + int (*early_out)(struct Sequence *seq, + float facf0, float facf1); + + /* stores the y-range of the effect IPO */ + void (*store_icu_yrange)(struct Sequence * seq, + short adrcode, float * ymin, float * ymax); + + /* stores the default facf0 and facf1 if no IPO is present */ + void (*get_default_fac)(struct Sequence * seq, int cfra, + float * facf0, float * facf1); + + /* execute the effect + sequence effects are only required to either support + float-rects or byte-rects + (mixed cases are handled one layer up...) */ + + void (*execute)(struct Sequence *seq, int cfra, + float facf0, float facf1, + int x, int y, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out); +}; + +struct SeqEffectHandle get_sequence_effect(struct Sequence * seq); +int get_sequence_effect_num_inputs(int seq_type); +void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force); + +#endif + diff --git a/source/blender/editors/include/BSE_seqscopes.h b/source/blender/editors/include/BSE_seqscopes.h new file mode 100644 index 00000000000..ac803100b8a --- /dev/null +++ b/source/blender/editors/include/BSE_seqscopes.h @@ -0,0 +1,38 @@ +/** + * $Id: BSE_seqscopes.h 6983 2006-03-07 20:01:12Z schlaile $ + * + * ***** 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. + * + * Author: Peter Schlaile < peter [at] schlaile [dot] de > + * + * ***** END GPL LICENSE BLOCK ***** + * + */ + +#ifndef BSE_SEQUENCE_SCOPES_H +#define BSE_SEQUENCE_SCOPES_H + +struct ImBuf; + +struct ImBuf *make_waveform_view_from_ibuf(struct ImBuf * ibuf); +struct ImBuf *make_vectorscope_view_from_ibuf(struct ImBuf * ibuf); + +#endif + diff --git a/source/blender/editors/include/BSE_sequence.h b/source/blender/editors/include/BSE_sequence.h new file mode 100644 index 00000000000..28143828568 --- /dev/null +++ b/source/blender/editors/include/BSE_sequence.h @@ -0,0 +1,89 @@ +/** + * $Id: BSE_sequence.h 12615 2007-11-18 17:39:30Z schlaile $ + * + * ***** 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 BSE_SEQUENCE_H +#define BSE_SEQUENCE_H + + +struct PluginSeq; +struct StripElem; +struct TStripElem; +struct Strip; +struct Sequence; +struct ListBase; +struct Editing; +struct ImBuf; +struct Scene; + +void free_tstripdata(int len, struct TStripElem *se); +void free_strip(struct Strip *strip); +void new_tstripdata(struct Sequence *seq); +void free_sequence(struct Sequence *seq); +void build_seqar(struct ListBase *seqbase, struct Sequence ***seqar, int *totseq); +void free_editing(struct Editing *ed); +void calc_sequence(struct Sequence *seq); +void calc_sequence_disp(struct Sequence *seq); +void sort_seq(void); +void clear_scene_in_allseqs(struct Scene *sce); + +int evaluate_seq_frame(int cfra); +struct StripElem *give_stripelem(struct Sequence *seq, int cfra); +struct TStripElem *give_tstripelem(struct Sequence *seq, int cfra); +void set_meta_stripdata(struct Sequence *seqm); +struct ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chansel); +/* chansel: render this channel. Default=0 (renders end result)*/ +struct ImBuf *give_ibuf_seq_direct(int rectx, int recty, int cfra, + struct Sequence * seq); + +/* sequence prefetch API */ +void seq_start_threads(); +void seq_stop_threads(); +void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown); +void seq_wait_for_prefetch_ready(); +struct ImBuf * give_ibuf_seq_threaded(int rectx, int recty, int cfra, + int chanshown); + + +void free_imbuf_seq_except(int cfra); +void free_imbuf_seq_with_ipo(struct Ipo * ipo); +void free_imbuf_seq(void); + +void update_changed_seq_and_deps(struct Sequence *seq, int len_change, int ibuf_change); + +/* still bad level call... */ +struct RenderResult; +void do_render_seq(struct RenderResult *rr, int cfra); + + +#endif + diff --git a/source/blender/editors/include/BSE_time.h b/source/blender/editors/include/BSE_time.h new file mode 100644 index 00000000000..d5cff9f5e5f --- /dev/null +++ b/source/blender/editors/include/BSE_time.h @@ -0,0 +1,71 @@ +/** + * $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 opt ion) 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) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifndef BSE_TIME_H +#define BSE_TIME_H + +struct ListBase; +struct View2D; + +/* ******** Markers - General Api ********* */ +void add_marker(int frame); +void duplicate_marker(void); +void remove_marker(void); +void rename_marker(void); +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); + +void nextprev_marker(short dir); +void get_minmax_markers(short sel, float *first, float *last); +int find_nearest_marker_time(float dx); + +void add_marker_to_cfra_elem(struct ListBase *lb, struct TimeMarker *marker, short only_sel); +void make_marker_cfra_list(struct ListBase *lb, short only_sel); + +void draw_markers_timespace(int lines); +TimeMarker *get_frame_marker(int frame); + +/* ******** Animation - Preview Range ************* */ +void anim_previewrange_set(void); +void anim_previewrange_clear(void); + +void draw_anim_preview_timespace(void); + +/* *********** TimeLine Specific ***************/ +void timeline_frame_to_center(void); +void nextprev_timeline_key(short dir); + +#endif + diff --git a/source/blender/editors/include/BSE_trans_types.h b/source/blender/editors/include/BSE_trans_types.h new file mode 100644 index 00000000000..5513c3c5fe3 --- /dev/null +++ b/source/blender/editors/include/BSE_trans_types.h @@ -0,0 +1,90 @@ +/** + * $Id: BSE_trans_types.h 12441 2007-10-31 13:56:07Z ton $ + * + * ***** 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 BSE_TRANS_TYPES_H +#define BSE_TRANS_TYPES_H + +struct Object; +struct MDeformVert; +struct ColorBand; + +typedef struct TransOb { + float *loc; + float oldloc[9]; + float *eff; + float oldeff[3]; + float *rot; + float oldrot[12]; + float olddrot[3]; + float *quat; + float oldquat[16]; + float olddquat[4]; + float *size; + float oldsize[12]; + float olddsize[3]; + float obmat[3][3]; + float obinv[3][3]; + float parmat[3][3]; + float parinv[3][3]; + float obvec[3]; + int flag; /* keys */ + float *locx, *locy, *locz; + float *rotx, *roty, *rotz; + float *quatx, *quaty, *quatz, *quatw; + float *sizex, *sizey, *sizez; + /* __NLA */ + float axismat[3][3]; /* Restmat of object (for localspace transforms) */ + void *data; /* Arbitrary data */ + /* end __NLA */ + struct Object *ob; +} TransOb; + +typedef struct TransVert { + float *loc; + float oldloc[3], fac; + float *val, oldval; + int flag; + float *nor; +} TransVert; + +typedef struct VPaint { + float r, g, b, a; + float size; /* of brush */ + float gamma, mul; + short mode, flag; + int tot, pad; /* allocation size of prev buffers */ + unsigned int *vpaint_prev; /* previous mesh colors */ + struct MDeformVert *wpaint_prev; /* previous vertex weights */ +} VPaint; + +#endif /* BSE_TRANS_TYPES_H */ + diff --git a/source/blender/editors/include/BSE_types.h b/source/blender/editors/include/BSE_types.h new file mode 100644 index 00000000000..b4b84c2dbf0 --- /dev/null +++ b/source/blender/editors/include/BSE_types.h @@ -0,0 +1,69 @@ +/** + * $Id: BSE_types.h 8957 2006-11-20 04:28:02Z blendix $ + * + * ***** 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 ***** + */ +/* forward declarations for some prototype header */ +/* these may wildly occur in other header files, too */ + +struct BGpic; +struct SpaceText; +struct Oops; +struct OopsLink; +struct uiBlock; +struct BoundBox; +struct Image; +struct ImBuf; +struct SpaceImaSel; +struct Sequence; +struct Scene; +struct IpoCurve; +struct Ipo; +struct IpoKey; +struct Mesh; +struct MTFace; +struct Object; +struct TransOb; +struct TransVert; +struct BPoint; +struct BezTriple; + +struct Nurb; + +struct EditFace; +struct EditVert; +struct EditEdge; +struct EditIpo; + +struct bArmature; +struct Bone; + +/* interface crap */ +struct uiBut; + diff --git a/source/blender/editors/include/BSE_view.h b/source/blender/editors/include/BSE_view.h new file mode 100644 index 00000000000..684113060f5 --- /dev/null +++ b/source/blender/editors/include/BSE_view.h @@ -0,0 +1,97 @@ +/** + * $Id: BSE_view.h 12237 2007-10-08 22:17:51Z broken $ + * + * ***** 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 ***** + * protos for view.c -- not complete + */ + +#ifndef BSE_VIEW_H +#define BSE_VIEW_H + +struct Object; +struct BoundBox; +struct View3D; +struct ScrArea; + +typedef struct ViewDepths { + unsigned short w, h; + float *depths; + double depth_range[2]; + + char damaged; +} ViewDepths; + +#define PERSP_WIN 0 +#define PERSP_VIEW 1 +#define PERSP_STORE 2 + +void persp_general(int a); +void persp(int a); + +/* note, the define below is still used for shorts, to calc distances... */ +#define IS_CLIPPED 12000 +void view3d_get_object_project_mat(struct ScrArea *area, struct Object *ob, float pmat[4][4], float vmat[4][4]); +void view3d_project_float(struct ScrArea *area, float *vec, float *adr, float mat[4][4]); +void view3d_project_short_clip(struct ScrArea *area, float *vec, short *adr, float projmat[4][4], float viewmat[4][4]); +void view3d_project_short_noclip(struct ScrArea *area, float *vec, short *adr, float mat[4][4]); + +void initgrabz(float x, float y, float z); +void window_to_3d(float *vec, short mx, short my); +void project_short(float *vec, short *adr); +void project_short_noclip(float *vec, short *adr); +void project_int(float *vec, int *adr); +void project_float(float *vec, float *adr); + +int boundbox_clip(float obmat[][4], struct BoundBox *bb); +void fdrawline(float x1, float y1, float x2, float y2); +void fdrawbox(float x1, float y1, float x2, float y2); +void sdrawline(short x1, short y1, short x2, short y2); +void sdrawbox(short x1, short y1, short x2, short y2); +void calctrackballvecfirst(struct rcti *area, short *mval, float *vec); +void calctrackballvec(struct rcti *area, short *mval, float *vec); +void viewmove(int mode); +void view_zoom_mouseloc(float dfac, short *mouseloc); + +int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize); +void setwinmatrixview3d(int winx, int winy, struct rctf *rect); + +void obmat_to_viewmat(struct Object *ob, short smooth); +void setviewmatrixview3d(void); +float *give_cursor(void); +unsigned int free_localbit(void); +void initlocalview(void); +void centerview(void); +void restore_localviewdata(struct View3D *vd); +void endlocalview(struct ScrArea *sa); +void view3d_home(int center); +short view3d_opengl_select(unsigned int *buffer, unsigned int buffsize, short x1, short y1, short x2, short y2); +void view3d_align_axis_to_vector(struct View3D *v3d, int axisidx, float vec[3]); + +#endif + diff --git a/source/blender/editors/include/LOD_DependKludge.h b/source/blender/editors/include/LOD_DependKludge.h new file mode 100644 index 00000000000..b844552f32a --- /dev/null +++ b/source/blender/editors/include/LOD_DependKludge.h @@ -0,0 +1,40 @@ +/* + * $Id: LOD_DependKludge.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 ***** + * Decimation file dependency fix (and kludge) + * Use together with a NAN_DECIMATIONTEST env.var. for Makefile-based linking + */ +#ifndef LOD_DEPENDKLUDGE_H +#define LOD_DEPENDKLUDGE_H + +#define NAN_DECIMATION + +#endif //LOD_DEPENDKLUDGE_H + diff --git a/source/blender/editors/include/blendef.h b/source/blender/editors/include/blendef.h new file mode 100644 index 00000000000..96bd6d10591 --- /dev/null +++ b/source/blender/editors/include/blendef.h @@ -0,0 +1,465 @@ +/* $Id: blendef.h 12752 2007-12-01 23:25:00Z campbellbarton $ + * + * ***** 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 BLENDEF_H +#define BLENDEF_H + + +/* **************** MAX ********************* */ + +#define MAXFRAME 300000 +#define MAXFRAMEF 300000.0f + +#define MINFRAME 1 +#define MINFRAMEF 1.0 + +/* max length material array, 16 because of bits in matfrom */ +#define MAXPICKBUF 10000 +#define MAXSEQ 32 + +/* in buttons.c */ +#define MAX_EFFECT 20 + +#ifndef MAXFLOAT +#define MAXFLOAT ((float)3.40282347e+38) +#endif + +/* also fill in structs itself, dna cannot handle defines, duplicate with utildefines.h still */ +#ifndef FILE_MAXDIR +#define FILE_MAXDIR 160 +#define FILE_MAXFILE 80 +#endif + + +#include + + + + +/* **************** GENERAL ********************* */ + +// return values + +#define RET_OK 0 +#define RET_ERROR 1 +#define RET_CANCEL 2 +#define RET_YES (1 == 1) +#define RET_NO (1 == 0) + +#if defined(__sgi) || defined(__sparc) || defined(__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__) +/* big endian */ +#define MAKE_ID2(c, d) ( (c)<<8 | (d) ) +#define MOST_SIG_BYTE 0 +#define BBIG_ENDIAN +#else +/* little endian */ +#define MAKE_ID2(c, d) ( (d)<<8 | (c) ) +#define MOST_SIG_BYTE 1 +#define BLITTLE_ENDIAN +#endif + +#define SELECT 1 +#define HIDDEN 1 +#define FIRST 1 +#define ACTIVE 2 +/*#ifdef WITH_VERSE*/ +#define VERSE 3 +/*#endif*/ +#define DESELECT 0 +#define NOT_YET 0 +#define VISIBLE 0 +#define LAST 0 + +#define TESTBASE(base) ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) ) +#define TESTBASELIB(base) ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0)) +#define BASE_SELECTABLE(base) ((base->lay & G.vd->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0) +#define FIRSTBASE G.scene->base.first +#define LASTBASE G.scene->base.last +#define BASACT (G.scene->basact) +#define OBACT (BASACT? BASACT->object: 0) +#define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid +#define ID_NEW_US(a) if( (a)->id.newid) {(a)= (void *)(a)->id.newid; (a)->id.us++;} +#define ID_NEW_US2(a) if( ((ID *)a)->newid) {(a)= ((ID *)a)->newid; ((ID *)a)->us++;} +#define CFRA (G.scene->r.cfra) +#define F_CFRA ((float)(G.scene->r.cfra)) +#define SFRA (G.scene->r.sfra) +#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)) +/* 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 & 1 : BEZSELECTED(bezt)) + +/* psfont */ +#define FNT_PDRAW 1 +#define FNT_HAEBERLI 2 + +/* getbutton */ + +/* do_global_buttons(event) */ + +// (first event) +#define B_LOCAL_ALONE 20 + + +#define B_ACTLOCAL 24 /* __NLA */ +#define B_ACTALONE 25 /* __NLA */ +#define B_ARMLOCAL 26 /* __NLA */ +#define B_ARMALONE 27 /* __NLA */ + +#define B_WORLDLOCAL 28 +#define B_WORLDALONE 29 +#define B_LATTLOCAL 30 +#define B_MBALLLOCAL 31 +#define B_CAMERALOCAL 32 +#define B_OBLOCAL 33 +#define B_IPOLOCAL 34 +#define B_LAMPLOCAL 35 +#define B_MATLOCAL 36 +#define B_TEXLOCAL 37 +#define B_MESHLOCAL 38 +#define B_CURVELOCAL 39 + +#define B_LATTALONE 40 +#define B_MBALLALONE 41 +#define B_CAMERAALONE 42 +#define B_OBALONE 43 +#define B_IPOALONE 44 +#define B_LAMPALONE 45 +#define B_MATALONE 46 +#define B_TEXALONE 47 +#define B_MESHALONE 48 +#define B_CURVEALONE 49 + +/* EVENT < 50: alones en locals */ + +#define B_KEEPDATA 60 +#define B_CONSOLETOG 61 +#define B_DRAWINFO 62 +#define B_REDRCURW3D 63 +#define B_FLIPINFOMENU 64 +#define B_FLIPFULLSCREEN 65 +#define B_PLAINMENUS 66 + + +#define B_GLRESLIMITCHANGED 69 +#define B_SHOWSPLASH 70 +#define B_RESETAUTOSAVE 71 +#define B_SOUNDTOGGLE 72 +#define B_MIPMAPCHANGED 73 +#define B_CONSTRAINTBROWSE 74 /* __NLA */ +#define B_ACTIONDELETE 75 /* __NLA */ +#define B_ACTIONBROWSE 76 /* __NLA */ +#define B_IMAGEDELETE 77 +#define B_LTEXBROWSE 78 +#define B_MESHBROWSE 79 +#define B_EXTEXBROWSE 80 +#define B_LOADTEMP 81 +#define B_MATDELETE 82 +#define B_TEXDELETE 83 +#define B_IPODELETE 84 +#define B_WORLDDELETE 85 +#define B_WTEXBROWSE 86 +#define B_WORLDBROWSE 87 +#define B_IPOBROWSE 88 +#define B_NEWFRAME 89 +#define B_LAMPBROWSE 90 +#define B_MATBROWSE 91 +#define B_TEXBROWSE 92 +#define B_EDITBROWSE 93 +#define B_AUTOTEXNAME 94 +#define B_AUTOMATNAME 95 +#define B_MATLOCK 96 +#define B_IDNAME 97 +#define B_NEWSPACE 98 +#define B_FULL 99 +#define B_REDR 100 + + +/* VIEW3D: 100 */ +#define B_HOME 101 +#define B_LAY 102 +/* watch: codes 102-132 in in use for layers */ +#define B_AUTOKEY 139 +#define B_SCENELOCK 140 +#define B_LOCALVIEW 141 +#define B_U_CAPSLOCK 142 + +#define B_VIEWBUT 146 +#define B_PERSP 147 +#define B_PROPTOOL 148 +#define B_VIEWRENDER 149 +#define B_STARTGAME 150 + +#define B_MODESELECT 156 +#define B_AROUND 157 +#define B_SEL_VERT 158 +#define B_SEL_EDGE 159 +#define B_SEL_FACE 160 +#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 + +/* IPO: 200 */ +#define B_IPOHOME 201 +#define B_IPOBORDER 202 +#define B_IPOCOPY 203 +#define B_IPOPASTE 204 +#define B_IPOCONT 205 +#define B_IPOEXTRAP 206 +#define B_IPOCYCLIC 207 +#define B_IPOMAIN 208 +#define B_IPOSHOWKEY 209 +#define B_IPOCYCLICX 210 + /* warn: also used for oops and seq */ +#define B_VIEW2DZOOM 211 +#define B_IPOPIN 212 +#define B_IPO_ACTION_OB 213 +#define B_IPO_ACTION_KEY 214 +#define B_IPOVIEWCENTER 215 +#define B_IPOVIEWALL 216 +#define B_IPOREDRAW 217 + +/* OOPS: 250 */ +#define B_OOPSHOME 251 +#define B_OOPSBORDER 252 +#define B_NEWOOPS 253 +#define B_OOPSVIEWSEL 254 + +/* INFO: 300 */ +/* watch: also in filesel.c and editobject.c */ +#define B_INFOSCR 301 +#define B_INFODELSCR 302 +#define B_INFOSCE 304 +#define B_INFODELSCE 305 +#define B_FILEMENU 306 +#define B_PACKFILE 307 + +#define B_CONSOLEOUT 308 +#define B_CONSOLENUMLINES 309 +#define B_USERPREF 310 +#define B_LOADUIFONT 311 +#define B_SETLANGUAGE 312 +#define B_SETFONTSIZE 313 +#define B_SETENCODING 314 +#define B_SETTRANSBUTS 315 +#define B_DOLANGUIFONT 316 +#define B_RESTOREFONT 317 +#define B_USETEXTUREFONT 318 + +#define B_UITHEMECHANGED 320 +#define B_UITHEMECOLORMOD 321 +#define B_UITHEMERESET 322 +#define B_UITHEMEIMPORT 323 +#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 +#define B_TEXTUDIRFILESEL 331 +#define B_PLUGTEXDIRFILESEL 332 +#define B_PLUGSEQDIRFILESEL 333 +#define B_RENDERDIRFILESEL 334 +#define B_PYTHONDIRFILESEL 335 +#define B_SOUNDDIRFILESEL 336 +#define B_TEMPDIRFILESEL 337 +/* yafray: for exportdir select */ +#define B_YAFRAYDIRFILESEL 338 +#define B_PYMENUEVAL 339 /* re-eval scripts registration in menus */ +/* END Definitions for the fileselect buttons in user prefs */ + +/* IMAGE: 350 */ +#define B_SIMAGEHOME 351 +#define B_SIMABROWSE 352 +#define B_SIMAGELOAD 353 +#define B_SIMA_REDR_IMA_3D 354 +#define B_SIMAGETILE 355 +#define B_BE_SQUARE 356 +#define B_TWINANIM 357 +#define B_SIMAGEREPLACE 358 +#define B_CLIP_UV 359 +#define B_SIMAGELOAD1 360 +#define B_SIMAGEREPLACE1 361 +#define B_SIMAGEPAINTTOOL 362 +#define B_SIMAPACKIMA 363 +#define B_SIMAGESAVE 364 +#define B_SIMACLONEBROWSE 365 +#define B_SIMACLONEDELETE 366 +#define B_SIMANOTHING 368 +#define B_SIMACURVES 369 +#define B_SIMARANGE 370 +#define B_SIMA_USE_ALPHA 371 +#define B_SIMA_SHOW_ALPHA 372 +#define B_SIMA_SHOW_ZBUF 373 +#define B_SIMABRUSHBROWSE 374 +#define B_SIMABRUSHDELETE 375 +#define B_SIMABRUSHLOCAL 376 +#define B_SIMABRUSHCHANGE 377 +#define B_SIMABTEXBROWSE 378 +#define B_SIMABTEXDELETE 379 +#define B_SIMARELOAD 380 +#define B_SIMANAME 381 +#define B_SIMAMULTI 382 +#define B_TRANS_IMAGE 383 +#define B_CURSOR_IMAGE 384 +#define B_SIMA_REPACK 385 +#define B_SIMA_PLAY 386 +#define B_SIMA_RECORD 387 +#define B_SIMAPIN 388 +#define B_SIMA3DVIEWDRAW 389 + + +/* BUTS: 400 */ +#define B_BUTSHOME 401 +#define B_BUTSPREVIEW 402 +#define B_MATCOPY 403 +#define B_MATPASTE 404 +#define B_MESHTYPE 405 +#define B_CONTEXT_SWITCH 406 + +/* IMASEL: 450 */ +/* in imasel.h - not any more - elubie */ +#define B_SORTIMASELLIST 451 +#define B_RELOADIMASELDIR 452 +#define B_FILTERIMASELDIR 453 + +/* TEXT: 500 */ +#define B_TEXTBROWSE 501 +#define B_TEXTALONE 502 +#define B_TEXTLOCAL 503 +#define B_TEXTDELETE 504 +#define B_TEXTFONT 505 +#define B_TEXTSTORE 506 +#define B_TEXTLINENUM 507 +#define B_TAB_NUMBERS 508 +#define B_SYNTAX 509 + +/* SCRIPT: 525 */ +#define B_SCRIPTBROWSE 526 +#define B_SCRIPT2PREV 527 + +/* FILE: 550 */ +#define B_SORTFILELIST 551 +#define B_RELOADDIR 552 + +/* SEQUENCE: 600 */ +#define B_SEQHOME 601 +#define B_SEQCLEAR 602 + +/* SOUND: 650 */ +#define B_SOUNDBROWSE 651 +#define B_SOUNDBROWSE2 652 +#define B_SOUNDHOME 653 +#define B_PACKSOUND 654 + +/* ACTION: 701 - 750 */ +#define B_ACTHOME 701 +#define B_ACTCOPY 702 +#define B_ACTPASTE 703 +#define B_ACTPASTEFLIP 704 +#define B_ACTCYCLIC 705 +#define B_ACTCONT 706 +#define B_ACTMAIN 707 +#define B_ACTPIN 708 +#define B_ACTBAKE 709 +#define B_ACTCOPYKEYS 710 +#define B_ACTPASTEKEYS 711 + +/* TIME: 751 - 800 */ +#define B_TL_REW 751 +#define B_TL_PLAY 752 +#define B_TL_FF 753 +#define B_TL_PREVKEY 754 +#define B_TL_NEXTKEY 755 +#define B_TL_STOP 756 +#define B_TL_PREVIEWON 757 + +/* NLA: 801-850 */ +#define B_NLAHOME 801 + +/* NODE: 851-900 */ +#define B_NODEHOME 851 +#define B_NODE_USEMAT 852 +#define B_NODE_USESCENE 853 + +/* FREE 901 - 999 */ + + +#define B_NOP -1 + + +/* editbutflag */ +#define B_CLOCKWISE 1 +#define B_KEEPORIG 2 +#define B_BEAUTY 4 +#define B_SMOOTH 8 +#define B_BEAUTY_SHORT 16 +#define B_AUTOFGON 32 +#define B_KNIFE 0x80 +#define B_PERCENTSUBD 0x40 +#define B_MESH_X_MIRROR 0x100 +#define B_JOINTRIA_UV 0x200 +#define B_JOINTRIA_VCOL 0X400 +#define B_JOINTRIA_SHARP 0X800 +#define B_JOINTRIA_MAT 0X1000 + +/* DISPLAYMODE */ +#define R_DISPLAYIMAGE 0 +#define R_DISPLAYWIN 1 +#define R_DISPLAYSCREEN 2 + +/* Gvp.flag and Gwp.flag */ +#define VP_COLINDEX 1 +#define VP_AREA 2 +#define VP_SOFT 4 +#define VP_NORMALS 8 +#define VP_SPRAY 16 +#define VP_MIRROR_X 32 +#define VP_HARD 64 +#define VP_ONLYVGROUP 128 + +/* Error messages */ +#define ERROR_LIBDATA_MESSAGE "Can't edit external libdata" + + +#endif diff --git a/source/blender/editors/include/butspace.h b/source/blender/editors/include/butspace.h new file mode 100644 index 00000000000..e48ca941a13 --- /dev/null +++ b/source/blender/editors/include/butspace.h @@ -0,0 +1,762 @@ +/** + * $Id: butspace.h 12708 2007-11-28 18:43:09Z ton $ + * + * ***** 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 BUTSPACE_H +#define BUTSPACE_H + +/* all internal calls and event codes for buttons space */ + +struct Base; +struct Object; +struct ID; +struct ColorBand; +struct uiBlock; +struct rctf; +struct CurveMap; +struct ImageUser; +struct RenderResult; +struct Image; + +/* buts->scaflag */ +#define BUTS_SENS_SEL 1 +#define BUTS_SENS_ACT 2 +#define BUTS_SENS_LINK 4 +#define BUTS_CONT_SEL 8 +#define BUTS_CONT_ACT 16 +#define BUTS_CONT_LINK 32 +#define BUTS_ACT_SEL 64 +#define BUTS_ACT_ACT 128 +#define BUTS_ACT_LINK 256 + +/* internal */ + +/* scene */ +extern void render_panels(void); +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); + +/* 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); +extern void autocomplete_bone(char *str, void *arg_v); +extern void autocomplete_vgroup(char *str, void *arg_v); + +/* effects */ +extern void effects_panels(void); +extern void do_effects_panels(unsigned short event); + +/* modifiers */ +extern int mod_moveUp(void *ob_v, void *md_v); +extern int mod_moveDown(void *ob_v, void *md_v); + +/* constraint */ +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); + +/* editing */ +extern void editing_panels(void); +extern void do_common_editbuts(unsigned short event); +extern void do_meshbuts(unsigned short event); +extern void do_vgroupbuts(unsigned short event); +extern void do_curvebuts(unsigned short event); +extern void do_fontbuts(unsigned short event); +extern void do_mballbuts(unsigned short event); +extern void do_latticebuts(unsigned short event); +extern void do_fpaintbuts(unsigned short event); +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 + +/* shading */ +extern void draw_colorband_buts_small(struct uiBlock *block, struct ColorBand *coba, rctf *rct, int event); +extern void material_panels(void); +extern void do_matbuts(unsigned short event); +extern void lamp_panels(void); +extern void do_lampbuts(unsigned short event); +extern void world_panels(void); +extern void do_worldbuts(unsigned short event); +extern void radio_panels(void); +extern void do_radiobuts(unsigned short event); +extern void texture_panels(void); +extern void do_texbuts(unsigned short event); +void uiblock_image_panel(struct uiBlock *block, struct Image **ima_pp, struct ImageUser *iuser, + short redraw, short imagechanged); +void uiblock_layer_pass_buttons(struct uiBlock *block, struct RenderResult *rr, + struct ImageUser *iuser, int event, int x, int y, int w); + +/* logic */ +extern void do_logic_buts(unsigned short event); +extern void logic_buts(void); + +/* script */ +extern void script_panels(void); +extern void do_scriptbuts(unsigned short event); + +/* ipowindow */ +extern void do_ipobuts(unsigned short event); // drawipo.c (bad! ton) + +/* butspace.c */ +void test_meshpoin_but(char *name, struct ID **idpp); +void test_obpoin_but(char *name, struct ID **idpp); +void test_meshobpoin_but(char *name, struct ID **idpp); +void test_scenepoin_but(char *name, struct ID **idpp); +void test_matpoin_but(char *name, struct ID **idpp); +void test_scriptpoin_but(char *name, struct ID **idpp); +void test_actionpoin_but(char *name, ID **idpp); +void test_grouppoin_but(char *name, ID **idpp); +void test_texpoin_but(char *name, ID **idpp); +void test_imapoin_but(char *name, ID **idpp); + +void test_idbutton_cb(void *namev, void *arg2_unused); + +struct CurveMapping; +void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char labeltype, short event, short redraw, struct rctf *rect); + +/* -------------- internal event defines ------------ */ + + +#define B_DIFF 1 + +/* *********************** */ +#define B_VIEWBUTS 1100 + +#define B_OBJECTPANELROT 1007 +#define B_OBJECTPANELMEDIAN 1008 +#define B_ARMATUREPANEL1 1009 +#define B_ARMATUREPANEL2 1010 +#define B_OBJECTPANELPARENT 1011 +#define B_OBJECTPANEL 1012 +#define B_ARMATUREPANEL3 1013 +#define B_OBJECTPANELSCALE 1014 +#define B_OBJECTPANELDIMS 1015 + +/* *********************** */ +#define B_LAMPBUTS 1200 + +#define B_LAMPREDRAW 1101 +#define B_COLLAMP 1102 +#define B_TEXCLEARLAMP 1103 +#define B_SBUFF 1104 +#define B_SHADBUF 1105 +#define B_SHADRAY 1106 +#define B_LMTEXPASTE 1107 +#define B_LMTEXCOPY 1108 +#define B_LFALLOFFCHANGED 1109 + +/* *********************** */ +#define B_MATBUTS 1300 + +#define B_MATCOL 1201 +#define B_SPECCOL 1202 +#define B_MIRCOL 1203 +#define B_ACTCOL 1204 +#define B_MATFROM 1205 +#define B_MATPRV 1206 +#define B_LAMPPRV 1207 +#define B_WORLDPRV 1208 +#define B_MTEXCOL 1210 +#define B_TEXCLEAR 1211 +#define B_MTEXPASTE 1212 +#define B_MTEXCOPY 1213 +#define B_MATLAY 1214 +#define B_MATHALO 1215 +#define B_MATZTRANSP 1216 +#define B_MATRAYTRANSP 1217 +#define B_MATCOLORBAND 1218 + /* yafray: material preset menu event */ +#define B_MAT_YF_PRESET 1219 + +#define B_MAT_LAYERBROWSE 1220 +#define B_MAT_USENODES 1221 +#define B_MAT_VCOL_PAINT 1222 +#define B_MAT_VCOL_LIGHT 1223 + + /* world buttons: buttons-preview update, and redraw 3dview */ +#define B_WORLDPRV2 1224 + +#define B_MAT_PARTICLE 1225 + +/* *********************** */ +#define B_TEXBUTS 1400 + +#define B_TEXTYPE 1301 +#define B_DEFTEXVAR 1302 + +#define B_NAMEIMA 1304 +#define B_TEXCHANNEL 1305 +#define B_TEXREDR_PRV 1306 +#define B_IMAGECHANGED 1307 + +#define B_LOADPLUGIN 1310 +#define B_NAMEPLUGIN 1311 +#define B_COLORBAND 1312 +#define B_ADDCOLORBAND 1313 +#define B_DELCOLORBAND 1314 +#define B_CALCCBAND 1315 +#define B_CALCCBAND2 1316 +#define B_DOCOLORBAND 1317 +#define B_REDRAWCBAND 1318 +#define B_BANDCOL 1319 +#define B_LOADTEXIMA1 1320 +#define B_TEXPRV 1321 + + +#define B_PLUGBUT 1325 +/* B_PLUGBUT reserves 24 buttons at least! */ + +#define B_ENV_MAKE 1350 +#define B_ENV_FREE 1351 +#define B_ENV_DELETE 1352 +#define B_ENV_SAVE 1353 +#define B_ENV_OB 1354 + +#define B_ENV_FREE_ALL 1357 + + +/* **************** animbuts = object buttons ******* */ +#define B_ANIMBUTS 1500 + +#define B_RECALCPATH 1401 +#define B_TRACKBUTS 1402 +#define B_DUPLI_FRAME 1403 +#define B_DUPLI_VERTS 1404 +#define B_DUPLI_FACES 1405 +#define B_DUPLI_GROUP 1406 + + +#define B_PRINTSPEED 1413 +#define B_PRINTLEN 1414 +#define B_RELKEY 1415 +#define B_CURVECHECK 1416 + +#define B_SOFTBODY_CHANGE 1420 +#define B_SOFTBODY_DEL_VG 1421 +#define B_SOFTBODY_BAKE 1422 +#define B_SOFTBODY_BAKE_FREE 1423 + +/* this has MAX_EFFECT settings! Next free define is 1450... */ +#define B_SELEFFECT 1430 + +/* Fluidsim button defines */ +#define B_FLUIDSIM_BAKE 1450 +#define B_FLUIDSIM_SELDIR 1451 +#define B_FLUIDSIM_FORCEREDRAW 1452 +#define B_FLUIDSIM_MAKEPART 1453 + +#define B_GROUP_RELINK 1460 +#define B_OBJECT_IPOFLAG 1461 + +#define B_BAKEABLE_CHANGE 1470 + +/* *********************** */ +#define B_WORLDBUTS 1600 + +#define B_TEXCLEARWORLD 1501 +#define B_COLHOR 1502 +#define B_COLZEN 1503 +#define B_WMTEXPASTE 1504 +#define B_WMTEXCOPY 1505 +#define B_AO_FALLOFF 1506 + +/* *********************** */ +#define B_RENDERBUTS 1700 + +#define B_FS_PIC 1601 +#define B_FS_BACKBUF 1602 + +#define B_FS_FTYPE 1604 +#define B_DORENDER 1605 +#define B_DOANIM 1606 +#define B_PLAYANIM 1607 +#define B_PR_PAL 1608 +#define B_PR_FULL 1609 +#define B_PR_PRV 1610 +#define B_PR_HD 1611 +#define B_PR_PAL169 1612 + +#define B_REDRAWDISP 1615 +#define B_SETBROWSE 1616 +#define B_CLEARSET 1617 +#define B_PR_PRESET 1618 +#define B_PR_PANO 1619 +#define B_PR_NTSC 1620 + +#define B_IS_FTYPE 1622 +#define B_IS_BACKBUF 1623 +#define B_PR_PC 1624 + +#define B_PR_PANO360 1627 +#define B_PR_HALFFIELDS 1628 +#define B_NEWRENDERPIPE 1629 +#define B_R_SCALE 1630 +#define B_G_SCALE 1631 +#define B_B_SCALE 1632 +#define B_USE_R_SCALE 1633 +#define B_USE_G_SCALE 1634 +#define B_USE_B_SCALE 1635 +#define B_EDGECOLSLI 1636 +#define B_GAMMASLI 1637 + +#define B_FILETYPEMENU 1638 +#define B_SELECTCODEC 1639 +#define B_RTCHANGED 1640 +#define B_SWITCHRENDER 1641 +#define B_FBUF_REDO 1642 + +#define B_SET_EDGE 1643 +#define B_SET_ZBLUR 1644 +#define B_ADD_RENDERLAYER 1645 +#define B_SET_PASS 1646 + +/* *********************** */ +#define B_ARMATUREBUTS 1800 +#define B_POSE 1701 + +/* *********************** */ +#define B_COMMONEDITBUTS 2049 + +#define B_CHANGEDEP 2002 +#define B_MATWICH 2003 +#define B_MATNEW 2004 +#define B_MATDEL 2005 +#define B_MATASS 2006 +#define B_MATSEL 2007 +#define B_MATDESEL 2008 +#define B_HIDE 2009 +#define B_REVEAL 2010 +#define B_SELSWAP 2011 +#define B_SETSMOOTH 2012 +#define B_SETSOLID 2013 +#define B_AUTOTEX 2014 +#define B_DOCENTER 2015 +#define B_DOCENTERNEW 2016 +#define B_DOCENTERCURSOR 2017 +#define B_MATASS_BROWSE 2018 + + /* 20 values! */ +#define B_OBLAY 2019 + +#define B_ADDKEY 2041 +#define B_SETKEY 2042 +#define B_DELKEY 2043 +#define B_NAMEKEY 2044 +#define B_PREVKEY 2045 +#define B_NEXTKEY 2046 +#define B_LOCKKEY 2047 +#define B_MATCOL2 2048 + +#define B_MESHBUTS 2090 + +#define B_FLIPNORM 2050 +#define B_SPIN 2051 +#define B_SPINDUP 2052 +#define B_EXTR 2053 +#define B_SCREW 2054 +#define B_EXTREP 2055 +#define B_SPLIT 2056 +#define B_REMDOUB 2057 +#define B_SUBDIV 2058 +#define B_FRACSUBDIV 2059 +#define B_XSORT 2060 +#define B_HASH 2061 +#define B_MAKESTICKY 2062 +#define B_DELSTICKY 2063 +#define B_NEWMCOL 2064 +#define B_DELMCOL 2065 +#define B_TOSPHERE 2066 +#define B_DECIM_FACES 2067 +#define B_DECIM_CANCEL 2068 +#define B_DECIM_APPLY 2069 +/* B_SLOWERDRAW and B_FASTERDRAW removed */ +#define B_VERTEXNOISE 2072 +#define B_VERTEXSMOOTH 2073 +#define B_NEWTFACE 2074 +#define B_DELTFACE 2075 +#define B_CHROMADEPTH 2076 +#define B_DRAWEDGES 2077 +#define B_DRAWCREASES 2078 +#define B_SETTFACE 2079 +#define B_SETMCOL 2080 +#define B_JOINTRIA 2081 +#define B_SETTFACE_RND 2082 +#define B_SETMCOL_RND 2083 + +/* *********************** */ +#define B_VGROUPBUTS 2100 + +#define B_NEWVGROUP 2091 +#define B_DELVGROUP 2092 +#define B_ASSIGNVGROUP 2093 +#define B_REMOVEVGROUP 2094 +#define B_SELVGROUP 2095 +#define B_DESELVGROUP 2096 +#define B_AUTOVGROUP 2097 +#define B_LINKEDVGROUP 2098 +#define B_COPYVGROUP 2099 + + + +/* *********************** */ +#define B_CURVEBUTS 2200 + +#define B_CONVERTPOLY 2101 +#define B_CONVERTBEZ 2102 +#define B_CONVERTBSPL 2103 +#define B_CONVERTCARD 2104 +#define B_CONVERTNURB 2105 +#define B_UNIFU 2106 +#define B_ENDPU 2107 +#define B_BEZU 2108 +#define B_UNIFV 2109 +#define B_ENDPV 2110 +#define B_BEZV 2111 +#define B_SETWEIGHT 2112 +#define B_SETW1 2113 +#define B_SETW2 2114 +#define B_SETW3 2115 +#define B_SETORDER 2116 +#define B_MAKEDISP 2117 +#define B_SUBDIVCURVE 2118 +#define B_SPINNURB 2119 +#define B_CU3D 2120 +#define B_SETRESOLU 2121 +#define B_SETW4 2122 +#define B_SUBSURFTYPE 2123 +#define B_TILTINTERP 2124 +#define B_SETPT_AUTO 2125 +#define B_SETPT_VECTOR 2126 +#define B_SETPT_ALIGN 2127 +#define B_SETPT_FREE 2128 + +/* *********************** */ +#define B_FONTBUTS 2300 + +#define B_MAKEFONT 2201 +#define B_TOUPPER 2202 +#define B_SETFONT 2203 +#define B_LOADFONT 2204 +#define B_TEXTONCURVE 2205 +#define B_PACKFONT 2206 +#define B_LOAD3DTEXT 2207 +#define B_LOREM 2208 +#define B_FASTFONT 2209 +#define B_INSTB 2210 +#define B_DELTB 2211 +#define B_STYLETOSELB 2212 +#define B_STYLETOSELU 2213 +#define B_STYLETOSELI 2214 + +#define B_SETCHAR 2215 +#define B_SETUPCHAR 2216 +#define B_SETDOWNCHAR 2217 +#define B_SETCAT 2218 +#define B_SETUNITEXT 2219 + +/* *********************** */ +#define B_ARMBUTS 2400 + +#define B_ARM_RECALCDATA 2301 +#define B_ARM_STRIDE 2302 +#define B_ARM_CALCPATHS 2303 +#define B_ARM_CLEARPATHS 2304 + +/* *********************** */ +#define B_CAMBUTS 2500 + +/* *********************** */ +#define B_MBALLBUTS 2600 + +#define B_RECALCMBALL 2501 + +/* *********************** */ +#define B_LATTBUTS 2700 + +#define B_RESIZELAT 2601 +#define B_DRAWLAT 2602 +#define B_LATTCHANGED 2603 +#define B_REGULARLAT 2604 + +/* *********************** */ +#define B_GAMEBUTS 2800 + +#define B_ADD_PROP 2701 +#define B_CHANGE_PROP 2702 + +#define B_ADD_SENS 2703 +#define B_CHANGE_SENS 2704 +#define B_DEL_SENS 2705 + +#define B_ADD_CONT 2706 +#define B_CHANGE_CONT 2707 +#define B_DEL_CONT 2708 + +#define B_ADD_ACT 2709 +#define B_CHANGE_ACT 2710 +#define B_DEL_ACT 2711 + +#define B_SOUNDACT_BROWSE 2712 + +#define B_SETSECTOR 2713 +#define B_SETPROP 2714 +#define B_SETACTOR 2715 +#define B_SETMAINACTOR 2716 +#define B_SETDYNA 2717 + +/* *********************** */ +#define B_FPAINTBUTS 2900 + +#define B_VPCOLSLI 2801 +#define B_VPGAMMA 2802 + +#define B_COPY_TF_MODE 2804 +#define B_COPY_TF_UV 2805 +#define B_COPY_TF_COL 2806 +#define B_REDR_3D_IMA 2807 +#define B_SET_VCOL 2808 + +#define B_COPY_TF_TEX 2814 +#define B_TFACE_HALO 2815 +#define B_TFACE_BILLB 2816 + +#define B_SHOWTEX 2832 +#define B_ASSIGNMESH 2833 + +#define B_WEIGHT0_0 2840 +#define B_WEIGHT1_4 2841 +#define B_WEIGHT1_2 2842 +#define B_WEIGHT3_4 2843 +#define B_WEIGHT1_0 2844 + +#define B_OPA1_8 2845 +#define B_OPA1_4 2846 +#define B_OPA1_2 2847 +#define B_OPA3_4 2848 +#define B_OPA1_0 2849 + +#define B_CLR_WPAINT 2850 + +#define B_BRUSHBROWSE 2851 +#define B_BRUSHDELETE 2852 +#define B_BRUSHLOCAL 2853 +#define B_BRUSHCHANGE 2854 +#define B_BTEXBROWSE 2855 +#define B_BTEXDELETE 2856 +#define B_BRUSHKEEPDATA 2857 + +/* 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 + +#define B_RAD_GO 2901 +#define B_RAD_INIT 2902 +#define B_RAD_LIMITS 2903 +#define B_RAD_FAC 2904 +#define B_RAD_NODELIM 2905 +#define B_RAD_NODEFILT 2906 +#define B_RAD_FACEFILT 2907 +#define B_RAD_ADD 2908 +#define B_RAD_DELETE 2909 +#define B_RAD_COLLECT 2910 +#define B_RAD_SHOOTP 2911 +#define B_RAD_SHOOTE 2912 +#define B_RAD_REPLACE 2913 +#define B_RAD_DRAW 2914 +#define B_RAD_FREE 2915 +#define B_RAD_ADDMESH 2916 + +/* *********************** */ +#define B_SCRIPTBUTS 3100 + +#define B_SCRIPT_ADD 3001 +#define B_SCRIPT_DEL 3002 +#define B_SCRIPT_TYPE 3003 + +/* Scene script buttons */ +#define B_SSCRIPT_ADD 3004 +#define B_SSCRIPT_DEL 3005 +#define B_SSCRIPT_TYPE 3006 + +/* *********************** */ +#define B_SOUNDBUTS 3200 +enum B_SOUND_BUTTONS { + B_SOUND_CHANGED = 3101, + B_SOUND_REDRAW, + B_SOUND_VOLUME, + B_SOUND_PANNING, + B_SOUND_PITCH, + B_SOUND_LOAD_SAMPLE, + B_SOUND_MENU_SAMPLE, + B_SOUND_NAME_SAMPLE, + B_SOUND_UNLINK_SAMPLE, + B_SOUND_RELOAD_SAMPLE, + B_SOUND_UNPACK_SAMPLE, + B_SOUND_PLAY_SAMPLE, + B_SOUND_COPY_SOUND, + B_SOUND_LOOPSTART, + B_SOUND_LOOPEND, + B_SOUND_BIDIRECTIONAL, + B_SOUND_RECALC, + B_SOUND_RATECHANGED, + B_SOUND_MIXDOWN +}; + +/* *********************** */ +#define B_CONSTRAINTBUTS 3300 +enum { + B_CONSTRAINT_TEST = 3201, + B_CONSTRAINT_CHANGETARGET, + B_CONSTRAINT_ADD_NULL, + B_CONSTRAINT_ADD_KINEMATIC, + B_CONSTRAINT_ADD_TRACKTO, + B_CONSTRAINT_ADD_MINMAX, + B_CONSTRAINT_ADD_ROTLIKE, + B_CONSTRAINT_ADD_LOCLIKE, + B_CONSTRAINT_ADD_SIZELIKE, + B_CONSTRAINT_ADD_ACTION, + B_CONSTRAINT_ADD_LOCKTRACK, + B_CONSTRAINT_ADD_FOLLOWPATH, + B_CONSTRAINT_ADD_DISTANCELIMIT, + B_CONSTRAINT_ADD_STRETCHTO, + B_CONSTRAINT_ADD_LOCLIMIT, + B_CONSTRAINT_ADD_ROTLIMIT, + B_CONSTRAINT_ADD_SIZELIMIT, + B_CONSTRAINT_ADD_RIGIDBODYJOINT, + B_CONSTRAINT_ADD_CHILDOF, + B_CONSTRAINT_ADD_PYTHON, + B_CONSTRAINT_ADD_CLAMPTO, + B_CONSTRAINT_ADD_TRANSFORM, + B_CONSTRAINT_INF +}; + +/* *********************** */ +#define B_UVAUTOCALCBUTS 3400 +enum { + B_UVAUTO_REDRAW = 3301, + B_UVAUTO_SPHERE, + B_UVAUTO_CYLINDER, + B_UVAUTO_CYLRADIUS, + B_UVAUTO_WINDOW, + B_UVAUTO_CUBE, + B_UVAUTO_CUBESIZE, + B_UVAUTO_RESET, + B_UVAUTO_BOUNDS, + B_UVAUTO_TOP, + B_UVAUTO_FACE, + B_UVAUTO_OBJECT, + B_UVAUTO_ALIGNX, + B_UVAUTO_ALIGNY, + B_UVAUTO_UNWRAP, + B_UVAUTO_DRAWFACES +}; + +#define B_EFFECTSBUTS 3500 + +#define B_AUTOTIMEOFS 3403 +#define B_FRAMEMAP 3404 +#define B_NEWEFFECT 3405 +#define B_PREVEFFECT 3406 +#define B_NEXTEFFECT 3407 +#define B_CHANGEEFFECT 3408 +#define B_CALCEFFECT 3409 +#define B_DELEFFECT 3410 +#define B_RECALCAL 3411 +#define B_RECALC_DEFL 3412 +#define B_EFFECT_DEP 3413 +#define B_FIELD_DEP 3414 +#define B_FIELD_CHANGE 3415 +#define B_PAF_SET_VG 3416 +#define B_PAF_SET_VG1 3417 +#define B_PARTBROWSE 3418 +#define B_PARTDELETE 3419 +#define B_PARTALONE 3420 +#define B_PARTLOCAL 3421 +#define B_PARTAUTONAME 3422 +#define B_PART_ALLOC 3423 +#define B_PART_DISTR 3424 +#define B_PART_INIT 3425 +#define B_PART_RECALC 3426 +#define B_PART_REDRAW 3427 +#define B_PARTTYPE 3428 +#define B_PARTACT 3429 +#define B_PARTTARGET 3430 +#define B_PART_ALLOC_CHILD 3431 +#define B_PART_DISTR_CHILD 3432 +#define B_PART_INIT_CHILD 3433 +#define B_PART_RECALC_CHILD 3434 +#define B_PART_EDITABLE 3435 + +#define B_PART_REKEY 3436 + +#define B_MODIFIER_BUTS 3600 + +#define B_MODIFIER_RECALC 3501 +#define B_MODIFIER_REDRAW 3502 + +/* *********************** */ +#define B_NODE_BUTS 4000 + /* 400 slots reserved, we want an exec event for each node */ +#define B_NODE_LOADIMAGE 3601 +#define B_NODE_TREE_EXEC 3602 + + /* exec should be last in this list */ +#define B_NODE_EXEC 3610 + + +/* *********************** */ +/* BUTTON 4001-4032: layers? (sort this out!) */ + +/* *********************** */ +/* event code 0x4000 (16384) and larger: general events (redraws, etc) */ + + +#endif + diff --git a/source/blender/editors/include/datatoc.h b/source/blender/editors/include/datatoc.h new file mode 100644 index 00000000000..250418f8a9d --- /dev/null +++ b/source/blender/editors/include/datatoc.h @@ -0,0 +1,63 @@ +/* + * datatoc.h + * + * $Id: datatoc.h 11920 2007-09-02 17:25:03Z elubie $ + * + * ***** 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 DATATOC_H +#define DATATOC_H + +extern int datatoc_B_blend_size; +extern char datatoc_B_blend[]; + +extern int datatoc_Bfs_size; +extern char datatoc_Bfs[]; + +extern int datatoc_blenderbuttons_size; +extern char datatoc_blenderbuttons[]; + +extern int datatoc_prvicons_size; +extern char datatoc_prvicons[]; + +extern int datatoc_Bfont_size; +extern char datatoc_Bfont[]; + +extern int datatoc_bfont_ttf_size; +extern char datatoc_bfont_ttf[]; + +extern int datatoc_cmap_tga_size; +extern char datatoc_cmap_tga[]; + +extern int datatoc_cmovie_tga_size; +extern char datatoc_cmovie_tga[]; + +#endif /* DATATOC_H */ + diff --git a/source/blender/editors/include/editlattice_ext.h b/source/blender/editors/include/editlattice_ext.h new file mode 100644 index 00000000000..b0cb186a587 --- /dev/null +++ b/source/blender/editors/include/editlattice_ext.h @@ -0,0 +1,42 @@ +/* + * editlattice_ext.h + * + * $Id: editlattice_ext.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 EDITLATTICE_EXT_H +#define EDITLATTICE_EXT_H "$Id: editlattice_ext.h 229 2002-12-27 13:11:01Z mein $" +#define EDITLATTICE_EXT_H "Copyright (C) 2001 NaN Technologies B.V. + +void end_latt_deform(void); + +#endif /* EDITLATTICE_EXT_H */ + diff --git a/source/blender/editors/include/editmesh.h b/source/blender/editors/include/editmesh.h new file mode 100644 index 00000000000..1b2d91e22b8 --- /dev/null +++ b/source/blender/editors/include/editmesh.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. + * + * 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 ***** + */ + +/* Internal for editmesh_xxxx.c functions */ + +#ifndef EDITMESH_H +#define EDITMESH_H + +#define TEST_EDITMESH if(G.obedit==0) return; \ + if( (G.vd->lay & G.obedit->lay)==0 ) return; + +#define UVCOPY(t, s) memcpy(t, s, 2 * sizeof(float)); + + + +/* ******************* editmesh.c */ +extern void free_editvert(EditVert *eve); +extern void free_editedge(EditEdge *eed); +extern void free_editface(EditFace *efa); + +extern void free_vertlist(ListBase *edve); +extern void free_edgelist(ListBase *lb); +extern void free_facelist(ListBase *lb); + +extern void remedge(EditEdge *eed); + +extern struct EditVert *addvertlist(float *vec, struct EditVert *example); +extern struct EditEdge *addedgelist(struct EditVert *v1, struct EditVert *v2, struct EditEdge *example); +extern struct EditFace *addfacelist(struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example, struct EditFace *exampleEdges); +extern struct EditEdge *findedgelist(struct EditVert *v1, struct EditVert *v2); + +/* ******************* editmesh_add.c */ + + +/* ******************* editmesh_lib.c */ +extern void EM_fgon_flags(void); +extern void EM_hide_reset(void); + +extern int faceselectedOR(EditFace *efa, int flag); +extern int faceselectedAND(EditFace *efa, int flag); + +extern EditFace *exist_face(EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4); +extern void flipface(EditFace *efa); // flips for normal direction +extern int compareface(EditFace *vl1, EditFace *vl2); + +/* flag for selection bits, *nor will be filled with normal for extrusion constraint */ +/* return value defines if such normal was set */ +extern short extrudeflag_face_indiv(short flag, float *nor); +extern short extrudeflag_verts_indiv(short flag, float *nor); +extern short extrudeflag_edges_indiv(short flag, float *nor); +extern short extrudeflag_vert(short flag, float *nor); +extern short extrudeflag(short flag, float *nor); + +extern void adduplicateflag(int flag); +extern void delfaceflag(int flag); + +extern void rotateflag(short flag, float *cent, float rotmat[][3]); +extern void translateflag(short flag, float *vec); + +extern int convex(float *v1, float *v2, float *v3, float *v4); + +/* ******************* editmesh_mods.c */ +extern EditEdge *findnearestedge(int *dist); +extern void EM_automerge(int update); + +/** + * findnearestvert + * + * dist (in/out): minimal distance to the nearest and at the end, actual distance + * sel: selection bias + * if SELECT, selected vertice are given a 5 pixel bias to make them farter than unselect verts + * if 0, unselected vertice are given the bias + * strict: if 1, the vertice corresponding to the sel parameter are ignored and not just biased + */ +extern EditVert *findnearestvert(int *dist, short sel, short strict); + +/* ******************* editmesh_tools.c */ + + +#endif + diff --git a/source/blender/editors/include/interface.h b/source/blender/editors/include/interface.h new file mode 100644 index 00000000000..18f0db03881 --- /dev/null +++ b/source/blender/editors/include/interface.h @@ -0,0 +1,236 @@ +/** + * $Id: interface.h 11920 2007-09-02 17:25:03Z elubie $ + * + * ***** 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 INTERFACE_H +#define INTERFACE_H + +#include "BIF_resources.h" + +/* general defines */ + +#define UI_MAX_DRAW_STR 400 +#define UI_MAX_NAME_STR 64 +#define UI_ARRAY 29 + +/* panel limits */ +#define UI_PANEL_MINX 100 +#define UI_PANEL_MINY 70 + +/* uiBut->flag */ +#define UI_SELECT 1 +#define UI_MOUSE_OVER 2 +#define UI_ACTIVE 4 +#define UI_HAS_ICON 8 +/* warn: rest of uiBut->flag in BIF_interface.c */ + + +/* internal panel drawing defines */ +#define PNL_GRID 4 +#define PNL_DIST 8 +#define PNL_SAFETY 8 +#define PNL_HEADER 20 + +/* panel->flag */ +#define PNL_SELECT 1 +#define PNL_CLOSEDX 2 +#define PNL_CLOSEDY 4 +#define PNL_CLOSED 6 +#define PNL_TABBED 8 +#define PNL_OVERLAP 16 + +/* Button text selection: + * extension direction, selextend, inside ui_do_but_TEX */ +#define EXTEND_LEFT 1 +#define EXTEND_RIGHT 2 + +typedef struct { + short xim, yim; + unsigned int *rect; + short xofs, yofs; +} uiIconImage; + +typedef struct { + short mval[2]; + short qual, val; + int event; +} uiEvent; + +typedef struct { + void *xl, *large, *medium, *small; +} uiFont; + +typedef struct uiLinkLine { /* only for draw/edit */ + struct uiLinkLine *next, *prev; + + short flag, pad; + + struct uiBut *from, *to; +} uiLinkLine; + +typedef struct { + void **poin; /* pointer to original pointer */ + void ***ppoin; /* pointer to original pointer-array */ + short *totlink; /* if pointer-array, here is the total */ + + short maxlink, pad; + short fromcode, tocode; + + ListBase lines; +} uiLink; + +struct uiBut { + struct uiBut *next, *prev; + short type, pointype, bit, bitnr, retval, strwidth, ofs, pos, selsta, selend; + int flag; + + char *str; + char strdata[UI_MAX_NAME_STR]; + char drawstr[UI_MAX_DRAW_STR]; + + float x1, y1, x2, y2; + + char *poin; + float min, max; + float a1, a2, hsv[3]; // hsv is temp memory for hsv buttons + float aspect; + + void (*func)(void *, void *); + void *func_arg1; + void *func_arg2; + + void (*embossfunc)(int , int , float, float, float, float, float, int); + void (*sliderfunc)(int , float, float, float, float, float, float, int); + + void (*autocomplete_func)(char *, void *); + void *autofunc_arg; + + uiLink *link; + + char *tip, *lockstr; + + int themecol; /* themecolor id */ + void *font; + + BIFIconID icon; + short but_align; /* aligning buttons, horiz/vertical */ + short lock, win; + short iconadd, dt; + + /* IDPOIN data */ + uiIDPoinFuncFP idpoin_func; + ID **idpoin_idpp; + + /* BLOCK data */ + uiBlockFuncFP block_func; + + /* BUTM data */ + void (*butm_func)(void *arg, int event); + void *butm_func_arg; + + /* pointer back */ + uiBlock *block; +}; + +struct uiBlock { + uiBlock *next, *prev; + + ListBase buttons; + Panel *panel; + + char name[UI_MAX_NAME_STR]; + + float winmat[4][4]; + + float minx, miny, maxx, maxy; + float aspect; + + void (*butm_func)(void *arg, int event); + void *butm_func_arg; + + void (*func)(void *arg1, void *arg2); + void *func_arg1; + void *func_arg2; + + /* extra draw function for custom blocks */ + void (*drawextra)(); + + int themecol; /* themecolor id */ + + short font; /* indices */ + int afterval, flag; + void *curfont; + + short autofill, win, winq, direction, dt; + short needflush, auto_open, in_use, pad; //flush see below + void *overdraw; + struct uiBlock *parent; // nested pulldowns + + float xofs, yofs; // offset to parent button + rctf parentrct; // for pulldowns, rect the mouse is allowed outside of menu (parent button) + rctf safety; // pulldowns, to detect outside, can differ per case how it is created + + rctf flush; // rect to be flushed to frontbuffer + int handler; // for panels in other windows than buttonswin... just event code +}; + +/* interface.c */ + +extern void ui_graphics_to_window(int win, float *x, float *y); +extern void ui_graphics_to_window_rct(int win, rctf *graph, rcti *winr); +extern void ui_window_to_graphics(int win, float *x, float *y); + +extern void ui_block_flush_back(uiBlock *block); +extern void ui_block_set_flush(uiBlock *block, uiBut *but); + +extern void ui_check_but(uiBut *but); +extern double ui_get_but_val(uiBut *but); +extern void ui_get_but_vectorf(uiBut *but, float *vec); +extern void ui_set_but_vectorf(uiBut *but, float *vec); +extern void ui_autofill(uiBlock *block); + +/* interface_panel.c */ +extern void ui_draw_panel(uiBlock *block); +extern void ui_do_panel(uiBlock *block, uiEvent *uevent); +extern void ui_scale_panel(uiBlock *block); +extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad); +extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown); + +/* interface_draw.c */ +extern void ui_set_embossfunc(uiBut *but, int drawtype); +extern void ui_draw_but(uiBut *but); +extern void ui_rasterpos_safe(float x, float y, float aspect); +extern void ui_draw_tria_icon(float x, float y, float aspect, char dir); +extern void ui_draw_anti_x(float x1, float y1, float x2, float y2); +extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select); + +#endif + diff --git a/source/blender/editors/include/keyed_functions.h b/source/blender/editors/include/keyed_functions.h new file mode 100644 index 00000000000..3549795b399 --- /dev/null +++ b/source/blender/editors/include/keyed_functions.h @@ -0,0 +1,58 @@ +/** + * $Id: keyed_functions.h 540 2003-03-23 21:42:31Z zuster $ + * ***** 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 KEY_GETPTR(x) (g_ptrtab ? g_ptrtab[x] : 0) + +/* these are the defines for the keyed functions: + + #define key_func + + This function must be of type "int func(void*)" + + To prevent symbol table dumpers from retrieving certain key + functions too easily, some of those functions have nonsense names. +*/ + +#define key_func1 key_return_true +/* add the corresponding function pointer defines here. + Example: + + #define key_func4 my_protected_function_name + #define MY_PROTECTED_FUNCTION_PTR KEY_GETPTR(KEY_FUNC3) + + KEY_GETPTR(KEY_FUNC3) corresponds to the function pointer to function + key_func3 after the python key code unscrambled the function pointer tables. + Also add pointer initializations to these functions in + license_key.c:init_ftable() if necessary. +*/ + +#define KEY_RETURN_TRUE KEY_GETPTR(KEY_FUNC1) + diff --git a/source/blender/editors/include/license_key.h b/source/blender/editors/include/license_key.h new file mode 100644 index 00000000000..1f9fa09a1f5 --- /dev/null +++ b/source/blender/editors/include/license_key.h @@ -0,0 +1,95 @@ +/** + * $Id: license_key.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 LICENCEKEY_H +#define LICENCEKEY_H + +#define I_AM_PUBLISHER temp_val2 +#define LICENSE_KEY_VALID temp_val +#define SHOW_LICENSE_KEY rotop + +extern int LICENSE_KEY_VALID; +extern int I_AM_PUBLISHER; + +extern char * license_key_name; +extern void loadKeyboard(char * name); +extern void checkhome(void); +extern void SHOW_LICENSE_KEY(void); + +#define LICENSE_CHECK_0 (0==0) + +// Stuff from the Python files from Strubi + +typedef int (*Fptr)(void *); + +extern Fptr g_functab[]; +extern Fptr g_ptrtab[]; + +// TODO: From here on, this should be a generated header file... + +// change all KEY_FUNC values +// if you change PYKEY_TABLEN or PYKEY_SEED +// see below + +#define PYKEY_TABLEN 21 // don't change this unless needed. Other values + // may yield bad random orders + +#define PYKEY_SEED {26,8,1972} + +// these values are generated by $HOME/develop/intern/keymaker/makeseed.py +// from the above seed value. + +// DO NOT EDIT THESE VALUES BY HAND! + +#define KEY_FUNC1 12 +#define KEY_FUNC2 8 +#define KEY_FUNC3 1 +#define KEY_FUNC4 16 +#define KEY_FUNC5 20 +#define KEY_FUNC6 18 +#define KEY_FUNC7 13 +#define KEY_FUNC8 6 +#define KEY_FUNC9 9 +#define KEY_FUNC10 7 +#define KEY_FUNC11 14 +#define KEY_FUNC12 0 +#define KEY_FUNC13 5 +#define KEY_FUNC14 10 +#define KEY_FUNC15 19 +#define KEY_FUNC16 2 +#define KEY_FUNC17 11 +#define KEY_FUNC18 3 +#define KEY_FUNC19 17 +#define KEY_FUNC20 15 +#define KEY_FUNC21 4 + +#endif + diff --git a/source/blender/editors/include/multires.h b/source/blender/editors/include/multires.h new file mode 100644 index 00000000000..470084e9c5f --- /dev/null +++ b/source/blender/editors/include/multires.h @@ -0,0 +1,81 @@ +/* + * $Id: multires.h 11480 2007-08-03 16:33:08Z campbellbarton $ + * + * ***** 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 ***** + */ + +#ifndef MULTIRES_H +#define MULTIRES_H + +struct CustomData; +struct EditMesh; +struct Object; +struct MDeformVert; +struct Mesh; +struct MultiresLevel; +struct Multires; +struct uiBlock; + +/* For canceling operations that don't work with multires on or on a non-base level */ +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_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); +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/editors/include/mydevice.h b/source/blender/editors/include/mydevice.h new file mode 100644 index 00000000000..e2b9b529e9b --- /dev/null +++ b/source/blender/editors/include/mydevice.h @@ -0,0 +1,260 @@ + +#ifndef __MYDEVICE_H__ +#define __MYDEVICE_H__ + +/* + * This file has its origin at sgi, where all device defines were written down. + * Blender copied this concept quite some, and expanded it with internal new defines (ton) + * + * mouse / timer / window: until 0x020 + * custom codes: 0x4... + * + * $Id: mydevice.h 12385 2007-10-24 18:58:26Z campbellbarton $ + * + * ***** 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 ***** + */ + +/* MOUSE : 0x00x */ + +#define LEFTMOUSE 0x001 +#define MIDDLEMOUSE 0x002 +#define RIGHTMOUSE 0x003 +#define MOUSEX 0x004 +#define MOUSEY 0x005 +#define WHEELUPMOUSE 0x00a +#define WHEELDOWNMOUSE 0x00b + +/* timers */ + +#define TIMER0 0x006 +#define TIMER1 0x007 +#define TIMER2 0x008 +#define TIMER3 0x009 + +/* SYSTEM : 0x01x */ + +#define KEYBD 0x010 /* keyboard */ +#define RAWKEYBD 0x011 /* raw keyboard for keyboard manager */ +#define REDRAW 0x012 /* used by port manager to signal redraws */ +#define INPUTCHANGE 0x013 /* input connected or disconnected */ +#define QFULL 0x014 /* queue was filled */ +#define WINFREEZE 0x015 /* user wants process in this win to shut up */ +#define WINTHAW 0x016 /* user wants process in this win to go again */ +#define WINCLOSE 0x017 /* window close */ +#define WINQUIT 0x018 /* signal from user that app is to go away */ +#define Q_FIRSTTIME 0x019 /* on startup */ + +/* standard keyboard */ + +#define AKEY 'a' +#define BKEY 'b' +#define CKEY 'c' +#define DKEY 'd' +#define EKEY 'e' +#define FKEY 'f' +#define GKEY 'g' +#define HKEY 'h' +#define IKEY 'i' +#define JKEY 'j' +#define KKEY 'k' +#define LKEY 'l' +#define MKEY 'm' +#define NKEY 'n' +#define OKEY 'o' +#define PKEY 'p' +#define QKEY 'q' +#define RKEY 'r' +#define SKEY 's' +#define TKEY 't' +#define UKEY 'u' +#define VKEY 'v' +#define WKEY 'w' +#define XKEY 'x' +#define YKEY 'y' +#define ZKEY 'z' + +#define ZEROKEY '0' +#define ONEKEY '1' +#define TWOKEY '2' +#define THREEKEY '3' +#define FOURKEY '4' +#define FIVEKEY '5' +#define SIXKEY '6' +#define SEVENKEY '7' +#define EIGHTKEY '8' +#define NINEKEY '9' + +#define CAPSLOCKKEY 211 + +#define LEFTCTRLKEY 212 +#define LEFTALTKEY 213 +#define RIGHTALTKEY 214 +#define RIGHTCTRLKEY 215 +#define RIGHTSHIFTKEY 216 +#define LEFTSHIFTKEY 217 + +#define ESCKEY 218 +#define TABKEY 219 +#define RETKEY 220 +#define SPACEKEY 221 +#define LINEFEEDKEY 222 +#define BACKSPACEKEY 223 +#define DELKEY 224 +#define SEMICOLONKEY 225 +#define PERIODKEY 226 +#define COMMAKEY 227 +#define QUOTEKEY 228 +#define ACCENTGRAVEKEY 229 +#define MINUSKEY 230 +#define SLASHKEY 232 +#define BACKSLASHKEY 233 +#define EQUALKEY 234 +#define LEFTBRACKETKEY 235 +#define RIGHTBRACKETKEY 236 + +#define LEFTARROWKEY 137 +#define DOWNARROWKEY 138 +#define RIGHTARROWKEY 139 +#define UPARROWKEY 140 + +#define PAD0 150 +#define PAD1 151 +#define PAD2 152 +#define PAD3 153 +#define PAD4 154 +#define PAD5 155 +#define PAD6 156 +#define PAD7 157 +#define PAD8 158 +#define PAD9 159 + + +#define PADPERIOD 199 +#define PADSLASHKEY 161 +#define PADASTERKEY 160 + + +#define PADMINUS 162 +#define PADENTER 163 +#define PADPLUSKEY 164 + + +#define F1KEY 300 +#define F2KEY 301 +#define F3KEY 302 +#define F4KEY 303 +#define F5KEY 304 +#define F6KEY 305 +#define F7KEY 306 +#define F8KEY 307 +#define F9KEY 308 +#define F10KEY 309 +#define F11KEY 310 +#define F12KEY 311 + +#define PAUSEKEY 165 +#define INSERTKEY 166 +#define HOMEKEY 167 +#define PAGEUPKEY 168 +#define PAGEDOWNKEY 169 +#define ENDKEY 170 + +#define UNKNOWNKEY 171 +#define COMMANDKEY 172 +#define GRLESSKEY 173 + +/* used as fake leftmouse events, special handled in interface.c */ +#define BUT_ACTIVATE 200 +#define BUT_NEXT 201 +#define BUT_PREV 202 + +/* **************** BLENDER QUEUE EVENTS ********************* */ + +#define CHANGED 0x4000 +#define DRAWEDGES 0x4001 +#define AFTERQUEUE 0x4002 +#define BACKBUFDRAW 0x4003 +#define EXECUTE 0x4004 +#define IGNORE_REDRAW 0x4005 +#define LOAD_FILE 0x4006 +#define RESHAPE 0x4007 +#define UI_BUT_EVENT 0x4008 +#define AUTOSAVE_FILE 0x4009 +#define UNDOPUSH 0x400A + +/* REDRAWVIEW3D has to be the first one (lowest number) for buttons! */ +#define REDRAWVIEW3D 0x4010 +#define REDRAWVIEWCAM 0x4011 +#define REDRAWVIEW3D_Z 0x4012 + +#define REDRAWALL 0x4013 +#define REDRAWHEADERS 0x4014 + +#define REDRAWBUTSHEAD 0x4015 +#define REDRAWBUTSALL 0x4016 + +#define REDRAWBUTSSCENE 0x4017 +#define REDRAWBUTSOBJECT 0x4018 +#define REDRAWBUTSEDIT 0x4019 +#define REDRAWBUTSSCRIPT 0x401A +#define REDRAWBUTSLOGIC 0x401B +#define REDRAWBUTSSHADING 0x401C +#define REDRAWBUTSGAME 0x401D +#define REDRAWBUTSEFFECTS 0x401D + +#define REDRAWINFO 0x4021 +#define RENDERPREVIEW 0x4022 +#define REDRAWIPO 0x4023 +#define REDRAWDATASELECT 0x4024 +#define REDRAWSEQ 0x4025 +#define REDRAWIMAGE 0x4026 +#define REDRAWOOPS 0x4027 +#define REDRAWIMASEL 0x4028 +#define AFTERIMASELIMA 0x4029 +#define AFTERIMASELGET 0x402A +#define AFTERIMAWRITE 0x402B +#define IMALEFTMOUSE 0x402C +#define AFTERPIBREAD 0x402D +#define REDRAWTEXT 0x402E +#define REDRAWSOUND 0x402F +#define REDRAWACTION 0x4030 +#define REDRAWNLA 0x4031 +#define REDRAWSCRIPT 0x4032 +#define REDRAWTIME 0x4033 +#define REDRAWBUTSCONSTRAINT 0x4034 +#define ONLOAD_SCRIPT 0x4035 +#define SCREEN_HANDLER 0x4036 +#define REDRAWANIM 0x4037 +#define REDRAWNODE 0x4038 +#define RECALC_COMPOSITE 0x4039 +#define REDRAWMARKER 0x4040 /* all views that display markers */ +#define REDRAWVIEW3D_IMAGE 0x4041 + +#endif /* !__MYDEVICE_H__ */ + diff --git a/source/blender/editors/include/nla.h b/source/blender/editors/include/nla.h new file mode 100644 index 00000000000..fd3a0b74d01 --- /dev/null +++ b/source/blender/editors/include/nla.h @@ -0,0 +1,45 @@ +/* nla.h May 2001 + * $Id: nla.h 4664 2005-07-09 19:37:38Z ton $ + * + * ***** 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 ***** + * + * XXX THIS FILE SHOULD BE REMOVED! (TON) + * $Id: nla.h 4664 2005-07-09 19:37:38Z ton $ + */ + +#ifndef NLA_H +#define NLA_H + +#define __NLA + +#define __CON_IPO // Not for Release: Not yet fully implemented +//#define __NLA_ACTION_BY_MOTION_ACTUATOR // Not for release: Not yet fully implemented + +#endif + diff --git a/source/blender/editors/include/objfnt.h b/source/blender/editors/include/objfnt.h new file mode 100644 index 00000000000..7ba8d1b03e5 --- /dev/null +++ b/source/blender/editors/include/objfnt.h @@ -0,0 +1,105 @@ +/* $Id: objfnt.h 229 2002-12-27 13:11:01Z mein $ +*/ +/* + * ***** 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 OBJFNTDEF +#define OBJFNTDEF + +typedef struct chardesc { + short movex, movey; /* advance */ + short llx, lly; /* bounding box */ + short urx, ury; + short *data; /* char data */ + long datalen; +} chardesc; + +typedef struct objfnt { + struct objfnt *freeaddr; /* if freeaddr != 0, objfnt is one chunck */ + short type; + short charmin, charmax; + short my_nchars; + short scale; + chardesc *my_chars; +} objfnt; + +#define OFMAGIC 0x93339333 + +#define TM_TYPE 1 +#define PO_TYPE 2 +#define SP_TYPE 3 + +/* ops for tmesh characters */ + +#define TM_BGNTMESH (1) +#define TM_SWAPTMESH (2) +#define TM_ENDBGNTMESH (3) +#define TM_RETENDTMESH (4) +#define TM_RET (5) + +/* ops for poly characters */ + +#define PO_BGNLOOP (1) +#define PO_ENDBGNLOOP (2) +#define PO_RETENDLOOP (3) +#define PO_RET (4) + +/* ops for spline characters */ + +#define SP_MOVETO (1) +#define SP_LINETO (2) +#define SP_CURVETO (3) +#define SP_CLOSEPATH (4) +#define SP_RETCLOSEPATH (5) +#define SP_RET (6) + + +#define MIN_ASCII ' ' +#define MAX_ASCII '~' +#define NASCII (256 - 32) + +#define NOBBOX (30000) + +typedef struct pschar { + char *name; + int code; + int prog; +} pschar; + +extern pschar charlist[NASCII]; + +/* objfnt *fontname(void); */ +/* objfnt *readobjfnt(void); */ +/* objfnt *newobjfnt(void); */ +/* float fontstringwidth(void); */ +/* short *getcharprog(void); */ +/* chardesc *BLI_getchardesc(void); */ +/* char *asciiname(void); */ + +#endif + diff --git a/source/blender/editors/include/particle_effect.h b/source/blender/editors/include/particle_effect.h new file mode 100644 index 00000000000..656c88c5618 --- /dev/null +++ b/source/blender/editors/include/particle_effect.h @@ -0,0 +1,47 @@ +/* dec 95 + * jan feb 96 + * $Id: particle_effect.h 4851 2005-07-20 04:14:21Z zuster $ + * + * ***** 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 PARTICLE_EFFECT_H +#define PARTICLE_EFFECT_H + +/* effect.c */ +extern Effect *add_effect(int type); +extern PartEff *give_parteff(Object *ob); +extern void where_is_particle(PartEff *paf, Particle *pa, float ctime, float *vec); +extern void free_effect(Effect *eff); +extern void free_effects(ListBase *lb); +extern void copy_effects(ListBase *lbn, ListBase *lb); +extern void build_particle_system(Object *ob); + +#endif + diff --git a/source/blender/editors/include/playanim_ext.h b/source/blender/editors/include/playanim_ext.h new file mode 100644 index 00000000000..353ed04f3d7 --- /dev/null +++ b/source/blender/editors/include/playanim_ext.h @@ -0,0 +1,41 @@ +/* + * external interface + * $Id: playanim_ext.h 229 2002-12-27 13:11:01Z mein $ + * + * ***** 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 PLAYANIM_EXT_H +#define PLAYANIM_EXT_H + +/* used in apps */ +void playanim(int argc, char **argv); + +#endif + diff --git a/source/blender/editors/include/transform.h b/source/blender/editors/include/transform.h new file mode 100644 index 00000000000..bf9d96a6658 --- /dev/null +++ b/source/blender/editors/include/transform.h @@ -0,0 +1,458 @@ +/** + * $Id: transform.h 12682 2007-11-26 22:09:57Z blendix $ + * + * ***** 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 TRANSFORM_H +#define TRANSFORM_H + +#include "BIF_transform.h" + +/* ************************** Types ***************************** */ + +struct TransInfo; +struct TransData; +struct TransSnap; +struct NumInput; +struct Object; +struct View3D; +struct ScrArea; +struct bPose; + + +typedef struct NumInput { + short idx; + short idx_max; + short flag; /* Different flags to indicate different behaviors */ + float val[3]; /* Direct value of the input */ + int ctrl[3]; /* Control to indicate what to do with the numbers that are typed */ +} NumInput ; + +/* + The ctrl value has different meaning: + 0 : No value has been typed + + otherwise, |value| - 1 is where the cursor is located after the period + Positive : number is positive + Negative : number is negative +*/ + +typedef struct TransSnap { + short modePoint; + short modeTarget; + int status; + float snapPoint[3]; + float snapTarget[3]; + float dist; // Distance from snapPoint to snapTarget + double last; + void (*applySnap)(struct TransInfo *, float *); + void (*calcSnap)(struct TransInfo *, float *); + void (*targetSnap)(struct TransInfo *); + float (*distance)(struct TransInfo *, float p1[3], float p2[3]); // Get the transform distance between two points (used by Closest snap) +} TransSnap; + +typedef struct TransCon { + char text[50]; /* Description of the Constraint for header_print */ + float mtx[3][3]; /* Matrix of the Constraint space */ + float imtx[3][3]; /* Inverse Matrix of the Constraint space */ + float pmtx[3][3]; /* Projection Constraint Matrix (same as imtx with some axis == 0) */ + float center[3]; /* transformation center to define where to draw the view widget + ALWAYS in global space. Unlike the transformation center */ + short imval[2]; /* initial mouse value for visual calculation */ + /* the one in TransInfo is not garanty to stay the same (Rotates change it) */ + int mode; /* Mode flags of the Constraint */ + void (*drawExtra)(struct TransInfo *); + /* For constraints that needs to draw differently from the other + uses this instead of the generic draw function */ + void (*applyVec)(struct TransInfo *, struct TransData *, float *, float *, float *); + /* Apply function pointer for linear vectorial transformation */ + /* The last three parameters are pointers to the in/out/printable vectors */ + void (*applySize)(struct TransInfo *, struct TransData *, float [3][3]); + /* Apply function pointer for rotation transformation (prototype will change */ + void (*applyRot)(struct TransInfo *, struct TransData *, float [3]); + /* Apply function pointer for rotation transformation (prototype will change */ +} TransCon; + +typedef struct TransDataIpokey { + int flag; /* which keys */ + float *locx, *locy, *locz; /* channel pointers */ + float *rotx, *roty, *rotz; + float *quatx, *quaty, *quatz, *quatw; + float *sizex, *sizey, *sizez; + float oldloc[9]; /* storage old values */ + float oldrot[9]; + float oldsize[9]; + float oldquat[12]; +} TransDataIpokey; + +typedef struct TransDataExtension { + float drot[3]; /* Initial object drot */ + float dsize[3]; /* Initial object dsize */ + float *rot; /* Rotation of the data to transform (Faculative) */ + float irot[3]; /* Initial rotation */ + float *quat; /* Rotation quaternion of the data to transform (Faculative) */ + 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 */ +} TransDataExtension; + +typedef struct TransData2D { + float loc[3]; /* Location of data used to transform (x,y,0) */ + float *loc2d; /* Pointer to real 2d location of data */ +} TransData2D; + +typedef struct TransData { + float dist; /* Distance needed to affect element (for Proportionnal Editing) */ + float rdist; /* Distance to the nearest element (for Proportionnal Editing) */ + float factor; /* Factor of the transformation (for Proportionnal Editing) */ + float *loc; /* Location of the data to transform */ + float iloc[3]; /* Initial location */ + float *val; /* Value pointer for special transforms */ + float ival; /* Old value*/ + float center[3]; /* Individual data center */ + float mtx[3][3]; /* Transformation matrix from data space to global space */ + 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; + 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 */ + short flag; /* Various flags */ + short protectflag; /* If set, copy of Object or PoseChannel protection */ +/*#ifdef WITH_VERSE*/ + void *verse; /* pointer at verse data struct (VerseVert, etc.) */ +/*#endif*/ +} TransData; + +typedef struct TransInfo { + int mode; /* current mode */ + int flag; /* generic flags for special behaviors */ + short state; /* current state (running, canceled,...)*/ + int context; /* current context */ + float val; /* init value for some transformations (and rotation angle) */ + float fac; /* factor for distance based transform */ + int (*transform)(struct TransInfo *, short *); + /* transform function pointer */ + int (*handleEvent)(struct TransInfo *, unsigned short event, short val); + /* event handler function pointer RETURN 1 if redraw is needed */ + int total; /* total number of transformed data */ + TransData *data; /* transformed data (array) */ + TransDataExtension *ext; /* transformed data extension (array) */ + TransData2D *data2d; /* transformed data for 2d (array) */ + TransCon con; /* transformed constraint */ + TransSnap tsnap; + NumInput num; /* numerical input */ + char redraw; /* redraw flag */ + float propsize; /* proportional circle radius */ + char proptext[20]; /* proportional falloff text */ + float center[3]; /* center of transformation */ + int center2d[2]; /* center in screen coordinates */ + short imval[2]; /* initial mouse position */ + short shiftmval[2]; /* mouse position when shift was pressed */ + short idx_max; /* maximum index on the input vector */ + float snap[3]; /* Snapping Gears */ + + float viewmat[4][4]; /* copy from G.vd, prevents feedback, */ + float viewinv[4][4]; /* and to make sure we don't have to */ + float persmat[4][4]; /* access G.vd from other space types */ + float persinv[4][4]; + short persp; + short around; + char spacetype; /* spacetype where transforming is */ + + float vec[3]; /* translation, to show for widget */ + float mat[3][3]; /* rot/rescale, to show for widget */ + + char *undostr; /* if set, uses this string for undo */ + float spacemtx[3][3]; /* orientation matrix of the current space */ + char spacename[32]; /* name of the current space */ + + struct Object *poseobj; /* if t->flag & T_POSE, this denotes pose object */ + + void *customData; /* Per Transform custom data */ +} TransInfo; + + +/* ******************** Macros & Prototypes *********************** */ + +/* NUMINPUT FLAGS */ +#define NUM_NULL_ONE 2 +#define NUM_NO_NEGATIVE 4 +#define NUM_NO_ZERO 8 +#define NUM_NO_FRACTION 16 +#define NUM_AFFECT_ALL 32 + +/* transinfo->state */ +#define TRANS_RUNNING 0 +#define TRANS_CONFIRM 1 +#define TRANS_CANCEL 2 + +/* transinfo->flag */ +#define T_OBJECT (1 << 0) +#define T_EDIT (1 << 1) +#define T_POSE (1 << 2) +#define T_TEXTURE (1 << 3) +#define T_CAMERA (1 << 4) + // when shift pressed, higher resolution transform. cannot rely on G.qual, need event! +#define T_SHIFT_MOD (1 << 5) + // trans on points, having no rotation/scale +#define T_POINTS (1 << 6) + // for manipulator exceptions, like scaling using center point, drawing help lines +#define T_USES_MANIPULATOR (1 << 7) + +/* restrictions flags */ +#define T_ALL_RESTRICTIONS ((1 << 8)|(1 << 9)|(1 << 10)) +#define T_NO_CONSTRAINT (1 << 8) +#define T_NULL_ONE (1 << 9) +#define T_NO_ZERO (1 << 10) + +#define T_PROP_EDIT (1 << 11) +#define T_PROP_CONNECTED (1 << 12) + +/* 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 */ +#define T_CLIP_UV (1 << 16) + +#define T_FREE_CUSTOMDATA (1 << 17) + +/* ******************************************************************************** */ + +/* transinfo->con->mode */ +#define CON_APPLY 1 +#define CON_AXIS0 2 +#define CON_AXIS1 4 +#define CON_AXIS2 8 +#define CON_SELECT 16 +#define CON_NOFLIP 32 /* does not reorient vector to face viewport when on */ +#define CON_LOCAL 64 +#define CON_USER 128 + +/* 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 */ +#ifdef WITH_VERSE + #define TD_VERSE_OBJECT 32 + #define TD_VERSE_VERT 64 +#endif +#define TD_TIMEONLY 128 +#define TD_NOCENTER 256 +#define TD_NO_EXT 512 /* ext abused for particle key timing */ +#define TD_SKIP 1024 /* don't transform this data */ + +/* transsnap->status */ +#define SNAP_ON 1 +#define TARGET_INIT 2 +#define POINT_INIT 4 + +/* transsnap->modePoint */ +#define SNAP_GRID 0 +#define SNAP_GEO 1 + +/* transsnap->modeTarget */ +#define SNAP_CLOSEST 0 +#define SNAP_CENTER 1 +#define SNAP_MEDIAN 2 + +void checkFirstTime(void); + +void setTransformViewMatrices(TransInfo *t); +void convertViewVec(TransInfo *t, float *vec, short dx, short dy); +void projectIntView(TransInfo *t, float *vec, int *adr); +void projectFloatView(TransInfo *t, float *vec, float *adr); + +void convertVecToDisplayNum(float *vec, float *num); +void convertDisplayNumToVec(float *num, float *vec); + +void initWarp(TransInfo *t); +int Warp(TransInfo *t, short mval[2]); + +void initShear(TransInfo *t); +int handleEventShear(TransInfo *t, unsigned short evenl, short val); +int Shear(TransInfo *t, short mval[2]); + +void initResize(TransInfo *t); +int Resize(TransInfo *t, short mval[2]); + +void initTranslation(TransInfo *t); +int Translation(TransInfo *t, short mval[2]); + +void initToSphere(TransInfo *t); +int ToSphere(TransInfo *t, short mval[2]); + +void initRotation(TransInfo *t); +int Rotation(TransInfo *t, short mval[2]); + +void initShrinkFatten(TransInfo *t); +int ShrinkFatten(TransInfo *t, short mval[2]); + +void initTilt(TransInfo *t); +int Tilt(TransInfo *t, short mval[2]); + +void initCurveShrinkFatten(TransInfo *t); +int CurveShrinkFatten(TransInfo *t, short mval[2]); + +void initTrackball(TransInfo *t); +int Trackball(TransInfo *t, short mval[2]); + +void initPushPull(TransInfo *t); +int PushPull(TransInfo *t, short mval[2]); + +void initCrease(TransInfo *t); +int Crease(TransInfo *t, short mval[2]); + +void initBoneSize(TransInfo *t); +int BoneSize(TransInfo *t, short mval[2]); + +void initBoneEnvelope(TransInfo *t); +int BoneEnvelope(TransInfo *t, short mval[2]); + +void initBoneRoll(TransInfo *t); +int BoneRoll(TransInfo *t, short mval[2]); + +void initTimeTranslate(TransInfo *t); +int TimeTranslate(TransInfo *t, short mval[2]); + +void initTimeSlide(TransInfo *t); +int TimeSlide(TransInfo *t, short mval[2]); + +void initTimeScale(TransInfo *t); +int TimeScale(TransInfo *t, short mval[2]); + +void initBakeTime(TransInfo *t); +int BakeTime(TransInfo *t, short mval[2]); + +/*********************** transform_conversions.c ********** */ +struct ListBase; +void flushTransIpoData(TransInfo *t); +void flushTransUVs(TransInfo *t); +void flushTransParticles(TransInfo *t); +int clipUVTransform(TransInfo *t, float *vec, int resize); + +/*********************** exported from transform_manipulator.c ********** */ +void draw_manipulator_ext(struct ScrArea *sa, int type, char axis, int col, float vec[3], float mat[][3]); +int calc_manipulator_stats(struct ScrArea *sa); +float get_drawsize(struct View3D *v3d); + +/*********************** TransData Creation and General Handling *********** */ +void createTransData(TransInfo *t); +void sort_trans_data_dist(TransInfo *t); +void add_tdi_poin(float *poin, float *old, float delta); +void special_aftertrans_update(TransInfo *t); + +/* auto-keying stuff used by special_aftertrans_update */ +void autokeyframe_ob_cb_func(struct Object *ob, int tmode); +void autokeyframe_pose_cb_func(struct Object *ob, int tmode, short targetless_ik); + +/*********************** Constraints *****************************/ + +void getConstraintMatrix(TransInfo *t); +void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[]); +void setLocalConstraint(TransInfo *t, int mode, const char text[]); +void setUserConstraint(TransInfo *t, int mode, const char text[]); + +void constraintNumInput(TransInfo *t, float vec[3]); + +void getConstraintMatrix(TransInfo *t); +int isLockConstraint(TransInfo *t); +int getConstraintSpaceDimension(TransInfo *t); +char constraintModeToChar(TransInfo *t); + +void startConstraint(TransInfo *t); +void stopConstraint(TransInfo *t); + +void initSelectConstraint(TransInfo *t, float mtx[3][3]); +void selectConstraint(TransInfo *t); +void postSelectConstraint(TransInfo *t); + +void setNearestAxis(TransInfo *t); + +/*********************** Snapping ********************************/ + +typedef enum { + NO_GEARS = 0, + BIG_GEARS = 1, + SMALL_GEARS = 2 +} GearsType; + +void snapGrid(TransInfo *t, float *val); +void snapGridAction(TransInfo *t, float *val, GearsType action); + +void initSnapping(struct TransInfo *t); +void applySnapping(TransInfo *t, float *vec); +void resetSnapping(TransInfo *t); +int handleSnapping(TransInfo *t, int event); +void drawSnapping(TransInfo *t); + +/*********************** Generics ********************************/ + +void initTrans(TransInfo *t); +void initTransModeFlags(TransInfo *t, int mode); +void postTrans (TransInfo *t); + +void drawLine(float *center, float *dir, char axis, short options); + +/* DRAWLINE options flags */ +#define DRAWLIGHT 1 +#define DRAWDASHED 2 +#define DRAWBOLD 4 + +void applyTransObjects(TransInfo *t); +void restoreTransObjects(TransInfo *t); +void recalcData(TransInfo *t); + +void calculateCenter(TransInfo *t); +void calculateCenter2D(TransInfo *t); +void calculateCenterBound(TransInfo *t); +void calculateCenterMedian(TransInfo *t); +void calculateCenterCursor(TransInfo *t); + +void calculateCenterCursor2D(TransInfo *t); +void calculatePropRatio(TransInfo *t); + +void getViewVector(float coord[3], float vec[3]); + +TransInfo * BIF_GetTransInfo(void); + +/*********************** NumInput ********************************/ + +void outputNumInput(NumInput *n, char *str); +short hasNumInput(NumInput *n); +void applyNumInput(NumInput *n, float *vec); +char handleNumInput(NumInput *n, unsigned short event); + +#endif + diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h deleted file mode 100644 index e4986727ab1..00000000000 --- a/source/blender/python/BPY_extern.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code was in: source/blender/bpython/include/BPY_extern.h - * - * Contributor(s): Michel Selten, Willian P. Germano, Chris Keith - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#ifndef BPY_EXTERN_H -#define BPY_EXTERN_H - -extern char bprogname[]; /* holds a copy of argv[0], from creator.c */ - -struct Text; /* defined in DNA_text_types.h */ -struct ID; /* DNA_ID.h */ -struct Object; /* DNA_object_types.h */ -struct IpoDriver; /* DNA_curve_types.h */ -struct ScriptLink; /* DNA_scriptlink_types.h */ -struct ListBase; /* DNA_listBase.h */ -struct SpaceText; /* DNA_space_types.h */ -struct SpaceScript; /* DNA_space_types.h */ -struct Script; /* BPI_script.h */ -struct ScrArea; /* DNA_screen_types.h */ -struct bScreen; /* DNA_screen_types.h */ -struct bConstraint; /* DNA_constraint_types.h */ -struct bPythonConstraint; /* DNA_constraint_types.h */ -struct bConstraintOb; /* DNA_constraint_types.h */ -struct bConstraintTarget; /* DNA_constraint_types.h*/ -#ifdef __cplusplus -extern "C" { -#endif - - /*These two next functions are important for making sure the Draw module - works correctly. Before calling any gui callback using the Draw module, - the following code must be executed: - - if (some_drawspace_pylist) { - BPy_Set_DrawButtonsList(some_drawspace_pylist->but_refs); - BPy_Free_DrawButtonsList(); - } - some_drawspace_pylist = PyList_New(0); - BPy_Set_DrawButtonsList(some_drawspace_pylist); - - Also, BPy_Free_DrawButtonsList() must be called as necassary when a drawspace - with python callbacks is destroyed. - - This is necassary to avoid blender buttons storing invalid pointers to freed - python data.*/ - void BPy_Set_DrawButtonsList(void *list); - void BPy_Free_DrawButtonsList(void); - - void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets); - void BPY_pyconstraint_settings(void *arg1, void *arg2); - void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct); - void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con); - int BPY_is_pyconstraint(struct Text *text); - - void BPY_start_python( int argc, char **argv ); - void BPY_end_python( void ); - void BPY_post_start_python( void ); - void init_syspath( int first_time ); - void syspath_append( char *dir ); - - int BPY_Err_getLinenumber( void ); - const char *BPY_Err_getFilename( void ); - - int BPY_txt_do_python_Text( struct Text *text ); - int BPY_menu_do_python( short menutype, int event ); - void BPY_run_python_script( char *filename ); - void BPY_free_compiled_text( struct Text *text ); - - void BPY_clear_bad_scriptlinks( struct Text *byebye ); - int BPY_has_onload_script( void ); - void BPY_do_all_scripts( short event ); - int BPY_check_all_scriptlinks( struct Text *text ); - void BPY_do_pyscript( struct ID *id, short event ); - void BPY_free_scriptlink( struct ScriptLink *slink ); - void BPY_copy_scriptlink( struct ScriptLink *scriptlink ); - - int BPY_is_spacehandler(struct Text *text, char spacetype); - int BPY_del_spacehandler(struct Text *text, struct ScrArea *sa); - int BPY_add_spacehandler(struct Text *txt, struct ScrArea *sa,char spacetype); - int BPY_has_spacehandler(struct Text *text, struct ScrArea *sa); - void BPY_screen_free_spacehandlers(struct bScreen *sc); - int BPY_do_spacehandlers(struct ScrArea *sa, unsigned short event, - unsigned short space_event); - - void BPY_pydriver_update(void); - float BPY_pydriver_eval(struct IpoDriver *driver); - struct Object **BPY_pydriver_get_objects(struct IpoDriver *driver); - - int BPY_button_eval(char *expr, double *value); - -/* format importer hook */ - int BPY_call_importloader( char *name ); - - void BPY_spacescript_do_pywin_draw( struct SpaceScript *sc ); - void BPY_spacescript_do_pywin_event( struct SpaceScript *sc, - unsigned short event, short val, char ascii ); - void BPY_clear_script( struct Script *script ); - void BPY_free_finished_script( struct Script *script ); - -/* void BPY_Err_Handle(struct Text *text); */ -/* void BPY_clear_bad_scriptlink(struct ID *id, struct Text *byebye); */ -/* void BPY_clear_bad_scriptlist(struct ListBase *, struct Text *byebye); */ -/* int BPY_spacetext_is_pywin(struct SpaceText *st); */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* BPY_EXTERN_H */ diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c deleted file mode 100644 index 770fbf13931..00000000000 --- a/source/blender/python/BPY_interface.c +++ /dev/null @@ -1,2659 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten, Willian P. Germano, Stephen Swaney, - * Chris Keith, Chris Want, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include - -#include "compile.h" /* for the PyCodeObject */ -#include "eval.h" /* for PyEval_EvalCode */ -#include "BLI_blenlib.h" /* for BLI_last_slash() */ -#include "BIF_interface.h" /* for pupmenu() */ -#include "BIF_space.h" -#include "BIF_screen.h" -#include "BIF_toolbox.h" -#include "BKE_action.h" /* for get_pose_channel() */ -#include "BKE_library.h" -#include "BKE_object.h" /* during_scriptlink() */ -#include "BKE_text.h" -#include "BKE_constraint.h" /* for bConstraintOb */ -#include "BKE_idprop.h" - -#include "DNA_curve_types.h" /* for struct IpoDriver */ -#include "DNA_ID.h" /* ipo driver */ -#include "DNA_object_types.h" /* ipo driver */ -#include "DNA_constraint_types.h" /* for pyconstraint */ - -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" /* for U.pythondir */ -#include "MEM_guardedalloc.h" -#include "BPY_extern.h" -#include "BPY_menus.h" -#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" -#include "api2_2x/gen_library.h" /* GetPyObjectFromID */ -#include "api2_2x/BGL.h" -#include "api2_2x/Blender.h" -#include "api2_2x/Camera.h" -#include "api2_2x/Draw.h" -#include "api2_2x/Object.h" -#include "api2_2x/Registry.h" -#include "api2_2x/Pose.h" -#include "api2_2x/bpy.h" /* for the new "bpy" module */ - -/*these next two are for pyconstraints*/ -#include "api2_2x/IDProp.h" -#include "api2_2x/matrix.h" - -/* for scriptlinks */ -#include "DNA_lamp_types.h" -#include "DNA_camera_types.h" -#include "DNA_world_types.h" -#include "DNA_scene_types.h" -#include "DNA_material_types.h" - -/* bpy_registryDict is declared in api2_2x/Registry.h and defined - * in api2_2x/Registry.c - * This Python dictionary will be used to store data that scripts - * choose to preserve after they are executed, so user changes can be - * restored next time the script is used. Check the Blender.Registry module. - */ -/*#include "api2_2x/Registry.h" */ - -/* for pydrivers (ipo drivers defined by one-line Python expressions) */ -PyObject *bpy_pydriver_Dict = NULL; - -/* - * set up a weakref list for Armatures - * creates list in __main__ module dict - */ - -int setup_armature_weakrefs() -{ - PyObject *maindict; - PyObject *main_module; - char *list_name = ARM_WEAKREF_LIST_NAME; - - main_module = PyImport_AddModule( "__main__"); - if(main_module){ - PyObject *weakreflink; - maindict= PyModule_GetDict(main_module); - - /* check if there is already a dict entry for the armature weakrefs, - * and delete if so before making another one */ - - weakreflink= PyDict_GetItemString(maindict,list_name); - if( weakreflink != NULL ) { - PyDict_DelItemString(maindict,list_name); - Py_XDECREF( weakreflink ); - } - - if (PyDict_SetItemString(maindict, - list_name, - PyList_New(0)) == -1){ - printf("Oops - setup_armature_weakrefs()\n"); - - return 0; - } - } - return 1; -} - -/* Declares the modules and their initialization functions - * These are TOP-LEVEL modules e.g. import `module` - there is no - * support for packages here e.g. import `package.module` */ - -static struct _inittab BPy_Inittab_Modules[] = { - {"Blender", M_Blender_Init}, - {"bpy", m_bpy_init}, - {NULL, NULL} -}; - -/************************************************************************* -* Structure definitions -**************************************************************************/ -#define FILENAME_LENGTH 24 - -typedef struct _ScriptError { - char filename[FILENAME_LENGTH]; - int lineno; -} ScriptError; - -/**************************************************************************** -* Global variables -****************************************************************************/ -ScriptError g_script_error; - -/*************************************************************************** -* Function prototypes -***************************************************************************/ -PyObject *RunPython( Text * text, PyObject * globaldict ); -char *GetName( Text * text ); -PyObject *CreateGlobalDictionary( void ); -void ReleaseGlobalDictionary( PyObject * dict ); -void DoAllScriptsFromList( ListBase * list, short event ); -PyObject *importText( char *name ); -void init_ourImport( void ); -void init_ourReload( void ); -PyObject *blender_import( PyObject * self, PyObject * args ); -PyObject *RunPython2( Text * text, PyObject * globaldict, PyObject *localdict ); - - -void BPY_Err_Handle( char *script_name ); -PyObject *traceback_getFilename( PyObject * tb ); - -/**************************************************************************** -* Description: This function will start the interpreter and load all modules -* as well as search for a python installation. -****************************************************************************/ -void BPY_start_python( int argc, char **argv ) -{ - static int argc_copy = 0; - static char **argv_copy = NULL; - int first_time = argc; - - /* we keep a copy of the values of argc and argv so that the game engine - * can call BPY_start_python(0, NULL) whenever a game ends, without having - * to know argc and argv there (in source/blender/src/space.c) */ - if( first_time ) { - argc_copy = argc; - argv_copy = argv; - } - - //stuff for Registry module - bpy_registryDict = PyDict_New( );/* check comment at start of this file */ - if( !bpy_registryDict ) - printf( "Error: Couldn't create the Registry Python Dictionary!" ); - Py_SetProgramName( "blender" ); - - /* Py_Initialize() will attempt to import the site module and - * print an error if not found. See init_syspath() for the - * rest of our init msgs. - */ - - /* print Python version - * Py_GetVersion() returns a ptr to a static string "9.9.9 (aaaa..." - */ - { - int count = 3; /* a nice default for major.minor. example 2.5 */ - const char *version = Py_GetVersion(); - /* we know a blank is there somewhere! */ - char *blank_ptr = strchr( version, ' '); - if(blank_ptr) - count = blank_ptr - version; - - printf( "Compiled with Python version %.*s.\n", count, version ); - } - - - //Initialize the TOP-LEVEL modules - PyImport_ExtendInittab(BPy_Inittab_Modules); - - //Start the interpreter - Py_Initialize( ); - PySys_SetArgv( argc_copy, argv_copy ); - - //Overrides __import__ - init_ourImport( ); - init_ourReload( ); - - //init a global dictionary - g_blenderdict = NULL; - - //Look for a python installation - init_syspath( first_time ); /* not first_time: some msgs are suppressed */ - - return; -} - -/*****************************************************************************/ -/* Description: This function will terminate the Python interpreter */ -/*****************************************************************************/ -void BPY_end_python( void ) -{ - Script *script = NULL; - - if( bpy_registryDict ) { - Py_DECREF( bpy_registryDict ); - bpy_registryDict = NULL; - } - - if( bpy_pydriver_Dict ) { - Py_DECREF( bpy_pydriver_Dict ); - bpy_pydriver_Dict = NULL; - } - - /* Freeing all scripts here prevents problems with the order in which - * Python is finalized and G.main is freed in exit_usiblender() */ - for (script = G.main->script.first; script; script = script->id.next) { - BPY_clear_script(script); - free_libblock( &G.main->script, script ); - } - - Py_Finalize( ); - - BPyMenu_RemoveAllEntries( ); /* freeing bpymenu mem */ - - /* a script might've opened a .blend file but didn't close it, so: */ - EXPP_Library_Close( ); - - return; -} - -void syspath_append( char *dirname ) -{ - PyObject *mod_sys= NULL, *dict= NULL, *path= NULL, *dir= NULL; - short ok=1; - PyErr_Clear( ); - - dir = Py_BuildValue( "s", dirname ); - - mod_sys = PyImport_ImportModule( "sys" ); /* new ref */ - - if (mod_sys) { - dict = PyModule_GetDict( mod_sys ); /* borrowed ref */ - path = PyDict_GetItemString( dict, "path" ); /* borrowed ref */ - if ( !PyList_Check( path ) ) { - ok = 0; - } - } else { - /* cant get the sys module */ - ok = 0; - } - - if (ok && PyList_Append( path, dir ) != 0) - ok = 0; /* append failed */ - - if( (ok==0) || PyErr_Occurred( ) ) - Py_FatalError( "could import or build sys.path, can't continue" ); - - Py_XDECREF( mod_sys ); -} - -void init_syspath( int first_time ) -{ - PyObject *path; - PyObject *mod, *d; - char *progname; - char execdir[FILE_MAXDIR]; /*defines from DNA_space_types.h */ - - int n; - - path = Py_BuildValue( "s", bprogname ); - - mod = PyImport_ImportModule( "Blender.sys" ); - - if( mod ) { - d = PyModule_GetDict( mod ); - EXPP_dict_set_item_str( d, "progname", path ); - Py_DECREF( mod ); - } else - printf( "Warning: could not set Blender.sys.progname\n" ); - - progname = BLI_last_slash( bprogname ); /* looks for the last dir separator */ - - n = progname - bprogname; - if( n > 0 ) { - strncpy( execdir, bprogname, n ); - if( execdir[n - 1] == '.' ) - n--; /*fix for when run as ./blender */ - execdir[n] = '\0'; - - syspath_append( execdir ); /* append to module search path */ - } else - printf( "Warning: could not determine argv[0] path\n" ); - - /* - attempt to import 'site' module as a check for valid - python install found. - */ - - printf("Checking for installed Python... "); /* appears after msg "Compiled with Python 2.x" */ - mod = PyImport_ImportModule( "site" ); /* new ref */ - - if( mod ) { - printf("got it!\n"); - Py_DECREF( mod ); - } else { /* import 'site' failed */ - PyErr_Clear( ); - if( first_time ) { - printf( "No installed Python found.\n" ); - printf( "Only built-in modules are available. Some scripts may not run.\n" ); - printf( "Continuing happily.\n" ); - } - } - - - /* - * initialize the sys module - * set sys.executable to the Blender exe - */ - - mod = PyImport_ImportModule( "sys" ); /* new ref */ - - if( mod ) { - d = PyModule_GetDict( mod ); /* borrowed ref */ - EXPP_dict_set_item_str( d, "executable", - Py_BuildValue( "s", bprogname ) ); - Py_DECREF( mod ); - } else{ - printf("import of sys module failed\n"); - } -} - -/**************************************************************************** -* Description: This function finishes Python initialization in Blender. - -Because U.pythondir (user defined dir for scripts) isn't -initialized when BPY_start_Python needs to be executed, we -postpone adding U.pythondir to sys.path and also BPyMenus -(mechanism to register scripts in Blender menus) for when -that dir info is available. -****************************************************************************/ -void BPY_post_start_python( void ) -{ - char dirpath[FILE_MAX]; - char *sdir = NULL; - - if(U.pythondir[0] != '\0' ) { - char modpath[FILE_MAX]; - int upyslen = strlen(U.pythondir); - - /* check if user pydir ends with a slash and, if so, remove the slash - * (for eventual implementations of c library's stat function that might - * not like it) */ - if (upyslen > 2) { /* avoids doing anything if dir == '//' */ - char ending = U.pythondir[upyslen - 1]; - - if (ending == '/' || ending == '\\') - U.pythondir[upyslen - 1] = '\0'; - } - - BLI_strncpy(dirpath, U.pythondir, FILE_MAX); - BLI_convertstringcode(dirpath, G.sce, 0); - syspath_append(dirpath); /* append to module search path */ - - BLI_make_file_string("/", modpath, dirpath, "bpymodules"); - if (BLI_exists(modpath)) syspath_append(modpath); - } - - sdir = bpy_gethome(1); - if (sdir) { - - syspath_append(sdir); - - BLI_make_file_string("/", dirpath, sdir, "bpymodules"); - if (BLI_exists(dirpath)) syspath_append(dirpath); - } - - BPyMenu_Init( 0 ); /* get dynamic menus (registered scripts) data */ - - return; -} - -/**************************************************************************** -* Description: This function will return the linenumber on which an error -* has occurred in the Python script. -****************************************************************************/ -int BPY_Err_getLinenumber( void ) -{ - return g_script_error.lineno; -} - -/*****************************************************************************/ -/* Description: This function will return the filename of the python script. */ -/*****************************************************************************/ -const char *BPY_Err_getFilename( void ) -{ - return g_script_error.filename; -} - -/*****************************************************************************/ -/* Description: Return PyString filename from a traceback object */ -/*****************************************************************************/ -PyObject *traceback_getFilename( PyObject * tb ) -{ - PyObject *v = NULL; - -/* co_filename is in f_code, which is in tb_frame, which is in tb */ - - v = PyObject_GetAttrString( tb, "tb_frame" ); - if (v) { - Py_DECREF( v ); - v = PyObject_GetAttrString( v, "f_code" ); - if (v) { - Py_DECREF( v ); - v = PyObject_GetAttrString( v, "co_filename" ); - } - } - - if (v) return v; - else return PyString_FromString("unknown"); -} - -/**************************************************************************** -* Description: Blender Python error handler. This catches the error and -* stores filename and line number in a global -*****************************************************************************/ -void BPY_Err_Handle( char *script_name ) -{ - PyObject *exception, *err, *tb, *v; - - if( !script_name ) { - printf( "Error: script has NULL name\n" ); - return; - } - - PyErr_Fetch( &exception, &err, &tb ); - - if (!script_name) script_name = "untitled"; - //if( !exception && !tb ) { - // printf( "FATAL: spurious exception\n" ); - // return; - //} - - strcpy( g_script_error.filename, script_name ); - - if( exception - && PyErr_GivenExceptionMatches( exception, PyExc_SyntaxError ) ) { - /* no traceback available when SyntaxError */ - PyErr_Restore( exception, err, tb ); /* takes away reference! */ - PyErr_Print( ); - v = PyObject_GetAttrString( err, "lineno" ); - if( v ) { - g_script_error.lineno = PyInt_AsLong( v ); - Py_DECREF( v ); - } else { - g_script_error.lineno = -1; - } - /* this avoids an abort in Python 2.3's garbage collecting: */ - PyErr_Clear( ); - return; - } else { - PyErr_NormalizeException( &exception, &err, &tb ); - PyErr_Restore( exception, err, tb ); /* takes away reference! */ - PyErr_Print( ); - tb = PySys_GetObject( "last_traceback" ); - - if( !tb ) { - printf( "\nCan't get traceback\n" ); - return; - } - - Py_INCREF( tb ); - -/* From old bpython BPY_main.c: - * 'check traceback objects and look for last traceback in the - * same text file. This is used to jump to the line of where the - * error occured. "If the error occured in another text file or module, - * the last frame in the current file is adressed."' - */ - - for(;;) { - v = PyObject_GetAttrString( tb, "tb_next" ); - - if( !v || v == Py_None || - strcmp(PyString_AsString(traceback_getFilename(v)), script_name)) { - break; - } - - Py_DECREF( tb ); - tb = v; - } - - v = PyObject_GetAttrString( tb, "tb_lineno" ); - if (v) { - g_script_error.lineno = PyInt_AsLong(v); - Py_DECREF(v); - } - v = traceback_getFilename( tb ); - if (v) { - strncpy( g_script_error.filename, PyString_AsString( v ), - FILENAME_LENGTH ); - Py_DECREF(v); - } - Py_DECREF( tb ); - } - - return; -} - -/**************************************************************************** -* Description: This function executes the script passed by st. -* Notes: It is called by blender/src/drawtext.c when a Blender user -* presses ALT+PKEY in the script's text window. -*****************************************************************************/ -int BPY_txt_do_python_Text( struct Text *text ) -{ - PyObject *py_dict, *py_result; - BPy_constant *info; - char textname[24]; - Script *script = G.main->script.first; - - if( !text ) - return 0; - - /* check if this text is already running */ - while( script ) { - if( !strcmp( script->id.name + 2, text->id.name + 2 ) ) { - /* if this text is already a running script, - * just move to it: */ - SpaceScript *sc; - newspace( curarea, SPACE_SCRIPT ); - sc = curarea->spacedata.first; - sc->script = script; - return 1; - } - script = script->id.next; - } - - /* Create a new script structure and initialize it: */ - script = alloc_libblock( &G.main->script, ID_SCRIPT, GetName( text ) ); - - if( !script ) { - printf( "couldn't allocate memory for Script struct!" ); - return 0; - } - - /* if in the script Blender.Load(blendfile) is not the last command, - * an error after it will call BPY_Err_Handle below, but the text struct - * will have been deallocated already, so we need to copy its name here. - */ - BLI_strncpy( textname, GetName( text ), - strlen( GetName( text ) ) + 1 ); - - script->id.us = 1; - script->flags = SCRIPT_RUNNING; - script->py_draw = NULL; - script->py_event = NULL; - script->py_button = NULL; - script->py_browsercallback = NULL; - - py_dict = CreateGlobalDictionary( ); - - if( !setup_armature_weakrefs()){ - printf("Oops - weakref dict\n"); - return 0; - } - - script->py_globaldict = py_dict; - - info = ( BPy_constant * ) PyConstant_New( ); - if( info ) { - PyConstant_Insert( info, "name", - PyString_FromString( script->id.name + 2 ) ); - Py_INCREF( Py_None ); - PyConstant_Insert( info, "arg", Py_None ); - EXPP_dict_set_item_str( py_dict, "__script__", - ( PyObject * ) info ); - } - - py_result = RunPython( text, py_dict ); /* Run the script */ - - if( !py_result ) { /* Failed execution of the script */ - - BPY_Err_Handle( textname ); - ReleaseGlobalDictionary( py_dict ); - script->py_globaldict = NULL; - if( G.main->script.first ) - free_libblock( &G.main->script, script ); - - return 0; - } else { - Py_DECREF( py_result ); - script->flags &= ~SCRIPT_RUNNING; - if( !script->flags ) { - ReleaseGlobalDictionary( py_dict ); - script->py_globaldict = NULL; - free_libblock( &G.main->script, script ); - } - } - - return 1; /* normal return */ -} - -/**************************************************************************** -* Description: Called from command line to run a Python script -* automatically. The script can be a file or a Blender Text in the current -* .blend. -****************************************************************************/ -void BPY_run_python_script( char *fn ) -{ - Text *text = NULL; - int is_blender_text = 0; - - if (!BLI_exists(fn)) { /* if there's no such filename ... */ - text = G.main->text.first; /* try an already existing Blender Text */ - - while (text) { - if (!strcmp(fn, text->id.name + 2)) break; - text = text->id.next; - } - - if (text == NULL) { - printf("\nError: no such file or Blender text -- %s.\n", fn); - return; - } - else is_blender_text = 1; /* fn is already a Blender Text */ - } - - else { - text = add_text(fn); - - if (text == NULL) { - printf("\nError in BPY_run_python_script:\n" - "couldn't create Blender text from %s\n", fn); - /* Chris: On Windows if I continue I just get a segmentation - * violation. To get a baseline file I exit here. */ - exit(2); - /* return; */ - } - } - - if (BPY_txt_do_python_Text(text) != 1) { - printf("\nError executing Python script from command-line:\n" - "%s (at line %d).\n", fn, BPY_Err_getLinenumber()); - } - - if (!is_blender_text) { - /* We can't simply free the text, since the script might have called - * Blender.Load() to load a new .blend, freeing previous data. - * So we check if the pointer is still valid. */ - Text *txtptr = G.main->text.first; - while (txtptr) { - if (txtptr == text) { - free_libblock(&G.main->text, text); - break; - } - txtptr = txtptr->id.next; - } - } -} - -/**************************************************************************** -* Description: This function executes the script chosen from a menu. -* Notes: It is called by the ui code in src/header_???.c when a user -* clicks on a menu entry that refers to a script. -* Scripts are searched in the BPyMenuTable, using the given -* menutype and event values to know which one was chosen. -*****************************************************************************/ -int BPY_menu_do_python( short menutype, int event ) -{ - PyObject *py_dict, *py_res, *pyarg = NULL; - BPy_constant *info; - BPyMenu *pym; - BPySubMenu *pysm; - FILE *fp = NULL; - char *buffer, *s; - char filestr[FILE_MAXDIR + FILE_MAXFILE]; - char scriptname[21]; - Script *script = NULL; - int len; - - pym = BPyMenu_GetEntry( menutype, ( short ) event ); - - if( !pym ) - return 0; - - if( pym->version > G.version ) - notice( "Version mismatch: script was written for Blender %d. " - "It may fail with yours: %d.", pym->version, - G.version ); - -/* if there are submenus, let the user choose one from a pupmenu that we - * create here.*/ - pysm = pym->submenus; - if( pysm ) { - char *pupstr; - int arg; - - pupstr = BPyMenu_CreatePupmenuStr( pym, menutype ); - - if( pupstr ) { - arg = pupmenu( pupstr ); - MEM_freeN( pupstr ); - - if( arg >= 0 ) { - while( arg-- ) - pysm = pysm->next; - pyarg = PyString_FromString( pysm->arg ); - } else - return 0; - } - } - - if( !pyarg ) { /* no submenus */ - Py_INCREF( Py_None ); - pyarg = Py_None; - } - - if( pym->dir ) { /* script is in U.pythondir */ - char upythondir[FILE_MAXDIR]; - - /* dirs in Blender can be "//", which has a special meaning */ - BLI_strncpy(upythondir, U.pythondir, FILE_MAXDIR); - BLI_convertstringcode(upythondir, G.sce, 0); /* if so, this expands it */ - BLI_make_file_string( "/", filestr, upythondir, pym->filename ); - } - else { /* script is in default scripts dir */ - char *scriptsdir = bpy_gethome(1); - - if (!scriptsdir) { - printf("Error loading script: can't find default scripts dir!"); - return 0; - } - - BLI_make_file_string( "/", filestr, scriptsdir, pym->filename ); - } - - fp = fopen( filestr, "rb" ); - if( !fp ) { - printf( "Error loading script: couldn't open file %s\n", - filestr ); - return 0; - } - - BLI_strncpy(scriptname, pym->name, 21); - len = strlen(scriptname) - 1; - /* by convention, scripts that open the file browser or have submenus - * display '...'. Here we remove them from the datablock name */ - while ((len > 0) && scriptname[len] == '.') { - scriptname[len] = '\0'; - len--; - } - - /* Create a new script structure and initialize it: */ - script = alloc_libblock( &G.main->script, ID_SCRIPT, scriptname ); - - if( !script ) { - printf( "couldn't allocate memory for Script struct!" ); - fclose( fp ); - return 0; - } - - /* let's find a proper area for an eventual script gui: - * (still experimenting here, need definition on which win - * each group will be put to code this properly) */ - switch ( menutype ) { - - case PYMENU_IMPORT: /* first 4 were handled in header_info.c */ - case PYMENU_EXPORT: - case PYMENU_HELP: - case PYMENU_RENDER: - case PYMENU_WIZARDS: - case PYMENU_SCRIPTTEMPLATE: - case PYMENU_MESHFACEKEY: - break; - - default: - if( curarea->spacetype != SPACE_SCRIPT ) { - ScrArea *sa = NULL; - - sa = find_biggest_area_of_type( SPACE_BUTS ); - if( sa ) { - if( ( 1.5 * sa->winx ) < sa->winy ) - sa = NULL; /* too narrow? */ - } - - if( !sa ) - sa = find_biggest_area_of_type( SPACE_SCRIPT ); - if( !sa ) - sa = find_biggest_area_of_type( SPACE_TEXT ); - if( !sa ) - sa = find_biggest_area_of_type( SPACE_IMAGE ); /* group UV */ - if( !sa ) - sa = find_biggest_area_of_type( SPACE_VIEW3D ); - - if( !sa ) - sa = find_biggest_area( ); - - areawinset( sa->win ); - } - break; - } - - script->id.us = 1; - script->flags = SCRIPT_RUNNING; - script->py_draw = NULL; - script->py_event = NULL; - script->py_button = NULL; - script->py_browsercallback = NULL; - - py_dict = CreateGlobalDictionary( ); - - script->py_globaldict = py_dict; - - info = ( BPy_constant * ) PyConstant_New( ); - if( info ) { - PyConstant_Insert( info, "name", - PyString_FromString( script->id.name + 2 ) ); - PyConstant_Insert( info, "arg", pyarg ); - EXPP_dict_set_item_str( py_dict, "__script__", - ( PyObject * ) info ); - } - - /* Previously we used PyRun_File to run directly the code on a FILE - * object, but as written in the Python/C API Ref Manual, chapter 2, - * 'FILE structs for different C libraries can be different and - * incompatible'. - * So now we load the script file data to a buffer */ - - fseek( fp, 0L, SEEK_END ); - len = ftell( fp ); - fseek( fp, 0L, SEEK_SET ); - - buffer = MEM_mallocN( len + 2, "pyfilebuf" ); /* len+2 to add '\n\0' */ - len = fread( buffer, 1, len, fp ); - - buffer[len] = '\n'; /* fix syntax error in files w/o eol */ - buffer[len + 1] = '\0'; - - /* fast clean-up of dos cr/lf line endings: change '\r' to space */ - - /* we also have to check for line splitters: '\\' */ - /* to avoid possible syntax errors on dos files on win */ - /**/ - /* but first make sure we won't disturb memory below &buffer[0]: */ - if( *buffer == '\r' ) - *buffer = ' '; - - /* now handle the whole buffer */ - for( s = buffer + 1; *s != '\0'; s++ ) { - if( *s == '\r' ) { - if( *( s - 1 ) == '\\' ) { /* special case: long lines split with '\': */ - *( s - 1 ) = ' '; /* we write ' \', because '\ ' is a syntax error */ - *s = '\\'; - } else - *s = ' '; /* not a split line, just replace '\r' with ' ' */ - } - } - - fclose( fp ); - - - if( !setup_armature_weakrefs()){ - printf("Oops - weakref dict\n"); - MEM_freeN( buffer ); - return 0; - } - - /* run the string buffer */ - - py_res = PyRun_String( buffer, Py_file_input, py_dict, py_dict ); - - MEM_freeN( buffer ); - - if( !py_res ) { /* Failed execution of the script */ - - BPY_Err_Handle( script->id.name + 2 ); - ReleaseGlobalDictionary( py_dict ); - script->py_globaldict = NULL; - if( G.main->script.first ) - free_libblock( &G.main->script, script ); - error( "Python script error: check console" ); - - return 0; - } else { - Py_DECREF( py_res ); - script->flags &= ~SCRIPT_RUNNING; - - if( !script->flags ) { - ReleaseGlobalDictionary( py_dict ); - script->py_globaldict = NULL; - free_libblock( &G.main->script, script ); - - /* special case: called from the menu in the Scripts window - * we have to change sc->script pointer, since it'll be freed here.*/ - if( curarea->spacetype == SPACE_SCRIPT ) { - SpaceScript *sc = curarea->spacedata.first; - sc->script = G.main->script.first; /* can be null, which is ok ... */ - /* ... meaning no other script is running right now. */ - } - - } - } - - return 1; /* normal return */ -} - -/***************************************************************************** -* Description: -* Notes: -*****************************************************************************/ -void BPY_free_compiled_text( struct Text *text ) -{ - if( !text->compiled ) - return; - Py_DECREF( ( PyObject * ) text->compiled ); - text->compiled = NULL; - - return; -} - -/***************************************************************************** -* Description: This function frees a finished (flags == 0) script. -*****************************************************************************/ -void BPY_free_finished_script( Script * script ) -{ - if( !script ) - return; - - if( PyErr_Occurred( ) ) { /* if script ended after filesel */ - PyErr_Print( ); /* eventual errors are handled now */ - error( "Python script error: check console" ); - } - - free_libblock( &G.main->script, script ); - return; -} - -static void unlink_script( Script * script ) -{ /* copied from unlink_text in drawtext.c */ - bScreen *scr; - ScrArea *area; - SpaceLink *sl; - - for( scr = G.main->screen.first; scr; scr = scr->id.next ) { - for( area = scr->areabase.first; area; area = area->next ) { - for( sl = area->spacedata.first; sl; sl = sl->next ) { - if( sl->spacetype == SPACE_SCRIPT ) { - SpaceScript *sc = ( SpaceScript * ) sl; - - if( sc->script == script ) { - sc->script = NULL; - - if( sc == - area->spacedata.first ) { - scrarea_queue_redraw - ( area ); - } - } - } - } - } - } -} - -void BPY_clear_script( Script * script ) -{ - PyObject *dict; - - if( !script ) - return; - - if (!Py_IsInitialized()) { - printf("\nError: trying to free script data after finalizing Python!"); - printf("\nScript name: %s\n", script->id.name+2); - return; - } - - Py_XDECREF( ( PyObject * ) script->py_draw ); - Py_XDECREF( ( PyObject * ) script->py_event ); - Py_XDECREF( ( PyObject * ) script->py_button ); - Py_XDECREF( ( PyObject * ) script->py_browsercallback ); - script->py_draw = NULL; - script->py_event = NULL; - script->py_button = NULL; - script->py_browsercallback = NULL; - - dict = script->py_globaldict; - - if( dict ) { - PyDict_Clear( dict ); - Py_DECREF( dict ); /* Release dictionary. */ - script->py_globaldict = NULL; - } - - unlink_script( script ); -} - -/* PyDrivers */ - -/* PyDrivers are Ipo Drivers governed by expressions written in Python. - * Expressions here are one-liners that evaluate to a float value. */ - -/* For faster execution we keep a special dictionary for pydrivers, with - * the needed modules and aliases. */ -static int bpy_pydriver_create_dict(void) -{ - PyObject *d, *mod; - - if (bpy_pydriver_Dict) return -1; - - d = PyDict_New(); - if (!d) return -1; - - bpy_pydriver_Dict = d; - - /* import some modules: builtins, Blender, math, Blender.noise */ - - PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins()); - - mod = PyImport_ImportModule("Blender"); - if (mod) { - PyDict_SetItemString(d, "Blender", mod); - PyDict_SetItemString(d, "b", mod); - Py_DECREF(mod); - } - - 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) { - PyDict_SetItemString(d, "noise", mod); - PyDict_SetItemString(d, "n", mod); - Py_DECREF(mod); - } - - /* If there's a Blender text called pydrivers.py, import it. - * Users can add their own functions to this module. */ - mod = importText("pydrivers"); /* can also use PyImport_Import() */ - if (mod) { - PyDict_SetItemString(d, "pydrivers", mod); - PyDict_SetItemString(d, "p", mod); - Py_DECREF(mod); - } - else - PyErr_Clear(); - - /* short aliases for some Get() functions: */ - - /* ob(obname) == Blender.Object.Get(obname) */ - mod = PyImport_ImportModule("Blender.Object"); - if (mod) { - PyObject *fcn = PyObject_GetAttrString(mod, "Get"); - Py_DECREF(mod); - if (fcn) { - PyDict_SetItemString(d, "ob", fcn); - Py_DECREF(fcn); - } - } - - /* TODO - change these */ - /* me(meshname) == Blender.Mesh.Get(meshname) */ - mod = PyImport_ImportModule("Blender.Mesh"); - if (mod) { - PyObject *fcn = PyObject_GetAttrString(mod, "Get"); - Py_DECREF(mod); - if (fcn) { - PyDict_SetItemString(d, "me", fcn); - Py_DECREF(fcn); - } - } - - /* ma(matname) == Blender.Material.Get(matname) */ - mod = PyImport_ImportModule("Blender.Material"); - if (mod) { - PyObject *fcn = PyObject_GetAttrString(mod, "Get"); - Py_DECREF(mod); - if (fcn) { - PyDict_SetItemString(d, "ma", fcn); - Py_DECREF(fcn); - } - } - - return 0; -} - -/* error return function for BPY_eval_pydriver */ -static float pydriver_error(IpoDriver *driver) { - - if (bpy_pydriver_oblist) - bpy_pydriver_freeList(); - - if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */ - PyDict_Clear(bpy_pydriver_Dict); - Py_DECREF(bpy_pydriver_Dict); - bpy_pydriver_Dict = NULL; - } - - driver->flag |= IPO_DRIVER_FLAG_INVALID; /* py expression failed */ - - if (driver->ob) - fprintf(stderr, "\nError in Ipo Driver: Object %s\nThis is the failed Python expression:\n'%s'\n\n", driver->ob->id.name+2, driver->name); - else - fprintf(stderr, "\nError in Ipo Driver: No Object\nThis is the failed Python expression:\n'%s'\n\n", driver->name); - - PyErr_Print(); - - return 0.0f; -} - - -/********PyConstraints*********/ - -/* This function checks whether a text-buffer is a PyConstraint candidate. - * It uses simple text parsing that could be easily confused! - */ -int BPY_is_pyconstraint(Text *text) -{ - TextLine *tline = text->lines.first; - - if (tline && (tline->len > 10)) { - char *line = tline->line; - - /* Expected format: #BPYCONSTRAINT - * The actual checks are forgiving, so slight variations also work. */ - if (line && line[0] == '#' && strstr(line, "BPYCONSTRAINT")) return 1; - } - return 0; -} - -/* This function is called to update PyConstraint data so that it is compatible with the script. - * Some of the allocating/freeing of memory for constraint targets occurs here, espcially - * if the number of targets changes. - */ -void BPY_pyconstraint_update(Object *owner, bConstraint *con) -{ - bPythonConstraint *data= con->data; - - if (data->text) { - /* script does exist. it is assumed that this is a valid pyconstraint script */ - PyObject *globals; - PyObject *retval, *gval; - int num, i; - - /* clear the relevant flags first */ - data->flag = 0; - - /* populate globals dictionary */ - globals = CreateGlobalDictionary(); - retval = RunPython(data->text, globals); - - if (retval == NULL) { - BPY_Err_Handle(data->text->id.name); - ReleaseGlobalDictionary(globals); - data->flag |= PYCON_SCRIPTERROR; - return; - } - - Py_XDECREF(retval); - retval = NULL; - - /* try to find NUM_TARGETS */ - gval = PyDict_GetItemString(globals, "NUM_TARGETS"); - if ( (gval) && (num= PyInt_AsLong(gval)) ) { - /* NUM_TARGETS is defined... and non-zero */ - bConstraintTarget *ct; - - /* check if it is valid (just make sure it is not negative) - * TODO: PyInt_AsLong may return -1 as sign of invalid input... - */ - num = abs(num); - data->flag |= PYCON_USETARGETS; - - /* check if the number of targets has changed */ - if (num < data->tarnum) { - /* free a few targets */ - num= data->tarnum - num; - for (i = 0; i < num; i++, data->tarnum--) { - ct= data->targets.last; - BLI_freelinkN(&data->targets, ct); - } - } - else if (num > data->tarnum) { - /* add a few targets */ - num = num - data->tarnum; - for (i = 0; i < num; i++, data->tarnum++) { - ct= MEM_callocN(sizeof(bConstraintTarget), "PyConTarget"); - BLI_addtail(&data->targets, ct); - } - } - - /* validate targets */ - con->flag &= ~CONSTRAINT_DISABLE; - for (ct= data->targets.first; ct; ct= ct->next) { - if (!exist_object(ct->tar)) { - ct->tar = NULL; - con->flag |= CONSTRAINT_DISABLE; - break; - } - - if ((ct->tar == owner) && (ct->subtarget[0] != 0)) { - if (get_named_bone(get_armature(owner), ct->subtarget) == NULL) { - con->flag |= CONSTRAINT_DISABLE; - break; - } - } - } - - /* clear globals */ - ReleaseGlobalDictionary(globals); - } - else { - /* NUM_TARGETS is not defined or equals 0 */ - ReleaseGlobalDictionary(globals); - - /* free all targets */ - BLI_freelistN(&data->targets); - data->tarnum = 0; - data->flag &= ~PYCON_USETARGETS; - - return; - } - } - else { - /* no script, so clear any settings/data now */ - data->tarnum = 0; - data->flag = 0; - con->flag &= ~CONSTRAINT_DISABLE; - - BLI_freelistN(&data->targets); - - /* supposedly this should still leave the base struct... */ - IDP_FreeProperty(data->prop); - } -} - -/* PyConstraints Evaluation Function (only called from evaluate_constraint) - * This function is responsible for modifying the ownermat that it is passed. - */ -void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase *targets) -{ - PyObject *srcmat, *tarmat, *tarmats, *idprop; - PyObject *globals; - PyObject *gval; - PyObject *pyargs, *retval; - bConstraintTarget *ct; - MatrixObject *retmat; - int row, col, index; - - if (!con->text) return; - if (con->flag & PYCON_SCRIPTERROR) return; - - globals = CreateGlobalDictionary(); - - /* wrap blender-data as PyObjects for evaluation - * - we expose the owner's matrix as pymatrix - * - id-properties are wrapped using the id-properties pyapi - * - targets are presented as a list of matrices - */ - srcmat = newMatrixObject((float *)cob->matrix, 4, 4, Py_NEW); - idprop = BPy_Wrap_IDProperty(NULL, con->prop, NULL); - - tarmats= PyList_New(con->tarnum); - for (ct=targets->first, index=0; ct; ct=ct->next, index++) { - tarmat = newMatrixObject((float *)ct->matrix, 4, 4, Py_NEW); - PyList_SET_ITEM(tarmats, index, tarmat); - } - - -/* since I can't remember what the armature weakrefs do, I'll just leave this here - commented out. This function was based on pydrivers, and it might still be relevent. - if( !setup_armature_weakrefs()){ - fprintf( stderr, "Oops - weakref dict setup\n"); - return result; - } -*/ - - retval = RunPython(con->text, globals); - - if (retval == NULL) { - BPY_Err_Handle(con->text->id.name); - con->flag |= PYCON_SCRIPTERROR; - - /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - - ReleaseGlobalDictionary(globals); - - return; - } - - if (retval) {Py_XDECREF( retval );} - retval = NULL; - - gval = PyDict_GetItemString(globals, "doConstraint"); - if (!gval) { - printf("ERROR: no doConstraint function in constraint!\n"); - - /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - - ReleaseGlobalDictionary(globals); - - return; - } - - /* Now for the fun part! Try and find the functions we need. */ - if (PyFunction_Check(gval)) { - pyargs = Py_BuildValue("OOO", srcmat, tarmats, idprop); - retval = PyObject_CallObject(gval, pyargs); - Py_XDECREF(pyargs); - } - else { - printf("ERROR: doConstraint is supposed to be a function!\n"); - con->flag |= PYCON_SCRIPTERROR; - - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - - ReleaseGlobalDictionary(globals); - - return; - } - - if (!retval) { - BPY_Err_Handle(con->text->id.name); - con->flag |= PYCON_SCRIPTERROR; - - /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - - ReleaseGlobalDictionary(globals); - - return; - } - - - if (!PyObject_TypeCheck(retval, &matrix_Type)) { - printf("Error in PyConstraint - doConstraint: Function not returning a matrix!\n"); - con->flag |= PYCON_SCRIPTERROR; - - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - Py_XDECREF(retval); - - ReleaseGlobalDictionary(globals); - - return; - } - - retmat = (MatrixObject *)retval; - if (retmat->rowSize != 4 || retmat->colSize != 4) { - printf("Error in PyConstraint - doConstraint: Matrix returned is the wrong size!\n"); - con->flag |= PYCON_SCRIPTERROR; - - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - Py_XDECREF(retval); - - ReleaseGlobalDictionary(globals); - - return; - } - - /* this is the reverse of code taken from newMatrix() */ - for(row = 0; row < 4; row++) { - for(col = 0; col < 4; col++) { - cob->matrix[row][col] = retmat->contigPtr[row*4+col]; - } - } - - /* free temp objects */ - Py_XDECREF(idprop); - Py_XDECREF(srcmat); - Py_XDECREF(tarmats); - Py_XDECREF(retval); - - /* clear globals */ - ReleaseGlobalDictionary(globals); -} - -/* This evaluates the target matrix for each target the PyConstraint uses. - * NOTE: it only does one target at a time! - */ -void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct) -{ - PyObject *tar, *subtar; - PyObject *tarmat, *idprop; - PyObject *globals; - PyObject *gval; - PyObject *pyargs, *retval; - MatrixObject *retmat; - int row, col; - - if (!con->text) return; - if (con->flag & PYCON_SCRIPTERROR) return; - if (!ct) return; - - globals = CreateGlobalDictionary(); - - tar = Object_CreatePyObject(ct->tar); - if ((ct->tar) && (ct->tar->type==OB_ARMATURE)) { - bPoseChannel *pchan; - pchan = get_pose_channel(ct->tar->pose, ct->subtarget); - subtar = PyPoseBone_FromPosechannel(pchan); - } - else - subtar = PyString_FromString(ct->subtarget); - - tarmat = newMatrixObject((float *)ct->matrix, 4, 4, Py_NEW); - idprop = BPy_Wrap_IDProperty( NULL, con->prop, NULL); - -/* since I can't remember what the armature weakrefs do, I'll just leave this here - commented out. This function was based on pydrivers, and it might still be relevent. - if( !setup_armature_weakrefs()){ - fprintf( stderr, "Oops - weakref dict setup\n"); - return result; - } -*/ - retval = RunPython(con->text, globals); - - if (retval == NULL) { - BPY_Err_Handle(con->text->id.name); - con->flag |= PYCON_SCRIPTERROR; - - /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - - ReleaseGlobalDictionary(globals); - - return; - } - - Py_XDECREF(retval); - retval = NULL; - - /* try to find doTarget function to set the target matrix */ - gval = PyDict_GetItemString(globals, "doTarget"); - if (!gval) { - /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - - ReleaseGlobalDictionary(globals); - - return; - } - - /* Now for the fun part! Try and find the functions we need.*/ - if (PyFunction_Check(gval)) { - pyargs = Py_BuildValue("OOOO", tar, subtar, tarmat, idprop); - retval = PyObject_CallObject(gval, pyargs); - Py_XDECREF(pyargs); - } - else { - printf("ERROR: doTarget is supposed to be a function!\n"); - con->flag |= PYCON_SCRIPTERROR; - - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - - ReleaseGlobalDictionary(globals); - return; - } - - if (!retval) { - BPY_Err_Handle(con->text->id.name); - con->flag |= PYCON_SCRIPTERROR; - - - /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - - ReleaseGlobalDictionary(globals); - return; - } - - if (!PyObject_TypeCheck(retval, &matrix_Type)) { - con->flag |= PYCON_SCRIPTERROR; - - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - Py_XDECREF(retval); - - ReleaseGlobalDictionary(globals); - return; - } - - retmat = (MatrixObject *)retval; - if (retmat->rowSize != 4 || retmat->colSize != 4) { - printf("Error in PyConstraint - doTarget: Matrix returned is the wrong size!\n"); - con->flag |= PYCON_SCRIPTERROR; - - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - Py_XDECREF(retval); - - ReleaseGlobalDictionary(globals); - return; - } - - /* this is the reverse of code taken from newMatrix() */ - for(row = 0; row < 4; row++) { - for(col = 0; col < 4; col++) { - ct->matrix[row][col] = retmat->contigPtr[row*4+col]; - } - } - - /* free temp objects */ - Py_XDECREF(tar); - Py_XDECREF(subtar); - Py_XDECREF(idprop); - Py_XDECREF(tarmat); - Py_XDECREF(retval); - - /* clear globals */ - ReleaseGlobalDictionary(globals); -} - -/* This draws+handles the user-defined interface for editing pyconstraints idprops */ -void BPY_pyconstraint_settings(void *arg1, void *arg2) -{ - bPythonConstraint *con= (bPythonConstraint *)arg1; - PyObject *idprop; - PyObject *globals; - PyObject *gval; - PyObject *retval; - - if (!con->text) return; - if (con->flag & PYCON_SCRIPTERROR) return; - - globals = CreateGlobalDictionary(); - - idprop = BPy_Wrap_IDProperty( NULL, con->prop, NULL); - - retval = RunPython(con->text, globals); - - if (retval == NULL) { - BPY_Err_Handle(con->text->id.name); - ReleaseGlobalDictionary(globals); - con->flag |= PYCON_SCRIPTERROR; - - /* free temp objects */ - Py_XDECREF(idprop); - return; - } - - if (retval) {Py_XDECREF( retval );} - retval = NULL; - - gval = PyDict_GetItemString(globals, "getSettings"); - if (!gval) { - printf("ERROR: no getSettings function in constraint!\n"); - - /* free temp objects */ - ReleaseGlobalDictionary( globals ); - Py_XDECREF(idprop); - return; - } - - /* Now for the fun part! Try and find the functions we need. */ - if (PyFunction_Check(gval)) { - retval = PyObject_CallFunction(gval, "O", idprop); - } - else { - printf("ERROR: getSettings is supposed to be a function!\n"); - ReleaseGlobalDictionary( globals ); - - Py_XDECREF(idprop); - return; - } - - if (!retval) { - BPY_Err_Handle(con->text->id.name); - con->flag |= PYCON_SCRIPTERROR; - - /* free temp objects */ - ReleaseGlobalDictionary(globals); - Py_XDECREF(idprop); - return; - } - else { - /* clear globals */ - ReleaseGlobalDictionary(globals); - - /* free temp objects */ - Py_XDECREF(idprop); - Py_DECREF(retval); - return; - } -} - -/* Update function, it gets rid of pydrivers global dictionary, forcing - * BPY_pydriver_eval to recreate it. This function is used to force - * reloading the Blender text module "pydrivers.py", if available, so - * updates in it reach pydriver evaluation. */ -void BPY_pydriver_update(void) -{ - if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */ - PyDict_Clear(bpy_pydriver_Dict); - Py_DECREF(bpy_pydriver_Dict); - bpy_pydriver_Dict = NULL; - } - - return; -} - -/* for depsgraph.c, runs py expr once to collect all refs. made - * to objects (self refs. to the object that owns the py driver - * are not allowed). */ -struct Object **BPY_pydriver_get_objects(IpoDriver *driver) -{ - /*if (!driver || !driver->ob || driver->name[0] == '\0') - return NULL;*/ - - /*PyErr_Clear();*/ - - /* clear the flag that marks invalid python expressions */ - driver->flag &= ~IPO_DRIVER_FLAG_INVALID; - - /* tell we're running a pydriver, so Get() functions know they need - * to add the requested obj to our list */ - bpy_pydriver_running(1); - - /* append driver owner object as the 1st ob in the list; - * we put it there to make sure it is not itself referenced in - * its pydriver expression */ - bpy_pydriver_appendToList(driver->ob); - - /* this will append any other ob referenced in expr (driver->name) - * or set the driver's error flag if driver's py expression fails */ - BPY_pydriver_eval(driver); - - bpy_pydriver_running(0); /* ok, we're done */ - - return bpy_pydriver_obArrayFromList(); /* NULL if eval failed */ -} - -/* This evals py driver expressions, 'expr' is a Python expression that - * should evaluate to a float number, which is returned. */ -float BPY_pydriver_eval(IpoDriver *driver) -{ - char *expr = NULL; - PyObject *retval, *bpy_ob = NULL; - float result = 0.0f; /* default return */ - int setitem_retval; - - if (!driver) return result; - - expr = driver->name; /* the py expression to be evaluated */ - if (!expr || expr[0]=='\0') return result; - - if (!bpy_pydriver_Dict) { - if (bpy_pydriver_create_dict() != 0) { - fprintf(stderr, "Pydriver error: couldn't create Python dictionary"); - return result; - } - } - - if (driver->ob) - bpy_ob = Object_CreatePyObject(driver->ob); - - if (!bpy_ob) { - Py_INCREF(Py_None); - bpy_ob = Py_None; - } - - setitem_retval = EXPP_dict_set_item_str(bpy_pydriver_Dict, "self", bpy_ob); - - if( !setup_armature_weakrefs()){ - fprintf( stderr, "Oops - weakref dict setup\n"); - return result; - } - - retval = PyRun_String(expr, Py_eval_input, bpy_pydriver_Dict, - bpy_pydriver_Dict); - - if (retval == NULL) { - return pydriver_error(driver); - } - - result = ( float )PyFloat_AsDouble( retval ); - - if (result == -1 && PyErr_Occurred()) - return pydriver_error(driver); - - /* remove 'self', since this dict is also used by py buttons */ - if (setitem_retval == 0) PyDict_DelItemString(bpy_pydriver_Dict, "self"); - - /* all fine, make sure the "invalid expression" flag is cleared */ - driver->flag &= ~IPO_DRIVER_FLAG_INVALID; - - return result; -} - -/* Button Python Evaluation */ - -/* Python evaluation for gui buttons: - * users can write any valid Python expression (that evals to an int or float) - * inside Blender's gui number buttons and have them evaluated to their - * actual int or float value. - * - * The global dict used for pydrivers is also used here, so all imported - * modules for pydrivers (including the pydrivers.py Blender text) are - * available for button py eval, too. */ - -static int bpy_button_eval_error(char *expr) { - - if (bpy_pydriver_oblist) - bpy_pydriver_freeList(); - - if (bpy_pydriver_Dict) { /* free the persistent global dict */ - /* it's the same dict used by pydrivers */ - PyDict_Clear(bpy_pydriver_Dict); - Py_DECREF(bpy_pydriver_Dict); - bpy_pydriver_Dict = NULL; - } - - fprintf(stderr, "\nError in button evaluation:\nThis is the failed Python expression:\n'%s'\n\n", expr); - - PyErr_Print(); - - return -1; -} - -int BPY_button_eval(char *expr, double *value) -{ - PyObject *retval, *floatval; - - if (!value || !expr || expr[0]=='\0') return -1; - - *value = 0.0; /* default value */ - - if (!bpy_pydriver_Dict) { - if (bpy_pydriver_create_dict() != 0) { - fprintf(stderr, - "Button Python Eval error: couldn't create Python dictionary"); - return -1; - } - } - - - if( !setup_armature_weakrefs()){ - fprintf(stderr, "Oops - weakref dict\n"); - return -1; - } - - retval = PyRun_String(expr, Py_eval_input, bpy_pydriver_Dict, - bpy_pydriver_Dict); - - if (retval == NULL) { - return bpy_button_eval_error(expr); - } - else { - floatval = PyNumber_Float(retval); - Py_DECREF(retval); - } - - if (floatval == NULL) - return bpy_button_eval_error(expr); - else { - *value = (float)PyFloat_AsDouble(floatval); - Py_DECREF(floatval); - } - - return 0; /* successful exit */ -} - - -/*****************************************************************************/ -/* ScriptLinks */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* Description: */ -/* Notes: Not implemented yet */ -/*****************************************************************************/ -void BPY_clear_bad_scriptlinks( struct Text *byebye ) -{ -/* - BPY_clear_bad_scriptlist(getObjectList(), byebye); - BPY_clear_bad_scriptlist(getLampList(), byebye); - BPY_clear_bad_scriptlist(getCameraList(), byebye); - BPY_clear_bad_scriptlist(getMaterialList(), byebye); - BPY_clear_bad_scriptlist(getWorldList(), byebye); - BPY_clear_bad_scriptlink(&scene_getCurrent()->id, byebye); - - allqueue(REDRAWBUTSSCRIPT, 0); -*/ - return; -} - -/***************************************************************************** -* Description: Loop through all scripts of a list of object types, and -* execute these scripts. -* For the scene, only the current active scene the scripts are -* executed (if any). -*****************************************************************************/ -void BPY_do_all_scripts( short event ) -{ - DoAllScriptsFromList( &( G.main->object ), event ); - DoAllScriptsFromList( &( G.main->lamp ), event ); - DoAllScriptsFromList( &( G.main->camera ), event ); - DoAllScriptsFromList( &( G.main->mat ), event ); - DoAllScriptsFromList( &( G.main->world ), event ); - - BPY_do_pyscript( &( G.scene->id ), event ); - - return; -} - -/***************************************************************************** -* Description: Execute a Python script when an event occurs. The following -* events are possible: frame changed, load script and redraw. -* Only events happening to one of the following object types -* are handled: Object, Lamp, Camera, Material, World and -* Scene. -*****************************************************************************/ - -static ScriptLink *ID_getScriptlink( ID * id ) -{ - switch ( MAKE_ID2( id->name[0], id->name[1] ) ) { - case ID_OB: - return &( ( Object * ) id )->scriptlink; - case ID_LA: - return &( ( Lamp * ) id )->scriptlink; - case ID_CA: - return &( ( Camera * ) id )->scriptlink; - case ID_MA: - return &( ( Material * ) id )->scriptlink; - case ID_WO: - return &( ( World * ) id )->scriptlink; - case ID_SCE: - return &( ( Scene * ) id )->scriptlink; - default: - return NULL; - } -} - -int BPY_has_onload_script( void ) -{ - ScriptLink *slink = &G.scene->scriptlink; - int i; - - if( !slink || !slink->totscript ) - return 0; - - for( i = 0; i < slink->totscript; i++ ) { - if( ( slink->flag[i] == SCRIPT_ONLOAD ) - && ( slink->scripts[i] != NULL ) ) - return 1; - } - - return 0; -} - -void BPY_do_pyscript( ID * id, short event ) -{ - ScriptLink *scriptlink; - - if( !id ) return; - - scriptlink = ID_getScriptlink( id ); - - if( scriptlink && scriptlink->totscript ) { - PyObject *value; - PyObject *dict; - PyObject *ret; - int index, during_slink = during_scriptlink( ); - - /* invalid scriptlinks (new .blend was just loaded), return */ - if( during_slink < 0 ) - return; - - if( !setup_armature_weakrefs()){ - printf("Oops - weakref dict, this is a bug\n"); - return; - } - - value = GetPyObjectFromID( id ); - if( !value){ - printf("Oops - could not get a valid python object for Blender.link, this is a bug\n"); - return; - } - - /* tell we're running a scriptlink. The sum also tells if this script - * is running nested inside another. Blender.Load needs this info to - * avoid trouble with invalid slink pointers. */ - during_slink++; - disable_where_scriptlink( (short)during_slink ); - - /* set globals in Blender module to identify scriptlink */ - 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++ ) { - if( ( scriptlink->flag[index] == event ) && - ( scriptlink->scripts[index] != NULL ) ) { - dict = CreateGlobalDictionary( ); - ret = RunPython( ( Text * ) scriptlink-> - scripts[index], dict ); - ReleaseGlobalDictionary( dict ); - - if( !ret ) { - /* Failed execution of the script */ - BPY_Err_Handle( scriptlink-> - scripts[index]->name + - 2 ); - //BPY_end_python (); - //BPY_start_python (); - } else { - Py_DECREF( ret ); - } - /* If a scriptlink has just loaded a new .blend file, the - * scriptlink pointer became invalid (see api2_2x/Blender.c), - * so we stop here. */ - if( during_scriptlink( ) == -1 ) { - during_slink = 1; - break; - } - } - } - - disable_where_scriptlink( (short)(during_slink - 1) ); - - /* cleanup bylink flag and clear link so PyObject - * can be released - */ - PyDict_SetItemString(g_blenderdict, "bylink", Py_False); - PyDict_SetItemString( g_blenderdict, "link", Py_None ); - EXPP_dict_set_item_str( g_blenderdict, "event", PyString_FromString( "" ) ); - } -} - - -/* SPACE HANDLERS */ - -/* These are special script links that can be assigned to ScrArea's to - * (EVENT type) receive events sent to a given space (and use or ignore them) or - * (DRAW type) be called after the space is drawn, to draw anything on top of - * the space area. */ - -/* How to add space handlers to other spaces: - * - add the space event defines to DNA_scriptlink_types.h, as done for - * 3d view: SPACEHANDLER_VIEW3D_EVENT, for example; - * - add the new defines to Blender.SpaceHandler dictionary in Blender.c; - * - check space.c for how to call the event handlers; - * - check drawview.c for how to call the draw handlers; - * - check header_view3d.c for how to add the "Space Handler Scripts" menu. - * Note: DRAW handlers should be called with 'event = 0', chech drawview.c */ - -int BPY_has_spacehandler(Text *text, ScrArea *sa) -{ - ScriptLink *slink; - int index; - - if (!sa || !text) return 0; - - slink = &sa->scriptlink; - - for (index = 0; index < slink->totscript; index++) { - if (slink->scripts[index] && (slink->scripts[index] == (ID *)text)) - return 1; - } - - return 0; -} - -int BPY_is_spacehandler(Text *text, char spacetype) -{ - TextLine *tline = text->lines.first; - unsigned short type = 0; - - if (tline && (tline->len > 10)) { - char *line = tline->line; - - /* Expected format: # SPACEHANDLER.SPACE.TYPE - * Ex: # SPACEHANDLER.VIEW3D.DRAW - * The actual checks are forgiving, so slight variations also work. */ - if (line && line[0] == '#' && strstr(line, "HANDLER")) { - line++; /* skip '#' */ - - /* only done for 3D View right now, trivial to add for others: */ - switch (spacetype) { - case SPACE_VIEW3D: - if (strstr(line, "3D")) { /* VIEW3D, 3DVIEW */ - if (strstr(line, "DRAW")) type = SPACEHANDLER_VIEW3D_DRAW; - else if (strstr(line, "EVENT")) type = SPACEHANDLER_VIEW3D_EVENT; - } - break; - } - } - } - return type; /* 0 if not a space handler */ -} - -int BPY_del_spacehandler(Text *text, ScrArea *sa) -{ - ScriptLink *slink; - int i, j; - - if (!sa || !text) return -1; - - slink = &sa->scriptlink; - if (slink->totscript < 1) return -1; - - for (i = 0; i < slink->totscript; i++) { - if (text == (Text *)slink->scripts[i]) { - - for (j = i; j < slink->totscript - 1; j++) { - slink->flag[j] = slink->flag[j+1]; - slink->scripts[j] = slink->scripts[j+1]; - } - slink->totscript--; - /* like done in buttons_script.c we just free memory - * if all slinks have been removed -- less fragmentation, - * these should be quite small arrays */ - if (slink->totscript == 0) { - if (slink->scripts) MEM_freeN(slink->scripts); - if (slink->flag) MEM_freeN(slink->flag); - break; - } - } - } - return 0; -} - -int BPY_add_spacehandler(Text *text, ScrArea *sa, char spacetype) -{ - unsigned short handlertype; - - if (!sa || !text) return -1; - - handlertype = (unsigned short)BPY_is_spacehandler(text, spacetype); - - if (handlertype) { - ScriptLink *slink = &sa->scriptlink; - void *stmp, *ftmp; - unsigned short space_event = SPACEHANDLER_VIEW3D_EVENT; - - /* extend slink */ - - stmp= slink->scripts; - slink->scripts= MEM_mallocN(sizeof(ID*)*(slink->totscript+1), - "spacehandlerscripts"); - - ftmp= slink->flag; - slink->flag= MEM_mallocN(sizeof(short*)*(slink->totscript+1), - "spacehandlerflags"); - - if (slink->totscript) { - memcpy(slink->scripts, stmp, sizeof(ID*)*(slink->totscript)); - MEM_freeN(stmp); - - memcpy(slink->flag, ftmp, sizeof(short)*(slink->totscript)); - MEM_freeN(ftmp); - } - - switch (spacetype) { - case SPACE_VIEW3D: - if (handlertype == 1) space_event = SPACEHANDLER_VIEW3D_EVENT; - else space_event = SPACEHANDLER_VIEW3D_DRAW; - break; - default: - break; - } - - slink->scripts[slink->totscript] = (ID *)text; - slink->flag[slink->totscript]= space_event; - - slink->totscript++; - slink->actscript = slink->totscript; - - } - return 0; -} - -int BPY_do_spacehandlers( ScrArea *sa, unsigned short event, - unsigned short space_event ) -{ - ScriptLink *scriptlink; - int retval = 0; - - if (!sa || !(G.f & G_DOSCRIPTLINKS)) return 0; - - scriptlink = &sa->scriptlink; - - if (scriptlink->totscript > 0) { - PyObject *dict; - PyObject *ret; - int index, during_slink = during_scriptlink(); - - /* invalid scriptlinks (new .blend was just loaded), return */ - if (during_slink < 0) return 0; - - /* tell we're running a scriptlink. The sum also tells if this script - * is running nested inside another. Blender.Load needs this info to - * avoid trouble with invalid slink pointers. - * Update (test): allow EVENT space handlers to call file/image selectors, - * still disabled for DRAW space handlers: */ - if (event == 0) { /* event = 0: DRAW space handler */ - during_slink++; - 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 */ - 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++ ) { - - /* for DRAW handlers: */ - if (event == 0) { - glPushAttrib(GL_ALL_ATTRIB_BITS); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - } - - if( ( scriptlink->flag[index] == space_event ) && - ( scriptlink->scripts[index] != NULL ) ) { - dict = CreateGlobalDictionary(); - ret = RunPython( ( Text * ) scriptlink->scripts[index], dict ); - ReleaseGlobalDictionary( dict ); - - if (!ret) { /* Failed execution of the script */ - BPY_Err_Handle( scriptlink->scripts[index]->name+2 ); - } else { - Py_DECREF(ret); - - /* an EVENT type (event != 0) script can either accept an event or - * ignore it: - * if the script sets Blender.event to None it accepted it; - * otherwise the space's event handling callback that called us - * can go on processing the event */ - if (event && (PyDict_GetItemString(g_blenderdict,"event") == Py_None)) - retval = 1; /* event was swallowed */ - } - - /* If a scriptlink has just loaded a new .blend file, the - * scriptlink pointer became invalid (see api2_2x/Blender.c), - * so we stop here. */ - if( during_scriptlink( ) == -1 ) { - during_slink = 1; - if (event == 0) glPopAttrib(); - break; - } - } - - /* for DRAW handlers: */ - if (event == 0) { - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glPopAttrib(); - disable_where_scriptlink( (short)(during_slink - 1) ); - } - - } - - PyDict_SetItemString(g_blenderdict, "bylink", Py_False); - PyDict_SetItemString(g_blenderdict, "link", Py_None ); - EXPP_dict_set_item_str(g_blenderdict, "event", PyString_FromString("")); - } - - /* retval: - * space_event is of type EVENT: - * 0 - event was returned, - * 1 - event was processed; - * space_event is of type DRAW: - * 0 always */ - - return retval; -} - -/***************************************************************************** -* Description: -* Notes: -*****************************************************************************/ -void BPY_free_scriptlink( struct ScriptLink *slink ) -{ - if( slink->totscript ) { - if( slink->flag ) { - MEM_freeN( slink->flag ); - slink->flag= NULL; - } - if( slink->scripts ) { - MEM_freeN( slink->scripts ); - slink->scripts= NULL; - } - } - - return; -} - -static int CheckAllSpaceHandlers(Text *text) -{ - bScreen *screen; - ScrArea *sa; - ScriptLink *slink; - int fixed = 0; - - for (screen = G.main->screen.first; screen; screen = screen->id.next) { - for (sa = screen->areabase.first; sa; sa = sa->next) { - slink = &sa->scriptlink; - if (!slink->totscript) continue; - if (BPY_del_spacehandler(text, sa) == 0) fixed++; - } - } - return fixed; -} - -static int CheckAllScriptsFromList( ListBase * list, Text * text ) -{ - ID *id; - ScriptLink *scriptlink; - int index; - int fixed = 0; - - id = list->first; - - while( id != NULL ) { - scriptlink = ID_getScriptlink( id ); - if( scriptlink && scriptlink->totscript ) { - for( index = 0; index < scriptlink->totscript; index++) { - if ((Text *)scriptlink->scripts[index] == text) { - scriptlink->scripts[index] = NULL; - fixed++; - } - } - } - id = id->next; - } - - return fixed; -} - -/* When a Text is deleted, we need to unlink it from eventual scriptlinks */ -int BPY_check_all_scriptlinks( Text * text ) -{ - int fixed = 0; - fixed += CheckAllScriptsFromList( &( G.main->object ), text ); - fixed += CheckAllScriptsFromList( &( G.main->lamp ), text ); - fixed += CheckAllScriptsFromList( &( G.main->camera ), text ); - fixed += CheckAllScriptsFromList( &( G.main->mat ), text ); - fixed += CheckAllScriptsFromList( &( G.main->world ), text ); - fixed += CheckAllScriptsFromList( &( G.main->scene ), text ); - fixed += CheckAllSpaceHandlers(text); - - return fixed; -} - -/***************************************************************************** -* Description: -* Notes: -*****************************************************************************/ -void BPY_copy_scriptlink( struct ScriptLink *scriptlink ) -{ - void *tmp; - - if( scriptlink->totscript ) { - - tmp = scriptlink->scripts; - scriptlink->scripts = - MEM_mallocN( sizeof( ID * ) * scriptlink->totscript, - "scriptlistL" ); - memcpy( scriptlink->scripts, tmp, - sizeof( ID * ) * scriptlink->totscript ); - - tmp = scriptlink->flag; - scriptlink->flag = - MEM_mallocN( sizeof( short ) * scriptlink->totscript, - "scriptlistF" ); - memcpy( scriptlink->flag, tmp, - sizeof( short ) * scriptlink->totscript ); - } - - return; -} - -/**************************************************************************** -* Description: -* Notes: Not implemented yet -*****************************************************************************/ -int BPY_call_importloader( char *name ) -{ /* XXX Should this function go away from Blender? */ - printf( "In BPY_call_importloader(name=%s)\n", name ); - return ( 0 ); -} - -/***************************************************************************** -* Private functions -*****************************************************************************/ - -/***************************************************************************** -* Description: This function executes the python script passed by text. -* The Python dictionary containing global variables needs to -* be passed in globaldict. -*****************************************************************************/ -PyObject *RunPython( Text * text, PyObject * globaldict ) -{ - char *buf = NULL; - -/* The script text is compiled to Python bytecode and saved at text->compiled - * to speed-up execution if the user executes the script multiple times */ - - if( !text->compiled ) { /* if it wasn't already compiled, do it now */ - buf = txt_to_buf( text ); - - text->compiled = - Py_CompileString( buf, GetName( text ), - Py_file_input ); - - MEM_freeN( buf ); - - if( PyErr_Occurred( ) ) { - BPY_free_compiled_text( text ); - return NULL; - } - - } - - return PyEval_EvalCode( text->compiled, globaldict, globaldict ); -} - -/***************************************************************************** -* Description: This function returns the value of the name field of the -* given Text struct. -*****************************************************************************/ -char *GetName( Text * text ) -{ - return ( text->id.name + 2 ); -} - -/***************************************************************************** -* Description: This function creates a new Python dictionary object. -*****************************************************************************/ -PyObject *CreateGlobalDictionary( void ) -{ - PyObject *dict = PyDict_New( ); - - PyDict_SetItemString( dict, "__builtins__", PyEval_GetBuiltins( ) ); - EXPP_dict_set_item_str( dict, "__name__", - PyString_FromString( "__main__" ) ); - - return dict; -} - -/***************************************************************************** -* Description: This function deletes a given Python dictionary object. -*****************************************************************************/ -void ReleaseGlobalDictionary( PyObject * dict ) -{ - PyDict_Clear( dict ); - Py_DECREF( dict ); /* Release dictionary. */ - - return; -} - -/*************************************************************************** -* Description: This function runs all scripts (if any) present in the -* list argument. The event by which the function has been -* called, is passed in the event argument. -*****************************************************************************/ -void DoAllScriptsFromList( ListBase * list, short event ) -{ - ID *id; - - id = list->first; - - while( id != NULL ) { - BPY_do_pyscript( id, event ); - id = id->next; - } - - return; -} - -PyObject *importText( char *name ) -{ - Text *text; - char *txtname; - char *buf = NULL; - int namelen = strlen( name ); - - txtname = malloc( namelen + 3 + 1 ); - if( !txtname ) - return NULL; - - memcpy( txtname, name, namelen ); - memcpy( &txtname[namelen], ".py", 4 ); - - text = ( Text * ) & ( G.main->text.first ); - - while( text ) { - if( !strcmp( txtname, GetName( text ) ) ) - break; - text = text->id.next; - } - - if( !text ) { - free( txtname ); - return NULL; - } - - if( !text->compiled ) { - buf = txt_to_buf( text ); - text->compiled = - Py_CompileString( buf, GetName( text ), - Py_file_input ); - MEM_freeN( buf ); - - if( PyErr_Occurred( ) ) { - PyErr_Print( ); - BPY_free_compiled_text( text ); - free( txtname ); - return NULL; - } - } - - free( txtname ); - return PyImport_ExecCodeModule( name, text->compiled ); -} - -static PyMethodDef bimport[] = { - {"blimport", blender_import, METH_VARARGS, "our own import"} -}; - -PyObject *blender_import( PyObject * self, PyObject * args ) -{ - PyObject *exception, *err, *tb; - char *name; - PyObject *globals = NULL, *locals = NULL, *fromlist = NULL; - PyObject *m; - - if( !PyArg_ParseTuple( args, "s|OOO:bimport", - &name, &globals, &locals, &fromlist ) ) - return NULL; - - m = PyImport_ImportModuleEx( name, globals, locals, fromlist ); - - if( m ) - return m; - else - PyErr_Fetch( &exception, &err, &tb ); /*restore for probable later use */ - - m = importText( name ); - if( m ) { /* found module, ignore above exception */ - PyErr_Clear( ); - Py_XDECREF( exception ); - Py_XDECREF( err ); - Py_XDECREF( tb ); - printf( "imported from text buffer...\n" ); - } else { - PyErr_Restore( exception, err, tb ); - } - return m; -} - -void init_ourImport( void ) -{ - PyObject *m, *d; - PyObject *import = PyCFunction_New( bimport, NULL ); - - m = PyImport_AddModule( "__builtin__" ); - d = PyModule_GetDict( m ); - - EXPP_dict_set_item_str( d, "__import__", import ); -} - -/* - * find in-memory module and recompile - */ - -static PyObject *reimportText( PyObject *module ) -{ - Text *text; - char *txtname; - char *name; - char *buf = NULL; - - /* get name, filename from the module itself */ - - txtname = PyModule_GetFilename( module ); - name = PyModule_GetName( module ); - if( !txtname || !name) - return NULL; - - /* look up the text object */ - text = ( Text * ) & ( G.main->text.first ); - while( text ) { - if( !strcmp( txtname, GetName( text ) ) ) - break; - text = text->id.next; - } - - /* uh-oh.... didn't find it */ - if( !text ) - return NULL; - - /* if previously compiled, free the object */ - /* (can't see how could be NULL, but check just in case) */ - if( text->compiled ){ - Py_DECREF( (PyObject *)text->compiled ); - } - - /* compile the buffer */ - buf = txt_to_buf( text ); - text->compiled = Py_CompileString( buf, GetName( text ), - Py_file_input ); - MEM_freeN( buf ); - - /* if compile failed.... return this error */ - if( PyErr_Occurred( ) ) { - PyErr_Print( ); - BPY_free_compiled_text( text ); - return NULL; - } - - /* make into a module */ - return PyImport_ExecCodeModule( name, text->compiled ); -} - -/* - * our reload() module, to handle reloading in-memory scripts - */ - -static PyObject *blender_reload( PyObject * self, PyObject * args ) -{ - PyObject *exception, *err, *tb; - PyObject *module = NULL; - PyObject *newmodule = NULL; - - /* check for a module arg */ - if( !PyArg_ParseTuple( args, "O:breload", &module ) ) - return NULL; - - /* try reimporting from file */ - newmodule = PyImport_ReloadModule( module ); - if( newmodule ) - return newmodule; - - /* no file, try importing from memory */ - PyErr_Fetch( &exception, &err, &tb ); /*restore for probable later use */ - - newmodule = reimportText( module ); - if( newmodule ) { /* found module, ignore above exception */ - PyErr_Clear( ); - Py_XDECREF( exception ); - Py_XDECREF( err ); - Py_XDECREF( tb ); - } else - PyErr_Restore( exception, err, tb ); - - return newmodule; -} - -static PyMethodDef breload[] = { - {"blreload", blender_reload, METH_VARARGS, "our own reload"} -}; - -void init_ourReload( void ) -{ - PyObject *m, *d; - PyObject *reload = PyCFunction_New( breload, NULL ); - - m = PyImport_AddModule( "__builtin__" ); - d = PyModule_GetDict( m ); - EXPP_dict_set_item_str( d, "reload", reload ); -} diff --git a/source/blender/python/BPY_menus.c b/source/blender/python/BPY_menus.c deleted file mode 100644 index 5f16aa0241b..00000000000 --- a/source/blender/python/BPY_menus.c +++ /dev/null @@ -1,1118 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Michael Reimpell - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* - *This is the main file responsible for having bpython scripts accessible - * from Blender menus. To know more, please start with its header file. - */ - -#include "BPY_menus.h" - -#include -#ifndef WIN32 - #include -#else - #include "BLI_winstuff.h" -#endif -#include "BKE_global.h" -#include "BKE_utildefines.h" -#include "BLI_blenlib.h" -#include "MEM_guardedalloc.h" -#include "DNA_userdef_types.h" /* for U.pythondir */ -#include "api2_2x/EXPP_interface.h" /* for bpy_gethome() */ - -#define BPYMENU_DATAFILE "Bpymenus" -#define MAX_DIR_DEPTH 4 /* max depth for traversing scripts dirs */ -#define MAX_DIR_NUMBER 30 /* max number of dirs in scripts dirs trees */ - -static int DEBUG; -static int Dir_Depth; -static int Dirs_Number; - -/* BPyMenuTable holds all registered pymenus, as linked lists for each menu - * where they can appear (see PYMENUHOOKS enum in BPY_menus.h). -*/ -BPyMenu *BPyMenuTable[PYMENU_TOTAL]; - -static int bpymenu_group_atoi( char *str ) -{ - if( !strcmp( str, "Export" ) ) - return PYMENU_EXPORT; - else if( !strcmp( str, "Import" ) ) - return PYMENU_IMPORT; - else if( !strcmp( str, "Help" ) ) - return PYMENU_HELP; - else if( !strcmp( str, "HelpWebsites" ) ) - return PYMENU_HELPWEBSITES; - else if( !strcmp( str, "HelpSystem" ) ) - return PYMENU_HELPSYSTEM; - else if( !strcmp( str, "Render" ) ) - return PYMENU_RENDER; - else if( !strcmp( str, "System" ) ) - return PYMENU_SYSTEM; - else if( !strcmp( str, "Object" ) ) - return PYMENU_OBJECT; - else if( !strcmp( str, "Mesh" ) ) - return PYMENU_MESH; - else if( !strncmp( str, "Theme", 5 ) ) - return PYMENU_THEMES; - else if( !strcmp( str, "Add" ) ) - return PYMENU_ADD; - else if( !strcmp( str, "Wizards" ) ) - return PYMENU_WIZARDS; - else if( !strcmp( str, "Animation" ) ) - return PYMENU_ANIMATION; - else if( !strcmp( str, "Materials" ) ) - return PYMENU_MATERIALS; - else if( !strcmp( str, "UV" ) ) - return PYMENU_UV; - else if( !strcmp( str, "Image" ) ) - return PYMENU_IMAGE; - else if( !strcmp( str, "FaceSelect" ) ) - return PYMENU_FACESELECT; - else if( !strcmp( str, "WeightPaint" ) ) - return PYMENU_WEIGHTPAINT; - else if( !strcmp( str, "VertexPaint" ) ) - return PYMENU_VERTEXPAINT; - else if( !strcmp( str, "UVCalculation" ) ) - return PYMENU_UVCALCULATION; - else if( !strcmp( str, "Armature" ) ) - return PYMENU_ARMATURE; - else if( !strcmp( str, "ScriptTemplate" ) ) - return PYMENU_SCRIPTTEMPLATE; - else if( !strcmp( str, "MeshFaceKey" ) ) - return PYMENU_MESHFACEKEY; - else if( !strcmp( str, "AddMesh" ) ) - return PYMENU_ADDMESH; - /* "Misc" or an inexistent group name: use misc */ - else - return PYMENU_MISC; -} - -char *BPyMenu_group_itoa( short menugroup ) -{ - switch ( menugroup ) { - case PYMENU_EXPORT: - return "Export"; - break; - case PYMENU_IMPORT: - return "Import"; - break; - case PYMENU_ADD: - return "Add"; - break; - case PYMENU_HELP: - return "Help"; - break; - case PYMENU_HELPWEBSITES: - return "HelpWebsites"; - break; - case PYMENU_HELPSYSTEM: - return "HelpSystem"; - break; - case PYMENU_RENDER: - return "Render"; - break; - case PYMENU_SYSTEM: - return "System"; - break; - case PYMENU_OBJECT: - return "Object"; - break; - case PYMENU_MESH: - return "Mesh"; - break; - case PYMENU_THEMES: - return "Themes"; - break; - case PYMENU_WIZARDS: - return "Wizards"; - break; - case PYMENU_ANIMATION: - return "Animation"; - break; - case PYMENU_MATERIALS: - return "Materials"; - break; - case PYMENU_UV: - return "UV"; - break; - case PYMENU_IMAGE: - return "Image"; - break; - case PYMENU_FACESELECT: - return "FaceSelect"; - break; - case PYMENU_WEIGHTPAINT: - return "WeightPaint"; - break; - case PYMENU_VERTEXPAINT: - return "VertexPaint"; - break; - case PYMENU_UVCALCULATION: - return "UVCalculation"; - break; - case PYMENU_ARMATURE: - return "Armature"; - break; - case PYMENU_SCRIPTTEMPLATE: - return "ScriptTemplate"; - break; - case PYMENU_MESHFACEKEY: - return "MeshFaceKey"; - break; - case PYMENU_ADDMESH: - return "AddMesh"; - break; - case PYMENU_MISC: - return "Misc"; - break; - } - return NULL; -} - -/* BPyMenu_CreatePupmenuStr: - * build and return a meaninful string to be used by pupmenu(). The - * string is made of a bpymenu name as title and its submenus as possible - * choices for the user. -*/ -char *BPyMenu_CreatePupmenuStr( BPyMenu * pym, short menugroup ) -{ - BPySubMenu *pysm = pym->submenus; - char str[1024], str2[100]; - int i = 0, rlen; - - if( !pym || !pysm ) - return NULL; - - str[0] = '\0'; - - PyOS_snprintf( str2, sizeof( str2 ), "%s: %s%%t", - BPyMenu_group_itoa( menugroup ), pym->name ); - strcat( str, str2 ); - - while( pysm ) { - PyOS_snprintf( str2, sizeof( str2 ), "|%s%%x%d", pysm->name, - i ); - rlen = sizeof( str ) - strlen( str ); - strncat( str, str2, rlen ); - i++; - pysm = pysm->next; - } - - return BLI_strdup( str ); -} - -static void bpymenu_RemoveAllSubEntries( BPySubMenu * smenu ) -{ - BPySubMenu *tmp; - - while( smenu ) { - tmp = smenu->next; - if( smenu->name ) - MEM_freeN( smenu->name ); - if( smenu->arg ) - MEM_freeN( smenu->arg ); - MEM_freeN( smenu ); - smenu = tmp; - } - return; -} - -void BPyMenu_RemoveAllEntries( void ) -{ - BPyMenu *tmp, *pymenu; - int i; - - for( i = 0; i < PYMENU_TOTAL; i++ ) { - pymenu = BPyMenuTable[i]; - while( pymenu ) { - tmp = pymenu->next; - if( pymenu->name ) - MEM_freeN( pymenu->name ); - if( pymenu->filename ) - MEM_freeN( pymenu->filename ); - if( pymenu->tooltip ) - MEM_freeN( pymenu->tooltip ); - if( pymenu->submenus ) - bpymenu_RemoveAllSubEntries( pymenu-> - submenus ); - MEM_freeN( pymenu ); - pymenu = tmp; - } - BPyMenuTable[i] = NULL; - } - - Dirs_Number = 0; - Dir_Depth = 0; - - return; -} - -static BPyMenu *bpymenu_FindEntry( short group, char *name ) -{ - BPyMenu *pymenu; - - if( ( group < 0 ) || ( group >= PYMENU_TOTAL ) ) - return NULL; - - pymenu = BPyMenuTable[group]; - - while( pymenu ) { - if( !strcmp( pymenu->name, name ) ) - return pymenu; - pymenu = pymenu->next; - } - - return NULL; -} - -/* BPyMenu_GetEntry: - * given a group and a position, return the entry in that position from - * that group. -*/ -BPyMenu *BPyMenu_GetEntry( short group, short pos ) -{ - BPyMenu *pym = NULL; - - if( ( group < 0 ) || ( group >= PYMENU_TOTAL ) ) - return NULL; - - pym = BPyMenuTable[group]; - - while( pos-- ) { - if( pym ) - pym = pym->next; - else - break; - } - - return pym; /* found entry or NULL */ -} - -static void bpymenu_set_tooltip( BPyMenu * pymenu, char *tip ) -{ - if( !pymenu ) - return; - - if( pymenu->tooltip ) - MEM_freeN( pymenu->tooltip ); - pymenu->tooltip = BLI_strdup( tip ); - - return; -} - -/* bpymenu_AddEntry: - * try to find an existing pymenu entry with the given type and name; - * if found, update it with new info, otherwise create a new one and fill it. - */ -static BPyMenu *bpymenu_AddEntry( short group, short version, char *name, - char *fname, int is_userdir, char *tooltip ) -{ - BPyMenu *menu, *next = NULL, **iter; - int nameclash = 0; - - if( ( group < 0 ) || ( group >= PYMENU_TOTAL ) ) - return NULL; - if( !name || !fname ) - return NULL; - - menu = bpymenu_FindEntry( group, name ); /* already exists? */ - - /* if a menu with this name already exists in the same group: - * - if one script is in the default dir and the other in U.pythondir, - * accept and let the new one override the other. - * - otherwise, report the error and return NULL. */ - if( menu ) { - if( menu->dir < is_userdir ) { /* new one is in U.pythondir */ - nameclash = 1; - if( menu->name ) - MEM_freeN( menu->name ); - if( menu->filename ) - MEM_freeN( menu->filename ); - if( menu->tooltip ) - MEM_freeN( menu->tooltip ); - if( menu->submenus ) - bpymenu_RemoveAllSubEntries( menu->submenus ); - next = menu->next; - } else { /* they are in the same dir */ - if (DEBUG) { - fprintf(stderr, "\n\ -Warning: script %s's menu name is already in use.\n\ -Edit the script and change its \n\ -Name: '%s'\n\ -field, please.\n\ -Note: if you really want to have two scripts for the same menu with\n\ -the same name, keep one in the default dir and the other in\n\ -the user defined dir (only the later will be registered).\n", fname, name); - } - return NULL; - } - } else - menu = MEM_mallocN( sizeof( BPyMenu ), "pymenu" ); - - if( !menu ) - return NULL; - - menu->name = BLI_strdup( name ); - menu->version = version; - menu->filename = BLI_strdup( fname ); - menu->tooltip = NULL; - if( tooltip ) - menu->tooltip = BLI_strdup( tooltip ); - menu->dir = is_userdir; - menu->submenus = NULL; - menu->next = next; /* non-NULL if menu already existed */ - - if( nameclash ) - return menu; /* no need to place it, it's already at the list */ - else { /* insert the new entry in its correct position at the table */ - BPyMenu *prev = NULL; - char *s = NULL; - - iter = &BPyMenuTable[group]; - while( *iter ) { - s = ( *iter )->name; - if( s ) - if( strcmp( menu->name, s ) < 0 ) - break; /* sort by names */ - prev = *iter; - iter = &( ( *iter )->next ); - } - - if( *iter ) { /* prepend */ - menu->next = *iter; - if( prev ) - prev->next = menu; - else - BPyMenuTable[group] = menu; /* is first entry */ - } else - *iter = menu; /* append */ - } - - return menu; -} - -/* bpymenu_AddSubEntry: - * add a submenu to an existing python menu. - */ -static int bpymenu_AddSubEntry( BPyMenu * mentry, char *name, char *arg ) -{ - BPySubMenu *smenu, **iter; - - smenu = MEM_mallocN( sizeof( BPySubMenu ), "pysubmenu" ); - if( !smenu ) - return -1; - - smenu->name = BLI_strdup( name ); - smenu->arg = BLI_strdup( arg ); - smenu->next = NULL; - - if( !smenu->name || !smenu->arg ) - return -1; - - iter = &( mentry->submenus ); - while( *iter ) - iter = &( ( *iter )->next ); - - *iter = smenu; - - return 0; -} - -/* bpymenu_CreateFromFile: - * parse the bpymenus data file where Python menu data is stored; - * based on this data, create and fill the pymenu structs. - */ -static int bpymenu_CreateFromFile( void ) -{ - FILE *fp; - char line[255], w1[255], w2[255], tooltip[255], *tip; - char *homedir = NULL; - int parsing, version, is_userdir; - short group; - BPyMenu *pymenu = NULL; - - /* init global bpymenu table (it is a list of pointers to struct BPyMenus - * for each available cathegory: import, export, etc.) */ - for( group = 0; group < PYMENU_TOTAL; group++ ) - BPyMenuTable[group] = NULL; - - /* let's try to open the file with bpymenu data */ - homedir = bpy_gethome(0); - if (!homedir) { - if( DEBUG ) - fprintf(stderr, - "BPyMenus error: couldn't open config file Bpymenus: no home dir.\n"); - return -1; - } - - BLI_make_file_string( "/", line, homedir, BPYMENU_DATAFILE ); - - fp = fopen( line, "rb" ); - - if( !fp ) { - if( DEBUG ) - fprintf(stderr, "BPyMenus error: couldn't open config file %s.\n", line ); - return -1; - } - - fgets( line, 255, fp ); /* header */ - - /* check if the U.pythondir we saved at the file is different from the - * current one. If so, return to force updating from dirs */ - w1[0] = '\0'; - fscanf( fp, "# User defined scripts dir: %[^\n]\n", w1 ); - if( w1 ) { - char upythondir[FILE_MAXDIR]; - - BLI_strncpy(upythondir, U.pythondir, FILE_MAXDIR); - BLI_convertstringcode(upythondir, G.sce, 0); - if( strcmp( w1, upythondir ) != 0 ) - return -1; - w1[0] = '\0'; - } - - while( fgets( line, 255, fp ) ) { /* parsing file lines */ - - switch ( line[0] ) { /* check first char */ - case '#': /* comment */ - continue; - break; - case '\n': - continue; - break; - default: - parsing = sscanf( line, "%s {\n", w1 ); /* menu group */ - break; - } - - if( parsing == 1 ) { /* got menu group string */ - group = (short)bpymenu_group_atoi( w1 ); - if( group < 0 && DEBUG ) { /* invalid type */ - fprintf(stderr, - "BPyMenus error parsing config file: wrong group: %s,\n\ -will use 'Misc'.\n", w1 ); - } - } else - continue; - - for(;;) { - tip = NULL; /* optional tooltip */ - fgets( line, 255, fp ); - if( line[0] == '}' ) - break; - else if( line[0] == '\n' ) - continue; - else if( line[0] == '\'' ) { /* menu entry */ - parsing = - sscanf( line, - "'%[^']' %d %s %d '%[^']'\n", - w1, &version, w2, &is_userdir, - tooltip ); - - if( parsing <= 0 ) { /* invalid line, get rid of it */ - fgets( line, 255, fp ); - } else if( parsing == 5 ) - tip = tooltip; /* has tooltip */ - - pymenu = bpymenu_AddEntry( group, - ( short ) version, - w1, w2, is_userdir, - tip ); - if( !pymenu ) { - puts( "BPyMenus error: couldn't create bpymenu entry.\n" ); - fclose( fp ); - return -1; - } - } else if( line[0] == '|' && line[1] == '_' ) { /* menu sub-entry */ - if( !pymenu ) - continue; /* no menu yet, skip this line */ - sscanf( line, "|_%[^:]: %s\n", w1, w2 ); - bpymenu_AddSubEntry( pymenu, w1, w2 ); - } - } - } - - fclose( fp ); - return 0; -} - -/* bpymenu_WriteDataFile: - * writes the registered scripts info to the user's home dir, for faster - * access when the scripts dir hasn't changed. -*/ -static void bpymenu_WriteDataFile( void ) -{ - BPyMenu *pymenu; - BPySubMenu *smenu; - FILE *fp; - char fname[FILE_MAXDIR], *homedir; - int i; - - homedir = bpy_gethome(0); - - if (!homedir) { - if( DEBUG ) - fprintf(stderr, - "BPyMenus error: couldn't write Bpymenus file: no home dir.\n\n"); - return; - } - - BLI_make_file_string( "/", fname, homedir, BPYMENU_DATAFILE ); - - fp = fopen( fname, "w" ); - if( !fp ) { - if( DEBUG ) - fprintf(stderr, "BPyMenus error: couldn't write %s file.\n\n", - fname ); - return; - } - - fprintf( fp, - "# Blender: registered menu entries for bpython scripts\n" ); - - if (U.pythondir[0] != '\0' && - strcmp(U.pythondir, "/") != 0 && strcmp(U.pythondir, "//") != 0) - { - char upythondir[FILE_MAXDIR]; - - BLI_strncpy(upythondir, U.pythondir, FILE_MAXDIR); - BLI_convertstringcode(upythondir, G.sce, 0); - fprintf( fp, "# User defined scripts dir: %s\n", upythondir ); - } - - for( i = 0; i < PYMENU_TOTAL; i++ ) { - pymenu = BPyMenuTable[i]; - if( !pymenu ) - continue; - fprintf( fp, "\n%s {\n", BPyMenu_group_itoa( (short)i ) ); - while( pymenu ) { - fprintf( fp, "'%s' %d %s %d", pymenu->name, - pymenu->version, pymenu->filename, - pymenu->dir ); - if( pymenu->tooltip ) - fprintf( fp, " '%s'\n", pymenu->tooltip ); - else - fprintf( fp, "\n" ); - smenu = pymenu->submenus; - while( smenu ) { - fprintf( fp, "|_%s: %s\n", smenu->name, - smenu->arg ); - smenu = smenu->next; - } - pymenu = pymenu->next; - } - fprintf( fp, "}\n" ); - } - - fclose( fp ); - return; -} - -/* BPyMenu_PrintAllEntries: - * useful for debugging. - */ -void BPyMenu_PrintAllEntries( void ) -{ - BPyMenu *pymenu; - BPySubMenu *smenu; - int i; - - printf( "# Blender: registered menu entries for bpython scripts\n" ); - - for( i = 0; i < PYMENU_TOTAL; i++ ) { - pymenu = BPyMenuTable[i]; - printf( "\n%s {\n", BPyMenu_group_itoa( (short)i ) ); - while( pymenu ) { - printf( "'%s' %d %s %d", pymenu->name, pymenu->version, - pymenu->filename, pymenu->dir ); - if( pymenu->tooltip ) - printf( " '%s'\n", pymenu->tooltip ); - else - printf( "\n" ); - smenu = pymenu->submenus; - while( smenu ) { - printf( "|_%s: %s\n", smenu->name, - smenu->arg ); - smenu = smenu->next; - } - pymenu = pymenu->next; - } - printf( "}\n" ); - } -} - -/* bpymenu_ParseFile: - * recursively scans folders looking for scripts to register. - * - * This function scans the scripts directory looking for .py files with the - * right header and menu info, using that to fill the bpymenu structs. - * is_userdir defines if the script is in the default scripts dir or the - * user defined one (U.pythondir: is_userdir == 1). - * Speed is important. - * - * The first line of the script must be '#!BPY'. - * The header registration lines must appear between the first pair of - * '\"\"\"' and follow this order (the single-quotes are part of - * the format): - * - * # \"\"\"
- * # Name: 'script name for the menu' - * # Blender: short int (minimal Blender version) - * # Group: 'group name' (defines menu) - * # Submenu: 'submenu name' related_1word_arg - * # Tooltip: 'tooltip for the menu' - * # \"\"\" - * - * Notes: - * - * - Commenting out header lines with "#" is optional, but recommended. - * - There may be more than one submenu line, or none: - * submenus and the tooltip are optional; - * - The Blender version is the same number reported by - * Blender.Get('version') in BPython or G.version in C; - * - Line length must be less than 99. - */ -static int bpymenu_ParseFile(FILE *file, char *fname, int is_userdir) -{ - char line[100]; - char head[100]; - char middle[100]; - char tail[100]; - int matches; - int parser_state; - - char script_name[100]; - int script_version = 1; - int script_group; - - BPyMenu *scriptMenu = NULL; - - if (file != NULL) { - parser_state = 1; /* state of parser, 0 to terminate */ - - while ((parser_state != 0) && (fgets(line, 100, file) != NULL)) { - - switch (parser_state) { - - case 1: /* !BPY */ - if (strncmp(line, "#!BPY", 5) == 0) { - parser_state++; - } else { - parser_state = 0; - } - break; - - case 2: /* \"\"\" */ - if ((strstr(line, "\"\"\""))) { - parser_state++; - } - break; - - case 3: /* Name: 'script name for the menu' */ - matches = sscanf(line, "%[^']'%[^']'%c", head, script_name, tail); - if ((matches == 3) && (strstr(head, "Name:") != NULL)) { - parser_state++; - } else { - if (DEBUG) - fprintf(stderr, "BPyMenus error: Wrong 'Name' line: %s\n", fname); - parser_state = 0; - } - break; - - case 4: /* Blender: */ - matches = sscanf(line, "%[^1234567890]%i%c", head, &script_version, - tail); - if (matches == 3) { - parser_state++; - } else { - if (DEBUG) - fprintf(stderr,"BPyMenus error: Wrong 'Blender' line: %s\n",fname); - parser_state = 0; - } - break; - - case 5: /* Group: 'group name' */ - matches = sscanf(line, "%[^']'%[^']'%c", head, middle, tail); - if ((matches == 3) && (strstr(head, "Group:") != NULL)) { - script_group = bpymenu_group_atoi(middle); - if (script_group < 0) { - if (DEBUG) - fprintf(stderr, "BPyMenus error: Unknown group \"%s\": %s\n", - middle, fname); - parser_state = 0; - } - - else { /* register script */ - scriptMenu = bpymenu_AddEntry((short)script_group, - (short int)script_version, script_name, fname, is_userdir,NULL); - if (scriptMenu == NULL) { - if (DEBUG) - fprintf(stderr, - "BPyMenus error: Couldn't create entry for: %s\n", fname); - parser_state = 0; - } else { - parser_state++; - } - } - - } else { - if (DEBUG) - fprintf(stderr, "BPyMenus error: Wrong 'Group' line: %s\n",fname); - parser_state = 0; - } - break; - - case 6: /* optional elements */ - /* Submenu: 'submenu name' related_1word_arg */ - matches = sscanf(line, "%[^']'%[^']'%s\n", head, middle, tail); - if ((matches == 3) && (strstr(head, "Submenu:") != NULL)) { - bpymenu_AddSubEntry(scriptMenu, middle, tail); - } else { - /* Tooltip: 'tooltip for the menu */ - matches = sscanf(line, "%[^']'%[^']'%c", head, middle, tail); - if ((matches == 3) && ((strstr(head, "Tooltip:") != NULL) || - (strstr(head, "Tip:") != NULL))) { - bpymenu_set_tooltip(scriptMenu, middle); - } - parser_state = 0; - } - break; - - default: - parser_state = 0; - break; - } - } - } - - else { /* shouldn't happen, it's checked in bpymenus_ParseDir */ - if (DEBUG) - fprintf(stderr, "BPyMenus error: Couldn't open %s.\n", fname); - return -1; - } - - return 0; -} - -/* bpymenu_ParseDir: - * recursively scans folders looking for scripts to register. - * - * This function scans the scripts directory looking for .py files with the - * right header and menu info. - * - is_userdir defines if the script is in the default scripts dir or the - * user defined one (U.pythondir: is_userdir == 1); - * - parentdir is the parent dir name to store as part of the script filename, - * if we're down a subdir. - * Speed is important. - */ -static int bpymenu_ParseDir(char *dirname, char *parentdir, int is_userdir ) -{ - DIR *dir; - FILE *file = NULL; - struct dirent *de; - struct stat status; - char *file_extension; - char path[FILE_MAX]; - char subdir[FILE_MAX]; - char *s = NULL; - - dir = opendir(dirname); - - if (dir != NULL) { - while ((de = readdir(dir)) != NULL) { - - /* skip files and dirs starting with '.' or 'bpy' */ - if ((de->d_name[0] == '.') || !strncmp(de->d_name, "bpy", 3)) { - continue; - } - - BLI_make_file_string("/", path, dirname, de->d_name); - - if (stat(path, &status) != 0) { - if (DEBUG) - fprintf(stderr, "stat %s failed: %s\n", path, strerror(errno)); - } - - if (S_ISREG(status.st_mode)) { /* is file */ - - file_extension = strstr(de->d_name, ".py"); - - if (file_extension && *(file_extension + 3) == '\0') { - file = fopen(path, "rb"); - - if (file) { - s = de->d_name; - if (parentdir) { - /* Join parentdir and de->d_name */ - BLI_join_dirfile(subdir, parentdir, de->d_name); - - s = subdir; - } - bpymenu_ParseFile(file, s, is_userdir); - fclose(file); - } - - else { - if (DEBUG) - fprintf(stderr, "BPyMenus error: Couldn't open %s.\n", path); - } - } - } - - else if (S_ISDIR(status.st_mode)) { /* is subdir */ - Dirs_Number++; - Dir_Depth++; - if (Dirs_Number > MAX_DIR_NUMBER) { - if (DEBUG) { - fprintf(stderr, "BPyMenus error: too many subdirs.\n"); - } - closedir(dir); - return -1; - } - else if (Dir_Depth > MAX_DIR_DEPTH) { - if (DEBUG) - fprintf(stderr, - "BPyMenus error: max depth reached traversing dir tree.\n"); - closedir(dir); - return -1; - } - s = de->d_name; - if (parentdir) { - /* Join parentdir and de->d_name */ - BLI_join_dirfile(subdir, parentdir, de->d_name); - s = subdir; - } - if (bpymenu_ParseDir(path, s, is_userdir) == -1) { - closedir(dir); - return -1; - } - Dir_Depth--; - } - - } - closedir(dir); - } - - else { /* open directory stream failed */ - if (DEBUG) - fprintf(stderr, "opendir %s failed: %s\n", dirname, strerror(errno)); - return -1; - } - - return 0; -} - -static int bpymenu_GetStatMTime( char *name, int is_file, time_t * mtime ) -{ - struct stat st; - int result; - - result = stat( name, &st ); - - if( result == -1 ) - return -1; - - if( is_file ) { - if( !S_ISREG( st.st_mode ) ) - return -2; - } else if( !S_ISDIR( st.st_mode ) ) - return -2; - - *mtime = st.st_mtime; - - return 0; -} - -/* BPyMenu_Init: - * import the bpython menus data to Blender, either from: - * - the BPYMENU_DATAFILE file (?/.blender/Bpymenus) or - * - the scripts dir(s), case newer than the datafile (then update the file). - * then fill the bpymenu table with this data. - * if param usedir != 0, then the data is recreated from the dir(s) anyway. -*/ -int BPyMenu_Init( int usedir ) -{ - char fname[FILE_MAXDIR]; - char dirname[FILE_MAXDIR]; - char upythondir[FILE_MAXDIR]; - char *upydir = U.pythondir, *sdir = NULL; - time_t time_dir1 = 0, time_dir2 = 0, time_file = 0; - int stat_dir1 = 0, stat_dir2 = 0, stat_file = 0; - int i; - - DEBUG = G.f & G_DEBUG; /* is Blender in debug mode (started with -d) ? */ - - /* init global bpymenu table (it is a list of pointers to struct BPyMenus - * for each available group: import, export, etc.) */ - for( i = 0; i < PYMENU_TOTAL; i++ ) - BPyMenuTable[i] = NULL; - - if( DEBUG ) - fprintf(stdout, "\nRegistering scripts in Blender menus ...\n\n" ); - - if( U.pythondir[0] == '\0') { - upydir = NULL; - } - else if (strcmp(U.pythondir, "/") == 0 || strcmp(U.pythondir, "//") == 0) { - /* these are not accepted to prevent possible slight slowdowns on startup; - * they should not be used as user defined scripts dir, anyway, also from - * speed considerations, since they'd not be dedicated scripts dirs */ - if (DEBUG) fprintf(stderr, - "BPyMenus: invalid user defined Python scripts dir: \"/\" or \"//\".\n"); - upydir = NULL; - } - else { - BLI_strncpy(upythondir, upydir, FILE_MAXDIR); - BLI_convertstringcode(upythondir, G.sce, 0); - } - - sdir = bpy_gethome(1); - - if (sdir) { - BLI_strncpy(dirname, sdir, FILE_MAXDIR); - stat_dir1 = bpymenu_GetStatMTime( dirname, 0, &time_dir1 ); - - if( stat_dir1 < 0 ) { - time_dir1 = 0; - if( DEBUG ) { - fprintf(stderr, - "\nDefault scripts dir: %s:\n%s\n", dirname, strerror(errno)); - if( upydir ) - fprintf(stdout, - "Getting scripts menu data from user defined dir: %s.\n", - upythondir ); - } - } - } - else stat_dir1 = -1; - - if( upydir ) { - stat_dir2 = bpymenu_GetStatMTime( upythondir, 0, &time_dir2 ); - - if( stat_dir2 < 0 ) { - time_dir2 = 0; - upydir = NULL; - if( DEBUG ) - fprintf(stderr, "\nUser defined scripts dir: %s:\n%s.\n", - upythondir, strerror( errno ) ); - if( stat_dir1 < 0 ) { - if( DEBUG ) - fprintf(stderr, "\ -To have scripts in menus, please add them to the default scripts dir:\n\ -%s\n\ -and / or go to 'Info window -> File Paths tab' and set a valid path for\n\ -the user defined Python scripts dir.\n", dirname ); - return -1; - } - } - } - else stat_dir2 = -1; - - if( ( stat_dir1 < 0 ) && ( stat_dir2 < 0 ) ) { - if( DEBUG ) { - fprintf(stderr, "\nCannot register scripts in menus, no scripts dir" - " available.\nExpected default dir at: %s \n", dirname ); - } - return -1; - } - - if (usedir) stat_file = -1; - else { /* if we're not forced to use the dir */ - char *homedir = bpy_gethome(0); - - if (homedir) { - BLI_make_file_string( "/", fname, homedir, BPYMENU_DATAFILE ); - stat_file = bpymenu_GetStatMTime( fname, 1, &time_file ); - if( stat_file < 0 ) - time_file = 0; - - /* comparing dates */ - - if((stat_file == 0) - && (time_file > time_dir1) && (time_file > time_dir2)) - { /* file is newer */ - stat_file = bpymenu_CreateFromFile( ); /* -1 if an error occurred */ - if( !stat_file && DEBUG ) - fprintf(stdout, - "Getting menu data for scripts from file:\n%s\n\n", fname ); - } - else stat_file = -1; - } - else stat_file = -1; /* -1 to use dirs: didn't use file or it was corrupted */ - } - - if( stat_file == -1 ) { /* use dirs */ - if( DEBUG ) { - fprintf(stdout, - "Getting menu data for scripts from dir(s):\ndefault: %s\n", dirname ); - if( upydir ) - fprintf(stdout, "user defined: %s\n", upythondir ); - fprintf(stdout, "\n"); - } - if( stat_dir1 == 0 ) { - i = bpymenu_ParseDir( dirname, NULL, 0 ); - if (i == -1 && DEBUG) - fprintf(stderr, "Default scripts dir does not seem valid.\n\n"); - } - if( stat_dir2 == 0 ) { - BLI_strncpy(dirname, U.pythondir, FILE_MAXDIR); - BLI_convertstringcode(dirname, G.sce, 0); - i = bpymenu_ParseDir( dirname, NULL, 1 ); - if (i == -1 && DEBUG) - fprintf(stderr, "User defined scripts dir does not seem valid.\n\n"); - } - - /* check if we got any data */ - for( i = 0; i < PYMENU_TOTAL; i++ ) - if( BPyMenuTable[i] ) - break; - - /* if we got, recreate the file */ - if( i < PYMENU_TOTAL ) - bpymenu_WriteDataFile( ); - else if( DEBUG ) { - fprintf(stderr, "\n\ -Warning: Registering scripts in menus -- no info found.\n\ -Either your scripts dirs have no .py scripts or the scripts\n\ -don't have a header with registration data.\n\ -Default scripts dir is:\n\ -%s\n", dirname ); - if( upydir ) - fprintf(stderr, "User defined scripts dir is: %s\n", - upythondir ); - } - } - - return 0; -} diff --git a/source/blender/python/BPY_menus.h b/source/blender/python/BPY_menus.h deleted file mode 100644 index 89491ce3ef2..00000000000 --- a/source/blender/python/BPY_menus.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Matt Ebb - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef BPY_MENUS_H -#define BPY_MENUS_H - -/* This header exposes BPyMenu related public declarations. The implementation - * adds 'dynamic' menus to Blender, letting scripts register themselves in any - * of a few pre-defined (trivial to upgrade) places in menus. These places or - * slots are called groups here (Import, Export, etc). This is how it works: - * - scripts at dirs user pref U.pythondir and .blender/scripts/ are scanned - * for registration info. - * - this data is also saved to a Bpymenus file at the user's .blender/ dir and - * only re-created when the scripts folder gets modified. - * - on start-up Blender uses this info to fill a table, which is used to - * create the menu entries when they are needed (see header_info.c or - * header_script.c, under source/blender/src/, for examples). -*/ - -/* These two structs hold py menu/submenu info. - * BPyMenu holds a script's name (as should appear in the menu) and filename, - * plus an optional list of submenus. Each submenu is related to a string - * (arg) that the script can get from the __script__ pydict, to know which - * submenu was chosen. */ - -typedef struct BPySubMenu { - char *name; - char *arg; - struct BPySubMenu *next; -} BPySubMenu; - -typedef struct BPyMenu { - char *name; - char *filename; - char *tooltip; - short version; /* Blender version */ - int dir; /* 0: default, 1: U.pythondir */ - struct BPySubMenu *submenus; - struct BPyMenu *next; -} BPyMenu; - -/* Scripts can be added to only a few pre-defined places in menus, like - * File->Import, File->Export, etc. (for speed and better control). - * To make a new menu 'slot' available for scripts: - * - add an entry to the enum below, before PYMENU_TOTAL, of course; - * - update the bpymenu_group_atoi() and BPyMenu_group_itoa() functions in - * BPY_menus.c; - * - add the necessary code to the header_***.c file in - * source/blender/src/, like done in header_info.c for import/export; -*/ -typedef enum { - PYMENU_ADD,/* creates new objects */ - PYMENU_ANIMATION, - PYMENU_EXPORT, - PYMENU_IMPORT, - PYMENU_MATERIALS, - PYMENU_MESH, - PYMENU_MISC, - PYMENU_OBJECT, - PYMENU_RENDER,/* exporters to external renderers */ - PYMENU_SYSTEM, - PYMENU_THEMES, - PYMENU_UV,/* UV editing tools, to go in UV/Image editor space, 'UV' menu */ - PYMENU_IMAGE,/* Image editing tools, to go in UV/Image editor space, 'Image' menu */ - PYMENU_WIZARDS,/* complex 'app' scripts */ - - /* entries put after Wizards don't appear at the Scripts win->Scripts menu; - * see define right below */ - - PYMENU_FACESELECT, - PYMENU_WEIGHTPAINT, - PYMENU_VERTEXPAINT, - PYMENU_UVCALCULATION, - PYMENU_ARMATURE, - PYMENU_SCRIPTTEMPLATE, - PYMENU_HELP,/*Main Help menu items - prob best to leave for 'official' ones*/ - PYMENU_HELPSYSTEM,/* Resources, troubleshooting, system tools */ - PYMENU_HELPWEBSITES,/* Help -> Websites submenu */ - PYMENU_MESHFACEKEY, /* face key in mesh editmode */ - PYMENU_ADDMESH, /* adds mesh */ - PYMENU_TOTAL -} PYMENUHOOKS; - -#define PYMENU_SCRIPTS_MENU_TOTAL (PYMENU_WIZARDS + 1) - -/* BPyMenuTable holds all registered pymenus, as linked lists for each menu - * where they can appear (see PYMENUHOOKS enum above). -*/ -extern BPyMenu *BPyMenuTable[]; /* defined in BPY_menus.c */ - -/* public functions: */ -int BPyMenu_Init( int usedir ); -void BPyMenu_RemoveAllEntries( void ); -void BPyMenu_PrintAllEntries( void ); -char *BPyMenu_CreatePupmenuStr( BPyMenu * pym, short group ); -char *BPyMenu_group_itoa( short group ); -struct BPyMenu *BPyMenu_GetEntry( short group, short pos ); - -#endif /* BPY_MENUS_H */ diff --git a/source/blender/python/CMakeLists.txt b/source/blender/python/CMakeLists.txt deleted file mode 100644 index 7df1f8a02d5..00000000000 --- a/source/blender/python/CMakeLists.txt +++ /dev/null @@ -1,57 +0,0 @@ -# $Id$ -# ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. The Blender -# Foundation also sells licenses for use in proprietary software under -# the Blender License. See http://www.blender.org/BL/ for information -# about this. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL/BL DUAL LICENSE BLOCK ***** - -FILE(GLOB SRC api2_2x/*.c) -SET(SRC ${SRC} - BPY_interface.c - BPY_menus.c -) - -SET(INC - api2_2x ../blenkernel ../blenlib ../blenloader - ../render/extern/include ../radiosity/extern/include - ../makesdna ../../../intern/guardedalloc ../../../intern/bmfont ../imbuf ../include - ${PYTHON_INC} -) - -IF(WITH_QUICKTIME) - SET(INC ${INC} ${QUICKTIME_INC}) - ADD_DEFINITIONS(-DWITH_QUICKTIME) -ENDIF(WITH_QUICKTIME) - -IF(WITH_OPENEXR) - ADD_DEFINITIONS(-DWITH_OPENEXR) -ENDIF(WITH_OPENEXR) - -IF(WITH_FFMPEG) - ADD_DEFINITIONS(-DWITH_FFMPEG) -ENDIF(WITH_FFMPEG) - -BLENDERLIB_NOLIST(blender_python "${SRC}" "${INC}") -#env.BlenderLib ( libname='blender_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype=['core','game2'], priority = [60,115] ) diff --git a/source/blender/python/Makefile b/source/blender/python/Makefile deleted file mode 100644 index 149e40092f3..00000000000 --- a/source/blender/python/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# -# $Id$ -# -# ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. The Blender -# Foundation also sells licenses for use in proprietary software under -# the Blender License. See http://www.blender.org/BL/ for information -# about this. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): none yet. -# -# ***** END GPL/BL DUAL LICENSE BLOCK ***** -# -# Bounces make to subdirectories. - -SOURCEDIR = source/blender/python -DIRS = api2_2x - -include nan_subdirs.mk diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript deleted file mode 100644 index 9cd245394b0..00000000000 --- a/source/blender/python/SConscript +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/python -Import ('env') - -sources = Split('BPY_interface.c BPY_menus.c') + env.Glob('api2_2x/*.c') - -incs = 'api2_2x ../blenkernel ../blenlib ../blenloader' -incs += ' ../render/extern/include ../radiosity/extern/include' -incs += ' ../makesdna #intern/guardedalloc #intern/bmfont ../imbuf ../include' -incs += ' ' + env['BF_PYTHON_INC'] -incs += ' ' + env['BF_OPENGL_INC'] - -defs = [] -if env['OURPLATFORM'] in ('win32-mingw') and env['BF_DEBUG']: - defs.append('Py_TRACE_REFS') - -if env['WITH_BF_QUICKTIME']==1: - incs += ' ' + env['BF_QUICKTIME_INC'] - defs.append('WITH_QUICKTIME') - -if env['WITH_BF_OPENEXR'] == 1: - defs.append('WITH_OPENEXR') - -if env['WITH_BF_FFMPEG'] == 1: - defs.append('WITH_FFMPEG') - -env.BlenderLib ( libname='blender_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype=['core','game2'], priority = [60,115] ) diff --git a/source/blender/python/api2_2x/Armature.c b/source/blender/python/api2_2x/Armature.c deleted file mode 100644 index f1fb3812625..00000000000 --- a/source/blender/python/api2_2x/Armature.c +++ /dev/null @@ -1,1490 +0,0 @@ -/* - * $Id: Armature.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 - * 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. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include - -#include "Armature.h" //This must come first - -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_armature.h" -#include "BKE_library.h" -#include "BKE_depsgraph.h" -#include "BKE_utildefines.h" -#include "BLI_blenlib.h" -#include "BLI_arithb.h" -#include "MEM_guardedalloc.h" -#include "Bone.h" -#include "NLA.h" -#include "gen_utils.h" -#include "gen_library.h" - -#include "DNA_object_types.h" //This must come before BIF_editarmature.h... -#include "BIF_editarmature.h" - -//------------------EXTERNAL PROTOTYPES-------------------- -extern void make_boneList(ListBase* list, ListBase *bones, EditBone *parent); -extern void editbones_to_armature (ListBase *list, Object *ob); - -//------------------------ERROR CODES--------------------------------- -//This is here just to make me happy and to have more consistant error strings :) -static const char sBoneDictError[] = "ArmatureType.bones - Error: "; -static const char sBoneDictBadArgs[] = "ArmatureType.bones - Bad Arguments: "; -static const char sArmatureError[] = "ArmatureType - Error: "; -static const char sArmatureBadArgs[] = "ArmatureType - Bad Arguments: "; -static const char sModuleError[] = "Blender.Armature - Error: "; -static const char sModuleBadArgs[] = "Blender.Armature - Bad Arguments: "; - -PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref); -/* python callable */ -PyObject * arm_weakref_callback_weakref_dealloc__pyfunc; - -//################## BonesDict_Type (internal) ######################## -/*This is an internal psuedo-dictionary type that allows for manipulation -* of bones inside of an armature. It is a subobject of armature. -* i.e. Armature.bones['key']*/ -//##################################################################### - -//------------------METHOD IMPLEMENTATIONS----------------------------- -//------------------------Armature.bones.items() -//Returns a list of key:value pairs like dict.items() -static PyObject* BonesDict_items(BPy_BonesDict *self) -{ - if (self->editmode_flag){ - return PyDict_Items(self->editbonesMap); - }else{ - return PyDict_Items(self->bonesMap); - } -} -//------------------------Armature.bones.keys() -//Returns a list of keys like dict.keys() -static PyObject* BonesDict_keys(BPy_BonesDict *self) -{ - if (self->editmode_flag){ - return PyDict_Keys(self->editbonesMap); - }else{ - return PyDict_Keys(self->bonesMap); - } -} -//------------------------Armature.bones.values() -//Returns a list of values like dict.values() -static PyObject* BonesDict_values(BPy_BonesDict *self) -{ - if (self->editmode_flag){ - return PyDict_Values(self->editbonesMap); - }else{ - return PyDict_Values(self->bonesMap); - } -} -//------------------ATTRIBUTE IMPLEMENTATION--------------------------- -//------------------TYPE_OBECT IMPLEMENTATION----------------------- -//------------------------tp_doc -//The __doc__ string for this object -static char BPy_BonesDict_doc[] = "This is an internal subobject of armature\ -designed to act as a Py_Bone dictionary."; - -//------------------------tp_methods -//This contains a list of all methods the object contains -static PyMethodDef BPy_BonesDict_methods[] = { - {"items", (PyCFunction) BonesDict_items, METH_NOARGS, - "() - Returns the key:value pairs from the dictionary"}, - {"keys", (PyCFunction) BonesDict_keys, METH_NOARGS, - "() - Returns the keys the dictionary"}, - {"values", (PyCFunction) BonesDict_values, METH_NOARGS, - "() - Returns the values from the dictionary"}, - {NULL, NULL, 0, NULL} -}; -//-----------------(internal) -static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){ - Bone *bone = NULL; - PyObject *py_bone = NULL; - - for (bone = bones->first; bone; bone = bone->next){ - py_bone = PyBone_FromBone(bone); - if (!py_bone) - return -1; - - if(PyDict_SetItemString(dictionary, bone->name, py_bone) == -1) { - /* unlikely but possible */ - Py_DECREF(py_bone); - return -1; - } - - Py_DECREF(py_bone); - if (bone->childbase.first) - BoneMapping_Init(dictionary, &bone->childbase); - } - return 0; -} -//-----------------(internal) -static int EditBoneMapping_Init(PyObject *dictionary, ListBase *editbones){ - EditBone *editbone = NULL; - PyObject *py_editbone = NULL; - - for (editbone = editbones->first; editbone; editbone = editbone->next){ - py_editbone = PyEditBone_FromEditBone(editbone); - if (!py_editbone) - return -1; - - if(PyDict_SetItemString(dictionary, editbone->name, py_editbone) == -1) { - Py_DECREF(py_editbone); - return -1; - } - Py_DECREF(py_editbone); - } - return 0; -} -//----------------- BonesDict_InitBones -static int BonesDict_InitBones(BPy_BonesDict *self) -{ - PyDict_Clear(self->bonesMap); - if (BoneMapping_Init(self->bonesMap, self->bones) == -1) - return 0; - return 1; -} -//----------------- BonesDict_InitEditBones -static int BonesDict_InitEditBones(BPy_BonesDict *self) -{ - PyDict_Clear(self->editbonesMap); - if (EditBoneMapping_Init(self->editbonesMap, &self->editbones) == -1) - return 0; - return 1; -} -//------------------------tp_repr -//This is the string representation of the object -static PyObject *BonesDict_repr(BPy_BonesDict *self) -{ - char str[2048]; - PyObject *key, *value; - int pos = 0; - char *p = str; - char *keys, *vals; - - p += sprintf(str, "[Bone Dict: {"); - - if (self->editmode_flag){ - while (PyDict_Next(self->editbonesMap, &pos, &key, &value)) { - keys = PyString_AsString(key); - vals = PyString_AsString(value->ob_type->tp_repr(value)); - if( strlen(str) + strlen(keys) + strlen(vals) < sizeof(str)-20 ) - p += sprintf(p, "%s : %s, ", keys, vals ); - else { - p += sprintf(p, "...." ); - break; - } - } - }else{ - while (PyDict_Next(self->bonesMap, &pos, &key, &value)) { - keys = PyString_AsString(key); - vals = PyString_AsString(value->ob_type->tp_repr(value)); - if( strlen(str) + strlen(keys) + strlen(vals) < sizeof(str)-20 ) - p += sprintf(p, "%s : %s, ", keys, vals ); - else { - p += sprintf(p, "...." ); - break; - } - } - } - sprintf(p, "}]"); - return PyString_FromString(str); -} - -//------------------------tp_dealloc -//This tells how to 'tear-down' our object when ref count hits 0 -static void BonesDict_dealloc(BPy_BonesDict * self) -{ - Py_DECREF(self->bonesMap); - Py_DECREF(self->editbonesMap); - BLI_freelistN(&self->editbones); - PyObject_DEL( self ); - return; -} -//------------------------mp_length -//This gets the size of the dictionary -static int BonesDict_len(BPy_BonesDict *self) -{ - if (self->editmode_flag){ - return BLI_countlist(&self->editbones); - }else{ - return BLI_countlist(self->bones); - } -} -//-----------------------mp_subscript -//This defines getting a bone from the dictionary - x = Bones['key'] -static PyObject *BonesDict_GetItem(BPy_BonesDict *self, PyObject* key) -{ - PyObject *value = NULL; - - if (self->editmode_flag){ - value = PyDict_GetItem(self->editbonesMap, key); - }else{ - value = PyDict_GetItem(self->bonesMap, key); - } - if(value == NULL){ /* item not found in dict. throw exception */ - char* key_str = PyString_AsString( key ); - if (key_str) { - return EXPP_ReturnPyObjError(PyExc_KeyError, "bone key must be a string" ); - } else { - char buffer[128]; - PyOS_snprintf( buffer, sizeof(buffer), "bone %s not found", key_str); - return EXPP_ReturnPyObjError(PyExc_KeyError, buffer ); - } - } - return EXPP_incr_ret(value); -} -//-----------------------mp_ass_subscript -//This does dict assignment - Bones['key'] = value -static int BonesDict_SetItem(BPy_BonesDict *self, PyObject *key, PyObject *value) -{ - BPy_EditBone *editbone_for_deletion; - struct EditBone *editbone = NULL; - char *key_str = PyString_AsString(key); - - if (!self->editmode_flag) - return EXPP_intError(PyExc_AttributeError, "%s%s", - sBoneDictBadArgs, "You must call makeEditable() first"); - - if (!key_str) - return EXPP_intError(PyExc_AttributeError, "%s%s", - sBoneDictBadArgs, "The key must be the name of an editbone"); - - if (value && !EditBoneObject_Check(value)) - return EXPP_intError(PyExc_AttributeError, "%s%s", - sBoneDictBadArgs, "Can only assign editbones as values"); - - //parse value for assignment - if (value){ /* we know this must be an editbone from the above check */ - //create a new editbone - editbone = MEM_callocN(sizeof(EditBone), "eBone"); - BLI_strncpy(editbone->name, key_str, 32); - unique_editbone_name(NULL, editbone->name); - editbone->dist = ((BPy_EditBone*)value)->dist; - editbone->ease1 = ((BPy_EditBone*)value)->ease1; - editbone->ease2 = ((BPy_EditBone*)value)->ease2; - editbone->flag = ((BPy_EditBone*)value)->flag; - editbone->parent = ((BPy_EditBone*)value)->parent; - editbone->rad_head = ((BPy_EditBone*)value)->rad_head; - editbone->rad_tail = ((BPy_EditBone*)value)->rad_tail; - editbone->roll = ((BPy_EditBone*)value)->roll; - editbone->segments = ((BPy_EditBone*)value)->segments; - editbone->weight = ((BPy_EditBone*)value)->weight; - editbone->xwidth = ((BPy_EditBone*)value)->xwidth; - editbone->zwidth = ((BPy_EditBone*)value)->zwidth; - VECCOPY(editbone->head, ((BPy_EditBone*)value)->head); - VECCOPY(editbone->tail, ((BPy_EditBone*)value)->tail); - editbone->layer= ((BPy_EditBone*)value)->layer; - - //set object pointer - ((BPy_EditBone*)value)->editbone = editbone; - - //fix the bone's head position if flags indicate that it is 'connected' - if (editbone->flag & BONE_CONNECTED){ - if(!editbone->parent){ - ((BPy_EditBone*)value)->editbone = NULL; - MEM_freeN(editbone); - return EXPP_intError(PyExc_AttributeError, "%s%s", - sBoneDictBadArgs, "The 'connected' flag is set but the bone has no parent!"); - }else{ - VECCOPY(editbone->head, editbone->parent->tail); - } - } - - //set in editbonelist - BLI_addtail(&self->editbones, editbone); - - //set the new editbone in the mapping - if(PyDict_SetItemString(self->editbonesMap, key_str, value) == -1){ - ((BPy_EditBone*)value)->editbone = NULL; - BLI_freelinkN(&self->editbones, editbone); - return EXPP_intError(PyExc_RuntimeError, "%s%s", - sBoneDictError, "Unable to access dictionary!"); - } - }else { - //they are trying to delete the bone using 'del' - editbone_for_deletion = (BPy_EditBone*)PyDict_GetItem(self->editbonesMap, key); - - if (!editbone_for_deletion) - return EXPP_intError(PyExc_KeyError, "%s%s%s%s", - sBoneDictError, "The key: ", key_str, " is not present in this dictionary!"); - - /*first kill the datastruct then remove the item from the dict - and wait for GC to pick it up. - We have to delete the datastruct here because the tp_dealloc - doesn't handle it*/ - - /*this is ugly but you have to set the parent to NULL for else - editbones_to_armature will crash looking for this bone*/ - for (editbone = self->editbones.first; editbone; editbone = editbone->next){ - if (editbone->parent == editbone_for_deletion->editbone) { - editbone->parent = NULL; - /* remove the connected flag or else the 'root' ball - * doesn't get drawn */ - editbone->flag &= ~BONE_CONNECTED; - } - } - BLI_freelinkN(&self->editbones, editbone_for_deletion->editbone); - if(PyDict_DelItem(self->editbonesMap, key) == -1) - return EXPP_intError(PyExc_RuntimeError, "%s%s", - sBoneDictError, "Unable to access dictionary!"); - } - return 0; -} -//------------------TYPE_OBJECT DEFINITION-------------------------- -//Mapping Protocol -static PyMappingMethods BonesDict_MapMethods = { - (inquiry) BonesDict_len, //mp_length - (binaryfunc)BonesDict_GetItem, //mp_subscript - (objobjargproc)BonesDict_SetItem, //mp_ass_subscript -}; -//BonesDict TypeObject -PyTypeObject BonesDict_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "BonesDict", //tp_name - sizeof(BPy_BonesDict), //tp_basicsize - 0, //tp_itemsize - (destructor)BonesDict_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - 0, //tp_compare - (reprfunc) BonesDict_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - &BonesDict_MapMethods, //tp_as_mapping - 0, //tp_hash - 0, //tp_call - 0, //tp_str - 0, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT, //tp_flags - BPy_BonesDict_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - 0, //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_BonesDict_methods, //tp_methods - 0, //tp_members - 0, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - 0, //tp_init - 0, //tp_alloc - 0, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; -//-----------------------PyBonesDict_FromPyArmature -static PyObject *PyBonesDict_FromPyArmature(BPy_Armature *py_armature) -{ - BPy_BonesDict *py_BonesDict = (BPy_BonesDict *)PyObject_NEW( BPy_BonesDict, &BonesDict_Type ); - if (!py_BonesDict) - goto RuntimeError; - - py_BonesDict->bones = NULL; - py_BonesDict->editbones.first = py_BonesDict->editbones.last = NULL; - - //create internal dictionaries - py_BonesDict->bonesMap = PyDict_New(); - py_BonesDict->editbonesMap = PyDict_New(); - if (!py_BonesDict->bonesMap || !py_BonesDict->editbonesMap) - goto RuntimeError; - - //set listbase pointer - py_BonesDict->bones = &py_armature->armature->bonebase; - - //now that everything is setup - init the mappings - if (!BonesDict_InitBones(py_BonesDict)) - goto RuntimeError; - if (!BonesDict_InitEditBones(py_BonesDict)) - goto RuntimeError; - - //set editmode flag - py_BonesDict->editmode_flag = 0; - - return (PyObject*)py_BonesDict; - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s", - sBoneDictError, "Failed to create class"); -} - -//######################### Armature_Type ############################# -/*This type represents a thin wrapper around bArmature data types -* internal to blender. It contains the psuedo-dictionary BonesDict -* as an assistant in manipulating it's own bone collection*/ -//################################################################# - -//------------------METHOD IMPLEMENTATION------------------------------ -//------------------------Armature.makeEditable() -static PyObject *Armature_makeEditable(BPy_Armature *self) -{ - if (self->armature->flag & ARM_EDITMODE) - goto AttributeError; - - make_boneList(&self->Bones->editbones, self->Bones->bones, NULL); - if (!BonesDict_InitEditBones(self->Bones)) - return NULL; - self->Bones->editmode_flag = 1; - return EXPP_incr_ret(Py_None); - -AttributeError: - return EXPP_objError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "The armature cannot be placed manually in editmode before you call makeEditable()!"); -} - -//------------------------Armature.update() -//This is a bit ugly because you need an object link to do this -static PyObject *Armature_update(BPy_Armature *self) -{ - Object *obj = NULL; - - for (obj = G.main->object.first; obj; obj = obj->id.next){ - if (obj->data == self->armature) - break; - } - if (obj){ - editbones_to_armature (&self->Bones->editbones, obj); - if (!BonesDict_InitBones(self->Bones)) - return NULL; - self->Bones->editmode_flag = 0; - BLI_freelistN(&self->Bones->editbones); - }else{ - goto AttributeError; - - } - return EXPP_incr_ret(Py_None); - -AttributeError: - return EXPP_objError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "The armature must be linked to an object before you can save changes!"); -} - -//------------------------Armature.__copy__() -static PyObject *Armature_copy(BPy_Armature *self) -{ - PyObject *py_armature = NULL; - bArmature *bl_armature; - bl_armature= copy_armature(self->armature); - bl_armature->id.us= 0; - py_armature= Armature_CreatePyObject( bl_armature ); - return py_armature; -} - -//------------------ATTRIBUTE IMPLEMENTATION--------------------------- -//------------------------Armature.autoIK (getter) -static PyObject *Armature_getAutoIK(BPy_Armature *self, void *closure) -{ - if (self->armature->flag & ARM_AUTO_IK) - return EXPP_incr_ret(Py_True); - else - return EXPP_incr_ret(Py_False); -} -//------------------------Armature.autoIK (setter) -static int Armature_setAutoIK(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->flag |= ARM_AUTO_IK; - return 0; - }else if (value == Py_False){ - self->armature->flag &= ~ARM_AUTO_IK; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} -//------------------------Armature.layers (getter) -static PyObject *Armature_getLayers(BPy_Armature *self, void *closure) -{ - int layers, bit = 0, val = 0; - PyObject *item = NULL, *laylist = PyList_New( 0 ); - - if( !laylist ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create pylist!" ); - - layers = self->armature->layer; - - while( bit < 20 ) { - val = 1 << bit; - if( layers & val ) { - item = Py_BuildValue( "i", bit + 1 ); - PyList_Append( laylist, item ); - Py_DECREF( item ); - } - bit++; - } - return laylist; -} -//------------------------Armature.layer (setter) -static int Armature_setLayers(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyList_Check(value)){ - int layers = 0, len_list = 0; - int val; - PyObject *item = NULL; - - len_list = PyList_Size(value); - - if( len_list == 0 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "list can't be empty, at least one layer must be set" ); - - while( len_list ) { - --len_list; - item = PyList_GetItem( value, len_list ); - if( !PyInt_Check( item ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "list must contain only integer numbers" ); - - val = ( int ) PyInt_AsLong( item ); - if( val < 1 || val > 20 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "layer values must be in the range [1, 20]" ); - - layers |= 1 << ( val - 1 ); - } - - /* update any bases pointing to our object */ - self->armature->layer = (short)layers; - - return 0; - } - } - goto AttributeError; - -AttributeError: - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of integers" ); -} - -//------------------------Armature.mirrorEdit (getter) -static PyObject *Armature_getMirrorEdit(BPy_Armature *self, void *closure) -{ - if (self->armature->flag & ARM_MIRROR_EDIT) - return EXPP_incr_ret(Py_True); - else - return EXPP_incr_ret(Py_False); -} -//------------------------Armature.mirrorEdit (setter) -static int Armature_setMirrorEdit(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->flag |= ARM_MIRROR_EDIT; - return 0; - }else if (value == Py_False){ - self->armature->flag &= ~ARM_MIRROR_EDIT; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} -//------------------------Armature.drawType (getter) -static PyObject *Armature_getDrawType(BPy_Armature *self, void *closure) -{ - if (self->armature->drawtype == ARM_OCTA){ - return EXPP_GetModuleConstant("Blender.Armature", "OCTAHEDRON") ; - }else if (self->armature->drawtype == ARM_LINE){ - return EXPP_GetModuleConstant("Blender.Armature", "STICK") ; - }else if (self->armature->drawtype == ARM_B_BONE){ - return EXPP_GetModuleConstant("Blender.Armature", "BBONE") ; - }else if (self->armature->drawtype == ARM_ENVELOPE){ - return EXPP_GetModuleConstant("Blender.Armature", "ENVELOPE") ; - }else{ - goto RuntimeError; - } - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sArmatureError, "drawType: ", "Internal failure!"); -} -//------------------------Armature.drawType (setter) -static int Armature_setDrawType(BPy_Armature *self, PyObject *value, void *closure) -{ - PyObject *val = NULL, *name = NULL; - long numeric_value; - - if(value){ - if(BPy_Constant_Check(value)){ - name = PyDict_GetItemString(((BPy_constant*)value)->dict, "name"); - if (!STREQ2(PyString_AsString(name), "OCTAHEDRON", "STICK") && - !STREQ2(PyString_AsString(name), "BBONE", "ENVELOPE")) - goto ValueError; - val = PyDict_GetItemString(((BPy_constant*)value)->dict, "value"); - if (PyInt_Check(val)){ - numeric_value = PyInt_AS_LONG(val); - self->armature->drawtype = (int)numeric_value; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects module constant"); - -ValueError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Argument must be the constant OCTAHEDRON, STICK, BBONE, or ENVELOPE"); -} -//------------------------Armature.ghostStep (getter) -static PyObject *Armature_getStep(BPy_Armature *self, void *closure) -{ - return PyInt_FromLong((long)self->armature->ghostsize); -} -//------------------------Armature.ghostStep (setter) -static int Armature_setStep(BPy_Armature *self, PyObject *value, void *closure) -{ - long numerical_value; - - if(value){ - if(PyInt_Check(value)){ - numerical_value = PyInt_AS_LONG(value); - if (numerical_value > 20.0f || numerical_value < 1.0f) - goto ValueError; - self->armature->ghostsize = (short)numerical_value; - return 0; - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects Integer"); - -ValueError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Argument must fall within 1-20"); -} -//------------------------Armature.ghost (getter) -static PyObject *Armature_getGhost(BPy_Armature *self, void *closure) -{ - return PyInt_FromLong((long)self->armature->ghostep); -} -//------------------------Armature.ghost (setter) -static int Armature_setGhost(BPy_Armature *self, PyObject *value, void *closure) -{ - long numerical_value; - - if(value){ - if(PyInt_Check(value)){ - numerical_value = PyInt_AS_LONG(value); - if (numerical_value > 30.0f || numerical_value < 0.0f) - goto ValueError; - self->armature->ghostep = (short)numerical_value; - return 0; - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects Integer"); - -ValueError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Argument must fall within 0-30"); -} -//------------------------Armature.drawNames (getter) -static PyObject *Armature_getDrawNames(BPy_Armature *self, void *closure) -{ - if (self->armature->flag & ARM_DRAWNAMES) - return EXPP_incr_ret(Py_True); - else - return EXPP_incr_ret(Py_False); -} -//------------------------Armature.drawNames (setter) -static int Armature_setDrawNames(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->flag |= ARM_DRAWNAMES; - return 0; - }else if (value == Py_False){ - self->armature->flag &= ~ARM_DRAWNAMES; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} -//------------------------Armature.drawAxes (getter) -static PyObject *Armature_getDrawAxes(BPy_Armature *self, void *closure) -{ - if (self->armature->flag & ARM_DRAWAXES) - return EXPP_incr_ret(Py_True); - else - return EXPP_incr_ret(Py_False); -} -//------------------------Armature.drawAxes (setter) -static int Armature_setDrawAxes(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->flag |= ARM_DRAWAXES; - return 0; - }else if (value == Py_False){ - self->armature->flag &= ~ARM_DRAWAXES; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} -//------------------------Armature.delayDeform (getter) -static PyObject *Armature_getDelayDeform(BPy_Armature *self, void *closure) -{ - if (self->armature->flag & ARM_DELAYDEFORM) - return EXPP_incr_ret(Py_True); - else - return EXPP_incr_ret(Py_False); -} -//------------------------Armature.delayDeform (setter) -static int Armature_setDelayDeform(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->flag |= ARM_DELAYDEFORM; - return 0; - }else if (value == Py_False){ - self->armature->flag &= ~ARM_DELAYDEFORM; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} -//------------------------Armature.restPosition (getter) -static PyObject *Armature_getRestPosition(BPy_Armature *self, void *closure) -{ - if (self->armature->flag & ARM_RESTPOS) - return EXPP_incr_ret(Py_True); - else - return EXPP_incr_ret(Py_False); -} -//------------------------Armature.restPosition (setter) -static int Armature_setRestPosition(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->flag |= ARM_RESTPOS; - return 0; - }else if (value == Py_False){ - self->armature->flag &= ~ARM_RESTPOS; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} -//------------------------Armature.envelopes (getter) -static PyObject *Armature_getEnvelopes(BPy_Armature *self, void *closure) -{ - if (self->armature->deformflag & ARM_DEF_ENVELOPE) - return EXPP_incr_ret(Py_True); - else - return EXPP_incr_ret(Py_False); -} -//------------------------Armature.envelopes (setter) -static int Armature_setEnvelopes(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->deformflag |= ARM_DEF_ENVELOPE; - return 0; - }else if (value == Py_False){ - self->armature->deformflag &= ~ARM_DEF_ENVELOPE; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} -//------------------------Armature.vertexGroups (getter) -static PyObject *Armature_getVertexGroups(BPy_Armature *self, void *closure) -{ - if (self->armature->deformflag & ARM_DEF_VGROUP) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} -//------------------------Armature.vertexGroups (setter) -static int Armature_setVertexGroups(BPy_Armature *self, PyObject *value, void *closure) -{ - if(value){ - if(PyBool_Check(value)){ - if (value == Py_True){ - self->armature->deformflag |= ARM_DEF_VGROUP; - return 0; - }else if (value == Py_False){ - self->armature->deformflag &= ~ARM_DEF_VGROUP; - return 0; - } - } - } - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sArmatureBadArgs, "Expects True or False"); -} - -//------------------------Armature.bones (getter) -//Gets the name of the armature -static PyObject *Armature_getBoneDict(BPy_Armature *self, void *closure) -{ - return EXPP_incr_ret((PyObject*)self->Bones); -} -//------------------------Armature.bones (setter) -//Sets the name of the armature -/*TODO*/ -/*Copy Bones through x = y*/ -static int Armature_setBoneDict(BPy_Armature *self, PyObject *value, void *closure) -{ - goto AttributeError; - -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 -static char BPy_Armature_doc[] = "This object wraps a Blender Armature object."; -//------------------------tp_methods -//This contains a list of all methods the object contains -static PyMethodDef BPy_Armature_methods[] = { - {"makeEditable", (PyCFunction) Armature_makeEditable, METH_NOARGS, - "() - Unlocks the ability to modify armature bones"}, - {"update", (PyCFunction) Armature_update, METH_NOARGS, - "() - Rebuilds the armature based on changes to bones since the last call to makeEditable"}, - {"__copy__", (PyCFunction) Armature_copy, METH_NOARGS, - "() - Return a copy of the armature."}, - {"copy", (PyCFunction) Armature_copy, METH_NOARGS, - "() - Return a copy of the armature."}, - {NULL, NULL, 0, NULL} -}; -//------------------------tp_getset -//This contains methods for attributes that require checking -static PyGetSetDef BPy_Armature_getset[] = { - GENERIC_LIB_GETSETATTR, - {"bones", (getter)Armature_getBoneDict, (setter)Armature_setBoneDict, - "The armature's Bone dictionary", NULL}, - {"vertexGroups", (getter)Armature_getVertexGroups, (setter)Armature_setVertexGroups, - "Enable/Disable vertex group defined deformation", NULL}, - {"envelopes", (getter)Armature_getEnvelopes, (setter)Armature_setEnvelopes, - "Enable/Disable bone envelope defined deformation", NULL}, - {"restPosition", (getter)Armature_getRestPosition, (setter)Armature_setRestPosition, - "Show armature rest position - disables posing", NULL}, - {"delayDeform", (getter)Armature_getDelayDeform, (setter)Armature_setDelayDeform, - "Don't deform children when manipulating bones in pose mode", NULL}, - {"drawAxes", (getter)Armature_getDrawAxes, (setter)Armature_setDrawAxes, - "Enable/Disable drawing the bone axes", NULL}, - {"drawNames", (getter)Armature_getDrawNames, (setter)Armature_setDrawNames, - "Enable/Disable drawing the bone names", NULL}, - {"ghost", (getter)Armature_getGhost, (setter)Armature_setGhost, - "Draw a number of ghosts around the current frame for current Action", NULL}, - {"ghostStep", (getter)Armature_getStep, (setter)Armature_setStep, - "The number of frames between ghost instances", NULL}, - {"drawType", (getter)Armature_getDrawType, (setter)Armature_setDrawType, - "The type of drawing currently applied to the armature", NULL}, - {"mirrorEdit", (getter)Armature_getMirrorEdit, (setter)Armature_setMirrorEdit, - "Enable/Disable X-axis mirrored editing", NULL}, - {"autoIK", (getter)Armature_getAutoIK, (setter)Armature_setAutoIK, - "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 -//This methods creates a new object (note it does not initialize it - only the building) -//This can be called through python by myObject.__new__() however, tp_init is not called -static PyObject *Armature_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - BPy_Armature *py_armature = NULL; - bArmature *bl_armature; - - bl_armature = add_armature("Armature"); - if(bl_armature) { - bl_armature->id.us = 0; // return count to 0 - add_armature() inc'd it - - py_armature = (BPy_Armature*)type->tp_alloc(type, 0); //*new* - if (py_armature == NULL) - goto RuntimeError; - - py_armature->armature = bl_armature; - - //create armature.bones - py_armature->Bones = (BPy_BonesDict*)PyBonesDict_FromPyArmature(py_armature); - if (!py_armature->Bones) - goto RuntimeError; - - } else { - goto RuntimeError; - } - return (PyObject*)py_armature; - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sArmatureError, " __new__: ", "couldn't create Armature Data in Blender"); -} -//------------------------tp_init -//This methods does initialization of the new object -//This method will get called in python by 'myObject(argument, keyword=value)' -//tp_new will be automatically called before this -static int Armature_init(BPy_Armature *self, PyObject *args, PyObject *kwds) -{ - char buf[21]; - char *name = "myArmature"; - static char *kwlist[] = {"name", NULL}; - - if(!PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, &name)){ - goto AttributeError; - } - - //rename the armature if a name is supplied - if(!BLI_streq(name, "myArmature")){ - PyOS_snprintf(buf, sizeof(buf), "%s", name); - rename_id(&self->armature->id, buf); - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sArmatureBadArgs, " __init__: ", "Expects string(name)"); -} - - -/*****************************************************************************/ -/* Function: Armature_compare */ -/* Description: This is a callback function for the BPy_Armature type. It */ -/* compares two Armature_Type objects. Only the "==" and "!=" */ -/* comparisons are meaninful. Returns 0 for equality and -1 if */ -/* they don't point to the same Blender Object struct. */ -/* In Python it becomes 1 if they are equal, 0 otherwise. */ -/*****************************************************************************/ -static int Armature_compare( BPy_Armature * a, BPy_Armature * b ) -{ - return ( a->armature == b->armature ) ? 0 : -1; -} - -//------------------------tp_repr -//This is the string representation of the object -static PyObject *Armature_repr(BPy_Armature *self) -{ - return PyString_FromFormat( "[Armature: \"%s\"]", self->armature->id.name + 2 ); //*new* -} -//------------------------tp_dealloc -//This tells how to 'tear-down' our object when ref count hits 0 -///tp_dealloc -static void Armature_dealloc(BPy_Armature * self) -{ - if (self->weaklist != NULL) - PyObject_ClearWeakRefs((PyObject *) self); /* this causes the weakref dealloc func to be called */ - - Py_DECREF(self->Bones); - PyObject_DEL( self ); -} -//------------------TYPE_OBECT DEFINITION-------------------------- -PyTypeObject Armature_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "Armature", //tp_name - sizeof(BPy_Armature), //tp_basicsize - 0, //tp_itemsize - (destructor)Armature_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - (cmpfunc) Armature_compare, //tp_compare - (reprfunc) Armature_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - 0, //tp_as_mapping - ( hashfunc ) GenericLib_hash, //tp_hash - 0, //tp_call - 0, //tp_str - 0, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT| Py_TPFLAGS_HAVE_WEAKREFS, //tp_flags - BPy_Armature_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - offsetof(BPy_Armature, weaklist), //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_Armature_methods, //tp_methods - 0, //tp_members - BPy_Armature_getset, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - (initproc)Armature_init, //tp_init - 0, //tp_alloc - (newfunc)Armature_new, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; - -//-------------------MODULE METHODS IMPLEMENTATION------------------------ -//----------------Blender.Armature.Get() -/* This function will return a Py_Armature when a single string is passed -* or else it will return a {key:value} dictionary when mutliple strings are passed -* or it will return a {key:value} dictionary of all armatures when nothing is passed */ -static PyObject *M_Armature_Get(PyObject * self, PyObject * args) -{ - PyObject *seq = NULL, *item = NULL, *dict = NULL, *py_armature = NULL; - char *name = "", buffer[24]; - int size = 0, i; - void *data; - - //GET ARGUMENTS - () ('s') ('s',..) (['s',..]) are exceptable - size = PySequence_Length(args); - if (size == 1) { - seq = PySequence_GetItem(args, 0); //*new* - if (!seq) - goto RuntimeError; - if(!PyString_Check(seq)){ - if (PySequence_Check(seq)) { - size = PySequence_Length(seq); - } else { - Py_DECREF(seq); - goto AttributeError; - } - } - } else { - seq = EXPP_incr_ret(args); //*take ownership* - } - //'seq' should be a list, empty tuple or string - check list for strings - if(!PyString_Check(seq)){ - for(i = 0; i < size; i++){ - item = PySequence_GetItem(seq, i); //*new* - if (!item) { - Py_DECREF(seq); - goto RuntimeError; - } - if(!PyString_Check(item)){ - EXPP_decr2(item, seq); - goto AttributeError; - } - Py_DECREF(item); - } - } - - //GET ARMATURES - if(size != 1){ - dict = PyDict_New(); //*new* - if(!dict){ - Py_DECREF(seq); - goto RuntimeError; - } - if(size == 0){ //GET ALL ARMATURES - 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); - goto RuntimeError; - } - Py_DECREF(py_armature); - data = ((ID*)data)->next; - } - Py_DECREF(seq); - }else{ //GET ARMATURE LIST - for (i = 0; i < size; i++) { - item = PySequence_GetItem(seq, i); //*new* - name = PyString_AsString(item); - Py_DECREF(item); - 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; - } - Py_DECREF(py_armature); - }else{ - if(PyDict_SetItemString(dict, name, Py_None) == -1){ //add to dictionary - EXPP_decr2(seq, dict); - goto RuntimeError; - } - Py_DECREF(Py_None); - } - } - Py_DECREF(seq); - } - return dict; - }else{ //GET SINGLE ARMATURE - if(!PyString_Check(seq)){ //This handles the bizarre case where (['s']) is passed - item = PySequence_GetItem(seq, 0); //*new* - name = PyString_AsString(item); - Py_DECREF(item); - }else{ - name = PyString_AsString(seq); - } - Py_DECREF(seq); - data = find_id("AR", name); //get data from library - if (data != NULL){ - return Armature_CreatePyObject(data); //*new* - }else{ - char buffer[128]; - PyOS_snprintf( buffer, sizeof(buffer), - "Armature \"%s\" not found", name); - return EXPP_ReturnPyObjError( PyExc_ValueError, - buffer ); - } - } - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sModuleError, "Get(): ", "Internal Error Ocurred"); - -AttributeError: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sModuleBadArgs, "Get(): ", "- Expects (optional) string sequence"); -} - - -//----------------Blender.Armature.New() -static PyObject *M_Armature_New(PyObject * self, PyObject * args) -{ - char *name = "Armature"; - struct bArmature *armature; - BPy_Armature *obj; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or a string as argument" ); - - armature= add_armature(name); - armature->id.us = 0; - obj = (BPy_Armature *)Armature_CreatePyObject(armature); /*new*/ - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - obj->armature = armature; - return (PyObject *)obj; -} - - -//-------------------MODULE METHODS DEFINITION----------------------------- - -static char M_Armature_Get_doc[] = "(name) - return the armature with the name 'name', \ - returns None if not found.\n If 'name' is not specified, it returns a list of all \ - armatures in the\ncurrent scene."; - -static char M_Armature_New_doc[] = "(name) - return a new armature object."; - -struct PyMethodDef M_Armature_methods[] = { - {"Get", M_Armature_Get, METH_VARARGS, M_Armature_Get_doc}, - {"New", M_Armature_New, METH_VARARGS, M_Armature_New_doc}, - {NULL, NULL, 0, NULL} -}; -//------------------VISIBLE PROTOTYPE IMPLEMENTATION----------------------- -//------------------------Armature_RebuildEditbones (internal) -PyObject * Armature_RebuildEditbones(PyObject *pyarmature) -{ - return Armature_makeEditable((BPy_Armature*)pyarmature); -} - -//------------------------Armature_RebuildBones (internal) -PyObject *Armature_RebuildBones(PyObject *pyarmature) -{ - return Armature_update((BPy_Armature*)pyarmature); -} - -/* internal func to remove weakref from weakref list */ -PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref) -{ - char *list_name = ARM_WEAKREF_LIST_NAME; - PyObject *maindict = NULL, *armlist = NULL; - int i; - - maindict= PyModule_GetDict(PyImport_AddModule( "__main__")); - armlist = PyDict_GetItemString(maindict, list_name); - if( !armlist){ - printf("Oops - update_armature_weakrefs()\n"); - Py_RETURN_NONE; - } - - i = PySequence_Index(armlist, weakref); - if (i==-1) { - printf("callback weakref internal error, weakref not in list\n\tthis should never happen.\n"); - Py_RETURN_NONE; - } - PySequence_DelItem(armlist, i); - Py_RETURN_NONE; -} - -/*-----------------(internal) - * Converts a bArmature to a PyArmature */ - -PyObject *Armature_CreatePyObject(struct bArmature *armature) -{ - BPy_Armature *py_armature = NULL; - PyObject *maindict = NULL, *weakref = NULL; - PyObject *armlist = NULL; /* list of armature weak refs */ - char *list_name = ARM_WEAKREF_LIST_NAME; - int i; - - //put a weakreference in __main__ - maindict= PyModule_GetDict(PyImport_AddModule( "__main__")); - - armlist = PyDict_GetItemString(maindict, list_name); - if(!armlist) { - printf("Oops - can't get the armature weakref list\n"); - goto RuntimeError; - } - - /* see if we alredy have it */ - for (i=0; i< PyList_Size(armlist); i++) { - py_armature = (BPy_Armature *)PyWeakref_GetObject(PyList_GET_ITEM(armlist, i)); - if (BPy_Armature_Check(py_armature) && py_armature->armature == armature) { - Py_INCREF(py_armature); - /*printf("reusing armature\n");*/ - return (PyObject *)py_armature; - } - } - - - /*create armature type*/ - py_armature = PyObject_NEW( BPy_Armature, &Armature_Type ); - - if (!py_armature){ - printf("Oops - can't create py armature\n"); - goto RuntimeError; - } - - py_armature->armature = armature; - py_armature->weaklist = NULL; //init the weaklist - - //create armature.bones - py_armature->Bones = (BPy_BonesDict*)PyBonesDict_FromPyArmature(py_armature); - if (!py_armature->Bones){ - printf("Oops - creating armature.bones\n"); - goto RuntimeError; - } - - weakref = PyWeakref_NewRef((PyObject*)py_armature, arm_weakref_callback_weakref_dealloc__pyfunc); - if (PyList_Append(armlist, weakref) == -1){ - printf("Oops - list-append failed\n"); - goto RuntimeError; - } - Py_DECREF(weakref); - - return (PyObject *) py_armature; - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sModuleError, "Armature_CreatePyObject: ", "Internal Error Ocurred"); -} -//-----------------(internal) -//Converts a PyArmature to a bArmature -struct bArmature *PyArmature_AsArmature(BPy_Armature *py_armature) -{ - return (py_armature->armature); -} - -struct bArmature *Armature_FromPyObject( PyObject * py_obj ) -{ - return PyArmature_AsArmature((BPy_Armature*)py_obj); -} - -/* internal use only */ -static PyMethodDef bpy_arm_weakref_callback_weakref_dealloc[] = { - {"arm_weakref_callback_weakref_dealloc", arm_weakref_callback_weakref_dealloc, METH_O, ""} -}; - -//-------------------MODULE INITIALIZATION-------------------------------- -PyObject *Armature_Init(void) -{ - PyObject *module, *dict; - - //Initializes TypeObject.ob_type - if (PyType_Ready(&Armature_Type) < 0 || PyType_Ready(&BonesDict_Type) < 0 || - PyType_Ready(&EditBone_Type) < 0 || PyType_Ready(&Bone_Type) < 0) { - return EXPP_incr_ret(Py_None); - } - - /* Weakref management - used for callbacks so we can - * tell when a callback has been removed that a UI button referenced */ - arm_weakref_callback_weakref_dealloc__pyfunc = PyCFunction_New(bpy_arm_weakref_callback_weakref_dealloc, NULL); - - - //Register the module - module = Py_InitModule3("Blender.Armature", M_Armature_methods, - "The Blender Armature module"); - - //Add TYPEOBJECTS to the module - PyModule_AddObject(module, "Armature", - EXPP_incr_ret((PyObject *)&Armature_Type)); //*steals* - PyModule_AddObject(module, "Bone", - EXPP_incr_ret((PyObject *)&Bone_Type)); //*steals* - PyModule_AddObject(module, "Editbone", - EXPP_incr_ret((PyObject *)&EditBone_Type)); //*steals* - - //Add CONSTANTS to the module - PyModule_AddObject(module, "CONNECTED", - PyConstant_NewInt("CONNECTED", BONE_CONNECTED)); - PyModule_AddObject(module, "HINGE", - PyConstant_NewInt("HINGE", BONE_HINGE)); - PyModule_AddObject(module, "NO_DEFORM", - PyConstant_NewInt("NO_DEFORM", BONE_NO_DEFORM)); - PyModule_AddObject(module, "MULTIPLY", - PyConstant_NewInt("MULTIPLY", BONE_MULT_VG_ENV)); - PyModule_AddObject(module, "HIDDEN_EDIT", - PyConstant_NewInt("HIDDEN_EDIT", BONE_HIDDEN_A)); - PyModule_AddObject(module, "ROOT_SELECTED", - PyConstant_NewInt("ROOT_SELECTED", BONE_ROOTSEL)); - PyModule_AddObject(module, "BONE_SELECTED", - PyConstant_NewInt("BONE_SELECTED", BONE_SELECTED)); - PyModule_AddObject(module, "TIP_SELECTED", - PyConstant_NewInt("TIP_SELECTED", BONE_TIPSEL)); - - PyModule_AddObject(module, "OCTAHEDRON", - PyConstant_NewInt("OCTAHEDRON", ARM_OCTA)); - PyModule_AddObject(module, "STICK", - PyConstant_NewInt("STICK", ARM_LINE)); - PyModule_AddObject(module, "BBONE", - PyConstant_NewInt("BBONE", ARM_B_BONE)); - PyModule_AddObject(module, "ENVELOPE", - PyConstant_NewInt("ENVELOPE", ARM_ENVELOPE)); - - //Add SUBMODULES to the module - dict = PyModule_GetDict( module ); //borrowed - PyDict_SetItemString(dict, "NLA", NLA_Init()); //creates a *new* module - - return module; -} diff --git a/source/blender/python/api2_2x/Armature.h b/source/blender/python/api2_2x/Armature.h deleted file mode 100644 index bafd49772b0..00000000000 --- a/source/blender/python/api2_2x/Armature.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * $Id: Armature.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 - * 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): Joseph gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_ARMATURE_H -#define EXPP_ARMATURE_H - -#include -#include "DNA_armature_types.h" - -//-------------------TYPE CHECKS--------------------------------- -#define BPy_Armature_Check(v) ((v)->ob_type == &Armature_Type) -#define BPy_BonesDict_Check(v) ((v)->ob_type == &BonesDict_Type) -//-------------------MODULE INIT--------------------------------- -PyObject *Armature_Init( void ); -//-------------------TYPEOBJECT---------------------------------- -extern PyTypeObject Armature_Type; -extern PyTypeObject BonesDict_Type; -//-------------------STRUCT DEFINITION--------------------------- -typedef struct { - PyObject_HEAD - PyObject *bonesMap; //wrapper for bones - PyObject *editbonesMap; //wrapper for editbones - ListBase *bones; //pointer to armature->bonebase - ListBase editbones; //allocated list of EditBones - short editmode_flag; //1 = in , 0 = not in -} BPy_BonesDict; - -typedef struct { - PyObject_HEAD - struct bArmature * armature; - BPy_BonesDict *Bones; //BPy_BonesDict - PyObject *weaklist; -} BPy_Armature; - -//-------------------VISIBLE PROTOTYPES------------------------- -PyObject *Armature_CreatePyObject(struct bArmature *armature); -struct bArmature *PyArmature_AsArmature(BPy_Armature *py_armature); -PyObject * Armature_RebuildEditbones(PyObject *pyarmature); -PyObject *Armature_RebuildBones(PyObject *pyarmature); - -struct bArmature *Armature_FromPyObject( PyObject * py_obj ); - -#endif diff --git a/source/blender/python/api2_2x/BGL.c b/source/blender/python/api2_2x/BGL.c deleted file mode 100644 index 5d78fd09e2d..00000000000 --- a/source/blender/python/api2_2x/BGL.c +++ /dev/null @@ -1,1590 +0,0 @@ -/* - * $Id: BGL.c 12267 2007-10-17 09:51:13Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* This file is the Blender.BGL part of opy_draw.c, from the old - * bpython/intern dir, with minor changes to adapt it to the new Python - * implementation. The BGL submodule "wraps" OpenGL functions and constants, - * allowing script writers to make OpenGL calls in their Python scripts. */ - -#include "BGL.h" /*This must come first */ - -#include "MEM_guardedalloc.h" -#include "gen_utils.h" - -static int type_size( int type ); -static Buffer *make_buffer( int type, int ndimensions, int *dimensions ); - -static char Method_Buffer_doc[] = - "(type, dimensions, [template]) - Create a new Buffer object\n\n\ -(type) - The format to store data in\n\ -(dimensions) - An int or sequence specifying the dimensions of the buffer\n\ -[template] - A sequence of matching dimensions to the buffer to be created\n\ - which will be used to initialize the Buffer.\n\n\ -If a template is not passed in all fields will be initialized to 0.\n\n\ -The type should be one of GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, or GL_DOUBLE.\n\ -If the dimensions are specified as an int a linear buffer will be\n\ -created. If a sequence is passed for the dimensions the buffer\n\ -will have len(sequence) dimensions, where the size for each dimension\n\ -is determined by the value in the sequence at that index.\n\n\ -For example, passing [100, 100] will create a 2 dimensional\n\ -square buffer. Passing [16, 16, 32] will create a 3 dimensional\n\ -buffer which is twice as deep as it is wide or high."; - -static PyObject *Method_Buffer( PyObject * self, PyObject * args ); - -/* Buffer sequence methods */ - -static int Buffer_len( PyObject * self ); -static PyObject *Buffer_item( PyObject * self, int i ); -static PyObject *Buffer_slice( PyObject * self, int begin, int end ); -static int Buffer_ass_item( PyObject * self, int i, PyObject * v ); -static int Buffer_ass_slice( PyObject * self, int begin, int end, - PyObject * seq ); - -static PySequenceMethods Buffer_SeqMethods = { - ( inquiry ) Buffer_len, /*sq_length */ - ( binaryfunc ) 0, /*sq_concat */ - ( intargfunc ) 0, /*sq_repeat */ - ( intargfunc ) Buffer_item, /*sq_item */ - ( intintargfunc ) Buffer_slice, /*sq_slice */ - ( intobjargproc ) Buffer_ass_item, /*sq_ass_item */ - ( intintobjargproc ) Buffer_ass_slice, /*sq_ass_slice */ -}; - -static void Buffer_dealloc( PyObject * self ); -static PyObject *Buffer_tolist( PyObject * self ); -static PyObject *Buffer_dimensions( PyObject * self ); -static PyObject *Buffer_getattr( PyObject * self, char *name ); -static PyObject *Buffer_repr( PyObject * self ); - -PyTypeObject buffer_Type = { - PyObject_HEAD_INIT( NULL ) /* required python macro */ - 0, /*ob_size */ - "buffer", /*tp_name */ - sizeof( Buffer ), /*tp_basicsize */ - 0, /*tp_itemsize */ - ( destructor ) Buffer_dealloc, /*tp_dealloc */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) Buffer_getattr, /*tp_getattr */ - ( setattrfunc ) 0, /*tp_setattr */ - ( cmpfunc ) 0, /*tp_compare */ - ( reprfunc ) Buffer_repr, /*tp_repr */ - 0, /*tp_as_number */ - &Buffer_SeqMethods, /*tp_as_sequence */ -}; - -/* #ifndef __APPLE__ */ - -#define BGL_Wrap(nargs, funcname, ret, arg_list) \ -static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\ - arg_def##nargs arg_list; \ - ret_def_##ret; \ - if(!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\ - ret_set_##ret gl##funcname (arg_var##nargs arg_list);\ - ret_ret_##ret; \ -} - -#define BGLU_Wrap(nargs, funcname, ret, arg_list) \ -static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\ - arg_def##nargs arg_list; \ - ret_def_##ret; \ - if(!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\ - ret_set_##ret glu##funcname (arg_var##nargs arg_list);\ - ret_ret_##ret; \ -} - -/* #endif */ - -PyObject *BGL_Init( void ); - -/********/ -static int type_size(int type) -{ - switch (type) { - case GL_BYTE: - return sizeof(char); - case GL_SHORT: - return sizeof(short); - case GL_INT: - return sizeof(int); - case GL_FLOAT: - return sizeof(float); - case GL_DOUBLE: - return sizeof(double); - } - return -1; -} - -static Buffer *make_buffer(int type, int ndimensions, int *dimensions) -{ - Buffer *buffer; - void *buf= NULL; - int i, size, length; - - length= 1; - for (i=0; iparent= NULL; - buffer->ndimensions= ndimensions; - buffer->dimensions= dimensions; - buffer->type= type; - buffer->buf.asvoid= buf; - - for (i= 0; ibuf.asbyte[i]= 0; - else if (type==GL_SHORT) - buffer->buf.asshort[i]= 0; - else if (type==GL_INT) - buffer->buf.asint[i]= 0; - else if (type==GL_FLOAT) - buffer->buf.asfloat[i]= 0.0f; - else if (type==GL_DOUBLE) - buffer->buf.asdouble[i]= 0.0; - } - return buffer; -} - -static PyObject *Method_Buffer (PyObject *self, PyObject *args) -{ - PyObject *length_ob= NULL, *template= NULL; - Buffer *buffer; - - int i, type; - int *dimensions = 0, ndimensions = 0; - - if (!PyArg_ParseTuple(args, "iO|O", &type, &length_ob, &template)) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "expected an int and one or two PyObjects"); - - if (type!=GL_BYTE && type!=GL_SHORT && type!=GL_INT && type!=GL_FLOAT && type!=GL_DOUBLE) { - PyErr_SetString(PyExc_AttributeError, "type"); - return NULL; - } - - if (PyNumber_Check(length_ob)) { - ndimensions= 1; - dimensions= MEM_mallocN(ndimensions*sizeof(int), "Buffer dimensions"); - dimensions[0]= PyInt_AsLong(length_ob); - } else if (PySequence_Check(length_ob)) { - ndimensions= PySequence_Length(length_ob); - dimensions= MEM_mallocN(ndimensions*sizeof(int), "Buffer dimensions"); - for (i=0; idimensions[0]; -} - -static PyObject *Buffer_item(PyObject *self, int i) -{ - Buffer *buf= (Buffer *) self; - - if (i >= buf->dimensions[0]) { - PyErr_SetString(PyExc_IndexError, "array index out of range"); - return NULL; - } - - if (buf->ndimensions==1) { - switch (buf->type) { - case GL_BYTE: return Py_BuildValue("b", buf->buf.asbyte[i]); - case GL_SHORT: return Py_BuildValue("h", buf->buf.asshort[i]); - case GL_INT: return Py_BuildValue("i", buf->buf.asint[i]); - case GL_FLOAT: return PyFloat_FromDouble(buf->buf.asfloat[i]); - case GL_DOUBLE: return Py_BuildValue("d", buf->buf.asdouble[i]); - } - } else { - Buffer *newbuf; - int j, length, size; - - length= 1; - for (j=1; jndimensions; j++) { - length*= buf->dimensions[j]; - } - size= type_size(buf->type); - - newbuf= (Buffer *) PyObject_NEW(Buffer, &buffer_Type); - - Py_INCREF(self); - newbuf->parent= self; - - newbuf->ndimensions= buf->ndimensions-1; - newbuf->type= buf->type; - newbuf->buf.asvoid= buf->buf.asbyte + i*length*size; - newbuf->dimensions= MEM_mallocN(newbuf->ndimensions*sizeof(int), - "Buffer dimensions"); - memcpy(newbuf->dimensions, buf->dimensions+1, - newbuf->ndimensions*sizeof(int)); - - return (PyObject *) newbuf; - } - - return NULL; -} - -static PyObject *Buffer_slice(PyObject *self, int begin, int end) -{ - Buffer *buf= (Buffer *) self; - PyObject *list; - int count; - - if (begin<0) begin= 0; - if (end>buf->dimensions[0]) - end= buf->dimensions[0]; - if (begin>end) begin= end; - - list= PyList_New(end-begin); - - for (count= begin; count= buf->dimensions[0]) { - PyErr_SetString(PyExc_IndexError, "array assignment index out of range"); - return -1; - } - - if (buf->ndimensions!=1) { - PyObject *row= Buffer_item(self, i); - int ret; - - if (!row) return -1; - ret= Buffer_ass_slice(row, 0, buf->dimensions[1], v); - Py_DECREF(row); - return ret; - } - - if (buf->type==GL_BYTE) { - if (!PyArg_Parse(v, "b;Coordinates must be ints", &buf->buf.asbyte[i])) - return -1; - } else if (buf->type==GL_SHORT) { - if (!PyArg_Parse(v, "h;Coordinates must be ints", &buf->buf.asshort[i])) - return -1; - - } else if (buf->type==GL_INT) { - if (!PyArg_Parse(v, "i;Coordinates must be ints", &buf->buf.asint[i])) - return -1; - } else if (buf->type==GL_FLOAT) { - if (!PyArg_Parse(v, "f;Coordinates must be floats", &buf->buf.asfloat[i])) - return -1; - } else if (buf->type==GL_DOUBLE) { - if (!PyArg_Parse(v, "d;Coordinates must be floats", &buf->buf.asdouble[i])) - return -1; - } - return 0; -} - -static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq) -{ - Buffer *buf= (Buffer *) self; - PyObject *item; - int count, err=0; - - if (begin<0) begin= 0; - if (end>buf->dimensions[0]) end= buf->dimensions[0]; - if (begin>end) begin= end; - - if (!PySequence_Check(seq)) { - PyErr_SetString(PyExc_TypeError, - "illegal argument type for built-in operation"); - return -1; - } - - if (PySequence_Length(seq)!=(end-begin)) { - PyErr_SetString(PyExc_TypeError, "size mismatch in assignment"); - return -1; - } - - for (count= begin; countparent) Py_DECREF (buf->parent); - else MEM_freeN (buf->buf.asvoid); - - MEM_freeN (buf->dimensions); - - PyObject_DEL (self); -} - -static PyObject *Buffer_tolist(PyObject *self) -{ - int i, len= ((Buffer *)self)->dimensions[0]; - PyObject *list= PyList_New(len); - - for (i=0; indimensions); - int i; - - for (i= 0; indimensions; i++) { - PyList_SetItem(list, i, PyInt_FromLong(buffer->dimensions[i])); - } - - return list; -} - -static PyObject *Buffer_getattr(PyObject *self, char *name) -{ - if (strcmp(name, "list")==0) return Buffer_tolist(self); - else if (strcmp(name, "dimensions")==0) return Buffer_dimensions(self); - - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - -static PyObject *Buffer_repr(PyObject *self) -{ - PyObject *list= Buffer_tolist(self); - PyObject *repr= PyObject_Repr(list); - Py_DECREF(list); - - return repr; -} - - -BGL_Wrap(2, Accum, void, (GLenum, GLfloat)) -BGL_Wrap(2, AlphaFunc, void, (GLenum, GLclampf)) -BGL_Wrap(3, AreTexturesResident, GLboolean, (GLsizei, GLuintP, GLbooleanP)) -BGL_Wrap(1, Begin, void, (GLenum)) -BGL_Wrap(2, BindTexture, void, (GLenum, GLuint)) -BGL_Wrap(7, Bitmap, void, (GLsizei, GLsizei, GLfloat, - GLfloat, GLfloat, GLfloat, GLubyteP)) -BGL_Wrap(2, BlendFunc, void, (GLenum, GLenum)) -BGL_Wrap(1, CallList, void, (GLuint)) -BGL_Wrap(3, CallLists, void, (GLsizei, GLenum, GLvoidP)) -BGL_Wrap(1, Clear, void, (GLbitfield)) -BGL_Wrap(4, ClearAccum, void, (GLfloat, GLfloat, GLfloat, GLfloat)) -BGL_Wrap(4, ClearColor, void, (GLclampf, GLclampf, GLclampf, GLclampf)) -BGL_Wrap(1, ClearDepth, void, (GLclampd)) -BGL_Wrap(1, ClearIndex, void, (GLfloat)) -BGL_Wrap(1, ClearStencil, void, (GLint)) -BGL_Wrap(2, ClipPlane, void, (GLenum, GLdoubleP)) -BGL_Wrap(3, Color3b, void, (GLbyte, GLbyte, GLbyte)) -BGL_Wrap(1, Color3bv, void, (GLbyteP)) -BGL_Wrap(3, Color3d, void, (GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, Color3dv, void, (GLdoubleP)) -BGL_Wrap(3, Color3f, void, (GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, Color3fv, void, (GLfloatP)) -BGL_Wrap(3, Color3i, void, (GLint, GLint, GLint)) -BGL_Wrap(1, Color3iv, void, (GLintP)) -BGL_Wrap(3, Color3s, void, (GLshort, GLshort, GLshort)) -BGL_Wrap(1, Color3sv, void, (GLshortP)) -BGL_Wrap(3, Color3ub, void, (GLubyte, GLubyte, GLubyte)) -BGL_Wrap(1, Color3ubv, void, (GLubyteP)) -BGL_Wrap(3, Color3ui, void, (GLuint, GLuint, GLuint)) -BGL_Wrap(1, Color3uiv, void, (GLuintP)) -BGL_Wrap(3, Color3us, void, (GLushort, GLushort, GLushort)) -BGL_Wrap(1, Color3usv, void, (GLushortP)) -BGL_Wrap(4, Color4b, void, (GLbyte, GLbyte, GLbyte, GLbyte)) -BGL_Wrap(1, Color4bv, void, (GLbyteP)) -BGL_Wrap(4, Color4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, Color4dv, void, (GLdoubleP)) -BGL_Wrap(4, Color4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, Color4fv, void, (GLfloatP)) -BGL_Wrap(4, Color4i, void, (GLint, GLint, GLint, GLint)) -BGL_Wrap(1, Color4iv, void, (GLintP)) -BGL_Wrap(4, Color4s, void, (GLshort, GLshort, GLshort, GLshort)) -BGL_Wrap(1, Color4sv, void, (GLshortP)) -BGL_Wrap(4, Color4ub, void, (GLubyte, GLubyte, GLubyte, GLubyte)) -BGL_Wrap(1, Color4ubv, void, (GLubyteP)) -BGL_Wrap(4, Color4ui, void, (GLuint, GLuint, GLuint, GLuint)) -BGL_Wrap(1, Color4uiv, void, (GLuintP)) -BGL_Wrap(4, Color4us, void, (GLushort, GLushort, GLushort, GLushort)) -BGL_Wrap(1, Color4usv, void, (GLushortP)) -BGL_Wrap(4, ColorMask, void, (GLboolean, GLboolean, GLboolean, GLboolean)) -BGL_Wrap(2, ColorMaterial, void, (GLenum, GLenum)) -BGL_Wrap(5, CopyPixels, void, (GLint, GLint, GLsizei, GLsizei, GLenum)) -BGL_Wrap(1, CullFace, void, (GLenum)) -BGL_Wrap(2, DeleteLists, void, (GLuint, GLsizei)) -BGL_Wrap(2, DeleteTextures, void, (GLsizei, GLuintP)) -BGL_Wrap(1, DepthFunc, void, (GLenum)) -BGL_Wrap(1, DepthMask, void, (GLboolean)) -BGL_Wrap(2, DepthRange, void, (GLclampd, GLclampd)) -BGL_Wrap(1, Disable, void, (GLenum)) -BGL_Wrap(1, DrawBuffer, void, (GLenum)) -BGL_Wrap(5, DrawPixels, void, (GLsizei, GLsizei, GLenum, GLenum, GLvoidP)) -BGL_Wrap(1, EdgeFlag, void, (GLboolean)) -BGL_Wrap(1, EdgeFlagv, void, (GLbooleanP)) -BGL_Wrap(1, Enable, void, (GLenum)) -BGL_Wrap(1, End, void, (void)) -BGL_Wrap(1, EndList, void, (void)) -BGL_Wrap(1, EvalCoord1d, void, (GLdouble)) -BGL_Wrap(1, EvalCoord1dv, void, (GLdoubleP)) -BGL_Wrap(1, EvalCoord1f, void, (GLfloat)) -BGL_Wrap(1, EvalCoord1fv, void, (GLfloatP)) -BGL_Wrap(2, EvalCoord2d, void, (GLdouble, GLdouble)) -BGL_Wrap(1, EvalCoord2dv, void, (GLdoubleP)) -BGL_Wrap(2, EvalCoord2f, void, (GLfloat, GLfloat)) -BGL_Wrap(1, EvalCoord2fv, void, (GLfloatP)) -BGL_Wrap(3, EvalMesh1, void, (GLenum, GLint, GLint)) -BGL_Wrap(5, EvalMesh2, void, (GLenum, GLint, GLint, GLint, GLint)) -BGL_Wrap(1, EvalPoint1, void, (GLint)) -BGL_Wrap(2, EvalPoint2, void, (GLint, GLint)) -BGL_Wrap(3, FeedbackBuffer, void, (GLsizei, GLenum, GLfloatP)) -BGL_Wrap(1, Finish, void, (void)) -BGL_Wrap(1, Flush, void, (void)) -BGL_Wrap(2, Fogf, void, (GLenum, GLfloat)) -BGL_Wrap(2, Fogfv, void, (GLenum, GLfloatP)) -BGL_Wrap(2, Fogi, void, (GLenum, GLint)) -BGL_Wrap(2, Fogiv, void, (GLenum, GLintP)) -BGL_Wrap(1, FrontFace, void, (GLenum)) -BGL_Wrap(6, Frustum, void, (GLdouble, GLdouble, - GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, GenLists, GLuint, (GLsizei)) -BGL_Wrap(2, GenTextures, void, (GLsizei, GLuintP)) -BGL_Wrap(2, GetBooleanv, void, (GLenum, GLbooleanP)) -BGL_Wrap(2, GetClipPlane, void, (GLenum, GLdoubleP)) -BGL_Wrap(2, GetDoublev, void, (GLenum, GLdoubleP)) -BGL_Wrap(1, GetError, GLenum, (void)) -BGL_Wrap(2, GetFloatv, void, (GLenum, GLfloatP)) -BGL_Wrap(2, GetIntegerv, void, (GLenum, GLintP)) -BGL_Wrap(3, GetLightfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, GetLightiv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(3, GetMapdv, void, (GLenum, GLenum, GLdoubleP)) -BGL_Wrap(3, GetMapfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, GetMapiv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(3, GetMaterialfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, GetMaterialiv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(2, GetPixelMapfv, void, (GLenum, GLfloatP)) -BGL_Wrap(2, GetPixelMapuiv, void, (GLenum, GLuintP)) -BGL_Wrap(2, GetPixelMapusv, void, (GLenum, GLushortP)) -BGL_Wrap(1, GetPolygonStipple,void, (GLubyteP)) -BGL_Wrap(1, GetString, GLstring, (GLenum)) -BGL_Wrap(3, GetTexEnvfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, GetTexEnviv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(3, GetTexGendv, void, (GLenum, GLenum, GLdoubleP)) -BGL_Wrap(3, GetTexGenfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, GetTexGeniv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(5, GetTexImage, void, (GLenum, GLint, GLenum, GLenum, GLvoidP)) -BGL_Wrap(4, GetTexLevelParameterfv, void, (GLenum, GLint, GLenum, GLfloatP)) -BGL_Wrap(4, GetTexLevelParameteriv, void, (GLenum, GLint, GLenum, GLintP)) -BGL_Wrap(3, GetTexParameterfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, GetTexParameteriv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(2, Hint, void, (GLenum, GLenum)) -BGL_Wrap(1, IndexMask, void, (GLuint)) -BGL_Wrap(1, Indexd, void, (GLdouble)) -BGL_Wrap(1, Indexdv, void, (GLdoubleP)) -BGL_Wrap(1, Indexf, void, (GLfloat)) -BGL_Wrap(1, Indexfv, void, (GLfloatP)) -BGL_Wrap(1, Indexi, void, (GLint)) -BGL_Wrap(1, Indexiv, void, (GLintP)) -BGL_Wrap(1, Indexs, void, (GLshort)) -BGL_Wrap(1, Indexsv, void, (GLshortP)) -BGL_Wrap(1, InitNames, void, (void)) -BGL_Wrap(1, IsEnabled, GLboolean, (GLenum)) -BGL_Wrap(1, IsList, GLboolean, (GLuint)) -BGL_Wrap(1, IsTexture, GLboolean, (GLuint)) -BGL_Wrap(2, LightModelf, void, (GLenum, GLfloat)) -BGL_Wrap(2, LightModelfv, void, (GLenum, GLfloatP)) -BGL_Wrap(2, LightModeli, void, (GLenum, GLint)) -BGL_Wrap(2, LightModeliv, void, (GLenum, GLintP)) -BGL_Wrap(3, Lightf, void, (GLenum, GLenum, GLfloat)) -BGL_Wrap(3, Lightfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, Lighti, void, (GLenum, GLenum, GLint)) -BGL_Wrap(3, Lightiv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(2, LineStipple, void, (GLint, GLushort)) -BGL_Wrap(1, LineWidth, void, (GLfloat)) -BGL_Wrap(1, ListBase, void, (GLuint)) -BGL_Wrap(1, LoadIdentity, void, (void)) -BGL_Wrap(1, LoadMatrixd, void, (GLdoubleP)) -BGL_Wrap(1, LoadMatrixf, void, (GLfloatP)) -BGL_Wrap(1, LoadName, void, (GLuint)) -BGL_Wrap(1, LogicOp, void, (GLenum)) -BGL_Wrap(6, Map1d, void, (GLenum, GLdouble, GLdouble, - GLint, GLint, GLdoubleP)) -BGL_Wrap(6, Map1f, void, (GLenum, GLfloat, GLfloat, - GLint, GLint, GLfloatP)) -BGL_Wrap(10, Map2d, void, (GLenum, GLdouble, GLdouble, - GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdoubleP)) -BGL_Wrap(10, Map2f, void, (GLenum, GLfloat, GLfloat, - GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloatP)) -BGL_Wrap(3, MapGrid1d, void, (GLint, GLdouble, GLdouble)) -BGL_Wrap(3, MapGrid1f, void, (GLint, GLfloat, GLfloat)) -BGL_Wrap(6, MapGrid2d, void, (GLint, GLdouble, GLdouble, - GLint, GLdouble, GLdouble)) -BGL_Wrap(6, MapGrid2f, void, (GLint, GLfloat, GLfloat, - GLint, GLfloat, GLfloat)) -BGL_Wrap(3, Materialf, void, (GLenum, GLenum, GLfloat)) -BGL_Wrap(3, Materialfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, Materiali, void, (GLenum, GLenum, GLint)) -BGL_Wrap(3, Materialiv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(1, MatrixMode, void, (GLenum)) -BGL_Wrap(1, MultMatrixd, void, (GLdoubleP)) -BGL_Wrap(1, MultMatrixf, void, (GLfloatP)) -BGL_Wrap(2, NewList, void, (GLuint, GLenum)) -BGL_Wrap(3, Normal3b, void, (GLbyte, GLbyte, GLbyte)) -BGL_Wrap(1, Normal3bv, void, (GLbyteP)) -BGL_Wrap(3, Normal3d, void, (GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, Normal3dv, void, (GLdoubleP)) -BGL_Wrap(3, Normal3f, void, (GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, Normal3fv, void, (GLfloatP)) -BGL_Wrap(3, Normal3i, void, (GLint, GLint, GLint)) -BGL_Wrap(1, Normal3iv, void, (GLintP)) -BGL_Wrap(3, Normal3s, void, (GLshort, GLshort, GLshort)) -BGL_Wrap(1, Normal3sv, void, (GLshortP)) -BGL_Wrap(6, Ortho, void, (GLdouble, GLdouble, - GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, PassThrough, void, (GLfloat)) -BGL_Wrap(3, PixelMapfv, void, (GLenum, GLint, GLfloatP)) -BGL_Wrap(3, PixelMapuiv, void, (GLenum, GLint, GLuintP)) -BGL_Wrap(3, PixelMapusv, void, (GLenum, GLint, GLushortP)) -BGL_Wrap(2, PixelStoref, void, (GLenum, GLfloat)) -BGL_Wrap(2, PixelStorei, void, (GLenum, GLint)) -BGL_Wrap(2, PixelTransferf, void, (GLenum, GLfloat)) -BGL_Wrap(2, PixelTransferi, void, (GLenum, GLint)) -BGL_Wrap(2, PixelZoom, void, (GLfloat, GLfloat)) -BGL_Wrap(1, PointSize, void, (GLfloat)) -BGL_Wrap(2, PolygonMode, void, (GLenum, GLenum)) -BGL_Wrap(2, PolygonOffset, void, (GLfloat, GLfloat)) -BGL_Wrap(1, PolygonStipple, void, (GLubyteP)) -BGL_Wrap(1, PopAttrib, void, (void)) -BGL_Wrap(1, PopClientAttrib, void, (void)) -BGL_Wrap(1, PopMatrix, void, (void)) -BGL_Wrap(1, PopName, void, (void)) -BGL_Wrap(3, PrioritizeTextures, void, (GLsizei, GLuintP, GLclampfP)) -BGL_Wrap(1, PushAttrib, void, (GLbitfield)) -BGL_Wrap(1, PushClientAttrib, void, (GLbitfield)) -BGL_Wrap(1, PushMatrix, void, (void)) -BGL_Wrap(1, PushName, void, (GLuint)) -BGL_Wrap(2, RasterPos2d, void, (GLdouble, GLdouble)) -BGL_Wrap(1, RasterPos2dv, void, (GLdoubleP)) -BGL_Wrap(2, RasterPos2f, void, (GLfloat, GLfloat)) -BGL_Wrap(1, RasterPos2fv, void, (GLfloatP)) -BGL_Wrap(2, RasterPos2i, void, (GLint, GLint)) -BGL_Wrap(1, RasterPos2iv, void, (GLintP)) -BGL_Wrap(2, RasterPos2s, void, (GLshort, GLshort)) -BGL_Wrap(1, RasterPos2sv, void, (GLshortP)) -BGL_Wrap(3, RasterPos3d, void, (GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, RasterPos3dv, void, (GLdoubleP)) -BGL_Wrap(3, RasterPos3f, void, (GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, RasterPos3fv, void, (GLfloatP)) -BGL_Wrap(3, RasterPos3i, void, (GLint, GLint, GLint)) -BGL_Wrap(1, RasterPos3iv, void, (GLintP)) -BGL_Wrap(3, RasterPos3s, void, (GLshort, GLshort, GLshort)) -BGL_Wrap(1, RasterPos3sv, void, (GLshortP)) -BGL_Wrap(4, RasterPos4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, RasterPos4dv, void, (GLdoubleP)) -BGL_Wrap(4, RasterPos4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, RasterPos4fv, void, (GLfloatP)) -BGL_Wrap(4, RasterPos4i, void, (GLint, GLint, GLint, GLint)) -BGL_Wrap(1, RasterPos4iv, void, (GLintP)) -BGL_Wrap(4, RasterPos4s, void, (GLshort, GLshort, GLshort, GLshort)) -BGL_Wrap(1, RasterPos4sv, void, (GLshortP)) -BGL_Wrap(1, ReadBuffer, void, (GLenum)) -BGL_Wrap(7, ReadPixels, void, (GLint, GLint, GLsizei, - GLsizei, GLenum, GLenum, GLvoidP)) -BGL_Wrap(4, Rectd, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(2, Rectdv, void, (GLdoubleP, GLdoubleP)) -BGL_Wrap(4, Rectf, void, (GLfloat, GLfloat, GLfloat, GLfloat)) -BGL_Wrap(2, Rectfv, void, (GLfloatP, GLfloatP)) -BGL_Wrap(4, Recti, void, (GLint, GLint, GLint, GLint)) -BGL_Wrap(2, Rectiv, void, (GLintP, GLintP)) -BGL_Wrap(4, Rects, void, (GLshort, GLshort, GLshort, GLshort)) -BGL_Wrap(2, Rectsv, void, (GLshortP, GLshortP)) -BGL_Wrap(1, RenderMode, GLint, (GLenum)) -BGL_Wrap(4, Rotated, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(4, Rotatef, void, (GLfloat, GLfloat, GLfloat, GLfloat)) -BGL_Wrap(3, Scaled, void, (GLdouble, GLdouble, GLdouble)) -BGL_Wrap(3, Scalef, void, (GLfloat, GLfloat, GLfloat)) -BGL_Wrap(4, Scissor, void, (GLint, GLint, GLsizei, GLsizei)) -BGL_Wrap(2, SelectBuffer, void, (GLsizei, GLuintP)) -BGL_Wrap(1, ShadeModel, void, (GLenum)) -BGL_Wrap(3, StencilFunc, void, (GLenum, GLint, GLuint)) -BGL_Wrap(1, StencilMask, void, (GLuint)) -BGL_Wrap(3, StencilOp, void, (GLenum, GLenum, GLenum)) -BGL_Wrap(1, TexCoord1d, void, (GLdouble)) -BGL_Wrap(1, TexCoord1dv, void, (GLdoubleP)) -BGL_Wrap(1, TexCoord1f, void, (GLfloat)) -BGL_Wrap(1, TexCoord1fv, void, (GLfloatP)) -BGL_Wrap(1, TexCoord1i, void, (GLint)) -BGL_Wrap(1, TexCoord1iv, void, (GLintP)) -BGL_Wrap(1, TexCoord1s, void, (GLshort)) -BGL_Wrap(1, TexCoord1sv, void, (GLshortP)) -BGL_Wrap(2, TexCoord2d, void, (GLdouble, GLdouble)) -BGL_Wrap(1, TexCoord2dv, void, (GLdoubleP)) -BGL_Wrap(2, TexCoord2f, void, (GLfloat, GLfloat)) -BGL_Wrap(1, TexCoord2fv, void, (GLfloatP)) -BGL_Wrap(2, TexCoord2i, void, (GLint, GLint)) -BGL_Wrap(1, TexCoord2iv, void, (GLintP)) -BGL_Wrap(2, TexCoord2s, void, (GLshort, GLshort)) -BGL_Wrap(1, TexCoord2sv, void, (GLshortP)) -BGL_Wrap(3, TexCoord3d, void, (GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, TexCoord3dv, void, (GLdoubleP)) -BGL_Wrap(3, TexCoord3f, void, (GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, TexCoord3fv, void, (GLfloatP)) -BGL_Wrap(3, TexCoord3i, void, (GLint, GLint, GLint)) -BGL_Wrap(1, TexCoord3iv, void, (GLintP)) -BGL_Wrap(3, TexCoord3s, void, (GLshort, GLshort, GLshort)) -BGL_Wrap(1, TexCoord3sv, void, (GLshortP)) -BGL_Wrap(4, TexCoord4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, TexCoord4dv, void, (GLdoubleP)) -BGL_Wrap(4, TexCoord4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, TexCoord4fv, void, (GLfloatP)) -BGL_Wrap(4, TexCoord4i, void, (GLint, GLint, GLint, GLint)) -BGL_Wrap(1, TexCoord4iv, void, (GLintP)) -BGL_Wrap(4, TexCoord4s, void, (GLshort, GLshort, GLshort, GLshort)) -BGL_Wrap(1, TexCoord4sv, void, (GLshortP)) -BGL_Wrap(3, TexEnvf, void, (GLenum, GLenum, GLfloat)) -BGL_Wrap(3, TexEnvfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, TexEnvi, void, (GLenum, GLenum, GLint)) -BGL_Wrap(3, TexEnviv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(3, TexGend, void, (GLenum, GLenum, GLdouble)) -BGL_Wrap(3, TexGendv, void, (GLenum, GLenum, GLdoubleP)) -BGL_Wrap(3, TexGenf, void, (GLenum, GLenum, GLfloat)) -BGL_Wrap(3, TexGenfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, TexGeni, void, (GLenum, GLenum, GLint)) -BGL_Wrap(3, TexGeniv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(8, TexImage1D, void, (GLenum, GLint, GLint, - GLsizei, GLint, GLenum, GLenum, GLvoidP)) -BGL_Wrap(9, TexImage2D, void, (GLenum, GLint, GLint, - GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP)) -BGL_Wrap(3, TexParameterf, void, (GLenum, GLenum, GLfloat)) -BGL_Wrap(3, TexParameterfv, void, (GLenum, GLenum, GLfloatP)) -BGL_Wrap(3, TexParameteri, void, (GLenum, GLenum, GLint)) -BGL_Wrap(3, TexParameteriv, void, (GLenum, GLenum, GLintP)) -BGL_Wrap(3, Translated, void, (GLdouble, GLdouble, GLdouble)) -BGL_Wrap(3, Translatef, void, (GLfloat, GLfloat, GLfloat)) -BGL_Wrap(2, Vertex2d, void, (GLdouble, GLdouble)) -BGL_Wrap(1, Vertex2dv, void, (GLdoubleP)) -BGL_Wrap(2, Vertex2f, void, (GLfloat, GLfloat)) -BGL_Wrap(1, Vertex2fv, void, (GLfloatP)) -BGL_Wrap(2, Vertex2i, void, (GLint, GLint)) -BGL_Wrap(1, Vertex2iv, void, (GLintP)) -BGL_Wrap(2, Vertex2s, void, (GLshort, GLshort)) -BGL_Wrap(1, Vertex2sv, void, (GLshortP)) -BGL_Wrap(3, Vertex3d, void, (GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, Vertex3dv, void, (GLdoubleP)) -BGL_Wrap(3, Vertex3f, void, (GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, Vertex3fv, void, (GLfloatP)) -BGL_Wrap(3, Vertex3i, void, (GLint, GLint, GLint)) -BGL_Wrap(1, Vertex3iv, void, (GLintP)) -BGL_Wrap(3, Vertex3s, void, (GLshort, GLshort, GLshort)) -BGL_Wrap(1, Vertex3sv, void, (GLshortP)) -BGL_Wrap(4, Vertex4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGL_Wrap(1, Vertex4dv, void, (GLdoubleP)) -BGL_Wrap(4, Vertex4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) -BGL_Wrap(1, Vertex4fv, void, (GLfloatP)) -BGL_Wrap(4, Vertex4i, void, (GLint, GLint, GLint, GLint)) -BGL_Wrap(1, Vertex4iv, void, (GLintP)) -BGL_Wrap(4, Vertex4s, void, (GLshort, GLshort, GLshort, GLshort)) -BGL_Wrap(1, Vertex4sv, void, (GLshortP)) -BGL_Wrap(4, Viewport, void, (GLint, GLint, GLsizei, GLsizei)) -BGLU_Wrap(4, Perspective, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGLU_Wrap(9, LookAt, void, (GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)) -BGLU_Wrap(4, Ortho2D, void, (GLdouble, GLdouble, GLdouble, GLdouble)) -BGLU_Wrap(5, PickMatrix, void, (GLdouble, GLdouble, GLdouble, GLdouble, GLintP)) -BGLU_Wrap(9, Project, GLint, (GLdouble, GLdouble, GLdouble, GLdoubleP, GLdoubleP, GLintP, GLdoubleP, GLdoubleP, GLdoubleP)) -BGLU_Wrap(9, UnProject, GLint, (GLdouble, GLdouble, GLdouble, GLdoubleP, GLdoubleP, GLintP, GLdoubleP, GLdoubleP, GLdoubleP)) - -#undef MethodDef -#define MethodDef(func) {"gl"#func, Method_##func, METH_VARARGS, "no string"} -#define MethodDefu(func) {"glu"#func, Method_##func, METH_VARARGS, "no string"} -/* So that MethodDef(Accum) becomes: - * {"glAccum", Method_Accumfunc, METH_VARARGS} */ - -static struct PyMethodDef BGL_methods[] = { - {"Buffer", Method_Buffer, METH_VARARGS, Method_Buffer_doc}, - -/* #ifndef __APPLE__ */ - MethodDef(Accum), - MethodDef(AlphaFunc), - MethodDef(AreTexturesResident), - MethodDef(Begin), - MethodDef(BindTexture), - MethodDef(Bitmap), - MethodDef(BlendFunc), - MethodDef(CallList), - MethodDef(CallLists), - MethodDef(Clear), - MethodDef(ClearAccum), - MethodDef(ClearColor), - MethodDef(ClearDepth), - MethodDef(ClearIndex), - MethodDef(ClearStencil), - MethodDef(ClipPlane), - MethodDef(Color3b), - MethodDef(Color3bv), - MethodDef(Color3d), - MethodDef(Color3dv), - MethodDef(Color3f), - MethodDef(Color3fv), - MethodDef(Color3i), - MethodDef(Color3iv), - MethodDef(Color3s), - MethodDef(Color3sv), - MethodDef(Color3ub), - MethodDef(Color3ubv), - MethodDef(Color3ui), - MethodDef(Color3uiv), - MethodDef(Color3us), - MethodDef(Color3usv), - MethodDef(Color4b), - MethodDef(Color4bv), - MethodDef(Color4d), - MethodDef(Color4dv), - MethodDef(Color4f), - MethodDef(Color4fv), - MethodDef(Color4i), - MethodDef(Color4iv), - MethodDef(Color4s), - MethodDef(Color4sv), - MethodDef(Color4ub), - MethodDef(Color4ubv), - MethodDef(Color4ui), - MethodDef(Color4uiv), - MethodDef(Color4us), - MethodDef(Color4usv), - MethodDef(ColorMask), - MethodDef(ColorMaterial), - MethodDef(CopyPixels), - MethodDef(CullFace), - MethodDef(DeleteLists), - MethodDef(DeleteTextures), - MethodDef(DepthFunc), - MethodDef(DepthMask), - MethodDef(DepthRange), - MethodDef(Disable), - MethodDef(DrawBuffer), - MethodDef(DrawPixels), - MethodDef(EdgeFlag), - MethodDef(EdgeFlagv), - MethodDef(Enable), - MethodDef(End), - MethodDef(EndList), - MethodDef(EvalCoord1d), - MethodDef(EvalCoord1dv), - MethodDef(EvalCoord1f), - MethodDef(EvalCoord1fv), - MethodDef(EvalCoord2d), - MethodDef(EvalCoord2dv), - MethodDef(EvalCoord2f), - MethodDef(EvalCoord2fv), - MethodDef(EvalMesh1), - MethodDef(EvalMesh2), - MethodDef(EvalPoint1), - MethodDef(EvalPoint2), - MethodDef(FeedbackBuffer), - MethodDef(Finish), - MethodDef(Flush), - MethodDef(Fogf), - MethodDef(Fogfv), - MethodDef(Fogi), - MethodDef(Fogiv), - MethodDef(FrontFace), - MethodDef(Frustum), - MethodDef(GenLists), - MethodDef(GenTextures), - MethodDef(GetBooleanv), - MethodDef(GetClipPlane), - MethodDef(GetDoublev), - MethodDef(GetError), - MethodDef(GetFloatv), - MethodDef(GetIntegerv), - MethodDef(GetLightfv), - MethodDef(GetLightiv), - MethodDef(GetMapdv), - MethodDef(GetMapfv), - MethodDef(GetMapiv), - MethodDef(GetMaterialfv), - MethodDef(GetMaterialiv), - MethodDef(GetPixelMapfv), - MethodDef(GetPixelMapuiv), - MethodDef(GetPixelMapusv), - MethodDef(GetPolygonStipple), - MethodDef(GetString), - MethodDef(GetTexEnvfv), - MethodDef(GetTexEnviv), - MethodDef(GetTexGendv), - MethodDef(GetTexGenfv), - MethodDef(GetTexGeniv), - MethodDef(GetTexImage), - MethodDef(GetTexLevelParameterfv), - MethodDef(GetTexLevelParameteriv), - MethodDef(GetTexParameterfv), - MethodDef(GetTexParameteriv), - MethodDef(Hint), - MethodDef(IndexMask), - MethodDef(Indexd), - MethodDef(Indexdv), - MethodDef(Indexf), - MethodDef(Indexfv), - MethodDef(Indexi), - MethodDef(Indexiv), - MethodDef(Indexs), - MethodDef(Indexsv), - MethodDef(InitNames), - MethodDef(IsEnabled), - MethodDef(IsList), - MethodDef(IsTexture), - MethodDef(LightModelf), - MethodDef(LightModelfv), - MethodDef(LightModeli), - MethodDef(LightModeliv), - MethodDef(Lightf), - MethodDef(Lightfv), - MethodDef(Lighti), - MethodDef(Lightiv), - MethodDef(LineStipple), - MethodDef(LineWidth), - MethodDef(ListBase), - MethodDef(LoadIdentity), - MethodDef(LoadMatrixd), - MethodDef(LoadMatrixf), - MethodDef(LoadName), - MethodDef(LogicOp), - MethodDef(Map1d), - MethodDef(Map1f), - MethodDef(Map2d), - MethodDef(Map2f), - MethodDef(MapGrid1d), - MethodDef(MapGrid1f), - MethodDef(MapGrid2d), - MethodDef(MapGrid2f), - MethodDef(Materialf), - MethodDef(Materialfv), - MethodDef(Materiali), - MethodDef(Materialiv), - MethodDef(MatrixMode), - MethodDef(MultMatrixd), - MethodDef(MultMatrixf), - MethodDef(NewList), - MethodDef(Normal3b), - MethodDef(Normal3bv), - MethodDef(Normal3d), - MethodDef(Normal3dv), - MethodDef(Normal3f), - MethodDef(Normal3fv), - MethodDef(Normal3i), - MethodDef(Normal3iv), - MethodDef(Normal3s), - MethodDef(Normal3sv), - MethodDef(Ortho), - MethodDef(PassThrough), - MethodDef(PixelMapfv), - MethodDef(PixelMapuiv), - MethodDef(PixelMapusv), - MethodDef(PixelStoref), - MethodDef(PixelStorei), - MethodDef(PixelTransferf), - MethodDef(PixelTransferi), - MethodDef(PixelZoom), - MethodDef(PointSize), - MethodDef(PolygonMode), - MethodDef(PolygonOffset), - MethodDef(PolygonStipple), - MethodDef(PopAttrib), - MethodDef(PopClientAttrib), - MethodDef(PopMatrix), - MethodDef(PopName), - MethodDef(PrioritizeTextures), - MethodDef(PushAttrib), - MethodDef(PushClientAttrib), - MethodDef(PushMatrix), - MethodDef(PushName), - MethodDef(RasterPos2d), - MethodDef(RasterPos2dv), - MethodDef(RasterPos2f), - MethodDef(RasterPos2fv), - MethodDef(RasterPos2i), - MethodDef(RasterPos2iv), - MethodDef(RasterPos2s), - MethodDef(RasterPos2sv), - MethodDef(RasterPos3d), - MethodDef(RasterPos3dv), - MethodDef(RasterPos3f), - MethodDef(RasterPos3fv), - MethodDef(RasterPos3i), - MethodDef(RasterPos3iv), - MethodDef(RasterPos3s), - MethodDef(RasterPos3sv), - MethodDef(RasterPos4d), - MethodDef(RasterPos4dv), - MethodDef(RasterPos4f), - MethodDef(RasterPos4fv), - MethodDef(RasterPos4i), - MethodDef(RasterPos4iv), - MethodDef(RasterPos4s), - MethodDef(RasterPos4sv), - MethodDef(ReadBuffer), - MethodDef(ReadPixels), - MethodDef(Rectd), - MethodDef(Rectdv), - MethodDef(Rectf), - MethodDef(Rectfv), - MethodDef(Recti), - MethodDef(Rectiv), - MethodDef(Rects), - MethodDef(Rectsv), - MethodDef(RenderMode), - MethodDef(Rotated), - MethodDef(Rotatef), - MethodDef(Scaled), - MethodDef(Scalef), - MethodDef(Scissor), - MethodDef(SelectBuffer), - MethodDef(ShadeModel), - MethodDef(StencilFunc), - MethodDef(StencilMask), - MethodDef(StencilOp), - MethodDef(TexCoord1d), - MethodDef(TexCoord1dv), - MethodDef(TexCoord1f), - MethodDef(TexCoord1fv), - MethodDef(TexCoord1i), - MethodDef(TexCoord1iv), - MethodDef(TexCoord1s), - MethodDef(TexCoord1sv), - MethodDef(TexCoord2d), - MethodDef(TexCoord2dv), - MethodDef(TexCoord2f), - MethodDef(TexCoord2fv), - MethodDef(TexCoord2i), - MethodDef(TexCoord2iv), - MethodDef(TexCoord2s), - MethodDef(TexCoord2sv), - MethodDef(TexCoord3d), - MethodDef(TexCoord3dv), - MethodDef(TexCoord3f), - MethodDef(TexCoord3fv), - MethodDef(TexCoord3i), - MethodDef(TexCoord3iv), - MethodDef(TexCoord3s), - MethodDef(TexCoord3sv), - MethodDef(TexCoord4d), - MethodDef(TexCoord4dv), - MethodDef(TexCoord4f), - MethodDef(TexCoord4fv), - MethodDef(TexCoord4i), - MethodDef(TexCoord4iv), - MethodDef(TexCoord4s), - MethodDef(TexCoord4sv), - MethodDef(TexEnvf), - MethodDef(TexEnvfv), - MethodDef(TexEnvi), - MethodDef(TexEnviv), - MethodDef(TexGend), - MethodDef(TexGendv), - MethodDef(TexGenf), - MethodDef(TexGenfv), - MethodDef(TexGeni), - MethodDef(TexGeniv), - MethodDef(TexImage1D), - MethodDef(TexImage2D), - MethodDef(TexParameterf), - MethodDef(TexParameterfv), - MethodDef(TexParameteri), - MethodDef(TexParameteriv), - MethodDef(Translated), - MethodDef(Translatef), - MethodDef(Vertex2d), - MethodDef(Vertex2dv), - MethodDef(Vertex2f), - MethodDef(Vertex2fv), - MethodDef(Vertex2i), - MethodDef(Vertex2iv), - MethodDef(Vertex2s), - MethodDef(Vertex2sv), - MethodDef(Vertex3d), - MethodDef(Vertex3dv), - MethodDef(Vertex3f), - MethodDef(Vertex3fv), - MethodDef(Vertex3i), - MethodDef(Vertex3iv), - MethodDef(Vertex3s), - MethodDef(Vertex3sv), - MethodDef(Vertex4d), - MethodDef(Vertex4dv), - MethodDef(Vertex4f), - MethodDef(Vertex4fv), - MethodDef(Vertex4i), - MethodDef(Vertex4iv), - MethodDef(Vertex4s), - MethodDef(Vertex4sv), - MethodDef(Viewport), - MethodDefu(Perspective), - MethodDefu(LookAt), - MethodDefu(Ortho2D), - MethodDefu(PickMatrix), - MethodDefu(Project), - MethodDefu(UnProject), -/* #endif */ - {NULL, NULL, 0, NULL} -}; - -PyObject *BGL_Init(void) -{ - PyObject *mod= Py_InitModule("Blender.BGL", BGL_methods); - PyObject *dict= PyModule_GetDict(mod); - - if( PyType_Ready( &buffer_Type) < 0) - Py_RETURN_NONE; - -#define EXPP_ADDCONST(x) EXPP_dict_set_item_str(dict, #x, PyInt_FromLong(x)) - -/* So, for example: - * EXPP_ADDCONST(GL_CURRENT_BIT) becomes - * EXPP_dict_set_item_str(dict, "GL_CURRENT_BIT", PyInt_FromLong(GL_CURRENT_BIT)) */ - - EXPP_ADDCONST(GL_CURRENT_BIT); - EXPP_ADDCONST(GL_POINT_BIT); - EXPP_ADDCONST(GL_LINE_BIT); - EXPP_ADDCONST(GL_POLYGON_BIT); - EXPP_ADDCONST(GL_POLYGON_STIPPLE_BIT); - EXPP_ADDCONST(GL_PIXEL_MODE_BIT); - EXPP_ADDCONST(GL_LIGHTING_BIT); - EXPP_ADDCONST(GL_FOG_BIT); - EXPP_ADDCONST(GL_DEPTH_BUFFER_BIT); - EXPP_ADDCONST(GL_ACCUM_BUFFER_BIT); - EXPP_ADDCONST(GL_STENCIL_BUFFER_BIT); - EXPP_ADDCONST(GL_VIEWPORT_BIT); - EXPP_ADDCONST(GL_TRANSFORM_BIT); - EXPP_ADDCONST(GL_ENABLE_BIT); - EXPP_ADDCONST(GL_COLOR_BUFFER_BIT); - EXPP_ADDCONST(GL_HINT_BIT); - EXPP_ADDCONST(GL_EVAL_BIT); - EXPP_ADDCONST(GL_LIST_BIT); - EXPP_ADDCONST(GL_TEXTURE_BIT); - EXPP_ADDCONST(GL_SCISSOR_BIT); - EXPP_ADDCONST(GL_ALL_ATTRIB_BITS); - - EXPP_ADDCONST(GL_FALSE); - EXPP_ADDCONST(GL_TRUE); - - EXPP_ADDCONST(GL_POINTS); - EXPP_ADDCONST(GL_LINES); - EXPP_ADDCONST(GL_LINE_LOOP); - EXPP_ADDCONST(GL_LINE_STRIP); - EXPP_ADDCONST(GL_TRIANGLES); - EXPP_ADDCONST(GL_TRIANGLE_STRIP); - EXPP_ADDCONST(GL_TRIANGLE_FAN); - EXPP_ADDCONST(GL_QUADS); - EXPP_ADDCONST(GL_QUAD_STRIP); - EXPP_ADDCONST(GL_POLYGON); - - EXPP_ADDCONST(GL_ACCUM); - EXPP_ADDCONST(GL_LOAD); - EXPP_ADDCONST(GL_RETURN); - EXPP_ADDCONST(GL_MULT); - EXPP_ADDCONST(GL_ADD); - - EXPP_ADDCONST(GL_NEVER); - EXPP_ADDCONST(GL_LESS); - EXPP_ADDCONST(GL_EQUAL); - EXPP_ADDCONST(GL_LEQUAL); - EXPP_ADDCONST(GL_GREATER); - EXPP_ADDCONST(GL_NOTEQUAL); - EXPP_ADDCONST(GL_GEQUAL); - EXPP_ADDCONST(GL_ALWAYS); - - EXPP_ADDCONST(GL_ZERO); - EXPP_ADDCONST(GL_ONE); - EXPP_ADDCONST(GL_SRC_COLOR); - EXPP_ADDCONST(GL_ONE_MINUS_SRC_COLOR); - EXPP_ADDCONST(GL_SRC_ALPHA); - EXPP_ADDCONST(GL_ONE_MINUS_SRC_ALPHA); - EXPP_ADDCONST(GL_DST_ALPHA); - EXPP_ADDCONST(GL_ONE_MINUS_DST_ALPHA); - - EXPP_ADDCONST(GL_DST_COLOR); - EXPP_ADDCONST(GL_ONE_MINUS_DST_COLOR); - EXPP_ADDCONST(GL_SRC_ALPHA_SATURATE); - - EXPP_ADDCONST(GL_NONE); - EXPP_ADDCONST(GL_FRONT_LEFT); - EXPP_ADDCONST(GL_FRONT_RIGHT); - EXPP_ADDCONST(GL_BACK_LEFT); - EXPP_ADDCONST(GL_BACK_RIGHT); - EXPP_ADDCONST(GL_FRONT); - EXPP_ADDCONST(GL_BACK); - EXPP_ADDCONST(GL_LEFT); - EXPP_ADDCONST(GL_RIGHT); - EXPP_ADDCONST(GL_FRONT_AND_BACK); - EXPP_ADDCONST(GL_AUX0); - EXPP_ADDCONST(GL_AUX1); - EXPP_ADDCONST(GL_AUX2); - EXPP_ADDCONST(GL_AUX3); - - EXPP_ADDCONST(GL_NO_ERROR); - EXPP_ADDCONST(GL_INVALID_ENUM); - EXPP_ADDCONST(GL_INVALID_VALUE); - EXPP_ADDCONST(GL_INVALID_OPERATION); - EXPP_ADDCONST(GL_STACK_OVERFLOW); - EXPP_ADDCONST(GL_STACK_UNDERFLOW); - EXPP_ADDCONST(GL_OUT_OF_MEMORY); - - EXPP_ADDCONST(GL_2D); - EXPP_ADDCONST(GL_3D); - EXPP_ADDCONST(GL_3D_COLOR); - EXPP_ADDCONST(GL_3D_COLOR_TEXTURE); - EXPP_ADDCONST(GL_4D_COLOR_TEXTURE); - - EXPP_ADDCONST(GL_PASS_THROUGH_TOKEN); - EXPP_ADDCONST(GL_POINT_TOKEN); - EXPP_ADDCONST(GL_LINE_TOKEN); - EXPP_ADDCONST(GL_POLYGON_TOKEN); - EXPP_ADDCONST(GL_BITMAP_TOKEN); - EXPP_ADDCONST(GL_DRAW_PIXEL_TOKEN); - EXPP_ADDCONST(GL_COPY_PIXEL_TOKEN); - EXPP_ADDCONST(GL_LINE_RESET_TOKEN); - - EXPP_ADDCONST(GL_EXP); - EXPP_ADDCONST(GL_EXP2); - - EXPP_ADDCONST(GL_CW); - EXPP_ADDCONST(GL_CCW); - - EXPP_ADDCONST(GL_COEFF); - EXPP_ADDCONST(GL_ORDER); - EXPP_ADDCONST(GL_DOMAIN); - - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_I); - EXPP_ADDCONST(GL_PIXEL_MAP_S_TO_S); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_R); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_G); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_B); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_A); - EXPP_ADDCONST(GL_PIXEL_MAP_R_TO_R); - EXPP_ADDCONST(GL_PIXEL_MAP_G_TO_G); - EXPP_ADDCONST(GL_PIXEL_MAP_B_TO_B); - EXPP_ADDCONST(GL_PIXEL_MAP_A_TO_A); - - EXPP_ADDCONST(GL_CURRENT_COLOR); - EXPP_ADDCONST(GL_CURRENT_INDEX); - EXPP_ADDCONST(GL_CURRENT_NORMAL); - EXPP_ADDCONST(GL_CURRENT_TEXTURE_COORDS); - EXPP_ADDCONST(GL_CURRENT_RASTER_COLOR); - EXPP_ADDCONST(GL_CURRENT_RASTER_INDEX); - EXPP_ADDCONST(GL_CURRENT_RASTER_TEXTURE_COORDS); - EXPP_ADDCONST(GL_CURRENT_RASTER_POSITION); - EXPP_ADDCONST(GL_CURRENT_RASTER_POSITION_VALID); - EXPP_ADDCONST(GL_CURRENT_RASTER_DISTANCE); - EXPP_ADDCONST(GL_POINT_SMOOTH); - EXPP_ADDCONST(GL_POINT_SIZE); - EXPP_ADDCONST(GL_POINT_SIZE_RANGE); - EXPP_ADDCONST(GL_POINT_SIZE_GRANULARITY); - EXPP_ADDCONST(GL_LINE_SMOOTH); - EXPP_ADDCONST(GL_LINE_WIDTH); - EXPP_ADDCONST(GL_LINE_WIDTH_RANGE); - EXPP_ADDCONST(GL_LINE_WIDTH_GRANULARITY); - EXPP_ADDCONST(GL_LINE_STIPPLE); - EXPP_ADDCONST(GL_LINE_STIPPLE_PATTERN); - EXPP_ADDCONST(GL_LINE_STIPPLE_REPEAT); - EXPP_ADDCONST(GL_LIST_MODE); - EXPP_ADDCONST(GL_MAX_LIST_NESTING); - EXPP_ADDCONST(GL_LIST_BASE); - EXPP_ADDCONST(GL_LIST_INDEX); - EXPP_ADDCONST(GL_POLYGON_MODE); - EXPP_ADDCONST(GL_POLYGON_SMOOTH); - EXPP_ADDCONST(GL_POLYGON_STIPPLE); - EXPP_ADDCONST(GL_EDGE_FLAG); - EXPP_ADDCONST(GL_CULL_FACE); - EXPP_ADDCONST(GL_CULL_FACE_MODE); - EXPP_ADDCONST(GL_FRONT_FACE); - EXPP_ADDCONST(GL_LIGHTING); - EXPP_ADDCONST(GL_LIGHT_MODEL_LOCAL_VIEWER); - EXPP_ADDCONST(GL_LIGHT_MODEL_TWO_SIDE); - EXPP_ADDCONST(GL_LIGHT_MODEL_AMBIENT); - EXPP_ADDCONST(GL_SHADE_MODEL); - EXPP_ADDCONST(GL_COLOR_MATERIAL_FACE); - EXPP_ADDCONST(GL_COLOR_MATERIAL_PARAMETER); - EXPP_ADDCONST(GL_COLOR_MATERIAL); - EXPP_ADDCONST(GL_FOG); - EXPP_ADDCONST(GL_FOG_INDEX); - EXPP_ADDCONST(GL_FOG_DENSITY); - EXPP_ADDCONST(GL_FOG_START); - EXPP_ADDCONST(GL_FOG_END); - EXPP_ADDCONST(GL_FOG_MODE); - EXPP_ADDCONST(GL_FOG_COLOR); - EXPP_ADDCONST(GL_DEPTH_RANGE); - EXPP_ADDCONST(GL_DEPTH_TEST); - EXPP_ADDCONST(GL_DEPTH_WRITEMASK); - EXPP_ADDCONST(GL_DEPTH_CLEAR_VALUE); - EXPP_ADDCONST(GL_DEPTH_FUNC); - EXPP_ADDCONST(GL_ACCUM_CLEAR_VALUE); - EXPP_ADDCONST(GL_STENCIL_TEST); - EXPP_ADDCONST(GL_STENCIL_CLEAR_VALUE); - EXPP_ADDCONST(GL_STENCIL_FUNC); - EXPP_ADDCONST(GL_STENCIL_VALUE_MASK); - EXPP_ADDCONST(GL_STENCIL_FAIL); - EXPP_ADDCONST(GL_STENCIL_PASS_DEPTH_FAIL); - EXPP_ADDCONST(GL_STENCIL_PASS_DEPTH_PASS); - EXPP_ADDCONST(GL_STENCIL_REF); - EXPP_ADDCONST(GL_STENCIL_WRITEMASK); - EXPP_ADDCONST(GL_MATRIX_MODE); - EXPP_ADDCONST(GL_NORMALIZE); - EXPP_ADDCONST(GL_VIEWPORT); - EXPP_ADDCONST(GL_MODELVIEW_STACK_DEPTH); - EXPP_ADDCONST(GL_PROJECTION_STACK_DEPTH); - EXPP_ADDCONST(GL_TEXTURE_STACK_DEPTH); - EXPP_ADDCONST(GL_MODELVIEW_MATRIX); - EXPP_ADDCONST(GL_PROJECTION_MATRIX); - EXPP_ADDCONST(GL_TEXTURE_MATRIX); - EXPP_ADDCONST(GL_ATTRIB_STACK_DEPTH); - EXPP_ADDCONST(GL_ALPHA_TEST); - EXPP_ADDCONST(GL_ALPHA_TEST_FUNC); - EXPP_ADDCONST(GL_ALPHA_TEST_REF); - EXPP_ADDCONST(GL_DITHER); - EXPP_ADDCONST(GL_BLEND_DST); - EXPP_ADDCONST(GL_BLEND_SRC); - EXPP_ADDCONST(GL_BLEND); - EXPP_ADDCONST(GL_LOGIC_OP_MODE); - EXPP_ADDCONST(GL_LOGIC_OP); - EXPP_ADDCONST(GL_AUX_BUFFERS); - EXPP_ADDCONST(GL_DRAW_BUFFER); - EXPP_ADDCONST(GL_READ_BUFFER); - EXPP_ADDCONST(GL_SCISSOR_BOX); - EXPP_ADDCONST(GL_SCISSOR_TEST); - EXPP_ADDCONST(GL_INDEX_CLEAR_VALUE); - EXPP_ADDCONST(GL_INDEX_WRITEMASK); - EXPP_ADDCONST(GL_COLOR_CLEAR_VALUE); - EXPP_ADDCONST(GL_COLOR_WRITEMASK); - EXPP_ADDCONST(GL_INDEX_MODE); - EXPP_ADDCONST(GL_RGBA_MODE); - EXPP_ADDCONST(GL_DOUBLEBUFFER); - EXPP_ADDCONST(GL_STEREO); - EXPP_ADDCONST(GL_RENDER_MODE); - EXPP_ADDCONST(GL_PERSPECTIVE_CORRECTION_HINT); - EXPP_ADDCONST(GL_POINT_SMOOTH_HINT); - EXPP_ADDCONST(GL_LINE_SMOOTH_HINT); - EXPP_ADDCONST(GL_POLYGON_SMOOTH_HINT); - EXPP_ADDCONST(GL_FOG_HINT); - EXPP_ADDCONST(GL_TEXTURE_GEN_S); - EXPP_ADDCONST(GL_TEXTURE_GEN_T); - EXPP_ADDCONST(GL_TEXTURE_GEN_R); - EXPP_ADDCONST(GL_TEXTURE_GEN_Q); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_I_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_S_TO_S_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_R_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_G_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_B_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_A_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_R_TO_R_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_G_TO_G_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_B_TO_B_SIZE); - EXPP_ADDCONST(GL_PIXEL_MAP_A_TO_A_SIZE); - EXPP_ADDCONST(GL_UNPACK_SWAP_BYTES); - EXPP_ADDCONST(GL_UNPACK_LSB_FIRST); - EXPP_ADDCONST(GL_UNPACK_ROW_LENGTH); - EXPP_ADDCONST(GL_UNPACK_SKIP_ROWS); - EXPP_ADDCONST(GL_UNPACK_SKIP_PIXELS); - EXPP_ADDCONST(GL_UNPACK_ALIGNMENT); - EXPP_ADDCONST(GL_PACK_SWAP_BYTES); - EXPP_ADDCONST(GL_PACK_LSB_FIRST); - EXPP_ADDCONST(GL_PACK_ROW_LENGTH); - EXPP_ADDCONST(GL_PACK_SKIP_ROWS); - EXPP_ADDCONST(GL_PACK_SKIP_PIXELS); - EXPP_ADDCONST(GL_PACK_ALIGNMENT); - EXPP_ADDCONST(GL_MAP_COLOR); - EXPP_ADDCONST(GL_MAP_STENCIL); - EXPP_ADDCONST(GL_INDEX_SHIFT); - EXPP_ADDCONST(GL_INDEX_OFFSET); - EXPP_ADDCONST(GL_RED_SCALE); - EXPP_ADDCONST(GL_RED_BIAS); - EXPP_ADDCONST(GL_ZOOM_X); - EXPP_ADDCONST(GL_ZOOM_Y); - EXPP_ADDCONST(GL_GREEN_SCALE); - EXPP_ADDCONST(GL_GREEN_BIAS); - EXPP_ADDCONST(GL_BLUE_SCALE); - EXPP_ADDCONST(GL_BLUE_BIAS); - EXPP_ADDCONST(GL_ALPHA_SCALE); - EXPP_ADDCONST(GL_ALPHA_BIAS); - EXPP_ADDCONST(GL_DEPTH_SCALE); - EXPP_ADDCONST(GL_DEPTH_BIAS); - EXPP_ADDCONST(GL_MAX_EVAL_ORDER); - EXPP_ADDCONST(GL_MAX_LIGHTS); - EXPP_ADDCONST(GL_MAX_CLIP_PLANES); - EXPP_ADDCONST(GL_MAX_TEXTURE_SIZE); - EXPP_ADDCONST(GL_MAX_PIXEL_MAP_TABLE); - EXPP_ADDCONST(GL_MAX_ATTRIB_STACK_DEPTH); - EXPP_ADDCONST(GL_MAX_MODELVIEW_STACK_DEPTH); - EXPP_ADDCONST(GL_MAX_NAME_STACK_DEPTH); - EXPP_ADDCONST(GL_MAX_PROJECTION_STACK_DEPTH); - EXPP_ADDCONST(GL_MAX_TEXTURE_STACK_DEPTH); - EXPP_ADDCONST(GL_MAX_VIEWPORT_DIMS); - EXPP_ADDCONST(GL_SUBPIXEL_BITS); - EXPP_ADDCONST(GL_INDEX_BITS); - EXPP_ADDCONST(GL_RED_BITS); - EXPP_ADDCONST(GL_GREEN_BITS); - EXPP_ADDCONST(GL_BLUE_BITS); - EXPP_ADDCONST(GL_ALPHA_BITS); - EXPP_ADDCONST(GL_DEPTH_BITS); - EXPP_ADDCONST(GL_STENCIL_BITS); - EXPP_ADDCONST(GL_ACCUM_RED_BITS); - EXPP_ADDCONST(GL_ACCUM_GREEN_BITS); - EXPP_ADDCONST(GL_ACCUM_BLUE_BITS); - EXPP_ADDCONST(GL_ACCUM_ALPHA_BITS); - EXPP_ADDCONST(GL_NAME_STACK_DEPTH); - EXPP_ADDCONST(GL_AUTO_NORMAL); - EXPP_ADDCONST(GL_MAP1_COLOR_4); - EXPP_ADDCONST(GL_MAP1_INDEX); - EXPP_ADDCONST(GL_MAP1_NORMAL); - EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_1); - EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_2); - EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_3); - EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_4); - EXPP_ADDCONST(GL_MAP1_VERTEX_3); - EXPP_ADDCONST(GL_MAP1_VERTEX_4); - EXPP_ADDCONST(GL_MAP2_COLOR_4); - EXPP_ADDCONST(GL_MAP2_INDEX); - EXPP_ADDCONST(GL_MAP2_NORMAL); - EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_1); - EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_2); - EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_3); - EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_4); - EXPP_ADDCONST(GL_MAP2_VERTEX_3); - EXPP_ADDCONST(GL_MAP2_VERTEX_4); - EXPP_ADDCONST(GL_MAP1_GRID_DOMAIN); - EXPP_ADDCONST(GL_MAP1_GRID_SEGMENTS); - EXPP_ADDCONST(GL_MAP2_GRID_DOMAIN); - EXPP_ADDCONST(GL_MAP2_GRID_SEGMENTS); - EXPP_ADDCONST(GL_TEXTURE_1D); - EXPP_ADDCONST(GL_TEXTURE_2D); - - EXPP_ADDCONST(GL_TEXTURE_WIDTH); - EXPP_ADDCONST(GL_TEXTURE_HEIGHT); - EXPP_ADDCONST(GL_TEXTURE_COMPONENTS); - EXPP_ADDCONST(GL_TEXTURE_BORDER_COLOR); - EXPP_ADDCONST(GL_TEXTURE_BORDER); - - EXPP_ADDCONST(GL_DONT_CARE); - EXPP_ADDCONST(GL_FASTEST); - EXPP_ADDCONST(GL_NICEST); - - EXPP_ADDCONST(GL_AMBIENT); - EXPP_ADDCONST(GL_DIFFUSE); - EXPP_ADDCONST(GL_SPECULAR); - EXPP_ADDCONST(GL_POSITION); - EXPP_ADDCONST(GL_SPOT_DIRECTION); - EXPP_ADDCONST(GL_SPOT_EXPONENT); - EXPP_ADDCONST(GL_SPOT_CUTOFF); - EXPP_ADDCONST(GL_CONSTANT_ATTENUATION); - EXPP_ADDCONST(GL_LINEAR_ATTENUATION); - EXPP_ADDCONST(GL_QUADRATIC_ATTENUATION); - - EXPP_ADDCONST(GL_COMPILE); - EXPP_ADDCONST(GL_COMPILE_AND_EXECUTE); - - EXPP_ADDCONST(GL_BYTE); - EXPP_ADDCONST(GL_UNSIGNED_BYTE); - EXPP_ADDCONST(GL_SHORT); - EXPP_ADDCONST(GL_UNSIGNED_SHORT); - EXPP_ADDCONST(GL_INT); - EXPP_ADDCONST(GL_UNSIGNED_INT); - EXPP_ADDCONST(GL_FLOAT); - EXPP_ADDCONST(GL_DOUBLE); - EXPP_ADDCONST(GL_2_BYTES); - EXPP_ADDCONST(GL_3_BYTES); - EXPP_ADDCONST(GL_4_BYTES); - - EXPP_ADDCONST(GL_CLEAR); - EXPP_ADDCONST(GL_AND); - EXPP_ADDCONST(GL_AND_REVERSE); - EXPP_ADDCONST(GL_COPY); - EXPP_ADDCONST(GL_AND_INVERTED); - EXPP_ADDCONST(GL_NOOP); - EXPP_ADDCONST(GL_XOR); - EXPP_ADDCONST(GL_OR); - EXPP_ADDCONST(GL_NOR); - EXPP_ADDCONST(GL_EQUIV); - EXPP_ADDCONST(GL_INVERT); - EXPP_ADDCONST(GL_OR_REVERSE); - EXPP_ADDCONST(GL_COPY_INVERTED); - EXPP_ADDCONST(GL_OR_INVERTED); - EXPP_ADDCONST(GL_NAND); - EXPP_ADDCONST(GL_SET); - - EXPP_ADDCONST(GL_EMISSION); - EXPP_ADDCONST(GL_SHININESS); - EXPP_ADDCONST(GL_AMBIENT_AND_DIFFUSE); - EXPP_ADDCONST(GL_COLOR_INDEXES); - - EXPP_ADDCONST(GL_MODELVIEW); - EXPP_ADDCONST(GL_PROJECTION); - EXPP_ADDCONST(GL_TEXTURE); - - EXPP_ADDCONST(GL_COLOR); - EXPP_ADDCONST(GL_DEPTH); - EXPP_ADDCONST(GL_STENCIL); - - EXPP_ADDCONST(GL_COLOR_INDEX); - EXPP_ADDCONST(GL_STENCIL_INDEX); - EXPP_ADDCONST(GL_DEPTH_COMPONENT); - EXPP_ADDCONST(GL_RED); - EXPP_ADDCONST(GL_GREEN); - EXPP_ADDCONST(GL_BLUE); - EXPP_ADDCONST(GL_ALPHA); - EXPP_ADDCONST(GL_RGB); - EXPP_ADDCONST(GL_RGBA); - EXPP_ADDCONST(GL_LUMINANCE); - EXPP_ADDCONST(GL_LUMINANCE_ALPHA); - - EXPP_ADDCONST(GL_BITMAP); - - EXPP_ADDCONST(GL_POINT); - EXPP_ADDCONST(GL_LINE); - EXPP_ADDCONST(GL_FILL); - - EXPP_ADDCONST(GL_RENDER); - EXPP_ADDCONST(GL_FEEDBACK); - EXPP_ADDCONST(GL_SELECT); - - EXPP_ADDCONST(GL_FLAT); - EXPP_ADDCONST(GL_SMOOTH); - - EXPP_ADDCONST(GL_KEEP); - EXPP_ADDCONST(GL_REPLACE); - EXPP_ADDCONST(GL_INCR); - EXPP_ADDCONST(GL_DECR); - - EXPP_ADDCONST(GL_VENDOR); - EXPP_ADDCONST(GL_RENDERER); - EXPP_ADDCONST(GL_VERSION); - EXPP_ADDCONST(GL_EXTENSIONS); - - EXPP_ADDCONST(GL_S); - EXPP_ADDCONST(GL_T); - EXPP_ADDCONST(GL_R); - EXPP_ADDCONST(GL_Q); - - EXPP_ADDCONST(GL_MODULATE); - EXPP_ADDCONST(GL_DECAL); - - EXPP_ADDCONST(GL_TEXTURE_ENV_MODE); - EXPP_ADDCONST(GL_TEXTURE_ENV_COLOR); - - EXPP_ADDCONST(GL_TEXTURE_ENV); - - EXPP_ADDCONST(GL_EYE_LINEAR); - EXPP_ADDCONST(GL_OBJECT_LINEAR); - EXPP_ADDCONST(GL_SPHERE_MAP); - - EXPP_ADDCONST(GL_TEXTURE_GEN_MODE); - EXPP_ADDCONST(GL_OBJECT_PLANE); - EXPP_ADDCONST(GL_EYE_PLANE); - - EXPP_ADDCONST(GL_NEAREST); - EXPP_ADDCONST(GL_LINEAR); - - EXPP_ADDCONST(GL_NEAREST_MIPMAP_NEAREST); - EXPP_ADDCONST(GL_LINEAR_MIPMAP_NEAREST); - EXPP_ADDCONST(GL_NEAREST_MIPMAP_LINEAR); - EXPP_ADDCONST(GL_LINEAR_MIPMAP_LINEAR); - - EXPP_ADDCONST(GL_TEXTURE_MAG_FILTER); - EXPP_ADDCONST(GL_TEXTURE_MIN_FILTER); - EXPP_ADDCONST(GL_TEXTURE_WRAP_S); - EXPP_ADDCONST(GL_TEXTURE_WRAP_T); - - EXPP_ADDCONST(GL_CLAMP); - EXPP_ADDCONST(GL_REPEAT); - - EXPP_ADDCONST(GL_CLIP_PLANE0); - EXPP_ADDCONST(GL_CLIP_PLANE1); - EXPP_ADDCONST(GL_CLIP_PLANE2); - EXPP_ADDCONST(GL_CLIP_PLANE3); - EXPP_ADDCONST(GL_CLIP_PLANE4); - EXPP_ADDCONST(GL_CLIP_PLANE5); - - EXPP_ADDCONST(GL_LIGHT0); - EXPP_ADDCONST(GL_LIGHT1); - EXPP_ADDCONST(GL_LIGHT2); - EXPP_ADDCONST(GL_LIGHT3); - EXPP_ADDCONST(GL_LIGHT4); - EXPP_ADDCONST(GL_LIGHT5); - EXPP_ADDCONST(GL_LIGHT6); - EXPP_ADDCONST(GL_LIGHT7); - - EXPP_ADDCONST(GL_POLYGON_OFFSET_UNITS); - EXPP_ADDCONST(GL_POLYGON_OFFSET_POINT); - EXPP_ADDCONST(GL_POLYGON_OFFSET_LINE); - EXPP_ADDCONST(GL_POLYGON_OFFSET_FILL); - EXPP_ADDCONST(GL_POLYGON_OFFSET_FACTOR); - - EXPP_ADDCONST(GL_TEXTURE_PRIORITY); - EXPP_ADDCONST(GL_TEXTURE_RESIDENT); - EXPP_ADDCONST(GL_TEXTURE_BINDING_1D); - EXPP_ADDCONST(GL_TEXTURE_BINDING_2D); - - return mod; -} - diff --git a/source/blender/python/api2_2x/BGL.h b/source/blender/python/api2_2x/BGL.h deleted file mode 100644 index f8dea726d73..00000000000 --- a/source/blender/python/api2_2x/BGL.h +++ /dev/null @@ -1,333 +0,0 @@ -/* - * $Id: BGL.h 5407 2005-10-02 17:09:11Z zuster $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* This is the Blender.BGL part of opy_draw.c, from the old bpython/intern - * dir, with minor changes to adapt it to the new Python implementation. - * The BGL submodule "wraps" OpenGL functions and constants, allowing script - * writers to make OpenGL calls in their Python scripts for Blender. The - * more important original comments are marked with an @ symbol. */ - -#ifndef EXPP_BGL_H -#define EXPP_BGL_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include "BIF_gl.h" - - -/*@ Buffer Object */ -/*@ For Python access to OpenGL functions requiring a pointer. */ - -typedef struct _Buffer { - PyObject_VAR_HEAD - PyObject * parent; - - int type; /* GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT */ - int ndimensions; - int *dimensions; - - union { - char *asbyte; - short *asshort; - int *asint; - float *asfloat; - double *asdouble; - - void *asvoid; - } buf; -} Buffer; - - -/*@ By golly George! It looks like fancy pants macro time!!! */ - -/* -#define int_str "i" -#define int_var(number) bgl_int##number -#define int_ref(number) &bgl_int##number -#define int_def(number) int int_var(number) - -#define float_str "f" -#define float_var(number) bgl_float##number -#define float_ref(number) &bgl_float##number -#define float_def(number) float float_var(number) -*/ - -/* TYPE_str is the string to pass to Py_ArgParse (for the format) */ -/* TYPE_var is the name to pass to the GL function */ -/* TYPE_ref is the pointer to pass to Py_ArgParse (to store in) */ -/* TYPE_def is the C initialization of the variable */ - -#define void_str "" -#define void_var(num) -#define void_ref(num) &bgl_var##num -#define void_def(num) char bgl_var##num - -#define buffer_str "O!" -#define buffer_var(number) (bgl_buffer##number)->buf.asvoid -#define buffer_ref(number) &buffer_Type, &bgl_buffer##number -#define buffer_def(number) Buffer *bgl_buffer##number - -/* GL Pointer fields, handled by buffer type */ -/* GLdoubleP, GLfloatP, GLintP, GLuintP, GLshortP */ - -#define GLbooleanP_str "O!" -#define GLbooleanP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLbooleanP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLbooleanP_def(number) Buffer *bgl_buffer##number - -#define GLbyteP_str "O!" -#define GLbyteP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLbyteP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLbyteP_def(number) Buffer *bgl_buffer##number - -#define GLubyteP_str "O!" -#define GLubyteP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLubyteP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLubyteP_def(number) Buffer *bgl_buffer##number - -#define GLintP_str "O!" -#define GLintP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLintP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLintP_def(number) Buffer *bgl_buffer##number - -#define GLuintP_str "O!" -#define GLuintP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLuintP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLuintP_def(number) Buffer *bgl_buffer##number - -#define GLshortP_str "O!" -#define GLshortP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLshortP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLshortP_def(number) Buffer *bgl_buffer##number - -#define GLushortP_str "O!" -#define GLushortP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLushortP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLushortP_def(number) Buffer *bgl_buffer##number - -#define GLfloatP_str "O!" -#define GLfloatP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLfloatP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLfloatP_def(number) Buffer *bgl_buffer##number - -#define GLdoubleP_str "O!" -#define GLdoubleP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLdoubleP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLdoubleP_def(number) Buffer *bgl_buffer##number - -#define GLclampfP_str "O!" -#define GLclampfP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLclampfP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLclampfP_def(number) Buffer *bgl_buffer##number - -#define GLvoidP_str "O!" -#define GLvoidP_var(number) (bgl_buffer##number)->buf.asvoid -#define GLvoidP_ref(number) &buffer_Type, &bgl_buffer##number -#define GLvoidP_def(number) Buffer *bgl_buffer##number - -#define buffer_str "O!" -#define buffer_var(number) (bgl_buffer##number)->buf.asvoid -#define buffer_ref(number) &buffer_Type, &bgl_buffer##number -#define buffer_def(number) Buffer *bgl_buffer##number - -/*@The standard GL typedefs are used as prototypes, we can't - * use the GL type directly because Py_ArgParse expects normal - * C types. - * - * Py_ArgParse doesn't grok writing into unsigned variables, - * so we use signed everything (even stuff that should be unsigned. - */ - -/* typedef unsigned int GLenum; */ -#define GLenum_str "i" -#define GLenum_var(num) bgl_var##num -#define GLenum_ref(num) &bgl_var##num -#define GLenum_def(num) /* unsigned */ int GLenum_var(num) - -/* typedef unsigned int GLboolean; */ -#define GLboolean_str "b" -#define GLboolean_var(num) bgl_var##num -#define GLboolean_ref(num) &bgl_var##num -#define GLboolean_def(num) /* unsigned */ char GLboolean_var(num) - -/* typedef unsigned int GLbitfield; */ -#define GLbitfield_str "i" -#define GLbitfield_var(num) bgl_var##num -#define GLbitfield_ref(num) &bgl_var##num -#define GLbitfield_def(num) /* unsigned */ int GLbitfield_var(num) - -/* typedef signed char GLbyte; */ -#define GLbyte_str "b" -#define GLbyte_var(num) bgl_var##num -#define GLbyte_ref(num) &bgl_var##num -#define GLbyte_def(num) signed char GLbyte_var(num) - -/* typedef short GLshort; */ -#define GLshort_str "h" -#define GLshort_var(num) bgl_var##num -#define GLshort_ref(num) &bgl_var##num -#define GLshort_def(num) short GLshort_var(num) - -/* typedef int GLint; */ -#define GLint_str "i" -#define GLint_var(num) bgl_var##num -#define GLint_ref(num) &bgl_var##num -#define GLint_def(num) int GLint_var(num) - -/* typedef int GLsizei; */ -#define GLsizei_str "i" -#define GLsizei_var(num) bgl_var##num -#define GLsizei_ref(num) &bgl_var##num -#define GLsizei_def(num) int GLsizei_var(num) - -/* typedef unsigned char GLubyte; */ -#define GLubyte_str "b" -#define GLubyte_var(num) bgl_var##num -#define GLubyte_ref(num) &bgl_var##num -#define GLubyte_def(num) /* unsigned */ char GLubyte_var(num) - -/* typedef unsigned short GLushort; */ -#define GLushort_str "h" -#define GLushort_var(num) bgl_var##num -#define GLushort_ref(num) &bgl_var##num -#define GLushort_def(num) /* unsigned */ short GLushort_var(num) - -/* typedef unsigned int GLuint; */ -#define GLuint_str "i" -#define GLuint_var(num) bgl_var##num -#define GLuint_ref(num) &bgl_var##num -#define GLuint_def(num) /* unsigned */ int GLuint_var(num) - -/* typedef float GLfloat; */ -#define GLfloat_str "f" -#define GLfloat_var(num) bgl_var##num -#define GLfloat_ref(num) &bgl_var##num -#define GLfloat_def(num) float GLfloat_var(num) - -/* typedef float GLclampf; */ -#define GLclampf_str "f" -#define GLclampf_var(num) bgl_var##num -#define GLclampf_ref(num) &bgl_var##num -#define GLclampf_def(num) float GLclampf_var(num) - -/* typedef double GLdouble; */ -#define GLdouble_str "d" -#define GLdouble_var(num) bgl_var##num -#define GLdouble_ref(num) &bgl_var##num -#define GLdouble_def(num) double GLdouble_var(num) - -/* typedef double GLclampd; */ -#define GLclampd_str "d" -#define GLclampd_var(num) bgl_var##num -#define GLclampd_ref(num) &bgl_var##num -#define GLclampd_def(num) double GLclampd_var(num) - -/* typedef void GLvoid; */ -/* #define GLvoid_str "" */ -/* #define GLvoid_var(num) bgl_var##num */ -/* #define GLvoid_ref(num) &bgl_var##num */ -/* #define GLvoid_def(num) char bgl_var##num */ - -#define arg_def1(a1) a1##_def(1) -#define arg_def2(a1, a2) arg_def1(a1); a2##_def(2) -#define arg_def3(a1, a2, a3) arg_def2(a1, a2); a3##_def(3) -#define arg_def4(a1, a2, a3, a4) arg_def3(a1, a2, a3); a4##_def(4) -#define arg_def5(a1, a2, a3, a4, a5) arg_def4(a1, a2, a3, a4); a5##_def(5) -#define arg_def6(a1, a2, a3, a4, a5, a6)arg_def5(a1, a2, a3, a4, a5); a6##_def(6) -#define arg_def7(a1, a2, a3, a4, a5, a6, a7)arg_def6(a1, a2, a3, a4, a5, a6); a7##_def(7) -#define arg_def8(a1, a2, a3, a4, a5, a6, a7, a8)arg_def7(a1, a2, a3, a4, a5, a6, a7); a8##_def(8) -#define arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_def8(a1, a2, a3, a4, a5, a6, a7, a8); a9##_def(9) -#define arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9); a10##_def(10) - -#define arg_var1(a1) a1##_var(1) -#define arg_var2(a1, a2) arg_var1(a1), a2##_var(2) -#define arg_var3(a1, a2, a3) arg_var2(a1, a2), a3##_var(3) -#define arg_var4(a1, a2, a3, a4) arg_var3(a1, a2, a3), a4##_var(4) -#define arg_var5(a1, a2, a3, a4, a5) arg_var4(a1, a2, a3, a4), a5##_var(5) -#define arg_var6(a1, a2, a3, a4, a5, a6)arg_var5(a1, a2, a3, a4, a5), a6##_var(6) -#define arg_var7(a1, a2, a3, a4, a5, a6, a7)arg_var6(a1, a2, a3, a4, a5, a6), a7##_var(7) -#define arg_var8(a1, a2, a3, a4, a5, a6, a7, a8)arg_var7(a1, a2, a3, a4, a5, a6, a7), a8##_var(8) -#define arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_var8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_var(9) -#define arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_var(10) - -#define arg_ref1(a1) a1##_ref(1) -#define arg_ref2(a1, a2) arg_ref1(a1), a2##_ref(2) -#define arg_ref3(a1, a2, a3) arg_ref2(a1, a2), a3##_ref(3) -#define arg_ref4(a1, a2, a3, a4) arg_ref3(a1, a2, a3), a4##_ref(4) -#define arg_ref5(a1, a2, a3, a4, a5) arg_ref4(a1, a2, a3, a4), a5##_ref(5) -#define arg_ref6(a1, a2, a3, a4, a5, a6)arg_ref5(a1, a2, a3, a4, a5), a6##_ref(6) -#define arg_ref7(a1, a2, a3, a4, a5, a6, a7)arg_ref6(a1, a2, a3, a4, a5, a6), a7##_ref(7) -#define arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8)arg_ref7(a1, a2, a3, a4, a5, a6, a7), a8##_ref(8) -#define arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_ref(9) -#define arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_ref(10) - -#define arg_str1(a1) a1##_str -#define arg_str2(a1, a2) arg_str1(a1) a2##_str -#define arg_str3(a1, a2, a3) arg_str2(a1, a2) a3##_str -#define arg_str4(a1, a2, a3, a4) arg_str3(a1, a2, a3) a4##_str -#define arg_str5(a1, a2, a3, a4, a5) arg_str4(a1, a2, a3, a4) a5##_str -#define arg_str6(a1, a2, a3, a4, a5, a6)arg_str5(a1, a2, a3, a4, a5) a6##_str -#define arg_str7(a1, a2, a3, a4, a5, a6, a7)arg_str6(a1, a2, a3, a4, a5, a6) a7##_str -#define arg_str8(a1, a2, a3, a4, a5, a6, a7, a8)arg_str7(a1, a2, a3, a4, a5, a6, a7) a8##_str -#define arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) a9##_str -#define arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) a10##_str - -#define ret_def_void -#define ret_set_void -#define ret_ret_void return EXPP_incr_ret(Py_None) - -#define ret_def_GLint int ret_int -#define ret_set_GLint ret_int= -#define ret_ret_GLint return PyInt_FromLong(ret_int); - -#define ret_def_GLuint unsigned int ret_uint -#define ret_set_GLuint ret_uint= -#define ret_ret_GLuint return PyInt_FromLong((long) ret_uint); - -#define ret_def_GLenum unsigned int ret_uint -#define ret_set_GLenum ret_uint= -#define ret_ret_GLenum return PyInt_FromLong((long) ret_uint); - -#define ret_def_GLboolean unsigned char ret_bool -#define ret_set_GLboolean ret_bool= -#define ret_ret_GLboolean return PyInt_FromLong((long) ret_bool); - -#define ret_def_GLstring const unsigned char *ret_str; -#define ret_set_GLstring ret_str= -#define ret_ret_GLstring return PyString_FromString(ret_str); - - - -#endif /* EXPP_BGL_H */ diff --git a/source/blender/python/api2_2x/BezTriple.c b/source/blender/python/api2_2x/BezTriple.c deleted file mode 100644 index e4a872c52c0..00000000000 --- a/source/blender/python/api2_2x/BezTriple.c +++ /dev/null @@ -1,716 +0,0 @@ -/* - * $Id: BezTriple.c 11241 2007-07-12 11:51:21Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot RIP 2005, - * Stephen Swaney, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "BezTriple.h" /*This must come first */ -#include "DNA_ipo_types.h" - -#include "MEM_guardedalloc.h" -#include "gen_utils.h" - - -/*************************************************************************** - Python API function prototypes for the BezTriple module. -***************************************************************************/ -static PyObject *M_BezTriple_New( PyObject * self, PyObject * args ); -static PyObject *M_BezTriple_Get( PyObject * self, PyObject * args ); - -/************************************* - Doc strings for the BezTriple module -*************************************/ - -static char M_BezTriple_doc[] = "The Blender BezTriple module\n"; - -/**************************************************************************** - Python BPy_BezTriple instance methods declarations: -****************************************************************************/ -static PyObject *BezTriple_oldsetPoints( BPy_BezTriple * self, PyObject * args ); -static int BezTriple_setPoints( BPy_BezTriple * self, PyObject * args ); -static PyObject *BezTriple_getPoints( BPy_BezTriple * self ); -static PyObject *BezTriple_getTriple( BPy_BezTriple * self ); - -/**************************************************************************** - Python method structure definition for Blender.BezTriple module: -****************************************************************************/ - -struct PyMethodDef M_BezTriple_methods[] = { - {"New", ( PyCFunction ) M_BezTriple_New, METH_VARARGS | METH_KEYWORDS, - 0}, -/* {"New", ( PyCFunction ) M_BezTriple_New, METH_O, 0}, */ - {"Get", M_BezTriple_Get, METH_VARARGS, 0}, - {"get", M_BezTriple_Get, METH_VARARGS, 0}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_BezTriple methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_BezTriple_methods[] = { - /* name, method, flags, doc */ - {"setPoints", ( PyCFunction ) BezTriple_oldsetPoints, METH_VARARGS, - "(str) - Change BezTriple point coordinates"}, - {"getPoints", ( PyCFunction ) BezTriple_getPoints, METH_NOARGS, - "() - return BezTriple knot point x and y coordinates"}, - {"getTriple", ( PyCFunction ) BezTriple_getTriple, METH_NOARGS, - "() - return list of 3 floating point triplets. order is H1, knot, H2"}, - {NULL, NULL, 0, NULL} -}; - -/**************************************************************************** - Function: M_BezTriple_New - Python equivalent: Blender.BezTriple.New -****************************************************************************/ - -static PyObject *M_BezTriple_New( PyObject* self, PyObject * args ) -{ - float numbuf[9]; - PyObject* in_args = NULL; - int length; - - /* accept list, tuple, or 3 or 9 args (which better be floats) */ - - length = PyTuple_Size( args ); - if( length == 3 || length == 9 ) - in_args = args; - else if( !PyArg_ParseTuple( args, "|O", &in_args) ) - goto TypeError; - - if( !in_args ) { - numbuf[0] = 0.0f; numbuf[1] = 0.0f; numbuf[2] = 0.0f; - numbuf[3] = 0.0f; numbuf[4] = 0.0f; numbuf[5] = 0.0f; - numbuf[6] = 0.0f; numbuf[7] = 0.0f; numbuf[8] = 0.0f; - } else { - int i, length; - if( !PySequence_Check( in_args ) ) - goto TypeError; - - length = PySequence_Length( in_args ); - if( length != 9 && length != 3 ) - goto TypeError; - - for( i = 0; i < length; i++ ) { - PyObject *item, *pyfloat; - item = PySequence_ITEM( in_args, i); - if( !item ) - goto TypeError; - pyfloat = PyNumber_Float( item ); - Py_DECREF( item ); - if( !pyfloat ) - goto TypeError; - numbuf[i] = ( float )PyFloat_AS_DOUBLE( pyfloat ); - Py_DECREF( pyfloat ); - } - - if( length == 3 ) { - numbuf[3] = numbuf[0]; numbuf[6] = numbuf[0]; - numbuf[4] = numbuf[1]; numbuf[7] = numbuf[1]; - numbuf[5] = numbuf[2]; numbuf[8] = numbuf[2]; - } - } - - return newBezTriple( numbuf ); - -TypeError: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected sequence of 3 or 9 floats or nothing" ); -} - -/**************************************************************************** - Function: M_BezTriple_Get - Python equivalent: Blender.BezTriple.Get - Description: Receives a string and returns the ipo data obj - whose name matches the string. If no argument is - passed in, a list of all ipo data names in the - current scene is returned. -****************************************************************************/ -static PyObject *M_BezTriple_Get( PyObject * self, PyObject * args ) -{ - return 0; -} - -/**************************************************************************** - Function: BezTriple_dealloc - Description: This is a callback function for the BPy_BezTriple type. It is - the destructor function. -****************************************************************************/ -static void BezTriple_dealloc( BPy_BezTriple * self ) -{ - if( self->own_memory) - MEM_freeN( self->beztriple ); - - PyObject_DEL( self ); -} - -/* - * BezTriple_getTriple - * - * Get the coordinate data for a BezTriple. Returns a list of 3 points. - * List order is handle1, knot, handle2. each point consists of a list - * of x,y,z float values. - */ - -static PyObject *BezTriple_getTriple( BPy_BezTriple * self ) -{ - BezTriple *bezt = self->beztriple; - return Py_BuildValue( "[[fff][fff][fff]]", - bezt->vec[0][0], bezt->vec[0][1], bezt->vec[0][2], - bezt->vec[1][0], bezt->vec[1][1], bezt->vec[1][2], - bezt->vec[2][0], bezt->vec[2][1], bezt->vec[2][2] ); -} - -/* - * BezTriple_setTriple - * - * Set the cordinate data for a BezTriple. Takes a sequence of 3 points, - * of the same format at BezTriple_getTriple. - */ - -static int BezTriple_setTriple( BPy_BezTriple * self, PyObject * args ) -{ - int i, j; - struct BezTriple *bezt = self->beztriple; - float vec[3][3]; - - if( !PySequence_Check( args ) || PySequence_Size( args ) != 3 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected three sequences of three floats" ); - - for( i = 0; i < 3; i++ ) { - PyObject *obj1 = PySequence_ITEM( args, i ); - if( !PySequence_Check( obj1 ) || PySequence_Size( obj1 ) != 3 ) { - Py_DECREF( obj1 ); - return EXPP_ReturnIntError( PyExc_TypeError, - "expected three sequences of three floats" ); - } - for( j = 0; j < 3; j++ ) { - PyObject *obj2 = PySequence_ITEM( obj1, j ); - PyObject *num = PyNumber_Float( obj2 ); - Py_DECREF( obj2 ); - - if( !num ) { - Py_DECREF( obj1 ); - return EXPP_ReturnIntError( PyExc_ValueError, - "expected float parameter" ); - } - vec[i][j] = ( float )PyFloat_AsDouble( num ); - Py_DECREF( num ); - } - Py_DECREF( obj1 ); - } - - for( i = 0; i < 3; i++ ) - for( j = 0; j < 3; j++ ) - bezt->vec[i][j] = vec[i][j]; - - return 0; -} - -/* - * BezTriple_getPoint - * - * Get the coordinate data for a BezTriple. Returns the control point, - * as a list of x,y float values. - */ - -static PyObject *BezTriple_getPoints( BPy_BezTriple * self ) -{ - BezTriple *bezt = self->beztriple; - return Py_BuildValue( "[ff]", bezt->vec[1][0], bezt->vec[1][1] ); -} - -/* - * BezTriple_setPoint - * - * Set the coordinate data for a BezTriple. Accepts the x,y for the control - * point and builds handle values based on control point. - */ - -static int BezTriple_setPoints( BPy_BezTriple * self, PyObject * args ) -{ - int i; - struct BezTriple *bezt = self->beztriple; - float vec[2]; - - if( !PySequence_Check( args ) || PySequence_Size( args ) != 2 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected sequence of two floats" ); - - for( i = 0; i < 2; i++ ) { - PyObject *obj = PySequence_ITEM( args, i ); - PyObject *num = PyNumber_Float( obj ); - Py_DECREF( obj ); - - if( !num ) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected float parameter" ); - vec[i] = ( float )PyFloat_AsDouble( num ); - Py_DECREF( num ); - } - - for( i = 0; i < 2; i++ ) { - bezt->vec[0][i] = vec[i] - 1; - bezt->vec[1][i] = vec[i]; - bezt->vec[2][i] = vec[i] + 1; - } - - /* experimental fussing with handles - ipo.c: calchandles_ipocurve */ - if( bezt->vec[0][0] > bezt->vec[1][0] ) - bezt->vec[0][0] = bezt->vec[1][0]; - - if( bezt->vec[2][0] < bezt->vec[1][0] ) - bezt->vec[2][0] = bezt->vec[1][0]; - - return 0; -} - -static PyObject *BezTriple_getTilt( BPy_BezTriple * self ) -{ - return PyFloat_FromDouble( self->beztriple->alfa ); -} - -static int BezTriple_setTilt( BPy_BezTriple * self, PyObject *value ) -{ - PyObject *num = PyNumber_Float( value ); - - if( !num ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected a float" ); - - self->beztriple->alfa = (float)PyFloat_AsDouble( num ); - Py_DECREF( num ); - return 0; -} - -static PyObject *BezTriple_getWeight( BPy_BezTriple * self ) -{ - return PyFloat_FromDouble( self->beztriple->weight ); -} - -static int BezTriple_setWeight( BPy_BezTriple * self, PyObject *value ) -{ - PyObject *num = PyNumber_Float( value ); - - if( !num ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected a float" ); - - self->beztriple->weight = (float)PyFloat_AsDouble( num ); - Py_DECREF( num ); - return 0; -} - -static PyObject *BezTriple_getRadius( BPy_BezTriple * self ) -{ - return PyFloat_FromDouble( self->beztriple->radius ); -} - -static int BezTriple_setRadius( BPy_BezTriple * self, PyObject *value ) -{ - PyObject *num = PyNumber_Float( value ); - - if( !num ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected a float" ); - - self->beztriple->radius = (float)PyFloat_AsDouble( num ); - Py_DECREF( num ); - return 0; -} - -static PyObject *BezTriple_getHide( BPy_BezTriple * self ) -{ - return PyInt_FromLong( self->beztriple->hide == IPO_BEZ ); -} - -static int BezTriple_setHide( BPy_BezTriple * self, PyObject *value ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) - self->beztriple->hide = IPO_BEZ; - else - self->beztriple->hide = 0; - return 0; -} - -static PyObject *BezTriple_getSelects( BPy_BezTriple * self ) -{ - BezTriple *bezt = self->beztriple; - - return Py_BuildValue( "[iii]", bezt->f1, bezt->f2, bezt->f3 ); -} - -static int BezTriple_setSelects( BPy_BezTriple * self, PyObject *args ) -{ - struct BezTriple *bezt = self->beztriple; - PyObject *ob1, *ob2, *ob3; - int param1, param2, param3; - - /* only accept a sequence of three booleans */ - - if( !PySequence_Check( args ) || PySequence_Size( args ) != 3 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected sequence of three integers" ); - - ob1 = PySequence_ITEM( args, 0 ); - ob2 = PySequence_ITEM( args, 1 ); - ob3 = PySequence_ITEM( args, 2 ); - - param1 = PyObject_IsTrue( ob1 ); - param2 = PyObject_IsTrue( ob2 ); - param3 = PyObject_IsTrue( ob3 ); - - if (param1==-1 || param2==-1 || param3==-1) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a sequence of 3 items: True/False or 0/1" ); - - /* assign the selects */ - bezt->f1 = (char)param1; - bezt->f2 = (char)param2; - bezt->f3 = (char)param3; - - Py_DECREF( ob1 ); - Py_DECREF( ob2 ); - Py_DECREF( ob3 ); - return 0; -} - -static PyObject *BezTriple_getHandles( BPy_BezTriple * self ) -{ - BezTriple *bezt = self->beztriple; - - return Py_BuildValue( "[ii]", bezt->h1, bezt->h2 ); -} - -static int BezTriple_setHandles( BPy_BezTriple * self, PyObject *args ) -{ - struct BezTriple *bezt = self->beztriple; - PyObject *ob1, *ob2; - short h1, h2; - - /* only accept a sequence of two ints */ - - if( !PySequence_Check( args ) || PySequence_Size( args ) != 2 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected sequence of two integers" ); - - ob1 = PySequence_ITEM( args, 0 ); - ob2 = PySequence_ITEM( args, 1 ); - - if( !PyInt_Check( ob1 ) || !PyInt_Check( ob2 ) ) { - Py_DECREF( ob1 ); - Py_DECREF( ob2 ); - return EXPP_ReturnIntError( PyExc_TypeError, - "expected sequence of two integers" ); - } - - h1 = ( short ) PyInt_AsLong( ob1 ); - h2 = ( short ) PyInt_AsLong( ob2 ); - Py_DECREF( ob1 ); - Py_DECREF( ob2 ); - - if( h1 < HD_FREE || h2 < HD_FREE || - h1 > HD_AUTO_ANIM || h2 > HD_AUTO_ANIM ) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected int in range [0,4]" ); - - /* assign the handles */ - - bezt->h1 = h1; - bezt->h2 = h2; - - return 0; -} - -/* - * Python BezTriple attributes get/set structure - */ - -static PyGetSetDef BPy_BezTriple_getseters[] = { - {"pt", - (getter)BezTriple_getPoints, (setter)BezTriple_setPoints, - "point knot values", - NULL}, - {"vec", - (getter)BezTriple_getTriple, (setter)BezTriple_setTriple, - "point handle and knot values", - NULL}, - {"tilt", - (getter)BezTriple_getTilt, (setter)BezTriple_setTilt, - "point tilt", - NULL}, - {"hide", - (getter)BezTriple_getHide, (setter)BezTriple_setHide, - "point hide status", - NULL}, - {"selects", - (getter)BezTriple_getSelects, (setter)BezTriple_setSelects, - "point select statuses", - NULL}, - {"handleTypes", - (getter)BezTriple_getHandles, (setter)BezTriple_setHandles, - "point handle types", - NULL}, - {"weight", - (getter)BezTriple_getWeight, (setter)BezTriple_setWeight, - "point weight", - NULL}, - {"radius", - (getter)BezTriple_getRadius, (setter)BezTriple_setRadius, - "point radius", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Function: BezTriple_repr */ -/* Description: This is a callback function for the BPy_BezTriple type. It */ -/* builds a meaninful string to represent BezTriple objects. */ -/*****************************************************************************/ -static PyObject *BezTriple_repr( BPy_BezTriple * self ) -{ - char str[512]; - sprintf( str, - "[BezTriple [%.6f, %.6f, %.6f] [%.6f, %.6f, %.6f] [%.6f, %.6f, %.6f]\n", - self->beztriple->vec[0][0], self->beztriple->vec[0][1], self->beztriple->vec[0][2], - self->beztriple->vec[1][0], self->beztriple->vec[1][1], self->beztriple->vec[1][2], - self->beztriple->vec[2][0], self->beztriple->vec[2][1], self->beztriple->vec[2][2]); - return PyString_FromString( str ); -} - -/************************************************************************ - * - * Python BezTriple_Type structure definition - * - ************************************************************************/ - -PyTypeObject BezTriple_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "BezTriple", /* char *tp_name; */ - sizeof( BPy_BezTriple ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) BezTriple_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - ( reprfunc ) BezTriple_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 ***/ - BPy_BezTriple_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_BezTriple_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 -}; - -static PyObject *M_BezTriple_HandleDict( void ) -{ - PyObject *HM = PyConstant_New( ); - - if( HM ) { - BPy_constant *d = ( BPy_constant * ) HM; - - PyConstant_Insert( d, "FREE", PyInt_FromLong( HD_FREE ) ); - PyConstant_Insert( d, "AUTO", PyInt_FromLong( HD_AUTO ) ); - PyConstant_Insert( d, "VECT", PyInt_FromLong( HD_VECT ) ); - PyConstant_Insert( d, "ALIGN", PyInt_FromLong( HD_ALIGN ) ); - PyConstant_Insert( d, "AUTOANIM", PyInt_FromLong( HD_AUTO_ANIM ) ); - } - return HM; -} - -/* - BezTriple_Init -*/ - -PyObject *BezTriple_Init( void ) -{ - PyObject *submodule; - PyObject *HandleTypes = M_BezTriple_HandleDict( ); - - if( PyType_Ready( &BezTriple_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.BezTriple", - M_BezTriple_methods, - M_BezTriple_doc ); - if( HandleTypes ) - PyModule_AddObject( submodule, "HandleTypes", HandleTypes ); - - - return submodule; -} - -/* Three Python BezTriple_Type helper functions needed by the Object module: */ - -/**************************************************************************** - Function: BezTriple_CreatePyObject - Description: This function will create a new BPy_BezTriple from an existing - Blender ipo structure. -****************************************************************************/ -PyObject *BezTriple_CreatePyObject( BezTriple * bzt ) -{ - BPy_BezTriple *pybeztriple; - - pybeztriple = - ( BPy_BezTriple * ) PyObject_NEW( BPy_BezTriple, &BezTriple_Type ); - - if( !pybeztriple ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_BezTriple object" ); - - pybeztriple->beztriple = bzt; - pybeztriple->own_memory = 0; - - return ( PyObject * ) pybeztriple; -} - - -/*****************************************************************************/ -/* Function: BezTriple_FromPyObject */ -/* Description: This function returns the Blender beztriple from the given */ -/* PyObject. */ -/*****************************************************************************/ -BezTriple *BezTriple_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_BezTriple * ) pyobj )->beztriple; -} - - -/* - Create a new BezTriple - input args is a sequence - either 3 or 9 floats -*/ - -PyObject *newBezTriple( float *numbuf ) -{ - int i, j, num; - PyObject *pyobj = NULL; - BezTriple *bzt = NULL; - - /* create our own beztriple data */ - bzt = MEM_callocN( sizeof( BezTriple ), "new bpytriple"); - - /* check malloc */ - if( !bzt ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "MEM_callocN failed"); - - /* copy the data */ - num = 0; - for( i = 0; i < 3; i++ ) { - for( j = 0; j < 3; j++) { - bzt->vec[i][j] = numbuf[num++]; - } - } - bzt->h1 = HD_ALIGN; - bzt->h2 = HD_ALIGN; - - /* wrap it */ - pyobj = BezTriple_CreatePyObject( bzt ); - - /* we own it. must free later */ - ( ( BPy_BezTriple * )pyobj)->own_memory = 1; - - return pyobj; -} - -/* #####DEPRECATED###### */ - -static PyObject *BezTriple_oldsetPoints( BPy_BezTriple * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)BezTriple_setPoints ); -} diff --git a/source/blender/python/api2_2x/BezTriple.h b/source/blender/python/api2_2x/BezTriple.h deleted file mode 100644 index 38c9b88e185..00000000000 --- a/source/blender/python/api2_2x/BezTriple.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * $Id: BezTriple.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot, Stephen Swaney - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_BEZTRIPLE_H -#define EXPP_BEZTRIPLE_H - -#include -#include "DNA_curve_types.h" - -extern PyTypeObject BezTriple_Type; - -/* type check macro */ -#define BPy_BezTriple_Check(o) \ - ( (o)->ob_type == &BezTriple_Type) - -/**************************************************************************** - Python BPy_BezTriple structure definition: -****************************************************************************/ - -typedef struct { - PyObject_HEAD /* required python macro */ - BezTriple * beztriple; - int own_memory; /* true == we own this memory and must delete. */ -} BPy_BezTriple; - -/* - * prototypes - */ - -PyObject *BezTriple_CreatePyObject( BezTriple * bzt ); -BezTriple *BezTriple_FromPyObject( PyObject * pyobj ); -PyObject *newBezTriple( float *args ); -PyObject *BezTriple_Init( void ); - -#endif /* EXPP_BEZTRIPLE_H */ diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c deleted file mode 100644 index 05eb82802b8..00000000000 --- a/source/blender/python/api2_2x/Blender.c +++ /dev/null @@ -1,1004 +0,0 @@ -/* - * $Id: Blender.c 12702 2007-11-27 23:15:51Z campbellbarton $ - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten, Willian P. Germano, Joseph Gilbert, - * Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ -struct ID; /*keep me up here */ - -#include "Blender.h" /*This must come first */ - -/* for open, close in Blender_Load */ -#include -#include "BDR_editobject.h" /* exit_editmode() */ -#include "BIF_usiblender.h" -#include "BLI_blenlib.h" -#include "BLO_writefile.h" -#include "BKE_blender.h" -#include "BKE_exotic.h" -#include "BKE_global.h" -#include "BKE_packedFile.h" -#include "BKE_utildefines.h" -#include "BKE_object.h" -#include "BKE_scene.h" -#include "BKE_text.h" -#include "BKE_ipo.h" -#include "BKE_library.h" -#include "BKE_main.h" -#include "BPI_script.h" -#include "BSE_headerbuttons.h" -#include "DNA_screen_types.h" /* for SPACE_VIEW3D */ -#include "DNA_userdef_types.h" -#include "DNA_packedFile_types.h" -#include "EXPP_interface.h" /* for bpy_gethome() */ -#include "gen_utils.h" -#include "modules.h" -#include "constant.h" -#include "../BPY_extern.h" /* BPY_txt_do_python_Text */ -#include "../BPY_menus.h" /* to update menus */ -#include "Armature.h" -#include "BezTriple.h" -#include "Camera.h" -#include "Constraint.h" -#include "Curve.h" -#include "CurNurb.h" -#include "Draw.h" -#include "Effect.h" -#include "Ipo.h" -#include "Ipocurve.h" -#include "IDProp.h" -#include "Key.h" -#include "Lamp.h" -#include "Lattice.h" -#include "Library.h" -#include "Mathutils.h" -#include "Geometry.h" -#include "Mesh.h" -#include "Metaball.h" -#include "Modifier.h" -#include "NMesh.h" -#include "Object.h" -#include "Group.h" -#include "Registry.h" -#include "Scene.h" -#include "Sound.h" -#include "SurfNurb.h" -#include "Sys.h" -#include "Text.h" -#include "Texture.h" -#include "Window.h" -#include "World.h" -#include "Types.h" - -/**********************************************************/ -/* Python API function prototypes for the Blender module. */ -/**********************************************************/ -static PyObject *Blender_Set( PyObject * self, PyObject * args ); -static PyObject *Blender_Get( PyObject * self, PyObject * value ); -static PyObject *Blender_Redraw( PyObject * self, PyObject * args ); -static PyObject *Blender_Quit( PyObject * self ); -static PyObject *Blender_Load( PyObject * self, PyObject * args ); -static PyObject *Blender_Save( PyObject * self, PyObject * args ); -static PyObject *Blender_Run( PyObject * self, PyObject * value ); -static PyObject *Blender_ShowHelp( PyObject * self, PyObject * script ); -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 ); - -extern PyObject *Text3d_Init( void ); /* missing in some include */ - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.__doc__ */ -/*****************************************************************************/ -static char Blender_Set_doc[] = - "(request, data) - Update settings in Blender\n\ -\n\ -(request) A string identifying the setting to change\n\ - 'curframe' - Sets the current frame using the number in data"; - -static char Blender_Get_doc[] = "(request) - Retrieve settings from Blender\n\ -\n\ -(request) A string indentifying the data to be returned\n\ - 'curframe' - Returns the current animation frame\n\ - 'curtime' - Returns the current animation time\n\ - 'staframe' - Returns the start frame of the animation\n\ - 'endframe' - Returns the end frame of the animation\n\ - 'filename' - Returns the name of the last file read or written\n\ - 'homedir' - Returns Blender's home dir\n\ - 'datadir' - Returns the dir where scripts can save their data, if available\n\ - 'scriptsdir' - Returns the main dir where scripts are kept, if available\n\ - 'uscriptsdir' - Returns the user defined dir for scripts, if available\n\ - 'version' - Returns the Blender version number"; - -static char Blender_Redraw_doc[] = "() - Redraw all 3D windows"; - -static char Blender_Quit_doc[] = - "() - Quit Blender. The current data is saved as 'quit.blend' before leaving."; - -static char Blender_Load_doc[] = "(filename) - Load the given file.\n\ -Supported formats:\n\ -Blender, DXF, Inventor 1.0 ASCII, VRML 1.0 asc, STL, Videoscape, radiogour.\n\ -\n\ -Notes:\n\ -1 - () - an empty argument loads the default .B.blend file;\n\ -2 - if the substring '.B.blend' occurs inside 'filename', the default\n\ -.B.blend file is loaded;\n\ -3 - If a Blender file is loaded the script ends immediately.\n\ -4 - The current data is always preserved as an autosave file, for safety;\n\ -5 - This function only works if the script where it's executed is the\n\ -only one running at the moment."; - -static char Blender_Save_doc[] = - "(filename) - Save data to a file based on the filename's extension.\n\ -Supported are: Blender's .blend and the builtin exporters:\n\ -VRML 1.0 (.wrl), Videoscape (.obj), DXF (.dxf) and STL (.stl)\n\ -(filename) - A filename with one of the supported extensions.\n\ -Note 1: 'filename' should not contain the substring \".B.blend\" in it.\n\ -Note 2: only .blend raises an error if file wasn't saved.\n\ -\tYou can use Blender.sys.exists(filename) to make sure the file was saved\n\ -\twhen writing to one of the other formats."; - -static char Blender_Run_doc[] = - "(script) - Run the given Python script.\n\ -(script) - the path to a file or the name of an available Blender Text."; - -static char Blender_ShowHelp_doc[] = -"(script) - Show help for the given Python script.\n\ - This will try to open the 'Scripts Help Browser' script, so to have\n\ -any help displayed the passed 'script' must be properly documented\n\ -with the expected strings (check API ref docs or any bundled script\n\ -for examples).\n\n\ -(script) - the filename of a script in the default or user defined\n\ - scripts dir (no need to supply the full path name)."; - -static char Blender_UpdateMenus_doc[] = - "() - Update the menus where scripts are registered. Only needed for\n\ -scripts that save other new scripts in the default or user defined folders."; - -static char Blender_PackAll_doc[] = -"() - Pack all files.\n\ -All files will packed into the blend file."; -static char Blender_UnpackAll_doc[] = -"(mode) - Unpack files.\n\ -All files will be unpacked using specified mode.\n\n\ -(mode) - the unpack mode."; - -static char Blender_CountPackedFiles_doc[] = -"() - Returns the number of packed files."; - -/*****************************************************************************/ -/* Python method structure definition. */ -/*****************************************************************************/ -static struct PyMethodDef Blender_methods[] = { - {"Set", Blender_Set, METH_VARARGS, Blender_Set_doc}, - {"Get", Blender_Get, METH_O, Blender_Get_doc}, - {"Redraw", Blender_Redraw, METH_VARARGS, Blender_Redraw_doc}, - {"Quit", ( PyCFunction ) Blender_Quit, METH_NOARGS, Blender_Quit_doc}, - {"Load", Blender_Load, METH_VARARGS, Blender_Load_doc}, - {"Save", Blender_Save, METH_VARARGS, Blender_Save_doc}, - {"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}, - {"PackAll", ( PyCFunction ) Blender_PackAll, METH_NOARGS, Blender_PackAll_doc}, - {"UnpackAll", Blender_UnpackAll, METH_O, Blender_UnpackAll_doc}, - {"UpdateMenus", ( PyCFunction ) Blender_UpdateMenus, METH_NOARGS, - Blender_UpdateMenus_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Global variables */ -/*****************************************************************************/ -PyObject *g_blenderdict; - -/*****************************************************************************/ -/* Function: Blender_Set */ -/* Python equivalent: Blender.Set */ -/*****************************************************************************/ -static PyObject *Blender_Set( PyObject * self, PyObject * args ) -{ - char *name, *dir = NULL; - PyObject *arg; - - if( !PyArg_ParseTuple( args, "sO", &name, &arg ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected 2 args, where the first is always a string" ); - - if( StringEqual( name, "curframe" ) ) { - if( !PyInt_Check( arg ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected an integer" ); - - G.scene->r.cfra = (short)PyInt_AsLong( arg ) ; - - /* update all objects, so python scripts can export all objects - in a scene without worrying about the view layers */ - scene_update_for_newframe(G.scene, (1<<20) - 1); - - } else if (StringEqual( name , "uscriptsdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.pythondir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "yfexportdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.yfexportdir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "fontsdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.fontdir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "texturesdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.textudir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "texpluginsdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.plugtexdir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "seqpluginsdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.plugseqdir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "renderdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.renderdir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "soundsdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.sounddir, dir, FILE_MAXDIR); - } else if (StringEqual( name , "tempdir" ) ) { - if ( !PyArg_Parse( arg , "s" , &dir )) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); - BLI_strncpy(U.tempdir, dir, FILE_MAXDIR); - } 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 - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "value given is not a blender setting" ) ); - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: Blender_Get */ -/* Python equivalent: Blender.Get */ -/*****************************************************************************/ -static PyObject *Blender_Get( PyObject * self, PyObject * value ) -{ - PyObject *ret = NULL; - char *str = PyString_AsString(value); - - if( !str ) - return EXPP_ReturnPyObjError (PyExc_TypeError, - "expected string argument"); - - if( StringEqual( str, "curframe" ) ) - ret = PyInt_FromLong( G.scene->r.cfra ); - else if( StringEqual( str, "curtime" ) ) - ret = PyFloat_FromDouble( frame_to_float( G.scene->r.cfra ) ); - else if( StringEqual( str, "rt" ) ) - ret = PyInt_FromLong( (long)frame_to_float( G.rt ) ); - else if( StringEqual( str, "staframe" ) ) - ret = PyInt_FromLong( G.scene->r.sfra ); - else if( StringEqual( str, "endframe" ) ) - ret = PyInt_FromLong( G.scene->r.efra ); - else if( StringEqual( str, "filename" ) ) { - if ( strstr(G.main->name, ".B.blend") != 0) - ret = PyString_FromString(""); - else - ret = PyString_FromString(G.main->name); - } - else if( StringEqual( str, "homedir" ) ) { - char *hdir = bpy_gethome(0); - if( hdir && BLI_exists( hdir )) - ret = PyString_FromString( hdir ); - else - ret = EXPP_incr_ret( Py_None ); - } - else if( StringEqual( str, "datadir" ) ) { - char datadir[FILE_MAXDIR]; - char *sdir = bpy_gethome(1); - - if (sdir) { - BLI_make_file_string( "/", datadir, sdir, "bpydata" ); - if( BLI_exists( datadir ) ) - ret = PyString_FromString( datadir ); - } - if (!ret) ret = EXPP_incr_ret( Py_None ); - } - else if(StringEqual(str, "udatadir")) { - if (U.pythondir[0] != '\0') { - char upydir[FILE_MAXDIR]; - - BLI_strncpy(upydir, U.pythondir, FILE_MAXDIR); - BLI_convertstringcode(upydir, G.sce, 0); - - if (BLI_exists(upydir)) { - char udatadir[FILE_MAXDIR]; - - BLI_make_file_string("/", udatadir, upydir, "bpydata"); - - if (BLI_exists(udatadir)) - ret = PyString_FromString(udatadir); - } - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - else if( StringEqual( str, "scriptsdir" ) ) { - char *sdir = bpy_gethome(1); - - if (sdir) - ret = PyString_FromString(sdir); - else - ret = EXPP_incr_ret( Py_None ); - } - else if( StringEqual( str, "uscriptsdir" ) ) { - if (U.pythondir[0] != '\0') { - char upydir[FILE_MAXDIR]; - - BLI_strncpy(upydir, U.pythondir, FILE_MAXDIR); - BLI_convertstringcode(upydir, G.sce, 0); - - if( BLI_exists( upydir ) ) - ret = PyString_FromString( upydir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* USER PREFS: */ - else if( StringEqual( str, "yfexportdir" ) ) { - if (U.yfexportdir[0] != '\0') { - char yfexportdir[FILE_MAXDIR]; - - BLI_strncpy(yfexportdir, U.yfexportdir, FILE_MAXDIR); - BLI_convertstringcode(yfexportdir, G.sce, 0); - - if( BLI_exists( yfexportdir ) ) - ret = PyString_FromString( yfexportdir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* fontsdir */ - else if( StringEqual( str, "fontsdir" ) ) { - if (U.fontdir[0] != '\0') { - char fontdir[FILE_MAXDIR]; - - BLI_strncpy(fontdir, U.fontdir, FILE_MAXDIR); - BLI_convertstringcode(fontdir, G.sce, 0); - - if( BLI_exists( fontdir ) ) - ret = PyString_FromString( fontdir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* texturesdir */ - else if( StringEqual( str, "texturesdir" ) ) { - if (U.textudir[0] != '\0') { - char textudir[FILE_MAXDIR]; - - BLI_strncpy(textudir, U.textudir, FILE_MAXDIR); - BLI_convertstringcode(textudir, G.sce, 0); - - if( BLI_exists( textudir ) ) - ret = PyString_FromString( textudir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* texpluginsdir */ - else if( StringEqual( str, "texpluginsdir" ) ) { - if (U.plugtexdir[0] != '\0') { - char plugtexdir[FILE_MAXDIR]; - - BLI_strncpy(plugtexdir, U.plugtexdir, FILE_MAXDIR); - BLI_convertstringcode(plugtexdir, G.sce, 0); - - if( BLI_exists( plugtexdir ) ) - ret = PyString_FromString( plugtexdir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* seqpluginsdir */ - else if( StringEqual( str, "seqpluginsdir" ) ) { - if (U.plugseqdir[0] != '\0') { - char plugseqdir[FILE_MAXDIR]; - - BLI_strncpy(plugseqdir, U.plugseqdir, FILE_MAXDIR); - BLI_convertstringcode(plugseqdir, G.sce, 0); - - if( BLI_exists( plugseqdir ) ) - ret = PyString_FromString( plugseqdir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* renderdir */ - else if( StringEqual( str, "renderdir" ) ) { - if (U.renderdir[0] != '\0') { - char renderdir[FILE_MAXDIR]; - - BLI_strncpy(renderdir, U.renderdir, FILE_MAXDIR); - BLI_convertstringcode(renderdir, G.sce, 0); - - if( BLI_exists( renderdir ) ) - ret = PyString_FromString( renderdir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* soundsdir */ - else if( StringEqual( str, "soundsdir" ) ) { - if (U.sounddir[0] != '\0') { - char sounddir[FILE_MAXDIR]; - - BLI_strncpy(sounddir, U.sounddir, FILE_MAXDIR); - BLI_convertstringcode(sounddir, G.sce, 0); - - if( BLI_exists( sounddir ) ) - ret = PyString_FromString( sounddir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* tempdir */ - else if( StringEqual( str, "tempdir" ) ) { - if (U.tempdir[0] != '\0') { - char tempdir[FILE_MAXDIR]; - - BLI_strncpy(tempdir, U.tempdir, FILE_MAXDIR); - BLI_convertstringcode(tempdir, G.sce, 0); - - if( BLI_exists( tempdir ) ) - ret = PyString_FromString( tempdir ); - } - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* icondir */ - else if( StringEqual( str, "icondir" ) ) { - - char icondirstr[FILE_MAXDIR]; - - #ifdef WIN32 - BLI_make_file_string("/", icondirstr, BLI_gethome(), "icons"); - #else - BLI_make_file_string("/", icondirstr, BLI_gethome(), ".blender/icons"); - #endif - - if( BLI_exists( icondirstr ) ) - ret = PyString_FromString( icondirstr ); - - if (!ret) ret = EXPP_incr_ret(Py_None); - } - /* According to the old file (opy_blender.c), the following if - statement is a quick hack and needs some clean up. */ - else if( StringEqual( str, "vrmloptions" ) ) { - ret = PyDict_New( ); - - EXPP_dict_set_item_str( ret, "twoside", - PyInt_FromLong( U.vrmlflag & USER_VRML_TWOSIDED ) ); - - EXPP_dict_set_item_str( ret, "layers", - PyInt_FromLong( U.vrmlflag & USER_VRML_LAYERS ) ); - - EXPP_dict_set_item_str( ret, "autoscale", - PyInt_FromLong( U.vrmlflag & USER_VRML_AUTOSCALE ) ); - - } /* 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 - return EXPP_ReturnPyObjError( PyExc_AttributeError, "unknown attribute" ); - - if (ret) return ret; - else - return EXPP_ReturnPyObjError (PyExc_MemoryError, - "could not create pystring!"); -} - -/*****************************************************************************/ -/* Function: Blender_Redraw */ -/* Python equivalent: Blender.Redraw */ -/*****************************************************************************/ -static PyObject *Blender_Redraw( PyObject * self, PyObject * args ) -{ - return M_Window_Redraw( self, args ); -} - -/*****************************************************************************/ -/* Function: Blender_Quit */ -/* Python equivalent: Blender.Quit */ -/*****************************************************************************/ -static PyObject *Blender_Quit( PyObject * self ) -{ - BIF_write_autosave( ); /* save the current data first */ - - exit_usiblender( ); /* renames last autosave to quit.blend */ - - Py_RETURN_NONE; -} - -/** - * Blender.Load - * loads Blender's .blend, DXF, radiogour(?), STL, Videoscape, - * Inventor 1.0 ASCII, VRML 1.0 asc. - */ -static PyObject *Blender_Load( PyObject * self, PyObject * args ) -{ - char *fname = NULL; - int keep_oldfname = 0; - Script *script = NULL; - char str[32], name[FILE_MAXDIR]; - int file, is_blend_file = 0; - - if( !PyArg_ParseTuple( args, "|si", &fname, &keep_oldfname ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected filename and optional int or nothing as arguments" ); - - if( fname ) { - if( strlen( fname ) > FILE_MAXDIR ) /* G.main->name's max length */ - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "filename too long!" ); - else if( !BLI_exists( fname ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "requested file doesn't exist!" ); - - if( keep_oldfname ) - BLI_strncpy( name, G.sce, FILE_MAXDIR ); - } - - /* We won't let a new .blend file be loaded if there are still other - * scripts running, since loading a new file will close and remove them. */ - - if( G.main->script.first != G.main->script.last ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "there are other scripts running at the Scripts win, close them first!" ); - - if( fname ) { - file = open( fname, O_BINARY | O_RDONLY ); - - if( file <= 0 ) { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot open file!" ); - } else { - read( file, str, 31 ); - close( file ); - - if( strncmp( str, "BLEN", 4 ) == 0 ) - is_blend_file = 1; - } - } else - is_blend_file = 1; /* no arg given means default: .B.blend */ - - if( is_blend_file ) { - - int during_slink = during_scriptlink( ); - - /* when loading a .blend file from a scriptlink, the scriptlink pointer - * in BPY_do_pyscript becomes invalid during a loop. Inform it here. - * Also do not allow a nested scriptlink (called from inside another) - * to load .blend files, to avoid nasty problems. */ - if( during_slink >= 1 ) { - if( during_slink == 1 ) - disable_where_scriptlink( -1 ); - else { - return EXPP_ReturnPyObjError - ( PyExc_EnvironmentError, - "Blender.Load: cannot load .blend files from a nested scriptlink." ); - } - } - - /* trick: mark the script so that its script struct won't be freed after - * the script is executed (to avoid a double free warning on exit): */ - script = G.main->script.first; - if( script ) - script->flags |= SCRIPT_GUI; - - BIF_write_autosave( ); /* for safety let's preserve the current data */ - } - - if( G.obedit ) - exit_editmode(EM_FREEDATA); - - if (G.background) { /* background mode */ - if (is_blend_file) - BKE_read_file(fname, NULL); - else { - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "only .blend files can be loaded from command line,\n\ - other file types require interactive mode."); - } - } - else { /* interactive mode */ - /* for safety, any filename with .B.blend is considered the default one. - * It doesn't seem necessary to compare file attributes (like st_ino and - * st_dev, according to the glibc info pages) to find out if the given - * filename, that may have been given with a twisted misgiving path, is the - * default one for sure. Taking any .B.blend file as the default is good - * enough here. Note: the default file requires extra clean-up done by - * BIF_read_homefile: freeing the user theme data. */ - if( !fname || ( strstr( fname, ".B.blend" ) && is_blend_file ) ) - BIF_read_homefile(0); - else - BIF_read_file( fname ); - - if( fname && keep_oldfname ) { - /*BLI_strncpy(G.main->name, name, FILE_MAXDIR); */ - BLI_strncpy( G.sce, name, FILE_MAXDIR ); - } - } - - Py_RETURN_NONE; -} - -static PyObject *Blender_Save( PyObject * self, PyObject * args ) -{ - char *fname = NULL; - int overwrite = 0, len = 0; - char *error = NULL; - Library *li; - - if( !PyArg_ParseTuple( args, "s|i", &fname, &overwrite ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected filename and optional int (overwrite flag) as arguments" ); - - for( li = G.main->library.first; li; li = li->id.next ) { - if( BLI_streq( li->name, fname ) ) { - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "cannot overwrite used library" ); - } - } - - /* for safety, any filename with .B.blend is considered the default one - * and not accepted here. */ - if( strstr( fname, ".B.blend" ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "filename can't contain the substring \".B.blend\" in it." ); - - len = strlen( fname ); - - if( len > FILE_MAXDIR + FILE_MAXFILE ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "filename is too long!" ); - else if( BLI_exists( fname ) && !overwrite ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "file already exists and overwrite flag was not given." ); - - disable_where_script( 1 ); /* to avoid error popups in the write_* functions */ - - if( BLI_testextensie( fname, ".blend" ) ) { - int writeflags; - if( G.fileflags & G_AUTOPACK ) - packAll( ); - - 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 ); - } - } else if( BLI_testextensie( fname, ".dxf" ) ) - write_dxf( fname ); - else if( BLI_testextensie( fname, ".stl" ) ) - write_stl( fname ); - else if( BLI_testextensie( fname, ".wrl" ) ) - write_vrml( fname ); - else if( BLI_testextensie( fname, ".obj" ) ) - write_videoscape( fname ); - else { - disable_where_script( 0 ); - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown file extension." ); - } - - disable_where_script( 0 ); - - Py_RETURN_NONE; -} - -static PyObject *Blender_ShowHelp(PyObject *self, PyObject *script) -{ - char hspath[FILE_MAXDIR + FILE_MAXFILE]; /* path to help_browser.py */ - char *sdir = bpy_gethome(1); - PyObject *rkeyd = NULL, *arglist = NULL; - - if (!PyString_Check(script)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "expected a script filename as argument"); - - /* first we try to find the help_browser script */ - - if (sdir) BLI_make_file_string("/", hspath, sdir, "help_browser.py"); - - if (!sdir || (!BLI_exists(hspath) && (U.pythondir[0] != '\0'))) { - char upydir[FILE_MAXDIR]; - - BLI_strncpy(upydir, U.pythondir, FILE_MAXDIR); - BLI_convertstringcode(upydir, G.sce, 0); - BLI_make_file_string("/", hspath, upydir, "help_browser.py"); - - if (!BLI_exists(hspath)) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "can't find script help_browser.py"); - } - - /* now we store the passed script in the registry dict and call the - * help_browser to show help info for it */ - rkeyd = PyDict_New(); - if (!rkeyd) - return EXPP_ReturnPyObjError(PyExc_MemoryError, - "can't create py dictionary!"); - - /* note: don't use EXPP_dict_set_item_str for 'script', which is an - * argument to the function we're in and so shouldn't be decref'ed: */ - PyDict_SetItemString(rkeyd, "script", script); - - EXPP_dict_set_item_str(bpy_registryDict, "__help_browser", rkeyd); - - arglist = Py_BuildValue("(s)", hspath); - Blender_Run(self, arglist); - Py_DECREF(arglist); - - Py_RETURN_NONE; -} - -static PyObject *Blender_Run(PyObject *self, PyObject *value) -{ - char *fname = PyString_AsString(value); - Text *text = NULL; - int is_blender_text = 0; - Script *script = NULL; - - if (!fname) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "expected a filename or a Blender Text name as argument"); - - if (!BLI_exists(fname)) { /* if there's no such filename ... */ - text = G.main->text.first; /* try an already existing Blender Text */ - - while (text) { - if (!strcmp(fname, text->id.name + 2)) break; - text = text->id.next; - } - - if (!text) { - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "no such file or Blender text"); - } - else is_blender_text = 1; /* fn is already a Blender Text */ - } - - else { - text = add_text(fname); - - if (!text) { - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "couldn't create Blender Text from given file"); - } - } - - /* (this is messy, check Draw.c's Method_Register and Window.c's file - * selector for more info) - * - caller script is the one that called this Blender_Run function; - * - called script is the argument to this function: fname; - * To mark scripts whose global dicts can't be freed right after - * the script execution (or better, 'first pass', since these scripts - * leave callbacks for gui or file/image selectors) we flag them. But to - * get a pointer to them we need to check which one is currently - * running (if none we're already at a spacescript). To make sure only - * the called script will have the SCRIPT_RUNNING flag on, we unset it - * for the caller script here: */ - script = G.main->script.first; - while (script) { - if (script->flags & SCRIPT_RUNNING) break; - script = script->id.next; - } - - if (script) script->flags &= ~SCRIPT_RUNNING; /* unset */ - - BPY_txt_do_python_Text(text); /* call new script */ - - if (script) script->flags |= SCRIPT_RUNNING; /* set */ - - if (!is_blender_text) free_libblock(&G.main->text, text); - - Py_RETURN_NONE; -} - -static PyObject * Blender_UpdateMenus( PyObject * self ) -{ - - BPyMenu_RemoveAllEntries(); - - if (BPyMenu_Init(1) == -1) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "invalid scripts dir"); - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: Blender_PackAll */ -/* Python equivalent: Blender.PackAll */ -/*****************************************************************************/ -static PyObject *Blender_PackAll( PyObject * self) -{ - packAll(); - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: Blender_UnpackAll */ -/* Python equivalent: Blender.UnpackAll */ -/*****************************************************************************/ -static PyObject *Blender_UnpackAll( PyObject * self, PyObject *value) -{ - int mode = PyInt_AsLong(value); - - if (mode==-1) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected an int Blender.UnpackModes"); - unpackAll(mode); - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: Blender_CountPackedFiles */ -/* Python equivalent: Blender.CountPackedFiles */ -/*****************************************************************************/ -static PyObject *Blender_CountPackedFiles( PyObject * self ) -{ - int nfiles = countPackedFiles(); - return PyInt_FromLong( nfiles ); -} -static PyObject *Blender_UnpackModesDict( void ) -{ - PyObject *UnpackModes = PyConstant_New( ); - if( UnpackModes ) { - BPy_constant *d = ( BPy_constant * ) UnpackModes; - PyConstant_Insert( d, "EQUAL", PyInt_FromLong((long)PF_EQUAL) ); - PyConstant_Insert( d, "DIFFERS",PyInt_FromLong((long)PF_DIFFERS) ); - PyConstant_Insert( d, "NOFILE", PyInt_FromLong((long)PF_NOFILE) ); - PyConstant_Insert( d, "WRITE_ORIGINAL", PyInt_FromLong((long)PF_WRITE_ORIGINAL) ); - PyConstant_Insert( d, "WRITE_LOCAL", PyInt_FromLong((long)PF_WRITE_LOCAL) ); - PyConstant_Insert( d, "USE_LOCAL", PyInt_FromLong((long)PF_USE_LOCAL) ); - PyConstant_Insert( d, "USE_ORIGINAL", PyInt_FromLong((long)PF_USE_ORIGINAL) ); - PyConstant_Insert( d, "KEEP", PyInt_FromLong((long)PF_KEEP) ); - PyConstant_Insert( d, "NOOP", PyInt_FromLong((long)PF_NOOP) ); - PyConstant_Insert( d, "ASK", PyInt_FromLong((long)PF_EQUAL) ); - } - return UnpackModes; -} - -/*****************************************************************************/ -/* Function: initBlender */ -/*****************************************************************************/ - -void M_Blender_Init(void) -{ - PyObject *module; - PyObject *dict, *smode, *SpaceHandlers, *UnpackModes; - - /* G.scene should only aver be NULL if blender is executed in - background mode, not loading a blend file and executing a python script eg. - blender -P somescript.py -b - The if below solves the segfaults that happen when python runs and - G.scene is NULL */ - if(G.background && G.main->scene.first==NULL) { - Scene *sce= add_scene("1"); - /*set_scene(sce);*/ /* causes a crash */ - G.scene= sce; - } - - module = Py_InitModule3("Blender", Blender_methods, - "The main Blender module"); - - types_InitAll(); /* set all our pytypes to &PyType_Type */ - - /* constants for packed files*/ - UnpackModes = Blender_UnpackModesDict( ); - if( UnpackModes ) - PyModule_AddObject( module, "UnpackModes", UnpackModes ); - - SpaceHandlers = PyConstant_New(); - if (SpaceHandlers) { - BPy_constant *d = (BPy_constant *)SpaceHandlers; - - PyConstant_Insert(d,"VIEW3D_EVENT",PyInt_FromLong(SPACEHANDLER_VIEW3D_EVENT)); - PyConstant_Insert(d,"VIEW3D_DRAW", PyInt_FromLong(SPACEHANDLER_VIEW3D_DRAW)); - - PyModule_AddObject(module, "SpaceHandlers", SpaceHandlers); - } - - if (G.background) - smode = PyString_FromString("background"); - else - smode = PyString_FromString("interactive"); - - dict = PyModule_GetDict(module); - g_blenderdict = dict; - - PyModule_AddIntConstant(module, "TRUE", 1); - PyModule_AddIntConstant( module, "FALSE", 0 ); - - EXPP_dict_set_item_str(dict, "bylink", EXPP_incr_ret_False()); - PyDict_SetItemString(dict, "link", Py_None); - EXPP_dict_set_item_str(dict, "event", PyString_FromString("")); - EXPP_dict_set_item_str(dict, "mode", smode); - - PyDict_SetItemString(dict, "Armature", Armature_Init()); - PyDict_SetItemString(dict, "BezTriple", BezTriple_Init()); - PyDict_SetItemString(dict, "BGL", BGL_Init()); - PyDict_SetItemString(dict, "CurNurb", CurNurb_Init()); - PyDict_SetItemString(dict, "Constraint", Constraint_Init()); - PyDict_SetItemString(dict, "Curve", Curve_Init()); - PyDict_SetItemString(dict, "Camera", Camera_Init()); - PyDict_SetItemString(dict, "Draw", Draw_Init()); - PyDict_SetItemString(dict, "Effect", Effect_Init()); - PyDict_SetItemString(dict, "Ipo", Ipo_Init()); - PyDict_SetItemString(dict, "IpoCurve", IpoCurve_Init()); - PyDict_SetItemString(dict, "Image", Image_Init()); - PyDict_SetItemString(dict, "Key", Key_Init()); - PyDict_SetItemString(dict, "Lamp", Lamp_Init()); - PyDict_SetItemString(dict, "Lattice", Lattice_Init()); - PyDict_SetItemString(dict, "Library", oldLibrary_Init()); - PyDict_SetItemString(dict, "Material", Material_Init()); - PyDict_SetItemString(dict, "Mesh", Mesh_Init()); - PyDict_SetItemString(dict, "Metaball", Metaball_Init()); - PyDict_SetItemString(dict, "Mathutils", Mathutils_Init()); - PyDict_SetItemString(dict, "Geometry", Geometry_Init()); - PyDict_SetItemString(dict, "Modifier", Modifier_Init()); - PyDict_SetItemString(dict, "NMesh", NMesh_Init()); - PyDict_SetItemString(dict, "Noise", Noise_Init()); - PyDict_SetItemString(dict, "Object", Object_Init()); - PyDict_SetItemString(dict, "Group", Group_Init()); - PyDict_SetItemString(dict, "Registry", Registry_Init()); - PyDict_SetItemString(dict, "Scene", Scene_Init()); - PyDict_SetItemString(dict, "Sound", Sound_Init()); - PyDict_SetItemString(dict, "SurfNurb", SurfNurb_Init()); - PyDict_SetItemString(dict, "sys", sys_Init()); - PyDict_SetItemString(dict, "Types", Types_Init()); - PyDict_SetItemString(dict, "Text", Text_Init()); - PyDict_SetItemString(dict, "Text3d", Text3d_Init()); - PyDict_SetItemString(dict, "Texture", Texture_Init()); - PyDict_SetItemString(dict, "Window", Window_Init()); - PyDict_SetItemString(dict, "World", World_Init()); - -} diff --git a/source/blender/python/api2_2x/Blender.h b/source/blender/python/api2_2x/Blender.h deleted file mode 100644 index 77f21ed333c..00000000000 --- a/source/blender/python/api2_2x/Blender.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * $Id: Blender.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten, Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_BLENDER_H -#define EXPP_BLENDER_H - -#include - -extern PyObject *g_blenderdict; -void M_Blender_Init( void ); - -#endif /* EXPP_BLENDER_H */ diff --git a/source/blender/python/api2_2x/Bone.c b/source/blender/python/api2_2x/Bone.c deleted file mode 100644 index 704fe20d6db..00000000000 --- a/source/blender/python/api2_2x/Bone.c +++ /dev/null @@ -1,1425 +0,0 @@ -/* - * $Id: Bone.c 12399 2007-10-26 08:19:40Z campbellbarton $ - * - * ***** 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): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Bone.h" -#include "vector.h" -#include "matrix.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" -#include "BKE_utildefines.h" -#include "gen_utils.h" -#include "BKE_armature.h" -#include "Mathutils.h" -#include "BKE_library.h" - -//these must come in this order -#include "DNA_object_types.h" //1 -#include "BIF_editarmature.h" //2 - -//------------------------ERROR CODES--------------------------------- -//This is here just to make me happy and to have more consistant error strings :) -static const char sEditBoneError[] = "EditBone - Error: "; -// static const char sEditBoneBadArgs[] = "EditBone - Bad Arguments: "; -static const char sBoneError[] = "Bone - Error: "; -// static const char sBoneBadArgs[] = "Bone - Bad Arguments: "; - -//----------------------(internal) -//gets the bone->roll (which is a localspace roll) and puts it in parentspace -//(which is the 'roll' value the user sees) -static double boneRoll_ToArmatureSpace(struct Bone *bone) -{ - float head[3], tail[3], delta[3]; - float premat[3][3], postmat[3][3]; - float imat[3][3], difmat[3][3]; - double roll = 0.0f; - - VECCOPY(head, bone->arm_head); - VECCOPY(tail, bone->arm_tail); - VECSUB (delta, tail, head); - vec_roll_to_mat3(delta, 0.0f, postmat); - Mat3CpyMat4(premat, bone->arm_mat); - Mat3Inv(imat, postmat); - Mat3MulMat3(difmat, imat, premat); - - roll = atan2(difmat[2][0], difmat[2][2]); - if (difmat[0][0] < 0.0){ - roll += M_PI; - } - return roll; //result is in radians -} - -//################## EditBone_Type ######################## -/*This type is a wrapper for a tempory bone. This is an 'unparented' bone -*object. The armature->bonebase will be calculated from these temporary -*python tracked objects.*/ -//#################################################### - -//------------------METHOD IMPLEMENTATIONS----------------------------- -//-------------------------EditBone.hasParent() -static PyObject *EditBone_hasParent(BPy_EditBone *self) -{ - if (self->editbone){ - if (self->editbone->parent) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; - }else{ - goto AttributeError; - } - -AttributeError: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".hasParent: ", "EditBone must be added to the armature first"); -} -//-------------------------EditBone.clearParent() -static PyObject *EditBone_clearParent(BPy_EditBone *self) -{ - if (self->editbone){ - if (self->editbone->parent) - self->editbone->parent = NULL; - Py_RETURN_NONE; - }else{ - goto AttributeError; - } - -AttributeError: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".clearParent: ", "EditBone must be added to the armature first"); -} -//------------------ATTRIBUTE IMPLEMENTATION--------------------------- -//------------------------EditBone.name (get) -static PyObject *EditBone_getName(BPy_EditBone *self, void *closure) -{ - if (self->editbone) - return PyString_FromString(self->editbone->name); - else - return PyString_FromString(self->name); -} -//------------------------EditBone.name (set) -//check for char[] overflow here... -static int EditBone_setName(BPy_EditBone *self, PyObject *value, void *closure) -{ - char *name = ""; - - if (!PyArg_Parse(value, "s", &name)) - goto AttributeError; - - if (self->editbone) - BLI_strncpy(self->editbone->name, name, 32); - else - BLI_strncpy(self->name, name, 32); - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".name: ", "expects a string"); -} -//------------------------EditBone.roll (get) -static PyObject *EditBone_getRoll(BPy_EditBone *self, void *closure) -{ - if (self->editbone){ - return PyFloat_FromDouble((self->editbone->roll * (180/Py_PI))); - }else{ - return PyFloat_FromDouble((self->roll * (180/Py_PI))); - } -} -//------------------------EditBone.roll (set) -static int EditBone_setRoll(BPy_EditBone *self, PyObject *value, void *closure) -{ - float roll = 0.0f; - - if (!PyArg_Parse(value, "f", &roll)) - goto AttributeError; - - if (self->editbone){ - self->editbone->roll = (float)(roll * (Py_PI/180)); - }else{ - self->roll = (float)(roll * (Py_PI/180)); - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".roll: ", "expects a float"); -} -//------------------------EditBone.head (get) -static PyObject *EditBone_getHead(BPy_EditBone *self, void *closure) -{ - if (self->editbone){ - return newVectorObject(self->editbone->head, 3, Py_WRAP); - }else{ - return newVectorObject(self->head, 3, Py_NEW); - } -} -//------------------------EditBone.head (set) -static int EditBone_setHead(BPy_EditBone *self, PyObject *value, void *closure) -{ - VectorObject *vec = NULL; - int x; - - if (!PyArg_Parse(value, "O!", &vector_Type, &vec)) - goto AttributeError; - if (vec->size != 3) - goto AttributeError2; - - if (self->editbone){ - for (x = 0; x < 3; x++){ - self->editbone->head[x] = vec->vec[x]; - } - }else{ - for (x = 0; x < 3; x++){ - self->head[x] = vec->vec[x]; - } - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".head: ", "expects a Vector Object"); - -AttributeError2: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".head: ", "Vector Object needs to be (x,y,z)"); -} -//------------------------EditBone.tail (get) -static PyObject *EditBone_getTail(BPy_EditBone *self, void *closure) -{ - if (self->editbone){ - return newVectorObject(self->editbone->tail, 3, Py_WRAP); - }else{ - return newVectorObject(self->tail, 3, Py_NEW); - } -} -//------------------------EditBone.tail (set) -static int EditBone_setTail(BPy_EditBone *self, PyObject *value, void *closure) -{ - VectorObject *vec = NULL; - int x; - - if (!PyArg_Parse(value, "O!", &vector_Type, &vec)) - goto AttributeError; - if (vec->size != 3) - goto AttributeError2; - - if (self->editbone){ - for (x = 0; x < 3; x++){ - self->editbone->tail[x] = vec->vec[x]; - } - }else{ - for (x = 0; x < 3; x++){ - self->tail[x] = vec->vec[x]; - } - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".tail: ", "expects a Vector Object"); - -AttributeError2: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".tail: ", "Vector Object needs to be (x,y,z)"); -} -//------------------------EditBone.weight (get) -static PyObject *EditBone_getWeight(BPy_EditBone *self, void *closure) -{ - if (self->editbone) - return PyFloat_FromDouble(self->editbone->weight); - else - return PyFloat_FromDouble(self->weight); -} -//------------------------EditBone.weight (set) -static int EditBone_setWeight(BPy_EditBone *self, PyObject *value, void *closure) -{ - float weight; - - if (!PyArg_Parse(value, "f", &weight)) - goto AttributeError; - CLAMP(weight, 0.0f, 1000.0f); - - if (self->editbone) - self->editbone->weight = weight; - else - self->weight = weight; - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".weight: ", "expects a float"); -} -//------------------------EditBone.deform_dist (get) -static PyObject *EditBone_getDeform_dist(BPy_EditBone *self, void *closure) -{ - if (self->editbone) - return PyFloat_FromDouble(self->editbone->dist); - else - return PyFloat_FromDouble(self->dist); -} -//------------------------EditBone.deform_dist (set) -static int EditBone_setDeform_dist(BPy_EditBone *self, PyObject *value, void *closure) -{ - float deform; - - if (!PyArg_Parse(value, "f", &deform)) - goto AttributeError; - CLAMP(deform, 0.0f, 1000.0f); - - if (self->editbone) - self->editbone->dist = deform; - else - self->dist = deform; - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".deform_dist: ", "expects a float"); -} -//------------------------EditBone.subdivisions (get) -static PyObject *EditBone_getSubdivisions(BPy_EditBone *self, void *closure) -{ - if (self->editbone) - return PyInt_FromLong(self->editbone->segments); - else - return PyInt_FromLong(self->segments); -} -//------------------------EditBone.subdivisions (set) -static int EditBone_setSubdivisions(BPy_EditBone *self, PyObject *value, void *closure) -{ - int segs; - - if (!PyArg_Parse(value, "i", &segs)) - goto AttributeError; - CLAMP(segs, 1, 32); - - if (self->editbone) - self->editbone->segments = (short)segs; - else - self->segments = (short)segs; - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".subdivisions: ", "expects a integer"); -} -//------------------------EditBone.options (get) -static PyObject *EditBone_getOptions(BPy_EditBone *self, void *closure) -{ - PyObject *list = NULL; - - list = PyList_New(0); - if (!list) - goto RuntimeError; - - if(self->editbone){ - if(self->editbone->flag & BONE_CONNECTED) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "CONNECTED")) == -1) - goto RuntimeError; - if(self->editbone->flag & BONE_HINGE) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "HINGE")) == -1) - goto RuntimeError; - if(self->editbone->flag & BONE_NO_DEFORM) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "NO_DEFORM")) == -1) - goto RuntimeError; - if(self->editbone->flag & BONE_MULT_VG_ENV) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "MULTIPLY")) == -1) - goto RuntimeError; - if(self->editbone->flag & BONE_HIDDEN_A) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "HIDDEN_EDIT")) == -1) - goto RuntimeError; - if(self->editbone->flag & BONE_ROOTSEL) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "ROOT_SELECTED")) == -1) - goto RuntimeError; - if(self->editbone->flag & BONE_SELECTED) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "BONE_SELECTED")) == -1) - goto RuntimeError; - if(self->editbone->flag & BONE_TIPSEL) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "TIP_SELECTED")) == -1) - goto RuntimeError; - }else{ - if(self->flag & BONE_CONNECTED) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "CONNECTED")) == -1) - goto RuntimeError; - if(self->flag & BONE_HINGE) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "HINGE")) == -1) - goto RuntimeError; - if(self->flag & BONE_NO_DEFORM) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "NO_DEFORM")) == -1) - goto RuntimeError; - if(self->flag & BONE_MULT_VG_ENV) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "MULTIPLY")) == -1) - goto RuntimeError; - if(self->flag & BONE_HIDDEN_A) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "HIDDEN_EDIT")) == -1) - goto RuntimeError; - if(self->flag & BONE_ROOTSEL) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "ROOT_SELECTED")) == -1) - goto RuntimeError; - if(self->flag & BONE_SELECTED) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "BONE_SELECTED")) == -1) - goto RuntimeError; - if(self->flag & BONE_TIPSEL) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "TIP_SELECTED")) == -1) - goto RuntimeError; - } - - return list; - -RuntimeError: - Py_XDECREF( list ); - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sEditBoneError, ".options: ", "Internal failure!"); -} -//----------------------(internal) EditBone_CheckValidConstant -static int EditBone_CheckValidConstant(PyObject *constant) -{ - PyObject *name = NULL; - - if (constant){ - if (BPy_Constant_Check(constant)){ - name = PyDict_GetItemString(((BPy_constant*)constant)->dict, "name"); - if (!name) - return 0; - if (!STREQ3(PyString_AsString(name), "CONNECTED", "HINGE", "NO_DEFORM") && - !STREQ3(PyString_AsString(name), "ROOT_SELECTED", "BONE_SELECTED", "TIP_SELECTED") && - !STREQ2(PyString_AsString(name), "MULTIPLY", "HIDDEN_EDIT")) - return 0; - else - return 1; - }else{ - return 0; - } - }else{ - return 0; - } -} - -//------------------------EditBone.options (set) -static int EditBone_setOptions(BPy_EditBone *self, PyObject *value, void *closure) -{ - int length, numeric_value, new_flag = 0, x; - PyObject *val = NULL, *index = NULL; - - if (PyList_Check(value)){ - length = PyList_Size(value); - for (x = 0; x < length; x++){ - index = PyList_GetItem(value, x); - if (!EditBone_CheckValidConstant(index)) - goto AttributeError2; - val = PyDict_GetItemString(((BPy_constant*)index)->dict, "value"); - if (PyInt_Check(val)){ - numeric_value = (int)PyInt_AS_LONG(val); - new_flag |= numeric_value; - }else{ - goto AttributeError2; - } - } - - //set the options - if(self->editbone){ - //make sure the 'connected' property is set up correctly - if (new_flag & BONE_CONNECTED) { - if(!self->editbone->parent) - goto AttributeError3; - else - VECCOPY(self->editbone->head, self->editbone->parent->tail); - } - self->editbone->flag = new_flag; - }else{ - self->flag = new_flag; - } - return 0; - }else if (BPy_Constant_Check(value)){ - if (!EditBone_CheckValidConstant(value)) - goto AttributeError2; - val = PyDict_GetItemString(((BPy_constant*)value)->dict, "value"); - if (PyInt_Check(val)){ - numeric_value = (int)PyInt_AS_LONG(val); - - if(self->editbone){ - //make sure the 'connected' property is set up correctly - if (numeric_value & BONE_CONNECTED) { - if(!self->editbone->parent) - goto AttributeError3; - else - VECCOPY(self->editbone->head, self->editbone->parent->tail); - } - self->editbone->flag = numeric_value; - }else{ - self->flag = numeric_value; - } - return 0; - }else{ - goto AttributeError2; - } - }else{ - goto AttributeError1; - } - -AttributeError1: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".options: ", "Expects a constant or list of constants"); -AttributeError2: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".options: ", "Please use a constant defined in the Armature module"); -AttributeError3: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".options: ", "You can't connect to parent because no parent is set"); -} -//------------------------EditBone.parent (get) -static PyObject *EditBone_getParent(BPy_EditBone *self, void *closure) -{ - if (self->editbone){ - if (self->editbone->parent) - return PyEditBone_FromEditBone(self->editbone->parent); - else - Py_RETURN_NONE; - }else{ - Py_RETURN_NONE; //not in the list yet can't have a parent - } -} -//------------------------EditBone.parent (set) -static int EditBone_setParent(BPy_EditBone *self, PyObject *value, void *closure) -{ - BPy_EditBone *parent = NULL; - - if (!PyArg_Parse(value, "O!", &EditBone_Type, &parent)) - goto AttributeError; - - if (!parent->editbone) - goto AttributeError2; - - if (self->editbone){ - self->editbone->parent = parent->editbone; - }else{ - self->parent = parent->editbone; - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".parent: ", "expects a EditBone Object"); -AttributeError2: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".parent: ", "This object is not in the armature's bone list!"); -} -//------------------------EditBone.matrix (get) -static PyObject *EditBone_getMatrix(BPy_EditBone *self, void *closure) -{ - float boneMatrix[3][3]; - float axis[3]; - - if (self->editbone){ - VECSUB(axis, self->editbone->tail, self->editbone->head); - vec_roll_to_mat3(axis, self->editbone->roll, boneMatrix); - }else{ - VECSUB(axis, self->tail, self->head); - vec_roll_to_mat3(axis, self->roll, boneMatrix); - } - - return newMatrixObject((float*)boneMatrix, 3, 3, Py_NEW); -} -//------------------------EditBone.matrix (set) -static int EditBone_setMatrix(BPy_EditBone *self, PyObject *value, void *closure) -{ - PyObject *matrix; - float roll, length, vec[3], axis[3], mat3[3][3]; - - if (!PyArg_Parse(value, "O!", &matrix_Type, &matrix)) - goto AttributeError; - - //make sure we have the right sizes - if (((MatrixObject*)matrix)->rowSize != 3 && ((MatrixObject*)matrix)->colSize != 3){ - if(((MatrixObject*)matrix)->rowSize != 4 && ((MatrixObject*)matrix)->colSize != 4){ - goto AttributeError; - } - } - - /*vec will be a normalized directional vector - * together with the length of the old bone vec*length = the new vector*/ - /*The default rotation is 0,1,0 on the Y axis (see mat3_to_vec_roll)*/ - if (((MatrixObject*)matrix)->rowSize == 4){ - Mat3CpyMat4(mat3, ((float (*)[4])*((MatrixObject*)matrix)->matrix)); - }else{ - Mat3CpyMat3(mat3, ((float (*)[3])*((MatrixObject*)matrix)->matrix)); - } - mat3_to_vec_roll(mat3, vec, &roll); - - //if a 4x4 matrix was passed we'll translate the vector otherwise not - if (self->editbone){ - self->editbone->roll = roll; - VecSubf(axis, self->editbone->tail, self->editbone->head); - length = VecLength(axis); - VecMulf(vec, length); - if (((MatrixObject*)matrix)->rowSize == 4) - VecCopyf(self->editbone->head, ((MatrixObject*)matrix)->matrix[3]); - VecAddf(self->editbone->tail, self->editbone->head, vec); - return 0; - }else{ - self->roll = roll; - VecSubf(axis, self->tail, self->head); - length = VecLength(axis); - VecMulf(vec, length); - if (((MatrixObject*)matrix)->rowSize == 4) - VecCopyf(self->head, ((MatrixObject*)matrix)->matrix[3]); - VecAddf(self->tail, self->head, vec); - return 0; - } - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".matrix: ", "expects a 3x3 or 4x4 Matrix Object"); -} -//------------------------Bone.length (get) -static PyObject *EditBone_getLength(BPy_EditBone *self, void *closure) -{ - float delta[3]; - double dot = 0.0f; - int x; - - if (self->editbone){ - VECSUB(delta, self->editbone->tail, self->editbone->head); - for(x = 0; x < 3; x++){ - dot += (delta[x] * delta[x]); - } - return PyFloat_FromDouble(sqrt(dot)); - }else{ - VECSUB(delta, self->tail, self->head); - for(x = 0; x < 3; x++){ - dot += (delta[x] * delta[x]); - } - return PyFloat_FromDouble(sqrt(dot)); - } -} -//------------------------Bone.length (set) -static int EditBone_setLength(BPy_EditBone *self, PyObject *value, void *closure) -{ - printf("Sorry this isn't implemented yet.... :/"); - return 1; -} - - -//------------------------Bone.headRadius (get) -static PyObject *EditBone_getHeadRadius(BPy_EditBone *self, void *closure) -{ - if (self->editbone) - if (self->editbone->parent && self->editbone->flag & BONE_CONNECTED) - return PyFloat_FromDouble(self->editbone->parent->rad_tail); - else - return PyFloat_FromDouble(self->editbone->rad_head); - else - if (self->parent && self->flag & BONE_CONNECTED) - return PyFloat_FromDouble(self->parent->rad_tail); - else - return PyFloat_FromDouble(self->rad_head); -} -//------------------------Bone.headRadius (set) -static int EditBone_setHeadRadius(BPy_EditBone *self, PyObject *value, void *closure) -{ - float radius; - if (!PyArg_Parse(value, "f", &radius)) - goto AttributeError; - CLAMP(radius, 0.0f, 10000.0f); - - if (self->editbone) - if (self->editbone->parent && self->editbone->flag & BONE_CONNECTED) - self->editbone->parent->rad_tail= radius; - else - self->editbone->rad_head= radius; - else - if (self->parent && self->flag & BONE_CONNECTED) - self->parent->rad_tail= radius; - else - self->rad_head= radius; - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".headRadius: ", "expects a float"); -} - - -//------------------------Bone.tailRadius (get) -static PyObject *EditBone_getTailRadius(BPy_EditBone *self, void *closure) -{ - if (self->editbone) - return PyFloat_FromDouble(self->editbone->rad_tail); - else - return PyFloat_FromDouble(self->rad_tail); -} -//------------------------Bone.tailRadius (set) -static int EditBone_setTailRadius(BPy_EditBone *self, PyObject *value, void *closure) -{ - float radius; - if (!PyArg_Parse(value, "f", &radius)) - goto AttributeError; - CLAMP(radius, 0.0f, 10000.0f); - - if (self->editbone) - self->editbone->rad_tail = radius; - else - self->rad_tail = radius; - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - 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 -//This contains a list of all methods the object contains -static PyMethodDef BPy_EditBone_methods[] = { - {"hasParent", (PyCFunction) EditBone_hasParent, METH_NOARGS, - "() - True/False - Bone has a parent"}, - {"clearParent", (PyCFunction) EditBone_clearParent, METH_NOARGS, - "() - sets the parent to None"}, - {NULL, NULL, 0, NULL} -}; -///------------------------tp_getset -//This contains methods for attributes that require checking -static PyGetSetDef BPy_EditBone_getset[] = { - {"name", (getter)EditBone_getName, (setter)EditBone_setName, - "The name of the bone", NULL}, - {"roll", (getter)EditBone_getRoll, (setter)EditBone_setRoll, - "The roll (or rotation around the axis) of the bone", NULL}, - {"head", (getter)EditBone_getHead, (setter)EditBone_setHead, - "The start point of the bone", NULL}, - {"tail", (getter)EditBone_getTail, (setter)EditBone_setTail, - "The end point of the bone", NULL}, - {"matrix", (getter)EditBone_getMatrix, (setter)EditBone_setMatrix, - "The matrix of the bone", NULL}, - {"weight", (getter)EditBone_getWeight, (setter)EditBone_setWeight, - "The weight of the bone in relation to a parented mesh", NULL}, - {"deformDist", (getter)EditBone_getDeform_dist, (setter)EditBone_setDeform_dist, - "The distance at which deformation has effect", NULL}, - {"subdivisions", (getter)EditBone_getSubdivisions, (setter)EditBone_setSubdivisions, - "The number of subdivisions (for B-Bones)", NULL}, - {"options", (getter)EditBone_getOptions, (setter)EditBone_setOptions, - "The options effective on this bone", NULL}, - {"parent", (getter)EditBone_getParent, (setter)EditBone_setParent, - "The parent bone of this bone", NULL}, - {"length", (getter)EditBone_getLength, (setter)EditBone_setLength, - "The length of this bone", NULL}, - {"tailRadius", (getter)EditBone_getTailRadius, (setter)EditBone_setTailRadius, - "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} -}; - -//------------------------tp_repr -//This is the string representation of the object -static PyObject *EditBone_repr(BPy_EditBone *self) -{ - if (self->editbone) - return PyString_FromFormat( "[EditBone \"%s\"]", self->editbone->name ); - else - return PyString_FromFormat( "[EditBone \"%s\"]", self->name ); -} - -static int EditBone_compare( BPy_EditBone * a, BPy_EditBone * b ) -{ - /* if they are not wrapped, then they cant be the same */ - if (a->editbone==NULL && b->editbone==NULL) return -1; - return ( a->editbone == b->editbone ) ? 0 : -1; -} - - -//------------------------tp_doc -//The __doc__ string for this object -static char BPy_EditBone_doc[] = "This is an internal subobject of armature\ -designed to act as a wrapper for an 'edit bone'."; - -//------------------------tp_new -//This methods creates a new object (note it does not initialize it - only the building) -static PyObject *EditBone_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - char *name = "myEditBone"; - BPy_EditBone *py_editBone = NULL; - float head[3], tail[3]; - - py_editBone = (BPy_EditBone*)type->tp_alloc(type, 0); //new - if (py_editBone == NULL) - goto RuntimeError; - - //this pointer will be set when this bone is placed in ListBase - //otherwise this will act as a py_object - py_editBone->editbone = NULL; - - unique_editbone_name(NULL, name); - BLI_strncpy(py_editBone->name, name, 32); - py_editBone->parent = NULL; - py_editBone->weight= 1.0f; - py_editBone->dist= 0.25f; - py_editBone->xwidth= 0.1f; - py_editBone->zwidth= 0.1f; - py_editBone->ease1= 1.0f; - py_editBone->ease2= 1.0f; - 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; - - head[0] = head[1] = head[2] = 0.0f; - tail[1] = tail[2] = 0.0f; - tail[0] = 1.0f; - VECCOPY(py_editBone->head, head); - VECCOPY(py_editBone->tail, tail); - - return (PyObject*)py_editBone; - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sEditBoneError, " __new__: ", "Internal Error"); -} -//------------------------tp_dealloc -//This tells how to 'tear-down' our object when ref count hits 0 -//the struct EditBone pointer will be handled by the BPy_BonesDict class -static void EditBone_dealloc(BPy_EditBone * self) -{ - EditBone_Type.tp_free(self); - return; -} -//------------------TYPE_OBECT DEFINITION-------------------------- -PyTypeObject EditBone_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "EditBone", //tp_name - sizeof(BPy_EditBone), //tp_basicsize - 0, //tp_itemsize - (destructor)EditBone_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - (cmpfunc)EditBone_compare, //tp_compare - (reprfunc)EditBone_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - 0, //tp_as_mapping - 0, //tp_hash - 0, //tp_call - 0, //tp_str - 0, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT, //tp_flags - BPy_EditBone_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - 0, //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_EditBone_methods, //tp_methods - 0, //tp_members - BPy_EditBone_getset, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - 0, //tp_init - 0, //tp_alloc - (newfunc)EditBone_new, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; - -//------------------METHOD IMPLEMENTATIONS-------------------------------- -//------------------------(internal) PyBone_ChildrenAsList -static int PyBone_ChildrenAsList(PyObject *list, ListBase *bones){ - Bone *bone = NULL; - PyObject *py_bone = NULL; - - for (bone = bones->first; bone; bone = bone->next){ - py_bone = PyBone_FromBone(bone); - if (py_bone == NULL) - return 0; - - if(PyList_Append(list, py_bone) == -1){ - return 0; - } - Py_DECREF(py_bone); - if (bone->childbase.first) - if (!PyBone_ChildrenAsList(list, &bone->childbase)) - return 0; - } - return 1; -} -//-------------------------Bone.hasParent() -static PyObject *Bone_hasParent(BPy_Bone *self) -{ - if (self->bone->parent) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} -//-------------------------Bone.hasChildren() -static PyObject *Bone_hasChildren(BPy_Bone *self) -{ - if (self->bone->childbase.first) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} -//-------------------------Bone.getAllChildren() -static PyObject *Bone_getAllChildren(BPy_Bone *self) -{ - PyObject *list = PyList_New(0); - if (!self->bone->childbase.first) { - /* do nothing */ - } else if (!PyBone_ChildrenAsList(list, &self->bone->childbase)) { - Py_XDECREF(list); - EXPP_objError(PyExc_RuntimeError, "%s%s", - sBoneError, "Internal error trying to wrap blender bones!"); - } - return list; -} - -//------------------ATTRIBUTE IMPLEMENTATIONS----------------------------- -//------------------------Bone.name (get) -static PyObject *Bone_getName(BPy_Bone *self, void *closure) -{ - return PyString_FromString(self->bone->name); -} -//------------------------Bone.name (set) -//check for char[] overflow here... -static int Bone_setName(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.roll (get) -static PyObject *Bone_getRoll(BPy_Bone *self, void *closure) -{ - return Py_BuildValue("{s:f, s:f}", - "BONESPACE", self->bone->roll * (180/Py_PI), - "ARMATURESPACE", boneRoll_ToArmatureSpace(self->bone) * (180/Py_PI)); -} -//------------------------Bone.roll (set) -static int Bone_setRoll(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.head (get) -static PyObject *Bone_getHead(BPy_Bone *self, void *closure) -{ - PyObject *val1 = newVectorObject(self->bone->head, 3, Py_WRAP); - PyObject *val2 = newVectorObject(self->bone->arm_head, 3, Py_WRAP); - PyObject *ret = Py_BuildValue( - "{s:O, s:O}", "BONESPACE", val1, "ARMATURESPACE", val2); - - Py_DECREF(val1); - Py_DECREF(val2); - return ret; -} -//------------------------Bone.head (set) -static int Bone_setHead(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.tail (get) -static PyObject *Bone_getTail(BPy_Bone *self, void *closure) -{ - PyObject *val1 = newVectorObject(self->bone->tail, 3, Py_WRAP); - PyObject *val2 = newVectorObject(self->bone->arm_tail, 3, Py_WRAP); - PyObject *ret = Py_BuildValue("{s:O, s:O}", - "BONESPACE", val1, "ARMATURESPACE", val2); - - Py_DECREF(val1); - Py_DECREF(val2); - return ret; -} -//------------------------Bone.tail (set) -static int Bone_setTail(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.weight (get) -static PyObject *Bone_getWeight(BPy_Bone *self, void *closure) -{ - return PyFloat_FromDouble(self->bone->weight); -} -//------------------------Bone.weight (set) -static int Bone_setWeight(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.deform_dist (get) -static PyObject *Bone_getDeform_dist(BPy_Bone *self, void *closure) -{ - return PyFloat_FromDouble(self->bone->dist); -} -//------------------------Bone.deform_dist (set) -static int Bone_setDeform_dist(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.subdivisions (get) -static PyObject *Bone_getSubdivisions(BPy_Bone *self, void *closure) -{ - return PyInt_FromLong(self->bone->segments); -} -//------------------------Bone.subdivisions (set) -static int Bone_setSubdivisions(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.connected (get) -static PyObject *Bone_getOptions(BPy_Bone *self, void *closure) -{ - PyObject *list = NULL; - - list = PyList_New(0); - if (list == NULL) - goto RuntimeError; - - if(self->bone->flag & BONE_CONNECTED) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "CONNECTED")) == -1) - goto RuntimeError; - if(self->bone->flag & BONE_HINGE) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "HINGE")) == -1) - goto RuntimeError; - if(self->bone->flag & BONE_NO_DEFORM) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "NO_DEFORM")) == -1) - goto RuntimeError; - if(self->bone->flag & BONE_MULT_VG_ENV) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "MULTIPLY")) == -1) - goto RuntimeError; - if(self->bone->flag & BONE_HIDDEN_A) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "HIDDEN_EDIT")) == -1) - goto RuntimeError; - if(self->bone->flag & BONE_ROOTSEL) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "ROOT_SELECTED")) == -1) - goto RuntimeError; - if(self->bone->flag & BONE_SELECTED) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "BONE_SELECTED")) == -1) - goto RuntimeError; - if(self->bone->flag & BONE_TIPSEL) - if (PyList_Append(list, - EXPP_GetModuleConstant("Blender.Armature", "TIP_SELECTED")) == -1) - goto RuntimeError; - - return list; - -RuntimeError: - Py_XDECREF(list); - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sBoneError, "getOptions(): ", "Internal failure!"); -} -//------------------------Bone.connected (set) -static int Bone_setOptions(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.parent (get) -static PyObject *Bone_getParent(BPy_Bone *self, void *closure) -{ - if (self->bone->parent) - return PyBone_FromBone(self->bone->parent); - else - Py_RETURN_NONE; -} -//------------------------Bone.parent (set) -static int Bone_setParent(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.children (get) -static PyObject *Bone_getChildren(BPy_Bone *self, void *closure) -{ - PyObject *list = PyList_New(0); - Bone *bone = NULL; - PyObject *py_bone = NULL; - - if (self->bone->childbase.first){ - for (bone = self->bone->childbase.first; bone; bone = bone->next){ - py_bone = PyBone_FromBone(bone); - if (py_bone == NULL) - goto RuntimeError; - if (PyList_Append(list, py_bone) == -1) - goto RuntimeError; - Py_DECREF(py_bone); - } - } - return list; - -RuntimeError: - Py_XDECREF(list); - Py_XDECREF(py_bone); - return EXPP_objError(PyExc_RuntimeError, "%s%s", - sBoneError, "Internal error trying to wrap blender bones!"); -} -//------------------------Bone.children (set) -static int Bone_setChildren(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.matrix (get) -static PyObject *Bone_getMatrix(BPy_Bone *self, void *closure) -{ - PyObject *val1 = newMatrixObject((float*)self->bone->bone_mat, 3,3, Py_WRAP); - PyObject *val2 = newMatrixObject((float*)self->bone->arm_mat, 4,4, Py_WRAP); - PyObject *ret = Py_BuildValue("{s:O, s:O}", - "BONESPACE", val1, "ARMATURESPACE", val2); - Py_DECREF(val1); - Py_DECREF(val2); - return ret; - - -} -//------------------------Bone.matrix (set) -static int Bone_setMatrix(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} -//------------------------Bone.length (get) -static PyObject *Bone_getLength(BPy_Bone *self, void *closure) -{ - return PyFloat_FromDouble(self->bone->length); -} -//------------------------Bone.length (set) -static int Bone_setLength(BPy_Bone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_ValueError, "%s%s", - sBoneError, "You must first call .makeEditable() to edit the armature"); -} - -//------------------------Bone.headRadius (get) -static PyObject *Bone_getHeadRadius(BPy_Bone *self, void *closure) -{ - - if (self->bone->parent && self->bone->flag & BONE_CONNECTED) - return PyFloat_FromDouble(self->bone->parent->rad_tail); - else - return PyFloat_FromDouble(self->bone->rad_head); -} -//------------------------Bone.headRadius (set) -static int Bone_setHeadRadius(BPy_Bone *self, PyObject *value, void *closure) -{ - float radius; - if (!PyArg_Parse(value, "f", &radius)) - goto AttributeError; - CLAMP(radius, 0.0f, 10000.0f); - - if (self->bone->parent && self->bone->flag & BONE_CONNECTED) - self->bone->parent->rad_tail= radius; - else - self->bone->rad_head= radius; - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sEditBoneError, ".headRadius: ", "expects a float"); -} - -//------------------------Bone.tailRadius (get) -static PyObject *Bone_getTailRadius(BPy_Bone *self, void *closure) -{ - return PyFloat_FromDouble(self->bone->rad_tail); -} - -//------------------------Bone.headRadius (set) -static int Bone_setTailRadius(BPy_Bone *self, PyObject *value, void *closure) -{ - float radius; - if (!PyArg_Parse(value, "f", &radius)) - goto AttributeError; - CLAMP(radius, 0.0f, 10000.0f); - self->bone->rad_tail= radius; - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - 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 -static PyMethodDef BPy_Bone_methods[] = { - {"hasParent", (PyCFunction) Bone_hasParent, METH_NOARGS, - "() - True/False - Bone has a parent"}, - {"hasChildren", (PyCFunction) Bone_hasChildren, METH_NOARGS, - "() - True/False - Bone has 1 or more children"}, - {"getAllChildren", (PyCFunction) Bone_getAllChildren, METH_NOARGS, - "() - All the children for this bone - including children's children"}, - {NULL, NULL, 0, NULL} -}; -//------------------------tp_getset -//This contains methods for attributes that require checking -static PyGetSetDef BPy_Bone_getset[] = { - {"name", (getter)Bone_getName, (setter)Bone_setName, - "The name of the bone", NULL}, - {"roll", (getter)Bone_getRoll, (setter)Bone_setRoll, - "The roll (or rotation around the axis) of the bone", NULL}, - {"head", (getter)Bone_getHead, (setter)Bone_setHead, - "The start point of the bone", NULL}, - {"tail", (getter)Bone_getTail, (setter)Bone_setTail, - "The end point of the bone", NULL}, - {"matrix", (getter)Bone_getMatrix, (setter)Bone_setMatrix, - "The matrix of the bone", NULL}, - {"weight", (getter)Bone_getWeight, (setter)Bone_setWeight, - "The weight of the bone in relation to a parented mesh", NULL}, - {"deform_dist", (getter)Bone_getDeform_dist, (setter)Bone_setDeform_dist, - "The distance at which deformation has effect", NULL}, - {"subdivisions", (getter)Bone_getSubdivisions, (setter)Bone_setSubdivisions, - "The number of subdivisions (for B-Bones)", NULL}, - {"options", (getter)Bone_getOptions, (setter)Bone_setOptions, - "The options effective on this bone", NULL}, - {"parent", (getter)Bone_getParent, (setter)Bone_setParent, - "The parent bone of this bone", NULL}, - {"children", (getter)Bone_getChildren, (setter)Bone_setChildren, - "The child bones of this bone", NULL}, - {"length", (getter)Bone_getLength, (setter)Bone_setLength, - "The length of this bone", NULL}, - {"tailRadius", (getter)Bone_getTailRadius, (setter)Bone_setTailRadius, - "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 -//This is the string representation of the object -static PyObject *Bone_repr(BPy_Bone *self) -{ - return PyString_FromFormat( "[Bone \"%s\"]", self->bone->name ); -} -static int Bone_compare( BPy_Bone * a, BPy_Bone * b ) -{ - return ( a->bone == b->bone ) ? 0 : -1; -} -//------------------------tp_dealloc -//This tells how to 'tear-down' our object when ref count hits 0 -static void Bone_dealloc(BPy_Bone * self) -{ - Bone_Type.tp_free(self); - return; -} -//------------------------tp_doc -//The __doc__ string for this object -static char BPy_Bone_doc[] = "This object wraps a Blender Boneobject.\n\ - This object is a subobject of the Armature object."; - -//------------------TYPE_OBECT DEFINITION-------------------------- -PyTypeObject Bone_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "Bone", //tp_name - sizeof(BPy_Bone), //tp_basicsize - 0, //tp_itemsize - (destructor)Bone_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - (cmpfunc) Bone_compare, //tp_compare - (reprfunc) Bone_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - 0, //tp_as_mapping - 0, //tp_hash - 0, //tp_call - 0, //tp_str - 0, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT, //tp_flags - BPy_Bone_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - 0, //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_Bone_methods, //tp_methods - 0, //tp_members - BPy_Bone_getset, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - 0, //tp_init - 0, //tp_alloc - 0, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; -//------------------VISIBLE PROTOTYPE IMPLEMENTATION----------------------- -//-----------------(internal) -//Converts a struct EditBone to a BPy_EditBone -PyObject *PyEditBone_FromEditBone(struct EditBone *editbone) -{ - BPy_EditBone *py_editbone = NULL; - - py_editbone = (BPy_EditBone*)EditBone_Type.tp_alloc(&EditBone_Type, 0); //*new* - if (!py_editbone) - goto RuntimeError; - - py_editbone->editbone = editbone; - - return (PyObject *) py_editbone; - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sEditBoneError, "PyEditBone_FromEditBone: ", "Internal Error Ocurred"); -} -//-----------------(internal) -//Converts a struct Bone to a BPy_Bone -PyObject *PyBone_FromBone(struct Bone *bone) -{ - BPy_Bone *py_Bone = ( BPy_Bone * ) PyObject_NEW( BPy_Bone, &Bone_Type ); - - py_Bone->bone = bone; - - return (PyObject *) py_Bone; -} -//-----------------(internal) -//Converts a PyBone to a bBone -struct Bone *PyBone_AsBone(BPy_Bone *py_Bone) -{ - return (py_Bone->bone); -} diff --git a/source/blender/python/api2_2x/Bone.h b/source/blender/python/api2_2x/Bone.h deleted file mode 100644 index da7efe27931..00000000000 --- a/source/blender/python/api2_2x/Bone.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * $Id: Bone.h 12399 2007-10-26 08:19:40Z campbellbarton $ - * - * ***** 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): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_BONE_H -#define EXPP_BONE_H - -#include -#include "DNA_armature_types.h" - -/*-------------------TYPE CHECKS---------------------------------*/ -#define BoneObject_Check(v) ((v)->ob_type == &Bone_Type) -#define EditBoneObject_Check(v) ((v)->ob_type == &EditBone_Type) -/*-------------------TYPEOBJECT----------------------------------*/ -extern PyTypeObject EditBone_Type; -extern PyTypeObject Bone_Type; -/*-------------------STRUCT DEFINITION----------------------------*/ - -typedef struct { - PyObject_HEAD - Bone * bone; -} BPy_Bone; - -typedef struct { - PyObject_HEAD - struct EditBone *editbone; - struct EditBone *parent; - char name[32]; - float roll; - float head[3]; - float tail[3]; - int flag; - float dist; - float weight; - float xwidth; - float zwidth; - float ease1; - float ease2; - float rad_head; - float rad_tail; - short segments; - short layer; -} BPy_EditBone; -/*-------------------VISIBLE PROTOTYPES-------------------------*/ -PyObject *PyBone_FromBone(struct Bone *bone); -struct Bone *PyBone_AsBone(BPy_Bone *py_Bone); -PyObject *PyEditBone_FromBone(Bone *bone); -PyObject *PyEditBone_FromEditBone(struct EditBone *editbone); - -#endif diff --git a/source/blender/python/api2_2x/Camera.c b/source/blender/python/api2_2x/Camera.c deleted file mode 100644 index bd1e7932f5c..00000000000 --- a/source/blender/python/api2_2x/Camera.c +++ /dev/null @@ -1,1057 +0,0 @@ -/* - * $Id: Camera.c 12078 2007-09-18 06:41:29Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Johnny Matthews, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Camera.h" /*This must come first */ - -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_object.h" -#include "BKE_library.h" -#include "BLI_blenlib.h" -#include "BLI_arithb.h" /* for M_PI */ -#include "BSE_editipo.h" -#include "BIF_space.h" -#include "mydevice.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "Ipo.h" - - -#define IPOKEY_LENS 0 -#define IPOKEY_CLIPPING 1 - - - -enum cam_consts { - EXPP_CAM_ATTR_LENS = 0, - EXPP_CAM_ATTR_ANGLE, - EXPP_CAM_ATTR_DOFDIST, - EXPP_CAM_ATTR_CLIPEND, - EXPP_CAM_ATTR_CLIPSTART, - EXPP_CAM_ATTR_SCALE, - EXPP_CAM_ATTR_DRAWSIZE, - EXPP_CAM_ATTR_SHIFTX, - EXPP_CAM_ATTR_SHIFTY, - EXPP_CAM_ATTR_ALPHA, -}; - -/*****************************************************************************/ -/* Python API function prototypes for the Camera module. */ -/*****************************************************************************/ -static PyObject *M_Camera_New( PyObject * self, PyObject * args, - PyObject * keywords ); -static PyObject *M_Camera_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Camera.__doc__ */ -/*****************************************************************************/ -static char M_Camera_doc[] = "The Blender Camera module\n\ -\n\ -This module provides access to **Camera Data** objects in Blender\n\ -\n\ -Example::\n\ -\n\ - from Blender import Camera, Object, Scene\n\ - c = Camera.New('ortho') # create new ortho camera data\n\ - c.scale = 6.0 # set scale value\n\ - scn = Scene.GetCurrent() # get current Scene\n\ - ob = scn.objects.new(c) # Make an object from this data in the scene\n\ - cur.setCurrentCamera(ob) # make this camera the active"; - -static char M_Camera_New_doc[] = - "Camera.New (type = 'persp', name = 'CamData'):\n\ - Return a new Camera Data object with the given type and name."; - -static char M_Camera_Get_doc[] = "Camera.Get (name = None):\n\ - Return the camera data with the given 'name', None if not found, or\n\ - Return a list with all Camera Data objects in the current scene,\n\ - if no argument was given."; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Camera module: */ -/*****************************************************************************/ -struct PyMethodDef M_Camera_methods[] = { - {"New", ( PyCFunction ) M_Camera_New, METH_VARARGS | METH_KEYWORDS, - M_Camera_New_doc}, - {"Get", M_Camera_Get, METH_VARARGS, M_Camera_Get_doc}, - {"get", M_Camera_Get, METH_VARARGS, M_Camera_Get_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Camera methods declarations: */ -/*****************************************************************************/ -static PyObject *Camera_oldgetType( BPy_Camera * self ); -static PyObject *Camera_oldgetMode( BPy_Camera * self ); -static PyObject *Camera_oldgetLens( BPy_Camera * self ); -static PyObject *Camera_oldgetClipStart( BPy_Camera * self ); -static PyObject *Camera_oldgetClipEnd( BPy_Camera * self ); -static PyObject *Camera_oldgetDrawSize( BPy_Camera * self ); -static PyObject *Camera_oldgetScale( BPy_Camera * self ); -static PyObject *Camera_getIpo( BPy_Camera * self ); -static int Camera_setIpo( BPy_Camera * self, PyObject * value ); -static PyObject *Camera_oldsetIpo( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldsetType( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldsetMode( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldsetLens( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldsetClipStart( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldsetClipEnd( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldsetDrawSize( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldsetScale( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldgetScriptLinks( BPy_Camera * self, PyObject * value ); -static PyObject *Camera_addScriptLink( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_oldclearIpo( BPy_Camera * self ); -static PyObject *Camera_clearScriptLinks( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_insertIpoKey( BPy_Camera * self, PyObject * args ); -static PyObject *Camera_copy( BPy_Camera * self ); - - -/*****************************************************************************/ -/* Python BPy_Camera methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Camera_methods[] = { - /* name, method, flags, doc */ - {"getIpo", ( PyCFunction ) Camera_getIpo, METH_NOARGS, - "() - Return Camera Data Ipo"}, - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return Camera Data name"}, - {"getType", ( PyCFunction ) Camera_oldgetType, METH_NOARGS, - "() - Return Camera type - 'persp':0, 'ortho':1"}, - {"getMode", ( PyCFunction ) Camera_oldgetMode, METH_NOARGS, - "() - Return Camera mode flags (or'ed value) -\n" - " 'showLimits':1, 'showMist':2"}, - {"getLens", ( PyCFunction ) Camera_oldgetLens, METH_NOARGS, - "() - Return *perspective* Camera lens value"}, - {"getScale", ( PyCFunction ) Camera_oldgetScale, METH_NOARGS, - "() - Return *ortho* Camera scale value"}, - {"getClipStart", ( PyCFunction ) Camera_oldgetClipStart, METH_NOARGS, - "() - Return Camera clip start value"}, - {"getClipEnd", ( PyCFunction ) Camera_oldgetClipEnd, METH_NOARGS, - "() - Return Camera clip end value"}, - {"getDrawSize", ( PyCFunction ) Camera_oldgetDrawSize, METH_NOARGS, - "() - Return Camera draw size value"}, - {"setIpo", ( PyCFunction ) Camera_oldsetIpo, METH_VARARGS, - "(Blender Ipo) - Set Camera Ipo"}, - {"clearIpo", ( PyCFunction ) Camera_oldclearIpo, METH_NOARGS, - "() - Unlink Ipo from this Camera."}, - {"insertIpoKey", ( PyCFunction ) Camera_insertIpoKey, METH_VARARGS, - "( Camera IPO type ) - Inserts a key into IPO"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(s) - Set Camera Data name"}, - {"setType", ( PyCFunction ) Camera_oldsetType, METH_O, - "(s) - Set Camera type, which can be 'persp' or 'ortho'"}, - {"setMode", ( PyCFunction ) Camera_oldsetMode, METH_VARARGS, - "(>) - Set Camera mode flag(s): 'showLimits' and 'showMist'"}, - {"setLens", ( PyCFunction ) Camera_oldsetLens, METH_O, - "(f) - Set *perpective* Camera lens value"}, - {"setScale", ( PyCFunction ) Camera_oldsetScale, METH_O, - "(f) - Set *ortho* Camera scale value"}, - {"setClipStart", ( PyCFunction ) Camera_oldsetClipStart, METH_O, - "(f) - Set Camera clip start value"}, - {"setClipEnd", ( PyCFunction ) Camera_oldsetClipEnd, METH_O, - "(f) - Set Camera clip end value"}, - {"setDrawSize", ( PyCFunction ) Camera_oldsetDrawSize, METH_O, - "(f) - Set Camera draw size value"}, - {"getScriptLinks", ( PyCFunction ) Camera_oldgetScriptLinks, METH_O, - "(eventname) - Get a list of this camera's scriptlinks (Text names) " - "of the given type\n" - "(eventname) - string: FrameChanged, Redraw or Render."}, - {"addScriptLink", ( PyCFunction ) Camera_addScriptLink, METH_VARARGS, - "(text, evt) - Add a new camera scriptlink.\n" - "(text) - string: an existing Blender Text name;\n" - "(evt) string: FrameChanged, Redraw or Render."}, - {"clearScriptLinks", ( PyCFunction ) Camera_clearScriptLinks, - METH_NOARGS, - "() - Delete all scriptlinks from this camera.\n" - "([s1<,s2,s3...>]) - Delete specified scriptlinks from this camera."}, - {"__copy__", ( PyCFunction ) Camera_copy, METH_NOARGS, - "() - Return a copy of the camera."}, - {"copy", ( PyCFunction ) Camera_copy, METH_NOARGS, - "() - Return a copy of the camera."}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python Camera_Type callback function prototypes: */ -/*****************************************************************************/ -static int Camera_compare( BPy_Camera * a, BPy_Camera * b ); -static PyObject *Camera_repr( BPy_Camera * self ); - -static PyObject *M_Camera_New( PyObject * self, PyObject * args, - PyObject * kwords ) -{ - char *type_str = "persp"; /* "persp" is type 0, "ortho" is type 1 */ - char *name_str = "Camera"; - static char *kwlist[] = { "type_str", "name_str", NULL }; - PyObject *pycam; /* for Camera Data object wrapper in Python */ - Camera *blcam; /* for actual Camera Data we create in Blender */ - - /* Parse the arguments passed in by the Python interpreter */ - if( !PyArg_ParseTupleAndKeywords( args, kwords, "|ss", kwlist, - &type_str, &name_str ) ) - /* We expected string(s) (or nothing) as argument, but we didn't get that. */ - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected zero, one or two strings as arguments" ); - - blcam = add_camera( name_str ); /* first create the Camera Data in Blender */ - - if( blcam ) /* now create the wrapper obj in Python */ - pycam = Camera_CreatePyObject( blcam ); - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Camera Data in Blender" ); - - /* let's return user count to zero, because ... */ - blcam->id.us = 0; /* ... add_camera() incref'ed it */ - /* XXX XXX Do this in other modules, too */ - - if( pycam == NULL ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Camera PyObject" ); - - if( strcmp( type_str, "persp" ) == 0 ) - /* default, no need to set, so */ - /*blcam->type = (short)EXPP_CAM_TYPE_PERSP */ - ; - /* we comment this line */ - else if( strcmp( type_str, "ortho" ) == 0 ) - blcam->type = ( short ) EXPP_CAM_TYPE_ORTHO; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown camera type" ); - - return pycam; -} - -static PyObject *M_Camera_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Camera *cam_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ); - - cam_iter = G.main->camera.first; - - if( name ) { /* (name) - Search camera by name */ - - PyObject *wanted_cam = NULL; - - while( cam_iter && !wanted_cam ) { - - if( strcmp( name, cam_iter->id.name + 2 ) == 0 ) { - wanted_cam = Camera_CreatePyObject( cam_iter ); - break; - } - - cam_iter = cam_iter->id.next; - } - - if( !wanted_cam ) { /* Requested camera doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Camera \"%s\" not found", name ); - return EXPP_ReturnPyObjError( PyExc_NameError, - error_msg ); - } - - return wanted_cam; - } - - else { /* () - return a list of wrappers for all cameras in the scene */ - int index = 0; - PyObject *cam_pylist, *pyobj; - - cam_pylist = - PyList_New( BLI_countlist( &( G.main->camera ) ) ); - - if( !cam_pylist ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ); - - while( cam_iter ) { - pyobj = Camera_CreatePyObject( cam_iter ); - - if( !pyobj ) { - Py_DECREF(cam_pylist); - return EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create Camera PyObject" ); - } - PyList_SET_ITEM( cam_pylist, index, pyobj ); - - cam_iter = cam_iter->id.next; - index++; - } - - return cam_pylist; - } -} - -PyObject *Camera_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &Camera_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Camera", - M_Camera_methods, M_Camera_doc ); - - PyModule_AddIntConstant( submodule, "LENS", IPOKEY_LENS ); - PyModule_AddIntConstant( submodule, "CLIPPING", IPOKEY_CLIPPING ); - - return submodule; -} - -/* Three Python Camera_Type helper functions needed by the Object module: */ - -PyObject *Camera_CreatePyObject( Camera * cam ) -{ - BPy_Camera *pycam; - - pycam = ( BPy_Camera * ) PyObject_NEW( BPy_Camera, &Camera_Type ); - - if( !pycam ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Camera PyObject" ); - - pycam->camera = cam; - return ( PyObject * ) pycam; -} - -Camera *Camera_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Camera * ) pyobj )->camera; -} - -/*****************************************************************************/ -/* Python BPy_Camera methods: */ -/*****************************************************************************/ - -static PyObject *Camera_oldgetType( BPy_Camera * self ) -{ - return PyInt_FromLong( self->camera->type ); -} - -static PyObject *Camera_oldgetMode( BPy_Camera * self ) -{ - return PyInt_FromLong( self->camera->flag ); -} - -static PyObject *Camera_oldgetLens( BPy_Camera * self ) -{ - return PyFloat_FromDouble( self->camera->lens ); -} - -static PyObject *Camera_oldgetScale( BPy_Camera * self ) -{ - return PyFloat_FromDouble( self->camera->ortho_scale ); -} - -static PyObject *Camera_oldgetClipStart( BPy_Camera * self ) -{ - return PyFloat_FromDouble( self->camera->clipsta ); -} - -static PyObject *Camera_oldgetClipEnd( BPy_Camera * self ) -{ - return PyFloat_FromDouble( self->camera->clipend ); -} - -static PyObject *Camera_oldgetDrawSize( BPy_Camera * self ) -{ - return PyFloat_FromDouble( self->camera->drawsize ); -} - - - -static PyObject *Camera_oldsetIpo( BPy_Camera * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Camera_setIpo ); -} - -static PyObject *Camera_oldclearIpo( BPy_Camera * self ) -{ - Camera *cam = self->camera; - Ipo *ipo = ( Ipo * ) cam->ipo; - - if( ipo ) { - ID *id = &ipo->id; - if( id->us > 0 ) - id->us--; - cam->ipo = NULL; - - return EXPP_incr_ret_True(); - } - - return EXPP_incr_ret_False(); /* no ipo found */ -} - -static PyObject *Camera_oldsetType( BPy_Camera * self, PyObject * value ) -{ - char *type = PyString_AsString(value); - - if(!value) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if( strcmp( type, "persp" ) == 0 ) - self->camera->type = ( short ) EXPP_CAM_TYPE_PERSP; - else if( strcmp( type, "ortho" ) == 0 ) - self->camera->type = ( short ) EXPP_CAM_TYPE_ORTHO; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown camera type" ); - - Py_RETURN_NONE; -} - -static PyObject *Camera_oldsetMode( BPy_Camera * self, PyObject * args ) -{ - char *mode_str1 = NULL, *mode_str2 = NULL; - short flag = 0; - - if( !PyArg_ParseTuple( args, "|ss", &mode_str1, &mode_str2 ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected one or two strings as arguments" ); - - if( mode_str1 != NULL ) { - if( strcmp( mode_str1, "showLimits" ) == 0 ) - flag |= ( short ) EXPP_CAM_MODE_SHOWLIMITS; - else if( strcmp( mode_str1, "showMist" ) == 0 ) - flag |= ( short ) EXPP_CAM_MODE_SHOWMIST; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "first argument is an unknown camera flag" ); - - if( mode_str2 != NULL ) { - if( strcmp( mode_str2, "showLimits" ) == 0 ) - flag |= ( short ) EXPP_CAM_MODE_SHOWLIMITS; - else if( strcmp( mode_str2, "showMist" ) == 0 ) - flag |= ( short ) EXPP_CAM_MODE_SHOWMIST; - else - return EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "second argument is an unknown camera flag" ); - } - } - - self->camera->flag = flag; - - Py_RETURN_NONE; -} - -static PyObject *Camera_oldsetLens( BPy_Camera * self, PyObject * value ) -{ - float param = PyFloat_AsDouble(value); - - if( !PyFloat_Check(value) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->camera->lens = EXPP_ClampFloat( param, - EXPP_CAM_LENS_MIN, - EXPP_CAM_LENS_MAX ); - - Py_RETURN_NONE; -} - -static PyObject *Camera_oldsetScale( BPy_Camera * self, PyObject * value ) -{ - float param = PyFloat_AsDouble(value); - - if( !PyFloat_Check(value) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->camera->ortho_scale = EXPP_ClampFloat( param, - EXPP_CAM_SCALE_MIN, - EXPP_CAM_SCALE_MAX ); - - Py_RETURN_NONE; -} - -static PyObject *Camera_oldsetClipStart( BPy_Camera * self, PyObject * value ) -{ - float param = PyFloat_AsDouble(value); - - if( !PyFloat_Check(value) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->camera->clipsta = EXPP_ClampFloat( param, - EXPP_CAM_CLIPSTART_MIN, - EXPP_CAM_CLIPSTART_MAX ); - - Py_RETURN_NONE; -} - -static PyObject *Camera_oldsetClipEnd( BPy_Camera * self, PyObject * value ) -{ - float param = PyFloat_AsDouble(value); - - if( !PyFloat_Check(value) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->camera->clipend = EXPP_ClampFloat( param, - EXPP_CAM_CLIPEND_MIN, - EXPP_CAM_CLIPEND_MAX ); - - Py_RETURN_NONE; -} - -static PyObject *Camera_oldsetDrawSize( BPy_Camera * self, PyObject * value ) -{ - float param = PyFloat_AsDouble(value); - - if( !PyFloat_Check(value) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->camera->drawsize = EXPP_ClampFloat( param, - EXPP_CAM_DRAWSIZE_MIN, - EXPP_CAM_DRAWSIZE_MAX ); - - Py_RETURN_NONE; -} - -/* cam.addScriptLink */ -static PyObject *Camera_addScriptLink( BPy_Camera * self, PyObject * args ) -{ - Camera *cam = self->camera; - ScriptLink *slink = NULL; - - slink = &( cam )->scriptlink; - - return EXPP_addScriptLink( slink, args, 0 ); -} - -/* cam.clearScriptLinks */ -static PyObject *Camera_clearScriptLinks( BPy_Camera * self, PyObject * args ) -{ - Camera *cam = self->camera; - ScriptLink *slink = NULL; - - slink = &( cam )->scriptlink; - - return EXPP_clearScriptLinks( slink, args ); -} - -/* cam.getScriptLinks */ -static PyObject *Camera_oldgetScriptLinks( BPy_Camera * self, PyObject * value ) -{ - Camera *cam = self->camera; - ScriptLink *slink = NULL; - PyObject *ret = NULL; - - slink = &( cam )->scriptlink; - - ret = EXPP_getScriptLinks( slink, value, 0 ); - - if( ret ) - return ret; - else - return NULL; -} - -/* cam.__copy__ */ -static PyObject *Camera_copy( BPy_Camera * self ) -{ - PyObject *pycam; /* for Camera Data object wrapper in Python */ - Camera *blcam; /* for actual Camera Data we create in Blender */ - - blcam = copy_camera( self->camera ); /* first create the Camera Data in Blender */ - - if( blcam ) /* now create the wrapper obj in Python */ - pycam = Camera_CreatePyObject( blcam ); - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Camera Data in Blender" ); - - /* let's return user count to zero, because ... */ - blcam->id.us = 0; /* ... copy_camera() incref'ed it */ - /* XXX XXX Do this in other modules, too */ - - if( pycam == NULL ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Camera PyObject" ); - - return pycam; -} - -static PyObject *Camera_getType( BPy_Camera * self ) -{ - if (self->camera->type == EXPP_CAM_TYPE_PERSP) - return PyString_FromString("persp"); - else /* must be EXPP_CAM_TYPE_ORTHO */ - return PyString_FromString("ortho"); -} - -static int Camera_setType( BPy_Camera * self, PyObject * value ) -{ - char *type = NULL; - type = PyString_AsString(value); - - if (!type) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected a string" ); - if (strcmp("persp", type)==0) { - self->camera->type = EXPP_CAM_TYPE_PERSP; - return 0; - } else if (strcmp("ortho", type)==0) { - self->camera->type = EXPP_CAM_TYPE_ORTHO; - return 0; - } - - return EXPP_ReturnIntError( PyExc_ValueError, - "expected a string \"ortho\" or \"persp\"" ); -} - - - -static PyObject *Camera_getMode( BPy_Camera * self ) -{ - return PyInt_FromLong(self->camera->flag); -} - -static int Camera_setMode( BPy_Camera * self, PyObject * value ) -{ - unsigned int flag = 0; - - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an integer (bitmask) as argument" ); - - flag = ( unsigned int )PyInt_AS_LONG( value ); - - self->camera->flag = flag; - return 0; -} - -static PyObject *Camera_getIpo( BPy_Camera * self ) -{ - struct Ipo *ipo = self->camera->ipo; - - if( ipo ) - return Ipo_CreatePyObject( ipo ); - Py_RETURN_NONE; -} - -static int Camera_setIpo( BPy_Camera * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->camera->ipo, 0, 1, ID_IP, ID_CA); -} - -/* - * get floating point attributes - */ - -static PyObject *getFloatAttr( BPy_Camera *self, void *type ) -{ - float param; - struct Camera *cam= self->camera; - - switch( (int)type ) { - case EXPP_CAM_ATTR_LENS: - param = cam->lens; - break; - case EXPP_CAM_ATTR_ANGLE: - param = 360.0f * atan(16.0f/cam->lens) / M_PI; - break; - case EXPP_CAM_ATTR_DOFDIST: - param = cam->YF_dofdist; - break; - case EXPP_CAM_ATTR_CLIPSTART: - param = cam->clipsta; - break; - case EXPP_CAM_ATTR_CLIPEND: - param = cam->clipend; - break; - case EXPP_CAM_ATTR_DRAWSIZE: - param = cam->drawsize; - break; - case EXPP_CAM_ATTR_SCALE: - param = cam->ortho_scale; - break; - case EXPP_CAM_ATTR_ALPHA: - param = cam->passepartalpha; - break; - case EXPP_CAM_ATTR_SHIFTX: - param = cam->shiftx; - break; - case EXPP_CAM_ATTR_SHIFTY: - param = cam->shifty; - break; - - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "undefined type in getFloatAttr" ); - } - - return PyFloat_FromDouble( param ); -} - - - -/* - * set floating point attributes which require clamping - */ - -static int setFloatAttrClamp( BPy_Camera *self, PyObject *value, void *type ) -{ - float *param; - struct Camera *cam = self->camera; - float min, max; - int ret; - - switch( (int)type ) { - case EXPP_CAM_ATTR_LENS: - min = 1.0; - max = 250.0; - param = &cam->lens; - break; - case EXPP_CAM_ATTR_ANGLE: - min = 7.323871; - max = 172.847331; - param = &cam->lens; - break; - case EXPP_CAM_ATTR_DOFDIST: - min = 0.0; - max = 5000.0; - param = &cam->YF_dofdist; - break; - case EXPP_CAM_ATTR_CLIPSTART: - min = 0.0; - max = 100.0; - param = &cam->clipsta; - break; - case EXPP_CAM_ATTR_CLIPEND: - min = 1.0; - max = 5000.0; - param = &cam->clipend; - break; - case EXPP_CAM_ATTR_DRAWSIZE: - min = 0.1f; - max = 10.0; - param = &cam->drawsize; - break; - case EXPP_CAM_ATTR_SCALE: - min = 0.01f; - max = 1000.0; - param = &cam->ortho_scale; - break; - case EXPP_CAM_ATTR_ALPHA: - min = 0.0; - max = 1.0; - param = &cam->passepartalpha; - break; - case EXPP_CAM_ATTR_SHIFTX: - min = -2.0; - max = 2.0; - param = &cam->shiftx; - break; - case EXPP_CAM_ATTR_SHIFTY: - min = -2.0; - max = 2.0; - param = &cam->shifty; - break; - - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setFloatAttrClamp" ); - } - - ret = EXPP_setFloatClamped( value, param, min, max ); - - if (ret==0) { - if ((int)type == EXPP_CAM_ATTR_ANGLE) { - cam->lens = 16.0f / tan(M_PI*cam->lens/360.0f); - } - } - return ret; -} - - -/* - * get floating point attributes - */ - -static PyObject *getFlagAttr( BPy_Camera *self, void *type ) -{ - if (self->camera->flag & (int)type) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -/* - * set floating point attributes which require clamping - */ - -static int setFlagAttr( BPy_Camera *self, PyObject *value, void *type ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if (param) - self->camera->flag |= (int)type; - else - self->camera->flag &= ~(int)type; - return 0; -} - - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Camera_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"type", - (getter)Camera_getType, (setter)Camera_setType, - "camera type \"persp\" or \"ortho\"", - NULL}, - {"mode", - (getter)Camera_getMode, (setter)Camera_setMode, - "Cameras mode", - NULL}, - {"ipo", - (getter)Camera_getIpo, (setter)Camera_setIpo, - "Cameras ipo", - NULL}, - - /* float settings */ - {"lens", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "lens angle for perspective cameras", - (void *)EXPP_CAM_ATTR_LENS}, - {"angle", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "lens angle for perspective cameras", - (void *)EXPP_CAM_ATTR_ANGLE}, - - {"scale", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "scale for ortho cameras", - (void *)EXPP_CAM_ATTR_SCALE}, - {"clipStart", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the cameras clip start", - (void *)EXPP_CAM_ATTR_CLIPSTART}, - {"clipEnd", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the cameras clip end", - (void *)EXPP_CAM_ATTR_CLIPEND}, - {"shiftX", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the cameras X perspective shift", - (void *)EXPP_CAM_ATTR_SHIFTX}, - {"shiftY", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the cameras Y perspective shift", - (void *)EXPP_CAM_ATTR_SHIFTY}, - {"dofDist", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "cameras dof distance", - (void *)EXPP_CAM_ATTR_DOFDIST}, - {"drawSize", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the cameras display size", - (void *)EXPP_CAM_ATTR_DRAWSIZE}, - {"alpha", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "passepart alpha value for display", - (void *)EXPP_CAM_ATTR_ALPHA}, - - /* flags - use flags as defined in DNA_camera_types.h */ - {"drawLimits", - (getter)getFlagAttr, (setter)setFlagAttr, - "toggle the draw limits display flag", - (void *)CAM_SHOWLIMITS}, - {"drawMist", - (getter)getFlagAttr, (setter)setFlagAttr, - "toggle the draw mist display flag", - (void *)CAM_SHOWMIST}, - {"drawName", - (getter)getFlagAttr, (setter)setFlagAttr, - "toggle the draw name display flag", - (void *)CAM_SHOWNAME}, - {"drawTileSafe", - (getter)getFlagAttr, (setter)setFlagAttr, - "toggle the tile safe display flag", - (void *)CAM_SHOWTITLESAFE}, - {"drawPassepartout", - (getter)getFlagAttr, (setter)setFlagAttr, - "toggle the passPartOut display flag", - (void *)CAM_SHOWPASSEPARTOUT}, - {"angleToggle", - (getter)getFlagAttr, (setter)setFlagAttr, - "toggle the camera input unit flag", - (void *)CAM_ANGLETOGGLE}, - {NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/*****************************************************************************/ -/* Python Camera_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Camera_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Camera", /* char *tp_name; */ - sizeof( BPy_Camera ), /* 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; */ - ( cmpfunc ) Camera_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Camera_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 ***/ - BPy_Camera_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Camera_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 -}; - - - -static int Camera_compare( BPy_Camera * a, BPy_Camera * b ) -{ - Camera *pa = a->camera, *pb = b->camera; - return ( pa == pb ) ? 0 : -1; -} - -static PyObject *Camera_repr( BPy_Camera * self ) -{ - return PyString_FromFormat( "[Camera \"%s\"]", - self->camera->id.name + 2 ); -} - -/* - * Camera_insertIpoKey() - * inserts Camera IPO key for LENS and CLIPPING - */ - -static PyObject *Camera_insertIpoKey( BPy_Camera * self, PyObject * args ) -{ - int key = 0; - - if( !PyArg_ParseTuple( args, "i", &( key ) ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument" ) ); - - if (key == IPOKEY_LENS){ - insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_LENS, 0); - } - else if (key == IPOKEY_CLIPPING){ - insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_STA, 0); - insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_END, 0); - } - - allspace(REMAKEIPO, 0); - EXPP_allqueue(REDRAWIPO, 0); - EXPP_allqueue(REDRAWVIEW3D, 0); - EXPP_allqueue(REDRAWACTION, 0); - EXPP_allqueue(REDRAWNLA, 0); - - Py_RETURN_NONE; -} diff --git a/source/blender/python/api2_2x/Camera.h b/source/blender/python/api2_2x/Camera.h deleted file mode 100644 index bb751a8849a..00000000000 --- a/source/blender/python/api2_2x/Camera.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * $Id: Camera.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_CAMERA_H -#define EXPP_CAMERA_H - -#include -#include "DNA_camera_types.h" - -extern PyTypeObject Camera_Type; - -#define BPy_Camera_Check(v) \ - ((v)->ob_type == &Camera_Type) /* for type checking */ - -/* Python BPy_Camera structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - Camera * camera; - -} BPy_Camera; - -/*****************************************************************************/ -/* Python BPy_Camera defaults: */ -/*****************************************************************************/ - -/* Camera types */ - -#define EXPP_CAM_TYPE_PERSP 0 -#define EXPP_CAM_TYPE_ORTHO 1 - -/* Camera mode flags */ - -#define EXPP_CAM_MODE_SHOWLIMITS 1 -#define EXPP_CAM_MODE_SHOWMIST 2 - -/* Camera MIN, MAX values */ - -#define EXPP_CAM_LENS_MIN 1.0 -#define EXPP_CAM_LENS_MAX 250.0 -#define EXPP_CAM_SCALE_MIN 0.01f -#define EXPP_CAM_SCALE_MAX 1000.0 -#define EXPP_CAM_CLIPSTART_MIN 0.0 -#define EXPP_CAM_CLIPSTART_MAX 100.0 -#define EXPP_CAM_CLIPEND_MIN 1.0 -#define EXPP_CAM_CLIPEND_MAX 5000.0 -#define EXPP_CAM_DRAWSIZE_MIN 0.1f -#define EXPP_CAM_DRAWSIZE_MAX 10.0 - -PyObject *Camera_Init( void ); -PyObject *Camera_CreatePyObject( Camera * cam ); -Camera *Camera_FromPyObject( PyObject * pyobj ); - -#endif /* EXPP_CAMERA_H */ diff --git a/source/blender/python/api2_2x/Constraint.c b/source/blender/python/api2_2x/Constraint.c deleted file mode 100644 index 51dbe6a85f9..00000000000 --- a/source/blender/python/api2_2x/Constraint.c +++ /dev/null @@ -1,2692 +0,0 @@ -/* - * $Id: Constraint.c 12705 2007-11-28 12:42:36Z ton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert, Ken Hughes, Joshua Leung - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Constraint.h" /*This must come first*/ - -#include "DNA_object_types.h" -#include "DNA_effect_types.h" -#include "DNA_vec_types.h" -#include "DNA_curve_types.h" -#include "DNA_text_types.h" - -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_action.h" -#include "BKE_armature.h" -#include "BKE_constraint.h" -#include "BLI_blenlib.h" -#include "BIF_editconstraint.h" -#include "BSE_editipo.h" -#include "MEM_guardedalloc.h" -#include "butspace.h" -#include "blendef.h" -#include "mydevice.h" - -#include "IDProp.h" -#include "Object.h" -#include "NLA.h" -#include "Text.h" -#include "gen_utils.h" - -enum constraint_constants { - EXPP_CONSTR_XROT = 0, - EXPP_CONSTR_YROT = 1, - EXPP_CONSTR_ZROT = 2, - EXPP_CONSTR_XSIZE = 10, - EXPP_CONSTR_YSIZE = 11, - EXPP_CONSTR_ZSIZE = 12, - EXPP_CONSTR_XLOC = 20, - EXPP_CONSTR_YLOC = 21, - EXPP_CONSTR_ZLOC = 22, - - EXPP_CONSTR_MAXX = TRACK_X, - EXPP_CONSTR_MAXY = TRACK_Y, - EXPP_CONSTR_MAXZ = TRACK_Z, - EXPP_CONSTR_MINX = TRACK_nX, - EXPP_CONSTR_MINY = TRACK_nY, - EXPP_CONSTR_MINZ = TRACK_nZ, - - EXPP_CONSTR_TARGET = 100, - EXPP_CONSTR_STRETCH, - EXPP_CONSTR_ITERATIONS, - EXPP_CONSTR_BONE, - EXPP_CONSTR_CHAINLEN, - EXPP_CONSTR_POSWEIGHT, - EXPP_CONSTR_ROTWEIGHT, - EXPP_CONSTR_ROTATE, - EXPP_CONSTR_USETIP, - - EXPP_CONSTR_ACTION, - EXPP_CONSTR_START, - EXPP_CONSTR_END, - EXPP_CONSTR_MIN, - EXPP_CONSTR_MAX, - EXPP_CONSTR_KEYON, - - EXPP_CONSTR_TRACK, - EXPP_CONSTR_UP, - - EXPP_CONSTR_RESTLENGTH, - EXPP_CONSTR_VOLVARIATION, - EXPP_CONSTR_VOLUMEMODE, - EXPP_CONSTR_PLANE, - - EXPP_CONSTR_FOLLOW, - EXPP_CONSTR_OFFSET, - EXPP_CONSTR_FORWARD, - - EXPP_CONSTR_LOCK, - - EXPP_CONSTR_MINMAX, - EXPP_CONSTR_STICKY, - - EXPP_CONSTR_COPY, - EXPP_CONSTR_LIMIT, - EXPP_CONSTR_CLAMP, - - EXPP_CONSTR_LIMXMIN = LIMIT_XMIN, - EXPP_CONSTR_LIMXMAX = LIMIT_XMAX, - EXPP_CONSTR_LIMYMIN = LIMIT_YMIN, - EXPP_CONSTR_LIMYMAX = LIMIT_YMAX, - EXPP_CONSTR_LIMZMIN = LIMIT_ZMIN, - EXPP_CONSTR_LIMZMAX = LIMIT_ZMAX, - - EXPP_CONSTR_LIMXROT = LIMIT_XROT, - EXPP_CONSTR_LIMYROT = LIMIT_YROT, - EXPP_CONSTR_LIMZROT = LIMIT_ZROT, - - EXPP_CONSTR_CLAMPCYCLIC, - - EXPP_CONSTR_XMIN, - EXPP_CONSTR_XMAX, - EXPP_CONSTR_YMIN, - EXPP_CONSTR_YMAX, - EXPP_CONSTR_ZMIN, - EXPP_CONSTR_ZMAX, - - EXPP_CONSTR_SCRIPT, - EXPP_CONSTR_PROPS, - - EXPP_CONSTR_FROM, - EXPP_CONSTR_TO, - EXPP_CONSTR_EXPO, - EXPP_CONSTR_FROMMINX, - EXPP_CONSTR_FROMMAXX, - EXPP_CONSTR_FROMMINY, - EXPP_CONSTR_FROMMAXY, - EXPP_CONSTR_FROMMINZ, - EXPP_CONSTR_FROMMAXZ, - EXPP_CONSTR_TOMINX, - EXPP_CONSTR_TOMAXX, - EXPP_CONSTR_TOMINY, - EXPP_CONSTR_TOMAXY, - EXPP_CONSTR_TOMINZ, - EXPP_CONSTR_TOMAXZ, - EXPP_CONSTR_MAPX, - EXPP_CONSTR_MAPY, - EXPP_CONSTR_MAPZ, - - EXPP_CONSTR_OWNSPACE, - EXPP_CONSTR_TARSPACE, - - EXPP_CONSTR_RB_TYPE, - EXPP_CONSTR_RB_BALL, - EXPP_CONSTR_RB_HINGE, - EXPP_CONSTR_RB_GENERIC6DOF, - EXPP_CONSTR_RB_VEHICLE, - EXPP_CONSTR_RB_PIVX, - EXPP_CONSTR_RB_PIVY, - EXPP_CONSTR_RB_PIVZ, - EXPP_CONSTR_RB_AXX, - EXPP_CONSTR_RB_AXY, - EXPP_CONSTR_RB_AXZ, - EXPP_CONSTR_RB_MINLIMIT0, - EXPP_CONSTR_RB_MINLIMIT1, - EXPP_CONSTR_RB_MINLIMIT2, - EXPP_CONSTR_RB_MINLIMIT3, - EXPP_CONSTR_RB_MINLIMIT4, - EXPP_CONSTR_RB_MINLIMIT5, - EXPP_CONSTR_RB_MAXLIMIT0, - EXPP_CONSTR_RB_MAXLIMIT1, - EXPP_CONSTR_RB_MAXLIMIT2, - EXPP_CONSTR_RB_MAXLIMIT3, - EXPP_CONSTR_RB_MAXLIMIT4, - EXPP_CONSTR_RB_MAXLIMIT5, - EXPP_CONSTR_RB_EXTRAFZ, - EXPP_CONSTR_RB_FLAG, - -}; - -/*****************************************************************************/ -/* Python BPy_Constraint methods declarations: */ -/*****************************************************************************/ -static PyObject *Constraint_getName( BPy_Constraint * self ); -static int Constraint_setName( BPy_Constraint * self, PyObject *arg ); -static PyObject *Constraint_getType( BPy_Constraint * self ); -static PyObject *Constraint_getInfluence( BPy_Constraint * self ); -static int Constraint_setInfluence( BPy_Constraint * self, PyObject * arg ); - -static PyObject *Constraint_insertKey( BPy_Constraint * self, PyObject * arg ); - -static PyObject *Constraint_getData( BPy_Constraint * self, PyObject * key ); -static int Constraint_setData( BPy_Constraint * self, PyObject * key, - PyObject * value ); - -/*****************************************************************************/ -/* Python BPy_Constraint methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Constraint_methods[] = { - /* name, method, flags, doc */ - {"insertKey", ( PyCFunction ) Constraint_insertKey, METH_O, - "Insert influence keyframe for constraint"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Constraint attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Constraint_getseters[] = { - {"name", - (getter)Constraint_getName, (setter)Constraint_setName, - "Constraint name", NULL}, - {"type", - (getter)Constraint_getType, (setter)NULL, - "Constraint type (read only)", NULL}, - {"influence", - (getter)Constraint_getInfluence, (setter)Constraint_setInfluence, - "Constraint influence", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Constraint_Type Mapping Methods table: */ -/*****************************************************************************/ -static PyMappingMethods Constraint_as_mapping = { - NULL, /* mp_length */ - ( binaryfunc ) Constraint_getData, /* mp_subscript */ - ( objobjargproc ) Constraint_setData, /* mp_ass_subscript */ -}; - -/*****************************************************************************/ -/* Python Constraint_Type callback function prototypes: */ -/*****************************************************************************/ -static PyObject *Constraint_repr( BPy_Constraint * self ); -static int Constraint_compare( BPy_Constraint * a, BPy_Constraint * b ); - -/*****************************************************************************/ -/* Python Constraint_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Constraint_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Constraint", /* char *tp_name; */ - sizeof( BPy_Constraint ), /* 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; */ - ( cmpfunc ) Constraint_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Constraint_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - &Constraint_as_mapping, /* 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 ***/ - BPy_Constraint_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Constraint_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 -}; - -/*****************************************************************************/ -/* Python BPy_Constraint methods: */ -/*****************************************************************************/ - -/* - * return the name of this constraint - */ - -static PyObject *Constraint_getName( BPy_Constraint * self ) -{ - if( !self->con ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - return PyString_FromString( self->con->name ); -} - -/* - * set the name of this constraint - */ - -static int Constraint_setName( BPy_Constraint * self, PyObject * attr ) -{ - char *name = PyString_AsString( attr ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected string arg" ); - - if( !self->con ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - BLI_strncpy( self->con->name, name, sizeof( self->con->name ) ); - - return 0; -} - -/* - * return the influence of this constraint - */ - -static PyObject *Constraint_getInfluence( BPy_Constraint * self ) -{ - if( !self->con ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - return PyFloat_FromDouble( (double)self->con->enforce ); -} - -/* - * set the influence of this constraint - */ - -static int Constraint_setInfluence( BPy_Constraint * self, PyObject * value ) -{ - if( !self->con ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - return EXPP_setFloatClamped( value, &self->con->enforce, 0.0, 1.0 ); -} - -/* - * return the type of this constraint - */ - -static PyObject *Constraint_getType( BPy_Constraint * self ) -{ - if( !self->con ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - return PyInt_FromLong( self->con->type ); -} - -/* - * add keyframe for influence - base on code in add_influence_key_to_constraint_func() - */ -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] = ""; - - if( !self->con ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - /* get frame for inserting key */ - if( PyFloat_Check(value) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a float argument" ); - - /* 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, - "cannot get a curve from this IPO, may be using libdata" ); - - if( ob->action ) - insert_vert_icu( icu, get_action_frame(ob, cfra), con->enforce, 0); - else - insert_vert_icu( icu, cfra, con->enforce, 0); - - Py_RETURN_NONE; -} - -/******************************************************************************/ -/* Constraint Space Conversion get/set procedures */ -/* - These are called before/instead of individual constraint */ -/* get/set procedures when OWNERSPACE or TARGETSPACE are chosen */ -/* - They are only called from Constraint_g/setData */ -/******************************************************************************/ - -static PyObject *constspace_getter( BPy_Constraint * self, int type ) -{ - bConstraint *con= (bConstraint *)(self->con); - - /* depends on type being asked for - * NOTE: not all constraints support all space types - */ - if (type == EXPP_CONSTR_OWNSPACE) { - switch (con->type) { - /* all of these support this... */ - case CONSTRAINT_TYPE_PYTHON: - case CONSTRAINT_TYPE_LOCLIKE: - case CONSTRAINT_TYPE_ROTLIKE: - case CONSTRAINT_TYPE_SIZELIKE: - case CONSTRAINT_TYPE_TRACKTO: - case CONSTRAINT_TYPE_LOCLIMIT: - case CONSTRAINT_TYPE_ROTLIMIT: - case CONSTRAINT_TYPE_SIZELIMIT: - case CONSTRAINT_TYPE_TRANSFORM: - return PyInt_FromLong( (long)con->ownspace ); - } - } - else if (type == EXPP_CONSTR_TARSPACE) { - switch (con->type) { - /* all of these support this... */ - case CONSTRAINT_TYPE_PYTHON: - case CONSTRAINT_TYPE_ACTION: - case CONSTRAINT_TYPE_LOCLIKE: - case CONSTRAINT_TYPE_ROTLIKE: - case CONSTRAINT_TYPE_SIZELIKE: - case CONSTRAINT_TYPE_TRACKTO: - case CONSTRAINT_TYPE_TRANSFORM: - return PyInt_FromLong( (long)con->tarspace ); - } - } - - /* raise error if failed */ - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); -} - -static int constspace_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bConstraint *con= (bConstraint *)(self->con); - - /* depends on type being asked for - * NOTE: not all constraints support all space types - */ - if (type == EXPP_CONSTR_OWNSPACE) { - switch (con->type) { - /* all of these support this... */ - case CONSTRAINT_TYPE_PYTHON: - case CONSTRAINT_TYPE_LOCLIKE: - case CONSTRAINT_TYPE_ROTLIKE: - case CONSTRAINT_TYPE_SIZELIKE: - case CONSTRAINT_TYPE_TRACKTO: - case CONSTRAINT_TYPE_LOCLIMIT: - case CONSTRAINT_TYPE_ROTLIMIT: - case CONSTRAINT_TYPE_SIZELIMIT: - case CONSTRAINT_TYPE_TRANSFORM: - { - /* only copy depending on ownertype */ - if (self->pchan) { - return EXPP_setIValueClamped( value, &con->ownspace, - CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_PARLOCAL, 'h' ); - } - else { - return EXPP_setIValueClamped( value, &con->ownspace, - CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, 'h' ); - } - } - break; - } - } - else if (type == EXPP_CONSTR_TARSPACE) { - switch (con->type) { - /* all of these support this... */ - case CONSTRAINT_TYPE_PYTHON: - case CONSTRAINT_TYPE_ACTION: - case CONSTRAINT_TYPE_LOCLIKE: - case CONSTRAINT_TYPE_ROTLIKE: - case CONSTRAINT_TYPE_SIZELIKE: - case CONSTRAINT_TYPE_TRACKTO: - case CONSTRAINT_TYPE_TRANSFORM: - { - Object *tar; - char *subtarget; - - // FIXME!!! - //tar= get_constraint_target(con, &subtarget); - tar = NULL; - subtarget = NULL; - - /* only copy depending on target-type */ - if (tar && subtarget[0]) { - return EXPP_setIValueClamped( value, &con->tarspace, - CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_PARLOCAL, 'h' ); - } - else if (tar) { - return EXPP_setIValueClamped( value, &con->tarspace, - CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, 'h' ); - } - } - break; - } - } - - /* raise error if failed */ - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); -} - -/*****************************************************************************/ -/* Specific constraint get/set procedures */ -/*****************************************************************************/ - -static PyObject *kinematic_getter( BPy_Constraint * self, int type ) -{ - bKinematicConstraint *con = (bKinematicConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_STRETCH: - return PyBool_FromLong( (long)( con->flag & CONSTRAINT_IK_STRETCH ) ) ; - case EXPP_CONSTR_ITERATIONS: - return PyInt_FromLong( (long)con->iterations ); - case EXPP_CONSTR_CHAINLEN: - return PyInt_FromLong( (long)con->rootbone ); - case EXPP_CONSTR_POSWEIGHT: - return PyFloat_FromDouble( (double)con->weight ); - case EXPP_CONSTR_ROTWEIGHT: - return PyFloat_FromDouble( (double)con->orientweight ); - case EXPP_CONSTR_ROTATE: - return PyBool_FromLong( (long)( con->flag & CONSTRAINT_IK_ROT ) ) ; - case EXPP_CONSTR_USETIP: - return PyBool_FromLong( (long)( con->flag & CONSTRAINT_IK_TIP ) ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int kinematic_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bKinematicConstraint *con = (bKinematicConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_STRETCH: - return EXPP_setBitfield( value, &con->flag, CONSTRAINT_IK_STRETCH, 'h' ); - case EXPP_CONSTR_ITERATIONS: - return EXPP_setIValueClamped( value, &con->iterations, 1, 10000, 'h' ); - case EXPP_CONSTR_CHAINLEN: - return EXPP_setIValueClamped( value, &con->rootbone, 0, 255, 'i' ); - case EXPP_CONSTR_POSWEIGHT: - return EXPP_setFloatClamped( value, &con->weight, 0.01f, 1.0 ); - case EXPP_CONSTR_ROTWEIGHT: - return EXPP_setFloatClamped( value, &con->orientweight, 0.01f, 1.0 ); - case EXPP_CONSTR_ROTATE: - return EXPP_setBitfield( value, &con->flag, CONSTRAINT_IK_ROT, 'h' ); - case EXPP_CONSTR_USETIP: - return EXPP_setBitfield( value, &con->flag, CONSTRAINT_IK_TIP, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *action_getter( BPy_Constraint * self, int type ) -{ - bActionConstraint *con = (bActionConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_ACTION: - return Action_CreatePyObject( con->act ); - case EXPP_CONSTR_START: - return PyInt_FromLong( (long)con->start ); - case EXPP_CONSTR_END: - return PyInt_FromLong( (long)con->end ); - case EXPP_CONSTR_MIN: - return PyFloat_FromDouble( (double)con->min ); - case EXPP_CONSTR_MAX: - return PyFloat_FromDouble( (double)con->max ); - case EXPP_CONSTR_KEYON: - return PyInt_FromLong( (long)con->type ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int action_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bActionConstraint *con = (bActionConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_ACTION: { - bAction *act = (( BPy_Action * )value)->action; - if( !BPy_Action_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy action argument" ); - con->act = act; - return 0; - } - case EXPP_CONSTR_START: - return EXPP_setIValueClamped( value, &con->start, 1, MAXFRAME, 'h' ); - case EXPP_CONSTR_END: - return EXPP_setIValueClamped( value, &con->end, 1, MAXFRAME, 'h' ); - case EXPP_CONSTR_MIN: - if (con->type < 10) - return EXPP_setFloatClamped( value, &con->min, -180.0, 180.0 ); - else if (con->type < 20) - return EXPP_setFloatClamped( value, &con->min, 0.0001, 1000.0 ); - else - return EXPP_setFloatClamped( value, &con->min, -1000.0, 1000.0 ); - case EXPP_CONSTR_MAX: - if (con->type < 10) - return EXPP_setFloatClamped( value, &con->max, -180.0, 180.0 ); - else if (con->type < 20) - return EXPP_setFloatClamped( value, &con->max, 0.0001, 1000.0 ); - else - return EXPP_setFloatClamped( value, &con->max, -1000.0, 1000.0 ); - case EXPP_CONSTR_KEYON: - return EXPP_setIValueRange( value, &con->type, - EXPP_CONSTR_XROT, EXPP_CONSTR_ZLOC, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *trackto_getter( BPy_Constraint * self, int type ) -{ - bTrackToConstraint *con = (bTrackToConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_TRACK: - return PyInt_FromLong( (long)con->reserved1 ); - case EXPP_CONSTR_UP: - return PyInt_FromLong( (long)con->reserved2 ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int trackto_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bTrackToConstraint *con = (bTrackToConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_TRACK: - return EXPP_setIValueRange( value, &con->reserved1, - TRACK_X, TRACK_nZ, 'i' ); - case EXPP_CONSTR_UP: - return EXPP_setIValueRange( value, &con->reserved2, - UP_X, UP_Z, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *stretchto_getter( BPy_Constraint * self, int type ) -{ - bStretchToConstraint *con = (bStretchToConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_RESTLENGTH: - return PyFloat_FromDouble( (double)con->orglength ); - case EXPP_CONSTR_VOLVARIATION: - return PyFloat_FromDouble( (double)con->bulge ); - case EXPP_CONSTR_VOLUMEMODE: - return PyInt_FromLong( (long)con->volmode ); - case EXPP_CONSTR_PLANE: - return PyInt_FromLong( (long)con->plane ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int stretchto_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bStretchToConstraint *con = (bStretchToConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_RESTLENGTH: - return EXPP_setFloatClamped( value, &con->orglength, 0.0, 100.0 ); - case EXPP_CONSTR_VOLVARIATION: - return EXPP_setFloatClamped( value, &con->bulge, 0.0, 100.0 ); - case EXPP_CONSTR_VOLUMEMODE: - return EXPP_setIValueRange( value, &con->volmode, - VOLUME_XZ, NO_VOLUME, 'h' ); - case EXPP_CONSTR_PLANE: { - int status, oldcode = con->plane; - status = EXPP_setIValueRange( value, &con->plane, - PLANE_X, PLANE_Z, 'h' ); - if( !status && con->plane == PLANE_Y ) { - con->plane = oldcode; - return EXPP_ReturnIntError( PyExc_ValueError, - "value must be either PLANEX or PLANEZ" ); - } - return status; - } - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *followpath_getter( BPy_Constraint * self, int type ) -{ - bFollowPathConstraint *con = (bFollowPathConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_FOLLOW: - return PyBool_FromLong( (long)( con->followflag & SELECT ) ); - case EXPP_CONSTR_OFFSET: - return PyFloat_FromDouble( (double)con->offset ); - case EXPP_CONSTR_FORWARD: - return PyInt_FromLong( (long)con->trackflag ); - case EXPP_CONSTR_UP: - return PyInt_FromLong( (long)con->upflag ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int followpath_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bFollowPathConstraint *con = (bFollowPathConstraint *)(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_FOLLOW: - return EXPP_setBitfield( value, &con->followflag, SELECT, 'i' ); - case EXPP_CONSTR_OFFSET: - return EXPP_setFloatClamped( value, &con->offset, - -MAXFRAMEF, MAXFRAMEF ); - case EXPP_CONSTR_FORWARD: - return EXPP_setIValueRange( value, &con->trackflag, - TRACK_X, TRACK_nZ, 'i' ); - case EXPP_CONSTR_UP: - return EXPP_setIValueRange( value, &con->upflag, - UP_X, UP_Z, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *clampto_getter( BPy_Constraint * self, int type ) -{ - bClampToConstraint *con = (bClampToConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_CLAMP: - return PyInt_FromLong( (long)con->flag ); - case EXPP_CONSTR_CLAMPCYCLIC: - return PyBool_FromLong( (long)(con->flag2 & CLAMPTO_CYCLIC) ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int clampto_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bClampToConstraint *con = (bClampToConstraint *)(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_CLAMP: - return EXPP_setIValueRange( value, &con->flag, - CLAMPTO_AUTO, CLAMPTO_Z, 'i' ); - case EXPP_CONSTR_CLAMPCYCLIC: - return EXPP_setBitfield( value, &con->flag2, CLAMPTO_CYCLIC, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} -static PyObject *locktrack_getter( BPy_Constraint * self, int type ) -{ - bLockTrackConstraint *con = (bLockTrackConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_TRACK: - return PyInt_FromLong( (long)con->trackflag ); - case EXPP_CONSTR_LOCK: - return PyInt_FromLong( (long)con->lockflag ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int locktrack_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bLockTrackConstraint *con = (bLockTrackConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_TRACK: - return EXPP_setIValueRange( value, &con->trackflag, - TRACK_X, TRACK_nZ, 'i' ); - case EXPP_CONSTR_LOCK: - return EXPP_setIValueRange( value, &con->lockflag, - LOCK_X, LOCK_Z, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *floor_getter( BPy_Constraint * self, int type ) -{ - bMinMaxConstraint *con = (bMinMaxConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_MINMAX: - return PyInt_FromLong( (long)con->minmaxflag ); - case EXPP_CONSTR_OFFSET: - return PyFloat_FromDouble( (double)con->offset ); - case EXPP_CONSTR_STICKY: - return PyBool_FromLong( (long)( con->flag & MINMAX_STICKY ) ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int floor_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bMinMaxConstraint *con = (bMinMaxConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_MINMAX: - return EXPP_setIValueRange( value, &con->minmaxflag, - EXPP_CONSTR_MAXX, EXPP_CONSTR_MINZ, 'i' ); - case EXPP_CONSTR_OFFSET: - return EXPP_setFloatClamped( value, &con->offset, -100.0, 100.0 ); - case EXPP_CONSTR_STICKY: - return EXPP_setBitfield( value, &con->flag, MINMAX_STICKY, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *locatelike_getter( BPy_Constraint * self, int type ) -{ - bLocateLikeConstraint *con = (bLocateLikeConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_COPY: - return PyInt_FromLong( (long)con->flag ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int locatelike_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bLocateLikeConstraint *con = (bLocateLikeConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_COPY: - return EXPP_setIValueRange( value, &con->flag, - 0, LOCLIKE_X | LOCLIKE_Y | LOCLIKE_Z | LOCLIKE_X_INVERT | LOCLIKE_Y_INVERT | LOCLIKE_Z_INVERT, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *rotatelike_getter( BPy_Constraint * self, int type ) -{ - bRotateLikeConstraint *con = (bRotateLikeConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_COPY: - return PyInt_FromLong( (long)con->flag ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int rotatelike_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bRotateLikeConstraint *con = (bRotateLikeConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_COPY: - return EXPP_setIValueRange( value, &con->flag, - 0, ROTLIKE_X | ROTLIKE_Y | ROTLIKE_Z | ROTLIKE_X_INVERT | ROTLIKE_Y_INVERT | ROTLIKE_Z_INVERT, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *sizelike_getter( BPy_Constraint * self, int type ) -{ - bSizeLikeConstraint *con = (bSizeLikeConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_COPY: - return PyInt_FromLong( (long)con->flag ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int sizelike_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bSizeLikeConstraint *con = (bSizeLikeConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_COPY: - return EXPP_setIValueRange( value, &con->flag, - 0, SIZELIKE_X | SIZELIKE_Y | SIZELIKE_Z, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *loclimit_getter( BPy_Constraint * self, int type) -{ - bLocLimitConstraint *con = (bLocLimitConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_LIMIT: - return PyInt_FromLong( (long)con->flag ); - case EXPP_CONSTR_XMIN: - return PyFloat_FromDouble( (double)con->xmin ); - case EXPP_CONSTR_XMAX: - return PyFloat_FromDouble( (double)con->xmax ); - case EXPP_CONSTR_YMIN: - return PyFloat_FromDouble( (double)con->ymin ); - case EXPP_CONSTR_YMAX: - return PyFloat_FromDouble( (double)con->ymax ); - case EXPP_CONSTR_ZMIN: - return PyFloat_FromDouble( (double)con->zmin ); - case EXPP_CONSTR_ZMAX: - return PyFloat_FromDouble( (double)con->zmax ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int loclimit_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bLocLimitConstraint *con = (bLocLimitConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_LIMIT: - return EXPP_setIValueRange( value, &con->flag, 0, - LIMIT_XMIN | LIMIT_XMAX | LIMIT_YMIN | LIMIT_YMAX | LIMIT_ZMIN | LIMIT_ZMAX , 'i' ); - case EXPP_CONSTR_XMIN: - return EXPP_setFloatClamped( value, &con->xmin, -1000.0, 1000.0 ); - case EXPP_CONSTR_XMAX: - return EXPP_setFloatClamped( value, &con->xmax, -1000.0, 1000.0 ); - case EXPP_CONSTR_YMIN: - return EXPP_setFloatClamped( value, &con->ymin, -1000.0, 1000.0 ); - case EXPP_CONSTR_YMAX: - return EXPP_setFloatClamped( value, &con->ymax, -1000.0, 1000.0 ); - case EXPP_CONSTR_ZMIN: - return EXPP_setFloatClamped( value, &con->zmin, -1000.0, 1000.0 ); - case EXPP_CONSTR_ZMAX: - return EXPP_setFloatClamped( value, &con->zmax, -1000.0, 1000.0 ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *rotlimit_getter( BPy_Constraint * self, int type ) -{ - bRotLimitConstraint *con = (bRotLimitConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_LIMIT: - return PyInt_FromLong( (long)con->flag ); - case EXPP_CONSTR_XMIN: - return PyFloat_FromDouble( (double)con->xmin ); - case EXPP_CONSTR_XMAX: - return PyFloat_FromDouble( (double)con->xmax ); - case EXPP_CONSTR_YMIN: - return PyFloat_FromDouble( (double)con->ymin ); - case EXPP_CONSTR_YMAX: - return PyFloat_FromDouble( (double)con->ymax ); - case EXPP_CONSTR_ZMIN: - return PyFloat_FromDouble( (double)con->zmin ); - case EXPP_CONSTR_ZMAX: - return PyFloat_FromDouble( (double)con->zmax ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int rotlimit_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bRotLimitConstraint *con = (bRotLimitConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_LIMIT: - return EXPP_setIValueRange( value, &con->flag, 0, - LIMIT_XROT | LIMIT_YROT | LIMIT_ZROT, 'i' ); - case EXPP_CONSTR_XMIN: - return EXPP_setFloatClamped( value, &con->xmin, -360.0, 360.0 ); - case EXPP_CONSTR_XMAX: - return EXPP_setFloatClamped( value, &con->xmax, -360.0, 360.0 ); - case EXPP_CONSTR_YMIN: - return EXPP_setFloatClamped( value, &con->ymin, -360.0, 360.0 ); - case EXPP_CONSTR_YMAX: - return EXPP_setFloatClamped( value, &con->ymax, -360.0, 360.0 ); - case EXPP_CONSTR_ZMIN: - return EXPP_setFloatClamped( value, &con->zmin, -360.0, 360.0 ); - case EXPP_CONSTR_ZMAX: - return EXPP_setFloatClamped( value, &con->zmax, -360.0, 360.0 ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *sizelimit_getter( BPy_Constraint * self, int type) -{ - bSizeLimitConstraint *con = (bSizeLimitConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_LIMIT: - return PyInt_FromLong( (long)con->flag ); - case EXPP_CONSTR_XMIN: - return PyFloat_FromDouble( (double)con->xmin ); - case EXPP_CONSTR_XMAX: - return PyFloat_FromDouble( (double)con->xmax ); - case EXPP_CONSTR_YMIN: - return PyFloat_FromDouble( (double)con->ymin ); - case EXPP_CONSTR_YMAX: - return PyFloat_FromDouble( (double)con->ymax ); - case EXPP_CONSTR_ZMIN: - return PyFloat_FromDouble( (double)con->zmin ); - case EXPP_CONSTR_ZMAX: - return PyFloat_FromDouble( (double)con->zmax ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int sizelimit_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bSizeLimitConstraint *con = (bSizeLimitConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_LIMIT: - return EXPP_setIValueRange( value, &con->flag, 0, - LIMIT_XMIN | LIMIT_XMAX | LIMIT_YMIN | LIMIT_YMAX | LIMIT_ZMIN | LIMIT_ZMAX, 'i' ); - case EXPP_CONSTR_XMIN: - return EXPP_setFloatClamped( value, &con->xmin, -1000.0, 1000.0 ); - case EXPP_CONSTR_XMAX: - return EXPP_setFloatClamped( value, &con->xmax, -1000.0, 1000.0 ); - case EXPP_CONSTR_YMIN: - return EXPP_setFloatClamped( value, &con->ymin, -1000.0, 1000.0 ); - case EXPP_CONSTR_YMAX: - return EXPP_setFloatClamped( value, &con->ymax, -1000.0, 1000.0 ); - case EXPP_CONSTR_ZMIN: - return EXPP_setFloatClamped( value, &con->zmin, -1000.0, 1000.0 ); - case EXPP_CONSTR_ZMAX: - return EXPP_setFloatClamped( value, &con->zmax, -1000.0, 1000.0 ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *script_getter( BPy_Constraint * self, int type ) -{ - bPythonConstraint *con = (bPythonConstraint *)(self->con->data); - - switch( type ) { - // FIXME!!! - //case EXPP_CONSTR_TARGET: - // return Object_CreatePyObject( con->tar ); - //case EXPP_CONSTR_BONE: - // return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_SCRIPT: - return Text_CreatePyObject( con->text ); - case EXPP_CONSTR_PROPS: - return BPy_Wrap_IDProperty( NULL, con->prop, NULL); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int script_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bPythonConstraint *con = (bPythonConstraint *)(self->con->data); - - switch( type ) { - // FIXME!!! - //case EXPP_CONSTR_TARGET: { - // Object *obj = (( BPy_Object * )value)->object; - // if( !BPy_Object_Check( value ) ) - // return EXPP_ReturnIntError( PyExc_TypeError, - // "expected BPy object argument" ); - // con->tar = obj; - // return 0; - // } - //case EXPP_CONSTR_BONE: { - // char *name = PyString_AsString( value ); - // if( !name ) - // return EXPP_ReturnIntError( PyExc_TypeError, - // "expected string arg" ); - // - // BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - // - // return 0; - // } - case EXPP_CONSTR_SCRIPT: { - Text *text = (( BPy_Text * )value)->text; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy text argument" ); - con->text = text; - return 0; - } - case EXPP_CONSTR_PROPS: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "setting ID-Properties of PyConstraints this way is not supported" ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - - -static PyObject *rigidbody_getter( BPy_Constraint * self, int type) -{ - bRigidBodyJointConstraint *con = (bRigidBodyJointConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_RB_PIVX: - return PyFloat_FromDouble( (double)con->pivX ); - case EXPP_CONSTR_RB_PIVY: - return PyFloat_FromDouble( (double)con->pivY ); - case EXPP_CONSTR_RB_PIVZ: - return PyFloat_FromDouble( (double)con->pivZ ); - case EXPP_CONSTR_RB_AXX: - return PyFloat_FromDouble( (double)con->axX ); - case EXPP_CONSTR_RB_AXY: - return PyFloat_FromDouble( (double)con->axY ); - case EXPP_CONSTR_RB_AXZ: - return PyFloat_FromDouble( (double)con->axZ ); - case EXPP_CONSTR_RB_MINLIMIT0: - return PyFloat_FromDouble( (double)con->minLimit[0] ); - case EXPP_CONSTR_RB_MINLIMIT1: - return PyFloat_FromDouble( (double)con->minLimit[1] ); - case EXPP_CONSTR_RB_MINLIMIT2: - return PyFloat_FromDouble( (double)con->minLimit[2] ); - case EXPP_CONSTR_RB_MINLIMIT3: - return PyFloat_FromDouble( (double)con->minLimit[3] ); - case EXPP_CONSTR_RB_MINLIMIT4: - return PyFloat_FromDouble( (double)con->minLimit[4] ); - case EXPP_CONSTR_RB_MINLIMIT5: - return PyFloat_FromDouble( (double)con->minLimit[5] ); - case EXPP_CONSTR_RB_MAXLIMIT0: - return PyFloat_FromDouble( (double)con->maxLimit[0] ); - case EXPP_CONSTR_RB_MAXLIMIT1: - return PyFloat_FromDouble( (double)con->maxLimit[1] ); - case EXPP_CONSTR_RB_MAXLIMIT2: - return PyFloat_FromDouble( (double)con->maxLimit[2] ); - case EXPP_CONSTR_RB_MAXLIMIT3: - return PyFloat_FromDouble( (double)con->maxLimit[3] ); - case EXPP_CONSTR_RB_MAXLIMIT4: - return PyFloat_FromDouble( (double)con->maxLimit[4] ); - case EXPP_CONSTR_RB_MAXLIMIT5: - return PyFloat_FromDouble( (double)con->maxLimit[5] ); - case EXPP_CONSTR_RB_EXTRAFZ: - return PyFloat_FromDouble( (double)con->extraFz ); - case EXPP_CONSTR_LIMIT: - return PyInt_FromLong( (int)con->flag ); - - case EXPP_CONSTR_RB_TYPE: - return PyInt_FromLong( (int)con->type ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - - -static int rigidbody_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bRigidBodyJointConstraint *con = (bRigidBodyJointConstraint *)(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_RB_PIVX: - return EXPP_setFloatClamped( value, &con->pivX , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_PIVY: - return EXPP_setFloatClamped( value, &con->pivY , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_PIVZ: - return EXPP_setFloatClamped( value, &con->pivZ , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_AXX: - return EXPP_setFloatClamped( value, &con->axX , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_AXY: - return EXPP_setFloatClamped( value, &con->axY , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_AXZ: - return EXPP_setFloatClamped( value, &con->axZ , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MINLIMIT0: - return EXPP_setFloatClamped( value, &con->minLimit[0] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MINLIMIT1: - return EXPP_setFloatClamped( value, &con->minLimit[1] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MINLIMIT2: - return EXPP_setFloatClamped( value, &con->minLimit[2] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MINLIMIT3: - return EXPP_setFloatClamped( value, &con->minLimit[3] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MINLIMIT4: - return EXPP_setFloatClamped( value, &con->minLimit[4] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MINLIMIT5: - return EXPP_setFloatClamped( value, &con->minLimit[5] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MAXLIMIT0: - return EXPP_setFloatClamped( value, &con->maxLimit[0] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MAXLIMIT1: - return EXPP_setFloatClamped( value, &con->maxLimit[1] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MAXLIMIT2: - return EXPP_setFloatClamped( value, &con->maxLimit[2] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MAXLIMIT3: - return EXPP_setFloatClamped( value, &con->maxLimit[3] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MAXLIMIT4: - return EXPP_setFloatClamped( value, &con->maxLimit[4] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_MAXLIMIT5: - return EXPP_setFloatClamped( value, &con->maxLimit[5] , -1000.0, 1000.0 ); - case EXPP_CONSTR_RB_EXTRAFZ: - return EXPP_setFloatClamped( value, &con->extraFz , -1000.0, 1000.0 ); - case EXPP_CONSTR_LIMIT: - return EXPP_setIValueRange( value, &con->flag, 0, - LIMIT_XMIN | LIMIT_XMAX | LIMIT_YMIN | LIMIT_YMAX | LIMIT_ZMIN | LIMIT_ZMAX, 'i' ); - case EXPP_CONSTR_RB_TYPE: - return EXPP_setIValueRange( value, &con->type, 0, - EXPP_CONSTR_RB_BALL | EXPP_CONSTR_RB_HINGE | EXPP_CONSTR_RB_GENERIC6DOF | EXPP_CONSTR_RB_VEHICLE, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *childof_getter( BPy_Constraint * self, int type ) -{ - bChildOfConstraint *con = (bChildOfConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_COPY: - return PyInt_FromLong( (long)con->flag ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int childof_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bChildOfConstraint *con = (bChildOfConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_COPY: - return EXPP_setIValueRange( value, &con->flag, - 0, CHILDOF_LOCX| CHILDOF_LOCY | CHILDOF_LOCZ | CHILDOF_ROTX | CHILDOF_ROTY | CHILDOF_ROTZ | - CHILDOF_SIZEX |CHILDOF_SIZEY| CHILDOF_SIZEZ, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *transf_getter( BPy_Constraint * self, int type ) -{ - bTransformConstraint *con = (bTransformConstraint *)(self->con->data); - - switch( type ) { - case EXPP_CONSTR_TARGET: - return Object_CreatePyObject( con->tar ); - case EXPP_CONSTR_BONE: - return PyString_FromString( con->subtarget ); - case EXPP_CONSTR_FROM: - return PyInt_FromLong( (long)con->from ); - case EXPP_CONSTR_TO: - return PyInt_FromLong( (long)con->to ); - case EXPP_CONSTR_MAPX: - return PyInt_FromLong( (long)con->map[0] ); - case EXPP_CONSTR_MAPY: - return PyInt_FromLong( (long)con->map[1] ); - case EXPP_CONSTR_MAPZ: - return PyInt_FromLong( (long)con->map[2] ); - case EXPP_CONSTR_FROMMINX: - return PyFloat_FromDouble( (double)con->from_min[0] ); - case EXPP_CONSTR_FROMMAXX: - return PyFloat_FromDouble( (double)con->from_max[0] ); - case EXPP_CONSTR_FROMMINY: - return PyFloat_FromDouble( (double)con->from_min[1] ); - case EXPP_CONSTR_FROMMAXY: - return PyFloat_FromDouble( (double)con->from_max[1] ); - case EXPP_CONSTR_FROMMINZ: - return PyFloat_FromDouble( (double)con->from_min[2] ); - case EXPP_CONSTR_FROMMAXZ: - return PyFloat_FromDouble( (double)con->from_max[2] ); - case EXPP_CONSTR_TOMINX: - return PyFloat_FromDouble( (double)con->to_min[0] ); - case EXPP_CONSTR_TOMAXX: - return PyFloat_FromDouble( (double)con->to_max[0] ); - case EXPP_CONSTR_TOMINY: - return PyFloat_FromDouble( (double)con->to_min[1] ); - case EXPP_CONSTR_TOMAXY: - return PyFloat_FromDouble( (double)con->to_max[1] ); - case EXPP_CONSTR_TOMINZ: - return PyFloat_FromDouble( (double)con->to_min[2] ); - case EXPP_CONSTR_TOMAXZ: - return PyFloat_FromDouble( (double)con->to_max[2] ); - case EXPP_CONSTR_EXPO: - return PyBool_FromLong( (long)con->expo ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int transf_setter( BPy_Constraint *self, int type, PyObject *value ) -{ - bTransformConstraint *con = (bTransformConstraint *)(self->con->data); - float fmin, fmax, tmin, tmax; - - if (con->from == 2) { - fmin = 0.0001; - fmax = 1000.0; - } - else if (con->from == 1) { - fmin = -360.0; - fmax = 360.0; - } - else { - fmin = -1000.0; - fmax = 1000.0; - } - - if (con->to == 2) { - tmin = 0.0001; - tmax = 1000.0; - } - else if (con->to == 1) { - tmin = -360.0; - tmax = 360.0; - } - else { - tmin = -1000.0; - tmax = 1000.0; - } - - switch( type ) { - case EXPP_CONSTR_TARGET: { - Object *obj = (( BPy_Object * )value)->object; - if( !BPy_Object_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected BPy object argument" ); - con->tar = obj; - return 0; - } - case EXPP_CONSTR_BONE: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - - BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) ); - - return 0; - } - case EXPP_CONSTR_FROM: - return EXPP_setIValueClamped( value, &con->from, 0, 3, 'h' ); - case EXPP_CONSTR_TO: - return EXPP_setIValueClamped( value, &con->to, 0, 3, 'h' ); - case EXPP_CONSTR_MAPX: - return EXPP_setIValueClamped( value, &con->map[0], 0, 3, 'h' ); - case EXPP_CONSTR_MAPY: - return EXPP_setIValueClamped( value, &con->map[1], 0, 3, 'h' ); - case EXPP_CONSTR_MAPZ: - return EXPP_setIValueClamped( value, &con->map[2], 0, 3, 'h' ); - case EXPP_CONSTR_FROMMINX: - return EXPP_setFloatClamped( value, &con->from_min[0], fmin, fmax ); - case EXPP_CONSTR_FROMMAXX: - return EXPP_setFloatClamped( value, &con->from_max[0], fmin, fmax ); - case EXPP_CONSTR_FROMMINY: - return EXPP_setFloatClamped( value, &con->from_min[1], fmin, fmax ); - case EXPP_CONSTR_FROMMAXY: - return EXPP_setFloatClamped( value, &con->from_max[1], fmin, fmax ); - case EXPP_CONSTR_FROMMINZ: - return EXPP_setFloatClamped( value, &con->from_min[2], fmin, fmax ); - case EXPP_CONSTR_FROMMAXZ: - return EXPP_setFloatClamped( value, &con->from_max[2], fmin, fmax ); - case EXPP_CONSTR_TOMINX: - return EXPP_setFloatClamped( value, &con->to_min[0], tmin, tmax ); - case EXPP_CONSTR_TOMAXX: - return EXPP_setFloatClamped( value, &con->to_max[0], tmin, tmax ); - case EXPP_CONSTR_TOMINY: - return EXPP_setFloatClamped( value, &con->to_min[1], tmin, tmax ); - case EXPP_CONSTR_TOMAXY: - return EXPP_setFloatClamped( value, &con->to_max[1], tmin, tmax ); - case EXPP_CONSTR_TOMINZ: - return EXPP_setFloatClamped( value, &con->to_min[2], tmin, tmax ); - case EXPP_CONSTR_TOMAXZ: - return EXPP_setFloatClamped( value, &con->to_max[2], tmin, tmax ); - case EXPP_CONSTR_EXPO: - return EXPP_setBitfield( value, &con->expo, 1, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -/* - * get data from a constraint - */ - -static PyObject *Constraint_getData( BPy_Constraint * self, PyObject * key ) -{ - int setting; - - if( !PyInt_Check( key ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an int arg" ); - - if( !self->con ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - setting = PyInt_AsLong( key ); - - /* bypass doing settings of individual constraints, if we're just doing - * constraint space access-stuff - */ - if ((setting==EXPP_CONSTR_OWNSPACE) || (setting==EXPP_CONSTR_TARSPACE)) { - return constspace_getter( self, setting ); - } - switch( self->con->type ) { - case CONSTRAINT_TYPE_NULL: - Py_RETURN_NONE; - case CONSTRAINT_TYPE_TRACKTO: - return trackto_getter( self, setting ); - case CONSTRAINT_TYPE_KINEMATIC: - return kinematic_getter( self, setting ); - case CONSTRAINT_TYPE_FOLLOWPATH: - return followpath_getter( self, setting ); - case CONSTRAINT_TYPE_ACTION: - return action_getter( self, setting ); - case CONSTRAINT_TYPE_LOCKTRACK: - return locktrack_getter( self, setting ); - case CONSTRAINT_TYPE_STRETCHTO: - return stretchto_getter( self, setting ); - case CONSTRAINT_TYPE_MINMAX: - return floor_getter( self, setting ); - case CONSTRAINT_TYPE_LOCLIKE: - return locatelike_getter( self, setting ); - case CONSTRAINT_TYPE_ROTLIKE: - return rotatelike_getter( self, setting ); - case CONSTRAINT_TYPE_SIZELIKE: - return sizelike_getter( self, setting ); - case CONSTRAINT_TYPE_ROTLIMIT: - return rotlimit_getter( self, setting ); - case CONSTRAINT_TYPE_LOCLIMIT: - return loclimit_getter( self, setting ); - case CONSTRAINT_TYPE_SIZELIMIT: - return sizelimit_getter( self, setting ); - case CONSTRAINT_TYPE_RIGIDBODYJOINT: - return rigidbody_getter( self, setting ); - case CONSTRAINT_TYPE_CLAMPTO: - return clampto_getter( self, setting ); - case CONSTRAINT_TYPE_PYTHON: - return script_getter( self, setting ); - case CONSTRAINT_TYPE_CHILDOF: - return childof_getter( self, setting ); - case CONSTRAINT_TYPE_TRANSFORM: - return transf_getter( self, setting ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, - "unknown constraint type" ); - } -} - -static int Constraint_setData( BPy_Constraint * self, PyObject * key, - PyObject * arg ) -{ - int key_int, result; - - if( !PyNumber_Check( key ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int arg" ); - if( !self->con ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - key_int = PyInt_AsLong( key ); - - /* bypass doing settings of individual constraints, if we're just doing - * constraint space access-stuff - */ - if ((key_int==EXPP_CONSTR_OWNSPACE) || (key_int==EXPP_CONSTR_TARSPACE)) { - result = constspace_setter( self, key_int, arg ); - } - else { - switch( self->con->type ) { - case CONSTRAINT_TYPE_KINEMATIC: - result = kinematic_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_ACTION: - result = action_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_TRACKTO: - result = trackto_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_STRETCHTO: - result = stretchto_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_FOLLOWPATH: - result = followpath_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_LOCKTRACK: - result = locktrack_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_MINMAX: - result = floor_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_LOCLIKE: - result = locatelike_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_ROTLIKE: - result = rotatelike_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_SIZELIKE: - result = sizelike_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_ROTLIMIT: - result = rotlimit_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_LOCLIMIT: - result = loclimit_setter( self, key_int, arg ); - break; - case CONSTRAINT_TYPE_SIZELIMIT: - result = sizelimit_setter( self, key_int, arg); - break; - case CONSTRAINT_TYPE_RIGIDBODYJOINT: - result = rigidbody_setter( self, key_int, arg); - break; - case CONSTRAINT_TYPE_CLAMPTO: - result = clampto_setter( self, key_int, arg); - break; - case CONSTRAINT_TYPE_PYTHON: - result = script_setter( self, key_int, arg); - break; - case CONSTRAINT_TYPE_CHILDOF: - result = childof_setter( self, key_int, arg); - break; - case CONSTRAINT_TYPE_TRANSFORM: - result = transf_setter( self, key_int, arg); - break; - case CONSTRAINT_TYPE_NULL: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "unsupported constraint setting" ); - } - } - if( !result && self->pchan ) - update_pose_constraint_flags( self->obj->pose ); - return result; -} - -/*****************************************************************************/ -/* Function: Constraint_compare */ -/* Description: This compares 2 constraint python types, == or != only. */ -/*****************************************************************************/ -static int Constraint_compare( BPy_Constraint * a, BPy_Constraint * b ) -{ - return ( a->con == b->con ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Constraint_repr */ -/* Description: This is a callback function for the BPy_Constraint type. It */ -/* builds a meaningful string to represent constraint objects. */ -/*****************************************************************************/ - -static PyObject *Constraint_repr( BPy_Constraint * self ) -{ - bConstraintTypeInfo *cti; - - 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: */ - -/*****************************************************************************/ -/* Function: Constraint_CreatePyObject */ -/* Description: This function will create a new BPy_Constraint from an */ -/* existing Blender constraint structure. */ -/*****************************************************************************/ -PyObject *Constraint_CreatePyObject( bPoseChannel *pchan, Object *obj, - bConstraint *con ) -{ - BPy_Constraint *pycon; - pycon = ( BPy_Constraint * ) PyObject_NEW( BPy_Constraint, - &Constraint_Type ); - if( !pycon ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Constraint object" ); - - pycon->con = con; - - /* one of these two will be NULL */ - pycon->obj = obj; - pycon->pchan = pchan; - return ( PyObject * ) pycon; -} - -/*****************************************************************************/ -/* Function: Constraint_FromPyObject */ -/* Description: This function returns the Blender constraint from the given */ -/* PyObject. */ -/*****************************************************************************/ -bConstraint *Constraint_FromPyObject( BPy_Constraint * self ) -{ - return self->con; -} - -/*****************************************************************************/ -/* Constraint Sequence wrapper */ -/*****************************************************************************/ - -/* - * Initialize the interator - */ - -static PyObject *ConstraintSeq_getIter( BPy_ConstraintSeq * self ) -{ - if( self->pchan ) - self->iter = (bConstraint *)self->pchan->constraints.first; - else - self->iter = (bConstraint *)self->obj->constraints.first; - return EXPP_incr_ret ( (PyObject *) self ); -} - -/* - * Get the next Constraint - */ - -static PyObject *ConstraintSeq_nextIter( BPy_ConstraintSeq * self ) -{ - bConstraint *this = self->iter; - if( this ) { - self->iter = this->next; - return Constraint_CreatePyObject( self->pchan, self->obj, this ); - } - - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); -} - -/* return the number of constraints */ - -static int ConstraintSeq_length( BPy_ConstraintSeq * self ) -{ - return BLI_countlist( self->pchan ? - &self->pchan->constraints : &self->obj->constraints ); -} - -/* return a constraint */ - -static PyObject *ConstraintSeq_item( BPy_ConstraintSeq * self, int i ) -{ - bConstraint *con = NULL; - - /* if index is negative, start counting from the end of the list */ - if( i < 0 ) - i += ConstraintSeq_length( self ); - - /* skip through the list until we get the constraint or end of list */ - - if( self->pchan ) - con = self->pchan->constraints.first; - else - con = self->obj->constraints.first; - - while( i && con ) { - --i; - con = con->next; - } - - if( con ) - return Constraint_CreatePyObject( self->pchan, self->obj, con ); - else - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); -} - -/*****************************************************************************/ -/* Python BPy_ConstraintSeq sequence table: */ -/*****************************************************************************/ -static PySequenceMethods ConstraintSeq_as_sequence = { - ( inquiry ) ConstraintSeq_length, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) ConstraintSeq_item, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - ( objobjproc ) 0, /* sq_contains */ - ( binaryfunc ) 0, /* sq_inplace_concat */ - ( intargfunc ) 0, /* sq_inplace_repeat */ -}; - -/* - * helper function to check for a valid constraint argument - */ - -static bConstraint *locate_constr( BPy_ConstraintSeq *self, BPy_Constraint * value ) -{ - bConstraint *con; - - /* check that argument is a modifier */ - if (!BPy_Constraint_Check(value)) - return (bConstraint *)EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a constraint as an argument" ); - - /* check whether constraint has been removed */ - if( !value->con ) - return (bConstraint *)EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This constraint has been removed!" ); - - /* verify the constraint is still exists in the stack */ - if( self->pchan ) - con = self->pchan->constraints.first; - else - con = self->obj->constraints.first; - while( con && con != value->con ) - con = con->next; - - /* if we didn't find it, exception */ - if( !con ) - return (bConstraint *)EXPP_ReturnPyObjError( PyExc_AttributeError, - "This constraint is no longer in the object's stack" ); - - return con; -} - - -/* create a new constraint at the end of the list */ - -static PyObject *ConstraintSeq_append( BPy_ConstraintSeq *self, PyObject *value ) -{ - int type = (int)PyInt_AsLong(value); - bConstraint *con; - - /* type 0 is CONSTRAINT_TYPE_NULL, should we be able to add one of these? - * if the value is not an int it will be -1 */ - if( type < CONSTRAINT_TYPE_NULL || type > CONSTRAINT_TYPE_RIGIDBODYJOINT ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "arg not in int or out of range" ); - - con = add_new_constraint( type ); - if( self->pchan ) { - BLI_addtail( &self->pchan->constraints, con ); - update_pose_constraint_flags( self->obj->pose ); - } - else - BLI_addtail( &self->obj->constraints, con ); - - return Constraint_CreatePyObject( self->pchan, self->obj, con ); -} - -/* move the constraint up in the stack */ - -static PyObject *ConstraintSeq_moveUp( BPy_ConstraintSeq *self, BPy_Constraint *value ) -{ - bConstraint *con = locate_constr( self, value ); - - /* if we can't locate the constraint, return (exception already set) */ - if( !con ) - return (PyObject *)NULL; - - const_moveUp( self->obj, con ); - Py_RETURN_NONE; -} - -/* move the constraint down in the stack */ - -static PyObject *ConstraintSeq_moveDown( BPy_ConstraintSeq *self, BPy_Constraint *value ) -{ - bConstraint *con = locate_constr( self, value ); - - /* if we can't locate the constraint, return (exception already set) */ - if( !con ) - return (PyObject *)NULL; - - const_moveDown( self->obj, con ); - Py_RETURN_NONE; -} - -/* remove an existing constraint */ - -static PyObject *ConstraintSeq_remove( BPy_ConstraintSeq *self, BPy_Constraint *value ) -{ - bConstraint *con = locate_constr( self, value ); - - /* if we can't locate the constraint, return (exception already set) */ - if( !con ) - return (PyObject *)NULL; - - /* do the actual removal */ - if( self->pchan ) - BLI_remlink( &self->pchan->constraints, con ); - else - BLI_remlink( &self->obj->constraints, con); - del_constr_func( self->obj, con ); - - /* erase the link to the constraint */ - value->con = NULL; - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: ConstraintSeq_dealloc */ -/* Description: This is a callback function for the BPy_ConstraintSeq type. */ -/* It destroys data when the object is deleted. */ -/*****************************************************************************/ -static void ConstraintSeq_dealloc( BPy_Constraint * self ) -{ - PyObject_DEL( self ); -} - -/*****************************************************************************/ -/* Python BPy_ConstraintSeq methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_ConstraintSeq_methods[] = { - /* name, method, flags, doc */ - {"append", ( PyCFunction ) ConstraintSeq_append, METH_O, - "(type) - add a new constraint, where type is the constraint type"}, - {"remove", ( PyCFunction ) ConstraintSeq_remove, METH_O, - "(con) - remove an existing constraint, where con is a constraint from this object."}, - {"moveUp", ( PyCFunction ) ConstraintSeq_moveUp, METH_O, - "(con) - Move constraint up in stack"}, - {"moveDown", ( PyCFunction ) ConstraintSeq_moveDown, METH_O, - "(con) - Move constraint down in stack"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python ConstraintSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject ConstraintSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Constraints", /* char *tp_name; */ - sizeof( BPy_ConstraintSeq ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) ConstraintSeq_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - ( reprfunc ) NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &ConstraintSeq_as_sequence, /* 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 */ - ( getiterfunc )ConstraintSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc )ConstraintSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_ConstraintSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 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 -}; - -/*****************************************************************************/ -/* Function: PoseConstraintSeq_CreatePyObject */ -/* Description: This function will create a new BPy_ConstraintSeq from an */ -/* existing ListBase structure. */ -/*****************************************************************************/ -PyObject *PoseConstraintSeq_CreatePyObject( bPoseChannel *pchan ) -{ - BPy_ConstraintSeq *pyseq; - Object *ob; - - for( ob = G.main->object.first; ob; ob = ob->id.next ) { - if( ob->type == OB_ARMATURE ) { - bPoseChannel *p = ob->pose->chanbase.first; - while( p ) { - if( p == pchan ) { - pyseq = ( BPy_ConstraintSeq * ) PyObject_NEW( - BPy_ConstraintSeq, &ConstraintSeq_Type ); - if( !pyseq ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_ConstraintSeq object" ); - pyseq->pchan = pchan; - pyseq->obj = ob; - return ( PyObject * ) pyseq; - } else - p = p->next; - } - } - } - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't find ANY armature with the pose!" ); - -} - -/*****************************************************************************/ -/* Function: ObConstraintSeq_CreatePyObject */ -/* Description: This function will create a new BPy_ConstraintSeq from an */ -/* existing ListBase structure. */ -/*****************************************************************************/ -PyObject *ObConstraintSeq_CreatePyObject( Object *obj ) -{ - BPy_ConstraintSeq *pyseq; - pyseq = ( BPy_ConstraintSeq * ) PyObject_NEW( BPy_ConstraintSeq, - &ConstraintSeq_Type ); - if( !pyseq ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_ConstraintSeq object" ); - pyseq->obj = obj; - pyseq->pchan = NULL; - return ( PyObject * ) pyseq; -} - -static PyObject *M_Constraint_TypeDict( void ) -{ - PyObject *S = PyConstant_New( ); - - if( S ) { - BPy_constant *d = ( BPy_constant * ) S; - PyConstant_Insert( d, "NULL", - PyInt_FromLong( CONSTRAINT_TYPE_NULL ) ); - PyConstant_Insert( d, "TRACKTO", - PyInt_FromLong( CONSTRAINT_TYPE_TRACKTO ) ); - PyConstant_Insert( d, "IKSOLVER", - PyInt_FromLong( CONSTRAINT_TYPE_KINEMATIC ) ); - PyConstant_Insert( d, "FOLLOWPATH", - PyInt_FromLong( CONSTRAINT_TYPE_FOLLOWPATH ) ); - PyConstant_Insert( d, "COPYROT", - PyInt_FromLong( CONSTRAINT_TYPE_ROTLIKE ) ); - PyConstant_Insert( d, "COPYLOC", - PyInt_FromLong( CONSTRAINT_TYPE_LOCLIKE ) ); - PyConstant_Insert( d, "COPYSIZE", - PyInt_FromLong( CONSTRAINT_TYPE_SIZELIKE ) ); - PyConstant_Insert( d, "ACTION", - PyInt_FromLong( CONSTRAINT_TYPE_ACTION ) ); - PyConstant_Insert( d, "LOCKTRACK", - PyInt_FromLong( CONSTRAINT_TYPE_LOCKTRACK ) ); - PyConstant_Insert( d, "STRETCHTO", - PyInt_FromLong( CONSTRAINT_TYPE_STRETCHTO ) ); - PyConstant_Insert( d, "FLOOR", - PyInt_FromLong( CONSTRAINT_TYPE_MINMAX ) ); - PyConstant_Insert( d, "LIMITLOC", - PyInt_FromLong( CONSTRAINT_TYPE_LOCLIMIT ) ); - PyConstant_Insert( d, "LIMITROT", - PyInt_FromLong( CONSTRAINT_TYPE_ROTLIMIT ) ); - PyConstant_Insert( d, "LIMITSIZE", - PyInt_FromLong( CONSTRAINT_TYPE_SIZELIMIT ) ); - PyConstant_Insert( d, "RIGIDBODYJOINT", - PyInt_FromLong( CONSTRAINT_TYPE_RIGIDBODYJOINT ) ); - PyConstant_Insert( d, "CLAMPTO", - PyInt_FromLong( CONSTRAINT_TYPE_CLAMPTO ) ); - PyConstant_Insert( d, "PYTHON", - PyInt_FromLong( CONSTRAINT_TYPE_PYTHON ) ); - PyConstant_Insert( d, "CHILDOF", - PyInt_FromLong( CONSTRAINT_TYPE_CHILDOF ) ); - PyConstant_Insert( d, "TRANSFORM", - PyInt_FromLong( CONSTRAINT_TYPE_TRANSFORM ) ); - } - return S; -} - -static PyObject *M_Constraint_SettingsDict( void ) -{ - PyObject *S = PyConstant_New( ); - - if( S ) { - BPy_constant *d = ( BPy_constant * ) S; - PyConstant_Insert( d, "XROT", - PyInt_FromLong( EXPP_CONSTR_XROT ) ); - PyConstant_Insert( d, "YROT", - PyInt_FromLong( EXPP_CONSTR_YROT ) ); - PyConstant_Insert( d, "ZROT", - PyInt_FromLong( EXPP_CONSTR_ZROT ) ); - PyConstant_Insert( d, "XSIZE", - PyInt_FromLong( EXPP_CONSTR_XSIZE ) ); - PyConstant_Insert( d, "YSIZE", - PyInt_FromLong( EXPP_CONSTR_YSIZE ) ); - PyConstant_Insert( d, "ZSIZE", - PyInt_FromLong( EXPP_CONSTR_ZSIZE ) ); - PyConstant_Insert( d, "XLOC", - PyInt_FromLong( EXPP_CONSTR_XLOC ) ); - PyConstant_Insert( d, "YLOC", - PyInt_FromLong( EXPP_CONSTR_YLOC ) ); - PyConstant_Insert( d, "ZLOC", - PyInt_FromLong( EXPP_CONSTR_ZLOC ) ); - - PyConstant_Insert( d, "UPX", - PyInt_FromLong( UP_X ) ); - PyConstant_Insert( d, "UPY", - PyInt_FromLong( UP_Y ) ); - PyConstant_Insert( d, "UPZ", - PyInt_FromLong( UP_Z ) ); - - PyConstant_Insert( d, "TRACKX", - PyInt_FromLong( TRACK_X ) ); - PyConstant_Insert( d, "TRACKY", - PyInt_FromLong( TRACK_Y ) ); - PyConstant_Insert( d, "TRACKZ", - PyInt_FromLong( TRACK_Z ) ); - PyConstant_Insert( d, "TRACKNEGX", - PyInt_FromLong( TRACK_nX ) ); - PyConstant_Insert( d, "TRACKNEGY", - PyInt_FromLong( TRACK_nY ) ); - PyConstant_Insert( d, "TRACKNEGZ", - PyInt_FromLong( TRACK_nZ ) ); - - PyConstant_Insert( d, "VOLUMEXZ", - PyInt_FromLong( VOLUME_XZ ) ); - PyConstant_Insert( d, "VOLUMEX", - PyInt_FromLong( VOLUME_X ) ); - PyConstant_Insert( d, "VOLUMEZ", - PyInt_FromLong( VOLUME_Z ) ); - PyConstant_Insert( d, "VOLUMENONE", - PyInt_FromLong( NO_VOLUME ) ); - - PyConstant_Insert( d, "PLANEX", - PyInt_FromLong( PLANE_X ) ); - PyConstant_Insert( d, "PLANEY", - PyInt_FromLong( PLANE_Y ) ); - PyConstant_Insert( d, "PLANEZ", - PyInt_FromLong( PLANE_Z ) ); - - PyConstant_Insert( d, "LOCKX", - PyInt_FromLong( LOCK_X ) ); - PyConstant_Insert( d, "LOCKY", - PyInt_FromLong( LOCK_Y ) ); - PyConstant_Insert( d, "LOCKZ", - PyInt_FromLong( LOCK_Z ) ); - - PyConstant_Insert( d, "MAXX", - PyInt_FromLong( EXPP_CONSTR_MAXX ) ); - PyConstant_Insert( d, "MAXY", - PyInt_FromLong( EXPP_CONSTR_MAXY ) ); - PyConstant_Insert( d, "MAXZ", - PyInt_FromLong( EXPP_CONSTR_MAXZ ) ); - PyConstant_Insert( d, "MINX", - PyInt_FromLong( EXPP_CONSTR_MINX ) ); - PyConstant_Insert( d, "MINY", - PyInt_FromLong( EXPP_CONSTR_MINY ) ); - PyConstant_Insert( d, "MINZ", - PyInt_FromLong( EXPP_CONSTR_MINZ ) ); - - PyConstant_Insert( d, "COPYX", - PyInt_FromLong( LOCLIKE_X ) ); - PyConstant_Insert( d, "COPYY", - PyInt_FromLong( LOCLIKE_Y ) ); - PyConstant_Insert( d, "COPYZ", - PyInt_FromLong( LOCLIKE_Z ) ); - PyConstant_Insert( d, "COPYXINVERT", - PyInt_FromLong( LOCLIKE_X_INVERT ) ); - PyConstant_Insert( d, "COPYYINVERT", - PyInt_FromLong( LOCLIKE_Y_INVERT ) ); - PyConstant_Insert( d, "COPYZINVERT", - PyInt_FromLong( LOCLIKE_Z_INVERT ) ); - - PyConstant_Insert( d, "PARLOCX", - PyInt_FromLong( CHILDOF_LOCX ) ); - PyConstant_Insert( d, "PARLOCY", - PyInt_FromLong( CHILDOF_LOCY ) ); - PyConstant_Insert( d, "PARLOCZ", - PyInt_FromLong( CHILDOF_LOCZ ) ); - PyConstant_Insert( d, "PARROTX", - PyInt_FromLong( CHILDOF_ROTX ) ); - PyConstant_Insert( d, "PARROTY", - PyInt_FromLong( CHILDOF_ROTY ) ); - PyConstant_Insert( d, "PARROTZ", - PyInt_FromLong( CHILDOF_ROTZ ) ); - PyConstant_Insert( d, "PARSIZEX", - PyInt_FromLong( CHILDOF_LOCX ) ); - PyConstant_Insert( d, "PARSIZEY", - PyInt_FromLong( CHILDOF_SIZEY ) ); - PyConstant_Insert( d, "PARSIZEZ", - PyInt_FromLong( CHILDOF_SIZEZ ) ); - - PyConstant_Insert( d, "CLAMPAUTO", - PyInt_FromLong( CLAMPTO_AUTO ) ); - PyConstant_Insert( d, "CLAMPX", - PyInt_FromLong( CLAMPTO_X ) ); - PyConstant_Insert( d, "CLAMPY", - PyInt_FromLong( CLAMPTO_Y ) ); - PyConstant_Insert( d, "CLAMPZ", - PyInt_FromLong( CLAMPTO_Z ) ); - PyConstant_Insert( d, "CLAMPCYCLIC", - PyInt_FromLong( EXPP_CONSTR_CLAMPCYCLIC )); - - PyConstant_Insert( d, "TARGET", - PyInt_FromLong( EXPP_CONSTR_TARGET ) ); - PyConstant_Insert( d, "STRETCH", - PyInt_FromLong( EXPP_CONSTR_STRETCH ) ); - PyConstant_Insert( d, "ITERATIONS", - PyInt_FromLong( EXPP_CONSTR_ITERATIONS ) ); - PyConstant_Insert( d, "BONE", - PyInt_FromLong( EXPP_CONSTR_BONE ) ); - PyConstant_Insert( d, "CHAINLEN", - PyInt_FromLong( EXPP_CONSTR_CHAINLEN ) ); - PyConstant_Insert( d, "POSWEIGHT", - PyInt_FromLong( EXPP_CONSTR_POSWEIGHT ) ); - PyConstant_Insert( d, "ROTWEIGHT", - PyInt_FromLong( EXPP_CONSTR_ROTWEIGHT ) ); - PyConstant_Insert( d, "ROTATE", - PyInt_FromLong( EXPP_CONSTR_ROTATE ) ); - PyConstant_Insert( d, "USETIP", - PyInt_FromLong( EXPP_CONSTR_USETIP ) ); - - PyConstant_Insert( d, "ACTION", - PyInt_FromLong( EXPP_CONSTR_ACTION ) ); - PyConstant_Insert( d, "START", - PyInt_FromLong( EXPP_CONSTR_START ) ); - PyConstant_Insert( d, "END", - PyInt_FromLong( EXPP_CONSTR_END ) ); - PyConstant_Insert( d, "MIN", - PyInt_FromLong( EXPP_CONSTR_MIN ) ); - PyConstant_Insert( d, "MAX", - PyInt_FromLong( EXPP_CONSTR_MAX ) ); - PyConstant_Insert( d, "KEYON", - PyInt_FromLong( EXPP_CONSTR_KEYON ) ); - - PyConstant_Insert( d, "TRACK", - PyInt_FromLong( EXPP_CONSTR_TRACK ) ); - PyConstant_Insert( d, "UP", - PyInt_FromLong( EXPP_CONSTR_UP ) ); - - PyConstant_Insert( d, "RESTLENGTH", - PyInt_FromLong( EXPP_CONSTR_RESTLENGTH ) ); - PyConstant_Insert( d, "VOLVARIATION", - PyInt_FromLong( EXPP_CONSTR_VOLVARIATION ) ); - PyConstant_Insert( d, "VOLUMEMODE", - PyInt_FromLong( EXPP_CONSTR_VOLUMEMODE ) ); - PyConstant_Insert( d, "PLANE", - PyInt_FromLong( EXPP_CONSTR_PLANE ) ); - - PyConstant_Insert( d, "FOLLOW", - PyInt_FromLong( EXPP_CONSTR_FOLLOW ) ); - PyConstant_Insert( d, "OFFSET", - PyInt_FromLong( EXPP_CONSTR_OFFSET ) ); - PyConstant_Insert( d, "FORWARD", - PyInt_FromLong( EXPP_CONSTR_FORWARD ) ); - - PyConstant_Insert( d, "LOCK", - PyInt_FromLong( EXPP_CONSTR_LOCK ) ); - - PyConstant_Insert( d, "COPY", - PyInt_FromLong( EXPP_CONSTR_COPY ) ); - PyConstant_Insert( d, "LIMIT", - PyInt_FromLong( EXPP_CONSTR_LIMIT ) ); - PyConstant_Insert( d, "CLAMP", - PyInt_FromLong( EXPP_CONSTR_CLAMP ) ); - - PyConstant_Insert( d, "LIMIT_XMIN", - PyInt_FromLong( EXPP_CONSTR_LIMXMIN ) ); - PyConstant_Insert( d, "LIMIT_XMAX", - PyInt_FromLong( EXPP_CONSTR_LIMXMAX ) ); - PyConstant_Insert( d, "LIMIT_YMIN", - PyInt_FromLong( EXPP_CONSTR_LIMYMIN ) ); - PyConstant_Insert( d, "LIMIT_YMAX", - PyInt_FromLong( EXPP_CONSTR_LIMYMAX ) ); - PyConstant_Insert( d, "LIMIT_ZMIN", - PyInt_FromLong( EXPP_CONSTR_LIMZMIN ) ); - PyConstant_Insert( d, "LIMIT_ZMAX", - PyInt_FromLong( EXPP_CONSTR_LIMZMAX ) ); - - PyConstant_Insert( d, "LIMIT_XROT", - PyInt_FromLong( EXPP_CONSTR_LIMXROT ) ); - PyConstant_Insert( d, "LIMIT_YROT", - PyInt_FromLong( EXPP_CONSTR_LIMYROT ) ); - PyConstant_Insert( d, "LIMIT_ZROT", - PyInt_FromLong( EXPP_CONSTR_LIMZROT ) ); - - PyConstant_Insert( d, "XMIN", - PyInt_FromLong( EXPP_CONSTR_XMIN ) ); - PyConstant_Insert( d, "XMAX", - PyInt_FromLong( EXPP_CONSTR_XMAX ) ); - PyConstant_Insert( d, "YMIN", - PyInt_FromLong( EXPP_CONSTR_YMIN ) ); - PyConstant_Insert( d, "YMAX", - PyInt_FromLong( EXPP_CONSTR_YMAX ) ); - PyConstant_Insert( d, "ZMIN", - PyInt_FromLong( EXPP_CONSTR_ZMIN ) ); - PyConstant_Insert( d, "ZMAX", - PyInt_FromLong( EXPP_CONSTR_ZMAX ) ); - - PyConstant_Insert( d, "SCRIPT", - PyInt_FromLong( EXPP_CONSTR_SCRIPT ) ); - PyConstant_Insert( d, "PROPERTIES", - PyInt_FromLong( EXPP_CONSTR_PROPS ) ); - - PyConstant_Insert( d, "FROM", - PyInt_FromLong( EXPP_CONSTR_FROM ) ); - PyConstant_Insert( d, "TO", - PyInt_FromLong( EXPP_CONSTR_TO ) ); - PyConstant_Insert( d, "EXTRAPOLATE", - PyInt_FromLong( EXPP_CONSTR_EXPO ) ); - PyConstant_Insert( d, "MAPX", - PyInt_FromLong( EXPP_CONSTR_MAPX ) ); - PyConstant_Insert( d, "MAPY", - PyInt_FromLong( EXPP_CONSTR_MAPY ) ); - PyConstant_Insert( d, "MAPZ", - PyInt_FromLong( EXPP_CONSTR_MAPZ ) ); - PyConstant_Insert( d, "FROM_MINX", - PyInt_FromLong( EXPP_CONSTR_FROMMINX ) ); - PyConstant_Insert( d, "FROM_MAXX", - PyInt_FromLong( EXPP_CONSTR_FROMMAXX ) ); - PyConstant_Insert( d, "FROM_MINY", - PyInt_FromLong( EXPP_CONSTR_FROMMINY ) ); - PyConstant_Insert( d, "FROM_MAXY", - PyInt_FromLong( EXPP_CONSTR_FROMMAXY ) ); - PyConstant_Insert( d, "FROM_MINZ", - PyInt_FromLong( EXPP_CONSTR_FROMMINZ ) ); - PyConstant_Insert( d, "FROM_MAXZ", - PyInt_FromLong( EXPP_CONSTR_FROMMAXZ ) ); - PyConstant_Insert( d, "TO_MINX", - PyInt_FromLong( EXPP_CONSTR_TOMINX ) ); - PyConstant_Insert( d, "TO_MAXX", - PyInt_FromLong( EXPP_CONSTR_TOMAXX ) ); - PyConstant_Insert( d, "TO_MINY", - PyInt_FromLong( EXPP_CONSTR_TOMINY ) ); - PyConstant_Insert( d, "TO_MAXY", - PyInt_FromLong( EXPP_CONSTR_TOMAXY ) ); - PyConstant_Insert( d, "TO_MINZ", - PyInt_FromLong( EXPP_CONSTR_TOMINZ ) ); - PyConstant_Insert( d, "TO_MAXZ", - PyInt_FromLong( EXPP_CONSTR_TOMAXZ ) ); - - PyConstant_Insert( d, "LOC", - PyInt_FromLong( 0 ) ); - PyConstant_Insert( d, "ROT", - PyInt_FromLong( 1 ) ); - PyConstant_Insert( d, "SCALE", - PyInt_FromLong( 2 ) ); - - PyConstant_Insert( d, "CONSTR_RB_TYPE", - PyInt_FromLong( EXPP_CONSTR_RB_TYPE ) ); - PyConstant_Insert( d, "CONSTR_RB_BALL", - PyInt_FromLong( EXPP_CONSTR_RB_BALL ) ); - PyConstant_Insert( d, "CONSTR_RB_HINGE", - PyInt_FromLong( EXPP_CONSTR_RB_HINGE ) ); - PyConstant_Insert( d, "CONSTR_RB_GENERIC6DOF", - PyInt_FromLong( EXPP_CONSTR_RB_GENERIC6DOF ) ); - PyConstant_Insert( d, "CONSTR_RB_VEHICLE", - PyInt_FromLong( EXPP_CONSTR_RB_VEHICLE ) ); - PyConstant_Insert( d, "CONSTR_RB_PIVX", - PyInt_FromLong( EXPP_CONSTR_RB_PIVX ) ); - PyConstant_Insert( d, "CONSTR_RB_PIVY", - PyInt_FromLong( EXPP_CONSTR_RB_PIVY ) ); - PyConstant_Insert( d, "CONSTR_RB_PIVZ", - PyInt_FromLong( EXPP_CONSTR_RB_PIVZ ) ); - PyConstant_Insert( d, "CONSTR_RB_AXX", - PyInt_FromLong( EXPP_CONSTR_RB_AXX ) ); - PyConstant_Insert( d, "CONSTR_RB_AXY", - PyInt_FromLong( EXPP_CONSTR_RB_AXY ) ); - PyConstant_Insert( d, "CONSTR_RB_AXZ", - PyInt_FromLong( EXPP_CONSTR_RB_AXZ ) ); - PyConstant_Insert( d, "CONSTR_RB_MINLIMIT0", - PyInt_FromLong( EXPP_CONSTR_RB_MINLIMIT0 ) ); - PyConstant_Insert( d, "CONSTR_RB_MINLIMIT1", - PyInt_FromLong( EXPP_CONSTR_RB_MINLIMIT1 ) ); - PyConstant_Insert( d, "CONSTR_RB_MINLIMIT2", - PyInt_FromLong( EXPP_CONSTR_RB_MINLIMIT2 ) ); - PyConstant_Insert( d, "CONSTR_RB_MINLIMIT3", - PyInt_FromLong( EXPP_CONSTR_RB_MINLIMIT3 ) ); - PyConstant_Insert( d, "CONSTR_RB_MINLIMIT4", - PyInt_FromLong( EXPP_CONSTR_RB_MINLIMIT4 ) ); - PyConstant_Insert( d, "CONSTR_RB_MINLIMIT5", - PyInt_FromLong( EXPP_CONSTR_RB_MINLIMIT5 ) ); - PyConstant_Insert( d, "CONSTR_RB_MAXLIMIT0", - PyInt_FromLong( EXPP_CONSTR_RB_MAXLIMIT0 ) ); - PyConstant_Insert( d, "CONSTR_RB_MAXLIMIT1", - PyInt_FromLong( EXPP_CONSTR_RB_MAXLIMIT1 ) ); - PyConstant_Insert( d, "CONSTR_RB_MAXLIMIT2", - PyInt_FromLong( EXPP_CONSTR_RB_MAXLIMIT2 ) ); - PyConstant_Insert( d, "CONSTR_RB_MAXLIMIT3", - PyInt_FromLong( EXPP_CONSTR_RB_MAXLIMIT3 ) ); - PyConstant_Insert( d, "CONSTR_RB_MAXLIMIT4", - PyInt_FromLong( EXPP_CONSTR_RB_MAXLIMIT4 ) ); - PyConstant_Insert( d, "CONSTR_RB_MAXLIMIT5", - PyInt_FromLong( EXPP_CONSTR_RB_MAXLIMIT5 ) ); - PyConstant_Insert( d, "CONSTR_RB_EXTRAFZ", - PyInt_FromLong( EXPP_CONSTR_RB_EXTRAFZ ) ); - PyConstant_Insert( d, "CONSTR_RB_FLAG", - PyInt_FromLong( EXPP_CONSTR_RB_FLAG ) ); - - - PyConstant_Insert( d, "OWNERSPACE", - PyInt_FromLong( EXPP_CONSTR_OWNSPACE ) ); - PyConstant_Insert( d, "TARGETSPACE", - PyInt_FromLong( EXPP_CONSTR_TARSPACE ) ); - - PyConstant_Insert( d, "SPACE_WORLD", - PyInt_FromLong( CONSTRAINT_SPACE_WORLD) ); - PyConstant_Insert( d, "SPACE_LOCAL", - PyInt_FromLong( CONSTRAINT_SPACE_LOCAL ) ); - PyConstant_Insert( d, "SPACE_POSE", - PyInt_FromLong( CONSTRAINT_SPACE_POSE) ); - PyConstant_Insert( d, "SPACE_PARLOCAL", - PyInt_FromLong( CONSTRAINT_SPACE_PARLOCAL ) ); - } - return S; -} - -/*****************************************************************************/ -/* Function: Constraint_Init */ -/*****************************************************************************/ -PyObject *Constraint_Init( void ) -{ - PyObject *submodule; - PyObject *TypeDict = M_Constraint_TypeDict( ); - PyObject *SettingsDict = M_Constraint_SettingsDict( ); - - if( PyType_Ready( &ConstraintSeq_Type ) < 0 - || PyType_Ready( &Constraint_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Constraint", NULL, - "Constraint module for accessing and creating constraint data" ); - - if( TypeDict ) - PyModule_AddObject( submodule, "Type", TypeDict ); - - if( SettingsDict ) - PyModule_AddObject( submodule, "Settings", SettingsDict ); - - return submodule; -} diff --git a/source/blender/python/api2_2x/Constraint.h b/source/blender/python/api2_2x/Constraint.h deleted file mode 100644 index a9b983fadb4..00000000000 --- a/source/blender/python/api2_2x/Constraint.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * $Id: Constraint.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_CONSTRAINT_H -#define EXPP_CONSTRAINT_H - -#include -#include "DNA_object_types.h" -#include "DNA_action_types.h" -#include "DNA_constraint_types.h" -#include "DNA_listBase.h" - -/*****************************************************************************/ -/* Python BPy_Modifier structure definition: */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD /* required macro */ - Object *obj; /* "parent" object */ - bPoseChannel *pchan;/* "parent" pose channel */ - /* if con this is null, the constraint has been removed and we need to - * raise an error when its data is accessed */ - bConstraint *con; -} BPy_Constraint; - -extern PyTypeObject Constraint_Type; - -#define BPy_Constraint_Check(v) ((v)->ob_type == &Constraint_Type) /* for type checking */ -typedef struct { - PyObject_HEAD /* required macro */ - Object *obj; /* "parent" object */ - bPoseChannel *pchan;/* "parent" pose channel */ - bConstraint *iter; -} BPy_ConstraintSeq; - -/* - * prototypes - */ - -PyObject *Constraint_Init( void ); -PyObject *Constraint_CreatePyObject( bPoseChannel *pchan, Object *obj, - bConstraint *con ); -bConstraint *Constraint_FromPyObject( BPy_Constraint * obj ); - -PyObject *PoseConstraintSeq_CreatePyObject( bPoseChannel *pchan ); -PyObject *ObConstraintSeq_CreatePyObject( Object *obj ); - -#endif /* EXPP_CONSTRAINT_H */ diff --git a/source/blender/python/api2_2x/CurNurb.c b/source/blender/python/api2_2x/CurNurb.c deleted file mode 100644 index fc79296e952..00000000000 --- a/source/blender/python/api2_2x/CurNurb.c +++ /dev/null @@ -1,1098 +0,0 @@ -/* - * $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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Stephen Swaney, Campbell Barton, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "CurNurb.h" /*This must come first */ - -#include "BKE_curve.h" -#include "BDR_editcurve.h" /* for convertspline */ -#include "MEM_guardedalloc.h" -#include "gen_utils.h" -#include "BezTriple.h" - -/* Only for ME_SMOOTH */ -#include "DNA_meshdata_types.h" - -/* - * forward declarations go here - */ - -static PyObject *M_CurNurb_New( PyObject * self, PyObject * args ); -static PyObject *CurNurb_oldsetMatIndex( BPy_CurNurb * self, PyObject * args ); -static int CurNurb_setMatIndex( BPy_CurNurb * self, PyObject * args ); -static PyObject *CurNurb_getMatIndex( BPy_CurNurb * self ); -static PyObject *CurNurb_getFlagU( BPy_CurNurb * self ); -static PyObject *CurNurb_oldsetFlagU( BPy_CurNurb * self, PyObject * args ); -static int CurNurb_setFlagU( BPy_CurNurb * self, PyObject * args ); -static PyObject *CurNurb_getFlagV( BPy_CurNurb * self ); -static PyObject *CurNurb_oldsetFlagV( BPy_CurNurb * self, PyObject * args ); -static int CurNurb_setFlagV( BPy_CurNurb * self, PyObject * args ); -static PyObject *CurNurb_getType( BPy_CurNurb * self ); -static PyObject *CurNurb_oldsetType( BPy_CurNurb * self, PyObject * args ); -static int CurNurb_setType( BPy_CurNurb * self, PyObject * args ); -static PyObject *CurNurb_getKnotsU( BPy_CurNurb * self ); -static PyObject *CurNurb_getKnotsV( BPy_CurNurb * self ); -static PyObject *CurNurb_getPoints( BPy_CurNurb * self ); -/* static PyObject* CurNurb_setXXX( BPy_CurNurb* self, PyObject* args ); */ -static int CurNurb_setPoint( BPy_CurNurb * self, int index, PyObject * ob ); -static int CurNurb_length( PyInstanceObject * inst ); -static PyObject *CurNurb_getIter( BPy_CurNurb * self ); -static PyObject *CurNurb_iterNext( BPy_CurNurb * self ); -PyObject *CurNurb_append( BPy_CurNurb * self, PyObject * value ); - -static PyObject *CurNurb_isNurb( BPy_CurNurb * self ); -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"; - - -/* - CurNurb_Type callback function prototypes: -*/ - -static int CurNurb_compare( BPy_CurNurb * a, BPy_CurNurb * b ); -static PyObject *CurNurb_repr( BPy_CurNurb * self ); - -/* - table of module methods - these are the equivalent of class or static methods. - you do not need an object instance to call one. - -*/ - -static PyMethodDef M_CurNurb_methods[] = { -/* name, method, flags, doc_string */ - {"New", ( PyCFunction ) M_CurNurb_New, METH_VARARGS | METH_KEYWORDS, - " () - doc string"}, -/* {"Get", (PyCFunction) M_CurNurb_method, METH_NOARGS, " () - doc string"}, */ -/* {"method", (PyCFunction) M_CurNurb_method, METH_NOARGS, " () - doc string"}, */ - - {NULL, NULL, 0, NULL} -}; - - - -/* - * method table - * table of instance methods - * these methods are invoked on an instance of the type. -*/ - -static PyMethodDef BPy_CurNurb_methods[] = { -/* name, method, flags, doc */ -/* {"method", (PyCFunction) CurNurb_method, METH_NOARGS, " () - doc string"} */ - {"setMatIndex", ( PyCFunction ) CurNurb_oldsetMatIndex, METH_VARARGS, - "( index ) - set index into materials list"}, - {"getMatIndex", ( PyCFunction ) CurNurb_getMatIndex, METH_NOARGS, - "( ) - get current material index"}, - {"setFlagU", ( PyCFunction ) CurNurb_oldsetFlagU, METH_VARARGS, - "( index ) - set flagU and recalculate the knots (0: uniform, 1: endpoints, 2: bezier)"}, - {"getFlagU", ( PyCFunction ) CurNurb_getFlagU, METH_NOARGS, - "( ) - get flagU of the knots"}, - {"setFlagV", ( PyCFunction ) CurNurb_oldsetFlagV, METH_VARARGS, - "( index ) - set flagV and recalculate the knots (0: uniform, 1: endpoints, 2: bezier)"}, - {"getFlagV", ( PyCFunction ) CurNurb_getFlagV, METH_NOARGS, - "( ) - get flagV of the knots"}, - {"setType", ( PyCFunction ) CurNurb_oldsetType, METH_VARARGS, - "( type ) - change the type of the curve (Poly: 0, Bezier: 1, NURBS: 4)"}, - {"getType", ( PyCFunction ) CurNurb_getType, METH_NOARGS, - "( ) - get the type of the curve (Poly: 0, Bezier: 1, NURBS: 4)"}, - {"append", ( PyCFunction ) CurNurb_append, METH_O, - "( point ) - add a new point. arg is BezTriple or list of x,y,z,w floats"}, - {"isNurb", ( PyCFunction ) CurNurb_isNurb, METH_NOARGS, - "( ) - boolean function tests if this spline is type nurb or bezier"}, - {"isCyclic", ( PyCFunction ) CurNurb_isCyclic, METH_NOARGS, - "( ) - boolean function tests if this spline is cyclic (closed) or not (open)"}, - {"dump", ( PyCFunction ) CurNurb_dump, METH_NOARGS, - "( ) - dumps Nurb data)"}, - {"switchDirection", ( PyCFunction ) CurNurb_switchDirection, METH_NOARGS, - "( ) - swaps curve beginning and end)"}, - {"recalc", ( PyCFunction ) CurNurb_recalc, METH_NOARGS, - "( ) - recalc Nurb data)"}, - {NULL, NULL, 0, NULL} -}; - -/* - * methods for CurNurb as sequece - */ - -static PySequenceMethods CurNurb_as_sequence = { - ( inquiry ) CurNurb_length, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) CurNurb_getPoint, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) CurNurb_setPoint, /* sq_ass_item */ - 0, /* sq_ass_slice */ - ( objobjproc ) 0, /* sq_contains */ - 0, - 0 -}; - -static PyGetSetDef BPy_CurNurb_getseters[] = { - {"mat_index", - (getter)CurNurb_getMatIndex, (setter)CurNurb_setMatIndex, - "CurNurb's material index", - NULL}, - {"points", - (getter)CurNurb_getPoints, (setter)NULL, - "The number of curve points", - NULL}, - {"flagU", - (getter)CurNurb_getFlagU, (setter)CurNurb_setFlagU, - "The knot type in the U direction", - NULL}, - {"flagV", - (getter)CurNurb_getFlagV, (setter)CurNurb_setFlagV, - "The knot type in the V direction", - NULL}, - {"type", - (getter)CurNurb_getType, (setter)CurNurb_setType, - "The curve type (poly: bezier, or NURBS)", - NULL}, - {"knotsU", - (getter)CurNurb_getKnotsU, (setter)NULL, - "The The knot vector in the U direction", - NULL}, - {"knotsV", - (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 */ -}; - -/* - Object Type definition - full blown 2.3 struct - if you are having trouble building with an earlier version of python, - this is why. -*/ - -PyTypeObject CurNurb_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "CurNurb", /* char *tp_name; */ - sizeof( CurNurb_Type ), /* 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; */ - ( cmpfunc ) CurNurb_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) CurNurb_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - 0, /* PyNumberMethods *tp_as_number; */ - &CurNurb_as_sequence, /* PySequenceMethods *tp_as_sequence; */ - 0, /* PyMappingMethods *tp_as_mapping; */ - - /* More standard operations (here for binary compatibility) */ - - 0, /* hashfunc tp_hash; */ - 0, /* ternaryfunc tp_call; */ - 0, /* reprfunc tp_str; */ - 0, /* getattrofunc tp_getattro; */ - 0, /* setattrofunc tp_setattro; */ - - /* Functions to access object as input/output buffer */ - 0, /* PyBufferProcs *tp_as_buffer; */ - - /*** Flags to define presence of optional/expanded features ***/ - Py_TPFLAGS_DEFAULT, /* long tp_flags; */ - - 0, /* char *tp_doc; Documentation string */ - /*** Assigned meaning in release 2.0 ***/ - /* call function for all accessible objects */ - 0, /* traverseproc tp_traverse; */ - - /* delete references to contained objects */ - 0, /* inquiry tp_clear; */ - - /*** Assigned meaning in release 2.1 ***/ - /*** rich comparisons ***/ - 0, /* richcmpfunc tp_richcompare; */ - - /*** weak reference enabler ***/ - 0, /* long tp_weaklistoffset; */ - - /*** Added in release 2.2 ***/ - /* Iterators */ - ( getiterfunc ) CurNurb_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) CurNurb_iterNext, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_CurNurb_methods, /* struct PyMethodDef *tp_methods; */ - 0, /* struct PyMemberDef *tp_members; */ - BPy_CurNurb_getseters, /* struct PyGetSetDef *tp_getset; */ - 0, /* struct _typeobject *tp_base; */ - 0, /* PyObject *tp_dict; */ - 0, /* descrgetfunc tp_descr_get; */ - 0, /* descrsetfunc tp_descr_set; */ - 0, /* long tp_dictoffset; */ - 0, /* initproc tp_init; */ - 0, /* allocfunc tp_alloc; */ - 0, /* newfunc tp_new; */ - /* Low-level free-memory routine */ - 0, /* freefunc tp_free; */ - /* For PyObject_IS_GC */ - 0, /* inquiry tp_is_gc; */ - 0, /* PyObject *tp_bases; */ - /* method resolution order */ - 0, /* PyObject *tp_mro; */ - 0, /* PyObject *tp_cache; */ - 0, /* PyObject *tp_subclasses; */ - 0, /* PyObject *tp_weaklist; */ - 0 -}; - -/* - compare - in this case, we consider two CurNurbs equal, if they point to the same - blender data. -*/ - -static int CurNurb_compare( BPy_CurNurb * a, BPy_CurNurb * b ) -{ - Nurb *pa = a->nurb; - Nurb *pb = b->nurb; - - return ( pa == pb ) ? 0 : -1; -} - - -/* - factory method to create a BPy_CurNurb from a Blender Nurb -*/ - -PyObject *CurNurb_CreatePyObject( Nurb * blen_nurb ) -{ - BPy_CurNurb *pyNurb; - - pyNurb = ( BPy_CurNurb * ) PyObject_NEW( BPy_CurNurb, &CurNurb_Type ); - - if( !pyNurb ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "could not create BPy_CurNurb PyObject" ); - - pyNurb->nurb = blen_nurb; - return ( PyObject * ) pyNurb; -} - - -/* - * CurNurb_repr - */ -static PyObject *CurNurb_repr( BPy_CurNurb * self ) -{ /* used by 'repr' */ - - return PyString_FromFormat( "[CurNurb \"%d\"]", self->nurb->type ); -} - -/* XXX Can't this be simply removed? */ -static PyObject *M_CurNurb_New( PyObject * self, PyObject * args ) -{ - return ( PyObject * ) 0; - -} - -/* - * Curve.getType - */ -static PyObject *CurNurb_getType( BPy_CurNurb * self ) -{ - /* type is on 3 first bits only */ - return PyInt_FromLong( self->nurb->type & 7 ); -} - -/* - * Curve.setType - * - * Convert the curve using Blender's convertspline fonction - */ -static int CurNurb_setType( BPy_CurNurb * self, PyObject * args ) -{ - PyObject* integer = PyNumber_Int( args ); - short value; - - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - value = ( short )PyInt_AS_LONG( integer ); - Py_DECREF( integer ); - - /* parameter value checking */ - if (value != CU_POLY && value != CU_BEZIER && value != CU_NURBS) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected integer argument" ); - - /* convert and raise error if impossible */ - if (convertspline(value, self->nurb)) - return EXPP_ReturnIntError( PyExc_ValueError, - "Conversion Impossible" ); - - return 0; -} - -/* - * CurNurb_getKnotsU - * - * returns curve's knotsU in a tuple. Empty tuple is returned if curve - * isn't Nurbs or it doesn't have knots in U - */ - -static PyObject *CurNurb_getKnotsU( BPy_CurNurb * self ) -{ - if(self->nurb->knotsu) { - int len = KNOTSU(self->nurb); - int i; - PyObject *knotsu = PyTuple_New(len); - if( !knotsu ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not get CurNurb.knotsU attribute" ); - - for(i = 0; i < len; ++i) - PyTuple_SetItem(knotsu, i, - PyFloat_FromDouble(self->nurb->knotsu[i])); - - return knotsu; - } - return PyTuple_New(0); -} - -/* - * CurNurb_getKnotsV - * - * returns curve's knotsV in a tuple. Empty tuple is returned if curve doesn't have knots in V - */ - -static PyObject *CurNurb_getKnotsV( BPy_CurNurb * self ) -{ - if(self->nurb->knotsv) { - int len = KNOTSV(self->nurb); - int i; - PyObject *knotsv = PyTuple_New(len); - if( !knotsv ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not get CurNurb.knotsV index" ); - - for(i = 0; i < len; ++i) - PyTuple_SetItem(knotsv, i, - PyFloat_FromDouble(self->nurb->knotsv[i] )); - - return knotsv; - } - return PyTuple_New(0); -} - -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. - * arg is BezTriple or list of xyzw floats - */ - -PyObject *CurNurb_append( BPy_CurNurb * self, PyObject * value ) -{ - return CurNurb_appendPointToNurb( self->nurb, value ); -} - - -/* - * CurNurb_appendPointToNurb - * this is a non-bpy utility func to add a point to a given nurb. - * notice the first arg is Nurb*. - */ - -PyObject *CurNurb_appendPointToNurb( Nurb * nurb, PyObject * value ) -{ - - int i; - int size; - int npoints = nurb->pntsu; - - /* - do we have a list of four floats or a BezTriple? - */ - - /* if curve is empty, adjust type depending on input type */ - if (nurb->bezt==NULL && nurb->bp==NULL) { - if (BPy_BezTriple_Check( value )) - nurb->type |= CU_BEZIER; - else if (PySequence_Check( value )) - nurb->type |= CU_NURBS; - else - return( EXPP_ReturnPyObjError( PyExc_TypeError, - "Expected a BezTriple or a Sequence of 4 (or 5) floats" ) ); - } - - - - if ((nurb->type & 7)==CU_BEZIER) { - BezTriple *tmp; - - if( !BPy_BezTriple_Check( value ) ) - return( EXPP_ReturnPyObjError( PyExc_TypeError, - "Expected a BezTriple\n" ) ); - -/* printf("\ndbg: got a BezTriple\n"); */ - tmp = nurb->bezt; /* save old points */ - nurb->bezt = - ( BezTriple * ) MEM_mallocN( sizeof( BezTriple ) * - ( npoints + 1 ), - "CurNurb_append2" ); - - if( !nurb->bezt ) - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, "allocation failed" ) ); - - /* copy old points to new */ - if( tmp ) { - memmove( nurb->bezt, tmp, sizeof( BezTriple ) * npoints ); - MEM_freeN( tmp ); - } - - nurb->pntsu++; - /* add new point to end of list */ - memcpy( nurb->bezt + npoints, - BezTriple_FromPyObject( value ), sizeof( BezTriple ) ); - - } - else if( PySequence_Check( value ) ) { - size = PySequence_Size( value ); -/* printf("\ndbg: got a sequence of size %d\n", size ); */ - if( size == 4 || size == 5 ) { - BPoint *tmp; - - tmp = nurb->bp; /* save old pts */ - - nurb->bp = - ( BPoint * ) MEM_mallocN( sizeof( BPoint ) * - ( npoints + 1 ), - "CurNurb_append1" ); - if( !nurb->bp ) - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "allocation failed" ) ); - - memmove( nurb->bp, tmp, sizeof( BPoint ) * npoints ); - if( tmp ) - MEM_freeN( tmp ); - - ++nurb->pntsu; - /* initialize new BPoint from old */ - memcpy( nurb->bp + npoints, nurb->bp, - sizeof( BPoint ) ); - - for( i = 0; i < 4; ++i ) { - PyObject *item = PySequence_GetItem( value, i ); - - if (item == NULL) - return NULL; - - - nurb->bp[npoints].vec[i] = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - - if (size == 5) { - PyObject *item = PySequence_GetItem( value, i ); - - if (item == NULL) - return NULL; - - nurb->bp[npoints].alfa = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - else { - nurb->bp[npoints].alfa = 0.0f; - } - - makeknots( nurb, 1, nurb->flagu >> 1 ); - - } else { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of 4 or 5 floats" ); - } - - } else { - /* bail with error */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of 4 or 5 floats" ); - - } - - Py_RETURN_NONE; -} - - -/* - * CurNurb_setMatIndex - * - * set index into material list - */ - -static int CurNurb_setMatIndex( BPy_CurNurb * self, PyObject * args ) -{ - printf ("%d\n", self->nurb->mat_nr); - return EXPP_setIValueRange( args, &self->nurb->mat_nr, 0, 15, 'h' ); -} - -/* - * CurNurb_getMatIndex - * - * returns index into material list - */ - -static PyObject *CurNurb_getMatIndex( BPy_CurNurb * self ) -{ - PyObject *index = PyInt_FromLong( ( long ) self->nurb->mat_nr ); - - if( index ) - return index; - - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not get material index" ); -} - -/* - * CurNurb_getFlagU - * - * returns curve's flagu - */ - -static PyObject *CurNurb_getFlagU( BPy_CurNurb * self ) -{ - PyObject *flagu = PyInt_FromLong( ( long ) self->nurb->flagu ); - - if( flagu ) - return flagu; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not get CurNurb.flagu index" ) ); -} - -/* - * CurNurb_setFlagU - * - * set curve's flagu and recalculate the knots - * - * Possible values: 0 - uniform, 2 - endpoints, 4 - bezier - * bit 0 controls CU_CYCLIC - */ - -static int CurNurb_setFlagU( BPy_CurNurb * self, PyObject * args ) -{ - PyObject* integer = PyNumber_Int( args ); - short value; - - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - value = ( short )PyInt_AS_LONG( integer ); - Py_DECREF( integer ); - - if( value < 0 || value > 5 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected integer argument in range [0,5]" ); - - if( self->nurb->flagu != value ) { - self->nurb->flagu = (short)value; - makeknots( self->nurb, 1, self->nurb->flagu >> 1 ); - } - - return 0; -} - -/* - * CurNurb_getFlagV - * - * returns curve's flagu - */ - -static PyObject *CurNurb_getFlagV( BPy_CurNurb * self ) -{ - PyObject *flagv = PyInt_FromLong( ( long ) self->nurb->flagv ); - - if( flagv ) - return flagv; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not get CurNurb.flagv" ) ); -} - -/* - * CurNurb_setFlagV - * - * set curve's flagu and recalculate the knots - * - * Possible values: 0 - uniform, 1 - endpoints, 2 - bezier - */ - -static int CurNurb_setFlagV( BPy_CurNurb * self, PyObject * args ) -{ - PyObject* integer = PyNumber_Int( args ); - short value; - - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - value = ( short )PyInt_AS_LONG( integer ); - Py_DECREF( integer ); - - if( value < 0 || value > 5 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected integer argument in range [0,5]" ); - - if( self->nurb->flagv != value ) { - self->nurb->flagv = (short)value; - makeknots( self->nurb, 2, self->nurb->flagv >> 1 ); - } - - return 0; -} - -/* - * CurNurb_getIter - * - * create an iterator for our CurNurb. - * this iterator returns the points for this CurNurb. - */ - -static PyObject *CurNurb_getIter( BPy_CurNurb * self ) -{ - self->bp = self->nurb->bp; - self->bezt = self->nurb->bezt; - self->atEnd = 0; - self->nextPoint = 0; - - /* set exhausted flag if both bp and bezt are zero */ - if( ( !self->bp ) && ( !self->bezt ) ) - self->atEnd = 1; - - Py_INCREF( self ); - return ( PyObject * ) self; -} - - -static PyObject *CurNurb_iterNext( BPy_CurNurb * self ) -{ - PyObject *po; /* return value */ - Nurb *pnurb = self->nurb; - int npoints = pnurb->pntsu; - - /* are we at end already? */ - if( self->atEnd ) - return ( EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ) ); - - if( self->nextPoint < npoints ) { - - po = CurNurb_pointAtIndex( self->nurb, self->nextPoint ); - self->nextPoint++; - - return po; - - } else { - self->atEnd = 1; /* set flag true */ - } - - return ( EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ) ); -} - - - -/* - * CurNurb_isNurb() - * test whether spline nurb or bezier - */ - -static PyObject *CurNurb_isNurb( BPy_CurNurb * self ) -{ - /* NOTE: a Nurb has bp and bezt pointers - * depending on type. - * It is possible both are NULL if no points exist. - * in that case, we return False - */ - - if( self->nurb->bp ) { - Py_RETURN_TRUE; - } else { - Py_RETURN_FALSE; - } -} - -/* - * CurNurb_isCyclic() - * test whether spline cyclic (closed) or not (open) - */ - -static PyObject *CurNurb_isCyclic( BPy_CurNurb * self ) -{ - /* supposing that the flagu is always set */ - - if( self->nurb->flagu & CU_CYCLIC ) { - Py_RETURN_TRUE; - } else { - Py_RETURN_FALSE; - } -} - -/* - * CurNurb_length - * returns the number of points in a Nurb - * this is a tp_as_sequence method, not a regular instance method. - */ - -static int CurNurb_length( PyInstanceObject * inst ) -{ - Nurb *nurb; - int len; - - if( BPy_CurNurb_Check( ( PyObject * ) inst ) ) { - nurb = ( ( BPy_CurNurb * ) inst )->nurb; - len = nurb->pntsu; - return len; - } - - return EXPP_ReturnIntError( PyExc_RuntimeError, - "arg is not a BPy_CurNurb" ); -} - -/* - * CurNurb_getPoint - * returns the Nth point in a Nurb - * this is one of the tp_as_sequence methods, hence the int N argument. - * it is called via the [] operator, not as a usual instance method. - */ - -PyObject *CurNurb_getPoint( BPy_CurNurb * self, int index ) -{ - Nurb *myNurb; - - int npoints; - - /* for convenince */ - myNurb = self->nurb; - npoints = myNurb->pntsu; - - /* DELETED: bail if index < 0 */ - /* actually, this check is not needed since python treats */ - /* negative indices as starting from the right end of a sequence */ - /* - THAT IS WRONG, when passing a negative index, python adjusts it to be positive - BUT it can still overflow in the negatives if the index is too small. - For example, list[-6] when list contains 5 items means index = -1 in here. - (theeth) - */ - - /* bail if no Nurbs in Curve */ - if( npoints == 0 ) - return ( EXPP_ReturnPyObjError( PyExc_IndexError, - "no points in this CurNurb" ) ); - - /* check index limits */ - if( index >= npoints || index < 0 ) - return ( EXPP_ReturnPyObjError( PyExc_IndexError, - "index out of range" ) ); - - return CurNurb_pointAtIndex( myNurb, index ); -} - -/* - * CurNurb_setPoint - * modifies the Nth point in a Nurb - * this is one of the tp_as_sequence methods, hence the int N argument. - * it is called via the [] = operator, not as a usual instance method. - */ -static int CurNurb_setPoint( BPy_CurNurb * self, int index, PyObject * pyOb ) -{ - Nurb *nurb = self->nurb; - int size; - - /* check index limits */ - if( index < 0 || index >= nurb->pntsu ) - return EXPP_ReturnIntError( PyExc_IndexError, - "array assignment index out of range" ); - - - /* branch by curve type */ - if ((nurb->type & 7)==CU_BEZIER) { /* BEZIER */ - /* check parameter type */ - if( !BPy_BezTriple_Check( pyOb ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a BezTriple" ); - - /* copy bezier in array */ - memcpy( nurb->bezt + index, - BezTriple_FromPyObject( pyOb ), sizeof( BezTriple ) ); - - return 0; /* finished correctly */ - } - else { /* NURBS or POLY */ - int i; - - /* check parameter type */ - if (!PySequence_Check( pyOb )) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of 4 (or optionally 5 if the curve is 3D) floats" ); - - size = PySequence_Size( pyOb ); - - /* check sequence size */ - if( size != 4 && size != 5 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of 4 (or optionally 5 if the curve is 3D) floats" ); - - /* copy x, y, z, w */ - for( i = 0; i < 4; ++i ) { - PyObject *item = PySequence_GetItem( pyOb, i ); - - if (item == NULL) - return -1; - - nurb->bp[index].vec[i] = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - - if (size == 5) { /* set tilt, if present */ - PyObject *item = PySequence_GetItem( pyOb, i ); - - if (item == NULL) - return -1; - - nurb->bp[index].alfa = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - else { /* if not, set default */ - nurb->bp[index].alfa = 0.0f; - } - - return 0; /* finished correctly */ - } -} - - -/* - * this is an internal routine. not callable directly from python - */ - -PyObject *CurNurb_pointAtIndex( Nurb * nurb, int index ) -{ - PyObject *pyo; - - if( nurb->bp ) { /* we have a nurb curve */ - int i; - - /* add Tilt only if curve is 3D */ - if (nurb->flag & CU_3D) - pyo = PyList_New( 5 ); - else - pyo = PyList_New( 4 ); - - for( i = 0; i < 4; i++ ) { - PyList_SetItem( pyo, i, - PyFloat_FromDouble( nurb->bp[index].vec[i] ) ); - } - - /* add Tilt only if curve is 3D */ - if (nurb->flag & CU_3D) - PyList_SetItem( pyo, 4, PyFloat_FromDouble( nurb->bp[index].alfa ) ); - - } else if( nurb->bezt ) { /* we have a bezier */ - /* if an error occurs, we just pass it on */ - pyo = BezTriple_CreatePyObject( &( nurb->bezt[index] ) ); - - } else /* something is horribly wrong */ - /* neither bp or bezt is set && pntsu != 0 */ - return EXPP_ReturnPyObjError( PyExc_SystemError, - "inconsistant structure found" ); - - return pyo; -} - -/* - dump nurb -*/ - -PyObject *CurNurb_dump( BPy_CurNurb * self ) -{ - BPoint *bp = NULL; - BezTriple *bezt = NULL; - Nurb *nurb = self->nurb; - int npoints = 0; - - if( !self->nurb ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "no Nurb in this CurNurb"); - - printf(" type: %d, mat_nr: %d hide: %d flag: %d", - nurb->type, nurb->mat_nr, nurb->hide, nurb->flag); - printf("\n pntsu: %d, pntsv: %d, resolu: %d resolv: %d", - nurb->pntsu, nurb->pntsv, nurb->resolu, nurb->resolv ); - printf("\n orderu: %d orderv: %d", nurb->orderu, nurb->orderv ); - printf("\n flagu: %d flagv: %d", - nurb->flagu, nurb->flagv ); - - npoints = nurb->pntsu; - - if( nurb->bp ) { /* we have a BPoint */ - int n; - for( n = 0, bp = nurb->bp; - n < npoints; - n++, bp++ ) - { - /* vec[4] */ - printf( "\ncoords[%d]: ", n); - { - int i; - for( i = 0; i < 4; i++){ - printf("%10.3f ", bp->vec[i] ); - } - } - - /* alfa, s[2] */ - printf("\n alpha: %5.2f", bp->alfa); - /* f1, hide */ - printf(" f1 %d hide %d", bp->f1, bp->hide ); - printf("\n"); - } - } - else { /* we have a BezTriple */ - int n; - for( n = 0, bezt = nurb->bezt; - n < npoints; - n++, bezt++ ) - { - int i, j; - printf("\npoint %d: ", n); - for( i = 0; i < 3; i++ ) { - printf("\nvec[%i] ",i ); - for( j = 0; j < 3; j++ ) { - printf(" %5.2f ", bezt->vec[i][j] ); - } - } - - - } - printf("\n"); - } - - Py_RETURN_NONE; -} - -/* - recalc nurb -*/ - -static PyObject *CurNurb_recalc( BPy_CurNurb * self ) -{ - calchandlesNurb ( self->nurb ); - Py_RETURN_NONE; -} - -PyObject *CurNurb_switchDirection( BPy_CurNurb * self ) -{ - if( !self->nurb ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "no Nurb in this CurNurb"); - - switchdirectionNurb( self->nurb ); - - Py_RETURN_NONE; -} - -PyObject *CurNurb_Init( void ) -{ - if( PyType_Ready( &CurNurb_Type ) < 0) - return NULL; - - return Py_InitModule3( "Blender.CurNurb", M_CurNurb_methods, - M_CurNurb_doc ); -} - -/* #####DEPRECATED###### */ - -static PyObject *CurNurb_oldsetType( BPy_CurNurb * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)CurNurb_setType ); -} - -static PyObject *CurNurb_oldsetMatIndex( BPy_CurNurb * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)CurNurb_setMatIndex ); -} - -static PyObject *CurNurb_oldsetFlagU( BPy_CurNurb * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)CurNurb_setFlagU ); -} - -static PyObject *CurNurb_oldsetFlagV( BPy_CurNurb * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)CurNurb_setFlagV ); -} diff --git a/source/blender/python/api2_2x/CurNurb.h b/source/blender/python/api2_2x/CurNurb.h deleted file mode 100644 index f7c50c41bb9..00000000000 --- a/source/blender/python/api2_2x/CurNurb.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * $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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Stephen Swaney - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#ifndef EXPP_NURB_H -#define EXPP_NURB_H - -#include -#include "DNA_curve_types.h" - -extern PyTypeObject CurNurb_Type; - -#define BPy_CurNurb_Check(v) ((v)->ob_type == &CurNurb_Type) /* for type checking */ - -/* Python BPy_CurNurb structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - Nurb * nurb; /* pointer to Blender data */ - - /* iterator stuff */ - /* internal ptrs to point data. do not free */ - BPoint *bp; - BezTriple *bezt; - int atEnd; /* iter exhausted flag */ - int nextPoint; - -} BPy_CurNurb; - - -/* - * prototypes - */ - -PyObject *CurNurb_Init( void ); -PyObject *CurNurb_CreatePyObject( Nurb * bzt ); -Nurb *CurNurb_FromPyObject( PyObject * pyobj ); - -PyObject *CurNurb_getPoint( BPy_CurNurb * self, int index ); -PyObject *CurNurb_pointAtIndex( Nurb * nurb, int index ); - -PyObject *CurNurb_appendPointToNurb( Nurb * nurb, PyObject * args ); - -#endif /* EXPP_NURB_H */ diff --git a/source/blender/python/api2_2x/Curve.c b/source/blender/python/api2_2x/Curve.c deleted file mode 100644 index e96e25c25d8..00000000000 --- a/source/blender/python/api2_2x/Curve.c +++ /dev/null @@ -1,1696 +0,0 @@ -/* - * $Id: Curve.c 12752 2007-12-01 23:25:00Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot, Stephen Swaney - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Curve.h" /*This must come first*/ - -#include "BLI_blenlib.h" -#include "BKE_main.h" -#include "BKE_displist.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_curve.h" -#include "BKE_material.h" -#include "MEM_guardedalloc.h" /* because we wil be mallocing memory */ -#include "CurNurb.h" -#include "SurfNurb.h" -#include "Material.h" -#include "Object.h" -#include "Key.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "mydevice.h" - - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Curve.__doc__ */ -/*****************************************************************************/ - -char M_Curve_doc[] = "The Blender Curve module\n\n\ -This module provides access to **Curve Data** in Blender.\n\ -Functions :\n\ - New(opt name) : creates a new curve object with the given name (optional)\n\ - Get(name) : retreives a curve with the given name (mandatory)\n\ - get(name) : same as Get. Kept for compatibility reasons"; -char M_Curve_New_doc[] = ""; -char M_Curve_Get_doc[] = "xxx"; - - - -/*****************************************************************************/ -/* Python API function prototypes for the Curve module. */ -/*****************************************************************************/ -static PyObject *M_Curve_New( PyObject * self, PyObject * args ); -static PyObject *M_Curve_Get( PyObject * self, PyObject * args ); - - -/*****************************************************************************/ -/* Python BPy_Curve instance methods declarations: */ -/*****************************************************************************/ - -static PyObject *Curve_getPathLen( BPy_Curve * self ); -static PyObject *Curve_setPathLen( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_getTotcol( BPy_Curve * self ); -static PyObject *Curve_setTotcol( BPy_Curve * self, PyObject * args ); -#if 0 -PyObject *Curve_getResolu( BPy_Curve * self ); -PyObject *Curve_setResolu( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getResolv( BPy_Curve * self ); -PyObject *Curve_setResolv( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getWidth( BPy_Curve * self ); -PyObject *Curve_setWidth( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getExt1( BPy_Curve * self ); -PyObject *Curve_setExt1( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getExt2( BPy_Curve * self ); -PyObject *Curve_setExt2( BPy_Curve * self, PyObject * args ); -#endif -static PyObject *Curve_getControlPoint( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_setControlPoint( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_getLoc( BPy_Curve * self ); -static PyObject *Curve_setLoc( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_getRot( BPy_Curve * self ); -static PyObject *Curve_setRot( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_getSize( BPy_Curve * self ); -static PyObject *Curve_setSize( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_getNumCurves( BPy_Curve * self ); -static PyObject *Curve_getKey( BPy_Curve * self ); -static PyObject *Curve_isNurb( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_isCyclic( BPy_Curve * self, PyObject * args); -static PyObject *Curve_getNumPoints( BPy_Curve * self, PyObject * args ); - -static PyObject *Curve_appendPoint( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * args ); - -static PyObject *Curve_getMaterials( BPy_Curve * self ); - -static PyObject *Curve_getBevOb( BPy_Curve * self ); -static PyObject *Curve_setBevOb( BPy_Curve * self, PyObject * args ); - -static PyObject *Curve_getTaperOb( BPy_Curve * self ); -static PyObject *Curve_setTaperOb( BPy_Curve * self, PyObject * args ); -static PyObject *Curve_copy( BPy_Curve * self ); - -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 ); - - -struct chartrans *text_to_curve( Object * ob, int mode ); -/*****************************************************************************/ -/* Python BPy_Curve methods: */ -/* gives access to */ -/* name, pathlen totcol flag bevresol */ -/* resolu resolv width ext1 ext2 */ -/* controlpoint loc rot size */ -/* numpts */ -/*****************************************************************************/ - - -PyObject *Curve_getName( BPy_Curve * self ) -{ - return PyString_FromString( self->curve->id.name + 2 ); -} - -static int Curve_newsetName( BPy_Curve * self, PyObject * args ) -{ - char *name; - - name = PyString_AsString( args ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - - rename_id( &self->curve->id, name ); /* proper way in Blender */ - Curve_update( self ); - - return 0; -} - -static PyObject *Curve_getPathLen( BPy_Curve * self ) -{ - return PyInt_FromLong( ( long ) self->curve->pathlen ); -} - - -static int Curve_newsetPathLen( BPy_Curve * self, PyObject * args ) -{ - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - num = PyNumber_Int( args ); - self->curve->pathlen = (short)PyInt_AS_LONG( num ); - Py_DECREF( num ); - - return 0; -} - -static PyObject *Curve_getTotcol( BPy_Curve * self ) -{ - return PyInt_FromLong( ( long ) self->curve->totcol ); -} - - -PyObject *Curve_getMode( BPy_Curve * self ) -{ - return PyInt_FromLong( ( long ) self->curve->flag ); -} - - -static int Curve_newsetMode( BPy_Curve * self, PyObject * args ) -{ - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - num = PyNumber_Int( args ); - self->curve->flag = (short)PyInt_AS_LONG( num ); - Py_DECREF( num ); - - return 0; -} - -PyObject *Curve_getBevresol( BPy_Curve * self ) -{ - return PyInt_FromLong( ( long ) self->curve->bevresol ); -} - -static int Curve_newsetBevresol( BPy_Curve * self, PyObject * args ) -{ - short value; - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - num = PyNumber_Int( args ); - value = (short)PyInt_AS_LONG( num ); - Py_DECREF( num ); - - if( value > 10 || value < 0 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are between 0 and 10" ); - - self->curve->bevresol = value; - return 0; -} - - -PyObject *Curve_getResolu( BPy_Curve * self ) -{ - return PyInt_FromLong( ( long ) self->curve->resolu ); -} - - -static int Curve_newsetResolu( BPy_Curve * self, PyObject * args ) -{ - short value; - Nurb *nu; - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - num = PyNumber_Int( args ); - value = (short)PyInt_AS_LONG( num ); - Py_DECREF( num ); - - if( value > 128 || value < 1 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are between 1 and 128" ); - - self->curve->resolu = value; - /* propagate the change through all the curves */ - for( nu = self->curve->nurb.first; nu; nu = nu->next ) - nu->resolu = value; - - return 0; -} - -PyObject *Curve_getResolv( BPy_Curve * self ) -{ - return PyInt_FromLong( ( long ) self->curve->resolv ); -} - -static int Curve_newsetResolv( BPy_Curve * self, PyObject * args ) -{ - short value; - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - num = PyNumber_Int( args ); - value = (short)PyInt_AS_LONG( num ); - Py_DECREF( num ); - - if(value > 128 || value < 1) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are between 1 and 128" ); - self->curve->resolv = value; - - return 0; -} - -PyObject *Curve_getWidth( BPy_Curve * self ) -{ - return PyFloat_FromDouble( ( double ) self->curve->width ); -} - - -static int Curve_newsetWidth( BPy_Curve * self, PyObject * args ) -{ - float value; - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - - num = PyNumber_Float( args ); - value = (float)PyFloat_AS_DOUBLE( num ); - Py_DECREF( num ); - - if(value > 2.0f || value < 0.0f) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are between 2.0 and 0.0" ); - self->curve->width = value; - - return 0; -} - - -PyObject *Curve_getExt1( BPy_Curve * self ) -{ - return PyFloat_FromDouble( ( double ) self->curve->ext1 ); -} - - -static int Curve_newsetExt1( BPy_Curve * self, PyObject * args ) -{ - float value; - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - - num = PyNumber_Float( args ); - value = (float)PyFloat_AS_DOUBLE( num ); - Py_DECREF( num ); - - if(value > 100.0f || value < 0.0f) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are between 0.0 and 100.0" ); - self->curve->ext1 = value; - - return 0; -} - -PyObject *Curve_getExt2( BPy_Curve * self ) -{ - return PyFloat_FromDouble( ( double ) self->curve->ext2 ); -} - - -static int Curve_newsetExt2( BPy_Curve * self, PyObject * args ) -{ - float value; - PyObject *num; - - if( !PyNumber_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - - num = PyNumber_Float( args ); - value = (float)PyFloat_AS_DOUBLE( num ); - Py_DECREF( num ); - - if(value > 2.0f || value < 0.0f) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are between 0.0 and 2.0" ); - self->curve->ext2 = value; - - return 0; -} - -/* - * Curve_setControlPoint - * this function sets an EXISTING control point. - * it does NOT add a new one. - */ - -static PyObject *Curve_setControlPoint( BPy_Curve * self, PyObject * args ) -{ - PyObject *listargs = 0; - Nurb *ptrnurb = self->curve->nurb.first; - int numcourbe = 0, numpoint = 0, i, j; - - if( !ptrnurb ) - Py_RETURN_NONE; - - if( ptrnurb->bp ) - if( !PyArg_ParseTuple - ( args, "iiO", &numcourbe, &numpoint, &listargs ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "expected int, int, list arguments" ) ); - if( ptrnurb->bezt ) - if( !PyArg_ParseTuple - ( args, "iiO", &numcourbe, &numpoint, &listargs ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "expected int, int, list arguments" ) ); - - for( i = 0; i < numcourbe; i++ ) - ptrnurb = ptrnurb->next; - - if( ptrnurb->bp ) - for( i = 0; i < 4; i++ ) - ptrnurb->bp[numpoint].vec[i] = - (float)PyFloat_AsDouble( PyList_GetItem ( listargs, i ) ); - - if( ptrnurb->bezt ) - for( i = 0; i < 3; i++ ) - for( j = 0; j < 3; j++ ) - ptrnurb->bezt[numpoint].vec[i][j] = - (float)PyFloat_AsDouble( PyList_GetItem - ( listargs, - i * 3 + j ) ); - - Py_RETURN_NONE; -} - - -static PyObject *Curve_getControlPoint( BPy_Curve * self, PyObject * args ) -{ - PyObject *liste; - PyObject *item; - - Nurb *ptrnurb; - int i, j; - /* input args: requested curve and point number on curve */ - int numcourbe, numpoint; - - if( !PyArg_ParseTuple( args, "ii", &numcourbe, &numpoint ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int int arguments" ) ); - if( ( numcourbe < 0 ) || ( numpoint < 0 ) ) - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "arguments must be non-negative" ) ); - - /* if no nurbs in this curve obj */ - if( !self->curve->nurb.first ) - return PyList_New( 0 ); - - /* walk the list of nurbs to find requested numcourbe */ - ptrnurb = self->curve->nurb.first; - for( i = 0; i < numcourbe; i++ ) { - ptrnurb = ptrnurb->next; - if( !ptrnurb ) /* if zero, we ran just ran out of curves */ - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "curve index out of range" ) ); - } - - /* check numpoint param against pntsu */ - if( numpoint >= ptrnurb->pntsu ) - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "point index out of range" ) ); - - liste = PyList_New( 0 ); - if( ptrnurb->bp ) { /* if we are a nurb curve, you get 4 values */ - for( i = 0; i < 4; i++ ) { - item = PyFloat_FromDouble( ptrnurb->bp[numpoint].vec[i] ); - PyList_Append( liste, item ); - Py_DECREF(item); - } - } else if( ptrnurb->bezt ) { /* if we are a bezier, you get 9 values */ - for( i = 0; i < 3; i++ ) - for( j = 0; j < 3; j++ ) { - item = PyFloat_FromDouble( ptrnurb->bezt[numpoint].vec[i][j] ); - PyList_Append( liste, item ); - Py_DECREF(item); - } - } - - return liste; -} - -static PyObject *Curve_getLoc( BPy_Curve * self ) -{ - return Py_BuildValue( "[f,f,f]", self->curve->loc[0], - self->curve->loc[1], self->curve->loc[2] ); -} - -static int Curve_newsetLoc( BPy_Curve * self, PyObject * args ) -{ - float loc[3]; - int i; - - if( ( !PyList_Check( args ) && !PyTuple_Check( args ) ) || - PySequence_Size( args ) != 3 ) { -TypeError: - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a sequence of three floats" ); - } - - for( i = 0; i < 3; i++ ) { - PyObject *item = PySequence_GetItem( args, i ); - PyObject *num = PyNumber_Float( item ); - Py_DECREF( item ); - if( !num ) - goto TypeError; - loc[i] = PyFloat_AS_DOUBLE( num ); - Py_DECREF( num ); - } - memcpy( self->curve->loc, loc, sizeof( loc ) ); - - return 0; -} - -static PyObject *Curve_getRot( BPy_Curve * self ) -{ - return Py_BuildValue( "[f,f,f]", self->curve->rot[0], - self->curve->rot[1], self->curve->rot[2] ); -} - -static int Curve_newsetRot( BPy_Curve * self, PyObject * args ) -{ - float rot[3]; - int i; - - if( ( !PyList_Check( args ) && !PyTuple_Check( args ) ) || - PySequence_Size( args ) != 3 ) { -TypeError: - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a sequence of three floats" ); - } - - for( i = 0; i < 3; i++ ) { - PyObject *item = PySequence_GetItem( args, i ); - PyObject *num = PyNumber_Float( item ); - Py_DECREF( item ); - if( !num ) - goto TypeError; - rot[i] = PyFloat_AS_DOUBLE( num ); - Py_DECREF( num ); - } - memcpy( self->curve->rot, rot, sizeof( rot ) ); - - return 0; -} - -static PyObject *Curve_getSize( BPy_Curve * self ) -{ - return Py_BuildValue( "[f,f,f]", self->curve->size[0], - self->curve->size[1], self->curve->size[2] ); -} - -static int Curve_newsetSize( BPy_Curve * self, PyObject * args ) -{ - float size[3]; - int i; - - if( ( !PyList_Check( args ) && !PyTuple_Check( args ) ) || - PySequence_Size( args ) != 3 ) { -TypeError: - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a sequence of three floats" ); - } - - for( i = 0; i < 3; i++ ) { - PyObject *item = PySequence_GetItem( args, i ); - PyObject *num = PyNumber_Float( item ); - Py_DECREF( item ); - if( !num ) - goto TypeError; - size[i] = PyFloat_AS_DOUBLE( num ); - Py_DECREF( num ); - } - memcpy( self->curve->size, size, sizeof( size ) ); - - return 0; -} - -/* - * Count the number of splines in a Curve Object - * int getNumCurves() - */ - -static PyObject *Curve_getNumCurves( BPy_Curve * self ) -{ - Nurb *ptrnurb; - PyObject *ret_val; - int num_curves = 0; /* start with no splines */ - - /* get curve */ - ptrnurb = self->curve->nurb.first; - if( ptrnurb ) { /* we have some nurbs in this curve */ - for(;;) { - ++num_curves; - ptrnurb = ptrnurb->next; - if( !ptrnurb ) /* no more curves */ - break; - } - } - - ret_val = PyInt_FromLong( ( long ) num_curves ); - - if( ret_val ) - return ret_val; - - /* oops! */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get number of curves" ); -} - -/* - * get the key object linked to this curve - */ - -static PyObject *Curve_getKey( BPy_Curve * self ) -{ - PyObject *keyObj; - - if (self->curve->key) - keyObj = Key_CreatePyObject(self->curve->key); - else keyObj = EXPP_incr_ret(Py_None); - - return keyObj; -} - -/* - * count the number of points in a given spline - * int getNumPoints( curve_num=0 ) - * - */ - -static PyObject *Curve_getNumPoints( BPy_Curve * self, PyObject * args ) -{ - Nurb *ptrnurb; - PyObject *ret_val; - int curve_num = 0; /* default spline number */ - int i; - - /* parse input arg */ - if( !PyArg_ParseTuple( args, "|i", &curve_num ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ) ); - - /* check arg - must be non-negative */ - if( curve_num < 0 ) - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "argument must be non-negative" ) ); - - - /* walk the list of curves looking for our curve */ - ptrnurb = self->curve->nurb.first; - if( !ptrnurb ) { /* no splines in this Curve */ - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "no splines in this Curve" ) ); - } - - for( i = 0; i < curve_num; i++ ) { - ptrnurb = ptrnurb->next; - if( !ptrnurb ) /* if zero, we ran just ran out of curves */ - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "curve index out of range" ) ); - } - - /* pntsu is the number of points in curve */ - ret_val = PyInt_FromLong( ( long ) ptrnurb->pntsu ); - - if( ret_val ) - return ret_val; - - /* oops! */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get number of points for curve" ); -} - -/* - * Test whether a given spline of a Curve is a nurb - * as opposed to a bezier - * int isNurb( curve_num=0 ) - */ - -static PyObject *Curve_isNurb( BPy_Curve * self, PyObject * args ) -{ - int curve_num = 0; /* default value */ - int is_nurb; - Nurb *ptrnurb; - PyObject *ret_val; - int i; - - /* parse and check input args */ - if( !PyArg_ParseTuple( args, "|i", &curve_num ) ) { - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ) ); - } - if( curve_num < 0 ) { - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "curve number must be non-negative" ) ); - } - - ptrnurb = self->curve->nurb.first; - - if( !ptrnurb ) /* no splines in this curve */ - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "no splines in this Curve" ) ); - - for( i = 0; i < curve_num; i++ ) { - ptrnurb = ptrnurb->next; - if( !ptrnurb ) /* if zero, we ran just ran out of curves */ - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "curve index out of range" ) ); - } - - /* right now, there are only two curve types, nurb and bezier. */ - is_nurb = ptrnurb->bp ? 1 : 0; - - ret_val = PyInt_FromLong( ( long ) is_nurb ); - if( ret_val ) - return ret_val; - - /* oops */ - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get curve type" ) ); -} - -/* trying to make a check for closedness (cyclic), following on isNurb (above) - copy-pasting done by antont@kyperjokki.fi */ - -static PyObject *Curve_isCyclic( BPy_Curve * self, PyObject * args ) -{ - int curve_num = 0; /* default value */ - /* unused:*/ - /* int is_cyclic; - * PyObject *ret_val;*/ - Nurb *ptrnurb; - int i; - - /* parse and check input args */ - if( !PyArg_ParseTuple( args, "|i", &curve_num ) ) { - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ) ); - } - if( curve_num < 0 ) { - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "curve number must be non-negative" ) ); - } - - ptrnurb = self->curve->nurb.first; - - if( !ptrnurb ) /* no splines in this curve */ - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "no splines in this Curve" ) ); - - for( i = 0; i < curve_num; i++ ) { - ptrnurb = ptrnurb->next; - if( !ptrnurb ) /* if zero, we ran just ran out of curves */ - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "curve index out of range" ) ); - } - - if( ptrnurb->flagu & CU_CYCLIC ){ - return EXPP_incr_ret_True(); - } else { - return EXPP_incr_ret_False(); - } -} - - -/* - * Curve_appendPoint( numcurve, new_point ) - * append a new point to indicated spline - */ - -static PyObject *Curve_appendPoint( BPy_Curve * self, PyObject * args ) -{ - int i; - int nurb_num; /* index of curve we append to */ - PyObject *coord_args; /* coords for new point */ - Nurb *nurb = self->curve->nurb.first; /* first nurb in Curve */ - -/* fixme - need to malloc new Nurb */ - if( !nurb ) - return ( EXPP_ReturnPyObjError - ( PyExc_AttributeError, "no nurbs in this Curve" ) ); - - if( !PyArg_ParseTuple( args, "iO", &nurb_num, &coord_args ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "expected int, coords as arguments" ) ); - - /* - chase down the list of Nurbs looking for our curve. - */ - for( i = 0; i < nurb_num; i++ ) { - nurb = nurb->next; - if( !nurb ) /* we ran off end of list */ - return EXPP_ReturnPyObjError( PyExc_ValueError, - "curve index out of range" ); - } - return CurNurb_appendPointToNurb( nurb, coord_args ); -} - - -/**** - appendNurb( new_point ) - create a new nurb in the Curve and add the point param to it. - returns a refernce to the newly created nurb. -*****/ - -static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * value ) -{ - Nurb *new_nurb; - /* malloc new nurb */ - new_nurb = ( Nurb * ) MEM_callocN( sizeof( Nurb ), "appendNurb" ); - if( !new_nurb ) - return EXPP_ReturnPyObjError - ( PyExc_MemoryError, "unable to malloc Nurb" ); - - if( CurNurb_appendPointToNurb( new_nurb, value ) ) { - new_nurb->resolu = self->curve->resolu; - new_nurb->resolv = self->curve->resolv; - new_nurb->hide = 0; - new_nurb->flag = 1; - - - if( new_nurb->bezt ) { /* do setup for bezt */ - new_nurb->type = CU_BEZIER; - new_nurb->bezt->h1 = HD_ALIGN; - new_nurb->bezt->h2 = HD_ALIGN; - 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 */ - new_nurb->pntsv = 1; - new_nurb->type = CU_NURBS; - new_nurb->orderu = 4; - new_nurb->flagu = 0; - new_nurb->flagv = 0; - new_nurb->bp->f1 = 0; - new_nurb->bp->hide = 0; - new_nurb->knotsu = 0; - /*makenots( new_nurb, 1, new_nurb->flagu >> 1); */ - } - BLI_addtail( &self->curve->nurb, new_nurb); - - } else { - freeNurb( new_nurb ); - return NULL; /* with PyErr already set */ - } - - return CurNurb_CreatePyObject( new_nurb ); -} - - -/* - * Curve_update( ) - * method to update display list for a Curve. - * used. after messing with control points - */ - -PyObject *Curve_update( BPy_Curve * self ) -{ - Nurb *nu = self->curve->nurb.first; - - /* recalculate handles for each curve: calchandlesNurb() will make - * sure curves are bezier first */ - while( nu ) { - calchandlesNurb ( nu ); - nu = nu->next; - } - - Object_updateDag( (void*) self->curve ); - - Py_RETURN_NONE; -} - -/* - * Curve_getMaterials - * - */ - -static PyObject *Curve_getMaterials( BPy_Curve * self ) -{ - return EXPP_PyList_fromMaterialList( self->curve->mat, - self->curve->totcol, 1 ); -} - -static int Curve_setMaterials( BPy_Curve *self, PyObject * value ) -{ - Material **matlist; - int len; - - if( !PySequence_Check( value ) || - !EXPP_check_sequence_consistency( value, &Material_Type ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "sequence should only contain materials or None)" ); - - len = PySequence_Size( value ); - if( len > 16 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "list can't have more than 16 materials" ); - - /* free old material list (if it exists) and adjust user counts */ - if( self->curve->mat ) { - Curve *cur = self->curve; - int i; - for( i = cur->totcol; i-- > 0; ) - if( cur->mat[i] ) - cur->mat[i]->id.us--; - MEM_freeN( cur->mat ); - } - - /* build the new material list, increment user count, store it */ - - matlist = EXPP_newMaterialList_fromPyList( value ); - EXPP_incr_mats_us( matlist, len ); - self->curve->mat = matlist; - self->curve->totcol = (short)len; - -/**@ This is another ugly fix due to the weird material handling of blender. - * it makes sure that object material lists get updated (by their length) - * according to their data material lists, otherwise blender crashes. - * It just stupidly runs through all objects...BAD BAD BAD. - */ - - test_object_materials( ( ID * ) self->curve ); - - return 0; -} - -/*****************************************************************************/ -/* Function: Curve_getBevOb */ -/* Description: Get the bevel object assign to the curve. */ -/*****************************************************************************/ -static PyObject *Curve_getBevOb( BPy_Curve * self) -{ - if( self->curve->bevobj ) { - return Object_CreatePyObject( self->curve->bevobj ); - } - - return EXPP_incr_ret( Py_None ); -} - -/*****************************************************************************/ -/* Function: Curve_newsetBevOb */ -/* Description: Assign a bevel object to the curve. */ -/*****************************************************************************/ -static int Curve_newsetBevOb( BPy_Curve * self, PyObject * args ) -{ - - if (BPy_Object_Check( args ) && ((BPy_Object *)args)->object->data == self->curve ) - return EXPP_ReturnIntError( PyExc_ValueError, - "Can't bevel an object to itself" ); - - return GenericLib_assignData(args, (void **) &self->curve->bevobj, 0, 0, ID_OB, OB_CURVE); -} - -/*****************************************************************************/ -/* Function: Curve_getTaperOb */ -/* Description: Get the taper object assign to the curve. */ -/*****************************************************************************/ - -static PyObject *Curve_getTaperOb( BPy_Curve * self) -{ - if( self->curve->taperobj ) - return Object_CreatePyObject( self->curve->taperobj ); - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: Curve_newsetTaperOb */ -/* Description: Assign a taper object to the curve. */ -/*****************************************************************************/ - -static int Curve_newsetTaperOb( BPy_Curve * self, PyObject * args ) -{ - if (BPy_Object_Check( args ) && ((BPy_Object *)args)->object->data == self->curve ) - return EXPP_ReturnIntError( PyExc_ValueError, - "Can't taper an object to itself" ); - - return GenericLib_assignData(args, (void **) &self->curve->taperobj, 0, 0, ID_OB, OB_CURVE); -} - -/*****************************************************************************/ -/* Function: Curve_copy */ -/* Description: Return a copy of this curve data. */ -/*****************************************************************************/ - -PyObject *Curve_copy( BPy_Curve * self ) -{ - BPy_Curve *pycurve; /* for Curve Data object wrapper in Python */ - Curve *blcurve = 0; /* for actual Curve Data we create in Blender */ - - /* copies the data */ - blcurve = copy_curve( self->curve ); /* first create the Curve Data in Blender */ - - if( blcurve == NULL ) /* bail out if add_curve() failed */ - return ( EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "couldn't create Curve Data in Blender" ) ); - - /* return user count to zero because add_curve() inc'd it */ - blcurve->id.us = 0; - - /* create python wrapper obj */ - pycurve = ( BPy_Curve * ) PyObject_NEW( BPy_Curve, &Curve_Type ); - - if( pycurve == NULL ) - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create Curve Data object" ) ); - - pycurve->curve = blcurve; /* link Python curve wrapper to Blender Curve */ - return ( PyObject * ) pycurve; -} - - -/* - * Curve_getIter - * - * create an iterator for our Curve. - * this iterator returns the Nurbs for this Curve. - * the iter_pointer always points to the next available item or null - */ - -static PyObject *Curve_getIter( BPy_Curve * self ) -{ - self->iter_pointer = self->curve->nurb.first; - - Py_INCREF( self ); - return ( PyObject * ) self; - -} - - -/* - * Curve_iterNext - * get the next item. - * iter_pointer always points to the next available element - * or NULL if at the end of the list. - */ - -static PyObject *Curve_iterNext( BPy_Curve * self ) -{ - Nurb *pnurb; - - if( self->iter_pointer ) { - pnurb = self->iter_pointer; - self->iter_pointer = pnurb->next; /* advance iterator */ - if( (pnurb->type & 7) == CU_BEZIER || pnurb->pntsv <= 1 ) - return CurNurb_CreatePyObject( pnurb ); /* make a bpy_curnurb */ - else - return SurfNurb_CreatePyObject( pnurb ); /* make a bpy_surfnurb */ - } - - /* if iter_pointer was null, we are at end */ - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); -} - -/* tp_sequence methods */ - -/* - * Curve_length - * returns the number of curves in a Curve - * this is a tp_as_sequence method, not a regular instance method. - */ - -static int Curve_length( PyInstanceObject * inst ) -{ - if( BPy_Curve_Check( ( PyObject * ) inst ) ) - return ( ( int ) PyInt_AsLong - ( Curve_getNumCurves( ( BPy_Curve * ) inst ) ) ); - - return EXPP_ReturnIntError( PyExc_RuntimeError, - "arg is not a BPy_Curve" ); - -} - -/* - * Curve_getNurb - * returns the Nth nurb in a Curve. - * this is one of the tp_as_sequence methods, hence the int N argument. - * it is called via the [] operator, not as a usual instance method. - */ - -PyObject *Curve_getNurb( BPy_Curve * self, int n ) -{ - Nurb *pNurb; - int i; - - /* bail if index < 0 */ - if( n < 0 ) - return ( EXPP_ReturnPyObjError( PyExc_IndexError, - "index less than 0" ) ); - /* bail if no Nurbs in Curve */ - if( self->curve->nurb.first == 0 ) - return ( EXPP_ReturnPyObjError( 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_ReturnPyObjError( PyExc_IndexError, - "index out of range" ) ); - - /* until there is a Surface BPyType, distinquish between a curve and a - * surface based on whether it's a Bezier and the v size */ - if( (pNurb->type & 7) == CU_BEZIER || pNurb->pntsv <= 1 ) - return CurNurb_CreatePyObject( pNurb ); /* make a bpy_curnurb */ - else - return SurfNurb_CreatePyObject( pNurb ); /* make a bpy_surfnurb */ - -} - -/* - * 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. */ -/*****************************************************************************/ -static int Curve_compare( BPy_Curve * a, BPy_Curve * b ) -{ - return ( a->curve == b->curve ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Curve_repr */ -/* Description: This is a callback function for the BPy_Curve type. It */ -/* builds a meaninful string to represent curve objects. */ -/*****************************************************************************/ -static PyObject *Curve_repr( BPy_Curve * self ) -{ /* used by 'repr' */ - - return PyString_FromFormat( "[Curve \"%s\"]", - self->curve->id.name + 2 ); -} - -/* attributes for curves */ - -static PyGetSetDef Curve_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"pathlen", - (getter)Curve_getPathLen, (setter)Curve_newsetPathLen, - "The path length, used to set the number of frames for an animation (not the physical length)", - NULL}, - {"totcol", - (getter)Curve_getTotcol, (setter)NULL, - "The maximum number of linked materials", - NULL}, - {"flag", - (getter)Curve_getMode, (setter)Curve_newsetMode, - "The flag bitmask", - NULL}, - {"bevresol", - (getter)Curve_getBevresol, (setter)Curve_newsetBevresol, - "The bevel resolution", - NULL}, - {"resolu", - (getter)Curve_getResolu, (setter)Curve_newsetResolu, - "The resolution in U direction", - NULL}, - {"resolv", - (getter)Curve_getResolv, (setter)Curve_newsetResolv, - "The resolution in V direction", - NULL}, - {"width", - (getter)Curve_getWidth, (setter)Curve_newsetWidth, - "The curve width", - NULL}, - {"ext1", - (getter)Curve_getExt1, (setter)Curve_newsetExt1, - "The extent1 value (for bevels)", - NULL}, - {"ext2", - (getter)Curve_getExt2, (setter)Curve_newsetExt2, - "The extent2 value (for bevels)", - NULL}, - {"loc", - (getter)Curve_getLoc, (setter)Curve_newsetLoc, - "The data location (from the center)", - NULL}, - {"rot", - (getter)Curve_getRot, (setter)Curve_newsetRot, - "The data rotation (from the center)", - NULL}, - {"size", - (getter)Curve_getSize, (setter)Curve_newsetSize, - "The data size (from the center)", - NULL}, - {"bevob", - (getter)Curve_getBevOb, (setter)Curve_newsetBevOb, - "The bevel object", - NULL}, - {"taperob", - (getter)Curve_getTaperOb, (setter)Curve_newsetTaperOb, - "The taper object", - NULL}, - {"key", - (getter)Curve_getKey, (setter)NULL, - "The shape key for the curve (if any)", - NULL}, - {"materials", - (getter)Curve_getMaterials, (setter)Curve_setMaterials, - "The materials associated with the curve", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ - -}; - -/*****************************************************************************/ -/* Function: M_Curve_New */ -/* Python equivalent: Blender.Curve.New */ -/*****************************************************************************/ -static PyObject *M_Curve_New( PyObject * self, PyObject * args ) -{ - char *name = "Curve"; - BPy_Curve *pycurve; /* for Curve Data object wrapper in Python */ - Curve *blcurve = 0; /* for actual Curve Data we create in Blender */ - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "expected string argument or no argument" ) ); - - blcurve = add_curve( name, OB_CURVE ); /* first create the Curve Data in Blender */ - - if( blcurve == NULL ) /* bail out if add_curve() failed */ - return ( EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "couldn't create Curve Data in Blender" ) ); - - /* return user count to zero because add_curve() inc'd it */ - blcurve->id.us = 0; - /* create python wrapper obj */ - pycurve = ( BPy_Curve * ) PyObject_NEW( BPy_Curve, &Curve_Type ); - - if( pycurve == NULL ) - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create Curve Data object" ) ); - - pycurve->curve = blcurve; /* link Python curve wrapper to Blender Curve */ - - return ( PyObject * ) pycurve; -} - -/*****************************************************************************/ -/* Function: M_Curve_Get */ -/* Python equivalent: Blender.Curve.Get */ -/*****************************************************************************/ -static PyObject *M_Curve_Get( PyObject * self, PyObject * args ) -{ - - char *name = NULL; - Curve *curv_iter; - BPy_Curve *wanted_curv; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) /* expects nothing or a string */ - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ) ); - if( name ) { /*a name has been given */ - /* Use the name to search for the curve requested */ - wanted_curv = NULL; - curv_iter = G.main->curve.first; - - while( ( curv_iter ) && ( wanted_curv == NULL ) ) { - - if( strcmp( name, curv_iter->id.name + 2 ) == 0 ) { - wanted_curv = ( BPy_Curve * ) - PyObject_NEW( BPy_Curve, &Curve_Type ); - if( wanted_curv ) - wanted_curv->curve = curv_iter; - } - - curv_iter = curv_iter->id.next; - } - - if( wanted_curv == NULL ) { /* Requested curve doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Curve \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - - return ( PyObject * ) wanted_curv; - } /* end of if(name) */ - else { - /* no name has been given; return a list of all curves by name. */ - PyObject *curvlist; - - curv_iter = G.main->curve.first; - curvlist = PyList_New( 0 ); - - if( curvlist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( curv_iter ) { - BPy_Curve *found_cur = - ( BPy_Curve * ) PyObject_NEW( BPy_Curve, - &Curve_Type ); - found_cur->curve = curv_iter; - PyList_Append( curvlist, ( PyObject * ) found_cur ); - Py_DECREF(found_cur); - curv_iter = curv_iter->id.next; - } - - return ( curvlist ); - } /* end of else */ -} - -/*****************************************************************************/ -/* Python method definitions for Blender.Curve module: */ -/*****************************************************************************/ -struct PyMethodDef M_Curve_methods[] = { - {"New", ( PyCFunction ) M_Curve_New, METH_VARARGS, M_Curve_New_doc}, - {"Get", M_Curve_Get, METH_VARARGS, M_Curve_Get_doc}, - {"get", M_Curve_Get, METH_VARARGS, M_Curve_Get_doc}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Python BPy_Curve instance methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Curve_methods[] = { - {"getName", ( PyCFunction ) Curve_getName, - METH_NOARGS, "() - Return Curve Data name"}, - {"setName", ( PyCFunction ) Curve_setName, - METH_VARARGS, "() - Sets Curve Data name"}, - {"getPathLen", ( PyCFunction ) Curve_getPathLen, - METH_NOARGS, "() - Return Curve path length"}, - {"setPathLen", ( PyCFunction ) Curve_setPathLen, - METH_VARARGS, "(int) - Sets Curve path length"}, - {"getTotcol", ( PyCFunction ) Curve_getTotcol, - METH_NOARGS, "() - Return the number of materials of the curve"}, - {"setTotcol", ( PyCFunction ) Curve_setTotcol, - METH_VARARGS, "(int) - Sets the number of materials of the curve"}, - {"getFlag", ( PyCFunction ) Curve_getMode, - METH_NOARGS, "() - Return flag (see the doc for semantic)"}, - {"setFlag", ( PyCFunction ) Curve_setMode, - METH_VARARGS, "(int) - Sets flag (see the doc for semantic)"}, - {"getBevresol", ( PyCFunction ) Curve_getBevresol, - METH_NOARGS, "() - Return bevel resolution"}, - {"setBevresol", ( PyCFunction ) Curve_setBevresol, - METH_VARARGS, "(int) - Sets bevel resolution"}, - {"getResolu", ( PyCFunction ) Curve_getResolu, - METH_NOARGS, "() - Return U resolution"}, - {"setResolu", ( PyCFunction ) Curve_setResolu, - METH_VARARGS, "(int) - Sets U resolution"}, - {"getResolv", ( PyCFunction ) Curve_getResolv, - METH_NOARGS, "() - Return V resolution"}, - {"setResolv", ( PyCFunction ) Curve_setResolv, - METH_VARARGS, "(int) - Sets V resolution"}, - {"getWidth", ( PyCFunction ) Curve_getWidth, - METH_NOARGS, "() - Return curve width"}, - {"setWidth", ( PyCFunction ) Curve_setWidth, - METH_VARARGS, "(int) - Sets curve width"}, - {"getExt1", ( PyCFunction ) Curve_getExt1, - METH_NOARGS, "() - Returns extent 1 of the bevel"}, - {"setExt1", ( PyCFunction ) Curve_setExt1, - METH_VARARGS, "(int) - Sets extent 1 of the bevel"}, - {"getExt2", ( PyCFunction ) Curve_getExt2, - METH_NOARGS, "() - Return extent 2 of the bevel "}, - {"setExt2", ( PyCFunction ) Curve_setExt2, - METH_VARARGS, "(int) - Sets extent 2 of the bevel "}, - {"getControlPoint", ( PyCFunction ) Curve_getControlPoint, - METH_VARARGS, "(int numcurve,int numpoint) -\ -Gets a control point.Depending upon the curve type, returne a list of 4 or 9 floats"}, - {"setControlPoint", ( PyCFunction ) Curve_setControlPoint, - METH_VARARGS, "(int numcurve,int numpoint,float x,float y,float z,\ -float w)(nurbs) or (int numcurve,int numpoint,float x1,...,x9(bezier)\ -Sets a control point "}, - {"getLoc", ( PyCFunction ) Curve_getLoc, - METH_NOARGS, "() - Gets Location of the curve (a 3-tuple) "}, - {"setLoc", ( PyCFunction ) Curve_setLoc, - METH_VARARGS, "(3-tuple) - Sets Location "}, - {"getRot", ( PyCFunction ) Curve_getRot, - METH_NOARGS, "() - Gets curve rotation"}, - {"setRot", ( PyCFunction ) Curve_setRot, - METH_VARARGS, "(3-tuple) - Sets curve rotation"}, - {"getSize", ( PyCFunction ) Curve_getSize, - METH_NOARGS, "() - Gets curve size"}, - {"setSize", ( PyCFunction ) Curve_setSize, - METH_VARARGS, "(3-tuple) - Sets curve size"}, - {"getNumCurves", ( PyCFunction ) Curve_getNumCurves, - METH_NOARGS, "() - Gets number of curves in Curve"}, - {"getKey", ( PyCFunction ) Curve_getKey, - METH_NOARGS, "() - Gets curve key"}, - {"isNurb", ( PyCFunction ) Curve_isNurb, - METH_VARARGS, - "(nothing or integer) - returns 1 if curve is type Nurb, O otherwise."}, - {"isCyclic", ( PyCFunction ) Curve_isCyclic, - METH_VARARGS, "( nothing or integer ) - returns true if curve is cyclic (closed), false otherwise."}, - {"getNumPoints", ( PyCFunction ) Curve_getNumPoints, - METH_VARARGS, - "(nothing or integer) - returns the number of points of the specified curve"}, - {"appendPoint", ( PyCFunction ) Curve_appendPoint, METH_VARARGS, - "( int numcurve, list of coordinates) - adds a new point to end of curve"}, - {"appendNurb", ( PyCFunction ) Curve_appendNurb, METH_O, - "( new_nurb ) - adds a new nurb to the Curve"}, - {"update", ( PyCFunction ) Curve_update, METH_NOARGS, - "( ) - updates display lists after changes to Curve"}, - {"getMaterials", ( PyCFunction ) Curve_getMaterials, METH_NOARGS, - "() - returns list of materials assigned to this Curve"}, - {"getBevOb", ( PyCFunction ) Curve_getBevOb, METH_NOARGS, - "() - returns Bevel Object assigned to this Curve"}, - {"setBevOb", ( PyCFunction ) Curve_setBevOb, METH_VARARGS, - "() - assign a Bevel Object to this Curve"}, - {"getTaperOb", ( PyCFunction ) Curve_getTaperOb, METH_NOARGS, - "() - returns Taper Object assigned to this Curve"}, - {"setTaperOb", ( PyCFunction ) Curve_setTaperOb, METH_VARARGS, - "() - assign a Taper Object to this Curve"}, - {"__copy__", ( PyCFunction ) Curve_copy, METH_NOARGS, - "() - make a copy of this curve data"}, - {"copy", ( PyCFunction ) Curve_copy, METH_NOARGS, - "() - make a copy of this curve data"}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Python Curve_Type callback function prototypes: */ -/*****************************************************************************/ -static int Curve_compare( BPy_Curve * a, BPy_Curve * b ); -static PyObject *Curve_repr( BPy_Curve * msh ); - -static PySequenceMethods Curve_as_sequence = { - ( inquiry ) Curve_length, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) Curve_getNurb, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) Curve_setNurb, /* sq_ass_item - only so you can do del curve[i] */ - 0, /* sq_ass_slice */ - ( objobjproc ) 0, /* sq_contains */ - 0, - 0 -}; - -/*****************************************************************************/ -/* Python Curve_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Curve_Type = { - PyObject_HEAD_INIT( NULL ) /* required macro */ - 0, /* ob_size */ - "Curve", /* tp_name */ - sizeof( BPy_Curve ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - 0, /* tp_print */ - ( getattrfunc ) NULL, /* tp_getattr */ - ( setattrfunc ) NULL, /* tp_setattr */ - ( cmpfunc ) Curve_compare, /* tp_compare */ - ( reprfunc ) Curve_repr, /* tp_repr */ - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &Curve_as_sequence, /* PySequenceMethods *tp_as_sequence; */ - NULL, /* PyMappingMethods *tp_as_mapping; */ - - /* More standard operations (here for binary compatibility) */ - - ( hashfunc ) GenericLib_hash, /* 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; */ - /*** 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 */ - ( getiterfunc ) Curve_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) Curve_iterNext, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_Curve_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - Curve_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 -}; - - -/*****************************************************************************/ -/* Function: Curve_Init */ -/*****************************************************************************/ -PyObject *Curve_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &Curve_Type) < 0) /* set exception. -1 is failure */ - return NULL; - - submodule = - Py_InitModule3( "Blender.Curve", M_Curve_methods, - M_Curve_doc ); - return ( submodule ); -} - - -/* - * Curve_CreatePyObject - * constructor to build a py object from blender data - */ - -PyObject *Curve_CreatePyObject( struct Curve * curve ) -{ - BPy_Curve *blen_object; - - blen_object = ( BPy_Curve * ) PyObject_NEW( BPy_Curve, &Curve_Type ); - - if( blen_object == NULL ) { - return ( NULL ); - } - blen_object->curve = curve; - return ( ( PyObject * ) blen_object ); - -} - -struct Curve *Curve_FromPyObject( PyObject * py_obj ) -{ - BPy_Curve *blen_obj; - - blen_obj = ( BPy_Curve * ) py_obj; - return ( blen_obj->curve ); - -} - -/* #####DEPRECATED###### */ - -PyObject *Curve_setName( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Curve_newsetName ); -} - -static PyObject *Curve_setPathLen( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetPathLen ); -} - -static PyObject *Curve_setTotcol( BPy_Curve * self, PyObject * args ) -{ - if( !PyArg_ParseTuple( args, "i", &( self->curve->totcol ) ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ); - Py_RETURN_NONE; -} - -PyObject *Curve_setMode( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetMode ); -} - -PyObject *Curve_setBevresol( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetBevresol); -} - -PyObject *Curve_setResolu( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetResolu ); -} - -PyObject *Curve_setResolv( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetResolv ); -} - -PyObject *Curve_setWidth( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetWidth ); -} - -PyObject *Curve_setExt1( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetExt1 ); -} - -PyObject *Curve_setExt2( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetExt2 ); -} - -static PyObject *Curve_setLoc( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetLoc ); -} - -static PyObject *Curve_setRot( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetRot ); -} - -static PyObject *Curve_setSize( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetSize ); -} - -PyObject *Curve_setBevOb( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetBevOb ); -} - -PyObject *Curve_setTaperOb( BPy_Curve * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Curve_newsetTaperOb ); -} - diff --git a/source/blender/python/api2_2x/Curve.h b/source/blender/python/api2_2x/Curve.h deleted file mode 100644 index b6c80058b77..00000000000 --- a/source/blender/python/api2_2x/Curve.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * $Id: Curve.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot, Stephen Swaney - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_CURVE_H -#define EXPP_CURVE_H - -#include -#include "DNA_curve_types.h" - -extern PyTypeObject Curve_Type; - -#define BPy_Curve_Check(v) ((v)->ob_type==&Curve_Type) - -/* Python BPy_Curve structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - Curve * curve; /* libdata must be second */ - /* pointer for iterator: does not point to owned memory */ - Nurb *iter_pointer; -} BPy_Curve; - - -/* - * protoypes - */ - -PyObject *Curve_Init( void ); -PyObject *Curve_CreatePyObject( struct Curve * curve ); -struct Curve *Curve_FromPyObject( PyObject * py_obj ); -PyObject *Curve_update( BPy_Curve * self ); - -PyObject *Curve_getName( BPy_Curve * self ); -PyObject *Curve_setName( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getMode( BPy_Curve * self ); -PyObject *Curve_setMode( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getBevresol( BPy_Curve * self ); -PyObject *Curve_setBevresol( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getResolu( BPy_Curve * self ); -PyObject *Curve_setResolu( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getResolv( BPy_Curve * self ); -PyObject *Curve_setResolv( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getExt1( BPy_Curve * self ); -PyObject *Curve_setExt1( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getExt2( BPy_Curve * self ); -PyObject *Curve_setExt2( BPy_Curve * self, PyObject * args ); -PyObject *Curve_getWidth( BPy_Curve * self ); -PyObject *Curve_setWidth( BPy_Curve * self, PyObject * args ); - -#endif /* EXPP_CURVE_H */ diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c deleted file mode 100644 index 621c72efc2a..00000000000 --- a/source/blender/python/api2_2x/Draw.c +++ /dev/null @@ -1,2197 +0,0 @@ -/* - * $Id: Draw.c 12893 2007-12-15 18:24:16Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Campbell Barton, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* This file is the Blender.Draw part of opy_draw.c, from the old - * bpython/intern dir, with minor changes to adapt it to the new Python - * implementation. Non-trivial original comments are marked with an - * @ symbol at their beginning. */ - -#include "Draw.h" /*This must come first*/ - -#include "BLI_blenlib.h" -#include "MEM_guardedalloc.h" -#include "BMF_Api.h" -#include "DNA_screen_types.h" -#include "BKE_global.h" -#include "BKE_image.h" -#include "BKE_object.h" -#include "BKE_main.h" -#include "BKE_utildefines.h" -#include "BIF_gl.h" -#include "BIF_mywindow.h" -#include "BIF_screen.h" -#include "BIF_space.h" -#include "BIF_interface.h" -#include "BIF_toolbox.h" -#include "BPI_script.h" /* script struct */ -#include "Image.h" /* for accessing Blender.Image objects */ -#include "IMB_imbuf_types.h" /* for the IB_rect define */ -#include "interface.h" -#include "mydevice.h" /*@ for all the event constants */ -#include "gen_utils.h" -#include "Window.h" -#include "../BPY_extern.h" - -/* used so we can get G.scene->r.cfra for getting the -current image frame, some images change frame if they are a sequence */ -#include "DNA_scene_types.h" - -/* these delimit the free range for button events */ -#define EXPP_BUTTON_EVENTS_OFFSET 1001 -#define EXPP_BUTTON_EVENTS_MIN 0 -#define EXPP_BUTTON_EVENTS_MAX 15382 /* 16384 - 1 - OFFSET */ - -#define ButtonObject_Check(v) ((v)->ob_type == &Button_Type) - -#define UI_METHOD_ERRORCHECK \ - if (check_button_event(&event) == -1)\ - return EXPP_ReturnPyObjError( PyExc_AttributeError,\ - "button event argument must be in the range [0, 16382]");\ - if (callback && !PyCallable_Check(callback))\ - return EXPP_ReturnPyObjError( PyExc_ValueError,\ - "callback is not a python function");\ - -/* pointer to main dictionary defined in Blender.c */ -extern PyObject *g_blenderdict; - -/*@ hack to flag that window redraw has happened inside slider callback: */ -int EXPP_disable_force_draw = 0; - -/* forward declarations for internal functions */ -static void Button_dealloc( PyObject * self ); -static PyObject *Button_getattr( PyObject * self, char *name ); -static PyObject *Button_repr( PyObject * self ); -static PyObject *Button_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type); -static int Button_setattr( PyObject * self, char *name, PyObject * v ); - -static Button *newbutton( void ); - -/* GUI interface routines */ - -static void exit_pydraw( SpaceScript * sc, short error ); -static void exec_callback( SpaceScript * sc, PyObject * callback, - PyObject * args ); -static void spacescript_do_pywin_buttons( SpaceScript * sc, - unsigned short event ); - -static PyObject *Method_Exit( PyObject * self ); -static PyObject *Method_Register( PyObject * self, PyObject * args ); -static PyObject *Method_Redraw( PyObject * self, PyObject * args ); -static PyObject *Method_Draw( PyObject * self ); -static PyObject *Method_Create( PyObject * self, PyObject * args ); -static PyObject *Method_UIBlock( PyObject * self, PyObject * args ); - -static PyObject *Method_Button( PyObject * self, PyObject * args ); -static PyObject *Method_Menu( PyObject * self, PyObject * args ); -static PyObject *Method_Toggle( PyObject * self, PyObject * args ); -static PyObject *Method_Slider( PyObject * self, PyObject * args ); -static PyObject *Method_Scrollbar( PyObject * self, PyObject * args ); -static PyObject *Method_ColorPicker( PyObject * self, PyObject * args ); -static PyObject *Method_Normal( PyObject * self, PyObject * args ); -static PyObject *Method_Number( PyObject * self, PyObject * args ); -static PyObject *Method_String( PyObject * self, PyObject * args ); -static PyObject *Method_GetStringWidth( PyObject * self, PyObject * args ); -static PyObject *Method_Text( PyObject * self, PyObject * args ); -static PyObject *Method_Label( PyObject * self, PyObject * args ); -/* by Campbell: */ -static PyObject *Method_PupMenu( PyObject * self, PyObject * args ); -static PyObject *Method_PupIntInput( PyObject * self, PyObject * args ); -static PyObject *Method_PupFloatInput( PyObject * self, PyObject * args ); -static PyObject *Method_PupStrInput( PyObject * self, PyObject * args ); -static PyObject *Method_BeginAlign( PyObject * self, PyObject * args ); -static PyObject *Method_EndAlign( PyObject * self, PyObject * args ); -/* next by Jonathan Merritt (lancelet): */ -static PyObject *Method_Image( PyObject * self, PyObject * args); -/* CLEVER NUMBUT */ -static PyObject *Method_PupBlock( PyObject * self, PyObject * args ); - -static uiBlock *Get_uiBlock( void ); - -static void py_slider_update( void *butv, void *data2_unused ); - -/* hack to get 1 block for the UIBlock, only ever 1 at a time */ -static uiBlock *uiblock=NULL; - -static char Draw_doc[] = "The Blender.Draw submodule"; - -static char Method_UIBlock_doc[] = "(drawfunc, x,y) - Popup dialog where buttons can be drawn (expemental)"; - -static char Method_Register_doc[] = - "(draw, event, button) - Register callbacks for windowing\n\n\ -(draw) A function to draw the screen, taking no arguments\n\ -(event) A function to handle events, taking 2 arguments (evt, val)\n\ - (evt) The event number\n\ - (val) The value modifier (for key and mouse press/release)\n\ -(button) A function to handle button events, taking 1 argument (evt)\n\ - (evt) The button number\n\n\ -A None object can be passed if a callback is unused."; - - -static char Method_Redraw_doc[] = "([after]) - Queue a redraw event\n\n\ -[after=0] Determines whether the redraw is processed before\n\ -or after other input events.\n\n\ -Redraw events are buffered so that regardless of how many events\n\ -are queued the window only receives one redraw event."; - -static char Method_Draw_doc[] = "() - Force an immediate redraw\n\n\ -Forced redraws are not buffered, in other words the window is redrawn\n\ -exactly once for everytime this function is called."; - - -static char Method_Create_doc[] = - "(value) - Create a default Button object\n\n\ - (value) - The value to store in the button\n\n\ - Valid values are ints, floats, and strings"; - -static char Method_Button_doc[] = - "(name, event, x, y, width, height, [tooltip]) - Create a new Button \ -(push) button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -[tooltip=] The button's tooltip\n\n\ -This function can be called as Button() or PushButton()."; - -static char Method_BeginAlign_doc[] = - "Buttons after this function will draw aligned (button layout only)"; - -static char Method_EndAlign_doc[] = - "Use after BeginAlign() to stop aligning the buttons (button layout only)."; - -static char Method_Menu_doc[] = - "(name, event, x, y, width, height, default, [tooltip]) - Create a new Menu \ -button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(default) The number of the option to be selected by default\n\ -[tooltip=" "] The button's tooltip\n\n\ -The menu options are specified through the name of the\n\ -button. Options are followed by a format code and separated\n\ -by the '|' (pipe) character.\n\ -Valid format codes are\n\ - %t - The option should be used as the title\n\ - %xN - The option should set the integer N in the button value."; - -static char Method_Toggle_doc[] = - "(name, event, x, y, width, height, default, [tooltip]) - Create a new Toggle \ -button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(default) An integer (0 or 1) specifying the default state\n\ -[tooltip=] The button's tooltip"; - - -static char Method_Slider_doc[] = - "(name, event, x, y, width, height, initial, min, max, [update, tooltip]) - \ -Create a new Slider button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial, min, max) Three values (int or float) specifying the initial \ - and limit values.\n\ -[update=1] A value controlling whether the slider will emit events as it \ -is edited.\n\ - A non-zero value (default) enables the events. A zero value supresses them.\n\ -[tooltip=] The button's tooltip"; - - -static char Method_Scrollbar_doc[] = - "(event, x, y, width, height, initial, min, max, [update, tooltip]) - Create a \ -new Scrollbar\n\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial, min, max) Three values (int or float) specifying the initial and limit values.\n\ -[update=1] A value controlling whether the slider will emit events as it is edited.\n\ - A non-zero value (default) enables the events. A zero value supresses them.\n\ -[tooltip=] The button's tooltip"; - -static char Method_ColorPicker_doc[] = - "(event, x, y, width, height, initial, [tooltip]) - Create a new Button \ -Color picker button\n\n\ -(event) The event number to pass to the button event function when the color changes\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial) 3-Float tuple of the color (values between 0 and 1)\ -[tooltip=] The button's tooltip"; - -static char Method_Normal_doc[] = - "(event, x, y, width, height, initial, [tooltip]) - Create a new Button \ -Normal button (a sphere that you can roll to change the normal)\n\n\ -(event) The event number to pass to the button event function when the color changes\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height - non square will gave odd results\n\ -(initial) 3-Float tuple of the normal vector (values between -1 and 1)\ -[tooltip=] The button's tooltip"; - -static char Method_Number_doc[] = - "(name, event, x, y, width, height, initial, min, max, [tooltip]) - Create a \ -new Number button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial, min, max) Three values (int or float) specifying the initial and \ -limit values.\n\ -[tooltip=] The button's tooltip"; - -static char Method_String_doc[] = - "(name, event, x, y, width, height, initial, length, [tooltip]) - Create a \ -new String button\n\n\ -(name) A string to display on the button\n\ -(event) The event number to pass to the button event function when activated\n\ -(x, y) The lower left coordinate of the button\n\ -(width, height) The button width and height\n\ -(initial) The string to display initially\n\ -(length) The maximum input length\n\ -[tooltip=] The button's tooltip"; - -static char Method_GetStringWidth_doc[] = - "(text, font = 'normal') - Return the width in pixels of the given string\n\ -(font) The font size: 'normal' (default), 'small' or 'tiny'."; - -static char Method_Text_doc[] = - "(text, font = 'normal') - Draw text onscreen\n\n\ -(text) The text to draw\n\ -(font) The font size: 'normal' (default), 'small' or 'tiny'.\n\n\ -This function returns the width of the drawn string."; - -static char Method_Label_doc[] = - "(text, x, y) - Draw a text label onscreen\n\n\ -(text) The text to draw\n\ -(x, y) The lower left coordinate of the lable"; - -static char Method_PupMenu_doc[] = - "(string, maxrow = None) - Display a pop-up menu at the screen.\n\ -The contents of the pop-up are specified through the 'string' argument,\n\ -like with Draw.Menu.\n\ -'maxrow' is an optional int to control how many rows the pop-up should have.\n\ -Options are followed by a format code and separated\n\ -by the '|' (pipe) character.\n\ -Valid format codes are\n\ - %t - The option should be used as the title\n\ - %xN - The option should set the integer N in the button value.\n\n\ -Ex: Draw.PupMenu('OK?%t|QUIT BLENDER') # should be familiar ..."; - -static char Method_PupIntInput_doc[] = - "(text, default, min, max) - Display an int pop-up input.\n\ -(text) - text string to display on the button;\n\ -(default, min, max) - the default, min and max int values for the button;\n\ -Return the user input value or None on user exit"; - -static char Method_PupFloatInput_doc[] = - "(text, default, min, max, clickStep, floatLen) - Display a float pop-up input.\n\ -(text) - text string to display on the button;\n\ -(default, min, max) - the default, min and max float values for the button;\n\ -(clickStep) - float increment/decrement for each click on the button arrows;\n\ -(floatLen) - an integer defining the precision (number of decimal places) of \n\ -the float value show.\n\ -Return the user input value or None on user exit"; - -static char Method_Image_doc[] = - "(image, x, y, zoomx = 1.0, zoomy = 1.0, [clipx, clipy, clipw, cliph])) \n\ - - Draw an image.\n\ -(image) - Blender.Image to draw.\n\ -(x, y) - floats specifying the location of the image.\n\ -(zoomx, zoomy) - float zoom factors in horizontal and vertical directions.\n\ -(clipx, clipy, clipw, cliph) - integers specifying a clipping rectangle within the original image."; - -static char Method_PupStrInput_doc[] = - "(text, default, max = 20) - Display a float pop-up input.\n\ -(text) - text string to display on the button;\n\ -(default) - the initial string to display (truncated to 'max' chars);\n\ -(max = 20) - The maximum number of chars the user can input;\n\ -Return the user input value or None on user exit"; - -static char Method_PupBlock_doc[] = - "(title, sequence) - Display a pop-up block.\n\ -(title) - The title of the block.\n\ -(sequence) - A sequence defining what the block contains. \ -The order of the list is the order of appearance, from top down.\n\ -Possible format for sequence items:\n\ -[value is an object created with Create]\n\ -\ttext: Defines a label in the block\n\ -\t(text, value, tooltip = ''): Defines a toggle button \n\ -\t(text, value, min, max, tooltip = ''): Defines a num or string button \n\ -\t\t\tdepending on the value.\n\ -\t\tFor string, max is the maximum length of the text and min is unused.\n\ -Return 1 if the pop-up is confirmed, 0 otherwise. \n\ -Warning: On cancel, the value objects are brought back to there previous values, \ -\texcept for string values which will still contain the modified values.\n"; - -static char Method_Exit_doc[] = "() - Exit the windowing interface"; - -/*This is needed for button callbacks. Any button that uses a callback gets added to this list. - On the C side of drawing begin, this list should be cleared. - Each entry is a tuple of the form (button, callback py object) -*/ -PyObject *M_Button_List = NULL; - -static struct PyMethodDef Draw_methods[] = { - {"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}, - {"Redraw", (PyCFunction)Method_Redraw, METH_VARARGS, Method_Redraw_doc}, - {"Draw", (PyCFunction)Method_Draw, METH_NOARGS, Method_Draw_doc}, - {"Register", (PyCFunction)Method_Register, METH_VARARGS, Method_Register_doc}, - {"PushButton", (PyCFunction)Method_Button, METH_VARARGS, Method_Button_doc}, - {"BeginAlign", (PyCFunction)Method_BeginAlign, METH_VARARGS, Method_BeginAlign_doc}, - {"EndAlign", (PyCFunction)Method_EndAlign, METH_VARARGS, Method_EndAlign_doc}, - {NULL, NULL, 0, NULL} -}; - -PyTypeObject Button_Type = { - PyObject_HEAD_INIT( NULL ) 0, /*ob_size */ - "Button", /*tp_name */ - sizeof( Button ), /*tp_basicsize */ - 0, /*tp_itemsize */ - ( destructor ) Button_dealloc, /*tp_dealloc */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) Button_getattr, /*tp_getattr */ - ( setattrfunc ) Button_setattr, /*tp_setattr */ - NULL, /*tp_cmp */ - ( reprfunc ) Button_repr, /*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 ***/ - (richcmpfunc)Button_richcmpr, /* 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; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 0, /* long tp_dictoffset; */ - NULL, /* initproc tp_init; */ - NULL, /* allocfunc tp_alloc; */ - NULL, /* newfunc tp_new; */ - /* Low-level free-memory routine */ - NULL, /* freefunc tp_free; */ - /* For PyObject_IS_GC */ - NULL, /* inquiry tp_is_gc; */ - NULL, /* PyObject *tp_bases; */ - /* method resolution order */ - NULL, /* PyObject *tp_mro; */ - NULL, /* PyObject *tp_cache; */ - NULL, /* PyObject *tp_subclasses; */ - NULL, /* PyObject *tp_weaklist; */ - NULL -}; - -static void Button_dealloc( PyObject * self ) -{ - Button *but = ( Button * ) self; - - if( but->type == BSTRING_TYPE ) { - if( but->val.asstr ) - MEM_freeN( but->val.asstr ); - } - - PyObject_DEL( self ); -} - -static PyObject *Button_getattr( PyObject * self, char *name ) -{ - Button *but = ( Button * ) self; - - if( strcmp( name, "val" ) == 0 ) { - if( but->type == BINT_TYPE ) - return PyInt_FromLong( but->val.asint ); - else if( but->type == BFLOAT_TYPE ) - return PyFloat_FromDouble( but->val.asfloat ); - else if( but->type == BSTRING_TYPE ) - return PyString_FromString( but->val.asstr ); - else if( but->type == BVECTOR_TYPE ) - return Py_BuildValue( "fff", but->val.asvec[0], but->val.asvec[1], but->val.asvec[2] ); - } - - PyErr_SetString( PyExc_AttributeError, name ); - return NULL; -} - -static int Button_setattr( PyObject * self, char *name, PyObject * v ) -{ - Button *but = ( Button * ) self; - - if( strcmp( name, "val" ) == 0 ) { - if( but->type == BINT_TYPE && PyNumber_Check(v) ) { - PyObject *pyVal = PyNumber_Int( v ); - if (pyVal) { - but->val.asint = (int)PyInt_AS_LONG( pyVal ); - Py_DECREF(pyVal); - return 0; - } - } - else if( but->type == BFLOAT_TYPE && PyNumber_Check(v) ) { - PyObject *pyVal = PyNumber_Float( v ); - if (pyVal) { - but->val.asfloat = (float)PyFloat_AS_DOUBLE( pyVal ); - Py_DECREF(pyVal); - return 0; - } - } - else if( but->type == BVECTOR_TYPE ) { - if ( PyArg_ParseTuple( v, "fff", but->val.asvec, but->val.asvec+1, but->val.asvec+2 ) ) - return 0; - } - else if( but->type == BSTRING_TYPE && PyString_Check(v) ) { - char *newstr; - unsigned int newlen; - - PyString_AsStringAndSize( v, &newstr, (int *)&newlen ); - - if (newlen+1> UI_MAX_DRAW_STR) - return EXPP_ReturnIntError( PyExc_ValueError, "Error: button string length exceeded max limit (399 chars)."); - - /* if the length of the new string is the same as */ - /* the old one, just copy, else delete and realloc. */ - if( but->slen == newlen ) { - BLI_strncpy( but->val.asstr, newstr, - but->slen + 1 ); - - return 0; - - } else { - MEM_freeN( but->val.asstr ); - but->slen = newlen; - but->val.asstr = - MEM_mallocN( but->slen + 1, - "button setattr" ); - BLI_strncpy( but->val.asstr, newstr, - but->slen + 1 ); - - return 0; - } - } - } else { - /* - * Accessing the wrong attribute. - */ - return EXPP_ReturnIntError( PyExc_AttributeError, name ); - } - - /* - * Correct attribute but value is incompatible with current button value. - */ - return EXPP_ReturnIntError( PyExc_ValueError, "value incompatible with current button type" ); -} - -static PyObject *Button_repr( PyObject * self ) -{ - return PyObject_Repr( Button_getattr( self, "val" ) ); -} - -static PyObject *Button_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type) -{ - PyObject *ret, *valA=NULL, *valB=NULL; - if (ButtonObject_Check(objectA)) - objectA = valA = Button_getattr( objectA, "val" ); - if (ButtonObject_Check(objectB)) - objectB = valB = Button_getattr( objectB, "val" ); - ret = PyObject_RichCompare(objectA, objectB, comparison_type); - Py_XDECREF(valA); /* Button_getattr created with 1 ref, we dont care about them now */ - Py_XDECREF(valB); - return ret; -} - - -static Button *newbutton( void ) -{ - Button *but = NULL; - - but = ( Button * ) PyObject_NEW( Button, &Button_Type ); - but->tooltip[0] = 0; /*NULL-terminate tooltip string*/ - but->tooltip[255] = 0; /*necassary to insure we always have a NULL-terminated string, as - according to the docs strncpy doesn't do this for us.*/ - return but; -} - -/* GUI interface routines */ - -static void exit_pydraw( SpaceScript * sc, short err ) -{ - Script *script = NULL; - - if( !sc || !sc->script ) - return; - - script = sc->script; - - if( err ) { - PyErr_Print( ); - script->flags = 0; /* mark script struct for deletion */ - error( "Python script error: check console" ); - scrarea_queue_redraw( sc->area ); - } - - BPy_Set_DrawButtonsList(sc->but_refs); - BPy_Free_DrawButtonsList(); /*clear all temp button references*/ - sc->but_refs = NULL; - - Py_XDECREF( ( PyObject * ) script->py_draw ); - Py_XDECREF( ( PyObject * ) script->py_event ); - Py_XDECREF( ( PyObject * ) script->py_button ); - - script->py_draw = script->py_event = script->py_button = NULL; -} - -static void exec_callback( SpaceScript * sc, PyObject * callback, - PyObject * args ) -{ - PyObject *result = PyObject_CallObject( callback, args ); - - if( result == NULL && sc->script ) { /* errors in the script */ - - if( sc->script->lastspace == SPACE_TEXT ) { /*if it can be an ALT+P script */ - Text *text = G.main->text.first; - - while( text ) { /* find it and free its compiled code */ - - if( !strcmp - ( text->id.name + 2, - sc->script->id.name + 2 ) ) { - BPY_free_compiled_text( text ); - break; - } - - text = text->id.next; - } - } - exit_pydraw( sc, 1 ); - } - - Py_XDECREF( result ); - Py_DECREF( args ); -} - -/* BPY_spacescript_do_pywin_draw, the static spacescript_do_pywin_buttons and - * BPY_spacescript_do_pywin_event are the three functions responsible for - * calling the draw, buttons and event callbacks registered with Draw.Register - * (see Method_Register below). They are called (only the two BPY_ ones) - * from blender/src/drawscript.c */ - -void BPY_spacescript_do_pywin_draw( SpaceScript * sc ) -{ - uiBlock *block; - char butblock[20]; - Script *script = sc->script; - - sprintf( butblock, "win %d", curarea->win ); - block = uiNewBlock( &curarea->uiblocks, butblock, UI_EMBOSSX, - UI_HELV, curarea->win ); - - if( script->py_draw ) { - if (sc->but_refs) { - BPy_Set_DrawButtonsList(sc->but_refs); - BPy_Free_DrawButtonsList(); /*clear all temp button references*/ - } - sc->but_refs = PyList_New(0); - BPy_Set_DrawButtonsList(sc->but_refs); - - glPushAttrib( GL_ALL_ATTRIB_BITS ); - exec_callback( sc, script->py_draw, Py_BuildValue( "()" ) ); - glPopAttrib( ); - } else { - glClearColor( 0.4375, 0.4375, 0.4375, 0.0 ); - glClear( GL_COLOR_BUFFER_BIT ); - } - - uiDrawBlock( block ); - - curarea->win_swap = WIN_BACK_OK; -} - -static void spacescript_do_pywin_buttons( SpaceScript * sc, - unsigned short event ) -{ - if( sc->script->py_button ) - exec_callback( sc, sc->script->py_button, - Py_BuildValue( "(i)", event ) ); -} - -void BPY_spacescript_do_pywin_event( SpaceScript * sc, unsigned short event, - short val, char ascii ) -{ - if( event == QKEY && G.qual & ( LR_ALTKEY | LR_CTRLKEY ) ) { - /* finish script: user pressed ALT+Q or CONTROL+Q */ - Script *script = sc->script; - - exit_pydraw( sc, 0 ); - - script->flags &= ~SCRIPT_GUI; /* we're done with this script */ - - return; - } - - if (val) { - - 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; - * read the comment before check_button_event() below to understand */ - if (val >= EXPP_BUTTON_EVENTS_OFFSET && val < 0x4000) - spacescript_do_pywin_buttons(sc, val - EXPP_BUTTON_EVENTS_OFFSET); - return; - } - } - - /* We use the "event" main module var, used by scriptlinks, to pass the ascii - * value to event callbacks (gui/event/button callbacks are not allowed - * inside scriptlinks, so this is ok) */ - if( sc->script->py_event ) { - int pass_ascii = 0; - if (ascii > 31 && ascii != 127) { - pass_ascii = 1; - EXPP_dict_set_item_str(g_blenderdict, "event", - PyInt_FromLong((long)ascii)); - } - exec_callback( sc, sc->script->py_event, - Py_BuildValue( "(ii)", event, val ) ); - if (pass_ascii) - EXPP_dict_set_item_str(g_blenderdict, "event", - PyString_FromString("")); - } -} - -static void exec_but_callback(void *pyobj, void *data) -{ - PyObject *result; - PyObject *pyvalue = NULL; - uiBut *but = (uiBut *)data; - PyObject *arg; - PyObject *callback = (PyObject *)pyobj; - - double value = ui_get_but_val(but); - - if (callback==NULL || callback == Py_None) - return; - - /* Button types support - case MENU: - case TEX: - case TOG: - case NUMSLI: - case NUM: - case COL: - case BUT_NORMAL: - case BUT */ - switch (but->type) { - case TEX: - /*printf("TEX\n");*/ - pyvalue = PyString_FromString( (char *)but->poin ); - break; - case NUM: - case NUMSLI: - case TOG: - case MENU: - if (but->pointype==FLO) { - /*printf("FLO\n");*/ - pyvalue = PyFloat_FromDouble( (float)value ); - } else if (but->pointype==INT) { - /*printf("INT\n");*/ - pyvalue = PyInt_FromLong( (int)value ); - } else if (but->pointype==SHO) { - /*printf("SHO\n");*/ - pyvalue = PyInt_FromLong( (short)value ); - } - break; - case COL: - case BUT_NORMAL: - { - float vec[3]; - VECCOPY(vec, (float *)but->poin); - pyvalue = Py_BuildValue("(fff)", vec[0], vec[1], vec[2]); - break; - } - case BUT: - pyvalue = Py_None; - Py_INCREF(pyvalue); - break; - default: - pyvalue = Py_None; - Py_INCREF(pyvalue); - printf("Error, no button type matched."); - } - - arg = PyTuple_New( 2 ); - if (uiblock==NULL) - PyTuple_SetItem( arg, 0, PyInt_FromLong(but->retval - EXPP_BUTTON_EVENTS_OFFSET) ); - else - PyTuple_SetItem( arg, 0, PyInt_FromLong(but->retval) ); - - PyTuple_SetItem( arg, 1, pyvalue ); - - result = PyObject_CallObject( callback, arg ); - Py_DECREF(arg); - - if (!result) { - Py_DECREF(pyvalue); - PyErr_Print( ); - error( "Python script error: check console" ); - } - Py_XDECREF( result ); -} - -/*note that this function populates the drawbutton ref lists.*/ -static void set_pycallback(uiBut *ubut, PyObject *callback, Button *but) -{ - PyObject *tuple; - if (!callback || !PyCallable_Check(callback)) { - if (M_Button_List && but) { - PyList_Append(M_Button_List, (PyObject*)but); - } - return; - } - - if (M_Button_List) { - if (but) tuple = PyTuple_New(2); - else tuple = PyTuple_New(1); - - /*the tuple API mandates this*/ - Py_XINCREF(callback); - Py_XINCREF(but); /*this checks for NULL*/ - - PyTuple_SET_ITEM(tuple, 0, callback); - if (but) PyTuple_SET_ITEM(tuple, 1, (PyObject*)but); - - PyList_Append(M_Button_List, tuple); - Py_DECREF(tuple); /*we have to do this to aovid double references.*/ - - uiButSetFunc(ubut, exec_but_callback, callback, ubut); - } -} - -void BPy_Set_DrawButtonsList(void *list) -{ - M_Button_List = list; -} - -/*this MUST be called after doing UI stuff.*/ -void BPy_Free_DrawButtonsList(void) -{ - /*Clear the list.*/ - if (M_Button_List) { - PyList_SetSlice(M_Button_List, 0, PyList_Size(M_Button_List), NULL); - Py_DECREF(M_Button_List); - M_Button_List = NULL; - } -} - -static PyObject *Method_Exit( PyObject * self ) -{ - SpaceScript *sc; - Script *script; - - /* if users call Draw.Exit when we are already out of the SPACE_SCRIPT, we - * simply return, for compatibility */ - if( curarea->spacetype == SPACE_SCRIPT ) - sc = curarea->spacedata.first; - else - Py_RETURN_NONE; - - exit_pydraw( sc, 0 ); - - script = sc->script; - - /* remove our lock to the current namespace */ - script->flags &= ~SCRIPT_GUI; - - Py_RETURN_NONE; -} - -/* Method_Register (Draw.Register) registers callbacks for drawing, events - * and gui button events, so a script can continue executing after the - * interpreter reached its end and returned control to Blender. Everytime - * the SPACE_SCRIPT window with this script is redrawn, the registered - * callbacks are executed. */ -static PyObject *Method_Register( PyObject * self, PyObject * args ) -{ - PyObject *newdrawc = NULL, *neweventc = NULL, *newbuttonc = NULL; - SpaceScript *sc; - Script *script; - int startspace = 0; - - if( !PyArg_ParseTuple - ( args, "O|OO", &newdrawc, &neweventc, &newbuttonc ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or three PyObjects" ); - - if( !PyCallable_Check( newdrawc ) ) - newdrawc = NULL; - if( !PyCallable_Check( neweventc ) ) - neweventc = NULL; - if( !PyCallable_Check( newbuttonc ) ) - newbuttonc = NULL; - - if( !( newdrawc || neweventc || newbuttonc ) ) - Py_RETURN_NONE; - - startspace = curarea->spacetype; - - /* first make sure the current area is of type SPACE_SCRIPT */ - if( startspace != SPACE_SCRIPT ) - newspace( curarea, SPACE_SCRIPT ); - - sc = curarea->spacedata.first; - - /* There are two kinds of scripts: - * a) those that simply run, finish and return control to Blender; - * b) those that do like 'a)' above but leave callbacks for drawing, - * events and button events, with this Method_Register (Draw.Register - * in Python). These callbacks are called by scriptspaces (Scripts windows). - * - * We need to flag scripts that leave callbacks so their namespaces are - * not deleted when they 'finish' execution, because the callbacks will - * still need the namespace. - */ - - /* Let's see if this is a new script */ - script = G.main->script.first; - while (script) { - if (script->flags & SCRIPT_RUNNING) break; - script = script->id.next; - } - - if( !script ) { - /* not new, it's a left callback calling Register again */ - script = sc->script; - if( !script ) { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Draw.Register can't be used inside script links" ); - } - } - else sc->script = script; - - /* Now we have the right script and can set a lock so its namespace can't be - * deleted for as long as we need it */ - script->flags |= SCRIPT_GUI; - - /* save the last space so we can go back to it upon finishing */ - if( !script->lastspace ) - script->lastspace = startspace; - - /* clean the old callbacks */ - exit_pydraw( sc, 0 ); - - /* prepare the new ones and insert them */ - Py_XINCREF( newdrawc ); - Py_XINCREF( neweventc ); - Py_XINCREF( newbuttonc ); - - script->py_draw = newdrawc; - script->py_event = neweventc; - script->py_button = newbuttonc; - - scrarea_queue_redraw( sc->area ); - - Py_RETURN_NONE; -} - -static PyObject *Method_Redraw( PyObject * self, PyObject * args ) -{ - int after = 0; - - if( !PyArg_ParseTuple( args, "|i", &after ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (or nothing)" ); - - if( after ) - addafterqueue( curarea->win, REDRAW, 1 ); - else - scrarea_queue_winredraw( curarea ); - - Py_RETURN_NONE; -} - -static PyObject *Method_Draw( PyObject * self ) -{ - /*@ If forced drawing is disable queue a redraw event instead */ - if( EXPP_disable_force_draw ) { - scrarea_queue_winredraw( curarea ); - Py_RETURN_NONE; - } - - scrarea_do_windraw( curarea ); - - screen_swapbuffers( ); - - Py_RETURN_NONE; -} - -static PyObject *Method_Create( PyObject * self, PyObject * args ) -{ - Button *but = NULL; - PyObject *val; - char *newstr; - - but = newbutton(); - /* If this function dosnt sucseed this will need to be deallocated, - * make sure the type is NOT BSTRING_TYPE before deallocing -1 is ok. - * so we dont dealloc with an uninitialized value wich would be bad! */ - if ( PyArg_ParseTuple( args, "fff", but->val.asvec, but->val.asvec+1, but->val.asvec+2 ) ) { - but->type = BVECTOR_TYPE; - - } else if ( PyArg_ParseTuple( args, "O!", &PyFloat_Type, &val ) ) { - but->val.asfloat = (float)PyFloat_AS_DOUBLE(val); - but->type = BFLOAT_TYPE; - - } else if ( PyArg_ParseTuple( args, "O!", &PyInt_Type, &val ) ) { - but->val.asint = (int)PyInt_AS_LONG(val); - but->type = BINT_TYPE; - - } else if ( PyArg_ParseTuple( args, "s#", &newstr, &but->slen ) ) { - if (but->slen + 1 > UI_MAX_DRAW_STR) { - but->type = -1; - Py_DECREF((PyObject *)but); /* will remove */ - but = NULL; - PyErr_SetString( PyExc_TypeError, "string is longer then 399 chars"); - } else { - but->type = BSTRING_TYPE; - but->val.asstr = MEM_mallocN( but->slen + 1, "button string" ); - BLI_strncpy( but->val.asstr, newstr, but->slen+1 ); - } - - } else { - but->type = -1; - Py_DECREF((PyObject *)but); /* will remove */ - but = NULL; - PyErr_SetString( PyExc_TypeError, "expected string, float, int or 3-float tuple argument" ); - } - - if (but != NULL) { - PyErr_Clear(); - } - - return (PyObject*) but; -} - - -static PyObject *Method_UIBlock( PyObject * self, PyObject * args ) -{ - PyObject *val = NULL; - PyObject *result = NULL; - ListBase listb= {NULL, NULL}; - - if ( !PyArg_ParseTuple( args, "O", &val ) || !PyCallable_Check( val ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected 1 python function and 2 ints" ); - - if (uiblock) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot run more then 1 UIBlock at a time" ); - - BPy_Set_DrawButtonsList(PyList_New(0)); - - mywinset(G.curscreen->mainwin); - uiblock= uiNewBlock(&listb, "numbuts", UI_EMBOSS, UI_HELV, G.curscreen->mainwin); - - uiBlockSetFlag(uiblock, UI_BLOCK_LOOP|UI_BLOCK_REDRAW); - result = PyObject_CallObject( val, Py_BuildValue( "()" ) ); - - if (!result) { - PyErr_Print( ); - error( "Python script error: check console" ); - } else { - /* copied from do_clever_numbuts in toolbox.c */ - - /* Clear all events so tooltips work, this is not ideal and - only needed because calls from the menu still have some events - left over when do_clever_numbuts is called. - Calls from keyshortcuts do not have this problem.*/ - ScrArea *sa; - BWinEvent temp_bevt; - for (sa= G.curscreen->areabase.first; sa; sa= sa->next) { - if(sa->win) { - while( bwin_qread( sa->win, &temp_bevt ) ) {} - } - if(sa->headwin) { - while( bwin_qread( sa->headwin, &temp_bevt ) ) {} - } - } - /* Done clearing events */ - - uiBoundsBlock(uiblock, 5); - uiDoBlocks(&listb, 0, 1); - } - uiFreeBlocks(&listb); - uiblock = NULL; - BPy_Free_DrawButtonsList(); /*clear all temp button references*/ - - Py_XDECREF( result ); - Py_RETURN_NONE; -} - -void Set_uiBlock(uiBlock *block) -{ - uiblock = block; -} - -static uiBlock *Get_uiBlock( void ) -{ - char butblock[32]; - /* Global, used now for UIBlock */ - if (uiblock) { - return uiblock; - } - /* Local */ - sprintf( butblock, "win %d", curarea->win ); - - return uiGetBlock( butblock, curarea ); -} - - -/* We restrict the acceptable event numbers to a proper "free" range - * according to other spaces in Blender. - * winqread***space() (space events callbacks) use short for events - * (called 'val' there) and we also translate by EXPP_BUTTON_EVENTS_OFFSET - * to get rid of unwanted events (check BPY_do_pywin_events above for - * explanation). This function takes care of that and proper checking: */ -static int check_button_event(int *event) { - if ((*event < EXPP_BUTTON_EVENTS_MIN) || - (*event > EXPP_BUTTON_EVENTS_MAX)) { - return -1; - } - if (uiblock==NULL) /* For UIBlock we need non offset UI elements */ - *event += EXPP_BUTTON_EVENTS_OFFSET; - return 0; -} - -static PyObject *Method_BeginAlign( PyObject * self, PyObject * args ) -{ - uiBlock *block = Get_uiBlock( ); - - if (block) - uiBlockBeginAlign(block); - - Py_RETURN_NONE; -} - -static PyObject *Method_EndAlign( PyObject * self, PyObject * args ) -{ - uiBlock *block = Get_uiBlock( ); - - if (block) - uiBlockEndAlign(block); - - Py_RETURN_NONE; -} - -static PyObject *Method_Button( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiii|sO", &name, &event, - &x, &y, &w, &h, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefBut( block, BUT, event, name, (short)x, (short)y, (short)w, (short)h, 0, 0, 0, 0, 0, tip ); - set_pycallback(ubut, callback, NULL); - } - Py_RETURN_NONE; -} - -static PyObject *Method_Menu( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event, def; - int x, y, w, h; - Button *but; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiii|sO", &name, &event, - &x, &y, &w, &h, &def, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, six ints and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - but->type = BINT_TYPE; - but->val.asint = def; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefButI( block, MENU, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asint, 0, 0, 0, 0, but->tooltip ); - set_pycallback(ubut, callback, but); - } - return ( PyObject * ) but; -} - -static PyObject *Method_Toggle( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h, def; - Button *but; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiii|sO", &name, &event, - &x, &y, &w, &h, &def, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, six ints and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - but->type = BINT_TYPE; - but->val.asint = def; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefButI( block, TOG, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asint, 0, 0, 0, 0, but->tooltip ); - set_pycallback(ubut, callback, but); - } - return ( PyObject * ) but; -} - -/*@DO NOT TOUCH THIS FUNCTION ! - Redrawing a slider inside its own callback routine is actually forbidden - with the current toolkit architecture (button routines are not reentrant). - But it works anyway. - XXX This is condemned to be dinosource in future - it's a hack. - */ - -static void py_slider_update( void *butv, void *data2_unused ) -{ - uiBut *but = butv; - PyObject *ref = Py_BuildValue( "(i)", SPACE_VIEW3D ); - PyObject *ret = NULL; - - EXPP_disable_force_draw = 1; - /*@ Disable forced drawing, otherwise the button object which - * is still being used might be deleted */ - - curarea->win_swap = WIN_BACK_OK; - /* removed global uiFrontBuf (contact ton when this goes wrong here) */ - - disable_where_script( 1 ); - - spacescript_do_pywin_buttons( curarea->spacedata.first, - (unsigned short)uiButGetRetVal( but ) - EXPP_BUTTON_EVENTS_OFFSET ); - - /* XXX useless right now, investigate better before a bcon 5 */ - ret = M_Window_Redraw( 0, ref ); - - Py_XDECREF(ref); - Py_XDECREF(ret); - - disable_where_script( 0 ); - - EXPP_disable_force_draw = 0; -} - -static PyObject *Method_Slider( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h, realtime = 1; - Button *but; - PyObject *mino, *maxo, *inio; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiiOOO|isO", &name, &event, - &x, &y, &w, &h, &inio, &mino, &maxo, &realtime, - &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints, three PyObjects\n\ - and optionally int, string and callback arguments" ); - - if(realtime && uiblock) - realtime = 0; /* realtime dosnt work with UIBlock */ - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - - if( PyFloat_Check( inio ) ) { - float ini, min, max; - - ini = (float)PyFloat_AsDouble( inio ); - min = (float)PyFloat_AsDouble( mino ); - max = (float)PyFloat_AsDouble( maxo ); - - but->type = BFLOAT_TYPE; - but->val.asfloat = ini; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButF( block, NUMSLI, event, name, (short)x, (short)y, (short)w, - (short)h, &but->val.asfloat, min, max, 0, 0, - but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - else - set_pycallback(ubut, callback, but); - } - } else { - int ini, min, max; - - ini = PyInt_AsLong( inio ); - min = PyInt_AsLong( mino ); - max = PyInt_AsLong( maxo ); - - but->type = BINT_TYPE; - but->val.asint = ini; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButI( block, NUMSLI, event, name, (short)x, (short)y, (short)w, - (short)h, &but->val.asint, (float)min, (float)max, 0, 0, - but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - else - set_pycallback(ubut, callback, but); - } - } - return ( PyObject * ) but; -} - -static PyObject *Method_Scrollbar( PyObject * self, PyObject * args ) -{ - char *tip = NULL; - uiBlock *block; - int event; - int x, y, w, h, realtime = 1; - Button *but; - PyObject *mino, *maxo, *inio; - float ini, min, max; - uiBut *ubut; - - if( !PyArg_ParseTuple( args, "iiiiiOOO|isO", &event, &x, &y, &w, &h, - &inio, &mino, &maxo, &realtime, &tip ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected five ints, three PyObjects and optionally\n\ -another int and string as arguments" ); - - if( !PyNumber_Check( inio ) || !PyNumber_Check( inio ) - || !PyNumber_Check( inio ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected numbers for initial, min, and max" ); - - if (check_button_event(&event) == -1) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "button event argument must be in the range [0, 16382]"); - - but = newbutton( ); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - if( PyFloat_Check( inio ) ) - but->type = BFLOAT_TYPE; - else - but->type = BINT_TYPE; - - ini = (float)PyFloat_AsDouble( inio ); - min = (float)PyFloat_AsDouble( mino ); - max = (float)PyFloat_AsDouble( maxo ); - - block = Get_uiBlock( ); - - if( block ) { - if( but->type == BFLOAT_TYPE ) { - but->val.asfloat = ini; - ubut = uiDefButF( block, SCROLL, event, "", (short)x, (short)y, (short)w, (short)h, - &but->val.asfloat, min, max, 0, 0, but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - } else { - but->val.asint = (int)ini; - ubut = uiDefButI( block, SCROLL, event, "", (short)x, (short)y, (short)w, (short)h, - &but->val.asint, min, max, 0, 0, but->tooltip ); - if( realtime ) - uiButSetFunc( ubut, py_slider_update, ubut, NULL ); - } - } - return ( PyObject * ) but; -} - -static PyObject *Method_ColorPicker( PyObject * self, PyObject * args ) -{ - char USAGE_ERROR[] = "expected a 3-float tuple of values between 0 and 1"; - Button *but; - PyObject *inio; - uiBlock *block; - char *tip = NULL; - float col[3]; - int event; - short x, y, w, h; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "ihhhhO!|sO", &event, - &x, &y, &w, &h, &PyTuple_Type, &inio, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected five ints, one tuple and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - if ( !PyArg_ParseTuple( inio, "fff", col, col+1, col+2 ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - if ( col[0] < 0 || col[0] > 1 - || col[1] < 0 || col[1] > 1 - || col[2] < 0 || col[2] > 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - if ( EXPP_check_sequence_consistency( inio, &PyFloat_Type ) != 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - but = newbutton(); - - but->type = BVECTOR_TYPE; - but->val.asvec[0] = col[0]; - but->val.asvec[1] = col[1]; - but->val.asvec[2] = col[2]; - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButF( block, COL, event, "", x, y, w, h, but->val.asvec, 0, 0, 0, 0, but->tooltip); - set_pycallback(ubut, callback, but); - } - - return ( PyObject * ) but; -} - - - -static PyObject *Method_Normal( PyObject * self, PyObject * args ) -{ - char USAGE_ERROR[] = "expected a 3-float tuple of values between -1 and 1"; - Button *but; - PyObject *inio; - uiBlock *block; - char *tip = NULL; - float nor[3]; - int event; - short x, y, w, h; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "ihhhhO!|sO", &event, - &x, &y, &w, &h, &PyTuple_Type, &inio, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected five ints, one tuple and optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - if ( !PyArg_ParseTuple( inio, "fff", nor, nor+1, nor+2 ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - if ( EXPP_check_sequence_consistency( inio, &PyFloat_Type ) != 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR); - - but = newbutton(); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - but->type = BVECTOR_TYPE; - but->val.asvec[0] = nor[0]; - but->val.asvec[1] = nor[1]; - but->val.asvec[2] = nor[2]; - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut; - ubut = uiDefButF( block, BUT_NORMAL, event, "", x, y, w, h, but->val.asvec, 0.0f, 1.0f, 0, 0, but->tooltip); - set_pycallback(ubut, callback, but); - } - - return ( PyObject * ) but; -} - -static PyObject *Method_Number( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *name, *tip = NULL; - int event; - int x, y, w, h; - Button *but; - PyObject *mino, *maxo, *inio; - PyObject *callback=NULL; - uiBut *ubut= NULL; - - if( !PyArg_ParseTuple( args, "siiiiiOOO|sO", &name, &event, - &x, &y, &w, &h, &inio, &mino, &maxo, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints, three PyObjects and\n\ - optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - but = newbutton( ); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - block = Get_uiBlock( ); - - if( PyFloat_Check( inio ) ) { - float ini, min, max, range, precission=0; - - ini = (float)PyFloat_AsDouble( inio ); - min = (float)PyFloat_AsDouble( mino ); - max = (float)PyFloat_AsDouble( maxo ); - - range= (float)fabs(max-min); /* Click step will be a 10th of the range. */ - if (!range) range= 1.0f; /* avoid any odd errors */ - - /* set the precission to display*/ - if (range>=1000.0f) precission=1.0f; - else if (range>=100.0f) precission=2.0f; - else if (range>=10.0f) precission=3.0f; - else precission=4.0f; - - but->type = BFLOAT_TYPE; - but->val.asfloat = ini; - - - if( block ) - ubut= uiDefButF( block, NUM, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asfloat, min, max, 10*range, precission, but->tooltip ); - } else { - int ini, min, max; - - ini = PyInt_AsLong( inio ); - min = PyInt_AsLong( mino ); - max = PyInt_AsLong( maxo ); - - but->type = BINT_TYPE; - but->val.asint = ini; - - if( block ) - ubut= uiDefButI( block, NUM, event, name, (short)x, (short)y, (short)w, (short)h, - &but->val.asint, (float)min, (float)max, 0, 0, but->tooltip ); - } - - if (ubut) set_pycallback(ubut, callback, but); - - return ( PyObject * ) but; -} - -static PyObject *Method_String( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *info_arg = NULL, *tip = NULL, *newstr = NULL; - char *info_str = NULL, *info_str0 = " "; - int event; - int x, y, w, h, len, real_len = 0; - Button *but; - PyObject *callback=NULL; - - if( !PyArg_ParseTuple( args, "siiiiisi|sO", &info_arg, &event, - &x, &y, &w, &h, &newstr, &len, &tip, &callback ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string, five ints, a string, an int and\n\ - optionally string and callback arguments" ); - - UI_METHOD_ERRORCHECK; - - if (len > (UI_MAX_DRAW_STR - 1)) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "The maximum length of a string is 399, your value is too high."); - - real_len = strlen(newstr); - if (real_len > len) real_len = len; - - but = newbutton( ); - but->type = BSTRING_TYPE; - but->slen = len; - but->val.asstr = MEM_mallocN( len + 1, "pybutton str" ); - if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP); - - BLI_strncpy( but->val.asstr, newstr, len + 1); /* adds '\0' */ - but->val.asstr[real_len] = '\0'; - - if (info_arg[0] == '\0') info_str = info_str0; - else info_str = info_arg; - - block = Get_uiBlock( ); - if( block ) { - uiBut *ubut = uiDefBut( block, TEX, event, info_str, (short)x, (short)y, (short)w, (short)h, - but->val.asstr, 0, (float)len, 0, 0, but->tooltip ); - set_pycallback(ubut, callback, but); - } - return ( PyObject * ) but; -} - -static PyObject *Method_GetStringWidth( PyObject * self, PyObject * args ) -{ - char *text; - char *font_str = "normal"; - struct BMF_Font *font; - PyObject *width; - - if( !PyArg_ParseTuple( args, "s|s", &text, &font_str ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or two string arguments" ); - - if( !strcmp( font_str, "normal" ) ) - font = ( &G )->font; - else if( !strcmp( font_str, "large" ) ) - font = BMF_GetFont(BMF_kScreen15); - else if( !strcmp( font_str, "small" ) ) - font = ( &G )->fonts; - else if( !strcmp( font_str, "tiny" ) ) - font = ( &G )->fontss; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "\"font\" must be: 'large', 'normal' (default), 'small' or 'tiny'." ); - - width = PyInt_FromLong( BMF_GetStringWidth( font, text ) ); - - if( !width ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyInt" ); - - return width; -} - -static PyObject *Method_Text( PyObject * self, PyObject * args ) -{ - char *text; - char *font_str = NULL; - struct BMF_Font *font; - - if( !PyArg_ParseTuple( args, "s|s", &text, &font_str ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or two string arguments" ); - - if( !font_str ) - font = ( &G )->font; - else if( !strcmp( font_str, "large" ) ) - font = BMF_GetFont(BMF_kScreen15); - else if( !strcmp( font_str, "normal" ) ) - font = ( &G )->font; - else if( !strcmp( font_str, "small" ) ) - font = ( &G )->fonts; - else if( !strcmp( font_str, "tiny" ) ) - font = ( &G )->fontss; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "\"font\" must be: 'normal' (default), 'large', 'small' or 'tiny'." ); - - BMF_DrawString( font, text ); - - return PyInt_FromLong( BMF_GetStringWidth( font, text ) ); -} - -static PyObject *Method_Label( PyObject * self, PyObject * args ) -{ - uiBlock *block; - char *text; - int x, y, w, h; - - if( !PyArg_ParseTuple( args, "siiii", &text, &x, &y, &w, &h ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string and four ints" ); - - block = Get_uiBlock( ); - uiDefBut(block, LABEL, 0, text, x, y, w, h, 0, 0, 0, 0, 0, ""); - - Py_RETURN_NONE; -} - - -static PyObject *Method_PupMenu( PyObject * self, PyObject * args ) -{ - char *text; - int maxrow = -1; - PyObject *ret; - - if( !PyArg_ParseTuple( args, "s|i", &text, &maxrow ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string and optionally an int as arguments" ); - - if( maxrow >= 0 ) - ret = PyInt_FromLong( pupmenu_col( text, maxrow ) ); - else - ret = PyInt_FromLong( pupmenu( text ) ); - - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyInt" ); -} - -static PyObject *Method_PupIntInput( PyObject * self, PyObject * args ) -{ - char *text = NULL; - int min = 0, max = 1; - short var = 0; - PyObject *ret = NULL; - - if( !PyArg_ParseTuple( args, "s|hii", &text, &var, &min, &max ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1 string and 3 int arguments" ); - - if( button( &var, (short)min, (short)max, text ) == 0 ) { - Py_INCREF( Py_None ); - return Py_None; - } - ret = PyInt_FromLong( var ); - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyInt" ); -} - -static PyObject *Method_PupFloatInput( PyObject * self, PyObject * args ) -{ - char *text = NULL; - float min = 0, max = 1, var = 0, a1 = 10, a2 = 2; - PyObject *ret = NULL; - - if( !PyArg_ParseTuple - ( args, "s|fffff", &text, &var, &min, &max, &a1, &a2 ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1 string and 5 float arguments" ); - - if( fbutton( &var, min, max, a1, a2, text ) == 0 ) { - Py_INCREF( Py_None ); - return Py_None; - } - ret = PyFloat_FromDouble( var ); - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyFloat" ); -} - -static PyObject *Method_PupStrInput( PyObject * self, PyObject * args ) -{ - char *text = NULL, *textMsg = NULL; - char tmp[101]; - char max = 20; - PyObject *ret = NULL; - - if( !PyArg_ParseTuple( args, "ss|b", &textMsg, &text, &max ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 strings and 1 int" ); - - if( ( max <= 0 ) || ( max > 100 ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "max string length value must be in the range [1, 100]." ); - - /* copying the text string handles both cases: - * max < strlen(text) (by truncating) and - * max > strlen(text) (by expanding to strlen(tmp)) */ - BLI_strncpy( tmp, text, max + 1 ); - - if( sbutton( tmp, 0, max, textMsg ) == 0 ) { - Py_INCREF( Py_None ); - return Py_None; - } - - ret = PyString_FromString( tmp ); - - if( ret ) - return ret; - - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create a PyString" ); -} - -static PyObject *Method_PupBlock( PyObject * self, PyObject * args ) -{ - PyObject *pyList, *pyItem; - float min, max; - int len, i; - char *title; - - if (!PyArg_ParseTuple( args, "sO", &title, &pyList ) || !PySequence_Check( pyList )) - return EXPP_ReturnPyObjError( PyExc_TypeError, "expected a string and a sequence" ); - - - len = PySequence_Length(pyList); - - if (len == 0) - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string and a non-empty sequence." ); - - if (len > 120) /* LIMIT DEFINED IN toolbox.c */ - return EXPP_ReturnPyObjError( PyExc_ValueError, "sequence cannot have more than 120 elements" ); - - for ( i=0 ; itype != BINT_TYPE) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "Button object for toggles should hold an integer" ); - } - - add_numbut(i, TOG|INT, text, 0, 0, &but->val.asint, tip); - break; - case 4: /* TEX and NUM (no tooltip) */ - case 5: /* TEX and NUM */ - if (!PyArg_ParseTuple( pyItem, "sO!OO|s", &text, &Button_Type, &but, &pyMin, &pyMax, &tip )) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a tuple containing a string, a Button object, two numerical values and optionally a string for Text and Num buttons" ); - } - - f1 = PyNumber_Float(pyMin); - f2 = PyNumber_Float(pyMax); - - if (!f1 || !f2) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a tuple containing a string, a Button object, two numerical values and optionally a string for Text and Num buttons" ); - } - - min = (float)PyFloat_AS_DOUBLE(f1); - max = (float)PyFloat_AS_DOUBLE(f2); - Py_DECREF( f1 ); - Py_DECREF( f2 ); - - switch ( but->type ) { - case BINT_TYPE: - add_numbut(i, NUM|INT, text, min, max, &but->val.asint, tip); - break; - case BFLOAT_TYPE: - add_numbut(i, NUM|FLO, text, min, max, &but->val.asfloat, tip); - break; - case BSTRING_TYPE: - if (max+1>UI_MAX_DRAW_STR) { - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "length of a string buttons must be less then 400" ); - } - max = (float)floor(max); - - if (max > but->slen) { - int old_len = but->slen; - char *old_str = but->val.asstr; - but->slen = (int)max; - but->val.asstr = MEM_callocN( but->slen + 1, "button pupblock"); - BLI_strncpy( but->val.asstr, old_str, old_len + 1 ); - MEM_freeN(old_str); - } - - add_numbut(i, TEX, text, 0.0f, max, but->val.asstr, tip); - } - - break; - default: - Py_DECREF( pyItem ); - return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string or a tuple containing 2 to 5 values." ); - } - Py_DECREF( pyItem ); - } - - if (do_clever_numbuts(title, len, REDRAW)) - return EXPP_incr_ret_True(); - else - return EXPP_incr_ret_False(); -} - - -/***************************************************************************** - * Function: Method_Image * - * Python equivalent: Blender.Draw.Image * - * * - * @author Jonathan Merritt * - ****************************************************************************/ -static PyObject *Method_Image( PyObject * self, PyObject * args ) -{ - PyObject *pyObjImage; - BPy_Image *py_img; - Image *image; - ImBuf *ibuf; - float originX, originY; - float zoomX = 1.0, zoomY = 1.0; - int clipX = 0, clipY = 0, clipW = -1, clipH = -1; - /*GLfloat scissorBox[4];*/ - - /* parse the arguments passed-in from Python */ - if( !PyArg_ParseTuple( args, "Off|ffiiii", &pyObjImage, - &originX, &originY, &zoomX, &zoomY, - &clipX, &clipY, &clipW, &clipH ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a Blender.Image and 2 floats, and " \ - "optionally 2 floats and 4 ints as arguments" ); - /* check that the first PyObject is actually a Blender.Image */ - if( !BPy_Image_Check( pyObjImage ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a Blender.Image and 2 floats, and " \ - "optionally 2 floats and 4 ints as arguments" ); - /* check that the zoom factors are valid */ - if( ( zoomX <= 0.0 ) || ( zoomY <= 0.0 ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "invalid zoom factors - they must be >= 0.0" ); - - /* fetch a C Image pointer from the passed-in Python object */ - py_img = ( BPy_Image * ) pyObjImage; - image = py_img->image; - ibuf = BKE_image_get_ibuf( image, NULL ); - - if( !ibuf ) /* if failed to load the image */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - if( !ibuf->rect ) /* no float yet */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Image has no byte rect" ); - - /* Update the time tag of the image */ - tag_image_time(image); - - /* set up a valid clipping rectangle. if no clip rectangle was - * given, this results in inclusion of the entire image. otherwise, - * the clipping is just checked against the bounds of the image. - * if clipW or clipH are less than zero then they include as much of - * the image as they can. */ - clipX = EXPP_ClampInt( clipX, 0, ibuf->x ); - clipY = EXPP_ClampInt( clipY, 0, ibuf->y ); - if( ( clipW < 0 ) || ( clipW > ( ibuf->x - clipW ) ) ) - clipW = ibuf->x - clipX; - if( ( clipH < 0 ) || ( clipH > ( ibuf->y - clipH ) ) ) - clipH = ibuf->y - clipY; - - /* -- we are "Go" to Draw! -- */ - - /* set the raster position. - * - * If the raster position is negative, then using glRasterPos2i() - * directly would cause it to be clipped. Instead, we first establish - * a valid raster position within the clipping rectangle of the - * window and then use glBitmap() with a NULL image pointer to offset - * it to the true position we require. To pick an initial valid - * raster position within the viewport, we query the clipping rectangle - * and use its lower-left pixel. - * - * This particular technique is documented in the glRasterPos() man - * page, although I haven't seen it used elsewhere in Blender. - */ - - /* update (W): to fix a bug where images wouldn't get drawn if the bottom - * left corner of the Scripts win were above a given height or to the right - * of a given width, the code below is being commented out. It should not - * be needed anyway, because spaces in Blender are projected to lie inside - * their areas, see src/drawscript.c for example. Note: the - * glaRasterPosSafe2i function in src/glutil.c does use the commented out - * technique, but with 0,0 instead of scissorBox. This function can be - * a little optimized, based on glaDrawPixelsSafe in that same fine, but - * we're too close to release 2.37 right now. */ - /* - glGetFloatv( GL_SCISSOR_BOX, scissorBox ); - glRasterPos2i( scissorBox[0], scissorBox[1] ); - glBitmap( 0, 0, 0.0, 0.0, - originX-scissorBox[0], originY-scissorBox[1], NULL ); - */ - - /* update (cont.): using these two lines instead: - * (based on glaRasterPosSafe2i, but Ken Hughes deserves credit - * for suggesting this exact fix in the bug tracker) */ - glRasterPos2i(0, 0); - glBitmap( 0, 0, 0.0, 0.0, originX, originY, NULL ); - - /* set the zoom */ - glPixelZoom( zoomX, zoomY ); - - /* set the width of the image (ROW_LENGTH), and the offset to the - * clip origin within the image in x (SKIP_PIXELS) and - * y (SKIP_ROWS) */ - glPixelStorei( GL_UNPACK_ROW_LENGTH, ibuf->x ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, clipX ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, clipY ); - - /* draw the image */ - glDrawPixels( clipW, clipH, GL_RGBA, GL_UNSIGNED_BYTE, - ibuf->rect ); - - /* restore the defaults for some parameters (we could also use a - * glPushClientAttrib() and glPopClientAttrib() pair). */ - glPixelZoom( 1.0, 1.0 ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); - glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); - - Py_INCREF( Py_None ); - return Py_None; - -} - -PyObject *Draw_Init( void ) -{ - PyObject *submodule, *dict; - - if( PyType_Ready( &Button_Type) < 0) - Py_RETURN_NONE; - - submodule = Py_InitModule3( "Blender.Draw", Draw_methods, Draw_doc ); - - dict = PyModule_GetDict( submodule ); - -#define EXPP_ADDCONST(x) \ - EXPP_dict_set_item_str(dict, #x, PyInt_FromLong(x)) - - /* So, for example: - * EXPP_ADDCONST(LEFTMOUSE) becomes - * EXPP_dict_set_item_str(dict, "LEFTMOUSE", PyInt_FromLong(LEFTMOUSE)) - */ - - EXPP_ADDCONST( LEFTMOUSE ); - EXPP_ADDCONST( MIDDLEMOUSE ); - EXPP_ADDCONST( RIGHTMOUSE ); - EXPP_ADDCONST( WHEELUPMOUSE ); - EXPP_ADDCONST( WHEELDOWNMOUSE ); - EXPP_ADDCONST( MOUSEX ); - EXPP_ADDCONST( MOUSEY ); - EXPP_ADDCONST( TIMER0 ); - EXPP_ADDCONST( TIMER1 ); - EXPP_ADDCONST( TIMER2 ); - EXPP_ADDCONST( TIMER3 ); - EXPP_ADDCONST( KEYBD ); - EXPP_ADDCONST( RAWKEYBD ); - EXPP_ADDCONST( REDRAW ); - EXPP_ADDCONST( INPUTCHANGE ); - EXPP_ADDCONST( QFULL ); - EXPP_ADDCONST( WINFREEZE ); - EXPP_ADDCONST( WINTHAW ); - EXPP_ADDCONST( WINCLOSE ); - EXPP_ADDCONST( WINQUIT ); -#ifndef IRISGL - EXPP_ADDCONST( Q_FIRSTTIME ); -#endif - EXPP_ADDCONST( AKEY ); - EXPP_ADDCONST( BKEY ); - EXPP_ADDCONST( CKEY ); - EXPP_ADDCONST( DKEY ); - EXPP_ADDCONST( EKEY ); - EXPP_ADDCONST( FKEY ); - EXPP_ADDCONST( GKEY ); - EXPP_ADDCONST( HKEY ); - EXPP_ADDCONST( IKEY ); - EXPP_ADDCONST( JKEY ); - EXPP_ADDCONST( KKEY ); - EXPP_ADDCONST( LKEY ); - EXPP_ADDCONST( MKEY ); - EXPP_ADDCONST( NKEY ); - EXPP_ADDCONST( OKEY ); - EXPP_ADDCONST( PKEY ); - EXPP_ADDCONST( QKEY ); - EXPP_ADDCONST( RKEY ); - EXPP_ADDCONST( SKEY ); - EXPP_ADDCONST( TKEY ); - EXPP_ADDCONST( UKEY ); - EXPP_ADDCONST( VKEY ); - EXPP_ADDCONST( WKEY ); - EXPP_ADDCONST( XKEY ); - EXPP_ADDCONST( YKEY ); - EXPP_ADDCONST( ZKEY ); - EXPP_ADDCONST( ZEROKEY ); - EXPP_ADDCONST( ONEKEY ); - EXPP_ADDCONST( TWOKEY ); - EXPP_ADDCONST( THREEKEY ); - EXPP_ADDCONST( FOURKEY ); - EXPP_ADDCONST( FIVEKEY ); - EXPP_ADDCONST( SIXKEY ); - EXPP_ADDCONST( SEVENKEY ); - EXPP_ADDCONST( EIGHTKEY ); - EXPP_ADDCONST( NINEKEY ); - EXPP_ADDCONST( CAPSLOCKKEY ); - EXPP_ADDCONST( LEFTCTRLKEY ); - EXPP_ADDCONST( LEFTALTKEY ); - EXPP_ADDCONST( RIGHTALTKEY ); - EXPP_ADDCONST( RIGHTCTRLKEY ); - EXPP_ADDCONST( RIGHTSHIFTKEY ); - EXPP_ADDCONST( LEFTSHIFTKEY ); - EXPP_ADDCONST( ESCKEY ); - EXPP_ADDCONST( TABKEY ); - EXPP_ADDCONST( RETKEY ); - EXPP_ADDCONST( SPACEKEY ); - EXPP_ADDCONST( LINEFEEDKEY ); - EXPP_ADDCONST( BACKSPACEKEY ); - EXPP_ADDCONST( DELKEY ); - EXPP_ADDCONST( SEMICOLONKEY ); - EXPP_ADDCONST( PERIODKEY ); - EXPP_ADDCONST( COMMAKEY ); - EXPP_ADDCONST( QUOTEKEY ); - EXPP_ADDCONST( ACCENTGRAVEKEY ); - EXPP_ADDCONST( MINUSKEY ); - EXPP_ADDCONST( SLASHKEY ); - EXPP_ADDCONST( BACKSLASHKEY ); - EXPP_ADDCONST( EQUALKEY ); - EXPP_ADDCONST( LEFTBRACKETKEY ); - EXPP_ADDCONST( RIGHTBRACKETKEY ); - EXPP_ADDCONST( LEFTARROWKEY ); - EXPP_ADDCONST( DOWNARROWKEY ); - EXPP_ADDCONST( RIGHTARROWKEY ); - EXPP_ADDCONST( UPARROWKEY ); - EXPP_ADDCONST( PAD2 ); - EXPP_ADDCONST( PAD4 ); - EXPP_ADDCONST( PAD6 ); - EXPP_ADDCONST( PAD8 ); - EXPP_ADDCONST( PAD1 ); - EXPP_ADDCONST( PAD3 ); - EXPP_ADDCONST( PAD5 ); - EXPP_ADDCONST( PAD7 ); - EXPP_ADDCONST( PAD9 ); - EXPP_ADDCONST( PADPERIOD ); - EXPP_ADDCONST( PADSLASHKEY ); - EXPP_ADDCONST( PADASTERKEY ); - EXPP_ADDCONST( PAD0 ); - EXPP_ADDCONST( PADMINUS ); - EXPP_ADDCONST( PADENTER ); - EXPP_ADDCONST( PADPLUSKEY ); - EXPP_ADDCONST( F1KEY ); - EXPP_ADDCONST( F2KEY ); - EXPP_ADDCONST( F3KEY ); - EXPP_ADDCONST( F4KEY ); - EXPP_ADDCONST( F5KEY ); - EXPP_ADDCONST( F6KEY ); - EXPP_ADDCONST( F7KEY ); - EXPP_ADDCONST( F8KEY ); - EXPP_ADDCONST( F9KEY ); - EXPP_ADDCONST( F10KEY ); - EXPP_ADDCONST( F11KEY ); - EXPP_ADDCONST( F12KEY ); - EXPP_ADDCONST( PAUSEKEY ); - EXPP_ADDCONST( INSERTKEY ); - EXPP_ADDCONST( HOMEKEY ); - EXPP_ADDCONST( PAGEUPKEY ); - EXPP_ADDCONST( PAGEDOWNKEY ); - EXPP_ADDCONST( ENDKEY ); - - return submodule; -} diff --git a/source/blender/python/api2_2x/Draw.h b/source/blender/python/api2_2x/Draw.h deleted file mode 100644 index a78b19b0ebd..00000000000 --- a/source/blender/python/api2_2x/Draw.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * $Id: Draw.h 11387 2007-07-27 06:14:25Z joeedh $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* The code in Draw.[ch] and BGL.[ch] comes from opy_draw.c in the old - * bpython/intern dir, with minor modifications to suit the current - * implementation. Important original comments are marked with an @ symbol. */ - -#ifndef EXPP_DRAW_H_ -#define EXPP_DRAW_H_ - -#include -#include "DNA_space_types.h" -#include "DNA_text_types.h" - -void initDraw( void ); - -/* - * Button Object stuct - */ - -typedef struct _Button { - PyObject_VAR_HEAD /* required Py Macro */ - int type; /*@ 1 == int, 2 == float, 3 == string */ - unsigned int slen; /*@ length of string (if type == 3) */ - union { - int asint; - float asfloat; - char *asstr; - float asvec[3]; - } val; - char tooltip[256]; -} Button; - -#define BPY_MAX_TOOLTIP 255 - -#define BINT_TYPE 1 -#define BFLOAT_TYPE 2 -#define BSTRING_TYPE 3 -#define BVECTOR_TYPE 4 - -/* - * these are declared in ../BPY_extern.h -*/ - -PyObject *M_Draw_Init( void ); -PyObject *Draw_Init( void ); - -#endif /* EXPP_DRAW_H */ diff --git a/source/blender/python/api2_2x/EXPP_interface.c b/source/blender/python/api2_2x/EXPP_interface.c deleted file mode 100644 index 9d49746ff41..00000000000 --- a/source/blender/python/api2_2x/EXPP_interface.c +++ /dev/null @@ -1,230 +0,0 @@ -/* - * $Id: EXPP_interface.c 7338 2006-04-30 16:22:31Z ianwill $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include - -#include "EXPP_interface.h" -#include "BLI_blenlib.h" -#include "MEM_guardedalloc.h" -#include "BLI_linklist.h" /* linked list: LinkNode struct and functions */ -#include "DNA_object_types.h" -#include "DNA_space_types.h" /* for FILE_MAXDIR, FILE_MAXFILE */ -#include "Blender.h" - -extern char bprogname[]; /* argv[0] from creator.c */ - -/* this makes sure BLI_gethome() returns a path with '.blender' appended - * Besides, this function now either returns userhome/.blender (if it exists) - * or blenderInstallDir/.blender/ otherwise (can also be cvs dir). - * If append_scriptsdir is non NULL, "scripts/" is appended to the dir, to - * get the path to the scripts folder ("release/scripts/" if cvs dir). - * Finally, if all else fails BLI_gethome() is returned - * (or NULL if append_scriptdir != 0). -*/ -char *bpy_gethome(int append_scriptsdir) -{ - static char homedir[FILE_MAXDIR]; - static char scriptsdir[FILE_MAXDIR]; - char tmpdir[FILE_MAXDIR]; - char bprogdir[FILE_MAXDIR]; - char *s; - int i; - - if (append_scriptsdir) { - if (scriptsdir[0] != '\0') - return scriptsdir; - } - else if (homedir[0] != '\0') - return homedir; - - /* BLI_gethome() can return NULL if env vars are not set */ - s = BLI_gethome(); - - if( !s ) /* bail if no $HOME */ - { - printf("$HOME is NOT set\n"); - return NULL; - } - - if( strstr( s, ".blender" ) ) - PyOS_snprintf( homedir, FILE_MAXDIR, s ); - else - BLI_make_file_string( "/", homedir, s, ".blender" ); - - /* if userhome/.blender/ exists, return it */ - if( BLI_exists( homedir ) ) { - if (append_scriptsdir) { - BLI_make_file_string("/", scriptsdir, homedir, "scripts"); - if (BLI_exists (scriptsdir)) return scriptsdir; - } - else return homedir; - } - else homedir[0] = '\0'; - - /* if either: - * no homedir was found or - * append_scriptsdir = 1 but there's no scripts/ inside homedir, - * use argv[0] (bprogname) to get .blender/ in - * Blender's installation dir */ - s = BLI_last_slash( bprogname ); - - i = s - bprogname + 1; - - PyOS_snprintf( bprogdir, i, "%s", bprogname ); - - /* using tmpdir to preserve homedir (if) found above: - * the ideal is to have a home dir with scripts dir inside - * it, but if that isn't available, it's possible to - * have a 'broken' home dir somewhere and a scripts dir in the - * cvs sources */ - BLI_make_file_string( "/", tmpdir, bprogdir, ".blender" ); - - if (BLI_exists(tmpdir)) { - if (append_scriptsdir) { - BLI_make_file_string("/", scriptsdir, tmpdir, "scripts"); - if (BLI_exists(scriptsdir)) { - PyOS_snprintf(homedir, FILE_MAXDIR, "%s", tmpdir); - return scriptsdir; - } - else { - homedir[0] = '\0'; - scriptsdir[0] = '\0'; - } - } - else return homedir; - } - - /* last try for scripts dir: blender in cvs dir, scripts/ inside release/: */ - if (append_scriptsdir) { - BLI_make_file_string("/", scriptsdir, bprogdir, "release/scripts"); - if (BLI_exists(scriptsdir)) return scriptsdir; - else scriptsdir[0] = '\0'; - } - - return NULL; -} - -/* PyDrivers */ - -/* - * Pydrivers are Blender Ipo Drivers defined by Python expressions. - * We need to tell DAG about objects used in these expressions, so we - * eval each expression to collect the ob refs. in it. - */ - -/* these are checked for example in Object.c: M_Object_Get (Object.Get()) - * to collect the refs. */ -static int pydriver_running = 0; - -int bpy_during_pydriver(void) -{ - return pydriver_running; -} - -void bpy_pydriver_running(int state) -{ - pydriver_running = state; -} - -/* Obj references are collected in this extern linked list: */ -LinkNode *bpy_pydriver_oblist = NULL; - -void bpy_pydriver_freeList(void) -{ - BLI_linklist_free(bpy_pydriver_oblist, NULL); - bpy_pydriver_oblist = NULL; -} - -void bpy_pydriver_appendToList(struct Object *ob) -{ - LinkNode *ln = bpy_pydriver_oblist; - - /* check that the expression is not referencing its owner object */ - -/* XXX COMMENTED OUT TO TEST IF WE REALLY NEED TO IMPOSE THIS RESTRICTION - if (ln && ln->link) { - if (ob == (Object *)ln->link) { - PyErr_SetString(PyExc_AttributeError, - "Python driver expression can't reference its own object"); - return; - } - else - ln = ln->next; - } -*/ - while (ln) { /* is ob already in list? ... */ - if (ob == (Object *)ln->link) - break; - ln = ln->next; - } - - if (!ln) /* ... not yet, append it */ - BLI_linklist_append(&bpy_pydriver_oblist, (void *)ob); - - return; -} - -/* Get an array from our linked list of objs referenced in the - * current pydriver. The first node in the list is discarded, - * since it is the actual pydriver owner, which shouldn't be - * passed to the depsgraph (no self references). */ -struct Object **bpy_pydriver_obArrayFromList(void) -{ - Object **obarray = NULL; - - if (bpy_pydriver_oblist) { - int i; - short len = BLI_linklist_length(bpy_pydriver_oblist); - - if (len > 1) { - - obarray = (Object **)MEM_mallocN(sizeof(Object*)*len, - "pydriver array"); - - if (obarray) { - LinkNode *ln = bpy_pydriver_oblist; - ln = ln->next; /* skip first ob, which is the pydriver owner */ - - for (i = 0; i < len-1; i++) { - obarray[i] = (Object *)ln->link; - ln = ln->next; - } - - obarray[len-1] = NULL; /* NULL-terminated array */ - } - } - bpy_pydriver_freeList(); - } - - return obarray; -} - diff --git a/source/blender/python/api2_2x/EXPP_interface.h b/source/blender/python/api2_2x/EXPP_interface.h deleted file mode 100644 index 8ed0836820d..00000000000 --- a/source/blender/python/api2_2x/EXPP_interface.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * $Id: EXPP_interface.h 7338 2006-04-30 16:22:31Z ianwill $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten, Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_INTERFACE_H -#define EXPP_INTERFACE_H - -struct Object; -struct Script; -struct LinkNode; - -extern struct LinkNode *bpy_pydriver_oblist; - -void initBlenderApi2_2x( void ); -char *bpy_gethome( int append_scriptsdir ); -void discardFromBDict( char *key ); -void EXPP_Library_Close( void ); /* in Library.c, used by BPY_end_python */ - -/* PyDrivers */ - -void bpy_pydriver_freeList(void); -void bpy_pydriver_appendToList(struct Object *ob); -struct Object **bpy_pydriver_obArrayFromList(void); - -int bpy_during_pydriver(void); -void bpy_pydriver_running(int state); - -#endif /* EXPP_INTERFACE_H */ diff --git a/source/blender/python/api2_2x/Effect.c b/source/blender/python/api2_2x/Effect.c deleted file mode 100644 index 1dcc2279ee2..00000000000 --- a/source/blender/python/api2_2x/Effect.c +++ /dev/null @@ -1,1575 +0,0 @@ -/* - * $Id: Effect.c 11485 2007-08-05 09:21:29Z aligorith $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot, Jean-Michel Soler, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ -#include "Effect.h" /*This must come first */ - -#include "DNA_object_types.h" -#include "DNA_scene_types.h" /* for G.scene->r.cfra */ -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_effect.h" -#include "BKE_object.h" -#include "BKE_deform.h" -#include "BKE_scene.h" /* for G.scene->r.cfra */ -#include "BKE_ipo.h" /* frame_to_float() */ -#include "BLI_blenlib.h" -#include "gen_utils.h" -#include "blendef.h" -#include "vector.h" -#include "MTC_matrixops.h" - -#define EXPP_EFFECT_STA_MIN -250.0f -#define EXPP_EFFECT_END_MIN 1.0f -#define EXPP_EFFECT_LIFETIME_MIN 1.0f -#define EXPP_EFFECT_NORMFAC_MIN -2.0f -#define EXPP_EFFECT_NORMFAC_MAX 2.0f -#define EXPP_EFFECT_OBFAC_MIN -1.0f -#define EXPP_EFFECT_OBFAC_MAX 1.0f -#define EXPP_EFFECT_RANDFAC_MIN 0.0f -#define EXPP_EFFECT_RANDFAC_MAX 2.0f -#define EXPP_EFFECT_TEXFAC_MIN 0.0f -#define EXPP_EFFECT_TEXFAC_MAX 2.0f -#define EXPP_EFFECT_RANDLIFE_MIN 0.0f -#define EXPP_EFFECT_RANDLIFE_MAX 2.0f -#define EXPP_EFFECT_NABLA_MIN 0.0001f -#define EXPP_EFFECT_NABLA_MAX 1.0f -#define EXPP_EFFECT_VECTSIZE_MIN 0.0f -#define EXPP_EFFECT_VECTSIZE_MAX 1.0f -#define EXPP_EFFECT_TOTPART_MIN 1.0f -#define EXPP_EFFECT_TOTPART_MAX 100000.0f -#define EXPP_EFFECT_FORCE_MIN -1.0f -#define EXPP_EFFECT_FORCE_MAX 1.0f -#define EXPP_EFFECT_MULT_MIN 0.0f -#define EXPP_EFFECT_MULT_MAX 1.0f -#define EXPP_EFFECT_LIFE_MIN 1.0f -#define EXPP_EFFECT_DEFVEC_MIN -1.0f -#define EXPP_EFFECT_DEFVEC_MAX 1.0f -#define EXPP_EFFECT_DAMP_MIN 0.0f -#define EXPP_EFFECT_DAMP_MAX 1.0f - -#define EXPP_EFFECT_TOTKEY_MIN 1 -#define EXPP_EFFECT_TOTKEY_MAX 100 -#define EXPP_EFFECT_SEED_MIN 0 -#define EXPP_EFFECT_SEED_MAX 255 -#define EXPP_EFFECT_CHILD_MIN 1 -#define EXPP_EFFECT_CHILD_MAX 600 -#define EXPP_EFFECT_CHILDMAT_MIN 1 -#define EXPP_EFFECT_CHILDMAT_MAX 16 -#define EXPP_EFFECT_JITTER_MIN 0 -#define EXPP_EFFECT_JITTER_MAX 200 -#define EXPP_EFFECT_DISPMAT_MIN 1 -#define EXPP_EFFECT_DISPMAT_MAX 16 -#define EXPP_EFFECT_TIMETEX_MIN 1 -#define EXPP_EFFECT_TIMETEX_MAX 10 -#define EXPP_EFFECT_SPEEDTEX_MIN 1 -#define EXPP_EFFECT_SPEEDTEX_MAX 10 -#define EXPP_EFFECT_TEXMAP_MIN 1 -#define EXPP_EFFECT_TEXMAP_MAX 3 - -#define EXPP_EFFECT_SPEEDTYPE_INTENSITY 0 -#define EXPP_EFFECT_SPEEDTYPE_RGB 1 -#define EXPP_EFFECT_SPEEDTYPE_GRADIENT 2 - -#define EXPP_EFFECT_STATICSTEP_MIN 1 -#define EXPP_EFFECT_STATICSTEP_MAX 100 -#define EXPP_EFFECT_DISP_MIN 0 -#define EXPP_EFFECT_DISP_MAX 100 - -/*****************************************************************************/ -/* Python API function prototypes for the Blender module. */ -/*****************************************************************************/ -static PyObject *M_Effect_New( PyObject * self, PyObject * args ); -static PyObject *M_Effect_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* Python BPy_Effect methods declarations: */ -/*****************************************************************************/ -static PyObject *Effect_getType( BPy_Effect * self ); -static int Effect_setType( void ); -static PyObject *Effect_getStype( BPy_Effect * self ); -static int Effect_setStype( BPy_Effect * self, PyObject * args ); -static PyObject *Effect_getFlag( BPy_Effect * self ); -static int Effect_setFlag( BPy_Effect * self, PyObject * args ); -static PyObject *Effect_getSta( BPy_Effect * self ); -static int Effect_setSta( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getEnd( BPy_Effect * self ); -static int Effect_setEnd( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getLifetime( BPy_Effect * self ); -static int Effect_setLifetime( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getNormfac( BPy_Effect * self ); -static int Effect_setNormfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getObfac( BPy_Effect * self ); -static int Effect_setObfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getRandfac( BPy_Effect * self ); -static int Effect_setRandfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getTexfac( BPy_Effect * self ); -static int Effect_setTexfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getRandlife( BPy_Effect * self ); -static int Effect_setRandlife( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getNabla( BPy_Effect * self ); -static int Effect_setNabla( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getVectsize( BPy_Effect * self ); -static int Effect_setVectsize( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getTotpart( BPy_Effect * self ); -static int Effect_setTotpart( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getTotkey( BPy_Effect * self ); -static int Effect_setTotkey( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getSeed( BPy_Effect * self ); -static int Effect_setSeed( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getForce( BPy_Effect * self ); -static int Effect_setForce( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getMult( BPy_Effect * self ); -static int Effect_setMult( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getLife( BPy_Effect * self ); -static int Effect_setLife( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getChildMat( BPy_Effect * self ); -static int Effect_setChildMat( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getChild( BPy_Effect * self ); -static int Effect_setChild( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getDefvec( BPy_Effect * self ); -static int Effect_setDefvec( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getJitter( BPy_Effect * self ); -static int Effect_setJitter( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getDispMat( BPy_Effect * self ); -static int Effect_setDispMat( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getEmissionTex( BPy_Effect * self ); -static int Effect_setEmissionTex( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getForceTex( BPy_Effect * self ); -static int Effect_setForceTex( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getDamping( BPy_Effect * self ); -static int Effect_setDamping( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getSpeedType( BPy_Effect * self ); -static int Effect_setSpeedType( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getVertGroup( BPy_Effect * self ); -static int Effect_setVertGroup( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getSpeedVertGroup( BPy_Effect * self ); -static int Effect_setSpeedVertGroup( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_getStaticStep( BPy_Effect * self ); -static int Effect_setStaticStep( BPy_Effect * self , PyObject * a); -static PyObject *Effect_getDisp( BPy_Effect * self ); -static int Effect_setDisp( BPy_Effect * self , PyObject * a); -static PyObject *Effect_getParticlesLoc( BPy_Effect * self ); - -static PyObject *Effect_oldsetType( void ); -static PyObject *Effect_oldsetStype( BPy_Effect * self, PyObject * args ); -static PyObject *Effect_oldsetFlag( BPy_Effect * self, PyObject * args ); -static PyObject *Effect_oldsetSta( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetEnd( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetLifetime( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetNormfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetObfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetRandfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetTexfac( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetRandlife( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetNabla( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetVectsize( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetTotpart( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetTotkey( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetSeed( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetForce( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetMult( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetLife( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetMat( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetChild( BPy_Effect * self, PyObject * a ); -static PyObject *Effect_oldsetDefvec( BPy_Effect * self, PyObject * a ); - -/*****************************************************************************/ -/* Python Effect_Type callback function prototypes: */ -/*****************************************************************************/ -static PyObject *Effect_repr( void ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Particle.__doc__ */ -/*****************************************************************************/ -static char M_Particle_doc[] = "The Blender Effect module\n\n\ -This module provides access to **Object Data** in Blender.\n\ -Functions :\n\ - New(name) : creates a new part object and adds it to the given mesh object \n\ - Get(name) : retreives a particle with the given name (mandatory)\n\ - get(name) : same as Get. Kept for compatibility reasons.\n"; -static char M_Effect_New_doc[] = "New(name) : creates a new part object and adds it to the given mesh object\n"; -static char M_Effect_Get_doc[] = "xxx"; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Particle module: */ -/*****************************************************************************/ -static struct PyMethodDef M_Particle_methods[] = { - {"New", ( PyCFunction ) M_Effect_New, METH_VARARGS, M_Effect_New_doc}, - {"Get", M_Effect_Get, METH_VARARGS, M_Effect_Get_doc}, - {"get", M_Effect_Get, METH_VARARGS, M_Effect_Get_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Effect methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Effect_methods[] = { - {"getType", ( PyCFunction ) Effect_getType, - METH_NOARGS, "() - Return Effect type"}, - {"setType", ( PyCFunction ) Effect_oldsetType, - METH_VARARGS, "() - Set Effect type"}, - {"getStype", ( PyCFunction ) Effect_getStype, - METH_NOARGS, "() - Return Effect stype"}, - {"setStype", ( PyCFunction ) Effect_oldsetStype, - METH_VARARGS, "() - Set Effect stype"}, - {"getFlag", ( PyCFunction ) Effect_getFlag, - METH_NOARGS, "() - Return Effect flag"}, - {"setFlag", ( PyCFunction ) Effect_oldsetFlag, - METH_VARARGS, "() - Set Effect flag"}, - {"getStartTime", ( PyCFunction ) Effect_getSta, - METH_NOARGS, "()-Return particle start time"}, - {"setStartTime", ( PyCFunction ) Effect_oldsetSta, METH_VARARGS, - "()- Sets particle start time"}, - {"getEndTime", ( PyCFunction ) Effect_getEnd, - METH_NOARGS, "()-Return particle end time"}, - {"setEndTime", ( PyCFunction ) Effect_oldsetEnd, METH_VARARGS, - "()- Sets particle end time"}, - {"getLifetime", ( PyCFunction ) Effect_getLifetime, - METH_NOARGS, "()-Return particle life time"}, - {"setLifetime", ( PyCFunction ) Effect_oldsetLifetime, METH_VARARGS, - "()- Sets particle life time "}, - {"getNormfac", ( PyCFunction ) Effect_getNormfac, - METH_NOARGS, "()-Return particle life time"}, - {"setNormfac", ( PyCFunction ) Effect_oldsetNormfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getObfac", ( PyCFunction ) Effect_getObfac, - METH_NOARGS, "()-Return particle life time"}, - {"setObfac", ( PyCFunction ) Effect_oldsetObfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getRandfac", ( PyCFunction ) Effect_getRandfac, - METH_NOARGS, "()-Return particle life time"}, - {"setRandfac", ( PyCFunction ) Effect_oldsetRandfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getTexfac", ( PyCFunction ) Effect_getTexfac, - METH_NOARGS, "()-Return particle life time"}, - {"setTexfac", ( PyCFunction ) Effect_oldsetTexfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getRandlife", ( PyCFunction ) Effect_getRandlife, - METH_NOARGS, "()-Return particle life time"}, - {"setRandlife", ( PyCFunction ) Effect_oldsetRandlife, METH_VARARGS, - "()- Sets particle life time "}, - {"getNabla", ( PyCFunction ) Effect_getNabla, - METH_NOARGS, "()-Return particle life time"}, - {"setNabla", ( PyCFunction ) Effect_oldsetNabla, METH_VARARGS, - "()- Sets particle life time "}, - {"getVectsize", ( PyCFunction ) Effect_getVectsize, - METH_NOARGS, "()-Return particle life time"}, - {"setVectsize", ( PyCFunction ) Effect_oldsetVectsize, METH_VARARGS, - "()- Sets particle life time "}, - {"getTotpart", ( PyCFunction ) Effect_getTotpart, - METH_NOARGS, "()-Return particle life time"}, - {"setTotpart", ( PyCFunction ) Effect_oldsetTotpart, METH_VARARGS, - "()- Sets particle life time "}, - {"getTotkey", ( PyCFunction ) Effect_getTotkey, - METH_NOARGS, "()-Return the number of key positions."}, - {"setTotkey", ( PyCFunction ) Effect_oldsetTotkey, METH_VARARGS, - "()-Set the number of key positions. "}, - {"getSeed", ( PyCFunction ) Effect_getSeed, - METH_NOARGS, "()-Return particle life time"}, - {"setSeed", ( PyCFunction ) Effect_oldsetSeed, METH_VARARGS, - "()- Sets particle life time "}, - {"getForce", ( PyCFunction ) Effect_getForce, - METH_NOARGS, "()-Return particle life time"}, - {"setForce", ( PyCFunction ) Effect_oldsetForce, METH_VARARGS, - "()- Sets particle life time "}, - {"getMult", ( PyCFunction ) Effect_getMult, - METH_NOARGS, "()-Return particle life time"}, - {"setMult", ( PyCFunction ) Effect_oldsetMult, METH_VARARGS, - "()- Sets particle life time "}, - {"getLife", ( PyCFunction ) Effect_getLife, - METH_NOARGS, "()-Return particle life time"}, - {"setLife", ( PyCFunction ) Effect_oldsetLife, METH_VARARGS, - "()- Sets particle life time "}, - {"getMat", ( PyCFunction ) Effect_getChildMat, - METH_NOARGS, "()-Return particle life time"}, - {"setMat", ( PyCFunction ) Effect_oldsetMat, METH_VARARGS, - "()- Sets particle life time "}, - {"getChild", ( PyCFunction ) Effect_getChild, - METH_NOARGS, "()-Return particle life time"}, - {"setChild", ( PyCFunction ) Effect_oldsetChild, METH_VARARGS, - "()- Sets particle life time "}, - {"getDefvec", ( PyCFunction ) Effect_getDefvec, - METH_NOARGS, "()-Return particle life time"}, - {"setDefvec", ( PyCFunction ) Effect_oldsetDefvec, METH_VARARGS, - "()- Sets particle life time "}, - {"getParticlesLoc", ( PyCFunction ) Effect_getParticlesLoc, METH_NOARGS, - "()- Sets particle life time "}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Effect attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Effect_getseters[] = { - {"flag", - (getter)Effect_getFlag, (setter)Effect_setFlag, - "The particle flag bitfield", - NULL}, - {"stype", - (getter)Effect_getStype, (setter)Effect_setStype, - "The particle stype bitfield", - NULL}, - {"disp", - (getter)Effect_getDisp, (setter)Effect_setDisp, - "The particle display value", - NULL}, - {"staticStep", - (getter)Effect_getStaticStep, (setter)Effect_setStaticStep, - "The particle static step value", - NULL}, - {"type", - (getter)Effect_getType, (setter)Effect_setType, - "The effect's type (deprecated)", - NULL}, - {"child", - (getter)Effect_getChild, (setter)Effect_setChild, - "The number of children of a particle that multiply itself", - NULL}, - {"childMat", - (getter)Effect_getChildMat, (setter)Effect_setChildMat, - "Specify the material used for the particles", - NULL}, - {"damping", - (getter)Effect_getDamping, (setter)Effect_setDamping, - "The damping factor", - NULL}, - {"defvec", - (getter)Effect_getDefvec, (setter)Effect_setDefvec, - "The axes of a force, determined by the texture", - NULL}, - {"dispMat", - (getter)Effect_getDispMat, (setter)Effect_setDispMat, - "The material used for the particles", - NULL}, - {"emissionTex", - (getter)Effect_getEmissionTex, (setter)Effect_setEmissionTex, - "The texture used for texture emission", - NULL}, - {"end", - (getter)Effect_getEnd, (setter)Effect_setEnd, - "The endframe for the effect", - NULL}, - {"force", - (getter)Effect_getForce, (setter)Effect_setForce, - "The axes of a continues force", - NULL}, - {"forceTex", - (getter)Effect_getForceTex, (setter)Effect_setForceTex, - "The texture used for force", - NULL}, - {"jitter", - (getter)Effect_getJitter, (setter)Effect_setJitter, - "Jitter table distribution: maximum particles per face", - NULL}, - {"life", - (getter)Effect_getLife, (setter)Effect_setLife, - "The life span of the next generation of particles", - NULL}, - {"lifetime", - (getter)Effect_getLifetime, (setter)Effect_setLifetime, - "The life span of the particles", - NULL}, - {"mult", - (getter)Effect_getMult, (setter)Effect_setMult, - "The probabilities that a \"dying\" particle spawns a new one", - NULL}, - {"nabla", - (getter)Effect_getNabla, (setter)Effect_setNabla, - "The dimension of the area for gradient calculation", - NULL}, - {"normfac", - (getter)Effect_getNormfac, (setter)Effect_setNormfac, - "Particle's starting speed (from the mesh)", - NULL}, - {"obfac", - (getter)Effect_getObfac, (setter)Effect_setObfac, - "Particle's starting speed (from the object)", - NULL}, - {"randfac", - (getter)Effect_getRandfac, (setter)Effect_setRandfac, - "The random variation for the starting speed", - NULL}, - {"randlife", - (getter)Effect_getRandlife, (setter)Effect_setRandlife, - "The random variation for a particle's life", - NULL}, - {"seed", - (getter)Effect_getSeed, (setter)Effect_setSeed, - "The seed for random variations", - NULL}, - {"speedType", - (getter)Effect_getSpeedType, (setter)Effect_setSpeedType, - "Controls which texture property affects particle speeds", - NULL}, - {"speedVGroup", - (getter)Effect_getSpeedVertGroup, (setter)Effect_setSpeedVertGroup, - "Vertex group for speed control", - NULL}, - {"sta", - (getter)Effect_getSta, (setter)Effect_setSta, - "The startframe for the effect", - NULL}, - {"texfac", - (getter)Effect_getTexfac, (setter)Effect_setTexfac, - "Particle's starting speed (from the texture)", - NULL}, - {"totpart", - (getter)Effect_getTotpart, (setter)Effect_setTotpart, - "The total number of particles", - NULL}, - {"totkey", - (getter)Effect_getTotkey, (setter)Effect_setTotkey, - "The total number of key positions", - NULL}, - {"vectsize", - (getter)Effect_getVectsize, (setter)Effect_setVectsize, - "The speed for particle's rotation direction", - NULL}, - {"vGroup", - (getter)Effect_getVertGroup, (setter)Effect_setVertGroup, - "Vertex group for emitted particles", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Effect_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Effect_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Effect", /* char *tp_name; */ - sizeof( BPy_Effect ), /* 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 ) Effect_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 ***/ - BPy_Effect_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Effect_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 -}; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Effect module: */ -/*****************************************************************************/ - -struct PyMethodDef M_Effect_methods[] = { - {"New", ( PyCFunction ) M_Effect_New, METH_VARARGS, NULL}, - {"Get", M_Effect_Get, METH_VARARGS, NULL}, - {"get", M_Effect_Get, METH_VARARGS, NULL}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Function: M_Effect_New */ -/* Python equivalent: Blender.Effect.New */ -/*****************************************************************************/ -PyObject *M_Effect_New( PyObject * self, PyObject * args ) -{ - Effect *bleffect = 0; - Object *ob; - char *name = NULL; - - if( !PyArg_ParseTuple( args, "s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - for( ob = G.main->object.first; ob; ob = ob->id.next ) - if( !strcmp( name, ob->id.name + 2 ) ) - break; - - if( !ob ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object does not exist" ); - - if( ob->type != OB_MESH ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object is not a mesh" ); - - bleffect = add_effect( EFF_PARTICLE ); - if( !bleffect ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Effect Data in Blender" ); - - BLI_addtail( &ob->effect, bleffect ); - - return EffectCreatePyObject( bleffect, ob ); -} - -/*****************************************************************************/ -/* Function: M_Effect_Get */ -/* Python equivalent: Blender.Effect.Get */ -/*****************************************************************************/ -PyObject *M_Effect_Get( PyObject * self, PyObject * args ) -{ - /*arguments : string object name - int : position of effect in the obj's effect list */ - char *name = NULL; - Object *object_iter; - Effect *eff; - int num = -1, i; - - if( !PyArg_ParseTuple( args, "|si", &name, &num ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string int argument" ) ); - - object_iter = G.main->object.first; - - if( !object_iter ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "Scene contains no object" ) ); - - if( name ) { /* (name, num = -1) - try to find the given object */ - - while( object_iter ) { - - if( !strcmp( name, object_iter->id.name + 2 ) ) { - - eff = object_iter->effect.first; /*can be NULL: None will be returned*/ - - if (num >= 0) { /* return effect in given num position if available */ - - for( i = 0; i < num; i++ ) { - if (!eff) break; - eff = eff->next; - } - - if (eff) { - return EffectCreatePyObject( eff, object_iter ); - } else { /* didn't find any effect in the given position */ - Py_RETURN_NONE; - } - } - - else {/*return a list with all effects linked to the given object*/ - /* this was pointed by Stephen Swaney */ - PyObject *effectlist = PyList_New( 0 ); - - while (eff) { - PyObject *found_eff = EffectCreatePyObject( eff, - object_iter ); - PyList_Append( effectlist, found_eff ); - Py_DECREF( found_eff ); /* PyList_Append incref'ed it */ - eff = eff->next; - } - return effectlist; - } - } - - object_iter = object_iter->id.next; - } - - if (!object_iter) - return EXPP_ReturnPyObjError (PyExc_AttributeError, - "no such object"); - } - - else { /* () - return a list with all effects currently in Blender */ - PyObject *effectlist = PyList_New( 0 ); - - while( object_iter ) { - if( object_iter->effect.first != NULL ) { - eff = object_iter->effect.first; - while( eff ) { - PyObject *found_eff = EffectCreatePyObject( eff, - object_iter ); - PyList_Append( effectlist, found_eff ); - Py_DECREF( found_eff ); - eff = eff->next; - } - } - object_iter = object_iter->id.next; - } - return effectlist; - } - Py_INCREF( Py_None ); - return Py_None; -} - -/* create the Blender.Effect.Flags constant dict */ - -static PyObject *Effect_FlagsDict( void ) -{ - PyObject *Flags = PyConstant_New( ); - - if( Flags ) { - BPy_constant *c = ( BPy_constant * ) Flags; - - PyConstant_Insert( c, "SELECTED", - PyInt_FromLong( EFF_SELECT ) ); - PyConstant_Insert( c, "BSPLINE", - PyInt_FromLong( PAF_BSPLINE ) ); - PyConstant_Insert( c, "STATIC", - PyInt_FromLong( PAF_STATIC ) ); - PyConstant_Insert( c, "FACES", - PyInt_FromLong( PAF_FACE ) ); - PyConstant_Insert( c, "ANIMATED", - PyInt_FromLong( PAF_ANIMATED ) ); - PyConstant_Insert( c, "UNBORN", - PyInt_FromLong( PAF_UNBORN ) ); - PyConstant_Insert( c, "VERTS", - PyInt_FromLong( PAF_OFACE ) ); - PyConstant_Insert( c, "EMESH", - PyInt_FromLong( PAF_SHOWE ) ); - PyConstant_Insert( c, "TRUERAND", - PyInt_FromLong( PAF_TRAND ) ); - PyConstant_Insert( c, "EVENDIST", - PyInt_FromLong( PAF_EDISTR ) ); - PyConstant_Insert( c, "DIED", - PyInt_FromLong( PAF_DIED ) ); - } - return Flags; -} - -static PyObject *Effect_SpeedTypeDict( void ) -{ - PyObject *Type = PyConstant_New( ); - - if( Type ) { - BPy_constant *c = ( BPy_constant * ) Type; - - PyConstant_Insert( c, "INTENSITY", - PyInt_FromLong( EXPP_EFFECT_SPEEDTYPE_INTENSITY ) ); - PyConstant_Insert( c, "RGB", - PyInt_FromLong( EXPP_EFFECT_SPEEDTYPE_RGB ) ); - PyConstant_Insert( c, "GRADIENT", - PyInt_FromLong( EXPP_EFFECT_SPEEDTYPE_GRADIENT ) ); - } - return Type; -} - -/*****************************************************************************/ -/* Function: Effect_Init */ -/*****************************************************************************/ - -PyObject *Effect_Init( void ) -{ - PyObject *submodule, *dict; - PyObject *particle; - PyObject *Flags; - PyObject *Types; - - if( PyType_Ready( &Effect_Type ) < 0) - return NULL; - - Flags = Effect_FlagsDict( ); - Types = Effect_SpeedTypeDict( ); - - submodule = Py_InitModule3( "Blender.Effect", M_Effect_methods, 0 ); - if( Flags ) - PyModule_AddObject( submodule, "Flags", Flags ); - if( Types ) - PyModule_AddObject( submodule, "SpeedTypes", Types ); - - particle = Py_InitModule3( "Blender.Particle", M_Particle_methods, - M_Particle_doc ); - - dict = PyModule_GetDict( submodule ); - - PyDict_SetItemString( dict, "Particle", particle ); - return ( submodule ); -} - -/*****************************************************************************/ -/* Python BPy_Effect methods: */ -/*****************************************************************************/ - -static PyObject *Effect_getType( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long ) self->effect->type ); -} - -/* does nothing since there is only one type of effect */ - -static int Effect_setType( void ) -{ - return 0; -} - -static int Effect_setStype( BPy_Effect * self, PyObject * args ) -{ - short param; - if( !PyArg_Parse( args, "h", ¶m ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int as argument" ); - self->effect->stype = param; - return 0; -} - -static PyObject *Effect_getStype( BPy_Effect * self ) -{ - return PyInt_FromLong( (long)( self->effect->stype ) ); -} - -static PyObject *Effect_getFlag( BPy_Effect * self ) -{ - return PyInt_FromLong( (long)( self->effect->flag ^ PAF_OFACE ) ); -} - -static int Effect_setFlag( BPy_Effect * self, PyObject * args ) -{ - short param; - static short bitmask = PAF_BSPLINE | PAF_STATIC | PAF_FACE | PAF_ANIMATED | - PAF_UNBORN | PAF_OFACE | PAF_SHOWE | PAF_TRAND | PAF_EDISTR | PAF_DIED; - - if( !PyArg_Parse( args, "h", ¶m ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int as argument" ); - - /* we don't allow users to change the select bit at this time */ - param &= ~EFF_SELECT; - - if ( ( param & bitmask ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - /* the sense of "Verts" is inverted (clear is enabled) */ - param ^= PAF_OFACE; - - /* leave select bit alone, and add in the others */ - self->effect->flag &= EFF_SELECT; - self->effect->flag |= param; - return 0; -} - -static PyObject *Effect_getSta( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->sta ); -} - -static int Effect_setSta( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->sta, - EXPP_EFFECT_STA_MIN, MAXFRAMEF ); -} - -static PyObject *Effect_getEnd( BPy_Effect * self ) -{ - return PyFloat_FromDouble( ((PartEff *) self->effect)->end ); -} - -static int Effect_setEnd( BPy_Effect * self, PyObject * args ) -{ - float val; - - if( !PyArg_Parse( args, "f", &val ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected float argument" ); - - self->effect->end = EXPP_ClampFloat( val, - EXPP_EFFECT_END_MIN, MAXFRAMEF ); - return 0; -} - -static PyObject *Effect_getLifetime( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->lifetime ); -} - -static int Effect_setLifetime( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->lifetime, - EXPP_EFFECT_LIFETIME_MIN, MAXFRAMEF ); -} - -static PyObject *Effect_getNormfac( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->normfac ); -} - -static int Effect_setNormfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->normfac, - EXPP_EFFECT_NORMFAC_MIN, EXPP_EFFECT_NORMFAC_MAX ); -} - -static PyObject *Effect_getObfac( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->obfac ); -} - -static int Effect_setObfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->obfac, - EXPP_EFFECT_OBFAC_MIN, EXPP_EFFECT_OBFAC_MAX ); -} - -static PyObject *Effect_getRandfac( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->randfac ); -} - -static int Effect_setRandfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->randfac, - EXPP_EFFECT_RANDFAC_MIN, EXPP_EFFECT_RANDFAC_MAX ); -} - -static PyObject *Effect_getTexfac( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->texfac ); -} - -static int Effect_setTexfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->texfac, - EXPP_EFFECT_TEXFAC_MIN, EXPP_EFFECT_TEXFAC_MAX ); -} - -static PyObject *Effect_getRandlife( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->randlife ); -} - -static int Effect_setRandlife( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->randlife, - EXPP_EFFECT_RANDLIFE_MIN, EXPP_EFFECT_RANDLIFE_MAX ); -} - -static PyObject *Effect_getNabla( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->nabla ); -} - -static int Effect_setNabla( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->nabla, - EXPP_EFFECT_NABLA_MIN, EXPP_EFFECT_NABLA_MAX ); -} - -static PyObject *Effect_getVectsize( BPy_Effect * self ) -{ - return PyFloat_FromDouble( self->effect->vectsize ); -} - -static int Effect_setVectsize( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->vectsize, - EXPP_EFFECT_VECTSIZE_MIN, EXPP_EFFECT_VECTSIZE_MAX ); -} - -static PyObject *Effect_getTotpart( BPy_Effect * self ) -{ - return PyInt_FromLong( self->effect->totpart ); -} - -static int Effect_setTotpart( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueClamped( args, &self->effect->totpart, - (int)EXPP_EFFECT_TOTPART_MIN, (int)EXPP_EFFECT_TOTPART_MAX, 'i' ); -} - -static PyObject *Effect_getTotkey( BPy_Effect * self ) -{ - return PyInt_FromLong( self->effect->totkey ); -} - -static int Effect_setTotkey( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueClamped( args, &self->effect->totkey, - EXPP_EFFECT_TOTKEY_MIN, EXPP_EFFECT_TOTKEY_MAX, 'i' ); -} - -static PyObject *Effect_getSeed( BPy_Effect * self ) -{ - return PyInt_FromLong( self->effect->seed ); -} - -static int Effect_setSeed( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueClamped( args, &self->effect->seed, - EXPP_EFFECT_SEED_MIN, EXPP_EFFECT_SEED_MAX, 'i' ); -} - -static PyObject *Effect_getForce( BPy_Effect * self ) -{ - return Py_BuildValue( "(f,f,f)", self->effect->force[0], - self->effect->force[1], self->effect->force[2] ); -} - -static int Effect_setForce( BPy_Effect * self, PyObject * args ) -{ - float val[3]; - int i; - - if( PyTuple_Check( args ) && PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - - if( !PyArg_ParseTuple( args, "fff", &val[0], &val[1], &val[2] ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected a tuple of three float arguments" ); - for( i = 0; i < 3; ++i ) - self->effect->force[i] = EXPP_ClampFloat( val[i], - EXPP_EFFECT_FORCE_MIN, EXPP_EFFECT_FORCE_MAX ); - return 0; -} - -static PyObject *Effect_getMult( BPy_Effect * self ) -{ - return Py_BuildValue( "(f,f,f,f)", self->effect->mult[0], - self->effect->mult[1], self->effect->mult[2], - self->effect->mult[3] ); -} - -static int Effect_setMult( BPy_Effect * self, PyObject * args ) -{ - float val[4]; - int i; - - if( PyTuple_Check( args ) && PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - - if( !PyArg_ParseTuple( args, "ffff", &val[0], &val[1], &val[2], &val[3] ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected a tuple of four float arguments" ); - for( i = 0; i < 4; ++i ) - self->effect->mult[i] = EXPP_ClampFloat( val[i], - EXPP_EFFECT_MULT_MIN, EXPP_EFFECT_MULT_MAX ); - return 0; -} - -static PyObject *Effect_getLife( BPy_Effect * self ) -{ - return Py_BuildValue( "(f,f,f,f)", self->effect->life[0], - self->effect->life[1], self->effect->life[2], - self->effect->life[3] ); -} - -static int Effect_setLife( BPy_Effect * self, PyObject * args ) -{ - float val[4]; - int i; - - if( PyTuple_Check( args ) && PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - - if( !PyArg_ParseTuple( args, "ffff", &val[0], &val[1], &val[2], &val[3] ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected a tuple of four float arguments" ); - for( i = 0; i < 4; ++i ) - self->effect->life[i] = EXPP_ClampFloat( val[i], - EXPP_EFFECT_LIFE_MIN, MAXFRAMEF ); - return 0; -} - -static PyObject *Effect_getChild( BPy_Effect * self ) -{ - return Py_BuildValue( "(h,h,h,h)", self->effect->child[0], - self->effect->child[1], self->effect->child[2], - self->effect->child[3] ); -} - - -static int Effect_setChild( BPy_Effect * self, PyObject * args ) -{ - short val[4]; - int i; - - if( PyTuple_Check( args ) && PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - - if( !PyArg_ParseTuple( args, "hhhh", &val[0], &val[1], &val[2], &val[3] ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected a tuple of four int argument" ); - for( i = 0; i < 4; ++i ) - self->effect->child[i] = (short)EXPP_ClampInt( val[i], - EXPP_EFFECT_CHILD_MIN, EXPP_EFFECT_CHILD_MAX ); - return 0; -} - -static PyObject *Effect_getChildMat( BPy_Effect * self ) -{ - return Py_BuildValue( "(h,h,h,h)", self->effect->mat[0], - self->effect->mat[1], self->effect->mat[2], - self->effect->mat[3] ); -} - -static int Effect_setChildMat( BPy_Effect * self, PyObject * args ) -{ - short val[4]; - int i; - - if( PyTuple_Check( args ) && PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - - if( !PyArg_ParseTuple( args, "hhhh", &val[0], &val[1], &val[2], &val[3] ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected a tuple of four int argument" ); - for( i = 0; i < 4; ++i ) - self->effect->mat[i] = (short)EXPP_ClampInt( val[i], - EXPP_EFFECT_CHILDMAT_MIN, EXPP_EFFECT_CHILDMAT_MAX ); - return 0; -} - -static PyObject *Effect_getDefvec( BPy_Effect * self ) -{ - return Py_BuildValue( "(f,f,f)", self->effect->defvec[0], - self->effect->defvec[1], self->effect->defvec[2] ); -} - -static int Effect_setDefvec( BPy_Effect * self, PyObject * args ) -{ - float val[3]; - int i; - - if( PyTuple_Check( args ) && PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - - if( !PyArg_ParseTuple( args, "fff", &val[0], &val[1], &val[2] ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected a tuple of three float arguments" ); - - for( i = 0; i < 3; ++i ) - self->effect->defvec[i] = EXPP_ClampFloat( val[i], - EXPP_EFFECT_DEFVEC_MIN, EXPP_EFFECT_DEFVEC_MAX ); - return 0; -} - -static PyObject *Effect_getJitter( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long )self->effect->userjit ); -} - -static int Effect_setJitter( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueClamped( args, &self->effect->userjit, - EXPP_EFFECT_JITTER_MIN, EXPP_EFFECT_JITTER_MAX, 'h' ); -} - -static PyObject *Effect_getDispMat( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long )self->effect->omat ); -} - -static int Effect_setDispMat( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueClamped( args, &self->effect->omat, - EXPP_EFFECT_DISPMAT_MIN, EXPP_EFFECT_DISPMAT_MAX, 'h' ); -} - -static PyObject *Effect_getEmissionTex( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long )self->effect->timetex ); -} - -static int Effect_setEmissionTex( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueClamped( args, &self->effect->timetex, - EXPP_EFFECT_TIMETEX_MIN, EXPP_EFFECT_TIMETEX_MAX, 'h' ); -} - -static PyObject *Effect_getForceTex( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long )self->effect->speedtex ); -} - -static int Effect_setForceTex( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueClamped( args, &self->effect->speedtex, - EXPP_EFFECT_SPEEDTEX_MIN, EXPP_EFFECT_SPEEDTEX_MAX, 'h' ); -} - -static PyObject *Effect_getSpeedType( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long )self->effect->texmap ); -} - -static int Effect_setSpeedType( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueRange( args, &self->effect->texmap, - EXPP_EFFECT_SPEEDTYPE_INTENSITY, EXPP_EFFECT_SPEEDTYPE_GRADIENT, - 'h' ); -} - -static PyObject *Effect_getDamping( BPy_Effect * self ) -{ - return PyFloat_FromDouble( ( double )self->effect->damp ); -} - -static int Effect_setDamping( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setFloatClamped( args, &self->effect->damp, - EXPP_EFFECT_DAMP_MIN, EXPP_EFFECT_DAMP_MAX ); -} - -static PyObject *Effect_getVertGroup( BPy_Effect * self ) -{ - return PyString_FromString( self->effect->vgroupname ); -} - - -static int Effect_setVertGroup( BPy_Effect * self, PyObject * value ) -{ - char *name; - bDeformGroup *dg; - - name = PyString_AsString ( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - - PyOS_snprintf( self->effect->vgroupname, - sizeof( self->effect->vgroupname )-1, "%s", name ); - - dg = get_named_vertexgroup( self->object, self->effect->vgroupname ); - if( dg ) - self->effect->vertgroup = (short)get_defgroup_num( self->object, dg )+1; - else - self->effect->vertgroup = 0; - - return 0; -} - -static PyObject *Effect_getSpeedVertGroup( BPy_Effect * self ) -{ - return PyString_FromString( self->effect->vgroupname_v ); -} - -static int Effect_setSpeedVertGroup( BPy_Effect * self, PyObject * value ) -{ - char *name; - bDeformGroup *dg; - - name = PyString_AsString ( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - - PyOS_snprintf( self->effect->vgroupname_v, - sizeof( self->effect->vgroupname_v )-1, "%s", name ); - - dg = get_named_vertexgroup( self->object, self->effect->vgroupname_v ); - if( dg ) - self->effect->vertgroup_v = (short)get_defgroup_num( self->object, dg )+1; - else - self->effect->vertgroup_v = 0; - - return 0; -} - -/*****************************************************************************/ -/* attribute: getDisp */ -/* Description: the current value of the display number button */ -/* Data: self effect */ -/* Return: integer value between 0 and 100 */ -/*****************************************************************************/ -static PyObject *Effect_getDisp( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long )self->effect->disp ); -} - -static int Effect_setDisp( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setIValueRange( args, &self->effect->disp, - EXPP_EFFECT_DISP_MIN, EXPP_EFFECT_DISP_MAX, 'h' ); -} - -/*****************************************************************************/ -/* attribute: getStep */ -/* Description: the current value of the Step number button */ -/* Data: self effect */ -/* Return: integer value between 1 and 100 */ -/*****************************************************************************/ -static PyObject *Effect_getStaticStep( BPy_Effect * self ) -{ - return PyInt_FromLong( ( long )self->effect->staticstep ); -} - -static int Effect_setStaticStep( BPy_Effect * self , PyObject * args ) -{ - return EXPP_setIValueRange( args, &self->effect->staticstep, - EXPP_EFFECT_STATICSTEP_MIN, EXPP_EFFECT_STATICSTEP_MAX, - 'h' ); -} - -/*****************************************************************************/ -/* Method: getParticlesLoc */ -/* Python equivalent: effect.getParticlesLoc */ -/* Description: Get the current location of each particle */ -/* and return a list of 3D vectors */ -/* or a list of ists of two 3D vectors */ -/* if effect.vect has any sense */ -/* Data: notihng get the current time from G.scene */ -/* Return: One python list of 3D vector */ -/*****************************************************************************/ -static PyObject *Effect_getParticlesLoc( BPy_Effect * self ) -{ - Object *ob; - Effect *eff; - PartEff *paf; - Particle *pa=0; - PyObject *list, *strand_list, *pyvec, *pyvec2; - float p_time, c_time, vec[3], vec1[3], cfra, m_time, s_time; - int a; - short disp=100 ; - - cfra=frame_to_float( G.scene->r.cfra ); - - /* as we need to update the particles system we try to retrieve - the object to which the effect is connected */ - eff =(Effect *) self->effect; - - ob= self->object; - if(!ob) - return ( EXPP_ReturnPyObjError (PyExc_AttributeError, - "Effect has no object" ) ); - /*get the particles data */ - paf= (PartEff *)eff; - - /* particles->disp reduce the display number of particles */ - /* as we want the complete list ... we backup the disp value and restore later */ - if (paf->disp<100) - disp= paf->disp; paf->disp=100; - - - build_particle_system(ob); - pa= paf->keys; - - if(!pa) - return ( EXPP_ReturnPyObjError (PyExc_AttributeError, - "Particles Location : no Keys" ) ); - - /* if object is in motion */ - if( ob->ipoflag & OB_OFFS_PARTICLE ) - p_time= ob->sf; - else - p_time= 0.0; - - list = PyList_New( 0 ); - if( !list ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, "PyList() failed" ); - - c_time= bsystem_time( ob, cfra, p_time ); - - for( a=0; a < paf->totpart; a++, pa += paf->totkey ) { - - if(paf->flag & PAF_STATIC ) { - strand_list = PyList_New( 0 ); - m_time= pa->time+pa->lifetime+paf->staticstep-1; - for(c_time= pa->time; c_timestaticstep) { - where_is_particle(paf, pa, c_time, vec); - MTC_Mat4MulVecfl(ob->obmat, vec); /* make worldspace like the others */ - pyvec = newVectorObject(vec, 3, Py_NEW); - if( PyList_Append( strand_list, pyvec) < 0 ) { - Py_DECREF( list ); - Py_DECREF( strand_list ); - Py_XDECREF( pyvec ); - - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Couldn't append item to PyList" ); - } - Py_DECREF( pyvec ); - - } - - if( PyList_Append( list, strand_list) < 0 ) { - Py_DECREF( list ); - Py_DECREF( strand_list ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Couldn't append item to PyList" ); - } - Py_DECREF( strand_list ); - } else { - if(c_time > pa->time && c_time < pa->time+pa->lifetime ) { - /* vector particles are a tuple of 2 vectors */ - if( paf->stype==PAF_VECT ) { - s_time= c_time; - p_time= c_time+1.0f; - if(c_time < pa->time) { - if(paf->flag & PAF_UNBORN) - p_time= pa->time+1.0f; - else - continue; - } - if(c_time > pa->time+pa->lifetime) { - if(paf->flag & PAF_DIED) - s_time= pa->time+pa->lifetime-1.0f; - else - continue; - } - where_is_particle(paf, pa, s_time, vec); - where_is_particle(paf, pa, p_time, vec1); - pyvec = newVectorObject(vec, 3, Py_NEW); - pyvec2 = newVectorObject(vec1, 3, Py_NEW); - if( PyList_Append( list, Py_BuildValue("[OO]", pyvec, pyvec2)) < 0 ) { - Py_DECREF( list ); - Py_XDECREF( pyvec ); - Py_XDECREF( pyvec2 ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Couldn't append item to PyList" ); - } - Py_DECREF( pyvec ); - Py_DECREF( pyvec2 ); - } else { /* not a vector */ - where_is_particle(paf, pa, c_time, vec); - pyvec = newVectorObject(vec, 3, Py_NEW); - if( PyList_Append( list, pyvec) < 0 ) { - Py_DECREF( list ); - Py_XDECREF( pyvec ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Couldn't append item to PyList" ); - } - Py_DECREF( pyvec ); - } - } - } - } - - /* restore the real disp value */ - if (disp<100){ - paf->disp=disp; - build_particle_system(ob); - } - - return list; -} - -/*****************************************************************************/ -/* Function: Effect_repr */ -/* Description: This is a callback function for the BPy_Effect type. It */ -/* builds a meaninful string to represent effcte objects. */ -/*****************************************************************************/ - -static PyObject *Effect_repr( void ) -{ - return PyString_FromString( "Particle" ); -} - -/*****************************************************************************/ -/* These are needed by Object.c */ -/*****************************************************************************/ -PyObject *EffectCreatePyObject( Effect * effect, Object *ob ) -{ - BPy_Effect *blen_object; - - blen_object = - ( BPy_Effect * ) PyObject_NEW( BPy_Effect, &Effect_Type ); - - if( blen_object ) - blen_object->effect = (PartEff *)effect; - blen_object->object = ob; - - return ( PyObject * ) blen_object; -} - -int EffectCheckPyObject( PyObject * py_obj ) -{ - return ( py_obj->ob_type == &Effect_Type ); -} - -/* #####DEPRECATED###### */ - -static PyObject *Effect_oldsetChild( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Effect_setChild ); -} - -static PyObject *Effect_oldsetDefvec( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Effect_setDefvec ); -} - -static PyObject *Effect_oldsetForce( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Effect_setForce ); -} - -static PyObject *Effect_oldsetMat( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Effect_setChildMat ); -} - -static PyObject *Effect_oldsetEnd( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setEnd ); -} - -static PyObject *Effect_oldsetLife( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Effect_setLife ); -} - -static PyObject *Effect_oldsetLifetime( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setLifetime ); -} - -static PyObject *Effect_oldsetMult( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Effect_setMult ); -} - -static PyObject *Effect_oldsetNabla( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setNabla ); -} - -static PyObject *Effect_oldsetNormfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setNormfac ); -} - -static PyObject *Effect_oldsetObfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setObfac ); -} - -static PyObject *Effect_oldsetRandfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setRandfac ); -} - -static PyObject *Effect_oldsetRandlife( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setRandlife ); -} - -static PyObject *Effect_oldsetSeed( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setSeed ); -} - -static PyObject *Effect_oldsetSta( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setSta ); -} - -static PyObject *Effect_oldsetTexfac( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setTexfac ); -} - -static PyObject *Effect_oldsetTotkey( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setTotkey ); -} - -static PyObject *Effect_oldsetTotpart( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setTotpart ); -} - -static PyObject *Effect_oldsetVectsize( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setVectsize ); -} - -static PyObject *Effect_oldsetFlag( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setFlag ); -} - -static PyObject *Effect_oldsetStype( BPy_Effect * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Effect_setStype ); -} - -static PyObject *Effect_oldsetType( void ) -{ - return EXPP_incr_ret( Py_None ); -} diff --git a/source/blender/python/api2_2x/Effect.h b/source/blender/python/api2_2x/Effect.h deleted file mode 100644 index 86996b9f8a6..00000000000 --- a/source/blender/python/api2_2x/Effect.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * $Id: Effect.h 5817 2005-11-17 19:19:05Z khughes $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_EFFECT_H -#define EXPP_EFFECT_H - -#include -#include "DNA_effect_types.h" -#include "DNA_object_types.h" - -extern PyTypeObject Effect_Type; - -#define BPy_Effect_Check(v) ((v)->ob_type==&Effect_Type) - -/* Python BPy_Effect structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - PartEff * effect; - Object * object; -} BPy_Effect; - -/*****************************************************************************/ -/* Python Effect_Type helpder function prototypes: */ -/*****************************************************************************/ -PyObject *Effect_Init( void ); -int EffectCheckPyObject( PyObject * py_obj ); -PyObject *EffectCreatePyObject( Effect * eff, Object * ob ); - -#endif /* EXPP_EFFECT_H */ diff --git a/source/blender/python/api2_2x/Font.c b/source/blender/python/api2_2x/Font.c deleted file mode 100644 index 61edac2841a..00000000000 --- a/source/blender/python/api2_2x/Font.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joilnen Leite - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Font.h" /*This must come first*/ - -#include "DNA_packedFile_types.h" -#include "BKE_packedFile.h" -#include "BKE_global.h" -#include "BKE_library.h" /* for rename_id() */ -#include "BLI_blenlib.h" -#include "gen_utils.h" -#include "gen_library.h" - -#include "BKE_main.h" /* so we can access G.main->vfont.first */ -#include "DNA_space_types.h" /* for FILE_MAXDIR only */ - -extern PyObject *M_Text3d_LoadFont( PyObject * self, PyObject * args ); - -/*--------------------Python API function prototypes for the Font module----*/ -static PyObject *M_Font_Load( PyObject * self, PyObject * value ); -static PyObject *M_Font_Get( PyObject * self, PyObject * args ); - -/*------------------------Python API Doc strings for the Font module--------*/ -char M_Font_doc[] = "The Blender Font module\n\n\ -This module provides control over **Font Data** objects in Blender.\n\n\ -Example::\n\n\ - from Blender import Text3d.Font\n\ - l = Text3d.Font.Load('/usr/share/fonts/verdata.ttf')\n"; -char M_Font_Get_doc[] = "(name) - return an existing font called 'name'\ -when no argument is given it returns a list of blenders fonts."; -char M_Font_Load_doc[] = - "(filename) - return font from file filename as Font Object, \ -returns None if not found.\n"; - -/*----- Python method structure definition for Blender.Text3d.Font module---*/ -struct PyMethodDef M_Font_methods[] = { - {"Get", ( PyCFunction ) M_Font_Get, METH_VARARGS, M_Font_Get_doc}, - {"Load", ( PyCFunction ) M_Font_Load, METH_O, M_Font_Load_doc}, - {NULL, NULL, 0, NULL} -}; - -/*--------------- Python BPy_Font methods declarations:-------------------*/ -static PyObject *Font_pack( BPy_Font * self ); -static PyObject *Font_unpack( BPy_Font * self, PyObject * args ); - -/*--------------- Python BPy_Font methods table:--------------------------*/ -static PyMethodDef BPy_Font_methods[] = { - {"pack", ( PyCFunction ) Font_pack, METH_NOARGS, - "() - pack this Font"}, - {"unpack", ( PyCFunction ) Font_unpack, METH_O, - "(mode) - unpack this packed font"}, - {NULL, NULL, 0, NULL} -}; - -/*--------------- Python TypeFont callback function prototypes----------*/ -static int Font_compare( BPy_Font * a1, BPy_Font * a2 ); -static PyObject *Font_repr( BPy_Font * font ); - - -/*--------------- Python Font Module methods------------------------*/ - -/*--------------- Blender.Text3d.Font.Get()-----------------------*/ -static PyObject *M_Font_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - VFont *vfont_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - vfont_iter = G.main->vfont.first; - - if( name ) { /* (name) - Search font by name */ - - BPy_Font *wanted_vfont = NULL; - - while(vfont_iter) { - if( strcmp( name, vfont_iter->id.name + 2 ) == 0 ) { - wanted_vfont = - ( BPy_Font * ) - Font_CreatePyObject( vfont_iter ); - break; - } - vfont_iter = vfont_iter->id.next; - } - - if( wanted_vfont == NULL ) { /* Requested font doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Font \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return ( PyObject * ) wanted_vfont; - } - - else { /* () - return a list of all fonts in the scene */ - int index = 0; - PyObject *vfontlist, *pyobj; - - vfontlist = PyList_New( BLI_countlist( &( G.main->vfont ) ) ); - - if( vfontlist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create font list" ) ); - - while( vfont_iter ) { - pyobj = Font_CreatePyObject( vfont_iter ); - - if( !pyobj ) { - Py_DECREF(vfontlist); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create Object" ) ); - } - PyList_SET_ITEM( vfontlist, index, pyobj ); - - vfont_iter = vfont_iter->id.next; - index++; - } - - return vfontlist; - } -} - - -/*--------------- Blender.Text3d.Font.New()-----------------------*/ -PyObject *M_Font_Load( PyObject * self, PyObject * value ) -{ - char *filename_str = PyString_AsString(value); - BPy_Font *py_font = NULL; /* for Font Data object wrapper in Python */ - - if( !value ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string or empty argument" ) ); - - /*create python font*/ - if( !S_ISDIR(BLI_exist(filename_str)) ) { - py_font= (BPy_Font *) M_Text3d_LoadFont (self, value); - } - else - Py_RETURN_NONE; - return ( PyObject * ) py_font; -} - -/*--------------- Python BPy_Font getsetattr funcs ---------------------*/ - - -/*--------------- BPy_Font.filename-------------------------------------*/ -static PyObject *Font_getFilename( BPy_Font * self ) -{ - return PyString_FromString( self->font->name ); -} - -static int Font_setFilename( BPy_Font * self, PyObject * value ) -{ - char *name = NULL; - - /* max len is FILE_MAXDIR = 160 chars like done in DNA_image_types.h */ - - name = PyString_AsString ( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - - PyOS_snprintf( self->font->name, FILE_MAXDIR * sizeof( char ), "%s", - name ); - - return 0; -} - -/*--------------- BPy_Font.pack()---------------------------------*/ -static PyObject *Font_pack( BPy_Font * self ) -{ - if( !self->font->packedfile ) - self->font->packedfile = newPackedFile(self->font->name); - Py_RETURN_NONE; -} - -/*--------------- BPy_Font.unpack()---------------------------------*/ -static PyObject *Font_unpack( BPy_Font * self, PyObject * value ) -{ - int mode= PyInt_AsLong(value); - VFont *font= self->font; - - if( mode==-1 ) - return ( EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "expected int argument from Blender.UnpackModes" ) ); - - if (font->packedfile) - if (unpackVFont(font, mode) == RET_ERROR) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "error unpacking font" ); - - Py_RETURN_NONE; -} - -/*--------------- BPy_Font.packed---------------------------------*/ -static PyObject *Font_getPacked( BPy_Font * self ) -{ - if (G.fileflags & G_AUTOPACK) - return EXPP_incr_ret_True(); - else - return EXPP_incr_ret_False(); -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Font_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"filename", - (getter)Font_getFilename, (setter)Font_setFilename, - "Font filepath", - NULL}, - {"packed", - (getter)Font_getPacked, (setter)NULL, - "Packed status", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python TypeFont structure definition: */ -/*****************************************************************************/ -PyTypeObject Font_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Font", /* char *tp_name; */ - sizeof( BPy_Font ), /* 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; */ - ( cmpfunc ) Font_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Font_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Font_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Font_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 -}; - - - - - - -/*--------------- Font Module Init-----------------------------*/ -PyObject *Font_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &Font_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Text3d.Font", - M_Font_methods, M_Font_doc ); - - return ( submodule ); -} - -/*--------------- Font module internal callbacks-----------------*/ -/*---------------BPy_Font internal callbacks/methods-------------*/ - -/*--------------- repr---------------------------------------------*/ -static PyObject *Font_repr( BPy_Font * self ) -{ - if( self->font ) - return PyString_FromFormat( "[Font \"%s\"]", - self->font->id.name+2 ); - else - return PyString_FromString( "[Font - no data]" ); -} - -/*--------------- compare------------------------------------------*/ -static int Font_compare( BPy_Font * a, BPy_Font * b ) -{ - return ( a->font == b->font ) ? 0 : -1; -} - -/*--------------- Font_CreatePyObject---------------------------------*/ -PyObject *Font_CreatePyObject( struct VFont * font ) -{ - BPy_Font *blen_font; - - blen_font = ( BPy_Font * ) PyObject_NEW( BPy_Font, &Font_Type ); - - blen_font->font = font; - - return ( ( PyObject * ) blen_font ); -} - -/*--------------- Font_FromPyObject---------------------------------*/ -struct VFont *Font_FromPyObject( PyObject * py_obj ) -{ - BPy_Font *blen_obj; - - blen_obj = ( BPy_Font * ) py_obj; - if( !( ( BPy_Font * ) py_obj )->font ) { /*test to see if linked to text3d*/ - //use python vars - return NULL; - } else { - return ( blen_obj->font ); - } -} - - - diff --git a/source/blender/python/api2_2x/Font.h b/source/blender/python/api2_2x/Font.h deleted file mode 100644 index 75867c5b6e7..00000000000 --- a/source/blender/python/api2_2x/Font.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * $Id: Font.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joilnen Leite - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_FONT_H -#define EXPP_FONT_H - -#include -#include "DNA_vfont_types.h" - -extern PyTypeObject Font_Type; - -typedef struct { - PyObject_HEAD /* required py macro */ - VFont * font; /* libdata must be second */ -} BPy_Font; - -/*------------------------------visible prototypes----------------------*/ -PyObject *Font_CreatePyObject( struct VFont * font ); -struct VFont *Font_FromPyObject( PyObject * py_obj ); -PyObject *Font_Init( void ); - -#endif - - diff --git a/source/blender/python/api2_2x/Geometry.c b/source/blender/python/api2_2x/Geometry.c deleted file mode 100644 index 909e6e449cb..00000000000 --- a/source/blender/python/api2_2x/Geometry.c +++ /dev/null @@ -1,428 +0,0 @@ -/* - * $Id: Geometry.c 12867 2007-12-13 15:06:02Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert, Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Geometry.h" - -/* - Not needed for now though other geometry functions will probably need them -#include "BLI_arithb.h" -#include "BKE_utildefines.h" -*/ - -/* Used for PolyFill */ -#include "BKE_displist.h" -#include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" - -/* needed for EXPP_ReturnPyObjError and EXPP_check_sequence_consistency */ -#include "gen_utils.h" - -#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 - -/*-- 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} -}; -/*----------------------------MODULE INIT-------------------------*/ -PyObject *Geometry_Init(void) -{ - PyObject *submodule; - - submodule = Py_InitModule3("Blender.Geometry", - M_Geometry_methods, M_Geometry_doc); - return (submodule); -} - -/*----------------------------------Geometry.PolyFill() -------------------*/ -/* PolyFill function, uses Blenders scanfill to fill multiple poly lines */ -static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq ) -{ - PyObject *tri_list; /*return this list of tri's */ - PyObject *polyLine, *polyVec; - int i, len_polylines, len_polypoints; - - /* display listbase */ - ListBase dispbase={NULL, NULL}; - DispList *dl; - float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */ - int index, *dl_face, totpoints=0; - - - dispbase.first= dispbase.last= NULL; - - - if(!PySequence_Check(polyLineSeq)) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of poly lines" ); - } - - len_polylines = PySequence_Size( polyLineSeq ); - - for( i = 0; i < len_polylines; ++i ) { - polyLine= PySequence_GetItem( polyLineSeq, i ); - if (!PySequence_Check(polyLine)) { - freedisplist(&dispbase); - Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "One or more of the polylines is not a sequence of Mathutils.Vector's" ); - } - - len_polypoints= PySequence_Size( polyLine ); - if (len_polypoints>0) { /* dont bother adding edges as polylines */ - if (EXPP_check_sequence_consistency( polyLine, &vector_Type ) != 1) { - freedisplist(&dispbase); - Py_DECREF(polyLine); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "A point in one of the polylines is not a Mathutils.Vector type" ); - } - - dl= MEM_callocN(sizeof(DispList), "poly disp"); - BLI_addtail(&dispbase, dl); - dl->type= DL_INDEX3; - dl->nr= len_polypoints; - dl->type= DL_POLY; - dl->parts= 1; /* no faces, 1 edge loop */ - dl->col= 0; /* no material */ - dl->verts= fp= MEM_callocN( sizeof(float)*3*len_polypoints, "dl verts"); - dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index"); - - for( index = 0; indexvec[0]; - fp[1] = ((VectorObject *)polyVec)->vec[1]; - if( ((VectorObject *)polyVec)->size > 2 ) - fp[2] = ((VectorObject *)polyVec)->vec[2]; - else - fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */ - - totpoints++; - Py_DECREF(polyVec); - } - } - Py_DECREF(polyLine); - } - - if (totpoints) { - /* now make the list to return */ - filldisplist(&dispbase, &dispbase); - - /* The faces are stored in a new DisplayList - thats added to the head of the listbase */ - dl= dispbase.first; - - tri_list= PyList_New(dl->parts); - if( !tri_list ) { - freedisplist(&dispbase); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Geometry.PolyFill failed to make a new list" ); - } - - index= 0; - dl_face= dl->index; - while(index < dl->parts) { - PyList_SetItem(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]) ); - dl_face+= 3; - index++; - } - freedisplist(&dispbase); - } else { - /* no points, do this so scripts dont barf */ - tri_list= PyList_New(0); - } - - return tri_list; -} - - -static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args ) -{ - VectorObject *line_a1, *line_a2, *line_b1, *line_b2; - float a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y, xi, yi, a1,a2,b1,b2, newvec[2]; - if( !PyArg_ParseTuple ( args, "O!O!O!O!", - &vector_Type, &line_a1, - &vector_Type, &line_a2, - &vector_Type, &line_b1, - &vector_Type, &line_b2) - ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected 4 vector types\n" ) ); - - a1x= line_a1->vec[0]; - a1y= line_a1->vec[1]; - a2x= line_a2->vec[0]; - a2y= line_a2->vec[1]; - - b1x= line_b1->vec[0]; - b1y= line_b1->vec[1]; - b2x= line_b2->vec[0]; - b2y= line_b2->vec[1]; - - if((MIN2(a1x, a2x) > MAX2(b1x, b2x)) || - (MAX2(a1x, a2x) < MIN2(b1x, b2x)) || - (MIN2(a1y, a2y) > MAX2(b1y, b2y)) || - (MAX2(a1y, a2y) < MIN2(b1y, b2y)) ) { - Py_RETURN_NONE; - } - /* Make sure the hoz/vert line comes first. */ - if (fabs(b1x - b2x) < eul || fabs(b1y - b2y) < eul) { - SWAP_FLOAT(a1x, b1x, xi); /*abuse xi*/ - SWAP_FLOAT(a1y, b1y, xi); - SWAP_FLOAT(a2x, b2x, xi); - SWAP_FLOAT(a2y, b2y, xi); - } - - if (fabs(a1x-a2x) < eul) { /* verticle line */ - if (fabs(b1x-b2x) < eul){ /*verticle second line */ - Py_RETURN_NONE; /* 2 verticle lines dont intersect. */ - } - else if (fabs(b1y-b2y) < eul) { - /*X of vert, Y of hoz. no calculation needed */ - newvec[0]= a1x; - newvec[1]= b1y; - return newVectorObject(newvec, 2, Py_NEW); - } - - yi = (float)(((b1y / fabs(b1x - b2x)) * fabs(b2x - a1x)) + ((b2y / fabs(b1x - b2x)) * fabs(b1x - a1x))); - - if (yi > MAX2(a1y, a2y)) {/* New point above seg1's vert line */ - Py_RETURN_NONE; - } else if (yi < MIN2(a1y, a2y)) { /* New point below seg1's vert line */ - Py_RETURN_NONE; - } - newvec[0]= a1x; - newvec[1]= yi; - return newVectorObject(newvec, 2, Py_NEW); - } else if (fabs(a2y-a1y) < eul) { /* hoz line1 */ - if (fabs(b2y-b1y) < eul) { /*hoz line2*/ - Py_RETURN_NONE; /*2 hoz lines dont intersect*/ - } - - /* Can skip vert line check for seg 2 since its covered above. */ - xi = (float)(((b1x / fabs(b1y - b2y)) * fabs(b2y - a1y)) + ((b2x / fabs(b1y - b2y)) * fabs(b1y - a1y))); - if (xi > MAX2(a1x, a2x)) { /* New point right of hoz line1's */ - Py_RETURN_NONE; - } else if (xi < MIN2(a1x, a2x)) { /*New point left of seg1's hoz line */ - Py_RETURN_NONE; - } - newvec[0]= xi; - newvec[1]= a1y; - return newVectorObject(newvec, 2, Py_NEW); - } - - b1 = (a2y-a1y)/(a2x-a1x); - b2 = (b2y-b1y)/(b2x-b1x); - a1 = a1y-b1*a1x; - a2 = b1y-b2*b1x; - - if (b1 - b2 == 0.0) { - Py_RETURN_NONE; - } - - xi = - (a1-a2)/(b1-b2); - yi = a1+b1*xi; - if ((a1x-xi)*(xi-a2x) >= 0 && (b1x-xi)*(xi-b2x) >= 0 && (a1y-yi)*(yi-a2y) >= 0 && (b1y-yi)*(yi-b2y)>=0) { - newvec[0]= xi; - newvec[1]= yi; - return newVectorObject(newvec, 2, Py_NEW); - } - 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)) - -static PyObject *M_Geometry_PointInTriangle2D( PyObject * self, PyObject * args ) -{ - VectorObject *pt_vec, *tri_p1, *tri_p2, *tri_p3; - - if( !PyArg_ParseTuple ( args, "O!O!O!O!", - &vector_Type, &pt_vec, - &vector_Type, &tri_p1, - &vector_Type, &tri_p2, - &vector_Type, &tri_p3) - ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected 4 vector types\n" ) ); - - if POINT_IN_TRI(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -int boxPack_FromPyObject(PyObject * value, boxPack **boxarray ) -{ - int len, i; - PyObject *list_item, *item_1, *item_2; - boxPack *box; - - - /* Error checking must alredy be done */ - if( !PyList_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "can only back a list of [x,y,x,w]" ); - - len = PyList_Size( value ); - - (*boxarray) = MEM_mallocN( len*sizeof(boxPack), "boxPack box"); - - - for( i = 0; i < len; i++ ) { - list_item = PyList_GET_ITEM( value, i ); - if( !PyList_Check( list_item ) || PyList_Size( list_item ) < 4 ) { - MEM_freeN(*boxarray); - return EXPP_ReturnIntError( PyExc_TypeError, - "can only back a list of [x,y,x,w]" ); - } - - box = (*boxarray)+i; - - item_1 = PyList_GET_ITEM(list_item, 2); - item_2 = PyList_GET_ITEM(list_item, 3); - - if (!PyNumber_Check(item_1) || !PyNumber_Check(item_2)) { - MEM_freeN(*boxarray); - return EXPP_ReturnIntError( PyExc_TypeError, - "can only back a list of 2d boxes [x,y,x,w]" ); - } - - box->w = (float)PyFloat_AsDouble( item_1 ); - box->h = (float)PyFloat_AsDouble( item_2 ); - box->index = i; - /* verts will be added later */ - } - return 0; -} - -void boxPack_ToPyObject(PyObject * value, boxPack **boxarray) -{ - int len, i; - PyObject *list_item; - boxPack *box; - - len = PyList_Size( value ); - - for( i = 0; i < len; i++ ) { - box = (*boxarray)+i; - list_item = PyList_GET_ITEM( value, box->index ); - PyList_SET_ITEM( list_item, 0, PyFloat_FromDouble( box->x )); - PyList_SET_ITEM( list_item, 1, PyFloat_FromDouble( box->y )); - } - MEM_freeN(*boxarray); -} - - -static PyObject *M_Geometry_BoxPack2D( PyObject * self, PyObject * boxlist ) -{ - boxPack *boxarray; - float tot_width, tot_height; - int len; - int error; - - if(!PyList_Check(boxlist)) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of boxes [[x,y,w,h], ... ]" ); - - len = PyList_Size( boxlist ); - - if (!len) - return Py_BuildValue( "ff", 0.0, 0.0); - - error = boxPack_FromPyObject(boxlist, &boxarray); - if (error!=0) return NULL; - - /* Non Python function */ - boxPack2D(boxarray, len, &tot_width, &tot_height); - - boxPack_ToPyObject(boxlist, &boxarray); - - return Py_BuildValue( "ff", tot_width, tot_height); -} diff --git a/source/blender/python/api2_2x/Geometry.h b/source/blender/python/api2_2x/Geometry.h deleted file mode 100644 index a9a1c7cf818..00000000000 --- a/source/blender/python/api2_2x/Geometry.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * $Id: Geometry.h 10324 2007-03-21 17:06:02Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ -/*Include this file for access to vector, quat, matrix, euler, etc...*/ - -#ifndef EXPP_Geometry_H -#define EXPP_Geometry_H - -#include -#include "vector.h" - -PyObject *Geometry_Init( void ); - -#endif /* EXPP_Geometry_H */ diff --git a/source/blender/python/api2_2x/Group.c b/source/blender/python/api2_2x/Group.c deleted file mode 100644 index 26e5edd0733..00000000000 --- a/source/blender/python/api2_2x/Group.c +++ /dev/null @@ -1,813 +0,0 @@ -/* - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Group.h" /* This must come first */ - -#include "MEM_guardedalloc.h" - -#include "DNA_group_types.h" -#include "DNA_scene_types.h" /* for Base */ - -#include "BKE_mesh.h" -#include "BKE_library.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_scene.h" -#include "BKE_group.h" - -#include "BLI_blenlib.h" - -#include "blendef.h" -#include "Object.h" -#include "gen_utils.h" -#include "gen_library.h" - -/* checks for the group being removed */ -#define GROUP_DEL_CHECK_PY(bpy_group) if (!(bpy_group->group)) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "Group has been removed" ) ) -#define GROUP_DEL_CHECK_INT(bpy_group) if (!(bpy_group->group)) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "Group has been removed" ) ) - -/*****************************************************************************/ -/* Python API function prototypes for the Blender module. */ -/*****************************************************************************/ -static PyObject *M_Group_New( PyObject * self, PyObject * args ); -PyObject *M_Group_Get( PyObject * self, PyObject * args ); -PyObject *M_Group_Unlink( PyObject * self, BPy_Group * pygrp ); - -/* internal */ -static PyObject *GroupObSeq_CreatePyObject( BPy_Group *self, GroupObject *iter ); - -/*****************************************************************************/ -/* Python method structure definition for Blender.Object module: */ -/*****************************************************************************/ -struct PyMethodDef M_Group_methods[] = { - {"New", ( PyCFunction ) M_Group_New, METH_VARARGS, - "(name) Add a new empty group"}, - {"Get", ( PyCFunction ) M_Group_Get, METH_VARARGS, -"(name) - return the group with the name 'name',\ -returns None if notfound.\nIf 'name' is not specified, it returns a list of all groups."}, - {"Unlink", ( PyCFunction ) M_Group_Unlink, METH_O, - "(group) - Unlink (delete) this group from Blender."}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Group methods table: */ -/*****************************************************************************/ -static PyObject *BPy_Group_copy( BPy_Group * self ); - -static PyMethodDef BPy_Group_methods[] = { - /* name, method, flags, doc */ - {"__copy__", ( PyCFunction ) BPy_Group_copy, METH_VARARGS, - "() - Return a copy of the group containing the same objects."}, - {"copy", ( PyCFunction ) BPy_Group_copy, METH_VARARGS, - "() - Return a copy of the group containing the same objects."}, - {NULL, NULL, 0, NULL} -}; - - -static PyObject *BPy_Group_copy( BPy_Group * self ) -{ - BPy_Group *py_group; /* for Group Data object wrapper in Python */ - struct Group *bl_group; - GroupObject *group_ob, *group_ob_new; /* Group object, copied and added to the groups */ - - GROUP_DEL_CHECK_PY(self); - - bl_group= add_group( self->group->id.name + 2 ); - - if( bl_group ) /* now create the wrapper grp in Python */ - py_group = ( BPy_Group * ) Group_CreatePyObject( bl_group ); - else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Group Data in Blender" ) ); - - bl_group->id.us = 1; - - /* Now add the objects to the group */ - group_ob= self->group->gobject.first; - while(group_ob) { - /* save time by not using */ - group_ob_new= MEM_callocN(sizeof(GroupObject), "groupobject"); - group_ob_new->ob= group_ob->ob; - BLI_addtail( &bl_group->gobject, group_ob_new); - group_ob= group_ob->next; - } - - return ( PyObject * ) py_group; - -} - - -/************************************************************************ - * - * Python BPy_Object attributes - * - ************************************************************************/ -static PyObject *Group_getObjects( BPy_Group * self ) -{ - return GroupObSeq_CreatePyObject(self, NULL); -} - - -static void add_to_group_wraper(Group *group, Object *ob) { - Base *base; - add_to_group(group, ob); - - if (!(ob->flag & OB_FROMGROUP)) { /* do this to avoid a listbase lookup */ - ob->flag |= OB_FROMGROUP; - - base= object_in_scene(ob, G.scene); - if (base) - base->flag |= OB_FROMGROUP; - } -} - -/* only for internal use Blender.Group.Get("MyGroup").objects= []*/ -static int Group_setObjects( BPy_Group * self, PyObject * args ) -{ - int i, list_size; - Group *group; - Object *blen_ob; - group= self->group; - - GROUP_DEL_CHECK_INT(self); - - if( PyList_Check( args ) ) { - if( EXPP_check_sequence_consistency( args, &Object_Type ) != 1) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of objects" ) ); - - /* remove all from the list and add the new items */ - free_group(group); /* unlink all objects from this group, keep the group */ - list_size= PyList_Size( args ); - for( i = 0; i < list_size; i++ ) { - blen_ob= ((BPy_Object *)PyList_GET_ITEM( args, i ))->object; - add_to_group_wraper(group, blen_ob); - } - } else if (PyIter_Check(args)) { - PyObject *iterator = PyObject_GetIter(args); - PyObject *item; - if (iterator == NULL) { - Py_DECREF(iterator); - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of objects, This iterator cannot be used." ); - } - free_group(group); /* unlink all objects from this group, keep the group */ - item = PyIter_Next(iterator); - while (item) { - if ( PyObject_TypeCheck(item, &Object_Type) ) { - blen_ob= ((BPy_Object *)item)->object; - add_to_group_wraper(group, blen_ob); - } - Py_DECREF(item); - item = PyIter_Next(iterator); - } - - Py_DECREF(iterator); - - if (PyErr_Occurred()) { - return EXPP_ReturnIntError( PyExc_RuntimeError, - "An unknown error occured while adding iterator objects to the group.\nThe group has been modified." ); - } - - } else - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list or sequence of objects" ); - return 0; -} - - - -/*****************************************************************************/ -/* PythonTypeObject callback function prototypes */ -/*****************************************************************************/ -static PyObject *Group_repr( BPy_Group * obj ); -static int Group_compare( BPy_Group * a, BPy_Group * b ); - -/*****************************************************************************/ -/* Python BPy_Group getsetattr funcs: */ -/*****************************************************************************/ -static int Group_setLayers( BPy_Group * self, PyObject * value ) -{ - unsigned int laymask = 0; - - GROUP_DEL_CHECK_INT(self); - - 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 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "layer value cannot be zero or below" ); - - self->group->layer= laymask & ((1<<20) - 1); - - return 0; -} - -static PyObject *Group_getLayers( BPy_Group * self ) -{ - return PyInt_FromLong( self->group->layer ); -} - - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Group_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"layers", - (getter)Group_getLayers, (setter)Group_setLayers, - "layer mask for this group", - NULL}, - {"objects", - (getter)Group_getObjects, (setter)Group_setObjects, - "objects in this group", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python TypeGroup structure definition: */ -/*****************************************************************************/ -PyTypeObject Group_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Group", /* char *tp_name; */ - sizeof( BPy_Group ), /* 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; */ - ( cmpfunc ) Group_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Group_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Group_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Group_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 -}; - - - - - -/*****************************************************************************/ -/* Function: M_Group_New */ -/* Python equivalent: Blender.Group.New */ -/*****************************************************************************/ -PyObject *M_Group_New( PyObject * self, PyObject * args ) -{ - char *name = "Group"; - BPy_Group *py_group; /* for Group Data object wrapper in Python */ - struct Group *bl_group; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "string expected as argument or nothing" ); - - bl_group= add_group( name ); - - if( bl_group ) /* now create the wrapper grp in Python */ - py_group = ( BPy_Group * ) Group_CreatePyObject( bl_group ); - else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Group Data in Blender" ) ); - - bl_group->id.us = 1; - - return ( PyObject * ) py_group; -} - -/*****************************************************************************/ -/* Function: M_Group_Get */ -/* Python equivalent: Blender.Group.Get */ -/*****************************************************************************/ -PyObject *M_Group_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Group *group_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - group_iter = G.main->group.first; - - if( name ) { /* (name) - Search group by name */ - - BPy_Group *wanted_group = NULL; - - while( ( group_iter ) && ( wanted_group == NULL ) ) { - - if( strcmp( name, group_iter->id.name + 2 ) == 0 ) - wanted_group = - ( BPy_Group * ) - Group_CreatePyObject( group_iter ); - - group_iter = group_iter->id.next; - } - - if( wanted_group == NULL ) { /* Requested group doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Group \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return ( PyObject * ) wanted_group; - } - - else { /* () - return a list of all groups in the scene */ - int index = 0; - PyObject *grouplist, *pyobj; - - grouplist = PyList_New( BLI_countlist( &( G.main->group ) ) ); - - if( grouplist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create group list" ) ); - - while( group_iter ) { - pyobj = Group_CreatePyObject( group_iter ); - - if( !pyobj ) { - Py_DECREF(grouplist); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create Object" ) ); - } - PyList_SET_ITEM( grouplist, index, pyobj ); - - group_iter = group_iter->id.next; - index++; - } - - return grouplist; - } -} - - -/*****************************************************************************/ -/* Function: M_Group_Unlink */ -/* Python equivalent: Blender.Group.Unlink */ -/*****************************************************************************/ -PyObject *M_Group_Unlink( PyObject * self, BPy_Group * pygrp ) -{ - Group *group; - if( !BPy_Group_Check(pygrp) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a group" ) ); - - GROUP_DEL_CHECK_PY(pygrp); - - group= pygrp->group; - - pygrp->group= NULL; - free_group(group); - unlink_group(group); - group->id.us= 0; - free_libblock( &G.main->group, group ); - Py_RETURN_NONE; -} - - -/*****************************************************************************/ -/* Function: initObject */ -/*****************************************************************************/ -PyObject *Group_Init( void ) -{ - PyObject *submodule; - if( PyType_Ready( &Group_Type ) < 0 ) - return NULL; - if( PyType_Ready( &GroupObSeq_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Group", M_Group_methods, - "The Blender Group module\n\n\ -This module provides access to **Group Data** in Blender.\n" ); - - /*Add SUBMODULES to the module*/ - /*PyDict_SetItemString(dict, "Constraint", Constraint_Init()); //creates a *new* module*/ - return submodule; -} - - -/*****************************************************************************/ -/* Function: Group_CreatePyObject */ -/* Description: This function will create a new BlenObject from an existing */ -/* Object structure. */ -/*****************************************************************************/ -PyObject *Group_CreatePyObject( struct Group * grp ) -{ - BPy_Group *pygrp; - - if( !grp ) - Py_RETURN_NONE; - - pygrp = - ( BPy_Group * ) PyObject_NEW( BPy_Group, &Group_Type ); - - if( pygrp == NULL ) { - return ( NULL ); - } - pygrp->group = grp; - return ( ( PyObject * ) pygrp ); -} - -/*****************************************************************************/ -/* Function: Group_FromPyObject */ -/* Description: This function returns the Blender group from the given */ -/* PyObject. */ -/*****************************************************************************/ -Group *Group_FromPyObject( PyObject * py_grp ) -{ - BPy_Group *blen_grp; - - blen_grp = ( BPy_Group * ) py_grp; - return ( blen_grp->group ); -} - -/*****************************************************************************/ -/* Function: Group_compare */ -/* Description: This is a callback function for the BPy_Group type. It */ -/* compares two Group_Type objects. Only the "==" and "!=" */ -/* comparisons are meaninful. Returns 0 for equality and -1 if */ -/* they don't point to the same Blender Object struct. */ -/* In Python it becomes 1 if they are equal, 0 otherwise. */ -/*****************************************************************************/ -static int Group_compare( BPy_Group * a, BPy_Group * b ) -{ - Group *pa = a->group, *pb = b->group; - return ( pa == pb ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Group_repr */ -/* Description: This is a callback function for the BPy_Group type. It */ -/* builds a meaninful string to represent object objects. */ -/*****************************************************************************/ -static PyObject *Group_repr( BPy_Group * self ) -{ - if (!self->group) - return PyString_FromString( "[Group - Removed]" ); - - return PyString_FromFormat( "[Group \"%s\"]", - self->group->id.name + 2 ); -} - - -/************************************************************************ - * - * GroupOb sequence - * - ************************************************************************/ -/* - * create a thin GroupOb object - */ - -static PyObject *GroupObSeq_CreatePyObject( BPy_Group *self, GroupObject *iter ) -{ - BPy_GroupObSeq *seq = PyObject_NEW( BPy_GroupObSeq, &GroupObSeq_Type); - seq->bpygroup = self; Py_INCREF(self); - seq->iter= iter; - return (PyObject *)seq; -} - - -static int GroupObSeq_len( BPy_GroupObSeq * self ) -{ - GROUP_DEL_CHECK_INT(self->bpygroup); - return BLI_countlist( &( self->bpygroup->group->gobject ) ); -} - -/* - * retrive a single GroupOb from somewhere in the GroupObex list - */ - -static PyObject *GroupObSeq_item( BPy_GroupObSeq * self, int i ) -{ - Group *group= self->bpygroup->group; - int index=0; - PyObject *bpy_obj; - GroupObject *gob; - - GROUP_DEL_CHECK_PY(self->bpygroup); - - for (gob= group->gobject.first; gob && i!=index; gob= gob->next, index++) {} - - if (!(gob)) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - - bpy_obj = Object_CreatePyObject( gob->ob ); - - if( !bpy_obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - return (PyObject *)bpy_obj; - -} - -static PySequenceMethods GroupObSeq_as_sequence = { - ( inquiry ) GroupObSeq_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) GroupObSeq_item, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - 0,0,0, -}; - -/************************************************************************ - * - * Python GroupObSeq_Type iterator (iterates over GroupObjects) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *GroupObSeq_getIter( BPy_GroupObSeq * self ) -{ - GROUP_DEL_CHECK_PY(self->bpygroup); - - if (!self->iter) { - self->iter = self->bpygroup->group->gobject.first; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - return GroupObSeq_CreatePyObject(self->bpygroup, self->bpygroup->group->gobject.first); - } -} - -/* - * Return next GroupOb. - */ - -static PyObject *GroupObSeq_nextIter( BPy_GroupObSeq * self ) -{ - PyObject *object; - if( !(self->iter) || !(self->bpygroup->group) ) { - self->iter = NULL; /* so we can add objects again */ - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - object= Object_CreatePyObject( self->iter->ob ); - self->iter= self->iter->next; - return object; -} - - -static PyObject *GroupObSeq_link( BPy_GroupObSeq * self, BPy_Object *value ) -{ - Object *blen_ob; - - GROUP_DEL_CHECK_PY(self->bpygroup); - - if( !BPy_Object_Check(value) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a python object as an argument" ) ); - - /* - if (self->iter != NULL) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Cannot modify group objects while iterating" ); - */ - - blen_ob = value->object; - - add_to_group_wraper(self->bpygroup->group, blen_ob); /* this checks so as not to add the object into the group twice*/ - - Py_RETURN_NONE; -} - -static PyObject *GroupObSeq_unlink( BPy_GroupObSeq * self, BPy_Object *value ) -{ - Object *blen_ob; - Base *base= NULL; - - GROUP_DEL_CHECK_PY(self->bpygroup); - - if( !BPy_Object_Check(value) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a python object as an argument" ) ); - - blen_ob = value->object; - - - - rem_from_group(self->bpygroup->group, blen_ob); - - if(find_group(blen_ob)==NULL) { - blen_ob->flag &= ~OB_FROMGROUP; - - base= object_in_scene(blen_ob, G.scene); - if (base) - base->flag &= ~OB_FROMGROUP; - } - Py_RETURN_NONE; -} - -static struct PyMethodDef BPy_GroupObSeq_methods[] = { - {"link", (PyCFunction)GroupObSeq_link, METH_O, - "make the object a part of this group"}, - {"unlink", (PyCFunction)GroupObSeq_unlink, METH_O, - "unlink an object from this group"}, - {NULL, NULL, 0, NULL} -}; - -/************************************************************************ - * - * Python GroupObSeq_Type standard operations - * - ************************************************************************/ - -static void GroupObSeq_dealloc( BPy_GroupObSeq * self ) -{ - Py_DECREF(self->bpygroup); - PyObject_DEL( self ); -} - -/*****************************************************************************/ -/* Python GroupObSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject GroupObSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender GroupObSeq", /* char *tp_name; */ - sizeof( BPy_GroupObSeq ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) GroupObSeq_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &GroupObSeq_as_sequence, /* 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 */ - ( getiterfunc) GroupObSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) GroupObSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_GroupObSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 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 -}; diff --git a/source/blender/python/api2_2x/Group.h b/source/blender/python/api2_2x/Group.h deleted file mode 100644 index 68b6ce3eb17..00000000000 --- a/source/blender/python/api2_2x/Group.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * $Id: Group.h 11864 2007-08-28 10:07:08Z sirdude $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_GROUP_H -#define EXPP_GROUP_H - -#include -#include "DNA_group_types.h" - -/* The Group PyTypeObject defined in Group.c */ -extern PyTypeObject Group_Type; -extern PyTypeObject GroupObSeq_Type; - -#define BPy_Group_Check(v) ((v)->ob_type == &Group_Type) -#define BPy_GroupObSeq_Check(v) ((v)->ob_type == &GroupObSeq_Type) - -/*****************************************************************************/ -/* Python BPy_Group structure definition. */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - struct Group *group; -} BPy_Group; - - -/* Group object sequence, iterate on the groups object listbase*/ -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - BPy_Group *bpygroup; /* link to the python group so we can know if its been removed */ - GroupObject *iter; /* so we can iterate over the objects */ -} BPy_GroupObSeq; - -PyObject *Group_Init( void ); -PyObject *Group_CreatePyObject( struct Group *group ); -Group *Group_FromPyObject( PyObject * py_obj ); - -#endif /* EXPP_GROUP_H */ diff --git a/source/blender/python/api2_2x/IDProp.c b/source/blender/python/api2_2x/IDProp.c deleted file mode 100644 index 4f2fa82b21e..00000000000 --- a/source/blender/python/api2_2x/IDProp.c +++ /dev/null @@ -1,895 +0,0 @@ -/** - * $Id: IDProp.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) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * Contributor(s): Joseph Eagar - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "DNA_ID.h" - -#include "BKE_idprop.h" - -#include "IDProp.h" -#include "gen_utils.h" - -#include "MEM_guardedalloc.h" - -#define BSTR_EQ(a, b) (*(a) == *(b) && !strcmp(a, b)) - -/*** Function to wrap ID properties ***/ -PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent); - -extern PyTypeObject IDArray_Type; -extern PyTypeObject IDGroup_Iter_Type; - -/*********************** ID Property Main Wrapper Stuff ***************/ - -PyObject *IDGroup_repr( BPy_IDProperty *self ) -{ - return PyString_FromString( "(ID Property)" ); -} - -extern PyTypeObject IDGroup_Type; - -PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop ) -{ - switch ( prop->type ) { - case IDP_STRING: - return PyString_FromString( prop->data.pointer ); - case IDP_INT: - return PyInt_FromLong( (long)prop->data.val ); - case IDP_FLOAT: - return PyFloat_FromDouble( (double)(*(float*)(&prop->data.val)) ); - case IDP_GROUP: - /*blegh*/ - { - BPy_IDProperty *group = PyObject_New(BPy_IDProperty, &IDGroup_Type); - if (!group) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - group->id = id; - group->prop = prop; - return (PyObject*) group; - } - case IDP_ARRAY: - { - BPy_IDProperty *array = PyObject_New(BPy_IDProperty, &IDArray_Type); - if (!array) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - array->id = id; - array->prop = prop; - return (PyObject*) array; - } - } - Py_RETURN_NONE; -} - -int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value) -{ - switch (prop->type) { - case IDP_STRING: - { - char *st; - if (!PyString_Check(value)) - return EXPP_ReturnIntError(PyExc_TypeError, "expected a string!"); - - st = PyString_AsString(value); - IDP_ResizeArray(prop, strlen(st)+1); - strcpy(prop->data.pointer, st); - return 0; - } - - case IDP_INT: - { - int ivalue; - if (!PyNumber_Check(value)) - return EXPP_ReturnIntError(PyExc_TypeError, "expected an int!"); - value = PyNumber_Int(value); - if (!value) - return EXPP_ReturnIntError(PyExc_TypeError, "expected an int!"); - ivalue = (int) PyInt_AsLong(value); - prop->data.val = ivalue; - Py_XDECREF(value); - break; - } - case IDP_FLOAT: - { - float fvalue; - if (!PyNumber_Check(value)) - return EXPP_ReturnIntError(PyExc_TypeError, "expected a float!"); - value = PyNumber_Float(value); - if (!value) - return EXPP_ReturnIntError(PyExc_TypeError, "expected a float!"); - fvalue = (float) PyFloat_AsDouble(value); - *(float*)&self->prop->data.val = fvalue; - Py_XDECREF(value); - break; - } - - default: - return EXPP_ReturnIntError(PyExc_AttributeError, "attempt to set read-only attribute!"); - } - return 0; -} - -PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *bleh) -{ - return PyString_FromString(self->prop->name); -} - -int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh) -{ - char *st; - if (!PyString_Check(value)) - return EXPP_ReturnIntError(PyExc_TypeError, "expected a string!"); - - st = PyString_AsString(value); - if (strlen(st) >= MAX_IDPROP_NAME) - return EXPP_ReturnIntError(PyExc_TypeError, "string length cannot exceed 31 characters!"); - - strcpy(self->prop->name, st); - return 0; -} - -PyObject *BPy_IDGroup_GetType(BPy_IDProperty *self) -{ - return PyInt_FromLong((long)self->prop->type); -} - -static PyGetSetDef BPy_IDGroup_getseters[] = { - {"name", - (getter)BPy_IDGroup_GetName, (setter)BPy_IDGroup_SetName, - "The name of this Group.", - NULL}, - {NULL, NULL, NULL, NULL, NULL} -}; - -int BPy_IDGroup_Map_Len(BPy_IDProperty *self) -{ - if (self->prop->type != IDP_GROUP) - return EXPP_ReturnIntError( PyExc_TypeError, - "len() of unsized object"); - - return self->prop->len; -} - -PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item) -{ - IDProperty *loop; - char *st; - - if (self->prop->type != IDP_GROUP) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "unsubscriptable object"); - - if (!PyString_Check(item)) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "only strings are allowed as keys of ID properties"); - - st = PyString_AsString(item); - for (loop=self->prop->data.group.first; loop; loop=loop->next) { - if (BSTR_EQ(loop->name, st)) return BPy_IDGroup_WrapData(self->id, loop); - } - return EXPP_ReturnPyObjError( PyExc_KeyError, - "key not in subgroup dict"); -} - -/*returns NULL on success, error string on failure*/ -char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObject *ob) -{ - IDProperty *prop = NULL; - IDPropertyTemplate val = {0}; - - if (PyFloat_Check(ob)) { - val.f = (float) PyFloat_AsDouble(ob); - prop = IDP_New(IDP_FLOAT, val, name); - } else if (PyInt_Check(ob)) { - val.i = (int) PyInt_AsLong(ob); - prop = IDP_New(IDP_INT, val, name); - } else if (PyString_Check(ob)) { - val.str = PyString_AsString(ob); - prop = IDP_New(IDP_STRING, val, name); - } else if (PySequence_Check(ob)) { - PyObject *item; - int i; - - /*validate sequence and derive type. - we assume IDP_INT unless we hit a float - number; then we assume it's */ - val.array.type = IDP_INT; - val.array.len = PySequence_Length(ob); - for (i=0; idata.pointer)[i] = (int)PyInt_AsLong(item); - } else { - item = PyNumber_Float(item); - ((float*)prop->data.pointer)[i] = (float)PyFloat_AsDouble(item); - } - Py_XDECREF(item); - } - } else if (PyMapping_Check(ob)) { - PyObject *keys, *vals, *key, *pval; - int i, len; - /*yay! we get into recursive stuff now!*/ - keys = PyMapping_Keys(ob); - vals = PyMapping_Values(ob); - - /*we allocate the group first; if we hit any invalid data, - we can delete it easily enough.*/ - prop = IDP_New(IDP_GROUP, val, name); - len = PyMapping_Length(ob); - for (i=0; iprop->type != IDP_GROUP) - return EXPP_ReturnIntError( PyExc_TypeError, - "unsubscriptable object"); - - if (!PyString_Check(key)) - return EXPP_ReturnIntError( PyExc_TypeError, - "only strings are allowed as subgroup keys" ); - - if (val == NULL) { - IDProperty *pkey = IDP_GetPropertyFromGroup(self->prop, PyString_AsString(key)); - if (pkey) { - IDP_RemFromGroup(self->prop, pkey); - IDP_FreeProperty(pkey); - MEM_freeN(pkey); - return 0; - } else return EXPP_ReturnIntError( PyExc_RuntimeError, "property not found in group" ); - } - - err = BPy_IDProperty_Map_ValidateAndCreate(PyString_AsString(key), self->prop, val); - if (err) return EXPP_ReturnIntError( PyExc_RuntimeError, err ); - - return 0; -} - -PyObject *BPy_IDGroup_SpawnIterator(BPy_IDProperty *self) -{ - BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &IDGroup_Iter_Type); - - if (!iter) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - iter->group = self; - iter->mode = IDPROP_ITER_KEYS; - iter->cur = self->prop->data.group.first; - Py_XINCREF(iter); - return (PyObject*) iter; -} - -PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop) -{ - switch (prop->type) { - case IDP_STRING: - return PyString_FromString(prop->data.pointer); - break; - case IDP_FLOAT: - return PyFloat_FromDouble(*((float*)&prop->data.val)); - break; - case IDP_INT: - return PyInt_FromLong( (long)prop->data.val ); - break; - case IDP_ARRAY: - { - PyObject *seq = PyList_New(prop->len); - int i; - - if (!seq) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - for (i=0; ilen; i++) { - if (prop->subtype == IDP_FLOAT) - PyList_SetItem(seq, i, - PyFloat_FromDouble(((float*)prop->data.pointer)[i])); - - else PyList_SetItem(seq, i, - PyInt_FromLong(((int*)prop->data.pointer)[i])); - } - return seq; - } - case IDP_GROUP: - { - PyObject *dict = PyDict_New(), *wrap; - IDProperty *loop; - - if (!dict) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyDict_New() failed" ); - - for (loop=prop->data.group.first; loop; loop=loop->next) { - wrap = BPy_IDGroup_MapDataToPy(loop); - if (!wrap) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "BPy_IDGroup_MapDataToPy() failed" ); - - PyDict_SetItemString(dict, loop->name, wrap); - } - return dict; - } - } - - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "eek!! a property exists with a bad type code!!!" ); -} - -PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value) -{ - IDProperty *loop; - PyObject *pyform; - char *name = PyString_AsString(value); - - if (!name) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "pop expected at least 1 arguments, got 0" ); - } - - for (loop=self->prop->data.group.first; loop; loop=loop->next) { - if (BSTR_EQ(loop->name, name)) { - pyform = BPy_IDGroup_MapDataToPy(loop); - - if (!pyform) - /*ok something bad happened with the pyobject, - so don't remove the prop from the group. if pyform is - NULL, then it already should have raised an exception.*/ - return NULL; - - IDP_RemFromGroup(self->prop, loop); - return pyform; - } - } - - return EXPP_ReturnPyObjError( PyExc_KeyError, - "item not in group" ); -} - -PyObject *BPy_IDGroup_IterItems(BPy_IDProperty *self) -{ - BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &IDGroup_Iter_Type); - - if (!iter) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - iter->group = self; - iter->mode = IDPROP_ITER_ITEMS; - iter->cur = self->prop->data.group.first; - Py_XINCREF(iter); - return (PyObject*) iter; -} - -PyObject *BPy_IDGroup_GetKeys(BPy_IDProperty *self) -{ - PyObject *seq = PyList_New(self->prop->len); - IDProperty *loop; - int i; - - if (!seq) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - for (i=0, loop=self->prop->data.group.first; loop; loop=loop->next, i++) - PyList_SetItem(seq, i, PyString_FromString(loop->name)); - - return seq; -} - -PyObject *BPy_IDGroup_GetValues(BPy_IDProperty *self) -{ - PyObject *seq = PyList_New(self->prop->len); - IDProperty *loop; - int i; - - if (!seq) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - for (i=0, loop=self->prop->data.group.first; loop; loop=loop->next, i++) { - PyList_SetItem(seq, i, BPy_IDGroup_WrapData(self->id, loop)); - } - - return seq; -} - -PyObject *BPy_IDGroup_HasKey(BPy_IDProperty *self, PyObject *value) -{ - IDProperty *loop; - char *name = PyString_AsString(value); - - if (!name) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string"); - - for (loop=self->prop->data.group.first; loop; loop=loop->next) { - if (BSTR_EQ(loop->name, name)) Py_RETURN_TRUE; - } - - Py_RETURN_FALSE; -} - -PyObject *BPy_IDGroup_Update(BPy_IDProperty *self, PyObject *vars) -{ - PyObject *pyob, *pkey, *pval; - int i=0; - - if (PySequence_Size(vars) != 1) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an object derived from dict."); - - pyob = PyTuple_GET_ITEM(vars, 0); - if (!PyDict_Check(pyob)) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an object derived from dict."); - - while (PyDict_Next(pyob, &i, &pkey, &pval)) { - BPy_IDGroup_Map_SetItem(self, pkey, pval); - if (PyErr_Occurred()) return NULL; - } - - Py_RETURN_NONE; -} - -PyObject *BPy_IDGroup_ConvertToPy(BPy_IDProperty *self) -{ - return BPy_IDGroup_MapDataToPy(self->prop); -} - -static struct PyMethodDef BPy_IDGroup_methods[] = { - {"pop", (PyCFunction)BPy_IDGroup_Pop, METH_O, - "pop an item from the group; raises KeyError if the item doesn't exist."}, - {"iteritems", (PyCFunction)BPy_IDGroup_IterItems, METH_NOARGS, - "iterate through the items in the dict; behaves like dictionary method iteritems."}, - {"keys", (PyCFunction)BPy_IDGroup_GetKeys, METH_NOARGS, - "get the keys associated with this group as a list of strings."}, - {"values", (PyCFunction)BPy_IDGroup_GetValues, METH_NOARGS, - "get the values associated with this group."}, - {"has_key", (PyCFunction)BPy_IDGroup_HasKey, METH_O, - "returns true if the group contains a key, false if not."}, - {"update", (PyCFunction)BPy_IDGroup_Update, METH_VARARGS, - "updates the values in the group with the values of another or a dict."}, - {"convert_to_pyobject", (PyCFunction)BPy_IDGroup_ConvertToPy, METH_NOARGS, - "return a purely python version of the group."}, - {0, NULL, 0, NULL} -}; - -PyMappingMethods BPy_IDGroup_Mapping = { - (inquiry)BPy_IDGroup_Map_Len, /*inquiry mp_length */ - (binaryfunc)BPy_IDGroup_Map_GetItem, /*binaryfunc mp_subscript */ - (objobjargproc)BPy_IDGroup_Map_SetItem, /*objobjargproc mp_ass_subscript */ -}; - -PyTypeObject IDGroup_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender IDProperty", /* char *tp_name; */ - sizeof( BPy_IDProperty ), /* 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 ) IDGroup_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - &BPy_IDGroup_Mapping, /* 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 */ - (getiterfunc)BPy_IDGroup_SpawnIterator, /* getiterfunc tp_iter; */ - NULL, /* iternextfunc tp_iternext; */ - /*** Attribute descriptor and subclassing stuff ***/ - BPy_IDGroup_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_IDGroup_getseters, /* struct PyGetSetDef *tp_getset; */ -}; - -/*********** Main external wrapping function *******/ -PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent) -{ - BPy_IDProperty *wrap = PyObject_New(BPy_IDProperty, &IDGroup_Type); - - if (!wrap) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - wrap->prop = prop; - wrap->parent = parent; - wrap->id = id; - //wrap->destroy = 0; - return (PyObject*) wrap; -} - - -/********Array Wrapper********/ - -PyObject *IDArray_repr(BPy_IDArray *self) -{ - return PyString_FromString("(ID Array)"); -} - - -PyObject *BPy_IDArray_GetType(BPy_IDArray *self) -{ - return PyInt_FromLong( (long)self->prop->subtype ); -} - -PyObject *BPy_IDArray_GetLen(BPy_IDArray *self) -{ - return PyInt_FromLong( (long)self->prop->len ); -} - -static PyGetSetDef BPy_IDArray_getseters[] = { - {"len", - (getter)BPy_IDArray_GetLen, (setter)NULL, - "The length of the array, can also be gotten with len(array).", - NULL}, - {"type", - (getter)BPy_IDArray_GetType, (setter)NULL, - "The type of the data in the array, is an ant.", - NULL}, - {NULL, NULL, NULL, NULL, NULL}, -}; - -int BPy_IDArray_Len(BPy_IDArray *self) -{ - return self->prop->len; -} - -PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index) -{ - if (index < 0 || index >= self->prop->len) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "index out of range!"); - - switch (self->prop->subtype) { - case IDP_FLOAT: - return PyFloat_FromDouble( (double)(((float*)self->prop->data.pointer)[index])); - break; - case IDP_INT: - return PyInt_FromLong( (long)((int*)self->prop->data.pointer)[index] ); - break; - } - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "invalid/corrupt array type!"); -} - -int BPy_IDArray_SetItem(BPy_IDArray *self, int index, PyObject *val) -{ - int i; - float f; - - if (index < 0 || index >= self->prop->len) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "index out of range!"); - - switch (self->prop->subtype) { - case IDP_FLOAT: - if (!PyNumber_Check(val)) return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float"); - val = PyNumber_Float(val); - if (!val) return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float"); - - f = (float) PyFloat_AsDouble(val); - ((float*)self->prop->data.pointer)[index] = f; - Py_XDECREF(val); - break; - case IDP_INT: - if (!PyNumber_Check(val)) return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int"); - val = PyNumber_Int(val); - if (!val) return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int"); - - i = (int) PyInt_AsLong(val); - ((int*)self->prop->data.pointer)[index] = i; - Py_XDECREF(val); - break; - } - return 0; -} - -static PySequenceMethods BPy_IDArray_Seq = { - (inquiry) BPy_IDArray_Len, /* inquiry sq_length */ - 0, /* binaryfunc sq_concat */ - 0, /* intargfunc sq_repeat */ - (intargfunc)BPy_IDArray_GetItem, /* intargfunc sq_item */ - 0, /* intintargfunc sq_slice */ - (intobjargproc)BPy_IDArray_SetItem, /* intobjargproc sq_ass_item */ - 0, /* intintobjargproc sq_ass_slice */ - 0, /* objobjproc sq_contains */ - /* Added in release 2.0 */ - 0, /* binaryfunc sq_inplace_concat */ - 0, /* intargfunc sq_inplace_repeat */ -}; - -PyTypeObject IDArray_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender IDArray", /* char *tp_name; */ - sizeof( BPy_IDArray ), /* 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 ) IDArray_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &BPy_IDArray_Seq, /* 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_IDArray_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 -}; - -/*********** ID Property Group iterator ********/ - -PyObject *IDGroup_Iter_iterself(PyObject *self) -{ - Py_XINCREF(self); - return self; -} - -PyObject *IDGroup_Iter_repr(BPy_IDGroup_Iter *self) -{ - return PyString_FromString("(ID Property Group)"); -} - -PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self) -{ - IDProperty *cur=NULL; - PyObject *tmpval; - PyObject *ret; - - if (self->cur) { - cur = self->cur; - self->cur = self->cur->next; - if (self->mode == IDPROP_ITER_ITEMS) { - tmpval = BPy_IDGroup_WrapData(self->group->id, cur); - ret = Py_BuildValue("[s, O]", cur->name, tmpval); - Py_DECREF(tmpval); - return ret; - } else { - return PyString_FromString(cur->name); - } - } else { - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } -} - -PyTypeObject IDGroup_Iter_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender IDGroup_Iter", /* char *tp_name; */ - sizeof( BPy_IDGroup_Iter ), /* 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 ) IDGroup_Iter_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 */ - IDGroup_Iter_iterself, /* getiterfunc tp_iter; */ - (iternextfunc) BPy_Group_Iter_Next, /* iternextfunc tp_iternext; */ -}; - -void IDProp_Init_Types(void) -{ - PyType_Ready( &IDGroup_Type ); - PyType_Ready( &IDGroup_Iter_Type ); - PyType_Ready( &IDArray_Type ); -} diff --git a/source/blender/python/api2_2x/IDProp.h b/source/blender/python/api2_2x/IDProp.h deleted file mode 100644 index 5fcf4f6e1b7..00000000000 --- a/source/blender/python/api2_2x/IDProp.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * $Id: IDProp.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) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * Contributor(s): Joseph Eagar - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include - -struct ID; -struct IDProperty; -struct BPy_IDGroup_Iter; - -typedef struct BPy_IDProperty { - PyObject_VAR_HEAD - struct ID *id; - struct IDProperty *prop, *parent; - PyObject *data_wrap; -} BPy_IDProperty; - -typedef struct BPy_IDArray { - PyObject_VAR_HEAD - struct ID *id; - struct IDProperty *prop; -} BPy_IDArray; - -typedef struct BPy_IDGroup_Iter { - PyObject_VAR_HEAD - BPy_IDProperty *group; - struct IDProperty *cur; - int mode; -} BPy_IDGroup_Iter; - -PyObject *BPy_Wrap_IDProperty(struct ID *id, struct IDProperty *prop, struct IDProperty *parent); -void IDProp_Init_Types(void); - -#define IDPROP_ITER_KEYS 0 -#define IDPROP_ITER_ITEMS 1 diff --git a/source/blender/python/api2_2x/Image.c b/source/blender/python/api2_2x/Image.c deleted file mode 100644 index f68cb2d8eeb..00000000000 --- a/source/blender/python/api2_2x/Image.c +++ /dev/null @@ -1,1339 +0,0 @@ -/* - * $Id: Image.c 11241 2007-07-12 11:51:21Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Campbell Barton, Joilnen B. Leite, - * Austin Benesh - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ -#include "Image.h" /*This must come first */ - -#include "BDR_drawmesh.h" /* free_realtime_image */ -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_image.h" -#include "BKE_idprop.h" -#include "BIF_drawimage.h" -#include "BLI_blenlib.h" -#include "DNA_space_types.h" /* FILE_MAXDIR = 160 */ -#include "IMB_imbuf_types.h" /* for the IB_rect define */ -#include "BIF_gl.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "BKE_packedFile.h" -#include "DNA_packedFile_types.h" -#include "BKE_icons.h" -#include "IMB_imbuf.h" -#include "IDProp.h" - -/* used so we can get G.scene->r.cfra for getting the -current image frame, some images change frame if they are a sequence */ -#include "DNA_scene_types.h" - -/*****************************************************************************/ -/* Python BPy_Image defaults: */ -/*****************************************************************************/ -#define EXPP_IMAGE_REP 1 -#define EXPP_IMAGE_REP_MIN 1 -#define EXPP_IMAGE_REP_MAX 16 - - -enum img_consts { - EXPP_IMAGE_ATTR_XREP = 0, - EXPP_IMAGE_ATTR_YREP, - EXPP_IMAGE_ATTR_START, - EXPP_IMAGE_ATTR_END, - EXPP_IMAGE_ATTR_SPEED, - EXPP_IMAGE_ATTR_BINDCODE, - EXPP_IMAGE_ATTR_SOURCE, -}; - -/************************/ -/*** The Image Module ***/ -/************************/ - -/*****************************************************************************/ -/* Python API function prototypes for the Image module. */ -/*****************************************************************************/ -static PyObject *M_Image_New( PyObject * self, PyObject * args ); -static PyObject *M_Image_Get( PyObject * self, PyObject * args ); -static PyObject *M_Image_GetCurrent( PyObject * self ); -static PyObject *M_Image_Load( PyObject * self, PyObject * value ); - - -/*****************************************************************************/ -/* Python BPy_Image methods declarations: */ -/*****************************************************************************/ -static PyObject *Image_getFilename( BPy_Image * self ); -static PyObject *Image_getSize( BPy_Image * self ); -static PyObject *Image_getDepth( BPy_Image * self ); -static PyObject *Image_getXRep( BPy_Image * self ); -static PyObject *Image_getYRep( BPy_Image * self ); -static PyObject *Image_getBindCode( BPy_Image * self ); -static PyObject *Image_getStart( BPy_Image * self ); -static PyObject *Image_getEnd( BPy_Image * self ); -static PyObject *Image_getSpeed( BPy_Image * self ); -static int Image_setFilename( BPy_Image * self, PyObject * args ); -static PyObject *Image_oldsetFilename( BPy_Image * self, PyObject * args ); -static PyObject *Image_setXRep( BPy_Image * self, PyObject * value ); -static PyObject *Image_setYRep( BPy_Image * self, PyObject * value ); -static PyObject *Image_setStart( BPy_Image * self, PyObject * args ); -static PyObject *Image_setEnd( BPy_Image * self, PyObject * args ); -static PyObject *Image_setSpeed( BPy_Image * self, PyObject * args ); -static PyObject *Image_reload( BPy_Image * self ); -static PyObject *Image_glLoad( BPy_Image * self ); -static PyObject *Image_glFree( BPy_Image * self ); -static PyObject *Image_getPixelF( BPy_Image * self, PyObject * args ); -static PyObject *Image_getPixelI( BPy_Image * self, PyObject * args ); -static PyObject *Image_setPixelF( BPy_Image * self, PyObject * args ); -static PyObject *Image_setPixelI( BPy_Image * self, PyObject * args ); -static PyObject *Image_getMaxXY( BPy_Image * self ); -static PyObject *Image_getMinXY( BPy_Image * self ); -static PyObject *Image_save( BPy_Image * self ); -static PyObject *Image_unpack( BPy_Image * self, PyObject * value ); -static PyObject *Image_pack( BPy_Image * self ); -static PyObject *Image_makeCurrent( BPy_Image * self ); - - -/*****************************************************************************/ -/* Python BPy_Image methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Image_methods[] = { - /* name, method, flags, doc */ - {"getPixelF", ( PyCFunction ) Image_getPixelF, METH_VARARGS, - "(int, int) - Get pixel color as floats 0.0-1.0 returns [r,g,b,a]"}, - {"getPixelI", ( PyCFunction ) Image_getPixelI, METH_VARARGS, - "(int, int) - Get pixel color as ints 0-255 returns [r,g,b,a]"}, - {"setPixelF", ( PyCFunction ) Image_setPixelF, METH_VARARGS, - "(int, int, [f r,f g,f b,f a]) - Set pixel color using floats 0.0-1.0"}, - {"setPixelI", ( PyCFunction ) Image_setPixelI, METH_VARARGS, - "(int, int, [i r, i g, i b, i a]) - Set pixel color using ints 0-255"}, - {"getMaxXY", ( PyCFunction ) Image_getMaxXY, METH_NOARGS, - "() - Get maximum x & y coordinates of current image as [x, y]"}, - {"getMinXY", ( PyCFunction ) Image_getMinXY, METH_NOARGS, - "() - Get minimun x & y coordinates of image as [x, y]"}, - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return Image object name"}, - {"getFilename", ( PyCFunction ) Image_getFilename, METH_NOARGS, - "() - Return Image object filename"}, - {"getSize", ( PyCFunction ) Image_getSize, METH_NOARGS, - "() - Return Image object [width, height] dimension in pixels"}, - {"getDepth", ( PyCFunction ) Image_getDepth, METH_NOARGS, - "() - Return Image object pixel depth"}, - {"getXRep", ( PyCFunction ) Image_getXRep, METH_NOARGS, - "() - Return Image object x repetition value"}, - {"getYRep", ( PyCFunction ) Image_getYRep, METH_NOARGS, - "() - Return Image object y repetition value"}, - {"getStart", ( PyCFunction ) Image_getStart, METH_NOARGS, - "() - Return Image object start frame."}, - {"getEnd", ( PyCFunction ) Image_getEnd, METH_NOARGS, - "() - Return Image object end frame."}, - {"getSpeed", ( PyCFunction ) Image_getSpeed, METH_NOARGS, - "() - Return Image object speed (fps)."}, - {"getBindCode", ( PyCFunction ) Image_getBindCode, METH_NOARGS, - "() - Return Image object's bind code value"}, - {"reload", ( PyCFunction ) Image_reload, METH_NOARGS, - "() - Reload the image from the filesystem"}, - {"glLoad", ( PyCFunction ) Image_glLoad, METH_NOARGS, - "() - Load the image data in OpenGL texture memory.\n\ - The bindcode (int) is returned."}, - {"glFree", ( PyCFunction ) Image_glFree, METH_NOARGS, - "() - Free the image data from OpenGL texture memory only,\n\ - see also image.glLoad()."}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(str) - Change Image object name"}, - {"setFilename", ( PyCFunction ) Image_oldsetFilename, METH_VARARGS, - "(str) - Change Image file name"}, - {"setXRep", ( PyCFunction ) Image_setXRep, METH_O, - "(int) - Change Image object x repetition value"}, - {"setYRep", ( PyCFunction ) Image_setYRep, METH_O, - "(int) - Change Image object y repetition value"}, - {"setStart", ( PyCFunction ) Image_setStart, METH_VARARGS, - "(int) - Change Image object animation start value"}, - {"setEnd", ( PyCFunction ) Image_setEnd, METH_VARARGS, - "(int) - Change Image object animation end value"}, - {"setSpeed", ( PyCFunction ) Image_setSpeed, METH_VARARGS, - "(int) - Change Image object animation speed (fps)"}, - {"save", ( PyCFunction ) Image_save, METH_NOARGS, - "() - Write image buffer to file"}, - {"unpack", ( PyCFunction ) Image_unpack, METH_VARARGS, - "(int) - Unpack image. Uses the values defined in Blender.UnpackModes."}, - {"pack", ( PyCFunction ) Image_pack, METH_NOARGS, - "() - Pack the image"}, - {"makeCurrent", ( PyCFunction ) Image_makeCurrent, METH_NOARGS, - "() - Make this the currently displayed image"}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Image.__doc__ */ -/*****************************************************************************/ -static char M_Image_doc[] = "The Blender Image module\n\n"; - -static char M_Image_New_doc[] = - "() - return a new Image object"; - -static char M_Image_Get_doc[] = - "(name) - return the image with the name 'name', \ -returns None if not found.\n If 'name' is not specified, \ -it returns a list of all images in the\ncurrent scene."; - -static char M_Image_GetCurrent_doc[] = - "() - return the current image, from last active the uv/image view, \ -returns None no image is in the view.\n"; - -static char M_Image_Load_doc[] = - "(filename) - return image from file filename as Image Object, \ -returns None if not found.\n"; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Image module: */ -/*****************************************************************************/ -struct PyMethodDef M_Image_methods[] = { - {"New", M_Image_New, METH_VARARGS, M_Image_New_doc}, - {"Get", M_Image_Get, METH_VARARGS, M_Image_Get_doc}, - {"GetCurrent", ( PyCFunction ) M_Image_GetCurrent, METH_NOARGS, M_Image_GetCurrent_doc}, - {"get", M_Image_Get, METH_VARARGS, M_Image_Get_doc}, - {"Load", M_Image_Load, METH_O, M_Image_Load_doc}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Function: M_Image_New */ -/* Python equivalent: Blender.Image.New */ -/*****************************************************************************/ -static PyObject *M_Image_New( PyObject * self, PyObject * args) -{ - int width, height, depth; - char *name; - float color[] = {0, 0, 0, 1}; - Image *image; - if( !PyArg_ParseTuple( args, "siii", &name, &width, &height, &depth ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1 string and 3 ints" ) ); - 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); - if( !image ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyObject Image_Type" ) ); - - /* reset usage count, since BKE_add_image_size() incremented it */ - /* image->id.us--; */ - /* Strange, new images have a user count of one???, otherwise it messes up */ - - return Image_CreatePyObject( image ); -} - - - -/*****************************************************************************/ -/* Function: M_Image_Get */ -/* Python equivalent: Blender.Image.Get */ -/* Description: Receives a string and returns the image object */ -/* whose name matches the string. If no argument is */ -/* passed in, a list of all image names in the */ -/* current scene is returned. */ -/*****************************************************************************/ -static PyObject *M_Image_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Image *img_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - img_iter = G.main->image.first; - - if( name ) { /* (name) - Search image by name */ - - BPy_Image *wanted_image = NULL; - - while( ( img_iter ) && ( wanted_image == NULL ) ) { - if( strcmp( name, img_iter->id.name + 2 ) == 0 ) { - wanted_image = ( BPy_Image * ) - PyObject_NEW( BPy_Image, &Image_Type ); - if( wanted_image ) - wanted_image->image = img_iter; - } - img_iter = img_iter->id.next; - } - - if( wanted_image == NULL ) { /* Requested image doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Image \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return ( PyObject * ) wanted_image; - } - - else { /* () - return a list of all images in the scene */ - int index = 0; - PyObject *img_list, *pyobj; - - img_list = PyList_New( BLI_countlist( &( G.main->image ) ) ); - - if( img_list == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( img_iter ) { - pyobj = Image_CreatePyObject( img_iter ); - - PyList_SET_ITEM( img_list, index, pyobj ); - - img_iter = img_iter->id.next; - index++; - } - - return ( img_list ); - } -} - - - -/*****************************************************************************/ -/* Function: M_Image_GetCurrent*/ -/* Python equivalent: Blender.Image.GetCurrent */ -/* Description: Returns the active current (G.sima) */ -/* This will be the image last under the mouse cursor */ -/* None if there is no Image. */ -/*****************************************************************************/ -static PyObject *M_Image_GetCurrent( PyObject * self ) -{ - if (!G.sima || !G.sima->image) { - Py_RETURN_NONE; - } - what_image( G.sima ); /* make sure image data exists */ - return Image_CreatePyObject( G.sima->image ); -} - - -/*****************************************************************************/ -/* Function: M_Image_Load */ -/* Python equivalent: Blender.Image.Load */ -/* Description: Receives a string and returns the image object */ -/* whose filename matches the string. */ -/*****************************************************************************/ -static PyObject *M_Image_Load( PyObject * self, PyObject * value ) -{ - char *fname = PyString_AsString(value); - Image *img_ptr; - BPy_Image *image; - - if( !value ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ) ); - - image = ( BPy_Image * ) PyObject_NEW( BPy_Image, &Image_Type ); - - if( !image ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyObject Image_Type" ) ); - - img_ptr = BKE_add_image_file( fname ); - if( !img_ptr ) - return ( EXPP_ReturnPyObjError( PyExc_IOError, - "couldn't load image" ) ); - - /* force a load the image buffers*/ - BKE_image_get_ibuf(img_ptr, NULL); - - image->image = img_ptr; - - return ( PyObject * ) image; -} - - -/** - * getPixelF( x, y ) - * returns float list of pixel colors in rgba order. - * returned values are floats normalized to 0.0 - 1.0. - * blender images are all 4x8 bit at the moment apr-2005 - */ - -static PyObject *Image_getPixelF( BPy_Image * self, PyObject * args ) -{ - - PyObject *attr; - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - char *pixel; /* image data */ - int index; /* offset into image data */ - int x = 0; - int y = 0; - int pixel_size = 4; /* each pixel is 4 x 8-bits packed in unsigned int */ - int i; - - if( !PyArg_ParseTuple( args, "ii", &x, &y ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 integers" ); - - if( !ibuf || !ibuf->rect ) /* loading didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - if( ibuf->type == 1 ) /* bitplane image */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "unsupported bitplane image format" ); - - if( x > ( ibuf->x - 1 ) - || y > ( ibuf->y - 1 ) - || x < ibuf->xorig || y < ibuf->yorig ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "x or y is out of range" ); - - /* - assumption: from looking at source, skipx is often not set, - so we calc ourselves - */ - - attr = PyList_New(4); - - if (!attr) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't allocate memory for color list" ); - - index = ( x + y * ibuf->x ) * pixel_size; - - pixel = ( char * ) ibuf->rect; - for (i=0; i<4; i++) { - PyList_SetItem( attr, i, PyFloat_FromDouble( ( ( double ) pixel[index+i] ) / 255.0 )); - } - return attr; -} - - -/** - * getPixelI( x, y ) - * returns integer list of pixel colors in rgba order. - * returned values are ints normalized to 0-255. - * blender images are all 4x8 bit at the moment apr-2005 - */ - -static PyObject *Image_getPixelI( BPy_Image * self, PyObject * args ) -{ - PyObject *attr = PyList_New(4); - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - char *pixel; /* image data */ - int index; /* offset into image data */ - int x = 0; - int y = 0; - int pixel_size = 4; /* each pixel is 4 x 8-bits packed in unsigned int */ - int i; - - if (!attr) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't allocate memory for color list" ); - - if( !PyArg_ParseTuple( args, "ii", &x, &y ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 integers" ); - - if( !ibuf || !ibuf->rect ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - if( ibuf->type == 1 ) /* bitplane image */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "unsupported bitplane image format" ); - - if( x > ( ibuf->x - 1 ) - || y > ( ibuf->y - 1 ) - || x < ibuf->xorig || y < ibuf->yorig ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "x or y is out of range" ); - - /* - assumption: from looking at source, skipx is often not set, - so we calc ourselves - */ - - index = ( x + y * ibuf->x ) * pixel_size; - pixel = ( char * ) ibuf->rect; - - for (i=0; i<4; i++) { - PyList_SetItem( attr, i, PyInt_FromLong( pixel[index+i] )); - } - return attr; -} - - -/* set pixel as floats */ - -static PyObject *Image_setPixelF( BPy_Image * self, PyObject * args ) -{ - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - char *pixel; /* image data */ - int index; /* offset into image data */ - int x = 0; - int y = 0; - int a = 0; - int pixel_size = 4; /* each pixel is 4 x 8-bits packed in unsigned int */ - float p[4]; - - if( !PyArg_ParseTuple - ( args, "ii(ffff)", &x, &y, &p[0], &p[1], &p[2], &p[3] ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 integers and an array of 4 floats" ); - - if( !ibuf || !ibuf->rect ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - if( ibuf->type == 1 ) /* bitplane image */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "unsupported bitplane image format" ); - - if( x > ( ibuf->x - 1 ) - || y > ( ibuf->y - 1 ) - || x < ibuf->xorig || y < ibuf->yorig ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "x or y is out of ruange" ); - - for( a = 0; a < 4; a++ ) { - if( p[a] > 1.0 || p[a] < 0.0 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "r, g, b, or a is out of range" ); - } - - - /* - assumption: from looking at source, skipx is often not set, - so we calc ourselves - */ - - index = ( x + y * ibuf->x ) * pixel_size; - - pixel = ( char * ) ibuf->rect; - - pixel[index] = ( char ) ( p[0] * 255.0 ); - pixel[index + 1] = ( char ) ( p[1] * 255.0 ); - pixel[index + 2] = ( char ) ( p[2] * 255.0 ); - pixel[index + 3] = ( char ) ( p[3] * 255.0 ); - - ibuf->userflags |= IB_BITMAPDIRTY; - Py_RETURN_NONE; -} - - -/* set pixel as ints */ - -static PyObject *Image_setPixelI( BPy_Image * self, PyObject * args ) -{ - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - char *pixel; /* image data */ - int index; /* offset into image data */ - int x = 0; - int y = 0; - int a = 0; - int pixel_size = 4; /* each pixel is 4 x 8-bits packed in unsigned int */ - int p[4]; - - if( !PyArg_ParseTuple - ( args, "ii(iiii)", &x, &y, &p[0], &p[1], &p[2], &p[3] ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 integers and an list of 4 ints" ); - - if( !ibuf || !ibuf->rect ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - if( ibuf->type == 1 ) /* bitplane image */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "unsupported bitplane image format" ); - - if( x > ( ibuf->x - 1 ) - || y > ( ibuf->y - 1 ) - || x < ibuf->xorig || y < ibuf->yorig ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "x or y is out of range" ); - - for( a = 0; a < 4; a++ ) { - if( p[a] > 255 || p[a] < 0 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "r, g, b, or a is out of range" ); - } - - /* - assumption: from looking at source, skipx is often not set, - so we calc ourselves - */ - - index = ( x + y * ibuf->x ) * pixel_size; - - pixel = ( char * ) ibuf->rect; - - pixel[index] = ( char ) p[0]; - pixel[index + 1] = ( char ) p[1]; - pixel[index + 2] = ( char ) p[2]; - pixel[index + 3] = ( char ) p[3]; - - ibuf->userflags |= IB_BITMAPDIRTY; - Py_RETURN_NONE; -} - - -/* get max extent of image */ - -static PyObject *Image_getMaxXY( BPy_Image * self ) -{ - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - - if( !ibuf || !ibuf->rect ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - return Py_BuildValue( "[i,i]", ibuf->x, ibuf->y ); -} - - -/* get min extent of image */ - -static PyObject *Image_getMinXY( BPy_Image * self ) -{ - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - - if( !ibuf || !ibuf->rect ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - return Py_BuildValue( "[i,i]", ibuf->xorig, ibuf->yorig ); -} - -/* unpack image */ - -static PyObject *Image_unpack( BPy_Image * self, PyObject * value ) -{ - Image *image = self->image; - int mode = (int)PyInt_AsLong(value); - - /*get the absolute path */ - if( mode==-1 ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1 integer from Blender.UnpackModes" ); - - if (image->packedfile==NULL) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "image not packed" ); - - if (unpackImage(image, mode) == RET_ERROR) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "error unpacking image" ); - Py_RETURN_NONE; -} - -/* pack image */ - -static PyObject *Image_pack( BPy_Image * self ) -{ - Image *image = self->image; - ImBuf *ibuf = BKE_image_get_ibuf(image, NULL); - - if( !ibuf || !ibuf->rect ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - if (image->packedfile ) { /* RePack? */ - if (ibuf->userflags & IB_BITMAPDIRTY) - BKE_image_memorypack(image); - } else { /* Pack for the first time */ - if (ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) - BKE_image_memorypack(image); - else - image->packedfile = newPackedFile(image->name); - } - Py_RETURN_NONE; -} - - -static PyObject *Image_makeCurrent( BPy_Image * self ) -{ -#if 0 /* add back in when bpy becomes "official" */ - static char warning = 1; - if( warning ) { - printf("image.makeCurrent() deprecated!\n\t use 'bpy.images.active = image instead'\n"); - --warning; - } -#endif - - if (!G.sima) - Py_RETURN_FALSE; - - G.sima->image= self->image; - Py_RETURN_TRUE; -} - - -/* save image to file */ - -static PyObject *Image_save( BPy_Image * self ) -{ - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - - if(!ibuf) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not save image (no image buffer)" ); - - /* If this is a packed file, write using writePackedFile - * because IMB_saveiff wont save to a file */ - if (self->image->packedfile) { - if (writePackedFile(self->image->name, self->image->packedfile, 0) != RET_OK) { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not save image (writing image from packedfile failed)" ); - } - } else if (!IMB_saveiff( ibuf, self->image->name, ibuf->flags)) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not save image (writing the image buffer failed)" ); - - Py_RETURN_NONE; /* normal return, image saved */ -} - -static PyObject *M_Image_SourceDict( void ) -{ - PyObject *Dict = PyConstant_New( ); - if( Dict ) { - BPy_constant *d = ( BPy_constant * ) Dict; - PyConstant_Insert(d, "STILL", PyInt_FromLong(IMA_SRC_FILE)); - PyConstant_Insert(d, "MOVIE", PyInt_FromLong(IMA_SRC_MOVIE)); - PyConstant_Insert(d, "SEQUENCE", PyInt_FromLong(IMA_SRC_SEQUENCE)); - PyConstant_Insert(d, "GENERATED", PyInt_FromLong(IMA_SRC_GENERATED)); - } - return Dict; -} - -/*****************************************************************************/ -/* Function: Image_Init */ -/*****************************************************************************/ -PyObject *Image_Init( void ) -{ - PyObject *submodule; - PyObject *Sources = M_Image_SourceDict( ); - - if( PyType_Ready( &Image_Type ) < 0 ) - return NULL; - - submodule = - Py_InitModule3( "Blender.Image", M_Image_methods, - M_Image_doc ); - - if( Sources ) - PyModule_AddObject( submodule, "Sources", Sources ); - - return submodule; -} - -/*****************************************************************************/ -/* Python Image_Type callback function prototypes: */ -/*****************************************************************************/ -static int Image_compare( BPy_Image * a, BPy_Image * b ); -static PyObject *Image_repr( BPy_Image * self ); - -/*****************************************************************************/ -/* Function: Image_CreatePyObject */ -/* Description: This function will create a new BPy_Image from an existing */ -/* Blender image structure. */ -/*****************************************************************************/ -PyObject *Image_CreatePyObject( Image * image ) -{ - BPy_Image *py_img; - py_img = ( BPy_Image * ) PyObject_NEW( BPy_Image, &Image_Type ); - - if( !py_img ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Image object" ); - - py_img->image = image; - return ( PyObject * ) py_img; -} - -/*****************************************************************************/ -/* Function: Image_FromPyObject */ -/* Description: Returns the Blender Image associated with this object */ -/*****************************************************************************/ -Image *Image_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Image * ) pyobj )->image; -} - -static PyObject *Image_getFilename( BPy_Image * self ) -{ - return PyString_FromString( self->image->name ); -} - -static PyObject *Image_getSize( BPy_Image * self ) -{ - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - PyObject *attr; - - if( !ibuf ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - attr = PyList_New(2); - - if( !attr ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Image.size attribute" ); - - PyList_SetItem( attr, 0, PyInt_FromLong(ibuf->x)); - PyList_SetItem( attr, 1, PyInt_FromLong(ibuf->y)); - return attr; -} - -static PyObject *Image_getDepth( BPy_Image * self ) -{ - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - - if( !ibuf ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - return PyInt_FromLong( (long)ibuf->depth ); -} - - -static PyObject *Image_getXRep( BPy_Image * self ) -{ - return PyInt_FromLong( self->image->xrep ); -} - -static PyObject *Image_getYRep( BPy_Image * self ) -{ - return PyInt_FromLong( self->image->yrep ); -} - -static PyObject *Image_getStart( BPy_Image * self ) -{ - return PyInt_FromLong( self->image->twsta ); -} - -static PyObject *Image_getEnd( BPy_Image * self ) -{ - return PyInt_FromLong( self->image->twend ); -} - -static PyObject *Image_getSpeed( BPy_Image * self ) -{ - return PyInt_FromLong( self->image->animspeed ); -} - -static PyObject *Image_getBindCode( BPy_Image * self ) -{ - return PyLong_FromUnsignedLong( self->image->bindcode ); -} - -static PyObject *Image_reload( BPy_Image * self ) -{ - Image *image = self->image; - - BKE_image_signal(image, NULL, IMA_SIGNAL_RELOAD); - - Py_RETURN_NONE; -} - -static PyObject *Image_glFree( BPy_Image * self ) -{ - Image *image = self->image; - - free_realtime_image( image ); - /* remove the nocollect flag, image is available for garbage collection again */ - image->flag &= ~IMA_NOCOLLECT; - Py_RETURN_NONE; -} - -static PyObject *Image_glLoad( BPy_Image * self ) -{ - Image *image = self->image; - unsigned int *bind = &image->bindcode; - - if( *bind == 0 ) { - ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL); - - if( !ibuf ) /* didn't work */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't load image data in Blender" ); - - glGenTextures( 1, ( GLuint * ) bind ); - glBindTexture( GL_TEXTURE_2D, *bind ); - - gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, ibuf->x, - ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, - ibuf->rect ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - GL_LINEAR_MIPMAP_NEAREST ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, - GL_LINEAR ); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, ibuf->x, - ibuf->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, - ibuf->rect ); - - /* raise the nocollect flag, - image is not available for garbage collection - (python GL might use it directly) - */ - image->flag |= IMA_NOCOLLECT; - } - - return PyLong_FromUnsignedLong( image->bindcode ); -} - -static int Image_setFilename( BPy_Image * self, PyObject * value ) -{ - char *name; - - name = PyString_AsString(value); - - if( !name ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected a string argument" ) ); - - /* max len is FILE_MAXDIR == 160, FILE_MAXFILE == 80 chars like done in DNA_image_types.h */ - if( strlen(name) >= FILE_MAXDIR + FILE_MAXFILE ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "string argument is limited to 240 chars at most" ) ); - - strcpy( self->image->name, name ); - return 0; -} - -static PyObject *Image_oldsetFilename( BPy_Image * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Image_setFilename ); -} - -static PyObject *Image_setXRep( BPy_Image * self, PyObject * value ) -{ - short param = (short)PyInt_AsLong(value); - - if( param !=-1 && param >= EXPP_IMAGE_REP_MIN && param <= EXPP_IMAGE_REP_MAX) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument in [1,16]" ) ); - - self->image->xrep = param; - Py_RETURN_NONE; -} - -static PyObject *Image_setYRep( BPy_Image * self, PyObject * value ) -{ - short param = (short)PyInt_AsLong(value); - - if( param !=-1 && param >= EXPP_IMAGE_REP_MIN && param <= EXPP_IMAGE_REP_MAX) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument in [1,16]" ) ); - - self->image->yrep = param; - Py_RETURN_NONE; -} - - -static PyObject *Image_setStart( BPy_Image * self, PyObject * args ) -{ - short value; - - if( !PyArg_ParseTuple( args, "h", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument in [0,128]" ) ); - - if( value >= 0 && value <= 128 ) - self->image->twsta = value; - else - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "expected int argument in [0,128]" ) ); - - Py_RETURN_NONE; -} - - -static PyObject *Image_setEnd( BPy_Image * self, PyObject * args ) -{ - short value; - - if( !PyArg_ParseTuple( args, "h", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument in [0,128]" ) ); - - if( value >= 0 && value <= 128 ) - self->image->twend = value; - else - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "expected int argument in [0,128]" ) ); - - Py_RETURN_NONE; -} - -static PyObject *Image_setSpeed( BPy_Image * self, PyObject * args ) -{ - short value; - - if( !PyArg_ParseTuple( args, "h", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument in [0,128]" ) ); - - if( value >= 1 && value <= 100 ) - self->image->animspeed = value; - else - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "expected int argument in [0,128]" ) ); - - Py_RETURN_NONE; -} - - -/*****************************************************************************/ -/* Function: Image_compare */ -/* Description: This is a callback function for the BPy_Image type. It */ -/* compares two Image_Type objects. Only the "==" and "!=" */ -/* comparisons are meaninful. Returns 0 for equality and -1 if */ -/* they don't point to the same Blender Image struct. */ -/* In Python it becomes 1 if they are equal, 0 otherwise. */ -/*****************************************************************************/ -static int Image_compare( BPy_Image * a, BPy_Image * b ) -{ - return ( a->image == b->image ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Image_repr */ -/* Description: This is a callback function for the BPy_Image type. It */ -/* builds a meaninful string to represent image objects. */ -/*****************************************************************************/ -static PyObject *Image_repr( BPy_Image * self ) -{ - return PyString_FromFormat( "[Image \"%s\"]", - self->image->id.name + 2 ); -} - -static PyObject *Image_getPacked(BPy_Image *self, void *closure) -{ - if (self->image->packedfile) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static PyObject *Image_hasData(BPy_Image *self, void *closure) -{ - if (self->image->ibufs.first) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static PyObject *Image_getFlag(BPy_Image *self, void *flag) -{ - if (self->image->flag & (int)flag) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; - -} - -static PyObject *Image_getFlagTpage(BPy_Image *self, void *flag) -{ - if (self->image->tpageflag & (int)flag) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; - -} - -static int Image_setSource( BPy_Image *self, PyObject *args) -{ - PyObject* integer = PyNumber_Int( args ); - short value; - - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - value = ( short )PyInt_AS_LONG( integer ); - Py_DECREF( integer ); - - if( value < IMA_SRC_FILE || value > IMA_SRC_GENERATED ) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected integer argument in range 1-4" ); - - self->image->source = value; - return 0; -} - -static int Image_setFlag(BPy_Image *self, PyObject *value, void *flag) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if ( param ) - self->image->flag |= (int)flag; - else - self->image->flag &= ~(int)flag; - return 0; -} - -static int Image_setFlagTpage(BPy_Image *self, PyObject *value, void *flag) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if ( param ) - self->image->tpageflag |= (int)flag; - else - self->image->tpageflag &= ~(int)flag; - return 0; -} - -/* - * get integer attributes - */ -static PyObject *getIntAttr( BPy_Image *self, void *type ) -{ - int param; - struct Image *image = self->image; - - switch( (int)type ) { - case EXPP_IMAGE_ATTR_XREP: - param = image->xrep; - break; - case EXPP_IMAGE_ATTR_YREP: - param = image->xrep; - break; - case EXPP_IMAGE_ATTR_START: - param = image->twsta; - break; - case EXPP_IMAGE_ATTR_END: - param = image->twend; - break; - case EXPP_IMAGE_ATTR_SPEED: - param = image->animspeed; - break; - case EXPP_IMAGE_ATTR_BINDCODE: - param = image->bindcode; - break; - case EXPP_IMAGE_ATTR_SOURCE: - param = image->source; - break; - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "undefined type in getIntAttr" ); - } - - return PyInt_FromLong( param ); -} - - -/* - * set integer attributes which require clamping - */ - -static int setIntAttrClamp( BPy_Image *self, PyObject *value, void *type ) -{ - void *param; - struct Image *image = self->image; - int min, max, size; - - switch( (int)type ) { - case EXPP_IMAGE_ATTR_XREP: - min = EXPP_IMAGE_REP_MIN; - max = EXPP_IMAGE_REP_MAX; - size = 'h'; - param = (void *)&image->xrep; - break; - case EXPP_IMAGE_ATTR_YREP: - min = EXPP_IMAGE_REP_MIN; - max = EXPP_IMAGE_REP_MAX; - size = 'h'; - param = (void *)&image->yrep; - break; - case EXPP_IMAGE_ATTR_START: - min = 0; - max = 128; - size = 'h'; - param = (void *)&image->twsta; - break; - case EXPP_IMAGE_ATTR_END: - min = 0; - max = 128; - size = 'h'; - param = (void *)&image->twend; - break; - case EXPP_IMAGE_ATTR_SPEED: - min = 0; - max = 100; - size = 'h'; - param = (void *)&image->animspeed; - break; - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setIntAttrClamp"); - } - return EXPP_setIValueClamped( value, param, min, max, size ); -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Image_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"filename", (getter)Image_getFilename, (setter)Image_setFilename, - "image path", NULL}, - /* readonly */ - {"depth", (getter)Image_getDepth, (setter)NULL, - "image depth", NULL}, - {"size", (getter)Image_getSize, (setter)NULL, - "image size", NULL}, - {"packed", (getter)Image_getPacked, (setter)NULL, - "image packed state", NULL }, - {"has_data", (getter)Image_hasData, (setter)NULL, - "is image data loaded", NULL }, - /* ints */ - {"xrep", (getter)getIntAttr, (setter)setIntAttrClamp, - "image xrep", (void *)EXPP_IMAGE_ATTR_XREP }, - {"yrep", (getter)getIntAttr, (setter)setIntAttrClamp, - "image yrep", (void *)EXPP_IMAGE_ATTR_YREP }, - {"start", (getter)getIntAttr, (setter)setIntAttrClamp, - "image start frame", (void *)EXPP_IMAGE_ATTR_START }, - {"end", (getter)getIntAttr, (setter)setIntAttrClamp, - "image end frame", (void *)EXPP_IMAGE_ATTR_END }, - {"speed", (getter)getIntAttr, (setter)setIntAttrClamp, - "image end frame", (void *)EXPP_IMAGE_ATTR_SPEED }, - {"bindcode", (getter)getIntAttr, (setter)NULL, - "openGL bindcode", (void *)EXPP_IMAGE_ATTR_BINDCODE }, - {"source", (getter)getIntAttr, (setter)Image_setSource, - "image source type", (void *)EXPP_IMAGE_ATTR_SOURCE }, - /* flags */ - {"fields", (getter)Image_getFlag, (setter)Image_setFlag, - "image fields toggle", (void *)IMA_FIELDS }, - {"fields_odd", (getter)Image_getFlag, (setter)Image_setFlag, - "image odd fields toggle", (void *)IMA_STD_FIELD }, - {"antialias", (getter)Image_getFlag, (setter)Image_setFlag, - "image antialiasing toggle", (void *)IMA_ANTIALI }, - {"reflect", (getter)Image_getFlag, (setter)Image_setFlag, - "image reflect toggle", (void *)IMA_REFLECT }, - {"clampX", (getter)Image_getFlagTpage, (setter)Image_setFlagTpage, - "disable tiling on the X axis", (void *)IMA_CLAMP_U }, - {"clampY", (getter)Image_getFlagTpage, (setter)Image_setFlagTpage, - "disable tiling on the Y axis", (void *)IMA_CLAMP_V }, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/*****************************************************************************/ -/* Python Image_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Image_Type = { - PyObject_HEAD_INIT( NULL ) /* required macro. ( no comma needed ) */ - 0, /* ob_size */ - "Blender Image", /* tp_name */ - sizeof( BPy_Image ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - 0, /* tp_print */ - NULL, /* tp_getattr */ - NULL, /* tp_setattr */ - ( cmpfunc ) Image_compare, /* tp_compare */ - ( reprfunc ) Image_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Image_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Image_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 -}; diff --git a/source/blender/python/api2_2x/Image.h b/source/blender/python/api2_2x/Image.h deleted file mode 100644 index a2fb22563bb..00000000000 --- a/source/blender/python/api2_2x/Image.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * $Id: Image.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Alex Mole - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_IMAGE_H -#define EXPP_IMAGE_H - -#include -#include "DNA_image_types.h" - - -/*****************************************************************************/ -/* Python BPy_Image structure definition */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - Image * image; /* libdata must be second */ - -} BPy_Image; - -extern PyTypeObject Image_Type; /* The Image PyType Object */ - -#define BPy_Image_Check(v) ((v)->ob_type == &Image_Type) /*for type checking */ - -/*****************************************************************************/ -/* Module Blender.Image - public functions */ -/*****************************************************************************/ -PyObject *Image_Init( void ); -PyObject *Image_CreatePyObject( Image * image ); -Image *Image_FromPyObject( PyObject * pyobj ); - -#endif /* EXPP_IMAGE_H */ diff --git a/source/blender/python/api2_2x/Ipo.c b/source/blender/python/api2_2x/Ipo.c deleted file mode 100644 index e150a10259c..00000000000 --- a/source/blender/python/api2_2x/Ipo.c +++ /dev/null @@ -1,1842 +0,0 @@ -/* - * $Id: Ipo.c 12078 2007-09-18 06:41:29Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot RIP 2005, Nathan Letwory, - * Stephen Swaney, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Ipo.h" /*This must come first*/ - -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_object.h" -#include "BKE_ipo.h" -#include "BLI_blenlib.h" -#include "BIF_space.h" -#include "BSE_editipo.h" -#include "MEM_guardedalloc.h" -#include "DNA_key_types.h" -#include "mydevice.h" -#include "Ipocurve.h" -#include "gen_utils.h" -#include "gen_library.h" - -extern int ob_ar[]; -extern int la_ar[]; -extern int ma_ar[]; -extern int ac_ar[]; -extern int cam_ar[]; -extern int co_ar[]; -extern int cu_ar[]; -extern int seq_ar[]; -extern int te_ar[]; -extern int wo_ar[]; - -PyObject *submodule; - -/*****************************************************************************/ -/* Python API function prototypes for the Ipo module. */ -/*****************************************************************************/ -static PyObject *M_Ipo_New( PyObject * self, PyObject * args ); -static PyObject *M_Ipo_Get( PyObject * self, PyObject * args ); -static PyObject *M_Ipo_Recalc( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Ipo.__doc__ */ -/*****************************************************************************/ -char M_Ipo_doc[] = ""; -char M_Ipo_New_doc[] = ""; -char M_Ipo_Get_doc[] = ""; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Ipo module: */ -/*****************************************************************************/ - -struct PyMethodDef M_Ipo_methods[] = { - {"New", ( PyCFunction ) M_Ipo_New, METH_VARARGS | METH_KEYWORDS, - M_Ipo_New_doc}, - {"Get", M_Ipo_Get, METH_VARARGS, M_Ipo_Get_doc}, - {"get", M_Ipo_Get, METH_VARARGS, M_Ipo_Get_doc}, - {"Recalc", M_Ipo_Recalc, METH_O, M_Ipo_Get_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Ipo methods declarations: */ -/*****************************************************************************/ -static PyObject *Ipo_getBlocktype( BPy_Ipo * self ); -static PyObject *Ipo_oldsetBlocktype( BPy_Ipo * self, PyObject * args ); -static int Ipo_setBlocktype( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_getRctf( BPy_Ipo * self ); -static PyObject *Ipo_oldsetRctf( BPy_Ipo * self, PyObject * args ); -static int Ipo_setRctf( BPy_Ipo * self, PyObject * args ); - -static PyObject *Ipo_getCurve( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_getCurves( BPy_Ipo * self ); -static PyObject *Ipo_getCurveNames( BPy_Ipo * self ); -static PyObject *Ipo_addCurve( BPy_Ipo * self, PyObject * value ); -static PyObject *Ipo_delCurve( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_getNcurves( BPy_Ipo * self ); -static PyObject *Ipo_getNBezPoints( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_DeleteBezPoints( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_getCurveBP( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_getCurvecurval( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_EvaluateCurveOn( BPy_Ipo * self, PyObject * args ); - -static PyObject *Ipo_setCurveBeztriple( BPy_Ipo * self, PyObject * args ); -static PyObject *Ipo_getCurveBeztriple( BPy_Ipo * self, PyObject * args ); - -static PyObject *Ipo_getChannel( BPy_Ipo * self ); -static PyObject *Ipo_copy( BPy_Ipo * self ); -static int Ipo_setChannel( BPy_Ipo * self, PyObject * args ); - -static int Ipo_length( BPy_Ipo * inst ); -static PyObject *Ipo_getIpoCurveByName( BPy_Ipo * self, PyObject * key ); -static int Ipo_setIpoCurveByName( BPy_Ipo * self, PyObject * key, - PyObject * value ); -static int Ipo_contains( BPy_Ipo * self, PyObject * key ); - -/*****************************************************************************/ -/* Python BPy_Ipo methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Ipo_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return Ipo Data name"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(str) - Change Ipo Data name"}, - {"getBlocktype", ( PyCFunction ) Ipo_getBlocktype, METH_NOARGS, - "() - Return Ipo blocktype"}, - {"setBlocktype", ( PyCFunction ) Ipo_oldsetBlocktype, METH_VARARGS, - "(str) - Change Ipo blocktype"}, - {"getRctf", ( PyCFunction ) Ipo_getRctf, METH_NOARGS, - "() - Return Ipo rctf"}, - {"setRctf", ( PyCFunction ) Ipo_oldsetRctf, METH_VARARGS, - "(flt,flt,flt,flt) - Change Ipo rctf"}, - {"addCurve", ( PyCFunction ) Ipo_addCurve, METH_O, - "() - Add a curve to Ipo"}, - {"delCurve", ( PyCFunction ) Ipo_delCurve, METH_VARARGS, - "(str) - Delete curve from Ipo"}, - {"getNcurves", ( PyCFunction ) Ipo_getNcurves, METH_NOARGS, - "() - Return number of Ipo curves"}, - {"getCurves", ( PyCFunction ) Ipo_getCurves, METH_NOARGS, - "() - Return list of all defined Ipo curves"}, - {"getCurve", ( PyCFunction ) Ipo_getCurve, METH_VARARGS, - "(str|int) - Returns specified Ipo curve"}, - {"getNBezPoints", ( PyCFunction ) Ipo_getNBezPoints, METH_VARARGS, - "(int) - Return number of Bez points on an Ipo curve"}, - {"delBezPoint", ( PyCFunction ) Ipo_DeleteBezPoints, METH_VARARGS, - "(int) - deprecated: use ipocurve.delBezier()"}, - {"getCurveBP", ( PyCFunction ) Ipo_getCurveBP, METH_VARARGS, - "() - unsupported"}, - {"EvaluateCurveOn", ( PyCFunction ) Ipo_EvaluateCurveOn, METH_VARARGS, - "(int,flt) - deprecated: see ipocurve.evaluate()"}, - {"getCurveCurval", ( PyCFunction ) Ipo_getCurvecurval, METH_VARARGS, - "(int) - deprecated: see ipocurve.evaluate()"}, - {"getCurveBeztriple", ( PyCFunction ) Ipo_getCurveBeztriple, METH_VARARGS, - "(int,int) - deprecated: see ipocurve.bezierPoints[]"}, - {"setCurveBeztriple", ( PyCFunction ) Ipo_setCurveBeztriple, METH_VARARGS, - "(int,int,list) - set a BezTriple"}, - - {"__copy__", ( PyCFunction ) Ipo_copy, METH_NOARGS, - "() - copy the ipo"}, - {"copy", ( PyCFunction ) Ipo_copy, METH_NOARGS, - "() - copy the ipo"}, - - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Ipo attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Ipo_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"curves", - (getter)Ipo_getCurves, (setter)NULL, - "Ipo curves", - NULL}, - {"curveConsts", - (getter)Ipo_getCurveNames, (setter)NULL, - "Ipo curve constants (values depend on Ipo type)", - NULL}, - {"channel", - (getter)Ipo_getChannel, (setter)Ipo_setChannel, - "Ipo texture channel (world, lamp, material Ipos only)", - NULL}, - - {"blocktype", - (getter)Ipo_getBlocktype, (setter)NULL, - "Ipo block type", - NULL}, - {"rctf", - (getter)Ipo_getRctf, (setter)Ipo_setRctf, - "Ipo type", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Ipo_Type Mapping Methods table: */ -/*****************************************************************************/ -static PyMappingMethods Ipo_as_mapping = { - ( inquiry ) Ipo_length, /* mp_length */ - ( binaryfunc ) Ipo_getIpoCurveByName, /* mp_subscript */ - ( objobjargproc ) Ipo_setIpoCurveByName, /* mp_ass_subscript */ -}; - -static PySequenceMethods Ipo_as_sequence = { - ( inquiry ) 0, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) 0, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - ( objobjproc ) Ipo_contains, /* sq_contains */ - ( binaryfunc ) 0, /* sq_inplace_concat */ - ( intargfunc ) 0, /* sq_inplace_repeat */ -}; - -/*****************************************************************************/ -/* Python Ipo_Type callback function prototypes: */ -/*****************************************************************************/ -/*static int IpoPrint (BPy_Ipo *self, FILE *fp, int flags);*/ -static int Ipo_compare( BPy_Ipo * a, BPy_Ipo * b ); -static PyObject *Ipo_repr( BPy_Ipo * self ); -static PyObject *Ipo_getIter( BPy_Ipo * self ); -static PyObject *Ipo_nextIter( BPy_Ipo * self ); - -/* #define CURVEATTRS */ /* uncomment to enable curves as Ipo attributes */ - -#ifdef CURVEATTRS -static PyGetSetDef BPy_Ipocurve_getseter = { - "noname", - (getter)NULL, (setter)NULL, - "Ipo curve name", - NULL -}; - -void generate_curveattrs( PyObject* dict, int blocktype ) -{ - typedef char * (*namefunc)(int, ... ); - namefunc lookup_name; - int size; - int *vals = NULL; - char name[32]; - PyObject*desc; - - switch ( blocktype ) { - case ID_OB: - lookup_name = (namefunc)getname_ob_ei; - vals = ob_ar; - size = OB_TOTIPO; - break; - case ID_MA: - lookup_name = (namefunc)getname_mat_ei; - vals = ma_ar; - size = MA_TOTIPO; - break; - case ID_CA: - lookup_name = (namefunc)getname_cam_ei; - vals = cam_ar; - size = CAM_TOTIPO; - break; - case ID_LA: - lookup_name = (namefunc)getname_la_ei; - vals = la_ar; - size = LA_TOTIPO; - break; - case ID_TE: - lookup_name = (namefunc)getname_tex_ei; - vals = te_ar; - size = TE_TOTIPO; - break; - case ID_WO: - lookup_name = (namefunc)getname_world_ei; - vals = wo_ar; - size = WO_TOTIPO; - break; - case ID_PO: - lookup_name = (namefunc)getname_ac_ei; - vals = ac_ar; - size = AC_TOTIPO; - break; - case ID_CO: - lookup_name = (namefunc)getname_co_ei; - vals = co_ar; - size = CO_TOTIPO; - break; - case ID_CU: - lookup_name = (namefunc)getname_cu_ei; - vals = cu_ar; - size = CU_TOTIPO; - break; - case ID_SEQ: - lookup_name = (namefunc)getname_seq_ei; - vals = seq_ar; - size = SEQ_TOTIPO; - break; - } - - desc = PyDescr_NewGetSet( &Ipo_Type, &BPy_Ipocurve_getseter ); - while( size-- ) { - strcpy( name, lookup_name( *vals ) ); - *name = tolower( *name ); - PyDict_SetItemString( dict, name, desc ); - ++vals; - } - Py_DECREF( desc ); -} - -static short lookup_curve_name( char *, int , int ); - -static PyObject *getattro( PyObject *self, PyObject *value ) -{ - char *name = PyString_AS_STRING( value ); - Ipo *ipo = ((BPy_Ipo *)self)->ipo; - int adrcode; - IpoCurve *icu; - - if( !strcmp(name, "__class__") ) - return PyObject_GenericGetAttr( self, value ); - - if( !strcmp(name, "__dict__") ) /* no effect */ - { - PyObject *dict; - dict = PyDict_Copy( self->ob_type->tp_dict ); - generate_curveattrs( dict, ipo->blocktype ); - return dict; - } - - adrcode = lookup_curve_name( name, ipo->blocktype, - ((BPy_Ipo *)self)->mtex ); - - if( adrcode != -1 ) { - for( icu = ipo->curve.first; icu; icu = icu->next ) - if( icu->adrcode == adrcode ) - return IpoCurve_CreatePyObject( icu ); - Py_RETURN_NONE; - } - - return PyObject_GenericGetAttr( self, value ); -} -#endif - -/*****************************************************************************/ -/* Python Ipo_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Ipo_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Ipo", /* char *tp_name; */ - sizeof( BPy_Ipo ), /* 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; */ - ( cmpfunc ) Ipo_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Ipo_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &Ipo_as_sequence, /* PySequenceMethods *tp_as_sequence; */ - &Ipo_as_mapping, /* PyMappingMethods *tp_as_mapping; */ - - /* More standard operations (here for binary compatibility) */ - - ( hashfunc ) GenericLib_hash, /* hashfunc tp_hash; */ - NULL, /* ternaryfunc tp_call; */ - NULL, /* reprfunc tp_str; */ -#ifdef CURVEATTRS - (getattrofunc)getattro, -#else - NULL, /* getattrofunc tp_getattro; */ -#endif - 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 */ - ( getiterfunc) Ipo_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) Ipo_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_Ipo_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Ipo_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 -}; - -/*****************************************************************************/ -/* internal utility routines */ -/*****************************************************************************/ - -/* - * Search through list of known Ipocurves for a particular name. - * - * str: name of curve we are searching for - * blocktype: type of Ipo - * channel: texture channel number, for World/Lamp/Material curves - * - * returns the adrcode for the named curve if it exists, -1 otherwise - */ - -/* this is needed since getname_ob_ei() is different from the rest */ - -typedef char * (*namefunc)(int, ... ); - -static short lookup_curve_name( char *str, int blocktype, int channel ) -{ - namefunc lookup_name; - int *adrcodes = NULL; - int size = 0; - - /* make sure channel type is ignored when it should be */ - if( blocktype != ID_WO && blocktype != ID_LA && blocktype != ID_MA ) - channel = -1; - - switch ( blocktype ) { - case ID_OB: - lookup_name = (namefunc)getname_ob_ei; - adrcodes = ob_ar; - size = OB_TOTIPO; - break; - case ID_MA: - lookup_name = (namefunc)getname_mat_ei; - adrcodes = ma_ar; - size = MA_TOTIPO; - break; - case ID_CA: - lookup_name = (namefunc)getname_cam_ei; - adrcodes = cam_ar; - size = CAM_TOTIPO; - break; - case ID_LA: - lookup_name = (namefunc)getname_la_ei; - adrcodes = la_ar; - size = LA_TOTIPO; - break; - case ID_TE: - lookup_name = (namefunc)getname_tex_ei; - adrcodes = te_ar; - size = TE_TOTIPO; - break; - case ID_WO: - lookup_name = (namefunc)getname_world_ei; - adrcodes = wo_ar; - size = WO_TOTIPO; - break; - case ID_PO: - lookup_name = (namefunc)getname_ac_ei; - adrcodes = ac_ar; - size = AC_TOTIPO; - break; - case ID_CO: - lookup_name = (namefunc)getname_co_ei; - adrcodes = co_ar; - size = CO_TOTIPO; - break; - case ID_CU: - lookup_name = (namefunc)getname_cu_ei; - adrcodes = cu_ar; - size = CU_TOTIPO; - break; - case ID_SEQ: - lookup_name = (namefunc)getname_seq_ei; - adrcodes = seq_ar; - size = SEQ_TOTIPO; - break; - case ID_KE: /* shouldn't happen */ - default: - return -1; - } - - while ( size-- ) { - char *name = lookup_name ( *adrcodes ); - - /* if not a texture channel, just return the adrcode */ - if( !strcmp( str, name ) ) { - if( channel == -1 || *adrcodes < MA_MAP1 ) - return (short)*adrcodes; - - /* otherwise adjust adrcode to include current channel */ - else { - int param = (short)*adrcodes & ~MA_MAP1; - param |= texchannel_to_adrcode( channel ); - return (short)param; - } - } - ++adrcodes; - } - return -1; -} - -static short lookup_curve_key( char *str, Ipo *ipo ) -{ - Key *keyiter; - - /* find the ipo in the keylist */ - for( keyiter = G.main->key.first; keyiter; keyiter = keyiter->id.next ) { - if( keyiter->ipo == ipo ) { - KeyBlock *block = keyiter->block.first; - - /* look for a matching string, get the adrcode */ - for( block = keyiter->block.first; block; block = block->next ) - if( !strcmp( str, block->name ) ) - return block->adrcode; - - /* no match; no addr code */ - return -1; - } - } - - /* error if the ipo isn't in the list */ - return -2; -} - -/* - * Search through list of known Ipocurves for a particular adrcode. - * - * code: adrcode of curve we are searching for - * blocktype: type of Ipo - * channel: texture channel number, for World/Lamp/Material curves - * - * returns the adrcode for the named curve if it exists, -1 otherwise - */ - -static short lookup_curve_adrcode( int code, int blocktype, int channel ) -{ - int *adrcodes = NULL; - int size = 0; - - switch ( blocktype ) { - case ID_OB: - adrcodes = ob_ar; - size = OB_TOTIPO; - break; - case ID_MA: - adrcodes = ma_ar; - size = MA_TOTIPO; - break; - case ID_CA: - adrcodes = cam_ar; - size = CAM_TOTIPO; - break; - case ID_LA: - adrcodes = la_ar; - size = LA_TOTIPO; - break; - case ID_TE: - adrcodes = te_ar; - size = TE_TOTIPO; - break; - case ID_WO: - adrcodes = wo_ar; - size = WO_TOTIPO; - break; - case ID_PO: - adrcodes = ac_ar; - size = AC_TOTIPO; - break; - case ID_CO: - adrcodes = co_ar; - size = CO_TOTIPO; - break; - case ID_CU: - adrcodes = cu_ar; - size = CU_TOTIPO; - break; - case ID_SEQ: - adrcodes = seq_ar; - size = SEQ_TOTIPO; - break; - case ID_KE: - default: - return -1; - } - - while ( size-- ) { - if( *adrcodes == code ) { - - /* if not a texture channel, just return the adrcode */ - if( channel == -1 || *adrcodes < MA_MAP1 ) - return (short)*adrcodes; - - /* otherwise adjust adrcode to include current channel */ - else { - int param = *adrcodes & ~MA_MAP1; - param |= texchannel_to_adrcode( channel ); - return (short)param; - } - } - ++adrcodes; - } - return -1; -} - -/* - * Delete an IpoCurve from an Ipo - */ - -static void del_ipocurve( Ipo * ipo, IpoCurve * icu ) { - BLI_remlink( &( ipo->curve ), icu ); - if( icu->bezt ) - MEM_freeN( icu->bezt ); - if( icu->driver ) - MEM_freeN( icu->driver ); - MEM_freeN( icu ); - - /* have to do this to avoid crashes in the IPO window */ - allspace( REMAKEIPO, 0 ); - EXPP_allqueue( REDRAWIPO, 0 ); -} - -/*****************************************************************************/ -/* Python BPy_Ipo functions: */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* Function: M_Ipo_New */ -/* Python equivalent: Blender.Ipo.New */ -/*****************************************************************************/ - -static PyObject *M_Ipo_New( PyObject * self_unused, PyObject * args ) -{ - char *name = NULL, *code = NULL; - int idcode = -1; - Ipo *blipo; - - if( !PyArg_ParseTuple( args, "ss", &code, &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected two string arguments" ); - - if( !strcmp( code, "Object" ) ) - idcode = ID_OB; - else if( !strcmp( code, "Camera" ) ) - idcode = ID_CA; - else if( !strcmp( code, "World" ) ) - idcode = ID_WO; - else if( !strcmp( code, "Material" ) ) - idcode = ID_MA; - else if( !strcmp( code, "Texture" ) ) - idcode = ID_TE; - else if( !strcmp( code, "Lamp" ) ) - idcode = ID_LA; - else if( !strcmp( code, "Action" ) ) - idcode = ID_PO; - else if( !strcmp( code, "Constraint" ) ) - idcode = ID_CO; - else if( !strcmp( code, "Sequence" ) ) - idcode = ID_SEQ; - else if( !strcmp( code, "Curve" ) ) - idcode = ID_CU; - else if( !strcmp( code, "Key" ) ) - idcode = ID_KE; - else return EXPP_ReturnPyObjError( PyExc_ValueError, - "unknown Ipo code" ); - - blipo = add_ipo( name, idcode ); - - if( blipo ) { - /* return user count to zero because add_ipo() inc'd it */ - blipo->id.us = 0; - /* create python wrapper obj */ - return Ipo_CreatePyObject( blipo ); - } else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Ipo Data in Blender" ); -} - -/*****************************************************************************/ -/* Function: M_Ipo_Get */ -/* Python equivalent: Blender.Ipo.Get */ -/* Description: Receives a string and returns the ipo data obj */ -/* whose name matches the string. If no argument is */ -/* passed in, a list of all ipo data names in the */ -/* current scene is returned. */ -/*****************************************************************************/ -static PyObject *M_Ipo_Get( PyObject * self_unused, PyObject * args ) -{ - char *name = NULL; - Ipo *ipo_iter; - PyObject *ipolist, *pyobj; - char error_msg[64]; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - ipo_iter = G.main->ipo.first; - - if( name ) { /* (name) - Search ipo by name */ - while( ipo_iter ) { - if( !strcmp( name, ipo_iter->id.name + 2 ) ) { - return Ipo_CreatePyObject( ipo_iter ); - } - ipo_iter = ipo_iter->id.next; - } - - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Ipo \"%s\" not found", name ); - return EXPP_ReturnPyObjError( PyExc_NameError, error_msg ); - } - - else { /* () - return a list with all ipos in the scene */ - int index = 0; - - ipolist = PyList_New( BLI_countlist( &( G.main->ipo ) ) ); - - if( !ipolist ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ); - - while( ipo_iter ) { - pyobj = Ipo_CreatePyObject( ipo_iter ); - - if( !pyobj ) - return NULL; - - PyList_SET_ITEM( ipolist, index, pyobj ); - - ipo_iter = ipo_iter->id.next; - index++; - } - - return ipolist; - } -} - -/* - * This should probably be deprecated too? Or else documented in epydocs. - * Seems very similar to Ipocurve.recalc(). - */ - -/*****************************************************************************/ -/* Function: M_Ipo_Recalc */ -/* Python equivalent: Blender.Ipo.Recalc */ -/* Description: Receives (presumably) an IpoCurve object and */ -/* updates the curve after changes to control points. */ -/*****************************************************************************/ -static PyObject *M_Ipo_Recalc( PyObject * self_unused, PyObject * value ) -{ - if( !BPy_IpoCurve_Check(value) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Ipo curve argument" ); - - testhandles_ipocurve( IpoCurve_FromPyObject( value ) ); - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Python BPy_Ipo methods: */ -/*****************************************************************************/ -static PyObject *Ipo_getBlocktype( BPy_Ipo * self ) -{ - return PyInt_FromLong( self->ipo->blocktype ); -} - -static int Ipo_setBlocktype( BPy_Ipo * self, PyObject * args ) -{ - if( !PyInt_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - self->ipo->blocktype = (short)PyInt_AS_LONG( args ); - - return 0; -} - -static PyObject *Ipo_getRctf( BPy_Ipo * self ) -{ - PyObject *l = PyList_New( 4 ); - PyList_SET_ITEM( l, 0, PyFloat_FromDouble( self->ipo->cur.xmin ) ); - PyList_SET_ITEM( l, 1, PyFloat_FromDouble( self->ipo->cur.xmax ) ); - PyList_SET_ITEM( l, 2, PyFloat_FromDouble( self->ipo->cur.ymin ) ); - PyList_SET_ITEM( l, 3, PyFloat_FromDouble( self->ipo->cur.ymax ) ); - return l; -} - -static int Ipo_setRctf( BPy_Ipo * self, PyObject * args ) -{ - float v[4]; - - if( !PyArg_ParseTuple( args, "ffff", v, v + 1, v + 2, v + 3 ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a tuple of 4 floats" ); - - self->ipo->cur.xmin = v[0]; - self->ipo->cur.xmax = v[1]; - self->ipo->cur.ymin = v[2]; - self->ipo->cur.ymax = v[3]; - - return 0; -} - -/* - * Get total number of Ipo curves for this Ipo. NOTE: this function - * returns all curves for Ipos which have texture channels, unlike - * Ipo_length(). - */ - -static PyObject *Ipo_getNcurves( BPy_Ipo * self ) -{ - IpoCurve *icu; - int i = 0; - - for( icu = self->ipo->curve.first; icu; icu = icu->next ) { - i++; - } - - return PyInt_FromLong( (long)i ); -} - -/* - Function: Ipo_addCurve - Bpy: Blender.Ipo.addCurve( 'curname') - - add a new curve to an existing IPO. - example: - ipo = Blender.Ipo.New('Object','ObIpo') - cu = ipo.addCurve('LocX') -*/ - -static PyObject *Ipo_addCurve( BPy_Ipo * self, PyObject * value ) -{ - short param; /* numeric curve name constant */ - char *cur_name = PyString_AsString(value); /* input arg: curve name */ - Ipo *ipo = 0; - IpoCurve *icu = 0; - Link *link; - - if( !cur_name ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected string argument" ) ); - - - /* chase down the ipo list looking for ours */ - link = G.main->ipo.first; - - while( link ) { - ipo = ( Ipo * ) link; - if( ipo == self->ipo ) - break; - link = link->next; - } - - if( !link ) - return EXPP_ReturnPyObjError - ( PyExc_RuntimeError, "Ipo not found" ); - - /* - * Check if the input arg curve name is valid depending on the block - * type, and set param to numeric value. Invalid names will return - * param = -1. - */ - - if( ipo->blocktype != ID_KE ) { - param = lookup_curve_name( cur_name, ipo->blocktype, self->mtex ); - } else { - param = lookup_curve_key( cur_name, ipo ); - if( param == -2 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unable to find matching key data for Ipo" ); - } - - if( param == -1 ) - return EXPP_ReturnPyObjError( PyExc_NameError, - "curve name is not valid" ); - - /* see if the curve already exists */ - for( icu = ipo->curve.first; icu; icu = icu->next ) - if( icu->adrcode == param ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Ipo curve already exists" ); - - /* create the new ipo curve */ - icu = MEM_callocN( sizeof(IpoCurve), "Python added ipocurve"); - icu->blocktype = ipo->blocktype; - icu->adrcode = param; - icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ; - set_icu_vars( icu ); - BLI_addtail( &(ipo->curve), icu); - - allspace( REMAKEIPO, 0 ); - EXPP_allqueue( REDRAWIPO, 0 ); - - /* create a bpy wrapper for the new ipo curve */ - return IpoCurve_CreatePyObject( icu ); -} - -/* - Function: Ipo_delCurve - Bpy: Blender.Ipo.delCurve(curtype) - - delete an existing curve from IPO. - example: - ipo = Blender.Ipo.New('Object','ObIpo') - cu = ipo.delCurve('LocX') -*/ - -static PyObject *Ipo_delCurve( BPy_Ipo * self, PyObject * value ) -{ - IpoCurve *icu; - char *strname = PyString_AsString(value); - - if( !strname ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - for( icu = self->ipo->curve.first; icu; icu = icu->next ) { - if( !strcmp( strname, getIpoCurveName( icu ) ) ) { - del_ipocurve( self->ipo, icu ); - Py_RETURN_NONE; - } - } - - return EXPP_ReturnPyObjError( PyExc_ValueError, "IpoCurve not found" ); -} -/* - */ - -static PyObject *Ipo_getCurve( BPy_Ipo * self, PyObject * args ) -{ - IpoCurve *icu = NULL; - short adrcode; - PyObject *value = NULL; - - if( !PyArg_ParseTuple( args, "|O", &value ) ) - goto typeError; - - /* if no name give, get all the Ipocurves */ - if( !value ) - return Ipo_getCurves( self ); - - /* if arg is a string or int, look up the adrcode */ - if( PyString_Check( value ) ) { - char *str = PyString_AsString( value ); - for( icu = self->ipo->curve.first; icu; icu = icu->next ) { - if( !strcmp( str, getIpoCurveName( icu ) ) ) - return IpoCurve_CreatePyObject( icu ); - } - Py_RETURN_NONE; - } - else if( PyInt_Check( value ) ) { - adrcode = ( short )PyInt_AsLong( value ); - for( icu = self->ipo->curve.first; icu; icu = icu->next ) { - if( icu->adrcode == adrcode ) - return IpoCurve_CreatePyObject( icu ); - } - Py_RETURN_NONE; - } - -typeError: - return EXPP_ReturnPyObjError(PyExc_TypeError, - "expected string or int argument" ); -} - -static PyObject *Ipo_getCurves( BPy_Ipo * self ) -{ - PyObject *attr = PyList_New( 0 ), *pyipo; - IpoCurve *icu; - - for( icu = self->ipo->curve.first; icu; icu = icu->next ) { - pyipo = IpoCurve_CreatePyObject( icu ); - PyList_Append( attr, pyipo ); - Py_DECREF(pyipo); - } - return attr; -} - -/* - * return a list of valid curve name constants for the Ipo - */ - -static PyObject *Ipo_getCurveNames( BPy_Ipo * self ) -{ - namefunc lookup_name; - int size; - PyObject *dict; - int *vals = NULL; - char name[32]; - PyObject *attr = Py_None; - - /* determine what type of Ipo we are */ - - switch ( self->ipo->blocktype ) { - case ID_OB: - lookup_name = (namefunc)getname_ob_ei; - vals = ob_ar; - size = OB_TOTIPO; - strcpy( name, "OB_" ); - break; - case ID_MA: - lookup_name = (namefunc)getname_mat_ei; - vals = ma_ar; - size = MA_TOTIPO; - strcpy( name, "MA_" ); - break; - case ID_CA: - lookup_name = (namefunc)getname_cam_ei; - vals = cam_ar; - size = CAM_TOTIPO; - strcpy( name, "CA_" ); - break; - case ID_LA: - lookup_name = (namefunc)getname_la_ei; - vals = la_ar; - size = LA_TOTIPO; - strcpy( name, "LA_" ); - break; - case ID_TE: - lookup_name = (namefunc)getname_tex_ei; - vals = te_ar; - size = TE_TOTIPO; - strcpy( name, "TE_" ); - break; - case ID_WO: - lookup_name = (namefunc)getname_world_ei; - vals = wo_ar; - size = WO_TOTIPO; - strcpy( name, "WO_" ); - break; - case ID_PO: - lookup_name = (namefunc)getname_ac_ei; - vals = ac_ar; - size = AC_TOTIPO; - strcpy( name, "PO_" ); - break; - case ID_CO: - lookup_name = (namefunc)getname_co_ei; - vals = co_ar; - size = CO_TOTIPO; - strcpy( name, "CO_" ); - break; - case ID_CU: - lookup_name = (namefunc)getname_cu_ei; - vals = cu_ar; - size = CU_TOTIPO; - strcpy( name, "CU_" ); - break; - case ID_SEQ: - lookup_name = (namefunc)getname_seq_ei; - vals = seq_ar; - size = SEQ_TOTIPO; - strcpy( name, "SQ_" ); - break; - case ID_KE: - { - Key *key; - - /* find the ipo in the keylist */ - for( key = G.main->key.first; key; key = key->id.next ) { - if( key->ipo == self->ipo ) { - PyObject *tmpstr; - KeyBlock *block = key->block.first; - attr = PyList_New( 0 ); - - /* add each name to the list */ - for( block = key->block.first; block; block = block->next ) { - tmpstr = PyString_FromString( block->name ); - PyList_Append( attr, tmpstr); - Py_DECREF(tmpstr); - } - return attr; - } - } - - /* error if the ipo isn't in the list */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unable to find matching key data for Ipo" ); - } - default: - Py_DECREF( attr ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unknown Ipo type" ); - } - - /* - * go through the list of adrcodes to find names, then add to dictionary - * with string as key and adrcode as value - */ - - dict = PyModule_GetDict( submodule ); - attr = PyConstant_New(); - - while( size-- ) { - char *ptr = name+3; - strcpy( name+3, lookup_name( *vals ) ); - while( *ptr ) { - *ptr = (char)toupper( *ptr ); - ++ptr; - } - PyConstant_Insert( (BPy_constant *)attr, name, - PyInt_FromLong( *vals ) ); - ++vals; - } - return attr; -} - -void generate_curveconsts( PyObject* module ) -{ - namefunc lookup_name = NULL; - int size = 0; - int *vals = NULL; - char name[32]; - - unsigned int i = 0; - static short curvelist[] = { - ID_OB, ID_MA, ID_CA, ID_LA, ID_TE, ID_WO, ID_PO, ID_CO, ID_CU, ID_SEQ - }; - - for( i = 0; i < sizeof(curvelist)/sizeof(short); ++i ) { - switch ( curvelist[i] ) { - case ID_OB: - lookup_name = (namefunc)getname_ob_ei; - vals = ob_ar; - size = OB_TOTIPO; - strcpy( name, "OB_" ); - break; - case ID_MA: - lookup_name = (namefunc)getname_mat_ei; - vals = ma_ar; - size = MA_TOTIPO; - strcpy( name, "MA_" ); - break; - case ID_CA: - lookup_name = (namefunc)getname_cam_ei; - vals = cam_ar; - size = CAM_TOTIPO; - strcpy( name, "CA_" ); - break; - case ID_LA: - lookup_name = (namefunc)getname_la_ei; - vals = la_ar; - size = LA_TOTIPO; - strcpy( name, "LA_" ); - break; - case ID_TE: - lookup_name = (namefunc)getname_tex_ei; - vals = te_ar; - size = TE_TOTIPO; - strcpy( name, "TE_" ); - break; - case ID_WO: - lookup_name = (namefunc)getname_world_ei; - vals = wo_ar; - size = WO_TOTIPO; - strcpy( name, "WO_" ); - break; - case ID_PO: - lookup_name = (namefunc)getname_ac_ei; - vals = ac_ar; - size = AC_TOTIPO; - strcpy( name, "PO_" ); - break; - case ID_CO: - lookup_name = (namefunc)getname_co_ei; - vals = co_ar; - size = CO_TOTIPO; - strcpy( name, "CO_" ); - break; - case ID_CU: - lookup_name = (namefunc)getname_cu_ei; - vals = cu_ar; - size = CU_TOTIPO; - strcpy( name, "CU_" ); - break; - case ID_SEQ: - lookup_name = (namefunc)getname_seq_ei; - vals = seq_ar; - size = SEQ_TOTIPO; - strcpy( name, "SQ_" ); - break; - } - - while( size-- ) { - char *ptr = name+3; - strcpy( name+3, lookup_name( *vals ) ); - while( *ptr ) { - *ptr = (char)toupper( *ptr ); - ++ptr; - } - PyModule_AddIntConstant( module, name, *vals ); - ++vals; - } - } -} - - -/* - * get the current texture channel number, if defined - */ - -static PyObject *Ipo_getChannel( BPy_Ipo * self ) -{ - if( self->mtex != -1 ) - return PyInt_FromLong( (long)self->mtex ); - Py_RETURN_NONE; -} - -/* - * set the current texture channel number, if defined - */ - -static int Ipo_setChannel( BPy_Ipo * self, PyObject * value ) -{ - if( self->mtex != -1 ) - return EXPP_setIValueRange( value, &self->mtex, 0, 9, 'h' ); - return 0; -} - -/*****************************************************************************/ -/* Function: Ipo_compare */ -/* Description: This compares 2 ipo python types, == or != only. */ -/*****************************************************************************/ -static int Ipo_compare( BPy_Ipo * a, BPy_Ipo * b ) -{ - return ( a->ipo == b->ipo ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Ipo_repr */ -/* Description: This is a callback function for the BPy_Ipo type. It */ -/* builds a meaningful string to represent ipo objects. */ -/*****************************************************************************/ -static PyObject *Ipo_repr( BPy_Ipo * self ) -{ - char *param; - - switch ( self->ipo->blocktype ) { - case ID_OB: - param = "Object"; break; - case ID_CA: - param = "Camera"; break; - case ID_LA: - param = "Lamp"; break; - case ID_TE: - param = "Texture"; break; - case ID_WO: - param = "World"; break; - case ID_MA: - param = "Material"; break; - case ID_PO: - param = "Action"; break; - case ID_CO: - param = "Constriant"; break; - case ID_CU: - param = "Curve"; break; - case ID_SEQ: - param = "Sequence"; break; - case ID_KE: - param = "Key"; break; - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unknown Ipo type" ); - } - return PyString_FromFormat( "[Ipo \"%s\" (%s)]", self->ipo->id.name + 2, - param ); -} - -/* Three Python Ipo_Type helper functions needed by the Object module: */ - -/*****************************************************************************/ -/* Function: Ipo_CreatePyObject */ -/* Description: This function will create a new BPy_Ipo from an existing */ -/* Blender ipo structure. */ -/*****************************************************************************/ -PyObject *Ipo_CreatePyObject( Ipo * ipo ) -{ - BPy_Ipo *pyipo; - pyipo = ( BPy_Ipo * ) PyObject_NEW( BPy_Ipo, &Ipo_Type ); - if( !pyipo ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Ipo object" ); - pyipo->ipo = ipo; - pyipo->iter = 0; - if( pyipo->ipo->blocktype == ID_WO || pyipo->ipo->blocktype == ID_LA || - pyipo->ipo->blocktype == ID_MA ) - pyipo->mtex = 0; - else - pyipo->mtex = -1; - return ( PyObject * ) pyipo; -} - -/*****************************************************************************/ -/* Function: Ipo_FromPyObject */ -/* Description: This function returns the Blender ipo from the given */ -/* PyObject. */ -/*****************************************************************************/ -Ipo *Ipo_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Ipo * ) pyobj )->ipo; -} - -/*****************************************************************************/ -/* Function: Ipo_length */ -/* Description: This function counts the number of curves accessible for the */ -/* PyObject. */ -/*****************************************************************************/ -static int Ipo_length( BPy_Ipo * self ) -{ - IpoCurve *icu; - int len = 0; - - for( icu = self->ipo->curve.first; icu; icu = icu->next ) { - if( self->mtex == -1 || icu->adrcode < MA_MAP1 || - icu->adrcode & texchannel_to_adrcode( self->mtex ) ) - ++len; - } - return len; -} - -/* - * "mapping" operator getter: return an IpoCurve it we can find it - */ - -static PyObject *Ipo_getIpoCurveByName( BPy_Ipo * self, PyObject * key ) -{ - IpoCurve *icu = NULL; - int adrcode; - - /* if Ipo is not ShapeKey and arg is an int, look up the adrcode */ - if( self->ipo->blocktype != ID_KE && PyNumber_Check( key ) ) - adrcode = lookup_curve_adrcode( PyInt_AsLong( key ), - self->ipo->blocktype, self->mtex ); - /* if Ipo is ShapeKey and arg is string, look up the adrcode */ - else if( self->ipo->blocktype == ID_KE && PyString_Check( key ) ) { - adrcode = lookup_curve_key( PyString_AS_STRING( key ), self->ipo ); - if( adrcode == -2 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unable to find matching key data for Ipo" ); - } - else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int or string key" ); - - /* if no adrcode found, value error */ - if( adrcode == -1 ) - return EXPP_ReturnPyObjError( PyExc_KeyError, "invalid curve key" ); - - /* search for a matching adrcode */ - for( icu = self->ipo->curve.first; icu; icu = icu->next ) - if( icu->adrcode == adrcode ) - return IpoCurve_CreatePyObject( icu ); - - /* no curve found */ - Py_RETURN_NONE; -} - -/* - * "mapping" operator setter: create or delete an IpoCurve it we can find it - */ - -static int Ipo_setIpoCurveByName( BPy_Ipo * self, PyObject * key, - PyObject * arg ) -{ - IpoCurve *icu; - Ipo *ipo = self->ipo; - short adrcode; - - /* "del ipo[const]" will send NULL here; give an error */ - if( !arg ) - return EXPP_ReturnIntError( PyExc_NotImplementedError, - "del operator not supported" ); - - /* "del ipo[const]" will send NULL here; give an error */ - if( self->ipo->blocktype == ID_KE ) - return EXPP_ReturnIntError( PyExc_TypeError, - "creation or deletion of Shape Keys not supported" ); - - /* check for int argument */ - if( !PyNumber_Check( key ) ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected int key" ); - - /* look up the key, return error if not found */ - adrcode = lookup_curve_adrcode( PyInt_AsLong( key ), - self->ipo->blocktype, self->mtex ); - - if( adrcode == -1 ) - return EXPP_ReturnIntError( PyExc_KeyError, - "invalid curve specified" ); - - /* if arg is None, delete the curve */ - if( arg == Py_None ) { - for( icu = self->ipo->curve.first; icu; icu = icu->next ) { - if( icu->adrcode == adrcode ) { - del_ipocurve( ipo, icu ); - return 0; - } - } - - return EXPP_ReturnIntError( PyExc_ValueError, "IpoCurve not found" ); - } else { - - /* create the new ipo curve */ - float time, curval; - PyObject *tmp, *flt=NULL, *val=NULL; - - /* error if not a sequence or sequence with other than 2 values */ - if( PySequence_Size( arg ) != 2 ) - goto AttrError; - - /* get the time and curval */ - tmp = PySequence_ITEM( arg, 0 ); - flt = PyNumber_Float( tmp ); - Py_DECREF( tmp ); - tmp = PySequence_ITEM( arg, 1 ); - val = PyNumber_Float( tmp ); - Py_DECREF( tmp ); - - if( !flt || !val ) - goto AttrError; - - time = (float)PyFloat_AS_DOUBLE( flt ); - curval = (float)PyFloat_AS_DOUBLE( val ); - Py_DECREF( flt ); - Py_DECREF( val ); - - /* if curve already exist, delete the original */ - for( icu = ipo->curve.first; icu; icu = icu->next ) - if( icu->adrcode == adrcode ) { - del_ipocurve( ipo, icu ); - break; - } - - /* create the new curve, then add the key */ - icu = MEM_callocN( sizeof(IpoCurve), "Python added ipocurve"); - icu->blocktype = ipo->blocktype; - icu->adrcode = adrcode; - icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ; - set_icu_vars( icu ); - BLI_addtail( &(ipo->curve), icu); - insert_vert_icu( icu, time, curval, 0); - - allspace( REMAKEIPO, 0 ); - EXPP_allqueue( REDRAWIPO, 0 ); - - return 0; - -AttrError: - Py_XDECREF( val ); - Py_XDECREF( flt ); - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected sequence of two floats" ); - } -} - -/* - * sequence __contains__ method (implements "x in ipo") - */ - -static int Ipo_contains( BPy_Ipo *self, PyObject *key ) -{ - IpoCurve *icu = NULL; - int adrcode; - - /* take a Ipo curve name: key must be a int */ - - if( self->ipo->blocktype != ID_KE && PyNumber_Check( key ) ) { - adrcode = lookup_curve_adrcode( PyInt_AsLong( key ), - self->ipo->blocktype, self->mtex ); - - /* if we found an adrcode for the key, search the ipo's curve */ - if( adrcode != -1 ) { - for( icu = self->ipo->curve.first; icu; icu = icu->next ) - if( icu->adrcode == adrcode ) - return 1; - } - } else if( self->ipo->blocktype == ID_KE && PyString_Check( key ) ) { - adrcode = lookup_curve_key( PyString_AS_STRING( key ), self->ipo ); - - /* if we found an adrcode for the key, search the ipo's curve */ - if( adrcode >= 0 ) { - for( icu = self->ipo->curve.first; icu; icu = icu->next ) - if( icu->adrcode == adrcode ) - return 1; - } - } - - /* no curve found */ - return 0; -} - -/* - * Initialize the interator index - */ - -static PyObject *Ipo_getIter( BPy_Ipo * self ) -{ - /* return a new IPO object if we are looping on the existing one - This allows nested loops */ - if (self->iter==0) { - return EXPP_incr_ret ( (PyObject *) self ); - } else { - return Ipo_CreatePyObject(self->ipo); - } -} - -/* - * Get the next Ipo curve - */ - -static PyObject *Ipo_nextIter( BPy_Ipo * self ) -{ - int i; - IpoCurve *icu = self->ipo->curve.first; - - ++self->iter; - - /* - * count curves only if - * (a) Ipo has no texture channels - * (b) Ipo has texture channels, but curve is not that type - * (c) Ipo has texture channels, and curve is that type, and it is - * in the active texture channel - */ - for( i = 0; icu; icu = icu->next ) { - if( self->mtex == -1 || icu->adrcode < MA_MAP1 || - icu->adrcode & texchannel_to_adrcode( self->mtex ) ) { - ++i; - - /* if indices match, return the curve */ - if( i == self->iter ) - return IpoCurve_CreatePyObject( icu ); - } - } - - self->iter = 0; /* allow iter use again */ - /* ran out of curves */ - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); -} - -/*****************************************************************************/ -/* Function: Ipo_Init */ -/*****************************************************************************/ -PyObject *Ipo_Init( void ) -{ - /* PyObject *submodule; */ - - if( PyType_Ready( &Ipo_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Ipo", M_Ipo_methods, M_Ipo_doc ); - generate_curveconsts( submodule ); - - return submodule; -} - -/* - * The following methods should be deprecated when there are equivalent - * methods in Ipocurve (if there aren't already). - */ - -static PyObject *Ipo_getNBezPoints( BPy_Ipo * self, PyObject * args ) -{ - int num = 0; - IpoCurve *icu = NULL; - - if( !PyArg_ParseTuple( args, "i", &num ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ); - - icu = self->ipo->curve.first; - while( icu && num > 0 ) { - icu = icu->next; - --num; - } - - if( num < 0 || !icu ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "index out of range" ); - - return PyInt_FromLong( icu->totvert ); -} - -static PyObject *Ipo_DeleteBezPoints( BPy_Ipo * self, PyObject * args ) -{ - int num = 0, i = 0; - IpoCurve *icu = 0; - if( !PyArg_ParseTuple( args, "i", &num ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected int argument" ) ); - icu = self->ipo->curve.first; - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "No IPO curve" ) ); - for( i = 0; i < num; i++ ) { - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "Bad curve number" ) ); - icu = icu->next; - - } - icu->totvert--; - return ( PyInt_FromLong( icu->totvert ) ); -} - -/* - * Ipo_getCurveBP() - * this method is UNSUPPORTED. - * Calling this method throws a TypeError Exception. - * - * it looks like the original intent was to return the first point - * of a BPoint Ipo curve. However, BPoint ipos are not currently - * implemented. - */ - -static PyObject *Ipo_getCurveBP( BPy_Ipo * self_unused, PyObject * args_unused ) -{ - return EXPP_ReturnPyObjError( PyExc_NotImplementedError, - "bpoint ipos are not supported" ); -} - -static PyObject *Ipo_getCurveBeztriple( BPy_Ipo * self, PyObject * args ) -{ - struct BezTriple *ptrbt; - int num = 0, pos, i, j; - IpoCurve *icu; - PyObject *l, *pyfloat; - - if( !PyArg_ParseTuple( args, "ii", &num, &pos ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected int argument" ) ); - icu = self->ipo->curve.first; - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "No IPO curve" ) ); - for( i = 0; i < num; i++ ) { - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "Bad ipo number" ) ); - icu = icu->next; - } - if( pos >= icu->totvert ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Bad bezt number" ); - - ptrbt = icu->bezt + pos; - if( !ptrbt ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "No bez triple" ); - - l = PyList_New( 0 ); - for( i = 0; i < 3; i++ ) { - for( j = 0; j < 3; j++ ) { - pyfloat = PyFloat_FromDouble( ptrbt->vec[i][j] ); - PyList_Append( l, pyfloat ); - Py_DECREF(pyfloat); - } - } - return l; -} - -static PyObject *Ipo_setCurveBeztriple( BPy_Ipo * self, PyObject * args ) -{ - struct BezTriple *ptrbt; - int num = 0, pos, i; - IpoCurve *icu; - PyObject *listargs = 0; - - if( !PyArg_ParseTuple( args, "iiO", &num, &pos, &listargs ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "expected int int object argument" ) ); - if( !PyTuple_Check( listargs ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "3rd arg should be a tuple" ) ); - icu = self->ipo->curve.first; - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "No IPO curve" ) ); - for( i = 0; i < num; i++ ) { - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "Bad ipo number" ) ); - icu = icu->next; - } - if( pos >= icu->totvert ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Bad bezt number" ); - - ptrbt = icu->bezt + pos; - if( !ptrbt ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "No bez triple" ); - - for( i = 0; i < 9; i++ ) { - PyObject *xx = PyTuple_GetItem( listargs, i ); - ptrbt->vec[i / 3][i % 3] = (float)PyFloat_AsDouble( xx ); - } - - Py_INCREF( Py_None ); - return Py_None; -} - -/* Ipo.__copy__ */ -static PyObject *Ipo_copy( BPy_Ipo * self ) -{ - Ipo *ipo = copy_ipo(self->ipo ); - ipo->id.us = 0; - return Ipo_CreatePyObject(ipo); -} - -static PyObject *Ipo_EvaluateCurveOn( BPy_Ipo * self, PyObject * args ) -{ - int num = 0, i; - IpoCurve *icu; - float time = 0; - - if( !PyArg_ParseTuple( args, "if", &num, &time ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected int argument" ) ); - - icu = self->ipo->curve.first; - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "No IPO curve" ) ); - - for( i = 0; i < num; i++ ) { - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "Bad ipo number" ) ); - icu = icu->next; - - } - return PyFloat_FromDouble( eval_icu( icu, time ) ); -} - -static PyObject *Ipo_getCurvecurval( BPy_Ipo * self, PyObject * args ) -{ - int numcurve = 0, i; - IpoCurve *icu; - char *stringname = 0, *str1 = 0; - - icu = self->ipo->curve.first; - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "No IPO curve" ) ); - - if( PyNumber_Check( PyTuple_GetItem( args, 0 ) ) ) /* args is an integer */ - { - if( !PyArg_ParseTuple( args, "i", &numcurve ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "expected int or string argument" ) ); - for( i = 0; i < numcurve; i++ ) { - if( !icu ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "Bad ipo number" ) ); - icu = icu->next; - } - } - - else /* args is a string */ - { - if( !PyArg_ParseTuple( args, "s", &stringname ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, - "expected int or string argument" ) ); - while( icu ) { - str1 = getIpoCurveName( icu ); - if( !strcmp( str1, stringname ) ) - break; - icu = icu->next; - } - } - - if( icu ) - return PyFloat_FromDouble( icu->curval ); - Py_RETURN_NONE; -} - -/* - * The following methods should be deprecated when methods are pruned out. - */ - -static PyObject *Ipo_oldsetRctf( BPy_Ipo * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Ipo_setRctf ); -} - -static PyObject *Ipo_oldsetBlocktype( BPy_Ipo * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Ipo_setBlocktype ); -} diff --git a/source/blender/python/api2_2x/Ipo.h b/source/blender/python/api2_2x/Ipo.h deleted file mode 100644 index 35893015a79..00000000000 --- a/source/blender/python/api2_2x/Ipo.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * $Id: Ipo.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_IPO_H -#define EXPP_IPO_H - -#include -#include "DNA_ipo_types.h" - -/*****************************************************************************/ -/* Python BPy_Ipo structure definition: */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD /* required macro */ - Ipo * ipo; /* libdata must be second */ - short iter; - short mtex; -} BPy_Ipo; - -extern PyTypeObject Ipo_Type; - -#define BPy_Ipo_Check(v) ((v)->ob_type == &Ipo_Type) /* for type checking */ - - -/* - * prototypes - */ - -PyObject *Ipo_Init( void ); -PyObject *Ipo_CreatePyObject( struct Ipo *ipo ); -Ipo *Ipo_FromPyObject( PyObject * py_obj ); - - -#endif /* EXPP_IPO_H */ diff --git a/source/blender/python/api2_2x/Ipocurve.c b/source/blender/python/api2_2x/Ipocurve.c deleted file mode 100644 index cc4cb066fe7..00000000000 --- a/source/blender/python/api2_2x/Ipocurve.c +++ /dev/null @@ -1,1080 +0,0 @@ -/* - * $Id: Ipocurve.c 12078 2007-09-18 06:41:29Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot, Nathan Letwory, Ken Hughes, Johnny Matthews - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Ipocurve.h" /*This must come first*/ - -#include "Object.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_depsgraph.h" -#include "BKE_ipo.h" -#include "BIF_space.h" -#include "BSE_editipo.h" -#include "MEM_guardedalloc.h" -#include "DNA_ipo_types.h" -#include "DNA_key_types.h" -#include "BezTriple.h" -#include "gen_utils.h" - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.IpoCurve.__doc__ */ -/*****************************************************************************/ -char M_IpoCurve_doc[] = ""; -char M_IpoCurve_New_doc[] = ""; -char M_IpoCurve_Get_doc[] = ""; - -/*****************************************************************************/ -/* Python method structure definition for Blender.IpoCurve module: */ -/*****************************************************************************/ - -struct PyMethodDef M_IpoCurve_methods[] = { - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python C_IpoCurve methods declarations: */ -/*****************************************************************************/ -static PyObject *IpoCurve_getName( C_IpoCurve * self ); -static PyObject *IpoCurve_Recalc( C_IpoCurve * self ); -static PyObject *IpoCurve_append( C_IpoCurve * self, PyObject * value ); -static PyObject *IpoCurve_addBezier( C_IpoCurve * self, PyObject * value ); -static PyObject *IpoCurve_delBezier( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_setInterpolation( C_IpoCurve * self, - PyObject * value ); -static PyObject *IpoCurve_getInterpolation( C_IpoCurve * self ); -static PyObject *IpoCurve_newgetInterp( C_IpoCurve * self ); -static int IpoCurve_newsetInterp( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_setExtrapolation( C_IpoCurve * self, - PyObject * value ); -static PyObject *IpoCurve_getExtrapolation( C_IpoCurve * self ); -static PyObject *IpoCurve_newgetExtend( C_IpoCurve * self ); -static int IpoCurve_newsetExtend( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_getPoints( C_IpoCurve * self ); -static PyObject *IpoCurve_evaluate( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_getDriver( C_IpoCurve * self ); -static int IpoCurve_setDriver( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_getDriverObject( C_IpoCurve * self); -static int IpoCurve_setDriverObject( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_getDriverChannel( C_IpoCurve * self); -static int IpoCurve_setDriverChannel( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_getDriverExpression( C_IpoCurve * self); -static PyObject *IpoCurve_getFlag( C_IpoCurve * self, void *type); -static int IpoCurve_setFlag( C_IpoCurve * self, PyObject *value, void *type); - -static int IpoCurve_setDriverExpression( C_IpoCurve * self, PyObject * args ); -static PyObject *IpoCurve_getCurval( C_IpoCurve * self, PyObject * args ); -static int IpoCurve_setCurval( C_IpoCurve * self, PyObject * key, - PyObject * value ); - -/*****************************************************************************/ -/* Python C_IpoCurve methods table: */ -/*****************************************************************************/ -static PyMethodDef C_IpoCurve_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) IpoCurve_getName, METH_NOARGS, - "() - Return IpoCurve name"}, - {"Recalc", ( PyCFunction ) IpoCurve_Recalc, METH_NOARGS, - "() - deprecated method. use recalc() instead"}, - {"recalc", ( PyCFunction ) IpoCurve_Recalc, METH_NOARGS, - "() - Recomputes the curve after changes"}, - {"update", ( PyCFunction ) IpoCurve_Recalc, METH_NOARGS, - "() - deprecated method: use recalc method instead."}, - {"append", ( PyCFunction ) IpoCurve_append, METH_O, - "(coordlist) - Adds a Bezier point to a curve"}, - {"addBezier", ( PyCFunction ) IpoCurve_addBezier, METH_O, - "() - deprecated method. use append() instead"}, - {"delBezier", ( PyCFunction ) IpoCurve_delBezier, METH_VARARGS, - "() - deprecated method. use \"del icu[index]\" instead"}, - {"setInterpolation", ( PyCFunction ) IpoCurve_setInterpolation, - METH_O, "(str) - Sets the interpolation type of the curve"}, - {"getInterpolation", ( PyCFunction ) IpoCurve_getInterpolation, - METH_NOARGS, "() - Gets the interpolation type of the curve"}, - {"setExtrapolation", ( PyCFunction ) IpoCurve_setExtrapolation, - METH_O, "(str) - Sets the extend mode of the curve"}, - {"getExtrapolation", ( PyCFunction ) IpoCurve_getExtrapolation, - METH_NOARGS, "() - Gets the extend mode of the curve"}, - {"getPoints", ( PyCFunction ) IpoCurve_getPoints, METH_NOARGS, - "() - Returns list of all bezTriples of the curve"}, - {"evaluate", ( PyCFunction ) IpoCurve_evaluate, METH_VARARGS, - "(float) - Evaluate curve at given time"}, - {NULL, NULL, 0, NULL} -}; - -/* - * IpoCurve methods - */ - -static PyGetSetDef C_IpoCurve_getseters[] = { - {"name", - (getter)IpoCurve_getName, (setter)NULL, - "the IpoCurve name", - NULL}, - {"bezierPoints", - (getter)IpoCurve_getPoints, (setter)NULL, - "list of all bezTriples of the curve", - NULL}, - {"driver", - (getter)IpoCurve_getDriver, (setter)IpoCurve_setDriver, - "The status of the driver 1-object, 2-py expression, 0-off", - NULL}, - {"driverObject", - (getter)IpoCurve_getDriverObject, (setter)IpoCurve_setDriverObject, - "The object used to drive the IpoCurve", - NULL}, - {"driverChannel", - (getter)IpoCurve_getDriverChannel, (setter)IpoCurve_setDriverChannel, - "The channel on the driver object used to drive the IpoCurve", - NULL}, - {"driverExpression", - (getter)IpoCurve_getDriverExpression, (setter)IpoCurve_setDriverExpression, - "The python expression on the driver used to drive the IpoCurve", - NULL}, - {"interpolation", - (getter)IpoCurve_newgetInterp, (setter)IpoCurve_newsetInterp, - "The interpolation mode of the curve", - NULL}, - {"extend", - (getter)IpoCurve_newgetExtend, (setter)IpoCurve_newsetExtend, - "The extend mode of the curve", - NULL}, - - {"sel", - (getter)IpoCurve_getFlag, (setter)IpoCurve_setFlag, - "the selection state of the curve", - (void *)IPO_SELECT}, - - {NULL,NULL,NULL,NULL,NULL} -}; - -/*****************************************************************************/ -/* Python IpoCurve_Type Mapping Methods table: */ -/*****************************************************************************/ - -static PyMappingMethods IpoCurve_as_mapping = { - ( inquiry ) 0, /* mp_length */ - ( binaryfunc ) IpoCurve_getCurval, /* mp_subscript */ - ( objobjargproc ) IpoCurve_setCurval, /* mp_ass_subscript */ -}; - -/*****************************************************************************/ -/* Python IpoCurve_Type callback function prototypes: */ -/*****************************************************************************/ -static int IpoCurve_compare( C_IpoCurve * a, C_IpoCurve * b ); -static PyObject *IpoCurve_repr( C_IpoCurve * self ); - -/*****************************************************************************/ -/* Python IpoCurve_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject IpoCurve_Type = { - PyObject_HEAD_INIT( NULL ) /* required macro */ - 0, /* ob_size */ - "IpoCurve", /* tp_name */ - sizeof( C_IpoCurve ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - 0, /* tp_print */ - ( getattrfunc ) NULL, /* tp_getattr */ - ( setattrfunc ) NULL, /* tp_setattr */ - ( cmpfunc ) IpoCurve_compare, /* tp_compare */ - ( reprfunc ) IpoCurve_repr, /* tp_repr */ - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - &IpoCurve_as_mapping, /* 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; */ - /*** 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 ***/ - C_IpoCurve_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - C_IpoCurve_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 -}; - -/*****************************************************************************/ -/* local utility functions */ -/*****************************************************************************/ - -/* - * Keys are handled differently than other Ipos, so go through contortions - * to find their names. - */ - -static char *get_key_curvename( IpoCurve *ipocurve ) -{ - Key *key_iter; - char *empty = ""; - - /* search for keys with an Ipo */ - - for( key_iter = G.main->key.first; key_iter; key_iter=key_iter->id.next) { - if( key_iter->ipo ) { - IpoCurve *icu = key_iter->ipo->curve.first; - /* search curves for a match */ - while( icu ) { - if( icu == ipocurve ) { - KeyBlock *block = key_iter->block.first; - /* search for matching adrcode */ - while( block ) { - if( block->adrcode == ipocurve->adrcode ) - return block->name; - block = block->next; - } - } - icu = icu->next; - } - } - } - - /* shouldn't get here unless deleted in UI while BPy object alive */ - return empty; -} - -/* - * internal bpy func to get Ipo Curve Name, used by Ipo.c and - * KX_BlenderSceneConverter.cpp. - * - * We are returning a pointer to string constants so there are - * no issues with who owns pointers. - */ - -char *getIpoCurveName( IpoCurve * icu ) -{ - switch ( icu->blocktype ) { - case ID_MA: - return getname_mat_ei( icu->adrcode ); - case ID_WO: - return getname_world_ei( icu->adrcode ); - case ID_CA: - return getname_cam_ei( icu->adrcode ); - case ID_OB: - return getname_ob_ei( icu->adrcode, 1 ); - /* solve: what if EffX/Y/Z are wanted? */ - case ID_TE: - return getname_tex_ei( icu->adrcode ); - case ID_LA: - return getname_la_ei( icu->adrcode ); - case ID_PO: - return getname_ac_ei( icu->adrcode ); - case ID_CU: - return getname_cu_ei( icu->adrcode ); - case ID_KE: - /* return "Key"; */ - /* ipo curves have no names... that was only meant for drawing the buttons... (ton) */ - return get_key_curvename( icu ); - case ID_SEQ: - return getname_seq_ei( icu->adrcode ); - case ID_CO: - return getname_co_ei( icu->adrcode ); - } - return NULL; -} - -/* - * delete a bezTriple from a curve - */ - -static void del_beztriple( IpoCurve *icu, int index ) -{ - int npoints = icu->totvert - 1; - BezTriple * tmp = icu->bezt; - - /* - * if delete empties list, then delete it, otherwise copy the remaining - * points to a new list - */ - - if( !npoints ) { - icu->bezt = NULL; - } else { - icu->bezt = - MEM_mallocN( sizeof( BezTriple ) * npoints, "bezt" ); - if( index > 0 ) - memmove( icu->bezt, tmp, index * sizeof( BezTriple ) ); - if( index < npoints ) - memmove( icu->bezt + index, tmp + index + 1, - ( npoints - index ) * sizeof( BezTriple ) ); - } - - /* free old list, adjust vertex count */ - MEM_freeN( tmp ); - icu->totvert--; - - /* call calchandles_* instead of testhandles_* */ - /* I'm not sure this is a complete solution but since we do not */ - /* deal with curve handles right now, it seems ok */ - calchandles_ipocurve( icu ); -} - -/*****************************************************************************/ -/* Python C_IpoCurve methods: */ -/*****************************************************************************/ - -static PyObject *IpoCurve_setInterpolation( C_IpoCurve * self, - PyObject * value ) -{ - char *interpolationtype = PyString_AsString(value); - short id; - - if( !interpolationtype ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if( !strcmp( interpolationtype, "Bezier" ) ) - id = IPO_BEZ; - else if( !strcmp( interpolationtype, "Constant" ) ) - id = IPO_CONST; - else if( !strcmp( interpolationtype, "Linear" ) ) - id = IPO_LIN; - else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "bad interpolation type" ); - - self->ipocurve->ipo = id; - Py_RETURN_NONE; -} - -static PyObject *IpoCurve_getInterpolation( C_IpoCurve * self ) -{ - char *str = 0; - IpoCurve *icu = self->ipocurve; - - switch( icu->ipo ) { - case IPO_BEZ: - str = "Bezier"; - break; - case IPO_CONST: - str = "Constant"; - break; - case IPO_LIN: - str = "Linear"; - break; - default: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "unknown interpolation type" ); - } - - return PyString_FromString( str ); -} - -static PyObject * IpoCurve_setExtrapolation( C_IpoCurve * self, - PyObject * value ) -{ - char *extrapolationtype = PyString_AsString(value); - short id; - - if( !extrapolationtype ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if( !strcmp( extrapolationtype, "Constant" ) ) - id = 0; - else if( !strcmp( extrapolationtype, "Extrapolation" ) ) - id = 1; - else if( !strcmp( extrapolationtype, "Cyclic" ) ) - id = 2; - else if( !strcmp( extrapolationtype, "Cyclic_extrapolation" ) ) - id = 3; - else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "bad interpolation type" ); - - self->ipocurve->extrap = id; - Py_RETURN_NONE; -} - -static PyObject *IpoCurve_getExtrapolation( C_IpoCurve * self ) -{ - char *str; - IpoCurve *icu = self->ipocurve; - - switch( icu->extrap ) { - case 0: - str = "Constant"; - break; - case 1: - str = "Extrapolation"; - break; - case 2: - str = "Cyclic"; - break; - case 3: - str = "Cyclic_extrapolation"; - break; - default: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "bad extrapolation type" ); - } - - return PyString_FromString( str ); -} - -/* - * append a new BezTriple to curve - */ - -static PyObject *IpoCurve_append( C_IpoCurve * self, PyObject * value ) -{ - float x, y; - IpoCurve *icu = self->ipocurve; - - /* if args is a already a beztriple, tack onto end of list */ - if( BPy_BezTriple_Check ( value ) ) { - BPy_BezTriple *bobj = (BPy_BezTriple *)value; - - BezTriple *newb = MEM_callocN( (icu->totvert+1)*sizeof(BezTriple), - "BPyBeztriple" ); - if( icu->bezt ) { - memcpy( newb, icu->bezt, ( icu->totvert )*sizeof( BezTriple ) ); - MEM_freeN( icu->bezt ); - } - icu->bezt = newb; - memcpy( &icu->bezt[icu->totvert], bobj->beztriple, - sizeof( BezTriple ) ); - icu->totvert++; - calchandles_ipocurve( icu ); - - /* otherwise try to get two floats and add to list */ - } else { - PyObject *xobj, *yobj; - xobj = PyNumber_Float( PyTuple_GetItem( value, 0 ) ); - yobj = PyNumber_Float( PyTuple_GetItem( value, 1 ) ); - - if( !xobj || !yobj ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected tuple of floats" ); - - x = (float)PyFloat_AsDouble( xobj ); - Py_DECREF( xobj ); - y = (float)PyFloat_AsDouble( yobj ); - Py_DECREF( yobj ); - insert_vert_icu( icu, x, y, 0); - } - - Py_RETURN_NONE; -} - -/* - Function: IpoCurve_delBezier - Bpy: Blender.Ipocurve.delBezier(0) - - Delete an BezTriple from an IPO curve. - example: - ipo = Blender.Ipo.Get('ObIpo') - cu = ipo.getCurve('LocX') - cu.delBezier(0) -*/ - -static PyObject *IpoCurve_delBezier( C_IpoCurve * self, PyObject * args ) -{ - int index; - - if( !PyArg_ParseTuple( args, "i", &index ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ); - - /* if index is negative, count from end of list */ - if( index < 0 ) - index += self->ipocurve->totvert; - /* check range of index */ - if( index < 0 || index > self->ipocurve->totvert - 1 ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "index outside of list" ); - - del_beztriple( self->ipocurve, index ); - - Py_RETURN_NONE; -} - -static PyObject *IpoCurve_Recalc( C_IpoCurve * self ) -{ - IpoCurve *icu = self->ipocurve; - - /* testhandles_ipocurve (icu); */ - /* call calchandles_* instead of testhandles_* */ - /* I'm not sure this is a complete solution but since we do not */ - /* deal with curve handles right now, it seems ok */ - calchandles_ipocurve( icu ); - sort_time_ipocurve( icu ); - - Py_INCREF( Py_None ); - return Py_None; -} - -static PyObject *IpoCurve_getName( C_IpoCurve * self ) -{ - switch ( self->ipocurve->blocktype ) { - case ID_OB: - return PyString_FromString( getname_ob_ei( self->ipocurve->adrcode, 1 ) ); /* solve: what if EffX/Y/Z are wanted? */ - case ID_TE: - return PyString_FromString( getname_tex_ei - ( self->ipocurve->adrcode ) ); - case ID_LA: - return PyString_FromString( getname_la_ei - ( self->ipocurve->adrcode ) ); - case ID_MA: - return PyString_FromString( getname_mat_ei - ( self->ipocurve->adrcode ) ); - case ID_CA: - return PyString_FromString( getname_cam_ei - ( self->ipocurve->adrcode ) ); - case ID_WO: - return PyString_FromString( getname_world_ei - ( self->ipocurve->adrcode ) ); - case ID_PO: - return PyString_FromString( getname_ac_ei - ( self->ipocurve->adrcode ) ); - case ID_CU: - return PyString_FromString( getname_cu_ei - ( self->ipocurve->adrcode ) ); - case ID_KE: - return PyString_FromString( get_key_curvename( self->ipocurve ) ); - case ID_SEQ: - return PyString_FromString( getname_seq_ei - ( self->ipocurve->adrcode ) ); - case ID_CO: - return PyString_FromString( getname_co_ei - ( self->ipocurve->adrcode ) ); - default: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "This function doesn't support this ipocurve type yet" ); - } -} - -static PyObject *IpoCurve_getPoints( C_IpoCurve * self ) -{ - BezTriple *bezt; - PyObject *po; - int i; - PyObject *list = PyList_New( self->ipocurve->totvert ); - - if( !list ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "PyList_New() failed" ); - - for( bezt = self->ipocurve->bezt, i = 0; - i < self->ipocurve->totvert; i++, bezt++ ) { - po = BezTriple_CreatePyObject( bezt ); - if( !po ) { - Py_DECREF( list ); - return NULL; /* This is okay since the error is alredy set */ - } - PyList_SET_ITEM( list, i, po ); - } - return list; -} - -/*****************************************************************************/ -/* Function: IpoCurve_compare */ -/* Description: This compares 2 python types, == or != only. */ -/*****************************************************************************/ -static int IpoCurve_compare( C_IpoCurve * a, C_IpoCurve * b ) -{ - return ( a->ipocurve == b->ipocurve ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: IpoCurve_repr */ -/* Description: This is a callback function for the C_IpoCurve type. It */ -/* builds a meaningful string to represent ipocurve objects. */ -/*****************************************************************************/ -static PyObject *IpoCurve_repr( C_IpoCurve * self ) -{ - return PyString_FromFormat( "[IpoCurve \"%s\"]", - getIpoCurveName( self->ipocurve ) ); -} - -/* Three Python IpoCurve_Type helper functions needed by the Object module: */ - -/*****************************************************************************/ -/* Function: IpoCurve_CreatePyObject */ -/* Description: This function will create a new C_IpoCurve from an existing */ -/* Blender ipo structure. */ -/*****************************************************************************/ -PyObject *IpoCurve_CreatePyObject( IpoCurve * icu ) -{ - C_IpoCurve *pyipo; - - pyipo = ( C_IpoCurve * ) PyObject_NEW( C_IpoCurve, &IpoCurve_Type ); - - if( !pyipo ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create C_IpoCurve object" ); - - pyipo->ipocurve = icu; - - return ( PyObject * ) pyipo; -} - -/*****************************************************************************/ -/* Function: IpoCurve_FromPyObject */ -/* Description: This function returns the Blender ipo from the given */ -/* PyObject. */ -/*****************************************************************************/ -IpoCurve *IpoCurve_FromPyObject( PyObject * pyobj ) -{ - return ( ( C_IpoCurve * ) pyobj )->ipocurve; -} - -/* - * get the value of an Ipocurve at a particular time - */ - -static PyObject *IpoCurve_getCurval( C_IpoCurve * self, PyObject * args ) -{ - float time; - PyObject *pyfloat = PyNumber_Float( args ); - - if( !pyfloat ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - time = ( float )PyFloat_AS_DOUBLE( pyfloat ); - Py_DECREF( pyfloat ); - - return PyFloat_FromDouble( ( double ) eval_icu( self->ipocurve, time ) ); -} - -/* - * set the value of an Ipocurve at a particular time - */ - -static int IpoCurve_setCurval( C_IpoCurve * self, PyObject * key, - PyObject * value ) -{ - float time, curval; - PyObject *pyfloat; - - /* make sure time, curval are both floats */ - - pyfloat = PyNumber_Float( key ); - if( !pyfloat ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float key" ); - time = ( float )PyFloat_AS_DOUBLE( pyfloat ); - Py_DECREF( pyfloat ); - - pyfloat = PyNumber_Float( value ); - if( !pyfloat ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - curval = ( float )PyFloat_AS_DOUBLE( pyfloat ); - Py_DECREF( pyfloat ); - - /* insert a key at the specified time */ - - insert_vert_icu( self->ipocurve, time, curval, 0); - allspace(REMAKEIPO, 0); - return 0; -} - -/***************************************************************************/ -/* Function: IpoCurve_evaluate( time ) */ -/* Description: Evaluates IPO curve at the given time. */ -/***************************************************************************/ - -static PyObject *IpoCurve_evaluate( C_IpoCurve * self, PyObject * args ) -{ - float time = 0; - double eval = 0; - - /* expecting float */ - if( !PyArg_ParseTuple( args, "f", &time ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected float argument" ) ); - - eval = ( double ) eval_icu( self->ipocurve, time ); - - return PyFloat_FromDouble( eval ); - -} - -static PyObject *IpoCurve_getDriver( C_IpoCurve * self ) -{ - if( !self->ipocurve->driver ) - return PyInt_FromLong( 0 ); - else { - if (self->ipocurve->driver->type == IPO_DRIVER_TYPE_NORMAL) - return PyInt_FromLong( 1 ); - if (self->ipocurve->driver->type == IPO_DRIVER_TYPE_PYTHON) - return PyInt_FromLong( 2 ); - } - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unknown driver type, internal error" ); - -} - -/* - sets the driver to - 0: disabled - 1: enabled (object) - 2: enabled (python expression) -*/ -static int IpoCurve_setDriver( C_IpoCurve * self, PyObject * args ) -{ - IpoCurve *ipo = self->ipocurve; - int type; - if( !PyInt_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument 0 or 1 " ); - - type = PyInt_AS_LONG( args ); - - if (type < 0 || type > 2) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected int argument 0, 1 or 2" ); - - if (type==0) { /* disable driver */ - if( ipo->driver ) { - MEM_freeN( ipo->driver ); - ipo->driver = NULL; - } - } else { - if( !ipo->driver ) { /*add driver if its not there */ - ipo->driver = MEM_callocN( sizeof(IpoDriver), "ipo driver" ); - ipo->driver->blocktype = ID_OB; - ipo->driver->adrcode = OB_LOC_X; - } - - if (type==1 && ipo->driver->type != IPO_DRIVER_TYPE_NORMAL) { - ipo->driver->type = IPO_DRIVER_TYPE_NORMAL; - ipo->driver->ob = NULL; - ipo->driver->flag &= ~IPO_DRIVER_FLAG_INVALID; - - } else if (type==2 && ipo->driver->type != IPO_DRIVER_TYPE_PYTHON) { - ipo->driver->type = IPO_DRIVER_TYPE_PYTHON; - /* we should probably set ipo->driver->ob, but theres no way to do it properly */ - ipo->driver->ob = NULL; - } - } - - return 0; -} - -static PyObject *IpoCurve_getDriverObject( C_IpoCurve * self ) -{ - IpoCurve *ipo = self->ipocurve; - - if( ipo->driver ) - return Object_CreatePyObject( ipo->driver->ob ); - - Py_RETURN_NONE; -} - -static int IpoCurve_setDriverObject( C_IpoCurve * self, PyObject * arg ) -{ - IpoCurve *ipo = self->ipocurve; - - if( !ipo->driver ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This IpoCurve does not have an active driver" ); - - if(!BPy_Object_Check(arg) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "expected an object argument" ); - ipo->driver->ob = ((BPy_Object *)arg)->object; - - DAG_scene_sort(G.scene); - - return 0; -} - -static PyObject *IpoCurve_getDriverChannel( C_IpoCurve * self ) -{ - if( !self->ipocurve->driver ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This IpoCurve does not have an active driver" ); - - return PyInt_FromLong( self->ipocurve->driver->adrcode ); -} - -static int IpoCurve_setDriverChannel( C_IpoCurve * self, PyObject * args ) -{ - IpoCurve *ipo = self->ipocurve; - short param; - - if( !ipo->driver ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This IpoCurve does not have an active driver" ); - - if( !PyInt_Check( args ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - param = (short)PyInt_AS_LONG ( args ); - if( ( param >= OB_LOC_X && param <= OB_LOC_Z ) - || ( param >= OB_ROT_X && param <= OB_ROT_Z ) - || ( param >= OB_SIZE_X && param <= OB_SIZE_Z ) ) { - ipo->driver->adrcode = (short)PyInt_AS_LONG ( args ); - return 0; - } - - return EXPP_ReturnIntError( PyExc_ValueError, "invalid int argument" ); -} - -static PyObject *IpoCurve_getDriverExpression( C_IpoCurve * self ) -{ - IpoCurve *ipo = self->ipocurve; - - if( ipo->driver && ipo->driver->type == IPO_DRIVER_TYPE_PYTHON ) - return PyString_FromString( ipo->driver->name ); - - Py_RETURN_NONE; -} - -static int IpoCurve_setDriverExpression( C_IpoCurve * self, PyObject * arg ) -{ - IpoCurve *ipo = self->ipocurve; - char *exp; /* python expression */ - - if( !ipo->driver ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This IpoCurve does not have an active driver" ); - - if (ipo->driver->type != IPO_DRIVER_TYPE_PYTHON) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This IpoCurve is not a python expression set the driver attribute to 2" ); - - if(!PyString_Check(arg) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "expected a string argument" ); - - exp = PyString_AsString(arg); - if (strlen(exp)>127) - return EXPP_ReturnIntError( PyExc_ValueError, - "string is too long, use 127 characters or less" ); - - strcpy(ipo->driver->name, exp); - return 0; -} - -static PyObject *M_IpoCurve_ExtendDict( void ) -{ - PyObject *EM = PyConstant_New( ); - - if( EM ) { - BPy_constant *d = ( BPy_constant * ) EM; - - PyConstant_Insert( d, "CONST", PyInt_FromLong( IPO_HORIZ ) ); - PyConstant_Insert( d, "EXTRAP", PyInt_FromLong( IPO_DIR ) ); - PyConstant_Insert( d, "CYCLIC", PyInt_FromLong( IPO_CYCL ) ); - PyConstant_Insert( d, "CYCLIC_EXTRAP", PyInt_FromLong( IPO_CYCLX ) ); - } - return EM; -} - -static PyObject *M_IpoCurve_InterpDict( void ) -{ - PyObject *IM = PyConstant_New( ); - - if( IM ) { - BPy_constant *d = ( BPy_constant * ) IM; - - PyConstant_Insert( d, "CONST", PyInt_FromLong( IPO_CONST ) ); - PyConstant_Insert( d, "LINEAR", PyInt_FromLong( IPO_LIN ) ); - PyConstant_Insert( d, "BEZIER", PyInt_FromLong( IPO_BEZ ) ); - } - return IM; -} - -/*****************************************************************************/ -/* Function: IpoCurve_Init */ -/*****************************************************************************/ -PyObject *IpoCurve_Init( void ) -{ - PyObject *submodule; - PyObject *ExtendTypes = M_IpoCurve_ExtendDict( ); - PyObject *InterpTypes = M_IpoCurve_InterpDict( ); - - if( PyType_Ready( &IpoCurve_Type ) < 0) - return NULL; - - submodule = - Py_InitModule3( "Blender.IpoCurve", M_IpoCurve_methods, - M_IpoCurve_doc ); - - PyModule_AddIntConstant( submodule, "LOC_X", OB_LOC_X ); - PyModule_AddIntConstant( submodule, "LOC_Y", OB_LOC_Y ); - PyModule_AddIntConstant( submodule, "LOC_Z", OB_LOC_Z ); - PyModule_AddIntConstant( submodule, "ROT_X", OB_ROT_X ); - PyModule_AddIntConstant( submodule, "ROT_Y", OB_ROT_Y ); - PyModule_AddIntConstant( submodule, "ROT_Z", OB_ROT_Z ); - PyModule_AddIntConstant( submodule, "SIZE_X", OB_SIZE_X ); - PyModule_AddIntConstant( submodule, "SIZE_Y", OB_SIZE_Y ); - PyModule_AddIntConstant( submodule, "SIZE_Z", OB_SIZE_Z ); - - if( ExtendTypes ) - PyModule_AddObject( submodule, "ExtendTypes", ExtendTypes ); - if( InterpTypes ) - PyModule_AddObject( submodule, "InterpTypes", InterpTypes ); - - return submodule; -} - -/* - */ - -static PyObject *IpoCurve_newgetInterp( C_IpoCurve * self ) -{ - return PyInt_FromLong( self->ipocurve->ipo ); -} - -static int IpoCurve_newsetInterp( C_IpoCurve * self, PyObject * value ) -{ - return EXPP_setIValueRange( value, &self->ipocurve->ipo, - IPO_CONST, IPO_BEZ, 'h' ); -} - -static PyObject *IpoCurve_newgetExtend( C_IpoCurve * self ) -{ - return PyInt_FromLong( self->ipocurve->extrap ); -} - -static int IpoCurve_newsetExtend( C_IpoCurve * self, PyObject * value ) -{ - return EXPP_setIValueRange( value, &self->ipocurve->extrap, - IPO_HORIZ, IPO_CYCLX, 'h' ); -} - -static PyObject *IpoCurve_getFlag( C_IpoCurve * self, void *type ) -{ - if (self->ipocurve->flag & (int)type) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int IpoCurve_setFlag( C_IpoCurve * self, PyObject *value, void *type ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if (param) - self->ipocurve->flag |= (int)type; - else - self->ipocurve->flag &= ~(int)type; - - return 0; -} - - -/* #####DEPRECATED###### */ - -static PyObject *IpoCurve_addBezier( C_IpoCurve * self, PyObject * value ) -{ - float x, y; - int npoints; - IpoCurve *icu; - BezTriple *bzt, *tmp; - static char name[10] = "mlml"; - if( !PyArg_ParseTuple( value, "ff", &x, &y ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected a tuple of 2 floats" ) ); - - icu = self->ipocurve; - npoints = icu->totvert; - tmp = icu->bezt; - icu->bezt = MEM_mallocN( sizeof( BezTriple ) * ( npoints + 1 ), name ); - if( tmp ) { - memmove( icu->bezt, tmp, sizeof( BezTriple ) * npoints ); - MEM_freeN( tmp ); - } - memmove( icu->bezt + npoints, icu->bezt, sizeof( BezTriple ) ); - icu->totvert++; - bzt = icu->bezt + npoints; - bzt->vec[0][0] = x - 1; - bzt->vec[1][0] = x; - bzt->vec[2][0] = x + 1; - bzt->vec[0][1] = y - 1; - bzt->vec[1][1] = y; - bzt->vec[2][1] = y + 1; - /* set handle type to Auto */ - bzt->h1 = HD_AUTO; - bzt->h2 = HD_AUTO; - - Py_RETURN_NONE; -} diff --git a/source/blender/python/api2_2x/Ipocurve.h b/source/blender/python/api2_2x/Ipocurve.h deleted file mode 100644 index 6c4216fa4bd..00000000000 --- a/source/blender/python/api2_2x/Ipocurve.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * $Id: Ipocurve.h 10943 2007-06-16 12:24:41Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_IPOCURVE_H -#define EXPP_IPOCURVE_H - -#include -#include "DNA_curve_types.h" /* declaration of IpoCurve */ - -/*****************************************************************************/ -/* Python C_IpoCurve structure definition: */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD /* required macro */ - IpoCurve * ipocurve; - char wrapped; -} C_IpoCurve; - -extern PyTypeObject IpoCurve_Type; - -#define BPy_IpoCurve_Check(v) ((v)->ob_type == &IpoCurve_Type) /* for type checking */ - -PyObject *IpoCurve_Init( void ); -PyObject *IpoCurve_CreatePyObject( IpoCurve * ipo ); -IpoCurve *IpoCurve_FromPyObject( PyObject * pyobj ); -char *getIpoCurveName( IpoCurve * icu ); - - -#endif /* EXPP_IPOCURVE_H */ diff --git a/source/blender/python/api2_2x/Key.c b/source/blender/python/api2_2x/Key.c deleted file mode 100644 index b223a382818..00000000000 --- a/source/blender/python/api2_2x/Key.c +++ /dev/null @@ -1,681 +0,0 @@ -/* - * $Id: Key.c 12867 2007-12-13 15:06:02Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Pontus Lidman, Johnny Matthews, Ken Hughes, - * Michael Reimpell - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Key.h" /*This must come first*/ -#include "vector.h" - -#include "DNA_scene_types.h" - -#include -#include -#include -#include -#include -#include -#include "BIF_space.h" - -#include "Ipocurve.h" -#include "NMesh.h" /* we create NMesh.NMVert objects */ -#include "Ipo.h" -#include "BezTriple.h" - -#include "BSE_editipo.h" -#include "mydevice.h" -#include "BKE_depsgraph.h" -#include "blendef.h" -#include "constant.h" -#include "gen_utils.h" -#include "gen_library.h" - -#define KEY_TYPE_MESH 0 -#define KEY_TYPE_CURVE 1 -#define KEY_TYPE_LATTICE 2 - -static int Key_compare( BPy_Key * a, BPy_Key * b ); -static PyObject *Key_repr( BPy_Key * self ); -static void Key_dealloc( BPy_Key * self ); - -static PyObject *Key_getBlocks( BPy_Key * self ); -static PyObject *Key_getType( BPy_Key * self ); -static PyObject *Key_getRelative( BPy_Key * self ); -static PyObject *Key_getIpo( BPy_Key * self ); -static int Key_setIpo( BPy_Key * self, PyObject * args ); -static PyObject *Key_getValue( BPy_Key * self ); -static int Key_setRelative( BPy_Key * self, PyObject * value ); - -static struct PyMethodDef Key_methods[] = { - { "getBlocks", (PyCFunction) Key_getBlocks, METH_NOARGS, "Get key blocks" }, - { "getIpo", (PyCFunction) Key_getIpo, METH_NOARGS, "Get key Ipo" }, - { 0, 0, 0, 0 } -}; - -static PyGetSetDef BPy_Key_getsetters[] = { - {"type",(getter)Key_getType, (setter)NULL, - "Key Type",NULL}, - {"value",(getter)Key_getValue, (setter)NULL, - "Key value",NULL}, - {"ipo",(getter)Key_getIpo, (setter)Key_setIpo, - "Ipo linked to key",NULL}, - {"blocks",(getter)Key_getBlocks, (setter)NULL, - "Blocks linked to the key",NULL}, - {"relative",(getter)Key_getRelative, (setter)Key_setRelative, - "Non-zero is key is relative",NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -static PyObject *KeyBlock_getData( PyObject * self ); -static PyObject *KeyBlock_getCurval( BPy_KeyBlock * self ); -static PyObject *KeyBlock_getName( BPy_KeyBlock * self ); -static PyObject *KeyBlock_getPos( BPy_KeyBlock * self ); -static PyObject *KeyBlock_getSlidermin( BPy_KeyBlock * self ); -static PyObject *KeyBlock_getSlidermax( BPy_KeyBlock * self ); -static PyObject *KeyBlock_getVgroup( BPy_KeyBlock * self ); - -static int KeyBlock_setName( BPy_KeyBlock *, PyObject * args ); -static int KeyBlock_setVgroup( BPy_KeyBlock *, PyObject * args ); -static int KeyBlock_setSlidermin( BPy_KeyBlock *, PyObject * args ); -static int KeyBlock_setSlidermax( BPy_KeyBlock *, PyObject * args ); - -static void KeyBlock_dealloc( BPy_KeyBlock * self ); -static int KeyBlock_compare( BPy_KeyBlock * a, BPy_KeyBlock * b ); -static PyObject *KeyBlock_repr( BPy_KeyBlock * self ); - -static struct PyMethodDef KeyBlock_methods[] = { - { "getData", (PyCFunction) KeyBlock_getData, METH_NOARGS, - "Get keyblock data" }, - { 0, 0, 0, 0 } -}; - -static PyGetSetDef BPy_KeyBlock_getsetters[] = { - {"curval",(getter)KeyBlock_getCurval, (setter)NULL, - "Current value of the corresponding IpoCurve",NULL}, - {"name",(getter)KeyBlock_getName, (setter)KeyBlock_setName, - "Keyblock Name",NULL}, - {"pos",(getter)KeyBlock_getPos, (setter)NULL, - "Keyblock Pos",NULL}, - {"slidermin",(getter)KeyBlock_getSlidermin, (setter)KeyBlock_setSlidermin, - "Keyblock Slider Minimum",NULL}, - {"slidermax",(getter)KeyBlock_getSlidermax, (setter)KeyBlock_setSlidermax, - "Keyblock Slider Maximum",NULL}, - {"vgroup",(getter)KeyBlock_getVgroup, (setter)KeyBlock_setVgroup, - "Keyblock VGroup",NULL}, - {"data",(getter)KeyBlock_getData, (setter)NULL, - "Keyblock VGroup",NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -PyTypeObject Key_Type = { - PyObject_HEAD_INIT( NULL ) 0, /*ob_size */ - "Blender Key", /*tp_name */ - sizeof( BPy_Key ), /*tp_basicsize */ - 0, /*tp_itemsize */ - /* methods */ - ( destructor ) Key_dealloc,/* destructor tp_dealloc; */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) 0, /*tp_getattr */ - ( setattrfunc ) 0, /*tp_setattr */ - ( cmpfunc) Key_compare, /*tp_compare*/ - ( reprfunc ) Key_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - Key_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Key_getsetters, /* 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 -}; - -PyTypeObject KeyBlock_Type = { - PyObject_HEAD_INIT( NULL ) 0, /*ob_size */ - "Blender KeyBlock", /*tp_name */ - sizeof( BPy_KeyBlock ), /*tp_basicsize */ - 0, /*tp_itemsize */ - /* methods */ - ( destructor ) KeyBlock_dealloc,/* destructor tp_dealloc; */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) 0, /*tp_getattr */ - ( setattrfunc ) 0, /*tp_setattr */ - ( cmpfunc) KeyBlock_compare, /*tp_compare*/ - ( reprfunc ) KeyBlock_repr, /* 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 ***/ - KeyBlock_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_KeyBlock_getsetters, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 0, /* long tp_dictoffset; */ - NULL, /* initproc tp_init; */ - NULL, /* allocfunc tp_alloc; */ - NULL, /* newfunc tp_new; */ - /* Low-level free-memory routine */ - NULL, /* freefunc tp_free; */ - /* For PyObject_IS_GC */ - NULL, /* inquiry tp_is_gc; */ - NULL, /* PyObject *tp_bases; */ - /* method resolution order */ - NULL, /* PyObject *tp_mro; */ - NULL, /* PyObject *tp_cache; */ - NULL, /* PyObject *tp_subclasses; */ - NULL, /* PyObject *tp_weaklist; */ - NULL -}; - -PyObject *Key_CreatePyObject( Key * blenkey ) -{ - BPy_Key *bpykey = PyObject_NEW( BPy_Key, &Key_Type ); - /* blenkey may be NULL so be careful */ - bpykey->key = blenkey; - return ( PyObject * ) bpykey; -} - -static void Key_dealloc( BPy_Key * self ) -{ - PyObject_DEL( self ); -} - -static int Key_compare( BPy_Key * a, BPy_Key * b ) -{ - return ( a->key == b->key ) ? 0 : -1; -} - -static PyObject *Key_repr( BPy_Key * self ) -{ - return PyString_FromFormat( "[Key \"%s\"]", self->key->id.name + 2 ); -} - -static PyObject *Key_getIpo( BPy_Key * self ) -{ - if (self->key->ipo) - return Ipo_CreatePyObject( self->key->ipo ); - Py_RETURN_NONE; -} - -static int Key_setIpo( BPy_Key * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->key->ipo, 0, 1, ID_IP, ID_KE); -} - -static PyObject *Key_getRelative( BPy_Key * self ) -{ - if( self->key->type == KEY_RELATIVE ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int Key_setRelative( BPy_Key * self, PyObject * value ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) - self->key->type = KEY_RELATIVE; - else - self->key->type = KEY_NORMAL; - allqueue(REDRAWIPO, 0); - allspace(REMAKEIPO, 0); - - return 0; -} - -static PyObject *Key_getType( BPy_Key * self ) -{ - int idcode; - int type = -1; - - idcode = GS( self->key->from->name ); - - switch( idcode ) { - case ID_ME: - type = KEY_TYPE_MESH; - break; - case ID_CU: - type = KEY_TYPE_CURVE; - break; - case ID_LT: - type = KEY_TYPE_LATTICE; - break; - } - - return PyInt_FromLong( type ); -} - -static PyObject *Key_getBlocks( BPy_Key * self ) -{ - Key *key = self->key; - KeyBlock *kb; - int i=0; - PyObject *l = PyList_New( BLI_countlist( &(key->block)) ); - - for (kb = key->block.first; kb; kb = kb->next, i++) - PyList_SET_ITEM( l, i, KeyBlock_CreatePyObject( kb, key ) ); - - return l; -} - -static PyObject *Key_getValue( BPy_Key * self ) -{ - BPy_Key *k = ( BPy_Key * ) self; - - return PyFloat_FromDouble( k->key->curval ); -} - -/* ------------ Key Block Functions -------------- */ -PyObject *KeyBlock_CreatePyObject( KeyBlock * keyblock, Key *parentKey ) -{ - BPy_KeyBlock *bpykb = PyObject_NEW( BPy_KeyBlock, &KeyBlock_Type ); - bpykb->key = parentKey; - bpykb->keyblock = keyblock; /* keyblock maye be NULL, thats ok */ - return ( PyObject * ) bpykb; -} - -static PyObject *KeyBlock_getCurval( BPy_KeyBlock * self ) { - return PyFloat_FromDouble( self->keyblock->curval ); -} - -static PyObject *KeyBlock_getName( BPy_KeyBlock * self ) { - return PyString_FromString(self->keyblock->name); -} - -static PyObject *KeyBlock_getPos( BPy_KeyBlock * self ){ - return PyFloat_FromDouble( self->keyblock->pos ); -} - -static PyObject *KeyBlock_getSlidermin( BPy_KeyBlock * self ){ - return PyFloat_FromDouble( self->keyblock->slidermin ); -} - -static PyObject *KeyBlock_getSlidermax( BPy_KeyBlock * self ){ - return PyFloat_FromDouble( self->keyblock->slidermax ); -} - -static PyObject *KeyBlock_getVgroup( BPy_KeyBlock * self ){ - return PyString_FromString(self->keyblock->vgroup); -} - -static int KeyBlock_setName( BPy_KeyBlock * self, PyObject * args ){ - char* text = NULL; - - text = PyString_AsString ( args ); - if( !text ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - strncpy( self->keyblock->name, text , 32); - - return 0; -} - -static int KeyBlock_setVgroup( BPy_KeyBlock * self, PyObject * args ){ - char* text = NULL; - - text = PyString_AsString ( args ); - if( !text ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - strncpy( self->keyblock->vgroup, text , 32); - - return 0; -} -static int KeyBlock_setSlidermin( BPy_KeyBlock * self, PyObject * args ){ - return EXPP_setFloatClamped ( args, &self->keyblock->slidermin, - -10.0f, - 10.0f ); -} -static int KeyBlock_setSlidermax( BPy_KeyBlock * self, PyObject * args ){ - return EXPP_setFloatClamped ( args, &self->keyblock->slidermax, - -10.0f, - 10.0f ); -} - -static void KeyBlock_dealloc( BPy_KeyBlock * self ) -{ - PyObject_DEL( self ); -} - -static int KeyBlock_compare( BPy_KeyBlock * a, BPy_KeyBlock * b ) -{ - return ( a->keyblock == b->keyblock ) ? 0 : -1; -} - -static PyObject *KeyBlock_repr( BPy_KeyBlock * self ) -{ - return PyString_FromFormat( "[KeyBlock \"%s\"]", self->keyblock->name ); -} - - -static Curve *find_curve( Key *key ) -{ - Curve *cu; - - if( !key ) - return NULL; - - for( cu = G.main->curve.first; cu; cu = cu->id.next ) { - if( cu->key == key ) - break; - } - return cu; -} - -static PyObject *KeyBlock_getData( PyObject * self ) -{ - /* If this is a mesh key, data is an array of MVert coords. - If lattice, data is an array of BPoint coords - If curve, data is an array of BezTriple or BPoint */ - - char *datap; - int datasize; - int idcode; - int i; - Curve *cu; - Nurb* nu; - PyObject *l; - BPy_KeyBlock *kb = ( BPy_KeyBlock * ) self; - Key *key = kb->key; - - if( !kb->keyblock->data ) { - Py_RETURN_NONE; - } - - l = PyList_New( kb->keyblock->totelem ); - if( !l ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "PyList_New() failed" ); - - idcode = GS( key->from->name ); - - switch(idcode) { - case ID_ME: - - for (i=0, datap = kb->keyblock->data; ikeyblock->totelem; i++) { - PyObject *vec = newVectorObject((float*)datap, 3, Py_WRAP); - - if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "could not allocate memory for Blender.Mathutils.Vector wrapper!" ); - - PyList_SetItem(l, i, vec); - datap += kb->key->elemsize; - } - break; - - case ID_CU: - cu = find_curve ( key ); - if( !cu ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "key is no linked to any curve!" ); - datasize = count_curveverts(&cu->nurb); - nu = cu->nurb.first; - if( nu->bezt ) { - datasize /= 3; - Py_DECREF (l); - l = PyList_New( datasize ); - for( i = 0, datap = kb->keyblock->data; i < datasize; - i++, datap += sizeof(float)*3*4) { - PyObject *tuple = PyTuple_New(4), *vec; - float *vecs = (float*)datap; - - if (!tuple) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "PyTuple_New() failed!" ); - - vec = newVectorObject(vecs, 3, Py_WRAP); - if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "Could not allocate memory for Blender.Mathutils.Vector wrapper!" ); - - PyTuple_SET_ITEM( tuple, 0, vec); - - vecs += 3; - vec = newVectorObject(vecs, 3, Py_WRAP); - if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "Could not allocate memory for Blender.Mathutils.Vector wrapper!" ); - - PyTuple_SET_ITEM( tuple, 1, vec); - - vecs += 3; - vec = newVectorObject(vecs, 3, Py_WRAP); - if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "Could not allocate memory for Blender.Mathutils.Vector wrapper!" ); - - PyTuple_SET_ITEM( tuple, 2, vec); - - /*tilts*/ - vecs += 3; - vec = newVectorObject(vecs, 3, Py_WRAP); - if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "Could not allocate memory for Blender.Mathutils.Vector wrapper!" ); - - PyTuple_SET_ITEM( tuple, 3, vec); - - PyList_SetItem( l, i, tuple ); - } - } else { - for( i = 0, datap = kb->keyblock->data; i < datasize; - i++, datap += kb->key->elemsize ) { - PyObject *vec = newVectorObject((float*)datap, 4, Py_WRAP); - if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "could not allocate memory for Blender.Mathutils.Vector wrapper!" ); - - PyList_SetItem( l, i, vec ); - } - } - break; - - case ID_LT: - for( i = 0, datap = kb->keyblock->data; i < kb->keyblock->totelem; - i++, datap += kb->key->elemsize ) { - PyObject *vec = newVectorObject((float*)datap, 3, Py_WRAP); - if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError, - "Could not allocate memory for Blender.Mathutils.Vector wrapper!" ); - - PyList_SetItem( l, i, vec ); - } - break; - } - - return l; -} - -static PyObject *M_Key_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Key *key_iter; - char error_msg[64]; - int i; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - if ( name ) { - for (key_iter = G.main->key.first; key_iter; - key_iter=key_iter->id.next) { - if (strcmp ( key_iter->id.name + 2, name ) == 0 ) { - return Key_CreatePyObject( key_iter ); - } - } - - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Key \"%s\" not found", name ); - return EXPP_ReturnPyObjError ( PyExc_NameError, error_msg ); - - } else { - - PyObject *keylist; - - keylist = PyList_New( BLI_countlist( &( G.main->key ) ) ); - - for ( i=0, key_iter = G.main->key.first; key_iter; - key_iter=key_iter->id.next, i++ ) { - PyList_SetItem(keylist, i, Key_CreatePyObject(key_iter)); - } - return keylist; - } -} - -struct PyMethodDef M_Key_methods[] = { - {"Get", M_Key_Get, METH_VARARGS, "Get a key or all key names"}, - {NULL, NULL, 0, NULL} -}; - -static PyObject *M_Key_TypesDict( void ) -{ - PyObject *T = PyConstant_New( ); - - if( T ) { - BPy_constant *d = ( BPy_constant * ) T; - - PyConstant_Insert( d, "MESH", PyInt_FromLong( KEY_TYPE_MESH ) ); - PyConstant_Insert( d, "CURVE", PyInt_FromLong( KEY_TYPE_CURVE ) ); - PyConstant_Insert( d, "LATTICE", PyInt_FromLong( KEY_TYPE_LATTICE ) ); - } - - return T; -} - -PyObject *Key_Init( void ) -{ - PyObject *submodule; - PyObject *Types = NULL; - - if( PyType_Ready( &Key_Type ) < 0 || PyType_Ready( &KeyBlock_Type ) < 0 ) - return NULL; - - submodule = - Py_InitModule3( "Blender.Key", M_Key_methods, "Key module" ); - - Types = M_Key_TypesDict( ); - if( Types ) - PyModule_AddObject( submodule, "Types", Types ); - - return submodule; -} - diff --git a/source/blender/python/api2_2x/Key.h b/source/blender/python/api2_2x/Key.h deleted file mode 100644 index 35e92fc5fea..00000000000 --- a/source/blender/python/api2_2x/Key.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * $Id: Key.h 10783 2007-05-26 12:58:46Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Pontus Lidman - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#ifndef EXPP_KEY_H -#define EXPP_KEY_H - -#include "Python.h" - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -extern PyTypeObject Key_Type; -extern PyTypeObject KeyBlock_Type; - -typedef struct { - PyObject_HEAD /* required python macro */ - Key * key; /* libdata must be second */ - /* Object *object;*/ /* for vertex grouping info, since it's stored on the object */ - /*PyObject *keyBlock;*/ - /*PyObject *ipo;*/ -} BPy_Key; - -typedef struct { - PyObject_HEAD /* required python macro */ - Key *key; - KeyBlock * keyblock; - /* Object *object;*/ /* for vertex grouping info, since it's stored on the object */ -} BPy_KeyBlock; - -PyObject *Key_CreatePyObject( Key * k ); -PyObject *KeyBlock_CreatePyObject( KeyBlock * k, Key *parentKey ); - -PyObject *Key_Init( void ); - -#endif /* EXPP_KEY_H */ diff --git a/source/blender/python/api2_2x/Lamp.c b/source/blender/python/api2_2x/Lamp.c deleted file mode 100644 index 8112d1372c6..00000000000 --- a/source/blender/python/api2_2x/Lamp.c +++ /dev/null @@ -1,1570 +0,0 @@ -/* - * $Id: Lamp.c 12810 2007-12-06 20:15:03Z khughes $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Nathan Letwory, Stephen Swaney, - * Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Lamp.h" /*This must come first*/ - -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_object.h" -#include "BKE_library.h" -#include "BLI_blenlib.h" -#include "BIF_space.h" -#include "BSE_editipo.h" -#include "mydevice.h" -#include "Ipo.h" -#include "constant.h" -#include "gen_utils.h" -#include "gen_library.h" - -/*****************************************************************************/ -/* Python BPy_Lamp defaults: */ -/*****************************************************************************/ - -/* Lamp types */ - -/* NOTE: - these are the same values as LA_* from DNA_lamp_types.h - is there some reason we are not simply using those #defines? - s. swaney 8-oct-2004 -*/ - -#define EXPP_LAMP_TYPE_LAMP 0 -#define EXPP_LAMP_TYPE_SUN 1 -#define EXPP_LAMP_TYPE_SPOT 2 -#define EXPP_LAMP_TYPE_HEMI 3 -#define EXPP_LAMP_TYPE_AREA 4 -#define EXPP_LAMP_TYPE_YF_PHOTON 5 -/* - define a constant to keep magic numbers out of the code - this value should be equal to the last EXPP_LAMP_TYPE_* -*/ -#define EXPP_LAMP_TYPE_MAX 5 - -/* Lamp mode flags */ - -#define EXPP_LAMP_MODE_SHADOWS 1 -#define EXPP_LAMP_MODE_HALO 2 -#define EXPP_LAMP_MODE_LAYER 4 -#define EXPP_LAMP_MODE_QUAD 8 -#define EXPP_LAMP_MODE_NEGATIVE 16 -#define EXPP_LAMP_MODE_ONLYSHADOW 32 -#define EXPP_LAMP_MODE_SPHERE 64 -#define EXPP_LAMP_MODE_SQUARE 128 -#define EXPP_LAMP_MODE_TEXTURE 256 -#define EXPP_LAMP_MODE_OSATEX 512 -#define EXPP_LAMP_MODE_DEEPSHADOW 1024 -#define EXPP_LAMP_MODE_NODIFFUSE 2048 -#define EXPP_LAMP_MODE_NOSPECULAR 4096 -#define EXPP_LAMP_MODE_SHAD_RAY 8192 -/* Lamp MIN, MAX values */ - -#define EXPP_LAMP_SAMPLES_MIN 1 -#define EXPP_LAMP_SAMPLES_MAX 16 -#define EXPP_LAMP_BUFFERSIZE_MIN 512 -#define EXPP_LAMP_BUFFERSIZE_MAX 5120 -#define EXPP_LAMP_ENERGY_MIN 0.0 -#define EXPP_LAMP_ENERGY_MAX 10.0 -#define EXPP_LAMP_DIST_MIN 0.1f -#define EXPP_LAMP_DIST_MAX 5000.0 -#define EXPP_LAMP_SPOTSIZE_MIN 1.0 -#define EXPP_LAMP_SPOTSIZE_MAX 180.0 -#define EXPP_LAMP_SPOTBLEND_MIN 0.00 -#define EXPP_LAMP_SPOTBLEND_MAX 1.00 -#define EXPP_LAMP_CLIPSTART_MIN 0.1f -#define EXPP_LAMP_CLIPSTART_MAX 1000.0 -#define EXPP_LAMP_CLIPEND_MIN 1.0 -#define EXPP_LAMP_CLIPEND_MAX 5000.0 -#define EXPP_LAMP_BIAS_MIN 0.01f -#define EXPP_LAMP_BIAS_MAX 5.00 -#define EXPP_LAMP_SOFTNESS_MIN 1.0 -#define EXPP_LAMP_SOFTNESS_MAX 100.0 -#define EXPP_LAMP_HALOINT_MIN 0.0 -#define EXPP_LAMP_HALOINT_MAX 5.0 -#define EXPP_LAMP_HALOSTEP_MIN 0 -#define EXPP_LAMP_HALOSTEP_MAX 12 -#define EXPP_LAMP_QUAD1_MIN 0.0 -#define EXPP_LAMP_QUAD1_MAX 1.0 -#define EXPP_LAMP_QUAD2_MIN 0.0 -#define EXPP_LAMP_QUAD2_MAX 1.0 -#define EXPP_LAMP_COL_MIN 0.0 -#define EXPP_LAMP_COL_MAX 1.0 - -/* Raytracing settings */ -#define EXPP_LAMP_RAYSAMPLES_MIN 1 -#define EXPP_LAMP_RAYSAMPLES_MAX 16 -#define EXPP_LAMP_AREASIZE_MIN 0.01f -#define EXPP_LAMP_AREASIZE_MAX 100.0f - -/* Lamp_setComponent() keys for which color to get/set */ -#define EXPP_LAMP_COMP_R 0x00 -#define EXPP_LAMP_COMP_G 0x01 -#define EXPP_LAMP_COMP_B 0x02 - -#define IPOKEY_RGB 0 -#define IPOKEY_ENERGY 1 -#define IPOKEY_SPOTSIZE 2 -#define IPOKEY_OFFSET 3 -#define IPOKEY_SIZE 4 - -/*****************************************************************************/ -/* Python API function prototypes for the Lamp module. */ -/*****************************************************************************/ -static PyObject *M_Lamp_New( PyObject * self, PyObject * args, - PyObject * keywords ); -static PyObject *M_Lamp_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Lamp.__doc__ */ -/*****************************************************************************/ -static char M_Lamp_doc[] = "The Blender Lamp module\n\n\ -This module provides control over **Lamp Data** objects in Blender.\n\n\ -Example::\n\n\ - from Blender import Lamp\n\ - l = Lamp.New('Spot') # create new 'Spot' lamp data\n\ - l.setMode('square', 'shadow') # set these two lamp mode flags\n\ - ob = Object.New('Lamp') # create new lamp object\n\ - ob.link(l) # link lamp obj with lamp data\n"; - -static char M_Lamp_New_doc[] = "Lamp.New (type = 'Lamp', name = 'LampData'):\n\ - Return a new Lamp Data object with the given type and name."; - -static char M_Lamp_Get_doc[] = "Lamp.Get (name = None):\n\ - Return the Lamp Data with the given name, None if not found, or\n\ - Return a list with all Lamp Data objects in the current scene,\n\ - if no argument was given."; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Lamp module: */ -/*****************************************************************************/ -struct PyMethodDef M_Lamp_methods[] = { - {"New", ( PyCFunction ) M_Lamp_New, METH_VARARGS | METH_KEYWORDS, - M_Lamp_New_doc}, - {"Get", M_Lamp_Get, METH_VARARGS, M_Lamp_Get_doc}, - {"get", M_Lamp_Get, METH_VARARGS, M_Lamp_Get_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Lamp methods declarations: */ -/*****************************************************************************/ -static PyObject *Lamp_getType( BPy_Lamp * self ); -static PyObject *Lamp_getTypesConst( void ); -static PyObject *Lamp_getMode( BPy_Lamp * self ); -static PyObject *Lamp_getModesConst( void ); -static PyObject *Lamp_getSamples( BPy_Lamp * self ); -static PyObject *Lamp_getRaySamplesX( BPy_Lamp * self ); -static PyObject *Lamp_getRaySamplesY( BPy_Lamp * self ); -static PyObject *Lamp_getAreaSizeX( BPy_Lamp * self ); -static PyObject *Lamp_getAreaSizeY( BPy_Lamp * self ); -static PyObject *Lamp_getBufferSize( BPy_Lamp * self ); -static PyObject *Lamp_getHaloStep( BPy_Lamp * self ); -static PyObject *Lamp_getEnergy( BPy_Lamp * self ); -static PyObject *Lamp_getDist( BPy_Lamp * self ); -static PyObject *Lamp_getSpotSize( BPy_Lamp * self ); -static PyObject *Lamp_getSpotBlend( BPy_Lamp * self ); -static PyObject *Lamp_getClipStart( BPy_Lamp * self ); -static PyObject *Lamp_getClipEnd( BPy_Lamp * self ); -static PyObject *Lamp_getBias( BPy_Lamp * self ); -static PyObject *Lamp_getSoftness( BPy_Lamp * self ); -static PyObject *Lamp_getHaloInt( BPy_Lamp * self ); -static PyObject *Lamp_getQuad1( BPy_Lamp * self ); -static PyObject *Lamp_getQuad2( BPy_Lamp * self ); -static PyObject *Lamp_getCol( BPy_Lamp * self ); -static PyObject *Lamp_getIpo( BPy_Lamp * self ); -static PyObject *Lamp_getComponent( BPy_Lamp * self, void * closure ); -static PyObject *Lamp_clearIpo( BPy_Lamp * self ); -static PyObject *Lamp_insertIpoKey( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetIpo( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetType( BPy_Lamp * self, PyObject * value ); -static PyObject *Lamp_oldsetMode( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetSamples( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetRaySamplesX( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetRaySamplesY( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetAreaSizeX( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetAreaSizeY( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetBufferSize( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetHaloStep( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetEnergy( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetDist( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetSpotSize( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetSpotBlend( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetClipStart( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetClipEnd( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetBias( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetSoftness( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetHaloInt( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetQuad1( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetQuad2( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_oldsetCol( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_copy( BPy_Lamp * self ); -static int Lamp_setIpo( BPy_Lamp * self, PyObject * args ); -static int Lamp_setType( BPy_Lamp * self, PyObject * args ); -static int Lamp_setMode( BPy_Lamp * self, PyObject * args ); -static int Lamp_setSamples( BPy_Lamp * self, PyObject * args ); -static int Lamp_setRaySamplesX( BPy_Lamp * self, PyObject * args ); -static int Lamp_setRaySamplesY( BPy_Lamp * self, PyObject * args ); -static int Lamp_setAreaSizeX( BPy_Lamp * self, PyObject * args ); -static int Lamp_setAreaSizeY( BPy_Lamp * self, PyObject * args ); -static int Lamp_setBufferSize( BPy_Lamp * self, PyObject * args ); -static int Lamp_setHaloStep( BPy_Lamp * self, PyObject * args ); -static int Lamp_setEnergy( BPy_Lamp * self, PyObject * args ); -static int Lamp_setDist( BPy_Lamp * self, PyObject * args ); -static int Lamp_setSpotSize( BPy_Lamp * self, PyObject * args ); -static int Lamp_setSpotBlend( BPy_Lamp * self, PyObject * args ); -static int Lamp_setClipStart( BPy_Lamp * self, PyObject * args ); -static int Lamp_setClipEnd( BPy_Lamp * self, PyObject * args ); -static int Lamp_setBias( BPy_Lamp * self, PyObject * args ); -static int Lamp_setSoftness( BPy_Lamp * self, PyObject * args ); -static int Lamp_setHaloInt( BPy_Lamp * self, PyObject * args ); -static int Lamp_setQuad1( BPy_Lamp * self, PyObject * args ); -static int Lamp_setQuad2( BPy_Lamp * self, PyObject * args ); -static int Lamp_setCol( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_getScriptLinks( BPy_Lamp * self, PyObject * value ); -static PyObject *Lamp_addScriptLink( BPy_Lamp * self, PyObject * args ); -static PyObject *Lamp_clearScriptLinks( BPy_Lamp * self, PyObject * args ); -static int Lamp_setComponent( BPy_Lamp * self, PyObject * value, void * closure ); - -/*****************************************************************************/ -/* Python BPy_Lamp methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Lamp_methods[] = { - /* name, method, flags, doc */ - - {"getType", ( PyCFunction ) Lamp_getType, METH_NOARGS, - "() - return Lamp type - 'Lamp':0, 'Sun':1, 'Spot':2, 'Hemi':3, 'Area':4, 'Photon':5"}, - {"getMode", ( PyCFunction ) Lamp_getMode, METH_NOARGS, - "() - return Lamp mode flags (or'ed value)"}, - {"getSamples", ( PyCFunction ) Lamp_getSamples, METH_NOARGS, - "() - return Lamp samples value"}, - {"getRaySamplesX", ( PyCFunction ) Lamp_getRaySamplesX, METH_NOARGS, - "() - return Lamp raytracing samples on the X axis"}, - {"getRaySamplesY", ( PyCFunction ) Lamp_getRaySamplesY, METH_NOARGS, - "() - return Lamp raytracing samples on the Y axis"}, - {"getAreaSizeX", ( PyCFunction ) Lamp_getAreaSizeX, METH_NOARGS, - "() - return Lamp area size on the X axis"}, - {"getAreaSizeY", ( PyCFunction ) Lamp_getAreaSizeY, METH_NOARGS, - "() - return Lamp area size on the Y axis"}, - {"getBufferSize", ( PyCFunction ) Lamp_getBufferSize, METH_NOARGS, - "() - return Lamp buffer size value"}, - {"getHaloStep", ( PyCFunction ) Lamp_getHaloStep, METH_NOARGS, - "() - return Lamp halo step value"}, - {"getEnergy", ( PyCFunction ) Lamp_getEnergy, METH_NOARGS, - "() - return Lamp energy value"}, - {"getDist", ( PyCFunction ) Lamp_getDist, METH_NOARGS, - "() - return Lamp clipping distance value"}, - {"getSpotSize", ( PyCFunction ) Lamp_getSpotSize, METH_NOARGS, - "() - return Lamp spot size value"}, - {"getSpotBlend", ( PyCFunction ) Lamp_getSpotBlend, METH_NOARGS, - "() - return Lamp spot blend value"}, - {"getClipStart", ( PyCFunction ) Lamp_getClipStart, METH_NOARGS, - "() - return Lamp clip start value"}, - {"getClipEnd", ( PyCFunction ) Lamp_getClipEnd, METH_NOARGS, - "() - return Lamp clip end value"}, - {"getBias", ( PyCFunction ) Lamp_getBias, METH_NOARGS, - "() - return Lamp bias value"}, - {"getSoftness", ( PyCFunction ) Lamp_getSoftness, METH_NOARGS, - "() - return Lamp softness value"}, - {"getHaloInt", ( PyCFunction ) Lamp_getHaloInt, METH_NOARGS, - "() - return Lamp halo intensity value"}, - {"getQuad1", ( PyCFunction ) Lamp_getQuad1, METH_NOARGS, - "() - return light intensity value #1 for a Quad Lamp"}, - {"getQuad2", ( PyCFunction ) Lamp_getQuad2, METH_NOARGS, - "() - return light intensity value #2 for a Quad Lamp"}, - {"getCol", ( PyCFunction ) Lamp_getCol, METH_NOARGS, - "() - return light rgb color triplet"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(str) - rename Lamp"}, - {"setType", ( PyCFunction ) Lamp_oldsetType, METH_O, - "(str) - change Lamp type, which can be 'Lamp', 'Sun', 'Spot', 'Hemi', 'Area', 'Photon'"}, - {"setMode", ( PyCFunction ) Lamp_oldsetMode, METH_VARARGS, - "([up to eight str's]) - Set Lamp mode flag(s)"}, - {"setSamples", ( PyCFunction ) Lamp_oldsetSamples, METH_VARARGS, - "(int) - change Lamp samples value"}, - {"setRaySamplesX", ( PyCFunction ) Lamp_oldsetRaySamplesX, METH_VARARGS, - "(int) - change Lamp ray X samples value in [1,16]"}, - {"setRaySamplesY", ( PyCFunction ) Lamp_oldsetRaySamplesY, METH_VARARGS, - "(int) - change Lamp ray Y samples value in [1,16]"}, - {"setAreaSizeX", ( PyCFunction ) Lamp_oldsetAreaSizeX, METH_VARARGS, - "(float) - change Lamp ray X size for area lamps, value in [0.01, 100.0]"}, - {"setAreaSizeY", ( PyCFunction ) Lamp_oldsetAreaSizeY, METH_VARARGS, - "(float) - change Lamp ray Y size for area lamps, value in [0.01, 100.0]"}, - {"setBufferSize", ( PyCFunction ) Lamp_oldsetBufferSize, METH_VARARGS, - "(int) - change Lamp buffer size value"}, - {"setHaloStep", ( PyCFunction ) Lamp_oldsetHaloStep, METH_VARARGS, - "(int) - change Lamp halo step value"}, - {"setEnergy", ( PyCFunction ) Lamp_oldsetEnergy, METH_VARARGS, - "(float) - change Lamp energy value"}, - {"setDist", ( PyCFunction ) Lamp_oldsetDist, METH_VARARGS, - "(float) - change Lamp clipping distance value"}, - {"setSpotSize", ( PyCFunction ) Lamp_oldsetSpotSize, METH_VARARGS, - "(float) - change Lamp spot size value"}, - {"setSpotBlend", ( PyCFunction ) Lamp_oldsetSpotBlend, METH_VARARGS, - "(float) - change Lamp spot blend value"}, - {"setClipStart", ( PyCFunction ) Lamp_oldsetClipStart, METH_VARARGS, - "(float) - change Lamp clip start value"}, - {"setClipEnd", ( PyCFunction ) Lamp_oldsetClipEnd, METH_VARARGS, - "(float) - change Lamp clip end value"}, - {"setBias", ( PyCFunction ) Lamp_oldsetBias, METH_VARARGS, - "(float) - change Lamp draw size value"}, - {"setSoftness", ( PyCFunction ) Lamp_oldsetSoftness, METH_VARARGS, - "(float) - change Lamp softness value"}, - {"setHaloInt", ( PyCFunction ) Lamp_oldsetHaloInt, METH_VARARGS, - "(float) - change Lamp halo intensity value"}, - {"setQuad1", ( PyCFunction ) Lamp_oldsetQuad1, METH_VARARGS, - "(float) - change light intensity value #1 for a Quad Lamp"}, - {"setQuad2", ( PyCFunction ) Lamp_oldsetQuad2, METH_VARARGS, - "(float) - change light intensity value #2 for a Quad Lamp"}, - {"setCol", ( PyCFunction ) Lamp_oldsetCol, METH_VARARGS, - "(f,f,f) or ([f,f,f]) - change light's rgb color triplet"}, - {"getScriptLinks", ( PyCFunction ) Lamp_getScriptLinks, METH_O, - "(eventname) - Get a list of this lamp's scriptlinks (Text names) " - "of the given type\n" - "(eventname) - string: FrameChanged, Redraw or Render."}, - {"addScriptLink", ( PyCFunction ) Lamp_addScriptLink, METH_VARARGS, - "(text, evt) - Add a new lamp scriptlink.\n" - "(text) - string: an existing Blender Text name;\n" - "(evt) string: FrameChanged, Redraw or Render."}, - {"clearScriptLinks", ( PyCFunction ) Lamp_clearScriptLinks, - METH_VARARGS, - "() - Delete all scriptlinks from this lamp.\n" - "([s1<,s2,s3...>]) - Delete specified scriptlinks from this lamp."}, - {"getIpo", ( PyCFunction ) Lamp_getIpo, METH_NOARGS, - "() - get IPO for this lamp"}, - {"clearIpo", ( PyCFunction ) Lamp_clearIpo, METH_NOARGS, - "() - unlink the IPO for this lamp"}, - {"setIpo", ( PyCFunction ) Lamp_oldsetIpo, METH_VARARGS, - "( lamp-ipo ) - link an IPO to this lamp"}, - {"insertIpoKey", ( PyCFunction ) Lamp_insertIpoKey, METH_VARARGS, - "( Lamp IPO type ) - Inserts a key into IPO"}, - {"__copy__", ( PyCFunction ) Lamp_copy, METH_NOARGS, - "() - Makes a copy of this lamp."}, - {"copy", ( PyCFunction ) Lamp_copy, METH_NOARGS, - "() - Makes a copy of this lamp."}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Lamp_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"bias", - (getter)Lamp_getBias, (setter)Lamp_setBias, - "Lamp shadow map sampling bias", - NULL}, - {"bufferSize", - (getter)Lamp_getBufferSize, (setter)Lamp_setBufferSize, - "Lamp shadow buffer size", - NULL}, - {"clipEnd", - (getter)Lamp_getClipEnd, (setter)Lamp_setClipEnd, - "Lamp shadow map clip end", - NULL}, - {"clipStart", - (getter)Lamp_getClipStart, (setter)Lamp_setClipStart, - "Lamp shadow map clip start", - NULL}, - {"col", - (getter)Lamp_getCol, (setter)Lamp_setCol, - "Lamp RGB color triplet", - NULL}, - {"dist", - (getter)Lamp_getDist, (setter)Lamp_setDist, - "Lamp clipping distance", - NULL}, - {"energy", - (getter)Lamp_getEnergy, (setter)Lamp_setEnergy, - "Lamp light intensity", - NULL}, - {"haloInt", - (getter)Lamp_getHaloInt, (setter)Lamp_setHaloInt, - "Lamp spotlight halo intensity", - NULL}, - {"haloStep", - (getter)Lamp_getHaloStep, (setter)Lamp_setHaloStep, - "Lamp volumetric halo sampling frequency", - NULL}, - {"ipo", - (getter)Lamp_getIpo, (setter)Lamp_setIpo, - "Lamp Ipo", - NULL}, - {"mode", - (getter)Lamp_getMode, (setter)Lamp_setMode, - "Lamp mode bitmask", - NULL}, - {"quad1", - (getter)Lamp_getQuad1, (setter)Lamp_setQuad1, - "Quad lamp linear distance attenuation", - NULL}, - {"quad2", - (getter)Lamp_getQuad2, (setter)Lamp_setQuad2, - "Quad lamp quadratic distance attenuation", - NULL}, - {"samples", - (getter)Lamp_getSamples, (setter)Lamp_setSamples, - "Lamp shadow map samples", - NULL}, - {"raySamplesX", - (getter)Lamp_getRaySamplesX, (setter)Lamp_setRaySamplesX, - "Lamp raytracing samples on the X axis", - NULL}, - {"raySamplesY", - (getter)Lamp_getRaySamplesY, (setter)Lamp_setRaySamplesY, - "Lamp raytracing samples on the Y axis", - NULL}, - {"areaSizeX", - (getter)Lamp_getAreaSizeX, (setter)Lamp_setAreaSizeX, - "Lamp X size for an arealamp", - NULL}, - {"areaSizeY", - (getter)Lamp_getAreaSizeY, (setter)Lamp_setAreaSizeY, - "Lamp Y size for an arealamp", - NULL}, - {"softness", - (getter)Lamp_getSoftness, (setter)Lamp_setSoftness, - "Lamp shadow sample area size", - NULL}, - {"spotBlend", - (getter)Lamp_getSpotBlend, (setter)Lamp_setSpotBlend, - "Lamp spotlight edge softness", - NULL}, - {"spotSize", - (getter)Lamp_getSpotSize, (setter)Lamp_setSpotSize, - "Lamp spotlight beam angle (in degrees)", - NULL}, - {"type", - (getter)Lamp_getType, (setter)Lamp_setType, - "Lamp type", - NULL}, - {"R", - (getter)Lamp_getComponent, (setter)Lamp_setComponent, - "Lamp color red component", - (void *)EXPP_LAMP_COMP_R}, - {"r", - (getter)Lamp_getComponent, (setter)Lamp_setComponent, - "Lamp color red component", - (void *)EXPP_LAMP_COMP_R}, - {"G", - (getter)Lamp_getComponent, (setter)Lamp_setComponent, - "Lamp color green component", - (void *)EXPP_LAMP_COMP_G}, - {"g", - (getter)Lamp_getComponent, (setter)Lamp_setComponent, - "Lamp color green component", - (void *)EXPP_LAMP_COMP_G}, - {"B", - (getter)Lamp_getComponent, (setter)Lamp_setComponent, - "Lamp color blue component", - (void *)EXPP_LAMP_COMP_B}, - {"b", - (getter)Lamp_getComponent, (setter)Lamp_setComponent, - "Lamp color blue component", - (void *)EXPP_LAMP_COMP_B}, - {"Modes", - (getter)Lamp_getModesConst, (setter)NULL, - "Dictionary of values for 'mode' attribute", - NULL}, - {"Types", - (getter)Lamp_getTypesConst, (setter)NULL, - "Dictionary of values for 'type' attribute", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python TypeLamp callback function prototypes: */ -/*****************************************************************************/ -static void Lamp_dealloc( BPy_Lamp * lamp ); -static int Lamp_compare( BPy_Lamp * a, BPy_Lamp * b ); -static PyObject *Lamp_repr( BPy_Lamp * lamp ); - -/*****************************************************************************/ -/* Python TypeLamp structure definition: */ -/*****************************************************************************/ -PyTypeObject Lamp_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Lamp", /* char *tp_name; */ - sizeof( BPy_Lamp ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) Lamp_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) Lamp_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Lamp_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Lamp_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Lamp_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 -}; - -/*****************************************************************************/ -/* Function: M_Lamp_New */ -/* Python equivalent: Blender.Lamp.New */ -/*****************************************************************************/ -static PyObject *M_Lamp_New( PyObject * self, PyObject * args, - PyObject * keywords ) -{ - char *type_str = "Lamp"; - char *name_str = "Lamp"; - static char *kwlist[] = { "type_str", "name_str", NULL }; - BPy_Lamp *py_lamp; /* for Lamp Data object wrapper in Python */ - Lamp *bl_lamp; /* for actual Lamp Data we create in Blender */ - - if( !PyArg_ParseTupleAndKeywords( args, keywords, "|ss", kwlist, - &type_str, &name_str ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string(s) or empty argument" ) ); - - bl_lamp = add_lamp( name_str ); /* first create in Blender */ - - if( bl_lamp ) /* now create the wrapper obj in Python */ - py_lamp = ( BPy_Lamp * ) Lamp_CreatePyObject( bl_lamp ); - else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Lamp Data in Blender" ) ); - - /* let's return user count to zero, because ... */ - bl_lamp->id.us = 0; /* ... add_lamp() incref'ed it */ - - if( py_lamp == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Lamp Data object" ) ); - - if( strcmp( type_str, "Lamp" ) == 0 ) - bl_lamp->type = ( short ) EXPP_LAMP_TYPE_LAMP; - else if( strcmp( type_str, "Sun" ) == 0 ) - bl_lamp->type = ( short ) EXPP_LAMP_TYPE_SUN; - else if( strcmp( type_str, "Spot" ) == 0 ) - bl_lamp->type = ( short ) EXPP_LAMP_TYPE_SPOT; - else if( strcmp( type_str, "Hemi" ) == 0 ) - bl_lamp->type = ( short ) EXPP_LAMP_TYPE_HEMI; - else if( strcmp( type_str, "Area" ) == 0 ) - bl_lamp->type = ( short ) EXPP_LAMP_TYPE_AREA; - else if( strcmp( type_str, "Photon" ) == 0 ) - bl_lamp->type = ( short ) EXPP_LAMP_TYPE_YF_PHOTON; - else - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown lamp type" ) ); - - return ( PyObject * ) py_lamp; -} - -/*****************************************************************************/ -/* Function: M_Lamp_Get */ -/* Python equivalent: Blender.Lamp.Get */ -/* Description: Receives a string and returns the lamp data obj */ -/* whose name matches the string. If no argument is */ -/* passed in, a list of all lamp data names in the */ -/* current scene is returned. */ -/*****************************************************************************/ -static PyObject *M_Lamp_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Lamp *lamp_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - lamp_iter = G.main->lamp.first; - - if( name ) { /* (name) - Search lamp by name */ - - BPy_Lamp *wanted_lamp = NULL; - - while( ( lamp_iter ) && ( wanted_lamp == NULL ) ) { - - if( strcmp( name, lamp_iter->id.name + 2 ) == 0 ) - wanted_lamp = - ( BPy_Lamp * ) - Lamp_CreatePyObject( lamp_iter ); - - lamp_iter = lamp_iter->id.next; - } - - if( wanted_lamp == NULL ) { /* Requested lamp doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Lamp \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return ( PyObject * ) wanted_lamp; - } - - else { /* () - return a list of all lamps in the scene */ - int index = 0; - PyObject *lamplist, *pyobj; - - lamplist = PyList_New( BLI_countlist( &( G.main->lamp ) ) ); - - if( lamplist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( lamp_iter ) { - pyobj = Lamp_CreatePyObject( lamp_iter ); - - if( !pyobj ) { - Py_DECREF(lamplist); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create PyLamp" ) ); - } - - PyList_SET_ITEM( lamplist, index, pyobj ); - - lamp_iter = lamp_iter->id.next; - index++; - } - - return lamplist; - } -} - -static PyObject *Lamp_TypesDict( void ) -{ /* create the Blender.Lamp.Types constant dict */ - PyObject *Types = PyConstant_New( ); - - if( Types ) { - BPy_constant *c = ( BPy_constant * ) Types; - - PyConstant_Insert( c, "Lamp", - PyInt_FromLong( EXPP_LAMP_TYPE_LAMP ) ); - PyConstant_Insert( c, "Sun", - PyInt_FromLong( EXPP_LAMP_TYPE_SUN ) ); - PyConstant_Insert( c, "Spot", - PyInt_FromLong( EXPP_LAMP_TYPE_SPOT ) ); - PyConstant_Insert( c, "Hemi", - PyInt_FromLong( EXPP_LAMP_TYPE_HEMI ) ); - PyConstant_Insert( c, "Area", - PyInt_FromLong( EXPP_LAMP_TYPE_AREA ) ); - PyConstant_Insert( c, "Photon", - PyInt_FromLong( EXPP_LAMP_TYPE_YF_PHOTON ) ); - } - - return Types; -} - -static PyObject *Lamp_ModesDict( void ) -{ /* create the Blender.Lamp.Modes constant dict */ - PyObject *Modes = PyConstant_New( ); - - if( Modes ) { - BPy_constant *c = ( BPy_constant * ) Modes; - - PyConstant_Insert( c, "Shadows", - PyInt_FromLong( EXPP_LAMP_MODE_SHADOWS ) ); - PyConstant_Insert( c, "Halo", - PyInt_FromLong( EXPP_LAMP_MODE_HALO ) ); - PyConstant_Insert( c, "Layer", - PyInt_FromLong( EXPP_LAMP_MODE_LAYER ) ); - PyConstant_Insert( c, "Quad", - PyInt_FromLong( EXPP_LAMP_MODE_QUAD ) ); - PyConstant_Insert( c, "Negative", - PyInt_FromLong( EXPP_LAMP_MODE_NEGATIVE ) ); - PyConstant_Insert( c, "Sphere", - PyInt_FromLong( EXPP_LAMP_MODE_SPHERE ) ); - PyConstant_Insert( c, "Square", - PyInt_FromLong( EXPP_LAMP_MODE_SQUARE ) ); - PyConstant_Insert( c, "OnlyShadow", - PyInt_FromLong( EXPP_LAMP_MODE_ONLYSHADOW ) ); - PyConstant_Insert( c, "NoDiffuse", - PyInt_FromLong( EXPP_LAMP_MODE_NODIFFUSE ) ); - PyConstant_Insert( c, "NoSpecular", - PyInt_FromLong( EXPP_LAMP_MODE_NOSPECULAR ) ); - PyConstant_Insert( c, "RayShadow", - PyInt_FromLong( EXPP_LAMP_MODE_SHAD_RAY ) ); - } - - return Modes; -} - -/*****************************************************************************/ -/* Function: Lamp_Init */ -/*****************************************************************************/ -/* Needed by the Blender module, to register the Blender.Lamp submodule */ -PyObject *Lamp_Init( void ) -{ - PyObject *submodule, *Types, *Modes; - - if( PyType_Ready( &Lamp_Type ) < 0) - return NULL; - - Types = Lamp_TypesDict( ); - Modes = Lamp_ModesDict( ); - - submodule = - Py_InitModule3( "Blender.Lamp", M_Lamp_methods, M_Lamp_doc ); - - if( Types ) - PyModule_AddObject( submodule, "Types", Types ); - if( Modes ) - PyModule_AddObject( submodule, "Modes", Modes ); - - PyModule_AddIntConstant( submodule, "RGB", IPOKEY_RGB ); - PyModule_AddIntConstant( submodule, "ENERGY", IPOKEY_ENERGY ); - PyModule_AddIntConstant( submodule, "SPOTSIZE", IPOKEY_SPOTSIZE ); - PyModule_AddIntConstant( submodule, "OFFSET", IPOKEY_OFFSET ); - PyModule_AddIntConstant( submodule, "SIZE", IPOKEY_SIZE ); - - return submodule; -} - -/* Three Python Lamp_Type helper functions needed by the Object module: */ - -/*****************************************************************************/ -/* Function: Lamp_CreatePyObject */ -/* Description: This function will create a new BPy_Lamp from an existing */ -/* Blender lamp structure. */ -/*****************************************************************************/ -PyObject *Lamp_CreatePyObject( Lamp * lamp ) -{ - BPy_Lamp *pylamp; - float *rgb[3]; - - pylamp = ( BPy_Lamp * ) PyObject_NEW( BPy_Lamp, &Lamp_Type ); - - if( !pylamp ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Lamp object" ); - - pylamp->lamp = lamp; - - rgb[0] = &lamp->r; - rgb[1] = &lamp->g; - rgb[2] = &lamp->b; - - pylamp->color = ( BPy_rgbTuple * ) rgbTuple_New( rgb ); - Py_INCREF(pylamp->color); - - return ( PyObject * ) pylamp; -} - -/*****************************************************************************/ -/* Function: Lamp_FromPyObject */ -/* Description: This function returns the Blender lamp from the given */ -/* PyObject. */ -/*****************************************************************************/ -Lamp *Lamp_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Lamp * ) pyobj )->lamp; -} - -/*****************************************************************************/ -/* Python BPy_Lamp methods: */ -/*****************************************************************************/ - -/* Lamp.__copy__ */ -static PyObject *Lamp_copy( BPy_Lamp * self ) -{ - Lamp *lamp = copy_lamp(self->lamp ); - lamp->id.us = 0; - return Lamp_CreatePyObject(lamp); -} - -static PyObject *Lamp_getType( BPy_Lamp * self ) -{ - return PyInt_FromLong( self->lamp->type ); -} - -static PyObject *Lamp_getMode( BPy_Lamp * self ) -{ - return PyInt_FromLong( self->lamp->mode ); -} - -static PyObject *Lamp_getSamples( BPy_Lamp * self ) -{ - return PyInt_FromLong( self->lamp->samp ); -} - -static PyObject *Lamp_getRaySamplesX( BPy_Lamp * self ) -{ - return PyInt_FromLong( self->lamp->ray_samp ); -} - -static PyObject *Lamp_getRaySamplesY( BPy_Lamp * self ) -{ - return PyInt_FromLong( self->lamp->ray_sampy ); -} - -static PyObject *Lamp_getAreaSizeX( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->area_size ); -} - -static PyObject *Lamp_getAreaSizeY( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->area_sizey ); -} - -static PyObject *Lamp_getBufferSize( BPy_Lamp * self ) -{ - return PyInt_FromLong( self->lamp->bufsize ); -} - -static PyObject *Lamp_getHaloStep( BPy_Lamp * self ) -{ - return PyInt_FromLong( self->lamp->shadhalostep ); -} - -static PyObject *Lamp_getEnergy( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->energy ); -} - -static PyObject *Lamp_getDist( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->dist ); -} - -static PyObject *Lamp_getSpotSize( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->spotsize ); -} - -static PyObject *Lamp_getSpotBlend( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->spotblend ); -} - -static PyObject *Lamp_getClipStart( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->clipsta ); -} - -static PyObject *Lamp_getClipEnd( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->clipend ); -} - -static PyObject *Lamp_getBias( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->bias ); -} - -static PyObject *Lamp_getSoftness( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->soft ); -} - -static PyObject *Lamp_getHaloInt( BPy_Lamp * self ) -{ - return PyFloat_FromDouble( self->lamp->haint ); -} - -static PyObject *Lamp_getQuad1( BPy_Lamp * self ) -{ /* should we complain if Lamp is not of type Quad? */ - return PyFloat_FromDouble( self->lamp->att1 ); -} - -static PyObject *Lamp_getQuad2( BPy_Lamp * self ) -{ /* should we complain if Lamp is not of type Quad? */ - return PyFloat_FromDouble( self->lamp->att2 ); -} - -static PyObject *Lamp_getCol( BPy_Lamp * self ) -{ - return rgbTuple_getCol( self->color ); -} - -static int Lamp_setType( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setIValueRange ( value, &self->lamp->type, - 0, EXPP_LAMP_TYPE_MAX, 'h' ); -} - -static int Lamp_setMode( BPy_Lamp * self, PyObject * value ) -{ - short param; - static short bitmask = EXPP_LAMP_MODE_SHADOWS - | EXPP_LAMP_MODE_HALO - | EXPP_LAMP_MODE_LAYER - | EXPP_LAMP_MODE_QUAD - | EXPP_LAMP_MODE_NEGATIVE - | EXPP_LAMP_MODE_ONLYSHADOW - | EXPP_LAMP_MODE_SPHERE - | EXPP_LAMP_MODE_SQUARE - | EXPP_LAMP_MODE_NODIFFUSE - | EXPP_LAMP_MODE_NOSPECULAR - | EXPP_LAMP_MODE_SHAD_RAY; - - if( !PyInt_Check ( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - param = (short)PyInt_AS_LONG ( value ); - - if ( ( param & bitmask ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - self->lamp->mode = param; - - return 0; -} - -static int Lamp_setSamples( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->lamp->samp, - EXPP_LAMP_SAMPLES_MIN, - EXPP_LAMP_SAMPLES_MAX, 'h' ); -} - - -static int Lamp_setRaySamplesX( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->lamp->ray_samp, - EXPP_LAMP_RAYSAMPLES_MIN, - EXPP_LAMP_RAYSAMPLES_MAX, 'h' ); -} - -static int Lamp_setRaySamplesY( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->lamp->ray_sampy, - EXPP_LAMP_RAYSAMPLES_MIN, - EXPP_LAMP_RAYSAMPLES_MAX, 'h' ); -} - -static int Lamp_setAreaSizeX( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->area_size, - EXPP_LAMP_AREASIZE_MIN, - EXPP_LAMP_AREASIZE_MAX ); -} - -static int Lamp_setAreaSizeY( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->area_sizey, - EXPP_LAMP_AREASIZE_MIN, - EXPP_LAMP_AREASIZE_MAX ); -} - -static int Lamp_setBufferSize( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->lamp->bufsize, - EXPP_LAMP_BUFFERSIZE_MIN, - EXPP_LAMP_BUFFERSIZE_MAX, 'h' ); -} - -static int Lamp_setHaloStep( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->lamp->shadhalostep, - EXPP_LAMP_HALOSTEP_MIN, - EXPP_LAMP_HALOSTEP_MAX, 'h' ); -} - -static int Lamp_setEnergy( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->energy, - EXPP_LAMP_ENERGY_MIN, - EXPP_LAMP_ENERGY_MAX ); -} - -static int Lamp_setDist( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->dist, - EXPP_LAMP_DIST_MIN, - EXPP_LAMP_DIST_MAX ); -} - -static int Lamp_setSpotSize( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->spotsize, - EXPP_LAMP_SPOTSIZE_MIN, - EXPP_LAMP_SPOTSIZE_MAX ); -} - -static int Lamp_setSpotBlend( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->spotblend, - EXPP_LAMP_SPOTBLEND_MIN, - EXPP_LAMP_SPOTBLEND_MAX ); -} - -static int Lamp_setClipStart( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->clipsta, - EXPP_LAMP_CLIPSTART_MIN, - EXPP_LAMP_CLIPSTART_MAX ); -} - -static int Lamp_setClipEnd( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->clipend, - EXPP_LAMP_CLIPEND_MIN, - EXPP_LAMP_CLIPEND_MAX ); -} - -static int Lamp_setBias( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->bias, - EXPP_LAMP_BIAS_MIN, - EXPP_LAMP_BIAS_MAX ); -} - -static int Lamp_setSoftness( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->soft, - EXPP_LAMP_SOFTNESS_MIN, - EXPP_LAMP_SOFTNESS_MAX ); -} - -static int Lamp_setHaloInt( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->haint, - EXPP_LAMP_HALOINT_MIN, - EXPP_LAMP_HALOINT_MAX ); -} - -static int Lamp_setQuad1( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->att1, - EXPP_LAMP_QUAD1_MIN, - EXPP_LAMP_QUAD1_MAX ); -} - -static int Lamp_setQuad2( BPy_Lamp * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->lamp->att2, - EXPP_LAMP_QUAD2_MIN, - EXPP_LAMP_QUAD2_MAX ); -} - -static PyObject *Lamp_getComponent( BPy_Lamp * self, void * closure ) -{ - switch ( (int)closure ) { - case EXPP_LAMP_COMP_R: - return PyFloat_FromDouble( self->lamp->r ); - case EXPP_LAMP_COMP_G: - return PyFloat_FromDouble( self->lamp->g ); - case EXPP_LAMP_COMP_B: - return PyFloat_FromDouble( self->lamp->b ); - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unknown color component specified" ); - } -} - -static int Lamp_setComponent( BPy_Lamp * self, PyObject * value, - void * closure ) -{ - float color; - - if( !PyNumber_Check ( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument in [0.0,1.0]" ); - - color = (float)PyFloat_AsDouble( value ); - color = EXPP_ClampFloat( color, EXPP_LAMP_COL_MIN, EXPP_LAMP_COL_MAX ); - - switch ( (int)closure ) { - case EXPP_LAMP_COMP_R: - self->lamp->r = color; - return 0; - case EXPP_LAMP_COMP_G: - self->lamp->g = color; - return 0; - case EXPP_LAMP_COMP_B: - self->lamp->b = color; - return 0; - } - return EXPP_ReturnIntError( PyExc_RuntimeError, - "unknown color component specified" ); -} - -static int Lamp_setCol( BPy_Lamp * self, PyObject * args ) -{ - return rgbTuple_setCol( self->color, args ); -} - -/* lamp.addScriptLink */ -static PyObject *Lamp_addScriptLink( BPy_Lamp * self, PyObject * args ) -{ - Lamp *lamp = self->lamp; - ScriptLink *slink = NULL; - - slink = &( lamp )->scriptlink; - - return EXPP_addScriptLink( slink, args, 0 ); -} - -/* lamp.clearScriptLinks */ -static PyObject *Lamp_clearScriptLinks( BPy_Lamp * self, PyObject * args ) -{ - Lamp *lamp = self->lamp; - ScriptLink *slink = NULL; - - slink = &( lamp )->scriptlink; - - return EXPP_clearScriptLinks( slink, args ); -} - -/* mat.getScriptLinks */ -static PyObject *Lamp_getScriptLinks( BPy_Lamp * self, PyObject * value ) -{ - Lamp *lamp = self->lamp; - ScriptLink *slink = NULL; - PyObject *ret = NULL; - - slink = &( lamp )->scriptlink; - - ret = EXPP_getScriptLinks( slink, value, 0 ); - - if( ret ) - return ret; - else - return NULL; -} - -/*****************************************************************************/ -/* Function: Lamp_dealloc */ -/* Description: This is a callback function for the BPy_Lamp type. It is */ -/* the destructor function. */ -/*****************************************************************************/ -static void Lamp_dealloc( BPy_Lamp * self ) -{ - Py_DECREF( self->color ); - PyObject_DEL( self ); -} - -/*****************************************************************************/ -/* Function: Lamp_compare */ -/* Description: This is a callback function for the BPy_Lamp type. It */ -/* compares two Lamp_Type objects. Only the "==" and "!=" */ -/* comparisons are meaningful. Returns 0 for equality and -1 */ -/* if they don't point to the same Blender Lamp struct. */ -/* In Python it becomes 1 if they are equal, 0 otherwise. */ -/*****************************************************************************/ -static int Lamp_compare( BPy_Lamp * a, BPy_Lamp * b ) -{ - return ( a->lamp == b->lamp ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Lamp_repr */ -/* Description: This is a callback function for the BPy_Lamp type. It */ -/* builds a meaninful string to represent lamp objects. */ -/*****************************************************************************/ -static PyObject *Lamp_repr( BPy_Lamp * self ) -{ - return PyString_FromFormat( "[Lamp \"%s\"]", self->lamp->id.name + 2 ); -} - -static PyObject *Lamp_getIpo( BPy_Lamp * self ) -{ - struct Ipo *ipo = self->lamp->ipo; - - if( !ipo ) - Py_RETURN_NONE; - - return Ipo_CreatePyObject( ipo ); -} - -/* - * this should accept a Py_None argument and just delete the Ipo link - * (as Lamp_clearIpo() does) - */ - -static int Lamp_setIpo( BPy_Lamp * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->lamp->ipo, 0, 1, ID_IP, ID_LA); -} - -/* - * Lamp_insertIpoKey() - * inserts Lamp IPO key for RGB,ENERGY,SPOTSIZE,OFFSET,SIZE - */ - -static PyObject *Lamp_insertIpoKey( BPy_Lamp * self, PyObject * args ) -{ - int key = 0, map; - - if( !PyArg_ParseTuple( args, "i", &( key ) ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument" ) ); - - map = texchannel_to_adrcode(self->lamp->texact); - - if (key == IPOKEY_RGB ) { - insertkey((ID *)self->lamp, ID_LA, NULL, NULL, LA_COL_R, 0); - insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_G, 0); - insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_B, 0); - } - if (key == IPOKEY_ENERGY ) { - insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_ENERGY, 0); - } - if (key == IPOKEY_SPOTSIZE ) { - insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_SPOTSI, 0); - } - if (key == IPOKEY_OFFSET ) { - insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_X, 0); - insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Y, 0); - insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Z, 0); - } - if (key == IPOKEY_SIZE ) { - insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_X, 0); - insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Y, 0); - insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Z, 0); - } - - allspace(REMAKEIPO, 0); - EXPP_allqueue(REDRAWIPO, 0); - EXPP_allqueue(REDRAWVIEW3D, 0); - EXPP_allqueue(REDRAWACTION, 0); - EXPP_allqueue(REDRAWNLA, 0); - - Py_RETURN_NONE; -} - -static PyObject *Lamp_getModesConst( void ) -{ - return Py_BuildValue - ( "{s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h}", - "Shadows", EXPP_LAMP_MODE_SHADOWS, "Halo", - EXPP_LAMP_MODE_HALO, "Layer", EXPP_LAMP_MODE_LAYER, - "Quad", EXPP_LAMP_MODE_QUAD, "Negative", - EXPP_LAMP_MODE_NEGATIVE, "OnlyShadow", - EXPP_LAMP_MODE_ONLYSHADOW, "Sphere", - EXPP_LAMP_MODE_SPHERE, "Square", - EXPP_LAMP_MODE_SQUARE, "NoDiffuse", - EXPP_LAMP_MODE_NODIFFUSE, "NoSpecular", - EXPP_LAMP_MODE_NOSPECULAR, "RayShadow", - EXPP_LAMP_MODE_SHAD_RAY); -} - -static PyObject *Lamp_getTypesConst( void ) -{ - return Py_BuildValue( "{s:h,s:h,s:h,s:h,s:h,s:h}", - "Lamp", EXPP_LAMP_TYPE_LAMP, - "Sun", EXPP_LAMP_TYPE_SUN, - "Spot", EXPP_LAMP_TYPE_SPOT, - "Hemi", EXPP_LAMP_TYPE_HEMI, - "Area", EXPP_LAMP_TYPE_AREA, - "Photon", EXPP_LAMP_TYPE_YF_PHOTON ); -} - -/* #####DEPRECATED###### */ - -static PyObject *Lamp_oldsetSamples( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setSamples ); -} - -static PyObject *Lamp_oldsetRaySamplesX( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setRaySamplesX ); -} - -static PyObject *Lamp_oldsetRaySamplesY( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setRaySamplesY ); -} - -static PyObject *Lamp_oldsetAreaSizeX( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setAreaSizeX ); -} - -static PyObject *Lamp_oldsetAreaSizeY( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setAreaSizeY ); -} - -static PyObject *Lamp_oldsetBufferSize( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setBufferSize ); -} - -static PyObject *Lamp_oldsetHaloStep( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setHaloStep ); -} - -static PyObject *Lamp_oldsetEnergy( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setEnergy ); -} - -static PyObject *Lamp_oldsetDist( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setDist ); -} - -static PyObject *Lamp_oldsetSpotSize( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setSpotSize ); -} - -static PyObject *Lamp_oldsetSpotBlend( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setSpotBlend ); -} - -static PyObject *Lamp_oldsetClipStart( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setClipStart ); -} - -static PyObject *Lamp_oldsetClipEnd( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setClipEnd ); -} - -static PyObject *Lamp_oldsetBias( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setBias ); -} - -static PyObject *Lamp_oldsetSoftness( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setSoftness ); -} - -static PyObject *Lamp_oldsetHaloInt( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setHaloInt ); -} - -static PyObject *Lamp_oldsetQuad1( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setQuad1 ); -} - -static PyObject *Lamp_oldsetQuad2( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setQuad2 ); -} - -static PyObject *Lamp_oldsetIpo( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setIpo ); -} - -static PyObject *Lamp_oldsetCol( BPy_Lamp * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Lamp_setCol ); -} - -/* - * the "not-well-behaved" methods which require more processing than - * just the simple wrapper - */ - -/* - * clearIpo() returns True/False depending on whether lamp has an Ipo - */ - -static PyObject *Lamp_clearIpo( BPy_Lamp * self ) -{ - /* if Ipo defined, delete it and return true */ - - if( self->lamp->ipo ) { - PyObject *value = Py_BuildValue( "(O)", Py_None ); - EXPP_setterWrapper ( (void *)self, value, (setter)Lamp_setIpo ); - Py_DECREF ( value ); - return EXPP_incr_ret_True(); - } - return EXPP_incr_ret_False(); /* no ipo found */ -} - -/* - * setType() accepts a string while mode setter takes an integer - */ - -static PyObject *Lamp_oldsetType( BPy_Lamp * self, PyObject * value ) -{ - char *type = PyString_AsString(value); - PyObject *arg, *error; - - /* parse string argument */ - - if( !value ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ) ); - - /* check for valid arguments, set type accordingly */ - - if( !strcmp( type, "Lamp" ) ) - self->lamp->type = ( short ) EXPP_LAMP_TYPE_LAMP; - else if( !strcmp( type, "Sun" ) ) - self->lamp->type = ( short ) EXPP_LAMP_TYPE_SUN; - else if( !strcmp( type, "Spot" ) ) - self->lamp->type = ( short ) EXPP_LAMP_TYPE_SPOT; - else if( !strcmp( type, "Hemi" ) ) - self->lamp->type = ( short ) EXPP_LAMP_TYPE_HEMI; - else if( !strcmp( type, "Area" ) ) - self->lamp->type = ( short ) EXPP_LAMP_TYPE_AREA; - else if( !strcmp( type, "Photon" ) ) - self->lamp->type = ( short ) EXPP_LAMP_TYPE_YF_PHOTON; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown lamp type" ); - - /* build tuple, call wrapper */ - - arg = Py_BuildValue( "(i)", type ); - error = EXPP_setterWrapper ( (void *)self, arg, (setter)Lamp_setType ); - Py_DECREF ( arg ); - return error; -} - -/* - * setMode() accepts up to ten strings while mode setter takes an integer - */ - -static PyObject *Lamp_oldsetMode( BPy_Lamp * self, PyObject * args ) -{ - short i, flag = 0; - PyObject *error, *value; - char *name; - - /* check that we're passed a tuple of no more than 10 args*/ - - if ( !PyTuple_Check( args ) || PyTuple_Size( args ) > 10 ) - return EXPP_ReturnPyObjError ( PyExc_AttributeError, - "expected up to 10 string arguments" ); - - /* check each argument for type, find its value */ - - for ( i = (short)PyTuple_Size( args ); i-- ; ) { - name = PyString_AsString ( PyTuple_GET_ITEM( args, i ) ); - if( !name ) - return EXPP_ReturnPyObjError ( PyExc_AttributeError, - "expected string argument" ); - - if( !strcmp( name, "Shadows" ) ) - flag |= ( short ) EXPP_LAMP_MODE_SHADOWS; - else if( !strcmp( name, "Halo" ) ) - flag |= ( short ) EXPP_LAMP_MODE_HALO; - else if( !strcmp( name, "Layer" ) ) - flag |= ( short ) EXPP_LAMP_MODE_LAYER; - else if( !strcmp( name, "Quad" ) ) - flag |= ( short ) EXPP_LAMP_MODE_QUAD; - else if( !strcmp( name, "Negative" ) ) - flag |= ( short ) EXPP_LAMP_MODE_NEGATIVE; - else if( !strcmp( name, "OnlyShadow" ) ) - flag |= ( short ) EXPP_LAMP_MODE_ONLYSHADOW; - else if( !strcmp( name, "Sphere" ) ) - flag |= ( short ) EXPP_LAMP_MODE_SPHERE; - else if( !strcmp( name, "Square" ) ) - flag |= ( short ) EXPP_LAMP_MODE_SQUARE; - else if( !strcmp( name, "NoDiffuse" ) ) - flag |= ( short ) EXPP_LAMP_MODE_NODIFFUSE; - else if( !strcmp( name, "NoSpecular" ) ) - flag |= ( short ) EXPP_LAMP_MODE_NOSPECULAR; - else if( !strcmp( name, "RayShadow" ) ) - flag |= ( short ) EXPP_LAMP_MODE_SHAD_RAY; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown lamp flag argument" ); - } - - /* build tuple, call wrapper */ - - 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 deleted file mode 100644 index 01c80e0006b..00000000000 --- a/source/blender/python/api2_2x/Lamp.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * $Id: Lamp.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Nathan Letwory - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_LAMP_H -#define EXPP_LAMP_H - -#include -#include "DNA_lamp_types.h" -#include "rgbTuple.h" - -extern PyTypeObject Lamp_Type; - -#define BPy_Lamp_Check(v) \ - ((v)->ob_type == &Lamp_Type) /* for type checking */ - -/* Python BPy_Lamp structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - Lamp * lamp; /* libdata must be second */ - BPy_rgbTuple *color; -} BPy_Lamp; - - -/* - * prototypes - */ - -PyObject *Lamp_Init( void ); -PyObject *Lamp_CreatePyObject( struct Lamp *lamp ); -Lamp *Lamp_FromPyObject( PyObject * pyobj ); - -#endif /* EXPP_LAMP_H */ diff --git a/source/blender/python/api2_2x/Lattice.c b/source/blender/python/api2_2x/Lattice.c deleted file mode 100644 index 6a9f3891e52..00000000000 --- a/source/blender/python/api2_2x/Lattice.c +++ /dev/null @@ -1,813 +0,0 @@ -/* - * $Id: Lattice.c 11130 2007-06-30 00:18:10Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Lattice.h" /*This must come first*/ - -#include "BKE_utildefines.h" -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_lattice.h" -#include "BLI_blenlib.h" -#include "DNA_object_types.h" -#include "DNA_key_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_curve_types.h" -#include "DNA_scene_types.h" -#include "BIF_editkey.h" -#include "BIF_editdeform.h" -#include "BIF_space.h" -#include "blendef.h" -#include "gen_utils.h" -#include "gen_library.h" - -#include "Key.h" - -/*****************************************************************************/ -/* Python API function prototypes for the Lattice module. */ -/*****************************************************************************/ -static PyObject *M_Lattice_New( PyObject * self, PyObject * args ); -static PyObject *M_Lattice_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* Lattice Module strings */ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Lattice.__doc__ */ -/*****************************************************************************/ -static char M_Lattice_doc[] = "The Blender Lattice module\n\n"; - -static char M_Lattice_New_doc[] = "() - return a new Lattice object"; - -static char M_Lattice_Get_doc[] = "() - get a Lattice from blender"; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Lattice module: */ -/*****************************************************************************/ -struct PyMethodDef M_Lattice_methods[] = { - {"New", ( PyCFunction ) M_Lattice_New, METH_VARARGS, - M_Lattice_New_doc}, - {"Get", ( PyCFunction ) M_Lattice_Get, METH_VARARGS, - M_Lattice_Get_doc}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Lattice Strings */ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Lattice.__doc__ */ -/*****************************************************************************/ -static char Lattice_getName_doc[] = "() - Return Lattice Object name"; - -static char Lattice_setName_doc[] = "(str) - Change Lattice Object name"; - -static char Lattice_setPartitions_doc[] = - "(str) - Set the number of Partitions in x,y,z"; - -static char Lattice_getPartitions_doc[] = - "(str) - Get the number of Partitions in x,y,z"; - -static char Lattice_getKey_doc[] = - "() - Get the Key object attached to this Lattice"; - -static char Lattice_setKeyTypes_doc[] = - "(str) - Set the key types for x,y,z dimensions"; - -static char Lattice_getKeyTypes_doc[] = - "(str) - Get the key types for x,y,z dimensions"; - -static char Lattice_setMode_doc[] = "(str) - Make an outside or grid lattice"; - -static char Lattice_getMode_doc[] = "(str) - Get lattice mode type"; - -static char Lattice_setPoint_doc[] = - "(str) - Set the coordinates of a point on the lattice"; - -static char Lattice_getPoint_doc[] = - "(str) - Get the coordinates of a point on the lattice"; - -static char Lattice_insertKey_doc[] = - "(str) - Set a new key for the lattice at specified frame"; - -static char Lattice_copy_doc[] = - "() - Return a copy of the lattice."; - -//*************************************************************************** -// Function: Lattice_CreatePyObject -//*************************************************************************** -PyObject *Lattice_CreatePyObject( Lattice * lt ) -{ - BPy_Lattice *pyLat; - - pyLat = ( BPy_Lattice * ) PyObject_NEW( BPy_Lattice, &Lattice_Type ); - - if( !pyLat ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Lattice PyObject" ); - - pyLat->lattice = lt; - - return ( PyObject * ) pyLat; -} - -//*************************************************************************** -// Function: Lattice_FromPyObject -//*************************************************************************** - -Lattice *Lattice_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Lattice * ) pyobj )->lattice; -} - -//*************************************************************************** -// Function: M_Lattice_New -// Python equivalent: Blender.Lattice.New -//*************************************************************************** -static PyObject *M_Lattice_New( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Lattice *bl_Lattice; // blender Lattice object - PyObject *py_Lattice; // python wrapper - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string and int arguments (or nothing)" ); - - bl_Lattice = add_lattice( "Lattice" ); - - if( bl_Lattice ) { - bl_Lattice->id.us = 0; - py_Lattice = Lattice_CreatePyObject( bl_Lattice ); - } else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Lattice Object in Blender" ); - if( !py_Lattice ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Lattice Object wrapper" ); - - if( name ) - rename_id( &bl_Lattice->id, name ); - - return py_Lattice; -} - -//*************************************************************************** -// Function: M_Lattice_Get -// Python equivalent: Blender.Lattice.Get -//*************************************************************************** -static PyObject *M_Lattice_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Lattice *lat_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - lat_iter = G.main->latt.first; - - if( name ) { /* (name) - Search Lattice by name */ - - PyObject *wanted_lat = NULL; - - while( ( lat_iter ) && ( wanted_lat == NULL ) ) { - if( strcmp( name, lat_iter->id.name + 2 ) == 0 ) { - wanted_lat = - Lattice_CreatePyObject( lat_iter ); - } - - lat_iter = lat_iter->id.next; - } - - if( wanted_lat == NULL ) { /* Requested Lattice doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Lattice \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return wanted_lat; - } - - else { /* () - return a list of all Lattices in the scene */ - int index = 0; - PyObject *latlist, *pyobj; - - latlist = PyList_New( BLI_countlist( &( G.main->latt ) ) ); - - if( latlist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( lat_iter ) { - pyobj = Lattice_CreatePyObject( lat_iter ); - - if( !pyobj ) { - Py_DECREF(latlist); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create PyString" ) ); - } - PyList_SET_ITEM( latlist, index, pyobj ); - - lat_iter = lat_iter->id.next; - index++; - } - - return ( latlist ); - } -} - -//*************************************************************************** -// Function: Lattice_Init -//*************************************************************************** -PyObject *Lattice_Init( void ) -{ - PyObject *mod; - PyObject *dict; - - if( PyType_Ready( &Lattice_Type ) < 0 ) - return NULL; - - mod = Py_InitModule3( "Blender.Lattice", M_Lattice_methods, - M_Lattice_doc ); - - dict = PyModule_GetDict( mod ); - - //Module dictionary -#define EXPP_ADDCONST(x) EXPP_dict_set_item_str(dict, #x, PyInt_FromLong(LT_##x)) - EXPP_ADDCONST( GRID ); - EXPP_ADDCONST( OUTSIDE ); - -#undef EXPP_ADDCONST -#define EXPP_ADDCONST(x) EXPP_dict_set_item_str(dict, #x, PyInt_FromLong(KEY_##x)) - EXPP_ADDCONST( LINEAR ); - EXPP_ADDCONST( CARDINAL ); - EXPP_ADDCONST( BSPLINE ); - - return ( mod ); -} - -static PyObject *Lattice_setPartitions( BPy_Lattice * self, PyObject * args ) -{ - int x = 0; - int y = 0; - int z = 0; - Lattice *bl_Lattice; - - if( !PyArg_ParseTuple( args, "iii", &x, &y, &z ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int,int,int argument" ) ); - - bl_Lattice = self->lattice; - - if( x < 2 || y < 2 || z < 2 ) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "partition values must be 2 or greater" ) ); - - resizelattice(bl_Lattice, x, y, z, NULL); - - Py_RETURN_NONE; -} - -static PyObject *Lattice_getPartitions( BPy_Lattice * self ) -{ - Lattice *bl_Lattice; - bl_Lattice = self->lattice; - - return Py_BuildValue( "[i,i,i]", ( int ) bl_Lattice->pntsu, - ( int ) bl_Lattice->pntsv, - ( int ) bl_Lattice->pntsw ); -} - -static PyObject *Lattice_getKey( BPy_Lattice * self ) -{ - Key *key = self->lattice->key; - - if (key) - return Key_CreatePyObject(key); - else - Py_RETURN_NONE; -} - -static PyObject *Lattice_getKeyTypes( BPy_Lattice * self ) -{ - Lattice *bl_Lattice; - char *linear = "linear"; - char *cardinal = "cardinal"; - char *bspline = "bspline"; - char *s_x = NULL, *s_y = NULL, *s_z = NULL; - - bl_Lattice = self->lattice; - - if( ( bl_Lattice->typeu ) == KEY_LINEAR ) - s_x = linear; - else if( ( bl_Lattice->typeu ) == KEY_CARDINAL ) - s_x = cardinal; - else if( ( bl_Lattice->typeu ) == KEY_BSPLINE ) - s_x = bspline; - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "bad key type..." ); - - if( ( bl_Lattice->typev ) == KEY_LINEAR ) - s_y = linear; - else if( ( bl_Lattice->typev ) == KEY_CARDINAL ) - s_y = cardinal; - else if( ( bl_Lattice->typev ) == KEY_BSPLINE ) - s_y = bspline; - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "bad key type..." ); - - if( ( bl_Lattice->typew ) == KEY_LINEAR ) - s_z = linear; - else if( ( bl_Lattice->typew ) == KEY_CARDINAL ) - s_z = cardinal; - else if( ( bl_Lattice->typew ) == KEY_BSPLINE ) - s_z = bspline; - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "bad key type..." ); - - /* we made sure no s_[xyz] is NULL */ - return Py_BuildValue( "[s,s,s]", s_x, s_y, s_z ); -} - -static PyObject *Lattice_setKeyTypes( BPy_Lattice * self, PyObject * args ) -{ - int x; - int y; - int z; - Lattice *bl_Lattice; - - if( !PyArg_ParseTuple( args, "iii", &x, &y, &z ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int,int,int argument" ) ); - - bl_Lattice = self->lattice; - - if( x == KEY_LINEAR ) - bl_Lattice->typeu = KEY_LINEAR; - else if( x == KEY_CARDINAL ) - bl_Lattice->typeu = KEY_CARDINAL; - else if( x == KEY_BSPLINE ) - bl_Lattice->typeu = KEY_BSPLINE; - else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "type must be LINEAR, CARDINAL OR BSPLINE" ); - - if( y == KEY_LINEAR ) - bl_Lattice->typev = KEY_LINEAR; - else if( y == KEY_CARDINAL ) - bl_Lattice->typev = KEY_CARDINAL; - else if( y == KEY_BSPLINE ) - bl_Lattice->typev = KEY_BSPLINE; - else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "type must be LINEAR, CARDINAL OR BSPLINE" ); - - if( z == KEY_LINEAR ) - bl_Lattice->typew = KEY_LINEAR; - else if( z == KEY_CARDINAL ) - bl_Lattice->typew = KEY_CARDINAL; - else if( z == KEY_BSPLINE ) - bl_Lattice->typew = KEY_BSPLINE; - else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "type must be LINEAR, CARDINAL OR BSPLINE" ); - - Py_RETURN_NONE; -} - -static PyObject *Lattice_setMode( BPy_Lattice * self, PyObject * args ) -{ - short type; - Lattice *bl_Lattice; - bl_Lattice = self->lattice; - - if( !PyArg_ParseTuple( args, "h", &type ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ) ); - - if( type == LT_GRID ) - bl_Lattice->flag = LT_GRID; - else if( type == LT_OUTSIDE ) { - bl_Lattice->flag = LT_OUTSIDE + LT_GRID; - outside_lattice( bl_Lattice ); - } else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "type must be either GRID or OUTSIDE" ); - - Py_RETURN_NONE; -} - -static PyObject *Lattice_getMode(BPy_Lattice * self) -{ - if( self->lattice->flag == 1 ) - return PyString_FromString( "Grid" ); - else if( self->lattice->flag == 3 ) - return PyString_FromString( "Outside" ); - Py_RETURN_NONE; -} - -static PyObject *Lattice_setPoint( BPy_Lattice * self, PyObject * args ) -{ - BPoint *bp, *bpoint; - short size; - Lattice *bl_Lattice; - int index, x; - float tempInt; - PyObject *listObject; - - if( !PyArg_ParseTuple - ( args, "iO!", &index, &PyList_Type, &listObject ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected int & list argument" ) ); - - if( !PyList_Check( listObject ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "2nd parameter should be a python list" ) ); - - if( !( PyList_Size( listObject ) == 3 ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "Please pass 3 parameters in the list [x,y,z]" ) ); - - //init - bp = 0; - bl_Lattice = self->lattice; - - //get bpoints - bp = bl_Lattice->def; - - if( bp == 0 ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "no lattice points!" ) ); - - //calculate size of lattice - size = bl_Lattice->pntsu * bl_Lattice->pntsv * bl_Lattice->pntsw; - - if( index < 0 || index > size ) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "index outside of lattice size!" ) ); - - //get the bpoint - while( index ) { - index--; - bp++; - } - bpoint = bp; - - for( x = 0; x < PyList_Size( listObject ); x++ ) { - if( ! - ( PyArg_Parse - ( ( PyList_GetItem( listObject, x ) ), "f", - &tempInt ) ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "python list integer not parseable" ); - bpoint->vec[x] = tempInt; - } - - Py_RETURN_NONE; -} - -static PyObject *Lattice_getPoint( BPy_Lattice * self, PyObject * args ) -{ - BPoint *bp, *bpoint; - short size; - Lattice *bl_Lattice; - int index; - - if( !PyArg_ParseTuple( args, "i", &index ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ) ); - - //init - bp = 0; - bl_Lattice = self->lattice; - - //get bpoints - bp = bl_Lattice->def; - - if( bp == 0 ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "no lattice points!" ) ); - - //calculate size of lattice - size = bl_Lattice->pntsu * bl_Lattice->pntsv * bl_Lattice->pntsw; - - if( index < 0 || index > size ) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "index outside of lattice size!" ) ); - - //get the bpoint - while( index ) { - index--; - bp++; - } - bpoint = bp; - - if( bpoint == 0 ) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "bpoint does not exist" ) ); - - return Py_BuildValue( "[f,f,f]", bp->vec[0], bp->vec[1], bp->vec[2] ); -} - -static PyObject *Lattice_insertKey( BPy_Lattice * self, PyObject * args ) -{ - Lattice *lt; - int frame = -1, oldfra = -1; - - if( !PyArg_ParseTuple( args, "i", &frame ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ) ); - - lt = self->lattice; - - //set the current frame - if( frame > 0 ) { - frame = EXPP_ClampInt( frame, 1, MAXFRAME ); - oldfra = G.scene->r.cfra; - G.scene->r.cfra = (int)frame; - } -// else just use current frame, then -// return (EXPP_ReturnPyObjError (PyExc_RuntimeError, -// "frame value has to be greater than 0")); - - //insert a keybock for the lattice (1=relative) - insert_lattkey( lt , 1); - allspace(REMAKEIPO, 0); - - if( frame > 0 ) - G.scene->r.cfra = (int)oldfra; - - Py_RETURN_NONE; -} - -static PyObject *Lattice_copy( BPy_Lattice * self ) -{ - Lattice *bl_Lattice; // blender Lattice object - PyObject *py_Lattice; // python wrapper - - bl_Lattice = copy_lattice( self->lattice ); - bl_Lattice->id.us = 0; - - if( bl_Lattice ) - py_Lattice = Lattice_CreatePyObject( bl_Lattice ); - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Lattice Object in Blender" ); - if( !py_Lattice ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Lattice Object wrapper" ); - - return py_Lattice; -} - -static int Lattice_compare( BPy_Lattice * a, BPy_Lattice * b ) -{ - return ( a->lattice == b->lattice ) ? 0 : -1; -} - - -//*************************************************************************** -// Function: Lattice_repr -// Description: This is a callback function for the BPy_Lattice type. It -// builds a meaninful string to represent Lattice objects. -//*************************************************************************** -static PyObject *Lattice_repr( BPy_Lattice * self ) -{ - if( self->lattice ) - return PyString_FromFormat( "[Lattice \"%s\"]", - self->lattice->id.name + 2 ); - else - return PyString_FromString( "[Lattice ]" ); -} - -/*****************************************************************************/ -/* Python BPy_Lattice methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Lattice_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - Lattice_getName_doc}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - Lattice_setName_doc}, - {"setPartitions", ( PyCFunction ) Lattice_setPartitions, METH_VARARGS, - Lattice_setPartitions_doc}, - {"getPartitions", ( PyCFunction ) Lattice_getPartitions, METH_NOARGS, - Lattice_getPartitions_doc}, - {"getKey", ( PyCFunction ) Lattice_getKey, METH_NOARGS, - Lattice_getKey_doc}, - {"setKeyTypes", ( PyCFunction ) Lattice_setKeyTypes, METH_VARARGS, - Lattice_setKeyTypes_doc}, - {"getKeyTypes", ( PyCFunction ) Lattice_getKeyTypes, METH_NOARGS, - Lattice_getKeyTypes_doc}, - {"setMode", ( PyCFunction ) Lattice_setMode, METH_VARARGS, - Lattice_setMode_doc}, - {"getMode", ( PyCFunction ) Lattice_getMode, METH_NOARGS, - Lattice_getMode_doc}, - {"setPoint", ( PyCFunction ) Lattice_setPoint, METH_VARARGS, - Lattice_setPoint_doc}, - {"getPoint", ( PyCFunction ) Lattice_getPoint, METH_VARARGS, - Lattice_getPoint_doc}, - {"insertKey", ( PyCFunction ) Lattice_insertKey, METH_VARARGS, - Lattice_insertKey_doc}, - {"__copy__", ( PyCFunction ) Lattice_copy, METH_NOARGS, - Lattice_copy_doc}, - {"copy", ( PyCFunction ) Lattice_copy, METH_NOARGS, - Lattice_copy_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python attributes get/set functions: */ -/*****************************************************************************/ -static PyObject *Lattice_getWidth(BPy_Lattice * self) -{ - return PyInt_FromLong( self->lattice->pntsu ); -} -static PyObject *Lattice_getHeight(BPy_Lattice * self) -{ - return PyInt_FromLong( self->lattice->pntsv ); -} -static PyObject *Lattice_getDepth(BPy_Lattice * self) -{ - return PyInt_FromLong( self->lattice->pntsw ); -} -static PyObject *Lattice_getLatSize(BPy_Lattice * self) -{ - return PyInt_FromLong( - self->lattice->pntsu * self->lattice->pntsv * self->lattice->pntsw ); -} - - -static PyObject *Lattice_getAxisType(BPy_Lattice * self, void * type) -{ - char interp_type = 0; - switch ( (int)type ) { - case 0: - interp_type = self->lattice->typeu; - break; - case 1: - interp_type = self->lattice->typev; - break; - case 2: - interp_type = self->lattice->typew; - break; - } - - switch (interp_type) { - case 0: - return PyString_FromString( "Linear" ); - case 1: - return PyString_FromString( "Cardinal" ); - case 2: - return PyString_FromString( "Bspline" ); - } - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Lattice_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"width", (getter)Lattice_getWidth, (setter)NULL, - "lattice U subdivision ", NULL}, - {"height", (getter)Lattice_getHeight, (setter)NULL, - "lattice V subdivision", NULL}, - {"depth", (getter)Lattice_getDepth, (setter)NULL, - "lattice W subdivision", NULL}, - {"latSize", (getter)Lattice_getLatSize, (setter)NULL, - "lattice W subdivision", NULL}, - - {"widthType", (getter)Lattice_getAxisType, NULL, - "lattice U interpolation type", (void *)0}, - {"heightType", (getter)Lattice_getAxisType, NULL, - "lattice V interpolation type", (void *)1}, - {"depthType", (getter)Lattice_getAxisType, NULL, - "lattice W interpolation type", (void *)2}, - - {"key", (getter)Lattice_getKey, NULL, - "lattice key", NULL}, - {"mode", (getter)Lattice_getMode, NULL, - "lattice key", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Lattice_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Lattice_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "Blender Lattice", /* tp_name */ - sizeof( BPy_Lattice ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - 0, /* tp_print */ - NULL, /* tp_getattr */ - NULL, /* tp_setattr */ - ( cmpfunc ) Lattice_compare, /* tp_compare */ - ( reprfunc ) Lattice_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Lattice_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Lattice_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 -}; diff --git a/source/blender/python/api2_2x/Lattice.h b/source/blender/python/api2_2x/Lattice.h deleted file mode 100644 index dd141f1b8dd..00000000000 --- a/source/blender/python/api2_2x/Lattice.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * $Id: Lattice.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_Lattice_H -#define EXPP_Lattice_H - -#include -#include "DNA_lattice_types.h" - -/* The Group PyTypeObject defined in Lattice.c */ -extern PyTypeObject Lattice_Type; - -#define BPy_Lattice_Check(v) ((v)->ob_type == &Lattice_Type) - -/*****************************************************************************/ -/* Python BPy_Lattice structure definition: */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - Lattice * lattice; /* libdata must be second */ -} BPy_Lattice; - -/* - * prototypes - */ - -PyObject *Lattice_Init( void ); -PyObject *Lattice_CreatePyObject( Lattice * lt ); -Lattice *Lattice_FromPyObject( PyObject * pyobj ); - -#endif /* EXPP_LATTICE_H */ diff --git a/source/blender/python/api2_2x/Library.c b/source/blender/python/api2_2x/Library.c deleted file mode 100644 index 412daf24bd2..00000000000 --- a/source/blender/python/api2_2x/Library.c +++ /dev/null @@ -1,1192 +0,0 @@ -/** - * $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. - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Campbell Barton, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/************************************************************/ -/* Original library module code */ -/************************************************************/ - -#include - -#include "DNA_curve_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" /* for line linked */ -#include "BKE_library.h" /* for all_local */ -#include "BKE_font.h" /* for text_to_curve */ -#include "BKE_utildefines.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BLI_blenlib.h" -#include "BLO_readfile.h" -#include "BLI_linklist.h" -#include "MEM_guardedalloc.h" -#include "gen_utils.h" - -/** - * Global variables. - */ -static BlendHandle *bpy_openlib = NULL; /* ptr to the open .blend file */ -static char *bpy_openlibname = NULL; /* its pathname */ -static int bpy_relative= 0; - -/** - * Function prototypes for the Library submodule. - */ -static PyObject *M_Library_Open( PyObject * self, PyObject * args ); -static PyObject *M_Library_Close( PyObject * self ); -static PyObject *M_Library_GetName( PyObject * self ); -static PyObject *M_Library_Update( PyObject * self ); -static PyObject *M_Library_Datablocks( PyObject * self, PyObject * value ); -static PyObject *oldM_Library_Load( PyObject * self, PyObject * args ); -static PyObject *M_Library_LinkableGroups( PyObject * self ); -static PyObject *M_Library_LinkedLibs( PyObject * self ); - -PyObject *Library_Init( void ); -void EXPP_Library_Close( void ); - -/** - * Module doc strings. - */ -static char M_Library_doc[] = "The Blender.Library submodule:\n\n\ -This module gives access to .blend files, using them as libraries of\n\ -data that can be loaded into the current scene in Blender."; - -static char Library_Open_doc[] = - "(filename) - Open the given .blend file for access to its objects.\n\ -If another library file is still open, it's closed automatically."; - -static char Library_Close_doc[] = - "() - Close the currently open library file, if any."; - -static char Library_GetName_doc[] = - "() - Get the filename of the currently open library file, if any."; - -static char Library_Datablocks_doc[] = - "(datablock) - List all datablocks of the given type in the currently\n\ -open library file.\n\ -(datablock) - datablock name as a string: Object, Mesh, etc."; - -static char Library_Load_doc[] = - "(name, datablock [,update = 1]) - Append object 'name' of type 'datablock'\n\ -from the open library file to the current scene.\n\ -(name) - (str) the name of the object.\n\ -(datablock) - (str) the datablock of the object.\n\ -(update = 1) - (int) if non-zero, all display lists are recalculated and the\n\ -links are updated. This is slow, set it to zero if you have more than one\n\ -object to load, then call Library.Update() after loading them all."; - -static char Library_Update_doc[] = - "() - Update the current scene, linking all loaded library objects and\n\ -remaking all display lists. This is slow, call it only once after loading\n\ -all objects (load each of them with update = 0:\n\ -Library.Load(name, datablock, 0), or the update will be automatic, repeated\n\ -for each loaded object."; - -static char Library_LinkableGroups_doc[] = - "() - Get all linkable groups from the open .blend library file."; - -static char Library_LinkedLibs_doc[] = - "() - Get all libs used in the the open .blend file."; - -/** - * Python method structure definition for Blender.Library submodule. - */ -struct PyMethodDef oldM_Library_methods[] = { - {"Open", M_Library_Open, METH_O, Library_Open_doc}, - {"Close", ( PyCFunction ) M_Library_Close, METH_NOARGS, - Library_Close_doc}, - {"GetName", ( PyCFunction ) M_Library_GetName, METH_NOARGS, - Library_GetName_doc}, - {"Update", ( PyCFunction ) M_Library_Update, METH_NOARGS, - Library_Update_doc}, - {"Datablocks", M_Library_Datablocks, METH_O, - Library_Datablocks_doc}, - {"Load", oldM_Library_Load, METH_VARARGS, Library_Load_doc}, - {"LinkableGroups", ( PyCFunction ) M_Library_LinkableGroups, - METH_NOARGS, Library_LinkableGroups_doc}, - {"LinkedLibs", ( PyCFunction ) M_Library_LinkedLibs, - METH_NOARGS, Library_LinkedLibs_doc}, - {NULL, NULL, 0, NULL} -}; - -/* Submodule Python functions: */ - -/** - * Open a new .blend file. - * Only one can be open at a time, so this function also closes - * the previously opened file, if any. - */ -static PyObject *M_Library_Open( PyObject * self, PyObject * value ) -{ - char *fname = PyString_AsString(value); - char filename[FILE_MAXDIR+FILE_MAXFILE]; - char fname1[FILE_MAXDIR+FILE_MAXFILE]; - - int len = 0; - - bpy_relative= 0; /* assume non relative each time we load */ - - if( !fname ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a .blend filename" ); - } - - if( bpy_openlib ) { - M_Library_Close( self ); - Py_DECREF( Py_None ); /* incref'ed by above function */ - } - - /* copy the name to make it absolute so BLO_blendhandle_from_file doesn't complain */ - BLI_strncpy(fname1, fname, sizeof(fname1)); - BLI_convertstringcode(fname1, G.sce, 0); /* make absolute */ - - /* G.sce = last file loaded, save for UI and restore after opening file */ - BLI_strncpy(filename, G.sce, sizeof(filename)); - bpy_openlib = BLO_blendhandle_from_file( fname1 ); - BLI_strncpy(G.sce, filename, sizeof(filename)); - - if( !bpy_openlib ) - return EXPP_ReturnPyObjError( PyExc_IOError, "file not found" ); - - /* "//someblend.blend" enables relative paths */ - if (sizeof(fname) > 2 && fname[0] == '/' && fname[1] == '/') - bpy_relative= 1; /* global that makes the library relative on loading */ - - len = strlen( fname1 ) + 1; /* +1 for terminating '\0' */ - - bpy_openlibname = MEM_mallocN( len, "bpy_openlibname" ); - - if( bpy_openlibname ) - PyOS_snprintf( bpy_openlibname, len, "%s", fname1 ); - - Py_RETURN_TRUE; -} - -/** - * Close the current .blend file, if any. - */ -static PyObject *M_Library_Close( PyObject * self ) -{ - if( bpy_openlib ) { - BLO_blendhandle_close( bpy_openlib ); - bpy_openlib = NULL; - } - - if( bpy_openlibname ) { - MEM_freeN( bpy_openlibname ); - bpy_openlibname = NULL; - } - - Py_RETURN_NONE; -} - -/** - * helper function for 'atexit' clean-ups, used by BPY_end_python, - * declared in EXPP_interface.h. - */ -void EXPP_Library_Close( void ) -{ - if( bpy_openlib ) { - BLO_blendhandle_close( bpy_openlib ); - bpy_openlib = NULL; - } - - if( bpy_openlibname ) { - MEM_freeN( bpy_openlibname ); - bpy_openlibname = NULL; - } -} - -/** - * Get the filename of the currently open library file, if any. - */ -static PyObject *M_Library_GetName( PyObject * self ) -{ - if( bpy_openlib && bpy_openlibname ) - return Py_BuildValue( "s", bpy_openlibname ); - - Py_INCREF( Py_None ); - return Py_None; -} - -/** - * Return a list with all items of a given datablock type - * (like 'Object', 'Mesh', etc.) in the open library file. - */ -static PyObject *M_Library_Datablocks( PyObject * self, PyObject * value ) -{ - char *name = PyString_AsString(value); - int blocktype = 0; - LinkNode *l = NULL, *names = NULL; - PyObject *list = NULL; - - if( !bpy_openlib ) { - return EXPP_ReturnPyObjError( PyExc_IOError, - "no library file: open one first with Blender.Lib_Open(filename)" ); - } - - if( !name ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string (datablock type) as argument." ); - } - - blocktype = ( int ) BLO_idcode_from_name( name ); - - if( !blocktype ) { - return EXPP_ReturnPyObjError( PyExc_NameError, - "no such Blender datablock type" ); - } - - names = BLO_blendhandle_get_datablock_names( bpy_openlib, blocktype ); - - if( names ) { - int counter = 0; - list = PyList_New( BLI_linklist_length( names ) ); - for( l = names; l; l = l->next ) { - PyList_SET_ITEM( list, counter, - PyString_FromString( ( char * ) l->link ) ); - counter++; - } - BLI_linklist_free( names, free ); /* free linklist *and* each node's data */ - return list; - } - - Py_RETURN_NONE; -} - -/** - * Return a list with the names of all linkable groups in the - * open library file. - */ -static PyObject *M_Library_LinkableGroups( PyObject * self ) -{ - LinkNode *l = NULL, *names = NULL; - PyObject *list = NULL; - - if( !bpy_openlib ) { - return EXPP_ReturnPyObjError( PyExc_IOError, - "no library file: open one first with Blender.Lib_Open(filename)" ); - } - - names = BLO_blendhandle_get_linkable_groups( bpy_openlib ); - list = PyList_New( BLI_linklist_length( names ) ); - - if( names ) { - int counter = 0; - - for( l = names; l; l = l->next ) { - PyList_SET_ITEM( list, counter, PyString_FromString( ( char * ) l->link ) ); - counter++; - } - BLI_linklist_free( names, free ); /* free linklist *and* each node's data */ - return list; - } - return list; -} - -/** - * Return a list with the names of all externally linked libs used in the current Blend file - */ -static PyObject *M_Library_LinkedLibs( PyObject * self ) -{ - int counter = 0; - Library *li; - PyObject *list; - - list = PyList_New( BLI_countlist( &( G.main->library ) ) ); - for (li= G.main->library.first; li; li= li->id.next) { - PyList_SET_ITEM( list, counter, PyString_FromString( li->name )); - counter++; - } - return list; -} - -/** - * Load (append) a given datablock of a given datablock type - * to the current scene. - */ -static PyObject *oldM_Library_Load( PyObject * self, PyObject * args ) -{ - char *name = NULL; - char *base = NULL; - int update = 1; - int blocktype = 0; - int linked = 0; - - if( !bpy_openlib ) { - return EXPP_ReturnPyObjError( PyExc_IOError, - "no library file: you need to open one, first." ); - } - - if( !PyArg_ParseTuple( args, "ss|ii", &name, &base, &update, &linked ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected two strings as arguments." ); - } - - blocktype = ( int ) BLO_idcode_from_name( base ); - - if( !blocktype ) - return EXPP_ReturnPyObjError( PyExc_NameError, - "no such Blender datablock type" ); - - if (linked) - BLO_script_library_append( bpy_openlib, bpy_openlibname, name, blocktype, FILE_LINK, G.scene); - else - BLO_script_library_append( bpy_openlib, bpy_openlibname, name, blocktype, 0, G.scene); - - if( update ) { - M_Library_Update( self ); - Py_DECREF( Py_None ); /* incref'ed by above function */ - } - - if( bpy_relative ) { - /* and now find the latest append lib file */ - Library *lib = G.main->library.first; - while( lib ) { - if( strcmp( bpy_openlibname, lib->name ) == 0 ) { - - /* use the full path, this could have been read by other library even */ - BLI_strncpy(lib->name, lib->filename, sizeof(lib->name)); - - /* uses current .blend file as reference */ - BLI_makestringcode(G.sce, lib->name); - break; - } - lib = lib->id.next; - } - - } - - Py_INCREF( Py_None ); - return Py_None; -} - -/** - * Update all links and remake displists. - */ -static PyObject *M_Library_Update( PyObject * self ) -{ /* code adapted from do_library_append in src/filesel.c: */ - Library *lib = NULL; - - /* Displist code that was here is obsolete... depending on what - * this function is supposed to do (it should technically be unnecessary) - * can be replaced with depgraph calls - zr - */ - - if( bpy_openlibname ) { - strcpy( G.lib, bpy_openlibname ); - - /* and now find the latest append lib file */ - lib = G.main->library.first; - while( lib ) { - if( strcmp( bpy_openlibname, lib->name ) == 0 ) - break; - lib = lib->id.next; - } - all_local( lib, 0 ); - } - - Py_INCREF( Py_None ); - return Py_None; -} - -/** - * Initialize the Blender.Library submodule. - * Called by Blender_Init in Blender.c . - * @return the registered submodule. - */ -PyObject *oldLibrary_Init( void ) -{ - PyObject *submod; - - submod = Py_InitModule3( "Blender.Library", oldM_Library_methods, - M_Library_doc ); - - return submod; -} - -/************************************************************/ -/* New library (LibData) module code */ -/************************************************************/ - -#include "Library.h" - -/* if this module supercedes the old library module, include these instead */ -#if 0 -#include "BLI_blenlib.h" -#include "MEM_guardedalloc.h" - -#include "DNA_curve_types.h" -#include "DNA_object_types.h" -#include "DNA_space_types.h" /* for line linked */ -#include "BKE_library.h" /* for all_local */ -#include "BKE_utildefines.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BLO_readfile.h" -#include "BLI_linklist.h" - -#include "Object.h" -#include "gen_utils.h" -#endif - -#include "gen_library.h" - -/* Helper function */ - -/* - * Try to open a library, set Python exceptions as necessary if not - * successful. On success, return a valid handle; othewise return NULL. - */ - -static BlendHandle *open_library( char *filename, char *longFilename ) -{ - char globalFilename[FILE_MAX]; - BlendHandle *openlib = NULL; - - /* get complete file name if necessary */ - BLI_strncpy( longFilename, filename, FILE_MAX ); - BLI_convertstringcode( longFilename, G.sce, 0 ); - - /* throw exceptions for wrong file type, cyclic reference */ - if( !BLO_has_bfile_extension(longFilename) ) { - PyErr_SetString( PyExc_ValueError, "file not a library" ); - return NULL; - } - if( BLI_streq(G.main->name, longFilename) ) { - PyErr_SetString( PyExc_ValueError, - "cannot use current file as library" ); - return NULL; - } - - /* G.sce = last file loaded, save for UI and restore after opening file */ - BLI_strncpy(globalFilename, G.sce, sizeof(globalFilename)); - openlib = BLO_blendhandle_from_file( longFilename ); - BLI_strncpy(G.sce, globalFilename, sizeof(globalFilename)); - - /* if failed, set that exception code too */ - if( !openlib ) - PyErr_SetString( PyExc_IOError, "library not found" ); - - return openlib; -} - -/* - * Create a specific type of LibraryData object. These are used for - * .append() and .link() access, for iterators, and (for Blender Objects) - * for defining "pseudo objects" for scene linking. - */ - -static PyObject *CreatePyObject_LibData( int idtype, int kind, - void *name, void *iter, char *filename ) -{ - BPy_LibraryData *seq = PyObject_NEW( BPy_LibraryData, &LibraryData_Type); - seq->iter = iter; /* the name list (for iterators) */ - seq->type = idtype; /* the Blender ID type */ - seq->kind = kind; /* used by Blender Objects */ - seq->name = name; /* object name, iterator name list, or NULL */ - /* save the library name */ - BLI_strncpy( seq->filename, filename, strlen(filename)+1 ); - return (PyObject *)seq; -} - -/* - * Link/append data to the current .blend file, or create a pseudo object - * which can be linked/appended to a scene. - */ - -static PyObject *lib_link_or_append( BPy_LibraryData *self, PyObject * value, - int mode ) -{ - char *name = PyString_AsString(value); - - /* get the name of the data used wants to append */ - if( !name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string" ); - - /* - * For everything except objects, just add to Blender's DB. For objects, - * create an APPEND or LINK "pseudo object" for the Scene module. - */ - if( self->type != ID_OB ) - return LibraryData_importLibData( self, name, 0, NULL ); - else { - /* - * If this is already a pseudo object, throw an exception: re-linking - * or re-appending is not allowed - */ - if( self->kind != OTHER ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "object has already been marked for append or link" ); - - /* otherwise, create a pseudo object ready for appending or linking */ - - return CreatePyObject_LibData( ID_OB, mode, - BLI_strdupn( name, strlen( name ) ), NULL, self->filename ); - } -} - -/* - * Perform the actual link or append operation. This procedure is also - * called externally from the Scene module using a "pseudo Object" so we - * can be sure objects get linked to a scene. - */ - -PyObject *LibraryData_importLibData( BPy_LibraryData *self, char *name, - int mode, Scene *scene ) -{ - char longFilename[FILE_MAX]; - BlendHandle *openlib; - Library *lib; - LinkNode *names, *ptr; - ID *id; - ListBase *lb; - char newName[32]; - - /* try to open the library */ - openlib = open_library( self->filename, longFilename ); - if( !openlib ) - return NULL; - - /* find all datablocks for the specified type */ - names = BLO_blendhandle_get_datablock_names ( openlib, self->type ); - - /* now check for a match to the user-specified name */ - for( ptr = names; ptr; ptr = ptr->next ) - if( strcmp( ptr->link, name ) == 0 ) break; - BLI_linklist_free( names, free ); - - /* if no match, throw exception */ - if( !ptr ) { - BLO_blendhandle_close( openlib ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "library does not contain specified item" ); - } - - /* - * Figure out what the datablock will be named after it's imported. If - * it's a link, nothing to do. If it's an append, find what it might - * be renamed to. - */ - - if( mode != FILE_LINK ) { - flag_all_listbases_ids(LIB_APPEND_TAG, 1); - - /* see what new block will be called */ - strncpy( newName, name, strlen(name)+1 ); - check_for_dupid( wich_libbase(G.main, self->type), NULL, newName ); - } - - /* import from the libary */ - BLO_script_library_append( openlib, longFilename, name, self->type, mode, - scene ); - - /* - * locate the library. If this is an append, make the data local. If it - * is link, we need the library for later - */ - for( lib = G.main->library.first; lib; lib = lib->id.next ) - if( strcmp( longFilename, lib->name ) == 0 ) { - if( mode != FILE_LINK ) { - all_local( lib, 1 ); - /* important we unset, otherwise these object wont - * link into other scenes from this blend file */ - flag_all_listbases_ids(LIB_APPEND_TAG, 0); - } - break; - } - - /* done with library; close it */ - BLO_blendhandle_close( openlib ); - - /* this should not happen, but just in case */ - if( !lib ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not library" ); - - /* find the base for this type */ - lb = wich_libbase( G.main, self->type ); - - /* - * Check for linked data matching the name first. Even if we are trying - * to append, if the data has already been linked we need to return it - * (it won't be appended from the library). - */ - for( id = lb->first; id; id = id->next ) { - if( id->lib == lib && id->name[2]==name[0] && - strcmp(id->name+2, name)==0 ) - return GetPyObjectFromID( id ); - } - - /* - * If we didn't find it, and we're appending, then try searching for the - * new datablock, possibly under a new name. - */ - if( mode != FILE_LINK ) - for( id = lb->first; id; id = id->next ) { - if( id->lib == NULL && id->name[2]==newName[0] && - strcmp(id->name+2, newName)==0 ) - return GetPyObjectFromID( id ); - } - - /* if we get here, something's really wrong */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not find data after reading from library" ); -} - -/************************************************************ - * Python LibraryData_Type getseters - ************************************************************/ - -/* .append(): make a local copy of the library's data (except for objects) */ - -static PyObject *LibraryData_getAppend( BPy_LibraryData *self, PyObject * value) -{ - return lib_link_or_append( self, value, OBJECT_IS_APPEND ); -} - -/* .link(): make a link to the library's data (except for objects) */ - -static PyObject *LibraryData_getLink( BPy_LibraryData *self, PyObject * value) -{ - return lib_link_or_append( self, value, OBJECT_IS_LINK ); -} - -/************************************************************************ - * Python LibraryData_Type iterator - ************************************************************************/ - -/* Create and initialize the interator indices */ - -static PyObject *LibraryData_getIter( BPy_LibraryData * self ) -{ - char longFilename[FILE_MAX]; - BlendHandle *openlib; - LinkNode *names; - - /* try to open library */ - openlib = open_library( self->filename, longFilename ); - - /* if failed, return exception */ - if( !openlib ) - return NULL; - - /* find all datablocks for the specified type */ - names = BLO_blendhandle_get_datablock_names ( openlib, self->type ); - - /* close library*/ - BLO_blendhandle_close( openlib ); - - /* build an iterator object for the name list */ - return CreatePyObject_LibData( self->type, OTHER, names, - names, self->filename ); -} - -/* Return next name. */ - -static PyObject *LibraryData_nextIter( BPy_LibraryData * self ) -{ - LinkNode *ptr = (LinkNode *)self->iter; - PyObject *ob; - - /* if at the end of list, clean up */ - if( !ptr ) { - /* If name list is still allocated, free storage. This check is - * necessary since iter.next() can technically be called repeatedly */ - if( self->name ) { - BLI_linklist_free( (LinkNode *)self->name, free ); - self->name = NULL; - } - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - /* otherwise, return the next name in the list */ - ob = PyString_FromString( ptr->link ); - ptr = ptr->next; - self->iter = ptr; - return ob; -} - -/************************************************************************ - * Python LibraryData_type methods structure - ************************************************************************/ - -static struct PyMethodDef BPy_LibraryData_methods[] = { - {"append", (PyCFunction)LibraryData_getAppend, METH_O, - "(str) - create new data from library"}, - {"link", (PyCFunction)LibraryData_getLink, METH_O, - "(str) - link data from library"}, - {NULL, NULL, 0, NULL} -}; - -/* Deallocate object and its data */ - -static void LibraryData_dealloc( BPy_LibraryData * self ) -{ - if( self->name ) - MEM_freeN( self->name ); - - PyObject_DEL( self ); -} - -/* Display representation of what Library Data is wrapping */ - -static PyObject *LibraryData_repr( BPy_LibraryData * self ) -{ - char *linkstate = ""; - char *str; - - switch (self->type) { - case ID_OB: - /* objects can be lib data or pseudo objects */ - switch( self->kind ) { - case OBJECT_IS_APPEND : - linkstate = ", appended"; - break; - case OBJECT_IS_LINK : - linkstate = ", linked"; - break; - default: - break; - } - str = "Object"; - break; - case ID_SCE: - str = "Scene"; - break; - case ID_ME: - str = "Mesh"; - break; - case ID_CU: - str = "Curve"; - break; - case ID_MB: - str = "Metaball"; - break; - case ID_MA: - str = "Material"; - break; - case ID_TE: - str = "Texture"; - break; - case ID_IM: - str = "Image"; - break; - case ID_LT: - str = "Lattice"; - break; - case ID_LA: - str = "Lamp"; - break; - case ID_CA: - str = "Camera"; - break; - case ID_IP: - str = "Ipo"; - break; - case ID_WO: - str = "World"; - break; - case ID_VF: - str = "Font"; - break; - case ID_TXT: - str = "Text"; - break; - case ID_SO: - str = "Sound"; - break; - case ID_GR: - str = "Group"; - break; - case ID_AR: - str = "Armature"; - break; - case ID_AC: - str = "Action"; - break; - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unsupported ID type" ); - } - - return PyString_FromFormat( "[Library Data (%s%s)]", str, linkstate ); -} - -PyTypeObject LibraryData_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender LibData", /* char *tp_name; */ - sizeof( BPy_LibraryData ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) LibraryData_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) NULL, /* cmpfunc tp_compare; */ - ( reprfunc ) LibraryData_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 */ - (getiterfunc)LibraryData_getIter, /* getiterfunc tp_iter; */ - (iternextfunc)LibraryData_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_LibraryData_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 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 -}; - -/* - * Create a LibraryData object for a specific type of Blender Group (ID_OB, - * ID_MA, etc). These can then be used to link or append the data. - */ - -static PyObject *LibraryData_CreatePyObject( BPy_Library *self, void *mode ) -{ - return CreatePyObject_LibData( (int)mode, OTHER, NULL, NULL, - self->filename ); -} - -/************************************************************ - * Python Library_Type getseters - ************************************************************/ - -/* - * Return the library's filename. - */ - -static PyObject *Library_getFilename( BPy_Library * self ) -{ - return PyString_FromString( self->filename ); -} - -/* - * Set/change the library's filename. - */ - -static int Library_setFilename( BPy_Library * self, PyObject * args ) -{ - char *filename = PyString_AsString( args ); - if( !filename ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected a string" ); - - BLI_strncpy( self->filename, filename, sizeof(self->filename) ); - return 0; -} - -/************************************************************************ - * Python Library_type attributes get/set structure - ************************************************************************/ - -static PyGetSetDef Library_getseters[] = { - {"filename", - (getter)Library_getFilename, (setter)Library_setFilename, - "library filename", - NULL}, - {"objects", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "objects from the library", - (void *)ID_OB}, - {"scenes", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "scenes from the library", - (void *)ID_SCE}, - {"meshes", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "meshes from the library", - (void *)ID_ME}, - {"curves", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "curves from the library", - (void *)ID_CU}, - {"metaballs", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "metaballs from the library", - (void *)ID_MB}, - {"lattices", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "lattices from the library", - (void *)ID_LT}, - {"lamps", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "lamps from the library", - (void *)ID_LA}, - {"cameras", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "cameras from the library", - (void *)ID_CA}, - {"materials", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "objects from the library", - (void *)ID_MA}, - {"textures", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "textures from the library", - (void *)ID_TE}, - {"images", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "images from the library", - (void *)ID_IM}, - {"ipos", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "ipos from the library", - (void *)ID_IP}, - {"worlds", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "worlds from the library", - (void *)ID_WO}, - {"fonts", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "fonts from the library", - (void *)ID_VF}, - {"texts", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "texts from the library", - (void *)ID_TXT}, - {"groups", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "groups from the library", - (void *)ID_GR}, - {"sounds", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "sounds from the library", - (void *)ID_SO}, - {"actions", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "actions from the library", - (void *)ID_AC}, - {"armatures", - (getter)LibraryData_CreatePyObject, (setter)NULL, - "armatures from the library", - (void *)ID_AR}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/* - * Define a new library and create a library object. We don't actually test - * if the library is valid here since we have to do it when the file is - * actually accessed later. - */ - -static PyObject *M_Library_Load(PyObject *self, PyObject * value) -{ - char *filename = PyString_AsString(value); - BPy_Library *lib; - - if( !filename ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string" ); - - /* try to create a new object */ - lib = (BPy_Library *)PyObject_NEW( BPy_Library, &Library_Type ); - if( !lib ) - return NULL; - - /* assign the library filename for future use, then return */ - BLI_strncpy( lib->filename, filename, sizeof(lib->filename) ); - - return (PyObject *)lib; -} - -static struct PyMethodDef M_Library_methods[] = { - {"load", (PyCFunction)M_Library_Load, METH_O, - "(string) - declare a .blend file for use as a library"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python Library_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Library_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Library", /* char *tp_name; */ - sizeof( BPy_Library ), /* 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; */ - ( cmpfunc ) NULL, /* cmpfunc tp_compare; */ - ( reprfunc ) NULL, /* 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; */ - Library_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 -}; - -/* - * Library module initialization - */ - -static char M_newLibrary_doc[] = "The Blender.lib submodule"; - -PyObject *Library_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &Library_Type ) < 0 ) - return NULL; - if( PyType_Ready( &LibraryData_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.lib", M_Library_methods, - M_newLibrary_doc ); - return submodule; -} diff --git a/source/blender/python/api2_2x/Library.h b/source/blender/python/api2_2x/Library.h deleted file mode 100644 index 1ddc138ea57..00000000000 --- a/source/blender/python/api2_2x/Library.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * $Id: Library.h 10323 2007-03-21 14:25:31Z stiv $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_LIBRARY_H -#define EXPP_LIBRARY_H - -#include -#include "DNA_scene_types.h" -#include "BLI_linklist.h" - -#include "blendef.h" - -/*****************************************************************************/ -/* Python BPy_Library structure definition: */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - char filename[FILE_MAXDIR + FILE_MAXFILE]; -} BPy_Library; - -typedef struct { - PyObject_HEAD - LinkNode *iter; - int type; - char filename[FILE_MAXDIR + FILE_MAXFILE]; - char *name; - enum { - OBJECT_IS_LINK, - OBJECT_IS_APPEND, - OTHER - } kind; -} BPy_LibraryData; - -extern PyTypeObject Library_Type; -extern PyTypeObject LibraryData_Type; - -#define BPy_LibraryData_Check(v) ((v)->ob_type == &LibraryData_Type) -#define BPy_Library_Check(v) ((v)->ob_type == &Library_Type) - -/*****************************************************************************/ -/* Module Blender.Library - public functions */ -/*****************************************************************************/ -PyObject *Library_Init( void ); -PyObject *oldLibrary_Init( void ); - -PyObject *LibraryData_importLibData( BPy_LibraryData *self, char *name, - int mode, Scene *scene ); - -#endif /* EXPP_LIBRARY_H */ diff --git a/source/blender/python/api2_2x/MTex.c b/source/blender/python/api2_2x/MTex.c deleted file mode 100644 index 61d809411a1..00000000000 --- a/source/blender/python/api2_2x/MTex.c +++ /dev/null @@ -1,827 +0,0 @@ -/* - * $Id: MTex.c 10279 2007-03-16 11:38:02Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Alex Mole, Yehoshua Sapir - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ -#include "MTex.h" /*This must come first*/ - -#include "BKE_utildefines.h" -#include "BLI_blenlib.h" -#include "Texture.h" -#include "Object.h" -#include "gen_utils.h" -#include "gen_library.h" - -#include - -/*****************************************************************************/ -/* Python BPy_MTex methods declarations: */ -/*****************************************************************************/ -static PyObject *MTex_setTexMethod( BPy_MTex * self, PyObject * args ); - -/*****************************************************************************/ -/* Python method structure definition for Blender.Texture.MTex module: */ -/*****************************************************************************/ -struct PyMethodDef M_MTex_methods[] = { - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_MTex methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_MTex_methods[] = { - /* name, method, flags, doc */ - {"setTex", ( PyCFunction ) MTex_setTexMethod, METH_VARARGS, - "(i) - Set MTex Texture"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python MTex_Type callback function prototypes: */ -/*****************************************************************************/ -static int MTex_compare( BPy_MTex * a, BPy_MTex * b ); -static PyObject *MTex_repr( BPy_MTex * self ); - -#define MTEXGET(x) \ - static PyObject *MTex_get##x( BPy_MTex *self, void *closure ); -#define MTEXSET(x) \ - static int MTex_set##x( BPy_MTex *self, PyObject *value, void *closure); -#define MTEXGETSET(x) \ - MTEXGET(x) \ - MTEXSET(x) - -MTEXGETSET(Tex) -MTEXGETSET(TexCo) -MTEXGETSET(Object) -MTEXGETSET(UVLayer) -MTEXGETSET(MapTo) -MTEXGETSET(Col) -MTEXGETSET(DVar) -MTEXGETSET(BlendMode) -MTEXGETSET(ColFac) -MTEXGETSET(NorFac) -MTEXGETSET(VarFac) -MTEXGETSET(DispFac) -MTEXGETSET(WarpFac) -MTEXGETSET(Ofs) -MTEXGETSET(Size) -MTEXGETSET(Mapping) -MTEXGETSET(Flag) -MTEXGETSET(ProjX) -MTEXGETSET(ProjY) -MTEXGETSET(ProjZ) -MTEXGETSET(MapToFlag) - -/*****************************************************************************/ -/* Python get/set methods table */ -/*****************************************************************************/ - -static PyGetSetDef MTex_getseters[] = { - { "tex", (getter) MTex_getTex, (setter) MTex_setTex, - "Texture whose mapping this MTex describes", NULL }, - { "texco", (getter) MTex_getTexCo, (setter) MTex_setTexCo, - "Texture coordinate space (UV, Global, etc.)", NULL }, - { "object", (getter) MTex_getObject, (setter) MTex_setObject, - "Object whose space to use when texco is Object", NULL }, - { "uvlayer", (getter) MTex_getUVLayer, (setter) MTex_setUVLayer, - "Name of the UV layer to use", NULL }, - { "mapto", (getter) MTex_getMapTo, (setter) MTex_setMapTo, - "What values the texture affects", NULL }, - { "col", (getter) MTex_getCol, (setter) MTex_setCol, - "Color that the texture blends with", NULL }, - { "dvar", (getter) MTex_getDVar, (setter) MTex_setDVar, - "Value that the texture blends with when not blending colors", NULL }, - { "blendmode", (getter) MTex_getBlendMode, (setter) MTex_setBlendMode, - "Texture blending mode", NULL }, - { "colfac", (getter) MTex_getColFac, (setter) MTex_setColFac, - "Factor by which texture affects color", NULL }, - { "norfac", (getter) MTex_getNorFac, (setter) MTex_setNorFac, - "Factor by which texture affects normal", NULL }, - { "varfac", (getter) MTex_getVarFac, (setter) MTex_setVarFac, - "Factor by which texture affects most variables", NULL }, - { "dispfac", (getter) MTex_getDispFac, (setter) MTex_setDispFac, - "Factor by which texture affects displacement", NULL }, - { "warpfac", (getter) MTex_getWarpFac, (setter) MTex_setWarpFac, - "Factor by which texture affects warp", NULL }, - { "ofs", (getter) MTex_getOfs, (setter) MTex_setOfs, - "Offset to adjust texture space", NULL }, - { "size", (getter) MTex_getSize, (setter) MTex_setSize, - "Size to scale texture space", NULL }, - { "mapping", (getter) MTex_getMapping, (setter) MTex_setMapping, - "Mapping of texture coordinates (flat, cube, etc.)", NULL }, - { "stencil", (getter) MTex_getFlag, (setter) MTex_setFlag, - "Stencil mode", (void*) MTEX_STENCIL }, - { "neg", (getter) MTex_getFlag, (setter) MTex_setFlag, - "Negate texture values mode", (void*) MTEX_NEGATIVE }, - { "noRGB", (getter) MTex_getFlag, (setter) MTex_setFlag, - "Convert texture RGB values to intensity values", - (void*) MTEX_RGBTOINT }, - { "correctNor", (getter) MTex_getFlag, (setter) MTex_setFlag, - "Correct normal mapping for Texture space and Object space", - (void*) MTEX_VIEWSPACE }, - { "xproj", (getter) MTex_getProjX, (setter) MTex_setProjX, - "Projection of X axis to Texture space", NULL }, - { "yproj", (getter) MTex_getProjY, (setter) MTex_setProjY, - "Projection of Y axis to Texture space", NULL }, - { "zproj", (getter) MTex_getProjZ, (setter) MTex_setProjZ, - "Projection of Z axis to Texture space", NULL }, - { "mtCol", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to color", (void*) MAP_COL }, - { "mtNor", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to normals", (void*) MAP_NORM }, - { "mtCsp", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to specularity color", (void*) MAP_COLSPEC }, - { "mtCmir", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to mirror color", (void*) MAP_COLMIR }, - { "mtRef", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to reflectivity", (void*) MAP_REF }, - { "mtSpec", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to specularity", (void*) MAP_SPEC }, - { "mtEmit", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to emit value", (void*) MAP_EMIT }, - { "mtAlpha", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to alpha value", (void*) MAP_ALPHA }, - { "mtHard", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to hardness", (void*) MAP_HAR }, - { "mtRayMir", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to RayMir value", (void*) MAP_RAYMIRR }, - { "mtTranslu", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to translucency", (void*) MAP_TRANSLU }, - { "mtAmb", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to ambient value", (void*) MAP_AMB }, - { "mtDisp", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to displacement", (void*) MAP_DISPLACE }, - { "mtWarp", (getter) MTex_getMapToFlag, (setter) MTex_setMapToFlag, - "How texture maps to warp", (void*) MAP_WARP }, - { NULL, NULL, NULL, NULL, NULL } -}; - - - -/*****************************************************************************/ -/* Python MTex_Type structure definition: */ -/*****************************************************************************/ - -PyTypeObject MTex_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "Blender MTex", /* tp_name */ - sizeof( BPy_MTex ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - ( cmpfunc ) MTex_compare, /* tp_compare */ - ( reprfunc ) MTex_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_as_hash */ - 0, 0, 0, 0, 0, - /*** Flags to define presence of optional/expanded features ***/ - Py_TPFLAGS_DEFAULT, /* long tp_flags; */ - 0, /* tp_doc */ - 0, 0, 0, 0, 0, 0, - BPy_MTex_methods, /* tp_methods */ - 0, /* tp_members */ - MTex_getseters, /* struct PyGetSetDef *tp_getset; */ - 0, /* struct _typeobject *tp_base; */ - 0, /* PyObject *tp_dict; */ - 0, /* descrgetfunc tp_descr_get; */ - 0, /* descrsetfunc tp_descr_set; */ - 0, /* long tp_dictoffset; */ - 0, /* initproc tp_init; */ - 0, /* allocfunc tp_alloc; */ - 0, /* newfunc tp_new; */ - /* Low-level free-memory routine */ - 0, /* freefunc tp_free; */ - /* For PyObject_IS_GC */ - 0, /* inquiry tp_is_gc; */ - 0, /* PyObject *tp_bases; */ - /* method resolution order */ - 0, /* PyObject *tp_mro; */ - 0, /* PyObject *tp_cache; */ - 0, /* PyObject *tp_subclasses; */ - 0, /* PyObject *tp_weaklist; */ - 0 -}; - - -PyObject *MTex_Init( void ) -{ - PyObject *submodule; -/* PyObject *dict; */ - - /* call PyType_Ready() to init dictionaries & such */ - if( PyType_Ready( &MTex_Type) < 0) - Py_RETURN_NONE; - - submodule = Py_InitModule( "Blender.Texture.MTex", M_MTex_methods ); - - return submodule; -} - -PyObject *MTex_CreatePyObject( MTex * mtex ) -{ - BPy_MTex *pymtex; - - pymtex = ( BPy_MTex * ) PyObject_NEW( BPy_MTex, &MTex_Type ); - if( !pymtex ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_MTex PyObject" ); - - pymtex->mtex = mtex; - return ( PyObject * ) pymtex; -} - -MTex *MTex_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_MTex * ) pyobj )->mtex; -} - -/*****************************************************************************/ -/* Python BPy_MTex methods: */ -/*****************************************************************************/ - -static PyObject *MTex_setTexMethod( BPy_MTex * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)MTex_setTex ); -} - -static int MTex_compare( BPy_MTex * a, BPy_MTex * b ) -{ - return ( a->mtex == b->mtex ) ? 0 : -1; -} - -static PyObject *MTex_repr( BPy_MTex * self ) -{ - return PyString_FromFormat( "[MTex]" ); -} - - -/*****************************************************************************/ -/* Python BPy_MTex get and set functions: */ -/*****************************************************************************/ - -static PyObject *MTex_getTex( BPy_MTex *self, void *closure ) -{ - if( self->mtex->tex ) - return Texture_CreatePyObject( self->mtex->tex ); - else - Py_RETURN_NONE; -} - -static int MTex_setTex( BPy_MTex *self, PyObject *value, void *closure) -{ - return GenericLib_assignData(value, (void **) &self->mtex->tex, 0, 1, ID_TE, 0); -} - -static PyObject *MTex_getTexCo( BPy_MTex *self, void *closure ) -{ - return PyInt_FromLong( self->mtex->texco ); -} - -static int MTex_setTexCo( BPy_MTex *self, PyObject *value, void *closure) -{ - int texco; - - if( !PyInt_Check( value ) ) { - return EXPP_ReturnIntError( PyExc_TypeError, - "Value must be a member of Texture.TexCo dictionary" ); - } - - texco = PyInt_AsLong( value ) ; - - if (texco != TEXCO_ORCO && texco != TEXCO_REFL && texco != TEXCO_NORM && - texco != TEXCO_GLOB && texco != TEXCO_UV && texco != TEXCO_OBJECT && - texco != TEXCO_STRESS && texco != TEXCO_TANGENT && texco != TEXCO_WINDOW && - texco != TEXCO_VIEW && texco != TEXCO_STICKY ) - return EXPP_ReturnIntError( PyExc_ValueError, - "Value must be a member of Texture.TexCo dictionary" ); - - self->mtex->texco = (short)texco; - - return 0; -} - -static PyObject *MTex_getObject( BPy_MTex *self, void *closure ) -{ - if( self->mtex->object ) - return Object_CreatePyObject( self->mtex->object ); - else - Py_RETURN_NONE; -} - -static int MTex_setObject( BPy_MTex *self, PyObject *value, void *closure) -{ - return GenericLib_assignData(value, (void **) &self->mtex->object, 0, 1, ID_OB, 0); -} - -static PyObject *MTex_getUVLayer( BPy_MTex *self, void *closure ) -{ - return PyString_FromString(self->mtex->uvname); -} - -static int MTex_setUVLayer( BPy_MTex *self, PyObject *value, void *closure) -{ - if ( !PyString_Check(value) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string value" ); - BLI_strncpy(self->mtex->uvname, PyString_AsString(value), 31); - return 0; -} - -static PyObject *MTex_getMapTo( BPy_MTex *self, void *closure ) -{ - return PyInt_FromLong( self->mtex->mapto ); -} - -static int MTex_setMapTo( BPy_MTex *self, PyObject *value, void *closure) -{ - int mapto; - - if( !PyInt_Check( value ) ) { - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int" ); - } - - mapto = PyInt_AsLong( value ); - - /* This method is deprecated anyway. */ - if ( mapto < 0 || mapto > 16383 ) { - return EXPP_ReturnIntError( PyExc_ValueError, - "Value must be a sum of values from Texture.MapTo dictionary" ); - } - - self->mtex->mapto = (short)mapto; - - return 0; -} - -static PyObject *MTex_getCol( BPy_MTex *self, void *closure ) -{ - return Py_BuildValue( "(f,f,f)", self->mtex->r, self->mtex->g, - self->mtex->b ); -} - -static int MTex_setCol( BPy_MTex *self, PyObject *value, void *closure) -{ - float rgb[3]; - int i; - - if( !PyArg_ParseTuple( value, "fff", - &rgb[0], &rgb[1], &rgb[2] ) ) - - return EXPP_ReturnIntError( PyExc_TypeError, - "expected tuple of 3 floats" ); - - for( i = 0; i < 3; ++i ) - if( rgb[i] < 0 || rgb[i] > 1 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [0,1]" ); - - self->mtex->r = rgb[0]; - self->mtex->g = rgb[1]; - self->mtex->b = rgb[2]; - - return 0; -} - -static PyObject *MTex_getDVar( BPy_MTex *self, void *closure ) -{ - return PyFloat_FromDouble(self->mtex->def_var); -} - -static int MTex_setDVar( BPy_MTex *self, PyObject *value, void *closure) -{ - float f; - - if ( !PyFloat_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float" ); - - f = (float)PyFloat_AsDouble(value); - - if (f < 0 || f > 1) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [0,1]" ); - - self->mtex->def_var = f; - - return 0; -} - -static PyObject *MTex_getBlendMode( BPy_MTex *self, void *closure ) -{ - return PyInt_FromLong(self->mtex->blendtype); -} - -static int MTex_setBlendMode( BPy_MTex *self, PyObject *value, void *closure) -{ - int n; - - if ( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Value must be member of Texture.BlendModes dictionary" ); - - n = PyInt_AsLong(value); - -/* if (n != MTEX_BLEND && n != MTEX_MUL && n != MTEX_ADD && - n != MTEX_SUB && n != MTEX_DIV && n != MTEX_DARK && - n != MTEX_DIFF && n != MTEX_LIGHT && n != MTEX_SCREEN)*/ - if (n < 0 || n > 8) - { - return EXPP_ReturnIntError( PyExc_ValueError, - "Value must be member of Texture.BlendModes dictionary" ); - } - - self->mtex->blendtype = (short)n; - - return 0; -} - -static PyObject *MTex_getColFac( BPy_MTex *self, void *closure ) -{ - return PyFloat_FromDouble(self->mtex->colfac); -} - -static int MTex_setColFac( BPy_MTex *self, PyObject *value, void *closure) -{ - float f; - - if ( !PyFloat_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float" ); - - f = (float)PyFloat_AsDouble(value); - - if (f < 0 || f > 1) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [0,1]" ); - - self->mtex->colfac = f; - - return 0; -} - -static PyObject *MTex_getNorFac( BPy_MTex *self, void *closure ) -{ - return PyFloat_FromDouble(self->mtex->norfac); -} - -static int MTex_setNorFac( BPy_MTex *self, PyObject *value, void *closure) -{ - float f; - - if ( !PyFloat_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float" ); - - f = (float)PyFloat_AsDouble(value); - - if (f < 0 || f > 25) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [0,25]" ); - - self->mtex->norfac = f; - - return 0; -} - -static PyObject *MTex_getVarFac( BPy_MTex *self, void *closure ) -{ - return PyFloat_FromDouble(self->mtex->varfac); -} - -static int MTex_setVarFac( BPy_MTex *self, PyObject *value, void *closure) -{ - float f; - - if ( !PyFloat_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float" ); - - f = (float)PyFloat_AsDouble(value); - - if (f < 0 || f > 1) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [0,1]" ); - - self->mtex->varfac = f; - - return 0; -} - -static PyObject *MTex_getDispFac( BPy_MTex *self, void *closure ) -{ - return PyFloat_FromDouble(self->mtex->dispfac); -} - -static int MTex_setDispFac( BPy_MTex *self, PyObject *value, void *closure) -{ - float f; - - if ( !PyFloat_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float" ); - - f = (float)PyFloat_AsDouble(value); - - if (f < 0 || f > 1) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [0,1]" ); - - self->mtex->dispfac = f; - - return 0; -} - -static PyObject *MTex_getWarpFac( BPy_MTex *self, void *closure ) -{ - return PyFloat_FromDouble(self->mtex->warpfac); -} - -static int MTex_setWarpFac( BPy_MTex *self, PyObject *value, void *closure) -{ - float f; - - if ( !PyFloat_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a float" ); - - f = (float)PyFloat_AsDouble(value); - - if (f < 0 || f > 1) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [0,1]" ); - - self->mtex->warpfac = f; - - return 0; -} - -static PyObject *MTex_getOfs( BPy_MTex *self, void *closure ) -{ - return Py_BuildValue( "(f,f,f)", self->mtex->ofs[0], self->mtex->ofs[1], - self->mtex->ofs[2] ); -} - -static int MTex_setOfs( BPy_MTex *self, PyObject *value, void *closure) -{ - float f[3]; - int i; - - if( !PyArg_ParseTuple( value, "fff", &f[0], &f[1], &f[2] ) ) - - return EXPP_ReturnIntError( PyExc_TypeError, - "expected tuple of 3 floats" ); - - for( i = 0; i < 3; ++i ) - if( f[i] < -10 || f[i] > 10 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [-10,10]" ); - - self->mtex->ofs[0] = f[0]; - self->mtex->ofs[1] = f[1]; - self->mtex->ofs[2] = f[2]; - - return 0; -} - -static PyObject *MTex_getSize( BPy_MTex *self, void *closure ) -{ - return Py_BuildValue( "(f,f,f)", self->mtex->size[0], self->mtex->size[1], - self->mtex->size[2] ); -} - -static int MTex_setSize( BPy_MTex *self, PyObject *value, void *closure) -{ - float f[3]; - int i; - - if( !PyArg_ParseTuple( value, "fff", &f[0], &f[1], &f[2] ) ) - - return EXPP_ReturnIntError( PyExc_TypeError, - "expected tuple of 3 floats" ); - - for( i = 0; i < 3; ++i ) - if( f[i] < -100 || f[i] > 100 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "values must be in range [-100,100]" ); - - self->mtex->size[0] = f[0]; - self->mtex->size[1] = f[1]; - self->mtex->size[2] = f[2]; - - return 0; -} - -static PyObject *MTex_getMapping( BPy_MTex *self, void *closure ) -{ - return PyInt_FromLong( self->mtex->mapping ); -} - -static int MTex_setMapping( BPy_MTex *self, PyObject *value, void *closure) -{ - int n; - - if ( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Value must be member of Texture.Mappings dictionary" ); - - n = PyInt_AsLong(value); - -/* if (n != MTEX_FLAT && n != MTEX_TUBE && n != MTEX_CUBE && - n != MTEX_SPHERE) */ - if (n < 0 || n > 3) - { - return EXPP_ReturnIntError( PyExc_ValueError, - "Value must be member of Texture.Mappings dictionary" ); - } - - self->mtex->mapping = (char)n; - - return 0; -} - -static PyObject *MTex_getFlag( BPy_MTex *self, void *closure ) -{ - return PyBool_FromLong( self->mtex->texflag & ((int) closure) ); -} - -static int MTex_setFlag( BPy_MTex *self, PyObject *value, void *closure) -{ - if ( !PyBool_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a bool"); - - if ( value == Py_True ) - self->mtex->texflag |= (int)closure; - else - self->mtex->texflag &= ~((int) closure); - - return 0; -} - -static PyObject *MTex_getProjX( BPy_MTex *self, void *closure ) -{ - return PyInt_FromLong( self->mtex->projx ); -} - -static int MTex_setProjX( BPy_MTex *self, PyObject *value, void *closure) -{ - int proj; - - if( !PyInt_Check( value ) ) { - return EXPP_ReturnIntError( PyExc_TypeError, - "Value must be a member of Texture.Proj dictionary" ); - } - - proj = PyInt_AsLong( value ) ; - - /* valid values are from PROJ_N to PROJ_Z = 0 to 3 */ - if (proj < 0 || proj > 3) - return EXPP_ReturnIntError( PyExc_ValueError, - "Value must be a member of Texture.Proj dictionary" ); - - self->mtex->projx = (char)proj; - - return 0; -} - -static PyObject *MTex_getProjY( BPy_MTex *self, void *closure ) -{ - return PyInt_FromLong( self->mtex->projy ); -} - -static int MTex_setProjY( BPy_MTex *self, PyObject *value, void *closure ) -{ - int proj; - - if( !PyInt_Check( value ) ) { - return EXPP_ReturnIntError( PyExc_TypeError, - "Value must be a member of Texture.Proj dictionary" ); - } - - proj = PyInt_AsLong( value ) ; - - /* valid values are from PROJ_N to PROJ_Z = 0 to 3 */ - if (proj < 0 || proj > 3) - return EXPP_ReturnIntError( PyExc_ValueError, - "Value must be a member of Texture.Proj dictionary" ); - - self->mtex->projy = (char)proj; - - return 0; -} - -static PyObject *MTex_getProjZ( BPy_MTex *self, void *closure ) -{ - return PyInt_FromLong( self->mtex->projz ); -} - -static int MTex_setProjZ( BPy_MTex *self, PyObject *value, void *closure) -{ - int proj; - - if( !PyInt_Check( value ) ) { - return EXPP_ReturnIntError( PyExc_TypeError, - "Value must be a member of Texture.Proj dictionary" ); - } - - proj = PyInt_AsLong( value ) ; - - /* valid values are from PROJ_N to PROJ_Z = 0 to 3 */ - if (proj < 0 || proj > 3) - return EXPP_ReturnIntError( PyExc_ValueError, - "Value must be a member of Texture.Proj dictionary" ); - - self->mtex->projz = (char)proj; - - return 0; -} - -static PyObject *MTex_getMapToFlag( BPy_MTex *self, void *closure ) -{ - int flag = (int) closure; - - if ( self->mtex->mapto & flag ) - { - return PyInt_FromLong( ( self->mtex->maptoneg & flag ) ? -1 : 1 ); - } else { - return PyInt_FromLong( 0 ); - } -} - -static int MTex_setMapToFlag( BPy_MTex *self, PyObject *value, void *closure) -{ - int flag = (int) closure; - int intVal; - - if ( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int"); - - intVal = PyInt_AsLong( value ); - - if (flag == MAP_COL || flag == MAP_COLSPEC || flag == MAP_COLMIR || - flag == MAP_WARP) { - if (intVal < 0 || intVal > 1) { - return EXPP_ReturnIntError( PyExc_ValueError, - "value for that mapping must be 0 or 1" ); - } - } else { - if (intVal < -1 || intVal > 1) { - return EXPP_ReturnIntError( PyExc_ValueError, - "value for that mapping must be -1, 0 or 1" ); - } - } - - switch (intVal) - { - case 0: - self->mtex->mapto &= ~flag; - self->mtex->maptoneg &= ~flag; - break; - - case 1: - self->mtex->mapto |= flag; - self->mtex->maptoneg &= ~flag; - break; - - case -1: - self->mtex->mapto |= flag; - self->mtex->maptoneg |= flag; - break; - } - - return 0; -} diff --git a/source/blender/python/api2_2x/MTex.h b/source/blender/python/api2_2x/MTex.h deleted file mode 100644 index 36cfa1c477a..00000000000 --- a/source/blender/python/api2_2x/MTex.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * $Id: MTex.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Alex Mole - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_MTEX_H -#define EXPP_MTEX_H - -#include -#include "DNA_texture_types.h" - - -/*****************************************************************************/ -/* Python BPy_MTex structure definition */ -/*****************************************************************************/ - -typedef struct { - PyObject_HEAD - MTex * mtex; -} BPy_MTex; - -extern PyTypeObject MTex_Type; - -#define BPy_MTex_Check(v) ((v)->ob_type == &MTex_Type) - - -/*****************************************************************************/ -/* Module Blender.Texture.MTex - public functions */ -/*****************************************************************************/ - -PyObject *MTex_Init( void ); -PyObject *MTex_CreatePyObject( struct MTex *obj ); -MTex *MTex_FromPyObject( PyObject * py_obj ); - - -#endif /* EXPP_MTEX_H */ diff --git a/source/blender/python/api2_2x/Makefile b/source/blender/python/api2_2x/Makefile deleted file mode 100644 index 4ea06a324f5..00000000000 --- a/source/blender/python/api2_2x/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# -# $Id: Makefile 11904 2007-08-31 16:16:33Z sirdude $ -# -# ***** 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 ***** -# -# - -LIBNAME = python -DIR = $(OCGDIR)/blender/python - -CSRCS ?= $(wildcard *.c) $(wildcard ../*.c) - -include nan_compile.mk - -CFLAGS += $(LEVEL_1_C_WARNINGS) - -ifeq ($(WITH_FFMPEG), true) - CPPFLAGS += -DWITH_FFMPEG -endif - -CPPFLAGS += -I$(OPENGL_HEADERS) -CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include -CPPFLAGS += -I../../makesdna -CPPFLAGS += -I../../blenkernel -CPPFLAGS += -I../../blenlib -CPPFLAGS += -I../../blenloader -CPPFLAGS += -I../../include -CPPFLAGS += -I../../render/extern/include -CPPFLAGS += -I../../radiosity/extern/include -CPPFLAGS += -I$(NAN_BMFONT)/include -CPPFLAGS += -I../../imbuf -CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) - -# We'll just add a little duct tape to fix things here ... -.PHONY: clean -clean:: - @rm -f $(OCGDIR)/blender/BPY_*.o - @rm -f $(OCGDIR)/blender/BPY_*.d diff --git a/source/blender/python/api2_2x/Material.c b/source/blender/python/api2_2x/Material.c deleted file mode 100644 index 8ec1a8fab06..00000000000 --- a/source/blender/python/api2_2x/Material.c +++ /dev/null @@ -1,3048 +0,0 @@ -/* - * $Id: Material.c 12078 2007-09-18 06:41:29Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Michel Selten, Alex Mole, - * Alexander Szakaly, Campbell Barton, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Material.h" /*This must come first*/ - -#include "DNA_space_types.h" -#include "DNA_material_types.h" -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_material.h" -#include "BKE_texture.h" -#include "BKE_idprop.h" -#include "BKE_utildefines.h" /* for CLAMP */ -#include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" -#include "BSE_editipo.h" -#include "BIF_space.h" -#include "mydevice.h" -#include "constant.h" -#include "MTex.h" -#include "Texture.h" -#include "Ipo.h" -#include "Group.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "IDProp.h" - -/*****************************************************************************/ -/* Python BPy_Material defaults: */ -/*****************************************************************************/ -/* Material MIN, MAX values */ -#define EXPP_MAT_ADD_MIN 0.0f -#define EXPP_MAT_ADD_MAX 1.0f -#define EXPP_MAT_ALPHA_MIN 0.0f -#define EXPP_MAT_ALPHA_MAX 1.0f -#define EXPP_MAT_AMB_MIN 0.0f -#define EXPP_MAT_AMB_MAX 1.0f -#define EXPP_MAT_COL_MIN 0.0f /* min/max for all ... */ -#define EXPP_MAT_COL_MAX 1.0f /* ... color triplets */ -#define EXPP_MAT_EMIT_MIN 0.0f -#define EXPP_MAT_EMIT_MAX 1.0f -#define EXPP_MAT_REF_MIN 0.0f -#define EXPP_MAT_REF_MAX 1.0f -#define EXPP_MAT_SPEC_MIN 0.0f -#define EXPP_MAT_SPEC_MAX 2.0f -#define EXPP_MAT_SPECTRA_MIN 0.0f -#define EXPP_MAT_SPECTRA_MAX 1.0f - -/* Shader specific settings */ - -#define EXPP_MAT_ROUGHNESS_MIN 0.0f -#define EXPP_MAT_ROUGHNESS_MAX 3.140f -#define EXPP_MAT_SPECSIZE_MIN 0.0f -#define EXPP_MAT_SPECSIZE_MAX 1.530f -#define EXPP_MAT_DIFFUSESIZE_MIN 0.0f -#define EXPP_MAT_DIFFUSESIZE_MAX 3.140f -#define EXPP_MAT_SPECSMOOTH_MIN 0.0f -#define EXPP_MAT_SPECSMOOTH_MAX 1.0f -#define EXPP_MAT_DIFFUSESMOOTH_MIN 0.0f -#define EXPP_MAT_DIFFUSESMOOTH_MAX 1.0f -#define EXPP_MAT_DIFFUSE_DARKNESS_MIN 0.0f -#define EXPP_MAT_DIFFUSE_DARKNESS_MAX 2.0f -#define EXPP_MAT_REFRACINDEX_MIN 1.0f -#define EXPP_MAT_REFRACINDEX_MAX 10.0f -#define EXPP_MAT_RMS_MIN 0.0f -#define EXPP_MAT_RMS_MAX 0.4f -/* End shader settings */ - -#define EXPP_MAT_ZOFFS_MIN 0.0 -#define EXPP_MAT_ZOFFS_MAX 10.0 -#define EXPP_MAT_HALOSIZE_MIN 0.0 -#define EXPP_MAT_HALOSIZE_MAX 100.0 -#define EXPP_MAT_FLARESIZE_MIN 0.1f -#define EXPP_MAT_FLARESIZE_MAX 25.0 -#define EXPP_MAT_FLAREBOOST_MIN 0.1f -#define EXPP_MAT_FLAREBOOST_MAX 10.0 -#define EXPP_MAT_SUBSIZE_MIN 0.1f -#define EXPP_MAT_SUBSIZE_MAX 25.0 - -#define EXPP_MAT_HARD_MIN 1 -#define EXPP_MAT_HARD_MAX 255 /* 127 with MODE HALO ON */ -#define EXPP_MAT_HALOSEED_MIN 0 -#define EXPP_MAT_HALOSEED_MAX 255 -#define EXPP_MAT_NFLARES_MIN 1 -#define EXPP_MAT_NFLARES_MAX 32 -#define EXPP_MAT_FLARESEED_MIN 0 -#define EXPP_MAT_FLARESEED_MAX 255 -#define EXPP_MAT_NSTARS_MIN 3 -#define EXPP_MAT_NSTARS_MAX 50 -#define EXPP_MAT_NLINES_MIN 0 -#define EXPP_MAT_NLINES_MAX 250 -#define EXPP_MAT_NRINGS_MIN 0 -#define EXPP_MAT_NRINGS_MAX 24 - -#define EXPP_MAT_RAYMIRR_MIN 0.0 -#define EXPP_MAT_RAYMIRR_MAX 1.0 -#define EXPP_MAT_MIRRDEPTH_MIN 0 -#define EXPP_MAT_MIRRDEPTH_MAX 10 -#define EXPP_MAT_FRESNELMIRR_MIN 0.0 -#define EXPP_MAT_FRESNELMIRR_MAX 5.0 -#define EXPP_MAT_FRESNELMIRRFAC_MIN 1.0 -#define EXPP_MAT_FRESNELMIRRFAC_MAX 5.0 -#define EXPP_MAT_FILTER_MIN 0.0 -#define EXPP_MAT_FILTER_MAX 1.0 -#define EXPP_MAT_TRANSLUCENCY_MIN 0.0 -#define EXPP_MAT_TRANSLUCENCY_MAX 1.0 -#define EXPP_MAT_ZOFFS_MIN 0.0 -#define EXPP_MAT_ZOFFS_MAX 10.0 -#define EXPP_MAT_IOR_MIN 1.0 -#define EXPP_MAT_IOR_MAX 3.0 -#define EXPP_MAT_TRANSDEPTH_MIN 0 -#define EXPP_MAT_TRANSDEPTH_MAX 10 -#define EXPP_MAT_FRESNELTRANS_MIN 0.0 -#define EXPP_MAT_FRESNELTRANS_MAX 5.0 -#define EXPP_MAT_FRESNELTRANSFAC_MIN 1.0 -#define EXPP_MAT_FRESNELTRANSFAC_MAX 5.0 -#define EXPP_MAT_SPECTRANS_MIN 0.0 -#define EXPP_MAT_SPECTRANS_MAX 1.0 -#define EXPP_MAT_MIRRTRANSADD_MIN 0.0 -#define EXPP_MAT_MIRRTRANSADD_MAX 1.0 - -/* closure values for getColorComponent()/setColorComponent() */ - -#define EXPP_MAT_COMP_R 0 -#define EXPP_MAT_COMP_G 1 -#define EXPP_MAT_COMP_B 2 -#define EXPP_MAT_COMP_SPECR 3 -#define EXPP_MAT_COMP_SPECG 4 -#define EXPP_MAT_COMP_SPECB 5 -#define EXPP_MAT_COMP_MIRR 6 -#define EXPP_MAT_COMP_MIRG 7 -#define EXPP_MAT_COMP_MIRB 8 -#define EXPP_MAT_COMP_SSSR 9 -#define EXPP_MAT_COMP_SSSG 10 -#define EXPP_MAT_COMP_SSSB 11 - - -#define IPOKEY_RGB 0 -#define IPOKEY_ALPHA 1 -#define IPOKEY_HALOSIZE 2 -#define IPOKEY_MODE 3 -#define IPOKEY_ALLCOLOR 10 -#define IPOKEY_ALLMIRROR 14 -#define IPOKEY_OFS 12 -#define IPOKEY_SIZE 13 -#define IPOKEY_ALLMAPPING 11 - -/* SSS Settings */ -#define EXPP_MAT_SSS_SCALE_MIN 0.001 -#define EXPP_MAT_SSS_SCALE_MAX 1000.0 -#define EXPP_MAT_SSS_RADIUS_MIN 0.0 -#define EXPP_MAT_SSS_RADIUS_MAX 10000.0 -#define EXPP_MAT_SSS_IOR_MIN 0.1 -#define EXPP_MAT_SSS_IOR_MAX 2.0 -#define EXPP_MAT_SSS_ERROR_MIN 0.0 -#define EXPP_MAT_SSS_ERROR_MAX 1.0 -#define EXPP_MAT_SSS_FRONT_MIN 0.0 -#define EXPP_MAT_SSS_FRONT_MAX 2.0 -#define EXPP_MAT_SSS_BACK_MIN 0.0 -#define EXPP_MAT_SSS_BACK_MAX 10.0 - - -/*****************************************************************************/ -/* Python API function prototypes for the Material module. */ -/*****************************************************************************/ -static PyObject *M_Material_New( PyObject * self, PyObject * args, - PyObject * keywords ); -static PyObject *M_Material_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. In */ -/* Python these will be written to the console when doing a */ -/* Blender.Material.__doc__ */ -/*****************************************************************************/ -static char M_Material_doc[] = "The Blender Material module"; - -static char M_Material_New_doc[] = - "(name) - return a new material called 'name'\n\ -() - return a new material called 'Mat'"; - -static char M_Material_Get_doc[] = - "(name) - return the material called 'name', None if not found.\n\ -() - return a list of all materials in the current scene."; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Material module: */ -/*****************************************************************************/ -struct PyMethodDef M_Material_methods[] = { - {"New", ( PyCFunction ) M_Material_New, METH_VARARGS | METH_KEYWORDS, - M_Material_New_doc}, - {"Get", M_Material_Get, METH_VARARGS, M_Material_Get_doc}, - {"get", M_Material_Get, METH_VARARGS, M_Material_Get_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Function: M_Material_New */ -/* Python equivalent: Blender.Material.New */ -/*****************************************************************************/ -static PyObject *M_Material_New( PyObject * self, PyObject * args, - PyObject * keywords ) -{ - char *name = "Mat"; - static char *kwlist[] = { "name", NULL }; - BPy_Material *pymat; /* for Material Data object wrapper in Python */ - Material *blmat; /* for actual Material Data we create in Blender */ - char buf[21]; - - if( !PyArg_ParseTupleAndKeywords - ( args, keywords, "|s", kwlist, &name ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "expected string or nothing as argument" ) ); - - if( strcmp( name, "Mat" ) != 0 ) /* use gave us a name ? */ - PyOS_snprintf( buf, sizeof( buf ), "%s", name ); - - blmat = add_material( name ); /* first create the Material Data in Blender */ - - if( blmat ) /* now create the wrapper obj in Python */ - pymat = ( BPy_Material * ) Material_CreatePyObject( blmat ); - else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Material Data in Blender" ) ); - - blmat->id.us = 0; /* was incref'ed by add_material() above */ - - if( pymat == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Material Data object" ) ); - - return ( PyObject * ) pymat; -} - -/*****************************************************************************/ -/* Function: M_Material_Get */ -/* Python equivalent: Blender.Material.Get */ -/* Description: Receives a string and returns the material whose */ -/* name matches the string. If no argument is */ -/* passed in, a list with all materials in the */ -/* current scene is returned. */ -/*****************************************************************************/ -static PyObject *M_Material_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Material *mat_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - if( name ) { /* (name) - Search material by name */ - - mat_iter = ( Material * ) GetIdFromList( &( G.main->mat ), name ); - - if( mat_iter == NULL ) { /* Requested material doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Material \"%s\" not found", name ); - return EXPP_ReturnPyObjError( PyExc_NameError, - error_msg ); - } - - return Material_CreatePyObject( mat_iter ); - } - - else { /* () - return a list with all materials in the scene */ - int index = 0; - PyObject *matlist, *pyobj; - - matlist = PyList_New( BLI_countlist( &( G.main->mat ) ) ); - - if( !matlist ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - mat_iter = G.main->mat.first; - while( mat_iter ) { - pyobj = Material_CreatePyObject( mat_iter ); - - if( !pyobj ) { - Py_DECREF(matlist); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create PyObject" ) ); - } - PyList_SET_ITEM( matlist, index, pyobj ); - - mat_iter = mat_iter->id.next; - index++; - } - - return matlist; - } -} - -static PyObject *Material_ModesDict( void ) -{ - PyObject *Modes = PyConstant_New( ); - - if( Modes ) { - BPy_constant *c = ( BPy_constant * ) Modes; - - PyConstant_Insert(c, "TRACEABLE", PyInt_FromLong(MA_TRACEBLE)); - PyConstant_Insert(c, "SHADOW", PyInt_FromLong(MA_SHADOW)); - PyConstant_Insert(c, "SHADOWBUF", PyInt_FromLong(MA_SHADBUF)); - PyConstant_Insert(c, "TANGENTSTR", PyInt_FromLong(MA_TANGENT_STR)); - PyConstant_Insert(c, "FULLOSA", PyInt_FromLong(MA_FULL_OSA)); - PyConstant_Insert(c, "RAYBIAS", PyInt_FromLong(MA_RAYBIAS)); - PyConstant_Insert(c, "TRANSPSHADOW", PyInt_FromLong(MA_SHADOW_TRA)); - PyConstant_Insert(c, "RAMPCOL", PyInt_FromLong(MA_RAMP_COL)); - PyConstant_Insert(c, "RAMPSPEC", PyInt_FromLong(MA_RAMP_SPEC)); - PyConstant_Insert(c, "SHADELESS", PyInt_FromLong(MA_SHLESS)); - PyConstant_Insert(c, "WIRE", PyInt_FromLong(MA_WIRE)); - PyConstant_Insert(c, "VCOL_LIGHT", PyInt_FromLong(MA_VERTEXCOL)); - PyConstant_Insert(c, "HALO", PyInt_FromLong(MA_HALO)); - PyConstant_Insert(c, "ZTRANSP", PyInt_FromLong(MA_ZTRA)); - PyConstant_Insert(c, "VCOL_PAINT", PyInt_FromLong(MA_VERTEXCOLP)); - PyConstant_Insert(c, "ZINVERT", PyInt_FromLong(MA_ZINV)); - PyConstant_Insert(c, "HALORINGS", PyInt_FromLong(MA_HALO_RINGS)); - PyConstant_Insert(c, "ENV", PyInt_FromLong(MA_ENV)); - PyConstant_Insert(c, "HALOLINES", PyInt_FromLong(MA_HALO_LINES)); - PyConstant_Insert(c, "ONLYSHADOW", PyInt_FromLong(MA_ONLYSHADOW)); - PyConstant_Insert(c, "HALOXALPHA", PyInt_FromLong(MA_HALO_XALPHA)); - PyConstant_Insert(c, "HALOSTAR", PyInt_FromLong(MA_STAR)); - PyConstant_Insert(c, "TEXFACE", PyInt_FromLong(MA_FACETEXTURE)); - PyConstant_Insert(c, "HALOTEX", PyInt_FromLong(MA_HALOTEX)); - PyConstant_Insert(c, "HALOPUNO", PyInt_FromLong(MA_HALOPUNO)); - PyConstant_Insert(c, "NOMIST", PyInt_FromLong(MA_NOMIST)); - PyConstant_Insert(c, "HALOSHADE", PyInt_FromLong(MA_HALO_SHADE)); - PyConstant_Insert(c, "HALOFLARE", PyInt_FromLong(MA_HALO_FLARE)); - PyConstant_Insert(c, "RADIO", PyInt_FromLong(MA_RADIO)); - PyConstant_Insert(c, "RAYMIRROR", PyInt_FromLong(MA_RAYMIRROR)); - PyConstant_Insert(c, "ZTRA", PyInt_FromLong(MA_ZTRA)); - PyConstant_Insert(c, "RAYTRANSP", PyInt_FromLong(MA_RAYTRANSP)); - PyConstant_Insert(c, "TANGENT_V", PyInt_FromLong(MA_TANGENT_V)); - PyConstant_Insert(c, "NMAP_TS", PyInt_FromLong(MA_NORMAP_TANG)); - PyConstant_Insert(c, "GROUP_EXCLUSIVE", PyInt_FromLong(MA_GROUP_NOLAY)); - } - - return Modes; -} - - -static PyObject *Material_ShadersDict( void ) -{ - PyObject *Shaders = PyConstant_New( ); - - if( Shaders ) { - BPy_constant *c = ( BPy_constant * ) Shaders; - - PyConstant_Insert(c, "DIFFUSE_LAMBERT", PyInt_FromLong(MA_DIFF_LAMBERT)); - PyConstant_Insert(c, "DIFFUSE_ORENNAYAR", PyInt_FromLong(MA_DIFF_ORENNAYAR)); - PyConstant_Insert(c, "DIFFUSE_TOON", PyInt_FromLong(MA_DIFF_TOON)); - PyConstant_Insert(c, "DIFFUSE_MINNAERT", PyInt_FromLong(MA_DIFF_MINNAERT)); - PyConstant_Insert(c, "SPEC_COOKTORR", PyInt_FromLong(MA_SPEC_COOKTORR)); - PyConstant_Insert(c, "SPEC_PHONG", PyInt_FromLong(MA_SPEC_PHONG)); - PyConstant_Insert(c, "SPEC_BLINN", PyInt_FromLong(MA_SPEC_BLINN)); - PyConstant_Insert(c, "SPEC_TOON", PyInt_FromLong(MA_SPEC_TOON)); - PyConstant_Insert(c, "SPEC_WARDISO", PyInt_FromLong(MA_SPEC_WARDISO)); - - } - - return Shaders; -} - - -/*****************************************************************************/ -/* Function: Material_Init */ -/*****************************************************************************/ -PyObject *Material_Init( void ) -{ - PyObject *submodule, *Modes, *Shaders; - - if( PyType_Ready( &Material_Type ) < 0) - return NULL; - - Modes = Material_ModesDict( ); - Shaders = Material_ShadersDict( ); - - submodule = Py_InitModule3( "Blender.Material", - M_Material_methods, M_Material_doc ); - - if( Modes ) - PyModule_AddObject( submodule, "Modes", Modes ); - if( Shaders ) - PyModule_AddObject( submodule, "Shaders", Shaders ); - - PyModule_AddIntConstant( submodule, "RGB", IPOKEY_RGB ); - PyModule_AddIntConstant( submodule, "ALPHA", IPOKEY_ALPHA ); - PyModule_AddIntConstant( submodule, "HALOSIZE", IPOKEY_HALOSIZE ); - PyModule_AddIntConstant( submodule, "MODE", IPOKEY_MODE ); - PyModule_AddIntConstant( submodule, "ALLCOLOR", IPOKEY_ALLCOLOR ); - PyModule_AddIntConstant( submodule, "ALLMIRROR", IPOKEY_ALLMIRROR ); - PyModule_AddIntConstant( submodule, "OFS", IPOKEY_OFS ); - PyModule_AddIntConstant( submodule, "SIZE", IPOKEY_SIZE ); - PyModule_AddIntConstant( submodule, "ALLMAPPING", IPOKEY_ALLMAPPING ); - - return ( submodule ); -} - -/***************************/ -/*** The Material PyType ***/ -/***************************/ - -static PyObject *Matr_oldsetAdd( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetAlpha( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetAmb( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetEmit( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFilter( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFlareBoost( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFlareSeed( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFlareSize( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFresnelMirr( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFresnelMirrFac( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFresnelTrans( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetFresnelTransFac( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetHaloSeed( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetHaloSize( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetHardness( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetIOR( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetNFlares( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetNLines( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetNRings( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetNStars( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetRayMirr( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetMirrDepth( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetRef( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetSpec( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetSpecTransp( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetSubSize( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetTransDepth( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetZOffset( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetMode( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetIpo( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetRGBCol( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetSpecCol( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetSpecShader( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetMirCol( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetDiffuseShader( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetRoughness( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetSpecSize( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetDiffuseSize( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetSpecSmooth( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetDiffuseSmooth( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetDiffuseDarkness( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetRefracIndex( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetRms( BPy_Material * self, PyObject * args ); -static PyObject *Matr_oldsetTranslucency( BPy_Material * self, PyObject * args ); - -static int Material_setIpo( BPy_Material * self, PyObject * value ); - -static int Material_setMode( BPy_Material * self, PyObject * value ); -static int Material_setRGBCol( BPy_Material * self, PyObject * value ); -static int Material_setSpecCol( BPy_Material * self, PyObject * value ); -static int Material_setMirCol( BPy_Material * self, PyObject * value ); -static int Material_setSssCol( BPy_Material * self, PyObject * value ); -static int Material_setColorComponent( BPy_Material * self, PyObject * value, - void * closure ); -static int Material_setAmb( BPy_Material * self, PyObject * value ); -static int Material_setEmit( BPy_Material * self, PyObject * value ); -static int Material_setSpecTransp( BPy_Material * self, PyObject * value ); -static int Material_setAlpha( BPy_Material * self, PyObject * value ); -static int Material_setShadAlpha( BPy_Material * self, PyObject * value ); -static int Material_setRef( BPy_Material * self, PyObject * value ); -static int Material_setSpec( BPy_Material * self, PyObject * value ); -static int Material_setZOffset( BPy_Material * self, PyObject * value ); -static int Material_setLightGroup( BPy_Material * self, PyObject * value ); -static int Material_setAdd( BPy_Material * self, PyObject * value ); -static int Material_setHaloSize( BPy_Material * self, PyObject * value ); -static int Material_setFlareSize( BPy_Material * self, PyObject * value ); -static int Material_setFlareBoost( BPy_Material * self, PyObject * value ); -static int Material_setSubSize( BPy_Material * self, PyObject * value ); -static int Material_setHaloSeed( BPy_Material * self, PyObject * value ); -static int Material_setFlareSeed( BPy_Material * self, PyObject * value ); -static int Material_setHardness( BPy_Material * self, PyObject * value ); -static int Material_setNFlares( BPy_Material * self, PyObject * value ); -static int Material_setNStars( BPy_Material * self, PyObject * value ); -static int Material_setNLines( BPy_Material * self, PyObject * value ); -static int Material_setNRings( BPy_Material * self, PyObject * value ); -static int Material_setRayMirr( BPy_Material * self, PyObject * value ); -static int Material_setMirrDepth( BPy_Material * self, PyObject * value ); -static int Material_setFresnelMirr( BPy_Material * self, PyObject * value ); -static int Material_setFresnelMirrFac( BPy_Material * self, PyObject * value ); -static int Material_setIOR( BPy_Material * self, PyObject * value ); -static int Material_setTransDepth( BPy_Material * self, PyObject * value ); -static int Material_setFresnelTrans( BPy_Material * self, PyObject * value ); -static int Material_setFresnelTransFac( BPy_Material * self, PyObject * value ); -static int Material_setRigidBodyFriction( BPy_Material * self, PyObject * value ); -static int Material_setRigidBodyRestitution( BPy_Material * self, PyObject * value ); - -static int Material_setSpecShader( BPy_Material * self, PyObject * value ); -static int Material_setDiffuseShader( BPy_Material * self, PyObject * value ); -static int Material_setRoughness( BPy_Material * self, PyObject * value ); -static int Material_setSpecSize( BPy_Material * self, PyObject * value ); -static int Material_setDiffuseSize( BPy_Material * self, PyObject * value ); -static int Material_setSpecSmooth( BPy_Material * self, PyObject * value ); -static int Material_setDiffuseSmooth( BPy_Material * self, PyObject * value ); -static int Material_setDiffuseDarkness( BPy_Material * self, PyObject * value ); -static int Material_setRefracIndex( BPy_Material * self, PyObject * value ); -static int Material_setRms( BPy_Material * self, PyObject * value ); -static int Material_setFilter( BPy_Material * self, PyObject * value ); -static int Material_setTranslucency( BPy_Material * self, PyObject * value ); - -static int Material_setSssEnable( BPy_Material * self, PyObject * value ); -static int Material_setSssScale( BPy_Material * self, PyObject * value ); -static int Material_setSssRadius( BPy_Material * self, PyObject * value, void * type ); -static int Material_setSssIOR( BPy_Material * self, PyObject * value ); -static int Material_setSssError( BPy_Material * self, PyObject * value ); -static int Material_setSssColorBlend( BPy_Material * self, PyObject * value ); -static int Material_setSssTexScatter( BPy_Material * self, PyObject * value ); -static int Material_setSssFront( BPy_Material * self, PyObject * value ); -static int Material_setSssBack( BPy_Material * self, PyObject * value ); -static int Material_setSssBack( BPy_Material * self, PyObject * value ); - -static PyObject *Material_getColorComponent( BPy_Material * self, - void * closure ); - -/*static int Material_setSeptex( BPy_Material * self, PyObject * value ); - static PyObject *Material_getSeptex( BPy_Material * self );*/ - -/*****************************************************************************/ -/* Python BPy_Material methods declarations: */ -/*****************************************************************************/ -static PyObject *Material_getIpo( BPy_Material * self ); -static PyObject *Material_getMode( BPy_Material * self ); -static PyObject *Material_getRGBCol( BPy_Material * self ); -/*static PyObject *Material_getAmbCol(BPy_Material *self);*/ -static PyObject *Material_getSpecCol( BPy_Material * self ); -static PyObject *Material_getMirCol( BPy_Material * self ); -static PyObject *Material_getSssCol( BPy_Material * self ); -static PyObject *Material_getAmb( BPy_Material * self ); -static PyObject *Material_getEmit( BPy_Material * self ); -static PyObject *Material_getAlpha( BPy_Material * self ); -static PyObject *Material_getShadAlpha( BPy_Material * self ); -static PyObject *Material_getRef( BPy_Material * self ); -static PyObject *Material_getSpec( BPy_Material * self ); -static PyObject *Material_getSpecTransp( BPy_Material * self ); -static PyObject *Material_getAdd( BPy_Material * self ); -static PyObject *Material_getZOffset( BPy_Material * self ); -static PyObject *Material_getLightGroup( BPy_Material * self ); -static PyObject *Material_getHaloSize( BPy_Material * self ); -static PyObject *Material_getHaloSeed( BPy_Material * self ); -static PyObject *Material_getFlareSize( BPy_Material * self ); -static PyObject *Material_getFlareSeed( BPy_Material * self ); -static PyObject *Material_getFlareBoost( BPy_Material * self ); -static PyObject *Material_getSubSize( BPy_Material * self ); -static PyObject *Material_getHardness( BPy_Material * self ); -static PyObject *Material_getNFlares( BPy_Material * self ); -static PyObject *Material_getNStars( BPy_Material * self ); -static PyObject *Material_getNLines( BPy_Material * self ); -static PyObject *Material_getNRings( BPy_Material * self ); -/* Shader settings */ -static PyObject *Material_getSpecShader( BPy_Material * self ); -static PyObject *Material_getDiffuseShader( BPy_Material * self ); -static PyObject *Material_getRoughness( BPy_Material * self ); -static PyObject *Material_getSpecSize( BPy_Material * self ); -static PyObject *Material_getDiffuseSize( BPy_Material * self ); -static PyObject *Material_getSpecSmooth( BPy_Material * self ); -static PyObject *Material_getDiffuseSmooth( BPy_Material * self ); -static PyObject *Material_getDiffuseDarkness( BPy_Material * self ); -static PyObject *Material_getRefracIndex( BPy_Material * self ); -static PyObject *Material_getRms( BPy_Material * self ); - -static PyObject *Material_getRayMirr( BPy_Material * self ); -static PyObject *Material_getMirrDepth( BPy_Material * self ); -static PyObject *Material_getFresnelMirr( BPy_Material * self ); -static PyObject *Material_getFresnelMirrFac( BPy_Material * self ); -static PyObject *Material_getIOR( BPy_Material * self ); -static PyObject *Material_getTransDepth( BPy_Material * self ); -static PyObject *Material_getFresnelTrans( BPy_Material * self ); -static PyObject *Material_getFresnelTransFac( BPy_Material * self ); -static PyObject *Material_getRigidBodyFriction( BPy_Material * self ); -static PyObject *Material_getRigidBodyRestitution( BPy_Material * self ); - -static PyObject *Material_getSssEnable( BPy_Material * self ); -static PyObject *Material_getSssScale( BPy_Material * self ); -static PyObject *Material_getSssRadius( BPy_Material * self, void * type ); -static PyObject *Material_getSssIOR( BPy_Material * self ); -static PyObject *Material_getSssError( BPy_Material * self ); -static PyObject *Material_getSssColorBlend( BPy_Material * self ); -static PyObject *Material_getSssTexScatter( BPy_Material * self ); -static PyObject *Material_getSssFront( BPy_Material * self ); -static PyObject *Material_getSssBack( BPy_Material * self ); -static PyObject *Material_getSssBack( BPy_Material * self ); - -static PyObject *Material_getFilter( BPy_Material * self ); -static PyObject *Material_getTranslucency( BPy_Material * self ); -static PyObject *Material_getTextures( BPy_Material * self ); -static PyObject *Material_clearIpo( BPy_Material * self ); - -static PyObject *Material_setTexture( BPy_Material * self, PyObject * args ); -static PyObject *Material_clearTexture( BPy_Material * self, PyObject * value ); - -static PyObject *Material_getScriptLinks(BPy_Material *self, PyObject * value ); -static PyObject *Material_addScriptLink(BPy_Material * self, PyObject * args ); -static PyObject *Material_clearScriptLinks(BPy_Material *self, PyObject *args); - -static PyObject *Material_insertIpoKey( BPy_Material * self, PyObject * args ); -static PyObject *Material_getColorband( BPy_Material * self, void * type); -int Material_setColorband( BPy_Material * self, PyObject * value, void * type); -static PyObject *Material_copy( BPy_Material * self ); - - -/*****************************************************************************/ -/* Python BPy_Material methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Material_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return Material's name"}, - {"getIpo", ( PyCFunction ) Material_getIpo, METH_NOARGS, - "() - Return Material's ipo or None if not found"}, - {"getMode", ( PyCFunction ) Material_getMode, METH_NOARGS, - "() - Return Material's mode flags"}, - {"getRGBCol", ( PyCFunction ) Material_getRGBCol, METH_NOARGS, - "() - Return Material's rgb color triplet"}, -/* {"getAmbCol", (PyCFunction)Material_getAmbCol, METH_NOARGS, - "() - Return Material's ambient color"},*/ - {"getSpecCol", ( PyCFunction ) Material_getSpecCol, METH_NOARGS, - "() - Return Material's specular color"}, - {"getMirCol", ( PyCFunction ) Material_getMirCol, METH_NOARGS, - "() - Return Material's mirror color"}, - {"getAmb", ( PyCFunction ) Material_getAmb, METH_NOARGS, - "() - Return Material's ambient color blend factor"}, - {"getEmit", ( PyCFunction ) Material_getEmit, METH_NOARGS, - "() - Return Material's emitting light intensity"}, - {"getAlpha", ( PyCFunction ) Material_getAlpha, METH_NOARGS, - "() - Return Material's alpha (transparency) value"}, - {"getRef", ( PyCFunction ) Material_getRef, METH_NOARGS, - "() - Return Material's reflectivity"}, - {"getSpec", ( PyCFunction ) Material_getSpec, METH_NOARGS, - "() - Return Material's specularity"}, - /* Shader specific settings */ - {"getSpecShader", ( PyCFunction ) Material_getSpecShader, METH_NOARGS, - "() - Returns Material's specular shader" }, - {"getDiffuseShader", ( PyCFunction ) Material_getDiffuseShader, METH_NOARGS, - "() - Returns Material's diffuse shader" }, - {"getRoughness", ( PyCFunction ) Material_getRoughness, METH_NOARGS, - "() - Returns Material's Roughness (applies to the \"Oren Nayar\" Diffuse Shader only)" }, - {"getSpecSize", ( PyCFunction ) Material_getSpecSize, METH_NOARGS, - "() - Returns Material's size of specular area (applies to the \"Toon\" Specular Shader only)" }, - {"getDiffuseSize", ( PyCFunction ) Material_getDiffuseSize, METH_NOARGS, - "() - Returns Material's size of diffuse area (applies to the \"Toon\" Diffuse Shader only)" }, - {"getSpecSmooth", ( PyCFunction ) Material_getSpecSmooth, METH_NOARGS, - "() - Returns Material's smoothing of specular area (applies to the \"Toon\" Diffuse Shader only)" }, - {"getDiffuseSmooth", ( PyCFunction ) Material_getDiffuseSmooth, METH_NOARGS, - "() - Returns Material's smoothing of diffuse area (applies to the \"Toon\" Diffuse Shader only)" }, - {"getDiffuseDarkness", ( PyCFunction ) Material_getDiffuseDarkness, METH_NOARGS, - "() - Returns Material's diffuse darkness (applies to the \"Minnaert\" Diffuse Shader only)" }, - {"getRefracIndex", ( PyCFunction ) Material_getRefracIndex, METH_NOARGS, - "() - Returns Material's Index of Refraction (applies to the \"Blinn\" Specular Shader only)" }, - {"getRms", ( PyCFunction ) Material_getRms, METH_NOARGS, - "() - Returns Material's standard deviation of surface slope (applies to the \"WardIso\" Specular Shader only)" }, - /* End shader settings */ - {"getSpecTransp", ( PyCFunction ) Material_getSpecTransp, METH_NOARGS, - "() - Return Material's specular transparency"}, - {"getAdd", ( PyCFunction ) Material_getAdd, METH_NOARGS, - "() - Return Material's glow factor"}, - {"getZOffset", ( PyCFunction ) Material_getZOffset, METH_NOARGS, - "() - Return Material's artificial offset for faces"}, - {"getHaloSize", ( PyCFunction ) Material_getHaloSize, METH_NOARGS, - "() - Return Material's halo size"}, - {"getHaloSeed", ( PyCFunction ) Material_getHaloSeed, METH_NOARGS, - "() - Return Material's seed for random ring dimension and line " - "location in halos"}, - {"getFlareSize", ( PyCFunction ) Material_getFlareSize, METH_NOARGS, - "() - Return Material's (flare size)/(halo size) factor"}, - {"getFlareSeed", ( PyCFunction ) Material_getFlareSeed, METH_NOARGS, - "() - Return Material's flare offset in the seed table"}, - {"getFlareBoost", ( PyCFunction ) Material_getFlareBoost, METH_NOARGS, - "() - Return Material's flare boost"}, - {"getSubSize", ( PyCFunction ) Material_getSubSize, METH_NOARGS, - "() - Return Material's dimension of subflare, dots and circles"}, - {"getHardness", ( PyCFunction ) Material_getHardness, METH_NOARGS, - "() - Return Material's specular hardness"}, - {"getNFlares", ( PyCFunction ) Material_getNFlares, METH_NOARGS, - "() - Return Material's number of flares in halo"}, - {"getNStars", ( PyCFunction ) Material_getNStars, METH_NOARGS, - "() - Return Material's number of points in the halo stars"}, - {"getNLines", ( PyCFunction ) Material_getNLines, METH_NOARGS, - "() - Return Material's number of lines in halo"}, - {"getNRings", ( PyCFunction ) Material_getNRings, METH_NOARGS, - "() - Return Material's number of rings in halo"}, - {"getRayMirr", ( PyCFunction ) Material_getRayMirr, METH_NOARGS, - "() - Return mount mirror"}, - {"getMirrDepth", ( PyCFunction ) Material_getMirrDepth, METH_NOARGS, - "() - Return amount mirror depth"}, - {"getFresnelMirr", ( PyCFunction ) Material_getFresnelMirr, METH_NOARGS, - "() - Return fresnel power for refractions"}, - {"getFresnelMirrFac", ( PyCFunction ) Material_getFresnelMirrFac, METH_NOARGS, - "() - Return fresnel power for refractions factor"}, - {"getFilter", ( PyCFunction ) Material_getFilter, METH_NOARGS, - "() - Return the amount of filtering when transparent raytrace is enabled"}, - {"getTranslucency", ( PyCFunction ) Material_getTranslucency, METH_NOARGS, - "() - Return the Translucency, the amount of diffuse shading of the back side"}, - {"getIOR", ( PyCFunction ) Material_getIOR, METH_NOARGS, - "() - Return IOR"}, - {"getTransDepth", ( PyCFunction ) Material_getTransDepth, METH_NOARGS, - "() - Return amount inter-refractions"}, - {"getFresnelTrans", ( PyCFunction ) Material_getFresnelTrans, METH_NOARGS, - "() - Return fresnel power for refractions"}, - {"getFresnelTransFac", ( PyCFunction ) Material_getFresnelTransFac, METH_NOARGS, - "() - Return fresnel power for refractions factor"}, - - {"getTextures", ( PyCFunction ) Material_getTextures, METH_NOARGS, - "() - Return Material's texture list as a tuple"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(s) - Change Material's name"}, - {"setIpo", ( PyCFunction ) Matr_oldsetIpo, METH_VARARGS, - "(Blender Ipo) - Change Material's Ipo"}, - {"clearIpo", ( PyCFunction ) Material_clearIpo, METH_NOARGS, - "(Blender Ipo) - Unlink Ipo from this Material"}, - {"insertIpoKey", ( PyCFunction ) Material_insertIpoKey, METH_VARARGS, - "(Material Ipo Constant) - Insert IPO Key at current frame"}, - {"setMode", ( PyCFunction ) Matr_oldsetMode, METH_VARARGS, - "([s[,s]]) - Set Material's mode flag(s)"}, - {"setRGBCol", ( PyCFunction ) Matr_oldsetRGBCol, METH_VARARGS, - "(f,f,f or [f,f,f]) - Set Material's rgb color triplet"}, -/* {"setAmbCol", (PyCFunction)Matr_oldsetAmbCol, METH_VARARGS, - "(f,f,f or [f,f,f]) - Set Material's ambient color"},*/ - {"setSpecCol", ( PyCFunction ) Matr_oldsetSpecCol, METH_VARARGS, - "(f,f,f or [f,f,f]) - Set Material's specular color"}, - - /* Shader spesific settings */ - {"setSpecShader", ( PyCFunction ) Matr_oldsetSpecShader, METH_VARARGS, - "(i) - Set the Material's specular shader" }, - {"setDiffuseShader", ( PyCFunction ) Matr_oldsetDiffuseShader, METH_VARARGS, - "(i) - Set the Material's diffuse shader" }, - {"setRoughness", ( PyCFunction ) Matr_oldsetRoughness, METH_VARARGS, - "(f) - Set the Material's Roughness (applies to the \"Oren Nayar\" Diffuse Shader only)" }, - {"setSpecSize", ( PyCFunction ) Matr_oldsetSpecSize, METH_VARARGS, - "(f) - Set the Material's size of specular area (applies to the \"Toon\" Specular Shader only)" }, - {"setDiffuseSize", ( PyCFunction ) Matr_oldsetDiffuseSize, METH_VARARGS, - "(f) - Set the Material's size of diffuse area (applies to the \"Toon\" Diffuse Shader only)" }, - {"setSpecSmooth", ( PyCFunction ) Matr_oldsetSpecSmooth, METH_VARARGS, - "(f) - Set the Material's smoothing of specular area (applies to the \"Toon\" Specular Shader only)" }, - {"setDiffuseSmooth", ( PyCFunction ) Matr_oldsetDiffuseSmooth, METH_VARARGS, - "(f) - Set the Material's smoothing of diffuse area (applies to the \"Toon\" Diffuse Shader only)" }, - {"setDiffuseDarkness", ( PyCFunction ) Matr_oldsetDiffuseDarkness, METH_VARARGS, - "(f) - Set the Material's diffuse darkness (applies to the \"Minnaert\" Diffuse Shader only)" }, - {"setRefracIndex", ( PyCFunction ) Matr_oldsetRefracIndex, METH_VARARGS, - "(f) - Set the Material's Index of Refraction (applies to the \"Blinn\" Specular Shader only)" }, - {"setRms", ( PyCFunction ) Matr_oldsetRms, METH_VARARGS, - "(f) - Set the Material's standard deviation of surface slope (applies to the \"WardIso\" Specular Shader only)" }, - /* End shader settings */ - - {"setMirCol", ( PyCFunction ) Matr_oldsetMirCol, METH_VARARGS, - "(f,f,f or [f,f,f]) - Set Material's mirror color"}, - {"setAmb", ( PyCFunction ) Matr_oldsetAmb, METH_VARARGS, - "(f) - Set how much the Material's color is affected" - " by \nthe global ambient colors - [0.0, 1.0]"}, - {"setEmit", ( PyCFunction ) Matr_oldsetEmit, METH_VARARGS, - "(f) - Set Material's emitting light intensity - [0.0, 1.0]"}, - {"setAlpha", ( PyCFunction ) Matr_oldsetAlpha, METH_VARARGS, - "(f) - Set Material's alpha (transparency) - [0.0, 1.0]"}, - {"setRef", ( PyCFunction ) Matr_oldsetRef, METH_VARARGS, - "(f) - Set Material's reflectivity - [0.0, 1.0]"}, - {"setSpec", ( PyCFunction ) Matr_oldsetSpec, METH_VARARGS, - "(f) - Set Material's specularity - [0.0, 2.0]"}, - {"setSpecTransp", ( PyCFunction ) Matr_oldsetSpecTransp, METH_VARARGS, - "(f) - Set Material's specular transparency - [0.0, 1.0]"}, - {"setAdd", ( PyCFunction ) Matr_oldsetAdd, METH_VARARGS, - "(f) - Set Material's glow factor - [0.0, 1.0]"}, - {"setZOffset", ( PyCFunction ) Matr_oldsetZOffset, METH_VARARGS, - "(f) - Set Material's artificial offset - [0.0, 10.0]"}, - {"setHaloSize", ( PyCFunction ) Matr_oldsetHaloSize, METH_VARARGS, - "(f) - Set Material's halo size - [0.0, 100.0]"}, - {"setHaloSeed", ( PyCFunction ) Matr_oldsetHaloSeed, METH_VARARGS, - "(i) - Set Material's halo seed - [0, 255]"}, - {"setFlareSize", ( PyCFunction ) Matr_oldsetFlareSize, METH_VARARGS, - "(f) - Set Material's factor: (flare size)/(halo size) - [0.1, 25.0]"}, - {"setFlareSeed", ( PyCFunction ) Matr_oldsetFlareSeed, METH_VARARGS, - "(i) - Set Material's flare seed - [0, 255]"}, - {"setFlareBoost", ( PyCFunction ) Matr_oldsetFlareBoost, METH_VARARGS, - "(f) - Set Material's flare boost - [0.1, 10.0]"}, - {"setSubSize", ( PyCFunction ) Matr_oldsetSubSize, METH_VARARGS, - "(f) - Set Material's dimension of subflare," - " dots and circles - [0.1, 25.0]"}, - {"setHardness", ( PyCFunction ) Matr_oldsetHardness, METH_VARARGS, - "(i) - Set Material's hardness - [1, 255 (127 if halo mode is ON)]"}, - {"setNFlares", ( PyCFunction ) Matr_oldsetNFlares, METH_VARARGS, - "(i) - Set Material's number of flares in halo - [1, 32]"}, - {"setNStars", ( PyCFunction ) Matr_oldsetNStars, METH_VARARGS, - "(i) - Set Material's number of stars in halo - [3, 50]"}, - {"setNLines", ( PyCFunction ) Matr_oldsetNLines, METH_VARARGS, - "(i) - Set Material's number of lines in halo - [0, 250]"}, - {"setNRings", ( PyCFunction ) Matr_oldsetNRings, METH_VARARGS, - "(i) - Set Material's number of rings in halo - [0, 24]"}, - {"setRayMirr", ( PyCFunction ) Matr_oldsetRayMirr, METH_VARARGS, - "(f) - Set amount mirror - [0.0, 1.0]"}, - {"setMirrDepth", ( PyCFunction ) Matr_oldsetMirrDepth, METH_VARARGS, - "(i) - Set amount inter-reflections - [0, 10]"}, - {"setFresnelMirr", ( PyCFunction ) Matr_oldsetFresnelMirr, METH_VARARGS, - "(f) - Set fresnel power for mirror - [0.0, 5.0]"}, - {"setFresnelMirrFac", ( PyCFunction ) Matr_oldsetFresnelMirrFac, METH_VARARGS, - "(f) - Set blend fac for mirror fresnel - [1.0, 5.0]"}, - {"setFilter", ( PyCFunction ) Matr_oldsetFilter, METH_VARARGS, - "(f) - Set the amount of filtering when transparent raytrace is enabled"}, - {"setTranslucency", ( PyCFunction ) Matr_oldsetTranslucency, METH_VARARGS, - "(f) - Set the Translucency, the amount of diffuse shading of the back side"}, - {"setIOR", ( PyCFunction ) Matr_oldsetIOR, METH_VARARGS, - "(f) - Set IOR - [1.0, 3.0]"}, - {"setTransDepth", ( PyCFunction ) Matr_oldsetTransDepth, METH_VARARGS, - "(i) - Set amount inter-refractions - [0, 10]"}, - {"setFresnelTrans", ( PyCFunction ) Matr_oldsetFresnelTrans, METH_VARARGS, - "(f) - Set fresnel power for refractions - [0.0, 5.0]"}, - {"setFresnelTransFac", ( PyCFunction ) Matr_oldsetFresnelTransFac, METH_VARARGS, - "(f) - Set fresnel power for refractions factor- [0.0, 5.0]"}, - {"setTexture", ( PyCFunction ) Material_setTexture, METH_VARARGS, - "(n,tex,texco=0,mapto=0) - Set numbered texture to tex"}, - {"clearTexture", ( PyCFunction ) Material_clearTexture, METH_O, - "(n) - Remove texture from numbered slot"}, - {"getScriptLinks", ( PyCFunction ) Material_getScriptLinks, METH_O, - "(eventname) - Get a list of this material's scriptlinks (Text names) " - "of the given type\n" - "(eventname) - string: FrameChanged, Redraw or Render."}, - {"addScriptLink", ( PyCFunction ) Material_addScriptLink, METH_VARARGS, - "(text, evt) - Add a new material scriptlink.\n" - "(text) - string: an existing Blender Text name;\n" - "(evt) string: FrameChanged, Redraw or Render."}, - {"clearScriptLinks", ( PyCFunction ) Material_clearScriptLinks, METH_VARARGS, - "() - Delete all scriptlinks from this material.\n" - "([s1<,s2,s3...>]) - Delete specified scriptlinks from this material."}, - {"__copy__", ( PyCFunction ) Material_copy, METH_NOARGS, - "() - Return a copy of the material."}, - {"copy", ( PyCFunction ) Material_copy, METH_NOARGS, - "() - Return a copy of the material."}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ - -static PyGetSetDef BPy_Material_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"add", - (getter)Material_getAdd, (setter)Material_setAdd, - "Strength of the add effect", - NULL}, - {"alpha", - (getter)Material_getAlpha, (setter)Material_setAlpha, - "Alpha setting ", - NULL}, - {"shadAlpha", - (getter)Material_getShadAlpha, (setter)Material_setShadAlpha, - "Shadow Alpha setting", - NULL}, - {"amb", - (getter)Material_getAmb, (setter)Material_setAmb, - "Amount of global ambient color material receives", - NULL}, - {"diffuseDarkness", - (getter)Material_getDiffuseDarkness, (setter)Material_setDiffuseDarkness, - "Material's diffuse darkness (\"Minnaert\" diffuse shader only)", - NULL}, - {"diffuseShader", - (getter)Material_getDiffuseShader, (setter)Material_setDiffuseShader, - "Diffuse shader type", - NULL}, - {"diffuseSize", - (getter)Material_getDiffuseSize, (setter)Material_setDiffuseSize, - "Material's diffuse area size (\"Toon\" diffuse shader only)", - NULL}, - {"diffuseSmooth", - (getter)Material_getDiffuseSmooth, (setter)Material_setDiffuseSmooth, - "Material's diffuse area smoothing (\"Toon\" diffuse shader only)", - NULL}, - {"emit", - (getter)Material_getEmit, (setter)Material_setEmit, - "Amount of light the material emits", - NULL}, - {"filter", - (getter)Material_getFilter, (setter)Material_setFilter, - "Amount of filtering when transparent raytrace is enabled", - NULL}, - {"flareBoost", - (getter)Material_getFlareBoost, (setter)Material_setFlareBoost, - "Flare's extra strength", - NULL}, - {"flareSeed", - (getter)Material_getFlareSeed, (setter)Material_setFlareSeed, - "Offset in the flare seed table", - NULL}, - {"flareSize", - (getter)Material_getFlareSize, (setter)Material_setFlareSize, - "Ratio of flare size to halo size", - NULL}, - {"fresnelDepth", - (getter)Material_getFresnelMirr, (setter)Material_setFresnelMirr, - "Power of Fresnel for mirror reflection", - NULL}, - {"fresnelDepthFac", - (getter)Material_getFresnelMirrFac, (setter)Material_setFresnelMirrFac, - "Blending factor for Fresnel mirror", - NULL}, - {"fresnelTrans", - (getter)Material_getFresnelTrans, (setter)Material_setFresnelTrans, - "Power of Fresnel for transparency", - NULL}, - {"fresnelTransFac", - (getter)Material_getFresnelTransFac, (setter)Material_setFresnelTransFac, - "Blending factor for Fresnel transparency", - NULL}, - {"rbFriction", - (getter)Material_getRigidBodyFriction, (setter)Material_setRigidBodyFriction, - "Rigid Body Friction coefficient", - NULL}, - {"rbRestitution", - (getter)Material_getRigidBodyRestitution, (setter)Material_setRigidBodyRestitution, - "Rigid Body Restitution coefficient", - NULL}, - - {"haloSeed", - (getter)Material_getHaloSeed, (setter)Material_setHaloSeed, - "Randomizes halo ring dimension and line location", - NULL}, - {"haloSize", - (getter)Material_getHaloSize, (setter)Material_setHaloSize, - "Dimension of the halo", - NULL}, - {"hard", - (getter)Material_getHardness, (setter)Material_setHardness, - "Specularity hardness", - NULL}, - {"IOR", - (getter)Material_getIOR, (setter)Material_setIOR, - "Angular index of refraction for raytrace", - NULL}, - {"ipo", - (getter)Material_getIpo, (setter)Material_setIpo, - "Material Ipo data", - NULL}, - {"mirCol", - (getter)Material_getMirCol, (setter)Material_setMirCol, - "Mirror RGB color triplet", - NULL}, - {"mirR", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Mirror color red component", - (void *) EXPP_MAT_COMP_MIRR }, - {"mirG", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Mirror color green component", - (void *) EXPP_MAT_COMP_MIRG }, - {"mirB", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Mirror color blue component", - (void *) EXPP_MAT_COMP_MIRB }, - {"sssCol", - (getter)Material_getSssCol, (setter)Material_setSssCol, - "Sss RGB color triplet", - NULL}, - {"sssR", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "SSS color red component", - (void *) EXPP_MAT_COMP_SSSR }, - {"sssG", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "SSS color green component", - (void *) EXPP_MAT_COMP_SSSG }, - {"sssB", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "SSS color blue component", - (void *) EXPP_MAT_COMP_SSSB }, - {"mode", - (getter)Material_getMode, (setter)Material_setMode, - "Material mode bitmask", - NULL}, - {"nFlares", - (getter)Material_getNFlares, (setter)Material_setNFlares, - "Number of subflares with halo", - NULL}, - {"nLines", - (getter)Material_getNLines, (setter)Material_setNLines, - "Number of star-shaped lines with halo", - NULL}, - {"nRings", - (getter)Material_getNRings, (setter)Material_setNRings, - "Number of rings with halo", - NULL}, - {"nStars", - (getter)Material_getNStars, (setter)Material_setNStars, - "Number of star points with halo", - NULL}, - {"rayMirr", - (getter)Material_getRayMirr, (setter)Material_setRayMirr, - "Mirror reflection amount for raytrace", - NULL}, - {"rayMirrDepth", - (getter)Material_getMirrDepth, (setter)Material_setMirrDepth, - "Amount of raytrace inter-reflections", - NULL}, - {"ref", - (getter)Material_getRef, (setter)Material_setRef, - "Amount of reflections (for shader)", - NULL}, - {"refracIndex", - (getter)Material_getRefracIndex, (setter)Material_setRefracIndex, - "Material's Index of Refraction (applies to the \"Blinn\" Specular Shader only", - NULL}, - {"rgbCol", - (getter)Material_getRGBCol, (setter)Material_setRGBCol, - "Diffuse RGB color triplet", - NULL}, - {"rms", - (getter)Material_getRms, (setter)Material_setRms, - "Material's surface slope standard deviation (\"WardIso\" specular shader only)", - NULL}, - {"roughness", - (getter)Material_getRoughness, (setter)Material_setRoughness, - "Material's roughness (\"Oren Nayar\" diffuse shader only)", - NULL}, - {"spec", - (getter)Material_getSpec, (setter)Material_setSpec, - "Degree of specularity", - NULL}, - {"specCol", - (getter)Material_getSpecCol, (setter)Material_setSpecCol, - "Specular RGB color triplet", - NULL}, - {"specR", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Specular color red component", - (void *) EXPP_MAT_COMP_SPECR }, - {"specG", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Specular color green component", - (void *) EXPP_MAT_COMP_SPECG }, - {"specB", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Specular color blue component", - (void *) EXPP_MAT_COMP_SPECB }, - {"specTransp", - (getter)Material_getSpecTransp, (setter)Material_setSpecTransp, - "Makes specular areas opaque on transparent materials", - NULL}, - {"specShader", - (getter)Material_getSpecShader, (setter)Material_setSpecShader, - "Specular shader type", - NULL}, - {"specSize", - (getter)Material_getSpecSize, (setter)Material_setSpecSize, - "Material's specular area size (\"Toon\" specular shader only)", - NULL}, - {"specSmooth", - (getter)Material_getSpecSmooth, (setter)Material_setSpecSmooth, - "Sets the smoothness of specular toon area", - NULL}, - {"subSize", - (getter)Material_getSubSize, (setter)Material_setSubSize, - "Dimension of subflares, dots and circles", - NULL}, - {"transDepth", - (getter)Material_getTransDepth, (setter)Material_setTransDepth, - "Amount of refractions for raytrace", - NULL}, - {"translucency", - (getter)Material_getTranslucency, (setter)Material_setTranslucency, - "Amount of diffuse shading of the back side", - NULL}, - {"zOffset", - (getter)Material_getZOffset, (setter)Material_setZOffset, - "Artificial offset in the Z buffer (for Ztransp option)", - NULL}, - {"lightGroup", - (getter)Material_getLightGroup, (setter)Material_setLightGroup, - "Set the light group for this material", - NULL}, - {"R", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Diffuse color red component", - (void *) EXPP_MAT_COMP_R }, - {"G", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Diffuse color green component", - (void *) EXPP_MAT_COMP_G }, - {"B", - (getter)Material_getColorComponent, (setter)Material_setColorComponent, - "Diffuse color blue component", - (void *) EXPP_MAT_COMP_B }, - {"colorbandDiffuse", - (getter)Material_getColorband, (setter)Material_setColorband, - "The diffuse colorband for this material", - (void *) 0}, - {"colorbandSpecular", - (getter)Material_getColorband, (setter)Material_setColorband, - "The specular colorband for this material", - (void *) 1}, - - /* SSS settings */ - {"enableSSS", - (getter)Material_getSssEnable, (setter)Material_setSssEnable, - "if true, SSS will be rendered for this material", - NULL}, - {"sssScale", - (getter)Material_getSssScale, (setter)Material_setSssScale, - "object scale for sss", - NULL}, - {"sssRadiusRed", - (getter)Material_getSssRadius, (setter)Material_setSssRadius, - "Mean red scattering path length", - (void *) 0}, - {"sssRadiusGreen", - (getter)Material_getSssRadius, (setter)Material_setSssRadius, - "Mean red scattering path length", - (void *) 1}, - {"sssRadiusBlue", - (getter)Material_getSssRadius, (setter)Material_setSssRadius, - "Mean red scattering path length", - (void *) 0}, - {"sssIOR", - (getter)Material_getSssIOR, (setter)Material_setSssIOR, - "index of refraction", - NULL}, - {"sssError", - (getter)Material_getSssError, (setter)Material_setSssError, - "Error", - NULL}, - {"sssColorBlend", - (getter)Material_getSssColorBlend, (setter)Material_setSssColorBlend, - "Blend factor for SSS Colors", - NULL}, - {"sssTextureScatter", - (getter)Material_getSssTexScatter, (setter)Material_setSssTexScatter, - "Texture scattering factor", - NULL}, - {"sssFont", - (getter)Material_getSssFront, (setter)Material_setSssFront, - "Front scattering weight", - NULL}, - {"sssBack", - (getter)Material_getSssBack, (setter)Material_setSssBack, - "Back scattering weight", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Material_Type callback function prototypes: */ -/*****************************************************************************/ -static void Material_dealloc( BPy_Material * self ); -static int Material_compare( BPy_Material * a, BPy_Material * b); -static PyObject *Material_repr( BPy_Material * self ); - -/*****************************************************************************/ -/* Python Material_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Material_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Material", /* char *tp_name; */ - sizeof( BPy_Material ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) Material_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) Material_compare,/* cmpfunc tp_compare; */ - ( reprfunc ) Material_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Material_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Material_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 -}; - -/*****************************************************************************/ -/* Function: Material_dealloc */ -/* Description: This is a callback function for the BPy_Material type. It is */ -/* the destructor function. */ -/*****************************************************************************/ -static void Material_dealloc( BPy_Material * self ) -{ - Py_DECREF( self->col ); - Py_DECREF( self->amb ); - Py_DECREF( self->spec ); - Py_DECREF( self->mir ); - Py_DECREF( self->sss ); - PyObject_DEL( self ); -} - -/*****************************************************************************/ -/* Function: Material_CreatePyObject */ -/* Description: Create a new BPy_Material from an existing */ -/* Blender material structure. */ -/*****************************************************************************/ -PyObject *Material_CreatePyObject( struct Material *mat ) -{ - BPy_Material *pymat; - float *col[3], *amb[3], *spec[3], *mir[3], *sss[3]; - - pymat = ( BPy_Material * ) PyObject_NEW( BPy_Material, - &Material_Type ); - - if( !pymat ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Material object" ); - - pymat->material = mat; - - col[0] = &mat->r; - col[1] = &mat->g; - col[2] = &mat->b; - - amb[0] = &mat->ambr; - amb[1] = &mat->ambg; - amb[2] = &mat->ambb; - - spec[0] = &mat->specr; - spec[1] = &mat->specg; - spec[2] = &mat->specb; - - mir[0] = &mat->mirr; - mir[1] = &mat->mirg; - mir[2] = &mat->mirb; - - sss[0] = &mat->sss_col[0]; - sss[1] = &mat->sss_col[1]; - sss[2] = &mat->sss_col[2]; - - pymat->col = ( BPy_rgbTuple * ) rgbTuple_New( col ); - pymat->amb = ( BPy_rgbTuple * ) rgbTuple_New( amb ); - pymat->spec = ( BPy_rgbTuple * ) rgbTuple_New( spec ); - pymat->mir = ( BPy_rgbTuple * ) rgbTuple_New( mir ); - pymat->sss = ( BPy_rgbTuple * ) rgbTuple_New( sss ); - - return ( PyObject * ) pymat; -} - -/*****************************************************************************/ -/* Function: Material_FromPyObject */ -/* Description: This function returns the Blender material from the given */ -/* PyObject. */ -/*****************************************************************************/ -Material *Material_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Material * ) pyobj )->material; -} - -static PyObject *Material_getIpo( BPy_Material * self ) -{ - Ipo *ipo = self->material->ipo; - - if( !ipo ) - Py_RETURN_NONE; - - return Ipo_CreatePyObject( ipo ); -} - -static PyObject *Material_getMode( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->mode ); -} - -static PyObject *Material_getRGBCol( BPy_Material * self ) -{ - return rgbTuple_getCol( self->col ); -} - -/* -static PyObject *Material_getAmbCol(BPy_Material *self) -{ - return rgbTuple_getCol(self->amb); -} -*/ -static PyObject *Material_getSpecCol( BPy_Material * self ) -{ - return rgbTuple_getCol( self->spec ); -} - -static PyObject *Material_getMirCol( BPy_Material * self ) -{ - return rgbTuple_getCol( self->mir ); -} - -static PyObject *Material_getSssCol( BPy_Material * self ) -{ - return rgbTuple_getCol( self->sss ); -} - -static PyObject *Material_getSpecShader( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->spec_shader ); -} - -static PyObject *Material_getDiffuseShader( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->diff_shader ); -} - -static PyObject *Material_getRoughness( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->roughness ); -} - -static PyObject *Material_getSpecSize( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->param[2] ); -} - -static PyObject *Material_getDiffuseSize( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->param[0] ); -} - -static PyObject *Material_getSpecSmooth( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->param[3] ); -} - -static PyObject *Material_getDiffuseSmooth( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->param[1] ); -} - -static PyObject *Material_getDiffuseDarkness( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->darkness ); -} - -static PyObject *Material_getRefracIndex( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->refrac ); -} - -static PyObject *Material_getRms( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->rms ); -} - -static PyObject *Material_getAmb( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->amb ); -} - -static PyObject *Material_getEmit( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->emit ); -} - -static PyObject *Material_getAlpha( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->alpha ); -} - -static PyObject *Material_getShadAlpha( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->shad_alpha ); -} - -static PyObject *Material_getRef( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->ref ); -} - -static PyObject *Material_getSpec( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->spec ); -} - -static PyObject *Material_getSpecTransp( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->spectra ); -} - -static PyObject *Material_getAdd( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->add ); -} - -static PyObject *Material_getZOffset( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->zoffs ); -} - -static PyObject *Material_getLightGroup( BPy_Material * self ) -{ - return Group_CreatePyObject( self->material->group ); -} - -static PyObject *Material_getHaloSize( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->hasize ); -} - -static PyObject *Material_getFlareSize( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->flaresize ); -} - -static PyObject *Material_getFlareBoost( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->flareboost ); -} - -static PyObject *Material_getSubSize( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->subsize ); -} - -static PyObject *Material_getHaloSeed( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->seed1 ); -} - -static PyObject *Material_getFlareSeed( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->seed2 ); -} - -static PyObject *Material_getHardness( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->har ); -} - -static PyObject *Material_getNFlares( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->flarec ); -} - -static PyObject *Material_getNStars( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->starc ); -} - -static PyObject *Material_getNLines( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->linec ); -} - -static PyObject *Material_getNRings( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->ringc ); -} - -static PyObject *Material_getRayMirr( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->ray_mirror ); -} - -static PyObject *Material_getMirrDepth( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->ray_depth ); -} - -static PyObject *Material_getFresnelMirr( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->fresnel_mir ); -} - -static PyObject *Material_getFresnelMirrFac( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->fresnel_mir_i ); -} - -static PyObject *Material_getFilter( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->filter ); -} - -static PyObject *Material_getTranslucency( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->translucency ); -} - -static PyObject *Material_getIOR( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->ang ); -} - -static PyObject *Material_getTransDepth( BPy_Material * self ) -{ - return PyInt_FromLong( ( long ) self->material->ray_depth_tra ); -} - -static PyObject *Material_getFresnelTrans( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->fresnel_tra ); -} - -static PyObject *Material_getFresnelTransFac( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->fresnel_tra_i ); -} - -static PyObject* Material_getRigidBodyFriction( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->friction ); -} - -static PyObject* Material_getRigidBodyRestitution( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->reflect ); -} - -/* SSS */ -static PyObject* Material_getSssEnable( BPy_Material * self ) -{ - return EXPP_getBitfield( &self->material->sss_flag, MA_DIFF_SSS, 'h' ); -} - -static PyObject* Material_getSssScale( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->sss_scale ); -} - -static PyObject* Material_getSssRadius( BPy_Material * self, void * type ) -{ - return PyFloat_FromDouble( ( double ) (self->material->sss_radius[(int)type]) ); -} - -static PyObject* Material_getSssIOR( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->sss_ior); -} - -static PyObject* Material_getSssError( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->sss_error); -} - -static PyObject* Material_getSssColorBlend( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->sss_colfac); -} - -static PyObject* Material_getSssTexScatter( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->sss_texfac); -} - -static PyObject* Material_getSssFront( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->sss_front); -} - -static PyObject* Material_getSssBack( BPy_Material * self ) -{ - return PyFloat_FromDouble( ( double ) self->material->sss_back); -} - -static PyObject *Material_getTextures( BPy_Material * self ) -{ - int i; - struct MTex *mtex; - PyObject *t[MAX_MTEX]; - PyObject *tuple; - - /* build a texture list */ - for( i = 0; i < MAX_MTEX; ++i ) { - mtex = self->material->mtex[i]; - - if( mtex ) { - t[i] = MTex_CreatePyObject( mtex ); - } else { - Py_INCREF( Py_None ); - t[i] = Py_None; - } - } - - /* turn the array into a tuple */ - tuple = Py_BuildValue( "NNNNNNNNNN", t[0], t[1], t[2], t[3], - t[4], t[5], t[6], t[7], t[8], t[9] ); - if( !tuple ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "Material_getTextures: couldn't create PyTuple" ); - - return tuple; -} - -/* - * this should accept a Py_None argument and just delete the Ipo link - * (as Lamp_clearIpo() does) - */ - -static int Material_setIpo( BPy_Material * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->material->ipo, 0, 1, ID_IP, ID_MA); -} - - -/* - * Material_insertIpoKey( key ) - * inserts Material IPO key at current frame - */ - -static PyObject *Material_insertIpoKey( BPy_Material * self, PyObject * args ) -{ - int key = 0, map; - - if( !PyArg_ParseTuple( args, "i", &( key ) ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument" ) ); - - map = texchannel_to_adrcode(self->material->texact); - - if(key==IPOKEY_RGB || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_R, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_G, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_B, 0); - } - if(key==IPOKEY_ALPHA || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ALPHA, 0); - } - if(key==IPOKEY_HALOSIZE || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HASIZE, 0); - } - if(key==IPOKEY_MODE || key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE, 0); - } - if(key==IPOKEY_ALLCOLOR) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_R, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_G, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_B, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_REF, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_EMIT, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_AMB, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HARD, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_TRANSLU, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ADD, 0); - } - if(key==IPOKEY_ALLMIRROR) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_RAYM, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIR, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIRI, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRA, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRAI, 0); - } - if(key==IPOKEY_OFS || key==IPOKEY_ALLMAPPING) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_X, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Y, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Z, 0); - } - if(key==IPOKEY_SIZE || key==IPOKEY_ALLMAPPING) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_X, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Y, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Z, 0); - } - if(key==IPOKEY_ALLMAPPING) { - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_R, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_G, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_B, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DVAR, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_COLF, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_NORF, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_VARF, 0); - insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DISP, 0); - } - - allspace(REMAKEIPO, 0); - EXPP_allqueue(REDRAWIPO, 0); - EXPP_allqueue(REDRAWVIEW3D, 0); - EXPP_allqueue(REDRAWACTION, 0); - EXPP_allqueue(REDRAWNLA, 0); - - Py_RETURN_NONE; -} - -static int Material_setMode( BPy_Material * self, PyObject * value ) -{ - int param; - - if( !PyInt_Check( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%08x", MA_MODE_MASK ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - param = PyInt_AS_LONG ( value ); - - if ( ( param & MA_MODE_MASK ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - self->material->mode &= ( MA_RAMP_COL | MA_RAMP_SPEC ); - self->material->mode |= param & ~( MA_RAMP_COL | MA_RAMP_SPEC ); - - return 0; -} - -static int Material_setRGBCol( BPy_Material * self, PyObject * value ) -{ - return rgbTuple_setCol( self->col, value ); -} - -/* -static PyObject *Material_setAmbCol (BPy_Material *self, PyObject * value ) -{ - return rgbTuple_setCol(self->amb, value); -} -*/ - -static int Material_setSpecCol( BPy_Material * self, PyObject * value ) -{ - return rgbTuple_setCol( self->spec, value ); -} - -static int Material_setMirCol( BPy_Material * self, PyObject * value ) -{ - return rgbTuple_setCol( self->mir, value ); -} - -static int Material_setSssCol( BPy_Material * self, PyObject * value ) -{ - return rgbTuple_setCol( self->sss, value ); -} - -static int Material_setColorComponent( BPy_Material * self, PyObject * value, - void * closure ) -{ - float param; - - if( !PyNumber_Check ( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument in [0.0,1.0]" ); - - param = (float)PyFloat_AsDouble( value ); - param = EXPP_ClampFloat( param, EXPP_MAT_COL_MIN, EXPP_MAT_COL_MAX ); - - switch ( (int)closure ) { - case EXPP_MAT_COMP_R: - self->material->r = param; - return 0; - case EXPP_MAT_COMP_G: - self->material->g = param; - return 0; - case EXPP_MAT_COMP_B: - self->material->b = param; - return 0; - case EXPP_MAT_COMP_SPECR: - self->material->specr = param; - return 0; - case EXPP_MAT_COMP_SPECG: - self->material->specg = param; - return 0; - case EXPP_MAT_COMP_SPECB: - self->material->specb = param; - return 0; - case EXPP_MAT_COMP_MIRR: - self->material->mirr = param; - return 0; - case EXPP_MAT_COMP_MIRG: - self->material->mirg = param; - return 0; - case EXPP_MAT_COMP_MIRB: - self->material->mirb = param; - return 0; - case EXPP_MAT_COMP_SSSR: - self->material->sss_col[0] = param; - return 0; - case EXPP_MAT_COMP_SSSG: - self->material->sss_col[1] = param; - return 0; - case EXPP_MAT_COMP_SSSB: - self->material->sss_col[2] = param; - return 0; - } - return EXPP_ReturnIntError( PyExc_RuntimeError, - "unknown color component specified" ); -} - -/*#define setFloatWrapper(val, min, max) {return EXPP_setFloatClamped ( value, &self->material->#val, #min, #max}*/ - -static int Material_setAmb( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->amb, - EXPP_MAT_AMB_MIN, - EXPP_MAT_AMB_MAX ); -} - -static int Material_setEmit( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->emit, - EXPP_MAT_EMIT_MIN, - EXPP_MAT_EMIT_MAX ); -} - -static int Material_setSpecTransp( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->spectra, - EXPP_MAT_SPECTRA_MIN, - EXPP_MAT_SPECTRA_MAX ); -} - -static int Material_setAlpha( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->alpha, - EXPP_MAT_ALPHA_MIN, - EXPP_MAT_ALPHA_MAX ); -} - -static int Material_setShadAlpha( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->shad_alpha, - EXPP_MAT_ALPHA_MIN, - EXPP_MAT_ALPHA_MAX ); -} - -static int Material_setRef( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->ref, - EXPP_MAT_REF_MIN, - EXPP_MAT_REF_MAX ); -} - -static int Material_setSpec( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->spec, - EXPP_MAT_SPEC_MIN, - EXPP_MAT_SPEC_MAX ); -} - -static int Material_setZOffset( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->zoffs, - EXPP_MAT_ZOFFS_MIN, - EXPP_MAT_ZOFFS_MAX ); -} - -static int Material_setLightGroup( BPy_Material * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->material->group, NULL, 1, ID_GR, 0); -} - -static int Material_setAdd( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->add, - EXPP_MAT_ADD_MIN, - EXPP_MAT_ADD_MAX ); -} - -static int Material_setHaloSize( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->hasize, - EXPP_MAT_HALOSIZE_MIN, - EXPP_MAT_HALOSIZE_MAX ); -} - -static int Material_setFlareSize( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->flaresize, - EXPP_MAT_FLARESIZE_MIN, - EXPP_MAT_FLARESIZE_MAX ); -} - -static int Material_setFlareBoost( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->flareboost, - EXPP_MAT_FLAREBOOST_MIN, - EXPP_MAT_FLAREBOOST_MAX ); -} - -static int Material_setSubSize( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->subsize, - EXPP_MAT_SUBSIZE_MIN, - EXPP_MAT_SUBSIZE_MAX ); -} - -static int Material_setHaloSeed( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->seed1, - EXPP_MAT_HALOSEED_MIN, - EXPP_MAT_HALOSEED_MAX, 'b' ); -} - -static int Material_setFlareSeed( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->seed2, - EXPP_MAT_FLARESEED_MIN, - EXPP_MAT_FLARESEED_MAX, 'b' ); -} - -static int Material_setHardness( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->har, - EXPP_MAT_HARD_MIN, - EXPP_MAT_HARD_MAX, 'h' ); -} - -static int Material_setNFlares( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->flarec, - EXPP_MAT_NFLARES_MIN, - EXPP_MAT_NFLARES_MAX, 'h' ); -} - -static int Material_setNStars( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->starc, - EXPP_MAT_NSTARS_MIN, - EXPP_MAT_NSTARS_MAX, 'h' ); -} - -static int Material_setNLines( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->linec, - EXPP_MAT_NLINES_MIN, - EXPP_MAT_NLINES_MAX, 'h' ); -} - -static int Material_setNRings( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->ringc, - EXPP_MAT_NRINGS_MIN, - EXPP_MAT_NRINGS_MAX, 'h' ); -} - -static int Material_setRayMirr( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->ray_mirror, - EXPP_MAT_RAYMIRR_MIN, - EXPP_MAT_RAYMIRR_MAX ); -} - -static int Material_setMirrDepth( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->ray_depth, - EXPP_MAT_MIRRDEPTH_MIN, - EXPP_MAT_MIRRDEPTH_MAX, 'h' ); -} - -static int Material_setFresnelMirr( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->fresnel_mir, - EXPP_MAT_FRESNELMIRR_MIN, - EXPP_MAT_FRESNELMIRR_MAX ); -} - -static int Material_setFresnelMirrFac( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->fresnel_mir_i, - EXPP_MAT_FRESNELMIRRFAC_MIN, - EXPP_MAT_FRESNELMIRRFAC_MAX ); -} - -static int Material_setIOR( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->ang, - EXPP_MAT_IOR_MIN, - EXPP_MAT_IOR_MAX ); -} - -static int Material_setTransDepth( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->material->ray_depth_tra, - EXPP_MAT_TRANSDEPTH_MIN, - EXPP_MAT_TRANSDEPTH_MAX, 'h' ); -} - -static int Material_setFresnelTrans( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->fresnel_tra, - EXPP_MAT_FRESNELTRANS_MIN, - EXPP_MAT_FRESNELTRANS_MAX ); -} - -static int Material_setFresnelTransFac( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->fresnel_tra_i, - EXPP_MAT_FRESNELTRANSFAC_MIN, - EXPP_MAT_FRESNELTRANSFAC_MAX ); -} - -static int Material_setRigidBodyFriction( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->friction, - 0.f, - 100.f ); -} - -static int Material_setRigidBodyRestitution( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->reflect, - 0.f, - 1.f ); -} - - - - -static int Material_setSpecShader( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueRange( value, &self->material->spec_shader, - MA_SPEC_COOKTORR, - MA_SPEC_WARDISO, 'h' ); -} - -static int Material_setDiffuseShader( BPy_Material * self, PyObject * value ) -{ - return EXPP_setIValueRange( value, &self->material->diff_shader, - MA_DIFF_LAMBERT, - MA_DIFF_MINNAERT, 'h' ); -} - -static int Material_setRoughness( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->roughness, - EXPP_MAT_ROUGHNESS_MIN, - EXPP_MAT_ROUGHNESS_MAX ); -} - -static int Material_setSpecSize( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->param[2], - EXPP_MAT_SPECSIZE_MIN, - EXPP_MAT_SPECSIZE_MAX ); -} - -static int Material_setDiffuseSize( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->param[0], - EXPP_MAT_DIFFUSESIZE_MIN, - EXPP_MAT_DIFFUSESIZE_MAX ); -} - -static int Material_setSpecSmooth( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->param[3], - EXPP_MAT_SPECSMOOTH_MIN, - EXPP_MAT_SPECSMOOTH_MAX ); -} - -static int Material_setDiffuseSmooth( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->param[1], - EXPP_MAT_DIFFUSESMOOTH_MIN, - EXPP_MAT_DIFFUSESMOOTH_MAX ); -} - -static int Material_setDiffuseDarkness( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->darkness, - EXPP_MAT_DIFFUSE_DARKNESS_MIN, - EXPP_MAT_DIFFUSE_DARKNESS_MAX ); -} - -static int Material_setRefracIndex( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->refrac, - EXPP_MAT_REFRACINDEX_MIN, - EXPP_MAT_REFRACINDEX_MAX ); -} - -static int Material_setRms( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->rms, - EXPP_MAT_RMS_MIN, - EXPP_MAT_RMS_MAX ); -} - -static int Material_setFilter( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->filter, - EXPP_MAT_FILTER_MIN, - EXPP_MAT_FILTER_MAX ); -} - -static int Material_setTranslucency( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->translucency, - EXPP_MAT_TRANSLUCENCY_MIN, - EXPP_MAT_TRANSLUCENCY_MAX ); -} - -/* SSS */ -static int Material_setSssEnable( BPy_Material * self, PyObject * value ) -{ - return EXPP_setBitfield( value, &self->material->sss_flag, MA_DIFF_SSS, 'h' ); -} - -static int Material_setSssScale( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_scale, - EXPP_MAT_SSS_SCALE_MIN, - EXPP_MAT_SSS_SCALE_MAX); -} - -static int Material_setSssRadius( BPy_Material * self, PyObject * value, void *type ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_radius[(int)type], - EXPP_MAT_SSS_RADIUS_MIN, - EXPP_MAT_SSS_RADIUS_MAX); -} - -static int Material_setSssIOR( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_ior, - EXPP_MAT_SSS_IOR_MIN, - EXPP_MAT_SSS_IOR_MAX); -} - -static int Material_setSssError( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_error, - EXPP_MAT_SSS_IOR_MIN, - EXPP_MAT_SSS_IOR_MAX); -} - -static int Material_setSssColorBlend( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_colfac, - 0.0, - 1.0); -} - -static int Material_setSssTexScatter( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_texfac, - 0.0, - 1.0); -} - -static int Material_setSssFront( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_front, - EXPP_MAT_SSS_FRONT_MIN, - EXPP_MAT_SSS_FRONT_MAX); -} - -static int Material_setSssBack( BPy_Material * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->material->sss_back, - EXPP_MAT_SSS_BACK_MIN, - EXPP_MAT_SSS_BACK_MAX); -} - - - - -static PyObject *Material_setTexture( BPy_Material * self, PyObject * args ) -{ - int texnum; - PyObject *pytex; - Tex *bltex; - int texco = TEXCO_ORCO, mapto = MAP_COL; - - if( !PyArg_ParseTuple( args, "iO!|ii", &texnum, &Texture_Type, &pytex, - &texco, &mapto ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int in [0,9] and Texture" ); - if( ( texnum < 0 ) || ( texnum >= MAX_MTEX ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int in [0,9] and Texture" ); - - bltex = Texture_FromPyObject( pytex ); - - if( !self->material->mtex[texnum] ) { - /* there isn't an mtex for this slot so we need to make one */ - self->material->mtex[texnum] = add_mtex( ); - } else { - /* we already had a texture here so deal with the old one first */ - self->material->mtex[texnum]->tex->id.us--; - } - - self->material->mtex[texnum]->tex = bltex; - id_us_plus( &bltex->id ); - self->material->mtex[texnum]->texco = (short)texco; - self->material->mtex[texnum]->mapto = (short)mapto; - - Py_RETURN_NONE; -} - -static PyObject *Material_clearTexture( BPy_Material * self, PyObject * value ) -{ - int texnum = (int)PyInt_AsLong(value); - struct MTex *mtex; - /* non ints will be -1 */ - if( ( texnum < 0 ) || ( texnum >= MAX_MTEX ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int in [0,9]" ); - - mtex = self->material->mtex[texnum]; - if( mtex ) { - if( mtex->tex ) - mtex->tex->id.us--; - MEM_freeN( mtex ); - self->material->mtex[texnum] = NULL; - } - - Py_RETURN_NONE; -} - -/* mat.addScriptLink */ -static PyObject *Material_addScriptLink( BPy_Material * self, PyObject * args ) -{ - Material *mat = self->material; - ScriptLink *slink = NULL; - - slink = &( mat )->scriptlink; - - return EXPP_addScriptLink( slink, args, 0 ); -} - -/* mat.clearScriptLinks */ -static PyObject *Material_clearScriptLinks(BPy_Material *self, PyObject *args ) -{ - Material *mat = self->material; - ScriptLink *slink = NULL; - - slink = &( mat )->scriptlink; - - return EXPP_clearScriptLinks( slink, args ); -} - -/* mat.getScriptLinks */ -static PyObject *Material_getScriptLinks( BPy_Material * self, - PyObject * value ) -{ - Material *mat = self->material; - ScriptLink *slink = NULL; - PyObject *ret = NULL; - - slink = &( mat )->scriptlink; - - /* can't this just return? EXP_getScriptLinks() returns a PyObject* - * or NULL anyway */ - - ret = EXPP_getScriptLinks( slink, value, 0 ); - - if( ret ) - return ret; - else - return NULL; -} - -/* mat.__copy__ */ -static PyObject *Material_copy( BPy_Material * self ) -{ - BPy_Material *pymat; /* for Material Data object wrapper in Python */ - Material *blmat; /* for actual Material Data we create in Blender */ - - blmat = copy_material( self->material ); /* first copy the Material Data in Blender */ - - if( blmat ) /* now create the wrapper obj in Python */ - pymat = ( BPy_Material * ) Material_CreatePyObject( blmat ); - else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Material Data in Blender" ) ); - - blmat->id.us = 0; /* was incref'ed by add_material() above */ - - if( pymat == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Material Data object" ) ); - - return ( PyObject * ) pymat; -} - -/* mat_a==mat_b or mat_a!=mat_b*/ -static int Material_compare( BPy_Material * a, BPy_Material * b ) -{ - return ( a->material == b->material) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Material_repr */ -/* Description: This is a callback function for the BPy_Material type. It */ -/* builds a meaninful string to represent material objects. */ -/*****************************************************************************/ -static PyObject *Material_repr( BPy_Material * self ) -{ - return PyString_FromFormat( "[Material \"%s\"]", - self->material->id.name + 2 ); -} - -/*****************************************************************************/ -/* These functions are used here and in in Texture.c */ -/*****************************************************************************/ -PyObject *EXPP_PyList_fromColorband( ColorBand *coba ) -{ - short i; - PyObject *cbls; - PyObject *colls; - - if (!coba) - return PyList_New( 0 ); - - cbls = PyList_New( coba->tot ); - - for (i=0; i < coba->tot; i++) { - colls = PyList_New( 5 ); - PyList_SET_ITEM( colls, 0, PyFloat_FromDouble(coba->data[i].r) ); - PyList_SET_ITEM( colls, 1, PyFloat_FromDouble(coba->data[i].g) ); - PyList_SET_ITEM( colls, 2, PyFloat_FromDouble(coba->data[i].b) ); - PyList_SET_ITEM( colls, 3, PyFloat_FromDouble(coba->data[i].a) ); - PyList_SET_ITEM( colls, 4, PyFloat_FromDouble(coba->data[i].pos) ); - PyList_SET_ITEM(cbls, i, colls); - } - return cbls; -} - -/* make sure you coba is not none before calling this */ -int EXPP_Colorband_fromPyList( ColorBand **coba, PyObject * value ) -{ - short totcol, i; - PyObject *colseq; - PyObject *pyflt; - float f; - - if ( !PySequence_Check( value ) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "Colorband must be a sequence" ) ); - - totcol = PySequence_Size(value); - if ( totcol > 31) - return ( EXPP_ReturnIntError( PyExc_ValueError, - "Colorband must be between 1 and 31 in length" ) ); - - if (totcol==0) { - MEM_freeN(*coba); - *coba = NULL; - return 0; - } - - if (!*coba) - *coba = MEM_callocN( sizeof(ColorBand), "colorband"); - - for (i=0; itot = totcol; - for (i=0; idata[i].r = f; - Py_DECREF ( pyflt ); - - pyflt = PySequence_GetItem( colseq, 1 ); - f = (float)PyFloat_AsDouble( pyflt ); - CLAMP(f, 0.0, 1.0); - (*coba)->data[i].g = f; - Py_DECREF ( pyflt ); - - pyflt = PySequence_GetItem( colseq, 2 ); - f = (float)PyFloat_AsDouble( pyflt ); - CLAMP(f, 0.0, 1.0); - (*coba)->data[i].b = f; - Py_DECREF ( pyflt ); - - pyflt = PySequence_GetItem( colseq, 3 ); - f = (float)PyFloat_AsDouble( pyflt ); - CLAMP(f, 0.0, 1.0); - (*coba)->data[i].a = f; - Py_DECREF ( pyflt ); - - pyflt = PySequence_GetItem( colseq, 4 ); - f = (float)PyFloat_AsDouble( pyflt ); - CLAMP(f, 0.0, 1.0); - (*coba)->data[i].pos = f; - Py_DECREF ( pyflt ); - - Py_DECREF ( colseq ); - } - return 0; -} - - -/*****************************************************************************/ -/* These functions are used in NMesh.c and Object.c */ -/*****************************************************************************/ -PyObject *EXPP_PyList_fromMaterialList( Material ** matlist, int len, int all ) -{ - PyObject *list; - int i; - - list = PyList_New( 0 ); - if( !matlist ) - return list; - - for( i = 0; i < len; i++ ) { - Material *mat = matlist[i]; - PyObject *ob; - - if( mat ) { - ob = Material_CreatePyObject( mat ); - PyList_Append( list, ob ); - Py_DECREF( ob ); /* because Append increfs */ - } else if( all ) { /* return NULL mats (empty slots) as Py_None */ - PyList_Append( list, Py_None ); - } - } - - return list; -} - -Material **EXPP_newMaterialList_fromPyList( PyObject * list ) -{ - int i, len; - BPy_Material *pymat = 0; - Material *mat; - Material **matlist; - - len = PySequence_Length( list ); - if( len > 16 ) - len = 16; - else if( len <= 0 ) - return NULL; - - matlist = EXPP_newMaterialList( len ); - - for( i = 0; i < len; i++ ) { - - pymat = ( BPy_Material * ) PySequence_GetItem( list, i ); - - if( BPy_Material_Check( ( PyObject * ) pymat ) ) { - mat = pymat->material; - matlist[i] = mat; - } else if( ( PyObject * ) pymat == Py_None ) { - matlist[i] = NULL; - } else { /* error; illegal type in material list */ - Py_DECREF( pymat ); - MEM_freeN( matlist ); - return NULL; - } - - Py_DECREF( pymat ); - } - - return matlist; -} - -Material **EXPP_newMaterialList( int len ) -{ - Material **matlist = - ( Material ** ) MEM_mallocN( len * sizeof( Material * ), - "MaterialList" ); - - return matlist; -} - -int EXPP_releaseMaterialList( Material ** matlist, int len ) -{ - int i; - Material *mat; - - if( ( len < 0 ) || ( len > MAXMAT ) ) { - printf( "illegal matindex!\n" ); - return 0; - } - - for( i = 0; i < len; i++ ) { - mat = matlist[i]; - if( mat ) { - if( ( ( ID * ) mat )->us > 0 ) - ( ( ID * ) mat )->us--; - else - printf( "FATAL: material usage=0: %s", - ( ( ID * ) mat )->name ); - } - } - MEM_freeN( matlist ); - - return 1; -} - -/** expands pointer array of length 'oldsize' to length 'newsize'. - * A pointer to the (void *) array must be passed as first argument - * The array pointer content can be NULL, in this case a new array of length - * 'newsize' is created. - */ - -static int expandPtrArray( void **p, int oldsize, int newsize ) -{ - void *newarray; - - if( newsize < oldsize ) { - return 0; - } - newarray = MEM_callocN( sizeof( void * ) * newsize, "PtrArray" ); - if( *p ) { - memcpy( newarray, *p, sizeof( void * ) * oldsize ); - MEM_freeN( *p ); - } - *p = newarray; - return 1; -} - -int EXPP_synchronizeMaterialLists( Object * object ) -{ - Material ***p_dataMaterials = give_matarar( object ); - short *nmaterials = give_totcolp( object ); - int result = 0; - - if( object->totcol > *nmaterials ) { - /* More object mats than data mats */ - result = expandPtrArray( ( void * ) p_dataMaterials, - *nmaterials, object->totcol ); - *nmaterials = object->totcol; - } else { - if( object->totcol < *nmaterials ) { - /* More data mats than object mats */ - result = expandPtrArray( ( void * ) &object->mat, - object->totcol, *nmaterials ); - object->totcol = (char)*nmaterials; - } - } /* else no synchronization needed, they are of equal length */ - - return result; /* 1 if changed, 0 otherwise */ -} - -void EXPP_incr_mats_us( Material ** matlist, int len ) -{ - int i; - Material *mat; - - if( len <= 0 ) - return; - - for( i = 0; i < len; i++ ) { - mat = matlist[i]; - if( mat ) - mat->id.us++; - } - - return; -} - -static PyObject *Material_getColorComponent( BPy_Material * self, - void * closure ) -{ - switch ( (int)closure ) { - case EXPP_MAT_COMP_R: - return PyFloat_FromDouble( ( double ) self->material->r ); - case EXPP_MAT_COMP_G: - return PyFloat_FromDouble( ( double ) self->material->g ); - case EXPP_MAT_COMP_B: - return PyFloat_FromDouble( ( double ) self->material->b ); - case EXPP_MAT_COMP_SPECR: - return PyFloat_FromDouble( ( double ) self->material->specr ); - case EXPP_MAT_COMP_SPECG: - return PyFloat_FromDouble( ( double ) self->material->specg ); - case EXPP_MAT_COMP_SPECB: - return PyFloat_FromDouble( ( double ) self->material->specb ); - case EXPP_MAT_COMP_MIRR: - return PyFloat_FromDouble( ( double ) self->material->mirr ); - case EXPP_MAT_COMP_MIRG: - return PyFloat_FromDouble( ( double ) self->material->mirg ); - case EXPP_MAT_COMP_MIRB: - return PyFloat_FromDouble( ( double ) self->material->mirb ); - case EXPP_MAT_COMP_SSSR: - return PyFloat_FromDouble( ( double ) self->material->sss_col[0] ); - case EXPP_MAT_COMP_SSSG: - return PyFloat_FromDouble( ( double ) self->material->sss_col[1] ); - case EXPP_MAT_COMP_SSSB: - return PyFloat_FromDouble( ( double ) self->material->sss_col[2] ); - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unknown color component specified" ); - } -} - -static PyObject *Material_getColorband( BPy_Material * self, void * type) -{ - switch( (long)type ) { - case 0: /* these are backwards, but that how it works */ - return EXPP_PyList_fromColorband( self->material->ramp_col ); - case 1: - return EXPP_PyList_fromColorband( self->material->ramp_spec ); - } - Py_RETURN_NONE; -} - -int Material_setColorband( BPy_Material * self, PyObject * value, void * type) -{ - switch( (long)type ) { - case 0: /* these are backwards, but that how it works */ - return EXPP_Colorband_fromPyList( &self->material->ramp_col, value ); - case 1: - return EXPP_Colorband_fromPyList( &self->material->ramp_spec, value ); - } - return 0; -} - -/* #####DEPRECATED###### */ - -static PyObject *Matr_oldsetAdd( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setAdd ); -} - -static PyObject *Matr_oldsetAlpha( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setAlpha ); -} - -static PyObject *Matr_oldsetAmb( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setAmb ); -} - -static PyObject *Matr_oldsetDiffuseDarkness( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setDiffuseDarkness ); -} - -static PyObject *Matr_oldsetDiffuseShader( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setDiffuseShader ); -} - -static PyObject *Matr_oldsetDiffuseSize( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setDiffuseSize ); -} - -static PyObject *Matr_oldsetDiffuseSmooth( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setDiffuseSmooth ); -} - -static PyObject *Matr_oldsetEmit( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setEmit ); -} - -static PyObject *Matr_oldsetFilter( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFilter ); -} - -static PyObject *Matr_oldsetFlareBoost( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFlareBoost ); -} - -static PyObject *Matr_oldsetFlareSeed( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFlareSeed ); -} - -static PyObject *Matr_oldsetFlareSize( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFlareSize ); -} - -static PyObject *Matr_oldsetFresnelMirr( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFresnelMirr ); -} - -static PyObject *Matr_oldsetFresnelMirrFac( BPy_Material * self, - PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFresnelMirrFac ); -} - -static PyObject *Matr_oldsetFresnelTrans( BPy_Material * self, - PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFresnelTrans ); -} - -static PyObject *Matr_oldsetFresnelTransFac( BPy_Material * self, - PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setFresnelTransFac ); -} - -static PyObject *Matr_oldsetHaloSeed( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setHaloSeed ); -} - -static PyObject *Matr_oldsetHaloSize( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setHaloSize ); -} - -static PyObject *Matr_oldsetHardness( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setHardness ); -} - -static PyObject *Matr_oldsetIOR( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setIOR ); -} - -static PyObject *Matr_oldsetNFlares( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setNFlares ); -} - -static PyObject *Matr_oldsetNLines( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setNLines ); -} - -static PyObject *Matr_oldsetNRings( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setNRings ); -} - -static PyObject *Matr_oldsetNStars( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setNStars ); -} - -static PyObject *Matr_oldsetRayMirr( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setRayMirr ); -} - -static PyObject *Matr_oldsetRoughness( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setRoughness ); -} - -static PyObject *Matr_oldsetMirrDepth( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setMirrDepth ); -} - -static PyObject *Matr_oldsetRef( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setRef ); -} - -static PyObject *Matr_oldsetRefracIndex( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setRefracIndex ); -} - -static PyObject *Matr_oldsetRms( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setRms ); -} - -static PyObject *Matr_oldsetSpec( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setSpec ); -} - -static PyObject *Matr_oldsetSpecShader( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setSpecShader ); -} - -static PyObject *Matr_oldsetSpecSize( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setSpecSize ); -} - -static PyObject *Matr_oldsetSpecSmooth( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setSpecSmooth ); -} - -static PyObject *Matr_oldsetSpecTransp( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setSpecTransp ); -} - -static PyObject *Matr_oldsetSubSize( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setSubSize ); -} - -static PyObject *Matr_oldsetTranslucency( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setTranslucency ); -} - -static PyObject *Matr_oldsetTransDepth( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setTransDepth ); -} - -static PyObject *Matr_oldsetZOffset( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setZOffset ); -} - -static PyObject *Matr_oldsetRGBCol( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Material_setRGBCol ); -} - -static PyObject *Matr_oldsetSpecCol( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Material_setSpecCol ); -} - -static PyObject *Matr_oldsetMirCol( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Material_setMirCol ); -} - - -/* Possible modes are traceable, shadow, shadeless, wire, vcolLight, - * vcolPaint, halo, ztransp, zinvert, haloRings, env, haloLines, - * onlyShadow, xalpha, star, faceTexture, haloTex, haloPuno, noMist, - * haloShaded, haloFlare */ - -static PyObject *Matr_oldsetMode( BPy_Material * self, PyObject * args ) -{ - unsigned int i, flag = 0, ok = 0; - PyObject *value, *error; - char *m[28] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL - }; - - /* - * check for a single integer argument; do a quick check for now - * that the value is not larger than double the highest flag bit - */ - - if ( (PySequence_Size( args ) == 1) - && PyInt_Check ( PyTuple_GET_ITEM ( args , 0 ) ) - && PyArg_ParseTuple( args, "i", &flag ) - && (flag & MA_MODE_MASK ) == flag ) { - ok = 1; - - /* - * check for either an empty argument list, or up to 28 strings - */ - - } else if( PyArg_ParseTuple( args, "|ssssssssssssssssssssssssssss", - &m[0], &m[1], &m[2], &m[3], &m[4], &m[5], &m[6], - &m[7], &m[8], &m[9], &m[10], &m[11], &m[12], - &m[13], &m[14], &m[15], &m[16], &m[17], &m[18], - &m[19], &m[20], &m[21], &m[22], &m[23], &m[24], - &m[25], &m[26], &m[27] ) ) { - for( i = 0; i < 28; i++ ) { - if( m[i] == NULL ) - break; - if( strcmp( m[i], "Traceable" ) == 0 ) - flag |= MA_TRACEBLE; - else if( strcmp( m[i], "Shadow" ) == 0 ) - flag |= MA_SHADOW; - else if( strcmp( m[i], "Shadeless" ) == 0 ) - flag |= MA_SHLESS; - else if( strcmp( m[i], "Wire" ) == 0 ) - flag |= MA_WIRE; - else if( strcmp( m[i], "VColLight" ) == 0 ) - flag |= MA_VERTEXCOL; - else if( strcmp( m[i], "VColPaint" ) == 0 ) - flag |= MA_VERTEXCOLP; - else if( strcmp( m[i], "Halo" ) == 0 ) - flag |= MA_HALO; - else if( strcmp( m[i], "ZTransp" ) == 0 ) - flag |= MA_ZTRA; - else if( strcmp( m[i], "ZInvert" ) == 0 ) - flag |= MA_ZINV; - else if( strcmp( m[i], "HaloRings" ) == 0 ) - flag |= MA_HALO_RINGS; - else if( strcmp( m[i], "HaloLines" ) == 0 ) - flag |= MA_HALO_LINES; - else if( strcmp( m[i], "OnlyShadow" ) == 0 ) - flag |= MA_ONLYSHADOW; - else if( strcmp( m[i], "HaloXAlpha" ) == 0 ) - flag |= MA_HALO_XALPHA; - else if( strcmp( m[i], "HaloStar" ) == 0 ) - flag |= MA_STAR; - else if( strcmp( m[i], "TexFace" ) == 0 ) - flag |= MA_FACETEXTURE; - else if( strcmp( m[i], "HaloTex" ) == 0 ) - flag |= MA_HALOTEX; - else if( strcmp( m[i], "HaloPuno" ) == 0 ) - flag |= MA_HALOPUNO; - else if( strcmp( m[i], "NoMist" ) == 0 ) - flag |= MA_NOMIST; - else if( strcmp( m[i], "HaloShaded" ) == 0 ) - flag |= MA_HALO_SHADE; - else if( strcmp( m[i], "HaloFlare" ) == 0 ) - flag |= MA_HALO_FLARE; - else if( strcmp( m[i], "Radio" ) == 0 ) - flag |= MA_RADIO; - /* ** Mirror ** */ - else if( strcmp( m[i], "RayMirr" ) == 0 ) - flag |= MA_RAYMIRROR; - else if( strcmp( m[i], "ZTransp" ) == 0 ) - flag |= MA_ZTRA; - else if( strcmp( m[i], "RayTransp" ) == 0 ) - flag |= MA_RAYTRANSP; - else if( strcmp( m[i], "OnlyShadow" ) == 0 ) - flag |= MA_ONLYSHADOW; - else if( strcmp( m[i], "NoMist" ) == 0 ) - flag |= MA_NOMIST; - else if( strcmp( m[i], "Env" ) == 0 ) - flag |= MA_ENV; - else - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown Material mode argument" ) ); - } - ok = 1; - } - - /* if neither input method worked, then throw an exception */ - - if ( ok == 0 ) - return ( EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "expected nothing, an integer or up to 22 string argument(s)" ) ); - /* build tuple, call wrapper */ - - value = Py_BuildValue("(i)", flag); - error = EXPP_setterWrapper( (void *)self, value, (setter)Material_setMode ); - Py_DECREF ( value ); - return error; -} - -static PyObject *Matr_oldsetIpo( BPy_Material * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Material_setIpo ); -} - -/* - * clearIpo() returns True/False depending on whether material has an Ipo - */ - -static PyObject *Material_clearIpo( BPy_Material * self ) -{ - /* if Ipo defined, delete it and return true */ - - if( self->material->ipo ) { - PyObject *value = Py_BuildValue( "(O)", Py_None ); - EXPP_setterWrapper( (void *)self, value, (setter)Material_setIpo ); - Py_DECREF ( value ); - return EXPP_incr_ret_True(); - } - return EXPP_incr_ret_False(); /* no ipo found */ -} - diff --git a/source/blender/python/api2_2x/Material.h b/source/blender/python/api2_2x/Material.h deleted file mode 100644 index 18fc87ee803..00000000000 --- a/source/blender/python/api2_2x/Material.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * $Id: Material.h 10649 2007-05-04 03:23:40Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_MATERIAL_H -#define EXPP_MATERIAL_H - -#include -#include "DNA_object_types.h" -#include "DNA_material_types.h" -#include "DNA_texture_types.h" /* colorband */ -#include "rgbTuple.h" - -/*****************************************************************************/ -/* Python BPy_Material structure definition: */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - Material * material; /* libdata must be second */ - BPy_rgbTuple *col, *amb, *spec, *mir, *sss; -} BPy_Material; - -extern PyTypeObject Material_Type; /* The Material PyType Object */ - -#define BPy_Material_Check(v) \ - ((v)->ob_type == &Material_Type) /* for type checking */ - -/*****************************************************************************/ -/* Module Blender.Material - public functions */ -/*****************************************************************************/ -PyObject *M_Material_Init( void ); - -PyObject *Material_Init( void ); -PyObject *Material_CreatePyObject( Material * mat ); -Material *Material_FromPyObject( PyObject * pyobj ); - -/* colorband tp_getseters */ -PyObject *EXPP_PyList_fromColorband( ColorBand *coba ); -int EXPP_Colorband_fromPyList( ColorBand **coba, PyObject * value ); - -/* Some functions needed by NMesh, Curve and friends */ -PyObject *EXPP_PyList_fromMaterialList( Material ** matlist, int len, - int all ); -Material **EXPP_newMaterialList_fromPyList( PyObject * list ); -Material **EXPP_newMaterialList( int len ); -void EXPP_incr_mats_us( Material ** matlist, int len ); -int EXPP_synchronizeMaterialLists( Object * object ); -int EXPP_releaseMaterialList( Material ** matlist, int len ); - -#endif /* EXPP_MATERIAL_H */ diff --git a/source/blender/python/api2_2x/Mathutils.c b/source/blender/python/api2_2x/Mathutils.c deleted file mode 100644 index cf79b3071f7..00000000000 --- a/source/blender/python/api2_2x/Mathutils.c +++ /dev/null @@ -1,1804 +0,0 @@ -/* - * $Id: Mathutils.c 11502 2007-08-06 14:27:08Z khughes $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert, Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Mathutils.h" - -#include "BLI_arithb.h" -#include "PIL_time.h" -#include "BLI_rand.h" -#include "BKE_utildefines.h" - -#include "gen_utils.h" - -//-------------------------DOC STRINGS --------------------------- -static char M_Mathutils_doc[] = "The Blender Mathutils module\n\n"; -static char M_Mathutils_Vector_doc[] = "() - create a new vector object from a list of floats"; -static char M_Mathutils_Matrix_doc[] = "() - create a new matrix object from a list of floats"; -static char M_Mathutils_Quaternion_doc[] = "() - create a quaternion from a list or an axis of rotation and an angle"; -static char M_Mathutils_Euler_doc[] = "() - create and return a new euler object"; -static char M_Mathutils_Rand_doc[] = "() - return a random number"; -static char M_Mathutils_CrossVecs_doc[] = "() - returns a vector perpedicular to the 2 vectors crossed"; -static char M_Mathutils_CopyVec_doc[] = "() - create a copy of vector"; -static char M_Mathutils_DotVecs_doc[] = "() - return the dot product of two vectors"; -static char M_Mathutils_AngleBetweenVecs_doc[] = "() - returns the angle between two vectors in degrees"; -static char M_Mathutils_MidpointVecs_doc[] = "() - return the vector to the midpoint between two vectors"; -static char M_Mathutils_MatMultVec_doc[] = "() - multiplies a matrix by a column vector"; -static char M_Mathutils_VecMultMat_doc[] = "() - multiplies a row vector by a matrix"; -static char M_Mathutils_ProjectVecs_doc[] = "() - returns the projection vector from the projection of vecA onto vecB"; -static char M_Mathutils_RotationMatrix_doc[] = "() - construct a rotation matrix from an angle and axis of rotation"; -static char M_Mathutils_ScaleMatrix_doc[] = "() - construct a scaling matrix from a scaling factor"; -static char M_Mathutils_OrthoProjectionMatrix_doc[] = "() - construct a orthographic projection matrix from a selected plane"; -static char M_Mathutils_ShearMatrix_doc[] = "() - construct a shearing matrix from a plane of shear and a shear factor"; -static char M_Mathutils_CopyMat_doc[] = "() - create a copy of a matrix"; -static char M_Mathutils_TranslationMatrix_doc[] = "(vec) - create a translation matrix from a vector"; -static char M_Mathutils_CopyQuat_doc[] = "() - copy quatB to quatA"; -static char M_Mathutils_CopyEuler_doc[] = "() - copy eulB to eultA"; -static char M_Mathutils_CrossQuats_doc[] = "() - return the mutliplication of two quaternions"; -static char M_Mathutils_DotQuats_doc[] = "() - return the dot product of two quaternions"; -static char M_Mathutils_Slerp_doc[] = "() - returns the interpolation between two quaternions"; -static char M_Mathutils_DifferenceQuats_doc[] = "() - return the angular displacment difference between two quats"; -static char M_Mathutils_RotateEuler_doc[] = "() - rotate euler by an axis and angle"; -static char M_Mathutils_Intersect_doc[] = "(v1, v2, v3, ray, orig, clip=1) - returns the intersection between a ray and a triangle, if possible, returns None otherwise"; -static char M_Mathutils_TriangleArea_doc[] = "(v1, v2, v3) - returns the area size of the 2D or 3D triangle defined"; -static char M_Mathutils_TriangleNormal_doc[] = "(v1, v2, v3) - returns the normal of the 3D triangle defined"; -static char M_Mathutils_QuadNormal_doc[] = "(v1, v2, v3, v4) - returns the normal of the 3D quad defined"; -static char M_Mathutils_LineIntersect_doc[] = "(v1, v2, v3, v4) - returns a tuple with the points on each line respectively closest to the other"; -static char M_Mathutils_Point_doc[] = "Creates a 2d or 3d point object"; -//-----------------------METHOD DEFINITIONS ---------------------- -struct PyMethodDef M_Mathutils_methods[] = { - {"Rand", (PyCFunction) M_Mathutils_Rand, METH_VARARGS, M_Mathutils_Rand_doc}, - {"Vector", (PyCFunction) M_Mathutils_Vector, METH_VARARGS, M_Mathutils_Vector_doc}, - {"CrossVecs", (PyCFunction) M_Mathutils_CrossVecs, METH_VARARGS, M_Mathutils_CrossVecs_doc}, - {"DotVecs", (PyCFunction) M_Mathutils_DotVecs, METH_VARARGS, M_Mathutils_DotVecs_doc}, - {"AngleBetweenVecs", (PyCFunction) M_Mathutils_AngleBetweenVecs, METH_VARARGS, M_Mathutils_AngleBetweenVecs_doc}, - {"MidpointVecs", (PyCFunction) M_Mathutils_MidpointVecs, METH_VARARGS, M_Mathutils_MidpointVecs_doc}, - {"VecMultMat", (PyCFunction) M_Mathutils_VecMultMat, METH_VARARGS, M_Mathutils_VecMultMat_doc}, - {"ProjectVecs", (PyCFunction) M_Mathutils_ProjectVecs, METH_VARARGS, M_Mathutils_ProjectVecs_doc}, - {"CopyVec", (PyCFunction) M_Mathutils_CopyVec, METH_VARARGS, M_Mathutils_CopyVec_doc}, - {"Matrix", (PyCFunction) M_Mathutils_Matrix, METH_VARARGS, M_Mathutils_Matrix_doc}, - {"RotationMatrix", (PyCFunction) M_Mathutils_RotationMatrix, METH_VARARGS, M_Mathutils_RotationMatrix_doc}, - {"ScaleMatrix", (PyCFunction) M_Mathutils_ScaleMatrix, METH_VARARGS, M_Mathutils_ScaleMatrix_doc}, - {"ShearMatrix", (PyCFunction) M_Mathutils_ShearMatrix, METH_VARARGS, M_Mathutils_ShearMatrix_doc}, - {"TranslationMatrix", (PyCFunction) M_Mathutils_TranslationMatrix, METH_O, M_Mathutils_TranslationMatrix_doc}, - {"CopyMat", (PyCFunction) M_Mathutils_CopyMat, METH_VARARGS, M_Mathutils_CopyMat_doc}, - {"OrthoProjectionMatrix", (PyCFunction) M_Mathutils_OrthoProjectionMatrix, METH_VARARGS, M_Mathutils_OrthoProjectionMatrix_doc}, - {"MatMultVec", (PyCFunction) M_Mathutils_MatMultVec, METH_VARARGS, M_Mathutils_MatMultVec_doc}, - {"Quaternion", (PyCFunction) M_Mathutils_Quaternion, METH_VARARGS, M_Mathutils_Quaternion_doc}, - {"CopyQuat", (PyCFunction) M_Mathutils_CopyQuat, METH_VARARGS, M_Mathutils_CopyQuat_doc}, - {"CrossQuats", (PyCFunction) M_Mathutils_CrossQuats, METH_VARARGS, M_Mathutils_CrossQuats_doc}, - {"DotQuats", (PyCFunction) M_Mathutils_DotQuats, METH_VARARGS, M_Mathutils_DotQuats_doc}, - {"DifferenceQuats", (PyCFunction) M_Mathutils_DifferenceQuats, METH_VARARGS,M_Mathutils_DifferenceQuats_doc}, - {"Slerp", (PyCFunction) M_Mathutils_Slerp, METH_VARARGS, M_Mathutils_Slerp_doc}, - {"Euler", (PyCFunction) M_Mathutils_Euler, METH_VARARGS, M_Mathutils_Euler_doc}, - {"CopyEuler", (PyCFunction) M_Mathutils_CopyEuler, METH_VARARGS, M_Mathutils_CopyEuler_doc}, - {"RotateEuler", (PyCFunction) M_Mathutils_RotateEuler, METH_VARARGS, M_Mathutils_RotateEuler_doc}, - {"Intersect", ( PyCFunction ) M_Mathutils_Intersect, METH_VARARGS, M_Mathutils_Intersect_doc}, - {"TriangleArea", ( PyCFunction ) M_Mathutils_TriangleArea, METH_VARARGS, M_Mathutils_TriangleArea_doc}, - {"TriangleNormal", ( PyCFunction ) M_Mathutils_TriangleNormal, METH_VARARGS, M_Mathutils_TriangleNormal_doc}, - {"QuadNormal", ( PyCFunction ) M_Mathutils_QuadNormal, METH_VARARGS, M_Mathutils_QuadNormal_doc}, - {"LineIntersect", ( PyCFunction ) M_Mathutils_LineIntersect, METH_VARARGS, M_Mathutils_LineIntersect_doc}, - {"Point", (PyCFunction) M_Mathutils_Point, METH_VARARGS, M_Mathutils_Point_doc}, - {NULL, NULL, 0, NULL} -}; -//----------------------------MODULE INIT------------------------- -PyObject *Mathutils_Init(void) -{ - PyObject *submodule; - - //seed the generator for the rand function - BLI_srand((unsigned int) (PIL_check_seconds_timer() * - 0x7FFFFFFF)); - - /* needed for getseters */ - if( PyType_Ready( &vector_Type ) < 0 ) - return NULL; - if( PyType_Ready( &matrix_Type ) < 0 ) - return NULL; - if( PyType_Ready( &euler_Type ) < 0 ) - return NULL; - if( PyType_Ready( &quaternion_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3("Blender.Mathutils", - M_Mathutils_methods, M_Mathutils_doc); - return (submodule); -} -//-----------------------------METHODS---------------------------- -//----------------column_vector_multiplication (internal)--------- -//COLUMN VECTOR Multiplication (Matrix X Vector) -// [1][2][3] [a] -// [4][5][6] * [b] -// [7][8][9] [c] -//vector/matrix multiplication IS NOT COMMUTATIVE!!!! -PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec) -{ - float vecNew[4], vecCopy[4]; - double dot = 0.0f; - int x, y, z = 0; - - if(mat->rowSize != vec->size){ - if(mat->rowSize == 4 && vec->size != 3){ - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "matrix * vector: matrix row size and vector size must be the same"); - }else{ - vecCopy[3] = 1.0f; - } - } - - for(x = 0; x < vec->size; x++){ - vecCopy[x] = vec->vec[x]; - } - - for(x = 0; x < mat->rowSize; x++) { - for(y = 0; y < mat->colSize; y++) { - dot += mat->matrix[x][y] * vecCopy[y]; - } - vecNew[z++] = (float)dot; - dot = 0.0f; - } - return newVectorObject(vecNew, vec->size, Py_NEW); -} -//This is a helper for point/matrix translation - -PyObject *column_point_multiplication(MatrixObject * mat, PointObject* pt) -{ - float ptNew[4], ptCopy[4]; - double dot = 0.0f; - int x, y, z = 0; - - if(mat->rowSize != pt->size){ - if(mat->rowSize == 4 && pt->size != 3){ - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "matrix * point: matrix row size and point size must be the same\n"); - }else{ - ptCopy[3] = 0.0f; - } - } - - for(x = 0; x < pt->size; x++){ - ptCopy[x] = pt->coord[x]; - } - - for(x = 0; x < mat->rowSize; x++) { - for(y = 0; y < mat->colSize; y++) { - dot += mat->matrix[x][y] * ptCopy[y]; - } - ptNew[z++] = (float)dot; - dot = 0.0f; - } - return newPointObject(ptNew, pt->size, Py_NEW); -} -//-----------------row_vector_multiplication (internal)----------- -//ROW VECTOR Multiplication - Vector X Matrix -//[x][y][z] * [1][2][3] -// [4][5][6] -// [7][8][9] -//vector/matrix multiplication IS NOT COMMUTATIVE!!!! -PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat) -{ - float vecNew[4], vecCopy[4]; - double dot = 0.0f; - int x, y, z = 0, vec_size = vec->size; - - if(mat->colSize != vec_size){ - if(mat->rowSize == 4 && vec_size != 3){ - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "vector * matrix: matrix column size and the vector size must be the same"); - }else{ - vecCopy[3] = 1.0f; - } - } - - for(x = 0; x < vec_size; x++){ - vecCopy[x] = vec->vec[x]; - } - - //muliplication - for(x = 0; x < mat->colSize; x++) { - for(y = 0; y < mat->rowSize; y++) { - dot += mat->matrix[y][x] * vecCopy[y]; - } - vecNew[z++] = (float)dot; - dot = 0.0f; - } - return newVectorObject(vecNew, vec_size, Py_NEW); -} -//This is a helper for the point class -PyObject *row_point_multiplication(PointObject* pt, MatrixObject * mat) -{ - float ptNew[4], ptCopy[4]; - double dot = 0.0f; - int x, y, z = 0, size; - - if(mat->colSize != pt->size){ - if(mat->rowSize == 4 && pt->size != 3){ - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "point * matrix: matrix column size and the point size must be the same\n"); - }else{ - ptCopy[3] = 0.0f; - } - } - size = pt->size; - for(x = 0; x < pt->size; x++){ - ptCopy[x] = pt->coord[x]; - } - - //muliplication - for(x = 0; x < mat->colSize; x++) { - for(y = 0; y < mat->rowSize; y++) { - dot += mat->matrix[y][x] * ptCopy[y]; - } - ptNew[z++] = (float)dot; - dot = 0.0f; - } - return newPointObject(ptNew, size, Py_NEW); -} -//-----------------quat_rotation (internal)----------- -//This function multiplies a vector/point * quat or vice versa -//to rotate the point/vector by the quaternion -//arguments should all be 3D -PyObject *quat_rotation(PyObject *arg1, PyObject *arg2) -{ - float rot[3]; - QuaternionObject *quat = NULL; - VectorObject *vec = NULL; - PointObject *pt = NULL; - - if(QuaternionObject_Check(arg1)){ - quat = (QuaternionObject*)arg1; - if(VectorObject_Check(arg2)){ - vec = (VectorObject*)arg2; - rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] - - 2*quat->quat[3]*quat->quat[0]*vec->vec[1] + quat->quat[1]*quat->quat[1]*vec->vec[0] + - 2*quat->quat[2]*quat->quat[1]*vec->vec[1] + 2*quat->quat[3]*quat->quat[1]*vec->vec[2] - - quat->quat[3]*quat->quat[3]*vec->vec[0] - quat->quat[2]*quat->quat[2]*vec->vec[0]; - rot[1] = 2*quat->quat[1]*quat->quat[2]*vec->vec[0] + quat->quat[2]*quat->quat[2]*vec->vec[1] + - 2*quat->quat[3]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[3]*vec->vec[0] - - quat->quat[3]*quat->quat[3]*vec->vec[1] + quat->quat[0]*quat->quat[0]*vec->vec[1] - - 2*quat->quat[1]*quat->quat[0]*vec->vec[2] - quat->quat[1]*quat->quat[1]*vec->vec[1]; - rot[2] = 2*quat->quat[1]*quat->quat[3]*vec->vec[0] + 2*quat->quat[2]*quat->quat[3]*vec->vec[1] + - quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] - - quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] - - quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2]; - return newVectorObject(rot, 3, Py_NEW); - }else if(PointObject_Check(arg2)){ - pt = (PointObject*)arg2; - rot[0] = quat->quat[0]*quat->quat[0]*pt->coord[0] + 2*quat->quat[2]*quat->quat[0]*pt->coord[2] - - 2*quat->quat[3]*quat->quat[0]*pt->coord[1] + quat->quat[1]*quat->quat[1]*pt->coord[0] + - 2*quat->quat[2]*quat->quat[1]*pt->coord[1] + 2*quat->quat[3]*quat->quat[1]*pt->coord[2] - - quat->quat[3]*quat->quat[3]*pt->coord[0] - quat->quat[2]*quat->quat[2]*pt->coord[0]; - rot[1] = 2*quat->quat[1]*quat->quat[2]*pt->coord[0] + quat->quat[2]*quat->quat[2]*pt->coord[1] + - 2*quat->quat[3]*quat->quat[2]*pt->coord[2] + 2*quat->quat[0]*quat->quat[3]*pt->coord[0] - - quat->quat[3]*quat->quat[3]*pt->coord[1] + quat->quat[0]*quat->quat[0]*pt->coord[1] - - 2*quat->quat[1]*quat->quat[0]*pt->coord[2] - quat->quat[1]*quat->quat[1]*pt->coord[1]; - rot[2] = 2*quat->quat[1]*quat->quat[3]*pt->coord[0] + 2*quat->quat[2]*quat->quat[3]*pt->coord[1] + - quat->quat[3]*quat->quat[3]*pt->coord[2] - 2*quat->quat[0]*quat->quat[2]*pt->coord[0] - - quat->quat[2]*quat->quat[2]*pt->coord[2] + 2*quat->quat[0]*quat->quat[1]*pt->coord[1] - - quat->quat[1]*quat->quat[1]*pt->coord[2] + quat->quat[0]*quat->quat[0]*pt->coord[2]; - return newPointObject(rot, 3, Py_NEW); - } - }else if(VectorObject_Check(arg1)){ - vec = (VectorObject*)arg1; - if(QuaternionObject_Check(arg2)){ - quat = (QuaternionObject*)arg2; - rot[0] = quat->quat[0]*quat->quat[0]*vec->vec[0] + 2*quat->quat[2]*quat->quat[0]*vec->vec[2] - - 2*quat->quat[3]*quat->quat[0]*vec->vec[1] + quat->quat[1]*quat->quat[1]*vec->vec[0] + - 2*quat->quat[2]*quat->quat[1]*vec->vec[1] + 2*quat->quat[3]*quat->quat[1]*vec->vec[2] - - quat->quat[3]*quat->quat[3]*vec->vec[0] - quat->quat[2]*quat->quat[2]*vec->vec[0]; - rot[1] = 2*quat->quat[1]*quat->quat[2]*vec->vec[0] + quat->quat[2]*quat->quat[2]*vec->vec[1] + - 2*quat->quat[3]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[3]*vec->vec[0] - - quat->quat[3]*quat->quat[3]*vec->vec[1] + quat->quat[0]*quat->quat[0]*vec->vec[1] - - 2*quat->quat[1]*quat->quat[0]*vec->vec[2] - quat->quat[1]*quat->quat[1]*vec->vec[1]; - rot[2] = 2*quat->quat[1]*quat->quat[3]*vec->vec[0] + 2*quat->quat[2]*quat->quat[3]*vec->vec[1] + - quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] - - quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] - - quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2]; - return newVectorObject(rot, 3, Py_NEW); - } - }else if(PointObject_Check(arg1)){ - pt = (PointObject*)arg1; - if(QuaternionObject_Check(arg2)){ - quat = (QuaternionObject*)arg2; - rot[0] = quat->quat[0]*quat->quat[0]*pt->coord[0] + 2*quat->quat[2]*quat->quat[0]*pt->coord[2] - - 2*quat->quat[3]*quat->quat[0]*pt->coord[1] + quat->quat[1]*quat->quat[1]*pt->coord[0] + - 2*quat->quat[2]*quat->quat[1]*pt->coord[1] + 2*quat->quat[3]*quat->quat[1]*pt->coord[2] - - quat->quat[3]*quat->quat[3]*pt->coord[0] - quat->quat[2]*quat->quat[2]*pt->coord[0]; - rot[1] = 2*quat->quat[1]*quat->quat[2]*pt->coord[0] + quat->quat[2]*quat->quat[2]*pt->coord[1] + - 2*quat->quat[3]*quat->quat[2]*pt->coord[2] + 2*quat->quat[0]*quat->quat[3]*pt->coord[0] - - quat->quat[3]*quat->quat[3]*pt->coord[1] + quat->quat[0]*quat->quat[0]*pt->coord[1] - - 2*quat->quat[1]*quat->quat[0]*pt->coord[2] - quat->quat[1]*quat->quat[1]*pt->coord[1]; - rot[2] = 2*quat->quat[1]*quat->quat[3]*pt->coord[0] + 2*quat->quat[2]*quat->quat[3]*pt->coord[1] + - quat->quat[3]*quat->quat[3]*pt->coord[2] - 2*quat->quat[0]*quat->quat[2]*pt->coord[0] - - quat->quat[2]*quat->quat[2]*pt->coord[2] + 2*quat->quat[0]*quat->quat[1]*pt->coord[1] - - quat->quat[1]*quat->quat[1]*pt->coord[2] + quat->quat[0]*quat->quat[0]*pt->coord[2]; - return newPointObject(rot, 3, Py_NEW); - } - } - - return (EXPP_ReturnPyObjError(PyExc_RuntimeError, - "quat_rotation(internal): internal problem rotating vector/point\n")); -} - -//----------------------------------Mathutils.Rand() -------------------- -//returns a random number between a high and low value -PyObject *M_Mathutils_Rand(PyObject * self, PyObject * args) -{ - float high, low, range; - double rand; - //initializers - high = 1.0; - low = 0.0; - - if(!PyArg_ParseTuple(args, "|ff", &low, &high)) - return (EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Rand(): expected nothing or optional (float, float)\n")); - - if((high < low) || (high < 0 && low > 0)) - return (EXPP_ReturnPyObjError(PyExc_ValueError, - "Mathutils.Rand(): high value should be larger than low value\n")); - - //get the random number 0 - 1 - rand = BLI_drand(); - - //set it to range - range = high - low; - rand = rand * range; - rand = rand + low; - - return PyFloat_FromDouble(rand); -} -//----------------------------------VECTOR FUNCTIONS--------------------- -//----------------------------------Mathutils.Vector() ------------------ -// Supports 2D, 3D, and 4D vector objects both int and float values -// accepted. Mixed float and int values accepted. Ints are parsed to float -PyObject *M_Mathutils_Vector(PyObject * self, PyObject * args) -{ - PyObject *listObject = NULL; - int size, i; - float vec[4]; - PyObject *v, *f; - - size = PySequence_Length(args); - if (size == 1) { - listObject = PySequence_GetItem(args, 0); - if (PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - } else { // Single argument was not a sequence - Py_XDECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Vector(): 2-4 floats or ints expected (optionally in a sequence)\n"); - } - } else if (size == 0) { - //returns a new empty 3d vector - return newVectorObject(NULL, 3, Py_NEW); - } else { - listObject = EXPP_incr_ret(args); - } - - if (size<2 || size>4) { // Invalid vector size - Py_XDECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Vector(): 2-4 floats or ints expected (optionally in a sequence)\n"); - } - - for (i=0; isize != 3 || vec2->size != 3) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.CrossVecs(): expects (2) 3D vector objects\n"); - - vecCross = newVectorObject(NULL, 3, Py_NEW); - Crossf(((VectorObject*)vecCross)->vec, vec1->vec, vec2->vec); - return vecCross; -} -//----------------------------------Mathutils.DotVec() ------------------- -//calculates the dot product of two vectors -PyObject *M_Mathutils_DotVecs(PyObject * self, PyObject * args) -{ - VectorObject *vec1 = NULL, *vec2 = NULL; - double dot = 0.0f; - int x; - - if(!PyArg_ParseTuple(args, "O!O!", &vector_Type, &vec1, &vector_Type, &vec2)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.DotVecs(): expects (2) vector objects of the same size\n"); - if(vec1->size != vec2->size) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.DotVecs(): expects (2) vector objects of the same size\n"); - - for(x = 0; x < vec1->size; x++) { - dot += vec1->vec[x] * vec2->vec[x]; - } - return PyFloat_FromDouble(dot); -} -//----------------------------------Mathutils.AngleBetweenVecs() --------- -//calculates the angle between 2 vectors -PyObject *M_Mathutils_AngleBetweenVecs(PyObject * self, PyObject * args) -{ - VectorObject *vec1 = NULL, *vec2 = NULL; - double dot = 0.0f, angleRads, test_v1 = 0.0f, test_v2 = 0.0f; - int x, size; - - if(!PyArg_ParseTuple(args, "O!O!", &vector_Type, &vec1, &vector_Type, &vec2)) - goto AttributeError1; //not vectors - if(vec1->size != vec2->size) - goto AttributeError1; //bad sizes - - //since size is the same.... - size = vec1->size; - - for(x = 0; x < size; x++) { - test_v1 += vec1->vec[x] * vec1->vec[x]; - test_v2 += vec2->vec[x] * vec2->vec[x]; - } - if (!test_v1 || !test_v2){ - goto AttributeError2; //zero-length vector - } - - //dot product - for(x = 0; x < size; x++) { - dot += vec1->vec[x] * vec2->vec[x]; - } - dot /= (sqrt(test_v1) * sqrt(test_v2)); - - if (dot < -1.0f || dot > 1.0f) { - CLAMP(dot,-1.0f,1.0f); - } - angleRads = (double)acos(dot); - - return PyFloat_FromDouble(angleRads * (180/ Py_PI)); - -AttributeError1: - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.AngleBetweenVecs(): expects (2) VECTOR objects of the same size\n"); - -AttributeError2: - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.AngleBetweenVecs(): zero length vectors are not acceptable arguments\n"); -} -//----------------------------------Mathutils.MidpointVecs() ------------- -//calculates the midpoint between 2 vectors -PyObject *M_Mathutils_MidpointVecs(PyObject * self, PyObject * args) -{ - VectorObject *vec1 = NULL, *vec2 = NULL; - float vec[4]; - int x; - - if(!PyArg_ParseTuple(args, "O!O!", &vector_Type, &vec1, &vector_Type, &vec2)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.MidpointVecs(): expects (2) vector objects of the same size\n"); - if(vec1->size != vec2->size) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.MidpointVecs(): expects (2) vector objects of the same size\n"); - - for(x = 0; x < vec1->size; x++) { - vec[x] = 0.5f * (vec1->vec[x] + vec2->vec[x]); - } - return newVectorObject(vec, vec1->size, Py_NEW); -} -//----------------------------------Mathutils.ProjectVecs() ------------- -//projects vector 1 onto vector 2 -PyObject *M_Mathutils_ProjectVecs(PyObject * self, PyObject * args) -{ - VectorObject *vec1 = NULL, *vec2 = NULL; - float vec[4]; - double dot = 0.0f, dot2 = 0.0f; - int x, size; - - if(!PyArg_ParseTuple(args, "O!O!", &vector_Type, &vec1, &vector_Type, &vec2)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.ProjectVecs(): expects (2) vector objects of the same size\n"); - if(vec1->size != vec2->size) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.ProjectVecs(): expects (2) vector objects of the same size\n"); - - //since they are the same size... - size = vec1->size; - - //get dot products - for(x = 0; x < size; x++) { - dot += vec1->vec[x] * vec2->vec[x]; - dot2 += vec2->vec[x] * vec2->vec[x]; - } - //projection - dot /= dot2; - for(x = 0; x < size; x++) { - vec[x] = (float)(dot * vec2->vec[x]); - } - return newVectorObject(vec, size, Py_NEW); -} -//----------------------------------MATRIX FUNCTIONS-------------------- -//----------------------------------Mathutils.Matrix() ----------------- -//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. -//create a new matrix type -PyObject *M_Mathutils_Matrix(PyObject * self, PyObject * args) -{ - PyObject *listObject = NULL; - PyObject *argObject, *m, *s, *f; - MatrixObject *mat; - int argSize, seqSize = 0, i, j; - float matrix[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; - - argSize = PySequence_Length(args); - if(argSize > 4){ //bad arg nums - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); - } else if (argSize == 0) { //return empty 4D matrix - return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW); - }else if (argSize == 1){ - //copy constructor for matrix objects - argObject = PySequence_GetItem(args, 0); - if(MatrixObject_Check(argObject)){ - mat = (MatrixObject*)argObject; - - argSize = mat->rowSize; //rows - seqSize = mat->colSize; //col - for(i = 0; i < (seqSize * argSize); i++){ - matrix[i] = mat->contigPtr[i]; - } - } - Py_DECREF(argObject); - }else{ //2-4 arguments (all seqs? all same size?) - for(i =0; i < argSize; i++){ - argObject = PySequence_GetItem(args, i); - if (PySequence_Check(argObject)) { //seq? - if(seqSize){ //0 at first - if(PySequence_Length(argObject) != seqSize){ //seq size not same - Py_DECREF(argObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); - } - } - seqSize = PySequence_Length(argObject); - }else{ //arg not a sequence - Py_XDECREF(argObject); - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); - } - Py_DECREF(argObject); - } - //all is well... let's continue parsing - listObject = args; - for (i = 0; i < argSize; i++){ - m = PySequence_GetItem(listObject, i); - if (m == NULL) { // Failed to read sequence - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "Mathutils.Matrix(): failed to parse arguments...\n"); - } - - for (j = 0; j < seqSize; j++) { - s = PySequence_GetItem(m, j); - if (s == NULL) { // Failed to read sequence - Py_DECREF(m); - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "Mathutils.Matrix(): failed to parse arguments...\n"); - } - - f = PyNumber_Float(s); - if(f == NULL) { // parsed item is not a number - EXPP_decr2(m,s); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n"); - } - - matrix[(seqSize*i)+j]=(float)PyFloat_AS_DOUBLE(f); - EXPP_decr2(f,s); - } - Py_DECREF(m); - } - } - return newMatrixObject(matrix, argSize, seqSize, Py_NEW); -} -//----------------------------------Mathutils.RotationMatrix() ---------- -//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. -//creates a rotation matrix -PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args) -{ - VectorObject *vec = NULL; - char *axis = NULL; - int matSize; - float angle = 0.0f, norm = 0.0f, cosAngle = 0.0f, sinAngle = 0.0f; - float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; - - if(!PyArg_ParseTuple - (args, "fi|sO!", &angle, &matSize, &axis, &vector_Type, &vec)) { - return EXPP_ReturnPyObjError (PyExc_TypeError, - "Mathutils.RotationMatrix(): expected float int and optional string and vector\n"); - } - - /* Clamp to -360:360 */ - while (angle<-360.0f) - angle+=360.0; - while (angle>360.0f) - angle-=360.0; - - if(matSize != 2 && matSize != 3 && matSize != 4) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); - if(matSize == 2 && (axis != NULL || vec != NULL)) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.RotationMatrix(): cannot create a 2x2 rotation matrix around arbitrary axis\n"); - if((matSize == 3 || matSize == 4) && axis == NULL) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.RotationMatrix(): please choose an axis of rotation for 3d and 4d matrices\n"); - if(axis) { - if(((strcmp(axis, "r") == 0) || - (strcmp(axis, "R") == 0)) && vec == NULL) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.RotationMatrix(): please define the arbitrary axis of rotation\n"); - } - if(vec) { - if(vec->size != 3) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.RotationMatrix(): the arbitrary axis must be a 3D vector\n"); - } - //convert to radians - angle = angle * (float) (Py_PI / 180); - if(axis == NULL && matSize == 2) { - //2D rotation matrix - mat[0] = (float) cos (angle); - mat[1] = (float) sin (angle); - mat[2] = -((float) sin(angle)); - mat[3] = (float) cos(angle); - } else if((strcmp(axis, "x") == 0) || (strcmp(axis, "X") == 0)) { - //rotation around X - mat[0] = 1.0f; - mat[4] = (float) cos(angle); - mat[5] = (float) sin(angle); - mat[7] = -((float) sin(angle)); - mat[8] = (float) cos(angle); - } else if((strcmp(axis, "y") == 0) || (strcmp(axis, "Y") == 0)) { - //rotation around Y - mat[0] = (float) cos(angle); - mat[2] = -((float) sin(angle)); - mat[4] = 1.0f; - mat[6] = (float) sin(angle); - mat[8] = (float) cos(angle); - } else if((strcmp(axis, "z") == 0) || (strcmp(axis, "Z") == 0)) { - //rotation around Z - mat[0] = (float) cos(angle); - mat[1] = (float) sin(angle); - mat[3] = -((float) sin(angle)); - mat[4] = (float) cos(angle); - mat[8] = 1.0f; - } else if((strcmp(axis, "r") == 0) || (strcmp(axis, "R") == 0)) { - //arbitrary rotation - //normalize arbitrary axis - norm = (float) sqrt(vec->vec[0] * vec->vec[0] + - vec->vec[1] * vec->vec[1] + - vec->vec[2] * vec->vec[2]); - vec->vec[0] /= norm; - vec->vec[1] /= norm; - vec->vec[2] /= norm; - - //create matrix - cosAngle = (float) cos(angle); - sinAngle = (float) sin(angle); - mat[0] = ((vec->vec[0] * vec->vec[0]) * (1 - cosAngle)) + - cosAngle; - mat[1] = ((vec->vec[0] * vec->vec[1]) * (1 - cosAngle)) + - (vec->vec[2] * sinAngle); - mat[2] = ((vec->vec[0] * vec->vec[2]) * (1 - cosAngle)) - - (vec->vec[1] * sinAngle); - mat[3] = ((vec->vec[0] * vec->vec[1]) * (1 - cosAngle)) - - (vec->vec[2] * sinAngle); - mat[4] = ((vec->vec[1] * vec->vec[1]) * (1 - cosAngle)) + - cosAngle; - mat[5] = ((vec->vec[1] * vec->vec[2]) * (1 - cosAngle)) + - (vec->vec[0] * sinAngle); - mat[6] = ((vec->vec[0] * vec->vec[2]) * (1 - cosAngle)) + - (vec->vec[1] * sinAngle); - mat[7] = ((vec->vec[1] * vec->vec[2]) * (1 - cosAngle)) - - (vec->vec[0] * sinAngle); - mat[8] = ((vec->vec[2] * vec->vec[2]) * (1 - cosAngle)) + - cosAngle; - } else { - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.RotationMatrix(): unrecognizable axis of rotation type - expected x,y,z or r\n"); - } - if(matSize == 4) { - //resize matrix - mat[10] = mat[8]; - mat[9] = mat[7]; - mat[8] = mat[6]; - mat[7] = 0.0f; - mat[6] = mat[5]; - mat[5] = mat[4]; - mat[4] = mat[3]; - mat[3] = 0.0f; - } - //pass to matrix creation - return newMatrixObject(mat, matSize, matSize, Py_NEW); -} -//----------------------------------Mathutils.TranslationMatrix() ------- -//creates a translation matrix -PyObject *M_Mathutils_TranslationMatrix(PyObject * self, VectorObject * vec) -{ - float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; - - if(!VectorObject_Check(vec)) { - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.TranslationMatrix(): expected vector\n"); - } - if(vec->size != 3 && vec->size != 4) { - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.TranslationMatrix(): vector must be 3D or 4D\n"); - } - //create a identity matrix and add translation - Mat4One((float(*)[4]) mat); - mat[12] = vec->vec[0]; - mat[13] = vec->vec[1]; - mat[14] = vec->vec[2]; - - return newMatrixObject(mat, 4, 4, Py_NEW); -} -//----------------------------------Mathutils.ScaleMatrix() ------------- -//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. -//creates a scaling matrix -PyObject *M_Mathutils_ScaleMatrix(PyObject * self, PyObject * args) -{ - VectorObject *vec = NULL; - float norm = 0.0f, factor; - int matSize, x; - float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; - - if(!PyArg_ParseTuple - (args, "fi|O!", &factor, &matSize, &vector_Type, &vec)) { - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.ScaleMatrix(): expected float int and optional vector\n"); - } - if(matSize != 2 && matSize != 3 && matSize != 4) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.ScaleMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); - if(vec) { - if(vec->size > 2 && matSize == 2) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.ScaleMatrix(): please use 2D vectors when scaling in 2D\n"); - } - if(vec == NULL) { //scaling along axis - if(matSize == 2) { - mat[0] = factor; - mat[3] = factor; - } else { - mat[0] = factor; - mat[4] = factor; - mat[8] = factor; - } - } else { //scaling in arbitrary direction - //normalize arbitrary axis - for(x = 0; x < vec->size; x++) { - norm += vec->vec[x] * vec->vec[x]; - } - norm = (float) sqrt(norm); - for(x = 0; x < vec->size; x++) { - vec->vec[x] /= norm; - } - if(matSize == 2) { - mat[0] = 1 +((factor - 1) *(vec->vec[0] * vec->vec[0])); - mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1])); - mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[1])); - mat[3] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1])); - } else { - mat[0] = 1 + ((factor - 1) *(vec->vec[0] * vec->vec[0])); - mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1])); - mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[2])); - mat[3] =((factor - 1) *(vec->vec[0] * vec->vec[1])); - mat[4] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1])); - mat[5] =((factor - 1) *(vec->vec[1] * vec->vec[2])); - mat[6] =((factor - 1) *(vec->vec[0] * vec->vec[2])); - mat[7] =((factor - 1) *(vec->vec[1] * vec->vec[2])); - mat[8] = 1 + ((factor - 1) *(vec->vec[2] * vec->vec[2])); - } - } - if(matSize == 4) { - //resize matrix - mat[10] = mat[8]; - mat[9] = mat[7]; - mat[8] = mat[6]; - mat[7] = 0.0f; - mat[6] = mat[5]; - mat[5] = mat[4]; - mat[4] = mat[3]; - mat[3] = 0.0f; - } - //pass to matrix creation - return newMatrixObject(mat, matSize, matSize, Py_NEW); -} -//----------------------------------Mathutils.OrthoProjectionMatrix() --- -//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc. -//creates an ortho projection matrix -PyObject *M_Mathutils_OrthoProjectionMatrix(PyObject * self, PyObject * args) -{ - VectorObject *vec = NULL; - char *plane; - int matSize, x; - float norm = 0.0f; - float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; - - if(!PyArg_ParseTuple - (args, "si|O!", &plane, &matSize, &vector_Type, &vec)) { - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.OrthoProjectionMatrix(): expected string and int and optional vector\n"); - } - if(matSize != 2 && matSize != 3 && matSize != 4) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.OrthoProjectionMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); - if(vec) { - if(vec->size > 2 && matSize == 2) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.OrthoProjectionMatrix(): please use 2D vectors when scaling in 2D\n"); - } - if(vec == NULL) { //ortho projection onto cardinal plane - if(((strcmp(plane, "x") == 0) - || (strcmp(plane, "X") == 0)) && matSize == 2) { - mat[0] = 1.0f; - } else if(((strcmp(plane, "y") == 0) - || (strcmp(plane, "Y") == 0)) - && matSize == 2) { - mat[3] = 1.0f; - } else if(((strcmp(plane, "xy") == 0) - || (strcmp(plane, "XY") == 0)) - && matSize > 2) { - mat[0] = 1.0f; - mat[4] = 1.0f; - } else if(((strcmp(plane, "xz") == 0) - || (strcmp(plane, "XZ") == 0)) - && matSize > 2) { - mat[0] = 1.0f; - mat[8] = 1.0f; - } else if(((strcmp(plane, "yz") == 0) - || (strcmp(plane, "YZ") == 0)) - && matSize > 2) { - mat[4] = 1.0f; - mat[8] = 1.0f; - } else { - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.OrthoProjectionMatrix(): unknown plane - expected: x, y, xy, xz, yz\n"); - } - } else { //arbitrary plane - //normalize arbitrary axis - for(x = 0; x < vec->size; x++) { - norm += vec->vec[x] * vec->vec[x]; - } - norm = (float) sqrt(norm); - for(x = 0; x < vec->size; x++) { - vec->vec[x] /= norm; - } - if(((strcmp(plane, "r") == 0) - || (strcmp(plane, "R") == 0)) && matSize == 2) { - mat[0] = 1 - (vec->vec[0] * vec->vec[0]); - mat[1] = -(vec->vec[0] * vec->vec[1]); - mat[2] = -(vec->vec[0] * vec->vec[1]); - mat[3] = 1 - (vec->vec[1] * vec->vec[1]); - } else if(((strcmp(plane, "r") == 0) - || (strcmp(plane, "R") == 0)) - && matSize > 2) { - mat[0] = 1 - (vec->vec[0] * vec->vec[0]); - mat[1] = -(vec->vec[0] * vec->vec[1]); - mat[2] = -(vec->vec[0] * vec->vec[2]); - mat[3] = -(vec->vec[0] * vec->vec[1]); - mat[4] = 1 - (vec->vec[1] * vec->vec[1]); - mat[5] = -(vec->vec[1] * vec->vec[2]); - mat[6] = -(vec->vec[0] * vec->vec[2]); - mat[7] = -(vec->vec[1] * vec->vec[2]); - mat[8] = 1 - (vec->vec[2] * vec->vec[2]); - } else { - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.OrthoProjectionMatrix(): unknown plane - expected: 'r' expected for axis designation\n"); - } - } - if(matSize == 4) { - //resize matrix - mat[10] = mat[8]; - mat[9] = mat[7]; - mat[8] = mat[6]; - mat[7] = 0.0f; - mat[6] = mat[5]; - mat[5] = mat[4]; - mat[4] = mat[3]; - mat[3] = 0.0f; - } - //pass to matrix creation - return newMatrixObject(mat, matSize, matSize, Py_NEW); -} -//----------------------------------Mathutils.ShearMatrix() ------------- -//creates a shear matrix -PyObject *M_Mathutils_ShearMatrix(PyObject * self, PyObject * args) -{ - int matSize; - char *plane; - float factor; - float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; - - if(!PyArg_ParseTuple(args, "sfi", &plane, &factor, &matSize)) { - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.ShearMatrix(): expected string float and int\n"); - } - if(matSize != 2 && matSize != 3 && matSize != 4) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.ShearMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n"); - - if(((strcmp(plane, "x") == 0) || (strcmp(plane, "X") == 0)) - && matSize == 2) { - mat[0] = 1.0f; - mat[2] = factor; - mat[3] = 1.0f; - } else if(((strcmp(plane, "y") == 0) - || (strcmp(plane, "Y") == 0)) && matSize == 2) { - mat[0] = 1.0f; - mat[1] = factor; - mat[3] = 1.0f; - } else if(((strcmp(plane, "xy") == 0) - || (strcmp(plane, "XY") == 0)) && matSize > 2) { - mat[0] = 1.0f; - mat[4] = 1.0f; - mat[6] = factor; - mat[7] = factor; - } else if(((strcmp(plane, "xz") == 0) - || (strcmp(plane, "XZ") == 0)) && matSize > 2) { - mat[0] = 1.0f; - mat[3] = factor; - mat[4] = 1.0f; - mat[5] = factor; - mat[8] = 1.0f; - } else if(((strcmp(plane, "yz") == 0) - || (strcmp(plane, "YZ") == 0)) && matSize > 2) { - mat[0] = 1.0f; - mat[1] = factor; - mat[2] = factor; - mat[4] = 1.0f; - mat[8] = 1.0f; - } else { - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.ShearMatrix(): expected: x, y, xy, xz, yz or wrong matrix size for shearing plane\n"); - } - if(matSize == 4) { - //resize matrix - mat[10] = mat[8]; - mat[9] = mat[7]; - mat[8] = mat[6]; - mat[7] = 0.0f; - mat[6] = mat[5]; - mat[5] = mat[4]; - mat[4] = mat[3]; - mat[3] = 0.0f; - } - //pass to matrix creation - return newMatrixObject(mat, matSize, matSize, Py_NEW); -} -//----------------------------------QUATERNION FUNCTIONS----------------- -//----------------------------------Mathutils.Quaternion() -------------- -PyObject *M_Mathutils_Quaternion(PyObject * self, PyObject * args) -{ - PyObject *listObject = NULL, *n, *q, *f; - int size, i; - float quat[4]; - double norm = 0.0f, angle = 0.0f; - - size = PySequence_Length(args); - if (size == 1 || size == 2) { //seq? - listObject = PySequence_GetItem(args, 0); - if (PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - if ((size == 4 && PySequence_Length(args) !=1) || - (size == 3 && PySequence_Length(args) !=2) || (size >4 || size < 3)) { - // invalid args/size - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - } - if(size == 3){ //get angle in axis/angle - n = PyNumber_Float(PySequence_GetItem(args, 1)); - if(n == NULL) { // parsed item not a number or getItem fail - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - } - angle = PyFloat_AS_DOUBLE(n); - Py_DECREF(n); - } - }else{ - listObject = PySequence_GetItem(args, 1); - if (size>1 && PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - if (size != 3) { - // invalid args/size - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - } - n = PyNumber_Float(PySequence_GetItem(args, 0)); - if(n == NULL) { // parsed item not a number or getItem fail - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - } - angle = PyFloat_AS_DOUBLE(n); - Py_DECREF(n); - } else { // argument was not a sequence - Py_XDECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - } - } - } else if (size == 0) { //returns a new empty quat - return newQuaternionObject(NULL, Py_NEW); - } else { - listObject = EXPP_incr_ret(args); - } - - if (size == 3) { // invalid quat size - if(PySequence_Length(args) != 2){ - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - } - }else{ - if(size != 4){ - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Quaternion(): 4d numeric sequence expected or 3d vector and number\n"); - } - } - - for (i=0; iquat, quatV->quat); - - return newQuaternionObject(quat, Py_NEW); -} -//----------------------------------Mathutils.DotQuats() ---------------- -//returns the dot product of 2 quaternions -PyObject *M_Mathutils_DotQuats(PyObject * self, PyObject * args) -{ - QuaternionObject *quatU = NULL, *quatV = NULL; - double dot = 0.0f; - int x; - - if(!PyArg_ParseTuple(args, "O!O!", &quaternion_Type, &quatU, - &quaternion_Type, &quatV)) - return EXPP_ReturnPyObjError(PyExc_TypeError, "Mathutils.DotQuats(): expected Quaternion types"); - - for(x = 0; x < 4; x++) { - dot += quatU->quat[x] * quatV->quat[x]; - } - return PyFloat_FromDouble(dot); -} -//----------------------------------Mathutils.DifferenceQuats() --------- -//returns the difference between 2 quaternions -PyObject *M_Mathutils_DifferenceQuats(PyObject * self, PyObject * args) -{ - QuaternionObject *quatU = NULL, *quatV = NULL; - float quat[4], tempQuat[4]; - double dot = 0.0f; - int x; - - if(!PyArg_ParseTuple(args, "O!O!", &quaternion_Type, - &quatU, &quaternion_Type, &quatV)) - return EXPP_ReturnPyObjError(PyExc_TypeError, "Mathutils.DifferenceQuats(): expected Quaternion types"); - - tempQuat[0] = quatU->quat[0]; - tempQuat[1] = -quatU->quat[1]; - tempQuat[2] = -quatU->quat[2]; - tempQuat[3] = -quatU->quat[3]; - - dot = sqrt(tempQuat[0] * tempQuat[0] + tempQuat[1] * tempQuat[1] + - tempQuat[2] * tempQuat[2] + tempQuat[3] * tempQuat[3]); - - for(x = 0; x < 4; x++) { - tempQuat[x] /= (float)(dot * dot); - } - QuatMul(quat, tempQuat, quatV->quat); - return newQuaternionObject(quat, Py_NEW); -} -//----------------------------------Mathutils.Slerp() ------------------ -//attemps to interpolate 2 quaternions and return the result -PyObject *M_Mathutils_Slerp(PyObject * self, PyObject * args) -{ - QuaternionObject *quatU = NULL, *quatV = NULL; - float quat[4], quat_u[4], quat_v[4], param; - double x, y, dot, sinT, angle, IsinT; - int z; - - if(!PyArg_ParseTuple(args, "O!O!f", &quaternion_Type, - &quatU, &quaternion_Type, &quatV, ¶m)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Slerp(): expected Quaternion types and float"); - - if(param > 1.0f || param < 0.0f) - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Slerp(): interpolation factor must be between 0.0 and 1.0"); - - //copy quats - for(z = 0; z < 4; z++){ - quat_u[z] = quatU->quat[z]; - quat_v[z] = quatV->quat[z]; - } - - //dot product - dot = quat_u[0] * quat_v[0] + quat_u[1] * quat_v[1] + - quat_u[2] * quat_v[2] + quat_u[3] * quat_v[3]; - - //if negative negate a quat (shortest arc) - if(dot < 0.0f) { - quat_v[0] = -quat_v[0]; - quat_v[1] = -quat_v[1]; - quat_v[2] = -quat_v[2]; - quat_v[3] = -quat_v[3]; - dot = -dot; - } - if(dot > .99999f) { //very close - x = 1.0f - param; - y = param; - } else { - //calculate sin of angle - sinT = sqrt(1.0f - (dot * dot)); - //calculate angle - angle = atan2(sinT, dot); - //caluculate inverse of sin(theta) - IsinT = 1.0f / sinT; - x = sin((1.0f - param) * angle) * IsinT; - y = sin(param * angle) * IsinT; - } - //interpolate - quat[0] = (float)(quat_u[0] * x + quat_v[0] * y); - quat[1] = (float)(quat_u[1] * x + quat_v[1] * y); - quat[2] = (float)(quat_u[2] * x + quat_v[2] * y); - quat[3] = (float)(quat_u[3] * x + quat_v[3] * y); - - return newQuaternionObject(quat, Py_NEW); -} -//----------------------------------EULER FUNCTIONS---------------------- -//----------------------------------Mathutils.Euler() ------------------- -//makes a new euler for you to play with -PyObject *M_Mathutils_Euler(PyObject * self, PyObject * args) -{ - - PyObject *listObject = NULL; - int size, i; - float eul[3]; - PyObject *e, *f; - - size = PySequence_Length(args); - if (size == 1) { - listObject = PySequence_GetItem(args, 0); - if (PySequence_Check(listObject)) { - size = PySequence_Length(listObject); - } else { // Single argument was not a sequence - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.Euler(): 3d numeric sequence expected\n"); - } - } else if (size == 0) { - //returns a new empty 3d euler - return newEulerObject(NULL, Py_NEW); - } else { - listObject = EXPP_incr_ret(args); - } - - if (size != 3) { // Invalid euler size - Py_DECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Euler(): 3d numeric sequence expected\n"); - } - - for (i=0; i3) { // Invalid vector size - Py_XDECREF(listObject); - return EXPP_ReturnPyObjError(PyExc_AttributeError, - "Mathutils.Point(): 2-3 floats or ints expected (optionally in a sequence)\n"); - } - - for (i=0; isize != 3 || vec2->size != 3 || vec3->size != 3 || - ray->size != 3 || ray_off->size != 3) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "only 3D vectors for all parameters\n" ) ); - - VECCOPY(v1, vec1->vec); - VECCOPY(v2, vec2->vec); - VECCOPY(v3, vec3->vec); - - VECCOPY(dir, ray->vec); - Normalize(dir); - - VECCOPY(orig, ray_off->vec); - - /* find vectors for two edges sharing v1 */ - VecSubf(e1, v2, v1); - VecSubf(e2, v3, v1); - - /* begin calculating determinant - also used to calculated U parameter */ - Crossf(pvec, dir, e2); - - /* if determinant is near zero, ray lies in plane of triangle */ - det = Inpf(e1, pvec); - - if (det > -0.000001 && det < 0.000001) { - return EXPP_incr_ret( Py_None ); - } - - inv_det = 1.0f / det; - - /* calculate distance from v1 to ray origin */ - VecSubf(tvec, orig, v1); - - /* calculate U parameter and test bounds */ - u = Inpf(tvec, pvec) * inv_det; - if (clip && (u < 0.0f || u > 1.0f)) { - return EXPP_incr_ret( Py_None ); - } - - /* prepare to test the V parameter */ - Crossf(qvec, tvec, e1); - - /* calculate V parameter and test bounds */ - v = Inpf(dir, qvec) * inv_det; - - if (clip && (v < 0.0f || u + v > 1.0f)) { - return EXPP_incr_ret( Py_None ); - } - - /* calculate t, ray intersects triangle */ - t = Inpf(e2, qvec) * inv_det; - - VecMulf(dir, t); - VecAddf(pvec, orig, dir); - - return newVectorObject(pvec, 3, Py_NEW); -} -//----------------------------------Mathutils.LineIntersect() ------------------- -/* Line-Line intersection using algorithm from mathworld.wolfram.com */ -PyObject *M_Mathutils_LineIntersect( PyObject * self, PyObject * args ) -{ - PyObject * tuple; - VectorObject *vec1, *vec2, *vec3, *vec4; - float v1[3], v2[3], v3[3], v4[3], i1[3], i2[3]; - - if( !PyArg_ParseTuple - ( args, "O!O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2 - , &vector_Type, &vec3, &vector_Type, &vec4 ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected 4 vector types\n" ) ); - if( vec1->size != vec2->size || vec1->size != vec3->size || vec1->size != vec2->size) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "vectors must be of the same size\n" ) ); - - if( vec1->size == 3 || vec1->size == 2) { - float a[3], b[3], c[3], ab[3], cb[3], dir1[3], dir2[3]; - float d; - if (vec1->size == 3) { - VECCOPY(v1, vec1->vec); - VECCOPY(v2, vec2->vec); - VECCOPY(v3, vec3->vec); - VECCOPY(v4, vec4->vec); - } - else { - v1[0] = vec1->vec[0]; - v1[1] = vec1->vec[1]; - v1[2] = 0.0f; - - v2[0] = vec2->vec[0]; - v2[1] = vec2->vec[1]; - v2[2] = 0.0f; - - v3[0] = vec3->vec[0]; - v3[1] = vec3->vec[1]; - v3[2] = 0.0f; - - v4[0] = vec4->vec[0]; - v4[1] = vec4->vec[1]; - v4[2] = 0.0f; - } - - VecSubf(c, v3, v1); - VecSubf(a, v2, v1); - VecSubf(b, v4, v3); - - VECCOPY(dir1, a); - Normalize(dir1); - VECCOPY(dir2, b); - Normalize(dir2); - d = Inpf(dir1, dir2); - if (d == 1.0f || d == -1.0f) { - /* colinear */ - return EXPP_incr_ret( Py_None ); - } - - Crossf(ab, a, b); - d = Inpf(c, ab); - - /* test if the two lines are coplanar */ - if (d > -0.000001f && d < 0.000001f) { - Crossf(cb, c, b); - - VecMulf(a, Inpf(cb, ab) / Inpf(ab, ab)); - VecAddf(i1, v1, a); - VECCOPY(i2, i1); - } - /* if not */ - else { - float n[3], t[3]; - VecSubf(t, v1, v3); - - /* offset between both plane where the lines lies */ - Crossf(n, a, b); - Projf(t, t, n); - - /* for the first line, offset the second line until it is coplanar */ - VecAddf(v3, v3, t); - VecAddf(v4, v4, t); - - VecSubf(c, v3, v1); - VecSubf(a, v2, v1); - VecSubf(b, v4, v3); - - Crossf(ab, a, b); - Crossf(cb, c, b); - - VecMulf(a, Inpf(cb, ab) / Inpf(ab, ab)); - VecAddf(i1, v1, a); - - /* for the second line, just substract the offset from the first intersection point */ - VecSubf(i2, i1, t); - } - - tuple = PyTuple_New( 2 ); - PyTuple_SetItem( tuple, 0, newVectorObject(i1, vec1->size, Py_NEW) ); - PyTuple_SetItem( tuple, 1, newVectorObject(i2, vec1->size, Py_NEW) ); - return tuple; - } - else { - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "2D/3D vectors only\n" ) ); - } -} - - - -//---------------------------------NORMALS FUNCTIONS-------------------- -//----------------------------------Mathutils.QuadNormal() ------------------- -PyObject *M_Mathutils_QuadNormal( PyObject * self, PyObject * args ) -{ - VectorObject *vec1; - VectorObject *vec2; - VectorObject *vec3; - VectorObject *vec4; - float v1[3], v2[3], v3[3], v4[3], e1[3], e2[3], n1[3], n2[3]; - - if( !PyArg_ParseTuple - ( args, "O!O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2 - , &vector_Type, &vec3, &vector_Type, &vec4 ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected 4 vector types\n" ) ); - if( vec1->size != vec2->size || vec1->size != vec3->size || vec1->size != vec4->size) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "vectors must be of the same size\n" ) ); - if( vec1->size != 3 ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "only 3D vectors\n" ) ); - - VECCOPY(v1, vec1->vec); - VECCOPY(v2, vec2->vec); - VECCOPY(v3, vec3->vec); - VECCOPY(v4, vec4->vec); - - /* find vectors for two edges sharing v2 */ - VecSubf(e1, v1, v2); - VecSubf(e2, v3, v2); - - Crossf(n1, e2, e1); - Normalize(n1); - - /* find vectors for two edges sharing v4 */ - VecSubf(e1, v3, v4); - VecSubf(e2, v1, v4); - - Crossf(n2, e2, e1); - Normalize(n2); - - /* adding and averaging the normals of both triangles */ - VecAddf(n1, n2, n1); - Normalize(n1); - - return newVectorObject(n1, 3, Py_NEW); -} - -//----------------------------Mathutils.TriangleNormal() ------------------- -PyObject *M_Mathutils_TriangleNormal( PyObject * self, PyObject * args ) -{ - VectorObject *vec1, *vec2, *vec3; - float v1[3], v2[3], v3[3], e1[3], e2[3], n[3]; - - if( !PyArg_ParseTuple - ( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2 - , &vector_Type, &vec3 ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected 3 vector types\n" ) ); - if( vec1->size != vec2->size || vec1->size != vec3->size ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "vectors must be of the same size\n" ) ); - if( vec1->size != 3 ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "only 3D vectors\n" ) ); - - VECCOPY(v1, vec1->vec); - VECCOPY(v2, vec2->vec); - VECCOPY(v3, vec3->vec); - - /* find vectors for two edges sharing v2 */ - VecSubf(e1, v1, v2); - VecSubf(e2, v3, v2); - - Crossf(n, e2, e1); - Normalize(n); - - return newVectorObject(n, 3, Py_NEW); -} - -//--------------------------------- AREA FUNCTIONS-------------------- -//----------------------------------Mathutils.TriangleArea() ------------------- -PyObject *M_Mathutils_TriangleArea( PyObject * self, PyObject * args ) -{ - VectorObject *vec1, *vec2, *vec3; - float v1[3], v2[3], v3[3]; - - if( !PyArg_ParseTuple - ( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2 - , &vector_Type, &vec3 ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected 3 vector types\n" ) ); - if( vec1->size != vec2->size || vec1->size != vec3->size ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "vectors must be of the same size\n" ) ); - - if (vec1->size == 3) { - VECCOPY(v1, vec1->vec); - VECCOPY(v2, vec2->vec); - VECCOPY(v3, vec3->vec); - - return PyFloat_FromDouble( AreaT3Dfl(v1, v2, v3) ); - } - else if (vec1->size == 2) { - v1[0] = vec1->vec[0]; - v1[1] = vec1->vec[1]; - - v2[0] = vec2->vec[0]; - v2[1] = vec2->vec[1]; - - v3[0] = vec3->vec[0]; - v3[1] = vec3->vec[1]; - - return PyFloat_FromDouble( AreaF2Dfl(v1, v2, v3) ); - } - else { - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "only 2D,3D vectors are supported\n" ) ); - } -} -//#############################DEPRECATED################################ -//####################################################################### -//----------------------------------Mathutils.CopyMat() ----------------- -//copies a matrix into a new matrix -PyObject *M_Mathutils_CopyMat(PyObject * self, PyObject * args) -{ - PyObject *matrix = NULL; - static char warning = 1; - - if( warning ) { - printf("Mathutils.CopyMat(): deprecated :use Mathutils.Matrix() to copy matrices\n"); - --warning; - } - - matrix = M_Mathutils_Matrix(self, args); - if(matrix == NULL) - return NULL; //error string already set if we get here - else - return matrix; -} -//----------------------------------Mathutils.CopyVec() ----------------- -//makes a new vector that is a copy of the input -PyObject *M_Mathutils_CopyVec(PyObject * self, PyObject * args) -{ - PyObject *vec = NULL; - static char warning = 1; - - if( warning ) { - printf("Mathutils.CopyVec(): Deprecated: use Mathutils.Vector() to copy vectors\n"); - --warning; - } - - vec = M_Mathutils_Vector(self, args); - if(vec == NULL) - return NULL; //error string already set if we get here - else - return vec; -} -//----------------------------------Mathutils.CopyQuat() -------------- -//Copies a quaternion to a new quat -PyObject *M_Mathutils_CopyQuat(PyObject * self, PyObject * args) -{ - PyObject *quat = NULL; - static char warning = 1; - - if( warning ) { - printf("Mathutils.CopyQuat(): Deprecated: use Mathutils.Quaternion() to copy vectors\n"); - --warning; - } - - quat = M_Mathutils_Quaternion(self, args); - if(quat == NULL) - return NULL; //error string already set if we get here - else - return quat; -} -//----------------------------------Mathutils.CopyEuler() --------------- -//copies a euler to a new euler -PyObject *M_Mathutils_CopyEuler(PyObject * self, PyObject * args) -{ - PyObject *eul = NULL; - static char warning = 1; - - if( warning ) { - printf("Mathutils.CopyEuler(): deprecated:use Mathutils.Euler() to copy vectors\n"); - --warning; - } - - eul = M_Mathutils_Euler(self, args); - if(eul == NULL) - return NULL; //error string already set if we get here - else - return eul; -} -//----------------------------------Mathutils.RotateEuler() ------------ -//rotates a euler a certain amount and returns the result -//should return a unique euler rotation (i.e. no 720 degree pitches :) -PyObject *M_Mathutils_RotateEuler(PyObject * self, PyObject * args) -{ - EulerObject *Eul = NULL; - float angle; - char *axis; - static char warning = 1; - - if( warning ) { - printf("Mathutils.RotateEuler(): Deprecated:use Euler.rotate() to rotate a euler\n"); - --warning; - } - - if(!PyArg_ParseTuple(args, "O!fs", &euler_Type, &Eul, &angle, &axis)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.RotateEuler(): expected euler type & float & string"); - - Euler_Rotate(Eul, Py_BuildValue("fs", angle, axis)); - Py_RETURN_NONE; -} -//----------------------------------Mathutils.MatMultVec() -------------- -//COLUMN VECTOR Multiplication (Matrix X Vector) -PyObject *M_Mathutils_MatMultVec(PyObject * self, PyObject * args) -{ - MatrixObject *mat = NULL; - VectorObject *vec = NULL; - static char warning = 1; - - if( warning ) { - printf("Mathutils.MatMultVec(): Deprecated: use matrix * vec to perform column vector multiplication\n"); - --warning; - } - - //get pyObjects - if(!PyArg_ParseTuple(args, "O!O!", &matrix_Type, &mat, &vector_Type, &vec)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.MatMultVec(): MatMultVec() expects a matrix and a vector object - in that order\n"); - - return column_vector_multiplication(mat, vec); -} -//----------------------------------Mathutils.VecMultMat() --------------- -//ROW VECTOR Multiplication - Vector X Matrix -PyObject *M_Mathutils_VecMultMat(PyObject * self, PyObject * args) -{ - MatrixObject *mat = NULL; - VectorObject *vec = NULL; - static char warning = 1; - - if( warning ) { - printf("Mathutils.VecMultMat(): Deprecated: use vec * matrix to perform row vector multiplication\n"); - --warning; - } - - //get pyObjects - if(!PyArg_ParseTuple(args, "O!O!", &vector_Type, &vec, &matrix_Type, &mat)) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "Mathutils.VecMultMat(): VecMultMat() expects a vector and matrix object - in that order\n"); - - return row_vector_multiplication(vec, mat); -} -//####################################################################### -//#############################DEPRECATED################################ diff --git a/source/blender/python/api2_2x/Mathutils.h b/source/blender/python/api2_2x/Mathutils.h deleted file mode 100644 index 56d96d8f281..00000000000 --- a/source/blender/python/api2_2x/Mathutils.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * $Id: Mathutils.h 10943 2007-06-16 12:24:41Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ -//Include this file for access to vector, quat, matrix, euler, etc... - -#ifndef EXPP_Mathutils_H -#define EXPP_Mathutils_H - -#include -#include "vector.h" -#include "matrix.h" -#include "quat.h" -#include "euler.h" -#include "point.h" - -PyObject *Mathutils_Init( void ); -PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat); -PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec); -PyObject *row_point_multiplication(PointObject* pt, MatrixObject * mat); -PyObject *column_point_multiplication(MatrixObject * mat, PointObject* pt); -PyObject *quat_rotation(PyObject *arg1, PyObject *arg2); - -PyObject *M_Mathutils_Rand(PyObject * self, PyObject * args); -PyObject *M_Mathutils_Vector(PyObject * self, PyObject * args); -PyObject *M_Mathutils_CrossVecs(PyObject * self, PyObject * args); -PyObject *M_Mathutils_DotVecs(PyObject * self, PyObject * args); -PyObject *M_Mathutils_AngleBetweenVecs(PyObject * self, PyObject * args); -PyObject *M_Mathutils_MidpointVecs(PyObject * self, PyObject * args); -PyObject *M_Mathutils_ProjectVecs(PyObject * self, PyObject * args); -PyObject *M_Mathutils_Matrix(PyObject * self, PyObject * args); -PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args); -PyObject *M_Mathutils_TranslationMatrix(PyObject * self, VectorObject * value); -PyObject *M_Mathutils_ScaleMatrix(PyObject * self, PyObject * args); -PyObject *M_Mathutils_OrthoProjectionMatrix(PyObject * self, PyObject * args); -PyObject *M_Mathutils_ShearMatrix(PyObject * self, PyObject * args); -PyObject *M_Mathutils_Quaternion(PyObject * self, PyObject * args); -PyObject *M_Mathutils_CrossQuats(PyObject * self, PyObject * args); -PyObject *M_Mathutils_DotQuats(PyObject * self, PyObject * args); -PyObject *M_Mathutils_DifferenceQuats(PyObject * self, PyObject * args); -PyObject *M_Mathutils_Slerp(PyObject * self, PyObject * args); -PyObject *M_Mathutils_Euler(PyObject * self, PyObject * args); -PyObject *M_Mathutils_Intersect( PyObject * self, PyObject * args ); -PyObject *M_Mathutils_TriangleArea( PyObject * self, PyObject * args ); -PyObject *M_Mathutils_TriangleNormal( PyObject * self, PyObject * args ); -PyObject *M_Mathutils_QuadNormal( PyObject * self, PyObject * args ); -PyObject *M_Mathutils_LineIntersect( PyObject * self, PyObject * args ); -PyObject *M_Mathutils_Point(PyObject * self, PyObject * args); -//DEPRECATED -PyObject *M_Mathutils_CopyMat(PyObject * self, PyObject * args); -PyObject *M_Mathutils_CopyVec(PyObject * self, PyObject * args); -PyObject *M_Mathutils_CopyQuat(PyObject * self, PyObject * args); -PyObject *M_Mathutils_CopyEuler(PyObject * self, PyObject * args); -PyObject *M_Mathutils_RotateEuler(PyObject * self, PyObject * args); -PyObject *M_Mathutils_MatMultVec(PyObject * self, PyObject * args); -PyObject *M_Mathutils_VecMultMat(PyObject * self, PyObject * args); - -#endif /* EXPP_Mathutils_H */ diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c deleted file mode 100644 index 4424fd08ffd..00000000000 --- a/source/blender/python/api2_2x/Mesh.c +++ /dev/null @@ -1,8677 +0,0 @@ -/* - * $Id: Mesh.c 12892 2007-12-15 17:41:13Z joeedh $ - * - * ***** 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. - * - * This is a new part of Blender, partially based on NMesh.c API. - * - * Contributor(s): Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Mesh.h" /*This must come first*/ - -#include "MEM_guardedalloc.h" - -#include "DNA_key_types.h" -#include "DNA_armature_types.h" -#include "DNA_scene_types.h" -#include "DNA_oops_types.h" -#include "DNA_space_types.h" -#include "DNA_curve_types.h" -#include "DNA_meta_types.h" -#include "DNA_modifier_types.h" - -#include "BDR_editface.h" /* make_tfaces */ -#include "BDR_vpaint.h" -#include "BDR_editobject.h" - -#include "BIF_editdeform.h" -#include "BIF_editkey.h" /* insert_meshkey */ -#include "BIF_space.h" /* REMAKEIPO - insert_meshkey */ -#include "BIF_editview.h" -#include "BIF_editmesh.h" -#include "BIF_meshtools.h" - -#include "BKE_customdata.h" -#include "BKE_deform.h" -#include "BKE_displist.h" -#include "BKE_mesh.h" -#include "BKE_material.h" -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_DerivedMesh.h" -#include "BKE_object.h" -#include "BKE_mball.h" -#include "BKE_utildefines.h" -#include "BKE_depsgraph.h" -#include "BSE_edit.h" /* for countall(); */ -#include "BKE_curve.h" /* for copy_curve(); */ -#include "BKE_modifier.h" /* for modifier_new(), modifier_copyData(); */ -#include "BKE_idprop.h" - -#include "BLI_arithb.h" -#include "BLI_blenlib.h" - -#include "blendef.h" -#include "mydevice.h" -#include "butspace.h" /* for mesh tools */ -#include "Object.h" -#include "Key.h" -#include "Image.h" -#include "Material.h" -#include "Mathutils.h" -#include "IDProp.h" -#include "meshPrimitive.h" -#include "constant.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "multires.h" - -/* EXPP Mesh defines */ - -#define MESH_SMOOTHRESH 30 -#define MESH_SMOOTHRESH_MIN 1 -#define MESH_SMOOTHRESH_MAX 80 -#define MESH_SUBDIV 1 -#define MESH_SUBDIV_MIN 0 -#define MESH_SUBDIV_MAX 6 - -#define MESH_HASFACEUV 0 -#define MESH_HASMCOL 1 -#define MESH_HASVERTUV 2 -#define MESH_HASMULTIRES 3 - -#define MESH_MULTIRES_LEVEL 0 -#define MESH_MULTIRES_EDGE 1 -#define MESH_MULTIRES_PIN 2 -#define MESH_MULTIRES_RENDER 3 - -#define MESH_TOOL_TOSPHERE 0 -#define MESH_TOOL_VERTEXSMOOTH 1 -#define MESH_TOOL_FLIPNORM 2 -#define MESH_TOOL_SUBDIV 3 -#define MESH_TOOL_REMDOUB 4 -#define MESH_TOOL_FILL 5 -#define MESH_TOOL_RECALCNORM 6 -#define MESH_TOOL_TRI2QUAD 7 -#define MESH_TOOL_QUAD2TRI 8 - -static PyObject *MVertSeq_CreatePyObject( Mesh * mesh ); -static PyObject *MFaceSeq_CreatePyObject( Mesh * mesh ); -static PyObject *MEdgeSeq_CreatePyObject( Mesh * mesh ); -static PyObject *MFace_CreatePyObject( Mesh * mesh, int i ); -static PyObject *MEdge_CreatePyObject( Mesh * mesh, int i ); - -#define MFACE_VERT_BADRANGE_CHECK(me, face) ((int)face->v1 >= me->totvert || (int)face->v2 >= me->totvert || (int)face->v3 >= me->totvert || (int)face->v4 >= me->totvert) -#define MEDGE_VERT_BADRANGE_CHECK(me, edge) ((int)edge->v1 >= me->totvert || (int)edge->v2 >= me->totvert) - -/************************************************************************ - * - * internal utilities - * - ************************************************************************/ - -/* - * internal structures used for sorting edges and faces - */ - -typedef struct SrchEdges { - unsigned int v[2]; /* indices for verts */ - unsigned char swap; /* non-zero if verts swapped */ - unsigned int index; /* index in original param list of this edge */ - /* (will be used by findEdges) */ -} SrchEdges; - -typedef struct SrchFaces { - unsigned int v[4]; /* indices for verts */ - unsigned int index; /* index in original param list of this edge */ - unsigned char order; /* order of original verts, bitpacked */ -} SrchFaces; - -typedef struct FaceEdges { - unsigned int v[2]; /* search key (vert indices) */ - unsigned int index; /* location in edge list */ - unsigned char sel; /* selection state */ -} FaceEdges; - -/* - * compare edges by vertex indices - */ - -int medge_comp( const void *va, const void *vb ) -{ - const unsigned int *a = ((SrchEdges *)va)->v; - const unsigned int *b = ((SrchEdges *)vb)->v; - - /* compare first index for differences */ - - if (a[0] < b[0]) return -1; - else if (a[0] > b[0]) return 1; - - /* if first indices equal, compare second index for differences */ - - else if (a[1] < b[1]) return -1; - else return (a[1] > b[1]); -} - -/* - * compare edges by insert list indices - */ - -int medge_index_comp( const void *va, const void *vb ) -{ - const SrchEdges *a = (SrchEdges *)va; - const SrchEdges *b = (SrchEdges *)vb; - - /* compare list indices for differences */ - - if (a->index < b->index) return -1; - else return (a->index > b->index); -} - - -/* - * compare faces by vertex indices - */ - -int mface_comp( const void *va, const void *vb ) -{ - const SrchFaces *a = va; - const SrchFaces *b = vb; - int i; - - /* compare indices, first to last, for differences */ - for( i = 0; i < 4; ++i ) { - if( a->v[i] < b->v[i] ) - return -1; - if( a->v[i] > b->v[i] ) - return 1; - } - - /* - * don't think this needs be done; if order is different then either - * (a) the face is good, just reversed or has a different starting - * vertex, or (b) face is bad (for 4 verts) and there's a "twist" - */ - -#if 0 - /* if all the same verts, compare their order */ - if( a->order < b->order ) - return -1; - if( a->order > b->order ) - return 1; -#endif - - return 0; -} - -/* - * compare faces by insert list indices - */ - -int mface_index_comp( const void *va, const void *vb ) -{ - const SrchFaces *a = va; - const SrchFaces *b = vb; - - /* compare indices, first to last, for differences */ - if( a->index < b->index ) - return -1; - if( a->index > b->index ) - return 1; - return 0; -} - -/* - * compare edges by vertex indices - */ - -int faceedge_comp( const void *va, const void *vb ) -{ - const unsigned int *a = ((FaceEdges *)va)->v; - const unsigned int *b = ((FaceEdges *)vb)->v; - - /* compare first index for differences */ - - if (a[0] < b[0]) return -1; - else if (a[0] > b[0]) return 1; - - /* if first indices equal, compare second index for differences */ - - else if (a[1] < b[1]) return -1; - else return (a[1] > b[1]); -} - -/* - * update the DAG for all objects linked to this mesh - */ - -static void mesh_update( Mesh * mesh ) -{ - Object_updateDag( (void *) mesh ); -} - -/* - * delete vertices from mesh, then delete edges/keys/faces which used those - * vertices - * - * Deletion is done by "smart compaction"; groups of verts/edges/faces which - * remain in the list are copied to new list instead of one at a time. Since - * Blender has no realloc we would have to copy things anyway, so there's no - * point trying to fill empty entries with data from the end of the lists. - * - * vert_table is a lookup table for mapping old verts to new verts (after the - * vextex list has deleted vertices removed). Each entry contains the - * vertex's new index. - */ - -static void delete_verts( Mesh *mesh, unsigned int *vert_table, int to_delete ) -{ - /* - * (1) allocate vertex table (initialize contents to 0) - * (2) mark each vertex being deleted in vertex table (= UINT_MAX) - * (3) update remaining table entries with "new" vertex index (after - * compaction) - * (4) allocate new vertex list - * (5) do "smart copy" of vertices from old to new - * * each moved vertex is entered into vertex table: if vertex i is - * moving to index j in new list - * vert_table[i] = j; - * (6) if keys, do "smart copy" of keys - * (7) process edge list - * update vert index - * delete edges which delete verts - * (7) allocate new edge list - * (8) do "smart copy" of edges - * (9) allocate new face list - * (10) do "smart copy" of face - */ - - unsigned int *tmpvert; - CustomData vdata; - int i, count, state, dstindex, totvert; - - totvert = mesh->totvert - to_delete; - CustomData_copy( &mesh->vdata, &vdata, CD_MASK_MESH, CD_CALLOC, totvert ); - - /* - * do "smart compaction" of the table; find and copy groups of vertices - * which are not being deleted - */ - - dstindex = 0; - tmpvert = vert_table; - count = 0; - state = 1; - for( i = 0; i < mesh->totvert; ++i, ++tmpvert ) { - switch( state ) { - case 0: /* skipping verts */ - if( *tmpvert == UINT_MAX ) { - ++count; - } else { - count = 1; - state = 1; - } - break; - case 1: /* gathering verts */ - if( *tmpvert != UINT_MAX ) { - ++count; - } else { - if( count ) { - CustomData_copy_data( &mesh->vdata, &vdata, i-count, - dstindex, count ); - dstindex += count; - } - count = 1; - state = 0; - } - } - } - - /* if we were gathering verts at the end of the loop, copy those */ - if( state && count ) - CustomData_copy_data( &mesh->vdata, &vdata, i-count, dstindex, count ); - - /* delete old vertex list, install the new one, update vertex count */ - CustomData_free( &mesh->vdata, mesh->totvert ); - mesh->vdata = vdata; - mesh->totvert = totvert; - mesh_update_customdata_pointers( mesh ); -} - -static void delete_edges( Mesh *mesh, unsigned int *vert_table, int to_delete ) -{ - int i; - MEdge *tmpedge; - - /* if not given, then mark and count edges to be deleted */ - if( !to_delete ) { - tmpedge = mesh->medge; - for( i = mesh->totedge; i-- ; ++tmpedge ) - if( vert_table[tmpedge->v1] == UINT_MAX || - vert_table[tmpedge->v2] == UINT_MAX ) { - tmpedge->v1 = UINT_MAX; - ++to_delete; - } - } - - /* if there are edges to delete, handle it */ - if( to_delete ) { - CustomData edata; - int count, state, dstindex, totedge; - - /* allocate new edge list and populate */ - totedge = mesh->totedge - to_delete; - CustomData_copy( &mesh->edata, &edata, CD_MASK_MESH, CD_CALLOC, totedge); - - /* - * do "smart compaction" of the edges; find and copy groups of edges - * which are not being deleted - */ - - dstindex = 0; - tmpedge = mesh->medge; - count = 0; - state = 1; - for( i = 0; i < mesh->totedge; ++i, ++tmpedge ) { - switch( state ) { - case 0: /* skipping edges */ - if( tmpedge->v1 == UINT_MAX ) { - ++count; - } else { - count = 1; - state = 1; - } - break; - case 1: /* gathering edges */ - if( tmpedge->v1 != UINT_MAX ) { - ++count; - } else { - if( count ) { - CustomData_copy_data( &mesh->edata, &edata, i-count, - dstindex, count ); - dstindex += count; - } - count = 1; - state = 0; - } - } - /* if edge is good, update vertex indices */ - } - - /* copy any pending good edges */ - if( state && count ) - CustomData_copy_data( &mesh->edata, &edata, i-count, dstindex, - count ); - - /* delete old edge list, install the new one, update vertex count */ - CustomData_free( &mesh->edata, mesh->totedge ); - mesh->edata = edata; - mesh->totedge = totedge; - mesh_update_customdata_pointers( mesh ); - } - - /* if vertices were deleted, update edge's vertices */ - if( vert_table ) { - tmpedge = mesh->medge; - for( i = mesh->totedge; i--; ++tmpedge ) { - tmpedge->v1 = vert_table[tmpedge->v1]; - tmpedge->v2 = vert_table[tmpedge->v2]; - } - } -} - -/* -* Since all faces must have 3 or 4 verts, we can't have v3 or v4 be zero. -* If that happens during the deletion, we have to shuffle the vertices -* around; otherwise it can cause an Eeekadoodle or worse. If there are -* texture faces as well, they have to be shuffled as well. -* -* (code borrowed from test_index_face() in mesh.c, but since we know the -* faces already have correct number of vertices, this is a little faster) -*/ - -static void eeek_fix( MFace *mface, int len4 ) -{ - /* if 4 verts, then neither v3 nor v4 can be zero */ - if( len4 ) { - if( !mface->v3 || !mface->v4 ) { - SWAP( int, mface->v1, mface->v3 ); - SWAP( int, mface->v2, mface->v4 ); - } - } else if( !mface->v3 ) { - /* if 2 verts, then just v3 cannot be zero (v4 MUST be zero) */ - SWAP( int, mface->v1, mface->v2 ); - SWAP( int, mface->v2, mface->v3 ); - } -} - -static void delete_faces( Mesh *mesh, unsigned int *vert_table, int to_delete ) -{ - int i; - MFace *tmpface; - - /* if there are faces to delete, handle it */ - if( to_delete ) { - CustomData fdata; - int count, state, dstindex, totface; - - totface = mesh->totface - to_delete; - CustomData_copy( &mesh->fdata, &fdata, CD_MASK_MESH, CD_CALLOC, totface ); - - /* - * do "smart compaction" of the faces; find and copy groups of faces - * which are not being deleted - */ - - dstindex = 0; - tmpface = mesh->mface; - - count = 0; - state = 1; - for( i = 0; i < mesh->totface; ++i ) { - switch( state ) { - case 0: /* skipping faces */ - if( tmpface->v1 == UINT_MAX ) { - ++count; - } else { - count = 1; - state = 1; - } - break; - case 1: /* gathering faces */ - if( tmpface->v1 != UINT_MAX ) { - ++count; - } else { - if( count ) { - CustomData_copy_data( &mesh->fdata, &fdata, i-count, - dstindex, count ); - dstindex += count; - } - count = 1; - state = 0; - } - } - ++tmpface; - } - - /* if we were gathering faces at the end of the loop, copy those */ - if ( state && count ) - CustomData_copy_data( &mesh->fdata, &fdata, i-count, dstindex, - count ); - - /* delete old face list, install the new one, update face count */ - - CustomData_free( &mesh->fdata, mesh->totface ); - mesh->fdata = fdata; - mesh->totface = totface; - mesh_update_customdata_pointers( mesh ); - } - - /* if vertices were deleted, update face's vertices */ - if( vert_table ) { - tmpface = mesh->mface; - - for( i = 0; itotface; ++i, ++tmpface ) { - int len4 = tmpface->v4; - tmpface->v1 = vert_table[tmpface->v1]; - tmpface->v2 = vert_table[tmpface->v2]; - tmpface->v3 = vert_table[tmpface->v3]; - if(len4) - tmpface->v4 = vert_table[tmpface->v4]; - else - tmpface->v4 = 0; - - test_index_face( tmpface, &mesh->fdata, i, len4? 4: 3); - } - } -} - -/* - * fill up vertex lookup table with old-to-new mappings - * - * returns the number of vertices marked for deletion - */ - -static unsigned int make_vertex_table( unsigned int *vert_table, int count ) -{ - int i; - unsigned int *tmpvert = vert_table; - unsigned int to_delete = 0; - unsigned int new_index = 0; - - /* fill the lookup table with old->new index mappings */ - for( i = count; i; --i, ++tmpvert ) { - if( *tmpvert == UINT_MAX ) { - ++to_delete; - } else { - *tmpvert = new_index; - ++new_index; - } - } - return to_delete; -} - - -/************************************************************************ - * - * Color attributes - * - ************************************************************************/ - -/* - * get a color attribute - */ - -static PyObject *MCol_getAttr( BPy_MCol * self, void *type ) -{ - unsigned char param; - - switch( (long)type ) { - case 'R': /* these are backwards, but that how it works */ - param = self->color->b; - break; - case 'G': - param = self->color->g; - break; - case 'B': /* these are backwards, but that how it works */ - param = self->color->r; - break; - case 'A': - param = self->color->a; - break; - default: - { - char errstr[1024]; - sprintf( errstr, "undefined type '%d' in MCol_getAttr", - (int)((long)type & 0xff)); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, errstr ); - } - } - - return PyInt_FromLong( param ); -} - -/* - * set a color attribute - */ - -static int MCol_setAttr( BPy_MCol * self, PyObject * value, void * type ) -{ - unsigned char *param; - - switch( (long)type ) { - case 'R': /* these are backwards, but that how it works */ - param = (unsigned char *)&self->color->b; - break; - case 'G': - param = (unsigned char *)&self->color->g; - break; - case 'B': /* these are backwards, but that how it works */ - param = (unsigned char *)&self->color->r; - break; - case 'A': - param = (unsigned char *)&self->color->a; - break; - default: - { - char errstr[1024]; - sprintf( errstr, "undefined type '%d' in MCol_setAttr", - (int)((long)type & 0xff)); - return EXPP_ReturnIntError( PyExc_RuntimeError, errstr ); - } - } - - return EXPP_setIValueClamped( value, param, 0, 255, 'b' ); -} - -/************************************************************************ - * - * Python MCol_Type attributes get/set structure - * - ************************************************************************/ - -static PyGetSetDef BPy_MCol_getseters[] = { - {"r", - (getter)MCol_getAttr, (setter)MCol_setAttr, - "red component", - (void *)'R'}, - {"g", - (getter)MCol_getAttr, (setter)MCol_setAttr, - "green component", - (void *)'G'}, - {"b", - (getter)MCol_getAttr, (setter)MCol_setAttr, - "blue component", - (void *)'B'}, - {"a", - (getter)MCol_getAttr, (setter)MCol_setAttr, - "alpha component", - (void *)'A'}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/*----------------------------object[]--------------------------- - sequence accessor (get)*/ -static PyObject *MCol_item(BPy_MCol * self, int i) -{ - unsigned char param; - switch (i) { - case 0: - param = self->color->b; - break; - case 1: - param = self->color->g; - break; - case 2: - param = self->color->r; - break; - case 3: - param = self->color->a; - break; - default: - return EXPP_ReturnPyObjError(PyExc_IndexError, - "vector[index] = x: assignment index out of range\n"); - } - - return PyInt_FromLong( param ); -} - -/*----------------------------object[]------------------------- - sequence accessor (set)*/ -static int MCol_ass_item(BPy_MCol * self, int i, PyObject * value) -{ - unsigned char *param; - - switch (i) { - case 0: - param = (unsigned char *)&self->color->b; /* reversed? why */ - break; - case 1: - param = (unsigned char *)&self->color->g; - break; - case 2: - param = (unsigned char *)&self->color->r; /* reversed? why */ - break; - case 3: - param = (unsigned char *)&self->color->a; - break; - default: - { - return EXPP_ReturnIntError( PyExc_RuntimeError, "Index out of range" ); - } - } - return EXPP_setIValueClamped( value, param, 0, 255, 'b' ); -} - -/************************************************************************ - * - * Python MCol_Type methods - * - ************************************************************************/ - -static PyObject *MCol_repr( BPy_MCol * self ) -{ - return PyString_FromFormat( "[MCol %d %d %d %d]", - (int)self->color->b, (int)self->color->g, - (int)self->color->r, (int)self->color->a ); -} - -/*-----------------PROTCOL DECLARATIONS--------------------------*/ -static PySequenceMethods MCol_SeqMethods = { - (inquiry) NULL, /* sq_length */ - (binaryfunc) NULL, /* sq_concat */ - (intargfunc) NULL, /* sq_repeat */ - (intargfunc) MCol_item, /* sq_item */ - (intintargfunc) NULL, /* sq_slice */ - (intobjargproc) MCol_ass_item, /* sq_ass_item */ - (intintobjargproc) NULL, /* sq_ass_slice */ -}; - -/************************************************************************ - * - * Python MCol_Type structure definition - * - ************************************************************************/ - -PyTypeObject MCol_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MCol", /* char *tp_name; */ - sizeof( BPy_MCol ), /* 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 ) MCol_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &MCol_SeqMethods, /* 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_MCol_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 -}; - -static PyObject *MCol_CreatePyObject( MCol * color ) -{ - BPy_MCol *obj = PyObject_NEW( BPy_MCol, &MCol_Type ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - obj->color = color; - return (PyObject *)obj; -} - -/************************************************************************ - * - * BPy_MVert attributes - * - ************************************************************************/ - -static MVert * MVert_get_pointer( BPy_MVert * self ) -{ - if( BPy_MVert_Check( self ) ) { - if( self->index >= ((Mesh *)self->data)->totvert ) - return (MVert *)EXPP_ReturnPyObjError( PyExc_RuntimeError, - "MVert is no longer valid" ); - return &((Mesh *)self->data)->mvert[self->index]; - } - else - return (MVert *)self->data; -} - -/* - * get a vertex's coordinate - */ - -static PyObject *MVert_getCoord( BPy_MVert * self ) -{ - MVert *v; - - v = MVert_get_pointer( self ); - if( !v ) - return NULL; - - return newVectorObject( v->co, 3, Py_WRAP ); -} - -/* - * set a vertex's coordinate - */ - -static int MVert_setCoord( BPy_MVert * self, VectorObject * value ) -{ - int i; - MVert *v; - - v = MVert_get_pointer( self ); - if( !v ) - return -1; - - if( !VectorObject_Check( value ) || value->size != 3 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected vector argument of size 3" ); - - for( i=0; i<3 ; ++i) - v->co[i] = value->vec[i]; - - return 0; -} - -/* - * get a vertex's index - */ - -static PyObject *MVert_getIndex( BPy_MVert * self ) -{ - if( self->index >= ((Mesh *)self->data)->totvert ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "MVert is no longer valid" ); - - return PyInt_FromLong( self->index ); -} - - -/* - * get a verts's hidden state - */ - -static PyObject *MVert_getMFlagBits( BPy_MVert * self, void * type ) -{ - MVert *v; - - v = MVert_get_pointer( self ); - if (!v) - return NULL; /* error is set */ - - return EXPP_getBitfield( &v->flag, (int)((long)type & 0xff), 'b' ); -} - - -/* - * set a verts's hidden state - */ - -static int MVert_setMFlagBits( BPy_MVert * self, PyObject * value, - void * type ) -{ - MVert *v; - - v = MVert_get_pointer( self ); - - if (!v) - return -1; /* error is set */ - - return EXPP_setBitfield( value, &v->flag, - (int)((long)type & 0xff), 'b' ); -} - - -/* - * get a vertex's normal - */ - -static PyObject *MVert_getNormal( BPy_MVert * self ) -{ - float no[3]; - int i; - MVert *v; - - v = MVert_get_pointer( self ); - if( !v ) - return NULL; /* error set */ - - for( i = 0; i < 3; ++i ) - no[i] = (float)(v->no[i] / 32767.0); - return newVectorObject( no, 3, Py_NEW ); -} - -/* - * set a vertex's normal - */ - -static int MVert_setNormal( BPy_MVert * self, VectorObject * value ) -{ - int i; - MVert *v; - float normal[3]; - - v = MVert_get_pointer( self ); - if( !v ) - return -1; /* error set */ - - if( !VectorObject_Check( value ) || value->size != 3 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected vector argument of size 3" ); - - - for( i=0; i<3 ; ++i) - normal[i] = value->vec[i]; - - Normalize(normal); - - for( i=0; i<3 ; ++i) - v->no[i] = (short)(normal[i]*32767.0); - - return 0; -} - - -/* - * get a vertex's select status - */ - -static PyObject *MVert_getSel( BPy_MVert *self ) -{ - MVert *v; - - v = MVert_get_pointer( self ); - if( !v ) - return NULL; /* error is set */ - - return EXPP_getBitfield( &v->flag, SELECT, 'b' ); -} - -/* - * set a vertex's select status - */ - -static int MVert_setSel( BPy_MVert *self, PyObject *value ) -{ - MVert *v = MVert_get_pointer( self ); - Mesh *me = (Mesh *)self->data; - if (!v) - return -1; /* error is set */ - - /* - * if vertex exists and setting status is OK, delete select storage - * of the edges and faces as well - */ - - if( v && !EXPP_setBitfield( value, &v->flag, SELECT, 'b' ) ) { - if( me && me->mselect ) { - MEM_freeN( me->mselect ); - me->mselect = NULL; - } - return 0; - } - return -1; -} - -/* - * get a vertex's UV coordinates - */ - -static PyObject *MVert_getUVco( BPy_MVert *self ) -{ - Mesh *me = (Mesh *)self->data; - - if( !me->msticky ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh has no 'sticky' coordinates" ); - - if( self->index >= ((Mesh *)self->data)->totvert ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "MVert is no longer valid" ); - - return newVectorObject( me->msticky[self->index].co, 2, Py_WRAP ); -} - -/* - * set a vertex's UV coordinates - */ - -static int MVert_setUVco( BPy_MVert *self, PyObject *value ) -{ - float uvco[3] = {0.0, 0.0}; - Mesh *me = (Mesh *)self->data; - struct MSticky *v; - int i; - - /* - * at least for now, don't allow creation of sticky coordinates if they - * don't already exist - */ - - if( !me->msticky ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "mesh has no 'sticky' coordinates" ); - - if( self->index >= ((Mesh *)self->data)->totvert ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "MVert is no longer valid" ); - - if( VectorObject_Check( value ) ) { - VectorObject *vect = (VectorObject *)value; - if( vect->size != 2 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected 2D vector" ); - for( i = 0; i < vect->size; ++i ) - uvco[i] = vect->vec[i]; - } else if( !PyArg_ParseTuple( value, "ff", - &uvco[0], &uvco[1] ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected 2D vector" ); - - v = &me->msticky[self->index]; - - for( i = 0; i < 2; ++i ) - v->co[i] = uvco[i]; - - return 0; -} - -/************************************************************************ - * - * Python MVert_Type attributes get/set structure - * - ************************************************************************/ - -static PyGetSetDef BPy_MVert_getseters[] = { - {"co", - (getter)MVert_getCoord, (setter)MVert_setCoord, - "vertex's coordinate", - NULL}, - {"index", - (getter)MVert_getIndex, (setter)NULL, - "vertex's index", - NULL}, - {"no", - (getter)MVert_getNormal, (setter)MVert_setNormal, - "vertex's normal", - NULL}, - {"sel", - (getter)MVert_getSel, (setter)MVert_setSel, - "vertex's select status", - NULL}, - {"hide", - (getter)MVert_getMFlagBits, (setter)MVert_setMFlagBits, - "vert hidden in edit mode", - (void *)ME_HIDE}, - {"uvco", - (getter)MVert_getUVco, (setter)MVert_setUVco, - "vertex's UV coordinates", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -static PyGetSetDef BPy_PVert_getseters[] = { - {"co", - (getter)MVert_getCoord, (setter)MVert_setCoord, - "vertex's coordinate", - NULL}, - {"no", - (getter)MVert_getNormal, (setter)MVert_setNormal, - "vertex's normal", - NULL}, - {"sel", - (getter)MVert_getSel, (setter)MVert_setSel, - "vertex's select status", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/************************************************************************ - * - * Python MVert_Type standard operations - * - ************************************************************************/ - -static void MVert_dealloc( BPy_MVert * self ) -{ - if( BPy_PVert_Check( self ) ) /* free memory of thick objects */ - MEM_freeN ( self->data ); - - PyObject_DEL( self ); -} - -static int MVert_compare( BPy_MVert * a, BPy_MVert * b ) -{ - return( a->data == b->data && a->index == b->index ) ? 0 : -1; -} - -static PyObject *MVert_repr( BPy_MVert * self ) -{ - char format[512]; - char index[24]; - MVert *v; - - v = MVert_get_pointer( self ); - if( !v ) - return NULL; - - if( BPy_MVert_Check( self ) ) - sprintf( index, "%d", self->index ); - else - BLI_strncpy( index, "(None)", 24 ); - - sprintf( format, "[MVert (%f %f %f) (%f %f %f) %s]", - v->co[0], v->co[1], v->co[2], (float)(v->no[0] / 32767.0), - (float)(v->no[1] / 32767.0), (float)(v->no[2] / 32767.0), - index ); - - return PyString_FromString( format ); -} - -static long MVert_hash( BPy_MVert *self ) -{ - return (long)self->index; -} - -static PyObject *Mesh_addPropLayer_internal(Mesh *mesh, CustomData *data, int tot, PyObject *args) -{ - char *name=NULL; - int type = -1; - - if( !PyArg_ParseTuple( args, "si", &name, &type) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string and an int" ); - if (strlen(name)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31"); - if((type != CD_PROP_FLT) && (type != CD_PROP_INT) && (type != CD_PROP_STR)) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, unknown layer type"); - if (name) - CustomData_add_layer_named(data, type, CD_DEFAULT, NULL,tot,name); - - mesh_update_customdata_pointers(mesh); - Py_RETURN_NONE; -} - -static PyObject *Mesh_removePropLayer_internal(Mesh *mesh, CustomData *data, int tot,PyObject *value) -{ - CustomDataLayer *layer; - char *name=PyString_AsString(value); - int i; - - if( !name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if (strlen(name)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31" ); - - i = CustomData_get_named_layer_index(data, CD_PROP_FLT, name); - if(i == -1) i = CustomData_get_named_layer_index(data, CD_PROP_INT, name); - if(i == -1) i = CustomData_get_named_layer_index(data, CD_PROP_STR, name); - if (i==-1) - return EXPP_ReturnPyObjError(PyExc_ValueError, - "No matching layers to remove" ); - layer = &data->layers[i]; - CustomData_free_layer(data, layer->type, tot, i); - mesh_update_customdata_pointers(mesh); - - Py_RETURN_NONE; -} - -static PyObject *Mesh_renamePropLayer_internal(Mesh *mesh, CustomData *data, PyObject *args) -{ - CustomDataLayer *layer; - int i; - char *name_from, *name_to; - - if( !PyArg_ParseTuple( args, "ss", &name_from, &name_to ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 strings" ); - - if (strlen(name_from)>31 || strlen(name_to)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31" ); - - i = CustomData_get_named_layer_index(data, CD_PROP_FLT, name_from); - if(i == -1) i = CustomData_get_named_layer_index(data, CD_PROP_INT, name_from); - if(i == -1) i = CustomData_get_named_layer_index(data, CD_PROP_STR, name_from); - if(i == -1) - return EXPP_ReturnPyObjError(PyExc_ValueError, - "No matching layers to rename" ); - - layer = &data->layers[i]; - - strcpy(layer->name, name_to); /* we alredy know the string sizes are under 32 */ - CustomData_set_layer_unique_name(data, i); - Py_RETURN_NONE; -} - -static PyObject *Mesh_propList_internal(CustomData *data) -{ - CustomDataLayer *layer; - PyObject *list = PyList_New( 0 ), *item; - int i; - for(i=0; itotlayer; i++) { - layer = &data->layers[i]; - if( (layer->type == CD_PROP_FLT) || (layer->type == CD_PROP_INT) || (layer->type == CD_PROP_STR)) { - item = PyString_FromString(layer->name); - PyList_Append( list, item ); - Py_DECREF(item); - } - } - return list; -} - -static PyObject *Mesh_getProperty_internal(CustomData *data, int eindex, PyObject *value) -{ - CustomDataLayer *layer; - char *name=PyString_AsString(value); - int i; - MFloatProperty *pf; - MIntProperty *pi; - MStringProperty *ps; - - if(!name) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an string argument" ); - - if (strlen(name)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31" ); - - i = CustomData_get_named_layer_index(data, CD_PROP_FLT, name); - if(i == -1) i = CustomData_get_named_layer_index(data, CD_PROP_INT, name); - if(i == -1) i = CustomData_get_named_layer_index(data, CD_PROP_STR, name); - if(i == -1) - return EXPP_ReturnPyObjError(PyExc_ValueError, - "No matching layers" ); - - layer = &data->layers[i]; - - if(layer->type == CD_PROP_FLT){ - pf = layer->data; - return PyFloat_FromDouble(pf[eindex].f); - } - else if(layer->type == CD_PROP_INT){ - pi = layer->data; - return PyInt_FromLong(pi[eindex].i); - - } - else if(layer->type == CD_PROP_STR){ - ps = layer->data; - return PyString_FromString(ps[eindex].s); - } - Py_RETURN_NONE; -} - -static PyObject *Mesh_setProperty_internal(CustomData *data, int eindex, PyObject *args) -{ - CustomDataLayer *layer; - int i = 0, index, type = -1; - float f = 0.0f; - char *s=NULL, *name=NULL; - MFloatProperty *pf; - MIntProperty *pi; - MStringProperty *ps; - PyObject *val; - - if(PyArg_ParseTuple(args, "sO", &name, &val)){ - if (strlen(name)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31" ); - - if(PyInt_Check(val)){ - type = CD_PROP_INT; - i = (int)PyInt_AS_LONG(val); - } - else if(PyFloat_Check(val)){ - type = CD_PROP_FLT; - f = (float)PyFloat_AsDouble(val); - } - else if(PyString_Check(val)){ - type = CD_PROP_STR; - s = PyString_AsString(val); - } - else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an name plus either float/int/string" ); - - } - - index = CustomData_get_named_layer_index(data, type, name); - if(index == -1) - return EXPP_ReturnPyObjError(PyExc_ValueError, - "No matching layers or type mismatch" ); - - layer = &data->layers[index]; - - if(type==CD_PROP_STR){ - if (strlen(s)>255){ - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum string length is 255"); - } - else{ - ps = layer->data; - strcpy(ps[eindex].s,s); - } - } - else if(type==CD_PROP_FLT){ - pf = layer->data; - pf[eindex].f = f; - } - else{ - pi = layer->data; - pi[eindex].i = i; - } - Py_RETURN_NONE; -} - -static PyObject *MVert_getProp( BPy_MVert *self, PyObject *args) -{ - if( BPy_MVert_Check( self ) ){ - Mesh *me = (Mesh *)self->data; - if(self->index >= me->totvert) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, MVert is no longer valid part of mesh!"); - else - return Mesh_getProperty_internal(&(me->vdata), self->index, args); - } - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, Vertex not part of a mesh!"); -} - -static PyObject *MVert_setProp( BPy_MVert *self, PyObject *args) -{ - if( BPy_MVert_Check( self ) ){ - Mesh *me = (Mesh *)self->data; - if(self->index >= me->totvert) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, MVert is no longer valid part of mesh!"); - else - return Mesh_setProperty_internal(&(me->vdata), self->index, args); - } - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, Vertex not part of a mesh!"); -} - -static struct PyMethodDef BPy_MVert_methods[] = { - {"getProperty", (PyCFunction)MVert_getProp, METH_O, - "get property indicated by name"}, - {"setProperty", (PyCFunction)MVert_setProp, METH_VARARGS, - "set property indicated by name"}, - {NULL, NULL, 0, NULL} -}; - - -/************************************************************************ - * - * Python MVert_Type structure definition - * - ************************************************************************/ - -PyTypeObject MVert_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MVert", /* char *tp_name; */ - sizeof( BPy_MVert ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) MVert_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) MVert_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) MVert_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) */ - - ( hashfunc ) MVert_hash, /* 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 ***/ - BPy_MVert_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_MVert_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 -}; - -/************************************************************************ - * - * Python PVert_Type standard operations - * - ************************************************************************/ - -static int PVert_compare( BPy_MVert * a, BPy_MVert * b ) -{ - return( a->data == b->data ) ? 0 : -1; -} - -/************************************************************************ - * - * Python PVert_Type structure definition - * - ************************************************************************/ - -PyTypeObject PVert_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender PVert", /* char *tp_name; */ - sizeof( BPy_MVert ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) MVert_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) PVert_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) MVert_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) */ - - ( hashfunc ) MVert_hash, /* 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_PVert_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 -}; - -/* - * create 'thin' or 'thick' MVert objects - * - * there are two types of objects; thin (wrappers for mesh vertex) and thick - * (not contains in mesh). Thin objects are MVert_Type and thick are - * PVert_Type. For thin objects, data is a pointer to a Mesh and index - * is the vertex's index in mesh->mvert. For thick objects, data is a - * pointer to an MVert; index is unused. - */ - -/* - * create a thin MVert object - */ - -static PyObject *MVert_CreatePyObject( Mesh *mesh, int i ) -{ - BPy_MVert *obj = (BPy_MVert *)PyObject_NEW( BPy_MVert, &MVert_Type ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - obj->index = i; - obj->data = mesh; - return (PyObject *)obj; -} - -/* - * create a thick MVert object - */ - -static PyObject *PVert_CreatePyObject( MVert *vert ) -{ - MVert *newvert; - BPy_MVert *obj = (BPy_MVert *)PyObject_NEW( BPy_MVert, &PVert_Type ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - newvert = (MVert *)MEM_callocN( sizeof( MVert ), "MVert" ); - if( !newvert ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "MEM_callocN() failed" ); - - memcpy( newvert, vert, sizeof( MVert ) ); - obj->data = newvert; - return (PyObject *)obj; -} - -/************************************************************************ - * - * Vertex sequence - * - ************************************************************************/ - -static int MVertSeq_len( BPy_MVertSeq * self ) -{ - return self->mesh->totvert; -} - -/* - * retrive a single MVert from somewhere in the vertex list - */ - -static PyObject *MVertSeq_item( BPy_MVertSeq * self, int i ) -{ - if( i < 0 || i >= self->mesh->totvert ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - - return MVert_CreatePyObject( self->mesh, i ); -} - -/* - * retrieve a slice of the vertex list (as a Python list) - * - * Python is nice enough to handle negative indices for us: if the user - * specifies -1, Python will pass us len()-1. So we can just check for - * indices in the range 0:len()-1. Of course, we should never actually - * return the high index, but up to one less. - */ - -static PyObject *MVertSeq_slice( BPy_MVertSeq *self, int low, int high ) -{ - PyObject *list; - int i; - - /* - * Python list slice operator returns empty list when asked for a slice - * outside the list, or if indices are reversed (low > high). Clamp - * our input to do the same. - */ - - if( low < 0 ) low = 0; - if( high > self->mesh->totvert ) high = self->mesh->totvert; - if( low > high ) low = high; - - list = PyList_New( high-low ); - if( !list ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - /* - * return Py_NEW copies of requested vertices - */ - - for( i = low; i < high; ++i ) - PyList_SET_ITEM( list, i-low, - PVert_CreatePyObject( (void *)&self->mesh->mvert[i] ) ); - return list; -} - -/* - * assign a single MVert to somewhere in the vertex list - */ - -static int MVertSeq_assign_item( BPy_MVertSeq * self, int i, - BPy_MVert *v ) -{ - MVert *dst = &self->mesh->mvert[i]; - MVert *src; - - if( !v ) - return EXPP_ReturnIntError( PyExc_IndexError, - "del() not supported" ); - - if( i < 0 || i >= self->mesh->totvert ) - return EXPP_ReturnIntError( PyExc_IndexError, - "array index out of range" ); - - if( BPy_MVert_Check( v ) ) - src = &((Mesh *)v->data)->mvert[v->index]; - else - src = (MVert *)v->data; - - memcpy( dst, src, sizeof(MVert) ); - /* mesh_update( self->mesh );*/ - return 0; -} - -static int MVertSeq_assign_slice( BPy_MVertSeq *self, int low, int high, - PyObject *args ) -{ - int len, i; - - if( !PyList_Check( args ) ) - return EXPP_ReturnIntError( PyExc_IndexError, - "can only assign lists of MVerts" ); - - len = PyList_Size( args ); - - /* - * Python list slice assign operator allows for changing the size of the - * destination list, by replacement and appending.... - * - * >>> l=[1,2,3,4] - * >>> m=[11,12,13,14] - * >>> l[5:7]=m - * >>> print l - * [1, 2, 3, 4, 11, 12, 13, 14] - * >>> l=[1,2,3,4] - * >>> l[2:3]=m - * >>> print l - * [1, 2, 11, 12, 13, 14, 4] - * - * We don't want the size of the list to change (at least not at time - * point in development) so we are a little more strict: - * - low and high indices must be in range [0:len()] - * - high-low == PyList_Size(v) - */ - - if( low < 0 || high > self->mesh->totvert || low > high ) - return EXPP_ReturnIntError( PyExc_IndexError, - "invalid slice range" ); - - if( high-low != len ) - return EXPP_ReturnIntError( PyExc_IndexError, - "slice range and input list sizes must be equal" ); - - for( i = low; i < high; ++i ) - { - BPy_MVert *v = (BPy_MVert *)PyList_GET_ITEM( args, i-low ); - MVert *dst = &self->mesh->mvert[i]; - MVert *src; - - if( BPy_MVert_Check( v ) ) - src = &((Mesh *)v->data)->mvert[v->index]; - else - src = (MVert *)v->data; - - memcpy( dst, src, sizeof(MVert) ); - } - /* mesh_update( self->mesh );*/ - return 0; -} - -static PySequenceMethods MVertSeq_as_sequence = { - ( inquiry ) MVertSeq_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) MVertSeq_item, /* sq_item */ - ( intintargfunc ) MVertSeq_slice, /* sq_slice */ - ( intobjargproc ) MVertSeq_assign_item, /* sq_ass_item */ - ( intintobjargproc ) MVertSeq_assign_slice, /* sq_ass_slice */ - 0,0,0, -}; - -/************************************************************************ - * - * Python MVertSeq_Type iterator (iterates over vertices) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *MVertSeq_getIter( BPy_MVertSeq * self ) -{ - if (self->iter==-1) { /* iteration for this pyobject is not yet used, just return self */ - self->iter = 0; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - /* were alredy using this as an iterator, make a copy to loop on */ - BPy_MVertSeq *seq = (BPy_MVertSeq *)MVertSeq_CreatePyObject(self->mesh); - seq->iter = 0; - return (PyObject *)seq; - } -} - -/* - * Return next MVert. - */ - -static PyObject *MVertSeq_nextIter( BPy_MVertSeq * self ) -{ - if( self->iter == self->mesh->totvert ) { - self->iter= -1; /* allow it to be used as an iterator again without creating a new BPy_MVertSeq */ - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - return MVert_CreatePyObject( self->mesh, self->iter++ ); -} - -/************************************************************************ - * - * Python MVertSeq_Type methods - * - ************************************************************************/ - -static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args ) -{ - int len, newlen; - int i,j; - PyObject *tmp; - MVert *newvert, *tmpvert; - Mesh *mesh = self->mesh; - CustomData vdata; - /* make sure we get a sequence of tuples of something */ - - switch( PySequence_Size( args ) ) { - case 1: /* better be a list or a tuple */ - tmp = PyTuple_GET_ITEM( args, 0 ); - if( !VectorObject_Check ( tmp ) ) { - if( !PySequence_Check ( tmp ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence triplets" ); - else if( !PySequence_Size ( tmp ) ) { - Py_RETURN_NONE; - } - args = tmp; - } - Py_INCREF( args ); /* so we can safely DECREF later */ - break; - case 3: - tmp = PyTuple_GET_ITEM( args, 0 ); - /* if first item is not a number, it's wrong */ - if( !PyNumber_Check( tmp ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence triplets" ); - - /* otherwise, put into a new tuple */ - args = Py_BuildValue( "((OOO))", tmp, - PyTuple_GET_ITEM( args, 1 ), PyTuple_GET_ITEM( args, 2 ) ); - if( !args ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Py_BuildValue() failed" ); - break; - - default: /* anything else is definitely wrong */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence triplets" ); - } - - /* if no verts given, return quietly */ - len = PySequence_Size( args ); - if( len == 0 ) { - Py_DECREF ( args ); - Py_RETURN_NONE; - } - - /* create custom vertex data arrays and copy existing vertices into it */ - - newlen = mesh->totvert + len; - CustomData_copy( &mesh->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, newlen ); - CustomData_copy_data( &mesh->vdata, &vdata, 0, 0, mesh->totvert ); - - if ( !CustomData_has_layer( &vdata, CD_MVERT ) ) - CustomData_add_layer( &vdata, CD_MVERT, CD_CALLOC, NULL, newlen ); - - newvert = CustomData_get_layer( &vdata, CD_MVERT ); - - /* scan the input list and insert the new vertices */ - - tmpvert = &newvert[mesh->totvert]; - for( i = 0; i < len; ++i ) { - float co[3]; - tmp = PySequence_GetItem( args, i ); - if( VectorObject_Check( tmp ) ) { - if( ((VectorObject *)tmp)->size != 3 ) { - CustomData_free( &vdata, newlen ); - Py_DECREF ( tmp ); - Py_DECREF ( args ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected vector of size 3" ); - } - for( j = 0; j < 3; ++j ) - co[j] = ((VectorObject *)tmp)->vec[j]; - } else if( PySequence_Check( tmp ) ) { - int ok=1; - PyObject *flt; - if( PySequence_Size( tmp ) != 3 ) - ok = 0; - else - for( j = 0; ok && j < 3; ++j ) { - flt = PySequence_ITEM( tmp, j ); - if( !PyNumber_Check ( flt ) ) - ok = 0; - else - co[j] = (float)PyFloat_AsDouble( flt ); - Py_DECREF( flt ); - } - - if( !ok ) { - CustomData_free( &vdata, newlen ); - Py_DECREF ( args ); - Py_DECREF ( tmp ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected sequence triplet of floats" ); - } - } else { - CustomData_free( &vdata, newlen ); - Py_DECREF ( args ); - Py_DECREF ( tmp ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected sequence triplet of floats" ); - } - - Py_DECREF ( tmp ); - - /* add the coordinate to the new list */ - memcpy( tmpvert->co, co, sizeof(co) ); - - tmpvert->flag |= SELECT; - /* TODO: anything else which needs to be done when we add a vert? */ - /* probably not: NMesh's newvert() doesn't */ - ++tmpvert; - } - - CustomData_free( &mesh->vdata, mesh->totvert ); - mesh->vdata = vdata; - mesh_update_customdata_pointers( mesh ); - - /* - * if there are keys, have to fix those lists up - */ - - if( mesh->key ) { - KeyBlock *currkey = mesh->key->block.first; - float *fp, *newkey; - - while( currkey ) { - - /* create key list, copy existing data if any */ - newkey = MEM_callocN(mesh->key->elemsize*newlen, "keydata"); - if( currkey->data ) { - memcpy( newkey, currkey->data, - mesh->totvert*mesh->key->elemsize ); - MEM_freeN( currkey->data ); - currkey->data = newkey; - } - - /* add data for new vertices */ - fp = (float *)((char *)currkey->data + - (mesh->key->elemsize*mesh->totvert)); - tmpvert = mesh->mvert + mesh->totvert; - for( i = newlen - mesh->totvert; i > 0; --i ) { - VECCOPY(fp, tmpvert->co); - fp += 3; - tmpvert++; - } - currkey->totelem = newlen; - currkey = currkey->next; - } - } - - /* set final vertex list size */ - mesh->totvert = newlen; - - mesh_update( mesh ); - - Py_DECREF ( args ); - Py_RETURN_NONE; -} - -static PyObject *MVertSeq_delete( BPy_MVertSeq * self, PyObject *args ) -{ - unsigned int *vert_table; - int vert_delete, face_count; - int i; - Mesh *mesh = self->mesh; - MFace *tmpface; - - /* - * if input tuple contains a single sequence, use it as input instead; - * otherwise use the sequence as-is and check later that it contains - * one or more integers or MVerts - */ - if( PySequence_Size( args ) == 1 ) { - PyObject *tmp = PyTuple_GET_ITEM( args, 0 ); - if( PySequence_Check( tmp ) ) - args = tmp; - } - - /* if sequence is empty, do nothing */ - if( PySequence_Size( args ) == 0 ) { - Py_RETURN_NONE; - } - - /* allocate vertex lookup table */ - vert_table = (unsigned int *)MEM_callocN( - mesh->totvert*sizeof( unsigned int ), "vert_table" ); - - /* get the indices of vertices to be removed */ - for( i = PySequence_Size( args ); i--; ) { - PyObject *tmp = PySequence_GetItem( args, i ); - int index; - if( BPy_MVert_Check( tmp ) ) { - if( (void *)self->mesh != ((BPy_MVert*)tmp)->data ) { - MEM_freeN( vert_table ); - Py_DECREF( tmp ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "MVert belongs to a different mesh" ); - } - index = ((BPy_MVert*)tmp)->index; - } else if( PyInt_Check( tmp ) ) { - index = PyInt_AsLong ( tmp ); - } else { - MEM_freeN( vert_table ); - Py_DECREF( tmp ); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of ints or MVerts" ); - } - Py_DECREF( tmp ); - if( index < 0 || index >= mesh->totvert ) { - MEM_freeN( vert_table ); - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - } - vert_table[index] = UINT_MAX; - } - - /* delete things, then clean up and return */ - - vert_delete = make_vertex_table( vert_table, mesh->totvert ); - if( vert_delete ) - delete_verts( mesh, vert_table, vert_delete ); - - /* calculate edges to delete, fix vertex indices */ - delete_edges( mesh, vert_table, 0 ); - - /* - * find number of faces which contain any of the deleted vertices, - * and mark them, then delete them - */ - tmpface = mesh->mface; - face_count=0; - for( i = mesh->totface; i--; ++tmpface ) { - if( vert_table[tmpface->v1] == UINT_MAX || - vert_table[tmpface->v2] == UINT_MAX || - vert_table[tmpface->v3] == UINT_MAX || - ( tmpface->v4 && vert_table[tmpface->v4] == UINT_MAX ) ) { - tmpface->v1 = UINT_MAX; - ++face_count; - } - } - delete_faces( mesh, vert_table, face_count ); - - /* clean up and exit */ - MEM_freeN( vert_table ); - mesh_update ( mesh ); - Py_RETURN_NONE; -} - -static PyObject *MVertSeq_selected( BPy_MVertSeq * self ) -{ - int i, count; - Mesh *mesh = self->mesh; - MVert *tmpvert; - PyObject *list; - - /* first count selected edges (quicker than appending to PyList?) */ - count = 0; - tmpvert = mesh->mvert; - for( i = 0; i < mesh->totvert; ++i, ++tmpvert ) - if( tmpvert->flag & SELECT ) - ++count; - - list = PyList_New( count ); - if( !list ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - /* next, insert selected edges into list */ - count = 0; - tmpvert = mesh->mvert; - for( i = 0; i < mesh->totvert; ++i, ++tmpvert ) { - if( tmpvert->flag & SELECT ) { - PyObject *tmp = PyInt_FromLong( i ); - if( !tmp ) { - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyInt_FromLong() failed" ); - } - PyList_SET_ITEM( list, count, tmp ); - ++count; - } - } - return list; -} -static PyObject *MVertSeq_add_layertype(BPy_MVertSeq *self, PyObject *args) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_addPropLayer_internal(me, &(me->vdata), me->totvert, args); -} -static PyObject *MVertSeq_del_layertype(BPy_MVertSeq *self, PyObject *value) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_removePropLayer_internal(me, &(me->vdata), me->totvert, value); -} -static PyObject *MVertSeq_rename_layertype(BPy_MVertSeq *self, PyObject *args) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_renamePropLayer_internal(me,&(me->vdata),args); -} -static PyObject *MVertSeq_PropertyList(BPy_MVertSeq *self) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_propList_internal(&(me->vdata)); -} -static PyObject *M_Mesh_PropertiesTypeDict(void) -{ - PyObject *Types = PyConstant_New( ); - if(Types) { - BPy_constant *d = (BPy_constant *) Types; - PyConstant_Insert(d, "FLOAT", PyInt_FromLong(CD_PROP_FLT)); - PyConstant_Insert(d, "INT" , PyInt_FromLong(CD_PROP_INT)); - PyConstant_Insert(d, "STRING", PyInt_FromLong(CD_PROP_STR)); - } - return Types; -} - -static struct PyMethodDef BPy_MVertSeq_methods[] = { - {"extend", (PyCFunction)MVertSeq_extend, METH_VARARGS, - "add vertices to mesh"}, - {"delete", (PyCFunction)MVertSeq_delete, METH_VARARGS, - "delete vertices from mesh"}, - {"selected", (PyCFunction)MVertSeq_selected, METH_NOARGS, - "returns a list containing indices of selected vertices"}, - {"addPropertyLayer",(PyCFunction)MVertSeq_add_layertype, METH_VARARGS, - "add a new property layer"}, - {"removePropertyLayer",(PyCFunction)MVertSeq_del_layertype, METH_O, - "removes a property layer"}, - {"renamePropertyLayer",(PyCFunction)MVertSeq_rename_layertype, METH_VARARGS, - "renames an existing property layer"}, - {NULL, NULL, 0, NULL} -}; - -static PyGetSetDef BPy_MVertSeq_getseters[] = { - {"properties", - (getter)MVertSeq_PropertyList, (setter)NULL, - "vertex property layers, read only", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - - -/************************************************************************ - * - * Python MVertSeq_Type standard operations - * - ************************************************************************/ - -/*****************************************************************************/ -/* Python MVertSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject MVertSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MVertSeq", /* char *tp_name; */ - sizeof( BPy_MVertSeq ), /* 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; */ - NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &MVertSeq_as_sequence, /* 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 */ - ( getiterfunc) MVertSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) MVertSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_MVertSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_MVertSeq_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 -}; - -/************************************************************************ - * - * Edge attributes - * - ************************************************************************/ - -static MEdge * MEdge_get_pointer( BPy_MEdge * self ) -{ - if( self->index >= self->mesh->totedge ) - return (MEdge *)EXPP_ReturnPyObjError( PyExc_RuntimeError, - "MEdge is no longer valid" ); - return &self->mesh->medge[self->index]; -} - -/* - * get an edge's crease value - */ - -static PyObject *MEdge_getCrease( BPy_MEdge * self ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return NULL; - - return PyInt_FromLong( edge->crease ); -} - -/* - * set an edge's crease value - */ - -static int MEdge_setCrease( BPy_MEdge * self, PyObject * value ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return -1; - - return EXPP_setIValueClamped( value, &edge->crease, 0, 255, 'b' ); -} - -/* - * get an edge's flag - */ - -static PyObject *MEdge_getFlag( BPy_MEdge * self ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return NULL; - - return PyInt_FromLong( edge->flag ); -} - -/* - * set an edge's flag - */ - -static int MEdge_setFlag( BPy_MEdge * self, PyObject * value ) -{ - short param; - static short bitmask = SELECT - | ME_EDGEDRAW - | ME_SEAM - | ME_FGON - | ME_HIDE - | ME_EDGERENDER - | ME_LOOSEEDGE - | ME_SEAM_LAST - | ME_SHARP; - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return -1; - - if( !PyInt_Check ( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - param = (short)PyInt_AS_LONG ( value ); - - if ( ( param & bitmask ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - edge->flag = param; - - return 0; -} - -/* - * get an edge's first vertex - */ - -static PyObject *MEdge_getV1( BPy_MEdge * self ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return NULL; - - return MVert_CreatePyObject( self->mesh, edge->v1 ); -} - -/* - * set an edge's first vertex - */ - -static int MEdge_setV1( BPy_MEdge * self, BPy_MVert * value ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return -1; - if( !BPy_MVert_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected an MVert" ); - - edge->v1 = value->index; - return 0; -} - -/* - * get an edge's second vertex - */ - -static PyObject *MEdge_getV2( BPy_MEdge * self ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return NULL; /* error is set */ - /* if v2 is out of range, the python mvert will complain, no need to check here */ - return MVert_CreatePyObject( self->mesh, edge->v2 ); -} - -/* - * set an edge's second vertex - */ - -static int MEdge_setV2( BPy_MEdge * self, BPy_MVert * value ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return -1; /* error is set */ - if( !BPy_MVert_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected an MVert" ); - - if ( edge->v1 == value->index ) - return EXPP_ReturnIntError( PyExc_ValueError, "an edge cant use the same vertex for each end" ); - - edge->v2 = value->index; - return 0; -} - -/* - * get an edge's index - */ - -static PyObject *MEdge_getIndex( BPy_MEdge * self ) -{ - if( !MEdge_get_pointer( self ) ) - return NULL; /* error is set */ - - return PyInt_FromLong( self->index ); -} - -/* - * get an edge's flag - */ - -static PyObject *MEdge_getMFlagBits( BPy_MEdge * self, void * type ) -{ - MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return NULL; /* error is set */ - - return EXPP_getBitfield( &edge->flag, (int)((long)type & 0xff), 'b' ); -} - -/* - * get an edge's length - */ - -static PyObject *MEdge_getLength( BPy_MEdge * self ) -{ - MEdge *edge = MEdge_get_pointer( self ); - double dot = 0.0f; - float tmpf; - int i; - float *v1, *v2; - - if (!edge) - return NULL; /* error is set */ - - if MEDGE_VERT_BADRANGE_CHECK(self->mesh, edge) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, "This edge uses removed vert(s)" ); - - /* get the 2 edges vert locations */ - v1= (&((Mesh *)self->mesh)->mvert[edge->v1])->co; - v2= (&((Mesh *)self->mesh)->mvert[edge->v2])->co; - - if( !edge ) - return NULL; - - for( i = 0; i < 3; i++ ) { - tmpf = v1[i] - v2[i]; - dot += tmpf*tmpf; - } - return PyFloat_FromDouble( sqrt( dot ) ); -} - -/* - * get an key for using in a dictionary or set key - */ - -static PyObject *MEdge_getKey( BPy_MEdge * self ) -{ - PyObject *attr; - MEdge *edge = MEdge_get_pointer( self ); - if (!edge) - return NULL; /* error is set */ - - attr = PyTuple_New( 2 ); - if (edge->v1 > edge->v2) { - PyTuple_SET_ITEM( attr, 0, PyInt_FromLong(edge->v2) ); - PyTuple_SET_ITEM( attr, 1, PyInt_FromLong(edge->v1) ); - } else { - PyTuple_SET_ITEM( attr, 0, PyInt_FromLong(edge->v1) ); - PyTuple_SET_ITEM( attr, 1, PyInt_FromLong(edge->v2) ); - } - return attr; -} - -/* - * set an edge's select state - */ - -static int MEdge_setSel( BPy_MEdge * self,PyObject * value, - void * type_unused ) -{ - MEdge *edge = MEdge_get_pointer( self ); - int param = PyObject_IsTrue( value ); - Mesh *me = self->mesh; - - if( !edge ) - return -1; - - if MEDGE_VERT_BADRANGE_CHECK(me, edge) - return EXPP_ReturnIntError( PyExc_RuntimeError, "This edge uses removed vert(s)" ); - - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) { - edge->flag |= SELECT; - me->mvert[edge->v1].flag |= SELECT; - me->mvert[edge->v2].flag |= SELECT; - } - else { - edge->flag &= ~SELECT; - me->mvert[edge->v1].flag &= ~SELECT; - me->mvert[edge->v2].flag &= ~SELECT; - } - - if( self->mesh->mselect ) { - MEM_freeN( self->mesh->mselect ); - self->mesh->mselect = NULL; - } - - return 0; -} - -/************************************************************************ - * - * Python MEdge_Type attributes get/set structure - * - ************************************************************************/ - -static PyGetSetDef BPy_MEdge_getseters[] = { - {"crease", - (getter)MEdge_getCrease, (setter)MEdge_setCrease, - "edge's crease value", - NULL}, - {"flag", - (getter)MEdge_getFlag, (setter)MEdge_setFlag, - "edge's flags", - NULL}, - {"v1", - (getter)MEdge_getV1, (setter)MEdge_setV1, - "edge's first vertex", - NULL}, - {"v2", - (getter)MEdge_getV2, (setter)MEdge_setV2, - "edge's second vertex", - NULL}, - {"index", - (getter)MEdge_getIndex, (setter)NULL, - "edge's index", - NULL}, - {"sel", - (getter)MEdge_getMFlagBits, (setter)MEdge_setSel, - "edge selected in edit mode", - (void *)SELECT}, - {"length", - (getter)MEdge_getLength, (setter)NULL, - "edge's length, read only", - NULL}, - {"key", - (getter)MEdge_getKey, (setter)NULL, - "edge's key for using with sets or dictionaries, read only", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/************************************************************************ - * - * Python MEdge_Type iterator (iterates over vertices) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *MEdge_getIter( BPy_MEdge * self ) -{ - if (self->iter==-1) { /* not alredy used to iterator on, just use self */ - self->iter = 0; - return EXPP_incr_ret ( (PyObject *) self ); - } else { /* alredy being iterated on, return a copy */ - BPy_MEdge *seq = (BPy_MEdge *)MEdge_CreatePyObject(self->mesh, self->index); - seq->iter = 0; - return (PyObject *)seq; - } -} - -/* - * Return next MVert. Throw an exception after the second vertex. - */ - -static PyObject *MEdge_nextIter( BPy_MEdge * self ) -{ - if( self->iter == 2 ) { - self->iter = -1; - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - self->iter++; - if( self->iter == 1 ) - return MEdge_getV1( self ); - else - return MEdge_getV2( self ); -} - -/************************************************************************ - * - * Python MEdge_Type standard operations - * - ************************************************************************/ - -static int MEdge_compare( BPy_MEdge * a, BPy_MEdge * b ) -{ - return( a->mesh == b->mesh && a->index == b->index ) ? 0 : -1; -} - -static PyObject *MEdge_repr( BPy_MEdge * self ) -{ - struct MEdge *edge = MEdge_get_pointer( self ); - - if( !edge ) - return NULL; - - return PyString_FromFormat( "[MEdge (%d %d) %d %d]", - (int)edge->v1, (int)edge->v2, (int)edge->crease, - (int)self->index ); -} - -static long MEdge_hash( BPy_MEdge *self ) -{ - return (long)self->index; -} -static PyObject *MEdge_getProp( BPy_MEdge *self, PyObject *args) -{ - Mesh *me = (Mesh *)self->mesh; - return Mesh_getProperty_internal(&(me->edata), self->index, args); -} - -static PyObject *MEdge_setProp( BPy_MEdge *self, PyObject *args) -{ - Mesh *me = (Mesh *)self->mesh; - return Mesh_setProperty_internal(&(me->edata), self->index, args); -} - -static struct PyMethodDef BPy_MEdge_methods[] = { - {"getProperty", (PyCFunction)MEdge_getProp, METH_O, - "get property indicated by name"}, - {"setProperty", (PyCFunction)MEdge_setProp, METH_VARARGS, - "set property indicated by name"}, - {NULL, NULL, 0, NULL} -}; -/************************************************************************ - * - * Python MEdge_Type structure definition - * - ************************************************************************/ - -PyTypeObject MEdge_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MEdge", /* char *tp_name; */ - sizeof( BPy_MEdge ), /* 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; */ - ( cmpfunc ) MEdge_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) MEdge_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) */ - - ( hashfunc ) MEdge_hash, /* 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 */ - ( getiterfunc) MEdge_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) MEdge_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_MEdge_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_MEdge_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 -}; - -static PyObject *MEdge_CreatePyObject( Mesh * mesh, int i ) -{ - BPy_MEdge *obj = PyObject_NEW( BPy_MEdge, &MEdge_Type ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - obj->mesh = mesh; - obj->index = i; - obj->iter = -1; - return (PyObject *)obj; -} - -/************************************************************************ - * - * Edge sequence - * - ************************************************************************/ - -static int MEdgeSeq_len( BPy_MEdgeSeq * self ) -{ - return self->mesh->totedge; -} - -static PyObject *MEdgeSeq_item( BPy_MEdgeSeq * self, int i ) -{ - if( i < 0 || i >= self->mesh->totedge ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - - return MEdge_CreatePyObject( self->mesh, i ); -} - - -static PySequenceMethods MEdgeSeq_as_sequence = { - ( inquiry ) MEdgeSeq_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) MEdgeSeq_item, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - 0,0,0, -}; - -/************************************************************************ - * - * Python MEdgeSeq_Type iterator (iterates over edges) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *MEdgeSeq_getIter( BPy_MEdgeSeq * self ) -{ - if (self->iter==-1) { /* iteration for this pyobject is not yet used, just return self */ - self->iter = 0; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - BPy_MEdgeSeq *seq = (BPy_MEdgeSeq *)MEdgeSeq_CreatePyObject(self->mesh); - seq->iter = 0; - return (PyObject *)seq; - } -} - -/* - * Return next MEdge. - */ - -static PyObject *MEdgeSeq_nextIter( BPy_MEdgeSeq * self ) -{ - if( self->iter == self->mesh->totedge ) { - self->iter= -1; - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - return MEdge_CreatePyObject( self->mesh, self->iter++ ); -} - -/************************************************************************ - * - * Python MEdgeSeq_Type methods - * - ************************************************************************/ - -/* - * Create edges from tuples of vertices. Duplicate new edges, or - * edges which already exist, - */ - -static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args ) -{ - int len, nverts; - int i, j, ok; - int new_edge_count, good_edges; - SrchEdges *oldpair, *newpair, *tmppair, *tmppair2; - PyObject *tmp; - BPy_MVert *e[4]; - MEdge *tmpedge; - Mesh *mesh = self->mesh; - - /* make sure we get a tuple of sequences of something */ - switch( PySequence_Size( args ) ) { - case 1: - /* if a sequence... */ - tmp = PyTuple_GET_ITEM( args, 0 ); - if( PySequence_Check( tmp ) ) { - PyObject *tmp2; - - /* ignore empty sequences */ - if( !PySequence_Size( tmp ) ) { - Py_RETURN_NONE; - } - - /* if another sequence, use it */ - tmp2 = PySequence_ITEM( tmp, 0 ); - if( PySequence_Check( tmp2 ) ) - args = tmp; - Py_INCREF( args ); - Py_DECREF( tmp2 ); - } else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence pairs" ); - break; - case 2: - case 3: - case 4: /* two to four args may be individual verts */ - tmp = PyTuple_GET_ITEM( args, 0 ); - /* - * if first item isn't a sequence, then assume it's a bunch of MVerts - * and wrap inside a tuple - */ - if( !PySequence_Check( tmp ) ) { - args = Py_BuildValue( "(O)", args ); - if( !args ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Py_BuildValue() failed" ); - /* - * otherwise, assume it already a bunch of sequences so use as-is - */ - } else { - Py_INCREF( args ); /* so we can safely DECREF later */ - } - break; - default: /* anything else is definitely wrong */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence pairs" ); - } - - /* make sure there is something to add */ - len = PySequence_Size( args ); - if( len == 0 ) { - Py_DECREF ( args ); - Py_RETURN_NONE; - } - - /* verify the param list and get a total count of number of edges */ - new_edge_count = 0; - for( i = 0; i < len; ++i ) { - tmp = PySequence_GetItem( args, i ); - - /* not a tuple of MVerts... error */ - if( !PySequence_Check( tmp ) ) { - Py_DECREF( tmp ); - Py_DECREF( args ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected sequence of MVert sequences" ); - } - - /* not the right number of MVerts... error */ - nverts = PySequence_Size( tmp ); - if( nverts < 2 || nverts > 4 ) { - Py_DECREF( tmp ); - Py_DECREF( args ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected 2 to 4 MVerts per sequence" ); - } - - if( EXPP_check_sequence_consistency( tmp, &MVert_Type ) == 1 ) { - - /* get MVerts, check they're from this mesh */ - ok = 1; - for( j = 0; ok && j < nverts; ++j ) { - e[0] = (BPy_MVert *)PySequence_GetItem( tmp, j ); - if( (void *)e[0]->data != (void *)self->mesh ) - ok = 0; - Py_DECREF( e[0] ); - } - Py_DECREF( tmp ); - - /* not MVerts from another mesh ... error */ - if( !ok ) { - Py_DECREF( args ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "vertices are from a different mesh" ); - } - } else { - ok = 0; - for( j = 0; ok == 0 && j < nverts; ++j ) { - PyObject *item = PySequence_ITEM( tmp, j ); - if( !PyInt_Check( item ) ) - ok = 1; - else { - int index = PyInt_AsLong ( item ); - if( index < 0 || index >= self->mesh->totvert ) - ok = 2; - } - Py_DECREF( item ); - } - Py_DECREF( tmp ); - - /* not ints or outside of vertex list ... error */ - if( ok ) { - Py_DECREF( args ); - if( ok == 1 ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an integer index" ); - else - return EXPP_ReturnPyObjError( PyExc_KeyError, - "index out of range" ); - } - } - - if( nverts == 2 ) - ++new_edge_count; /* if only two vert, then add only edge */ - else - new_edge_count += nverts; /* otherwise, one edge per vert */ - } - - /* OK, commit to allocating the search structures */ - newpair = (SrchEdges *)MEM_callocN( sizeof(SrchEdges)*new_edge_count, - "MEdgePairs" ); - - /* scan the input list and build the new edge pair list */ - len = PySequence_Size( args ); - tmppair = newpair; - new_edge_count = 0; - for( i = 0; i < len; ++i ) { - int edge_count; - int eedges[4]; - tmp = PySequence_GetItem( args, i ); - nverts = PySequence_Size( tmp ); - - /* get new references for the vertices */ - for(j = 0; j < nverts; ++j ) { - PyObject *item = PySequence_ITEM( tmp, j ); - if( BPy_MVert_Check( item ) ) { - eedges[j] = ((BPy_MVert *)item)->index; - } else { - eedges[j] = PyInt_AsLong ( item ); - } - Py_DECREF( item ); - } - Py_DECREF( tmp ); - - if( nverts == 2 ) - edge_count = 1; /* again, two verts give just one edge */ - else - edge_count = nverts; - - /* now add the edges to the search list */ - for( j = 0; j < edge_count; ++j ) { - int k = j+1; - if( k == nverts ) /* final edge */ - k = 0; - - /* sort verts into search list, skip if two are the same */ - if( eedges[j] != eedges[k] ) { - if( eedges[j] < eedges[k] ) { - tmppair->v[0] = eedges[j]; - tmppair->v[1] = eedges[k]; - tmppair->swap = 0; - } else { - tmppair->v[0] = eedges[k]; - tmppair->v[1] = eedges[j]; - tmppair->swap = 1; - } - tmppair->index = new_edge_count; - ++new_edge_count; - tmppair++; - } - } - - } - - /* sort the new edge pairs */ - qsort( newpair, new_edge_count, sizeof(SrchEdges), medge_comp ); - - /* - * find duplicates in the new list and mark. if it's a duplicate, - * then mark by setting second vert index to 0 (a real edge won't have - * second vert index of 0 since verts are sorted) - */ - - good_edges = new_edge_count; /* all edges are good at this point */ - - tmppair = newpair; /* "last good edge" */ - tmppair2 = &tmppair[1]; /* "current candidate edge" */ - for( i = 0; i < new_edge_count; ++i ) { - if( tmppair->v[0] != tmppair2->v[0] || - tmppair->v[1] != tmppair2->v[1] ) - tmppair = tmppair2; /* last != current, so current == last */ - else { - tmppair2->v[1] = 0; /* last == current, so mark as duplicate */ - --good_edges; /* one less good edge */ - } - tmppair2++; - } - - /* if mesh has edges, see if any of the new edges are already in it */ - if( mesh->totedge ) { - oldpair = (SrchEdges *)MEM_callocN( sizeof(SrchEdges)*mesh->totedge, - "MEdgePairs" ); - - /* - * build a search list of new edges (don't need to update "swap" - * field, since we're not creating edges here) - */ - tmppair = oldpair; - tmpedge = mesh->medge; - for( i = 0; i < mesh->totedge; ++i ) { - if( tmpedge->v1 < tmpedge->v2 ) { - tmppair->v[0] = tmpedge->v1; - tmppair->v[1] = tmpedge->v2; - } else { - tmppair->v[0] = tmpedge->v2; - tmppair->v[1] = tmpedge->v1; - } - ++tmpedge; - ++tmppair; - } - - /* sort the old edge pairs */ - qsort( oldpair, mesh->totedge, sizeof(SrchEdges), medge_comp ); - - /* eliminate new edges already in the mesh */ - tmppair = newpair; - for( i = new_edge_count; i-- ; ) { - if( tmppair->v[1] ) { - if( bsearch( tmppair, oldpair, mesh->totedge, - sizeof(SrchEdges), medge_comp ) ) { - tmppair->v[1] = 0; /* mark as duplicate */ - --good_edges; - } - } - tmppair++; - } - MEM_freeN( oldpair ); - } - - /* if any new edges are left, add to list */ - if( good_edges ) { - CustomData edata; - int totedge = mesh->totedge+good_edges; - - /* create custom edge data arrays and copy existing edges into it */ - CustomData_copy( &mesh->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge ); - CustomData_copy_data( &mesh->edata, &edata, 0, 0, mesh->totedge ); - - if ( !CustomData_has_layer( &edata, CD_MEDGE ) ) - CustomData_add_layer( &edata, CD_MEDGE, CD_CALLOC, NULL, totedge ); - - /* replace old with new data */ - CustomData_free( &mesh->edata, mesh->totedge ); - mesh->edata = edata; - mesh_update_customdata_pointers( mesh ); - - /* resort edges into original order */ - qsort( newpair, new_edge_count, sizeof(SrchEdges), medge_index_comp ); - - /* point to the first edge we're going to add */ - tmpedge = &mesh->medge[mesh->totedge]; - tmppair = newpair; - - /* as we find a good edge, add it */ - while( good_edges ) { - if( tmppair->v[1] ) { /* not marked as duplicate ! */ - if( !tmppair->swap ) { - tmpedge->v1 = tmppair->v[0]; - tmpedge->v2 = tmppair->v[1]; - } else { - tmpedge->v1 = tmppair->v[1]; - tmpedge->v2 = tmppair->v[0]; - } - tmpedge->flag = ME_EDGEDRAW | ME_EDGERENDER | SELECT; - mesh->totedge++; - --good_edges; - ++tmpedge; - } - tmppair++; - } - } - - /* clean up and leave */ - mesh_update( mesh ); - MEM_freeN( newpair ); - Py_DECREF ( args ); - Py_RETURN_NONE; -} - -static PyObject *MEdgeSeq_delete( BPy_MEdgeSeq * self, PyObject *args ) -{ - Mesh *mesh = self->mesh; - MEdge *srcedge; - MFace *srcface; - unsigned int *vert_table, *del_table, *edge_table; - int i, len; - int face_count, edge_count, vert_count; - - /* - * if input tuple contains a single sequence, use it as input instead; - * otherwise use the sequence as-is and check later that it contains - * one or more integers or MVerts - */ - if( PySequence_Size( args ) == 1 ) { - PyObject *tmp = PyTuple_GET_ITEM( args, 0 ); - if( PySequence_Check( tmp ) ) - args = tmp; - } - - /* if sequence is empty, do nothing */ - len = PySequence_Size( args ); - if( len == 0 ) { - Py_RETURN_NONE; - } - - edge_table = (unsigned int *)MEM_callocN( len*sizeof( unsigned int ), - "edge_table" ); - - /* get the indices of edges to be removed */ - for( i = len; i--; ) { - PyObject *tmp = PySequence_GetItem( args, i ); - if( BPy_MEdge_Check( tmp ) ) - edge_table[i] = ((BPy_MEdge *)tmp)->index; - else if( PyInt_Check( tmp ) ) - edge_table[i] = PyInt_AsLong ( tmp ); - else { - MEM_freeN( edge_table ); - Py_DECREF( tmp ); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of ints or MEdges" ); - } - Py_DECREF( tmp ); - - /* if index out-of-range, throw exception */ - if( edge_table[i] >= (unsigned int)mesh->totedge ) { - MEM_freeN( edge_table ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "array index out of range" ); - } - } - - /* - * build two tables: first table marks vertices which belong to an edge - * which is being deleted - */ - del_table = (unsigned int *)MEM_callocN( - mesh->totvert*sizeof( unsigned int ), "vert_table" ); - - /* - * Borrow a trick from editmesh code: for each edge to be deleted, mark - * its vertices as well. Then go through face list and look for two - * consecutive marked vertices. - */ - - /* mark each edge that's to be deleted */ - srcedge = mesh->medge; - for( i = len; i--; ) { - unsigned int idx = edge_table[i]; - del_table[srcedge[idx].v1] = UINT_MAX; - del_table[srcedge[idx].v2] = UINT_MAX; - srcedge[idx].v1 = UINT_MAX; - } - - /* - * second table is used for vertices which become orphaned (belong to no - * edges) and need to be deleted; it's also the normal lookup table for - * old->new vertex indices - */ - - vert_table = (unsigned int *)MEM_mallocN( - mesh->totvert*sizeof( unsigned int ), "vert_table" ); - - /* assume all edges will be deleted (fills with UINT_MAX) */ - memset( vert_table, UCHAR_MAX, mesh->totvert*sizeof( unsigned int ) ); - - /* unmark vertices of each "good" edge; count each "bad" edge */ - edge_count = 0; - for( i = mesh->totedge; i--; ++srcedge ) - if( srcedge->v1 != UINT_MAX ) - vert_table[srcedge->v1] = vert_table[srcedge->v2] = 0; - else - ++edge_count; - - /* - * find faces which no longer have all edges - */ - - face_count = 0; - srcface = mesh->mface; - for( i = 0; i < mesh->totface; ++i, ++srcface ) { - int len = srcface->v4 ? 4 : 3; - unsigned int id[4]; - int del; - - id[0] = del_table[srcface->v1]; - id[1] = del_table[srcface->v2]; - id[2] = del_table[srcface->v3]; - id[3] = del_table[srcface->v4]; - - del = ( id[0] == UINT_MAX && id[1] == UINT_MAX ) || - ( id[1] == UINT_MAX && id[2] == UINT_MAX ); - if( !del ) { - if( len == 3 ) - del = ( id[2] == UINT_MAX && id[0] == UINT_MAX ); - else - del = ( id[2] == UINT_MAX && id[3] == UINT_MAX ) || - ( id[3] == UINT_MAX && id[0] == UINT_MAX ); - } - if( del ) { - srcface->v1 = UINT_MAX; - ++face_count; - } - } - - /* fix the vertex lookup table, if any verts to delete, do so now */ - vert_count = make_vertex_table( vert_table, mesh->totvert ); - if( vert_count ) - delete_verts( mesh, vert_table, vert_count ); - - /* delete faces which have a deleted edge */ - delete_faces( mesh, vert_table, face_count ); - - /* now delete the edges themselves */ - delete_edges( mesh, vert_table, edge_count ); - - /* clean up and return */ - MEM_freeN( del_table ); - MEM_freeN( vert_table ); - MEM_freeN( edge_table ); - mesh_update ( mesh ); - Py_RETURN_NONE; -} - -static PyObject *MEdgeSeq_collapse( BPy_MEdgeSeq * self, PyObject *args ) -{ - MEdge *srcedge; - unsigned int *edge_table; - float (*vert_list)[3]; - int i, len; - Base *base, *basact; - Mesh *mesh = self->mesh; - Object *object = NULL; - PyObject *tmp; - - /* - * when using removedoublesflag(), we need to switch to editmode, so - * nobody else can be using it - */ - - if( G.obedit ) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "can't use collapse() while in edit mode" ); - - /* make sure we get a tuple of sequences of something */ - switch( PySequence_Size( args ) ) { - case 1: - /* if a sequence... */ - tmp = PyTuple_GET_ITEM( args, 0 ); - if( PySequence_Check( tmp ) ) { - PyObject *tmp2; - - /* ignore empty sequences */ - if( !PySequence_Size( tmp ) ) { - Py_RETURN_NONE; - } - - /* if another sequence, use it */ - tmp2 = PySequence_ITEM( tmp, 0 ); - if( PySequence_Check( tmp2 ) ) - args = tmp; - Py_INCREF( args ); - Py_DECREF( tmp2 ); - } else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence pairs" ); - break; - case 2: /* two args may be individual edges/verts */ - tmp = PyTuple_GET_ITEM( args, 0 ); - /* - * if first item isn't a sequence, then assume it's a bunch of MVerts - * and wrap inside a tuple - */ - if( !PySequence_Check( tmp ) ) { - args = Py_BuildValue( "(O)", args ); - if( !args ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Py_BuildValue() failed" ); - /* - * otherwise, assume it already a bunch of sequences so use as-is - */ - } else { - Py_INCREF( args ); /* so we can safely DECREF later */ - } - break; - default: /* anything else is definitely wrong */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence pairs" ); - } - - /* if sequence is empty, do nothing */ - len = PySequence_Size( args ); - if( len == 0 ) { - Py_RETURN_NONE; - } - - /* allocate table of edge indices and new vertex values */ - - edge_table = (unsigned int *)MEM_callocN( len*sizeof( unsigned int ), - "edge_table" ); - vert_list = (float (*)[3])MEM_callocN( 3*len*sizeof( float ), - "vert_list" ); - - /* get the indices of edges to be collapsed and new vert locations */ - for( i = len; i--; ) { - PyObject *tmp1; - PyObject *tmp2; - - tmp = PySequence_GetItem( args, i ); - - /* if item isn't sequence of size 2, error */ - if( !PySequence_Check( tmp ) || PySequence_Size( tmp ) != 2 ) { - MEM_freeN( edge_table ); - MEM_freeN( vert_list ); - Py_DECREF( tmp ); - Py_DECREF( args ); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of (MEdges, vector)" ); - } - - /* if items aren't a MEdge/int and vector, error */ - tmp1 = PySequence_GetItem( tmp, 0 ); - tmp2 = PySequence_GetItem( tmp, 1 ); - Py_DECREF( tmp ); - if( !(BPy_MEdge_Check( tmp1 ) || PyInt_Check( tmp1 )) || - !VectorObject_Check ( tmp2 ) ) { - MEM_freeN( edge_table ); - MEM_freeN( vert_list ); - Py_DECREF( tmp1 ); - Py_DECREF( tmp2 ); - Py_DECREF( args ); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of (MEdges, vector)" ); - } - - /* store edge index, new vertex location */ - if( PyInt_Check( tmp1 ) ) - edge_table[i] = PyInt_AsLong ( tmp1 ); - else - edge_table[i] = ((BPy_MEdge *)tmp1)->index; - memcpy( vert_list[i], ((VectorObject *)tmp2)->vec, - 3*sizeof( float ) ); - Py_DECREF( tmp1 ); - Py_DECREF( tmp2 ); - - /* if index out-of-range, throw exception */ - if( edge_table[i] >= (unsigned int)mesh->totedge ) { - MEM_freeN( edge_table ); - MEM_freeN( vert_list ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "edge index out of range" ); - } - } - - /* - * simple algorithm: - * (1) deselect all verts - * (2) for each edge - * (2a) replace both verts with the new vert - * (2b) select both verts - * (3) call removedoublesflag() - */ - - /* (1) deselect all verts */ - for( i = mesh->totvert; i--; ) - mesh->mvert[i].flag &= ~SELECT; - - /* (2) replace edge's verts and select them */ - for( i = len; i--; ) { - srcedge = &mesh->medge[edge_table[i]]; - memcpy( &mesh->mvert[srcedge->v1].co, vert_list[i], 3*sizeof( float ) ); - memcpy( &mesh->mvert[srcedge->v2].co, vert_list[i], 3*sizeof( float ) ); - mesh->mvert[srcedge->v1].flag |= SELECT; - mesh->mvert[srcedge->v2].flag |= SELECT; - } - - /* (3) call removedoublesflag() */ - for( base = FIRSTBASE; base; base = base->next ) { - if( base->object->type == OB_MESH && - base->object->data == self->mesh ) { - object = base->object; - break; - } - } - - basact = BASACT; - BASACT = base; - - removedoublesflag( 1, 0, 0.0 ); - /* make mesh's object active, enter mesh edit mode */ - G.obedit = object; - - /* exit edit mode, free edit mesh */ - load_editMesh(); - free_editMesh(G.editMesh); - - BASACT = basact; - - /* clean up and exit */ - Py_DECREF( args ); - MEM_freeN( vert_list ); - MEM_freeN( edge_table ); - mesh_update ( mesh ); - Py_RETURN_NONE; -} - - -static PyObject *MEdgeSeq_selected( BPy_MEdgeSeq * self ) -{ - int i, count; - Mesh *mesh = self->mesh; - MEdge *tmpedge; - PyObject *list; - - /* first count selected edges (quicker than appending to PyList?) */ - count = 0; - tmpedge = mesh->medge; - for( i = 0; i < mesh->totedge; ++i, ++tmpedge ) - if( (mesh->mvert[tmpedge->v1].flag & SELECT) && - (mesh->mvert[tmpedge->v2].flag & SELECT) ) - ++count; - - list = PyList_New( count ); - if( !list ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - /* next, insert selected edges into list */ - count = 0; - tmpedge = mesh->medge; - for( i = 0; i < mesh->totedge; ++i, ++tmpedge ) { - if( (mesh->mvert[tmpedge->v1].flag & SELECT) && - (mesh->mvert[tmpedge->v2].flag & SELECT) ) { - PyObject *tmp = PyInt_FromLong( i ); - if( !tmp ) { - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyInt_FromLong() failed" ); - } - PyList_SET_ITEM( list, count, tmp ); - ++count; - } - } - return list; -} - -static PyObject *MEdgeSeq_add_layertype(BPy_MEdgeSeq *self, PyObject *args) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_addPropLayer_internal(me, &(me->edata), me->totedge, args); -} -static PyObject *MEdgeSeq_del_layertype(BPy_MEdgeSeq *self, PyObject *value) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_removePropLayer_internal(me, &(me->edata), me->totedge, value); -} -static PyObject *MEdgeSeq_rename_layertype(BPy_MEdgeSeq *self, PyObject *args) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_renamePropLayer_internal(me,&(me->edata),args); -} -static PyObject *MEdgeSeq_PropertyList(BPy_MEdgeSeq *self) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_propList_internal(&(me->edata)); -} - - -static struct PyMethodDef BPy_MEdgeSeq_methods[] = { - {"extend", (PyCFunction)MEdgeSeq_extend, METH_VARARGS, - "add edges to mesh"}, - {"delete", (PyCFunction)MEdgeSeq_delete, METH_VARARGS, - "delete edges from mesh"}, - {"selected", (PyCFunction)MEdgeSeq_selected, METH_NOARGS, - "returns a list containing indices of selected edges"}, - {"collapse", (PyCFunction)MEdgeSeq_collapse, METH_VARARGS, - "collapse one or more edges to a vertex"}, - {"addPropertyLayer",(PyCFunction)MEdgeSeq_add_layertype, METH_VARARGS, - "add a new property layer"}, - {"removePropertyLayer",(PyCFunction)MEdgeSeq_del_layertype, METH_O, - "removes a property layer"}, - {"renamePropertyLayer",(PyCFunction)MEdgeSeq_rename_layertype, METH_VARARGS, - "renames an existing property layer"}, - - {NULL, NULL, 0, NULL} -}; -static PyGetSetDef BPy_MEdgeSeq_getseters[] = { - {"properties", - (getter)MEdgeSeq_PropertyList, (setter)NULL, - "edge property layers, read only", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/************************************************************************ - * - * Python MEdgeSeq_Type standard operators - * - ************************************************************************/ - -/*****************************************************************************/ -/* Python MEdgeSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject MEdgeSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MEdgeSeq", /* char *tp_name; */ - sizeof( BPy_MEdgeSeq ), /* 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; */ - NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &MEdgeSeq_as_sequence, /* 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 */ - ( getiterfunc) MEdgeSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) MEdgeSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_MEdgeSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_MEdgeSeq_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 -}; - -/************************************************************************ - * - * Face attributes - * - ************************************************************************/ - -static MFace * MFace_get_pointer( BPy_MFace * self ) -{ - if( self->index >= self->mesh->totface ) - return (MFace *)EXPP_ReturnPyObjError( PyExc_RuntimeError, - "MFace is no longer valid" ); - return &self->mesh->mface[self->index]; -} - -/* - * get a face's vertices - */ - -static PyObject *MFace_getVerts( BPy_MFace * self ) -{ - PyObject *attr; - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return NULL; - - attr = PyTuple_New( face->v4 ? 4 : 3 ); - - if( !attr ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyTuple_New() failed" ); - - PyTuple_SetItem( attr, 0, MVert_CreatePyObject( self->mesh, face->v1 ) ); - PyTuple_SetItem( attr, 1, MVert_CreatePyObject( self->mesh, face->v2 ) ); - PyTuple_SetItem( attr, 2, MVert_CreatePyObject( self->mesh, face->v3 ) ); - if( face->v4 ) - PyTuple_SetItem( attr, 3, MVert_CreatePyObject( self->mesh, - face->v4 ) ); - - return attr; -} - -/* - * set a face's vertices - */ - -static int MFace_setVerts( BPy_MFace * self, PyObject * args ) -{ - BPy_MVert *v1, *v2, *v3, *v4 = NULL; - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return -1; - - if( !PyArg_ParseTuple ( args, "O!O!O!|O!", &MVert_Type, &v1, - &MVert_Type, &v2, &MVert_Type, &v3, &MVert_Type, &v4 ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected tuple of 3 or 4 MVerts" ); - - if( v1->index == v2->index || - v1->index == v3->index || - v2->index == v3->index ) - return EXPP_ReturnIntError( PyExc_ValueError, - "cannot assign 2 or move verts that are the same" ); - - if(v4 && ( v1->index == v4->index || - v2->index == v4->index || - v3->index == v4->index )) - return EXPP_ReturnIntError( PyExc_ValueError, - "cannot assign 2 or move verts that are the same" ); - - if( v1->index >= self->mesh->totvert || - v2->index >= self->mesh->totvert || - v3->index >= self->mesh->totvert || - (v4 &&( v4->index >= self->mesh->totvert))) - return EXPP_ReturnIntError( PyExc_ValueError, - "cannot assign verts that have been removed" ); - - face->v1 = v1->index; - face->v2 = v2->index; - face->v3 = v3->index; - if( v4 ) - face->v4 = v4->index; - return 0; -} - -/* - * get face's material index - */ - -static PyObject *MFace_getMat( BPy_MFace * self ) -{ - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return NULL; - - return PyInt_FromLong( face->mat_nr ); -} - -/* - * set face's material index - */ - -static int MFace_setMat( BPy_MFace * self, PyObject * value ) -{ - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return -1; /* error is set */ - - return EXPP_setIValueRange( value, &face->mat_nr, 0, 15, 'b' ); -} - -/* - * get a face's index - */ - -static PyObject *MFace_getIndex( BPy_MFace * self ) -{ - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return NULL; /* error is set */ - - return PyInt_FromLong( self->index ); -} - -/* - * get face's normal index - */ - -static PyObject *MFace_getNormal( BPy_MFace * self ) -{ - float *vert[4]; - float no[3]; - MFace *face = MFace_get_pointer( self ); - - Mesh *me = self->mesh; - - if( !face ) - return NULL; /* error is set */ - - if MFACE_VERT_BADRANGE_CHECK(me, face) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "one or more MFace vertices are no longer valid" ); - - vert[0] = me->mvert[face->v1].co; - vert[1] = me->mvert[face->v2].co; - vert[2] = me->mvert[face->v3].co; - if( face->v4 ) { - vert[3] = me->mvert[face->v4].co; - CalcNormFloat4( vert[0], vert[1], vert[2], vert[3], no ); - } else - CalcNormFloat( vert[0], vert[1], vert[2], no ); - - return newVectorObject( no, 3, Py_NEW ); -} - -/* - * get face's center location - */ - -static PyObject *MFace_getCent( BPy_MFace * self ) -{ - float *vert[4]; - float cent[3]= {0,0,0}; - int i=3, j, k; - Mesh *me = self->mesh; - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return NULL; /* error is set */ - - - if MFACE_VERT_BADRANGE_CHECK(me, face) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "one or more MFace vertices are no longer valid" ); - - vert[0] = me->mvert[face->v1].co; - vert[1] = me->mvert[face->v2].co; - vert[2] = me->mvert[face->v3].co; - if( face->v4 ) { - vert[3] = me->mvert[face->v4].co; - i=4; - } - - for (j=0;jmesh; - - if( !face ) - return NULL; /* error is set */ - - if MFACE_VERT_BADRANGE_CHECK(me, face) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "one or more MFace vertices are no longer valid" ); - - v1 = me->mvert[face->v1].co; - v2 = me->mvert[face->v2].co; - v3 = me->mvert[face->v3].co; - - if( face->v4 ) { - v4 = me->mvert[face->v4].co; - return PyFloat_FromDouble( AreaQ3Dfl(v1, v2, v3, v4)); - } else - return PyFloat_FromDouble( AreaT3Dfl(v1, v2, v3)); -} - -/* - * get one of a face's mface flag bits - */ - -static PyObject *MFace_getMFlagBits( BPy_MFace * self, void * type ) -{ - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return NULL; /* error is set */ - - return EXPP_getBitfield( &face->flag, (int)((long)type & 0xff), 'b' ); -} - -/* - * set one of a face's mface flag bits - */ - -static int MFace_setMFlagBits( BPy_MFace * self, PyObject * value, - void * type ) -{ - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return -1; /* error is set */ - - return EXPP_setBitfield( value, &face->flag, - (int)((long)type & 0xff), 'b' ); -} - -static int MFace_setSelect( BPy_MFace * self, PyObject * value, - void * type_unused ) -{ - MFace *face = MFace_get_pointer( self ); - int param = PyObject_IsTrue( value ); - Mesh *me; - - if( !face ) - return -1; /* error is set */ - - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - me = self->mesh; - if( param ) { - face->flag |= ME_FACE_SEL; - me->mvert[face->v1].flag |= SELECT; - me->mvert[face->v2].flag |= SELECT; - me->mvert[face->v3].flag |= SELECT; - if( face->v4 ) - me->mvert[face->v4].flag |= SELECT; - } - else { - face->flag &= ~ME_FACE_SEL; - me->mvert[face->v1].flag &= ~SELECT; - me->mvert[face->v2].flag &= ~SELECT; - me->mvert[face->v3].flag &= ~SELECT; - if( face->v4 ) - me->mvert[face->v4].flag &= ~SELECT; - } - - if( self->mesh->mselect ) { - MEM_freeN( self->mesh->mselect ); - self->mesh->mselect = NULL; - } - - return 0; -} - -/* - * get face's texture image - */ - -static PyObject *MFace_getImage( BPy_MFace *self ) -{ - MTFace *face; - if( !self->mesh->mtface ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return NULL; - - face = &self->mesh->mtface[self->index]; - - if( face->tpage ) - return Image_CreatePyObject( face->tpage ); - else - Py_RETURN_NONE; -} - -/* - * change or clear face's texture image - */ - -static int MFace_setImage( BPy_MFace *self, PyObject *value ) -{ - MTFace *face; - - if( !MFace_get_pointer( self ) ) - return -1; - - if( value && value != Py_None && !BPy_Image_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected image object or None" ); - - if( !self->mesh->mtface ) -#if 0 - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no texture values" ); -#else - make_tfaces( self->mesh ); -#endif - - face = &self->mesh->mtface[self->index]; - - if( value == NULL || value == Py_None ) - face->tpage = NULL; /* should memory be freed? */ - else { - face->tpage = ( ( BPy_Image * ) value )->image; - face->mode |= TF_TEX; - } - - return 0; -} - -#define MFACE_FLAG_BITMASK ( TF_SELECT | TF_SEL1 | \ - TF_SEL2 | TF_SEL3 | TF_SEL4 | TF_HIDE ) - -/* -* get face's texture flag -*/ - -static PyObject *MFace_getFlag( BPy_MFace *self ) -{ - int flag; - if( !self->mesh->mtface ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return NULL; - - flag = self->mesh->mtface[self->index].flag & MFACE_FLAG_BITMASK; - - /* so old scripts still work */ - if (self->index == self->mesh->act_face) - flag |= TF_ACTIVE; - - return PyInt_FromLong( (long)( flag ) ); -} - -/* - * set face's texture flag - */ - -static int MFace_setFlag( BPy_MFace *self, PyObject *value ) -{ - int param; - - if( !self->mesh->mtface ) - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return -1; - - if( !PyInt_Check ( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%04x", MFACE_FLAG_BITMASK ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - param = PyInt_AS_LONG ( value ); - - /* only one face can be active, so don't allow that here */ - if( param & TF_ACTIVE ) - param &= ~TF_ACTIVE; - - if( ( param & MFACE_FLAG_BITMASK ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - /* merge active setting with other new params */ - param |= (self->mesh->mtface[self->index].flag); - self->mesh->mtface[self->index].flag = (char)param; - - return 0; -} - -/* - * get face's texture mode - */ - -static PyObject *MFace_getMode( BPy_MFace *self ) -{ - if( !self->mesh->mtface ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return NULL; - - return PyInt_FromLong( self->mesh->mtface[self->index].mode ); -} - -/* - * set face's texture mode - */ - -static int MFace_setMode( BPy_MFace *self, PyObject *value ) -{ - int param; - static short bitmask = TF_DYNAMIC - | TF_TEX - | TF_SHAREDVERT - | TF_LIGHT - | TF_SHAREDCOL - | TF_TILES - | TF_BILLBOARD - | TF_TWOSIDE - | TF_INVISIBLE - | TF_OBCOL - | TF_BILLBOARD2 - | TF_SHADOW - | TF_BMFONT; - - if( !self->mesh->mtface ) - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return -1; - - if( !PyInt_Check ( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - param = PyInt_AS_LONG ( value ); - - if( param == 0xffff ) /* if param is ALL, set everything but HALO */ - param = bitmask ^ TF_BILLBOARD; - else if( ( param & bitmask ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - /* Blender UI doesn't allow these on at the same time */ - - if( ( param & (TF_BILLBOARD | TF_BILLBOARD2) ) == - (TF_BILLBOARD | TF_BILLBOARD2) ) - return EXPP_ReturnIntError( PyExc_ValueError, - "HALO and BILLBOARD cannot be enabled simultaneously" ); - - self->mesh->mtface[self->index].mode = (short)param; - - return 0; -} - -/* - * get face's texture transparency setting - */ - -static PyObject *MFace_getTransp( BPy_MFace *self ) -{ - if( !self->mesh->mtface ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return NULL; - - return PyInt_FromLong( self->mesh->mtface[self->index].transp ); -} - -/* - * set face's texture transparency setting - */ - -static int MFace_setTransp( BPy_MFace *self, PyObject *value ) -{ - if( !self->mesh->mtface ) - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return -1; - - return EXPP_setIValueRange( value, - &self->mesh->mtface[self->index].transp, TF_SOLID, TF_SUB, 'b' ); -} - -/* - * get a face's texture UV coord values - */ - -static PyObject *MFace_getUV( BPy_MFace * self ) -{ - MTFace *face; - PyObject *attr; - int length, i; - - if( !self->mesh->mtface ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return NULL; - - face = &self->mesh->mtface[self->index]; - length = self->mesh->mface[self->index].v4 ? 4 : 3; - attr = PyTuple_New( length ); - - if( !attr ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyTuple_New() failed" ); - - for( i=0; iuv[i], 2, Py_WRAP ); - if( !vector ) - return NULL; - PyTuple_SetItem( attr, i, vector ); - } - - return attr; -} - -/* - * set a face's texture UV coord values - */ - -static int MFace_setUV( BPy_MFace * self, PyObject * value ) -{ - MTFace *face; - int length, i; - - if( !MFace_get_pointer( self ) ) - return -1; - - if( !PySequence_Check( value ) || - EXPP_check_sequence_consistency( value, &vector_Type ) != 1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected sequence of vectors" ); - - length = self->mesh->mface[self->index].v4 ? 4 : 3; - if( length != PySequence_Size( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "size of vertex and UV sequences differ" ); - - if( !self->mesh->mtface ) -#if 0 - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no texture values" ); -#else - make_tfaces( self->mesh ); -#endif - - face = &self->mesh->mtface[self->index]; - for( i=0; iuv[i][0] = vector->vec[0]; - face->uv[i][1] = vector->vec[1]; - Py_DECREF( vector ); - } - return 0; -} - -/* - * get a face's texture UV coord select state - */ - -static PyObject *MFace_getUVSel( BPy_MFace * self ) -{ - MTFace *face; - PyObject *attr; - int length, i, mask; - - if( !self->mesh->mtface ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no texture values" ); - - if( !MFace_get_pointer( self ) ) - return NULL; - - face = &self->mesh->mtface[self->index]; - length = self->mesh->mface[self->index].v4 ? 4 : 3; - attr = PyTuple_New( length ); - - if( !attr ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyTuple_New() failed" ); - - /* get coord select state, one bit at a time */ - mask = TF_SEL1; - for( i=0; iflag & mask ? 1 : 0 ); - if( !value ) { - Py_DECREF( attr ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyInt_FromLong() failed" ); - } - PyTuple_SetItem( attr, i, value ); - } - - return attr; -} - -/* - * set a face's texture UV coord select state - */ - -static int MFace_setUVSel( BPy_MFace * self, PyObject * value ) -{ - MTFace *face; - int length, i, mask; - - if( !MFace_get_pointer( self ) ) - return -1; - - if( !PySequence_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a tuple of integers" ); - - length = self->mesh->mface[self->index].v4 ? 4 : 3; - if( length != PySequence_Size( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "size of vertex and UV lists differ" ); - - if( !self->mesh->mtface ) -#if 0 - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no texture values" ); -#else - make_tfaces( self->mesh ); -#endif - - /* set coord select state, one bit at a time */ - face = &self->mesh->mtface[self->index]; - mask = TF_SEL1; - for( i=0; iflag |= mask; - else - face->flag &= ~mask; - Py_DECREF(tmp); - } - return 0; -} - -/* - * get a face's vertex colors. note that if mesh->mtfaces is defined, then - * it takes precedent over mesh->mcol - */ - -static PyObject *MFace_getCol( BPy_MFace * self ) -{ - PyObject *attr; - int length, i; - MCol * mcol; - - /* if there's no mesh color vectors or texture faces, nothing to do */ - - if( !self->mesh->mcol ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no vertex colors" ); - - if( !MFace_get_pointer( self ) ) - return NULL; - - mcol = &self->mesh->mcol[self->index*4]; - - length = self->mesh->mface[self->index].v4 ? 4 : 3; - attr = PyTuple_New( length ); - - if( !attr ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyTuple_New() failed" ); - - for( i=0; imesh->mcol ) - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no vertex colors" ); - - if( !MFace_get_pointer( self ) ) - return -1; - - mcol = &self->mesh->mcol[self->index*4]; - - length = self->mesh->mface[self->index].v4 ? 4 : 3; - - if( !PyList_Check( value ) && !PyTuple_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a sequence of MCols" ); - - if( EXPP_check_sequence_consistency( value, &MCol_Type ) != 1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a sequence of MCols" ); - - if( PySequence_Size( value ) != length ) - return EXPP_ReturnIntError( PyExc_ValueError, - "incorrect number of colors for this face" ); - - for( i=0; icolor->r; - mcol[i].g = obj->color->g; - mcol[i].b = obj->color->b; - mcol[i].a = obj->color->a; - Py_DECREF( obj ); - } - return 0; -} - - -/* - * get edge keys for using in a dictionary or set key - */ - -static PyObject *MFace_getEdgeKeys( BPy_MFace * self ) -{ - MFace *face = MFace_get_pointer( self ); - PyObject *attr, *edpair; - - if (!face) - return NULL; /* error set */ - - if (face->v4) { - attr = PyTuple_New( 4 ); - edpair = PyTuple_New( 2 ); - if (face->v1 > face->v2) { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) ); - } else { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) ); - } - PyTuple_SET_ITEM( attr, 0, edpair ); - - edpair = PyTuple_New( 2 ); - if (face->v2 > face->v3) { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) ); - } else { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) ); - } - PyTuple_SET_ITEM( attr, 1, edpair ); - - edpair = PyTuple_New( 2 ); - if (face->v3 > face->v4) { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v4) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) ); - } else { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v4) ); - } - PyTuple_SET_ITEM( attr, 2, edpair ); - - edpair = PyTuple_New( 2 ); - if (face->v4 > face->v1) { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v4) ); - } else { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v4) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) ); - } - PyTuple_SET_ITEM( attr, 3, edpair ); - - } else { - - attr = PyTuple_New( 3 ); - edpair = PyTuple_New( 2 ); - if (face->v1 > face->v2) { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) ); - } else { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) ); - } - PyTuple_SET_ITEM( attr, 0, edpair ); - - edpair = PyTuple_New( 2 ); - if (face->v2 > face->v3) { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) ); - } else { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) ); - } - PyTuple_SET_ITEM( attr, 1, edpair ); - - edpair = PyTuple_New( 2 ); - if (face->v3 > face->v1) { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) ); - } else { - PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) ); - PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) ); - } - PyTuple_SET_ITEM( attr, 2, edpair ); - } - - return attr; -} - - -/************************************************************************ - * - * Python MFace_Type attributes get/set structure - * - ************************************************************************/ - -static PyGetSetDef BPy_MFace_getseters[] = { - {"verts", - (getter)MFace_getVerts, (setter)MFace_setVerts, - "face's vertices", - NULL}, - {"v", - (getter)MFace_getVerts, (setter)MFace_setVerts, - "deprecated: see 'verts'", - NULL}, - {"mat", - (getter)MFace_getMat, (setter)MFace_setMat, - "face's material index", - NULL}, - {"index", - (getter)MFace_getIndex, (setter)NULL, - "face's index", - NULL}, - {"no", - (getter)MFace_getNormal, (setter)NULL, - "face's normal", - NULL}, - {"cent", - (getter)MFace_getCent, (setter)NULL, - "face's center", - NULL}, - {"area", - (getter)MFace_getArea, (setter)NULL, - "face's 3D area", - NULL}, - - {"hide", - (getter)MFace_getMFlagBits, (setter)MFace_setMFlagBits, - "face hidden in edit mode", - (void *)ME_HIDE}, - {"sel", - (getter)MFace_getMFlagBits, (setter)MFace_setSelect, - "face selected in edit mode", - (void *)ME_FACE_SEL}, - {"smooth", - (getter)MFace_getMFlagBits, (setter)MFace_setMFlagBits, - "face smooth enabled", - (void *)ME_SMOOTH}, - - /* attributes for texture faces (mostly, I think) */ - - {"col", - (getter)MFace_getCol, (setter)MFace_setCol, - "face's vertex colors", - NULL}, - {"flag", - (getter)MFace_getFlag, (setter)MFace_setFlag, - "flags associated with texture faces", - NULL}, - {"image", - (getter)MFace_getImage, (setter)MFace_setImage, - "image associated with texture faces", - NULL}, - {"mode", - (getter)MFace_getMode, (setter)MFace_setMode, - "modes associated with texture faces", - NULL}, - {"transp", - (getter)MFace_getTransp, (setter)MFace_setTransp, - "transparency of texture faces", - NULL}, - {"uv", - (getter)MFace_getUV, (setter)MFace_setUV, - "face's UV coordinates", - NULL}, - {"uvSel", - (getter)MFace_getUVSel, (setter)MFace_setUVSel, - "face's UV coordinates select status", - NULL}, - {"edge_keys", - (getter)MFace_getEdgeKeys, (setter)NULL, - "for each edge this face uses return an ordered tuple edge pair that can be used as a key in a dictionary or set", - NULL}, - - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/************************************************************************ - * - * Python MFace_Type iterator (iterates over vertices) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *MFace_getIter( BPy_MFace * self ) -{ - if (self->iter==-1) { - self->iter = 0; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - BPy_MFace *seq= (BPy_MFace *)MFace_CreatePyObject(self->mesh, self->index); - seq->iter = 0; - return (PyObject *) seq; - } -} - -/* - * Return next MVert. Throw an exception after the final vertex. - */ - -static PyObject *MFace_nextIter( BPy_MFace * self ) -{ - struct MFace *face = &self->mesh->mface[self->index]; - int len = self->mesh->mface[self->index].v4 ? 4 : 3; - - if( self->iter == len ) { - self->iter = -1; - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - ++self->iter; - switch ( self->iter ) { - case 1: - return MVert_CreatePyObject( self->mesh, face->v1 ); - case 2: - return MVert_CreatePyObject( self->mesh, face->v2 ); - case 3: - return MVert_CreatePyObject( self->mesh, face->v3 ); - default : - return MVert_CreatePyObject( self->mesh, face->v4 ); - } -} - -/************************************************************************ - * - * Python MFace_Type methods - * - ************************************************************************/ - -/************************************************************************ - * - * Python MFace_Type standard operations - * - ************************************************************************/ -static int MFace_compare( BPy_MFace * a, BPy_MFace * b ) -{ - return( a->mesh == b->mesh && a->index == b->index ) ? 0 : -1; -} - -static PyObject *MFace_repr( BPy_MFace* self ) -{ - MFace *face = MFace_get_pointer( self ); - - if( !face ) - return NULL; - - if( face->v4 ) - return PyString_FromFormat( "[MFace (%d %d %d %d) %d]", - (int)face->v1, (int)face->v2, - (int)face->v3, (int)face->v4, (int)self->index ); - else - return PyString_FromFormat( "[MFace (%d %d %d) %d]", - (int)face->v1, (int)face->v2, - (int)face->v3, (int)self->index ); -} - -static long MFace_hash( BPy_MFace *self ) -{ - return (long)self->index; -} - -static int MFace_len( BPy_MFace * self ) -{ - if( self->index >= self->mesh->totface ) - return 0; - return self->mesh->mface[self->index].v4 ? 4 : 3; -} - -static PySequenceMethods MFace_as_sequence = { - ( inquiry ) MFace_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) 0, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - 0,0,0, -}; - -static PyObject *MFace_getProp( BPy_MFace *self, PyObject *args) -{ - Mesh *me = (Mesh *)self->mesh; - MFace *face = MFace_get_pointer( self ); - if( !face ) - return NULL; - mesh_update_customdata_pointers(me); //! - return Mesh_getProperty_internal(&(me->fdata), self->index, args); -} - -static PyObject *MFace_setProp( BPy_MFace *self, PyObject *args) -{ - Mesh *me = (Mesh *)self->mesh; - PyObject *obj; - MFace *face = MFace_get_pointer( self ); - if( !face ) - return NULL; /* error set */ - - obj = Mesh_setProperty_internal(&(me->fdata), self->index, args); - mesh_update_customdata_pointers(me); //! - return obj; -} - -static struct PyMethodDef BPy_MFace_methods[] = { - {"getProperty", (PyCFunction)MFace_getProp, METH_O, - "get property indicated by name"}, - {"setProperty", (PyCFunction)MFace_setProp, METH_VARARGS, - "set property indicated by name"}, - {NULL, NULL, 0, NULL} -}; -/************************************************************************ - * - * Python MFace_Type structure definition - * - ************************************************************************/ - -PyTypeObject MFace_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MFace", /* char *tp_name; */ - sizeof( BPy_MFace ), /* 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; */ - ( cmpfunc ) MFace_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) MFace_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &MFace_as_sequence, /* PySequenceMethods *tp_as_sequence; */ - NULL, /* PyMappingMethods *tp_as_mapping; */ - - /* More standard operations (here for binary compatibility) */ - - ( hashfunc ) MFace_hash, /* 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 */ - ( getiterfunc ) MFace_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) MFace_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_MFace_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_MFace_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 -}; - -static PyObject *MFace_CreatePyObject( Mesh * mesh, int i ) -{ - BPy_MFace *obj = PyObject_NEW( BPy_MFace, &MFace_Type ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - obj->mesh = mesh; - obj->index = i; - obj->iter= -1; - return (PyObject *)obj; -} - -/************************************************************************ - * - * Face sequence - * - ************************************************************************/ - -static int MFaceSeq_len( BPy_MFaceSeq * self ) -{ - return self->mesh->totface; -} - -static PyObject *MFaceSeq_item( BPy_MFaceSeq * self, int i ) -{ - if( i < 0 || i >= self->mesh->totface ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - - return MFace_CreatePyObject( self->mesh, i ); -} - -static PySequenceMethods MFaceSeq_as_sequence = { - ( inquiry ) MFaceSeq_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) MFaceSeq_item, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - 0,0,0, -}; - -/************************************************************************ - * - * Python MFaceSeq_Type iterator (iterates over faces) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *MFaceSeq_getIter( BPy_MFaceSeq * self ) -{ - if (self->iter==-1) { - self->iter = 0; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - BPy_MFaceSeq *seq = (BPy_MFaceSeq *)MFaceSeq_CreatePyObject(self->mesh); - seq->iter = 0; - return (PyObject *)seq; - } -} - -/* - * Return next MFace. - */ - -static PyObject *MFaceSeq_nextIter( BPy_MFaceSeq * self ) -{ - if( self->iter == self->mesh->totface ) { - self->iter= -1; /* not being used in a seq */ - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - return MFace_CreatePyObject( self->mesh, self->iter++ ); -} - -/************************************************************************ - * - * Python MFaceSeq_Type methods - * - ************************************************************************/ - -static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args, - PyObject *keywds ) -{ - /* - * (a) check input for valid edge objects, faces which consist of - * only three or four edges - * (b) check input to be sure edges form a closed face (each edge - * contains verts in two other different edges?) - * - * (1) build list of new faces; remove duplicates - * * use existing "v4=0 rule" for 3-vert faces - * (2) build list of existing faces for searching - * (3) from new face list, remove existing faces: - */ - - int len, nverts; - int i, j, k, new_face_count; - int good_faces; - SrchFaces *oldpair, *newpair, *tmppair, *tmppair2; - PyObject *tmp; - MFace *tmpface; - 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 ); - if( !tmp ) - return NULL; - Py_DECREF( tmp ); - - /* process any keyword arguments */ - if( keywds ) { - PyObject *res = PyDict_GetItemString( keywds, "ignoreDups" ); - if( res ) { - ignore_dups = PyObject_IsTrue( res ); - if (ignore_dups==-1) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "keyword argument \"ignoreDups\" expected True/False or 0/1" ); - } - } - res = PyDict_GetItemString( keywds, "indexList" ); - if (res) { - switch( PyObject_IsTrue( res ) ) { - case 0: - break; - case -1: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "keyword argument \"indexList\" expected True/False or 0/1" ); - default: - return_list = PyList_New( 0 ); - } - } - - res = PyDict_GetItemString( keywds, "smooth" ); - if (res) { - switch( PyObject_IsTrue( res ) ) { - case 0: - break; - case -1: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "keyword argument \"smooth\" expected True/False or 0/1" ); - default: - flag |= ME_SMOOTH; - - } - } - } - - /* make sure we get a tuple of sequences of something */ - - switch( PySequence_Size( args ) ) { - case 1: /* better be a sequence or a tuple */ - /* if a sequence... */ - tmp = PyTuple_GET_ITEM( args, 0 ); - if( PySequence_Check( tmp ) ) { - PyObject *tmp2; - - /* ignore empty sequences */ - if( !PySequence_Size( tmp ) ) { - Py_RETURN_NONE; - } - - /* if another sequence, use it */ - tmp2 = PySequence_ITEM( tmp, 0 ); - if( PySequence_Check( tmp2 ) ) - args = tmp; - Py_INCREF( args ); - Py_DECREF( tmp2 ); - } else - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence pairs" ); - break; - case 2: - case 3: - case 4: /* two to four args may be individual verts */ - tmp = PyTuple_GET_ITEM( args, 0 ); - /* - * if first item isn't a sequence, then assume it's a bunch of MVerts - * and wrap inside a tuple - */ - if( !PySequence_Check( tmp ) ) { - args = Py_BuildValue( "(O)", args ); - if( !args ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Py_BuildValue() failed" ); - /* - * otherwise, assume it already a bunch of sequences so use as-is - */ - } else { - Py_INCREF( args ); /* so we can safely DECREF later */ - } - break; - default: /* anything else is definitely wrong */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of sequence pairs" ); - } - - /* if nothing to add, just exit */ - len = PySequence_Size( args ); - if( len == 0 ) { - Py_DECREF( args ); - Py_RETURN_NONE; - } - - /* - * Since we call MEdgeSeq_extend first, we already know the input list - * is valid. Here we just need to count the total number of faces. - */ - - new_face_count = 0; - for( i = 0; i < len; ++i ) { - tmp = PySequence_ITEM( args, i ); - nverts = PySequence_Size( tmp ); - if( return_list || nverts != 2 ) - ++new_face_count; /* new faces must have 3 or 4 verts */ - Py_DECREF( tmp ); - } - - /* OK, commit to allocating the search structures */ - newpair = (SrchFaces *)MEM_callocN( sizeof(SrchFaces)*new_face_count, - "MFacePairs" ); - - /* scan the input list and build the new face pair list */ - len = PySequence_Size( args ); - tmppair = newpair; - - for( i = 0; i < len; ++i ) { - MFace tmpface; - unsigned int vert[4]={0,0,0,0}; - unsigned char order[4]={0,1,2,3}; - tmp = PySequence_GetItem( args, i ); - nverts = PySequence_Size( tmp ); - - if( nverts == 2 ) { /* again, ignore 2-vert tuples */ - if( return_list ) /* if returning indices, mark as deleted */ - tmppair->v[1] = 0; - Py_DECREF( tmp ); - continue; - } - - /* - * get the face's vertices' indexes - */ - - for( j = 0; j < nverts; ++j ) { - PyObject *item = PySequence_ITEM( tmp, j ); - if( BPy_MVert_Check( item ) ) - vert[j] = ((BPy_MVert *)item)->index; - else - vert[j] = PyInt_AsLong( item ); - Py_DECREF( item ); - } - Py_DECREF( tmp ); - tmpface.v1 = vert[0]; - tmpface.v2 = vert[1]; - tmpface.v3 = vert[2]; - tmpface.v4 = vert[3]; - - /* - * go through some contortions to guarantee the third and fourth - * vertices are not index 0 - */ - eeek_fix( &tmpface, nverts == 4 ); - vert[0] = tmpface.v1; - vert[1] = tmpface.v2; - vert[2] = tmpface.v3; - if( nverts == 3 ) - vert[3] = tmppair->v[3] = 0; - else - vert[3] = tmpface.v4; - - /* - * sort the verts before placing in pair list. the order of - * vertices in the face is very important, so keep track of - * the original order - */ - - for( j = nverts-1; j >= 0; --j ) { - for( k = 0; k < j; ++k ) { - if( vert[k] > vert[k+1] ) { - SWAP( int, vert[k], vert[k+1] ); - SWAP( char, order[k], order[k+1] ); - } else if( vert[k] == vert[k+1] ) { - break; - } - } - if( k < j ) - break; - tmppair->v[j] = vert[j]; - } - if( j >= 0 ) { /* a duplicate vertex found */ - if( return_list ) { /* if returning index list */ - tmppair->v[1] = 0; /* mark as deleted */ - } else { - --new_face_count; /* otherwise skip */ - continue; - } - } - tmppair->index = i; - - /* pack order into a byte */ - tmppair->order = order[0]|(order[1]<<2)|(order[2]<<4)|(order[3]<<6); - ++tmppair; - } - - /* - * find duplicates in the new list and mark. if it's a duplicate, - * then mark by setting second vert index to 0 (a real edge won't have - * second vert index of 0 since verts are sorted) - */ - - good_faces = new_face_count; /* assume all faces good to start */ - - tmppair = newpair; /* "last good edge" */ - tmppair2 = &tmppair[1]; /* "current candidate edge" */ - if( !ignore_dups ) { - - /* sort the new face pairs */ - qsort( newpair, new_face_count, sizeof(SrchFaces), mface_comp ); - - for( i = 0; i < new_face_count; ++i ) { - if( mface_comp( tmppair, tmppair2 ) ) - tmppair = tmppair2; /* last != current, so current == last */ - else { - tmppair2->v[1] = 0; /* last == current, so mark as duplicate */ - --good_faces; /* one less good face */ - } - tmppair2++; - } - } - - /* if mesh has faces, see if any of the new faces are already in it */ - if( mesh->totface && !ignore_dups ) { - oldpair = (SrchFaces *)MEM_callocN( sizeof(SrchFaces)*mesh->totface, - "MFacePairs" ); - - tmppair = oldpair; - tmpface = mesh->mface; - for( i = 0; i < mesh->totface; ++i ) { - unsigned char order[4]={0,1,2,3}; - int verts[4]; - verts[0]=tmpface->v1; - verts[1]=tmpface->v2; - verts[2]=tmpface->v3; - verts[3]=tmpface->v4; - - len = ( tmpface->v4 ) ? 3 : 2; - tmppair->v[3] = 0; /* for triangular faces */ - - /* sort the verts before placing in pair list here too */ - for( j = len; j >= 0; --j ) { - for( k = 0; k < j; ++k ) - if( verts[k] > verts[k+1] ) { - SWAP( int, verts[k], verts[k+1] ); - SWAP( unsigned char, order[k], order[k+1] ); - } - tmppair->v[j] = verts[j]; - } - - /* pack order into a byte */ - tmppair->order = order[0]|(order[1]<<2)|(order[2]<<4)|(order[3]<<6); - ++tmppair; - ++tmpface; - } - - /* sort the old face pairs */ - qsort( oldpair, mesh->totface, sizeof(SrchFaces), mface_comp ); - - /* eliminate new faces already in the mesh */ - tmppair = newpair; - for( i = good_faces; i ; ) { - if( tmppair->v[1] ) { - if( bsearch( tmppair, oldpair, mesh->totface, - sizeof(SrchFaces), mface_comp ) ) { - tmppair->v[1] = 0; /* mark as duplicate */ - --good_faces; - } - --i; - } - tmppair++; - } - MEM_freeN( oldpair ); - } - - /* if any new faces are left, add to list */ - if( good_faces || return_list ) { - int totface = mesh->totface+good_faces; /* new face count */ - CustomData fdata; - - CustomData_copy( &mesh->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface ); - CustomData_copy_data( &mesh->fdata, &fdata, 0, 0, mesh->totface ); - - if ( !CustomData_has_layer( &fdata, CD_MFACE ) ) - CustomData_add_layer( &fdata, CD_MFACE, CD_CALLOC, NULL, totface ); - - CustomData_free( &mesh->fdata, mesh->totface ); - mesh->fdata = fdata; - mesh_update_customdata_pointers( mesh ); - - /* sort the faces back into their original input list order */ - if( !ignore_dups ) - qsort( newpair, new_face_count, sizeof(SrchFaces), - mface_index_comp ); - - - /* point to the first face we're going to add */ - tmpface = &mesh->mface[mesh->totface]; - tmppair = newpair; - - if( return_list ) - good_faces = new_face_count; /* assume all faces good to start */ - - /* as we find a good face, add it */ - while ( good_faces ) { - if( tmppair->v[1] ) { - int i; - unsigned int index[4]; - unsigned char order = tmppair->order; - - /* unpack the order of the vertices */ - for( i = 0; i < 4; ++i ) { - index[(order & 0x03)] = i; - order >>= 2; - } - - /* now place vertices in the proper order */ - tmpface->v1 = tmppair->v[index[0]]; - tmpface->v2 = tmppair->v[index[1]]; - tmpface->v3 = tmppair->v[index[2]]; - tmpface->v4 = tmppair->v[index[3]]; - - tmpface->flag = flag; - - if( return_list ) { - tmp = PyInt_FromLong( mesh->totface ); - PyList_Append( return_list, tmp ); - Py_DECREF(tmp); - } - mesh->totface++; - ++tmpface; - --good_faces; - } else if( return_list ) { - PyList_Append( return_list, Py_None ); - --good_faces; - } - tmppair++; - } - } - - /* clean up and leave */ - mesh_update( mesh ); - Py_DECREF ( args ); - MEM_freeN( newpair ); - - if( return_list ) - return return_list; - else - Py_RETURN_NONE; -} - -struct fourEdges -{ - FaceEdges *v[4]; -}; - -static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args ) -{ - unsigned int *face_table; - int i, len; - Mesh *mesh = self->mesh; - MFace *tmpface; - int face_count; - int edge_also = 0; - - /* check for valid inputs */ - - if( PySequence_Size( args ) != 2 || - !PyArg_ParseTuple( args, "iO", &edge_also, &args ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected and int and a sequence of ints or MFaces" ); - - if( !PyList_Check( args ) && !PyTuple_Check( args ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected and int and a sequence of ints or MFaces" ); - - /* see how many args we need to parse */ - len = PySequence_Size( args ); - if( len < 1 ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "sequence must contain at least one int or MFace" ); - - face_table = MEM_callocN( len*sizeof( unsigned int ), - "face_table" ); - - /* get the indices of faces to be removed */ - for( i = len; i--; ) { - PyObject *tmp = PySequence_GetItem( args, i ); - if( BPy_MFace_Check( tmp ) ) - face_table[i] = ((BPy_MFace *)tmp)->index; - else if( PyInt_Check( tmp ) ) - face_table[i] = PyInt_AsLong( tmp ); - else { - MEM_freeN( face_table ); - Py_DECREF( tmp ); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of ints or MFaces" ); - } - Py_DECREF( tmp ); - - /* if index out-of-range, throw exception */ - if( face_table[i] >= (unsigned int)mesh->totface ) { - MEM_freeN( face_table ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "array index out of range" ); - } - } - - if( edge_also ) { - /* - * long version - * - * (1) build sorted table of all edges - * (2) construct face->edge lookup table for all faces - * face->e1 = mesh->medge[i] - * (3) (delete sorted table) - * (4) mark all edges as live - * (5) mark all edges for deleted faces as dead - * (6) mark all edges for remaining faces as live - * (7) delete all dead edges - * (8) (delete face lookup table) - * - */ - - FaceEdges *edge_table, *tmp_et; - MEdge *tmpedge; - FaceEdges **face_edges; - FaceEdges **tmp_fe; - struct fourEdges *fface; - int edge_count; - - edge_table = MEM_mallocN( mesh->totedge*sizeof( FaceEdges ), - "edge_table" ); - - tmpedge = mesh->medge; - tmp_et = edge_table; - - for( i = 0; i < mesh->totedge; ++i ) { - if( tmpedge->v1 < tmpedge->v2 ) { - tmp_et->v[0] = tmpedge->v1; - tmp_et->v[1] = tmpedge->v2; - } else { - tmp_et->v[0] = tmpedge->v2; - tmp_et->v[1] = tmpedge->v1; - } - tmp_et->index = i; - tmp_et->sel = 1; /* select each edge */ - ++tmpedge; - ++tmp_et; - } - - /* sort the edge pairs */ - qsort( edge_table, mesh->totedge, sizeof(FaceEdges), faceedge_comp ); - - /* build face translation table, lookup edges */ - face_edges = MEM_callocN( 4*sizeof(FaceEdges*)*mesh->totface, - "face_edges" ); - - tmp_fe = face_edges; - tmpface = mesh->mface; - for( i = mesh->totface; i--; ++tmpface ) { - FaceEdges *ptrs[4]; - unsigned int verts[4]; - int j,k; - FaceEdges target; - int len=tmpface->v4 ? 4 : 3; - - ptrs[3] = NULL; - verts[0] = tmpface->v1; - verts[1] = tmpface->v2; - verts[2] = tmpface->v3; - if( len == 4 ) - verts[3] = tmpface->v4; - for( j = 0; j < len; ++j ) { - k = (j+1) % len; - if( verts[j] < verts[k] ) { - target.v[0] = verts[j]; - target.v[1] = verts[k]; - } else { - target.v[0] = verts[k]; - target.v[1] = verts[j]; - } - ptrs[j] = bsearch( &target, edge_table, mesh->totedge, - sizeof(FaceEdges), faceedge_comp ); - } - for( j = 0; j < 4; ++j, ++tmp_fe ) - *tmp_fe = ptrs[j]; - } - - /* for each face, deselect each edge */ - tmpface = mesh->mface; - face_count = 0; - for( i = len; i--; ) { - if( tmpface[face_table[i]].v1 != UINT_MAX ) { - fface = (void *)face_edges; - fface += face_table[i]; - fface->v[0]->sel = 0; - fface->v[1]->sel = 0; - fface->v[2]->sel = 0; - if( fface->v[3] ) - fface->v[3]->sel = 0; - tmpface[face_table[i]].v1 = UINT_MAX; - ++face_count; - } - } - - /* 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 ) { - fface->v[0]->sel = 1; - fface->v[1]->sel = 1; - fface->v[2]->sel = 1; - if( fface->v[3] ) - fface->v[3]->sel = 1; - } - } - /* now mark the selected edges for deletion */ - - edge_count = 0; - for( i = 0; i < mesh->totedge; ++i ) { - if( !edge_table[i].sel ) { - mesh->medge[edge_table[i].index].v1 = UINT_MAX; - ++edge_count; - } - } - - if( edge_count ) - delete_edges( mesh, NULL, edge_count ); - - MEM_freeN( face_edges ); - MEM_freeN( edge_table ); - } else { - /* mark faces to delete */ - tmpface = mesh->mface; - face_count = 0; - for( i = len; i--; ) - if( tmpface[face_table[i]].v1 != UINT_MAX ) { - tmpface[face_table[i]].v1 = UINT_MAX; - ++face_count; - } - } - - /* delete faces which have a deleted edge */ - delete_faces( mesh, NULL, face_count ); - - /* clean up and return */ - MEM_freeN( face_table ); - mesh_update ( mesh ); - Py_RETURN_NONE; -} - -/* copied from meshtools.c - should make generic? */ -static void permutate(void *list, int num, int size, int *index) -{ - void *buf; - int len; - int i; - - len = num * size; - - buf = MEM_mallocN(len, "permutate"); - memcpy(buf, list, len); - - for (i = 0; i < num; i++) { - memcpy((char *)list + (i * size), (char *)buf + (index[i] * size), size); - } - MEM_freeN(buf); -} - -/* this wrapps list sorting then applies back to the mesh */ -static PyObject *MFaceSeq_sort( BPy_MEdgeSeq * self, PyObject *args, - PyObject *keywds ) -{ - PyObject *ret, *sort_func, *newargs; - - Mesh *mesh = self->mesh; - PyObject *sorting_list; - CustomDataLayer *layer; - int i, *index; - - /* get a list for internal use */ - sorting_list = PySequence_List( (PyObject *)self ); - if( !sorting_list ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - /* create index list */ - index = (int *) MEM_mallocN(sizeof(int) * mesh->totface, "sort faces"); - if (!index) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "faces.sort(...) failed to allocate memory" ); - - newargs = EXPP_PyTuple_New_Prepend(args, sorting_list); - sort_func = PyObject_GetAttrString( ((PyObject *)&PyList_Type), "sort"); - - ret = PyObject_Call(sort_func, newargs, keywds); - - Py_DECREF(newargs); - Py_DECREF(sort_func); - - if (ret) { - /* copy the faces indicies to index */ - for (i = 0; i < mesh->totface; i++) - index[i] = ((BPy_MFace *)PyList_GET_ITEM(sorting_list, i))->index; - - for(i = 0; i < mesh->fdata.totlayer; i++) { - layer = &mesh->fdata.layers[i]; - permutate(layer->data, mesh->totface, CustomData_sizeof(layer->type), index); - } - } - Py_DECREF(sorting_list); - MEM_freeN(index); - return ret; -} - -static PyObject *MFaceSeq_selected( BPy_MFaceSeq * self ) -{ - int i, count; - Mesh *mesh = self->mesh; - MFace *tmpface; - PyObject *list; - - /* first count selected faces (quicker than appending to PyList?) */ - count = 0; - tmpface = mesh->mface; - for( i = 0; i < mesh->totface; ++i, ++tmpface ) - if( tmpface->flag & ME_FACE_SEL ) - ++count; - - list = PyList_New( count ); - if( !list ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - /* next, insert selected faces into list */ - count = 0; - tmpface = mesh->mface; - for( i = 0; i < mesh->totface; ++i, ++tmpface ) { - if( tmpface->flag & ME_FACE_SEL ) { - PyObject *tmp = PyInt_FromLong( i ); - if( !tmp ) { - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyInt_FromLong() failed" ); - } - PyList_SET_ITEM( list, count, tmp ); - ++count; - } - } - return list; -} - -static PyObject *MFaceSeq_add_layertype(BPy_MFaceSeq *self, PyObject *args) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_addPropLayer_internal(me, &(me->fdata), me->totface, args); -} -static PyObject *MFaceSeq_del_layertype(BPy_MFaceSeq *self, PyObject *value) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_removePropLayer_internal(me, &(me->fdata), me->totface, value); -} -static PyObject *MFaceSeq_rename_layertype(BPy_MFaceSeq *self, PyObject *args) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_renamePropLayer_internal(me,&(me->fdata),args); -} -static PyObject *MFaceSeq_PropertyList(BPy_MFaceSeq *self) -{ - Mesh *me = (Mesh*)self->mesh; - return Mesh_propList_internal(&(me->fdata)); -} - -static struct PyMethodDef BPy_MFaceSeq_methods[] = { - {"extend", (PyCFunction)MFaceSeq_extend, METH_VARARGS|METH_KEYWORDS, - "add faces to mesh"}, - {"delete", (PyCFunction)MFaceSeq_delete, METH_VARARGS, - "delete faces from mesh"}, - {"sort", (PyCFunction)MFaceSeq_sort, METH_VARARGS|METH_KEYWORDS, - "sort the faces using list sorts syntax"}, - {"selected", (PyCFunction)MFaceSeq_selected, METH_NOARGS, - "returns a list containing indices of selected faces"}, - {"addPropertyLayer",(PyCFunction)MFaceSeq_add_layertype, METH_VARARGS, - "add a new property layer"}, - {"removePropertyLayer",(PyCFunction)MFaceSeq_del_layertype, METH_O, - "removes a property layer"}, - {"renamePropertyLayer",(PyCFunction)MFaceSeq_rename_layertype, METH_VARARGS, - "renames an existing property layer"}, - {NULL, NULL, 0, NULL} -}; -static PyGetSetDef BPy_MFaceSeq_getseters[] = { - {"properties", - (getter)MFaceSeq_PropertyList, (setter)NULL, - "vertex property layers, read only", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/************************************************************************ - * - * Python MFaceSeq_Type standard operations - * - ************************************************************************/ - -/*****************************************************************************/ -/* Python MFaceSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject MFaceSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MFaceSeq", /* char *tp_name; */ - sizeof( BPy_MFaceSeq ), /* 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; */ - NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &MFaceSeq_as_sequence, /* 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 */ - ( getiterfunc )MFaceSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc )MFaceSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_MFaceSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_MFaceSeq_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 -}; - -/************************************************************************ - * - * Python BPy_Mesh methods - * - ************************************************************************/ - -static PyObject *Mesh_calcNormals( BPy_Mesh * self ) -{ - Mesh *mesh = self->mesh; - - mesh_calc_normals( mesh->mvert, mesh->totvert, mesh->mface, - mesh->totface, NULL ); - Py_RETURN_NONE; -} - -static PyObject *Mesh_vertexShade( BPy_Mesh * self ) -{ - Base *base = FIRSTBASE; - - if( G.obedit ) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "can't shade vertices while in edit mode" ); - - while( base ) { - if( base->object->type == OB_MESH && - base->object->data == self->mesh ) { - base->flag |= SELECT; - set_active_base( base ); - make_vertexcol(1); - countall(); - Py_RETURN_NONE; - } - base = base->next; - } - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "object not found in baselist!" ); -} - -/* - * force display list update - */ - -static PyObject *Mesh_Update( BPy_Mesh * self, PyObject *args, PyObject *kwd ) -{ - - char *blockname= NULL; - static char *kwlist[] = {"key", NULL}; - - if( !PyArg_ParseTupleAndKeywords(args, kwd, "|s", kwlist, &blockname) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Expected nothing or the name of a shapeKey"); - - if (blockname) { - Mesh *me = self->mesh; - MVert *mv = me->mvert; - Key *key= me->key; - KeyBlock *kb; - float (*co)[3]; - int i; - - if (!key) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Cannot update the key for this mesh, it has no shape keys"); - - for (kb = key->block.first; kb; kb=kb->next) - if (strcmp(blockname, kb->name)==0) - break; - - if (!kb) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "This requested key to update does not exist"); - - for(i=0, co= kb->data; itotvert; i++, mv++, co++) - VECCOPY(*co, mv->co); - } else { - /* Normal operation */ - mesh_update( self->mesh ); - } - Py_RETURN_NONE; -} - -/* - * search for a single edge in mesh's edge list - */ - -static PyObject *Mesh_findEdge( BPy_Mesh * self, PyObject *args ) -{ - int i; - unsigned int v1, v2; - PyObject *tmp; - MEdge *edge = self->mesh->medge; - - if( EXPP_check_sequence_consistency( args, &MVert_Type ) == 1 && - PySequence_Size( args ) == 2 ) { - tmp = PyTuple_GET_ITEM( args, 0 ); - v1 = ((BPy_MVert *)tmp)->index; - tmp = PyTuple_GET_ITEM( args, 1 ); - v2 = ((BPy_MVert *)tmp)->index; - } else if( PyArg_ParseTuple( args, "ii", &v1, &v2 ) ) { - if( (int)v1 >= self->mesh->totvert || (int)v2 >= self->mesh->totvert ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "index out of range" ); - } else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "expected tuple of two ints or MVerts" ); - - for( i = 0; i < self->mesh->totedge; ++i ) { - if( ( edge->v1 == v1 && edge->v2 == v2 ) - || ( edge->v1 == v2 && edge->v2 == v1 ) ) { - tmp = PyInt_FromLong( i ); - if( tmp ) - return tmp; - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyInt_FromLong() failed" ); - } - ++edge; - } - Py_RETURN_NONE; -} - -/* - * search for a group of edges in mesh's edge list - */ - -static PyObject *Mesh_findEdges( PyObject * self, PyObject *args ) -{ - int len; - int i; - SrchEdges *oldpair, *tmppair, target, *result; - PyObject *list, *tmp; - BPy_MVert *v1, *v2; - unsigned int index1, index2; - MEdge *tmpedge; - Mesh *mesh = ((BPy_Mesh *)self)->mesh; - - /* if no edges, nothing to do */ - - if( !mesh->totedge ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "mesh has no edges" ); - - /* make sure we get a sequence of tuples of something */ - - tmp = PyTuple_GET_ITEM( args, 0 ); - switch( PySequence_Size ( args ) ) { - case 1: /* better be a list or a tuple */ - if( !PySequence_Check ( tmp ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of tuple int or MVert pairs" ); - args = tmp; - Py_INCREF( args ); /* so we can safely DECREF later */ - break; - case 2: /* take any two args and put into a tuple */ - if( PyTuple_Check( tmp ) ) - Py_INCREF( args ); /* if first arg is a tuple, assume both are */ - else { - args = Py_BuildValue( "((OO))", tmp, PyTuple_GET_ITEM( args, 1 ) ); - if( !args ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Py_BuildValue() failed" ); - } - break; - default: /* anything else is definitely wrong */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of tuple pairs" ); - } - - len = PySequence_Size( args ); - if( len == 0 ) { - Py_DECREF( args ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected at least one tuple" ); - } - - /* if a single edge, handle the simpler way */ - if( len == 1 ) { - PyObject *result; - tmp = PySequence_GetItem( args, 0 ); - result = Mesh_findEdge( (BPy_Mesh *)self, tmp ); - Py_DECREF( tmp ); - Py_DECREF( args ); - return result; - } - - /* build a list of all edges so we can search */ - oldpair = (SrchEdges *)MEM_callocN( sizeof(SrchEdges)*mesh->totedge, - "MEdgePairs" ); - - tmppair = oldpair; - tmpedge = mesh->medge; - for( i = 0; i < mesh->totedge; ++i ) { - if( tmpedge->v1 < tmpedge->v2 ) { - tmppair->v[0] = tmpedge->v1; - tmppair->v[1] = tmpedge->v2; - } else { - tmppair->v[0] = tmpedge->v2; - tmppair->v[1] = tmpedge->v1; - } - tmppair->index = i; - ++tmpedge; - ++tmppair; - } - - /* sort the old edge pairs */ - qsort( oldpair, mesh->totedge, sizeof(SrchEdges), medge_comp ); - - list = PyList_New( len ); - if( !len ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - /* scan the input list, find vert pairs, then search the edge list */ - - for( i = 0; i < len; ++i ) { - tmp = PySequence_GetItem( args, i ); - if( !PyTuple_Check( tmp ) || PyTuple_Size( tmp ) != 2 ) { - MEM_freeN( oldpair ); - Py_DECREF( tmp ); - Py_DECREF( args ); - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected tuple pair" ); - } - - /* get objects, check that they are both MVerts of this mesh */ - v1 = (BPy_MVert *)PyTuple_GET_ITEM( tmp, 0 ); - v2 = (BPy_MVert *)PyTuple_GET_ITEM( tmp, 1 ); - Py_DECREF ( tmp ); - if( BPy_MVert_Check( v1 ) && BPy_MVert_Check( v2 ) ) { - if( v1->data != (void *)mesh || v2->data != (void *)mesh ) { - MEM_freeN( oldpair ); - Py_DECREF( args ); - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "one or both MVerts do not belong to this mesh" ); - } - index1 = v1->index; - index2 = v2->index; - } else if( PyInt_Check( v1 ) && PyInt_Check( v2 ) ) { - index1 = PyInt_AsLong( (PyObject *)v1 ); - index2 = PyInt_AsLong( (PyObject *)v2 ); - if( (int)index1 >= mesh->totvert - || (int)index2 >= mesh->totvert ) { - MEM_freeN( oldpair ); - Py_DECREF( args ); - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_IndexError, - "index out of range" ); - } - } else { - MEM_freeN( oldpair ); - Py_DECREF( args ); - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected tuple to contain MVerts" ); - } - - /* sort verts into order */ - if( index1 < index2 ) { - target.v[0] = index1; - target.v[1] = index2; - } else { - target.v[0] = index2; - target.v[1] = index1; - } - - /* search edge list for a match; result is index or None */ - result = bsearch( &target, oldpair, mesh->totedge, - sizeof(SrchEdges), medge_comp ); - if( result ) - tmp = PyInt_FromLong( result->index ); - else - tmp = EXPP_incr_ret( Py_None ); - if( !tmp ) { - MEM_freeN( oldpair ); - Py_DECREF( args ); - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyInt_FromLong() failed" ); - } - PyList_SET_ITEM( list, i, tmp ); - } - - MEM_freeN( oldpair ); - Py_DECREF ( args ); - return list; -} - -/* - * replace mesh data with mesh data from another object - */ - - -static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args ) -{ - Object *ob = NULL; - PyObject *object_arg; - ID tmpid; - Mesh *tmpmesh; - Curve *tmpcu = NULL; - DerivedMesh *dm; - Object *tmpobj = NULL; - int cage = 0, render = 0, i; - - if( !PyArg_ParseTuple( args, "O|ii", &object_arg, &cage, &render ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected object or string and optional integer arguments" ); - - if ( PyString_Check( object_arg ) ) { - char *name; - name = PyString_AsString ( object_arg ); - ob = ( Object * ) GetIdFromList( &( G.main->object ), name ); - if( !ob ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, name ); - } else if ( BPy_Object_Check(object_arg) ) { - ob = (( BPy_Object * ) object_arg)->object; - } else { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected object or string and optional integer arguments" ); - } - - if( cage != 0 && cage != 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "cage value must be 0 or 1" ); - - - - /* perform the mesh extraction based on type */ - switch (ob->type) { - case OB_FONT: - case OB_CURVE: - case OB_SURF: - /* copies object and modifiers (but not the data) */ - tmpobj= copy_object( ob ); - tmpcu = (Curve *)tmpobj->data; - tmpcu->id.us--; - - /* if getting the original caged mesh, delete object modifiers */ - if( cage ) - object_free_modifiers(tmpobj); - - /* copies the data */ - tmpobj->data = copy_curve( (Curve *) ob->data ); - -#if 0 - /* copy_curve() sets disp.first null, so currently not need */ - { - Curve *cu; - cu = (Curve *)tmpobj->data; - if( cu->disp.first ) - MEM_freeN( cu->disp.first ); - cu->disp.first = NULL; - } - -#endif - - /* get updated display list, and convert to a mesh */ - makeDispListCurveTypes( tmpobj, 0 ); - nurbs_to_mesh( tmpobj ); - - /* nurbs_to_mesh changes the type tp a mesh, check it worked */ - if (tmpobj->type != OB_MESH) { - free_libblock_us( &G.main->object, tmpobj ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cant convert curve to mesh. Does the curve have any segments?" ); - } - tmpmesh = tmpobj->data; - free_libblock_us( &G.main->object, tmpobj ); - break; - case OB_MBALL: - /* metaballs don't have modifiers, so just convert to mesh */ - ob = find_basis_mball( ob ); - tmpmesh = add_mesh("Mesh"); - mball_to_mesh( &ob->disp, tmpmesh ); - - break; - case OB_MESH: - /* copies object and modifiers (but not the data) */ - if (cage) { - /* copies the data */ - tmpmesh = copy_mesh( ob->data ); - /* if not getting the original caged mesh, get final derived mesh */ - } else { - /* Make a dummy mesh, saves copying */ - - /* Write the display mesh into the dummy mesh */ - if (render) - dm = mesh_create_derived_render( ob, CD_MASK_MESH ); - else - dm = mesh_create_derived_view( ob, CD_MASK_MESH ); - - tmpmesh = add_mesh( "Mesh" ); - DM_to_mesh( dm, tmpmesh ); - dm->release( dm ); - } - - break; - default: - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "Object does not have geometry data" ); - } - - /* free mesh data in the original */ - free_mesh( self->mesh ); - /* save a copy of our ID, dup the temporary mesh, restore the ID */ - tmpid = self->mesh->id; - memcpy( self->mesh, tmpmesh, sizeof( Mesh ) ); - self->mesh->id = tmpid; - - /* if mesh has keys, make sure they point back to this mesh */ - if( self->mesh->key ) - self->mesh->key->from = (ID *)self->mesh; - - - - /* Copy materials to new object */ - switch (ob->type) { - case OB_SURF: - self->mesh->totcol = tmpcu->totcol; - - /* free old material list (if it exists) and adjust user counts */ - if( tmpcu->mat ) { - for( i = tmpcu->totcol; i-- > 0; ) { - - /* are we an object material or data based? */ - if (ob->colbits & 1<mesh->mat[i] = ob->mat[i]; - ob->mat[i]->id.us++; - tmpmesh->mat[i]->id.us--; - } else { - self->mesh->mat[i] = tmpcu->mat[i]; - if (self->mesh->mat[i]) { - tmpmesh->mat[i]->id.us++; - } - } - } - } - break; - -#if 0 - /* Crashes when assigning the new material, not sure why */ - case OB_MBALL: - tmpmb = (MetaBall *)ob->data; - self->mesh->totcol = tmpmb->totcol; - - /* free old material list (if it exists) and adjust user counts */ - if( tmpmb->mat ) { - for( i = tmpmb->totcol; i-- > 0; ) { - self->mesh->mat[i] = tmpmb->mat[i]; /* CRASH HERE ??? */ - if (self->mesh->mat[i]) { - tmpmb->mat[i]->id.us++; - } - } - } - break; -#endif - - case OB_MESH: - if (!cage) { - Mesh *origmesh= ob->data; - self->mesh->flag= origmesh->flag; - self->mesh->mat = MEM_dupallocN(origmesh->mat); - self->mesh->totcol = origmesh->totcol; - self->mesh->smoothresh= origmesh->smoothresh; - if( origmesh->mat ) { - for( i = origmesh->totcol; i-- > 0; ) { - /* are we an object material or data based? */ - if (ob->colbits & 1<mesh->mat[i] = ob->mat[i]; - - if (ob->mat[i]) - ob->mat[i]->id.us++; - if (origmesh->mat[i]) - origmesh->mat[i]->id.us--; - } else { - self->mesh->mat[i] = origmesh->mat[i]; - - if (origmesh->mat[i]) - origmesh->mat[i]->id.us++; - } - } - } - } - break; - } /* end copy materials */ - - - - /* remove the temporary mesh */ - BLI_remlink( &G.main->mesh, tmpmesh ); - MEM_freeN( tmpmesh ); - - /* make sure materials get updated in objects */ - test_object_materials( ( ID * ) self->mesh ); - - mesh_update( self->mesh ); - Py_RETURN_NONE; -} - -/* - * apply a transform to the mesh's vertices - * - * WARNING: unlike NMesh, this method ALWAYS changes the original mesh - */ - -static PyObject *Mesh_transform( BPy_Mesh *self, PyObject *args, PyObject *kwd ) -{ - Mesh *mesh = self->mesh; - MVert *mvert; - /*PyObject *pymat = NULL;*/ - MatrixObject *bpymat=NULL; - int i, recalc_normals = 0, selected_only = 0; - - static char *kwlist[] = {"matrix", "recalc_normals", "selected_only", NULL}; - - if( !PyArg_ParseTupleAndKeywords(args, kwd, "|O!ii", kwlist, - &matrix_Type, &bpymat, &recalc_normals, &selected_only) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "matrix must be a 4x4 transformation matrix\n" - "for example as returned by object.matrixWorld\n" - "and optionaly keyword bools, recalc_normals and selected_only\n"); - } - - if (!bpymat) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "the first argument must be a matrix or\n" - "matrix passed as a keyword argument\n"); - - - /*bpymat = ( MatrixObject * ) pymat;*/ - - if( bpymat->colSize != 4 || bpymat->rowSize != 4 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "matrix must be a 4x4 transformation matrix\n" - "for example as returned by object.getMatrix()" ); - - /* loop through all the verts and transform by the supplied matrix */ - mvert = mesh->mvert; - if (selected_only) { - for( i = 0; i < mesh->totvert; i++, mvert++ ) { - if (mvert->flag & SELECT) { - Mat4MulVecfl( (float(*)[4])*bpymat->matrix, mvert->co ); - } - } - } else { - for( i = 0; i < mesh->totvert; i++, mvert++ ) { - Mat4MulVecfl( (float(*)[4])*bpymat->matrix, mvert->co ); - } - } - - if( recalc_normals ) { - /* loop through all the verts and transform normals by the inverse - * of the transpose of the supplied matrix */ - float invmat[4][4], vec[3], nx, ny, nz; - - /* - * we only need to invert a 3x3 submatrix, because the 4th component of - * affine vectors is 0, but Mat4Invert reports non invertible matrices - */ - - if (!Mat4Invert((float(*)[4])*invmat, (float(*)[4])*bpymat->matrix)) - return EXPP_ReturnPyObjError (PyExc_AttributeError, - "given matrix is not invertible"); - - /* - * since normal is stored as shorts, convert to float - */ - - mvert = mesh->mvert; - for( i = 0; i < mesh->totvert; i++, mvert++ ) { - nx= vec[0] = (float)(mvert->no[0] / 32767.0); - ny= vec[1] = (float)(mvert->no[1] / 32767.0); - nz= vec[2] = (float)(mvert->no[2] / 32767.0); - vec[0] = nx*invmat[0][0] + ny*invmat[0][1] + nz*invmat[0][2]; - vec[1] = nx*invmat[1][0] + ny*invmat[1][1] + nz*invmat[1][2]; - vec[2] = nx*invmat[2][0] + ny*invmat[2][1] + nz*invmat[2][2]; - Normalize( vec ); - mvert->no[0] = (short)(vec[0] * 32767.0); - mvert->no[1] = (short)(vec[1] * 32767.0); - mvert->no[2] = (short)(vec[2] * 32767.0); - } - } - - Py_RETURN_NONE; -} - -static PyObject *Mesh_addVertGroup( PyObject * self, PyObject * value ) -{ - char *groupStr = PyString_AsString(value); - struct Object *object; - - if( !groupStr ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - object = ( ( BPy_Mesh * ) self )->object; - - if( object == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh not linked to an object" ); - - /* add_defgroup_name clamps the name to 32, make sure that dosnt change */ - add_defgroup_name( object, groupStr ); - - EXPP_allqueue( REDRAWBUTSALL, 1 ); - - Py_RETURN_NONE; -} - -static PyObject *Mesh_removeVertGroup( PyObject * self, PyObject * value ) -{ - char *groupStr = PyString_AsString(value); - struct Object *object; - 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" ); - - if( ( ( BPy_Mesh * ) self )->object == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first..." ); - - object = ( ( BPy_Mesh * ) self )->object; - - pGroup = get_named_vertexgroup( object, groupStr ); - if( pGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no deform groups assigned to mesh" ); - nIndex++; - object->actdef = (unsigned short)nIndex; - - del_defgroup_in_object_mode( object ); - - EXPP_allqueue( REDRAWBUTSALL, 1 ); - - Py_RETURN_NONE; -} - -extern void add_vert_defnr( Object * ob, int def_nr, int vertnum, float weight, - int assignmode ); -extern void remove_vert_def_nr (Object *ob, int def_nr, int vertnum); - -static PyObject *Mesh_assignVertsToGroup( BPy_Mesh * self, PyObject * args ) -{ - char *groupStr; - int nIndex; - bDeformGroup *pGroup; - PyObject *listObject; - int tempInt; - int x; - int assignmode = WEIGHT_REPLACE; - float weight = 1.0; - Object *object = self->object; - Mesh *mesh = self->mesh; - - if( !object ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first" ); - - if( ((Mesh *)object->data) != mesh ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object no longer linked to this mesh" ); - - if( !PyArg_ParseTuple ( args, "sO!fi", &groupStr, &PyList_Type, - &listObject, &weight, &assignmode) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string, list, float, string arguments" ); - } - - pGroup = get_named_vertexgroup( object, groupStr ); - if( pGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no deform groups assigned to mesh" ); - - - if( assignmode != WEIGHT_REPLACE && assignmode != WEIGHT_ADD && - assignmode != WEIGHT_SUBTRACT ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad assignment mode" ); - - /* makes a set of dVerts corresponding to the mVerts */ - if( !mesh->dvert ) - create_dverts( &mesh->id ); - - /* loop list adding verts to group */ - for( x = 0; x < PyList_Size( listObject ); x++ ) { - if( !PyArg_Parse ( PyList_GetItem( listObject, x ), "i", &tempInt ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "python list integer not parseable" ); - - if( tempInt < 0 || tempInt >= mesh->totvert ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad vertex index in list" ); - - add_vert_defnr( object, nIndex, tempInt, weight, assignmode ); - } - - Py_RETURN_NONE; -} - -static PyObject *Mesh_removeVertsFromGroup( BPy_Mesh * self, PyObject * args ) -{ - /* not passing a list will remove all verts from group */ - - char *groupStr; - int nIndex; - Object *object; - Mesh *mesh; - bDeformGroup *pGroup; - PyObject *listObject = NULL; - int tempInt; - int i; - - object = self->object; - mesh = self->mesh; - if( !object ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first" ); - - if( ((Mesh *)object->data) != mesh ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object no longer linked to this mesh" ); - - if( !PyArg_ParseTuple - ( args, "s|O!", &groupStr, &PyList_Type, &listObject ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string and optional list argument" ); - - if( !mesh->dvert ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "this mesh contains no deform vertices" ); - - pGroup = get_named_vertexgroup( object, groupStr ); - if( pGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "no deform groups assigned to mesh" ); - - /* get out of edit mode */ - - if( G.obedit ) { - load_editMesh(); - free_editMesh(G.editMesh); - G.obedit = NULL; - } - - if( !listObject ) /* no list given */ - for( i = 0; i < mesh->totvert; i++ ) - remove_vert_def_nr( object, nIndex, i ); - else /* loop list removing verts to group */ - for( i = 0; i < PyList_Size( listObject ); i++ ) { - if( !PyArg_Parse( PyList_GetItem( listObject, i ), "i", &tempInt ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "python list integer not parseable" ); - - if( tempInt < 0 || tempInt >= mesh->totvert ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad vertex index in list" ); - - remove_vert_def_nr( object, nIndex, tempInt ); - } - - Py_RETURN_NONE; -} - -static PyObject *Mesh_getVertsFromGroup( BPy_Mesh* self, PyObject * args ) -{ - /* - * not passing a list will return all verts from group - * passing indecies not part of the group will not return data in pyList - * can be used as a index/group check for a vertex - */ - - char *groupStr; - int nIndex; - bDeformGroup *pGroup; - MDeformVert *dvert; - int i, k, count; - PyObject *vertexList; - Object *object; - Mesh *mesh; - - int num = 0; - int weightRet = 0; - PyObject *listObject = NULL; - - object = self->object; - mesh = self->mesh; - if( !object ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first" ); - - if( ((Mesh *)object->data) != mesh ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object no longer linked to this mesh" ); - - if( !PyArg_ParseTuple( args, "s|iO!", &groupStr, &weightRet, - &PyList_Type, &listObject ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string and optional int and list arguments" ); - - if( weightRet < 0 || weightRet > 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "return weights flag must be 0 or 1" ); - - if( !mesh->dvert ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "this mesh contains no deform vertices" ); - - pGroup = get_named_vertexgroup( object, groupStr ); - if( !pGroup ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no deform groups assigned to mesh" ); - - count = 0; - - if( !listObject ) { /* do entire group */ - vertexList = PyList_New( mesh->totvert ); - if( !vertexList ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "getVertsFromGroup: can't create pylist!" ); - - dvert = mesh->dvert; - for( num = 0; num < mesh->totvert; num++, ++dvert ) { - for( i = 0; i < dvert->totweight; i++ ) { - if( dvert->dw[i].def_nr == nIndex ) { - PyObject *attr; - if( weightRet ) - attr = Py_BuildValue( "(i,f)", num, - dvert->dw[i].weight ); - else - attr = PyInt_FromLong ( num ); - PyList_SetItem( vertexList, count, attr ); - count++; - } - } - } - - if (count < mesh->totvert) - PyList_SetSlice(vertexList, count, mesh->totvert, NULL); - - } else { /* do individual vertices */ - int listObjectLen = PyList_Size( listObject ); - - vertexList = PyList_New( listObjectLen ); - for( i = 0; i < listObjectLen; i++ ) { - PyObject *attr = NULL; - - num = PyInt_AsLong( PyList_GetItem( listObject, i ) ); - if (num == -1) {/* -1 is an error AND an invalid range, we dont care which */ - Py_DECREF(vertexList); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "python list integer not parseable" ); - } - - if( num < 0 || num >= mesh->totvert ) { - Py_DECREF(vertexList); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad vertex index in list" ); - } - dvert = mesh->dvert + num; - for( k = 0; k < dvert->totweight; k++ ) { - if( dvert->dw[k].def_nr == nIndex ) { - if( weightRet ) - attr = Py_BuildValue( "(i,f)", num, - dvert->dw[k].weight ); - else - attr = PyInt_FromLong ( num ); - PyList_SetItem( vertexList, count, attr ); - count++; - } - } - } - if (count < listObjectLen) - PyList_SetSlice(vertexList, count, listObjectLen, NULL); - } - - return vertexList; -} - -static PyObject *Mesh_renameVertGroup( BPy_Mesh * self, PyObject * args ) -{ - char *oldGr = NULL; - char *newGr = NULL; - bDeformGroup *defGroup; - Object *object; - Mesh *mesh; - - object = self->object; - mesh = self->mesh; - if( !object ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first" ); - - if( ((Mesh *)object->data) != mesh ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object no longer linked to this mesh" ); - - if( !PyArg_ParseTuple( args, "ss", &oldGr, &newGr ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected two string arguments" ); - - defGroup = get_named_vertexgroup( object, oldGr ); - if( !defGroup ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't find the vertex group" ); - - PyOS_snprintf( defGroup->name, 32, newGr ); - unique_vertexgroup_name( defGroup, object ); - - Py_RETURN_NONE; -} - - - - -static PyObject *Mesh_getVertGroupNames( BPy_Mesh * self ) -{ - bDeformGroup *defGroup; - PyObject *list; - Object *obj = self->object; - Mesh *mesh = self->mesh; - int count; - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first" ); - - if( ((Mesh *)obj->data) != mesh ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object no longer linked to this mesh" ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - count = 0; - for( defGroup = obj->defbase.first; defGroup; defGroup = defGroup->next ) - ++count; - - list = PyList_New( count ); - count = 0; - for( defGroup = obj->defbase.first; defGroup; defGroup = defGroup->next ) - PyList_SET_ITEM( list, count++, - PyString_FromString( defGroup->name ) ); - - return list; -} - -static PyObject *Mesh_getVertexInfluences( BPy_Mesh * self, PyObject * args ) -{ - int index; - PyObject *influence_list = NULL; - Object *object = self->object; - Mesh *me = self->mesh; - - /* Get a reference to the mesh object wrapped in here. */ - if( !object ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - /* Parse the parameters: only on integer (vertex index) */ - if( !PyArg_ParseTuple( args, "i", &index ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (index of the vertex)" ); - - /* check for valid index */ - if( index < 0 || index >= me->totvert ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "vertex index out of range" ); - - influence_list = PyList_New( 0 ); - - /* Proceed only if we have vertex deformation information */ - if( me->dvert ) { - int i; - MDeformWeight *sweight = NULL; - - /* Number of bones influencing the vertex */ - int totinfluences = me->dvert[index].totweight; - - /* Get the reference of the first weight structure */ - sweight = me->dvert[index].dw; - - /* Build the list only with weights and names of the influent bones */ - for( i = 0; i < totinfluences; i++, sweight++ ) { - bDeformGroup *defgroup = BLI_findlink( &object->defbase, - sweight->def_nr ); - if( defgroup ) - PyList_Append( influence_list, Py_BuildValue( "[sf]", - defgroup->name, sweight->weight ) ); - } - } - - return influence_list; -} - -static PyObject *Mesh_removeAllKeys( BPy_Mesh * self ) -{ - Mesh *mesh = self->mesh; - - if( !mesh || !mesh->key ) - Py_RETURN_FALSE; - - mesh->key->id.us--; - mesh->key = NULL; - - Py_RETURN_TRUE; -} - - -static PyObject *Mesh_insertKey( BPy_Mesh * self, PyObject * args ) -{ - Mesh *mesh = self->mesh; - int fra = -1, oldfra = -1; - char *type = NULL; - short typenum; - - if (mesh->mr) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Shape Keys cannot be added to meshes with multires" ); - - if( !PyArg_ParseTuple( args, "|is", &fra, &type ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int and optionally a string as arguments" ); - - if( !type || !strcmp( type, "relative" ) ) - typenum = 1; - else if( !strcmp( type, "absolute" ) ) - typenum = 2; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "if given, type should be 'relative' or 'absolute'" ); - - if( fra > 0 ) { - fra = EXPP_ClampInt( fra, 1, MAXFRAME ); - oldfra = G.scene->r.cfra; - G.scene->r.cfra = fra; - } - - insert_meshkey( mesh, typenum ); - allspace(REMAKEIPO, 0); - - if( fra > 0 ) - G.scene->r.cfra = oldfra; - - Py_RETURN_NONE; -} - - - - -/* Custom Data Layers */ - -static PyObject * Mesh_addCustomLayer_internal(Mesh *me, PyObject * args, int type) -{ - char *name = NULL; - CustomData *data = &me->fdata; - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string or nothing" ); - - if (strlen(name)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31" ); - - if (name) - CustomData_add_layer_named(data, type, CD_DEFAULT, - NULL, me->totface, name); - else - CustomData_add_layer(data, type, CD_DEFAULT, - NULL, me->totface); - mesh_update_customdata_pointers(me); - Py_RETURN_NONE; -} - -static PyObject *Mesh_addUVLayer( BPy_Mesh * self, PyObject * args ) -{ - return Mesh_addCustomLayer_internal(self->mesh, args, CD_MTFACE); -} - -static PyObject *Mesh_addColorLayer( BPy_Mesh * self, PyObject * args ) -{ - return Mesh_addCustomLayer_internal(self->mesh, args, CD_MCOL); -} - -static PyObject *Mesh_removeLayer_internal( BPy_Mesh * self, PyObject * value, int type ) -{ - Mesh *me = self->mesh; - CustomData *data = &me->fdata; - char *name = PyString_AsString(value); - int i; - - if( !name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if (strlen(name)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31" ); - - i = CustomData_get_named_layer_index(data, type, name); - - if (i==-1) - return EXPP_ReturnPyObjError(PyExc_ValueError, - "No matching layers to remove" ); - - CustomData_free_layer(data, type, me->totface, i); - mesh_update_customdata_pointers(me); - - /* No more Color or UV layers left ? - switch modes if this is the active object */ - if (!CustomData_has_layer(data, type)) { - if (me == get_mesh(OBACT)) { - if(type == CD_MCOL && (G.f & G_VERTEXPAINT)) - G.f &= ~G_VERTEXPAINT; /* get out of vertexpaint mode */ - if(type == CD_MTFACE && (G.f & G_FACESELECT)) - G.f |= ~G_FACESELECT; /* get out of faceselect mode */ - } - } - - Py_RETURN_NONE; -} - - -static PyObject *Mesh_removeUVLayer( BPy_Mesh * self, PyObject * value ) -{ - return Mesh_removeLayer_internal(self, value, CD_MTFACE); -} - -static PyObject *Mesh_removeColorLayer( BPy_Mesh * self, PyObject * value ) -{ - return Mesh_removeLayer_internal(self, value, CD_MCOL); -} - - -static PyObject *Mesh_renameLayer_internal( BPy_Mesh * self, PyObject * args, int type ) -{ - CustomData *data; - CustomDataLayer *layer; - Mesh *mesh = self->mesh; - int i; - char *name_from, *name_to; - - data = &mesh->fdata; - - if( !PyArg_ParseTuple( args, "ss", &name_from, &name_to ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 2 strings" ); - - if (strlen(name_from)>31 || strlen(name_to)>31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "error, maximum name length is 31" ); - - i = CustomData_get_named_layer_index(data, type, name_from); - - if (i==-1) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "layer name was not found" ); - - layer = &data->layers[i]; - strcpy(layer->name, name_to); /* we alredy know the string sizes are under 32 */ - CustomData_set_layer_unique_name(data, i); - Py_RETURN_NONE; -} - -static PyObject *Mesh_renameUVLayer( BPy_Mesh * self, PyObject * args ) -{ - return Mesh_renameLayer_internal( self, args, CD_MTFACE ); -} - -static PyObject *Mesh_renameColorLayer( BPy_Mesh * self, PyObject * args ) -{ - return Mesh_renameLayer_internal( self, args, CD_MCOL ); -} - - -static PyObject *Mesh_getLayerNames_internal( BPy_Mesh * self, int type ) -{ - CustomData *data; - CustomDataLayer *layer; - PyObject *str, *list = PyList_New( 0 ); - Mesh *mesh = self->mesh; - int i; - data = &mesh->fdata; - - /* see if there is a duplicate */ - for(i=0; itotlayer; i++) { - layer = &data->layers[i]; - if(layer->type == type) { - str = PyString_FromString(layer->name); - PyList_Append( list, str ); - Py_DECREF(str); - } - } - return list; -} - -static PyObject *Mesh_getUVLayerNames( BPy_Mesh * self ) -{ - return Mesh_getLayerNames_internal(self, CD_MTFACE); -} - -static PyObject *Mesh_getColorLayerNames( BPy_Mesh * self ) -{ - return Mesh_getLayerNames_internal(self, CD_MCOL); -} -/* used by activeUVLayer and activeColorLayer attrs */ -static PyObject *Mesh_getActiveLayer( BPy_Mesh * self, void *type ) -{ - CustomData *data = &self->mesh->fdata; - int layer_type = (int)type; - int i; - if (layer_type < 0) { /* hack, if negative, its the renderlayer.*/ - layer_type = -layer_type; - i = CustomData_get_render_layer_index(data, layer_type); - } else { - i = CustomData_get_active_layer_index(data, layer_type); - } - if (i == -1) /* so -1 is for no active layer 0+ for an active layer */ - Py_RETURN_NONE; - else { - return PyString_FromString( data->layers[i].name); - } -} - -static int Mesh_setActiveLayer( BPy_Mesh * self, PyObject * value, void *type ) -{ - CustomData *data = &self->mesh->fdata; - char *name; - int i,ok,n,layer_type = (int)type, render=0; - - if( !PyString_Check( value ) ) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected a string argument" ); - - if (layer_type<0) { - layer_type = -layer_type; - render = 1; - } - - name = PyString_AsString( value ); - ok = 0; - n = 0; - for(i=0; i < data->totlayer; ++i) { - if(data->layers[i].type == layer_type) { - if (strcmp(data->layers[i].name, name)==0) { - ok = 1; - break; - } - n++; - } - } - - if (!ok) - return EXPP_ReturnIntError( PyExc_ValueError, - "layer name does not exist" ); - if (render) { - CustomData_set_layer_render(data, layer_type, n); - } else { - CustomData_set_layer_active(data, layer_type, n); - mesh_update_customdata_pointers(self->mesh); - } - return 0; -} - - -/* multires */ -static PyObject *Mesh_getMultiresLevelCount( BPy_Mesh * self ) -{ - int i; - if (!self->mesh->mr) - i=0; - else - i= self->mesh->mr->level_count; - - return PyInt_FromLong(i); -} - - -static PyObject *Mesh_getMultires( BPy_Mesh * self, void *type ) -{ - int i=0; - if (self->mesh->mr) { - switch ((int)type) { - case MESH_MULTIRES_LEVEL: - i = self->mesh->mr->newlvl; - break; - case MESH_MULTIRES_EDGE: - i = self->mesh->mr->edgelvl; - break; - case MESH_MULTIRES_PIN: - i = self->mesh->mr->pinlvl; - break; - case MESH_MULTIRES_RENDER: - i = self->mesh->mr->renderlvl; - break; - } - } - - return PyInt_FromLong(i); -} - -static int Mesh_setMultires( BPy_Mesh * self, PyObject *value, void *type ) -{ - int i; - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - if (!self->object) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - if (!self->mesh->mr) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "the mesh has no multires data" ); - - if (!self->mesh->mr->level_count) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "multires data has no levels added" ); - - i = PyInt_AsLong(value); - - if (i<1||i>self->mesh->mr->level_count) - return EXPP_ReturnIntError( PyExc_TypeError, - "value out of range" ); - - switch ((int)type) { - case MESH_MULTIRES_LEVEL: - self->mesh->mr->newlvl = i; - multires_set_level(self->object, self->mesh, 0); - break; - case MESH_MULTIRES_EDGE: - self->mesh->mr->edgelvl = i; - multires_edge_level_update(self->object, self->mesh); - break; - case MESH_MULTIRES_PIN: - self->mesh->mr->pinlvl = i; - break; - case MESH_MULTIRES_RENDER: - self->mesh->mr->renderlvl = i; - break; - } - - return 0; -} - -/* end multires */ - - -static PyObject *Mesh_Tools( BPy_Mesh * self, int type, void **args ) -{ - Base *base; - int result; - Object *object = NULL; - PyObject *attr = NULL; - - /* if already in edit mode, exit */ - - if( G.obedit ) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "can't use mesh tools while in edit mode" ); - - for( base = FIRSTBASE; base; base = base->next ) { - if( base->object->type == OB_MESH && - base->object->data == self->mesh ) { - object = base->object; - break; - } - } - if( !object ) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "can't find an object for the mesh" ); - - if( object->type != OB_MESH ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Object specified is not a mesh." ); - - /* make mesh's object active, enter mesh edit mode */ - G.obedit = object; - make_editMesh(); - - /* apply operation, then exit edit mode */ - switch( type ) { - case MESH_TOOL_TOSPHERE: - vertices_to_sphere(); - break; - case MESH_TOOL_VERTEXSMOOTH: - vertexsmooth(); - break; - case MESH_TOOL_FLIPNORM: - /* would be simple to rewrite this to not use edit mesh */ - /* see flipface() */ - flip_editnormals(); - break; - case MESH_TOOL_SUBDIV: - esubdivideflag( 1, 0.0, *((int *)args[0]), 1, 0 ); - break; - case MESH_TOOL_REMDOUB: - result = removedoublesflag( 1, 0, *((float *)args[0]) ); - - attr = PyInt_FromLong( result ); - if( !attr ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyInt_FromLong() failed" ); - break; - case MESH_TOOL_FILL: - fill_mesh(); - break; - case MESH_TOOL_RECALCNORM: - righthandfaces( *((int *)args[0]) ); - break; - case MESH_TOOL_TRI2QUAD: - join_triangles(); - break; - case MESH_TOOL_QUAD2TRI: - convert_to_triface( *((int *)args[0]) ); - break; - } - - /* exit edit mode, free edit mesh */ - load_editMesh(); - free_editMesh(G.editMesh); - - if(G.f & G_FACESELECT) - EXPP_allqueue( REDRAWIMAGE, 0 ); - if(G.f & G_WEIGHTPAINT) - mesh_octree_table(G.obedit, NULL, 'e'); - G.obedit = NULL; - - DAG_object_flush_update(G.scene, object, OB_RECALC_DATA); - - if( attr ) - return attr; - - Py_RETURN_NONE; -} - -/* - * "Subdivide" function - */ - -static PyObject *Mesh_subdivide( BPy_Mesh * self, PyObject * args ) -{ - int beauty = 0; - void *params = &beauty; - - if( !PyArg_ParseTuple( args, "|i", &beauty ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int argument" ); - - return Mesh_Tools( self, MESH_TOOL_SUBDIV, ¶ms ); -} - -/* - * "Smooth" function - */ - -static PyObject *Mesh_smooth( BPy_Mesh * self ) -{ - return Mesh_Tools( self, MESH_TOOL_VERTEXSMOOTH, NULL ); -} - -/* - * "Remove doubles" function - */ - -static PyObject *Mesh_removeDoubles( BPy_Mesh * self, PyObject *args ) -{ - float limit; - void *params = &limit; - - if( !PyArg_ParseTuple( args, "f", &limit ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - limit = EXPP_ClampFloat( limit, 0.0f, 1.0f ); - - return Mesh_Tools( self, MESH_TOOL_REMDOUB, ¶ms ); -} - -/* - * "recalc normals" function - */ - -static PyObject *Mesh_recalcNormals( BPy_Mesh * self, PyObject *args ) -{ - int direction = 0; - void *params = &direction; - - if( !PyArg_ParseTuple( args, "|i", &direction ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int in range [0,1]" ); - - if( direction < 0 || direction > 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected int in range [0,1]" ); - - /* righthandfaces(1) = outward, righthandfaces(2) = inward */ - ++direction; - - return Mesh_Tools( self, MESH_TOOL_RECALCNORM, ¶ms ); -} - -/* - * "Quads to Triangles" function - */ - -static PyObject *Mesh_quad2tri( BPy_Mesh * self, PyObject *args ) -{ - int kind = 0; - void *params = &kind; - - if( !PyArg_ParseTuple( args, "|i", &kind ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int in range [0,1]" ); - - if( kind < 0 || kind > 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected int in range [0,1]" ); - - return Mesh_Tools( self, MESH_TOOL_QUAD2TRI, ¶ms ); -} - -/* - * "Triangles to Quads" function - */ - -static PyObject *Mesh_tri2quad( BPy_Mesh * self ) -{ - return Mesh_Tools( self, MESH_TOOL_TRI2QUAD, NULL ); -} - -/* - * "Flip normals" function - */ - -static PyObject *Mesh_flipNormals( BPy_Mesh * self ) -{ - return Mesh_Tools( self, MESH_TOOL_FLIPNORM, NULL ); -} - -/* - * "To sphere" function - */ - -static PyObject *Mesh_toSphere( BPy_Mesh * self ) -{ - return Mesh_Tools( self, MESH_TOOL_TOSPHERE, NULL ); -} - -/* - * "Fill" (scan fill) function - */ - -static PyObject *Mesh_fill( BPy_Mesh * self ) -{ - return Mesh_Tools( self, MESH_TOOL_FILL, NULL ); -} - - -/* - * "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 (vec[2] > MAX3(v1[2], v2[2], v3[2])) - return 0; - - /* 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, 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( !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 object\n"); - - 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) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - - -/* - * "__copy__" return a copy of the mesh - */ - -static PyObject *Mesh_copy( BPy_Mesh * self ) -{ - BPy_Mesh *obj; - - obj = (BPy_Mesh *)PyObject_NEW( BPy_Mesh, &Mesh_Type ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - obj->mesh = copy_mesh( self->mesh ); - obj->mesh->id.us= 0; - obj->object = NULL; - obj->new = 1; - return (PyObject *)obj; -} - - -static struct PyMethodDef BPy_Mesh_methods[] = { - {"calcNormals", (PyCFunction)Mesh_calcNormals, METH_NOARGS, - "all recalculate vertex normals"}, - {"vertexShade", (PyCFunction)Mesh_vertexShade, METH_VARARGS, - "color vertices based on the current lighting setup"}, - {"findEdges", (PyCFunction)Mesh_findEdges, METH_VARARGS, - "find indices of an multiple edges in the mesh"}, - {"getFromObject", (PyCFunction)Mesh_getFromObject, METH_VARARGS, - "Get a mesh by name"}, - {"update", (PyCFunction)Mesh_Update, METH_VARARGS | METH_KEYWORDS, - "Update display lists after changes to mesh"}, - {"transform", (PyCFunction)Mesh_transform, METH_VARARGS | METH_KEYWORDS, - "Applies a transformation matrix to mesh's vertices"}, - {"addVertGroup", (PyCFunction)Mesh_addVertGroup, METH_O, - "Assign vertex group name to the object linked to the mesh"}, - {"removeVertGroup", (PyCFunction)Mesh_removeVertGroup, METH_O, - "Delete vertex group name from the object linked to the mesh"}, - {"assignVertsToGroup", (PyCFunction)Mesh_assignVertsToGroup, METH_VARARGS, - "Assigns vertices to a vertex group"}, - {"removeVertsFromGroup", (PyCFunction)Mesh_removeVertsFromGroup, METH_VARARGS, - "Removes vertices from a vertex group"}, - {"getVertsFromGroup", (PyCFunction)Mesh_getVertsFromGroup, METH_VARARGS, - "Get index and optional weight for vertices in vertex group"}, - {"renameVertGroup", (PyCFunction)Mesh_renameVertGroup, METH_VARARGS, - "Rename an existing vertex group"}, - {"getVertGroupNames", (PyCFunction)Mesh_getVertGroupNames, METH_NOARGS, - "Get names of vertex groups"}, - {"getVertexInfluences", (PyCFunction)Mesh_getVertexInfluences, METH_VARARGS, - "Get list of the influences of bones for a given mesh vertex"}, - /* Shape Keys */ - {"removeAllKeys", (PyCFunction)Mesh_removeAllKeys, METH_NOARGS, - "Remove all the shape keys from a mesh"}, - {"insertKey", (PyCFunction)Mesh_insertKey, METH_VARARGS, - "(frame = None, type = 'relative') - inserts a Mesh key at the given frame"}, - /* Mesh tools */ - {"smooth", (PyCFunction)Mesh_smooth, METH_NOARGS, - "Flattens angle of selected faces (experimental)"}, - {"flipNormals", (PyCFunction)Mesh_flipNormals, METH_NOARGS, - "Toggles the direction of selected face's normals (experimental)"}, - {"toSphere", (PyCFunction)Mesh_toSphere, METH_NOARGS, - "Moves selected vertices outward in a spherical shape (experimental)"}, - {"fill", (PyCFunction)Mesh_fill, METH_NOARGS, - "Scan fill a closed edge loop (experimental)"}, - {"triangleToQuad", (PyCFunction)Mesh_tri2quad, METH_VARARGS, - "Convert selected triangles to quads (experimental)"}, - {"quadToTriangle", (PyCFunction)Mesh_quad2tri, METH_VARARGS, - "Convert selected quads to triangles (experimental)"}, - {"subdivide", (PyCFunction)Mesh_subdivide, METH_VARARGS, - "Subdivide selected edges in a mesh (experimental)"}, - {"remDoubles", (PyCFunction)Mesh_removeDoubles, METH_VARARGS, - "Removes duplicates from selected vertices (experimental)"}, - {"recalcNormals", (PyCFunction)Mesh_recalcNormals, METH_VARARGS, - "Recalculates inside or outside normals (experimental)"}, - {"pointInside", (PyCFunction)Mesh_pointInside, METH_VARARGS|METH_KEYWORDS, - "Recalculates inside or outside normals (experimental)"}, - - /* mesh custom data layers */ - {"addUVLayer", (PyCFunction)Mesh_addUVLayer, METH_VARARGS, - "adds a UV layer to this mesh"}, - {"addColorLayer", (PyCFunction)Mesh_addColorLayer, METH_VARARGS, - "adds a color layer to this mesh "}, - {"removeUVLayer", (PyCFunction)Mesh_removeUVLayer, METH_O, - "removes a UV layer to this mesh"}, - {"removeColorLayer", (PyCFunction)Mesh_removeColorLayer, METH_O, - "removes a color layer to this mesh"}, - {"getUVLayerNames", (PyCFunction)Mesh_getUVLayerNames, METH_NOARGS, - "Get names of UV layers"}, - {"getColorLayerNames", (PyCFunction)Mesh_getColorLayerNames, METH_NOARGS, - "Get names of Color layers"}, - {"renameUVLayer", (PyCFunction)Mesh_renameUVLayer, METH_VARARGS, - "Rename a UV Layer"}, - {"renameColorLayer", (PyCFunction)Mesh_renameColorLayer, METH_VARARGS, - "Rename a Color Layer"}, - - /* python standard class functions */ - {"__copy__", (PyCFunction)Mesh_copy, METH_NOARGS, - "Return a copy of the mesh"}, - {"copy", (PyCFunction)Mesh_copy, METH_NOARGS, - "Return a copy of the mesh"}, - {NULL, NULL, 0, NULL} -}; - -/************************************************************************ - * - * Python BPy_Mesh attributes - * - ************************************************************************/ - -static PyObject *MVertSeq_CreatePyObject( Mesh * mesh ) -{ - - BPy_MVertSeq *obj = PyObject_NEW( BPy_MVertSeq, &MVertSeq_Type); - obj->mesh = mesh; - - /* - an iter of -1 means this seq has not been used as an iterator yet - once it is, then any other calls on getIter will return a new copy of BPy_MVertSeq - This means you can loop do nested loops with the same iterator without worrying about - the iter variable being used twice and messing up the loops. - */ - obj->iter = -1; - return (PyObject *)obj; -} - -static PyObject *Mesh_getVerts( BPy_Mesh * self ) -{ - return MVertSeq_CreatePyObject(self->mesh); -} - -static int Mesh_setVerts( BPy_Mesh * self, PyObject * args ) -{ - MVert *dst; - MVert *src; - int i; - - /* special case if None: delete the mesh */ - if( args == NULL || args == Py_None ) { - Mesh *me = self->mesh; - 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->mselect = NULL; - me->totvert = me->totedge = me->totface = me->totcol = 0; - mesh_update( me ); - return 0; - } - - if( PyList_Check( args ) ) { - if( EXPP_check_sequence_consistency( args, &MVert_Type ) != 1 && - EXPP_check_sequence_consistency( args, &PVert_Type ) != 1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of MVerts" ); - - if( PyList_Size( args ) != self->mesh->totvert ) - return EXPP_ReturnIntError( PyExc_TypeError, - "list must have the same number of vertices as the mesh" ); - - dst = self->mesh->mvert; - for( i = 0; i < PyList_Size( args ); ++i ) { - BPy_MVert *v = (BPy_MVert *)PyList_GET_ITEM( args, i ); - - if( BPy_MVert_Check( v ) ) - src = &((Mesh *)v->data)->mvert[v->index]; - else - src = (MVert *)v->data; - - memcpy( dst, src, sizeof(MVert) ); - ++dst; - } - } else if( args->ob_type == &MVertSeq_Type ) { - Mesh *mesh = ( (BPy_MVertSeq *) args)->mesh; - - if( mesh->totvert != self->mesh->totvert ) - return EXPP_ReturnIntError( PyExc_TypeError, - "vertex sequences must have the same number of vertices" ); - - memcpy( self->mesh->mvert, mesh->mvert, mesh->totvert*sizeof(MVert) ); - } else - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list or sequence of MVerts" ); - return 0; -} - -static PyObject *MEdgeSeq_CreatePyObject( Mesh *mesh ) -{ - BPy_MEdgeSeq *obj = PyObject_NEW( BPy_MEdgeSeq, &MEdgeSeq_Type); - obj->mesh = mesh; - obj->iter = -1; /* iterator not yet used */ - return (PyObject *)obj; -} - -static PyObject *Mesh_getEdges( BPy_Mesh * self ) -{ - return MEdgeSeq_CreatePyObject(self->mesh); -} - -static PyObject *MFaceSeq_CreatePyObject( Mesh * mesh ) -{ - BPy_MFaceSeq *obj= PyObject_NEW( BPy_MFaceSeq, &MFaceSeq_Type); - obj->mesh = mesh; - obj->iter = -1; /* iterator not yet used */ - return (PyObject *)obj; -} - -static PyObject *Mesh_getFaces( BPy_Mesh * self ) -{ - return MFaceSeq_CreatePyObject( self->mesh ); -} - -static PyObject *Mesh_getMaterials( BPy_Mesh *self ) -{ - return EXPP_PyList_fromMaterialList( self->mesh->mat, - self->mesh->totcol, 1 ); -} - -static int Mesh_setMaterials( BPy_Mesh *self, PyObject * value ) -{ - Material **matlist; - int len; - - if( !PySequence_Check( value ) || - !EXPP_check_sequence_consistency( value, &Material_Type ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "list should only contain materials or None)" ); - - len = PyList_Size( value ); - if( len > 16 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "list can't have more than 16 materials" ); - - /* free old material list (if it exists) and adjust user counts */ - if( self->mesh->mat ) { - Mesh *me = self->mesh; - int i; - for( i = me->totcol; i-- > 0; ) - if( me->mat[i] ) - me->mat[i]->id.us--; - MEM_freeN( me->mat ); - } - - /* build the new material list, increment user count, store it */ - - matlist = EXPP_newMaterialList_fromPyList( value ); - EXPP_incr_mats_us( matlist, len ); - self->mesh->mat = matlist; - self->mesh->totcol = (short)len; - -/**@ This is another ugly fix due to the weird material handling of blender. - * it makes sure that object material lists get updated (by their length) - * according to their data material lists, otherwise blender crashes. - * It just stupidly runs through all objects...BAD BAD BAD. - */ - - test_object_materials( ( ID * ) self->mesh ); - - return 0; -} - -static PyObject *Mesh_getMaxSmoothAngle( BPy_Mesh * self ) -{ - return PyInt_FromLong( self->mesh->smoothresh ); -} - -static int Mesh_setMaxSmoothAngle( BPy_Mesh *self, PyObject *value ) -{ - return EXPP_setIValueClamped( value, &self->mesh->smoothresh, - MESH_SMOOTHRESH_MIN, - MESH_SMOOTHRESH_MAX, 'h' ); -} - -static PyObject *Mesh_getSubDivLevels( BPy_Mesh * self ) -{ - return Py_BuildValue( "(h,h)", - self->mesh->subdiv, self->mesh->subdivr ); -} - -static int Mesh_setSubDivLevels( BPy_Mesh *self, PyObject *value ) -{ - int subdiv[2]; - int i; - PyObject *tmp; - - if( !PyTuple_Check( value ) || PyTuple_Size( value ) != 2 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected (int, int) as argument" ); - - for( i = 0; i < 2; i++ ) { - tmp = PyTuple_GET_ITEM( value, i ); - if( !PyInt_Check( tmp ) ) - return EXPP_ReturnIntError ( PyExc_TypeError, - "expected a list [int, int] as argument" ); - subdiv[i] = EXPP_ClampInt( PyInt_AsLong( tmp ), - MESH_SUBDIV_MIN, - MESH_SUBDIV_MAX ); - } - - self->mesh->subdiv = (short)subdiv[0]; - self->mesh->subdivr = (short)subdiv[1]; - return 0; -} - -static PyObject *Mesh_getFlag( BPy_Mesh * self, void *type ) -{ - switch( (long)type ) { - case MESH_HASFACEUV: - return self->mesh->mtface ? EXPP_incr_ret_True() : - EXPP_incr_ret_False(); - case MESH_HASMCOL: - return self->mesh->mcol ? EXPP_incr_ret_True() : - EXPP_incr_ret_False(); - case MESH_HASVERTUV: - return self->mesh->msticky ? EXPP_incr_ret_True() : - EXPP_incr_ret_False(); - case MESH_HASMULTIRES: - return self->mesh->mr ? EXPP_incr_ret_True() : - EXPP_incr_ret_False(); - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get attribute" ); - } -} - -static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type ) -{ - int param; - Mesh *mesh = self->mesh; - - param = PyObject_IsTrue( value ); - - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - /* sticky is independent of faceUV and vertUV */ - - switch( (long)type ) { - case MESH_HASFACEUV: - if( !param ) { - if( mesh->mtface ) { - CustomData_free_layers( &mesh->fdata, CD_MTFACE, mesh->totface ); - mesh->mtface = NULL; - } - } else if( !mesh->mtface ) { - if( !mesh->totface ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "mesh has no faces" ); - make_tfaces( mesh ); - } - return 0; - case MESH_HASMCOL: - if( !param ) { - if( mesh->mcol ) { - CustomData_free_layers( &mesh->fdata, CD_MCOL, mesh->totface ); - mesh->mcol = NULL; - } - } else if( !mesh->mcol ) { - /* TODO: mesh_create_shadedColors */ - mesh->mcol = CustomData_add_layer( &mesh->fdata, CD_MCOL, - CD_DEFAULT, NULL, mesh->totface ); - } - return 0; - case MESH_HASVERTUV: - if( !param ) { - if( mesh->msticky ) { - CustomData_free_layer_active( &mesh->vdata, CD_MSTICKY, mesh->totvert ); - mesh->msticky = NULL; - } - } else { - if( !mesh->msticky ) { - mesh->msticky = CustomData_add_layer( &mesh->vdata, CD_MSTICKY, - CD_CALLOC, NULL, mesh->totvert ); - memset( mesh->msticky, 255, mesh->totvert*sizeof( MSticky ) ); - /* TODO: rework RE_make_sticky() so we can calculate */ - } - } - return 0; - case MESH_HASMULTIRES: - if (!self->object) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - if( !param ) { - if ( mesh->mr ) { - multires_delete(self->object, mesh); - } - } else { - if ( !mesh->mr ) { - if (mesh->key) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "Cannot enable multires for a mesh with shape keys" ); - multires_make(self->object, mesh); - } - } - return 0; - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "couldn't get attribute" ); - } -} - -static PyObject *Mesh_getMode( BPy_Mesh * self ) -{ - return PyInt_FromLong( self->mesh->flag ); -} - -static int Mesh_setMode( BPy_Mesh *self, PyObject *value ) -{ - short param; - static short bitmask = ME_ISDONE | ME_NOPUNOFLIP | ME_TWOSIDED | - ME_UVEFFECT | ME_VCOLEFFECT | ME_AUTOSMOOTH | ME_SMESH | - ME_SUBSURF | ME_OPT_EDGES; - - if( !PyInt_Check ( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - param = (short)PyInt_AS_LONG ( value ); - - if( ( param & bitmask ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - self->mesh->flag = param; - - return 0; -} - -static PyObject *Mesh_getKey( BPy_Mesh * self ) -{ - if( self->mesh->key ) - return Key_CreatePyObject(self->mesh->key); - else - Py_RETURN_NONE; -} - - -static PyObject *Mesh_getActiveFace( BPy_Mesh * self ) -{ - /* not needed but keep incase exceptions make use of it */ - if( !self->mesh->mtface ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "face has no texture values" ); - - if (self->mesh->act_face != -1 && self->mesh->act_face <= self->mesh->totface) - return PyInt_FromLong( self->mesh->act_face ); - - Py_RETURN_NONE; -} - -static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value ) -{ - int param; - - /* if no texture faces, error */ - - if( !self->mesh->mtface ) - return EXPP_ReturnIntError( PyExc_ValueError, - "face has no texture values" ); - - /* if param isn't an int, error */ - - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int argument" ); - - /* check for a valid index */ - - param = PyInt_AsLong( value ); - if( param < 0 || param > self->mesh->totface ) - return EXPP_ReturnIntError( PyExc_TypeError, - "face index out of range" ); - - self->mesh->act_face = param; - return 0; -} - -static PyObject *Mesh_getActiveGroup( BPy_Mesh * self ) -{ - bDeformGroup *defGroup; - Object *object = self->object; - - if( !object ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - if( object->actdef ) { - defGroup = BLI_findlink( &object->defbase, object->actdef-1 ); - return PyString_FromString( defGroup->name ); - } - - Py_RETURN_NONE; -} - -static int Mesh_setActiveGroup( BPy_Mesh * self, PyObject * arg ) -{ - char *name; - int tmp; - Object *object = self->object; - - if( !object ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - if( !PyString_Check( arg ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected a string argument" ); - - name = PyString_AsString( arg ); - tmp = object->actdef; - vertexgroup_select_by_name( object, name ); - if( !object->actdef ) { - object->actdef = tmp; - return EXPP_ReturnIntError( PyExc_ValueError, - "vertex group not found" ); - } - - return 0; -} - -static PyObject *Mesh_getTexMesh( BPy_Mesh * self ) -{ - Mesh *texme= self->mesh->texcomesh; - - if (texme) - return Mesh_CreatePyObject( texme, NULL ); - else - Py_RETURN_NONE; -} - -static int Mesh_setTexMesh( BPy_Mesh * self, PyObject * value ) -{ - int ret = GenericLib_assignData(value, (void **) &self->mesh->texcomesh, 0, 1, ID_ME, 0); - - if (ret==0 && value!=Py_None) /*This must be a mesh type*/ - (( BPy_Mesh * ) value)->new= 0; - - return ret; -} - -static int Mesh_setSel( BPy_Mesh * self, PyObject * value ) -{ - int i, param = PyObject_IsTrue( value ); - Mesh *me = self->mesh; - MVert *mvert = me->mvert; - MEdge *medge = me->medge; - MFace *mface = me->mface; - - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) { - for( i = 0; i < me->totvert; ++mvert, ++i ) - mvert->flag |= SELECT; - for( i = 0; i < me->totedge; ++medge, ++i ) - medge->flag |= SELECT; - for( i = 0; i < me->totface; ++mface, ++i ) - mface->flag |= ME_FACE_SEL; - } else { - for( i = 0; i < me->totvert; ++mvert, ++i ) - mvert->flag &= ~SELECT; - for( i = 0; i < me->totedge; ++medge, ++i ) - medge->flag &= ~SELECT; - for( i = 0; i < me->totface; ++mface, ++i ) - mface->flag &= ~ME_FACE_SEL; - } - - return 0; -} - -static int Mesh_setHide( BPy_Mesh * self, PyObject * value ) -{ - int i, param = PyObject_IsTrue( value ); - Mesh *me = self->mesh; - MVert *mvert = me->mvert; - MEdge *medge = me->medge; - MFace *mface = me->mface; - - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) { - for( i = 0; i < me->totvert; ++mvert, ++i ) - mvert->flag |= ME_HIDE; - for( i = 0; i < me->totedge; ++medge, ++i ) - medge->flag |= ME_HIDE; - for( i = 0; i < me->totface; ++mface, ++i ) - mface->flag |= ME_HIDE; - } else { - for( i = 0; i < me->totvert; ++mvert, ++i ) - mvert->flag &= ~ME_HIDE; - for( i = 0; i < me->totedge; ++medge, ++i ) - medge->flag &= ~ME_HIDE; - for( i = 0; i < me->totface; ++mface, ++i ) - mface->flag &= ~ME_HIDE; - } - - return 0; -} - -/************************************************************************ - * - * Python Mesh_Type standard operations - * - ************************************************************************/ - -static void Mesh_dealloc( BPy_Mesh * self ) -{ - Mesh *mesh = self->mesh; - - /* if the mesh is new and has no users, delete it */ - if( self->new && !mesh->id.us ) - free_libblock( &G.main->mesh, mesh ); - - PyObject_DEL( self ); -} - -static int Mesh_compare( BPy_Mesh * a, BPy_Mesh * b ) -{ - return ( a->mesh == b->mesh ) ? 0 : -1; -} - -static PyObject *Mesh_repr( BPy_Mesh * self ) -{ - return PyString_FromFormat( "[Mesh \"%s\"]", - self->mesh->id.name + 2 ); -} - -/*****************************************************************************/ -/* Python Mesh_Type attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Mesh_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"verts", - (getter)Mesh_getVerts, (setter)Mesh_setVerts, - "The mesh's vertices (MVert)", - NULL}, - {"edges", - (getter)Mesh_getEdges, (setter)NULL, - "The mesh's edge data (MEdge)", - NULL}, - {"faces", - (getter)Mesh_getFaces, (setter)NULL, - "The mesh's face data (MFace)", - NULL}, - {"materials", - (getter)Mesh_getMaterials, (setter)Mesh_setMaterials, - "List of the mesh's materials", - NULL}, - {"degr", - (getter)Mesh_getMaxSmoothAngle, (setter)Mesh_setMaxSmoothAngle, - "The max angle for auto smoothing", - NULL}, - {"maxSmoothAngle", - (getter)Mesh_getMaxSmoothAngle, (setter)Mesh_setMaxSmoothAngle, - "deprecated: see 'degr'", - NULL}, - {"subDivLevels", - (getter)Mesh_getSubDivLevels, (setter)Mesh_setSubDivLevels, - "The display and rendering subdivision levels", - NULL}, - {"mode", - (getter)Mesh_getMode, (setter)Mesh_setMode, - "The mesh's mode bitfield", - NULL}, - {"key", - (getter)Mesh_getKey, (setter)NULL, - "The mesh's key", - NULL}, - {"faceUV", - (getter)Mesh_getFlag, (setter)Mesh_setFlag, - "UV-mapped textured faces enabled", - (void *)MESH_HASFACEUV}, - {"vertexColors", - (getter)Mesh_getFlag, (setter)Mesh_setFlag, - "Vertex colors for the mesh enabled", - (void *)MESH_HASMCOL}, - {"vertexUV", - (getter)Mesh_getFlag, (setter)Mesh_setFlag, - "'Sticky' flag for per vertex UV coordinates enabled", - (void *)MESH_HASVERTUV}, - {"multires", - (getter)Mesh_getFlag, (setter)Mesh_setFlag, - "'Sticky' flag for per vertex UV coordinates enabled", - (void *)MESH_HASMULTIRES}, - {"activeFace", - (getter)Mesh_getActiveFace, (setter)Mesh_setActiveFace, - "Index of the mesh's active texture face (in UV editor)", - NULL}, - {"activeGroup", - (getter)Mesh_getActiveGroup, (setter)Mesh_setActiveGroup, - "Active group for the mesh", - NULL}, - - /* uv layers */ - {"activeColorLayer", - (getter)Mesh_getActiveLayer, (setter)Mesh_setActiveLayer, - "Name of the active UV layer", - (void *)CD_MCOL}, - {"activeUVLayer", - (getter)Mesh_getActiveLayer, (setter)Mesh_setActiveLayer, - "Name of the active vertex color layer", - (void *)CD_MTFACE}, - /* hack flip CD_MCOL so it uses the render setting */ - {"renderColorLayer", - (getter)Mesh_getActiveLayer, (setter)Mesh_setActiveLayer, - "Name of the render UV layer", - (void *)-CD_MCOL}, - {"renderUVLayer", - (getter)Mesh_getActiveLayer, (setter)Mesh_setActiveLayer, - "Name of the render vertex color layer", - (void *)-CD_MTFACE}, - - - - /* Multires */ - {"multiresLevelCount", - (getter)Mesh_getMultiresLevelCount, (setter)NULL, - "The total number of multires levels", - NULL}, - {"multiresDrawLevel", - (getter)Mesh_getMultires, (setter)Mesh_setMultires, - "The current multires display level", - (void *)MESH_MULTIRES_LEVEL}, - {"multiresEdgeLevel", - (getter)Mesh_getMultires, (setter)Mesh_setMultires, - "The current multires edge level", - (void *)MESH_MULTIRES_EDGE}, - {"multiresPinLevel", - (getter)Mesh_getMultires, (setter)Mesh_setMultires, - "The current multires pin level", - (void *)MESH_MULTIRES_PIN}, - {"multiresRenderLevel", - (getter)Mesh_getMultires, (setter)Mesh_setMultires, - "The current multires render level", - (void *)MESH_MULTIRES_RENDER}, - - {"texMesh", - (getter)Mesh_getTexMesh, (setter)Mesh_setTexMesh, - "The meshes tex mesh proxy texture coord mesh", - NULL}, - {"sel", - (getter)NULL, (setter)Mesh_setSel, - "Select/deselect all verts, edges, faces in the mesh", - NULL}, - {"hide", - (getter)NULL, (setter)Mesh_setHide, - "Hide/unhide all verts, edges, faces in the mesh", - NULL}, - - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Mesh_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Mesh_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Mesh", /* char *tp_name; */ - sizeof( BPy_Mesh ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) Mesh_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) Mesh_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Mesh_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Mesh_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Mesh_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 -}; - -/* - * get one or all mesh data objects - */ - -static PyObject *M_Mesh_Get( PyObject * self_unused, PyObject * args ) -{ - char *name = NULL; - Mesh *mesh = NULL; - BPy_Mesh* obj; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected zero or one string arguments" ); - - if( name ) { - mesh = ( Mesh * ) GetIdFromList( &( G.main->mesh ), name ); - - if( !mesh ) { - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Mesh \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - return Mesh_CreatePyObject( mesh, NULL ); - } else { /* () - return a list with all meshes in the scene */ - PyObject *meshlist; - Link *link; - int index = 0; - - meshlist = PyList_New( BLI_countlist( &( G.main->mesh ) ) ); - - if( !meshlist ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ); - - link = G.main->mesh.first; - index = 0; - while( link ) { - obj = ( BPy_Mesh * ) Mesh_CreatePyObject( ( Mesh * )link, NULL ); - PyList_SetItem( meshlist, index, ( PyObject * ) obj ); - index++; - link = link->next; - } - return meshlist; - } -} - -/* - * create a new mesh data object - */ - -static PyObject *M_Mesh_New( PyObject * self_unused, PyObject * args ) -{ - char *name = "Mesh"; - Mesh *mesh; - BPy_Mesh *obj; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or a string as argument" ); - - obj = (BPy_Mesh *)PyObject_NEW( BPy_Mesh, &Mesh_Type ); - - if( !obj ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyObject_New() failed" ); - - mesh = add_mesh(name); /* doesn't return NULL now, but might someday */ - - if( !mesh ) { - Py_DECREF ( obj ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "FATAL: could not create mesh object" ); - } - - /* Bound box set to null needed because a new mesh is initialized - with a bounding box of -1 -1 -1 -1 -1 -1 - if its not set to null the bounding box is not re-calculated - when ob.getBoundBox() is called.*/ - MEM_freeN(mesh->bb); - mesh->bb= NULL; - - mesh->id.us = 0; - - obj->mesh = mesh; - obj->object = NULL; - obj->new = 1; - return (PyObject *)obj; -} - -/* - * creates a new MVert for users to manipulate - */ - -static PyObject *M_Mesh_MVert( PyObject * self_unused, PyObject * args ) -{ - int i; - MVert vert; - - /* initialize the new vert's data */ - memset( &vert, 0, sizeof( MVert ) ); - - /* - * accept either a 3D vector or tuple of three floats - */ - - if( PyTuple_Size ( args ) == 1 ) { - PyObject *tmp = PyTuple_GET_ITEM( args, 0 ); - if( !VectorObject_Check( tmp ) || ((VectorObject *)tmp)->size != 3 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected three floats or vector of size 3" ); - for( i = 0; i < 3; ++i ) - vert.co[i] = ((VectorObject *)tmp)->vec[i]; - } else if( !PyArg_ParseTuple ( args, "fff", - &vert.co[0], &vert.co[1], &vert.co[2] ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected three floats or vector of size 3" ); - - /* make a new MVert from the data */ - return PVert_CreatePyObject( &vert ); -} - -static PyObject *M_Mesh_Modes( PyObject * self_unused, PyObject * args ) -{ - int modes = 0; - - if( !G.scene ) { - Py_RETURN_NONE; - } - - if( !PyArg_ParseTuple( args, "|i", &modes ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected optional int as argument" ); - - if( modes > ( SCE_SELECT_VERTEX | SCE_SELECT_EDGE | SCE_SELECT_FACE ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "value out of range" ); - - if( modes > 0 ) - G.scene->selectmode = (short)modes; - - return PyInt_FromLong( G.scene->selectmode ); -} - -static struct PyMethodDef M_Mesh_methods[] = { - {"New", (PyCFunction)M_Mesh_New, METH_VARARGS, - "Create a new mesh"}, - {"Get", (PyCFunction)M_Mesh_Get, METH_VARARGS, - "Get a mesh by name"}, - {"MVert", (PyCFunction)M_Mesh_MVert, METH_VARARGS, - "Create a new MVert"}, - {"Mode", (PyCFunction)M_Mesh_Modes, METH_VARARGS, - "Get/set edit selection mode(s)"}, - {NULL, NULL, 0, NULL}, -}; - -static PyObject *M_Mesh_ModesDict( void ) -{ - PyObject *Modes = PyConstant_New( ); - - if( Modes ) { - BPy_constant *d = ( BPy_constant * ) Modes; - - PyConstant_Insert( d, "NOVNORMALSFLIP", - PyInt_FromLong( ME_NOPUNOFLIP ) ); - PyConstant_Insert( d, "TWOSIDED", PyInt_FromLong( ME_TWOSIDED ) ); - PyConstant_Insert( d, "AUTOSMOOTH", - PyInt_FromLong( ME_AUTOSMOOTH ) ); - } - - return Modes; -} - -/* Set constants for face drawing mode -- see drawmesh.c */ - -static PyObject *M_Mesh_FaceModesDict( void ) -{ - PyObject *FM = PyConstant_New( ); - - if( FM ) { - BPy_constant *d = ( BPy_constant * ) FM; - - PyConstant_Insert( d, "BILLBOARD", - PyInt_FromLong( TF_BILLBOARD2 ) ); - PyConstant_Insert( d, "ALL", PyInt_FromLong( 0xffff ) ); - PyConstant_Insert( d, "HALO", PyInt_FromLong( TF_BILLBOARD ) ); - PyConstant_Insert( d, "DYNAMIC", PyInt_FromLong( TF_DYNAMIC ) ); - PyConstant_Insert( d, "INVISIBLE", PyInt_FromLong( TF_INVISIBLE ) ); - PyConstant_Insert( d, "LIGHT", PyInt_FromLong( TF_LIGHT ) ); - PyConstant_Insert( d, "OBCOL", PyInt_FromLong( TF_OBCOL ) ); - PyConstant_Insert( d, "SHADOW", PyInt_FromLong( TF_SHADOW ) ); - PyConstant_Insert( d, "TEXT", PyInt_FromLong( TF_BMFONT ) ); - PyConstant_Insert( d, "SHAREDVERT", PyInt_FromLong( TF_SHAREDVERT ) ); - PyConstant_Insert( d, "SHAREDCOL", PyInt_FromLong( TF_SHAREDCOL ) ); - PyConstant_Insert( d, "TEX", PyInt_FromLong( TF_TEX ) ); - PyConstant_Insert( d, "TILES", PyInt_FromLong( TF_TILES ) ); - PyConstant_Insert( d, "TWOSIDE", PyInt_FromLong( TF_TWOSIDE ) ); - } - - return FM; -} - -static PyObject *M_Mesh_FaceFlagsDict( void ) -{ - PyObject *FF = PyConstant_New( ); - - if( FF ) { - BPy_constant *d = ( BPy_constant * ) FF; - - PyConstant_Insert( d, "SELECT", PyInt_FromLong( TF_SELECT ) ); - PyConstant_Insert( d, "HIDE", PyInt_FromLong( TF_HIDE ) ); - PyConstant_Insert( d, "ACTIVE", PyInt_FromLong( TF_ACTIVE ) ); /* deprecated */ - } - - return FF; -} - -static PyObject *M_Mesh_FaceTranspModesDict( void ) -{ - PyObject *FTM = PyConstant_New( ); - - if( FTM ) { - BPy_constant *d = ( BPy_constant * ) FTM; - - PyConstant_Insert( d, "SOLID", PyInt_FromLong( TF_SOLID ) ); - PyConstant_Insert( d, "ADD", PyInt_FromLong( TF_ADD ) ); - PyConstant_Insert( d, "ALPHA", PyInt_FromLong( TF_ALPHA ) ); - PyConstant_Insert( d, "SUB", PyInt_FromLong( TF_SUB ) ); - } - - return FTM; -} - -static PyObject *M_Mesh_EdgeFlagsDict( void ) -{ - PyObject *EF = PyConstant_New( ); - - if( EF ) { - BPy_constant *d = ( BPy_constant * ) EF; - - PyConstant_Insert(d, "SELECT", PyInt_FromLong( SELECT ) ); - PyConstant_Insert(d, "EDGEDRAW", PyInt_FromLong( ME_EDGEDRAW ) ); - PyConstant_Insert(d, "EDGERENDER", PyInt_FromLong( ME_EDGERENDER ) ); - PyConstant_Insert(d, "SEAM", PyInt_FromLong( ME_SEAM ) ); - PyConstant_Insert(d, "FGON", PyInt_FromLong( ME_FGON ) ); - PyConstant_Insert(d, "LOOSE", PyInt_FromLong( ME_LOOSEEDGE ) ); - PyConstant_Insert(d, "SHARP", PyInt_FromLong( ME_SHARP ) ); - } - - return EF; -} - -static PyObject *M_Mesh_VertAssignDict( void ) -{ - PyObject *Vert = PyConstant_New( ); - if( Vert ) { - BPy_constant *d = ( BPy_constant * ) Vert; - PyConstant_Insert(d, "ADD", PyInt_FromLong(WEIGHT_ADD)); - PyConstant_Insert(d, "REPLACE", PyInt_FromLong(WEIGHT_REPLACE)); - PyConstant_Insert(d, "SUBTRACT", PyInt_FromLong(WEIGHT_SUBTRACT)); - } - return Vert; -} - - -static PyObject *M_Mesh_SelectModeDict( void ) -{ - PyObject *Mode = PyConstant_New( ); - if( Mode ) { - BPy_constant *d = ( BPy_constant * ) Mode; - PyConstant_Insert(d, "VERTEX", PyInt_FromLong(SCE_SELECT_VERTEX)); - PyConstant_Insert(d, "EDGE", PyInt_FromLong(SCE_SELECT_EDGE)); - PyConstant_Insert(d, "FACE", PyInt_FromLong(SCE_SELECT_FACE)); - } - return Mode; -} - -static char M_Mesh_doc[] = "The Blender.Mesh submodule"; - -PyObject *Mesh_Init( void ) -{ - PyObject *submodule; - - PyObject *Modes = M_Mesh_ModesDict( ); - PyObject *FaceFlags = M_Mesh_FaceFlagsDict( ); - PyObject *FaceModes = M_Mesh_FaceModesDict( ); - PyObject *FaceTranspModes = M_Mesh_FaceTranspModesDict( ); - PyObject *EdgeFlags = M_Mesh_EdgeFlagsDict( ); - PyObject *AssignModes = M_Mesh_VertAssignDict( ); - PyObject *SelectModes = M_Mesh_SelectModeDict( ); - PyObject *PropertyTypes = M_Mesh_PropertiesTypeDict( ); - - if( PyType_Ready( &MCol_Type ) < 0 ) - return NULL; - if( PyType_Ready( &MVert_Type ) < 0 ) - return NULL; - if( PyType_Ready( &PVert_Type ) < 0 ) - return NULL; - if( PyType_Ready( &MVertSeq_Type ) < 0 ) - return NULL; - if( PyType_Ready( &MEdge_Type ) < 0 ) - return NULL; - if( PyType_Ready( &MEdgeSeq_Type ) < 0 ) - return NULL; - if( PyType_Ready( &MFace_Type ) < 0 ) - return NULL; - if( PyType_Ready( &MFaceSeq_Type ) < 0 ) - return NULL; - if( PyType_Ready( &Mesh_Type ) < 0 ) - return NULL; - - submodule = - Py_InitModule3( "Blender.Mesh", M_Mesh_methods, M_Mesh_doc ); - PyDict_SetItemString( PyModule_GetDict( submodule ), - "Primitives", MeshPrimitives_Init( ) ); - - if( Modes ) - PyModule_AddObject( submodule, "Modes", Modes ); - if( FaceFlags ) - PyModule_AddObject( submodule, "FaceFlags", FaceFlags ); - if( FaceModes ) - PyModule_AddObject( submodule, "FaceModes", FaceModes ); - if( FaceTranspModes ) - PyModule_AddObject( submodule, "FaceTranspModes", - FaceTranspModes ); - if( EdgeFlags ) - PyModule_AddObject( submodule, "EdgeFlags", EdgeFlags ); - if( AssignModes ) - PyModule_AddObject( submodule, "AssignModes", AssignModes ); - if( SelectModes ) - PyModule_AddObject( submodule, "SelectModes", SelectModes ); - if( PropertyTypes ) - PyModule_AddObject( submodule, "PropertyTypes", PropertyTypes ); - - - - return submodule; -} - -/* These are needed by Object.c */ - -PyObject *Mesh_CreatePyObject( Mesh * me, Object *obj ) -{ - BPy_Mesh *nmesh = PyObject_NEW( BPy_Mesh, &Mesh_Type ); - - if( !nmesh ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Mesh object" ); - - nmesh->mesh = me; - nmesh->object = obj; - nmesh->new = 0; - G.totmesh++; - - return ( PyObject * ) nmesh; -} - - -Mesh *Mesh_FromPyObject( PyObject * pyobj, Object *obj ) -{ - BPy_Mesh *blen_obj; - - blen_obj = ( BPy_Mesh * ) pyobj; - if (obj) - blen_obj->object = obj; - - return blen_obj->mesh; - -} diff --git a/source/blender/python/api2_2x/Mesh.h b/source/blender/python/api2_2x/Mesh.h deleted file mode 100644 index d73c5c5925e..00000000000 --- a/source/blender/python/api2_2x/Mesh.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * $Id: Mesh.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -/* Most of this file comes from opy_nmesh.[ch] in the old bpython dir */ - -#ifndef EXPP_MESH_H -#define EXPP_MESH_H - -#include - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "DNA_object_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "Material.h" -#include "Image.h" - -/* EXPP PyType Objects */ -extern PyTypeObject Mesh_Type; -extern PyTypeObject MVert_Type; -extern PyTypeObject PVert_Type; -extern PyTypeObject MVertSeq_Type; -extern PyTypeObject MEdge_Type; -extern PyTypeObject MFace_Type; -extern PyTypeObject MCol_Type; - -struct BPy_Object; - -/* Type checking for EXPP PyTypes */ -#define BPy_Mesh_Check(v) ((v)->ob_type == &Mesh_Type) -#define BPy_MFace_Check(v) ((v)->ob_type == &MFace_Type) -#define BPy_MEdge_Check(v) ((v)->ob_type == &MEdge_Type) -#define BPy_MVert_Check(v) ((v)->ob_type == &MVert_Type) -#define BPy_PVert_Check(v) ((v)->ob_type == &PVert_Type) -#define BPy_MCol_Check(v) ((v)->ob_type == &MCol_Type) - -/* Typedefs for the new types */ - -typedef struct { - PyObject_HEAD /* required python macro */ - MCol *color; -} BPy_MCol; /* a Mesh color: [r,g,b,a] */ - -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - void * data; /* points to a Mesh or an MVert */ - int index; -} BPy_MVert; /* a Mesh vertex */ - -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - Mesh * mesh; - int iter; -} BPy_MVertSeq; /* a Mesh vertex sequence */ - -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - Mesh *mesh; /* points to a Mesh */ - int index; - short iter; /* char because it can only ever be between -1 and 2 */ -} BPy_MEdge; /* a Mesh edge */ - -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - Mesh * mesh; - int iter; -} BPy_MEdgeSeq; /* a Mesh edge sequence */ - -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - Mesh * mesh; - int index; - short iter; /* char because it can only ever be between -1 and 4 */ -} BPy_MFace; /* a Mesh face */ - -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - Mesh * mesh; - int iter; -} BPy_MFaceSeq; /* a Mesh face sequence */ - -typedef struct { - PyObject_HEAD /* required python macro */ - Mesh *mesh; - Object *object; - char new; /* was mesh created or already existed? */ -} BPy_Mesh; - -/* PROTOS */ - -PyObject *Mesh_Init( void ); -PyObject *Mesh_CreatePyObject( Mesh * me, Object *obj ); -Mesh *Mesh_FromPyObject( PyObject * pyobj, Object *obj ); - -#endif /* EXPP_MESH_H */ diff --git a/source/blender/python/api2_2x/Metaball.c b/source/blender/python/api2_2x/Metaball.c deleted file mode 100644 index 72152bd1a9a..00000000000 --- a/source/blender/python/api2_2x/Metaball.c +++ /dev/null @@ -1,1189 +0,0 @@ -/* - * $Id: Metaball.c 11136 2007-07-01 05:41:23Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Metaball.h" /*This must come first*/ - -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_mball.h" -#include "BKE_library.h" -#include "BLI_blenlib.h" -#include "BLI_arithb.h" /* for quat normal */ -#include "DNA_object_types.h" -#include "Mathutils.h" -#include "Material.h" -#include "gen_utils.h" -#include "gen_library.h" - -/* for dealing with materials */ -#include "MEM_guardedalloc.h" -#include "BKE_material.h" - -/* checks for the metaelement being removed */ -#define METAELEM_DEL_CHECK_PY(bpy_meta_elem) if (!(bpy_meta_elem->metaelem)) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "Metaball has been removed" ) ); -#define METAELEM_DEL_CHECK_INT(bpy_meta_elem) if (!(bpy_meta_elem->metaelem)) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "Metaball has been removed" ) ); - -/*****************************************************************************/ -/* Python API function prototypes for the Metaball module. */ -/*****************************************************************************/ -static PyObject *M_Metaball_New( PyObject * self, PyObject * args ); -static PyObject *M_Metaball_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Metaball.__doc__ */ -/*****************************************************************************/ -static char M_Metaball_doc[] = - "The Blender Metaball module\n\n\nMetaballs are primitive shapes\ - such as balls, pipes, boxes and planes,\ - that can join each other to create smooth,\ - organic volumes\n. The shapes themseves are called\ - 'Metaelements' and can be accessed from the Metaball module."; - -static char M_Metaball_New_doc[] = "Creates new metaball object data"; - -static char M_Metaball_Get_doc[] = "Retreives an existing metaball object data"; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Metaball module: */ -/*****************************************************************************/ -struct PyMethodDef M_Metaball_methods[] = { - {"New", M_Metaball_New, METH_VARARGS, M_Metaball_New_doc}, - {"Get", M_Metaball_Get, METH_VARARGS, M_Metaball_Get_doc}, - {NULL, NULL, 0, NULL} -}; - -static PyObject *M_MetaElem_TypesDict( void ) -{ - PyObject *Types = PyConstant_New( ); - - if( Types ) { - BPy_constant *d = ( BPy_constant * ) Types; - - PyConstant_Insert( d, "BALL", PyInt_FromLong( MB_BALL ) ); - /* PyConstant_Insert( d, "TUBEX", PyInt_FromLong( MB_TUBEX ) ); - DEPRICATED */ - /* PyConstant_Insert( d, "TUBEY", PyInt_FromLong( MB_TUBEY ) ); - DEPRICATED */ - /* PyConstant_Insert( d, "TUBEZ", PyInt_FromLong( MB_TUBEZ ) ); - DEPRICATED */ - PyConstant_Insert( d, "TUBE", PyInt_FromLong( MB_TUBE ) ); - PyConstant_Insert( d, "PLANE", PyInt_FromLong( MB_PLANE ) ); - PyConstant_Insert( d, "ELIPSOID",PyInt_FromLong( MB_ELIPSOID ) ); - PyConstant_Insert( d, "CUBE", PyInt_FromLong( MB_CUBE ) ); - } - - return Types; -} - -static PyObject *M_MetaElem_UpdateDict( void ) -{ - PyObject *Update = PyConstant_New( ); - - if( Update ) { - BPy_constant *d = ( BPy_constant * ) Update; - PyConstant_Insert( d, "ALWAYS", PyInt_FromLong( MB_UPDATE_ALWAYS ) ); - PyConstant_Insert( d, "HALFRES",PyInt_FromLong( MB_UPDATE_HALFRES ) ); - PyConstant_Insert( d, "FAST", PyInt_FromLong( MB_UPDATE_FAST ) ); - PyConstant_Insert( d, "NEVER", PyInt_FromLong( MB_UPDATE_NEVER ) ); - } - - return Update; -} - -/*****************************************************************************/ -/* Python BPy_Metaball methods declarations: */ -/*****************************************************************************/ -static PyObject *Metaball_getElements( BPy_Metaball * self ); -static PyObject *Metaball_getMaterials( BPy_Metaball * self ); -static int Metaball_setMaterials( BPy_Metaball * self, PyObject * value ); -static PyObject *Metaball_getWiresize( BPy_Metaball * self ); -static int Metaball_setWiresize( BPy_Metaball * self, PyObject * value ); -static PyObject *Metaball_getRendersize( BPy_Metaball * self ); -static int Metaball_setRendersize( BPy_Metaball * self, PyObject * value); -static PyObject *Metaball_getThresh( BPy_Metaball * self ); -static int Metaball_setThresh( BPy_Metaball * self, PyObject * args ); -static PyObject *Metaball_getUpdate( BPy_Metaball * self ); -static int Metaball_setUpdate( BPy_Metaball * self, PyObject * args ); -static PyObject *Metaball_copy( BPy_Metaball * self ); - -/*****************************************************************************/ -/* Python BPy_Metaball methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Metaball_methods[] = { - /* name, method, flags, doc */ - {"__copy__", ( PyCFunction ) Metaball_copy, - METH_NOARGS, "() - Return a copy of this metaball"}, - {"copy", ( PyCFunction ) Metaball_copy, - METH_NOARGS, "() - Return a copy of this metaball"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Metaelem methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Metaelem_methods[] = { - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python Metaball_Type callback function prototypes: */ -/*****************************************************************************/ -static PyObject *Metaball_repr( BPy_Metaball * self ); -static int Metaball_compare( BPy_Metaball * a, BPy_Metaball * b ); - -/*****************************************************************************/ -/* Python Metaelem_Type callback function prototypes: */ -/*****************************************************************************/ -static void Metaelem_dealloc( BPy_Metaelem * self ); -static PyObject *Metaelem_repr( BPy_Metaelem * self ); -static int Metaelem_compare( BPy_Metaelem * a, BPy_Metaelem * b ); - -static PyObject *Metaelem_getType( BPy_Metaelem *self ); -static int Metaelem_setType( BPy_Metaelem * self, PyObject * args ); -static PyObject *Metaelem_getCoord( BPy_Metaelem * self ); -static int Metaelem_setCoord( BPy_Metaelem * self, VectorObject * value ); -static PyObject *Metaelem_getDims( BPy_Metaelem * self ); -static int Metaelem_setDims( BPy_Metaelem * self, VectorObject * value ); -static PyObject *Metaelem_getQuat( BPy_Metaelem * self ); -static int Metaelem_setQuat( BPy_Metaelem * self, QuaternionObject * value ); -static PyObject *Metaelem_getStiffness( BPy_Metaelem * self ); -static int Metaelem_setStiffness( BPy_Metaelem * self, PyObject * value ); -static PyObject *Metaelem_getRadius( BPy_Metaelem * self ); -static int Metaelem_setRadius( BPy_Metaelem * self, PyObject * value ); - -static PyObject *Metaelem_getMFlagBits( BPy_Metaelem * self, void * type ); -static int Metaelem_setMFlagBits( BPy_Metaelem * self, PyObject * value, void * type ); - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Metaball_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"materials", - (getter)Metaball_getMaterials, (setter)Metaball_setMaterials, - "Number of metaball users", - NULL}, - {"elements", - (getter)Metaball_getElements, (setter)NULL, - "Elements in this metaball", - NULL}, - {"wiresize", - (getter)Metaball_getWiresize, (setter)Metaball_setWiresize, - "The density to draw the metaball in the 3D view", - NULL}, - {"rendersize", - (getter)Metaball_getRendersize, (setter)Metaball_setRendersize, - "The density to render wire", - NULL}, - {"thresh", - (getter)Metaball_getThresh, (setter)Metaball_setThresh, - "The density to render wire", - NULL}, - {"update", - (getter)Metaball_getUpdate, (setter)Metaball_setUpdate, - "The setting for updating this metaball data", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/*****************************************************************************/ -/* Python TypeMetaball structure definition: */ -/*****************************************************************************/ -PyTypeObject Metaball_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Metaball", /* char *tp_name; */ - sizeof( BPy_Metaball ), /* 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; */ - ( cmpfunc ) Metaball_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Metaball_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Metaball_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Metaball_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 -}; - - -static PyGetSetDef BPy_Metaelem_getseters[] = { - {"type", - (getter)Metaelem_getType, (setter)Metaelem_setType, - "Metaelem Type", - NULL}, - {"co", - (getter)Metaelem_getCoord, (setter)Metaelem_setCoord, - "Metaelem Location", - NULL}, - {"quat", - (getter)Metaelem_getQuat, (setter)Metaelem_setQuat, - "Metaelem Rotation Quat", - NULL}, - {"dims", - (getter)Metaelem_getDims, (setter)Metaelem_setDims, - "Metaelem Dimensions", - NULL}, - {"stiffness", - (getter)Metaelem_getStiffness, (setter)Metaelem_setStiffness, - "MetaElem stiffness", - NULL}, - {"radius", - (getter)Metaelem_getRadius, (setter)Metaelem_setRadius, - "The radius of the MetaElem", - NULL}, - {"negative", - (getter)Metaelem_getMFlagBits, (setter)Metaelem_setMFlagBits, - "The density to render wire", - (void *)MB_NEGATIVE}, - {"hide", - (getter)Metaelem_getMFlagBits, (setter)Metaelem_setMFlagBits, - "The density to render wire", - (void *)MB_HIDE}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/*****************************************************************************/ -/* Python TypeMetaelem structure definition: */ -/*****************************************************************************/ -PyTypeObject Metaelem_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Metaelem", /* char *tp_name; */ - sizeof( BPy_Metaelem ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) Metaelem_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) Metaelem_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Metaelem_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 ***/ - BPy_Metaelem_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Metaelem_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 -}; - - -/*****************************************************************************/ -/* Function: M_Metaball_New */ -/* Python equivalent: Blender.Metaball.New */ -/*****************************************************************************/ -static PyObject *M_Metaball_New( PyObject * self, PyObject * args ) -{ - char *name = 0; - BPy_Metaball *pymball; /* for Data object wrapper in Python */ - MetaBall *blmball; /* for actual Data we create in Blender */ - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "Metaball.New() - expected string argument (or nothing)" ) ); - - /* first create the MetaBall Data in Blender */ - if (name) - blmball = add_mball( name ); - else - blmball = add_mball( "Meta" ); - - if( blmball ) { - /* return user count to zero since add_mball() incref'ed it */ - blmball->id.us = 0; - /* now create the wrapper obj in Python */ - pymball = - ( BPy_Metaball * ) PyObject_NEW( BPy_Metaball, - &Metaball_Type ); - } else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Metaball.New() - couldn't create data in Blender" ) ); - - if( pymball == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create MetaBall Data object" ) ); - - pymball->metaball = blmball; - /*link Python mballer wrapper to Blender MetaBall */ - - return ( PyObject * ) pymball; -} - - -/*****************************************************************************/ -/* Function: M_Metaball_Get */ -/* Python equivalent: Blender.Metaball.Get */ -/* Description: Receives a string and returns the metaball data obj */ -/* whose name matches the string. If no argument is */ -/* passed in, a list of all metaball data names in the */ -/* current scene is returned. */ -/*****************************************************************************/ -static PyObject *M_Metaball_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - MetaBall *mball_iter = NULL; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "Metaball.Get() - expected string argument (or nothing)" ) ); - - if( name ) { /* (name) - Search mball by name */ - mball_iter = ( MetaBall * ) GetIdFromList( &( G.main->mball ), name ); - - if (!mball_iter) { - char error_msg[128]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Metaball.Get(\"%s\") - not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - return Metaball_CreatePyObject(mball_iter); - - } else { /* () - return a list of all mballs in the scene */ - - PyObject *mballlist = PyList_New( BLI_countlist( &( G.main->mball ) ) ); - int index=0; - - if( mballlist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "MetaBall.Get() - couldn't create PyList" ) ); - - mball_iter = G.main->mball.first; - while( mball_iter ) { - PyList_SetItem( mballlist, index, Metaball_CreatePyObject(mball_iter) ); - index++; - mball_iter = mball_iter->id.next; - } - return mballlist; - } - -} - - -/*****************************************************************************/ -/* Function: initObject */ -/*****************************************************************************/ -PyObject *Metaball_Init( void ) -{ - PyObject *submodule; - PyObject *Types= M_MetaElem_TypesDict( ); - PyObject *Update= M_MetaElem_UpdateDict( ); - - if( PyType_Ready( &Metaball_Type ) < 0 ) - return NULL; - if( PyType_Ready( &Metaelem_Type ) < 0 ) - return NULL; - if( PyType_Ready( &MetaElemSeq_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Metaball", M_Metaball_methods, M_Metaball_doc); - - if( Types ) - PyModule_AddObject( submodule, "Types", Types ); - PyModule_AddObject( submodule, "Update", Update ); - - /*Add SUBMODULES to the module*/ - /*PyDict_SetItemString(dict, "Constraint", Constraint_Init()); */ /*creates a *new* module*/ - return submodule; -} - -MetaBall *Metaball_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Metaball * ) pyobj )->metaball; -} - -static PyObject *Metaball_getMaterials( BPy_Metaball *self ) -{ - return EXPP_PyList_fromMaterialList( self->metaball->mat, - self->metaball->totcol, 1 ); -} -static int Metaball_setMaterials( BPy_Metaball *self, PyObject * value ) -{ - Material **matlist; - int len; - - if( !PySequence_Check( value ) || - !EXPP_check_sequence_consistency( value, &Material_Type ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaball.materials - list should only contain materials or None)" ); - - len = PyList_Size( value ); - if( len > 16 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaball.materials - list can't have more than 16 materials" ); - - /* free old material list (if it exists) and adjust user counts */ - if( self->metaball->mat ) { - MetaBall *mb = self->metaball; - int i; - for( i = mb->totcol; i-- > 0; ) - if( mb->mat[i] ) - mb->mat[i]->id.us--; - MEM_freeN( mb->mat ); - } - - /* build the new material list, increment user count, store it */ - - matlist = EXPP_newMaterialList_fromPyList( value ); - EXPP_incr_mats_us( matlist, len ); - self->metaball->mat = matlist; - self->metaball->totcol = (short)len; - -/**@ This is another ugly fix due to the weird material handling of blender. - * it makes sure that object material lists get updated (by their length) - * according to their data material lists, otherwise blender crashes. - * It just stupidly runs through all objects...BAD BAD BAD. - */ - - test_object_materials( ( ID * ) self->metaball ); - - return 0; -} - -static PyObject *Metaball_getWiresize( BPy_Metaball * self ) -{ - return PyFloat_FromDouble( self->metaball->wiresize ); -} - -static int Metaball_setWiresize( BPy_Metaball * self, PyObject * value ) -{ - float param; - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaball.wiresize - expected float argument" ); - - param = (float)PyFloat_AsDouble( value ); - - self->metaball->wiresize = EXPP_ClampFloat(param, 0.05f, 1.0); - return 0; - -} -static PyObject *Metaball_getRendersize( BPy_Metaball * self ) -{ - return PyFloat_FromDouble( self->metaball->rendersize ); -} - -static int Metaball_setRendersize( BPy_Metaball * self, PyObject * value ) -{ - - float param; - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaball.rendersize - expected float argument" ); - - param = (float)PyFloat_AsDouble( value ); - - self->metaball->rendersize = EXPP_ClampFloat(param, 0.05f, 1.0); - return 0; -} - -static PyObject *Metaball_getThresh( BPy_Metaball * self ) -{ - return PyFloat_FromDouble( self->metaball->thresh ); -} - -static int Metaball_setThresh( BPy_Metaball * self, PyObject * value ) -{ - - float param; - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaball.thresh - expected float argument" ); - - param = (float)PyFloat_AsDouble( value ); - - self->metaball->thresh = EXPP_ClampFloat(param, 0.0, 5.0); - return 0; -} - -static PyObject *Metaball_getUpdate( BPy_Metaball * self ) -{ - return PyInt_FromLong( (long)self->metaball->flag ); -} - -static int Metaball_setUpdate( BPy_Metaball * self, PyObject * value ) -{ - - int param; - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaball.update - expected an int argument" ); - - param = (int)PyInt_AS_LONG( value ); - - self->metaball->flag = EXPP_ClampInt( param, 0, 3 ); - return 0; -} - -static PyObject *Metaball_copy( BPy_Metaball * self ) -{ - BPy_Metaball *pymball; /* for Data object wrapper in Python */ - MetaBall *blmball; /* for actual Data we create in Blender */ - - blmball = copy_mball( self->metaball ); /* first create the MetaBall Data in Blender */ - - if( blmball ) { - /* return user count to zero since add_mball() incref'ed it */ - blmball->id.us = 0; - /* now create the wrapper obj in Python */ - pymball = - ( BPy_Metaball * ) PyObject_NEW( BPy_Metaball, - &Metaball_Type ); - } else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "metaball.__copy__() - couldn't create data in Blender" ) ); - - if( pymball == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "metaball.__copy__() - couldn't create data in Blender" ) ); - - pymball->metaball = blmball; - - return ( PyObject * ) pymball; -} - - -/* These are needed by Object.c */ -PyObject *Metaball_CreatePyObject( MetaBall * mball) -{ - BPy_Metaball *py_mball= PyObject_NEW( BPy_Metaball, &Metaball_Type ); - - if( !py_mball ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Metaball object" ); - - py_mball->metaball= mball; - - return ( PyObject * ) py_mball; -} - - -static PyObject *MetaElemSeq_CreatePyObject(BPy_Metaball *self, MetaElem *iter) -{ - BPy_MetaElemSeq *seq = PyObject_NEW( BPy_MetaElemSeq, &MetaElemSeq_Type); - seq->bpymetaball = self; Py_INCREF(self); - seq->iter= iter; - return (PyObject *)seq; -} - -/* - * Element, get an instance of the iterator. - */ -static PyObject *Metaball_getElements( BPy_Metaball * self ) -{ - return MetaElemSeq_CreatePyObject(self, NULL); -} - -/* - * Metaelem dealloc - free from memory - */ -/* This is a callback function for the BPy_Metaelem type. It is */ -static void Metaelem_dealloc( BPy_Metaelem * self ) -{ - self->metaelem= NULL; /* so any references to the same bpyobject will raise an error */ - PyObject_DEL( self ); -} - -/* - * elem.type - int to set the shape of the element - */ -static PyObject *Metaelem_getType( BPy_Metaelem *self ) -{ - METAELEM_DEL_CHECK_PY(self); - - return PyInt_FromLong( self->metaelem->type ); -} -static int Metaelem_setType( BPy_Metaelem * self, PyObject * value ) -{ - int type; - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaelem.type - expected an integer (bitmask) as argument" ); - - METAELEM_DEL_CHECK_INT(self); - - type = PyInt_AS_LONG( value ); - - if( (type < 0) || ( type > ( MB_BALL | MB_TUBEX | MB_TUBEY | MB_TUBEZ | MB_TUBE | MB_PLANE | MB_ELIPSOID | MB_CUBE ) )) - return EXPP_ReturnIntError( PyExc_ValueError, - "metaelem.type - value out of range" ); - - self->metaelem->type= type; - return 0; -} - -/* - * elem.co - non wrapped vector representing location - */ -static PyObject *Metaelem_getCoord( BPy_Metaelem * self ) -{ - float co[3]; - - METAELEM_DEL_CHECK_PY(self); - - co[0]= self->metaelem->x; - co[1]= self->metaelem->y; - co[2]= self->metaelem->z; - - return newVectorObject( co, 3, Py_NEW ); -} -static int Metaelem_setCoord( BPy_Metaelem * self, VectorObject * value ) -{ - - if( !VectorObject_Check( value ) || value->size != 3 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaelem.co - expected vector argument of size 3" ); - - METAELEM_DEL_CHECK_INT(self); - - self->metaelem->x= value->vec[0]; - self->metaelem->y= value->vec[1]; - self->metaelem->z= value->vec[2]; - return 0; -} - -/* - * elem.dims - non wrapped vector representing the xyz dimensions - * only effects some element types - */ -static PyObject *Metaelem_getDims( BPy_Metaelem * self ) -{ - float co[3]; - METAELEM_DEL_CHECK_PY(self); - - co[0]= self->metaelem->expx; - co[1]= self->metaelem->expy; - co[2]= self->metaelem->expz; - return newVectorObject( co, 3, Py_NEW ); -} -static int Metaelem_setDims( BPy_Metaelem * self, VectorObject * value ) -{ - if( !VectorObject_Check( value ) || value->size != 3 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaelem.dims - expected vector argument of size 3" ); - - METAELEM_DEL_CHECK_INT(self); - - self->metaelem->expx= EXPP_ClampFloat(value->vec[0], 0.0, 20.0); - self->metaelem->expy= EXPP_ClampFloat(value->vec[1], 0.0, 20.0); - self->metaelem->expz= EXPP_ClampFloat(value->vec[2], 0.0, 20.0); - return 0; -} - -/* - * elem.quat - non wrapped quat representing the rotation - * only effects some element types - a rotated ball has no effect for eg. - */ -static PyObject *Metaelem_getQuat( BPy_Metaelem * self ) -{ - METAELEM_DEL_CHECK_PY(self); - return newQuaternionObject(self->metaelem->quat, Py_NEW); -} -static int Metaelem_setQuat( BPy_Metaelem * self, QuaternionObject * value ) -{ - int i; - if( !QuaternionObject_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaelem.quat - expected quat argument" ); - - METAELEM_DEL_CHECK_INT(self); - - for (i = 0; i < 4; i++) - self->metaelem->quat[i]= value->quat[i]; - - /* need to normalize or metaball drawing can go into an infinate loop */ - NormalQuat(self->metaelem->quat); - - return 0; -} - -/* - * elem.hide and elem.sel - get/set true false - */ -static PyObject *Metaelem_getMFlagBits( BPy_Metaelem * self, void * type ) -{ - METAELEM_DEL_CHECK_PY(self); - return EXPP_getBitfield( &(self->metaelem->flag), (int)((long)type ), 'h' ); -} -static int Metaelem_setMFlagBits( BPy_Metaelem * self, PyObject * value, - void * type ) -{ - METAELEM_DEL_CHECK_INT(self); - return EXPP_setBitfield( value, &(self->metaelem->flag), - (int)((long)type), 'h' ); -} - -/* - * elem.stiffness - floating point, the volume of this element. - */ -static PyObject *Metaelem_getStiffness( BPy_Metaelem *self ) -{ - METAELEM_DEL_CHECK_PY(self); - return PyFloat_FromDouble( self->metaelem->s ); -} -static int Metaelem_setStiffness( BPy_Metaelem *self, PyObject *value) -{ - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaelem.stiffness - expected float argument" ); - - self->metaelem->s = EXPP_ClampFloat((float)PyFloat_AsDouble( value ), 0.0, 10.0); - return 0; -} - -/* - * elem.radius- floating point, the size if the element - */ -static PyObject *Metaelem_getRadius( BPy_Metaelem *self ) -{ - METAELEM_DEL_CHECK_PY(self); - return PyFloat_FromDouble( self->metaelem->rad ); -} -static int Metaelem_setRadius( BPy_Metaelem *self, PyObject *value) -{ - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "metaelem.radius - expected float argument" ); - - self->metaelem->rad = /* is 5000 too small? */ - EXPP_ClampFloat((float)PyFloat_AsDouble( value ), 0.0, 5000.0); - - return 0; -} - - -/* - * callback functions for comparison. - * It compares two Metaball_Type objects. Only the "==" and "!=" - * comparisons are meaninful. Returns 0 for equality and -1 if - * they don't point to the same Blender struct. - * In Python it becomes 1 if they are equal, 0 otherwise. - */ -static int Metaball_compare( BPy_Metaball * a, BPy_Metaball * b ) -{ - MetaBall *pa = a->metaball, *pb = b->metaball; - return ( pa == pb ) ? 0 : -1; -} - -static int MetaElemSeq_compare( BPy_MetaElemSeq * a, BPy_MetaElemSeq * b ) -{ - MetaBall *pa = a->bpymetaball->metaball, *pb = b->bpymetaball->metaball; - return ( pa == pb ) ? 0 : -1; -} - -static int Metaelem_compare( BPy_Metaelem * a, BPy_Metaelem * b ) -{ - MetaElem *pa = a->metaelem, *pb = b->metaelem; - return ( pa == pb ) ? 0 : -1; -} - -/* - * repr function - * callback functions building meaninful string to representations - */ -static PyObject *Metaball_repr( BPy_Metaball * self ) -{ - return PyString_FromFormat( "[Metaball \"%s\"]", - self->metaball->id.name + 2 ); -} - -static PyObject *Metaelem_repr( BPy_Metaelem * self ) -{ - return PyString_FromString( "Metaelem" ); -} - -static PyObject *MetaElemSeq_repr( BPy_MetaElemSeq * self ) -{ - return PyString_FromFormat( "[Metaball Iterator \"%s\"]", - self->bpymetaball->metaball->id.name + 2 ); -} - - - -/* - * MeteElem Seq sequence - */ - -static PyObject *MetaElem_CreatePyObject( MetaElem *metaelem ) -{ - BPy_Metaelem *elem= PyObject_NEW( BPy_Metaelem, &Metaelem_Type); - elem->metaelem = metaelem; Py_INCREF(elem); - return (PyObject *)elem; -} - -static int MetaElemSeq_len( BPy_MetaElemSeq * self ) -{ - return BLI_countlist( &( self->bpymetaball->metaball->elems ) ); -} - - -static PySequenceMethods MetaElemSeq_as_sequence = { - ( inquiry ) MetaElemSeq_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) 0, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - 0,0,0, -}; - -/************************************************************************ - * - * Python MetaElemSeq_Type iterator (iterates over Metaballs) - * - ************************************************************************/ - -/* - * Initialize the interator - */ - -static PyObject *MetaElemSeq_getIter( BPy_MetaElemSeq * self ) -{ - if (!self->iter) { /* not alredy looping on this data, */ - self->iter = self->bpymetaball->metaball->elems.first; - return EXPP_incr_ret ( (PyObject *) self ); - } else - return MetaElemSeq_CreatePyObject(self->bpymetaball, self->bpymetaball->metaball->elems.first); -} - -/* - * Return next MetaElem. - */ - -static PyObject *MetaElemSeq_nextIter( BPy_MetaElemSeq * self ) -{ - PyObject *object; - if( !(self->iter) || !(self->bpymetaball->metaball) ) { - self->iter= NULL; - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - object= MetaElem_CreatePyObject( self->iter ); - self->iter= self->iter->next; - return object; -} - -/* - * Adds and returns a new metaelement, - * no args are taken so the returned metaball must be modified after adding. - * Accessed as mball.elements.add() where mball is a python metaball data type. - */ -static PyObject *MetaElemSeq_add( BPy_MetaElemSeq * self ) -{ - MetaElem *ml; - - ml = MEM_callocN( sizeof( MetaElem ), "metaelem" ); - BLI_addhead( &( self->bpymetaball->metaball->elems ), ml ); - ml->x = 0; - ml->y = 0; - ml->z = 0; - ml->quat[0]= 1.0; - ml->quat[1]= 0.0; - ml->quat[2]= 0.0; - ml->quat[3]= 0.0; - ml->rad = 2; - ml->s = 2.0; - ml->flag = SELECT; - ml->type = 0; - ml->expx = 1; - ml->expy = 1; - ml->expz = 1; - ml->type = MB_BALL; - - return MetaElem_CreatePyObject(ml); -} - - -/* - * removes a metaelement if it is a part of the metaball, - * no args are taken so the returned metaball must be modified after adding. - * Accessed as mball.elements.add() where mball is a python metaball data type. - */ -static PyObject *MetaElemSeq_remove( BPy_MetaElemSeq * self, BPy_Metaelem *elem ) -{ - MetaElem *ml_iter, *ml_py; - - if( !BPy_Metaelem_Check(elem) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "elements.remove(metaelem) - expected a Metaball element" ); - - METAELEM_DEL_CHECK_PY(elem); - - ml_py= elem->metaelem; - - for (ml_iter= self->bpymetaball->metaball->elems.first; ml_iter; ml_iter= ml_iter->next) { - if (ml_py == ml_iter) { - elem->metaelem= NULL; - BLI_freelinkN( &(self->bpymetaball->metaball->elems), ml_py); - Py_RETURN_NONE; - } - } - - return EXPP_ReturnPyObjError( PyExc_ValueError, - "elements.remove(elem): elem not in meta elements" ); - -} - -static struct PyMethodDef BPy_MetaElemSeq_methods[] = { - {"add", (PyCFunction)MetaElemSeq_add, METH_NOARGS, - "add metaelem to metaball data"}, - {"remove", (PyCFunction)MetaElemSeq_remove, METH_O, - "remove element from metaball data"}, - {NULL, NULL, 0, NULL} -}; - -/************************************************************************ - * - * Python MetaElemSeq_Type standard operations - * - ************************************************************************/ - -static void MetaElemSeq_dealloc( BPy_MetaElemSeq * self ) -{ - Py_DECREF(self->bpymetaball); - PyObject_DEL( self ); -} - -/*****************************************************************************/ -/* Python MetaElemSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject MetaElemSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender MetaElemSeq", /* char *tp_name; */ - sizeof( BPy_MetaElemSeq ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) MetaElemSeq_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) MetaElemSeq_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) MetaElemSeq_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &MetaElemSeq_as_sequence, /* 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 */ - ( getiterfunc) MetaElemSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) MetaElemSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_MetaElemSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 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 -}; - diff --git a/source/blender/python/api2_2x/Metaball.h b/source/blender/python/api2_2x/Metaball.h deleted file mode 100644 index 6be35dbd3fb..00000000000 --- a/source/blender/python/api2_2x/Metaball.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * $Id: Metaball.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#ifndef EXPP_METABALL_H -#define EXPP_METABALL_H - -#include -#include "DNA_meta_types.h" - - -extern PyTypeObject Metaball_Type; - -#define BPy_Metaball_Check(v) ((v)->ob_type==&Metaball_Type) - - -/* Python BPy_Metaball structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - MetaBall * metaball; /* libdata must be second */ -} BPy_Metaball; - - -extern PyTypeObject Metaelem_Type; - -#define BPy_Metaelem_Check(v) ((v)->ob_type==&Metaelem_Type) - -/* Python BPy_Metaelem structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - MetaElem * metaelem; -} BPy_Metaelem; - -extern PyTypeObject MetaElemSeq_Type; - -#define BPy_MetaElemSeq_Check(v) ((v)->ob_type==&MetaElemSeq_Type) - -/* Python BPy_MetaElemSeq structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - BPy_Metaball *bpymetaball; /* link to the python group so we can know if its been removed */ - MetaElem * iter; /* so we can iterate over the objects */ -} BPy_MetaElemSeq; - -/* - * prototypes - */ - -PyObject *Metaball_Init( void ); -PyObject *Metaball_CreatePyObject( MetaBall * mball ); -MetaBall *Metaball_FromPyObject( PyObject * py_obj ); - -#endif /* EXPP_METABALL_H */ diff --git a/source/blender/python/api2_2x/Modifier.c b/source/blender/python/api2_2x/Modifier.c deleted file mode 100644 index 57f09332c03..00000000000 --- a/source/blender/python/api2_2x/Modifier.c +++ /dev/null @@ -1,1693 +0,0 @@ -/* - * $Id: Modifier.c 12840 2007-12-11 01:58:22Z khughes $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Ken Hughes, Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -/* TODO, accessing a modifier sequence of a deleted object will crash blender at the moment, not sure how to fix this. */ - - -#include "Modifier.h" /*This must come first*/ - -#include "DNA_object_types.h" -#include "DNA_effect_types.h" -#include "DNA_armature_types.h" -#include "DNA_vec_types.h" - -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_modifier.h" -#include "BKE_library.h" -#include "BLI_blenlib.h" -#include "BLI_arithb.h" -#include "MEM_guardedalloc.h" -#include "butspace.h" -#include "blendef.h" -#include "mydevice.h" - -#include "Object.h" -#include "Texture.h" -#include "Mathutils.h" -#include "gen_utils.h" -#include "gen_library.h" - -/* checks for the scene being removed */ -#define MODIFIER_DEL_CHECK_PY(bpy_modifier) if (!(bpy_modifier->md)) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "Modifier has been removed" ) ) -#define MODIFIER_DEL_CHECK_INT(bpy_modifier) if (!(bpy_modifier->md)) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "Modifier has been removed" ) ) - -enum mod_constants { - /*Apply to all modifiers*/ - EXPP_MOD_RENDER = 0, - EXPP_MOD_REALTIME, - EXPP_MOD_EDITMODE, - EXPP_MOD_ONCAGE, - - /*GENERIC*/ - EXPP_MOD_OBJECT, /*ARMATURE, LATTICE, CURVE, BOOLEAN, ARRAY*/ - EXPP_MOD_VERTGROUP, /*ARMATURE, LATTICE, CURVE, SMOOTH, CAST*/ - EXPP_MOD_LIMIT, /*ARRAY, MIRROR*/ - EXPP_MOD_FLAG, /*MIRROR, WAVE*/ - EXPP_MOD_COUNT, /*DECIMATOR, ARRAY*/ - EXPP_MOD_LENGTH, /*BUILD, ARRAY*/ - EXPP_MOD_FACTOR, /*SMOOTH, CAST*/ - EXPP_MOD_ENABLE_X, /*SMOOTH, CAST*/ - EXPP_MOD_ENABLE_Y, /*SMOOTH, CAST*/ - EXPP_MOD_ENABLE_Z, /*SMOOTH, CAST*/ - EXPP_MOD_TYPES, /*SUBSURF, CAST*/ - - /*SUBSURF SPECIFIC*/ - EXPP_MOD_LEVELS, - EXPP_MOD_RENDLEVELS, - EXPP_MOD_OPTIMAL, - EXPP_MOD_UV, - - /*ARMATURE SPECIFIC*/ - EXPP_MOD_ENVELOPES, - - /*ARRAY SPECIFIC*/ - EXPP_MOD_OBJECT_OFFSET, - EXPP_MOD_OBJECT_CURVE, - EXPP_MOD_OFFSET_VEC, - EXPP_MOD_SCALE_VEC, - EXPP_MOD_MERGE_DIST, - - /*BUILD SPECIFIC*/ - EXPP_MOD_START, - EXPP_MOD_SEED, - EXPP_MOD_RANDOMIZE, - - /*MIRROR SPECIFIC*/ - EXPP_MOD_AXIS_X, - EXPP_MOD_AXIS_Y, - EXPP_MOD_AXIS_Z, - - /*DECIMATE SPECIFIC*/ - EXPP_MOD_RATIO, - - /*WAVE SPECIFIC*/ - EXPP_MOD_STARTX, - EXPP_MOD_STARTY, - EXPP_MOD_HEIGHT, - EXPP_MOD_WIDTH, - EXPP_MOD_NARROW, - EXPP_MOD_SPEED, - EXPP_MOD_DAMP, - EXPP_MOD_LIFETIME, - EXPP_MOD_TIMEOFFS, - - /*BOOLEAN SPECIFIC*/ - EXPP_MOD_OPERATION, - - /*EDGE SPLIT SPECIFIC */ - EXPP_MOD_EDGESPLIT_ANGLE, - EXPP_MOD_EDGESPLIT_FROM_ANGLE, - EXPP_MOD_EDGESPLIT_FROM_SHARP, - - /* DISPLACE */ - EXPP_MOD_UVLAYER, - EXPP_MOD_MID_LEVEL, - EXPP_MOD_STRENGTH, - EXPP_MOD_TEXTURE, - EXPP_MOD_MAPPING, - EXPP_MOD_DIRECTION, - - /* SMOOTH */ - EXPP_MOD_REPEAT, - - /* CAST */ - EXPP_MOD_RADIUS, - EXPP_MOD_SIZE, - EXPP_MOD_USE_OB_TRANSFORM, - EXPP_MOD_SIZE_FROM_RADIUS - - /* yet to be implemented */ - /* EXPP_MOD_HOOK_,*/ - /* , */ -}; - -/*****************************************************************************/ -/* Python BPy_Modifier methods declarations: */ -/*****************************************************************************/ -static PyObject *Modifier_getName( BPy_Modifier * self ); -static int Modifier_setName( BPy_Modifier * self, PyObject *arg ); -static PyObject *Modifier_getType( BPy_Modifier * self ); -static PyObject *Modifier_reset( BPy_Modifier * self ); - -static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key ); -static int Modifier_setData( BPy_Modifier * self, PyObject * key, - PyObject * value ); - -/*****************************************************************************/ -/* Python BPy_Modifier methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Modifier_methods[] = { - /* name, method, flags, doc */ - {"reset", (PyCFunction)Modifier_reset, METH_NOARGS, - "resets a hook modifier location"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Modifier attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Modifier_getseters[] = { - {"name", - (getter)Modifier_getName, (setter)Modifier_setName, - "Modifier name", NULL}, - {"type", - (getter)Modifier_getType, (setter)NULL, - "Modifier type (read only)", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Modifier_Type Mapping Methods table: */ -/*****************************************************************************/ -static PyMappingMethods Modifier_as_mapping = { - NULL, /* mp_length */ - ( binaryfunc ) Modifier_getData, /* mp_subscript */ - ( objobjargproc ) Modifier_setData, /* mp_ass_subscript */ -}; - -/*****************************************************************************/ -/* Python Modifier_Type callback function prototypes: */ -/*****************************************************************************/ -static PyObject *Modifier_repr( BPy_Modifier * self ); - -/*****************************************************************************/ -/* Python Modifier_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Modifier_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Modifier", /* char *tp_name; */ - sizeof( BPy_Modifier ), /* 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 ) Modifier_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - &Modifier_as_mapping, /* 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 ***/ - BPy_Modifier_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Modifier_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 -}; - -/*****************************************************************************/ -/* Python BPy_Modifier methods: */ -/*****************************************************************************/ - -/* - * return the name of this modifier - */ - -static PyObject *Modifier_getName( BPy_Modifier * self ) -{ - MODIFIER_DEL_CHECK_PY(self); - return PyString_FromString( self->md->name ); -} - -/* - * set the name of this modifier - */ - -static int Modifier_setName( BPy_Modifier * self, PyObject * attr ) -{ - char *name = PyString_AsString( attr ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected string arg" ); - - MODIFIER_DEL_CHECK_INT(self); - - BLI_strncpy( self->md->name, name, sizeof( self->md->name ) ); - - return 0; -} - -/* - * return the type of this modifier - */ - -static PyObject *Modifier_getType( BPy_Modifier * self ) -{ - MODIFIER_DEL_CHECK_PY(self); - - return PyInt_FromLong( self->md->type ); -} - -static PyObject *subsurf_getter( BPy_Modifier * self, int type ) -{ - SubsurfModifierData *md = ( SubsurfModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_TYPES: - return PyInt_FromLong( ( long )md->subdivType ); - case EXPP_MOD_LEVELS: - return PyInt_FromLong( ( long )md->levels ); - case EXPP_MOD_RENDLEVELS: - return PyInt_FromLong( ( long )md->renderLevels ); - case EXPP_MOD_OPTIMAL: - return PyBool_FromLong( ( long ) - ( md->flags & eSubsurfModifierFlag_ControlEdges ) ) ; - case EXPP_MOD_UV: - return PyBool_FromLong( ( long ) - ( md->flags & eSubsurfModifierFlag_SubsurfUv ) ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, - "key not found" ); - } -} - -static int subsurf_setter( BPy_Modifier * self, int type, - PyObject *value ) -{ - SubsurfModifierData *md = (SubsurfModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_TYPES: - return EXPP_setIValueRange( value, &md->subdivType, 0, 1, 'h' ); - case EXPP_MOD_LEVELS: - return EXPP_setIValueClamped( value, &md->levels, 1, 6, 'h' ); - case EXPP_MOD_RENDLEVELS: - return EXPP_setIValueClamped( value, &md->renderLevels, 1, 6, 'h' ); - case EXPP_MOD_OPTIMAL: - return EXPP_setBitfield( value, &md->flags, - eSubsurfModifierFlag_ControlEdges, 'h' ); - case EXPP_MOD_UV: - return EXPP_setBitfield( value, &md->flags, - eSubsurfModifierFlag_SubsurfUv, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *armature_getter( BPy_Modifier * self, int type ) -{ - ArmatureModifierData *md = (ArmatureModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_OBJECT: - return Object_CreatePyObject( md->object ); - case EXPP_MOD_VERTGROUP: - return PyBool_FromLong( ( long )( md->deformflag & 1 ) ) ; - case EXPP_MOD_ENVELOPES: - return PyBool_FromLong( ( long )( md->deformflag & 2 ) ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int armature_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - ArmatureModifierData *md = (ArmatureModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_OBJECT: - return GenericLib_assignData(value, (void **) &md->object, 0, 0, ID_OB, OB_ARMATURE); - case EXPP_MOD_VERTGROUP: - return EXPP_setBitfield( value, &md->deformflag, 1, 'h' ); - case EXPP_MOD_ENVELOPES: - return EXPP_setBitfield( value, &md->deformflag, 2, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *lattice_getter( BPy_Modifier * self, int type ) -{ - LatticeModifierData *md = (LatticeModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_OBJECT: - return Object_CreatePyObject( md->object ); - case EXPP_MOD_VERTGROUP: - return PyString_FromString( md->name ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int lattice_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - LatticeModifierData *md = (LatticeModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_OBJECT: - return GenericLib_assignData(value, (void **) &md->object, (void **) &self->object, 0, ID_OB, OB_LATTICE); - case EXPP_MOD_VERTGROUP: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - BLI_strncpy( md->name, name, sizeof( md->name ) ); - break; - } - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } - return 0; -} - -static PyObject *curve_getter( BPy_Modifier * self, int type ) -{ - CurveModifierData *md = (CurveModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_OBJECT: - return Object_CreatePyObject( md->object ); - case EXPP_MOD_VERTGROUP: - return PyString_FromString( md->name ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int curve_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - CurveModifierData *md = (CurveModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_OBJECT: - return GenericLib_assignData(value, (void **) &md->object, (void **) &self->object, 0, ID_OB, OB_CURVE); - case EXPP_MOD_VERTGROUP: { - char *name = PyString_AsString( value ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string arg" ); - BLI_strncpy( md->name, name, sizeof( md->name ) ); - break; - } - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } - return 0; -} - -static PyObject *build_getter( BPy_Modifier * self, int type ) -{ - BuildModifierData *md = (BuildModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_START: - return PyFloat_FromDouble( ( float )md->start ); - case EXPP_MOD_LENGTH: - return PyFloat_FromDouble( ( float )md->length ); - case EXPP_MOD_SEED: - return PyInt_FromLong( ( long )md->seed ); - case EXPP_MOD_RANDOMIZE: - return PyBool_FromLong( ( long )md->randomize ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int build_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - BuildModifierData *md = (BuildModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_START: - return EXPP_setFloatClamped( value, &md->start, 1.0, MAXFRAMEF ); - case EXPP_MOD_LENGTH: - return EXPP_setFloatClamped( value, &md->length, 1.0, MAXFRAMEF ); - case EXPP_MOD_SEED: - return EXPP_setIValueClamped( value, &md->seed, 1, MAXFRAME, 'i' ); - case EXPP_MOD_RANDOMIZE: - return EXPP_setBitfield( value, &md->randomize, 1, 'i' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *mirror_getter( BPy_Modifier * self, int type ) -{ - MirrorModifierData *md = (MirrorModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_LIMIT: - return PyFloat_FromDouble( (double)md->tolerance ); - case EXPP_MOD_FLAG: - return PyBool_FromLong( (long)( md->flag & MOD_MIR_CLIPPING ) ) ; - case EXPP_MOD_AXIS_X: - return PyBool_FromLong( ( long ) - ( md->flag & MOD_MIR_AXIS_X ) ) ; - case EXPP_MOD_AXIS_Y: - return PyBool_FromLong( ( long ) - ( md->flag & MOD_MIR_AXIS_Y ) ) ; - case EXPP_MOD_AXIS_Z: - return PyBool_FromLong( ( long ) - ( md->flag & MOD_MIR_AXIS_Z ) ) ; - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int mirror_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - MirrorModifierData *md = (MirrorModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_LIMIT: - return EXPP_setFloatClamped( value, &md->tolerance, 0.0, 1.0 ); - case EXPP_MOD_FLAG: - return EXPP_setBitfield( value, &md->flag, MOD_MIR_CLIPPING, 'i' ); - case EXPP_MOD_AXIS_X: - return EXPP_setBitfield( value, &md->flag, MOD_MIR_AXIS_X, 'h' ); - case EXPP_MOD_AXIS_Y: - return EXPP_setBitfield( value, &md->flag, MOD_MIR_AXIS_Y, 'h' ); - case EXPP_MOD_AXIS_Z: - return EXPP_setBitfield( value, &md->flag, MOD_MIR_AXIS_Z, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *decimate_getter( BPy_Modifier * self, int type ) -{ - DecimateModifierData *md = (DecimateModifierData *)(self->md); - - if( type == EXPP_MOD_RATIO ) - return PyFloat_FromDouble( (double)md->percent ); - else if( type == EXPP_MOD_COUNT ) - return PyInt_FromLong( (long)md->faceCount ); - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); -} - -static int decimate_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - DecimateModifierData *md = (DecimateModifierData *)(self->md); - - if( type == EXPP_MOD_RATIO ) - return EXPP_setFloatClamped( value, &md->percent, 0.0, 1.0 ); - else if( type == EXPP_MOD_COUNT ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "value is read-only" ); - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); -} - -static PyObject *smooth_getter( BPy_Modifier * self, int type ) -{ - SmoothModifierData *md = (SmoothModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_FACTOR: - return PyFloat_FromDouble( (double)md->fac ); - case EXPP_MOD_REPEAT: - return PyInt_FromLong( (long)md->repeat ); - case EXPP_MOD_VERTGROUP: - return PyString_FromString( md->defgrp_name ) ; - case EXPP_MOD_ENABLE_X: - return EXPP_getBitfield( &md->flag, MOD_SMOOTH_X, 'h' ); - case EXPP_MOD_ENABLE_Y: - return EXPP_getBitfield( &md->flag, MOD_SMOOTH_Y, 'h' ); - case EXPP_MOD_ENABLE_Z: - return EXPP_getBitfield( &md->flag, MOD_SMOOTH_Z, 'h' ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int smooth_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - SmoothModifierData *md = (SmoothModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_FACTOR: - return EXPP_setFloatClamped( value, &md->fac, -10.0, 10.0 ); - case EXPP_MOD_REPEAT: - return EXPP_setIValueRange( value, &md->repeat, 0, 30, 'h' ); - case EXPP_MOD_VERTGROUP: { - char *name = PyString_AsString( value ); - if( !name ) return EXPP_ReturnIntError( PyExc_TypeError, "expected string arg" ); - BLI_strncpy( md->defgrp_name, name, sizeof( md->defgrp_name ) ); - return 0; - } - case EXPP_MOD_ENABLE_X: - return EXPP_setBitfield( value, &md->flag, MOD_SMOOTH_X, 'h' ); - case EXPP_MOD_ENABLE_Y: - return EXPP_setBitfield( value, &md->flag, MOD_SMOOTH_Y, 'h' ); - case EXPP_MOD_ENABLE_Z: - return EXPP_setBitfield( value, &md->flag, MOD_SMOOTH_Z, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *cast_getter( BPy_Modifier * self, int type ) -{ - CastModifierData *md = (CastModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_TYPES: - return PyInt_FromLong( (long)md->type ); - case EXPP_MOD_FACTOR: - return PyFloat_FromDouble( (double)md->fac ); - case EXPP_MOD_RADIUS: - return PyFloat_FromDouble( (double)md->radius ); - case EXPP_MOD_SIZE: - return PyFloat_FromDouble( (double)md->size ); - case EXPP_MOD_OBJECT: - return Object_CreatePyObject( md->object ); - case EXPP_MOD_VERTGROUP: - return PyString_FromString( md->defgrp_name ) ; - case EXPP_MOD_ENABLE_X: - return EXPP_getBitfield( &md->flag, MOD_CAST_X, 'h' ); - case EXPP_MOD_ENABLE_Y: - return EXPP_getBitfield( &md->flag, MOD_CAST_Y, 'h' ); - case EXPP_MOD_ENABLE_Z: - return EXPP_getBitfield( &md->flag, MOD_CAST_Z, 'h' ); - case EXPP_MOD_USE_OB_TRANSFORM: - return EXPP_getBitfield( &md->flag, MOD_CAST_USE_OB_TRANSFORM, 'h' ); - case EXPP_MOD_SIZE_FROM_RADIUS: - return EXPP_getBitfield( &md->flag, MOD_CAST_SIZE_FROM_RADIUS, 'h' ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int cast_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - CastModifierData *md = (CastModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_TYPES: - return EXPP_setIValueRange( value, &md->type, 0, MOD_CAST_TYPE_CUBOID, 'h' ); - case EXPP_MOD_FACTOR: - return EXPP_setFloatClamped( value, &md->fac, -10.0, 10.0 ); - case EXPP_MOD_RADIUS: - return EXPP_setFloatClamped( value, &md->radius, 0.0, 100.0 ); - case EXPP_MOD_SIZE: - return EXPP_setFloatClamped( value, &md->size, 0.0, 100.0 ); - case EXPP_MOD_OBJECT: { - Object *ob_new=NULL; - if (value == Py_None) { - md->object = NULL; - } else if (BPy_Object_Check( value )) { - ob_new = ((( BPy_Object * )value)->object); - md->object = ob_new; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "Expected an Object or None value" ); - } - return 0; - } - case EXPP_MOD_VERTGROUP: { - char *name = PyString_AsString( value ); - if( !name ) return EXPP_ReturnIntError( PyExc_TypeError, "expected string arg" ); - BLI_strncpy( md->defgrp_name, name, sizeof( md->defgrp_name ) ); - return 0; - } - case EXPP_MOD_ENABLE_X: - return EXPP_setBitfield( value, &md->flag, MOD_CAST_X, 'h' ); - case EXPP_MOD_ENABLE_Y: - return EXPP_setBitfield( value, &md->flag, MOD_CAST_Y, 'h' ); - case EXPP_MOD_ENABLE_Z: - return EXPP_setBitfield( value, &md->flag, MOD_CAST_Z, 'h' ); - case EXPP_MOD_USE_OB_TRANSFORM: - return EXPP_setBitfield( value, &md->flag, MOD_CAST_USE_OB_TRANSFORM, 'h' ); - case EXPP_MOD_SIZE_FROM_RADIUS: - return EXPP_setBitfield( value, &md->flag, MOD_CAST_SIZE_FROM_RADIUS, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *wave_getter( BPy_Modifier * self, int type ) -{ - WaveModifierData *md = (WaveModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_STARTX: - return PyFloat_FromDouble( (double)md->startx ); - case EXPP_MOD_STARTY: - return PyFloat_FromDouble( (double)md->starty ); - case EXPP_MOD_HEIGHT: - return PyFloat_FromDouble( (double)md->height ); - case EXPP_MOD_WIDTH: - return PyFloat_FromDouble( (double)md->width ); - case EXPP_MOD_NARROW: - return PyFloat_FromDouble( (double)md->narrow ); - case EXPP_MOD_SPEED: - return PyFloat_FromDouble( (double)md->speed ); - case EXPP_MOD_DAMP: - return PyFloat_FromDouble( (double)md->damp ); - case EXPP_MOD_LIFETIME: - return PyFloat_FromDouble( (double)md->lifetime ); - case EXPP_MOD_TIMEOFFS: - return PyFloat_FromDouble( (double)md->timeoffs ); - case EXPP_MOD_FLAG: - return PyInt_FromLong( (long)md->flag ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int wave_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - WaveModifierData *md = (WaveModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_STARTX: - return EXPP_setFloatClamped( value, &md->startx, -100.0, 100.0 ); - case EXPP_MOD_STARTY: - return EXPP_setFloatClamped( value, &md->starty, -100.0, 100.0 ); - case EXPP_MOD_HEIGHT: - return EXPP_setFloatClamped( value, &md->height, -2.0, 2.0 ); - case EXPP_MOD_WIDTH: - return EXPP_setFloatClamped( value, &md->width, 0.0, 5.0 ); - case EXPP_MOD_NARROW: - return EXPP_setFloatClamped( value, &md->width, 0.0, 5.0 ); - case EXPP_MOD_SPEED: - return EXPP_setFloatClamped( value, &md->speed, -2.0, 2.0 ); - case EXPP_MOD_DAMP: - return EXPP_setFloatClamped( value, &md->damp, -MAXFRAMEF, MAXFRAMEF ); - case EXPP_MOD_LIFETIME: - return EXPP_setFloatClamped( value, &md->lifetime, -MAXFRAMEF, MAXFRAMEF ); - case EXPP_MOD_TIMEOFFS: - return EXPP_setFloatClamped( value, &md->timeoffs, -MAXFRAMEF, MAXFRAMEF ); - case EXPP_MOD_FLAG: - return EXPP_setIValueRange( value, &md->flag, 0, - MOD_WAVE_X | MOD_WAVE_Y | MOD_WAVE_CYCL, 'h' ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *array_getter( BPy_Modifier * self, int type ) -{ - ArrayModifierData *md = (ArrayModifierData *)(self->md); - - if( type == EXPP_MOD_OBJECT_OFFSET ) - return Object_CreatePyObject( md->offset_ob ); - else if( type == EXPP_MOD_OBJECT_CURVE ) - return Object_CreatePyObject( md->curve_ob ); - else if( type == EXPP_MOD_COUNT ) - return PyInt_FromLong( (long)md->count ); - else if( type == EXPP_MOD_LENGTH ) - return PyFloat_FromDouble( md->length ); - 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) - return newVectorObject( md->scale, 3, Py_NEW ); - - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); -} - -static int array_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - ArrayModifierData *md = (ArrayModifierData *)(self->md); - switch( type ) { - case EXPP_MOD_OBJECT_OFFSET: - return GenericLib_assignData(value, (void **) &md->offset_ob, (void **) &self->object, 0, ID_OB, 0); - case EXPP_MOD_OBJECT_CURVE: - return GenericLib_assignData(value, (void **) &md->curve_ob, 0, 0, ID_OB, OB_CURVE); - case EXPP_MOD_COUNT: - return EXPP_setIValueClamped( value, &md->count, 1, 1000, 'i' ); - case EXPP_MOD_LENGTH: - return EXPP_setFloatClamped( value, &md->length, 0.0, 1000.0 ); - case EXPP_MOD_MERGE_DIST: - return EXPP_setFloatClamped( value, &md->merge_dist, 0.0, 1000.0 ); - case EXPP_MOD_OFFSET_VEC: - return EXPP_setVec3Clamped( value, md->offset, -10000.0, 10000.0 ); - case EXPP_MOD_SCALE_VEC: - return EXPP_setVec3Clamped( value, md->scale, -10000.0, 10000.0 ); - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *boolean_getter( BPy_Modifier * self, int type ) -{ - BooleanModifierData *md = (BooleanModifierData *)(self->md); - - if( type == EXPP_MOD_OBJECT ) - return Object_CreatePyObject( md->object ); - else if( type == EXPP_MOD_OPERATION ) - return PyInt_FromLong( ( long )md->operation ) ; - - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); -} - -static int boolean_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - BooleanModifierData *md = (BooleanModifierData *)(self->md); - - if( type == EXPP_MOD_OBJECT ) - return GenericLib_assignData(value, (void **) &md->object, (void **) &self->object, 0, ID_OB, OB_MESH); - else if( type == EXPP_MOD_OPERATION ) - return EXPP_setIValueRange( value, &md->operation, - eBooleanModifierOp_Intersect, eBooleanModifierOp_Difference, - 'h' ); - - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); -} - - -static PyObject *edgesplit_getter( BPy_Modifier * self, int type ) -{ - EdgeSplitModifierData *md = (EdgeSplitModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_EDGESPLIT_ANGLE: - return PyFloat_FromDouble( (double)md->split_angle ); - case EXPP_MOD_EDGESPLIT_FROM_ANGLE: - return PyBool_FromLong( ( long ) - ( md->flags & MOD_EDGESPLIT_FROMANGLE ) ) ; - case EXPP_MOD_EDGESPLIT_FROM_SHARP: - return PyBool_FromLong( ( long ) - ( md->flags & MOD_EDGESPLIT_FROMFLAG ) ) ; - - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int edgesplit_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - EdgeSplitModifierData *md = (EdgeSplitModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_EDGESPLIT_ANGLE: - return EXPP_setFloatClamped( value, &md->split_angle, 0.0, 180.0 ); - case EXPP_MOD_EDGESPLIT_FROM_ANGLE: - return EXPP_setBitfield( value, &md->flags, - MOD_EDGESPLIT_FROMANGLE, 'h' ); - case EXPP_MOD_EDGESPLIT_FROM_SHARP: - return EXPP_setBitfield( value, &md->flags, - MOD_EDGESPLIT_FROMFLAG, 'h' ); - - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - -static PyObject *displace_getter( BPy_Modifier * self, int type ) -{ - DisplaceModifierData *md = (DisplaceModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_TEXTURE: - if (md->texture) Texture_CreatePyObject( md->texture ); - else Py_RETURN_NONE; - case EXPP_MOD_STRENGTH: - return PyFloat_FromDouble( (double)md->strength ); - case EXPP_MOD_DIRECTION: - PyInt_FromLong( md->direction ); - case EXPP_MOD_VERTGROUP: - return PyString_FromString( md->defgrp_name ) ; - case EXPP_MOD_MID_LEVEL: - return PyFloat_FromDouble( (double)md->midlevel ); - case EXPP_MOD_MAPPING: - PyInt_FromLong( md->texmapping ); - case EXPP_MOD_OBJECT: - return Object_CreatePyObject( md->map_object ); - case EXPP_MOD_UVLAYER: - return PyString_FromString( md->uvlayer_name ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int displace_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - DisplaceModifierData *md = (DisplaceModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_TEXTURE: - return GenericLib_assignData(value, (void **) &md->texture, 0, 1, ID_TE, 0); - case EXPP_MOD_STRENGTH: - return EXPP_setFloatClamped( value, &md->strength, -1000.0, 1000.0 ); - - case EXPP_MOD_DIRECTION: - return EXPP_setIValueClamped( value, &md->direction, - MOD_DISP_DIR_X, MOD_DISP_DIR_RGB_XYZ, 'i' ); - - case EXPP_MOD_VERTGROUP: { - char *name = PyString_AsString( value ); - if( !name ) return EXPP_ReturnIntError( PyExc_TypeError, "expected string arg" ); - BLI_strncpy( md->defgrp_name, name, sizeof( md->defgrp_name ) ); - return 0; - } - case EXPP_MOD_MID_LEVEL: - return EXPP_setFloatClamped( value, &md->midlevel, 0.0, 1.0 ); - - case EXPP_MOD_MAPPING: - return EXPP_setIValueClamped( value, &md->texmapping, - MOD_DISP_MAP_LOCAL, MOD_DISP_MAP_UV, 'i' ); - - case EXPP_MOD_OBJECT: { - Object *ob_new=NULL; - if (value == Py_None) { - md->map_object = NULL; - } else if (BPy_Object_Check( value )) { - ob_new = ((( BPy_Object * )value)->object); - md->map_object = ob_new; - } else { - return EXPP_ReturnIntError( PyExc_TypeError, - "Expected an Object or None value" ); - } - return 0; - } - - case EXPP_MOD_UVLAYER: { - char *name = PyString_AsString( value ); - if( !name ) return EXPP_ReturnIntError( PyExc_TypeError, "expected string arg" ); - BLI_strncpy( md->uvlayer_name, name, sizeof( md->uvlayer_name ) ); - return 0; - } - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} - - -/* static PyObject *uvproject_getter( BPy_Modifier * self, int type ) -{ - DisplaceModifierData *md = (DisplaceModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_MID_LEVEL: - return PyFloat_FromDouble( (double)md->midlevel ); - default: - return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" ); - } -} - -static int uvproject_setter( BPy_Modifier *self, int type, PyObject *value ) -{ - DisplaceModifierData *md = (DisplaceModifierData *)(self->md); - - switch( type ) { - case EXPP_MOD_TEXTURE: - return 0; - default: - return EXPP_ReturnIntError( PyExc_KeyError, "key not found" ); - } -} */ - - -/* - * get data from a modifier - */ - -static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key ) -{ - int setting; - - if( !PyInt_Check( key ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an int arg as stored in Blender.Modifier.Settings" ); - - MODIFIER_DEL_CHECK_PY(self); - - setting = PyInt_AsLong( key ); - switch( setting ) { - case EXPP_MOD_RENDER: - return EXPP_getBitfield( &self->md->mode, eModifierMode_Render, 'h' ); - case EXPP_MOD_REALTIME: - return EXPP_getBitfield( &self->md->mode, eModifierMode_Realtime, 'h' ); - case EXPP_MOD_EDITMODE: - return EXPP_getBitfield( &self->md->mode, eModifierMode_Editmode, 'h' ); - case EXPP_MOD_ONCAGE: - return EXPP_getBitfield( &self->md->mode, eModifierMode_OnCage, 'h' ); - default: - switch( self->md->type ) { - case eModifierType_Subsurf: - return subsurf_getter( self, setting ); - case eModifierType_Armature: - return armature_getter( self, setting ); - case eModifierType_Lattice: - return lattice_getter( self, setting ); - case eModifierType_Curve: - return curve_getter( self, setting ); - case eModifierType_Build: - return build_getter( self, setting ); - case eModifierType_Mirror: - return mirror_getter( self, setting ); - case eModifierType_Decimate: - return decimate_getter( self, setting ); - case eModifierType_Smooth: - return smooth_getter( self, setting ); - case eModifierType_Cast: - return cast_getter( self, setting ); - case eModifierType_Wave: - return wave_getter( self, setting ); - case eModifierType_Boolean: - return boolean_getter( self, setting ); - case eModifierType_Array: - return array_getter( self, setting ); - case eModifierType_EdgeSplit: - return edgesplit_getter( self, setting ); - case eModifierType_Displace: - return displace_getter( self, setting ); - /*case eModifierType_UVProject: - return uvproject_getter( self, setting );*/ - case eModifierType_Hook: - case eModifierType_Softbody: - case eModifierType_None: - Py_RETURN_NONE; - } - } - return EXPP_ReturnPyObjError( PyExc_KeyError, - "unknown key or modifier type" ); -} - -static int Modifier_setData( BPy_Modifier * self, PyObject * key, - PyObject * arg ) -{ - int key_int; - - if( !PyNumber_Check( key ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int arg as stored in Blender.Modifier.Settings" ); - - MODIFIER_DEL_CHECK_INT(self); - - key_int = PyInt_AsLong( key ); - - /* Chach for standard modifier settings */ - switch( key_int ) { - case EXPP_MOD_RENDER: - return EXPP_setBitfield( arg, &self->md->mode, - eModifierMode_Render, 'h' ); - case EXPP_MOD_REALTIME: - return EXPP_setBitfield( arg, &self->md->mode, - eModifierMode_Realtime, 'h' ); - case EXPP_MOD_EDITMODE: - return EXPP_setBitfield( arg, &self->md->mode, - eModifierMode_Editmode, 'h' ); - case EXPP_MOD_ONCAGE: - return EXPP_setBitfield( arg, &self->md->mode, - eModifierMode_OnCage, 'h' ); - } - - switch( self->md->type ) { - case eModifierType_Subsurf: - return subsurf_setter( self, key_int, arg ); - case eModifierType_Armature: - return armature_setter( self, key_int, arg ); - case eModifierType_Lattice: - return lattice_setter( self, key_int, arg ); - case eModifierType_Curve: - return curve_setter( self, key_int, arg ); - case eModifierType_Build: - return build_setter( self, key_int, arg ); - case eModifierType_Mirror: - return mirror_setter( self, key_int, arg ); - case eModifierType_Array: - return array_setter( self, key_int, arg ); - case eModifierType_Decimate: - return decimate_setter( self, key_int, arg ); - case eModifierType_Smooth: - return smooth_setter( self, key_int, arg ); - case eModifierType_Cast: - return cast_setter( self, key_int, arg ); - case eModifierType_Wave: - return wave_setter( self, key_int, arg ); - case eModifierType_Boolean: - return boolean_setter( self, key_int, arg ); - case eModifierType_EdgeSplit: - return edgesplit_setter( self, key_int, arg ); - case eModifierType_Displace: - return displace_setter( self, key_int, arg ); - /*case eModifierType_UVProject: - return uvproject_setter( self, key_int, arg );*/ - case eModifierType_Hook: - case eModifierType_Softbody: - case eModifierType_None: - return 0; - } - return EXPP_ReturnIntError( PyExc_RuntimeError, - "unsupported modifier setting" ); -} - - -static PyObject *Modifier_reset( BPy_Modifier * self ) -{ - Object *ob = self->object; - ModifierData *md = self->md; - HookModifierData *hmd = (HookModifierData*) md; - - MODIFIER_DEL_CHECK_PY(self); - - if (md->type != eModifierType_Hook) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "can only reset hooks" ); - - if (hmd->object) { - Mat4Invert(hmd->object->imat, hmd->object->obmat); - Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL); - } - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: Modifier_repr */ -/* Description: This is a callback function for the BPy_Modifier type. It */ -/* builds a meaningful string to represent modifier objects. */ -/*****************************************************************************/ -static PyObject *Modifier_repr( BPy_Modifier * self ) -{ - ModifierTypeInfo *mti; - if (self->md==NULL) - return PyString_FromString( "[Modifier - Removed"); - - mti= modifierType_getInfo(self->md->type); - return PyString_FromFormat( "[Modifier \"%s\", Type \"%s\"]", self->md->name, mti->name ); -} - -/* Three Python Modifier_Type helper functions needed by the Object module: */ - -/*****************************************************************************/ -/* Function: Modifier_CreatePyObject */ -/* Description: This function will create a new BPy_Modifier from an */ -/* existing Blender modifier structure. */ -/*****************************************************************************/ -PyObject *Modifier_CreatePyObject( Object *ob, ModifierData * md ) -{ - BPy_Modifier *pymod; - pymod = ( BPy_Modifier * ) PyObject_NEW( BPy_Modifier, &Modifier_Type ); - if( !pymod ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Modifier object" ); - pymod->md = md; - pymod->object = ob; - return ( PyObject * ) pymod; -} - -/*****************************************************************************/ -/* Function: Modifier_FromPyObject */ -/* Description: This function returns the Blender modifier from the given */ -/* PyObject. */ -/*****************************************************************************/ -ModifierData *Modifier_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Modifier * ) pyobj )->md; -} - -/*****************************************************************************/ -/* Modifier Sequence wrapper */ -/*****************************************************************************/ - -/* - * Initialize the interator - */ - -static PyObject *ModSeq_getIter( BPy_ModSeq * self ) -{ - if (!self->iter) { - self->iter = (ModifierData *)self->object->modifiers.first; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - return ModSeq_CreatePyObject(self->object, (ModifierData *)self->object->modifiers.first); - } -} - -/* - * Get the next Modifier - */ - -static PyObject *ModSeq_nextIter( BPy_ModSeq * self ) -{ - ModifierData *iter = self->iter; - if( iter ) { - self->iter = iter->next; - return Modifier_CreatePyObject( self->object, iter ); - } - - self->iter= NULL; /* mark as not iterating */ - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); -} - -/* return the number of modifiers */ - -static int ModSeq_length( BPy_ModSeq * self ) -{ - return BLI_countlist( &self->object->modifiers ); -} - -/* return a modifier */ - -static PyObject *ModSeq_item( BPy_ModSeq * self, int i ) -{ - ModifierData *md = NULL; - - /* if index is negative, start counting from the end of the list */ - if( i < 0 ) - i += ModSeq_length( self ); - - /* skip through the list until we get the modifier or end of list */ - - for( md = self->object->modifiers.first; i && md; --i ) md = md->next; - - if( md ) - return Modifier_CreatePyObject( self->object, md ); - else - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); -} - -/*****************************************************************************/ -/* Python BPy_ModSeq sequence table: */ -/*****************************************************************************/ -static PySequenceMethods ModSeq_as_sequence = { - ( inquiry ) ModSeq_length, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) ModSeq_item, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - ( objobjproc ) 0, /* sq_contains */ - ( binaryfunc ) 0, /* sq_inplace_concat */ - ( intargfunc ) 0, /* sq_inplace_repeat */ -}; - -/* - * helper function to check for a valid modifier argument - */ - -static ModifierData *locate_modifier( BPy_ModSeq *self, BPy_Modifier * value ) -{ - ModifierData *md; - - /* check that argument is a modifier */ - if( !BPy_Modifier_Check(value) ) - return (ModifierData *)EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an modifier as an argument" ); - - /* check whether modifier has been removed */ - if( !value->md ) - return (ModifierData *)EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This modifier has been removed!" ); - - /* find the modifier in the object's list */ - for( md = self->object->modifiers.first; md; md = md->next ) - if( md == value->md ) - return md; - - /* return exception if we can't find the modifier */ - return (ModifierData *)EXPP_ReturnPyObjError( PyExc_AttributeError, - "This modifier is not in the object's stack" ); -} - -/* create a new modifier at the end of the list */ - -static PyObject *ModSeq_append( BPy_ModSeq *self, PyObject *value ) -{ - int type = PyInt_AsLong(value); - - /* type 0 is eModifierType_None, should we be able to add one of these? */ - if( type <= 0 || type >= NUM_MODIFIER_TYPES ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Not an int or argument out of range, expected an int from Blender.Modifier.Type" ); - - BLI_addtail( &self->object->modifiers, modifier_new( type ) ); - return Modifier_CreatePyObject( self->object, self->object->modifiers.last ); -} - -/* remove an existing modifier */ - -static PyObject *ModSeq_remove( BPy_ModSeq *self, BPy_Modifier *value ) -{ - ModifierData *md = locate_modifier( self, value ); - - /* if we can't locate the modifier, return (exception already set) */ - if( !md ) - return (PyObject *)NULL; - - /* do the actual removal */ - BLI_remlink( &self->object->modifiers, md ); - modifier_free( md ); - - /* erase the link to the modifier */ - value->md = NULL; - - Py_RETURN_NONE; -} - -/* move the modifier up in the stack */ - -static PyObject *ModSeq_moveUp( BPy_ModSeq * self, BPy_Modifier * value ) -{ - ModifierData *md = locate_modifier( self, value ); - - /* if we can't locate the modifier, return (exception already set) */ - if( !md ) - return (PyObject *)NULL; - - if( mod_moveUp( self->object, md ) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot move above a modifier requiring original data" ); - - Py_RETURN_NONE; -} - -/* move the modifier down in the stack */ - -static PyObject *ModSeq_moveDown( BPy_ModSeq * self, BPy_Modifier *value ) -{ - ModifierData *md = locate_modifier( self, value ); - - /* if we can't locate the modifier, return (exception already set) */ - if( !md ) - return (PyObject *)NULL; - - if( mod_moveDown( self->object, md ) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot move beyond a non-deforming modifier" ); - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Python BPy_ModSeq methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_ModSeq_methods[] = { - /* name, method, flags, doc */ - {"append", ( PyCFunction ) ModSeq_append, METH_O, - "(type) - add a new modifier, where type is the type of modifier"}, - {"remove", ( PyCFunction ) ModSeq_remove, METH_O, - "(modifier) - remove an existing modifier, where modifier is a modifier from this object."}, - {"moveUp", ( PyCFunction ) ModSeq_moveUp, METH_O, - "(modifier) - Move a modifier up in stack"}, - {"moveDown", ( PyCFunction ) ModSeq_moveDown, METH_O, - "(modifier) - Move a modifier down in stack"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python ModSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject ModSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Modifiers", /* char *tp_name; */ - sizeof( BPy_ModSeq ), /* 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 ) NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &ModSeq_as_sequence, /* 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 */ - ( getiterfunc )ModSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc )ModSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_ModSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 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 -}; - -/*****************************************************************************/ -/* Function: ModSeq_CreatePyObject */ -/* Description: This function will create a new BPy_ModSeq from an */ -/* existing ListBase structure. */ -/*****************************************************************************/ -PyObject *ModSeq_CreatePyObject( Object *ob, ModifierData *iter ) -{ - BPy_ModSeq *pymod; - pymod = ( BPy_ModSeq * ) PyObject_NEW( BPy_ModSeq, &ModSeq_Type ); - if( !pymod ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_ModSeq object" ); - pymod->object = ob; - pymod->iter = iter; - return ( PyObject * ) pymod; -} - -static PyObject *M_Modifier_TypeDict( void ) -{ - PyObject *S = PyConstant_New( ); - - if( S ) { - BPy_constant *d = ( BPy_constant * ) S; - - PyConstant_Insert( d, "SUBSURF", - PyInt_FromLong( eModifierType_Subsurf ) ); - PyConstant_Insert( d, "ARMATURE", - PyInt_FromLong( eModifierType_Armature ) ); - PyConstant_Insert( d, "LATTICE", - PyInt_FromLong( eModifierType_Lattice ) ); - PyConstant_Insert( d, "CURVE", - PyInt_FromLong( eModifierType_Curve ) ); - PyConstant_Insert( d, "BUILD", - PyInt_FromLong( eModifierType_Build ) ); - PyConstant_Insert( d, "MIRROR", - PyInt_FromLong( eModifierType_Mirror ) ); - PyConstant_Insert( d, "DECIMATE", - PyInt_FromLong( eModifierType_Decimate ) ); - PyConstant_Insert( d, "WAVE", - PyInt_FromLong( eModifierType_Wave ) ); - PyConstant_Insert( d, "BOOLEAN", - PyInt_FromLong( eModifierType_Boolean ) ); - PyConstant_Insert( d, "ARRAY", - PyInt_FromLong( eModifierType_Array ) ); - PyConstant_Insert( d, "EDGESPLIT", - PyInt_FromLong( eModifierType_EdgeSplit ) ); - PyConstant_Insert( d, "SMOOTH", - PyInt_FromLong( eModifierType_Smooth ) ); - PyConstant_Insert( d, "CAST", - PyInt_FromLong( eModifierType_Cast ) ); - PyConstant_Insert( d, "DISPLACE", - PyInt_FromLong( eModifierType_Displace ) ); - } - return S; -} - - -static PyObject *M_Modifier_SettingsDict( void ) -{ - PyObject *S = PyConstant_New( ); - - if( S ) { - BPy_constant *d = ( BPy_constant * ) S; - -/* -# The lines below are a python script that uses the enum variables to create -# the lines below -# START PYSCRIPT -st=''' - EXPP_MOD_RENDER = 0, - EXPP_MOD_REALTIME, - EXPP_MOD_EDITMODE, - etc.. copy from above -''' - -base= ''' - PyConstant_Insert( d, "%s", - PyInt_FromLong( EXPP_MOD_%s ) ); -''' -for var in st.replace(',','').split('\n'): - - var= var.split() - if not var: continue - var= var[0] - if (not var) or var.startswith('/'): continue - - var='_'.join(var.split('_')[2:]) - print base % (var, var), -# END PYSCRIPT -*/ - - /*Auto generated from the above script*/ - PyConstant_Insert( d, "RENDER", - PyInt_FromLong( EXPP_MOD_RENDER ) ); - PyConstant_Insert( d, "REALTIME", - PyInt_FromLong( EXPP_MOD_REALTIME ) ); - PyConstant_Insert( d, "EDITMODE", - PyInt_FromLong( EXPP_MOD_EDITMODE ) ); - PyConstant_Insert( d, "ONCAGE", - PyInt_FromLong( EXPP_MOD_ONCAGE ) ); - PyConstant_Insert( d, "OBJECT", - PyInt_FromLong( EXPP_MOD_OBJECT ) ); - PyConstant_Insert( d, "VERTGROUP", - PyInt_FromLong( EXPP_MOD_VERTGROUP ) ); - PyConstant_Insert( d, "LIMIT", - PyInt_FromLong( EXPP_MOD_LIMIT ) ); - PyConstant_Insert( d, "FLAG", - PyInt_FromLong( EXPP_MOD_FLAG ) ); - PyConstant_Insert( d, "COUNT", - PyInt_FromLong( EXPP_MOD_COUNT ) ); - PyConstant_Insert( d, "LENGTH", - PyInt_FromLong( EXPP_MOD_LENGTH ) ); - PyConstant_Insert( d, "FACTOR", - PyInt_FromLong( EXPP_MOD_FACTOR ) ); - PyConstant_Insert( d, "ENABLE_X", - PyInt_FromLong( EXPP_MOD_ENABLE_X ) ); - PyConstant_Insert( d, "ENABLE_Y", - PyInt_FromLong( EXPP_MOD_ENABLE_Y ) ); - PyConstant_Insert( d, "ENABLE_Z", - PyInt_FromLong( EXPP_MOD_ENABLE_Z ) ); - PyConstant_Insert( d, "TYPES", - PyInt_FromLong( EXPP_MOD_TYPES ) ); - PyConstant_Insert( d, "LEVELS", - PyInt_FromLong( EXPP_MOD_LEVELS ) ); - PyConstant_Insert( d, "RENDLEVELS", - PyInt_FromLong( EXPP_MOD_RENDLEVELS ) ); - PyConstant_Insert( d, "OPTIMAL", - PyInt_FromLong( EXPP_MOD_OPTIMAL ) ); - PyConstant_Insert( d, "UV", - PyInt_FromLong( EXPP_MOD_UV ) ); - PyConstant_Insert( d, "ENVELOPES", - PyInt_FromLong( EXPP_MOD_ENVELOPES ) ); - PyConstant_Insert( d, "OBJECT_OFFSET", - PyInt_FromLong( EXPP_MOD_OBJECT_OFFSET ) ); - PyConstant_Insert( d, "OBJECT_CURVE", - PyInt_FromLong( EXPP_MOD_OBJECT_CURVE ) ); - PyConstant_Insert( d, "OFFSET_VEC", - PyInt_FromLong( EXPP_MOD_OFFSET_VEC ) ); - PyConstant_Insert( d, "SCALE_VEC", - PyInt_FromLong( EXPP_MOD_SCALE_VEC ) ); - PyConstant_Insert( d, "MERGE_DIST", - PyInt_FromLong( EXPP_MOD_MERGE_DIST ) ); - PyConstant_Insert( d, "START", - PyInt_FromLong( EXPP_MOD_START ) ); - PyConstant_Insert( d, "SEED", - PyInt_FromLong( EXPP_MOD_SEED ) ); - PyConstant_Insert( d, "RANDOMIZE", - PyInt_FromLong( EXPP_MOD_RANDOMIZE ) ); - PyConstant_Insert( d, "AXIS_X", - PyInt_FromLong( EXPP_MOD_AXIS_X ) ); - PyConstant_Insert( d, "AXIS_Y", - PyInt_FromLong( EXPP_MOD_AXIS_Y ) ); - PyConstant_Insert( d, "AXIS_Z", - PyInt_FromLong( EXPP_MOD_AXIS_Z ) ); - PyConstant_Insert( d, "RATIO", - PyInt_FromLong( EXPP_MOD_RATIO ) ); - PyConstant_Insert( d, "STARTX", - PyInt_FromLong( EXPP_MOD_STARTX ) ); - PyConstant_Insert( d, "STARTY", - PyInt_FromLong( EXPP_MOD_STARTY ) ); - PyConstant_Insert( d, "HEIGHT", - PyInt_FromLong( EXPP_MOD_HEIGHT ) ); - PyConstant_Insert( d, "WIDTH", - PyInt_FromLong( EXPP_MOD_WIDTH ) ); - PyConstant_Insert( d, "NARROW", - PyInt_FromLong( EXPP_MOD_NARROW ) ); - PyConstant_Insert( d, "SPEED", - PyInt_FromLong( EXPP_MOD_SPEED ) ); - PyConstant_Insert( d, "DAMP", - PyInt_FromLong( EXPP_MOD_DAMP ) ); - PyConstant_Insert( d, "LIFETIME", - PyInt_FromLong( EXPP_MOD_LIFETIME ) ); - PyConstant_Insert( d, "TIMEOFFS", - PyInt_FromLong( EXPP_MOD_TIMEOFFS ) ); - PyConstant_Insert( d, "OPERATION", - PyInt_FromLong( EXPP_MOD_OPERATION ) ); - PyConstant_Insert( d, "EDGESPLIT_ANGLE", - PyInt_FromLong( EXPP_MOD_EDGESPLIT_ANGLE ) ); - PyConstant_Insert( d, "EDGESPLIT_FROM_ANGLE", - PyInt_FromLong( EXPP_MOD_EDGESPLIT_FROM_ANGLE ) ); - PyConstant_Insert( d, "EDGESPLIT_FROM_SHARP", - PyInt_FromLong( EXPP_MOD_EDGESPLIT_FROM_SHARP ) ); - PyConstant_Insert( d, "UVLAYER", - PyInt_FromLong( EXPP_MOD_UVLAYER ) ); - PyConstant_Insert( d, "MID_LEVEL", - PyInt_FromLong( EXPP_MOD_MID_LEVEL ) ); - PyConstant_Insert( d, "STRENGTH", - PyInt_FromLong( EXPP_MOD_STRENGTH ) ); - PyConstant_Insert( d, "TEXTURE", - PyInt_FromLong( EXPP_MOD_TEXTURE ) ); - PyConstant_Insert( d, "MAPPING", - PyInt_FromLong( EXPP_MOD_MAPPING ) ); - PyConstant_Insert( d, "DIRECTION", - PyInt_FromLong( EXPP_MOD_DIRECTION ) ); - PyConstant_Insert( d, "REPEAT", - PyInt_FromLong( EXPP_MOD_REPEAT ) ); - PyConstant_Insert( d, "RADIUS", - PyInt_FromLong( EXPP_MOD_RADIUS ) ); - PyConstant_Insert( d, "SIZE", - PyInt_FromLong( EXPP_MOD_SIZE ) ); - PyConstant_Insert( d, "USE_OB_TRANSFORM", - PyInt_FromLong( EXPP_MOD_USE_OB_TRANSFORM ) ); - PyConstant_Insert( d, "SIZE_FROM_RADIUS", - PyInt_FromLong( EXPP_MOD_SIZE_FROM_RADIUS ) ); - /*End Auto generated code*/ - } - return S; -} - -/*****************************************************************************/ -/* Function: Modifier_Init */ -/*****************************************************************************/ -PyObject *Modifier_Init( void ) -{ - PyObject *submodule; - PyObject *TypeDict = M_Modifier_TypeDict( ); - PyObject *SettingsDict = M_Modifier_SettingsDict( ); - - if( PyType_Ready( &ModSeq_Type ) < 0 || - PyType_Ready( &Modifier_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Modifier", NULL, - "Modifer module for accessing and creating object modifier data" ); - - if( TypeDict ) { - PyModule_AddObject( submodule, "Type", TypeDict ); /* deprecated */ - /* since PyModule_AddObject() steals a reference, we need to - incref TypeDict to use it again */ - Py_INCREF( TypeDict); - PyModule_AddObject( submodule, "Types", TypeDict ); - } - - if( SettingsDict ) - PyModule_AddObject( submodule, "Settings", SettingsDict ); - - return submodule; -} diff --git a/source/blender/python/api2_2x/Modifier.h b/source/blender/python/api2_2x/Modifier.h deleted file mode 100644 index 12afc591c2c..00000000000 --- a/source/blender/python/api2_2x/Modifier.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * $Id: Modifier.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_MODIFIER_H -#define EXPP_MODIFIER_H - -#include -#include "DNA_object_types.h" -#include "DNA_modifier_types.h" -#include "DNA_listBase.h" - -/*****************************************************************************/ -/* Python BPy_Modifier and BPy_ModSeq structure definition: */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD /* required macro */ - Object *object; - ModifierData *iter; -} BPy_ModSeq; - -typedef struct { - PyObject_HEAD /* required macro */ - Object *object; - /* if md this is null, the modifier has been removed and we need to raise - an error when its data is accessed */ - ModifierData *md; -} BPy_Modifier; - -extern PyTypeObject ModSeq_Type; -extern PyTypeObject Modifier_Type; -#define BPy_ModSeq_Check(v) ((v)->ob_type == &ModSeq_Type) -#define BPy_Modifier_Check(v) ((v)->ob_type == &Modifier_Type) - -/* - * prototypes - */ - -PyObject *Modifier_Init( void ); -PyObject *ModSeq_CreatePyObject( Object *obj, ModifierData *iter ); -PyObject *Modifier_CreatePyObject( Object *obj, ModifierData *md ); -ModifierData *Modifier_FromPyObject( PyObject * py_obj ); - -#endif /* EXPP_MODIFIER_H */ diff --git a/source/blender/python/api2_2x/NLA.c b/source/blender/python/api2_2x/NLA.c deleted file mode 100644 index a0bdaa83d07..00000000000 --- a/source/blender/python/api2_2x/NLA.c +++ /dev/null @@ -1,1590 +0,0 @@ -/* - * $Id: NLA.c 11907 2007-08-31 18:21:12Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "NLA.h" /*This must come first*/ - -#include "DNA_curve_types.h" -#include "DNA_scene_types.h" -#include "BKE_action.h" -#include "BKE_nla.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_library.h" -#include "BLI_blenlib.h" -#include "Object.h" -#include "Ipo.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "blendef.h" -#include "MEM_guardedalloc.h" - -#define ACTSTRIP_STRIDEAXIS_X 0 -#define ACTSTRIP_STRIDEAXIS_Y 1 -#define ACTSTRIP_STRIDEAXIS_Z 2 - -/*****************************************************************************/ -/* Python API function prototypes for the NLA module. */ -/*****************************************************************************/ -static PyObject *M_NLA_NewAction( PyObject * self, PyObject * args ); -static PyObject *M_NLA_CopyAction( PyObject * self, PyObject * args ); -static PyObject *M_NLA_GetActions( PyObject * self ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Armature.NLA.__doc__ */ -/*****************************************************************************/ -char M_NLA_doc[] = - "The Blender NLA module -This module provides control over Armature keyframing in Blender."; -char M_NLA_NewAction_doc[] = - "(name) - Create new action for linking to an object."; -char M_NLA_CopyAction_doc[] = "(name) - Copy action and return copy."; -char M_NLA_GetActions_doc[] = "(name) - Returns a dictionary of actions."; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Armature.NLA module: */ -/*****************************************************************************/ -struct PyMethodDef M_NLA_methods[] = { - {"NewAction", ( PyCFunction ) M_NLA_NewAction, METH_VARARGS, - M_NLA_NewAction_doc}, - {"CopyAction", ( PyCFunction ) M_NLA_CopyAction, METH_VARARGS, - M_NLA_CopyAction_doc}, - {"GetActions", ( PyCFunction ) M_NLA_GetActions, METH_NOARGS, - M_NLA_GetActions_doc}, - {NULL, NULL, 0, NULL} -}; -/*****************************************************************************/ -/* Python BPy_Action methods declarations: */ -/*****************************************************************************/ -static PyObject *Action_setActive( BPy_Action * self, PyObject * args ); -static PyObject *Action_getFrameNumbers(BPy_Action *self); -static PyObject *Action_getChannelIpo( BPy_Action * self, PyObject * value ); -static PyObject *Action_getChannelNames( BPy_Action * self ); -static PyObject *Action_renameChannel( BPy_Action * self, PyObject * args ); -static PyObject *Action_verifyChannel( BPy_Action * self, PyObject * value ); -static PyObject *Action_removeChannel( BPy_Action * self, PyObject * value ); -static PyObject *Action_getAllChannelIpos( BPy_Action * self ); - -/*****************************************************************************/ -/* Python BPy_Action methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Action_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - return Action name"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(str) - rename Action"}, - {"setActive", ( PyCFunction ) Action_setActive, METH_VARARGS, - "(str) -set this action as the active action for an object"}, - {"getFrameNumbers", (PyCFunction) Action_getFrameNumbers, METH_NOARGS, - "() - get the frame numbers at which keys have been inserted"}, - {"getChannelIpo", ( PyCFunction ) Action_getChannelIpo, METH_O, - "(str) -get the Ipo from a named action channel in this action"}, - {"getChannelNames", ( PyCFunction ) Action_getChannelNames, METH_NOARGS, - "() -get the channel names for this action"}, - {"renameChannel", ( PyCFunction ) Action_renameChannel, METH_VARARGS, - "(from, to) -rename the channel from string to string"}, - {"verifyChannel", ( PyCFunction ) Action_verifyChannel, METH_O, - "(str) -verify the channel in this action"}, - {"removeChannel", ( PyCFunction ) Action_removeChannel, METH_O, - "(str) -remove the channel from the action"}, - {"getAllChannelIpos", ( PyCFunction ) Action_getAllChannelIpos, - METH_NOARGS, - "() - Return a dict of (name:ipo)-keys containing each channel in the object's action"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python TypeAction callback function prototypes: */ -/*****************************************************************************/ -static int Action_compare( BPy_Action * a, BPy_Action * b ); -static PyObject *Action_repr( BPy_Action * bone ); - -/*-------------------------------------------------------------------------*/ -static PyObject *M_NLA_NewAction( PyObject * self_unused, PyObject * args ) -{ - char *name_str = "DefaultAction"; - BPy_Action *py_action = NULL; /* for Action Data object wrapper in Python */ - bAction *bl_action = NULL; /* for actual Action Data we create in Blender */ - - if( !PyArg_ParseTuple( args, "|s", &name_str ) ) { - EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string or nothing" ); - return NULL; - } - /* Create new action globally */ - bl_action = alloc_libblock( &G.main->action, ID_AC, name_str ); - bl_action->id.flag |= LIB_FAKEUSER; /* no need to assign a user because alloc_libblock alredy assigns one */ - - - /* now create the wrapper obj in Python */ - if( bl_action ) - py_action = - ( BPy_Action * ) PyObject_NEW( BPy_Action, - &Action_Type ); - else { - EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Action Data in Blender" ); - return NULL; - } - - if( py_action == NULL ) { - EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Action Data object" ); - return NULL; - } - - py_action->action = bl_action; /* link Python action wrapper with Blender Action */ - - Py_INCREF( py_action ); - return ( PyObject * ) py_action; -} - -static PyObject *M_NLA_CopyAction( PyObject * self_unused, PyObject * args ) -{ - BPy_Action *py_action = NULL; - bAction *copyAction = NULL; - - if( !PyArg_ParseTuple( args, "O!", &Action_Type, &py_action ) ) { - EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected python action type" ); - return NULL; - } - copyAction = copy_action( py_action->action ); - return Action_CreatePyObject( copyAction ); -} - -static PyObject *M_NLA_GetActions( PyObject * self_unused ) -{ - PyObject *dict = PyDict_New( ); - bAction *action = NULL; - - for( action = G.main->action.first; action; action = action->id.next ) { - PyObject *py_action = Action_CreatePyObject( action ); - if( py_action ) { - /* Insert dict entry using the bone name as key */ - if( PyDict_SetItemString - ( dict, action->id.name + 2, py_action ) != 0 ) { - Py_DECREF( py_action ); - Py_DECREF( dict ); - - return EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "NLA_GetActions: couldn't set dict item" ); - } - Py_DECREF( py_action ); - } else { - Py_DECREF( dict ); - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "NLA_GetActions: could not create Action object" ) ); - } - } - return dict; -} - -static PyObject *Action_getFrameNumbers(BPy_Action *self) -{ - bActionChannel *achan = NULL; - IpoCurve *icu = NULL; - BezTriple *bezt = NULL; - int verts; - PyObject *py_list = NULL; - - py_list = PyList_New(0); - for(achan = self->action->chanbase.first; achan; achan = achan->next){ - if (achan->ipo) { - for (icu = achan->ipo->curve.first; icu; icu = icu->next){ - bezt= icu->bezt; - if(bezt) { - verts = icu->totvert; - while(verts--) { - PyObject *value; - value = PyInt_FromLong((int)bezt->vec[1][0]); - if ( PySequence_Contains(py_list, value) == 0){ - PyList_Append(py_list, value); - } - Py_DECREF(value); - bezt++; - } - } - } - } - } - PyList_Sort(py_list); - return EXPP_incr_ret(py_list); -} - -static PyObject *Action_setActive( BPy_Action * self, PyObject * args ) -{ - BPy_Object *object; - - if( !self->action ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get attribute from a NULL action" ); - - if( !PyArg_ParseTuple( args, "O!", &Object_Type, &object ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected python object argument" ); - - if( object->object->type != OB_ARMATURE ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object not of type armature" ); - - /* if object is already attached to an action, decrement user count */ - if( object->object->action ) - --object->object->action->id.us; - - /* set the active action to object */ - object->object->action = self->action; - ++object->object->action->id.us; - - Py_RETURN_NONE; -} - -static PyObject *Action_getChannelIpo( BPy_Action * self, PyObject * value ) -{ - char *chanName = PyString_AsString(value); - bActionChannel *chan; - - if( !chanName ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "string expected" ); - - chan = get_action_channel( self->action, chanName ); - if( !chan ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "no channel with that name" ); - - if( !chan->ipo ) { - Py_RETURN_NONE; - } - - return Ipo_CreatePyObject( chan->ipo ); -} - -static PyObject *Action_getChannelNames( BPy_Action * self ) -{ - PyObject *list = PyList_New( BLI_countlist(&(self->action->chanbase)) ); - bActionChannel *chan = NULL; - int index=0; - for( chan = self->action->chanbase.first; chan; chan = chan->next ) { - PyList_SetItem( list, index, PyString_FromString(chan->name) ); - index++; - } - return list; -} - -static PyObject *Action_renameChannel( BPy_Action * self, PyObject * args ) -{ - char *chanFrom, *chanTo; - bActionChannel *chan; - - if( !PyArg_ParseTuple( args, "ss", &chanFrom, &chanTo ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "2 strings expected" ); - - chan = get_action_channel( self->action, chanFrom ); - if( !chan ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "no channel with that name" ); - if (strlen(chanTo) > 31) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "new name greater then 31 characters long" ); - - if (get_action_channel( self->action, chanTo )) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "channel target name alredy exists" ); - - strcpy(chan->name, chanTo); - - Py_RETURN_NONE; -} - -/*----------------------------------------------------------------------*/ -static PyObject *Action_verifyChannel( BPy_Action * self, PyObject * value ) -{ - char *chanName = PyString_AsString(value); - bActionChannel *chan; - - if( !self->action ) - ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create channel for a NULL action" ) ); - - if( !chanName ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string argument" ) ); - - chan = verify_action_channel(self->action, chanName); - - Py_RETURN_NONE; -} - - -static PyObject *Action_removeChannel( BPy_Action * self, PyObject * value ) -{ - char *chanName = PyString_AsString(value); - bActionChannel *chan; - - if( !chanName ) - return (EXPP_ReturnPyObjError( PyExc_AttributeError, - "string expected" )); - - - chan = get_action_channel( self->action, chanName ); - if( chan == NULL ) { - EXPP_ReturnPyObjError( PyExc_AttributeError, - "no channel with that name..." ); - return NULL; - } - /*release ipo*/ - if( chan->ipo ) - chan->ipo->id.us--; - - /*remove channel*/ - BLI_freelinkN( &self->action->chanbase, chan ); - - Py_RETURN_NONE; -} - -static PyObject *Action_getAllChannelIpos( BPy_Action * self ) -{ - PyObject *dict = PyDict_New( ); - bActionChannel *chan = NULL; - - for( chan = self->action->chanbase.first; chan; chan = chan->next ) { - PyObject *ipo_attr; - if( chan->ipo ) - ipo_attr = Ipo_CreatePyObject( chan->ipo ); - else { - ipo_attr = Py_None; - Py_INCREF( ipo_attr ); - } - if( ipo_attr ) { - /* Insert dict entry using the bone name as key*/ - if( PyDict_SetItemString( dict, chan->name, ipo_attr ) - != 0 ) { - Py_DECREF( ipo_attr ); - Py_DECREF( dict ); - - return EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "Action_getAllChannelIpos: couldn't set dict item" ); - } - Py_DECREF( ipo_attr ); - } else { - Py_DECREF( dict ); - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Action_getAllChannelIpos: could not create Ipo object" ) ); - } - } - return dict; -} - -/*----------------------------------------------------------------------*/ -static int Action_compare( BPy_Action * a, BPy_Action * b ) -{ - return ( a->action == b->action ) ? 0 : -1; -} - -/*----------------------------------------------------------------------*/ -static PyObject *Action_repr( BPy_Action * self ) -{ - if( self->action ) - return PyString_FromFormat( "[Action \"%s\"]", - self->action->id.name + 2 ); - else - return PyString_FromString( "NULL" ); -} - -/*----------------------------------------------------------------------*/ -PyObject *Action_CreatePyObject( struct bAction * act ) -{ - BPy_Action *blen_action; - - if(!act) Py_RETURN_NONE; - - blen_action = - ( BPy_Action * ) PyObject_NEW( BPy_Action, &Action_Type ); - - if( !blen_action) { - return ( EXPP_ReturnPyObjError - ( PyExc_RuntimeError, "failure to create object!" ) ); - } - blen_action->action = act; - return ( ( PyObject * ) blen_action ); -} - -/*----------------------------------------------------------------------*/ -struct bAction *Action_FromPyObject( PyObject * py_obj ) -{ - BPy_Action *blen_obj; - - blen_obj = ( BPy_Action * ) py_obj; - return ( blen_obj->action ); -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Action_getseters[] = { - GENERIC_LIB_GETSETATTR, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python TypeAction structure definition: */ -/*****************************************************************************/ -PyTypeObject Action_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "Blender Action", /* tp_name */ - sizeof( BPy_Action ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - NULL, /* tp_print */ - NULL, /* tp_getattr */ - NULL, /* tp_setattr */ - ( cmpfunc ) Action_compare, /* tp_compare */ - ( reprfunc ) Action_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Action_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Action_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 -}; - - - -/*****************************************************************************/ -/* ActionStrip wrapper */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* Python BPy_ActionStrip attributes: */ -/*****************************************************************************/ - -/* - * return the action for the action strip - */ - -static PyObject *ActionStrip_getAction( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return Action_CreatePyObject( self->strip->act ); -} - -/* - * return the start frame of the action strip - */ - -static PyObject *ActionStrip_getStripStart( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( self->strip->start ); -} - -/* - * set the start frame of the action strip - */ - -static int ActionStrip_setStripStart( BPy_ActionStrip * self, PyObject * value ) -{ - int retval; - - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - retval = EXPP_setFloatClamped( value, &self->strip->start, - -1000.0, self->strip->end-1 ); - if( !retval ) { - float max = self->strip->end - self->strip->start; - if( self->strip->blendin > max ) - self->strip->blendin = max; - if( self->strip->blendout > max ) - self->strip->blendout = max; - } - return retval; -} - -/* - * return the ending frame of the action strip - */ - -static PyObject *ActionStrip_getStripEnd( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( self->strip->end ); -} - -/* - * set the ending frame of the action strip - */ - -static int ActionStrip_setStripEnd( BPy_ActionStrip * self, PyObject * value ) -{ - int retval; - - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - retval = EXPP_setFloatClamped( value, &self->strip->end, - self->strip->start+1, MAXFRAMEF ); - if( !retval ) { - float max = self->strip->end - self->strip->start; - if( self->strip->blendin > max ) - self->strip->blendin = max; - if( self->strip->blendout > max ) - self->strip->blendout = max; - } - return retval; -} - -/* - * return the start frame of the action - */ - -static PyObject *ActionStrip_getActionStart( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( self->strip->actstart ); -} - -/* - * set the start frame of the action - */ - -static int ActionStrip_setActionStart( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setFloatClamped( value, &self->strip->actstart, - -1000.0, self->strip->actend-1 ); -} - -/* - * return the ending frame of the action - */ - -static PyObject *ActionStrip_getActionEnd( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( self->strip->actend ); -} - -/* - * set the ending frame of the action - */ - -static int ActionStrip_setActionEnd( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setFloatClamped( value, &self->strip->actend, - self->strip->actstart+1, MAXFRAMEF ); -} - -/* - * return the repeat value of the action strip - */ - -static PyObject *ActionStrip_getRepeat( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( self->strip->repeat ); -} - -/* - * set the repeat value of the action strip - */ - -static int ActionStrip_setRepeat( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setFloatClamped( value, &self->strip->repeat, - 0.001f, 1000.0f ); -} - -/* - * return the blend in of the action strip - */ - -static PyObject *ActionStrip_getBlendIn( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( self->strip->blendin ); -} - -/* - * set the blend in value of the action strip - */ - -static int ActionStrip_setBlendIn( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setFloatClamped( value, &self->strip->blendin, - 0.0, self->strip->end - self->strip->start ); -} - -/* - * return the blend out of the action strip - */ - -static PyObject *ActionStrip_getBlendOut( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( self->strip->blendout ); -} - -/* - * set the blend out value of the action strip - */ - -static int ActionStrip_setBlendOut( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setFloatClamped( value, &self->strip->blendout, - 0.0, self->strip->end - self->strip->start ); -} - -/* - * return the blend mode of the action strip - */ - -static PyObject *ActionStrip_getBlendMode( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyInt_FromLong( (long)self->strip->mode ) ; -} - -/* - * set the blend mode value of the action strip - */ - -static int ActionStrip_setBlendMode( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setIValueRange( value, &self->strip->mode, - 0, ACTSTRIPMODE_ADD, 'h' ); -} - -/* - * return the flag settings of the action strip - */ - -#define ACTIONSTRIP_MASK (ACTSTRIP_SELECT | ACTSTRIP_USESTRIDE \ - | ACTSTRIP_HOLDLASTFRAME | ACTSTRIP_ACTIVE | ACTSTRIP_LOCK_ACTION) - -static PyObject *ActionStrip_getFlag( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyInt_FromLong( (long)( self->strip->flag & ACTIONSTRIP_MASK ) ) ; -} - -/* - * set the flag settings out value of the action strip - */ - -static int ActionStrip_setFlag( BPy_ActionStrip * self, PyObject * arg ) -{ - PyObject *num = PyNumber_Int( arg ); - int value; - - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - if( !num ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - value = PyInt_AS_LONG( num ); - Py_DECREF( num ); - - if( ( value & ACTIONSTRIP_MASK ) != value ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%04x", ACTIONSTRIP_MASK ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - - self->strip->flag = (short)value; - return 0; -} - -/* - * return the stride axis of the action strip - */ - -static PyObject *ActionStrip_getStrideAxis( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyInt_FromLong( (long)self->strip->stride_axis ) ; -} - -/* - * set the stride axis of the action strip - */ - -static int ActionStrip_setStrideAxis( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setIValueRange( value, &self->strip->stride_axis, - ACTSTRIP_STRIDEAXIS_X, ACTSTRIP_STRIDEAXIS_Z, 'h' ); -} - -/* - * return the stride length of the action strip - */ - -static PyObject *ActionStrip_getStrideLength( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyFloat_FromDouble( (double)self->strip->stridelen ) ; -} - -/* - * set the stride length of the action strip - */ - -static int ActionStrip_setStrideLength( BPy_ActionStrip * self, PyObject * value ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return EXPP_setFloatClamped( value, &self->strip->stridelen, - 0.0001f, 1000.0 ); -} - -/* - * return the stride bone name - */ - -static PyObject *ActionStrip_getStrideBone( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - return PyString_FromString( self->strip->stridechannel ); -} - -static PyObject *ActionStrip_getGroupTarget( BPy_ActionStrip * self ) -{ - if( !self->strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - if (self->strip->object) { - return Object_CreatePyObject( self->strip->object ); - } else { - Py_RETURN_NONE; - } -} - -/* - * set the stride bone name - */ - -static int ActionStrip_setStrideBone( BPy_ActionStrip * self, PyObject * attr ) -{ - char *name = PyString_AsString( attr ); - if( !name ) - return EXPP_ReturnIntError( PyExc_TypeError, "expected string arg" ); - - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - BLI_strncpy( self->strip->stridechannel, name, 32 ); - - return 0; -} - -static int ActionStrip_setGroupTarget( BPy_ActionStrip * self, PyObject * args ) -{ - if( !self->strip ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This strip has been removed!" ); - - if( (PyObject *)args == Py_None ) - self->strip->object = NULL; - else if( BPy_Object_Check( args ) ) - self->strip->object = ((BPy_Object *)args)->object; - else - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an object or None" ); - return 0; -} - -/*****************************************************************************/ -/* Python BPy_Constraint attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_ActionStrip_getseters[] = { - {"action", - (getter)ActionStrip_getAction, (setter)NULL, - "Action associated with the strip", NULL}, - {"stripStart", - (getter)ActionStrip_getStripStart, (setter)ActionStrip_setStripStart, - "Starting frame of the strip", NULL}, - {"stripEnd", - (getter)ActionStrip_getStripEnd, (setter)ActionStrip_setStripEnd, - "Ending frame of the strip", NULL}, - {"actionStart", - (getter)ActionStrip_getActionStart, (setter)ActionStrip_setActionStart, - "Starting frame of the action", NULL}, - {"actionEnd", - (getter)ActionStrip_getActionEnd, (setter)ActionStrip_setActionEnd, - "Ending frame of the action", NULL}, - {"repeat", - (getter)ActionStrip_getRepeat, (setter)ActionStrip_setRepeat, - "The number of times to repeat the action range", NULL}, - {"blendIn", - (getter)ActionStrip_getBlendIn, (setter)ActionStrip_setBlendIn, - "Number of frames of motion blending", NULL}, - {"blendOut", - (getter)ActionStrip_getBlendOut, (setter)ActionStrip_setBlendOut, - "Number of frames of ease-out", NULL}, - {"mode", - (getter)ActionStrip_getBlendMode, (setter)ActionStrip_setBlendMode, - "Setting of blending mode", NULL}, - {"flag", - (getter)ActionStrip_getFlag, (setter)ActionStrip_setFlag, - "Setting of blending flags", NULL}, - {"strideAxis", - (getter)ActionStrip_getStrideAxis, (setter)ActionStrip_setStrideAxis, - "Dominant axis for stride bone", NULL}, - {"strideLength", - (getter)ActionStrip_getStrideLength, (setter)ActionStrip_setStrideLength, - "Distance covered by one complete cycle of the action", NULL}, - {"strideBone", - (getter)ActionStrip_getStrideBone, (setter)ActionStrip_setStrideBone, - "Name of Bone used for stride", NULL}, - {"groupTarget", - (getter)ActionStrip_getGroupTarget, (setter)ActionStrip_setGroupTarget, - "Name of target armature within group", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python BPy_ActionStrip methods: */ -/*****************************************************************************/ - -/* - * restore the values of ActionStart and ActionEnd to their defaults - */ - -static PyObject *ActionStrip_resetLimits( BPy_ActionStrip *self ) -{ - bActionStrip *strip = self->strip; - - if( !strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - calc_action_range( strip->act, &strip->actstart, &strip->actend, 1 ); - - Py_RETURN_NONE; -} - -/* - * reset the strip size - */ - -static PyObject *ActionStrip_resetStripSize( BPy_ActionStrip *self ) -{ - float mapping; - bActionStrip *strip = self->strip; - - if( !strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - mapping = (strip->actend - strip->actstart) / (strip->end - strip->start); - strip->end = strip->start + mapping*(strip->end - strip->start); - - Py_RETURN_NONE; -} - -/* - * snap to start and end to nearest frames - */ - -static PyObject *ActionStrip_snapToFrame( BPy_ActionStrip *self ) -{ - bActionStrip *strip = self->strip; - - if( !strip ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - - strip->start= (float)floor(strip->start+0.5); - strip->end= (float)floor(strip->end+0.5); - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Python BPy_ActionStrip methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_ActionStrip_methods[] = { - /* name, method, flags, doc */ - {"resetActionLimits", ( PyCFunction ) ActionStrip_resetLimits, METH_NOARGS, - "Restores the values of ActionStart and ActionEnd to their defaults"}, - {"resetStripSize", ( PyCFunction ) ActionStrip_resetStripSize, METH_NOARGS, - "Resets the Action Strip size to its creation values"}, - {"snapToFrame", ( PyCFunction ) ActionStrip_snapToFrame, METH_NOARGS, - "Snaps the ends of the action strip to the nearest whole numbered frame"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python ActionStrip_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject ActionStrip_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.ActionStrip", /* char *tp_name; */ - sizeof( BPy_ActionStrip ), /* 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 ) NULL, /* 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 ***/ - BPy_ActionStrip_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_ActionStrip_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 -}; - -static PyObject *M_ActionStrip_FlagsDict( void ) -{ - PyObject *S = PyConstant_New( ); - - if( S ) { - BPy_constant *d = ( BPy_constant * ) S; - PyConstant_Insert( d, "SELECT", - PyInt_FromLong( ACTSTRIP_SELECT ) ); - PyConstant_Insert( d, "STRIDE_PATH", - PyInt_FromLong( ACTSTRIP_USESTRIDE ) ); - PyConstant_Insert( d, "HOLD", - PyInt_FromLong( ACTSTRIP_HOLDLASTFRAME ) ); - PyConstant_Insert( d, "ACTIVE", - PyInt_FromLong( ACTSTRIP_ACTIVE ) ); - PyConstant_Insert( d, "LOCK_ACTION", - PyInt_FromLong( ACTSTRIP_LOCK_ACTION ) ); - } - return S; -} - -static PyObject *M_ActionStrip_AxisDict( void ) -{ - PyObject *S = PyConstant_New( ); - - if( S ) { - BPy_constant *d = ( BPy_constant * ) S; - PyConstant_Insert( d, "STRIDEAXIS_X", - PyInt_FromLong( ACTSTRIP_STRIDEAXIS_X ) ); - PyConstant_Insert( d, "STRIDEAXIS_Y", - PyInt_FromLong( ACTSTRIP_STRIDEAXIS_Y ) ); - PyConstant_Insert( d, "STRIDEAXIS_Z", - PyInt_FromLong( ACTSTRIP_STRIDEAXIS_Z ) ); - } - return S; -} - -static PyObject *M_ActionStrip_ModeDict( void ) -{ - PyObject *S = PyConstant_New( ); - - if( S ) { - BPy_constant *d = ( BPy_constant * ) S; - PyConstant_Insert( d, "MODE_ADD", - PyInt_FromLong( ACTSTRIPMODE_ADD ) ); - } - return S; -} - -PyObject *ActionStrip_CreatePyObject( struct bActionStrip *strip ) -{ - BPy_ActionStrip *pyobj; - pyobj = ( BPy_ActionStrip * ) PyObject_NEW( BPy_ActionStrip, - &ActionStrip_Type ); - if( !pyobj ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_ActionStrip object" ); - pyobj->strip = strip; - return ( PyObject * ) pyobj; -} - -/*****************************************************************************/ -/* ActionStrip Sequence wrapper */ -/*****************************************************************************/ - -/* - * Initialize the iterator - */ - -static PyObject *ActionStrips_getIter( BPy_ActionStrips * self ) -{ - self->iter = (bActionStrip *)self->ob->nlastrips.first; - return EXPP_incr_ret ( (PyObject *) self ); -} - -/* - * Get the next action strip - */ - -static PyObject *ActionStrips_nextIter( BPy_ActionStrips * self ) -{ - bActionStrip *strip = self->iter; - if( strip ) { - self->iter = strip->next; - return ActionStrip_CreatePyObject( strip ); - } - - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); -} - -/* return the number of action strips */ - -static int ActionStrips_length( BPy_ActionStrips * self ) -{ - return BLI_countlist( &self->ob->nlastrips ); -} - -/* return an action strip */ - -static PyObject *ActionStrips_item( BPy_ActionStrips * self, int i ) -{ - bActionStrip *strip = NULL; - - /* if index is negative, start counting from the end of the list */ - if( i < 0 ) - i += ActionStrips_length( self ); - - /* skip through the list until we get the strip or end of list */ - - strip = self->ob->nlastrips.first; - - while( i && strip ) { - --i; - strip = strip->next; - } - - if( strip ) - return ActionStrip_CreatePyObject( strip ); - else - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); -} - -/*****************************************************************************/ -/* Python BPy_ActionStrips sequence table: */ -/*****************************************************************************/ -static PySequenceMethods ActionStrips_as_sequence = { - ( inquiry ) ActionStrips_length, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) ActionStrips_item, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - ( objobjproc ) 0, /* sq_contains */ - ( binaryfunc ) 0, /* sq_inplace_concat */ - ( intargfunc ) 0, /* sq_inplace_repeat */ -}; - - -/*****************************************************************************/ -/* Python BPy_ActionStrip methods: */ -/*****************************************************************************/ - -/* - * helper function to check for a valid action strip argument - */ - -static bActionStrip *locate_strip( BPy_ActionStrips *self, - PyObject *args, BPy_ActionStrip **stripobj ) -{ - bActionStrip *strip = NULL; - BPy_ActionStrip *pyobj; - - /* check that argument is a constraint */ - if( !PyArg_ParseTuple( args, "O!", &ActionStrip_Type, &pyobj ) ) { - EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an action strip as an argument" ); - return NULL; - } - - if( !pyobj->strip ) { - EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This strip has been removed!" ); - return NULL; - } - - /* if caller needs the object, return it */ - if( stripobj ) - *stripobj = pyobj; - - /* find the action strip in the NLA */ - for( strip = self->ob->nlastrips.first; strip; strip = strip->next ) - if( strip == pyobj->strip ) - return strip; - - /* return exception if we can't find the strip */ - EXPP_ReturnPyObjError( PyExc_AttributeError, - "action strip does not belong to this object" ); - return NULL; -} - -/* - * remove an action strip from the NLA - */ - -static PyObject *ActionStrips_remove( BPy_ActionStrips *self, PyObject * args ) -{ - BPy_ActionStrip *pyobj; - bActionStrip *strip = locate_strip( self, args, &pyobj ); - - /* return exception if we can't find the strip */ - if( !strip ) - return (PyObject *)NULL; - - /* do the actual removal */ - free_actionstrip(strip); - BLI_remlink(&self->ob->nlastrips, strip); - MEM_freeN(strip); - - pyobj->strip = NULL; - Py_RETURN_NONE; -} - -/* - * move an action strip up in the strip list - */ - -static PyObject *ActionStrips_moveUp( BPy_ActionStrips *self, PyObject * args ) -{ - bActionStrip *strip = locate_strip( self, args, NULL ); - - /* return exception if we can't find the strip */ - if( !strip ) - return (PyObject *)NULL; - - /* if strip is not already the first, move it up */ - if( strip != self->ob->nlastrips.first ) { - BLI_remlink(&self->ob->nlastrips, strip); - BLI_insertlink(&self->ob->nlastrips, strip->prev->prev, strip); - } - - Py_RETURN_NONE; -} - -/* - * move an action strip down in the strip list - */ - -static PyObject *ActionStrips_moveDown( BPy_ActionStrips *self, PyObject * args ) -{ - bActionStrip *strip = locate_strip( self, args, NULL ); - - /* return exception if we can't find the strip */ - if( !strip ) - return (PyObject *)NULL; - - /* if strip is not already the last, move it down */ - if( strip != self->ob->nlastrips.last ) { - BLI_remlink(&self->ob->nlastrips, strip); - BLI_insertlink(&self->ob->nlastrips, strip->next, strip); - } - - Py_RETURN_NONE; -} - -static PyObject *ActionStrips_append( BPy_ActionStrips *self, PyObject * args ) -{ - BPy_Action *pyobj; - Object *ob; - bActionStrip *strip; - bAction *act; - - /* check that argument is an action */ - if( !PyArg_ParseTuple( args, "O!", &Action_Type, &pyobj ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an action as an argument" ); - - ob = self->ob; - act = pyobj->action; - - /* Initialize the new action block */ - strip = MEM_callocN( sizeof(bActionStrip), "bActionStrip" ); - - strip->act = act; - calc_action_range( strip->act, &strip->actstart, &strip->actend, 1 ); - strip->start = (float)G.scene->r.cfra; - strip->end = strip->start + ( strip->actend - strip->actstart ); - /* simple prevention of zero strips */ - if( strip->start > strip->end-2 ) - strip->end = strip->start+100; - - strip->flag = ACTSTRIP_LOCK_ACTION; - find_stridechannel(ob, strip); - - strip->repeat = 1.0; - act->id.us++; - - BLI_addtail(&ob->nlastrips, strip); - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Python BPy_ActionStrips methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_ActionStrips_methods[] = { - /* name, method, flags, doc */ - {"append", ( PyCFunction ) ActionStrips_append, METH_VARARGS, - "(action) - append a new actionstrip using existing action"}, - {"remove", ( PyCFunction ) ActionStrips_remove, METH_VARARGS, - "(strip) - remove an existing strip from this actionstrips"}, - {"moveUp", ( PyCFunction ) ActionStrips_moveUp, METH_VARARGS, - "(strip) - move an existing strip up in the actionstrips"}, - {"moveDown", ( PyCFunction ) ActionStrips_moveDown, METH_VARARGS, - "(strip) - move an existing strip down in the actionstrips"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python ActionStrips_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject ActionStrips_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.ActionStrips", /* char *tp_name; */ - sizeof( BPy_ActionStrips ), /* 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 ) NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &ActionStrips_as_sequence, /* 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 */ - ( getiterfunc )ActionStrips_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc )ActionStrips_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_ActionStrips_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 0, /* long tp_dictoffset; */ - NULL, /* initproc tp_init; */ - NULL, /* allocfunc tp_alloc; */ - NULL, /* newfunc tp_new; */ - /* Low-level free-memory routine */ - NULL, /* freefunc tp_free; */ - /* For PyObject_IS_GC */ - NULL, /* inquiry tp_is_gc; */ - NULL, /* PyObject *tp_bases; */ - /* method resolution order */ - NULL, /* PyObject *tp_mro; */ - NULL, /* PyObject *tp_cache; */ - NULL, /* PyObject *tp_subclasses; */ - NULL, /* PyObject *tp_weaklist; */ - NULL -}; - -PyObject *ActionStrips_CreatePyObject( Object *ob ) -{ - BPy_ActionStrips *pyseq; - pyseq = ( BPy_ActionStrips * ) PyObject_NEW( BPy_ActionStrips, - &ActionStrips_Type ); - if( !pyseq ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_ActionStrips object" ); - pyseq->ob = ob; - return ( PyObject * ) pyseq; -} - -/*****************************************************************************/ -/* Function: NLA_Init */ -/*****************************************************************************/ -PyObject *NLA_Init( void ) -{ - PyObject *FlagsDict = M_ActionStrip_FlagsDict( ); - PyObject *AxisDict = M_ActionStrip_AxisDict( ); - PyObject *ModeDict = M_ActionStrip_ModeDict( ); - PyObject *submodule; - - if( PyType_Ready( &Action_Type ) < 0 - || PyType_Ready( &ActionStrip_Type ) < 0 - || PyType_Ready( &ActionStrips_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Armature.NLA", - M_NLA_methods, M_NLA_doc ); - - if( FlagsDict ) - PyModule_AddObject( submodule, "Flags", FlagsDict ); - if( AxisDict ) - PyModule_AddObject( submodule, "StrideAxes", AxisDict ); - if( ModeDict ) - PyModule_AddObject( submodule, "Modes", ModeDict ); - - return submodule; -} diff --git a/source/blender/python/api2_2x/NLA.h b/source/blender/python/api2_2x/NLA.h deleted file mode 100644 index 50bfa32b7e7..00000000000 --- a/source/blender/python/api2_2x/NLA.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * $Id: NLA.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joseph Gilbert, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_NLA_H -#define EXPP_NLA_H - -#include -#include "DNA_action_types.h" -#include "DNA_nla_types.h" - -struct Object; - -/** NLA module initialization function. */ -PyObject *NLA_Init( void ); - -extern PyTypeObject Action_Type; -extern PyTypeObject ActionStrip_Type; -extern PyTypeObject ActionStrips_Type; - -/** Python BPy_NLA structure definition. */ -typedef struct { - PyObject_HEAD - bAction * action; /* libdata must be second */ -} BPy_Action; - -typedef struct { - PyObject_HEAD - bActionStrip * strip; -} BPy_ActionStrip; - -typedef struct { - PyObject_HEAD - struct Object * ob; - struct bActionStrip *iter; -} BPy_ActionStrips; - -/* Type checking for EXPP PyTypes */ -#define BPy_Action_Check(v) ((v)->ob_type == &Action_Type) -#define BPy_ActionStrip_Check(v) ((v)->ob_type == &ActionStrip_Type) -#define BPy_ActionStrips_Check(v) ((v)->ob_type == &ActionStrips_Type) - -PyObject *Action_CreatePyObject( struct bAction *action ); -bAction *Action_FromPyObject( PyObject * py_obj ); - -PyObject *ActionStrip_CreatePyObject( struct bActionStrip *strip ); -PyObject *ActionStrips_CreatePyObject( struct Object *ob ); - -#endif diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c deleted file mode 100644 index 6570613e94a..00000000000 --- a/source/blender/python/api2_2x/NMesh.c +++ /dev/null @@ -1,4164 +0,0 @@ -/* - * $Id: NMesh.c 12108 2007-09-22 17:54:13Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender, but it borrows all the old NMesh code. - * - * Contributor(s): Willian P. Germano, Jordi Rovira i Bonet, Joseph Gilbert, - * Bala Gi, Alexander Szakaly, Stephane Soppera, Campbell Barton, Ken Hughes, - * Daniel Dunbar. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "NMesh.h" /*This must come first*/ - -#include "MEM_guardedalloc.h" - -#include "DNA_key_types.h" -#include "DNA_armature_types.h" -#include "DNA_scene_types.h" -#include "DNA_space_types.h" -#include "DNA_curve_types.h" - -#include "BDR_editface.h" /* make_tfaces */ -#include "BDR_vpaint.h" -#include "BDR_editobject.h" - -#include "BIF_editdeform.h" -#include "BIF_editkey.h" /* insert_meshkey */ -#include "BIF_editview.h" -#include "BIF_space.h" - -#include "BKE_customdata.h" -#include "BKE_deform.h" -#include "BKE_mesh.h" -#include "BKE_material.h" -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_DerivedMesh.h" -#include "BKE_displist.h" -#include "BKE_object.h" -#include "BKE_mball.h" -#include "BKE_utildefines.h" -#include "BKE_depsgraph.h" -#include "BKE_idprop.h" - -#include "BLI_arithb.h" -#include "BLI_blenlib.h" - -#include "blendef.h" -#include "mydevice.h" -#include "Object.h" -#include "Key.h" -#include "Mathutils.h" -#include "IDProp.h" -#include "constant.h" -#include "gen_utils.h" -#include "gen_library.h" - -extern void countall(void); - -/* EXPP Mesh defines */ - -#define NMESH_FRAME_MAX 30000 -#define NMESH_SMOOTHRESH 30 -#define NMESH_SMOOTHRESH_MIN 1 -#define NMESH_SMOOTHRESH_MAX 80 -#define NMESH_SUBDIV 1 -#define NMESH_SUBDIV_MIN 0 -#define NMESH_SUBDIV_MAX 6 - -/* Globals */ -static PyObject *g_nmeshmodule = NULL; - -static int unlink_existingMeshData( Mesh * mesh ); -static int convert_NMeshToMesh( Mesh *mesh, BPy_NMesh *nmesh ); -static void check_dverts(Mesh *me, int old_totverts); -static PyObject *NMesh_printDebug( PyObject * self ); -static PyObject *NMesh_addEdge( PyObject * self, PyObject * args ); -static PyObject *NMesh_findEdge( PyObject * self, PyObject * args ); -static PyObject *NMesh_removeEdge( PyObject * self, PyObject * args ); -static PyObject *NMesh_addFace( PyObject * self, PyObject * args ); -static PyObject *NMesh_removeFace( PyObject * self, PyObject * args ); -static PyObject *NMesh_addVertGroup( PyObject * self, PyObject * args ); -static PyObject *NMesh_removeVertGroup( PyObject * self, PyObject * args ); -static PyObject *NMesh_assignVertsToGroup( PyObject * self, PyObject * args ); -static PyObject *NMesh_removeVertsFromGroup( PyObject * self,PyObject * args ); -static PyObject *NMesh_getVertsFromGroup( PyObject * self, PyObject * args ); -static PyObject *NMesh_renameVertGroup( PyObject * self, PyObject * args ); -static PyObject *NMesh_getVertGroupNames( PyObject * self ); -static PyObject *NMesh_transform (PyObject *self, PyObject *args); - -static char NMesh_printDebug_doc[] = - "print debug info about the mesh."; - -static char NMesh_getKey_doc[] = - "get the Key object linked to this mesh"; - -static char NMesh_addEdge_doc[] = - "create an edge between two vertices.\n\ -If an edge already exists between those vertices, it is returned.\n\ -(In Blender, only zero or one edge can link two vertices.)\n\ -Created edge is automatically added to edges list."; - -static char NMesh_findEdge_doc[] = - "find an edge between two vertices."; - -static char NMesh_removeEdge_doc[] = - "remove an edge between two vertices.\n\ -All faces using this edge are removed from faces list."; - -static char NMesh_addFace_doc[] = - "add a face to face list and add to edge list (if edge data exists) necessary edges."; - -static char NMesh_removeFace_doc[] = - "remove a face for face list and remove edges no more used by any other face (if \ -edge data exists)."; - -static char NMesh_addVertGroup_doc[] = - "add a named and empty vertex(deform) Group to a mesh that has been linked\n\ -to an object. "; - -static char NMesh_removeVertGroup_doc[] = - "remove a named vertex(deform) Group from a mesh that has been linked\n\ -to an object. Will remove all verts assigned to group."; - -static char NMesh_assignVertsToGroup_doc[] = - "Adds an array (a python list) of vertex points (by index) to a named\n\ -vertex group. The list will have an associated wieght assigned to them.\n\ -The weight represents the amount of influence this group has over these\n\ -vertex points. Weights should be in the range of 0.0 - 1.0.\n\ -The assignmode can be either 'add', 'subtract', or 'replace'. If this vertex\n\ -is not assigned to the group 'add' creates a new association with the weight\n\ -specified, otherwise the weight given is added to the current weight of the\n\ -vertex.\n\ -'subtract' will attempt to subtract the weight passed from a vertex already\n\ -associated with a group, else it does nothing. 'replace' attempts to replace\n\ -the weight with the new weight value for an already associated vertex/group,\n\ -else it does nothing. The mesh must have all it's vertex points set before\n\ -attempting to assign any vertex points to a vertex group."; - -static char NMesh_removeVertsFromGroup_doc[] = - "Remove an array (a python list) of vertex points from a named group in a\n\ -mesh that has been linked to an object. If no list is given this will remove\n\ -all vertex point associations with the group passed"; - -static char NMesh_getVertsFromGroup_doc[] = - "By passing a python list of vertex indices and a named group, this will\n\ -return a python list representing the indeces that are a part of this vertex.\n\ -group. If no association was found for the index passed nothing will be\n\ -return for the index. An optional flag will also return the weights as well"; - -static char NMesh_renameVertGroup_doc[] = "Renames a vertex group"; - -static char NMesh_getVertGroupNames_doc[] = - "Returns a list of all the vertex group names"; - -static char M_NMesh_doc[] = "The Blender.NMesh submodule"; - -static char M_NMesh_Col_doc[] = "([r, g, b, a]) - Get a new mesh color\n\n\ -[r=255, g=255, b=255, a=255] Specify the color components"; - -static char M_NMesh_Face_doc[] = - "(vertexlist = None) - Get a new face, and pass optional vertex list"; - -static char NMFace_append_doc[] = - "(vert) - appends Vertex 'vert' to face vertex list"; - -static char M_NMesh_Vert_doc[] = "([x, y, z]) - Get a new vertex\n\n\ -[x, y, z] Specify new coordinates"; - -static char NMesh_getMaterials_doc[] = - "(i = -1) - Get this mesh's list of materials.\n\ -(i = -1) - int: determines the list's contents:\n\ --1: return the current list, possibly modified by the script (default);\n\ - 0: get a fresh list from the Blender mesh -- modifications not included,\n\ - unless the script called mesh.update() first;\n\ - 1: like 0, but does not ignore empty slots, returns them as 'None'."; - -static char NMesh_setMaterials_doc[] = - "(matlist) - Set this mesh's list of materials. This method makes sure\n\ -the passed matlist is valid (can only include up to 16 materials and None's)."; - -static char NMesh_addMaterial_doc[] = - "(material) - add a new Blender Material 'material' to this Mesh's materials\n\ -list."; - -static char NMesh_insertKey_doc[] = - "(frame = None, type = 'relative') - inserts a Mesh key at the given frame\n\ -if called without arguments, it inserts the key at the current Scene frame.\n\ -(type) - 'relative' or 'absolute'. Only relevant on the first call to this\n\ -function for each nmesh."; - -static char NMesh_removeAllKeys_doc[] = - "() - removes all keys from this mesh\n\ -returns True if successful or False if this NMesh wasn't linked to a real\n\ -Blender Mesh yet or the Mesh had no keys"; - -static char NMesh_getSelectedFaces_doc[] = - "(flag = None) - returns list of selected Faces\n\ -If flag = 1, return indices instead"; - -static char NMesh_getActiveFace_doc[] = - "returns the index of the active face "; - -static char NMesh_hasVertexUV_doc[] = - "(flag = None) - returns 1 if Mesh has per vertex UVs ('Sticky')\n\ -The optional argument sets the Sticky flag"; - -static char NMesh_hasFaceUV_doc[] = - "(flag = None) - returns 1 if Mesh has textured faces\n\ -The optional argument sets the textured faces flag"; - -static char NMesh_hasVertexColours_doc[] = - "(flag = None) - returns 1 if Mesh has vertex colors.\n\ -The optional argument sets the vertex color flag"; - -static char NMesh_getVertexInfluences_doc[] = - "Return a list of the influences of bones in the vertex \n\ -specified by index. The list contains pairs with the \n\ -bone name and the weight."; - -static char NMesh_update_doc[] = -"(recalc_normals = 0, store_edges = 0, vertex_shade = 0) - Updates the Mesh.\n\ -Optional arguments: if given and nonzero:\n\ -'recalc_normals': normal vectors are recalculated;\n\ -'store_edges': edges data is stored.\n\ -'vertex_shade': vertex colors are added based on the current lamp setup."; - -static char NMesh_getMode_doc[] = - "() - get the mode flags of this nmesh as an or'ed int value."; - -static char NMesh_setMode_doc[] = - "(int or none to 5 strings) - set the mode flags of this nmesh.\n\ -() - unset all flags."; - -static char NMesh_getMaxSmoothAngle_doc[] = - "() - get the max smooth angle for mesh auto smoothing."; - -static char NMesh_setMaxSmoothAngle_doc[] = - "(int) - set the max smooth angle for mesh auto smoothing in the range\n\ -[1,80] in degrees."; - -static char NMesh_getSubDivLevels_doc[] = - "() - get the subdivision levels for display and rendering: [display, render]"; - -static char NMesh_setSubDivLevels_doc[] = - "([int, int]) - set the subdivision levels for [display, render] -- they are\n\ -clamped to the range [0,6]."; - -static char M_NMesh_New_doc[] = - "() - returns a new, empty NMesh mesh object\n"; - -static char M_NMesh_GetRaw_doc[] = "([name]) - Get a raw mesh from Blender\n\n\ -[name] Name of the mesh to be returned\n\n\ -If name is not specified a new empty mesh is\n\ -returned, otherwise Blender returns an existing\n\ -mesh."; - -static char M_NMesh_GetNames_doc[] = "\ -() - Get a list with the names of all available meshes in Blender\n\n\ -Any of these names can be passed to NMesh.GetRaw() for the actual mesh data."; - -static char M_NMesh_GetRawFromObject_doc[] = - "(name) - Get the raw mesh used by a Blender object\n\n\ -(name) Name of the object to get the mesh from\n\n\ -This returns the mesh as used by the object, which\n\ -means it contains all deformations and modifications."; - -static char M_NMesh_PutRaw_doc[] = - "(mesh, name = None, recalc_normals = 1, store_edges = 0]) -\n\ -Return a raw mesh to Blender\n\n\ -(mesh) The NMesh object to store\n\ -[name] The mesh to replace\n\ -[recalc_normals = 1] Flag to control vertex normal recalculation\n\ -[store_edges=0] Store edges data in the blender mesh\n\ -If the name of a mesh to replace is not given a new\n\ -object is created and returned."; - -static char NMesh_transform_doc[] = -"(matrix, recalc_normals = 0) - Transform the mesh by the supplied 4x4 matrix\n\ -if recalc_normals is True, vertex normals are transformed along with \n\ -vertex coordinatess.\n"; - - -void mesh_update( Mesh * mesh, Object * ob ) -{ - if (ob) { - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - } - else { - ob = G.main->object.first; - while (ob) { - if (ob->data == mesh) { - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - break; - } - ob = ob->id.next; - } - } -} - -/* - * before trying to convert NMesh data back to mesh, verify that the - * lists contain the right type of data - */ - -static int check_NMeshLists( BPy_NMesh *nmesh ) -{ - int i; - - if( !PySequence_Check( nmesh->verts ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh verts are not a sequence" ); - if( !PySequence_Check( nmesh->edges ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh edges are not a sequence" ); - if( !PySequence_Check( nmesh->faces ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh faces are not a sequence" ); - if( !PySequence_Check( nmesh->materials ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh materials are not a sequence" ); - - if( EXPP_check_sequence_consistency( nmesh->verts, &NMVert_Type ) != 1 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh vertices must be NMVerts" ); - if( EXPP_check_sequence_consistency( nmesh->edges, &NMEdge_Type ) != 1 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh edges must be NMEdges" ); - if( EXPP_check_sequence_consistency( nmesh->faces, &NMFace_Type ) != 1 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh faces must be NMFaces" ); - for( i = 0 ; i < PySequence_Length(nmesh->faces); ++i ) { - int j, err=0; - PyObject *col, *v, *uv; - BPy_NMFace *face=(BPy_NMFace *)PySequence_GetItem(nmesh->faces, i); - - col = face->col; - uv = face->uv; - v = face->v; - Py_DECREF( face ); - if( EXPP_check_sequence_consistency( face->col, &NMCol_Type ) != 1 ) { - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh face col must be NMCols" ); - } - if( EXPP_check_sequence_consistency( face->v, &NMVert_Type ) != 1 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh face v must be NMVerts" ); - - for( j = 0 ; !err && j < PySequence_Length( face->uv ); ++j ) { - PyObject *uv = PySequence_GetItem( face->uv, j); - if( PySequence_Check(uv) && PySequence_Length(uv) == 2 ) { - PyObject *p1 = PySequence_GetItem(uv, 0); - PyObject *p2 = PySequence_GetItem(uv, 1); - if( !PyNumber_Check(p1) || !PyNumber_Check(p2) ) - err = 1; - Py_DECREF( p1 ); - Py_DECREF( p2 ); - } - else { - err = 1; - } - - Py_DECREF( uv ); - } - if( err ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "nmesh face uv must contain sequence of 2 floats" ); - } - return 0; -} - - -/*****************************/ -/* Mesh Color Object */ -/*****************************/ - -static void NMCol_dealloc( PyObject * self ) -{ - PyObject_DEL( self ); -} - -static BPy_NMCol *newcol( char r, char g, char b, char a ) -{ - BPy_NMCol *mc = ( BPy_NMCol * ) PyObject_NEW( BPy_NMCol, &NMCol_Type ); - - mc->r = r; - mc->g = g; - mc->b = b; - mc->a = a; - - return mc; -} - -static PyObject *M_NMesh_Col( PyObject * self, PyObject * args ) -{ - char r = 255, g = 255, b = 255, a = 255; - - if( PyArg_ParseTuple( args, "|bbbb", &r, &g, &b, &a ) ) - return ( PyObject * ) newcol( r, g, b, a ); - - return NULL; -} - -static PyObject *NMCol_getattr( PyObject * self, char *name ) -{ - BPy_NMCol *mc = ( BPy_NMCol * ) self; - - if( strcmp( name, "r" ) == 0 ) - return Py_BuildValue( "i", mc->r ); - else if( strcmp( name, "g" ) == 0 ) - return Py_BuildValue( "i", mc->g ); - else if( strcmp( name, "b" ) == 0 ) - return Py_BuildValue( "i", mc->b ); - else if( strcmp( name, "a" ) == 0 ) - return Py_BuildValue( "i", mc->a ); - else if( strcmp( name, "__members__" ) == 0 ) - return Py_BuildValue( "[s,s,s,s]", "r", "g", "b", "a" ); - - return EXPP_ReturnPyObjError( PyExc_AttributeError, name ); -} - -static int NMCol_setattr( PyObject * self, char *name, PyObject * v ) -{ - BPy_NMCol *mc = ( BPy_NMCol * ) self; - char ival; - - if( !PyArg_Parse( v, "b", &ival ) ) - return -1; - - ival = ( char ) EXPP_ClampInt( ival, 0, 255 ); - - if( strcmp( name, "r" ) == 0 ) - mc->r = (unsigned char)ival; - else if( strcmp( name, "g" ) == 0 ) - mc->g = (unsigned char)ival; - else if( strcmp( name, "b" ) == 0 ) - mc->b = (unsigned char)ival; - else if( strcmp( name, "a" ) == 0 ) - mc->a = (unsigned char)ival; - else - return -1; - - return 0; -} - -static PyObject *NMCol_repr( BPy_NMCol * self ) -{ - static char s[256]; - sprintf( s, "[NMCol - <%d, %d, %d, %d>]", self->r, self->g, self->b, - self->a ); - return Py_BuildValue( "s", s ); -} - -PyTypeObject NMCol_Type = { - PyObject_HEAD_INIT( NULL ) 0, /* ob_size */ - "Blender NMCol", /* tp_name */ - sizeof( BPy_NMCol ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - ( destructor ) NMCol_dealloc, /* tp_dealloc */ - ( printfunc ) 0, /* tp_print */ - ( getattrfunc ) NMCol_getattr, /* tp_getattr */ - ( setattrfunc ) NMCol_setattr, /* tp_setattr */ - 0, /* tp_compare */ - ( reprfunc ) NMCol_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* up to tp_del to avoid a warning */ -}; - -/*****************************/ -/* NMesh Python Object */ -/*****************************/ -static void NMFace_dealloc( PyObject * self ) -{ - BPy_NMFace *mf = ( BPy_NMFace * ) self; - - Py_DECREF( mf->v ); - Py_DECREF( mf->uv ); - Py_DECREF( mf->col ); - - PyObject_DEL( self ); -} - -static PyObject *new_NMFace( PyObject * vertexlist ) -{ - BPy_NMFace *mf = PyObject_NEW( BPy_NMFace, &NMFace_Type ); - PyObject *vlcopy; - - if( vertexlist ) { /* create a copy of the given vertex list */ - PyObject *item; - int i, len = PyList_Size( vertexlist ); - - vlcopy = PyList_New( len ); - - if( !vlcopy ) { - Py_DECREF(mf); - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ); - } - for( i = 0; i < len; i++ ) { - item = PySequence_GetItem( vertexlist, i ); /* PySequence increfs */ - - if( item ) - PyList_SET_ITEM( vlcopy, i, item ); - else { - Py_DECREF(mf); - Py_DECREF(vlcopy); - return EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "couldn't get vertex from a PyList" ); - } - } - } else /* create an empty vertex list */ - vlcopy = PyList_New( 0 ); - - mf->v = vlcopy; - mf->uv = PyList_New( 0 ); - mf->image = NULL; - mf->mode = TF_DYNAMIC + TF_TEX; - mf->flag = TF_SELECT; - mf->transp = TF_SOLID; - mf->col = PyList_New( 0 ); - - mf->mf_flag = 0; - mf->mat_nr = 0; - mf->orig_index = -1; - - return ( PyObject * ) mf; -} - -static PyObject *M_NMesh_Face( PyObject * self, PyObject * args ) -{ - PyObject *vertlist = NULL; - - if( !PyArg_ParseTuple( args, "|O!", &PyList_Type, &vertlist ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of vertices or nothing as argument" ); - -/* if (!vertlist) vertlist = PyList_New(0); */ - - return new_NMFace( vertlist ); -} - -static PyObject *NMFace_append( PyObject * self, PyObject * args ) -{ - PyObject *vert; - BPy_NMFace *f = ( BPy_NMFace * ) self; - - if( !PyArg_ParseTuple( args, "O!", &NMVert_Type, &vert ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an NMVert object" ); - - PyList_Append( f->v, vert ); - - Py_RETURN_NONE; -} - -#undef MethodDef -#define MethodDef(func) {#func, NMFace_##func, METH_VARARGS, NMFace_##func##_doc} - -static struct PyMethodDef NMFace_methods[] = { - MethodDef( append ), - {NULL, NULL, 0, NULL} -}; - -static PyObject *NMFace_getattr( PyObject * self, char *name ) -{ - BPy_NMFace *mf = ( BPy_NMFace * ) self; - - if( strcmp( name, "v" ) == 0 ) - return Py_BuildValue( "O", mf->v ); - else if( strcmp( name, "col" ) == 0 ) - return Py_BuildValue( "O", mf->col ); - else if( strcmp( name, "mat" ) == 0 ) // emulation XXX - return Py_BuildValue( "i", mf->mat_nr ); - else if( strcmp( name, "materialIndex" ) == 0 ) - return Py_BuildValue( "i", mf->mat_nr ); - else if( strcmp( name, "smooth" ) == 0 ) - return Py_BuildValue( "i", (mf->mf_flag & ME_SMOOTH) ? 1:0 ); - else if( strcmp( name, "sel" ) == 0 ) - return Py_BuildValue( "i", (mf->mf_flag & ME_FACE_SEL) ? 1:0 ); - else if( strcmp( name, "hide" ) == 0 ) - return Py_BuildValue( "i", (mf->mf_flag & ME_HIDE) ? 1:0 ); - - else if( strcmp( name, "image" ) == 0 ) { - if( mf->image ) - return Image_CreatePyObject( mf->image ); - else - Py_RETURN_NONE; - } - - else if( strcmp( name, "mode" ) == 0 ) - return Py_BuildValue( "i", mf->mode ); - else if( strcmp( name, "flag" ) == 0 ) - return Py_BuildValue( "i", mf->flag ); - else if( strcmp( name, "transp" ) == 0 ) - return Py_BuildValue( "i", mf->transp ); - else if( strcmp( name, "uv" ) == 0 ) - return Py_BuildValue( "O", mf->uv ); - - else if( ( strcmp( name, "normal" ) == 0 ) - || ( strcmp( name, "no" ) == 0 ) ) { - - if( EXPP_check_sequence_consistency( mf->v, &NMVert_Type ) == - 1 ) { - - float fNormal[3] = { 0.0, 0.0, 0.0 }; - float *vco[4] = { NULL, NULL, NULL, NULL }; - int nSize = PyList_Size( mf->v ); - int loop; - - if( nSize != 3 && nSize != 4 ) - return EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "face must contain either 3 or 4 verts" ); - - for( loop = 0; loop < nSize; loop++ ) { - BPy_NMVert *v = - ( BPy_NMVert * ) PyList_GetItem( mf->v, - loop ); - vco[loop] = ( float * ) v->co; - } - - if( nSize == 4 ) - CalcNormFloat4( vco[0], vco[1], vco[2], vco[3], - fNormal ); - else - CalcNormFloat( vco[0], vco[1], vco[2], - fNormal ); - - return Py_BuildValue( "[f,f,f]", fNormal[0], - fNormal[1], fNormal[2] ); - } else // EXPP_check_sequence_consistency failed - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "this face does not contain a series of NMVerts" ); - } - - else if( strcmp( name, "__members__" ) == 0 ) - return Py_BuildValue( "[s,s,s,s,s,s,s,s,s,s,s,s,s]", - "v", "col", "mat", "materialIndex", - "smooth", "image", "mode", "flag", - "transp", "uv", "normal", "sel", "hide"); - return Py_FindMethod( NMFace_methods, ( PyObject * ) self, name ); -} - -static int NMFace_setattr( PyObject * self, char *name, PyObject * v ) -{ - BPy_NMFace *mf = ( BPy_NMFace * ) self; - short ival; - char cval; - - if( strcmp( name, "v" ) == 0 ) { - - if( PySequence_Check( v ) ) { - Py_DECREF( mf->v ); - mf->v = EXPP_incr_ret( v ); - - return 0; - } - } else if( strcmp( name, "col" ) == 0 ) { - - if( PySequence_Check( v ) ) { - Py_DECREF( mf->col ); - mf->col = EXPP_incr_ret( v ); - - return 0; - } - } else if( !strcmp( name, "mat" ) || !strcmp( name, "materialIndex" ) ) { - PyArg_Parse( v, "b", &cval ); - mf->mat_nr = cval; - - return 0; - } else if( strcmp( name, "smooth" ) == 0 ) { - PyArg_Parse( v, "h", &ival ); - if (ival) mf->mf_flag |= ME_SMOOTH; - else mf->mf_flag &= ~ME_SMOOTH; - - return 0; - } else if( strcmp( name, "sel" ) == 0 ) { - PyArg_Parse( v, "h", &ival ); - if (ival) mf->mf_flag |= ME_FACE_SEL; - else mf->mf_flag &= ~ME_FACE_SEL; - - return 0; - } else if( strcmp( name, "hide" ) == 0 ) { - PyArg_Parse( v, "h", &ival ); - if (ival) mf->mf_flag |= ME_HIDE; - else mf->mf_flag &= ~ME_HIDE; - - return 0; - - } else if( strcmp( name, "uv" ) == 0 ) { - - if( PySequence_Check( v ) ) { - Py_DECREF( mf->uv ); - mf->uv = EXPP_incr_ret( v ); - - return 0; - } - } else if( strcmp( name, "flag" ) == 0 ) { - PyArg_Parse( v, "h", &ival ); - mf->flag = ival; - - return 0; - } else if( strcmp( name, "mode" ) == 0 ) { - PyArg_Parse( v, "h", &ival ); - mf->mode = ival; - - return 0; - } else if( strcmp( name, "transp" ) == 0 ) { - PyArg_Parse( v, "b", &cval ); - mf->transp = cval; - - return 0; - } else if( strcmp( name, "image" ) == 0 ) { - PyObject *pyimg; - if( !PyArg_Parse( v, "O!", &Image_Type, &pyimg ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected image object" ); - - if( pyimg == Py_None ) { - mf->image = NULL; - - return 0; - } - - mf->image = ( ( BPy_Image * ) pyimg )->image; - - return 0; - } - - return EXPP_ReturnIntError( PyExc_AttributeError, name ); -} - -static PyObject *NMFace_repr( PyObject * self ) -{ - return PyString_FromString( "[NMFace]" ); -} - -static int NMFace_len( BPy_NMFace * self ) -{ - return PySequence_Length( self->v ); -} - -static PyObject *NMFace_item( BPy_NMFace * self, int i ) -{ - return PySequence_GetItem( self->v, i ); // new ref -} - -static PyObject *NMFace_slice( BPy_NMFace * self, int begin, int end ) -{ - return PyList_GetSlice( self->v, begin, end ); // new ref -} - -static PySequenceMethods NMFace_SeqMethods = { - ( inquiry ) NMFace_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) NMFace_item, /* sq_item */ - ( intintargfunc ) NMFace_slice, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - 0,0,0, -}; - -PyTypeObject NMFace_Type = { - PyObject_HEAD_INIT( NULL ) 0, /*ob_size */ - "Blender NMFace", /*tp_name */ - sizeof( BPy_NMFace ), /*tp_basicsize */ - 0, /*tp_itemsize */ - /* methods */ - ( destructor ) NMFace_dealloc, /*tp_dealloc */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) NMFace_getattr, /*tp_getattr */ - ( setattrfunc ) NMFace_setattr, /*tp_setattr */ - 0, /*tp_compare */ - ( reprfunc ) NMFace_repr, /*tp_repr */ - 0, /*tp_as_number */ - &NMFace_SeqMethods, /*tp_as_sequence */ - 0, /*tp_as_mapping */ - 0, /*tp_hash */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* up to tp_del to avoid a warning */ -}; - -static BPy_NMVert *newvert( float *co ) -{ - BPy_NMVert *mv = PyObject_NEW( BPy_NMVert, &NMVert_Type ); - - mv->co[0] = co[0]; - mv->co[1] = co[1]; - mv->co[2] = co[2]; - - mv->no[0] = mv->no[1] = mv->no[2] = 0.0; - mv->uvco[0] = mv->uvco[1] = mv->uvco[2] = 0.0; - mv->flag = 0; - - return mv; -} - -static PyObject *M_NMesh_Vert( PyObject * self, PyObject * args ) -{ - float co[3] = { 0.0, 0.0, 0.0 }; - - if( !PyArg_ParseTuple( args, "|fff", &co[0], &co[1], &co[2] ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected three floats (or nothing) as arguments" ); - - return ( PyObject * ) newvert( co ); -} - -static void NMVert_dealloc( PyObject * self ) -{ - PyObject_DEL( self ); -} - -static PyObject *NMVert_getattr( PyObject * self, char *name ) -{ - BPy_NMVert *mv = ( BPy_NMVert * ) self; - - if( !strcmp( name, "co" ) || !strcmp( name, "loc" ) ) - return newVectorObject(mv->co,3,Py_WRAP); - - else if( strcmp( name, "no" ) == 0 ) - return newVectorObject(mv->no,3,Py_WRAP); - else if( strcmp( name, "uvco" ) == 0 ) - return newVectorObject(mv->uvco,3,Py_WRAP); - else if( strcmp( name, "index" ) == 0 ) - return PyInt_FromLong( mv->index ); - else if( strcmp( name, "sel" ) == 0 ) - return PyInt_FromLong( mv->flag & 1 ); - else if( strcmp( name, "__members__" ) == 0 ) - return Py_BuildValue( "[s,s,s,s,s]", "co", "no", "uvco", - "index", "sel" ); - - return EXPP_ReturnPyObjError( PyExc_AttributeError, name ); -} - -static int NMVert_setattr( PyObject * self, char *name, PyObject * v ) -{ - BPy_NMVert *mv = ( BPy_NMVert * ) self; - int i; - - if( strcmp( name, "index" ) == 0 ) { - PyArg_Parse( v, "i", &i ); - mv->index = i; - return 0; - } else if( strcmp( name, "sel" ) == 0 ) { - PyArg_Parse( v, "i", &i ); - mv->flag = i ? 1 : 0; - return 0; - } else if( strcmp( name, "uvco" ) == 0 ) { - - if( !PyArg_ParseTuple( v, "ff|f", - &( mv->uvco[0] ), &( mv->uvco[1] ), - &( mv->uvco[2] ) ) ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "Vector tuple or triple expected" ); - - return 0; - } - - return EXPP_ReturnIntError( PyExc_AttributeError, name ); -} - -static int NMVert_len( BPy_NMVert * self ) -{ - return 3; -} - -static PyObject *NMVert_item( BPy_NMVert * self, int i ) -{ - if( i < 0 || i >= 3 ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - - return Py_BuildValue( "f", self->co[i] ); -} - -static PyObject *NMVert_slice( BPy_NMVert * self, int begin, int end ) -{ - PyObject *list; - int count; - - if( begin < 0 ) - begin = 0; - if( end > 3 ) - end = 3; - if( begin > end ) - begin = end; - - list = PyList_New( end - begin ); - - for( count = begin; count < end; count++ ) - PyList_SetItem( list, count - begin, - PyFloat_FromDouble( self->co[count] ) ); - - return list; -} - -static int NMVert_ass_item( BPy_NMVert * self, int i, PyObject * ob ) -{ - if( i < 0 || i >= 3 ) - return EXPP_ReturnIntError( PyExc_IndexError, - "array assignment index out of range" ); - - if( !PyNumber_Check( ob ) ) - return EXPP_ReturnIntError( PyExc_IndexError, - "NMVert member must be a number" ); - - self->co[i] = (float)PyFloat_AsDouble( ob ); - - return 0; -} - -static int NMVert_ass_slice( BPy_NMVert * self, int begin, int end, - PyObject * seq ) -{ - int count; - - if( begin < 0 ) - begin = 0; - if( end > 3 ) - end = 3; - if( begin > end ) - begin = end; - - if( !PySequence_Check( seq ) ) - EXPP_ReturnIntError( PyExc_TypeError, - "illegal argument type for built-in operation" ); - - if( PySequence_Length( seq ) != ( end - begin ) ) - EXPP_ReturnIntError( PyExc_TypeError, - "size mismatch in slice assignment" ); - - for( count = begin; count < end; count++ ) { - PyObject *ob = PySequence_GetItem( seq, count ); - - if( !PyArg_Parse( ob, "f", &self->co[count] ) ) { - Py_DECREF( ob ); - return -1; - } - - Py_DECREF( ob ); - } - - return 0; -} - -static PySequenceMethods NMVert_SeqMethods = { - ( inquiry ) NMVert_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) NMVert_item, /* sq_item */ - ( intintargfunc ) NMVert_slice, /* sq_slice */ - ( intobjargproc ) NMVert_ass_item, /* sq_ass_item */ - ( intintobjargproc ) NMVert_ass_slice, /* sq_ass_slice */ - 0,0,0, -}; - -PyTypeObject NMVert_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /*ob_size */ - "Blender NMVert", /*tp_name */ - sizeof( BPy_NMVert ), /*tp_basicsize */ - 0, /*tp_itemsize */ - /* methods */ - ( destructor ) NMVert_dealloc, /*tp_dealloc */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) NMVert_getattr, /*tp_getattr */ - ( setattrfunc ) NMVert_setattr, /*tp_setattr */ - 0, /*tp_compare */ - ( reprfunc ) 0, /*tp_repr */ - 0, /*tp_as_number */ - &NMVert_SeqMethods, /*tp_as_sequence */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_del */ -}; - - -/***************************** - * NMEdge - *****************************/ - -static BPy_NMEdge *new_NMEdge( BPy_NMVert * v1, BPy_NMVert * v2, char crease, short flag) -{ - BPy_NMEdge *edge=NULL; - - if (!v1 || !v2) return NULL; - if (!BPy_NMVert_Check(v1) || !BPy_NMVert_Check(v2)) return NULL; - - edge = PyObject_NEW( BPy_NMEdge, &NMEdge_Type ); - - edge->v1=EXPP_incr_ret((PyObject*)v1); - edge->v2=EXPP_incr_ret((PyObject*)v2); - edge->flag=flag; - edge->crease=crease; - - return edge; -} - -static void NMEdge_dealloc( PyObject * self ) -{ - BPy_NMEdge *edge=(BPy_NMEdge *)self; - - Py_DECREF(edge->v1); - Py_DECREF(edge->v2); - - PyObject_DEL(self); -} - -static PyObject *NMEdge_getattr( PyObject * self, char *name ) -{ - BPy_NMEdge *edge=(BPy_NMEdge *)self; - - if ( strcmp( name, "v1" ) == 0 ) - return EXPP_incr_ret( edge->v1 ); - else if ( strcmp( name, "v2" ) == 0 ) - return EXPP_incr_ret( edge->v2 ); - else if ( strcmp( name, "flag" ) == 0 ) - return PyInt_FromLong( edge->flag ); - else if ( strcmp( name, "crease" ) == 0 ) - return PyInt_FromLong( edge->crease ); - else if( strcmp( name, "__members__" ) == 0 ) - return Py_BuildValue( "[s,s,s,s]", - "v1", "v2", "flag", "crease" ); - - return EXPP_ReturnPyObjError( PyExc_AttributeError, name ); -} - -static int NMEdge_setattr( PyObject * self, char *name, PyObject * v ) -{ - BPy_NMEdge *edge=(BPy_NMEdge *)self; - - if ( strcmp( name, "flag" ) == 0 ) - { - short flag=0; - if( !PyInt_Check( v ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - flag = ( short ) PyInt_AsLong( v ); - - edge->flag = flag; - - return 0; - } - else if ( strcmp( name, "crease" ) == 0 ) - { - char crease=0; - if( !PyInt_Check( v ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - crease = ( char ) PyInt_AsLong( v ); - - edge->crease = crease; - - return 0; - } - - return EXPP_ReturnIntError( PyExc_AttributeError, name ); -} - -PyTypeObject NMEdge_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /*ob_size */ - "Blender NMEdge", /*tp_name */ - sizeof( BPy_NMEdge ), /*tp_basicsize */ - 0, /*tp_itemsize */ - /* methods */ - ( destructor ) NMEdge_dealloc, /*tp_dealloc */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) NMEdge_getattr, /*tp_getattr */ - ( setattrfunc ) NMEdge_setattr, /*tp_setattr */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0, -}; - -static void NMesh_dealloc( PyObject * self ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - - CustomData_free( &me->fdata, me->totfdata ); - - Py_DECREF( me->name ); - Py_DECREF( me->verts ); - Py_DECREF( me->faces ); - Py_DECREF( me->materials ); - Py_DECREF( me->edges ); - - PyObject_DEL( self ); -} - -static PyObject *NMesh_getMaterials( PyObject * self, PyObject * args ) -{ - BPy_NMesh *nm = ( BPy_NMesh * ) self; - PyObject *list = NULL; - Mesh *me = nm->mesh; - int all = -1; - - if( !PyArg_ParseTuple( args, "|i", &all ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int (bool) as argument" ); - - if( all >= 0 ) { - if (!me) - return EXPP_ReturnPyObjError(PyExc_TypeError, - "meshes obtained with GetRawFromObject don't support this option"); - - list = EXPP_PyList_fromMaterialList( me->mat, me->totcol, - all ); - Py_DECREF( nm->materials ); /* update nmesh.materials attribute */ - nm->materials = EXPP_incr_ret( list ); - } else - list = EXPP_incr_ret( nm->materials ); - - return list; -} - -static PyObject *NMesh_setMaterials( PyObject * self, PyObject * args ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - PyObject *pymats = NULL; - - if( !PyArg_ParseTuple( args, "O!", &PyList_Type, &pymats ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of materials (None's also accepted) as argument" ); - - if( !EXPP_check_sequence_consistency( pymats, &Material_Type ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "list should only contain materials (None's also accepted)" ); - - if( PyList_Size( pymats ) > 16 ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "list can't have more than 16 materials" ); - - Py_DECREF( me->materials ); - me->materials = EXPP_incr_ret( pymats ); - - Py_RETURN_NONE; -} - -static PyObject *NMesh_addMaterial( PyObject * self, PyObject * args ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - BPy_Material *pymat; - Material *mat; - PyObject *iter; - int i, len = 0; - - if( !PyArg_ParseTuple( args, "O!", &Material_Type, &pymat ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Blender Material PyObject" ); - - mat = pymat->material; - len = PyList_Size( me->materials ); - - if( len >= 16 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "object data material lists can't have more than 16 materials" ); - - for( i = 0; i < len; i++ ) { - iter = PyList_GetItem( me->materials, i ); - if( mat == Material_FromPyObject( iter ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "material already in the list" ); - } - - PyList_Append( me->materials, ( PyObject * ) pymat ); - - Py_RETURN_NONE; -} - -static PyObject *NMesh_getKey( BPy_NMesh * self ) -{ - PyObject *keyobj; - - if( self->mesh->key ) - keyobj = Key_CreatePyObject(self->mesh->key); - else - keyobj = EXPP_incr_ret(Py_None); - - return keyobj; -} - -static PyObject *NMesh_removeAllKeys( PyObject * self, PyObject * args ) -{ - BPy_NMesh *nm = ( BPy_NMesh * ) self; - Mesh *me = nm->mesh; - - if( !PyArg_ParseTuple( args, "" ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "this function expects no arguments" ); - - if( !me || !me->key ) - return EXPP_incr_ret_False(); - - me->key->id.us--; - me->key = 0; - - return EXPP_incr_ret_True(); -} - -static PyObject *NMesh_insertKey( PyObject * self, PyObject * args ) -{ - int fra = -1, oldfra = -1; - char *type = NULL; - short typenum; - BPy_NMesh *nm = ( BPy_NMesh * ) self; - Mesh *mesh = nm->mesh; - - if( !PyArg_ParseTuple( args, "|is", &fra, &type ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int and optionally a string as arguments" ); - - if( !type || !strcmp( type, "relative" ) ) - typenum = 1; - else if( !strcmp( type, "absolute" ) ) - typenum = 2; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "if given, type should be 'relative' or 'absolute'" ); - - if( fra > 0 ) { - fra = EXPP_ClampInt( fra, 1, NMESH_FRAME_MAX ); - oldfra = G.scene->r.cfra; - G.scene->r.cfra = (int)fra; - } - - if( !mesh ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "update this NMesh first with its .update() method" ); - - insert_meshkey( mesh, typenum ); - allspace(REMAKEIPO, 0); - - if( fra > 0 ) - G.scene->r.cfra = (int)oldfra; - - Py_RETURN_NONE; -} - -static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args ) -{ - BPy_NMesh *nm = ( BPy_NMesh * ) self; - Mesh *me = nm->mesh; - int i, totfaces, flag = 0; - PyObject *l, *pyval; - - if( !PyArg_ParseTuple( args, "|i", &flag ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected int argument (or nothing)" ); - - l = PyList_New( 0 ); - if( me == NULL || me->mface == NULL) - return l; - - /* make sure not to write more faces then we have */ - totfaces= MIN2(me->totface, PySequence_Length(nm->faces)); - - if( flag ) { - for( i = 0; i < totfaces; i++ ) { - if( me->mface[i].flag & ME_FACE_SEL ) { - pyval = PyInt_FromLong( i ); - PyList_Append( l, pyval ); - Py_DECREF(pyval); - } - } - } else { - for( i = 0; i < totfaces; i++ ) { - if( me->mface[i].flag & ME_FACE_SEL ) - PyList_Append( l, PyList_GetItem( nm->faces, i ) ); - } - } - return l; -} - -static PyObject *NMesh_getActiveFace( PyObject * self ) -{ - if( ( ( BPy_NMesh * ) self )->sel_face < 0 ) - Py_RETURN_NONE; - - return Py_BuildValue( "i", ( ( BPy_NMesh * ) self )->sel_face ); -} - -static PyObject *NMesh_hasVertexUV( PyObject * self, PyObject * args ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - int flag = -1; - - if( !PyArg_ParseTuple( args, "|i", &flag ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (or nothing)" ); - - switch ( flag ) { - case 0: - me->flags &= ~NMESH_HASVERTUV; - break; - case 1: - me->flags |= NMESH_HASVERTUV; - break; - default: - break; - } - - if( me->flags & NMESH_HASVERTUV ) - return EXPP_incr_ret_True(); - else - return EXPP_incr_ret_False(); -} - -static PyObject *NMesh_hasFaceUV( PyObject * self, PyObject * args ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - int flag = -1; - - if( !PyArg_ParseTuple( args, "|i", &flag ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (or nothing)" ); - - switch ( flag ) { - case 0: - me->flags &= ~NMESH_HASFACEUV; - break; - case 1: - me->flags |= NMESH_HASFACEUV; - break; - default: - break; - } - - if( me->flags & NMESH_HASFACEUV ) - return EXPP_incr_ret_True(); - else - return EXPP_incr_ret_False(); -} - -static PyObject *NMesh_hasVertexColours( PyObject * self, PyObject * args ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - int flag = -1; - - if( !PyArg_ParseTuple( args, "|i", &flag ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (or nothing)" ); - - switch ( flag ) { - case 0: - me->flags &= ~NMESH_HASMCOL; - break; - case 1: - me->flags |= NMESH_HASMCOL; - break; - default: - break; - } - - if( me->flags & NMESH_HASMCOL ) - return EXPP_incr_ret_True(); - else - return EXPP_incr_ret_False(); -} - -static PyObject *NMesh_update( PyObject *self, PyObject *a, PyObject *kwd ) -{ - BPy_NMesh *nmesh = ( BPy_NMesh * ) self; - Mesh *mesh = nmesh->mesh; - int recalc_normals = 0, store_edges = 0, vertex_shade = 0; - static char *kwlist[] = {"recalc_normals", "store_edges", - "vertex_shade", NULL}; - int needs_redraw = 1; - int old_totvert = 0; - - if (!PyArg_ParseTupleAndKeywords(a, kwd, "|iii", kwlist, &recalc_normals, - &store_edges, &vertex_shade ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected nothing or one to three bool(s) (0 or 1) as argument" ); - - if( check_NMeshLists( nmesh ) ) - return NULL; - - if( mesh ) { - old_totvert = mesh->totvert; - unlink_existingMeshData( mesh ); - if( !convert_NMeshToMesh( mesh, nmesh ) ) - return NULL; - if (mesh->dvert) check_dverts(mesh, old_totvert); - } else { - mesh = Mesh_fromNMesh( nmesh ); - /* if mesh is NULL, there was an error */ - if( !mesh ) - return NULL; - nmesh->mesh = mesh; - } - - if( recalc_normals ) - mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL); - - mesh_update( mesh, nmesh->object ); - - nmesh_updateMaterials( nmesh ); - - if( nmesh->name && nmesh->name != Py_None ) - new_id( &( G.main->mesh ), &mesh->id, - PyString_AsString( nmesh->name ) ); - - if (vertex_shade) { - Base *base = FIRSTBASE; - - if (!nmesh->object) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "link this mesh to an object first with ob.link(mesh)" ); - - if (G.obedit) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "can't shade vertices while in edit mode" ); - - while (base) { - if (base->object == nmesh->object) { - base->flag |= SELECT; - nmesh->object->flag = (short)base->flag; - set_active_base (base); - needs_redraw = 0; /* already done in make_vertexcol */ - break; - } - base = base->next; - } - - /* recalculate the derived mesh before trying to use it */ - makeDerivedMesh(nmesh->object, CD_MASK_BAREMESH); - make_vertexcol(1); - - countall(); - } - - if( !during_script( ) && needs_redraw) - EXPP_allqueue( REDRAWVIEW3D, 0 ); - - return PyInt_FromLong( 1 ); -} - -/** Implementation of the python method getVertexInfluence for an NMesh object. - * This method returns a list of pairs (string,float) with bone names and - * influences that this vertex receives. - * @author Jordi Rovira i Bonet - */ - -static PyObject *NMesh_getVertexInfluences( PyObject * self, PyObject * args ) -{ - int index; - PyObject *influence_list = NULL; - Object *object = ( ( BPy_NMesh * ) self )->object; - Mesh *me = ( ( BPy_NMesh * ) self )->mesh; - - /* Get a reference to the mesh object wrapped in here. */ - if( !me ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "unlinked nmesh: call its .update() method first" ); - - if( !object ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - /* Parse the parameters: only on integer (vertex index) */ - if( !PyArg_ParseTuple( args, "i", &index ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (index of the vertex)" ); - - /* check for valid index */ - if( index < 0 || index >= me->totvert ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "vertex index out of range" ); - - influence_list = PyList_New( 0 ); - - /* Proceed only if we have vertex deformation information */ - if( me->dvert ) { - int i; - MDeformWeight *sweight = NULL; - - /* Number of bones influencing the vertex */ - int totinfluences = me->dvert[index].totweight; - - /* Get the reference of the first weight structure */ - sweight = me->dvert[index].dw; - - /* Build the list only with weights and names of the influent bones */ - for( i = 0; i < totinfluences; i++, sweight++ ) { - bDeformGroup *defgroup = (bDeformGroup *) BLI_findlink( &object->defbase, - sweight->def_nr ); - if( defgroup ) - PyList_Append( influence_list, Py_BuildValue( "[sf]", - defgroup->name, sweight->weight ) ); - } - } - - return influence_list; -} - -Mesh *Mesh_fromNMesh( BPy_NMesh * nmesh ) -{ - Mesh *mesh = NULL; - - mesh = add_mesh( "Mesh" ); - - if( !mesh ) { - PyErr_SetString( PyExc_RuntimeError, - "FATAL: could not create mesh object" ); - return NULL; - } - - mesh->id.us = 0; /* no user yet */ - G.totmesh++; - - if( !convert_NMeshToMesh( mesh, nmesh ) ) - return NULL; - - return mesh; -} - -static PyObject *NMesh_getMaxSmoothAngle( BPy_NMesh * self ) -{ - return PyInt_FromLong( self->smoothresh ); -} - -static PyObject *NMesh_setMaxSmoothAngle( PyObject * self, PyObject * args ) -{ - short value = 0; - BPy_NMesh *nmesh = ( BPy_NMesh * ) self; - - if( !PyArg_ParseTuple( args, "h", &value ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected an int in [1, 80] as argument" ); - - nmesh->smoothresh = - ( short ) EXPP_ClampInt( value, NMESH_SMOOTHRESH_MIN, - NMESH_SMOOTHRESH_MAX ); - - Py_RETURN_NONE; -} - -static PyObject *NMesh_getSubDivLevels( BPy_NMesh * self ) -{ - return Py_BuildValue( "[h,h]", self->subdiv[0], self->subdiv[1] ); -} - -static PyObject *NMesh_setSubDivLevels( PyObject * self, PyObject * args ) -{ - short display = 0, render = 0; - BPy_NMesh *nmesh = ( BPy_NMesh * ) self; - - if( !PyArg_ParseTuple( args, "(hh)", &display, &render ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected a sequence [int, int] as argument" ); - - nmesh->subdiv[0] = - ( short ) EXPP_ClampInt( display, NMESH_SUBDIV_MIN, - NMESH_SUBDIV_MAX ); - - nmesh->subdiv[1] = - ( short ) EXPP_ClampInt( render, NMESH_SUBDIV_MIN, - NMESH_SUBDIV_MAX ); - - Py_RETURN_NONE; -} - -static PyObject *NMesh_getMode( BPy_NMesh * self ) -{ - return PyInt_FromLong( self->mode ); -} - -static PyObject *NMesh_setMode( PyObject * self, PyObject * args ) -{ - BPy_NMesh *nmesh = ( BPy_NMesh * ) self; - PyObject *arg1 = NULL; - char *m[5] = { NULL, NULL, NULL, NULL, NULL }; - short i, mode = 0; - - if( !PyArg_ParseTuple ( args, "|Ossss", &arg1, &m[1], &m[2], &m[3], &m[4] ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected an int or from none to 5 strings as argument(s)" ); - - if (arg1) { - if (PyInt_Check(arg1)) { - mode = (short)PyInt_AsLong(arg1); - } - else if (PyString_Check(arg1)) { - m[0] = PyString_AsString(arg1); - for( i = 0; i < 5; i++ ) { - if( !m[i] ) break; - else if( strcmp( m[i], "NoVNormalsFlip" ) == 0 ) - mode |= ME_NOPUNOFLIP; - else if( strcmp( m[i], "TwoSided" ) == 0 ) - mode |= ME_TWOSIDED; - else if( strcmp( m[i], "AutoSmooth" ) == 0 ) - mode |= ME_AUTOSMOOTH; - else if( m[i][0] == '\0' ) - mode = 0; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown NMesh mode" ); - } - } - else return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected an int or from none to 5 strings as argument(s)" ); - } - - nmesh->mode = mode; - - Py_RETURN_NONE; -} - -/* METH_VARARGS: function(PyObject *self, PyObject *args) */ -#undef MethodDef -#define MethodDef(func) {#func, NMesh_##func, METH_VARARGS, NMesh_##func##_doc} - -static struct PyMethodDef NMesh_methods[] = { - MethodDef( addEdge ), - MethodDef( findEdge ), - MethodDef( removeEdge ), - MethodDef( addFace ), - MethodDef( removeFace ), - MethodDef( addVertGroup ), - MethodDef( removeVertGroup ), - MethodDef( assignVertsToGroup ), - MethodDef( removeVertsFromGroup ), - MethodDef( getVertsFromGroup ), - MethodDef( renameVertGroup ), - MethodDef( hasVertexColours ), - MethodDef( hasFaceUV ), - MethodDef( hasVertexUV ), - MethodDef( getSelectedFaces ), - MethodDef( getVertexInfluences ), - MethodDef( getMaterials ), - MethodDef( setMaterials ), - MethodDef( addMaterial ), - MethodDef( insertKey ), - MethodDef( removeAllKeys ), - MethodDef( setMode ), - MethodDef( setMaxSmoothAngle ), - MethodDef( setSubDivLevels ), - MethodDef( transform ), - -/* METH_NOARGS: function(PyObject *self) */ -#undef MethodDef -#define MethodDef(func) {#func, (PyCFunction)NMesh_##func, METH_NOARGS,\ - NMesh_##func##_doc} - - MethodDef( printDebug ), - MethodDef( getVertGroupNames ), - MethodDef( getActiveFace ), - MethodDef( getKey ), - MethodDef( getMode ), - MethodDef( getMaxSmoothAngle ), - MethodDef( getSubDivLevels ), - -/* METH_VARARGS | METH_KEYWORDS: - * function(PyObject *self, PyObject *args, PyObject *keywords) */ -#undef MethodDef -#define MethodDef(func) {#func, (PyCFunction)NMesh_##func,\ - METH_VARARGS | METH_KEYWORDS, NMesh_##func##_doc} - - MethodDef( update ), - {NULL, NULL, 0, NULL} -}; - -static PyObject *NMesh_getattr( PyObject * self, char *name ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - - if( strcmp( name, "name" ) == 0 ) - return EXPP_incr_ret( me->name ); - - else if ( strcmp( name, "properties" ) == 0 ) - return BPy_Wrap_IDProperty( (ID*)me->mesh, IDP_GetProperties((ID*)me->mesh, 1), NULL ); - - else if( strcmp( name, "mode" ) == 0 ) - return PyInt_FromLong( me->mode ); - - else if( strcmp( name, "block_type" ) == 0 ) /* for compatibility */ - return PyString_FromString( "NMesh" ); - - else if( strcmp( name, "materials" ) == 0 ) - return EXPP_incr_ret( me->materials ); - - else if( strcmp( name, "verts" ) == 0 ) - return EXPP_incr_ret( me->verts ); - - else if( strcmp( name, "maxSmoothAngle" ) == 0 ) - return PyInt_FromLong( me->smoothresh ); - - else if( strcmp( name, "subDivLevels" ) == 0 ) - return Py_BuildValue( "[h,h]", me->subdiv[0], me->subdiv[1] ); - - else if( strcmp( name, "users" ) == 0 ) { - if( me->mesh ) { - return PyInt_FromLong( me->mesh->id.us ); - } else { /* it's a free mesh: */ - return Py_BuildValue( "i", 0 ); - } - } - else if (strcmp( name, "key") == 0) - return NMesh_getKey((BPy_NMesh*)self); - - else if( strcmp( name, "faces" ) == 0 ) - return EXPP_incr_ret( me->faces ); - - else if( strcmp( name, "edges" ) == 0 ) - { - return EXPP_incr_ret( me->edges ); - } - else if( strcmp( name, "__members__" ) == 0 ) - return Py_BuildValue( "[s,s,s,s,s,s,s,s,s,s,s]", - "name", "materials", "verts", "users", - "faces", "maxSmoothAngle", - "subdivLevels", "edges", "key" ); - - return Py_FindMethod( NMesh_methods, ( PyObject * ) self, name ); -} - -static int NMesh_setattr( PyObject * self, char *name, PyObject * v ) -{ - BPy_NMesh *me = ( BPy_NMesh * ) self; - - if( !strcmp( name, "name" ) ) { - - if( !PyString_Check( v ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - - Py_DECREF( me->name ); - me->name = EXPP_incr_ret( v ); - } - - else if( !strcmp( name, "mode" ) ) { - short mode; - - if( !PyInt_Check( v ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - mode = ( short ) PyInt_AsLong( v ); - if( mode >= 0 ) - me->mode = mode; - else - return EXPP_ReturnIntError( PyExc_ValueError, - "expected positive int argument" ); - } - - else if( !strcmp( name, "verts" ) || !strcmp( name, "faces" ) || - !strcmp( name, "materials" ) ) { - - if( PySequence_Check( v ) ) { - - if( strcmp( name, "materials" ) == 0 ) { - Py_DECREF( me->materials ); - me->materials = EXPP_incr_ret( v ); - } else if( strcmp( name, "verts" ) == 0 ) { - Py_DECREF( me->verts ); - me->verts = EXPP_incr_ret( v ); - } else { - Py_DECREF( me->faces ); - me->faces = EXPP_incr_ret( v ); - } - } - - else - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list" ); - } - - else if( !strcmp( name, "maxSmoothAngle" ) ) { - short smoothresh = 0; - - if( !PyInt_Check( v ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - smoothresh = ( short ) PyInt_AsLong( v ); - - me->smoothresh = - (short)EXPP_ClampInt( smoothresh, NMESH_SMOOTHRESH_MIN, - NMESH_SMOOTHRESH_MAX ); - } - - else if( !strcmp( name, "subDivLevels" ) ) { - int subdiv[2] = { 0, 0 }; - int i; - PyObject *tmp; - - if( !PySequence_Check( v ) || ( PySequence_Length( v ) != 2 ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list [int, int] as argument" ); - - for( i = 0; i < 2; i++ ) { - tmp = PySequence_GetItem( v, i ); - if( tmp ) { - if( !PyInt_Check( tmp ) ) { - Py_DECREF( tmp ); - return EXPP_ReturnIntError - ( PyExc_TypeError, - "expected a list [int, int] as argument" ); - } - - subdiv[i] = PyInt_AsLong( tmp ); - me->subdiv[i] = - ( short ) EXPP_ClampInt( subdiv[i], - NMESH_SUBDIV_MIN, - NMESH_SUBDIV_MAX ); - Py_DECREF( tmp ); - } else - return EXPP_ReturnIntError( PyExc_RuntimeError, - "couldn't retrieve subdiv values from list" ); - } - } - else if( strcmp( name, "edges" ) == 0 ) - { - if (PySequence_Check(v)) - { - Py_DECREF(me->edges); - me->edges = EXPP_incr_ret( v ); - } - } - else - return EXPP_ReturnIntError( PyExc_AttributeError, name ); - - return 0; -} - -PyTypeObject NMesh_Type = { - PyObject_HEAD_INIT( NULL ) 0, /*ob_size */ - "Blender NMesh", /*tp_name */ - sizeof( BPy_NMesh ), /*tp_basicsize */ - 0, /*tp_itemsize */ - /* methods */ - ( destructor ) NMesh_dealloc, /*tp_dealloc */ - ( printfunc ) 0, /*tp_print */ - ( getattrfunc ) NMesh_getattr, /*tp_getattr */ - ( setattrfunc ) NMesh_setattr, /*tp_setattr */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; - -static BPy_NMFace *nmface_from_data( BPy_NMesh * mesh, int vidxs[4], - char mat_nr, char flag, MTFace * tface, MCol * col, int orig_index ) -{ - BPy_NMFace *newf = PyObject_NEW( BPy_NMFace, &NMFace_Type ); - int i, len; - - if( vidxs[3] ) - len = 4; - else - len = 3; - - newf->v = PyList_New( len ); - - for( i = 0; i < len; i++ ) - PyList_SetItem( newf->v, i, - EXPP_incr_ret( PyList_GetItem - ( mesh->verts, vidxs[i] ) ) ); - - if( tface ) { - newf->uv = PyList_New( len ); // per-face UV coordinates - - for( i = 0; i < len; i++ ) { - PyList_SetItem( newf->uv, i, - Py_BuildValue( "(ff)", tface->uv[i][0], - tface->uv[i][1] ) ); - } - - if( tface->tpage ) /* pointer to image per face: */ - newf->image = ( Image * ) tface->tpage; - else - newf->image = NULL; - - newf->mode = tface->mode; /* draw mode */ - newf->flag = tface->flag; /* select flag */ - newf->transp = tface->transp; /* transparency flag */ - } else { - newf->mode = TF_DYNAMIC; /* just to initialize it to something meaninful, */ - /* since without tfaces there are no tface->mode's, obviously. */ - newf->image = NULL; - newf->uv = PyList_New( 0 ); - } - - newf->mat_nr = mat_nr; - newf->mf_flag = flag; /* MFace flag */ - newf->orig_index = orig_index; - - if( col ) { - newf->col = PyList_New( 4 ); - for( i = 0; i < 4; i++, col++ ) { - PyList_SetItem( newf->col, i, - ( PyObject * ) newcol( col->b, col->g, - col->r, - col->a ) ); - } - } else - newf->col = PyList_New( 0 ); - - return newf; -} - -static BPy_NMEdge *nmedge_from_index( BPy_NMesh * mesh, int v0idx, int v1idx) -{ - BPy_NMVert *v1=(BPy_NMVert *)PyList_GetItem( mesh->verts, v0idx); - BPy_NMVert *v2=(BPy_NMVert *)PyList_GetItem( mesh->verts, v1idx); - return new_NMEdge(v1, v2, (char)0.0, 0); -} - -static BPy_NMEdge *nmedge_from_data( BPy_NMesh * mesh, MEdge *edge ) -{ - BPy_NMVert *v1=(BPy_NMVert *)PyList_GetItem( mesh->verts, edge->v1 ); - BPy_NMVert *v2=(BPy_NMVert *)PyList_GetItem( mesh->verts, edge->v2 ); - return new_NMEdge(v1, v2, edge->crease, edge->flag); -} - -static BPy_NMVert *nmvert_from_data( MVert * vert, MSticky * st, float *co, - int idx, char flag ) -{ - BPy_NMVert *mv = PyObject_NEW( BPy_NMVert, &NMVert_Type ); - - mv->co[0] = co[0]; - mv->co[1] = co[1]; - mv->co[2] = co[2]; - - mv->no[0] = (float)(vert->no[0] / 32767.0); - mv->no[1] = (float)(vert->no[1] / 32767.0); - mv->no[2] = (float)(vert->no[2] / 32767.0); - - if( st ) { - mv->uvco[0] = st->co[0]; - mv->uvco[1] = st->co[1]; - mv->uvco[2] = 0.0; - - } else - mv->uvco[0] = mv->uvco[1] = mv->uvco[2] = 0.0; - - mv->index = idx; - mv->flag = flag & 1; - - return mv; -} - -static int get_active_faceindex( Mesh * me ) -{ - if( me == NULL ) - return -1; - - if (me->act_face != -1 && me->act_face < me->totface) - return me->act_face; - return -1; -} - -static BPy_NMVert *nmvert_from_float(float *co, float *no, int idx) { - BPy_NMVert *mv; - - mv = PyObject_NEW( BPy_NMVert, &NMVert_Type ); - - mv->index = idx; - - mv->co[0] = co[0]; - mv->co[1] = co[1]; - mv->co[2] = co[2]; - - mv->no[0] = no[0]; - mv->no[1] = no[1]; - mv->no[2] = no[2]; - - mv->uvco[0] = mv->uvco[1] = mv->uvco[2] = 0.0; - - mv->flag = 0; - - return mv; -} - -static BPy_NMFace *nmface_from_index( BPy_NMesh * mesh, int vidxs[4], char mat_nr ) -{ - BPy_NMFace *newf = PyObject_NEW( BPy_NMFace, &NMFace_Type ); - int i, len; - - if( vidxs[3] ) - len = 4; - else if( vidxs[2] ) - len = 3; - else - len = 2; - - newf->v = PyList_New( len ); - - for( i = 0; i < len; i++ ) - PyList_SetItem( newf->v, i, - EXPP_incr_ret( PyList_GetItem - ( mesh->verts, vidxs[i] ) ) ); - - newf->mode = TF_DYNAMIC; /* just to initialize it to something meaninful, */ - /* since without tfaces there are no tface->mode's, obviously. */ - newf->image = NULL; - newf->uv = PyList_New( 0 ); - - newf->mat_nr = mat_nr; - newf->mf_flag = 0; - newf->orig_index = -1; - - newf->col = PyList_New( 0 ); - - return newf; -} - -/* RATHER EVIL FUNCTION BORROWED FROM fix_faceindices IN editmesh.c */ -static void correctFaceIndex(int vidx[4]) -{ - if (vidx[3]) { - if (vidx[1] == 0) { - vidx[1] = vidx[2]; - vidx[2] = vidx[3]; - vidx[3] = vidx[0]; - vidx[0] = 0; - } - if (vidx[2] == 0) { - int t = vidx[1]; - vidx[2] = vidx[0]; - vidx[1] = vidx[3]; - vidx[3] = t; - vidx[0] = 0; - } - if (vidx[3] == 0) { - vidx[3] = vidx[2]; - vidx[2] = vidx[1]; - vidx[1] = vidx[0]; - vidx[0] = 0; - } - } - else if (vidx[1] == 0) { - vidx[1] = vidx[2]; - vidx[2] = vidx[0]; - vidx[0] = 0; - } - else if (vidx[2] == 0) { - vidx[2] = vidx[1]; - vidx[1] = vidx[0]; - vidx[0] = 0; - } -} - -/* - CREATES A NMESH FROM DISPLIST DATA. INSPIRED BY THE FUNCTIONS CALLED WHEN - CONVERTING OBJECTS TO MESH. - */ -static PyObject *new_NMesh_displist(ListBase *lb, Object *ob) -{ - BPy_NMesh *me; - DispList *dl; - float *data, *ndata; - float normal[3] = {1, 0, 0}; - int vidx[4]; - int parts, p1, p2, p3, p4, a, b, one_normal=0, ioffset=0; - int *index; - - /* Note: This routine does not create new edges for the faces - * it adds... should be fixed for consistency. - */ - - if (ob->type == OB_CURVE || ob->type == OB_FONT) - one_normal = 1; - - me = PyObject_NEW( BPy_NMesh, &NMesh_Type ); - me->name = EXPP_incr_ret( Py_None ); - me->flags = 0; - me->mode = ME_TWOSIDED; /* default for new meshes */ - me->subdiv[0] = NMESH_SUBDIV; - me->subdiv[1] = NMESH_SUBDIV; - me->smoothresh = NMESH_SMOOTHRESH; - me->edges = PyList_New( 0 ); - - me->object = ob; - me->materials = EXPP_PyList_fromMaterialList( ob->mat, ob->totcol, 0 ); - - me->verts = PyList_New( 0 ); - me->faces = PyList_New( 0 ); - - memset(&me->fdata, 0, sizeof(me->fdata)); - me->totfdata = 0; - - dl= lb->first; - while(dl) { - parts= dl->parts; - index= dl->index; - data= dl->verts; - ndata= dl->nors; - - switch(dl->type) { - case DL_SEGM: - for(a=0; aparts*dl->nr; a++, data+=3) { - PyList_Append(me->verts, ( PyObject * ) nmvert_from_float(data, normal, a)); - } - - vidx[2] = vidx[3] = 0; - - for(a=0; aparts; a++) { - for(b=1; bnr; b++) { - int v0 = ioffset + a * dl->nr + b-1; - int v1 = ioffset + a * dl->nr + b; - PyList_Append(me->edges, ( PyObject * ) nmedge_from_index(me, v0, v1)); - } - } - ioffset += dl->parts * dl->nr; - break; - case DL_POLY: - for(a=0; aparts*dl->nr; a++, data+=3) { - PyList_Append(me->verts, ( PyObject * ) nmvert_from_float(data, normal, a)); - } - - vidx[2] = vidx[3] = 0; - - for(a=0; aparts; a++) { - for(b=0; bnr; b++) { - int v1, v0 = ioffset + a * dl->nr + b; - if(b==dl->nr-1) v1 = ioffset + a * dl->nr; - else v1= ioffset + a * dl->nr + b+1; - PyList_Append(me->edges, ( PyObject * ) nmedge_from_index(me, v0, v1)); - } - } - ioffset += dl->parts * dl->nr; - break; - case DL_SURF: - for(a=0; aparts*dl->nr; a++, data+=3, ndata+=3) { - PyList_Append(me->verts, ( PyObject * ) nmvert_from_float(data, ndata, a)); - } - - for(a=0; aparts; a++) { - - DL_SURFINDEX(dl->flag & DL_CYCL_U, dl->flag & DL_CYCL_V, dl->nr, dl->parts); - - - for(; bnr; b++) { - vidx[0] = p2 + ioffset; - vidx[1] = p1 + ioffset; - vidx[2] = p3 + ioffset; - vidx[3] = p4 + ioffset; - correctFaceIndex(vidx); - - PyList_Append(me->faces, ( PyObject * ) nmface_from_index(me, vidx, (char)dl->col)); - - p2 = p1; - p4 = p3; - p1++; - p3++; - } - } - ioffset += dl->parts * dl->nr; - break; - - case DL_INDEX3: - if (one_normal) - for(a=0; anr; a++, data+=3) - PyList_Append(me->verts, ( PyObject * ) nmvert_from_float(data, ndata, a)); - else - for(a=0; anr; a++, data+=3, ndata+=3) - PyList_Append(me->verts, ( PyObject * ) nmvert_from_float(data, ndata, a)); - - while(parts--) { - vidx[0] = index[0] + ioffset; - vidx[1] = index[1] + ioffset; - vidx[2] = index[2] + ioffset; - vidx[3] = 0; - correctFaceIndex(vidx); - - PyList_Append(me->faces, ( PyObject * ) nmface_from_index(me, vidx, (char)dl->col)); - index+= 3; - } - ioffset += dl->nr; - - break; - - case DL_INDEX4: - for(a=0; anr; a++, data+=3, ndata+=3) { - PyList_Append(me->verts, ( PyObject * ) nmvert_from_float(data, ndata, a)); - } - - while(parts--) { - vidx[0] = index[0] + ioffset; - vidx[1] = index[1] + ioffset; - vidx[2] = index[2] + ioffset; - vidx[3] = index[3] + ioffset; - correctFaceIndex(vidx); - - PyList_Append(me->faces, ( PyObject * ) nmface_from_index(me, vidx, (char)dl->col)); - index+= 4; - } - ioffset += dl->nr; - break; - } - dl= dl->next; - } - - return ( PyObject * ) me; -} - -static PyObject *new_NMesh_internal( Mesh * oldmesh, - DerivedMesh *dm ) -{ - BPy_NMesh *me = PyObject_NEW( BPy_NMesh, &NMesh_Type ); - me->flags = 0; - me->mode = ME_TWOSIDED; /* default for new meshes */ - me->subdiv[0] = NMESH_SUBDIV; - me->subdiv[1] = NMESH_SUBDIV; - me->smoothresh = NMESH_SMOOTHRESH; - - me->object = NULL; /* not linked to any object yet */ - - if( !oldmesh ) { - me->name = EXPP_incr_ret( Py_None ); - me->materials = PyList_New( 0 ); - me->verts = PyList_New( 0 ); - me->edges = PyList_New( 0 ); - me->faces = PyList_New( 0 ); - me->mesh = 0; - memset(&me->fdata, 0, sizeof(me->fdata)); - me->totfdata = 0; - } else { - MVert *mverts; - MSticky *msticky; - MFace *mfaces; - MTFace *tfaces; - MCol *mcols; - MEdge *medges; - CustomData *fdata; - int i, totvert, totface, totedge; - - me->name = PyString_FromString( oldmesh->id.name + 2 ); - me->mesh = oldmesh; - me->mode = oldmesh->flag; /* yes, we save the mesh flags in nmesh->mode */ - me->subdiv[0] = oldmesh->subdiv; - me->subdiv[1] = oldmesh->subdivr; - me->smoothresh = oldmesh->smoothresh; - - me->sel_face = get_active_faceindex( oldmesh ); - - if( dm ) { - msticky = NULL; - mverts = dm->getVertArray(dm); - mfaces = dm->getFaceArray(dm); - tfaces = dm->getFaceDataArray(dm, CD_MTFACE); - mcols = dm->getFaceDataArray(dm, CD_MCOL); - medges = dm->getEdgeArray(dm); - fdata = &dm->faceData; - - totvert = dm->getNumVerts(dm); - totedge = dm->getNumEdges(dm); - totface = dm->getNumFaces(dm);; - } else { - msticky = oldmesh->msticky; - mverts = oldmesh->mvert; - mfaces = oldmesh->mface; - tfaces = oldmesh->mtface; - mcols = oldmesh->mcol; - medges = oldmesh->medge; - fdata = &oldmesh->fdata; - - totvert = oldmesh->totvert; - totface = oldmesh->totface; - totedge = oldmesh->totedge; - } - - /* copy non active mcol and mtface layers, these can't be edited - but will be preserved */ - CustomData_copy( fdata, &me->fdata, CD_MASK_MCOL|CD_MASK_MTFACE, - CD_DUPLICATE, totface ); - me->totfdata = totface; - - if( msticky ) - me->flags |= NMESH_HASVERTUV; - if( tfaces ) - me->flags |= NMESH_HASFACEUV; - if( mcols ) - me->flags |= NMESH_HASMCOL; - - me->verts = PyList_New( totvert ); - - for( i = 0; i < totvert; i++ ) { - MVert *oldmv = &mverts[i]; - MSticky *oldst = msticky ? &msticky[i] : NULL; - - PyList_SetItem( me->verts, i, - ( PyObject * ) nmvert_from_data( oldmv, - oldst, - oldmv->co, - i, - oldmv->flag ) ); - } - - me->faces = PyList_New( totface ); - for( i = 0; i < totface; i++ ) { - MTFace *oldtf = tfaces ? &tfaces[i] : NULL; - MCol *oldmc = mcols ? &mcols[i * 4] : NULL; - MFace *oldmf = &mfaces[i]; - int vidxs[4]; - vidxs[0] = oldmf->v1; - vidxs[1] = oldmf->v2; - vidxs[2] = oldmf->v3; - vidxs[3] = oldmf->v4; - - PyList_SetItem( me->faces, i, - ( PyObject * ) nmface_from_data( me, - vidxs, - oldmf-> - mat_nr, - oldmf-> - flag, - oldtf, - oldmc, - i) ); - } - - me->edges = PyList_New( totedge ); - for( i = 0; i < totedge; i++ ) - { - MEdge *edge = &medges[i]; - PyList_SetItem( me->edges, i, (PyObject*)nmedge_from_data ( me, edge ) ); - } - - me->materials = EXPP_PyList_fromMaterialList( oldmesh->mat, oldmesh->totcol, 0 ); - } - - return ( PyObject * ) me; -} - -PyObject *new_NMesh( Mesh * oldmesh ) -{ - return new_NMesh_internal( oldmesh, NULL ); -} - -static PyObject *M_NMesh_New( PyObject * self, PyObject * args ) -{ - char *name = NULL; - PyObject *ret = NULL; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or a string as argument" ); - - ret = new_NMesh( NULL ); - - if( ret && name ) { - BPy_NMesh *nmesh = ( BPy_NMesh * ) ret; - Py_DECREF( nmesh->name ); - nmesh->name = PyString_FromString( name ); - } - - return ret; -} - -static PyObject *M_NMesh_GetRaw( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Mesh *oldmesh = NULL; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ); - - if( name ) { - oldmesh = ( Mesh * ) GetIdFromList( &( G.main->mesh ), name ); - - if( !oldmesh ) - return EXPP_incr_ret( Py_None ); - } - - return new_NMesh( oldmesh ); -} - -static PyObject *M_NMesh_GetNames(PyObject *self) -{ - PyObject *names = PyList_New(0), *tmpstr; - Mesh *me = G.main->mesh.first; - - while (me) { - tmpstr = PyString_FromString(me->id.name+2); - PyList_Append(names, tmpstr); - Py_DECREF(tmpstr); - me = me->id.next; - } - - return names; -} - -/* Note: NMesh.GetRawFromObject gets the display list mesh from Blender: - * the vertices are already transformed / deformed. */ -static PyObject *M_NMesh_GetRawFromObject( PyObject * self, PyObject * args ) -{ - Object *ob; - PyObject *nmesh; - ListBase *lb=0; - DispList *dl; - char *name; - - if( !PyArg_ParseTuple( args, "s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - ob = ( Object * ) GetIdFromList( &( G.main->object ), name ); - - if( !ob ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, name ); - - - switch (ob->type) { - case OB_MBALL: - if( is_basis_mball(ob)) { - lb= &ob->disp; - if(lb->first==0) makeDispListMBall(ob); - nmesh = new_NMesh_displist(lb, ob); - } - else { - return EXPP_ReturnPyObjError( PyExc_AttributeError, "Object does not have geometry data" ); - } - break; - case OB_FONT: - case OB_CURVE: - { - Curve *cu= ob->data; - - lb= &cu->disp; - if(lb->first==0) makeDispListCurveTypes(ob, 0); - - dl= lb->first; - if(dl==0) - return EXPP_ReturnPyObjError( PyExc_AttributeError, "Object does not have geometry data" ); - - if(dl->nors==0) addnormalsDispList(ob, lb); - - nmesh = new_NMesh_displist(lb, ob); - } - break; - case OB_SURF: - - lb= &((Curve *)ob->data)->disp; - if(lb->first==0) makeDispListCurveTypes(ob, 0); - - dl= lb->first; - if(dl==0) - return EXPP_ReturnPyObjError( PyExc_AttributeError, "Object does not have geometry data" ); - - if(dl->nors==0) addnormalsDispList(ob, lb); - nmesh = new_NMesh_displist(lb, ob); - - break; - case OB_MESH: - { - CustomDataMask dataMask = CD_MASK_BAREMESH | CD_MASK_MTFACE - | CD_MASK_MCOL; - DerivedMesh *dm = mesh_create_derived_render( ob, dataMask ); - nmesh = new_NMesh_internal( ob->data, dm ); - dm->release(dm); - } - break; - default: - return EXPP_ReturnPyObjError( PyExc_AttributeError, "Object does not have geometry data" ); - } - -/* @hack: to mark that (deformed) mesh is readonly, so the update function - * will not try to write it. */ - - ( ( BPy_NMesh * ) nmesh )->mesh = 0; - - return nmesh; -} - -static void mvert_from_data( MVert * mv, MSticky * st, BPy_NMVert * from ) -{ - mv->co[0] = from->co[0]; - mv->co[1] = from->co[1]; - mv->co[2] = from->co[2]; - - mv->no[0] = (short)(from->no[0] * 32767.0); - mv->no[1] = (short)(from->no[1] * 32767.0); - mv->no[2] = (short)(from->no[2] * 32767.0); - - mv->flag = ( from->flag & 1 ); - mv->mat_nr = 0; - - if( st ) { - st->co[0] = from->uvco[0]; - st->co[1] = from->uvco[1]; - } -} - -static int assignFaceUV( MTFace * tf, BPy_NMFace * nmface ) -{ - PyObject *fuv, *tmp; - int i; - int len; - - fuv = nmface->uv; - /* if no UV info, allows things to proceed as normal */ - if( PySequence_Length( fuv ) == 0 ) { - tf->uv[0][0] = 0.0f; tf->uv[0][1] = 1.0f; - tf->uv[1][0] = 0.0f; tf->uv[1][1] = 0.0f; - tf->uv[2][0] = 1.0f; tf->uv[2][1] = 0.0f; - tf->uv[3][1] = 1.0f; tf->uv[3][1] = 1.0f; - return 1; - } - - /* if there are too many uv coordinates, only take the first 4 */ - len = PySequence_Length( fuv ); - if( len > 4 ) - len = 4; - - /* fuv = [(u_1, v_1), ... (u_n, v_n)] */ - for( i = 0; i < len; i++ ) { - tmp = PyList_GetItem( fuv, i ); /* stolen reference ! */ - if( !PyArg_ParseTuple - ( tmp, "ff", &( tf->uv[i][0] ), &( tf->uv[i][1] ) ) ) { - PyErr_SetString ( PyExc_TypeError, - "expected tuple of two floats for uv" ); - return 0; - } - } - if( nmface->image ) { /* image assigned ? */ - tf->tpage = ( void * ) nmface->image; - } else - tf->tpage = 0; - - tf->mode = nmface->mode; /* copy mode */ - tf->flag = (char)nmface->flag; /* copy flag */ - tf->transp = nmface->transp; /* copy transp flag */ - - return 1; -} - -static int mface_from_data( MFace * mf, CustomData *fdata, int findex, - BPy_NMFace * from ) -{ - BPy_NMVert *nmv; - MTFace *tf = CustomData_get(fdata, findex, CD_MTFACE); - MCol *col = CustomData_get(fdata, findex, CD_MCOL); - - int numverts = PyList_Size( from->v ); - if( numverts != 3 && numverts != 4 ) { /* face can only have three or four verts */ - PyErr_SetString ( PyExc_RuntimeError, - "faces must have at 3 or 4 vertices" ); - return 0; - } - - nmv = ( BPy_NMVert * ) PyList_GetItem( from->v, 0 ); - if( BPy_NMVert_Check( nmv ) && nmv->index != -1 ) - mf->v1 = nmv->index; - else - mf->v1 = 0; - - nmv = ( BPy_NMVert * ) PyList_GetItem( from->v, 1 ); - if( BPy_NMVert_Check( nmv ) && nmv->index != -1 ) - mf->v2 = nmv->index; - else - mf->v2 = 0; - - nmv = ( BPy_NMVert * ) PyList_GetItem( from->v, 2 ); - if( BPy_NMVert_Check( nmv ) && nmv->index != -1 ) - mf->v3 = nmv->index; - else - mf->v3 = 0; - - if( numverts == 4 ) { - nmv = ( BPy_NMVert * ) PyList_GetItem( from->v, 3 ); - if( BPy_NMVert_Check( nmv ) && nmv->index != -1 ) - mf->v4 = nmv->index; - else - mf->v4 = 0; - } - - if( tf ) - if( !assignFaceUV( tf, from ) ) - return 0; - - mf->mat_nr = from->mat_nr; - mf->flag = from->mf_flag; - - if( col ) { - int i, len = PySequence_Length( from->col ); - - if( len > 4 ) - len = 4; - - for( i = 0; i < len; i++, col++ ) { - BPy_NMCol *mc = - ( BPy_NMCol * ) PySequence_GetItem( from->col, - i ); - if( !BPy_NMCol_Check( mc ) ) { - Py_DECREF( mc ); - continue; - } - - col->b = mc->r; - col->g = mc->g; - col->r = mc->b; - col->a = mc->a; - - Py_DECREF( mc ); - } - } - - test_index_face(mf, fdata, findex, numverts); - - return 1; -} - -/* check for a valid UV sequence */ -static int check_validFaceUV( BPy_NMesh * nmesh ) -{ - PyObject *faces; - BPy_NMFace *nmface; - int i, n; - - faces = nmesh->faces; - for( i = 0; i < PySequence_Length( faces ); i++ ) { - nmface = ( BPy_NMFace * ) PyList_GetItem( faces, i ); - n = PySequence_Length( nmface->uv ); - if( n != PySequence_Length( nmface->v ) ) { - if( n > 0 ) - printf( "Warning: different length of vertex and UV coordinate " "list in face!\n" ); - return 0; - } - } - return 1; -} - -/* this is a copy of unlink_mesh in mesh.c, because ... */ -static void EXPP_unlink_mesh( Mesh * me ) -{ - int a; - - if( me == 0 ) - return; - - for( a = 0; a < me->totcol; a++ ) { - if( me->mat[a] ) - me->mat[a]->id.us--; - me->mat[a] = 0; - } - -/* ... here we want to preserve mesh keys */ -/* if users want to get rid of them, they can use mesh.removeAllKeys() */ -/* - if(me->key) me->key->id.us--; - me->key= 0; -*/ - if( me->texcomesh ) - me->texcomesh = 0; - - me->totcol = 0; -} - -static int unlink_existingMeshData( Mesh * mesh ) -{ - MDeformVert *dvert= NULL; - - EXPP_unlink_mesh( mesh ); - - if(mesh->dvert) { - /* we don't want to remove dvert here, check_dverts still needs it */ - dvert= mesh->dvert; - CustomData_set_layer( &mesh->vdata, CD_MDEFORMVERT, NULL ); - } - - CustomData_free( &mesh->vdata, mesh->totvert ); - CustomData_free( &mesh->edata, mesh->totedge ); - CustomData_free( &mesh->fdata, mesh->totface ); - mesh_update_customdata_pointers( mesh ); - - if(dvert) - mesh->dvert= CustomData_add_layer( &mesh->vdata, CD_MDEFORMVERT, - CD_ASSIGN, dvert, mesh->totvert ); - - mesh->totedge = 0; - - if( mesh->mat ) { - MEM_freeN( mesh->mat ); - mesh->mat = NULL; - } - - return 1; -} - -Material **nmesh_updateMaterials( BPy_NMesh * nmesh ) -{ - Material **matlist; - Mesh *mesh = nmesh->mesh; - int len = PyList_Size( nmesh->materials ); - - if( !mesh ) { - printf( "FATAL INTERNAL ERROR: illegal call to updateMaterials()\n" ); - return 0; - } - - if( len > 0 ) { - matlist = EXPP_newMaterialList_fromPyList( nmesh->materials ); - EXPP_incr_mats_us( matlist, len ); - - if( mesh->mat ) - MEM_freeN( mesh->mat ); - - mesh->mat = matlist; - - } else { - matlist = 0; - } - mesh->totcol = (short)len; - -/**@ This is another ugly fix due to the weird material handling of blender. - * it makes sure that object material lists get updated (by their length) - * according to their data material lists, otherwise blender crashes. - * It just stupidly runs through all objects...BAD BAD BAD. - */ - test_object_materials( ( ID * ) mesh ); - - return matlist; -} - -PyObject *NMesh_assignMaterials_toObject( BPy_NMesh * nmesh, Object * ob ) -{ - BPy_Material *pymat; - Material *ma; - int i; - short old_matmask; - Mesh *mesh = nmesh->mesh; - int nmats; /* number of mats == len(nmesh->materials) */ - - old_matmask = ob->colbits; /*@ HACK: save previous colbits */ - ob->colbits = 0; /* make assign_material work on mesh linked material */ - - nmats = PyList_Size( nmesh->materials ); - - if( nmats > 0 && !mesh->mat ) { - ob->totcol = (char)nmats; - mesh->totcol = (short)nmats; - mesh->mat = - MEM_callocN( sizeof( void * ) * nmats, "bpy_memats" ); - - if( ob->mat ) - MEM_freeN( ob->mat ); - ob->mat = - MEM_callocN( sizeof( void * ) * nmats, "bpy_obmats" ); - } - - for( i = 0; i < nmats; i++ ) { - pymat = ( BPy_Material * ) PySequence_GetItem( nmesh-> - materials, i ); - - if( BPy_Material_Check( ( PyObject * ) pymat ) ) { - ma = pymat->material; - assign_material( ob, ma, i + 1 ); /*@ XXX don't use this function anymore */ - } else { - Py_DECREF( pymat ); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Material type in attribute list 'materials'!" ); - } - - Py_DECREF( pymat ); - } - - ob->colbits = old_matmask; /*@ HACK */ - - ob->actcol = 1; - Py_RETURN_NONE; -} - -static void fill_medge_from_nmesh(Mesh * mesh, BPy_NMesh * nmesh) -{ - int i,j; - MEdge *faces_edges=NULL; - int tot_faces_edges=0; - int tot_valid_faces_edges=0; - int nmeshtotedges=PyList_Size(nmesh->edges); - int tot_valid_nmedges=0; - BPy_NMEdge **valid_nmedges=NULL; - - valid_nmedges=MEM_callocN(nmeshtotedges*sizeof(BPy_NMEdge *), "make BPy_NMEdge"); - - /* First compute the list of edges that exists because faces exists */ - make_edges(mesh, 0); /* 0 = draw all edges */ - - faces_edges=mesh->medge; - tot_faces_edges=mesh->totedge; - tot_valid_faces_edges=tot_faces_edges; - - mesh->medge= CustomData_set_layer(&mesh->edata, CD_MEDGE, NULL); - CustomData_free_layer_active(&mesh->edata, CD_MEDGE, mesh->totedge); - mesh->totedge = 0; - - /* Flag each edge in faces_edges that is already in nmesh->edges list. - * Flaging an edge means MEdge v1=v2=0. - * Each time an edge is flagged, tot_valid_faces_edges is decremented. - * - * Also store in valid_nmedges pointers to each valid NMEdge in nmesh->edges. - * An invalid NMEdge is an edge that has a vertex that is not in the vertices - * list. Ie its index is -1. - * Each time an valid NMEdge is flagged, tot_valid_nmedges is incremented. - */ - for( i = 0; i < nmeshtotedges; ++i ) - { - int v1idx,v2idx; - BPy_NMEdge *edge=( BPy_NMEdge *) PyList_GetItem(nmesh->edges, i); - BPy_NMVert *v=(BPy_NMVert *)edge->v1; - v1idx=v->index; - v=(BPy_NMVert *)edge->v2; - v2idx=v->index; - if (-1 == v1idx || -1 == v2idx) continue; - valid_nmedges[tot_valid_nmedges]=edge; - ++tot_valid_nmedges; - for( j = 0; j < tot_faces_edges; j++ ) - { - MEdge *me=faces_edges+j; - if ( ((int)me->v1==v1idx && (int)me->v2==v2idx) || - ((int)me->v1==v2idx && (int)me->v2==v1idx) ) - { - me->v1=0; me->v2=0; - --tot_valid_faces_edges; - } - } - } - - /* tot_valid_faces_edges < 0 causes a sigsegv crash, so we - * clamp to prevent it - * (this is related to faces (correctly) requiring at least 3 verts now, - * which can break old scripts -- maybe we should also warn about the - * 'broken' mesh the user created, but for now, until we investigate - * better, this should do) */ - if (tot_valid_faces_edges < 0) tot_valid_faces_edges = 0; - - /* Now we have the total count of valid edges */ - mesh->totedge=tot_valid_nmedges+tot_valid_faces_edges; - mesh->medge= CustomData_add_layer( &mesh->edata, CD_MEDGE, CD_CALLOC, NULL, - mesh->totedge ); - - for ( i = 0; i < tot_valid_nmedges; ++i ) - { - BPy_NMEdge *edge=valid_nmedges[i]; - MEdge *medge=mesh->medge+i; - int v1=((BPy_NMVert *)edge->v1)->index; - int v2=((BPy_NMVert *)edge->v2)->index; - medge->v1=v1; - medge->v2=v2; - medge->flag=edge->flag; - medge->crease=edge->crease; - } - for ( i = 0, j = tot_valid_nmedges; i < tot_faces_edges; ++i ) - { - MEdge *edge=faces_edges+i; - if (edge->v1!=0 || edge->v2!=0) // valid edge - { - MEdge *medge=mesh->medge+j; - medge->v1=edge->v1; - medge->v2=edge->v2; - medge->flag=ME_EDGEDRAW|ME_EDGERENDER; - medge->crease=0; - ++j; - } - } - - MEM_freeN( valid_nmedges ); - MEM_freeN( faces_edges ); -} - -/* this should ensure meshes don't end up with wrongly sized - * me->dvert arrays, which can cause hangs; it's not ideal, - * it's better to wrap dverts in NMesh, but it should do for now - * since there are also methods in NMesh to edit dverts in the actual - * mesh in Blender and anyway this is memory friendly */ -static void check_dverts(Mesh *me, int old_totvert) -{ - int totvert = me->totvert; - - /* if vert count didn't change or there are no dverts, all is fine */ - if ((totvert == old_totvert) || (!me->dvert)) return; - /* if all verts have been deleted, free old dverts */ - else if (totvert == 0) { - CustomData_free_layer_active( &me->vdata, CD_MDEFORMVERT, old_totvert ); - me->dvert= NULL; - } - else { - /* verts added or removed, make new me->dvert */ - MDeformVert *mdv = MEM_callocN( sizeof(MDeformVert)*totvert, "mdv" ); - copy_dverts( mdv, me->dvert, MIN2( old_totvert, totvert ) ); - free_dverts( me->dvert, old_totvert ); - me->dvert= CustomData_set_layer( &me->vdata, CD_MDEFORMVERT, mdv ); - } -} - -static void check_mtface_mcols( BPy_NMesh *nmesh, Mesh *mesh ) -{ - int i; - - /* copy non-active mcol and mtface layers based on original index */ - CustomData_merge( &nmesh->fdata, &mesh->fdata, CD_MASK_MCOL|CD_MASK_MTFACE, - CD_DEFAULT, mesh->totface ); - - for( i = 0; i < mesh->totface; i++ ) { - BPy_NMFace *mf = - ( BPy_NMFace * ) PySequence_GetItem( nmesh->faces, i ); - - if ( mf->orig_index != -1 ) - CustomData_copy_data( &nmesh->fdata, &mesh->fdata, mf->orig_index, - i, 1 ); - - Py_DECREF( mf ); - } - - /* add new layers if needed */ - if( ( nmesh->flags & NMESH_HASMCOL ) && - !CustomData_has_layer( &mesh->fdata, CD_MCOL ) ) { - mesh->mcol = CustomData_add_layer( &mesh->fdata, CD_MCOL, - CD_DEFAULT, NULL, mesh->totface ); - } - - if( ( nmesh->flags & NMESH_HASFACEUV ) || check_validFaceUV( nmesh ) ) { - if ( !CustomData_has_layer( &mesh->fdata, CD_MTFACE) ) - make_tfaces( mesh ); - nmesh->flags |= NMESH_HASFACEUV; - } - else - CustomData_free_layers( &mesh->fdata, CD_MTFACE, mesh->totface ); - - /* active uvs and colors from NMFace will be written in mface_from_data */ -} - -static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh) -{ - MFace *newmf; - MVert *newmv; - MSticky *newst; - int nmeshtotedges; - int i, j, ok; - - /* Minor note: we used 'mode' because 'flag' was already used internally - * by nmesh */ - mesh->flag = nmesh->mode; - mesh->smoothresh = nmesh->smoothresh; - mesh->subdiv = nmesh->subdiv[0]; - mesh->subdivr = nmesh->subdiv[1]; - - /*@ material assignment moved to PutRaw */ - mesh->totvert = PySequence_Length( nmesh->verts ); - if( mesh->totvert ) { - if( nmesh->flags & NMESH_HASVERTUV ) - mesh->msticky = CustomData_add_layer( &mesh->vdata, CD_MSTICKY, - CD_CALLOC, NULL, mesh->totvert ); - - mesh->mvert = CustomData_add_layer( &mesh->vdata, CD_MVERT, CD_CALLOC, - NULL, mesh->totvert ); - } - - if( mesh->totvert ) - mesh->totface = PySequence_Length( nmesh->faces ); - else - mesh->totface = 0; - - if( mesh->totface ) { - check_mtface_mcols( nmesh, mesh ); - - mesh->mface = CustomData_add_layer( &mesh->fdata, CD_MFACE, CD_CALLOC, - NULL, mesh->totface ); - } - - mesh_update_customdata_pointers( mesh ); - - /*@ This stuff here is to tag all the vertices referenced - * by faces, then untag the vertices which are actually - * in the vert list. Any vertices untagged will be ignored - * by the mface_from_data function. It comes from my - * screwed up decision to not make faces only store the - * index. - Zr - */ - for( i = 0; i < mesh->totface; i++ ) { - BPy_NMFace *mf = - ( BPy_NMFace * ) PySequence_GetItem( nmesh->faces, i ); - - j = PySequence_Length( mf->v ); - while( j-- ) { - BPy_NMVert *mv = - ( BPy_NMVert * ) PySequence_GetItem( mf->v, - j ); - if( BPy_NMVert_Check( mv ) ) - mv->index = -1; - Py_DECREF( mv ); - } - - Py_DECREF( mf ); - } - /* do the same for edges if there is edge data */ - nmeshtotedges=PyList_Size(nmesh->edges); - for( i = 0; i < nmeshtotedges; ++i ) - { - BPy_NMEdge *edge=( BPy_NMEdge *) PyList_GetItem(nmesh->edges, i); - BPy_NMVert *v=(BPy_NMVert *)edge->v1; - v->index=-1; - v=(BPy_NMVert *)edge->v2; - v->index=-1; - } - - for( i = 0; i < mesh->totvert; i++ ) { - BPy_NMVert *mv = - ( BPy_NMVert * ) PySequence_GetItem( nmesh->verts, i ); - mv->index = i; - Py_DECREF( mv ); - } - - newmv = mesh->mvert; - newst = mesh->msticky; - for( i = 0; i < mesh->totvert; i++ ) { - PyObject *mv = PySequence_GetItem( nmesh->verts, i ); - mvert_from_data( newmv, newst, ( BPy_NMVert * ) mv ); - Py_DECREF( mv ); - - newmv++; - if( newst ) - newst++; - } - - newmf = mesh->mface; - for( i = 0; i < mesh->totface; i++ ) { - PyObject *mf = PySequence_GetItem( nmesh->faces, i ); - ok = mface_from_data( newmf, &mesh->fdata, i, ( BPy_NMFace * ) mf ); - Py_DECREF( mf ); - if( !ok ) - return 0; - newmf++; - } - - /* Always do this to ensure no loose edges in faces */ - fill_medge_from_nmesh(mesh, nmesh); - - return 1; -} - -static PyObject *M_NMesh_PutRaw( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Mesh *mesh = NULL; - Object *ob = NULL; - BPy_NMesh *nmesh; - int recalc_normals = 1; - int store_edges = 0; - int old_totvert = 0; - - if( !PyArg_ParseTuple( args, "O!|sii", - &NMesh_Type, &nmesh, &name, &recalc_normals, &store_edges ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected an NMesh object and optionally also a string and two ints" ); - - if( check_NMeshLists( nmesh ) ) - return NULL; - - if( name ) - mesh = ( Mesh * ) GetIdFromList( &( G.main->mesh ), name ); - - if( !mesh || mesh->id.us == 0 ) { - ob = add_object( OB_MESH ); - if( !ob ) { - PyErr_SetString( PyExc_RuntimeError, - "Fatal: could not create mesh object" ); - return 0; - } - - if( !mesh ) - mesh = ( Mesh * ) ob->data; - else - set_mesh( ob, mesh ); // also does id.us++ - - nmesh->object = ob; // linking so vgrouping methods know which obj to work on - } - - if( name ) - new_id( &( G.main->mesh ), &mesh->id, name ); - else if( nmesh->name && nmesh->name != Py_None ) - new_id( &( G.main->mesh ), &mesh->id, - PyString_AsString( nmesh->name ) ); - - old_totvert = mesh->totvert; - - unlink_existingMeshData( mesh ); - if( !convert_NMeshToMesh( mesh, nmesh ) ) - return NULL; - nmesh->mesh = mesh; - - if (mesh->dvert) check_dverts(mesh, old_totvert); - - if( recalc_normals ) - mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL); - - mesh_update( mesh, nmesh->object ); - - if( !during_script( ) ) - EXPP_allqueue( REDRAWVIEW3D, 0 ); - - if (ob && G.obedit) { /* prevents a crash when a new object is created */ - exit_editmode(EM_FREEDATA); - enter_editmode(0); - } - - // @OK...this requires some explanation: - // Materials can be assigned two ways: - // a) to the object data (in this case, the mesh) - // b) to the Object - // - // Case a) is wanted, if Mesh data should be shared among objects, - // as well as its materials (up to 16) - // Case b) is wanted, when Mesh data should be shared, but not the - // materials. For example, you want several checker boards sharing their - // mesh data, but having different colors. So you would assign material - // index 0 to all even, index 1 to all odd faces and bind the materials - // to the Object instead (MaterialButtons: [OB] "link materials to object") - // - // This feature implies that pointers to materials can be stored in - // an object or a mesh. The number of total materials MUST be - // synchronized (ob->totcol <-> mesh->totcol). We avoid the dangerous - // direct access by calling blenderkernel/material.c:assign_material(). - - // The flags setting the material binding is found in ob->colbits, where - // each bit indicates the binding PER MATERIAL - - if( ob ) { // we created a new object - NMesh_assignMaterials_toObject( nmesh, ob ); - EXPP_synchronizeMaterialLists( ob ); - return Object_CreatePyObject( ob ); - } else { - mesh->mat = - EXPP_newMaterialList_fromPyList( nmesh->materials ); - EXPP_incr_mats_us( mesh->mat, - PyList_Size( nmesh->materials ) ); - Py_RETURN_NONE; - } - -} - -#undef MethodDef -#define MethodDef(func) \ - {#func, M_NMesh_##func, METH_VARARGS, M_NMesh_##func##_doc} - -static struct PyMethodDef M_NMesh_methods[] = { - MethodDef( Col ), - MethodDef( Vert ), - MethodDef( Face ), - MethodDef( New ), - MethodDef( GetRaw ), - MethodDef( GetRawFromObject ), - MethodDef( PutRaw ), - {"GetNames", (PyCFunction)M_NMesh_GetNames, METH_NOARGS, - M_NMesh_GetNames_doc}, - {NULL, NULL, 0, NULL} -}; - -static PyObject *M_NMesh_Modes( void ) -{ - PyObject *Modes = PyConstant_New( ); - - if( Modes ) { - BPy_constant *d = ( BPy_constant * ) Modes; - - PyConstant_Insert( d, "NOVNORMALSFLIP", - PyInt_FromLong - ( ME_NOPUNOFLIP ) ); - PyConstant_Insert( d, "TWOSIDED", - PyInt_FromLong( ME_TWOSIDED ) ); - PyConstant_Insert( d, "AUTOSMOOTH", - PyInt_FromLong - ( ME_AUTOSMOOTH ) ); - } - - return Modes; -} - -#undef EXPP_ADDCONST -#define EXPP_ADDCONST(dict, name) \ - PyConstant_Insert(dict, #name, PyInt_FromLong(TF_##name)) -/* Set constants for face drawing mode -- see drawmesh.c */ - -static PyObject *M_NMesh_FaceModesDict( void ) -{ - PyObject *FM = PyConstant_New( ); - - if( FM ) { - BPy_constant *d = ( BPy_constant * ) FM; - - PyConstant_Insert( d, "BILLBOARD", - PyInt_FromLong( TF_BILLBOARD2 ) ); - PyConstant_Insert( d, "ALL", PyInt_FromLong( 0x7fff ) ); - PyConstant_Insert( d, "HALO", PyInt_FromLong( TF_BILLBOARD ) ); - PyConstant_Insert( d, "DYNAMIC", PyInt_FromLong( TF_DYNAMIC ) ); - PyConstant_Insert( d, "INVISIBLE", PyInt_FromLong( TF_INVISIBLE ) ); - PyConstant_Insert( d, "LIGHT", PyInt_FromLong( TF_LIGHT ) ); - PyConstant_Insert( d, "OBCOL", PyInt_FromLong( TF_OBCOL ) ); - PyConstant_Insert( d, "SHADOW", PyInt_FromLong( TF_SHADOW ) ); - PyConstant_Insert( d, "TEXT", PyInt_FromLong( TF_BMFONT ) ); - PyConstant_Insert( d, "SHAREDVERT", PyInt_FromLong( TF_SHAREDVERT ) ); - PyConstant_Insert( d, "SHAREDCOL", PyInt_FromLong( TF_SHAREDCOL ) ); - PyConstant_Insert( d, "TEX", PyInt_FromLong( TF_TEX ) ); - PyConstant_Insert( d, "TILES", PyInt_FromLong( TF_TILES ) ); - PyConstant_Insert( d, "TWOSIDE", PyInt_FromLong( TF_TWOSIDE ) ); - } - - return FM; -} - -static PyObject *M_NMesh_FaceFlagsDict( void ) -{ - PyObject *FF = PyConstant_New( ); - - if( FF ) { - BPy_constant *d = ( BPy_constant * ) FF; - - EXPP_ADDCONST( d, SELECT ); - EXPP_ADDCONST( d, HIDE ); - EXPP_ADDCONST( d, ACTIVE ); - } - - return FF; -} - -static PyObject *M_NMesh_FaceTranspModesDict( void ) -{ - PyObject *FTM = PyConstant_New( ); - - if( FTM ) { - BPy_constant *d = ( BPy_constant * ) FTM; - - EXPP_ADDCONST( d, SOLID ); - EXPP_ADDCONST( d, ADD ); - EXPP_ADDCONST( d, ALPHA ); - EXPP_ADDCONST( d, SUB ); - } - - return FTM; -} - -static PyObject *M_NMesh_EdgeFlagsDict( void ) -{ - PyObject *EF = PyConstant_New( ); - - if( EF ) { - BPy_constant *d = ( BPy_constant * ) EF; - - PyConstant_Insert(d, "SELECT", PyInt_FromLong(1)); - PyConstant_Insert(d, "EDGEDRAW", PyInt_FromLong(ME_EDGEDRAW)); - PyConstant_Insert(d, "EDGERENDER", PyInt_FromLong(ME_EDGERENDER)); - PyConstant_Insert(d, "SEAM", PyInt_FromLong(ME_SEAM)); - PyConstant_Insert(d, "FGON", PyInt_FromLong(ME_FGON)); - } - - return EF; -} - -PyObject *NMesh_Init( void ) -{ - PyObject *submodule; - - PyObject *Modes = M_NMesh_Modes( ); - PyObject *FaceFlags = M_NMesh_FaceFlagsDict( ); - PyObject *FaceModes = M_NMesh_FaceModesDict( ); - PyObject *FaceTranspModes = M_NMesh_FaceTranspModesDict( ); - PyObject *EdgeFlags = M_NMesh_EdgeFlagsDict( ); - - NMCol_Type.ob_type = &PyType_Type; - NMFace_Type.ob_type = &PyType_Type; - NMVert_Type.ob_type = &PyType_Type; - NMesh_Type.ob_type = &PyType_Type; - - submodule = - Py_InitModule3( "Blender.NMesh", M_NMesh_methods, - M_NMesh_doc ); - - if( Modes ) - PyModule_AddObject( submodule, "Modes", Modes ); - if( FaceFlags ) - PyModule_AddObject( submodule, "FaceFlags", FaceFlags ); - if( FaceModes ) - PyModule_AddObject( submodule, "FaceModes", FaceModes ); - if( FaceTranspModes ) - PyModule_AddObject( submodule, "FaceTranspModes", - FaceTranspModes ); - if( EdgeFlags ) - PyModule_AddObject( submodule, "EdgeFlags", EdgeFlags ); - - g_nmeshmodule = submodule; - return submodule; -} - -/* These are needed by Object.c */ - -PyObject *NMesh_CreatePyObject( Mesh * me, Object * ob ) -{ - BPy_NMesh *nmesh = ( BPy_NMesh * ) new_NMesh( me ); - - if( nmesh ) - nmesh->object = ob; /* linking nmesh and object for vgrouping methods */ - - return ( PyObject * ) nmesh; -} - -int NMesh_CheckPyObject( PyObject * pyobj ) -{ - return ( pyobj->ob_type == &NMesh_Type ); -} - -Mesh *NMesh_FromPyObject( PyObject * pyobj, Object * ob ) -{ - if( pyobj->ob_type == &NMesh_Type ) { - Mesh *mesh; - BPy_NMesh *nmesh = ( BPy_NMesh * ) pyobj; - - if( nmesh->mesh ) { - mesh = nmesh->mesh; - } else { - mesh = Mesh_fromNMesh( nmesh ); - if( !mesh ) /* NULL means an PyError */ - return NULL; - - nmesh->mesh = mesh; - - nmesh->object = ob; /* linking for vgrouping methods */ - if( nmesh->name && nmesh->name != Py_None ) - new_id( &( G.main->mesh ), &mesh->id, - PyString_AsString( nmesh->name ) ); - mesh_update( mesh, nmesh->object ); - nmesh_updateMaterials( nmesh ); - } - return mesh; - } - - PyErr_SetString( PyExc_AttributeError, - "link argument type is not supported " ); - return NULL; -} - -#define POINTER_CROSS_EQ(a1, a2, b1, b2) (((a1)==(b1) && (a2)==(b2)) || ((a1)==(b2) && (a2)==(b1))) - -static PyObject *findEdge( BPy_NMesh *nmesh, BPy_NMVert *v1, BPy_NMVert *v2, int create) -{ - int i; - - for ( i = 0; i < PyList_Size(nmesh->edges); ++i ) - { - BPy_NMEdge *edge=(BPy_NMEdge*)PyList_GetItem( nmesh->edges, i ); - if (!BPy_NMEdge_Check(edge)) continue; - if ( POINTER_CROSS_EQ((BPy_NMVert*)edge->v1, (BPy_NMVert*)edge->v2, v1, v2) ) - { - return EXPP_incr_ret((PyObject*)edge); - } - } - - /* if this line is reached, edge has not been found */ - if (create) - { - PyObject *newEdge=(PyObject *)new_NMEdge(v1, v2, 0, ME_EDGEDRAW|ME_EDGERENDER); - PyList_Append(nmesh->edges, newEdge); - return newEdge; - } - else - Py_RETURN_NONE; -} - -static void removeEdge( BPy_NMesh *nmesh, BPy_NMVert *v1, BPy_NMVert *v2, int ununsedOnly) -{ - int i,j; - BPy_NMEdge *edge=NULL; - int edgeUsedByFace=0; - int totedge=PyList_Size(nmesh->edges); - - /* find the edge in the edge list */ - for ( i = 0; i < totedge; ++i ) - { - edge=(BPy_NMEdge*)PyList_GetItem( nmesh->edges, i ); - if (!BPy_NMEdge_Check(edge)) continue; - if ( POINTER_CROSS_EQ((BPy_NMVert*)edge->v1, (BPy_NMVert*)edge->v2, v1, v2) ) - { - break; - } - } - - if (i==totedge || !edge) // edge not found - return; - - for ( j = PyList_Size(nmesh->faces)-1; j >= 0 ; --j ) - { - BPy_NMFace *face=(BPy_NMFace *)PyList_GetItem(nmesh->faces, j); - int k, del_face=0; - int totv; - if (!BPy_NMFace_Check(face)) continue; - totv=PyList_Size(face->v); - if (totv<2) continue; - for ( k = 0; k < totv && !del_face; ++k ) - { - BPy_NMVert *fe_v1=(BPy_NMVert *)PyList_GetItem(face->v, k ? k-1 : totv-1); - BPy_NMVert *fe_v2=(BPy_NMVert *)PyList_GetItem(face->v, k); - if ( POINTER_CROSS_EQ(v1, v2, fe_v1, fe_v2) ) - { - edgeUsedByFace=1; - del_face=1; - } - } - if (del_face && !ununsedOnly) - { - PySequence_DelItem(nmesh->faces, j); - } - } - - if (!ununsedOnly || (ununsedOnly && !edgeUsedByFace) ) - PySequence_DelItem(nmesh->edges, PySequence_Index(nmesh->edges, (PyObject*)edge)); -} - - -static PyObject *NMesh_addEdge( PyObject * self, PyObject * args ) -{ - BPy_NMesh *bmesh=(BPy_NMesh *)self; - BPy_NMVert *v1=NULL, *v2=NULL; - - if (!PyArg_ParseTuple - ( args, "O!O!", &NMVert_Type, &v1, &NMVert_Type, &v2 ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected NMVert, NMVert" ); - } - - if (v1==v2) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "vertices must be different" ); - - return findEdge(bmesh, v1, v2, 1); -} - -static PyObject *NMesh_findEdge( PyObject * self, PyObject * args ) -{ - BPy_NMesh *bmesh=(BPy_NMesh *)self; - BPy_NMVert *v1=NULL, *v2=NULL; - - if (!PyArg_ParseTuple - ( args, "O!O!", &NMVert_Type, &v1, &NMVert_Type, &v2 ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected NMVert, NMVert" ); - } - - if (v1==v2) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "vertices must be different" ); - - return findEdge(bmesh, v1, v2, 0); -} - -static PyObject *NMesh_removeEdge( PyObject * self, PyObject * args ) -{ - BPy_NMesh *bmesh=(BPy_NMesh *)self; - BPy_NMVert *v1=NULL, *v2=NULL; - - if (!PyArg_ParseTuple - ( args, "O!O!", &NMVert_Type, &v1, &NMVert_Type, &v2 ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected NMVert, NMVert" ); - } - - if (v1==v2) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "vertices must be different" ); - removeEdge(bmesh, v1, v2, 0); - - Py_RETURN_NONE; -} - - -static PyObject *NMesh_addFace( PyObject * self, PyObject * args ) -{ - BPy_NMesh *nmesh=(BPy_NMesh *)self; - - BPy_NMFace *face; - int totv=0; - - if (!PyArg_ParseTuple - ( args, "O!", &NMFace_Type, &face ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected NMFace argument" ); - } - - totv=PyList_Size(face->v); - - /* - * Before edges data exists, having faces with two vertices was - * the only way of storing edges not attached to any face. - */ - if (totv!=2) - PyList_Append(nmesh->faces, (PyObject*)face); - - if (totv>=2) - { - /* when totv==2, there is only one edge, when totv==3 there is three edges - * and when totv==4 there is four edges. - * that's why in the following line totv==2 is a special case */ - PyObject *edges = PyList_New((totv==2) ? 1 : totv); - if (totv==2) - { - BPy_NMVert *fe_v1=(BPy_NMVert *)PyList_GetItem(face->v, 0); - BPy_NMVert *fe_v2=(BPy_NMVert *)PyList_GetItem(face->v, 1); - BPy_NMEdge *edge=(BPy_NMEdge *)findEdge(nmesh, fe_v1, fe_v2, 1); - PyList_SetItem(edges, 0, (PyObject*)edge); // PyList_SetItem steals the reference - } - else - { - int k; - for ( k = 0; k < totv; ++k ) - { - BPy_NMVert *fe_v1=(BPy_NMVert *)PyList_GetItem(face->v, k ? k-1 : totv-1); - BPy_NMVert *fe_v2=(BPy_NMVert *)PyList_GetItem(face->v, k); - BPy_NMEdge *edge=(BPy_NMEdge *)findEdge(nmesh, fe_v1, fe_v2, 1); - PyList_SetItem(edges, k, (PyObject*)edge); // PyList_SetItem steals the reference - } - } - return edges; - } - - Py_RETURN_NONE; -} - -static PyObject *NMesh_removeFace( PyObject * self, PyObject * args ) -{ - BPy_NMesh *nmesh=(BPy_NMesh *)self; - - BPy_NMFace *face; - int totv=0; - - if (!PyArg_ParseTuple - ( args, "O!", &NMFace_Type, &face ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected NMFace argument" ); - } - - totv=PyList_Size(face->v); - - { - int index=PySequence_Index(nmesh->faces, (PyObject*)face); - if (index>=0) - PySequence_DelItem(nmesh->faces, index); - } - - if (totv>=2) - { - /* when totv==2, there is only one edge, when totv==3 there is three edges - * and when totv==4 there is four edges. - * that's why in the following line totv==2 is a special case */ - if (totv==2) - { - BPy_NMVert *fe_v1=(BPy_NMVert *)PyList_GetItem(face->v, 0); - BPy_NMVert *fe_v2=(BPy_NMVert *)PyList_GetItem(face->v, 1); - removeEdge(nmesh, fe_v1, fe_v2, 1); - } - else - { - int k; - for ( k = 0; k < totv; ++k ) - { - BPy_NMVert *fe_v1=(BPy_NMVert *)PyList_GetItem(face->v, k ? k-1 : totv-1); - BPy_NMVert *fe_v2=(BPy_NMVert *)PyList_GetItem(face->v, k); - removeEdge(nmesh, fe_v1, fe_v2, 1); - } - } - } - - Py_RETURN_NONE; -} - -static PyObject *NMesh_printDebug( PyObject * self ) -{ - BPy_NMesh *bmesh=(BPy_NMesh *)self; - - Mesh *mesh=bmesh->mesh; - - printf("**Vertices\n"); - { - int i; - for (i=0; itotvert; ++i) - { - MVert *v=mesh->mvert+i; - double x=v->co[0]; - double y=v->co[1]; - double z=v->co[2]; - printf(" %2d : %.3f %.3f %.3f\n", i, x, y, z); - } - } - - printf("**Edges\n"); - { - int i; - for (i=0; itotedge; ++i) - { - MEdge *e=mesh->medge+i; - int v1 = e->v1; - int v2 = e->v2; - int flag = e->flag; - printf(" %2d : %2d %2d flag=%d\n", i, v1, v2, flag); - } - } - - printf("**Faces\n"); - { - int i; - for (i=0; itotface; ++i) - { - MFace *e=((MFace*)(mesh->mface))+i; - int v1 = e->v1; - int v2 = e->v2; - int v3 = e->v3; - int v4 = e->v4; - printf(" %2d : %2d %2d %2d %2d\n", i, v1, v2, v3, v4); - } - } - - Py_RETURN_NONE; -} - -static PyObject *NMesh_addVertGroup( PyObject * self, PyObject * args ) -{ - char *groupStr; - struct Object *object; - PyObject *tempStr; - - if( !PyArg_ParseTuple( args, "s", &groupStr ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if( ( ( BPy_NMesh * ) self )->object == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first..." ); - - object = ( ( BPy_NMesh * ) self )->object; - - //get clamped name - tempStr = PyString_FromStringAndSize( groupStr, 32 ); - groupStr = PyString_AsString( tempStr ); - - add_defgroup_name( object, groupStr ); - - EXPP_allqueue( REDRAWBUTSALL, 1 ); - - Py_RETURN_NONE; -} - -static PyObject *NMesh_removeVertGroup( PyObject * self, PyObject * args ) -{ - char *groupStr; - struct Object *object; - int nIndex; - bDeformGroup *pGroup; - - if( !PyArg_ParseTuple( args, "s", &groupStr ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if( ( ( BPy_NMesh * ) self )->object == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first..." ); - - object = ( ( BPy_NMesh * ) self )->object; - - pGroup = get_named_vertexgroup( object, groupStr ); - if( pGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no deform groups assigned to mesh" ); - nIndex++; - object->actdef = (unsigned short)nIndex; - - del_defgroup( object ); - - EXPP_allqueue( REDRAWBUTSALL, 1 ); - - Py_RETURN_NONE; -} - -static PyObject *NMesh_assignVertsToGroup( PyObject * self, PyObject * args ) -{ - //listObject is an integer list of vertex indices to add to group - //groupStr = group name - //weight is a float defining the weight this group has on this vertex - //assignmode = "replace", "add", "subtract" - // replace weight - add addition weight to vertex for this group - // - remove group influence from this vertex - //the function will not like it if your in editmode... - - char *groupStr; - char *assignmodeStr = NULL; - int nIndex; - int assignmode; - float weight = 1.0; - struct Object *object; - bDeformGroup *pGroup; - PyObject *listObject; - int tempInt; - int x; - - if( ( ( BPy_NMesh * ) self )->object == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first..." ); - - if( !PyArg_ParseTuple - ( args, "sO!fs", &groupStr, &PyList_Type, &listObject, &weight, - &assignmodeStr ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string, list, float, string arguments" ); - } - - object = ( ( BPy_NMesh * ) self )->object; - - if( object->data == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object contains no data..." ); - - pGroup = get_named_vertexgroup( object, groupStr ); - if( pGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no deform groups assigned to mesh" ); - - if( assignmodeStr == NULL ) - assignmode = 1; /* default */ - else if( STREQ( assignmodeStr, "replace" ) ) - assignmode = 1; - else if( STREQ( assignmodeStr, "add" ) ) - assignmode = 2; - else if( STREQ( assignmodeStr, "subtract" ) ) - assignmode = 3; - else - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad assignment mode" ); - - //makes a set of dVerts corresponding to the mVerts - if( !( ( Mesh * ) object->data )->dvert ) { - create_dverts( object->data ); - } - //loop list adding verts to group - for( x = 0; x < PyList_Size( listObject ); x++ ) { - if( ! - ( PyArg_Parse - ( ( PyList_GetItem( listObject, x ) ), "i", - &tempInt ) ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "python list integer not parseable" ); - } - - if( tempInt < 0 - || tempInt >= ( ( Mesh * ) object->data )->totvert ) { - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad vertex index in list" ); - } - - add_vert_defnr( object, nIndex, tempInt, weight, assignmode ); - } - - Py_RETURN_NONE; -} - -static PyObject *NMesh_removeVertsFromGroup( PyObject * self, PyObject * args ) -{ - //not passing a list will remove all verts from group - - char *groupStr; - int nIndex; - struct Object *object; - bDeformGroup *pGroup; - PyObject *listObject; - int tempInt; - int x, argc; - - /* argc is the number of parameters passed in: 1 (no list given) or 2: */ - argc = PyObject_Length( args ); - - if( !PyArg_ParseTuple - ( args, "s|O!", &groupStr, &PyList_Type, &listObject ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string and optional list argument" ); - - if( ( ( BPy_NMesh * ) self )->object == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first..." ); - - object = ( ( BPy_NMesh * ) self )->object; - - if( object->data == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object contains no data..." ); - - if( ( !( ( Mesh * ) object->data )->dvert ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "this mesh contains no deform vertices...'" ); - - pGroup = get_named_vertexgroup( object, groupStr ); - if( pGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no deform groups assigned to mesh" ); - - if( argc == 1 ) { /* no list given */ - //enter editmode - if( ( G.obedit == 0 ) ) { - //set current object - BASACT->object = object; - G.obedit = BASACT->object; - } - //set current vertex group - nIndex++; - object->actdef = (unsigned short)nIndex; - - //clear all dVerts in active group - remove_verts_defgroup( 1 ); - - //exit editmode - G.obedit = 0; - } else { - if( G.obedit != 0 ) //remove_vert_def_nr doesn't like it if your in editmode - G.obedit = 0; - - //loop list adding verts to group - for( x = 0; x < PyList_Size( listObject ); x++ ) { - if( ! - ( PyArg_Parse - ( ( PyList_GetItem( listObject, x ) ), "i", - &tempInt ) ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "python list integer not parseable" ); - - if( tempInt < 0 - || tempInt >= - ( ( Mesh * ) object->data )->totvert ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad vertex index in list" ); - - remove_vert_def_nr( object, nIndex, tempInt ); - } - } - - Py_RETURN_NONE; -} - -static PyObject *NMesh_getVertsFromGroup( PyObject * self, PyObject * args ) -{ - //not passing a list will return all verts from group - //passing indecies not part of the group will not return data in pyList - //can be used as a index/group check for a vertex - - char *groupStr; - int nIndex; - int weightRet; - struct Object *object; - bDeformGroup *pGroup; - MVert *mvert; - MDeformVert *dvert; - float weight; - int i, k, l1, l2, count; - int num = 0; - PyObject *tempVertexList = NULL; - PyObject *vertexList; - PyObject *listObject; - int tempInt; - int x; - - listObject = Py_None; //can't use NULL macro because compiler thinks - //it's a 0 and we need to check 0 index vertex pos - l1 = FALSE; - l2 = FALSE; - weightRet = 0; - - if( !PyArg_ParseTuple( args, "s|iO!", &groupStr, &weightRet, - &PyList_Type, &listObject ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string and optional int and list arguments" ); - - if( weightRet < 0 || weightRet > 1 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "return weights flag must be 0 or 1..." ); - - if( ( ( BPy_NMesh * ) self )->object == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "mesh must be linked to an object first..." ); - - object = ( ( BPy_NMesh * ) self )->object; - - if( object->data == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object contains no data..." ); - - if( ( !( ( Mesh * ) object->data )->dvert ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "this mesh contains no deform vertices...'" ); - - pGroup = get_named_vertexgroup( object, groupStr ); - if( pGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "group does not exist!" ); - - nIndex = get_defgroup_num( object, pGroup ); - if( nIndex == -1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no deform groups assigned to mesh" ); - - //temporary list - tempVertexList = PyList_New( ( ( Mesh * ) object->data )->totvert ); - if( tempVertexList == NULL ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "getVertsFromGroup: can't create pylist!" ); - - count = 0; - - if( listObject == Py_None ) //do entire group - { - for( k = 0; k < ( ( Mesh * ) object->data )->totvert; k++ ) { - dvert = ( ( Mesh * ) object->data )->dvert + k; - - for( i = 0; i < dvert->totweight; i++ ) { - if( dvert->dw[i].def_nr == nIndex ) { - mvert = ( ( Mesh * ) object->data )-> - mvert + k; - weight = dvert->dw[i].weight; - //printf("index =%3d weight:%10f\n", k, weight); - - if( weightRet == 1 ) - PyList_SetItem( tempVertexList, - count, - Py_BuildValue - ( "(i,f)", k, - weight ) ); - else if( weightRet == 0 ) - PyList_SetItem( tempVertexList, - count, - Py_BuildValue - ( "i", k ) ); - - count++; - } - } - } - } else //do single vertex - { - //loop list adding verts to group - for( x = 0; x < PyList_Size( listObject ); x++ ) { - if( ! - ( PyArg_Parse - ( ( PyList_GetItem( listObject, x ) ), "i", - &tempInt ) ) ) { - Py_DECREF(tempVertexList); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "python list integer not parseable" ); - } - if( tempInt < 0 - || tempInt >= - ( ( Mesh * ) object->data )->totvert ) { - Py_DECREF(tempVertexList); - return EXPP_ReturnPyObjError( PyExc_ValueError, - "bad vertex index in list" ); - } - num = tempInt; - dvert = ( ( Mesh * ) object->data )->dvert + num; - for( i = 0; i < dvert->totweight; i++ ) { - l1 = TRUE; - if( dvert->dw[i].def_nr == nIndex ) { - l2 = TRUE; - mvert = ( ( Mesh * ) object->data )-> - mvert + num; - - weight = dvert->dw[i].weight; - //printf("index =%3d weight:%10f\n", num, weight); - - if( weightRet == 1 ) { - PyList_SetItem( tempVertexList, - count, - Py_BuildValue - ( "(i,f)", num, - weight ) ); - } else if( weightRet == 0 ) - PyList_SetItem( tempVertexList, - count, - Py_BuildValue - ( "i", num ) ); - - count++; - } - if( l2 == FALSE ) - printf( "vertex at index %d is not part of passed group...\n", tempInt ); - } - if( l1 == FALSE ) - printf( "vertex at index %d is not assigned to a vertex group...\n", tempInt ); - - l1 = l2 = FALSE; //reset flags - } - } - //only return what we need - vertexList = PyList_GetSlice( tempVertexList, 0, count ); - - Py_DECREF( tempVertexList ); - - return ( vertexList ); -} - -static PyObject *NMesh_renameVertGroup( PyObject * self, PyObject * args ) -{ - char *oldGr = NULL; - char *newGr = NULL; - bDeformGroup *defGroup = NULL; - /*PyObject *tempStr; */ - - - if( !( ( BPy_NMesh * ) self )->object ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - if( !PyArg_ParseTuple( args, "ss", &oldGr, &newGr ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Expected string & string argument" ); - - defGroup = - get_named_vertexgroup( ( ( BPy_NMesh * ) self )->object, - oldGr ); - if( defGroup == NULL ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Couldn't find the expected vertex group" ); - - PyOS_snprintf( defGroup->name, 32, newGr ); - unique_vertexgroup_name( defGroup, ( ( BPy_NMesh * ) self )->object ); - - Py_RETURN_NONE; -} - -static PyObject *NMesh_getVertGroupNames( PyObject * self ) -{ - bDeformGroup *defGroup; - PyObject *list, *tmpstr; - - if( !( ( BPy_NMesh * ) self )->object ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This mesh must be linked to an object" ); - - list = PyList_New( 0 ); - for( defGroup = ( ( ( BPy_NMesh * ) self )->object )->defbase.first; - defGroup; defGroup = defGroup->next ) { - - tmpstr = PyString_FromString( defGroup->name ); - if( PyList_Append( list, tmpstr) < 0 ) { - Py_XDECREF(list); - Py_XDECREF(tmpstr); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, "Couldn't add item to list" ); - } - Py_XDECREF(tmpstr); - } - - return list; -} - -static PyObject *NMesh_transform (PyObject *self, PyObject *args) -{ - BPy_NMesh *nmesh = ( BPy_NMesh * ) self; - BPy_NMVert *mv; - PyObject *ob1 = NULL; - MatrixObject *mat; - float vx, vy, vz; - int i, recalc_normals = 0; - - if( !PyArg_ParseTuple( args, "O!|i", &matrix_Type, &ob1, &recalc_normals ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected matrix and optionally an int as arguments" ) ); - - mat = ( MatrixObject * ) ob1; - - if( mat->colSize != 4 || mat->rowSize != 4 ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "matrix must be a 4x4 transformation matrix\n" - "for example as returned by object.getMatrix()" ) ); - - /* loop through all the verts and transform locations by the supplied - * matrix */ - for( i = 0; i < PySequence_Length(nmesh->verts); i++ ) { - mv = ( BPy_NMVert * ) PySequence_GetItem( nmesh->verts, i ); - vx = mv->co[0]; - vy = mv->co[1]; - vz = mv->co[2]; - - /* Mat4MulVecfl(mat->matrix, mv->co); */ - mv->co[0] = vx*mat->matrix[0][0] + vy*mat->matrix[1][0] + - vz*mat->matrix[2][0] + mat->matrix[3][0]; - mv->co[1] = vx*mat->matrix[0][1] + vy*mat->matrix[1][1] + - vz*mat->matrix[2][1] + mat->matrix[3][1]; - mv->co[2] = vx*mat->matrix[0][2] + vy*mat->matrix[1][2] + - vz*mat->matrix[2][2] + mat->matrix[3][2]; - - Py_DECREF(mv); - } - - if ( recalc_normals ) { - /* loop through all the verts and transform normals by the inverse - * of the transpose of the supplied matrix */ - float invmat[4][4]; - - /* we only need to invert a 3x3 submatrix, because the 4th component of - * affine vectors is 0, but Mat4Invert reports non invertible matrices */ - if (!Mat4Invert((float(*)[4])*invmat, (float(*)[4])*mat->matrix)) - return EXPP_ReturnPyObjError (PyExc_AttributeError, - "given matrix is not invertible"); - - for( i = 0; i < PySequence_Length(nmesh->verts); i++ ) { - mv = ( BPy_NMVert * ) PySequence_GetItem( nmesh->verts, i ); - vx = mv->no[0]; - vy = mv->no[1]; - vz = mv->no[2]; - mv->no[0] = vx*invmat[0][0] + vy*invmat[0][1] + vz*invmat[0][2]; - mv->no[1] = vx*invmat[1][0] + vy*invmat[1][1] + vz*invmat[1][2]; - mv->no[2] = vx*invmat[2][0] + vy*invmat[2][1] + vz*invmat[2][2]; - Normalize(mv->no); - Py_DECREF(mv); - } - } - - /* should we alternatively return a list of changed verts (and preserve - * the original ones) ? */ - Py_RETURN_NONE; -} diff --git a/source/blender/python/api2_2x/NMesh.h b/source/blender/python/api2_2x/NMesh.h deleted file mode 100644 index 3a3b6e10088..00000000000 --- a/source/blender/python/api2_2x/NMesh.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * $Id: NMesh.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Jordi Rovira i Bonnet, Joseph Gilbert. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -/* Most of this file comes from opy_nmesh.[ch] in the old bpython dir */ - -#ifndef EXPP_NMESH_H -#define EXPP_NMESH_H - -#include - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "DNA_customdata_types.h" -#include "DNA_object_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "Material.h" -#include "Image.h" - -/* EXPP PyType Objects */ -extern PyTypeObject NMesh_Type; -extern PyTypeObject NMFace_Type; -extern PyTypeObject NMVert_Type; -extern PyTypeObject NMCol_Type; -extern PyTypeObject NMEdge_Type; - - -struct BPy_Object; - -/* These are from blender/src/editdeform.c, should be declared elsewhere, - * maybe in BIF_editdeform.h, after proper testing of vgrouping methods XXX */ - -extern void add_vert_defnr( Object * ob, int def_nr, int vertnum, float weight, - int assignmode ); -extern void remove_vert_def_nr( Object * ob, int def_nr, int vertnum ); - - - -/* Type checking for EXPP PyTypes */ -#define BPy_NMesh_Check(v) ((v)->ob_type == &NMesh_Type) -#define BPy_NMFace_Check(v) ((v)->ob_type == &NMFace_Type) -#define BPy_NMVert_Check(v) ((v)->ob_type == &NMVert_Type) -#define BPy_NMCol_Check(v) ((v)->ob_type == &NMCol_Type) -#define BPy_NMEdge_Check(v) ((v)->ob_type == &NMEdge_Type) - -/* Typedefs for the new types */ - -typedef struct { - PyObject_HEAD /* required python macro */ - unsigned char r, g, b, a; - -} BPy_NMCol; /* an NMesh color: [r,g,b,a] */ - -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - float co[3]; - float no[3]; - float uvco[3]; - int index; - char flag; /* see MVert flag in DNA_meshdata_types */ - -} BPy_NMVert; /* an NMesh vertex */ - -typedef struct { - PyObject_HEAD /* required python macro */ - PyObject * v; - PyObject *uv; - PyObject *col; - short mode; - short flag; /* tface->flag */ - unsigned char transp; - Image *image; - char mat_nr, mf_flag /* was char smooth */; - int orig_index; - -} BPy_NMFace; /* an NMesh face */ - -typedef struct { - PyObject_HEAD /* required python macro */ - PyObject *v1; - PyObject *v2; - char crease; - short flag; -} BPy_NMEdge; /* an NMesh edge */ - -typedef struct { - PyObject_HEAD /* required python macro */ - Mesh * mesh; /* libdata must be second */ - Object *object; /* for vertex grouping info, since it's stored on the object */ - PyObject *name; - PyObject *materials; - PyObject *verts; - PyObject *faces; - PyObject *edges; - int sel_face; /*@ XXX remove */ - short smoothresh; /* max AutoSmooth angle */ - short subdiv[2]; /* SubDiv Levels: display and rendering */ - short mode; /* see the EXPP_NMESH_* defines in the beginning of this file */ - char flags; - -#define NMESH_HASMCOL (1<<0) -#define NMESH_HASVERTUV (1<<1) -#define NMESH_HASFACEUV (1<<2) - - /* stores original data that is not accesible through NMesh, but that we - still want to preserve, indexed by orig_index in NMFace */ - CustomData fdata; - int totfdata; - -} BPy_NMesh; - -/* PROTOS */ - -PyObject *NMesh_Init( void ); -PyObject *NMesh_CreatePyObject( Mesh * me, Object * ob ); -Mesh *NMesh_FromPyObject( PyObject * pyobj, Object * ob ); - -void mesh_update( Mesh * mesh , Object * ob ); -PyObject *new_NMesh( Mesh * oldmesh ); -Mesh *Mesh_fromNMesh( BPy_NMesh * nmesh ); -PyObject *NMesh_assignMaterials_toObject( BPy_NMesh * nmesh, Object * ob ); -Material **nmesh_updateMaterials( BPy_NMesh * nmesh ); -Material **newMaterialList_fromPyList( PyObject * list ); - - -#endif /* EXPP_NMESH_H */ diff --git a/source/blender/python/api2_2x/Node.c b/source/blender/python/api2_2x/Node.c deleted file mode 100644 index 2871eda9432..00000000000 --- a/source/blender/python/api2_2x/Node.c +++ /dev/null @@ -1,1213 +0,0 @@ -/* - * $Id: Node.c 10454 2007-04-04 11:27:43Z jesterking $ - * - * ***** 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, Blender Foundation - * All rights reserved. - * - * Original code is this file - * - * Contributor(s): Nathan Letwory - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifdef USE_PYNODES /* note: won't work without patch */ -#include "Node.h" - -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_node.h" - -#include "DNA_material_types.h" - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "gen_utils.h" - -static PyObject *Node_repr( BPy_Node * self ); -static int Node_compare(BPy_Node *a, BPy_Node *b); -static PyObject *ShadeInput_repr( BPy_ShadeInput * self ); -static int ShadeInput_compare(BPy_ShadeInput *a, BPy_ShadeInput *b); - -/** - * Take the descriptions from dict and create sockets for those in socks - * socks is a socketstack from a bNodeTypeInfo - */ -static int dict_socks_to_typeinfo(PyObject *dict, bNodeSocketType **socks, int len, int stage) { - int a = 0, pos = 0; - PyObject *key = NULL, *value = NULL; - bNodeSocketType *newsocks = NULL; - - if(stage!=SH_NODE_DYNAMIC_READY && stage!=SH_NODE_DYNAMIC_ADDEXIST) { - newsocks = MEM_callocN(sizeof(bNodeSocketType)*(len+1), "bNodeSocketType"); - - if (dict) { - if(PyDict_Check(dict)) { - while(PyDict_Next(dict, &pos, &key, &value)) { - if(PyTuple_Check(value) && PyTuple_Size(value)==7) { - newsocks[a].name = BLI_strdup(PyString_AsString(key)); - newsocks[a].type = (int)(PyInt_AsLong(PyTuple_GetItem(value, 0))); - newsocks[a].val1 = (float)(PyFloat_AsDouble(PyTuple_GetItem(value, 1))); - newsocks[a].val2 = (float)(PyFloat_AsDouble(PyTuple_GetItem(value, 2))); - newsocks[a].val3 = (float)(PyFloat_AsDouble(PyTuple_GetItem(value, 3))); - newsocks[a].val4 = (float)(PyFloat_AsDouble(PyTuple_GetItem(value, 4))); - newsocks[a].min = (float)(PyFloat_AsDouble(PyTuple_GetItem(value, 5))); - newsocks[a].max = (float)(PyFloat_AsDouble(PyTuple_GetItem(value, 6))); - a++; - } - } - } else { - return(EXPP_ReturnIntError( PyExc_AttributeError, "INPUT must be a dict")); - } - } - newsocks[a].type = -1; - if(*socks) { - int b = 0; - while((*socks)[b].type!=-1) { - MEM_freeN((*socks)[b].name); - (*socks)[b].name = NULL; - b++; - } - MEM_freeN(*socks); - } - *socks = newsocks; - } - return 0; -} - -/* Get number of complying entries in a dict. - * - */ -static int num_dict_sockets(PyObject *dict) { - int a = 0, pos = 0; - PyObject *key = NULL, *value = NULL; - while(PyDict_Next(dict, &pos, &key, &value)) { - if(PyTuple_Check(value) && PyTuple_Size(value)==7) - a++; - } - return a; -} - -static int Map_socketdef(PyObject *self, PyObject *args, void *closure) -{ - int newincnt = 0, newoutcnt = 0; - bNode *node = NULL; - BPy_DefinitionMap *defs= NULL; - - Py_INCREF(args); - Py_INCREF(self); - - defs= (BPy_DefinitionMap *)self; - node= defs->node; - - if(!node) { - fprintf(stderr,"! no bNode in BPy_Node (Map_socketdef)\n"); - return 0; - } - - if(node->custom1==SH_NODE_DYNAMIC_READY && node->custom1==SH_NODE_DYNAMIC_ADDEXIST) - return 0; - - switch((int)closure) { - case 'I': - if (args) { - if(PyDict_Check(args)) { - newincnt = num_dict_sockets(args); - dict_socks_to_typeinfo(args, &(node->typeinfo->inputs), newincnt, node->custom1); - } else { - Py_DECREF(self); - Py_DECREF(args); - return(EXPP_ReturnIntError( PyExc_AttributeError, "INPUT must be a dict")); - } - } - break; - case 'O': - if (args) { - if(PyDict_Check(args)) { - newoutcnt = num_dict_sockets(args); - dict_socks_to_typeinfo(args, &(node->typeinfo->outputs), newoutcnt, node->custom1); - } else { - Py_DECREF(self); - Py_DECREF(args); - return(EXPP_ReturnIntError( PyExc_AttributeError, "OUTPUT must be a dict")); - } - } - break; - default: - fprintf(stderr, "Hrm, why we got no dict? Todo: figure out proper complaint to scripter\n"); - break; - } - Py_DECREF(self); - Py_DECREF(args); - return 0; -} - -static PyGetSetDef InputDefMap_getseters[] = { - {"definitions", (getter)NULL, (setter)Map_socketdef, - "Set the inputs definition (dictionary)", - (void *)'I'}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -PyTypeObject InputDefMap_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Node.InputDefinitions", /* char *tp_name; */ - sizeof( BPy_DefinitionMap ), /* 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; */ - NULL, /* 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/input 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 */ - 0, //( getiterfunc) MVertSeq_getIter, /* getiterfunc tp_iter; */ - 0, //( iternextfunc ) MVertSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - 0, //BPy_MVertSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - InputDefMap_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_DefinitionMap *Node_CreateInputDefMap(bNode *node) { - BPy_DefinitionMap *map = PyObject_NEW(BPy_DefinitionMap, &InputDefMap_Type); - map->node = node; - return map; -} - -/***************************************/ - -static PyGetSetDef OutputDefMap_getseters[] = { - {"definitions", (getter)NULL, (setter)Map_socketdef, - "Set the outputs definition (dictionary)", - (void *)'O'}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -PyTypeObject OutputDefMap_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Node.OutputDefinitions", /* char *tp_name; */ - sizeof( BPy_DefinitionMap ), /* 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; */ - NULL, /* 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 */ - 0, //( getiterfunc) MVertSeq_getIter, /* getiterfunc tp_iter; */ - 0, //( iternextfunc ) MVertSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - 0, //BPy_MVertSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - OutputDefMap_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_DefinitionMap *Node_CreateOutputDefMap(bNode *node) { - BPy_DefinitionMap *map = PyObject_NEW(BPy_DefinitionMap, &OutputDefMap_Type); - map->node = node; - return map; -} - -/***************************************/ - -static int sockinmap_len ( BPy_SockMap * self) { - int a = 0; - if(self->typeinfo) { - while(self->typeinfo->inputs[a].type!=-1) - a++; - } - return a; -} - -static int sockinmap_has_key( BPy_SockMap *self, PyObject *key) { - int a = 0; - char *strkey = PyString_AsString(key); - - if(self->typeinfo){ - while(self->typeinfo->inputs[a].type!=-1) { - if(BLI_strcaseeq(self->typeinfo->inputs[a].name, strkey)) { - return a; - } - a++; - } - } - return -1; -} - -PyObject *sockinmap_subscript(BPy_SockMap *self, PyObject *idx) { - int a, _idx; - a = sockinmap_len(self); - - if (PyString_Check(idx)) { - _idx = sockinmap_has_key( self, idx); - } - else if(PyInt_Check(idx)) { - PyErr_SetString(PyExc_ValueError, "int index not implemented"); - Py_RETURN_NONE; - } - else if (PySlice_Check(idx)) { - PyErr_SetString(PyExc_ValueError, "slices not implemented"); - Py_RETURN_NONE; - } else { - PyErr_SetString(PyExc_IndexError, "Index must be string"); - Py_RETURN_NONE; - } - - - switch(self->typeinfo->inputs[_idx].type) { - case SOCK_VALUE: - return Py_BuildValue("f", self->stack[_idx]->vec[0]); - break; - case SOCK_VECTOR: - return Py_BuildValue("(fff)", self->stack[_idx]->vec[0], self->stack[_idx]->vec[1], self->stack[_idx]->vec[2]); - break; - case SOCK_RGBA: - return Py_BuildValue("(ffff)", self->stack[_idx]->vec[0], self->stack[_idx]->vec[1], self->stack[_idx]->vec[2], self->stack[_idx]->vec[3]); - break; - default: - break; - } - Py_RETURN_NONE; -} - -/* read only */ -static PyMappingMethods sockinmap_as_mapping = { - ( inquiry ) sockinmap_len, /* mp_length */ - ( binaryfunc ) sockinmap_subscript, /* mp_subscript */ - ( objobjargproc ) 0 /* mp_ass_subscript */ -}; - -PyTypeObject SockInMap_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Node.InputSockets", /* char *tp_name; */ - sizeof( BPy_SockMap ), /* 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; */ - NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - &sockinmap_as_mapping, /* 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 */ - 0, //( getiterfunc) MVertSeq_getIter, /* getiterfunc tp_iter; */ - 0, //( iternextfunc ) MVertSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - 0, //BPy_MVertSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 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 -}; - -static int sockoutmap_len ( BPy_SockMap * self) { - int a = 0; - if(self->typeinfo) { - while(self->typeinfo->outputs[a].type!=-1) - a++; - } - return a; -} - -static int sockoutmap_has_key( BPy_SockMap *self, PyObject *key) { - int a = 0; - char *strkey = PyString_AsString(key); - - if(self->typeinfo){ - while(self->typeinfo->outputs[a].type!=-1) { - if(BLI_strcaseeq(self->typeinfo->outputs[a].name, strkey)) { - return a; - } - a++; - } - } - return -1; -} - -static int sockoutmap_assign_subscript(BPy_SockMap *self, PyObject *idx, PyObject *value) { - int a, _idx; - a = sockoutmap_len(self); - if(PyInt_Check(idx)) { - _idx = (int)PyInt_AsLong(idx); - } - else if (PyString_Check(idx)) { - _idx = sockoutmap_has_key( self, idx); - } - else if (PySlice_Check(idx)) { - PyErr_SetString(PyExc_ValueError, "slices not implemented, yet"); - return -1; - } else { - PyErr_SetString(PyExc_IndexError, "Index must be int or string"); - return -1; - } - if(_idx > -1) { - switch(self->typeinfo->outputs[_idx].type) { - case SOCK_VALUE: - if(PyTuple_Size(value)==1) - self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 0)); - return 0; - break; - case SOCK_VECTOR: - if(PyTuple_Size(value)==3) { - self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 0)); - self->stack[_idx]->vec[1] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 1)); - self->stack[_idx]->vec[2] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 2)); - } - return 0; - break; - case SOCK_RGBA: - if(PyTuple_Size(value)==4) { - self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 0)); - self->stack[_idx]->vec[1] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 1)); - self->stack[_idx]->vec[2] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 2)); - self->stack[_idx]->vec[3] = (float)PyFloat_AsDouble(PyTuple_GetItem(value, 3)); - } - return 0; - break; - default: - break; - } - } - return 0; -} - -/* write only */ -static PyMappingMethods sockoutmap_as_mapping = { - ( inquiry ) sockoutmap_len, /* mp_length */ - ( binaryfunc ) 0, /* mp_subscript */ - ( objobjargproc ) sockoutmap_assign_subscript /* mp_ass_subscript */ -}; - -PyTypeObject SockOutMap_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Node.OutputSockets", /* char *tp_name; */ - sizeof( BPy_SockMap ), /* 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; */ - NULL, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - &sockoutmap_as_mapping, /* 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 */ - 0, //( getiterfunc) MVertSeq_getIter, /* getiterfunc tp_iter; */ - 0, //( iternextfunc ) MVertSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - 0, //BPy_MVertSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - NULL, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 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 -}; - - -static BPy_SockMap *Node_CreateInputMap(bNode *node, bNodeStack **stack) { - BPy_SockMap *map= PyObject_NEW(BPy_SockMap, &SockInMap_Type); - map->typeinfo= node->typeinfo; - map->stack= stack; - return map; -} - -static PyObject *Node_GetInputMap(BPy_Node *self) { - BPy_SockMap *inmap= Node_CreateInputMap(self->node, self->in); - return (PyObject *)(inmap); -} - -#define SURFACEVIEWVECTOR 0 -#define VIEWNORMAL 1 -#define SURFACENORMAL 2 -#define GLOBALTEXTURE 3 -#define TEXTURE 4 -#define PIXEL 5 -#define COLOR 6 -#define SPECULAR 7 -#define MIRROR 8 -#define AMBIENT 9 -#define AMBIENTFACTOR 10 -#define EMITFACTOR 11 -#define DISPLACE 12 -#define STRAND 13 -#define STRESS 14 -#define TANGENT 15 -#define SURFACE_D 30 -#define TEXTURE_D 31 -#define GLOBALTEXTURE_D 32 -#define REFLECTION_D 33 -#define NORMAL_D 34 -#define STICKY_D 35 -#define REFRACT_D 36 -#define STRAND_D 37 - -static PyObject *ShadeInput_getAttribute(BPy_ShadeInput *self, void *type) { - PyObject *obj= NULL; - if(self->shi) { - switch((int)type) { - case SURFACEVIEWVECTOR: - obj= Py_BuildValue("(fff)", self->shi->view[0], self->shi->view[1], self->shi->view[2]); - break; - case VIEWNORMAL: - obj= Py_BuildValue("(fff)", self->shi->vn[0], self->shi->vn[1], self->shi->vn[2]); - break; - case SURFACENORMAL: - obj= Py_BuildValue("(fff)", self->shi->facenor[0], self->shi->facenor[1], self->shi->facenor[2]); - break; - case GLOBALTEXTURE: - obj= Py_BuildValue("(fff)", self->shi->gl[0], self->shi->gl[1], self->shi->gl[2]); - break; - case TEXTURE: - obj= Py_BuildValue("(fff)", self->shi->lo[0], self->shi->lo[1], self->shi->lo[2]); - break; - case PIXEL: - obj= Py_BuildValue("(ii)", self->shi->xs, self->shi->ys); - break; - case COLOR: - obj= Py_BuildValue("(fff)", self->shi->r, self->shi->g, self->shi->b); - break; - case SPECULAR: - obj= Py_BuildValue("(fff)", self->shi->specr, self->shi->specg, self->shi->specb); - break; - case MIRROR: - obj= Py_BuildValue("(fff)", self->shi->mirr, self->shi->mirg, self->shi->mirb); - break; - case AMBIENT: - obj= Py_BuildValue("(fff)", self->shi->ambr, self->shi->ambg, self->shi->ambb); - break; - case AMBIENTFACTOR: - obj= PyFloat_FromDouble((double)(self->shi->amb)); - break; - case EMITFACTOR: - obj= PyFloat_FromDouble((double)(self->shi->emit)); - break; - case DISPLACE: - obj= Py_BuildValue("(fff)", self->shi->displace[0], self->shi->displace[1], self->shi->displace[2]); - break; - case STRAND: - obj= PyFloat_FromDouble((double)(self->shi->strand)); - break; - case STRESS: - obj= PyFloat_FromDouble((double)(self->shi->stress)); - break; - case TANGENT: - obj= Py_BuildValue("(fff)", self->shi->tang[0], self->shi->tang[1], self->shi->tang[2]); - break; - case SURFACE_D: - obj= Py_BuildValue("(fff)(fff)", self->shi->dxco[0], self->shi->dxco[1], self->shi->dxco[2], self->shi->dyco[0], self->shi->dyco[1], self->shi->dyco[2]); - break; - case TEXTURE_D: - obj= Py_BuildValue("(fff)(fff)", self->shi->dxlo[0], self->shi->dxlo[1], self->shi->dxlo[2], self->shi->dylo[0], self->shi->dylo[1], self->shi->dylo[2]); - break; - case GLOBALTEXTURE_D: - obj= Py_BuildValue("(fff)(fff)", self->shi->dxgl[0], self->shi->dxgl[1], self->shi->dxgl[2], self->shi->dygl[0], self->shi->dygl[1], self->shi->dygl[2]); - break; - case REFLECTION_D: - obj= Py_BuildValue("(fff)(fff)", self->shi->dxref[0], self->shi->dxref[1], self->shi->dxref[2], self->shi->dyref[0], self->shi->dyref[1], self->shi->dyref[2]); - break; - case NORMAL_D: - obj= Py_BuildValue("(fff)(fff)", self->shi->dxno[0], self->shi->dxno[1], self->shi->dxno[2], self->shi->dyno[0], self->shi->dyno[1], self->shi->dyno[2]); - break; - case STICKY_D: - obj= Py_BuildValue("(fff)(fff)", self->shi->dxsticky[0], self->shi->dxsticky[1], self->shi->dxsticky[2], self->shi->dysticky[0], self->shi->dysticky[1], self->shi->dysticky[2]); - break; - case REFRACT_D: - obj= Py_BuildValue("(fff)(fff)", self->shi->dxrefract[0], self->shi->dxrefract[1], self->shi->dxrefract[2], self->shi->dyrefract[0], self->shi->dyrefract[1], self->shi->dyrefract[2]); - break; - case STRAND_D: - obj= Py_BuildValue("(ff)", self->shi->dxstrand, self->shi->dystrand); - break; - default: - break; - } - } - - if(!obj) { - Py_RETURN_NONE; - } - return obj; -} - -static BPy_SockMap *Node_CreateOutputMap(bNode *node, bNodeStack **stack) { - BPy_SockMap *map = PyObject_NEW(BPy_SockMap, &SockOutMap_Type); - map->typeinfo= node->typeinfo; - map->stack= stack; - return map; -} - -static PyObject *Node_GetOutputMap(BPy_Node *self) { - BPy_SockMap *outmap= Node_CreateOutputMap(self->node, self->out); - return (PyObject *)outmap; -} - -static PyObject *Node_GetShi(BPy_Node *self) { - BPy_ShadeInput *shi= ShadeInput_CreatePyObject(self->shi); - return (PyObject *)shi; - -} - -static PyObject *node_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *self; - assert(type!=NULL && type->tp_alloc!=NULL); - self= type->tp_alloc(type, 1); - return self; -} - -static int node_init(BPy_Node *self, PyObject *args, PyObject *kwds) -{ - return 0; -} - -static PyGetSetDef BPy_Node_getseters[] = { - {"ins", - (getter)Node_GetInputMap, (setter)NULL, - "Get the ShadeInput mapping (dictionary)", - NULL}, - {"outs", - (getter)Node_GetOutputMap, (setter)NULL, - "Get the ShadeInput mapping (dictionary)", - NULL}, - {"shi", - (getter)Node_GetShi, (setter)NULL, - "Get the ShadeInput (ShadeInput)", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -static PyGetSetDef BPy_ShadeInput_getseters[] = { - {"texture", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the current texture coordinate (tuple)", - (void*)TEXTURE}, - {"texture_global", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the current global texture coordinate (tuple)", - (void*)GLOBALTEXTURE}, - {"surface_normal", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the current surface normal (tuple)", - (void*)SURFACENORMAL}, - {"view_normal", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the current view normal (tuple)", - (void*)VIEWNORMAL}, - {"surface_view_vec", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the vector pointing to the viewpoint from the point being shaded (tuple)", - (void*)SURFACEVIEWVECTOR}, - {"pixel", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the x,y-coordinate for the pixel rendered (tuple)", - (void*)PIXEL}, - {"color", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the color for the point being shaded (tuple)", - (void*)COLOR}, - {"specular", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the specular color for the point being shaded (tuple)", - (void*)SPECULAR}, - {"mirror", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the mirror color for the point being shaded (tuple)", - (void*)MIRROR}, - {"ambient", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the ambient color for the point being shaded (tuple)", - (void*)AMBIENT}, - {"ambient_factor", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the ambient factor for the point being shaded (float)", - (void*)AMBIENTFACTOR}, - {"emit_factor", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the emit factor for the point being shaded (float)", - (void*)EMITFACTOR}, - {"displace", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the displace vector for the point being shaded (tuple)", - (void*)DISPLACE}, - {"strand", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the strand factor(float)", - (void*)STRAND}, - {"stress", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the stress factor(float)", - (void*)STRESS}, - {"tangent", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the tangent vector (tuple)", - (void*)TANGENT}, - {"surface_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the surface d (tuple of tuples)", - (void*)SURFACE_D}, - {"texture_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the texture d (tuple of tuples)", - (void*)TEXTURE_D}, - {"texture_global_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the global texture d (tuple of tuples)", - (void*)GLOBALTEXTURE_D}, - {"reflection_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the reflection d (tuple of tuples)", - (void*)REFLECTION_D}, - {"normal_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the normal d (tuple of tuples)", - (void*)NORMAL_D}, - {"sticky_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the sticky d (tuple of tuples)", - (void*)STICKY_D}, - {"refract_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the refract d (tuple of tuples)", - (void*)REFRACT_D}, - {"strand_d", - (getter)ShadeInput_getAttribute, (setter)NULL, - "Get the strand d (tuple)", - (void*)REFRACT_D}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -PyTypeObject Node_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Node.node", /* char *tp_name; */ - sizeof( BPy_Node ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - NULL,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL /*( getattrfunc ) PyObject_GenericGetAttr*/, /* getattrfunc tp_getattr; */ - NULL /*( setattrfunc ) PyObject_GenericSetAttr*/, /* setattrfunc tp_setattr; */ - ( cmpfunc ) Node_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Node_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|Py_TPFLAGS_BASETYPE, /* 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, /*BPy_Node_methods,*/ /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Node_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; */ - (initproc)node_init, /* initproc tp_init; */ - /*PyType_GenericAlloc*/NULL, /* allocfunc tp_alloc; */ - node_new, /* 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 -}; - -PyTypeObject ShadeInput_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender.Node.ShadeInput", /* char *tp_name; */ - sizeof( BPy_ShadeInput ), /* 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; */ - ( cmpfunc ) ShadeInput_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) ShadeInput_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, /*BPy_Node_methods,*/ /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_ShadeInput_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 -}; - - -/* Initialise Node module */ -PyObject *Node_Init(void) -{ - PyObject *submodule; - - if( PyType_Ready( &Node_Type ) < 0 ) - return NULL; - if( PyType_Ready( &ShadeInput_Type ) < 0 ) - return NULL; - if( PyType_Ready( &OutputDefMap_Type ) < 0 ) - return NULL; - if( PyType_Ready( &InputDefMap_Type ) < 0 ) - return NULL; - if( PyType_Ready( &SockInMap_Type ) < 0 ) - return NULL; - if( PyType_Ready( &SockOutMap_Type ) < 0 ) - return NULL; - submodule = Py_InitModule3( "Blender.Node", NULL, ""); - - PyModule_AddIntConstant(submodule, "VALUE", SOCK_VALUE); - PyModule_AddIntConstant(submodule, "RGBA", SOCK_RGBA); - PyModule_AddIntConstant(submodule, "VECTOR", SOCK_VECTOR); - - Py_INCREF(&Node_Type); - PyModule_AddObject(submodule, "node", (PyObject *)&Node_Type); - - return submodule; - -} - -static int Node_compare(BPy_Node *a, BPy_Node *b) -{ - bNode *pa = a->node, *pb = b->node; - return (pa==pb) ? 0 : -1; -} - -static PyObject *Node_repr(BPy_Node *self) -{ - return PyString_FromFormat( "[Node \"%s\"]", - self->node ? self->node->id->name+2 : "empty node"); -} - -BPy_Node *Node_CreatePyObject(bNode *node) -{ - BPy_Node *pynode; - - pynode = (BPy_Node *)PyObject_NEW(BPy_Node, &Node_Type); - if(!pynode) { - fprintf(stderr,"Couldn't create BPy_Node object\n"); - return (BPy_Node *)(EXPP_ReturnPyObjError(PyExc_MemoryError, "couldn't create BPy_Node object")); - } - - pynode->node= node; - - return pynode; -} - -void InitNode(BPy_Node *self, bNode *node) { - self->node= node; -} - -bNode *Node_FromPyObject(PyObject *pyobj) -{ - return ((BPy_Node *)pyobj)->node; -} - -void Node_SetStack(BPy_Node *self, bNodeStack **stack, int type) -{ - if(type==NODE_INPUTSTACK) { - self->in= stack; - } else if(type==NODE_OUTPUTSTACK) { - self->out= stack; - } -} - -void Node_SetShi(BPy_Node *self, ShadeInput *shi) -{ - self->shi= shi; -} - -/*********************/ - -static int ShadeInput_compare(BPy_ShadeInput *a, BPy_ShadeInput *b) -{ - ShadeInput *pa = a->shi, *pb = b->shi; - return (pa==pb) ? 0 : -1; -} - -static PyObject *ShadeInput_repr(BPy_ShadeInput *self) -{ - return PyString_FromFormat( "[ShadeInput @ \"%p\"]", self); -} - -BPy_ShadeInput *ShadeInput_CreatePyObject(ShadeInput *shi) -{ - BPy_ShadeInput *pyshi; - - pyshi = (BPy_ShadeInput *)PyObject_NEW(BPy_ShadeInput, &ShadeInput_Type); - if(!pyshi) { - fprintf(stderr,"Couldn't create BPy_ShadeInput object\n"); - return (BPy_ShadeInput *)(EXPP_ReturnPyObjError(PyExc_MemoryError, "couldn't create BPy_ShadeInput object")); - } - - pyshi->shi = shi; - - return pyshi; -} -#endif - diff --git a/source/blender/python/api2_2x/Node.h b/source/blender/python/api2_2x/Node.h deleted file mode 100644 index 434d0aa684a..00000000000 --- a/source/blender/python/api2_2x/Node.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * $Id: Node.h 10449 2007-04-03 11:24:11Z jesterking $ - * - * ***** 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, Blender Foundation - * All rights reserved. - * - * Original code is this file - * - * Contributor(s): Nathan Letwory - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifdef USE_PYNODES /* note: won't work without patch */ -#ifndef __NODE_H__ -#define __NODE_H__ - -#include -#include "DNA_node_types.h" -#include "BKE_node.h" - -#include "RE_shader_ext.h" /* <- ShadeInput Shaderesult TexResult */ - -extern PyTypeObject Node_Type; -extern PyTypeObject ShadeInput_Type; - -#define BPy_Node_Check(v) \ - ((v)->ob_type == &Node_Type) - -#define BPy_ShadeInput_Check(v) \ - ((v)->ob_type == &ShadeInput_Type) - -typedef struct BPy_ShadeInput { - PyObject_HEAD - ShadeInput *shi; -} BPy_ShadeInput; - -typedef struct { - PyObject_VAR_HEAD - bNodeType *typeinfo; - bNodeStack **stack; -} BPy_SockMap; - -typedef struct { - PyObject_HEAD - bNode *node; -} BPy_DefinitionMap; - -typedef struct BPy_Node { - PyObject_HEAD - bNode *node; - bNodeStack **in; - bNodeStack **out; - ShadeInput *shi; -} BPy_Node; - -extern PyObject *Node_Init(void); -extern void InitNode(BPy_Node *self, bNode *node); -extern BPy_Node *Node_CreatePyObject(bNode *node); -extern BPy_DefinitionMap *Node_CreateOutputDefMap(bNode *node); -extern BPy_DefinitionMap *Node_CreateInputDefMap(bNode *node); -extern void Node_SetStack(BPy_Node *self, bNodeStack **stack, int type); -extern void Node_SetShi(BPy_Node *self, ShadeInput *shi); -extern BPy_ShadeInput *ShadeInput_CreatePyObject(ShadeInput *shi); -extern void Node_dealloc(BPy_Node *self); -extern void ShadeInput_dealloc(BPy_ShadeInput *self); - -#define NODE_INPUTSTACK 0 -#define NODE_OUTPUTSTACK 1 - -#endif /* __NODE_H__*/ -#endif /* USE_PYNODES */ diff --git a/source/blender/python/api2_2x/Noise.c b/source/blender/python/api2_2x/Noise.c deleted file mode 100644 index dcee6f45d2a..00000000000 --- a/source/blender/python/api2_2x/Noise.c +++ /dev/null @@ -1,713 +0,0 @@ -/** - * $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. - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): eeshlo - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/************************/ -/* Blender Noise Module */ -/************************/ - -#include - -#include "BLI_blenlib.h" -#include "DNA_texture_types.h" -#include "constant.h" - -/*-----------------------------------------*/ -/* 'mersenne twister' random number generator */ - -/* - A C-program for MT19937, with initialization improved 2002/2/10. - Coded by Takuji Nishimura and Makoto Matsumoto. - This is a faster version by taking Shawn Cokus's optimization, - Matthe Bellew's simplification, Isaku Wada's real version. - - Before using, initialize the state by using init_genrand(seed) - or init_by_array(init_key, key_length). - - Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The names of its contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - Any feedback is very welcome. - http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html - email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) -*/ - -/* Period parameters */ -#define N 624 -#define M 397 -#define MATRIX_A 0x9908b0dfUL /* constant vector a */ -#define UMASK 0x80000000UL /* most significant w-r bits */ -#define LMASK 0x7fffffffUL /* least significant r bits */ -#define MIXBITS(u,v) ( ((u) & UMASK) | ((v) & LMASK) ) -#define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL)) - -static unsigned long state[N]; /* the array for the state vector */ -static int left = 1; -static int initf = 0; -static unsigned long *next; - -PyObject *Noise_Init(void); - -/* initializes state[N] with a seed */ -static void init_genrand( unsigned long s ) -{ - int j; - state[0] = s & 0xffffffffUL; - for( j = 1; j < N; j++ ) { - state[j] = - ( 1812433253UL * - ( state[j - 1] ^ ( state[j - 1] >> 30 ) ) + j ); - /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ - /* In the previous versions, MSBs of the seed affect */ - /* only MSBs of the array state[]. */ - /* 2002/01/09 modified by Makoto Matsumoto */ - state[j] &= 0xffffffffUL; /* for >32 bit machines */ - } - left = 1; - initf = 1; -} - -static void next_state( void ) -{ - unsigned long *p = state; - int j; - - /* if init_genrand() has not been called, */ - /* a default initial seed is used */ - if( initf == 0 ) - init_genrand( 5489UL ); - - left = N; - next = state; - - for( j = N - M + 1; --j; p++ ) - *p = p[M] ^ TWIST( p[0], p[1] ); - - for( j = M; --j; p++ ) - *p = p[M - N] ^ TWIST( p[0], p[1] ); - - *p = p[M - N] ^ TWIST( p[0], state[0] ); -} - -/*------------------------------------------------------------*/ - -static void setRndSeed( int seed ) -{ - if( seed == 0 ) - init_genrand( time( NULL ) ); - else - init_genrand( seed ); -} - -/* float number in range [0, 1) using the mersenne twister rng */ -static float frand( ) -{ - unsigned long y; - - if( --left == 0 ) - next_state( ); - y = *next++; - - /* Tempering */ - y ^= ( y >> 11 ); - y ^= ( y << 7 ) & 0x9d2c5680UL; - y ^= ( y << 15 ) & 0xefc60000UL; - y ^= ( y >> 18 ); - - return ( float ) y / 4294967296.f; -} - -/*------------------------------------------------------------*/ - -/* returns random unit vector */ -static void randuvec( float v[3] ) -{ - float r; - v[2] = 2.f * frand( ) - 1.f; - if( ( r = 1.f - v[2] * v[2] ) > 0.f ) { - float a = (float)(6.283185307f * frand( )); - r = (float)sqrt( r ); - v[0] = (float)(r * cos( a )); - v[1] = (float)(r * sin( a )); - } else - v[2] = 1.f; -} - -static PyObject *Noise_random( PyObject * self ) -{ - return Py_BuildValue( "f", frand( ) ); -} - -static PyObject *Noise_randuvec( PyObject * self ) -{ - float v[3] = {0.0f, 0.0f, 0.0f}; - randuvec( v ); - return Py_BuildValue( "[fff]", v[0], v[1], v[2] ); -} - -/*---------------------------------------------------------------------*/ - -/* Random seed init. Only used for MT random() & randuvec() */ - -static PyObject *Noise_setRandomSeed( PyObject * self, PyObject * args ) -{ - int s; - if( !PyArg_ParseTuple( args, "i", &s ) ) - return NULL; - setRndSeed( s ); - Py_INCREF( Py_None ); - return Py_None; -} - -/*-------------------------------------------------------------------------*/ - -/* General noise */ - -static PyObject *Noise_noise( PyObject * self, PyObject * args ) -{ - float x, y, z; - int nb = 1; - if( !PyArg_ParseTuple( args, "(fff)|i", &x, &y, &z, &nb ) ) - return NULL; - - return PyFloat_FromDouble( - (double)(2.0 * BLI_gNoise( 1.0, x, y, z, 0, nb ) - 1.0) ); -} - -/*-------------------------------------------------------------------------*/ - -/* General Vector noise */ - -static void vNoise( float x, float y, float z, int nb, float v[3] ) -{ - /* Simply evaluate noise at 3 different positions */ - v[0] = (float)(2.0 * BLI_gNoise( 1.f, x + 9.321f, y - 1.531f, z - 7.951f, 0, - nb ) - 1.0); - v[1] = (float)(2.0 * BLI_gNoise( 1.f, x, y, z, 0, nb ) - 1.0); - v[2] = (float)(2.0 * BLI_gNoise( 1.f, x + 6.327f, y + 0.1671f, z - 2.672f, 0, - nb ) - 1.0); -} - -static PyObject *Noise_vNoise( PyObject * self, PyObject * args ) -{ - float x, y, z, v[3]; - int nb = 1; - if( !PyArg_ParseTuple( args, "(fff)|i", &x, &y, &z, &nb ) ) - return NULL; - vNoise( x, y, z, nb, v ); - return Py_BuildValue( "[fff]", v[0], v[1], v[2] ); -} - -/*---------------------------------------------------------------------------*/ - -/* General turbulence */ - -static float turb( float x, float y, float z, int oct, int hard, int nb, - float ampscale, float freqscale ) -{ - float amp, out, t; - int i; - amp = 1.f; - out = (float)(2.0 * BLI_gNoise( 1.f, x, y, z, 0, nb ) - 1.0); - if( hard ) - out = (float)fabs( out ); - for( i = 1; i < oct; i++ ) { - amp *= ampscale; - x *= freqscale; - y *= freqscale; - z *= freqscale; - t = (float)(amp * ( 2.0 * BLI_gNoise( 1.f, x, y, z, 0, nb ) - 1.0 )); - if( hard ) - t = (float)fabs( t ); - out += t; - } - return out; -} - -static PyObject *Noise_turbulence( PyObject * self, PyObject * args ) -{ - float x, y, z; - int oct, hd, nb = 1; - float as = 0.5, fs = 2.0; - if( !PyArg_ParseTuple - ( args, "(fff)ii|iff", &x, &y, &z, &oct, &hd, &nb, &as, &fs ) ) - return NULL; - return PyFloat_FromDouble( (double)turb( x, y, z, oct, hd, nb, as, fs ) ); -} - -/*--------------------------------------------------------------------------*/ - -/* Turbulence Vector */ - -static void vTurb( float x, float y, float z, int oct, int hard, int nb, - float ampscale, float freqscale, float v[3] ) -{ - float amp, t[3]; - int i; - amp = 1.f; - vNoise( x, y, z, nb, v ); - if( hard ) { - v[0] = (float)fabs( v[0] ); - v[1] = (float)fabs( v[1] ); - v[2] = (float)fabs( v[2] ); - } - for( i = 1; i < oct; i++ ) { - amp *= ampscale; - x *= freqscale; - y *= freqscale; - z *= freqscale; - vNoise( x, y, z, nb, t ); - if( hard ) { - t[0] = (float)fabs( t[0] ); - t[1] = (float)fabs( t[1] ); - t[2] = (float)fabs( t[2] ); - } - v[0] += amp * t[0]; - v[1] += amp * t[1]; - v[2] += amp * t[2]; - } -} - -static PyObject *Noise_vTurbulence( PyObject * self, PyObject * args ) -{ - float x, y, z, v[3]; - int oct, hd, nb = 1; - float as = 0.5, fs = 2.0; - if( !PyArg_ParseTuple - ( args, "(fff)ii|iff", &x, &y, &z, &oct, &hd, &nb, &as, &fs ) ) - return NULL; - vTurb( x, y, z, oct, hd, nb, as, fs, v ); - return Py_BuildValue( "[fff]", v[0], v[1], v[2] ); -} - -/*---------------------------------------------------------------------*/ - -/* F. Kenton Musgrave's fractal functions */ - -static PyObject *Noise_fBm( PyObject * self, PyObject * args ) -{ - float x, y, z, H, lac, oct; - int nb = 1; - if( !PyArg_ParseTuple - ( args, "(fff)fff|i", &x, &y, &z, &H, &lac, &oct, &nb ) ) - return NULL; - return PyFloat_FromDouble( (double)mg_fBm( x, y, z, H, lac, oct, nb ) ); -} - -/*------------------------------------------------------------------------*/ - -static PyObject *Noise_multiFractal( PyObject * self, PyObject * args ) -{ - float x, y, z, H, lac, oct; - int nb = 1; - if( !PyArg_ParseTuple - ( args, "(fff)fff|i", &x, &y, &z, &H, &lac, &oct, &nb ) ) - return NULL; - return PyFloat_FromDouble( (double)mg_MultiFractal( x, y, z, H, lac, oct, nb ) ); -} - -/*------------------------------------------------------------------------*/ - -static PyObject *Noise_vlNoise( PyObject * self, PyObject * args ) -{ - float x, y, z, d; - int nt1 = 1, nt2 = 1; - if( !PyArg_ParseTuple - ( args, "(fff)f|ii", &x, &y, &z, &d, &nt1, &nt2 ) ) - return NULL; - return PyFloat_FromDouble( (double)mg_VLNoise( x, y, z, d, nt1, nt2 ) ); -} - -/*-------------------------------------------------------------------------*/ - -static PyObject *Noise_heteroTerrain( PyObject * self, PyObject * args ) -{ - float x, y, z, H, lac, oct, ofs; - int nb = 1; - if( !PyArg_ParseTuple - ( args, "(fff)ffff|i", &x, &y, &z, &H, &lac, &oct, &ofs, &nb ) ) - return NULL; - - return PyFloat_FromDouble( - (double)mg_HeteroTerrain( x, y, z, H, lac, oct, ofs, nb ) ); -} - -/*-------------------------------------------------------------------------*/ - -static PyObject *Noise_hybridMFractal( PyObject * self, PyObject * args ) -{ - float x, y, z, H, lac, oct, ofs, gn; - int nb = 1; - if( !PyArg_ParseTuple - ( args, "(fff)fffff|i", &x, &y, &z, &H, &lac, &oct, &ofs, &gn, - &nb ) ) - return NULL; - - return PyFloat_FromDouble( - (double)mg_HybridMultiFractal( x, y, z, H, lac, oct, ofs, gn, nb) ); -} - -/*------------------------------------------------------------------------*/ - -static PyObject *Noise_ridgedMFractal( PyObject * self, PyObject * args ) -{ - float x, y, z, H, lac, oct, ofs, gn; - int nb = 1; - if( !PyArg_ParseTuple - ( args, "(fff)fffff|i", &x, &y, &z, &H, &lac, &oct, &ofs, &gn, - &nb ) ) - return NULL; - return PyFloat_FromDouble( - (double)mg_RidgedMultiFractal( x, y, z, H, lac, oct, ofs, gn, nb) ); -} - -/*-------------------------------------------------------------------------*/ - -static PyObject *Noise_voronoi( PyObject * self, PyObject * args ) -{ - float x, y, z, da[4], pa[12]; - int dtype = 0; - float me = 2.5; /* default minkovsky exponent */ - if( !PyArg_ParseTuple( args, "(fff)|if", &x, &y, &z, &dtype, &me ) ) - return NULL; - voronoi( x, y, z, da, pa, me, dtype ); - return Py_BuildValue( "[[ffff][[fff][fff][fff][fff]]]", - da[0], da[1], da[2], da[3], - pa[0], pa[1], pa[2], - pa[3], pa[4], pa[5], - pa[6], pa[7], pa[8], pa[9], pa[10], pa[11] ); -} - -/*-------------------------------------------------------------------------*/ - -static PyObject *Noise_cellNoise( PyObject * self, PyObject * args ) -{ - float x, y, z; - if( !PyArg_ParseTuple( args, "(fff)", &x, &y, &z ) ) - return NULL; - return Py_BuildValue( "f", cellNoise( x, y, z ) ); -} - -/*--------------------------------------------------------------------------*/ - -static PyObject *Noise_cellNoiseV( PyObject * self, PyObject * args ) -{ - float x, y, z, ca[3]; - if( !PyArg_ParseTuple( args, "(fff)", &x, &y, &z ) ) - return NULL; - cellNoiseV( x, y, z, ca ); - return Py_BuildValue( "[fff]", ca[0], ca[1], ca[2] ); -} - -/*--------------------------------------------------------------------------*/ -/* For all other Blender modules, this stuff seems to be put in a header file. - This doesn't seem really appropriate to me, so I just put it here, feel free to change it. - In the original module I actually kept the docs stings with the functions themselves, - but I grouped them here so that it can easily be moved to a header if anyone thinks that is necessary. */ - -static char random__doc__[] = "() No arguments.\n\n\ -Returns a random floating point number in the range [0, 1)"; - -static char randuvec__doc__[] = - "() No arguments.\n\nReturns a random unit vector (3-float list)."; - -static char setRandomSeed__doc__[] = "(seed value)\n\n\ -Initializes random number generator.\n\ -if seed is zero, the current time will be used instead."; - -static char noise__doc__[] = "((x,y,z) tuple, [noisetype])\n\n\ -Returns general noise of the optional specified type.\n\ -Optional argument noisetype determines the type of noise, STDPERLIN by default, see NoiseTypes."; - -static char vNoise__doc__[] = "((x,y,z) tuple, [noisetype])\n\n\ -Returns noise vector (3-float list) of the optional specified type.\ -Optional argument noisetype determines the type of noise, STDPERLIN by default, see NoiseTypes."; - -static char turbulence__doc__[] = - "((x,y,z) tuple, octaves, hard, [noisebasis], [ampscale], [freqscale])\n\n\ -Returns general turbulence value using the optional specified noisebasis function.\n\ -octaves (integer) is the number of noise values added.\n\ -hard (bool), when false (0) returns 'soft' noise, when true (1) returns 'hard' noise (returned value always positive).\n\ -Optional arguments:\n\ -noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.\n\ -ampscale sets the amplitude scale value of the noise frequencies added, 0.5 by default.\n\ -freqscale sets the frequency scale factor, 2.0 by default."; - -static char vTurbulence__doc__[] = - "((x,y,z) tuple, octaves, hard, [noisebasis], [ampscale], [freqscale])\n\n\ -Returns general turbulence vector (3-float list) using the optional specified noisebasis function.\n\ -octaves (integer) is the number of noise values added.\n\ -hard (bool), when false (0) returns 'soft' noise, when true (1) returns 'hard' noise (returned vector always positive).\n\ -Optional arguments:\n\ -noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes.\n\ -ampscale sets the amplitude scale value of the noise frequencies added, 0.5 by default.\n\ -freqscale sets the frequency scale factor, 2.0 by default."; - -static char fBm__doc__[] = - "((x,y,z) tuple, H, lacunarity, octaves, [noisebasis])\n\n\ -Returns Fractal Brownian Motion noise value(fBm).\n\ -H is the fractal increment parameter.\n\ -lacunarity is the gap between successive frequencies.\n\ -octaves is the number of frequencies in the fBm.\n\ -Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes."; - -static char multiFractal__doc__[] = - "((x,y,z) tuple, H, lacunarity, octaves, [noisebasis])\n\n\ -Returns Multifractal noise value.\n\ -H determines the highest fractal dimension.\n\ -lacunarity is gap between successive frequencies.\n\ -octaves is the number of frequencies in the fBm.\n\ -Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes."; - -static char vlNoise__doc__[] = - "((x,y,z) tuple, distortion, [noisetype1], [noisetype2])\n\n\ -Returns Variable Lacunarity Noise value, a distorted variety of noise.\n\ -distortion sets the amount of distortion.\n\ -Optional arguments noisetype1 and noisetype2 set the noisetype to distort and the noisetype used for the distortion respectively.\n\ -See NoiseTypes, both are STDPERLIN by default."; - -static char heteroTerrain__doc__[] = - "((x,y,z) tuple, H, lacunarity, octaves, offset, [noisebasis])\n\n\ -returns Heterogeneous Terrain value\n\ -H determines the fractal dimension of the roughest areas.\n\ -lacunarity is the gap between successive frequencies.\n\ -octaves is the number of frequencies in the fBm.\n\ -offset raises the terrain from 'sea level'.\n\ -Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes."; - -static char hybridMFractal__doc__[] = - "((x,y,z) tuple, H, lacunarity, octaves, offset, gain, [noisebasis])\n\n\ -returns Hybrid Multifractal value.\n\ -H determines the fractal dimension of the roughest areas.\n\ -lacunarity is the gap between successive frequencies.\n\ -octaves is the number of frequencies in the fBm.\n\ -offset raises the terrain from 'sea level'.\n\ -gain scales the values.\n\ -Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes."; - -static char ridgedMFractal__doc__[] = - "((x,y,z) tuple, H, lacunarity, octaves, offset, gain [noisebasis])\n\n\ -returns Ridged Multifractal value.\n\ -H determines the fractal dimension of the roughest areas.\n\ -lacunarity is the gap between successive frequencies.\n\ -octaves is the number of frequencies in the fBm.\n\ -offset raises the terrain from 'sea level'.\n\ -gain scales the values.\n\ -Optional argument noisebasis determines the type of noise used for the turbulence, STDPERLIN by default, see NoiseTypes."; - -static char voronoi__doc__[] = - "((x,y,z) tuple, distance_metric, [exponent])\n\n\ -returns a list, containing a list of distances in order of closest feature,\n\ -and a list containing the positions of the four closest features\n\ -Optional arguments:\n\ -distance_metric: see DistanceMetrics, default is DISTANCE\n\ -exponent is only used with MINKOVSKY, default is 2.5."; - -static char cellNoise__doc__[] = "((x,y,z) tuple)\n\n\ -returns cellnoise float value."; - -static char cellNoiseV__doc__[] = "((x,y,z) tuple)\n\n\ -returns cellnoise vector/point/color (3-float list)."; - -static char Noise__doc__[] = "Blender Noise and Turbulence Module\n\n\ -This module can be used to generate noise of various types.\n\ -This can be used for terrain generation, to create textures,\n\ -make animations more 'animated', object deformation, etc.\n\ -As an example, this code segment when scriptlinked to a framechanged event,\n\ -will make the camera sway randomly about, by changing parameters this can\n\ -look like anything from an earthquake to a very nervous or maybe even drunk cameraman...\n\ -(the camera needs an ipo with at least one Loc & Rot key for this to work!):\n\ -\n\ -\tfrom Blender import Get, Scene, Noise\n\ -\n\ -\t####################################################\n\ -\t# This controls jitter speed\n\ -\tsl = 0.025\n\ -\t# This controls the amount of position jitter\n\ -\tsp = 0.1\n\ -\t# This controls the amount of rotation jitter\n\ -\tsr = 0.25\n\ -\t####################################################\n\ -\n\ -\ttime = Get('curtime')\n\ -\tob = Scene.GetCurrent().getCurrentCamera()\n\ -\tps = (sl*time, sl*time, sl*time)\n\ -\t# To add jitter only when the camera moves, use this next line instead\n\ -\t#ps = (sl*ob.LocX, sl*ob.LocY, sl*ob.LocZ)\n\ -\trv = Noise.vTurbulence(ps, 3, 0, Noise.NoiseTypes.NEWPERLIN)\n\ -\tob.dloc = (sp*rv[0], sp*rv[1], sp*rv[2])\n\ -\tob.drot = (sr*rv[0], sr*rv[1], sr*rv[2])\n\ -\n"; - -/* Just in case, declarations for a header file */ -/* -static PyObject *Noise_random(PyObject *self); -static PyObject *Noise_randuvec(PyObject *self); -static PyObject *Noise_setRandomSeed(PyObject *self, PyObject *args); -static PyObject *Noise_noise(PyObject *self, PyObject *args); -static PyObject *Noise_vNoise(PyObject *self, PyObject *args); -static PyObject *Noise_turbulence(PyObject *self, PyObject *args); -static PyObject *Noise_vTurbulence(PyObject *self, PyObject *args); -static PyObject *Noise_fBm(PyObject *self, PyObject *args); -static PyObject *Noise_multiFractal(PyObject *self, PyObject *args); -static PyObject *Noise_vlNoise(PyObject *self, PyObject *args); -static PyObject *Noise_heteroTerrain(PyObject *self, PyObject *args); -static PyObject *Noise_hybridMFractal(PyObject *self, PyObject *args); -static PyObject *Noise_ridgedMFractal(PyObject *self, PyObject *args); -static PyObject *Noise_voronoi(PyObject *self, PyObject *args); -static PyObject *Noise_cellNoise(PyObject *self, PyObject *args); -static PyObject *Noise_cellNoiseV(PyObject *self, PyObject *args); -*/ - -static PyMethodDef NoiseMethods[] = { - {"setRandomSeed", ( PyCFunction ) Noise_setRandomSeed, METH_VARARGS, - setRandomSeed__doc__}, - {"random", ( PyCFunction ) Noise_random, METH_NOARGS, random__doc__}, - {"randuvec", ( PyCFunction ) Noise_randuvec, METH_NOARGS, - randuvec__doc__}, - {"noise", ( PyCFunction ) Noise_noise, METH_VARARGS, noise__doc__}, - {"vNoise", ( PyCFunction ) Noise_vNoise, METH_VARARGS, vNoise__doc__}, - {"turbulence", ( PyCFunction ) Noise_turbulence, METH_VARARGS, - turbulence__doc__}, - {"vTurbulence", ( PyCFunction ) Noise_vTurbulence, METH_VARARGS, - vTurbulence__doc__}, - {"fBm", ( PyCFunction ) Noise_fBm, METH_VARARGS, fBm__doc__}, - {"multiFractal", ( PyCFunction ) Noise_multiFractal, METH_VARARGS, - multiFractal__doc__}, - {"vlNoise", ( PyCFunction ) Noise_vlNoise, METH_VARARGS, - vlNoise__doc__}, - {"heteroTerrain", ( PyCFunction ) Noise_heteroTerrain, METH_VARARGS, - heteroTerrain__doc__}, - {"hybridMFractal", ( PyCFunction ) Noise_hybridMFractal, METH_VARARGS, - hybridMFractal__doc__}, - {"ridgedMFractal", ( PyCFunction ) Noise_ridgedMFractal, METH_VARARGS, - ridgedMFractal__doc__}, - {"voronoi", ( PyCFunction ) Noise_voronoi, METH_VARARGS, - voronoi__doc__}, - {"cellNoise", ( PyCFunction ) Noise_cellNoise, METH_VARARGS, - cellNoise__doc__}, - {"cellNoiseV", ( PyCFunction ) Noise_cellNoiseV, METH_VARARGS, - cellNoiseV__doc__}, - {NULL, NULL, 0, NULL} -}; - -/*----------------------------------------------------------------------*/ - -PyObject *Noise_Init(void) -{ - PyObject *NoiseTypes, *DistanceMetrics, - *md = - Py_InitModule3( "Blender.Noise", NoiseMethods, Noise__doc__ ); - - /* use current time as seed for random number generator by default */ - setRndSeed( 0 ); - - /* Constant noisetype dictionary */ - NoiseTypes = PyConstant_New( ); - if( NoiseTypes ) { - BPy_constant *nt = ( BPy_constant * ) NoiseTypes; - PyConstant_Insert( nt, "BLENDER", - PyInt_FromLong( TEX_BLENDER ) ); - PyConstant_Insert( nt, "STDPERLIN", - PyInt_FromLong( TEX_STDPERLIN ) ); - PyConstant_Insert( nt, "NEWPERLIN", - PyInt_FromLong( TEX_NEWPERLIN ) ); - PyConstant_Insert( nt, "VORONOI_F1", - PyInt_FromLong( TEX_VORONOI_F1 ) ); - PyConstant_Insert( nt, "VORONOI_F2", - PyInt_FromLong( TEX_VORONOI_F2 ) ); - PyConstant_Insert( nt, "VORONOI_F3", - PyInt_FromLong( TEX_VORONOI_F3 ) ); - PyConstant_Insert( nt, "VORONOI_F4", - PyInt_FromLong( TEX_VORONOI_F4 ) ); - PyConstant_Insert( nt, "VORONOI_F2F1", - PyInt_FromLong( TEX_VORONOI_F2F1 ) ); - PyConstant_Insert( nt, "VORONOI_CRACKLE", - PyInt_FromLong( TEX_VORONOI_CRACKLE ) ); - PyConstant_Insert( nt, "CELLNOISE", - PyInt_FromLong( TEX_CELLNOISE ) ); - PyModule_AddObject( md, "NoiseTypes", NoiseTypes ); - } - - /* Constant distance metric dictionary for voronoi */ - DistanceMetrics = PyConstant_New( ); - if( DistanceMetrics ) { - BPy_constant *dm = ( BPy_constant * ) DistanceMetrics; - PyConstant_Insert( dm, "DISTANCE", - PyInt_FromLong( TEX_DISTANCE ) ); - PyConstant_Insert( dm, "DISTANCE_SQUARED", - PyInt_FromLong( TEX_DISTANCE_SQUARED ) ); - PyConstant_Insert( dm, "MANHATTAN", - PyInt_FromLong( TEX_MANHATTAN ) ); - PyConstant_Insert( dm, "CHEBYCHEV", - PyInt_FromLong( TEX_CHEBYCHEV ) ); - PyConstant_Insert( dm, "MINKOVSKY_HALF", - PyInt_FromLong( TEX_MINKOVSKY_HALF ) ); - PyConstant_Insert( dm, "MINKOVSKY_FOUR", - PyInt_FromLong( TEX_MINKOVSKY_FOUR ) ); - PyConstant_Insert( dm, "MINKOVSKY", - PyInt_FromLong( TEX_MINKOVSKY ) ); - PyModule_AddObject( md, "DistanceMetrics", DistanceMetrics ); - } - - return md; -} diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c deleted file mode 100644 index 83c8ed7df3d..00000000000 --- a/source/blender/python/api2_2x/Object.c +++ /dev/null @@ -1,5964 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * - * The Object module provides generic access to Objects of various types via - * the Python interface. - * - * - * Contributor(s): Michel Selten, Willian Germano, Jacques Guignot, - * Joseph Gilbert, Stephen Swaney, Bala Gi, Campbell Barton, Johnny Matthews, - * Ken Hughes, Alex Mole, Jean-Michel Soler - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -struct SpaceIpo; -struct rctf; - -#include "Object.h" /*This must come first */ - -#include "DNA_object_types.h" -#include "DNA_view3d_types.h" -#include "DNA_object_force.h" -#include "DNA_userdef_types.h" -#include "DNA_key_types.h" /* for pinShape and activeShape */ - -#include "BKE_action.h" -#include "BKE_anim.h" /* used for dupli-objects */ -#include "BKE_depsgraph.h" -#include "BKE_effect.h" -#include "BKE_font.h" -#include "BKE_property.h" -#include "BKE_mball.h" -#include "BKE_softbody.h" -#include "BKE_utildefines.h" -#include "BKE_armature.h" -#include "BKE_lattice.h" -#include "BKE_mesh.h" -#include "BKE_library.h" -#include "BKE_object.h" -#include "BKE_curve.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_scene.h" -#include "BKE_nla.h" -#include "BKE_material.h" -#include "BKE_modifier.h" -#include "BKE_idprop.h" -#include "BKE_object.h" -#include "BKE_key.h" /* for setting the activeShape */ -#include "BKE_displist.h" - -#include "BSE_editipo.h" -#include "BSE_edit.h" - -#include "BIF_space.h" -#include "BIF_editview.h" -#include "BIF_drawscene.h" -#include "BIF_meshtools.h" -#include "BIF_editarmature.h" -#include "BIF_editaction.h" -#include "BIF_editnla.h" - -#include "BLI_arithb.h" -#include "BLI_blenlib.h" - -#include "BDR_editobject.h" -#include "BDR_editcurve.h" -#include "BDR_drawobject.h" - -#include "MEM_guardedalloc.h" - -#include "mydevice.h" -#include "blendef.h" -#include "Scene.h" -#include "Mathutils.h" -#include "Mesh.h" -#include "NMesh.h" -#include "Curve.h" -#include "Ipo.h" -#include "Armature.h" -#include "Pose.h" -#include "Camera.h" -#include "Lamp.h" -#include "Lattice.h" -#include "Text.h" -#include "Text3d.h" -#include "Metaball.h" -#include "Draw.h" -#include "NLA.h" -#include "logic.h" -#include "Effect.h" -#include "Group.h" -#include "Modifier.h" -#include "Constraint.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "EXPP_interface.h" -#include "BIF_editkey.h" -#include "IDProp.h" - -/* Defines for insertIpoKey */ - -#define IPOKEY_LOC 0 -#define IPOKEY_ROT 1 -#define IPOKEY_SIZE 2 -#define IPOKEY_LOCROT 3 -#define IPOKEY_LOCROTSIZE 4 -#define IPOKEY_PI_STRENGTH 5 -#define IPOKEY_PI_FALLOFF 6 -#define IPOKEY_PI_MAXDIST 7 /*Not Ready Yet*/ -#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 -#define PFIELD_MAGNET 3 -#define PFIELD_WIND 4 - -enum obj_consts { - EXPP_OBJ_ATTR_LOC_X = 0, - EXPP_OBJ_ATTR_LOC_Y, - EXPP_OBJ_ATTR_LOC_Z, - EXPP_OBJ_ATTR_DLOC_X, - EXPP_OBJ_ATTR_DLOC_Y, - EXPP_OBJ_ATTR_DLOC_Z, - EXPP_OBJ_ATTR_ROT_X, - EXPP_OBJ_ATTR_ROT_Y, - EXPP_OBJ_ATTR_ROT_Z, - EXPP_OBJ_ATTR_DROT_X, - EXPP_OBJ_ATTR_DROT_Y, - EXPP_OBJ_ATTR_DROT_Z, - EXPP_OBJ_ATTR_SIZE_X, - EXPP_OBJ_ATTR_SIZE_Y, - EXPP_OBJ_ATTR_SIZE_Z, - EXPP_OBJ_ATTR_DSIZE_X, - EXPP_OBJ_ATTR_DSIZE_Y, - EXPP_OBJ_ATTR_DSIZE_Z, - EXPP_OBJ_ATTR_LOC, - EXPP_OBJ_ATTR_DLOC, - EXPP_OBJ_ATTR_DROT, - EXPP_OBJ_ATTR_SIZE, - EXPP_OBJ_ATTR_DSIZE, - EXPP_OBJ_ATTR_LAYERMASK, - EXPP_OBJ_ATTR_COLBITS, - EXPP_OBJ_ATTR_DRAWMODE, - EXPP_OBJ_ATTR_DRAWTYPE, - EXPP_OBJ_ATTR_DUPON, - 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, - EXPP_OBJ_ATTR_PASSINDEX, - EXPP_OBJ_ATTR_ACT_MATERIAL, - EXPP_OBJ_ATTR_ACT_SHAPE, - - EXPP_OBJ_ATTR_PI_SURFACEDAMP, /* these need to stay together */ - EXPP_OBJ_ATTR_PI_RANDOMDAMP, /* and in order */ - EXPP_OBJ_ATTR_PI_PERM, - EXPP_OBJ_ATTR_PI_STRENGTH, - EXPP_OBJ_ATTR_PI_FALLOFF, - EXPP_OBJ_ATTR_PI_MAXDIST, - EXPP_OBJ_ATTR_PI_SBDAMP, - EXPP_OBJ_ATTR_PI_SBIFACETHICK, - EXPP_OBJ_ATTR_PI_SBOFACETHICK, - - EXPP_OBJ_ATTR_SB_NODEMASS, /* these need to stay together */ - EXPP_OBJ_ATTR_SB_GRAV, /* and in order */ - EXPP_OBJ_ATTR_SB_MEDIAFRICT, - EXPP_OBJ_ATTR_SB_RKLIMIT, - EXPP_OBJ_ATTR_SB_PHYSICSSPEED, - EXPP_OBJ_ATTR_SB_GOALSPRING, - EXPP_OBJ_ATTR_SB_GOALFRICT, - EXPP_OBJ_ATTR_SB_MINGOAL, - EXPP_OBJ_ATTR_SB_MAXGOAL, - EXPP_OBJ_ATTR_SB_DEFGOAL, - EXPP_OBJ_ATTR_SB_INSPRING, - EXPP_OBJ_ATTR_SB_INFRICT, - -}; - -#define EXPP_OBJECT_DRAWSIZEMIN 0.01f -#define EXPP_OBJECT_DRAWSIZEMAX 10.0f - -/* clamping and range values for particle interaction settings */ -#define EXPP_OBJECT_PIDAMP_MIN 0.0f -#define EXPP_OBJECT_PIDAMP_MAX 1.0f -#define EXPP_OBJECT_PIRDAMP_MIN 0.0f -#define EXPP_OBJECT_PIRDAMP_MAX 1.0f -#define EXPP_OBJECT_PIPERM_MIN 0.0f -#define EXPP_OBJECT_PIPERM_MAX 1.0f -#define EXPP_OBJECT_PISTRENGTH_MIN 0.0f -#define EXPP_OBJECT_PISTRENGTH_MAX 1000.0f -#define EXPP_OBJECT_PIPOWER_MIN 0.0f -#define EXPP_OBJECT_PIPOWER_MAX 10.0f -#define EXPP_OBJECT_PIMAXDIST_MIN 0.0f -#define EXPP_OBJECT_PIMAXDIST_MAX 1000.0f -#define EXPP_OBJECT_PISBDAMP_MIN 0.0f -#define EXPP_OBJECT_PISBDAMP_MAX 1.0f -#define EXPP_OBJECT_PISBIFTMIN 0.001f -#define EXPP_OBJECT_PISBIFTMAX 1.0f -#define EXPP_OBJECT_PISBOFTMIN 0.001f -#define EXPP_OBJECT_PISBOFTMAX 1.0f - -/* clamping and range values for softbody settings */ -#define EXPP_OBJECT_SBMASS_MIN 0.0f -#define EXPP_OBJECT_SBMASS_MAX 50.0f -#define EXPP_OBJECT_SBGRAVITY_MIN 0.0f -#define EXPP_OBJECT_SBGRAVITY_MAX 10.0f -#define EXPP_OBJECT_SBFRICTION_MIN 0.0f -#define EXPP_OBJECT_SBFRICTION_MAX 10.0f -#define EXPP_OBJECT_SBSPEED_MIN 0.01f -#define EXPP_OBJECT_SBSPEED_MAX 100.0f -#define EXPP_OBJECT_SBERRORLIMIT_MIN 0.01f -#define EXPP_OBJECT_SBERRORLIMIT_MAX 1.0f -#define EXPP_OBJECT_SBGOALSPRING_MIN 0.0f -#define EXPP_OBJECT_SBGOALSPRING_MAX 0.999f -#define EXPP_OBJECT_SBGOALFRICT_MIN 0.0f -#define EXPP_OBJECT_SBGOALFRICT_MAX 10.0f -#define EXPP_OBJECT_SBMINGOAL_MIN 0.0f -#define EXPP_OBJECT_SBMINGOAL_MAX 1.0f -#define EXPP_OBJECT_SBMAXGOAL_MIN 0.0f -#define EXPP_OBJECT_SBMAXGOAL_MAX 1.0f -#define EXPP_OBJECT_SBINSPRING_MIN 0.0f -#define EXPP_OBJECT_SBINSPRING_MAX 0.999f -#define EXPP_OBJECT_SBINFRICT_MIN 0.0f -#define EXPP_OBJECT_SBINFRICT_MAX 10.0f -#define EXPP_OBJECT_SBDEFGOAL_MIN 0.0f -#define EXPP_OBJECT_SBDEFGOAL_MAX 1.0f -#define EXPP_OBJECT_SBNODEMASSMIN 0.001f -#define EXPP_OBJECT_SBNODEMASSMAX 50.0f -#define EXPP_OBJECT_SBGRAVMIN 0.0f -#define EXPP_OBJECT_SBGRAVMAX 10.0f -#define EXPP_OBJECT_SBMEDIAFRICTMIN 0.0f -#define EXPP_OBJECT_SBMEDIAFRICTMAX 10.0f -#define EXPP_OBJECT_SBRKLIMITMIN 0.01f -#define EXPP_OBJECT_SBRKLIMITMAX 1.0f -#define EXPP_OBJECT_SBPHYSICSSPEEDMIN 0.01f -#define EXPP_OBJECT_SBPHYSICSSPEEDMAX 100.0f -#define EXPP_OBJECT_SBGOALSPRINGMIN 0.0f -#define EXPP_OBJECT_SBGOALSPRINGMAX 0.999f -#define EXPP_OBJECT_SBGOALFRICTMIN 0.0f -#define EXPP_OBJECT_SBGOALFRICTMAX 10.0f -#define EXPP_OBJECT_SBMINGOALMIN 0.0f -#define EXPP_OBJECT_SBMINGOALMAX 1.0f -#define EXPP_OBJECT_SBMAXGOALMIN 0.0f -#define EXPP_OBJECT_SBMAXGOALMAX 1.0f -#define EXPP_OBJECT_SBDEFGOALMIN 0.0f -#define EXPP_OBJECT_SBDEFGOALMAX 1.0f -#define EXPP_OBJECT_SBINSPRINGMIN 0.0f -#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. */ -/*****************************************************************************/ -static PyObject *M_Object_New( PyObject * self, PyObject * args ); -PyObject *M_Object_Get( PyObject * self, PyObject * args ); -static PyObject *M_Object_GetSelected( PyObject * self ); -static PyObject *M_Object_Duplicate( PyObject * self, PyObject * args, PyObject *kwd); - -/* HELPER FUNCTION FOR PARENTING */ -static PyObject *internal_makeParent(Object *parent, PyObject *py_child, int partype, int noninverse, int fast, int v1, int v2, int v3, char *bonename); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Object.__doc__ */ -/*****************************************************************************/ -char M_Object_doc[] = "The Blender Object module\n\n\ -This module provides access to **Object Data** in Blender.\n"; - -char M_Object_New_doc[] = - "(type) - Add a new object of type 'type' in the current scene"; - -char M_Object_Get_doc[] = - "(name) - return the object with the name 'name', returns None if not\ - found.\n\ - If 'name' is not specified, it returns a list of all objects in the\n\ - current scene."; - -char M_Object_GetSelected_doc[] = - "() - Returns a list of selected Objects in the active layer(s)\n\ -The active object is the first in the list, if visible"; - -char M_Object_Duplicate_doc[] = - "(linked) - Duplicate all selected, visible objects in the current scene"; - - -/*****************************************************************************/ -/* Python method structure definition for Blender.Object module: */ -/*****************************************************************************/ -struct PyMethodDef M_Object_methods[] = { - {"New", ( PyCFunction ) M_Object_New, METH_VARARGS, - M_Object_New_doc}, - {"Get", ( PyCFunction ) M_Object_Get, METH_VARARGS, - M_Object_Get_doc}, - {"GetSelected", ( PyCFunction ) M_Object_GetSelected, METH_NOARGS, - M_Object_GetSelected_doc}, - {"Duplicate", ( PyCFunction ) M_Object_Duplicate, METH_VARARGS | METH_KEYWORDS, - M_Object_Duplicate_doc}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Python BPy_Object methods declarations: */ -/*****************************************************************************/ -static int setupSB(Object* ob); /*Make sure Softbody Pointer is initialized */ -static int setupPI(Object* ob); - -static PyObject *Object_buildParts( BPy_Object * self ); -static PyObject *Object_clearIpo( BPy_Object * self ); -static PyObject *Object_clrParent( BPy_Object * self, PyObject * args ); -static PyObject *Object_clearTrack( BPy_Object * self, PyObject * args ); -static PyObject *Object_getData(BPy_Object *self, PyObject *args, PyObject *kwd); -static PyObject *Object_getDeltaLocation( BPy_Object * self ); -static PyObject *Object_getDrawMode( BPy_Object * self ); -static PyObject *Object_getDrawType( BPy_Object * self ); -static PyObject *Object_GetEuler( BPy_Object * self, PyObject * args ); -static PyObject *Object_getInverseMatrix( BPy_Object * self ); -static PyObject *Object_getIpo( BPy_Object * self ); -static PyObject *Object_getLocation( BPy_Object * self, PyObject * args ); -static PyObject *Object_getMaterials( BPy_Object * self, PyObject * args ); -static PyObject *Object_getMatrix( BPy_Object * self, PyObject * args ); -static PyObject *Object_getParent( BPy_Object * self ); -static PyObject *Object_getParentBoneName( BPy_Object * self ); -static int Object_setParentBoneName( BPy_Object * self, PyObject * value ); -static PyObject *Object_getSize( BPy_Object * self, PyObject * args ); -static PyObject *Object_getTimeOffset( BPy_Object * self ); -static PyObject *Object_getTracked( BPy_Object * self ); -static PyObject *Object_getType( BPy_Object * self ); -static PyObject *Object_getBoundBox( BPy_Object * self ); -static PyObject *Object_getAction( BPy_Object * self ); -static PyObject *Object_getPose( BPy_Object * self ); -static PyObject *Object_evaluatePose( BPy_Object * self, PyObject *args ); -static PyObject *Object_getSelected( BPy_Object * self ); -static PyObject *Object_makeDisplayList( BPy_Object * self ); -static PyObject *Object_link( BPy_Object * self, PyObject * args ); -static PyObject *Object_makeParent( BPy_Object * self, PyObject * args ); -static PyObject *Object_join( BPy_Object * self, PyObject * args ); -static PyObject *Object_makeParentDeform( BPy_Object * self, PyObject * args ); -static PyObject *Object_makeParentVertex( BPy_Object * self, PyObject * args ); -static PyObject *Object_makeParentBone( BPy_Object * self, PyObject * args ); -static PyObject *Object_materialUsage( void ); -static PyObject *Object_getDupliObjects ( BPy_Object * self); -static PyObject *Object_getEffects( BPy_Object * self ); -static PyObject *Object_setDeltaLocation( BPy_Object * self, PyObject * args ); -static PyObject *Object_SetDrawMode( BPy_Object * self, PyObject * args ); -static PyObject *Object_SetDrawType( BPy_Object * self, PyObject * args ); -static PyObject *Object_SetEuler( BPy_Object * self, PyObject * args ); -static PyObject *Object_SetMatrix( BPy_Object * self, PyObject * args ); -static PyObject *Object_SetIpo( BPy_Object * self, PyObject * args ); -static PyObject *Object_insertIpoKey( BPy_Object * self, PyObject * args ); -static PyObject *Object_insertPoseKey( BPy_Object * self, PyObject * args ); -static PyObject *Object_insertCurrentPoseKey( BPy_Object * self, PyObject * args ); -static PyObject *Object_setConstraintInfluenceForBone( BPy_Object * self, PyObject * args ); -static PyObject *Object_setLocation( BPy_Object * self, PyObject * args ); -static PyObject *Object_setMaterials( BPy_Object * self, PyObject * args ); -static PyObject *Object_setSize( BPy_Object * self, PyObject * args ); -static PyObject *Object_setTimeOffset( BPy_Object * self, PyObject * args ); -static PyObject *Object_makeTrack( BPy_Object * self, PyObject * args ); -static PyObject *Object_shareFrom( BPy_Object * self, PyObject * args ); -static PyObject *Object_Select( BPy_Object * self, PyObject * args ); -static PyObject *Object_getAllProperties( BPy_Object * self ); -static PyObject *Object_addProperty( BPy_Object * self, PyObject * args ); -static PyObject *Object_removeProperty( BPy_Object * self, PyObject * args ); -static PyObject *Object_getProperty( BPy_Object * self, PyObject * args ); -static PyObject *Object_removeAllProperties( BPy_Object * self ); -static PyObject *Object_copyAllPropertiesTo( BPy_Object * self, - PyObject * args ); -static PyObject *Object_getScriptLinks( BPy_Object * self, PyObject * value ); -static PyObject *Object_addScriptLink( BPy_Object * self, PyObject * args ); -static PyObject *Object_clearScriptLinks( BPy_Object * self, PyObject *args ); -static PyObject *Object_getPIStrength( BPy_Object * self ); -static PyObject *Object_setPIStrength( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPIFalloff( BPy_Object * self ); -static PyObject *Object_setPIFalloff( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPIMaxDist( BPy_Object * self ); -static PyObject *Object_setPIMaxDist( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPIUseMaxDist( BPy_Object * self ); -static PyObject *Object_SetPIUseMaxDist( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPIType( BPy_Object * self ); -static PyObject *Object_SetPIType( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPIPerm( BPy_Object * self ); -static PyObject *Object_SetPIPerm( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPIRandomDamp( BPy_Object * self ); -static PyObject *Object_setPIRandomDamp( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPISurfaceDamp( BPy_Object * self ); -static PyObject *Object_SetPISurfaceDamp( BPy_Object * self, PyObject * args ); -static PyObject *Object_getPIDeflection( BPy_Object * self ); -static PyObject *Object_SetPIDeflection( BPy_Object * self, PyObject * args ); - -static int Object_setRBMass( BPy_Object * self, PyObject * args ); -static int Object_setRBFlags( BPy_Object * self, PyObject * args ); -static int Object_setRBShapeBoundType( BPy_Object * self, PyObject * args ); - -static PyObject *Object_getSBMass( BPy_Object * self ); -static PyObject *Object_setSBMass( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBGravity( BPy_Object * self ); -static PyObject *Object_setSBGravity( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBFriction( BPy_Object * self ); -static PyObject *Object_setSBFriction( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBErrorLimit( BPy_Object * self ); -static PyObject *Object_setSBErrorLimit( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBGoalSpring( BPy_Object * self ); -static PyObject *Object_setSBGoalSpring( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBGoalFriction( BPy_Object * self ); -static PyObject *Object_setSBGoalFriction( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBMinGoal( BPy_Object * self ); -static PyObject *Object_setSBMinGoal( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBMaxGoal( BPy_Object * self ); -static PyObject *Object_setSBMaxGoal( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBInnerSpring( BPy_Object * self ); -static PyObject *Object_setSBInnerSpring( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBInnerSpringFriction( BPy_Object * self ); -static PyObject *Object_setSBInnerSpringFriction( BPy_Object * self, PyObject * args ); - -static PyObject *Object_isSB( BPy_Object * self ); -static PyObject *Object_getSBDefaultGoal( BPy_Object * self ); -static PyObject *Object_setSBDefaultGoal( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBUseGoal( BPy_Object * self ); -static PyObject *Object_SetSBUseGoal( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBUseEdges( BPy_Object * self ); -static PyObject *Object_SetSBUseEdges( BPy_Object * self, PyObject * args ); -static PyObject *Object_getSBStiffQuads( BPy_Object * self ); -static PyObject *Object_SetSBStiffQuads( BPy_Object * self, PyObject * args ); -static PyObject *Object_insertShapeKey(BPy_Object * self); -static PyObject *Object_copyNLA( BPy_Object * self, PyObject * args ); -static PyObject *Object_convertActionToStrip( BPy_Object * self ); -static PyObject *Object_copy(BPy_Object * self); /* __copy__ */ - -/*****************************************************************************/ -/* Python BPy_Object methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Object_methods[] = { - /* name, method, flags, doc */ - {"buildParts", ( PyCFunction ) Object_buildParts, METH_NOARGS, - "Recalcs particle system (if any) "}, - {"getIpo", ( PyCFunction ) Object_getIpo, METH_NOARGS, - "Returns the ipo of this object (if any) "}, - {"clrParent", ( PyCFunction ) Object_clrParent, METH_VARARGS, - "Clears parent object. Optionally specify:\n\ -mode\n\tnonzero: Keep object transform\nfast\n\t>0: Don't update scene \ -hierarchy (faster)"}, - {"clearTrack", ( PyCFunction ) Object_clearTrack, METH_VARARGS, - "Make this object not track another anymore. Optionally specify:\n\ -mode\n\t2: Keep object transform\nfast\n\t>0: Don't update scene \ -hierarchy (faster)"}, - {"getData", ( PyCFunction ) Object_getData, METH_VARARGS | METH_KEYWORDS, - "(name_only = 0, mesh = 0) - Returns the datablock object containing the object's \ -data, e.g. Mesh.\n\ -If 'name_only' is nonzero or True, only the name of the datablock is returned"}, - {"getDeltaLocation", ( PyCFunction ) Object_getDeltaLocation, - METH_NOARGS, - "Returns the object's delta location (x, y, z)"}, - {"getDrawMode", ( PyCFunction ) Object_getDrawMode, METH_NOARGS, - "Returns the object draw modes"}, - {"getDrawType", ( PyCFunction ) Object_getDrawType, METH_NOARGS, - "Returns the object draw type"}, - {"getAction", ( PyCFunction ) Object_getAction, METH_NOARGS, - "Returns the active action for this object"}, - {"evaluatePose", ( PyCFunction ) Object_evaluatePose, METH_VARARGS, - "(framenum) - Updates the pose to a certain frame number when the Object is\ - bound to an Action"}, - {"getPose", ( PyCFunction ) Object_getPose, METH_NOARGS, - "() - returns the pose from an object if it exists, else None"}, - {"isSelected", ( PyCFunction ) Object_getSelected, METH_NOARGS, - "Return a 1 or 0 depending on whether the object is selected"}, - {"getEuler", ( PyCFunction ) Object_GetEuler, METH_VARARGS, - "(space = 'localspace' / 'worldspace') - Returns the object's rotation as Euler rotation vector\n\ -(rotX, rotY, rotZ)"}, - {"getInverseMatrix", ( PyCFunction ) Object_getInverseMatrix, - METH_NOARGS, - "Returns the object's inverse matrix"}, - {"getLocation", ( PyCFunction ) Object_getLocation, METH_VARARGS, - "(space = 'localspace' / 'worldspace') - Returns the object's location (x, y, z)\n\ -"}, - {"getMaterials", ( PyCFunction ) Object_getMaterials, METH_VARARGS, - "(i = 0) - Returns list of materials assigned to the object.\n\ -if i is nonzero, empty slots are not ignored: they are returned as None's."}, - {"getMatrix", ( PyCFunction ) Object_getMatrix, METH_VARARGS, - "(str = 'worldspace') - Returns the object matrix.\n\ -(str = 'worldspace') - the desired matrix: worldspace (default), localspace\n\ -or old_worldspace.\n\ -\n\ -'old_worldspace' was the only behavior before Blender 2.34. With it the\n\ -matrix is not updated for changes made by the script itself\n\ -(like obj.LocX = 10) until a redraw happens, either called by the script or\n\ -automatic when the script finishes."}, - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "Returns the name of the object"}, - {"getParent", ( PyCFunction ) Object_getParent, METH_NOARGS, - "Returns the object's parent object"}, - {"getParentBoneName", ( PyCFunction ) Object_getParentBoneName, METH_NOARGS, - "Returns None, or the 'sub-name' of the parent (eg. Bone name)"}, - {"getSize", ( PyCFunction ) Object_getSize, METH_VARARGS, - "(space = 'localspace' / 'worldspace') - Returns the object's size (x, y, z)"}, - {"getTimeOffset", ( PyCFunction ) Object_getTimeOffset, METH_NOARGS, - "Returns the object's time offset"}, - {"getTracked", ( PyCFunction ) Object_getTracked, METH_NOARGS, - "Returns the object's tracked object"}, - {"getType", ( PyCFunction ) Object_getType, METH_NOARGS, - "Returns type of string of Object"}, -/* Particle Interaction */ - - {"getPIStrength", ( PyCFunction ) Object_getPIStrength, METH_NOARGS, - "Returns Particle Interaction Strength"}, - {"setPIStrength", ( PyCFunction ) Object_setPIStrength, METH_VARARGS, - "Sets Particle Interaction Strength"}, - {"getPIFalloff", ( PyCFunction ) Object_getPIFalloff, METH_NOARGS, - "Returns Particle Interaction Falloff"}, - {"setPIFalloff", ( PyCFunction ) Object_setPIFalloff, METH_VARARGS, - "Sets Particle Interaction Falloff"}, - {"getPIMaxDist", ( PyCFunction ) Object_getPIMaxDist, METH_NOARGS, - "Returns Particle Interaction Max Distance"}, - {"setPIMaxDist", ( PyCFunction ) Object_setPIMaxDist, METH_VARARGS, - "Sets Particle Interaction Max Distance"}, - {"getPIUseMaxDist", ( PyCFunction ) Object_getPIUseMaxDist, METH_NOARGS, - "Returns bool for Use Max Distace in Particle Interaction "}, - {"setPIUseMaxDist", ( PyCFunction ) Object_SetPIUseMaxDist, METH_VARARGS, - "Sets if Max Distance should be used in Particle Interaction"}, - {"getPIType", ( PyCFunction ) Object_getPIType, METH_NOARGS, - "Returns Particle Interaction Type"}, - {"setPIType", ( PyCFunction ) Object_SetPIType, METH_VARARGS, - "sets Particle Interaction Type"}, - {"getPIPerm", ( PyCFunction ) Object_getPIPerm, METH_NOARGS, - "Returns Particle Interaction Permiability"}, - {"setPIPerm", ( PyCFunction ) Object_SetPIPerm, METH_VARARGS, - "Sets Particle Interaction Permiability"}, - {"getPISurfaceDamp", ( PyCFunction ) Object_getPISurfaceDamp, METH_NOARGS, - "Returns Particle Interaction Surface Damping"}, - {"setPISurfaceDamp", ( PyCFunction ) Object_SetPISurfaceDamp, METH_VARARGS, - "Sets Particle Interaction Surface Damping"}, - {"getPIRandomDamp", ( PyCFunction ) Object_getPIRandomDamp, METH_NOARGS, - "Returns Particle Interaction Random Damping"}, - {"setPIRandomDamp", ( PyCFunction ) Object_setPIRandomDamp, METH_VARARGS, - "Sets Particle Interaction Random Damping"}, - {"getPIDeflection", ( PyCFunction ) Object_getPIDeflection, METH_NOARGS, - "Returns Particle Interaction Deflection"}, - {"setPIDeflection", ( PyCFunction ) Object_SetPIDeflection, METH_VARARGS, - "Sets Particle Interaction Deflection"}, - -/* Softbody */ - - {"isSB", ( PyCFunction ) Object_isSB, METH_NOARGS, - "True if object is a soft body"}, - {"getSBMass", ( PyCFunction ) Object_getSBMass, METH_NOARGS, - "Returns SB Mass"}, - {"setSBMass", ( PyCFunction ) Object_setSBMass, METH_VARARGS, - "Sets SB Mass"}, - {"getSBGravity", ( PyCFunction ) Object_getSBGravity, METH_NOARGS, - "Returns SB Gravity"}, - {"setSBGravity", ( PyCFunction ) Object_setSBGravity, METH_VARARGS, - "Sets SB Gravity"}, - {"getSBFriction", ( PyCFunction ) Object_getSBFriction, METH_NOARGS, - "Returns SB Friction"}, - {"setSBFriction", ( PyCFunction ) Object_setSBFriction, METH_VARARGS, - "Sets SB Friction"}, - {"getSBErrorLimit", ( PyCFunction ) Object_getSBErrorLimit, METH_NOARGS, - "Returns SB ErrorLimit"}, - {"setSBErrorLimit", ( PyCFunction ) Object_setSBErrorLimit, METH_VARARGS, - "Sets SB ErrorLimit"}, - {"getSBGoalSpring", ( PyCFunction ) Object_getSBGoalSpring, METH_NOARGS, - "Returns SB GoalSpring"}, - {"setSBGoalSpring", ( PyCFunction ) Object_setSBGoalSpring, METH_VARARGS, - "Sets SB GoalSpring"}, - {"getSBGoalFriction", ( PyCFunction ) Object_getSBGoalFriction, METH_NOARGS, - "Returns SB GoalFriction"}, - {"setSBGoalFriction", ( PyCFunction ) Object_setSBGoalFriction, METH_VARARGS, - "Sets SB GoalFriction"}, - {"getSBMinGoal", ( PyCFunction ) Object_getSBMinGoal, METH_NOARGS, - "Returns SB MinGoal"}, - {"setSBMinGoal", ( PyCFunction ) Object_setSBMinGoal, METH_VARARGS, - "Sets SB MinGoal "}, - {"getSBMaxGoal", ( PyCFunction ) Object_getSBMaxGoal, METH_NOARGS, - "Returns SB MaxGoal"}, - {"setSBMaxGoal", ( PyCFunction ) Object_setSBMaxGoal, METH_VARARGS, - "Sets SB MaxGoal"}, - {"getSBInnerSpring", ( PyCFunction ) Object_getSBInnerSpring, METH_NOARGS, - "Returns SB InnerSpring"}, - {"setSBInnerSpring", ( PyCFunction ) Object_setSBInnerSpring, METH_VARARGS, - "Sets SB InnerSpring"}, - {"getSBInnerSpringFriction", ( PyCFunction ) Object_getSBInnerSpringFriction, METH_NOARGS, - "Returns SB InnerSpringFriction"}, - {"setSBInnerSpringFriction", ( PyCFunction ) Object_setSBInnerSpringFriction, METH_VARARGS, - "Sets SB InnerSpringFriction"}, - {"getSBDefaultGoal", ( PyCFunction ) Object_getSBDefaultGoal, METH_NOARGS, - "Returns SB DefaultGoal"}, - {"setSBDefaultGoal", ( PyCFunction ) Object_setSBDefaultGoal, METH_VARARGS, - "Sets SB DefaultGoal"}, - {"getSBUseGoal", ( PyCFunction ) Object_getSBUseGoal, METH_NOARGS, - "Returns SB UseGoal"}, - {"setSBUseGoal", ( PyCFunction ) Object_SetSBUseGoal, METH_VARARGS, - "Sets SB UseGoal"}, - {"getSBUseEdges", ( PyCFunction ) Object_getSBUseEdges, METH_NOARGS, - "Returns SB UseEdges"}, - {"setSBUseEdges", ( PyCFunction ) Object_SetSBUseEdges, METH_VARARGS, - "Sets SB UseEdges"}, - {"getSBStiffQuads", ( PyCFunction ) Object_getSBStiffQuads, METH_NOARGS, - "Returns SB StiffQuads"}, - {"setSBStiffQuads", ( PyCFunction ) Object_SetSBStiffQuads, METH_VARARGS, - "Sets SB StiffQuads"}, - {"getBoundBox", ( PyCFunction ) Object_getBoundBox, METH_NOARGS, - "Returns the object's bounding box"}, - {"makeDisplayList", ( PyCFunction ) Object_makeDisplayList, METH_NOARGS, - "Update this object's Display List. Some changes like turning\n\ -'SubSurf' on for a mesh need this method (followed by a Redraw) to\n\ -show the changes on the 3d window."}, - {"link", ( PyCFunction ) Object_link, METH_VARARGS, - "Links Object with data provided in the argument. The data must\n\ -match the Object's type, so you cannot link a Lamp to a Mesh type object."}, - {"makeParent", ( PyCFunction ) Object_makeParent, METH_VARARGS, - "Makes the object the parent of the objects provided in the\n\ -argument which must be a list of valid Objects. Optional extra arguments:\n\ -mode:\n\t0: make parent with inverse\n\t1: without inverse\n\ -fast:\n\t0: update scene hierarchy automatically\n\t\ -don't update scene hierarchy (faster). In this case, you must\n\t\ -explicitly update the Scene hierarchy."}, - {"join", ( PyCFunction ) Object_join, METH_VARARGS, - "(object_list) - Joins the objects in object list of the same type, into this object."}, - {"makeParentDeform", ( PyCFunction ) Object_makeParentDeform, METH_VARARGS, - "Makes the object the deformation parent of the objects provided in the \n\ -argument which must be a list of valid Objects. Optional extra arguments:\n\ -mode:\n\t0: make parent with inverse\n\t1: without inverse\n\ -fast:\n\t0: update scene hierarchy automatically\n\t\ -don't update scene hierarchy (faster). In this case, you must\n\t\ -explicitly update the Scene hierarchy."}, - {"makeParentVertex", ( PyCFunction ) Object_makeParentVertex, METH_VARARGS, - "Makes the object the vertex parent of the objects provided in the \n\ -argument which must be a list of valid Objects. \n\ -The second argument is a tuple of 1 or 3 positive integers which corresponds \ -to the index of the vertex you are parenting to.\n\ -Optional extra arguments:\n\ -mode:\n\t0: make parent with inverse\n\t1: without inverse\n\ -fast:\n\t0: update scene hierarchy automatically\n\t\ -don't update scene hierarchy (faster). In this case, you must\n\t\ -explicitly update the Scene hierarchy."}, - {"makeParentBone", ( PyCFunction ) Object_makeParentBone, METH_VARARGS, - "Makes this armature objects bone, the parent of the objects provided in the \n\ -argument which must be a list of valid Objects. Optional extra arguments:\n\ -mode:\n\t0: make parent with inverse\n\t1: without inverse\n\ -fast:\n\t0: update scene hierarchy automatically\n\t\ -don't update scene hierarchy (faster). In this case, you must\n\t\ -explicitely update the Scene hierarchy."}, - - {"materialUsage", ( PyCFunction ) Object_materialUsage, METH_NOARGS, - "Determines the way the material is used and returns status.\n\ -Possible arguments (provide as strings):\n\ -\tData: Materials assigned to the object's data are shown. (default)\n\ -\tObject: Materials assigned to the object are shown."}, - {"setDeltaLocation", ( PyCFunction ) Object_setDeltaLocation, - METH_VARARGS, - "Sets the object's delta location which must be a vector triple."}, - {"setDrawMode", ( PyCFunction ) Object_SetDrawMode, METH_VARARGS, - "Sets the object's drawing mode. The argument can be a sum of:\n\ -2: axis\n4: texspace\n8: drawname\n16: drawimage\n32: drawwire\n64: drawxray\n128: drawtransp"}, - {"setDrawType", ( PyCFunction ) Object_SetDrawType, METH_VARARGS, - "Sets the object's drawing type. The argument must be one of:\n\ -1: Bounding box\n2: Wire\n3: Solid\n4: Shaded\n5: Textured"}, - {"setEuler", ( PyCFunction ) Object_SetEuler, METH_VARARGS, - "Set the object's rotation according to the specified Euler\n\ -angles. The argument must be a vector triple"}, - {"setMatrix", ( PyCFunction ) Object_SetMatrix, METH_VARARGS, - "Set and apply a new local matrix for the object"}, - {"setLocation", ( PyCFunction ) Object_setLocation, METH_VARARGS, - "Set the object's location. The first argument must be a vector\n\ -triple."}, - {"setMaterials", ( PyCFunction ) Object_setMaterials, METH_VARARGS, - "Sets materials. The argument must be a list of valid material\n\ -objects."}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "Sets the name of the object"}, - {"setSize", ( PyCFunction ) Object_setSize, METH_VARARGS, - "Set the object's size. The first argument must be a vector\n\ -triple."}, - {"setTimeOffset", ( PyCFunction ) Object_setTimeOffset, METH_VARARGS, - "Set the object's time offset."}, - {"makeTrack", ( PyCFunction ) Object_makeTrack, METH_VARARGS, - "(trackedobj, fast = 0) - Make this object track another.\n\ - (trackedobj) - the object that will be tracked.\n\ - (fast = 0) - if 0: update the scene hierarchy automatically. If you\n\ - set 'fast' to a nonzero value, don't forget to update the scene yourself\n\ - (see scene.update())."}, - {"shareFrom", ( PyCFunction ) Object_shareFrom, METH_VARARGS, - "Link data of self with object specified in the argument. This\n\ -works only if self and the object specified are of the same type."}, - {"select", ( PyCFunction ) Object_Select, METH_VARARGS, - "( 1 or 0 ) - Set the selected state of the object.\n\ - 1 is selected, 0 not selected "}, - {"setIpo", ( PyCFunction ) Object_SetIpo, METH_VARARGS, - "(Blender Ipo) - Sets the object's ipo"}, - {"clearIpo", ( PyCFunction ) Object_clearIpo, METH_NOARGS, - "() - Unlink ipo from this object"}, - - {"insertIpoKey", ( PyCFunction ) Object_insertIpoKey, METH_VARARGS, - "( Object IPO type ) - Inserts a key into IPO"}, - {"insertPoseKey", ( PyCFunction ) Object_insertPoseKey, METH_VARARGS, - "( Object Pose type ) - Inserts a key into Action"}, - {"insertCurrentPoseKey", ( PyCFunction ) Object_insertCurrentPoseKey, METH_VARARGS, - "( Object Pose type ) - Inserts a key into Action based on current pose"}, - {"setConstraintInfluenceForBone", ( PyCFunction ) Object_setConstraintInfluenceForBone, METH_VARARGS, - "( ) - sets a constraint influence for a certain bone in this (armature)object."}, - {"copyNLA", ( PyCFunction ) Object_copyNLA, METH_VARARGS, - "( ) - copies all NLA strips from another object to this object."}, - {"convertActionToStrip", ( PyCFunction ) Object_convertActionToStrip, METH_NOARGS, - "( ) - copies all NLA strips from another object to this object."}, - {"getAllProperties", ( PyCFunction ) Object_getAllProperties, METH_NOARGS, - "() - Get all the properties from this object"}, - {"addProperty", ( PyCFunction ) Object_addProperty, METH_VARARGS, - "() - Add a property to this object"}, - {"removeProperty", ( PyCFunction ) Object_removeProperty, METH_VARARGS, - "() - Remove a property from this object"}, - {"getProperty", ( PyCFunction ) Object_getProperty, METH_VARARGS, - "() - Get a property from this object by name"}, - {"removeAllProperties", ( PyCFunction ) Object_removeAllProperties, - METH_NOARGS, - "() - removeAll a properties from this object"}, - {"copyAllPropertiesTo", ( PyCFunction ) Object_copyAllPropertiesTo, - METH_VARARGS, - "() - copy all properties from this object to another object"}, - {"getScriptLinks", ( PyCFunction ) Object_getScriptLinks, METH_O, - "(eventname) - Get a list of this object's scriptlinks (Text names) " - "of the given type\n" - "(eventname) - string: FrameChanged, Redraw or Render."}, - {"addScriptLink", ( PyCFunction ) Object_addScriptLink, METH_VARARGS, - "(text, evt) - Add a new object scriptlink.\n" - "(text) - string: an existing Blender Text name;\n" - "(evt) string: FrameChanged, Redraw or Render."}, - {"clearScriptLinks", ( PyCFunction ) Object_clearScriptLinks, - METH_VARARGS, - "() - Delete all scriptlinks from this object.\n" - "([s1<,s2,s3...>]) - Delete specified scriptlinks from this object."}, - {"insertShapeKey", ( PyCFunction ) Object_insertShapeKey, METH_NOARGS, - "() - Insert a Shape Key in the current object"}, - {"__copy__", ( PyCFunction ) Object_copy, METH_NOARGS, - "() - Return a copy of this object."}, - {"copy", ( PyCFunction ) Object_copy, METH_NOARGS, - "() - Return a copy of this object."}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* PythonTypeObject callback function prototypes */ -/*****************************************************************************/ -static void Object_dealloc( BPy_Object * obj ); -static PyObject *Object_repr( BPy_Object * obj ); -static int Object_compare( BPy_Object * a, BPy_Object * b ); - -/*****************************************************************************/ -/* Function: M_Object_New */ -/* Python equivalent: Blender.Object.New */ -/*****************************************************************************/ - -/* - * Note: if this method is called without later linking object data to it, - * errors can be caused elsewhere in Blender. Future versions of the API - * will designate obdata as a parameter to this method to prevent this, and - * eventually this method will be deprecated. - * - * When we can guarantee that objects will always have valid obdata, - * unlink_object() should be edited to remove checks for NULL pointers and - * debugging messages. - */ - -PyObject *M_Object_New( PyObject * self_unused, PyObject * args ) -{ - struct Object *object; - int type; - char *str_type; - char *name = NULL; - PyObject *py_object; - BPy_Object *blen_object; - - if( !PyArg_ParseTuple( args, "s|s", &str_type, &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "string expected as argument" ); - - if( strcmp( str_type, "Armature" ) == 0 ) - type = OB_ARMATURE; - else if( strcmp( str_type, "Camera" ) == 0 ) - type = OB_CAMERA; - else if( strcmp( str_type, "Curve" ) == 0 ) - type = OB_CURVE; - else if (strcmp (str_type, "Text") == 0) - type = OB_FONT; - else if( strcmp( str_type, "Lamp" ) == 0 ) - type = OB_LAMP; - else if( strcmp( str_type, "Lattice" ) == 0 ) - type = OB_LATTICE; - else if( strcmp( str_type, "Mball" ) == 0 ) - type = OB_MBALL; - else if( strcmp( str_type, "Mesh" ) == 0 ) - type = OB_MESH; - else if( strcmp( str_type, "Surf" ) == 0 ) - type = OB_SURF; -/* else if (strcmp (str_type, "Wave") == 0) type = OB_WAVE; */ - else if( strcmp( str_type, "Empty" ) == 0 ) - type = OB_EMPTY; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "Unknown type specified" ); - - /* Create a new object. */ - if( name == NULL ) { - /* No name is specified, set the name to the type of the object. */ - name = str_type; - } - object = add_only_object(type, name); - - object->flag = 0; - object->lay = 1; /* Layer, by default visible*/ - object->data = NULL; - - /* user count is incremented in Object_CreatePyObject */ - object->id.us = 0; - - /* Create a Python object from it. */ - py_object = Object_CreatePyObject( object ); - blen_object = (BPy_Object *)py_object; - - /* store the real object type in the PyObject, treat this as an Empty - * until it has some obdata */ - blen_object->realtype = object->type; - object->type = OB_EMPTY; - - return py_object; -} - -/*****************************************************************************/ -/* Function: M_Object_Get */ -/* Python equivalent: Blender.Object.Get */ -/*****************************************************************************/ -PyObject *M_Object_Get( PyObject * self_unused, PyObject * args ) -{ - struct Object *object; - PyObject *blen_object; - char *name = NULL; - - PyArg_ParseTuple( args, "|s", &name ); - - if( name != NULL ) { - object = ( Object * ) GetIdFromList( &( G.main->object ), name ); - - /* No object exists with the name specified in the argument name. */ - if( !object ){ - char buffer[128]; - PyOS_snprintf( buffer, sizeof(buffer), - "object \"%s\" not found", name); - return EXPP_ReturnPyObjError( PyExc_ValueError, - buffer ); - } - - /* objects used in pydriver expressions need this */ - if (bpy_during_pydriver()) - bpy_pydriver_appendToList(object); - - return Object_CreatePyObject( object ); - } else { - /* No argument has been given. Return a list of all objects. */ - PyObject *obj_list; - Link *link; - int index; - - /* do not allow Get() (w/o arguments) inside pydriver, otherwise - * we'd have to update all objects in the DAG */ - if (bpy_during_pydriver()) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "Object.Get requires an argument when used in pydrivers" ); - - obj_list = PyList_New( BLI_countlist( &( G.main->object ) ) ); - - if( !obj_list ) - return EXPP_ReturnPyObjError( PyExc_SystemError, - "List creation failed." ); - - link = G.main->object.first; - index = 0; - while( link ) { - object = ( Object * ) link; - blen_object = Object_CreatePyObject( object ); - if( !blen_object ) { - Py_DECREF( obj_list ); - Py_RETURN_NONE; - } - PyList_SetItem( obj_list, index, blen_object ); - index++; - link = link->next; - } - return obj_list; - } -} - -/*****************************************************************************/ -/* Function: M_Object_GetSelected */ -/* Python equivalent: Blender.Object.GetSelected */ -/*****************************************************************************/ -static PyObject *M_Object_GetSelected( PyObject * self_unused ) -{ - PyObject *blen_object; - PyObject *list; - Base *base_iter; - - list = PyList_New( 0 ); - - if( G.vd == NULL ) { - /* No 3d view has been initialized yet, simply return an empty list */ - return list; - } - - if( ( G.scene->basact ) && - ( ( G.scene->basact->flag & SELECT ) && - ( G.scene->basact->lay & G.vd->lay ) ) ) { - - /* Active object is first in the list. */ - blen_object = Object_CreatePyObject( G.scene->basact->object ); - if( !blen_object ) { - Py_DECREF( list ); - Py_RETURN_NONE; - } - PyList_Append( list, blen_object ); - Py_DECREF( blen_object ); - } - - base_iter = G.scene->base.first; - while( base_iter ) { - if( ( ( base_iter->flag & SELECT ) && - ( base_iter->lay & G.vd->lay ) ) && - ( base_iter != G.scene->basact ) ) { - - blen_object = Object_CreatePyObject( base_iter->object ); - if( blen_object ) { - PyList_Append( list, blen_object ); - Py_DECREF( blen_object ); - } - } - base_iter = base_iter->next; - } - return list; -} - - -/*****************************************************************************/ -/* Function: M_Object_Duplicate */ -/* Python equivalent: Blender.Object.Duplicate */ -/*****************************************************************************/ -static PyObject *M_Object_Duplicate( PyObject * self_unused, - PyObject * args, PyObject *kwd ) -{ - int dupflag= 0; /* this a flag, passed to adduplicate() and used instead of U.dupflag sp python can set what is duplicated */ - - /* the following variables are bools, if set true they will modify the dupflag to pass to adduplicate() */ - int mesh_dupe = 0; - int surface_dupe = 0; - int curve_dupe = 0; - int text_dupe = 0; - int metaball_dupe = 0; - int armature_dupe = 0; - int lamp_dupe = 0; - int material_dupe = 0; - int texture_dupe = 0; - int ipo_dupe = 0; - - static char *kwlist[] = {"mesh", "surface", "curve", - "text", "metaball", "armature", "lamp", "material", "texture", "ipo", NULL}; - - /* duplicating in background causes segfaults */ - if( G.background == 1 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot duplicate objects in background mode" ); - - - if (!PyArg_ParseTupleAndKeywords(args, kwd, "|iiiiiiiiii", kwlist, - &mesh_dupe, &surface_dupe, &curve_dupe, &text_dupe, &metaball_dupe, - &armature_dupe, &lamp_dupe, &material_dupe, &texture_dupe, &ipo_dupe)) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or bool keywords 'mesh', 'surface', 'curve', 'text', 'metaball', 'armature', 'lamp' 'material', 'texture' and 'ipo' as arguments" ); - - /* USER_DUP_ACT for actions is not supported in the UI so dont support it here */ - if (mesh_dupe) dupflag |= USER_DUP_MESH; - if (surface_dupe) dupflag |= USER_DUP_SURF; - if (curve_dupe) dupflag |= USER_DUP_CURVE; - if (text_dupe) dupflag |= USER_DUP_FONT; - if (metaball_dupe) dupflag |= USER_DUP_MBALL; - if (armature_dupe) dupflag |= USER_DUP_ARM; - if (lamp_dupe) dupflag |= USER_DUP_LAMP; - if (material_dupe) dupflag |= USER_DUP_MAT; - if (texture_dupe) dupflag |= USER_DUP_TEX; - if (ipo_dupe) dupflag |= USER_DUP_IPO; - adduplicate(2, dupflag); /* 2 is a mode with no transform and no redraw, Duplicate the current selection, context sensitive */ - Py_RETURN_NONE; -} - - -/*****************************************************************************/ -/* Python BPy_Object methods: */ -/*****************************************************************************/ - -static PyObject *Object_buildParts( BPy_Object * self ) -{ - build_particle_system( self->object ); - Py_RETURN_NONE; -} - -static PyObject *Object_clearIpo( BPy_Object * self ) -{ - Object *ob = self->object; - Ipo *ipo = ( Ipo * ) ob->ipo; - - if( ipo ) { - ID *id = &ipo->id; - if( id->us > 0 ) - id->us--; - ob->ipo = NULL; - - Py_RETURN_TRUE; - } - - Py_RETURN_FALSE; /* no ipo found */ -} - -static PyObject *Object_clrParent( BPy_Object * self, PyObject * args ) -{ - int mode = 0; - int fast = 0; - - if( !PyArg_ParseTuple( args, "|ii", &mode, &fast ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or two optional integers as arguments" ); - - /* Remove the link only, the object is still in the scene. */ - self->object->parent = NULL; - - if( mode == 2 ) { - /* Keep transform */ - apply_obmat( self->object ); - } - - if( !fast ) - DAG_scene_sort( G.scene ); - - Py_RETURN_NONE; -} - -static PyObject *Object_clearTrack( BPy_Object * self, PyObject * args ) -{ - int mode = 0; - int fast = 0; - - if( !PyArg_ParseTuple( args, "|ii", &mode, &fast ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or two optional integers as arguments" ); - - /* Remove the link only, the object is still in the scene. */ - self->object->track = NULL; - - if( mode ) { - /* Keep transform */ - apply_obmat( self->object ); - } - - if( !fast ) - DAG_scene_sort( G.scene ); - - Py_RETURN_NONE; -} - -/* adds object data to a Blender object, if object->data = NULL */ -int EXPP_add_obdata( struct Object *object ) -{ - if( object->data != NULL ) - return -1; - - switch ( object->type ) { - case OB_ARMATURE: - /* TODO: Do we need to add something to G? (see the OB_LAMP case) */ - object->data = add_armature( "Armature" ); - break; - case OB_CAMERA: - /* TODO: Do we need to add something to G? (see the OB_LAMP case) */ - object->data = add_camera( "Camera" ); - break; - case OB_CURVE: - object->data = add_curve( "Curve", OB_CURVE ); - G.totcurve++; - break; - case OB_LAMP: - object->data = add_lamp( "Lamp" ); - G.totlamp++; - break; - case OB_MESH: - object->data = add_mesh( "Mesh" ); - G.totmesh++; - break; - case OB_LATTICE: - object->data = ( void * ) add_lattice( "Lattice" ); - object->dt = OB_WIRE; - break; - case OB_MBALL: - object->data = add_mball( "Meta" ); - break; - - /* TODO the following types will be supported later, - be sure to update Scene_link when new types are supported - case OB_SURF: - object->data = add_curve(OB_SURF); - G.totcurve++; - break; - case OB_FONT: - object->data = add_curve(OB_FONT); - break; - case OB_WAVE: - object->data = add_wave(); - break; - */ - default: - break; - } - - if( !object->data ) - return -1; - - return 0; -} - -static PyObject *Object_getDeltaLocation( BPy_Object * self ) -{ - return Py_BuildValue( "fff", self->object->dloc[0], - self->object->dloc[1], self->object->dloc[2] ); -} - -static PyObject *Object_getAction( BPy_Object * self ) -{ - if( self->object->action ) - return Action_CreatePyObject( self->object->action ); - Py_RETURN_NONE; -} - -static int Object_setAction( BPy_Object * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->object->action, 0, 1, ID_AC, 0); -} - -static PyObject *Object_evaluatePose(BPy_Object *self, PyObject *args) -{ - int frame = 1; - if( !PyArg_ParseTuple( args, "i", &frame ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ); - - frame = EXPP_ClampInt(frame, MINFRAME, MAXFRAME); - G.scene->r.cfra = frame; - do_all_pose_actions(self->object); - where_is_pose (self->object); - - Py_RETURN_NONE; -} - -static PyObject * Object_getPose(BPy_Object *self) -{ - /*if there is no pose will return PyNone*/ - return PyPose_FromPose(self->object->pose, self->object->id.name+2); -} - -static PyObject *Object_getSelected( BPy_Object * self ) -{ - Base *base; - - base = FIRSTBASE; - while( base ) { - if( base->object == self->object ) { - if( base->flag & SELECT ) { - Py_RETURN_TRUE; - } else { - Py_RETURN_FALSE; - } - } - base = base->next; - } - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "could not find object's selection state" ); -} - -static int Object_setSelect( BPy_Object * self, PyObject * value ) -{ - Base *base; - int param = PyObject_IsTrue( value ); - - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - base = FIRSTBASE; - while( base ) { - if( base->object == self->object ) { - if( param ) { - base->flag |= SELECT; - self->object->flag = (short)base->flag; - set_active_base( base ); - } else { - base->flag &= ~SELECT; - self->object->flag = (short)base->flag; - } - break; - } - base = base->next; - } - if (base) { /* was the object selected? */ - countall( ); - } - return 0; -} - -static PyObject *Object_GetEuler( BPy_Object * self, PyObject * args ) -{ - char *space = "localspace"; /* default to local */ - float eul[3]; - - if( !PyArg_ParseTuple( args, "|s", &space ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string or nothing" ); - - if( BLI_streq( space, "worldspace" ) ) { /* Worldspace matrix */ - float mat3[3][3]; - disable_where_script( 1 ); - where_is_object( self->object ); - Mat3CpyMat4(mat3, self->object->obmat); - Mat3ToEul(mat3, eul); - disable_where_script( 0 ); - } else if( BLI_streq( space, "localspace" ) ) { /* Localspace matrix */ - eul[0] = self->object->rot[0]; - eul[1] = self->object->rot[1]; - eul[2] = self->object->rot[2]; - } else { - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected either nothing, 'localspace' (default) or 'worldspace'" ); - } - - return ( PyObject * ) newEulerObject( eul, Py_NEW ); -} - -static PyObject *Object_getInverseMatrix( BPy_Object * self ) -{ - MatrixObject *inverse = - ( MatrixObject * ) newMatrixObject( NULL, 4, 4, Py_NEW ); - Mat4Invert( (float ( * )[4])*inverse->matrix, self->object->obmat ); - - return ( ( PyObject * ) inverse ); -} - -static PyObject *Object_getIpo( BPy_Object * self ) -{ - struct Ipo *ipo = self->object->ipo; - - if( ipo ) - return Ipo_CreatePyObject( ipo ); - Py_RETURN_NONE; -} - -static PyObject *Object_getLocation( BPy_Object * self, PyObject * args ) -{ - char *space = "localspace"; /* default to local */ - PyObject *attr; - if( !PyArg_ParseTuple( args, "|s", &space ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string or nothing" ); - - if( BLI_streq( space, "worldspace" ) ) { /* Worldspace matrix */ - disable_where_script( 1 ); - where_is_object( self->object ); - - attr = Py_BuildValue( "fff", - self->object->obmat[3][0], - self->object->obmat[3][1], - self->object->obmat[3][2] ); - - disable_where_script( 0 ); - } else if( BLI_streq( space, "localspace" ) ) { /* Localspace matrix */ - attr = Py_BuildValue( "fff", - self->object->loc[0], - self->object->loc[1], - self->object->loc[2] ); - } else { - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected either nothing, 'localspace' (default) or 'worldspace'" ); - } - - return attr; -} - -static PyObject *Object_getMaterials( BPy_Object * self, PyObject * args ) -{ - int all = 0; - - if( !PyArg_ParseTuple( args, "|i", &all ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an int or nothing" ); - - return EXPP_PyList_fromMaterialList( self->object->mat, - self->object->totcol, all ); -} - -static PyObject *Object_getParent( BPy_Object * self ) -{ - return Object_CreatePyObject( self->object->parent ); -} - -static PyObject *Object_getParentBoneName( BPy_Object * self ) -{ - if( self->object->parent && self->object->parent->type==OB_ARMATURE && self->object->parsubstr[0] != '\0' ) - return PyString_FromString( self->object->parsubstr ); - Py_RETURN_NONE; -} - -static int Object_setParentBoneName( BPy_Object * self, PyObject *value ) -{ - char *bonename; - - if (!PyString_Check(value)) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an int or nothing" ); - - if ( - self->object->parent && - self->object->parent->type == OB_ARMATURE && - self->object->partype == PARBONE - ) {/* its all good */} else - return EXPP_ReturnIntError( PyExc_RuntimeError, - "can only set the parent bone name for objects that already have a bone parent" ); - - bonename = PyString_AsString(value); - - if (!get_named_bone(self->object->parent->data, bonename)) - return EXPP_ReturnIntError( PyExc_ValueError, - "cannot parent to this bone: invalid bone name" ); - - strcpy(self->object->parsubstr, bonename); - DAG_scene_sort( G.scene ); - return 0; -} - -static PyObject *Object_getSize( BPy_Object * self, PyObject * args ) -{ - char *space = "localspace"; /* default to local */ - PyObject *attr; - if( !PyArg_ParseTuple( args, "|s", &space ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string or nothing" ); - - if( BLI_streq( space, "worldspace" ) ) { /* Worldspace matrix */ - float rot[3]; - float mat[3][3], imat[3][3], tmat[3][3]; - disable_where_script( 1 ); - where_is_object( self->object ); - - Mat3CpyMat4(mat, self->object->obmat); - - /* functionality copied from editobject.c apply_obmat */ - Mat3ToEul(mat, rot); - EulToMat3(rot, tmat); - Mat3Inv(imat, tmat); - Mat3MulMat3(tmat, imat, mat); - - attr = Py_BuildValue( "fff", - tmat[0][0], - tmat[1][1], - tmat[2][2] ); - disable_where_script( 0 ); - } else if( BLI_streq( space, "localspace" ) ) { /* Localspace matrix */ - attr = Py_BuildValue( "fff", - self->object->size[0], - self->object->size[1], - self->object->size[2] ); - } else { - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected either nothing, 'localspace' (default) or 'worldspace'" ); - } - return attr; -} - -static PyObject *Object_getTimeOffset( BPy_Object * self ) -{ - return PyFloat_FromDouble ( (double) self->object->sf ); -} - -static PyObject *Object_getTracked( BPy_Object * self ) -{ - return Object_CreatePyObject( self->object->track ); -} - -static PyObject *Object_getType( BPy_Object * self ) -{ - char *str; - int type = self->object->type; - - /* if object not yet linked to data, return the stored type */ - if( self->realtype != OB_EMPTY ) - type = self->realtype; - - switch ( type ) { - case OB_ARMATURE: - str = "Armature"; - break; - case OB_CAMERA: - str = "Camera"; - break; - case OB_CURVE: - str = "Curve"; - break; - case OB_EMPTY: - str = "Empty"; - break; - case OB_FONT: - str = "Text"; - break; - case OB_LAMP: - str = "Lamp"; - break; - case OB_LATTICE: - str = "Lattice"; - break; - case OB_MBALL: - str = "MBall"; - break; - case OB_MESH: - str = "Mesh"; - break; - case OB_SURF: - str = "Surf"; - break; - case OB_WAVE: - str = "Wave"; - break; - default: - str = "unknown"; - break; - } - - return PyString_FromString( str ); -} - -static PyObject *Object_getBoundBox( BPy_Object * self ) -{ - int i; - float *vec = NULL; - PyObject *vector, *bbox; - - if( !self->object->data ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "This object isn't linked to any object data (mesh, curve, etc) yet" ); - - if( !self->object->bb ) { /* if no ob bbox, we look in obdata */ - Mesh *me; - Curve *curve; - switch ( self->object->type ) { - case OB_MESH: - me = self->object->data; - vec = (float*) mesh_get_bb(self->object)->vec; - break; - case OB_CURVE: - case OB_FONT: - case OB_SURF: - curve = self->object->data; - if( !curve->bb ) - tex_space_curve( curve ); - vec = ( float * ) curve->bb->vec; - break; - default: - Py_RETURN_NONE; - } - - { /* transform our obdata bbox by the obmat. - the obmat is 4x4 homogeneous coords matrix. - each bbox coord is xyz, so we make it homogenous - by padding it with w=1.0 and doing the matrix mult. - afterwards we divide by w to get back to xyz. - */ - /* printmatrix4( "obmat", self->object->obmat); */ - - float tmpvec[4]; /* tmp vector for homogenous coords math */ - int i; - float *from; - - bbox = PyList_New( 8 ); - if( !bbox ) - return EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create pylist" ); - for( i = 0, from = vec; i < 8; i++, from += 3 ) { - memcpy( tmpvec, from, 3 * sizeof( float ) ); - tmpvec[3] = 1.0f; /* set w coord */ - Mat4MulVec4fl( self->object->obmat, tmpvec ); - /* divide x,y,z by w */ - tmpvec[0] /= tmpvec[3]; - tmpvec[1] /= tmpvec[3]; - tmpvec[2] /= tmpvec[3]; - -#if 0 - { /* debug print stuff */ - int i; - - printf( "\nobj bbox transformed\n" ); - for( i = 0; i < 4; ++i ) - printf( "%f ", tmpvec[i] ); - - printf( "\n" ); - } -#endif - - /* because our bounding box is calculated and - does not have its own memory, - we must create vectors that allocate space */ - - vector = newVectorObject( NULL, 3, Py_NEW); - memcpy( ( ( VectorObject * ) vector )->vec, - tmpvec, 3 * sizeof( float ) ); - PyList_SET_ITEM( bbox, i, vector ); - } - } - } else { /* the ob bbox exists */ - vec = ( float * ) self->object->bb->vec; - - if( !vec ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't retrieve bounding box data" ); - - bbox = PyList_New( 8 ); - - if( !bbox ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create pylist" ); - - /* create vectors referencing object bounding box coords */ - for( i = 0; i < 8; i++ ) { - vector = newVectorObject( vec, 3, Py_WRAP ); - PyList_SET_ITEM( bbox, i, vector ); - vec += 3; - } - } - - return bbox; -} - -static PyObject *Object_makeDisplayList( BPy_Object * self ) -{ - Object *ob = self->object; - - if( ob->type == OB_FONT ) { - Curve *cu = ob->data; - freedisplist( &cu->disp ); - text_to_curve( ob, 0 ); - } - - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - - Py_RETURN_NONE; -} - -static PyObject *Object_link( BPy_Object * self, PyObject * args ) -{ - PyObject *py_data; - ID *id; - ID *oldid; - int obj_id; - void *data = NULL; - int ok; - - if( !PyArg_ParseTuple( args, "O", &py_data ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an object as argument" ); - - if( BPy_Armature_Check( py_data ) ) - data = ( void * ) PyArmature_AsArmature((BPy_Armature*)py_data); - else if( BPy_Camera_Check( py_data ) ) - data = ( void * ) Camera_FromPyObject( py_data ); - else if( BPy_Lamp_Check( py_data ) ) - data = ( void * ) Lamp_FromPyObject( py_data ); - else if( BPy_Curve_Check( py_data ) ) - data = ( void * ) Curve_FromPyObject( py_data ); - else if( BPy_NMesh_Check( py_data ) ) { - data = ( void * ) NMesh_FromPyObject( py_data, self->object ); - if( !data ) /* NULL means there is already an error */ - return NULL; - } else if( BPy_Mesh_Check( py_data ) ) - data = ( void * ) Mesh_FromPyObject( py_data, self->object ); - else if( BPy_Lattice_Check( py_data ) ) - data = ( void * ) Lattice_FromPyObject( py_data ); - else if( BPy_Metaball_Check( py_data ) ) - data = ( void * ) Metaball_FromPyObject( py_data ); - else if( BPy_Text3d_Check( py_data ) ) - data = ( void * ) Text3d_FromPyObject( py_data ); - - /* have we set data to something good? */ - if( !data ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "link argument type is not supported " ); - - oldid = ( ID * ) self->object->data; - id = ( ID * ) data; - obj_id = MAKE_ID2( id->name[0], id->name[1] ); - - /* if the object object has not been linked to real data before, we - * can now let it assume its real type */ - if( self->realtype != OB_EMPTY ) { - self->object->type = self->realtype; - self->realtype = OB_EMPTY; - } - - ok = 1; - switch ( obj_id ) { - case ID_AR: - if( self->object->type != OB_ARMATURE ) { - ok = 0; - } - break; - case ID_CA: - if( self->object->type != OB_CAMERA ) { - ok = 0; - } - break; - case ID_LA: - if( self->object->type != OB_LAMP ) { - ok = 0; - } - break; - case ID_ME: - if( self->object->type != OB_MESH ) { - ok = 0; - } - break; - case ID_CU: - if( self->object->type != OB_CURVE && self->object->type != OB_FONT ) { - ok = 0; - } - break; - case ID_LT: - if( self->object->type != OB_LATTICE ) { - ok = 0; - } - break; - case ID_MB: - if( self->object->type != OB_MBALL ) { - ok = 0; - } - break; - default: - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "Linking this object type is not supported" ); - } - - if( !ok ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "The 'link' object is incompatible with the base object" ); - self->object->data = data; - - /* creates the curve for the text object */ - if (self->object->type == OB_FONT) - text_to_curve(self->object, 0); - - id_us_plus( id ); - if( oldid ) { - if( oldid->us > 0 ) { - oldid->us--; - } else { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "old object reference count below 0" ); - } - } - - /* make sure data and object materials are consistent */ - test_object_materials( id ); - - Py_RETURN_NONE; -} - -static PyObject *Object_makeParentVertex( BPy_Object * self, PyObject * args ) -{ - PyObject *list; - PyObject *vlist; - PyObject *py_child; - PyObject *ret_val; - Object *parent; - int noninverse = 0; - int fast = 0; - int partype; - int v1, v2=0, v3=0; - int i; - - /* Check if the arguments passed to makeParent are valid. */ - if( !PyArg_ParseTuple( args, "OO|ii", &list, &vlist, &noninverse, &fast ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects, a tuple of integers and one or two integers as arguments" ); - - if( !PySequence_Check( list ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects" ); - - if (!PyTuple_Check( vlist )) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a tuple of integers" ); - - switch( PyTuple_Size( vlist ) ) { - case 1: - if( !PyArg_ParseTuple( vlist, "i", &v1 ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a tuple of 1 or 3 integers" ); - - if ( v1 < 0 ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "indices must be strictly positive" ); - - partype = PARVERT1; - break; - case 3: - if( !PyArg_ParseTuple( vlist, "iii", &v1, &v2, &v3 ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a tuple of 1 or 3 integers" ); - - if ( v1 < 0 || v2 < 0 || v3 < 0) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "indices must be strictly positive" ); - partype = PARVERT3; - break; - default: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a tuple of 1 or 3 integers" ); - } - - parent = ( Object * ) self->object; - - if (!ELEM3(parent->type, OB_MESH, OB_CURVE, OB_SURF)) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Parent Vertex only applies to curve, mesh or surface objects" ); - - if (parent->id.us == 0) - return EXPP_ReturnPyObjError (PyExc_RuntimeError, - "object must be linked to a scene before it can become a parent"); - - /* Check if the PyObject passed in list is a Blender object. */ - for( i = 0; i < PySequence_Length( list ); i++ ) { - py_child = PySequence_GetItem( list, i ); - - ret_val = internal_makeParent(parent, py_child, partype, noninverse, fast, v1, v2, v3, NULL); - Py_DECREF (py_child); - - if (ret_val) - Py_DECREF(ret_val); - else { - if (!fast) /* need to sort when interrupting in the middle of the list */ - DAG_scene_sort( G.scene ); - return NULL; /* error has been set already */ - } - } - - if (!fast) /* otherwise, only sort at the end */ - DAG_scene_sort( G.scene ); - - Py_RETURN_NONE; -} - -static PyObject *Object_makeParentDeform( BPy_Object * self, PyObject * args ) -{ - PyObject *list; - PyObject *py_child; - PyObject *ret_val; - Object *parent; - int noninverse = 0; - int fast = 0; - int i; - - /* Check if the arguments passed to makeParent are valid. */ - if( !PyArg_ParseTuple( args, "O|ii", &list, &noninverse, &fast ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects and one or two integers as arguments" ); - - if( !PySequence_Check( list ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects" ); - - parent = ( Object * ) self->object; - - if (parent->type != OB_CURVE && parent->type != OB_ARMATURE) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Parent Deform only applies to curve or armature objects" ); - - if (parent->id.us == 0) - return EXPP_ReturnPyObjError (PyExc_RuntimeError, - "object must be linked to a scene before it can become a parent"); - - /* Check if the PyObject passed in list is a Blender object. */ - for( i = 0; i < PySequence_Length( list ); i++ ) { - py_child = PySequence_GetItem( list, i ); - - ret_val = internal_makeParent(parent, py_child, PARSKEL, noninverse, fast, 0, 0, 0, NULL); - Py_DECREF (py_child); - - if (ret_val) - Py_DECREF(ret_val); - else { - if (!fast) /* need to sort when interupting in the middle of the list */ - DAG_scene_sort( G.scene ); - return NULL; /* error has been set already */ - } - } - - if (!fast) /* otherwise, only sort at the end */ - DAG_scene_sort( G.scene ); - - Py_RETURN_NONE; -} - - -static PyObject *Object_makeParentBone( BPy_Object * self, PyObject * args ) -{ - char *bonename; - PyObject *list; - PyObject *py_child; - PyObject *ret_val; - Object *parent; - int noninverse = 0; - int fast = 0; - int i; - - /* Check if the arguments passed to makeParent are valid. */ - if( !PyArg_ParseTuple( args, "Os|ii", &list, &bonename, &noninverse, &fast ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects, bonename and optionally two integers as arguments" ); - - parent = ( Object * ) self->object; - - if (parent->type != OB_ARMATURE) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Parent Bone only applies to armature objects" ); - - if (parent->id.us == 0) - return EXPP_ReturnPyObjError (PyExc_RuntimeError, - "object must be linked to a scene before it can become a parent"); - - if (!parent->data) - return EXPP_ReturnPyObjError (PyExc_RuntimeError, - "object must be linked to armature data"); - - if (!get_named_bone(parent->data, bonename)) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Parent Bone Name is not in the armature" ); - - /* Check if the PyObject passed in list is a Blender object. */ - for( i = 0; i < PySequence_Length( list ); i++ ) { - py_child = PySequence_GetItem( list, i ); - - ret_val = internal_makeParent(parent, py_child, PARBONE, noninverse, fast, 0, 0, 0, bonename); - Py_DECREF (py_child); - - if (ret_val) - Py_DECREF(ret_val); - else { - if (!fast) /* need to sort when interupting in the middle of the list */ - DAG_scene_sort( G.scene ); - return NULL; /* error has been set already */ - } - } - - if (!fast) /* otherwise, only sort at the end */ - DAG_scene_sort( G.scene ); - - Py_RETURN_NONE; -} - - -static PyObject *Object_makeParent( BPy_Object * self, PyObject * args ) -{ - PyObject *list; - PyObject *py_child; - PyObject *ret_val; - Object *parent; - int noninverse = 0; - int fast = 0; - int i; - - /* Check if the arguments passed to makeParent are valid. */ - if( !PyArg_ParseTuple( args, "O|ii", &list, &noninverse, &fast ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects and one or two integers as arguments" ); - - if( !PySequence_Check( list ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects" ); - - parent = ( Object * ) self->object; - - if (parent->id.us == 0) - return EXPP_ReturnPyObjError (PyExc_RuntimeError, - "object must be linked to a scene before it can become a parent"); - - /* Check if the PyObject passed in list is a Blender object. */ - for( i = 0; i < PySequence_Length( list ); i++ ) { - py_child = PySequence_GetItem( list, i ); - - ret_val = internal_makeParent(parent, py_child, PAROBJECT, noninverse, fast, 0, 0, 0, NULL); - Py_DECREF (py_child); - - if (ret_val) - Py_DECREF(ret_val); - else { - if (!fast) /* need to sort when interupting in the middle of the list */ - DAG_scene_sort( G.scene ); - return NULL; /* error has been set already */ - } - } - - if (!fast) /* otherwise, only sort at the end */ - DAG_scene_sort( G.scene ); - - Py_RETURN_NONE; -} - -static PyObject *Object_join( BPy_Object * self, PyObject * args ) -{ - PyObject *list; - PyObject *py_child; - Object *parent; - Object *child; - Scene *temp_scene; - Scene *orig_scene; - Base *temp_base; - short type; - int i, ok=0, ret_value=0, list_length=0; - - /* joining in background causes segfaults */ - if( G.background == 1 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot join objects in background mode" ); - - /* Check if the arguments passed to makeParent are valid. */ - if( !PyArg_ParseTuple( args, "O", &list ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects" ); - - if( !PySequence_Check( list ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects" ); - - list_length = PySequence_Length( list ); /* if there are no objects to join then exit silently */ - - if( !list_length ) { - Py_RETURN_NONE; - } - - parent = ( Object * ) self->object; - type = parent->type; - - /* Only these object types are sypported */ - if( type!=OB_MESH && type!=OB_CURVE && type!=OB_SURF && type!=OB_ARMATURE ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Base object is not a type Blender can join" ); - - if( !object_in_scene( parent, G.scene ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object must be in the current scene" ); - - /* exit editmode so join can be done */ - if( G.obedit ) - exit_editmode( EM_FREEDATA ); - - temp_scene = add_scene( "Scene" ); /* make the new scene */ - temp_scene->lay= 1; /* first layer on */ - - /* TODO: use EXPP_check_sequence_consistency here */ - - /* Check if the PyObject passed in list is a Blender object. */ - for( i = 0; i < list_length; i++ ) { - py_child = PySequence_GetItem( list, i ); - if( !BPy_Object_Check( py_child ) ) { - /* Cleanup */ - free_libblock( &G.main->scene, temp_scene ); - Py_DECREF( py_child ); - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list of objects, one or more of the list items is not a Blender Object." ); - } else { - /* List item is an object, is it the same type? */ - child = ( Object * ) Object_FromPyObject( py_child ); - Py_DECREF( py_child ); - if( parent->type == child->type ) { - if( !object_in_scene( child, G.scene ) ) { - free_libblock( &G.main->scene, temp_scene ); - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object must be in the current scene" ); - } - - ok =1; - /* Add a new base, then link the base to the temp_scene */ - temp_base = MEM_callocN( sizeof( Base ), "pynewbase" ); - /* we know these types are the same, link to the temp scene - * for joining */ - temp_base->object = child; /* link object to the new base */ - temp_base->flag |= SELECT; - temp_base->lay = 1; /*1 layer on */ - - BLI_addhead( &temp_scene->base, temp_base ); /* finally, link new base to scene */ - child->id.us += 1; /*Would usually increase user count but in this case it's ok not to */ - - /*DAG_object_flush_update(temp_scene, temp_base->object, OB_RECALC_DATA);*/ - } - } - } - - orig_scene = G.scene; /* backup our scene */ - - /* Add the main object into the temp_scene */ - temp_base = MEM_callocN( sizeof( Base ), "pynewbase" ); - temp_base->object = parent; /* link object to the new base */ - temp_base->flag |= SELECT; - temp_base->lay = 1; /*1 layer on */ - BLI_addhead( &temp_scene->base, temp_base ); /* finally, link new base to scene */ - parent->id.us += 1; - - /* all objects in the scene, set it active and the active object */ - set_scene( temp_scene ); - set_active_base( temp_base ); - - /* Do the joining now we know everythings OK. */ - if(type == OB_MESH) - ret_value = join_mesh(); - else if(type == OB_CURVE) - ret_value = join_curve(OB_CURVE); - else if(type == OB_SURF) - ret_value = join_curve(OB_SURF); - else if(type == OB_ARMATURE) - ret_value = join_armature(); - - /* May use this for correcting object user counts later on */ - /* - if (!ret_value) { - temp_base = temp_scene->base.first; - while( base ) { - object = base->object; - object->id.us +=1 - base = base->next; - } - }*/ - - /* remove old scene */ - set_scene( orig_scene ); - free_libblock( &G.main->scene, temp_scene ); - - /* no objects were of the correct type, return None */ - if (!ok) { - Py_RETURN_NONE; - } - - /* If the join failed then raise an error */ - if (!ret_value) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, -"Blender failed to join the objects, this is not a script error.\n\ -Please add exception handling to your script with a RuntimeError exception\n\ -letting the user know that their data could not be joined." ) ); - - Py_RETURN_NONE; -} - -static PyObject *internal_makeParent(Object *parent, PyObject *py_child, - int partype, /* parenting type */ - int noninverse, int fast, /* parenting arguments */ - int v1, int v2, int v3, /* for vertex parent */ - char *bonename) /* for bone parents - assume the name is already checked to be a valid bone name*/ -{ - Object *child = NULL; - - if( BPy_Object_Check( py_child ) ) - child = ( Object * ) Object_FromPyObject( py_child ); - - if( child == NULL ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Object Type expected" ); - - if( test_parent_loop( parent, child ) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "parenting loop detected - parenting failed" ); - - if (partype == PARSKEL && child->type != OB_MESH) - child->partype = PAROBJECT; - else - child->partype = (short)partype; - - if (partype == PARVERT3) { - child->par1 = v1; - child->par2 = v2; - child->par3 = v3; - } - else if (partype == PARVERT1) { - child->par1 = v1; - } else if (partype == PARBONE) { - strcpy( child->parsubstr, bonename ); - } - - - - child->parent = parent; - /* py_obj_child = (BPy_Object *) py_child; */ - if( noninverse == 1 ) { - Mat4One(child->parentinv); - /* Parent inverse = unity */ - child->loc[0] = 0.0; - child->loc[1] = 0.0; - child->loc[2] = 0.0; - } else { - what_does_parent( child ); - Mat4Invert( child->parentinv, workob.obmat ); - clear_workob(); - } - - if( !fast ) - child->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_materialUsage( void ) -{ - return EXPP_ReturnPyObjError( PyExc_NotImplementedError, - "materialUsage: not yet implemented" ); -} - -static PyObject *Object_setDeltaLocation( BPy_Object * self, PyObject * args ) -{ - float dloc1; - float dloc2; - float dloc3; - int status; - - if( PyObject_Length( args ) == 3 ) - status = PyArg_ParseTuple( args, "fff", &dloc1, &dloc2, - &dloc3 ); - else - status = PyArg_ParseTuple( args, "(fff)", &dloc1, &dloc2, - &dloc3 ); - - if( !status ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected sequence argument of 3 floats" ); - - self->object->dloc[0] = dloc1; - self->object->dloc[1] = dloc2; - self->object->dloc[2] = dloc3; - - /* since we have messed with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -#define DTX_MASK ( OB_AXIS | OB_TEXSPACE | OB_DRAWNAME | \ - OB_DRAWIMAGE | OB_DRAWWIRE | OB_DRAWXRAY | OB_DRAWTRANSP ) - -static PyObject *Object_getDrawMode( BPy_Object * self ) -{ - return PyInt_FromLong( (long)(self->object->dtx & DTX_MASK) ); -} - -static int Object_setDrawMode( BPy_Object * self, PyObject * args ) -{ - PyObject* integer = PyNumber_Int( args ); - int value; - - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - value = ( int )PyInt_AS_LONG( integer ); - Py_DECREF( integer ); - if( value & ~DTX_MASK ) - return EXPP_ReturnIntError( PyExc_ValueError, - "undefined bit(s) set in bitfield" ); - - self->object->dtx = value; - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -static PyObject *Object_getDrawType( BPy_Object * self ) -{ - return PyInt_FromLong( (long)self->object->dt ); -} - -static int Object_setDrawType( BPy_Object * self, PyObject * value ) -{ - /* since we mess with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - - return EXPP_setIValueRange( value, &self->object->dt, - OB_BOUNDBOX, OB_TEXTURE, 'b' ); -} - -static int Object_setEuler( BPy_Object * self, PyObject * args ) -{ - float rot1, rot2, rot3; - int status = 0; /* failure */ - - if( PyTuple_Check( args ) && PyTuple_Size( args ) == 1 ) - args = PyTuple_GET_ITEM( args, 0 ); - - if( EulerObject_Check( args ) ) { - rot1 = ( ( EulerObject * ) args )->eul[0]; - rot2 = ( ( EulerObject * ) args )->eul[1]; - rot3 = ( ( EulerObject * ) args )->eul[2]; - status = 1; - } else if( PySequence_Check( args ) && PySequence_Size( args ) == 3 ) { - if( PyList_Check( args ) ) - args = PySequence_Tuple( args ); - else - Py_INCREF( args ); - status = PyArg_ParseTuple( args, "fff", &rot1, &rot2, &rot3 ); - Py_DECREF( args ); - } - - if( !status ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected euler or sequence of 3 floats" ); - - self->object->rot[0] = rot1; - self->object->rot[1] = rot2; - self->object->rot[2] = rot3; - - /* since we have messed with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -static int Object_setMatrix( BPy_Object * self, MatrixObject * mat ) -#if 0 -{ - int x, y; - - if( !MatrixObject_Check( mat ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected matrix object as argument" ); - - if( mat->rowSize == 4 && mat->colSize == 4 ) { - for( x = 0; x < 4; x++ ) { - for( y = 0; y < 4; y++ ) { - self->object->obmat[x][y] = mat->matrix[x][y]; - } - } - } else if( mat->rowSize == 3 && mat->colSize == 3 ) { - for( x = 0; x < 3; x++ ) { - for( y = 0; y < 3; y++ ) { - self->object->obmat[x][y] = mat->matrix[x][y]; - } - } - /* if a 3x3 matrix, clear the fourth row/column */ - for( x = 0; x < 3; x++ ) - self->object->obmat[x][3] = self->object->obmat[3][x] = 0.0; - self->object->obmat[3][3] = 1.0; - } else - return EXPP_ReturnIntError( PyExc_ValueError, - "expected 3x3 or 4x4 matrix" ); - - apply_obmat( self->object ); - - /* since we have messed with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - - return 0; -} -#endif -{ - int x, y; - float matrix[4][4]; /* for the result */ - float invmat[4][4]; /* for the result */ - - if( !MatrixObject_Check( mat ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected matrix object as argument" ); - - if( mat->rowSize == 4 && mat->colSize == 4 ) { - for( x = 0; x < 4; x++ ) { - for( y = 0; y < 4; y++ ) { - matrix[x][y] = mat->matrix[x][y]; - } - } - } else if( mat->rowSize == 3 && mat->colSize == 3 ) { - for( x = 0; x < 3; x++ ) { - for( y = 0; y < 3; y++ ) { - matrix[x][y] = mat->matrix[x][y]; - } - } - /* if a 3x3 matrix, clear the fourth row/column */ - for( x = 0; x < 3; x++ ) - matrix[x][3] = matrix[3][x] = 0.0; - matrix[3][3] = 1.0; - } else - return EXPP_ReturnIntError( PyExc_ValueError, - "expected 3x3 or 4x4 matrix" ); - - /* localspace matrix is truly relative to the parent, but parameters - * stored in object are relative to parentinv matrix. Undo the parent - * inverse part before updating obmat and calling apply_obmat() */ - if( self->object->parent ) { - Mat4Invert( invmat, self->object->parentinv ); - Mat4MulMat4( self->object->obmat, matrix, invmat ); - } else - Mat4CpyMat4( self->object->obmat, matrix ); - - apply_obmat( self->object ); - - /* since we have messed with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - - -/* - * Object_insertIpoKey() - * inserts Object IPO key for LOC, ROT, SIZE, LOCROT, LOCROTSIZE, or LAYER - * Note it also inserts actions! - */ - -static PyObject *Object_insertIpoKey( BPy_Object * self, PyObject * args ) -{ - Object *ob= self->object; - int key = 0; - char *actname= NULL; - - if( !PyArg_ParseTuple( args, "i", &key ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ); - - if(ob->ipoflag & OB_ACTION_OB) - actname= "Object"; - - if (key == IPOKEY_LOC || key == IPOKEY_LOCROT || key == IPOKEY_LOCROTSIZE){ - insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_X, 0); - insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Y, 0); - insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Z, 0); - } - if (key == IPOKEY_ROT || key == IPOKEY_LOCROT || key == IPOKEY_LOCROTSIZE){ - insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_X, 0); - insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Y, 0); - insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Z, 0); - } - if (key == IPOKEY_SIZE || key == IPOKEY_LOCROTSIZE ){ - insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_X, 0); - insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Y, 0); - insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Z, 0); - } - if (key == IPOKEY_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); - } else if (key == IPOKEY_PI_FALLOFF ){ - insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FFALL, 0); - } else if (key == IPOKEY_PI_SURFACEDAMP ){ - insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_SDAMP, 0); - } else if (key == IPOKEY_PI_RANDOMDAMP ){ - insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_RDAMP, 0); - } else if (key == IPOKEY_PI_PERM ){ - insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_PERM, 0); - } - - allspace(REMAKEIPO, 0); - EXPP_allqueue(REDRAWIPO, 0); - EXPP_allqueue(REDRAWVIEW3D, 0); - EXPP_allqueue(REDRAWACTION, 0); - EXPP_allqueue(REDRAWNLA, 0); - - Py_RETURN_NONE; -} - -/* - * Object_insertPoseKey() - * inserts a Action Pose key from a given pose (sourceaction, frame) to the - * active action to a given framenum - */ - -static PyObject *Object_insertPoseKey( BPy_Object * self, PyObject * args ) -{ - Object *ob= self->object; - BPy_Action *sourceact; - char *chanName; - int actframe; - - - /* for doing the time trick, similar to editaction bake_action_with_client() */ - int oldframe; - int curframe; - - if( !PyArg_ParseTuple( args, "O!sii", &Action_Type, &sourceact, - &chanName, &actframe, &curframe ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expects an action to copy poses from, a string for chan/bone name, an int argument for frame to extract from the action and finally another int for the frame where to put the new key in the active object.action" ); - - extract_pose_from_action(ob->pose, sourceact->action, (float)actframe); - - oldframe = G.scene->r.cfra; - G.scene->r.cfra = curframe; - - /* XXX: must check chanName actually exists, otherwise segfaults! */ - //achan = get_action_channel(sourceact->action, chanName); - - insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_X, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Y, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Z, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_X, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Y, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Z, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_W, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_X, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Y, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Z, 0); - - G.scene->r.cfra = oldframe; - - allspace(REMAKEIPO, 0); - EXPP_allqueue(REDRAWIPO, 0); - EXPP_allqueue(REDRAWVIEW3D, 0); - EXPP_allqueue(REDRAWACTION, 0); - EXPP_allqueue(REDRAWNLA, 0); - - /* restore, but now with the new action in place */ - /*extract_pose_from_action(ob->pose, ob->action, G.scene->r.cfra); - where_is_pose(ob);*/ - - EXPP_allqueue(REDRAWACTION, 1); - - Py_RETURN_NONE; -} - -static PyObject *Object_insertCurrentPoseKey( BPy_Object * self, PyObject * args ) -{ - Object *ob= self->object; - char *chanName; - - /* for doing the time trick, similar to editaction bake_action_with_client() */ - int oldframe; - int curframe; - - if( !PyArg_ParseTuple( args, "si", &chanName, &curframe ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected chan/bone name, and a time (int) argument" ); - - oldframe = G.scene->r.cfra; - G.scene->r.cfra = curframe; - - /* XXX: must check chanName actually exists, otherwise segfaults! */ - - insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_X, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Y, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Z, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_X, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Y, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Z, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_W, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_X, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Y, 0); - insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Z, 0); - - G.scene->r.cfra = oldframe; - - allspace(REMAKEIPO, 0); - EXPP_allqueue(REDRAWIPO, 0); - EXPP_allqueue(REDRAWVIEW3D, 0); - EXPP_allqueue(REDRAWACTION, 0); - EXPP_allqueue(REDRAWNLA, 0); - - /* restore */ - extract_pose_from_action(ob->pose, ob->action, (float)G.scene->r.cfra); - where_is_pose(ob); - - EXPP_allqueue(REDRAWACTION, 1); - - Py_RETURN_NONE; -} - -static PyObject *Object_setConstraintInfluenceForBone( BPy_Object * self, - PyObject * args ) -{ - char *boneName, *constName; - float influence; - IpoCurve *icu; - - if( !PyArg_ParseTuple( args, "ssf", &boneName, &constName, &influence ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expects bonename, constraintname, influenceval" ); - - icu = verify_ipocurve((ID *)self->object, ID_CO, boneName, constName, NULL, - CO_ENFORCE); - - if (!icu) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot get a curve from this IPO, may be using libdata" ); - - insert_vert_icu(icu, (float)CFRA, influence, 0); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_copyNLA( BPy_Object * self, PyObject * args ) { - BPy_Object *bpy_fromob; - - if( !PyArg_ParseTuple( args, "O", &bpy_fromob ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "requires a Blender Object to copy NLA strips from." ); - copy_nlastrips(&self->object->nlastrips, &bpy_fromob->object->nlastrips); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -/*Now that BPY has a Strip type, return the created strip.*/ -static PyObject *Object_convertActionToStrip( BPy_Object * self ) -{ - bActionStrip *strip = convert_action_to_strip( self->object ); - return ActionStrip_CreatePyObject( strip ); -} - -static PyObject *Object_setLocation( BPy_Object * self, PyObject * args ) -{ - float loc1; - float loc2; - float loc3; - int status; - - if( PyObject_Length( args ) == 3 ) - status = PyArg_ParseTuple( args, "fff", &loc1, &loc2, &loc3 ); - else - status = PyArg_ParseTuple( args, "(fff)", &loc1, &loc2, - &loc3 ); - - if( !status ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected list argument of 3 floats" ); - - self->object->loc[0] = loc1; - self->object->loc[1] = loc2; - self->object->loc[2] = loc3; - - /* since we have messed with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - DAG_object_flush_update(G.scene, self->object, OB_RECALC_DATA); - - Py_RETURN_NONE; -} - -static PyObject *Object_setMaterials( BPy_Object * self, PyObject * args ) -{ - PyObject *list; - int len; - int i; - Material **matlist = NULL; - - if (!self->object->data) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "object must be linked to object data (e.g. to a mesh) first" ); - - if( !PyArg_ParseTuple( args, "O!", &PyList_Type, &list ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a list (of materials or None) as argument" ); - - len = PyList_Size(list); - - /* Object_getMaterials can return '[]' (zero-length list), so that must - * also be accepted by this method for - * ob2.setMaterials(ob1.getMaterials()) to always work. - * In other words, list can be '[]' and so len can be zero. */ - if (len > 0) { - if( len > MAXMAT ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "list must have from 1 up to 16 materials" ); - - matlist = EXPP_newMaterialList_fromPyList( list ); - if( !matlist ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "material list must be a list of valid materials!" ); - } - - if( self->object->mat ) - EXPP_releaseMaterialList( self->object->mat, self->object->totcol ); - - /* Increase the user count on all materials */ - for( i = 0; i < len; i++ ) { - if( matlist[i] ) - id_us_plus( ( ID * ) matlist[i] ); - } - self->object->mat = matlist; - self->object->totcol = (char)len; - self->object->actcol = (char)len; - - switch ( self->object->type ) { - case OB_CURVE: /* fall through */ - case OB_FONT: /* fall through */ - case OB_MESH: /* fall through */ - case OB_MBALL: /* fall through */ - case OB_SURF: - EXPP_synchronizeMaterialLists( self->object ); - break; - default: - break; - } - - /* since we have messed with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_setSize( BPy_Object * self, PyObject * args ) -{ - float sizex; - float sizey; - float sizez; - int status; - - if( PyObject_Length( args ) == 3 ) - status = PyArg_ParseTuple( args, "fff", &sizex, &sizey, - &sizez ); - else - status = PyArg_ParseTuple( args, "(fff)", &sizex, &sizey, - &sizez ); - - if( !status ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected list argument of 3 floats" ); - - self->object->size[0] = sizex; - self->object->size[1] = sizey; - self->object->size[2] = sizez; - - /* since we have messed with object, we need to flag for DAG recalc */ - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_makeTrack( BPy_Object * self, PyObject * args ) -{ - BPy_Object *tracked = NULL; - Object *ob = self->object; - int fast = 0; - - if( !PyArg_ParseTuple( args, "O!|i", &Object_Type, &tracked, &fast ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an object and optionally also an int as arguments." ); - - ob->track = tracked->object; - - if( !fast ) - DAG_scene_sort( G.scene ); - - Py_RETURN_NONE; -} - -static PyObject *Object_shareFrom( BPy_Object * self, PyObject * args ) -{ - BPy_Object *object; - ID *id; - ID *oldid; - - if( !PyArg_ParseTuple( args, "O!", &Object_Type, &object ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an object argument" ); - - if( !object->object->data ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Object argument has no data linked yet or is an empty" ); - - if( self->object->type != object->object->type && - self->realtype != object->object->type) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "objects are not of same data type" ); - - switch ( object->object->type ) { - case OB_MESH: - case OB_LAMP: - case OB_CAMERA: /* we can probably add the other types, too */ - case OB_ARMATURE: - case OB_CURVE: - case OB_SURF: - case OB_LATTICE: - - /* if this object had no data, we need to enable the realtype */ - if (self->object->type == OB_EMPTY) { - self->object->type= self->realtype; - self->realtype = OB_EMPTY; - } - - oldid = ( ID * ) self->object->data; - id = ( ID * ) object->object->data; - self->object->data = object->object->data; - - if( self->object->type == OB_MESH && id ) { - self->object->totcol = 0; - EXPP_synchronizeMaterialLists( self->object ); - } - - id_us_plus( id ); - if( oldid ) { - if( oldid->us > 0 ) { - oldid->us--; - } else { - return EXPP_ReturnPyObjError ( PyExc_RuntimeError, - "old object reference count below 0" ); - } - } - - Py_RETURN_NONE; - default: - return EXPP_ReturnPyObjError( PyExc_ValueError, - "object type not supported" ); - } -} - -static PyObject *Object_getAllProperties( BPy_Object * self ) -{ - PyObject *prop_list, *pyval; - bProperty *prop = NULL; - - prop_list = PyList_New( 0 ); - - prop = self->object->prop.first; - while( prop ) { - pyval = Property_CreatePyObject( prop ); - PyList_Append( prop_list, pyval ); - Py_DECREF(pyval); - prop = prop->next; - } - return prop_list; -} - -static PyObject *Object_getProperty( BPy_Object * self, PyObject * args ) -{ - char *prop_name = NULL; - bProperty *prop = NULL; - - if( !PyArg_ParseTuple( args, "s", &prop_name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string" ); - - prop = get_property( self->object, prop_name ); - if( prop ) - return Property_CreatePyObject( prop ); - - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't find the property" ); -} - -static PyObject *Object_addProperty( BPy_Object * self, PyObject * args ) -{ - bProperty *prop = NULL; - char *prop_name = NULL; - PyObject *prop_data = Py_None; - char *prop_type = NULL; - short type = -1; - BPy_Property *py_prop = NULL; - int argslen = PyObject_Length( args ); - - if( argslen == 3 || argslen == 2 ) { - if( !PyArg_ParseTuple( args, "sO|s", &prop_name, &prop_data, - &prop_type ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expecting string, data, and optional string" ); - } - } else if( argslen == 1 ) { - if( !PyArg_ParseTuple( args, "O!", &property_Type, &py_prop ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expecting a Property" ); - - if( py_prop->property != NULL ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "Property is already added to an object" ); - } else { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1,2 or 3 arguments" ); - } - - /*parse property type*/ - if( !py_prop ) { - if( prop_type ) { - if( BLI_streq( prop_type, "BOOL" ) ) - type = PROP_BOOL; - else if( BLI_streq( prop_type, "INT" ) ) - type = PROP_INT; - else if( BLI_streq( prop_type, "FLOAT" ) ) - type = PROP_FLOAT; - else if( BLI_streq( prop_type, "TIME" ) ) - type = PROP_TIME; - else if( BLI_streq( prop_type, "STRING" ) ) - type = PROP_STRING; - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "BOOL, INT, FLOAT, TIME or STRING expected" ); - } else { - /*use the default*/ - if( PyInt_Check( prop_data ) ) - type = PROP_INT; - else if( PyFloat_Check( prop_data ) ) - type = PROP_FLOAT; - else if( PyString_Check( prop_data ) ) - type = PROP_STRING; - } - } else { - type = py_prop->type; - } - - /*initialize a new bProperty of the specified type*/ - prop = new_property( type ); - - /*parse data*/ - if( !py_prop ) { - BLI_strncpy( prop->name, prop_name, 32 ); - if( PyInt_Check( prop_data ) ) { - *( ( int * ) &prop->data ) = - ( int ) PyInt_AsLong( prop_data ); - } else if( PyFloat_Check( prop_data ) ) { - *( ( float * ) &prop->data ) = - ( float ) PyFloat_AsDouble( prop_data ); - } else if( PyString_Check( prop_data ) ) { - BLI_strncpy( prop->poin, - PyString_AsString( prop_data ), - MAX_PROPSTRING ); - } - } else { - py_prop->property = prop; - - /* this should never be able to happen is we just assigned a valid - * proper to py_prop->property */ - - if( !updateProperyData( py_prop ) ) { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Could not update property data" ); - } - } - - /*add to property listbase for the object*/ - BLI_addtail( &self->object->prop, prop ); - - Py_RETURN_NONE; -} - -static PyObject *Object_removeProperty( BPy_Object * self, PyObject * args ) -{ - char *prop_name = NULL; - BPy_Property *py_prop = NULL; - bProperty *prop = NULL; - - /* we accept either a property stringname or actual object */ - if( PyTuple_Size( args ) == 1 ) { - PyObject *prop = PyTuple_GET_ITEM( args, 0 ); - if( BPy_Property_Check( prop ) ) - py_prop = (BPy_Property *)prop; - else - prop_name = PyString_AsString( prop ); - } - if( !py_prop && !prop_name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a Property or a string" ); - - /*remove the link, free the data, and update the py struct*/ - if( py_prop ) { - BLI_remlink( &self->object->prop, py_prop->property ); - if( updatePyProperty( py_prop ) ) { - free_property( py_prop->property ); - py_prop->property = NULL; - } - } else { - prop = get_property( self->object, prop_name ); - if( prop ) { - BLI_remlink( &self->object->prop, prop ); - free_property( prop ); - } - } - Py_RETURN_NONE; -} - -static PyObject *Object_removeAllProperties( BPy_Object * self ) -{ - free_properties( &self->object->prop ); - Py_RETURN_NONE; -} - -static PyObject *Object_copyAllPropertiesTo( BPy_Object * self, - PyObject * args ) -{ - PyObject *dest; - bProperty *prop = NULL; - bProperty *propn = NULL; - - if( !PyArg_ParseTuple( args, "O!", &Object_Type, &dest ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an Object" ); - - /*make a copy of all its properties*/ - prop = self->object->prop.first; - while( prop ) { - propn = copy_property( prop ); - BLI_addtail( &( ( BPy_Object * ) dest )->object->prop, propn ); - prop = prop->next; - } - - Py_RETURN_NONE; -} - -static PyObject *Object_addScriptLink( BPy_Object * self, PyObject * args ) -{ - Object *obj = self->object; - ScriptLink *slink = &obj->scriptlink; - return EXPP_addScriptLink( slink, args, 0 ); -} - -static PyObject *Object_clearScriptLinks( BPy_Object * self, PyObject * args ) -{ - Object *obj = self->object; - ScriptLink *slink = &obj->scriptlink; - return EXPP_clearScriptLinks( slink, args ); -} - -static PyObject *Object_getScriptLinks( BPy_Object * self, PyObject * value ) -{ - Object *obj = self->object; - ScriptLink *slink = &obj->scriptlink; - return EXPP_getScriptLinks( slink, value, 0 ); -} - -static PyObject *Object_getNLAflagBits ( BPy_Object * self ) -{ - if (self->object->nlaflag & OB_NLA_OVERRIDE) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int Object_setNLAflagBits ( BPy_Object * self, PyObject * value ) -{ - int param; - - param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if (param) - self->object->nlaflag |= OB_NLA_OVERRIDE; - else - self->object->nlaflag &= ~OB_NLA_OVERRIDE; - - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -static PyObject *Object_getDupliObjects( BPy_Object * self ) -{ - Object *ob= self->object; - - 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) { - PyObject *list; - DupliObject *dupob; - int index; - ListBase *duplilist = object_duplilist(G.scene, ob); - - list = PyList_New( BLI_countlist(duplilist) ); - if( !list ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - for(dupob= duplilist->first, index=0; dupob; dupob= dupob->next, index++) { - PyObject *pair; - pair = PyTuple_New( 2 ); - - PyTuple_SET_ITEM( pair, 0, Object_CreatePyObject(dupob->ob) ); - PyTuple_SET_ITEM( pair, 1, newMatrixObject((float*)dupob->mat,4,4,Py_NEW) ); - PyList_SET_ITEM( list, index, pair); - } - free_object_duplilist(duplilist); - return list; - } - } - return PyList_New( 0 ); -} - -static PyObject *Object_getDupliGroup( BPy_Object * self ) -{ - Object *ob= self->object; - - if( ob->dup_group ) - return Group_CreatePyObject( ob->dup_group ); - - Py_RETURN_NONE; -} - -static int Object_setDupliGroup( BPy_Object * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->object->dup_group, 0, 1, ID_GR, 0); -} - -static PyObject *Object_getEffects( BPy_Object * self ) -{ - PyObject *effect_list, *pyval; - Effect *eff; - - effect_list = PyList_New( 0 ); - if( !effect_list ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "PyList_New() failed" ); - - eff = self->object->effect.first; - - while( eff ) { - pyval = EffectCreatePyObject( eff, self->object ); - PyList_Append( effect_list, pyval ); - Py_DECREF(pyval); - eff = eff->next; - } - return effect_list; -} - -static PyObject *Object_getActionStrips( BPy_Object * self ) -{ - return ActionStrips_CreatePyObject( self->object ); -} - -static PyObject *Object_getConstraints( BPy_Object * self ) -{ - return ObConstraintSeq_CreatePyObject( self->object ); -} - -static PyObject *Object_getModifiers( BPy_Object * self ) -{ - return ModSeq_CreatePyObject( self->object, NULL ); -} - -static int Object_setModifiers( BPy_Object * self, PyObject * value ) -{ - BPy_ModSeq *pymodseq; - ModifierData *md; - - if (!BPy_ModSeq_Check(value)) - return EXPP_ReturnIntError( PyExc_TypeError, - "can only assign another objects modifiers" ); - - pymodseq = ( BPy_ModSeq * ) value; - - if (self->object->type != pymodseq->object->type) - return EXPP_ReturnIntError( PyExc_TypeError, - "can only assign modifiers between objects of the same type" ); - - if (self->object == pymodseq->object) - return 0; - - object_free_modifiers(self->object); - for (md=pymodseq->object->modifiers.first; md; md=md->next) { - if (md->type!=eModifierType_Hook) { - ModifierData *nmd = modifier_new(md->type); - modifier_copyData(md, nmd); - BLI_addtail(&self->object->modifiers, nmd); - } - } - - DAG_object_flush_update(G.scene, self->object, OB_RECALC_DATA); - return 0; -} - -static PyObject *Object_insertShapeKey(BPy_Object * self) -{ - insert_shapekey(self->object); - Py_RETURN_NONE; -} - -/* __copy__() */ -static PyObject *Object_copy(BPy_Object * self) -{ - /* copy_object never returns NULL */ - struct Object *object= copy_object( self->object ); - object->id.us= 0; /*is 1 by default, not sure why */ - - /* Create a Python object from it. */ - return Object_CreatePyObject( object ); -} - -/*****************************************************************************/ -/* Function: Object_CreatePyObject */ -/* Description: This function will create a new BlenObject from an existing */ -/* Object structure. */ -/*****************************************************************************/ -PyObject *Object_CreatePyObject( struct Object * obj ) -{ - BPy_Object *blen_object; - - if( !obj ) Py_RETURN_NONE; - - blen_object = - ( BPy_Object * ) PyObject_NEW( BPy_Object, &Object_Type ); - - if( blen_object == NULL ) { - return ( NULL ); - } - blen_object->object = obj; - blen_object->realtype = OB_EMPTY; - obj->id.us++; - return ( ( PyObject * ) blen_object ); -} - -/*****************************************************************************/ -/* Function: Object_FromPyObject */ -/* Description: This function returns the Blender object from the given */ -/* PyObject. */ -/*****************************************************************************/ -struct Object *Object_FromPyObject( PyObject * py_obj ) -{ - BPy_Object *blen_obj; - - blen_obj = ( BPy_Object * ) py_obj; - return ( blen_obj->object ); -} - -/*****************************************************************************/ -/* Function: Object_dealloc */ -/* Description: This is a callback function for the BlenObject type. It is */ -/* the destructor function. */ -/*****************************************************************************/ -static void Object_dealloc( BPy_Object * self ) -{ - if( self->realtype != OB_EMPTY ) - free_libblock_us( &G.main->object, self->object ); - else - self->object->id.us--; - -#if 0 /* this will adjust the ID and if zero delete the object */ - free_libblock_us( &G.main->object, self->object ); -#endif - PyObject_DEL( self ); -} - -/*****************************************************************************/ -/* Function: Object_compare */ -/* Description: This is a callback function for the BPy_Object type. It */ -/* compares two Object_Type objects. Only the "==" and "!=" */ -/* comparisons are meaninful. Returns 0 for equality and -1 if */ -/* they don't point to the same Blender Object struct. */ -/* In Python it becomes 1 if they are equal, 0 otherwise. */ -/*****************************************************************************/ -static int Object_compare( BPy_Object * a, BPy_Object * b ) -{ - return ( a->object == b->object ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Object_repr */ -/* Description: This is a callback function for the BPy_Object type. It */ -/* builds a meaninful string to represent object objects. */ -/*****************************************************************************/ -static PyObject *Object_repr( BPy_Object * self ) -{ - return PyString_FromFormat( "[Object \"%s\"]", - self->object->id.name + 2 ); -} - -/* Particle Deflection functions */ - -static PyObject *Object_getPIDeflection( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyBool_FromLong( ( long ) self->object->pd->deflect ); -} - -static int Object_setPIDeflection( BPy_Object * self, PyObject * value ) -{ - int param; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected true/false argument" ); - - self->object->pd->deflect = (short)param; - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -static PyObject *Object_getPIType( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyInt_FromLong( ( long )self->object->pd->forcefield ); -} - -static int Object_setPIType( BPy_Object * self, PyObject * value ) -{ - int status; - int oldforcefield; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - oldforcefield = self->object->pd->forcefield; - status = EXPP_setIValueRange( value, &self->object->pd->forcefield, - PFIELD_FORCE, PFIELD_GUIDE, 'h' ); - - /* - * if value was set successfully but is PFIELD_MAGNET, restore the old - * value and throw exception - */ - if( !status ) { - if ( self->object->pd->forcefield == PFIELD_MAGNET ) { - self->object->pd->forcefield = oldforcefield; - return EXPP_ReturnIntError( PyExc_ValueError, - "PFIELD_MAGNET not supported" ); - } - self->object->recalc |= OB_RECALC_OB; - } - return status; -} - -static PyObject *Object_getPIUseMaxDist( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyBool_FromLong( ( long )self->object->pd->flag ); -} - -static int Object_setPIUseMaxDist( BPy_Object * self, PyObject * value ) -{ - int param; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected true/false argument" ); - - self->object->pd->flag = (short)param; - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -/* RIGIDBODY FUNCTIONS */ - -static PyObject *Object_getRBMass( BPy_Object * self ) -{ - return PyFloat_FromDouble( (double)self->object->mass ); -} - -static int Object_setRBMass( BPy_Object * self, PyObject * args ) -{ - float value; - PyObject* flt = PyNumber_Float( args ); - - if( !flt ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - value = (float)PyFloat_AS_DOUBLE( flt ); - Py_DECREF( flt ); - - if( value < 0.0f ) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are non-negative, 0.0 or more" ); - - self->object->mass = value; - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -/* this is too low level, possible to add helper methods */ - -#define GAMEFLAG_MASK ( OB_DYNAMIC | OB_CHILD | OB_ACTOR | OB_DO_FH | \ - OB_ROT_FH | OB_ANISOTROPIC_FRICTION | OB_GHOST | OB_RIGID_BODY | \ - OB_BOUNDS | OB_COLLISION_RESPONSE | OB_SECTOR | OB_PROP | \ - OB_MAINACTOR ) - -static PyObject *Object_getRBFlags( BPy_Object * self ) -{ - return PyInt_FromLong( (long)( self->object->gameflag & GAMEFLAG_MASK ) ); -} - -static int Object_setRBFlags( BPy_Object * self, PyObject * args ) -{ - PyObject* integer = PyNumber_Int( args ); - int value; - - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - value = ( int )PyInt_AS_LONG( integer ); - Py_DECREF( integer ); - if( value & ~GAMEFLAG_MASK ) - return EXPP_ReturnIntError( PyExc_ValueError, - "undefined bit(s) set in bitfield" ); - - self->object->gameflag = value; - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -static PyObject *Object_getRBShapeBoundType( BPy_Object * self ) -{ - return PyInt_FromLong( (long)self->object->boundtype ); -} - -static int Object_setRBShapeBoundType( BPy_Object * self, PyObject * args ) -{ - self->object->recalc |= OB_RECALC_OB; - return EXPP_setIValueRange( args, &self->object->boundtype, - 0, OB_BOUND_DYN_MESH, 'h' ); -} - -/* SOFTBODY FUNCTIONS */ - -PyObject *Object_isSB(BPy_Object *self) -{ - if( self->object->soft ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static PyObject *Object_getSBUseGoal( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( self->object->softflag & OB_SB_GOAL ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int Object_setSBUseGoal( BPy_Object * self, PyObject * value ) -{ - int setting = PyObject_IsTrue( value ); - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( setting == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected true/false argument" ); - - if( setting ) - self->object->softflag |= OB_SB_GOAL; - else - self->object->softflag &= ~OB_SB_GOAL; - - self->object->recalc |= OB_RECALC_OB; - return 0; -} - -static PyObject *Object_getSBUseEdges( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( self->object->softflag & OB_SB_EDGES ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int Object_setSBUseEdges( BPy_Object * self, PyObject * value ) -{ - int setting = PyObject_IsTrue( value ); - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( setting == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected true/false argument" ); - - if( setting ) - self->object->softflag |= OB_SB_EDGES; - else - self->object->softflag &= ~OB_SB_EDGES; - - self->object->recalc |= OB_RECALC_OB; - return 0; -} - -static PyObject *Object_getSBStiffQuads( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( self->object->softflag & OB_SB_QUADS ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int Object_setSBStiffQuads( BPy_Object * self, PyObject * value ) -{ - int setting = PyObject_IsTrue( value ); - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( setting == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected true/false argument" ); - - if( setting ) - self->object->softflag |= OB_SB_QUADS; - else - self->object->softflag &= ~OB_SB_QUADS; - - self->object->recalc |= OB_RECALC_OB; - return 0; -} - -static int setupSB( Object* ob ) -{ - ob->soft= sbNew(); - ob->softflag |= OB_SB_GOAL|OB_SB_EDGES; - - if( !ob->soft ) - return 0; - /* all this is initialized in sbNew() */ -#if 0 - ob->soft->mediafrict = 0.5f; - ob->soft->nodemass = 1.0f; - ob->soft->grav = 0.0f; - ob->soft->rklimit = 0.1f; - - ob->soft->goalspring = 0.5f; - ob->soft->goalfrict = 0.0f; - ob->soft->mingoal = 0.0f; - ob->soft->maxgoal = 1.0f; - ob->soft->defgoal = 0.7f; - - ob->soft->inspring = 0.5f; - ob->soft->infrict = 0.5f; -#endif - return 1; -} - -static int setupPI( Object* ob ) -{ - if( ob->pd==NULL ) { - ob->pd= MEM_callocN(sizeof(PartDeflect), "PartDeflect"); - /* and if needed, init here */ - } - - if( !ob->pd ) - return 0; - - ob->pd->deflect =0; - ob->pd->forcefield =0; - ob->pd->flag =0; - ob->pd->pdef_damp =0; - ob->pd->pdef_rdamp =0; - ob->pd->pdef_perm =0; - ob->pd->f_strength =0; - ob->pd->f_power =0; - ob->pd->maxdist =0; - return 1; -} - -/* - * scan list of Objects looking for matching obdata. - * if found, set OB_RECALC_DATA flag. - * call this from a bpy type update() method. - */ - -void Object_updateDag( void *data ) -{ - Object *ob; - - if( !data ) - return; - - for( ob = G.main->object.first; ob; ob= ob->id.next ){ - if( ob->data == data ) { - ob->recalc |= OB_RECALC_DATA; - } - } -} - -/* - * utilities routines for handling generic getters and setters - */ - -/* - * get integer attributes - */ - -static PyObject *getIntAttr( BPy_Object *self, void *type ) -{ - int param; - struct Object *object = self->object; - - switch( (int)type ) { - case EXPP_OBJ_ATTR_LAYERMASK: - param = object->lay; - break; - case EXPP_OBJ_ATTR_COLBITS: - param = object->colbits; - if( param < 0 ) param += 65536; - break; - case EXPP_OBJ_ATTR_DRAWMODE: - param = object->dtx; - break; - case EXPP_OBJ_ATTR_DRAWTYPE: - param = object->dt; - break; - case EXPP_OBJ_ATTR_PARENT_TYPE: - param = object->partype; - break; - case EXPP_OBJ_ATTR_DUPON: - param = object->dupon; - break; - case EXPP_OBJ_ATTR_DUPOFF: - param = object->dupoff; - break; - case EXPP_OBJ_ATTR_DUPSTA: - param = object->dupsta; - break; - case EXPP_OBJ_ATTR_DUPEND: - param = object->dupend; - break; - case EXPP_OBJ_ATTR_PASSINDEX: - param = object->index; - break; - case EXPP_OBJ_ATTR_ACT_MATERIAL: - param = object->actcol; - break; - case EXPP_OBJ_ATTR_ACT_SHAPE: - param = object->shapenr; - break; - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "undefined type in getIntAttr" ); - } - - return PyInt_FromLong( param ); -} - -/* - * set integer attributes which require clamping - */ - -static int setIntAttrClamp( BPy_Object *self, PyObject *value, void *type ) -{ - void *param; - struct Object *object = self->object; - int min, max, size; - - switch( (int)type ) { - case EXPP_OBJ_ATTR_DUPON: - min = 1; - max = 1500; - size = 'H'; /* in case max is later made > 32767 */ - param = (void *)&object->dupon; - break; - case EXPP_OBJ_ATTR_DUPOFF: - min = 0; - max = 1500; - size = 'H'; /* in case max is later made > 32767 */ - param = (void *)&object->dupoff; - break; - case EXPP_OBJ_ATTR_DUPSTA: - min = 1; - max = 32767; - size = 'H'; /* in case max is later made > 32767 */ - param = (void *)&object->dupsta; - break; - case EXPP_OBJ_ATTR_DUPEND: - min = 1; - max = 32767; - size = 'H'; /* in case max is later made > 32767 */ - param = (void *)&object->dupend; - break; - case EXPP_OBJ_ATTR_PASSINDEX: - min = 0; - max = 1000; - size = 'H'; /* in case max is later made > 32767 */ - param = (void *)&object->index; - break; - case EXPP_OBJ_ATTR_ACT_MATERIAL: - min = 1; - max = object->totcol; - size = 'b'; /* in case max is later made > 128 */ - param = (void *)&object->actcol; - break; - case EXPP_OBJ_ATTR_ACT_SHAPE: - { - Key *key= ob_get_key(object); - KeyBlock *kb; - min = 1; - max = 0; - if (key) { - max= 1; - for (kb = key->block.first; kb; kb=kb->next, max++); - } - size = 'h'; /* in case max is later made > 128 */ - param = (void *)&object->shapenr; - break; - } - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setIntAttrClamp"); - } - - self->object->recalc |= OB_RECALC_OB; - return EXPP_setIValueClamped( value, param, min, max, size ); -} - -/* - * set integer attributes which require range checking - */ - -static int setIntAttrRange( BPy_Object *self, PyObject *value, void *type ) -{ - void *param; - struct Object *object = self->object; - int min, max, size; - - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - /* these parameters require clamping */ - - switch( (int)type ) { - case EXPP_OBJ_ATTR_COLBITS: - min = 0; - max = 0xffff; - size = 'H'; - param = (void *)&object->colbits; - break; - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setIntAttrRange" ); - } - - self->object->recalc |= OB_RECALC_OB; - return EXPP_setIValueRange( value, param, min, max, size ); -} - -/* - * get floating point attributes - */ - -static PyObject *getFloatAttr( BPy_Object *self, void *type ) -{ - float param; - struct Object *object = self->object; - - if( (int)type >= EXPP_OBJ_ATTR_PI_SURFACEDAMP && - (int)type <= EXPP_OBJ_ATTR_PI_SBOFACETHICK ) { - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - } - else if( (int)type >= EXPP_OBJ_ATTR_SB_NODEMASS && - (int)type <= EXPP_OBJ_ATTR_SB_INFRICT ) { - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - } - - switch( (int)type ) { - case EXPP_OBJ_ATTR_LOC_X: - param = object->loc[0]; - break; - case EXPP_OBJ_ATTR_LOC_Y: - param = object->loc[1]; - break; - case EXPP_OBJ_ATTR_LOC_Z: - param = object->loc[2]; - break; - case EXPP_OBJ_ATTR_DLOC_X: - param = object->dloc[0]; - break; - case EXPP_OBJ_ATTR_DLOC_Y: - param = object->dloc[1]; - break; - case EXPP_OBJ_ATTR_DLOC_Z: - param = object->dloc[2]; - break; - case EXPP_OBJ_ATTR_ROT_X: - param = object->rot[0]; - break; - case EXPP_OBJ_ATTR_ROT_Y: - param = object->rot[1]; - break; - case EXPP_OBJ_ATTR_ROT_Z: - param = object->rot[2]; - break; - case EXPP_OBJ_ATTR_DROT_X: - param = object->drot[0]; - break; - case EXPP_OBJ_ATTR_DROT_Y: - param = object->drot[1]; - break; - case EXPP_OBJ_ATTR_DROT_Z: - param = object->drot[2]; - break; - case EXPP_OBJ_ATTR_SIZE_X: - param = object->size[0]; - break; - case EXPP_OBJ_ATTR_SIZE_Y: - param = object->size[1]; - break; - case EXPP_OBJ_ATTR_SIZE_Z: - param = object->size[2]; - break; - case EXPP_OBJ_ATTR_DSIZE_X: - param = object->dsize[0]; - break; - case EXPP_OBJ_ATTR_DSIZE_Y: - param = object->dsize[1]; - break; - case EXPP_OBJ_ATTR_DSIZE_Z: - param = object->dsize[2]; - break; - case EXPP_OBJ_ATTR_TIMEOFFSET: - param = object->sf; - break; - case EXPP_OBJ_ATTR_DRAWSIZE: - param = object->empty_drawsize; - break; - case EXPP_OBJ_ATTR_PI_SURFACEDAMP: - param = object->pd->pdef_perm; - break; - case EXPP_OBJ_ATTR_PI_RANDOMDAMP: - param = object->pd->pdef_rdamp; - break; - case EXPP_OBJ_ATTR_PI_PERM: - param = object->pd->pdef_perm; - break; - case EXPP_OBJ_ATTR_PI_STRENGTH: - param = object->pd->f_strength; - break; - case EXPP_OBJ_ATTR_PI_FALLOFF: - param = object->pd->f_power; - break; - case EXPP_OBJ_ATTR_PI_MAXDIST: - param = object->pd->maxdist; - break; - case EXPP_OBJ_ATTR_PI_SBDAMP: - param = object->pd->pdef_sbdamp; - break; - case EXPP_OBJ_ATTR_PI_SBIFACETHICK: - param = object->pd->pdef_sbift; - break; - case EXPP_OBJ_ATTR_PI_SBOFACETHICK: - param = object->pd->pdef_sboft; - break; - case EXPP_OBJ_ATTR_SB_NODEMASS: - param = self->object->soft->nodemass; - break; - case EXPP_OBJ_ATTR_SB_GRAV: - param = self->object->soft->grav; - break; - case EXPP_OBJ_ATTR_SB_MEDIAFRICT: - param = self->object->soft->mediafrict; - break; - case EXPP_OBJ_ATTR_SB_RKLIMIT: - param = object->soft->rklimit; - break; - case EXPP_OBJ_ATTR_SB_PHYSICSSPEED: - param = object->soft->physics_speed; - break; - case EXPP_OBJ_ATTR_SB_GOALSPRING: - param = object->soft->goalspring; - break; - case EXPP_OBJ_ATTR_SB_GOALFRICT: - param = object->soft->goalfrict; - break; - case EXPP_OBJ_ATTR_SB_MINGOAL: - param = object->soft->mingoal; - break; - case EXPP_OBJ_ATTR_SB_MAXGOAL: - param = object->soft->maxgoal; - break; - case EXPP_OBJ_ATTR_SB_DEFGOAL: - param = object->soft->defgoal; - break; - case EXPP_OBJ_ATTR_SB_INSPRING: - param = object->soft->inspring; - break; - 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" ); - } - - return PyFloat_FromDouble( param ); -} - -/* - * set floating point attributes which require clamping - */ - -static int setFloatAttrClamp( BPy_Object *self, PyObject *value, void *type ) -{ - float *param; - struct Object *object = self->object; - float min, max; - - if( (int)type >= EXPP_OBJ_ATTR_PI_SURFACEDAMP && - (int)type <= EXPP_OBJ_ATTR_PI_SBOFACETHICK ) { - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - } - else if( (int)type >= EXPP_OBJ_ATTR_SB_NODEMASS && - (int)type <= EXPP_OBJ_ATTR_SB_INFRICT ) { - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "softbody could not be accessed" ); - } - - switch( (int)type ) { - case EXPP_OBJ_ATTR_DRAWSIZE: - min = EXPP_OBJECT_DRAWSIZEMIN; - max = EXPP_OBJECT_DRAWSIZEMAX; - param = &object->empty_drawsize; - break; - case EXPP_OBJ_ATTR_TIMEOFFSET: - min = -MAXFRAMEF; - max = MAXFRAMEF; - param = &object->sf; - break; - case EXPP_OBJ_ATTR_PI_SURFACEDAMP: - min = EXPP_OBJECT_PIDAMP_MIN; - max = EXPP_OBJECT_PIDAMP_MAX; - param = &object->pd->pdef_perm; - break; - case EXPP_OBJ_ATTR_PI_RANDOMDAMP: - min = EXPP_OBJECT_PIRDAMP_MIN; - max = EXPP_OBJECT_PIRDAMP_MAX; - param = &object->pd->pdef_rdamp; - break; - case EXPP_OBJ_ATTR_PI_PERM: - min = EXPP_OBJECT_PIPERM_MIN; - max = EXPP_OBJECT_PIPERM_MAX; - param = &object->pd->pdef_perm; - break; - case EXPP_OBJ_ATTR_PI_STRENGTH: - min = EXPP_OBJECT_PISTRENGTH_MIN; - max = EXPP_OBJECT_PISTRENGTH_MAX; - param = &object->pd->f_strength; - break; - case EXPP_OBJ_ATTR_PI_FALLOFF: - min = EXPP_OBJECT_PIPOWER_MIN; - max = EXPP_OBJECT_PIPOWER_MAX; - param = &object->pd->f_power; - break; - case EXPP_OBJ_ATTR_PI_MAXDIST: - min = EXPP_OBJECT_PIMAXDIST_MIN; - max = EXPP_OBJECT_PIMAXDIST_MAX; - param = &object->pd->maxdist; - break; - case EXPP_OBJ_ATTR_PI_SBDAMP: - min = EXPP_OBJECT_PISBDAMP_MIN; - max = EXPP_OBJECT_PISBDAMP_MAX; - param = &object->pd->pdef_sbdamp; - break; - case EXPP_OBJ_ATTR_PI_SBIFACETHICK: - min = EXPP_OBJECT_PISBIFTMIN; - max = EXPP_OBJECT_PISBIFTMAX; - param = &object->pd->pdef_sbift; - break; - case EXPP_OBJ_ATTR_PI_SBOFACETHICK: - min = EXPP_OBJECT_PISBOFTMIN; - max = EXPP_OBJECT_PISBOFTMAX; - param = &object->pd->pdef_sboft; - break; - case EXPP_OBJ_ATTR_SB_NODEMASS: - min = EXPP_OBJECT_SBNODEMASSMIN; - max = EXPP_OBJECT_SBNODEMASSMAX; - param = &self->object->soft->nodemass; - break; - case EXPP_OBJ_ATTR_SB_GRAV: - min = EXPP_OBJECT_SBGRAVMIN; - max = EXPP_OBJECT_SBGRAVMAX; - param = &self->object->soft->grav; - break; - case EXPP_OBJ_ATTR_SB_MEDIAFRICT: - min = EXPP_OBJECT_SBMEDIAFRICTMIN; - max = EXPP_OBJECT_SBMEDIAFRICTMAX; - param = &self->object->soft->mediafrict; - break; - case EXPP_OBJ_ATTR_SB_RKLIMIT: - min = EXPP_OBJECT_SBRKLIMITMIN; - max = EXPP_OBJECT_SBRKLIMITMAX; - param = &self->object->soft->rklimit; - break; - case EXPP_OBJ_ATTR_SB_PHYSICSSPEED: - min = EXPP_OBJECT_SBPHYSICSSPEEDMIN; - max = EXPP_OBJECT_SBPHYSICSSPEEDMAX; - param = &self->object->soft->physics_speed; - break; - case EXPP_OBJ_ATTR_SB_GOALSPRING: - min = EXPP_OBJECT_SBGOALSPRINGMIN; - max = EXPP_OBJECT_SBGOALSPRINGMAX; - param = &self->object->soft->goalspring; - break; - case EXPP_OBJ_ATTR_SB_GOALFRICT: - min = EXPP_OBJECT_SBGOALFRICTMIN; - max = EXPP_OBJECT_SBGOALFRICTMAX; - param = &self->object->soft->goalfrict; - break; - case EXPP_OBJ_ATTR_SB_MINGOAL: - min = EXPP_OBJECT_SBMINGOALMIN; - max = EXPP_OBJECT_SBMINGOALMAX; - param = &self->object->soft->mingoal; - break; - case EXPP_OBJ_ATTR_SB_MAXGOAL: - min = EXPP_OBJECT_SBMAXGOALMIN; - max = EXPP_OBJECT_SBMAXGOALMAX; - param = &self->object->soft->maxgoal; - break; - case EXPP_OBJ_ATTR_SB_DEFGOAL: - min = EXPP_OBJECT_SBDEFGOALMIN; - max = EXPP_OBJECT_SBDEFGOALMAX; - param = &self->object->soft->defgoal; - break; - case EXPP_OBJ_ATTR_SB_INSPRING: - min = EXPP_OBJECT_SBINSPRINGMIN; - max = EXPP_OBJECT_SBINSPRINGMAX; - param = &self->object->soft->inspring; - break; - case EXPP_OBJ_ATTR_SB_INFRICT: - min = EXPP_OBJECT_SBINFRICTMIN; - 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" ); - } - - self->object->recalc |= OB_RECALC_OB; - return EXPP_setFloatClamped( value, param, min, max ); -} - -/* - * set floating point attributes - */ - -static int setFloatAttr( BPy_Object *self, PyObject *value, void *type ) -{ - float param; - struct Object *object = self->object; - - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - - param = (float)PyFloat_AsDouble( value ); - - switch( (int)type ) { - case EXPP_OBJ_ATTR_LOC_X: - object->loc[0] = param; - break; - case EXPP_OBJ_ATTR_LOC_Y: - object->loc[1] = param; - break; - case EXPP_OBJ_ATTR_LOC_Z: - object->loc[2] = param; - break; - case EXPP_OBJ_ATTR_DLOC_X: - object->dloc[0] = param; - break; - case EXPP_OBJ_ATTR_DLOC_Y: - object->dloc[1] = param; - break; - case EXPP_OBJ_ATTR_DLOC_Z: - object->dloc[2] = param; - break; - case EXPP_OBJ_ATTR_ROT_X: - object->rot[0] = param; - break; - case EXPP_OBJ_ATTR_ROT_Y: - object->rot[1] = param; - break; - case EXPP_OBJ_ATTR_ROT_Z: - object->rot[2] = param; - break; - case EXPP_OBJ_ATTR_DROT_X: - object->drot[0] = param; - break; - case EXPP_OBJ_ATTR_DROT_Y: - object->drot[1] = param; - break; - case EXPP_OBJ_ATTR_DROT_Z: - object->drot[2] = param; - break; - case EXPP_OBJ_ATTR_SIZE_X: - object->size[0] = param; - break; - case EXPP_OBJ_ATTR_SIZE_Y: - object->size[1] = param; - break; - case EXPP_OBJ_ATTR_SIZE_Z: - object->size[2] = param; - break; - case EXPP_OBJ_ATTR_DSIZE_X: - object->dsize[0] = param; - break; - case EXPP_OBJ_ATTR_DSIZE_Y: - object->dsize[1] = param; - break; - case EXPP_OBJ_ATTR_DSIZE_Z: - object->dsize[2] = param; - break; - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setFloatAttr " ); - } - self->object->recalc |= OB_RECALC_OB; - return 0; -} - -/* - * get 3-tuple floating point attributes - */ - -static PyObject *getFloat3Attr( BPy_Object *self, void *type ) -{ - float *param; - struct Object *object = self->object; - - switch( (int)type ) { - case EXPP_OBJ_ATTR_LOC: - param = object->loc; - break; - case EXPP_OBJ_ATTR_DLOC: - param = object->dloc; - break; - case EXPP_OBJ_ATTR_DROT: - param = object->drot; - break; - case EXPP_OBJ_ATTR_SIZE: - param = object->size; - break; - case EXPP_OBJ_ATTR_DSIZE: - param = object->dsize; - break; - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "undefined type in getFloat3Attr" ); - } - - return Py_BuildValue( "(fff)", param[0], param[1], param[2] ); -} - -/* - * set 3-tuple floating point attributes - */ - -static int setFloat3Attr( BPy_Object *self, PyObject *value, void *type ) -{ - int i; - float *dst, param[3]; - struct Object *object = self->object; - - value = PySequence_Tuple( value ); - - if( !value || !PyArg_ParseTuple( value, "fff", ¶m[0], ¶m[1], ¶m[2] ) ) { - Py_XDECREF( value ); - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list or tuple of 3 floats" ); - } - - Py_DECREF( value ); - switch( (int)type ) { - case EXPP_OBJ_ATTR_LOC: - dst = object->loc; - break; - case EXPP_OBJ_ATTR_DLOC: - dst = object->dloc; - break; - case EXPP_OBJ_ATTR_DROT: - dst = object->drot; - break; - case EXPP_OBJ_ATTR_SIZE: - dst = object->size; - break; - case EXPP_OBJ_ATTR_DSIZE: - dst = object->dsize; - break; - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setFloat3Attr" ); - } - - for( i = 0; i < 3; ++i ) - dst[i] = param[i]; - - self->object->recalc |= OB_RECALC_OB; - return 0; -} - -/*****************************************************************************/ -/* BPy_Object methods and attribute handlers */ -/*****************************************************************************/ - -static PyObject *Object_getShapeFlag( BPy_Object *self, void *type ) -{ - if (self->object->shapeflag & (int)type) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int Object_setShapeFlag( BPy_Object *self, PyObject *value, - void *type ) -{ - if (PyObject_IsTrue(value) ) - self->object->shapeflag |= (int)type; - else - self->object->shapeflag &= ~(int)type; - - self->object->recalc |= OB_RECALC_OB; - return 0; -} - -static PyObject *Object_getRestricted( BPy_Object *self, void *type ) -{ - if (self->object->restrictflag & (int)type) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int Object_setRestricted( BPy_Object *self, PyObject *value, - void *type ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if ( param ) - self->object->restrictflag |= (int)type; - else - self->object->restrictflag &= ~(int)type; - - return 0; -} - -static PyObject *Object_getDrawModeBits( BPy_Object *self, void *type ) -{ - return EXPP_getBitfield( (void *)&self->object->dtx, (int)type, 'b' ); -} - -static int Object_setDrawModeBits( BPy_Object *self, PyObject *value, - void *type ) -{ - self->object->recalc |= OB_RECALC_OB; - return EXPP_setBitfield( value, (void *)&self->object->dtx, - (int)type, 'b' ); -} - -static PyObject *Object_getTransflagBits( BPy_Object *self, void *type ) -{ - return EXPP_getBitfield( (void *)&self->object->transflag, - (int)type, 'h' ); -} - -static int Object_setTransflagBits( BPy_Object *self, PyObject *value, - void *type ) -{ - self->object->recalc |= OB_RECALC_OB; - return EXPP_setBitfield( value, (void *)&self->object->transflag, - (int)type, 'h' ); -} - -static PyObject *Object_getLayers( BPy_Object * self ) -{ - int layers, bit; - PyObject *laylist = PyList_New( 0 ); - - if( !laylist ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "PyList_New() failed" ); - - layers = self->object->lay & 0xfffff; /* get layer bitmask */ - - /* - * starting with the first layer, and until there are no more layers, - * find which layers are visible - */ - - for( bit = 1; layers; ++bit ) { - if( layers & 1 ) { /* if layer is visible, add to list */ - PyObject *item = PyInt_FromLong( bit ); - PyList_Append( laylist, item ); - Py_DECREF( item ); - } - layers >>= 1; /* go to the next layer */ - } - return laylist; -} - -/* - * usage note: caller of this func needs to do a Blender.Redraw(-1) - * to update and redraw the interface - */ - -static int Object_setLayers( BPy_Object * self, PyObject *value ) -{ - int layers = 0, val, i, len_list, local; - Base *base; - - if( !PyList_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of integers in the range [1, 20]" ); - - len_list = PyList_Size( value ); - - /* build a bitmask, check for values outside of range */ - - for( i = 0; i < len_list; i++ ) { - PyObject* integer = PyNumber_Int( PyList_GetItem( value, i ) ); - val = PyInt_AsLong( integer ); - Py_XDECREF( integer ); - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "list must contain only integer numbers" ); - if( val < 1 || val > 20 ) - return EXPP_ReturnIntError ( PyExc_ValueError, - "layer values must be in the range [1, 20]" ); - layers |= 1 << ( val - 1 ); - } - - /* do this, to ensure layers are set for objects not in current scene */ - self->object->lay= layers; - - /* update any bases pointing to our object */ - base = FIRSTBASE; /* first base in current scene */ - while( base ) { - if( base->object == self->object ) { - base->lay &= 0xFFF00000; - local = base->lay; - base->lay = local | layers; - self->object->lay = base->lay; - break; - } - base = base->next; - } - - /* these to calls here are overkill! (ton) */ - if (base) { /* The object was found? */ - countall(); - DAG_scene_sort( G.scene ); - } - return 0; -} - -static int Object_setLayersMask( BPy_Object *self, PyObject *value ) -{ - int layers = 0, local; - Base *base; - - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an integer (bitmask) as argument" ); - - layers = PyInt_AS_LONG( value ); - - /* make sure some bits are set, and only those bits are set */ - - if( !( layers & 0xFFFFF ) || ( layers & 0xFFF00000 ) ) - return EXPP_ReturnIntError( PyExc_ValueError, - "bitmask must have between 1 and 20 bits set" ); - - /* update any bases pointing to our object */ - - base = FIRSTBASE; /* first base in current scene */ - while( base ) { - if( base->object == self->object ) { - base->lay &= 0xFFF00000; - local = base->lay; - base->lay = local | layers; - self->object->lay = base->lay; - break; - } - base = base->next; - } - if (base) { /* The object was found? */ - countall(); - DAG_scene_sort( G.scene ); - } - return 0; -} - -/* - * this should accept a Py_None argument and just delete the Ipo link - * (as Object_clearIpo() does) - */ - -static int Object_setIpo( BPy_Object * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->object->ipo, 0, 1, ID_IP, ID_OB); -} - -static int Object_setTracked( BPy_Object * self, PyObject * value ) -{ - int ret; - ret = GenericLib_assignData(value, (void **) &self->object->track, 0, 0, ID_OB, 0); - if (ret==0) { - self->object->recalc |= OB_RECALC_OB; - DAG_scene_sort( G.scene ); - } - return ret; -} - -/* Localspace matrix */ - -static PyObject *Object_getMatrixLocal( BPy_Object * self ) -{ - if( self->object->parent ) { - float matrix[4][4]; /* for the result */ - float invmat[4][4]; /* for inverse of parent's matrix */ - - Mat4Invert(invmat, self->object->parent->obmat ); - Mat4MulMat4(matrix, self->object->obmat, invmat); - return newMatrixObject((float*)matrix,4,4,Py_NEW); - } else { /* no parent, so return world space matrix */ - disable_where_script( 1 ); - where_is_object( self->object ); - disable_where_script( 0 ); - return newMatrixObject((float*)self->object->obmat,4,4,Py_WRAP); - } -} - -/* Worldspace matrix */ - -static PyObject *Object_getMatrixWorld( BPy_Object * self ) -{ - disable_where_script( 1 ); - where_is_object( self->object ); - disable_where_script( 0 ); - return newMatrixObject((float*)self->object->obmat,4,4,Py_WRAP); -} - -/* Parent Inverse matrix */ - -static PyObject *Object_getMatrixParentInverse( BPy_Object * self ) -{ - return newMatrixObject((float*)self->object->parentinv,4,4,Py_WRAP); -} - -/* - * Old behavior, prior to Blender 2.34, where eventual changes made by the - * script itself were not taken into account until a redraw happened, either - * called by the script or upon its exit. - */ - -static PyObject *Object_getMatrixOldWorld( BPy_Object * self ) -{ - return newMatrixObject((float*)self->object->obmat,4,4,Py_WRAP); -} - -/* - * get one of three different matrix representations - */ - -static PyObject *Object_getMatrix( BPy_Object * self, PyObject * args ) -{ - char *space = "worldspace"; /* default to world */ - char *errstr = "expected nothing, 'worldspace' (default), 'localspace' or 'old_worldspace'"; - - if( !PyArg_ParseTuple( args, "|s", &space ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, errstr ); - - if( BLI_streq( space, "worldspace" ) ) - return Object_getMatrixWorld( self ); - else if( BLI_streq( space, "localspace" ) ) - return Object_getMatrixLocal( self ); - else if( BLI_streq( space, "old_worldspace" ) ) - return Object_getMatrixOldWorld( self ); - else - return EXPP_ReturnPyObjError( PyExc_ValueError, errstr ); -} - -static PyObject *get_obj_data( BPy_Object *self, int mesh ) -{ - Object *object = self->object; - PyObject *data_object = NULL; - - switch ( object->type ) { - case OB_ARMATURE: - data_object = Armature_CreatePyObject( object->data ); - break; - case OB_CAMERA: - data_object = Camera_CreatePyObject( object->data ); - break; - case OB_CURVE: - case OB_SURF: - data_object = Curve_CreatePyObject( object->data ); - break; - case ID_IM: - data_object = Image_CreatePyObject( object->data ); - break; - case ID_IP: - data_object = Ipo_CreatePyObject( object->data ); - break; - case OB_LAMP: - data_object = Lamp_CreatePyObject( object->data ); - break; - case OB_LATTICE: - data_object = Lattice_CreatePyObject( object->data ); - break; - case ID_MA: - break; - case OB_MESH: - if( !mesh ) /* get as NMesh (default) */ - data_object = NMesh_CreatePyObject( object->data, object ); - else /* else get as Mesh */ - data_object = Mesh_CreatePyObject( object->data, object ); - break; - case OB_MBALL: - data_object = Metaball_CreatePyObject( object->data ); - break; - case ID_OB: - data_object = Object_CreatePyObject( object->data ); - break; - case ID_SCE: - break; - case OB_FONT: - data_object = Text3d_CreatePyObject( object->data ); - break; - case ID_WO: - break; - default: - break; - } - - if( data_object ) - return data_object; - - Py_RETURN_NONE; -} - -static PyObject *Object_getData( BPy_Object *self, PyObject *args, - PyObject *kwd ) -{ - Object *object = self->object; - int name_only = 0; - int mesh = 0; /* default mesh type = NMesh */ - static char *kwlist[] = {"name_only", "mesh", NULL}; - - if( !PyArg_ParseTupleAndKeywords(args, kwd, "|ii", kwlist, - &name_only, &mesh) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or bool keywords 'name_only' or 'mesh' as argument" ); - - /* if there's no obdata, try to create it */ - if( object->data == NULL ) { - int tmptype = object->type; /* save current type */ - - /* if we have no data and are faking an empty, set the type */ - if( self->realtype != OB_EMPTY ) - object->type = self->realtype; - - if( EXPP_add_obdata( object ) != 0 ) { /* couldn't create obdata */ - object->type = tmptype; /* restore previous type */ - Py_RETURN_NONE; - } - - /* if we set data successfully, clear the fake type */ - self->realtype = OB_EMPTY; - } - - /* user wants only the name of the data object */ - if( name_only ) { - ID *id = object->data; - return PyString_FromString( id->name+2 ); - } - - return get_obj_data( self, mesh ); -} - -static PyObject *Object_getEuler( BPy_Object * self ) -{ - return ( PyObject * ) newEulerObject( self->object->rot, Py_WRAP ); -} - -#define PROTFLAGS_MASK ( OB_LOCK_LOCX | OB_LOCK_LOCY | OB_LOCK_LOCZ | \ - OB_LOCK_ROTX | OB_LOCK_ROTY | OB_LOCK_ROTZ | \ - OB_LOCK_SCALEX | OB_LOCK_SCALEY | OB_LOCK_SCALEZ ) - -static PyObject *Object_getProtectFlags( BPy_Object * self ) -{ - return PyInt_FromLong( (long)(self->object->protectflag & PROTFLAGS_MASK) ); -} - -static int Object_setProtectFlags( BPy_Object * self, PyObject * args ) -{ - PyObject* integer = PyNumber_Int( args ); - short value; - - if( !integer ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - value = ( short )PyInt_AS_LONG( integer ); - Py_DECREF( integer ); - if( value & ~PROTFLAGS_MASK ) - return EXPP_ReturnIntError( PyExc_ValueError, - "undefined bit(s) set in bitfield" ); - - self->object->protectflag = value; - self->object->recalc |= OB_RECALC_OB; - return 0; -} - -static PyObject *Object_getRBRadius( BPy_Object * self ) -{ - return PyFloat_FromDouble( (double) self->object->inertia ); -} - -static int Object_setRBRadius( BPy_Object * self, PyObject * args ) -{ - float value; - PyObject* flt = PyNumber_Float( args ); - - if( !flt ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - value = (float)PyFloat_AS_DOUBLE( flt ); - Py_DECREF( flt ); - - if( value < 0.0f ) - return EXPP_ReturnIntError( PyExc_ValueError, - "acceptable values are non-negative, 0.0 or more" ); - - self->object->inertia = value; - self->object->recalc |= OB_RECALC_OB; - - return 0; -} - -static PyObject *Object_getRBHalfExtents( BPy_Object * self ) -{ - float center[3], extents[3]; - - get_local_bounds( self->object, center, extents ); - return Py_BuildValue( "[fff]", extents[0], extents[1], extents[2] ); -} - -static PyGetSetDef BPy_Object_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"LocX", - (getter)getFloatAttr, (setter)setFloatAttr, - "The X location coordinate of the object", - (void *)EXPP_OBJ_ATTR_LOC_X}, - {"LocY", - (getter)getFloatAttr, (setter)setFloatAttr, - "The Y location coordinate of the object", - (void *)EXPP_OBJ_ATTR_LOC_Y}, - {"LocZ", - (getter)getFloatAttr, (setter)setFloatAttr, - "The Z location coordinate of the object", - (void *)EXPP_OBJ_ATTR_LOC_Z}, - {"dLocX", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta X location coordinate of the object", - (void *)EXPP_OBJ_ATTR_DLOC_X}, - {"dLocY", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta Y location coordinate of the object", - (void *)EXPP_OBJ_ATTR_DLOC_Y}, - {"dLocZ", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta Z location coordinate of the object", - (void *)EXPP_OBJ_ATTR_DLOC_Z}, - {"RotX", - (getter)getFloatAttr, (setter)setFloatAttr, - "The X rotation angle (in radians) of the object", - (void *)EXPP_OBJ_ATTR_ROT_X}, - {"RotY", - (getter)getFloatAttr, (setter)setFloatAttr, - "The Y rotation angle (in radians) of the object", - (void *)EXPP_OBJ_ATTR_ROT_Y}, - {"RotZ", - (getter)getFloatAttr, (setter)setFloatAttr, - "The Z rotation angle (in radians) of the object", - (void *)EXPP_OBJ_ATTR_ROT_Z}, - {"dRotX", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta X rotation angle (in radians) of the object", - (void *)EXPP_OBJ_ATTR_DROT_X}, - {"dRotY", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta Y rotation angle (in radians) of the object", - (void *)EXPP_OBJ_ATTR_DROT_Y}, - {"dRotZ", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta Z rotation angle (in radians) of the object", - (void *)EXPP_OBJ_ATTR_DROT_Z}, - {"SizeX", - (getter)getFloatAttr, (setter)setFloatAttr, - "The X size of the object", - (void *)EXPP_OBJ_ATTR_SIZE_X}, - {"SizeY", - (getter)getFloatAttr, (setter)setFloatAttr, - "The Y size of the object", - (void *)EXPP_OBJ_ATTR_SIZE_Y}, - {"SizeZ", - (getter)getFloatAttr, (setter)setFloatAttr, - "The Z size of the object", - (void *)EXPP_OBJ_ATTR_SIZE_Z}, - {"dSizeX", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta X size of the object", - (void *)EXPP_OBJ_ATTR_DSIZE_X}, - {"dSizeY", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta Y size of the object", - (void *)EXPP_OBJ_ATTR_DSIZE_Y}, - {"dSizeZ", - (getter)getFloatAttr, (setter)setFloatAttr, - "The delta Z size of the object", - (void *)EXPP_OBJ_ATTR_DSIZE_Z}, - - {"loc", - (getter)getFloat3Attr, (setter)setFloat3Attr, - "The (X,Y,Z) location coordinates of the object", - (void *)EXPP_OBJ_ATTR_LOC}, - {"dloc", - (getter)getFloat3Attr, (setter)setFloat3Attr, - "The delta (X,Y,Z) location coordinates of the object", - (void *)EXPP_OBJ_ATTR_DLOC}, - {"rot", - (getter)Object_getEuler, (setter)Object_setEuler, - "The (X,Y,Z) rotation angles (in degrees) of the object", - NULL}, - {"drot", - (getter)getFloat3Attr, (setter)setFloat3Attr, - "The delta (X,Y,Z) rotation angles (in radians) of the object", - (void *)EXPP_OBJ_ATTR_DROT}, - {"size", - (getter)getFloat3Attr, (setter)setFloat3Attr, - "The (X,Y,Z) size of the object", - (void *)EXPP_OBJ_ATTR_SIZE}, - {"dsize", - (getter)getFloat3Attr, (setter)setFloat3Attr, - "The delta (X,Y,Z) size of the object", - (void *)EXPP_OBJ_ATTR_DSIZE}, - {"Layer", - (getter)getIntAttr, (setter)Object_setLayersMask, - "The object layers (bitfield)", - (void *)EXPP_OBJ_ATTR_LAYERMASK}, - {"Layers", - (getter)getIntAttr, (setter)Object_setLayersMask, - "The object layers (bitfield)", - (void *)EXPP_OBJ_ATTR_LAYERMASK}, - {"layers", - (getter)Object_getLayers, (setter)Object_setLayers, - "The object layers (list of ints)", - NULL}, - {"ipo", - (getter)Object_getIpo, (setter)Object_setIpo, - "Object's Ipo data", - NULL}, - {"colbits", - (getter)getIntAttr, (setter)setIntAttrRange, - "The Material usage bitfield", - (void *)EXPP_OBJ_ATTR_COLBITS}, - {"drawMode", - (getter)getIntAttr, (setter)Object_setDrawMode, - "The object's drawing mode bitfield", - (void *)EXPP_OBJ_ATTR_DRAWMODE}, - {"drawType", - (getter)getIntAttr, (setter)Object_setDrawType, - "The object's drawing type", - (void *)EXPP_OBJ_ATTR_DRAWTYPE}, - {"parentType", - (getter)getIntAttr, (setter)NULL, - "The object's parent type", - (void *)EXPP_OBJ_ATTR_PARENT_TYPE}, - {"DupOn", - (getter)getIntAttr, (setter)setIntAttrClamp, - "DupOn setting (for DupliFrames)", - (void *)EXPP_OBJ_ATTR_DUPON}, - {"DupOff", - (getter)getIntAttr, (setter)setIntAttrClamp, - "DupOff setting (for DupliFrames)", - (void *)EXPP_OBJ_ATTR_DUPOFF}, - {"DupSta", - (getter)getIntAttr, (setter)setIntAttrClamp, - "Starting frame (for DupliFrames)", - (void *)EXPP_OBJ_ATTR_DUPSTA}, - {"DupEnd", - (getter)getIntAttr, (setter)setIntAttrClamp, - "Ending frame (for DupliFrames)", - (void *)EXPP_OBJ_ATTR_DUPEND}, - {"passIndex", - (getter)getIntAttr, (setter)setIntAttrClamp, - "Index for object masks in the compositor", - (void *)EXPP_OBJ_ATTR_PASSINDEX}, - {"activeMaterial", - (getter)getIntAttr, (setter)setIntAttrClamp, - "Index for the active material (displayed in the material panel)", - (void *)EXPP_OBJ_ATTR_ACT_MATERIAL}, - {"mat", - (getter)Object_getMatrixWorld, (setter)NULL, - "worldspace matrix: absolute, takes vertex parents, tracking and Ipos into account", - NULL}, - {"matrix", - (getter)Object_getMatrixWorld, (setter)NULL, - "worldspace matrix: absolute, takes vertex parents, tracking and Ipos into account", - NULL}, - {"matrixWorld", - (getter)Object_getMatrixWorld, (setter)NULL, - "worldspace matrix: absolute, takes vertex parents, tracking and Ipos into account", - NULL}, - {"matrixLocal", - (getter)Object_getMatrixLocal, (setter)Object_setMatrix, - "localspace matrix: relative to the object's parent", - NULL}, - {"matrixParentInverse", - (getter)Object_getMatrixParentInverse, (setter)NULL, - "parents inverse matrix: parents localspace inverted matrix", - NULL}, - {"matrixOldWorld", - (getter)Object_getMatrixOldWorld, (setter)NULL, - "old-type worldspace matrix (prior to Blender 2.34)", - NULL}, - {"data", - (getter)get_obj_data, (setter)NULL, - "The Datablock object linked to this object", - NULL}, - {"sel", - (getter)Object_getSelected, (setter)Object_setSelect, - "The object's selection state", - NULL}, - {"parent", - (getter)Object_getParent, (setter)NULL, - "The object's parent object (if parented)", - NULL}, - {"parentbonename", - (getter)Object_getParentBoneName, (setter)Object_setParentBoneName, - "The object's parent object's sub name", - NULL}, - {"track", - (getter)Object_getTracked, (setter)Object_setTracked, - "The object's tracked object", - NULL}, - {"timeOffset", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "The time offset of the object's animation", - (void *)EXPP_OBJ_ATTR_TIMEOFFSET}, - {"type", - (getter)Object_getType, (setter)NULL, - "The object's type", - NULL}, - {"boundingBox", - (getter)Object_getBoundBox, (setter)NULL, - "The bounding box of this object", - NULL}, - {"action", - (getter)Object_getAction, (setter)Object_setAction, - "The action associated with this object (if defined)", - NULL}, - {"game_properties", - (getter)Object_getAllProperties, (setter)NULL, - "The object's properties", - NULL}, - - {"piFalloff", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "The particle interaction falloff power", - (void *)EXPP_OBJ_ATTR_PI_FALLOFF}, - {"piMaxDist", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Max distance for the particle interaction field to work", - (void *)EXPP_OBJ_ATTR_PI_MAXDIST}, - {"piPermeability", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Probability that a particle will pass through the mesh", - (void *)EXPP_OBJ_ATTR_PI_PERM}, - {"piRandomDamp", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Random variation of particle interaction damping", - (void *)EXPP_OBJ_ATTR_PI_RANDOMDAMP}, - {"piStrength", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Particle interaction force field strength", - (void *)EXPP_OBJ_ATTR_PI_STRENGTH}, - {"piSurfaceDamp", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Amount of damping during particle collision", - (void *)EXPP_OBJ_ATTR_PI_SURFACEDAMP}, - {"piSoftbodyDamp", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Damping factor for softbody deflection", - (void *)EXPP_OBJ_ATTR_PI_SBDAMP}, - {"piSoftbodyIThick", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Inner face thickness for softbody deflection", - (void *)EXPP_OBJ_ATTR_PI_SBIFACETHICK}, - {"piSoftbodyOThick", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Outer face thickness for softbody deflection", - (void *)EXPP_OBJ_ATTR_PI_SBOFACETHICK}, - - {"piDeflection", - (getter)Object_getPIDeflection, (setter)Object_setPIDeflection, - "Deflects particles based on collision", - NULL}, - {"piType", - (getter)Object_getPIType, (setter)Object_setPIType, - "Type of particle interaction (force field, wind, etc)", - NULL}, - {"piUseMaxDist", - (getter)Object_getPIUseMaxDist, (setter)Object_setPIUseMaxDist, - "Use a maximum distance for the field to work", - NULL}, - - {"sbMass", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody point mass (heavier is slower)", - (void *)EXPP_OBJ_ATTR_SB_NODEMASS}, - {"sbGrav", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Apply gravitation to softbody point movement", - (void *)EXPP_OBJ_ATTR_SB_GRAV}, - {"sbFriction", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "General media friction for softbody point movements", - (void *)EXPP_OBJ_ATTR_SB_MEDIAFRICT}, - {"sbSpeed", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Tweak timing for physics to control softbody frequency and speed", - (void *)EXPP_OBJ_ATTR_SB_MEDIAFRICT}, - {"sbErrorLimit", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody Runge-Kutta ODE solver error limit (low values give more precision)", - (void *)EXPP_OBJ_ATTR_SB_RKLIMIT}, - {"sbGoalSpring", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody goal (vertex target position) spring stiffness", - (void *)EXPP_OBJ_ATTR_SB_GOALSPRING}, - {"sbGoalFriction", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody goal (vertex target position) friction", - (void *)EXPP_OBJ_ATTR_SB_GOALFRICT}, - {"sbMinGoal", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody goal minimum (vertex group weights scaled to match this range)", - (void *)EXPP_OBJ_ATTR_SB_MINGOAL}, - {"sbMaxGoal", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody goal maximum (vertex group weights scaled to match this range)", - (void *)EXPP_OBJ_ATTR_SB_MAXGOAL}, - {"sbDefaultGoal", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Default softbody goal value, when no vertex group used", - (void *)EXPP_OBJ_ATTR_SB_DEFGOAL}, - {"sbInnerSpring", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody edge spring stiffness", - (void *)EXPP_OBJ_ATTR_SB_INSPRING}, - {"sbInnerSpringFrict", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "Softbody edge spring friction", - (void *)EXPP_OBJ_ATTR_SB_INFRICT}, - {"isSoftBody", - (getter)Object_isSB, (setter)NULL, - "True if object is a soft body", - NULL}, - {"sbUseGoal", - (getter)Object_getSBUseGoal, (setter)Object_setSBUseGoal, - "Softbody forces for vertices to stick to animated position enabled", - NULL}, - {"sbUseEdges", - (getter)Object_getSBUseEdges, (setter)Object_setSBUseEdges, - "Softbody use edges as springs enabled", - NULL}, - {"sbStiffQuads", - (getter)Object_getSBStiffQuads, (setter)Object_setSBStiffQuads, - "Softbody adds diagonal springs on 4-gons enabled", - NULL}, - - {"axis", - (getter)Object_getDrawModeBits, (setter)Object_setDrawModeBits, - "Display of active object's center and axis enabled", - (void *)OB_AXIS}, - {"texSpace", - (getter)Object_getDrawModeBits, (setter)Object_setDrawModeBits, - "Display of active object's texture space enabled", - (void *)OB_TEXSPACE}, - {"nameMode", - (getter)Object_getDrawModeBits, (setter)Object_setDrawModeBits, - "Display of active object's name enabled", - (void *)OB_DRAWNAME}, - {"wireMode", - (getter)Object_getDrawModeBits, (setter)Object_setDrawModeBits, - "Add the active object's wireframe over solid drawing enabled", - (void *)OB_DRAWWIRE}, - {"xRay", - (getter)Object_getDrawModeBits, (setter)Object_setDrawModeBits, - "Draw the active object in front of others enabled", - (void *)OB_DRAWXRAY}, - {"transp", - (getter)Object_getDrawModeBits, (setter)Object_setDrawModeBits, - "Transparent materials for the active object (mesh only) enabled", - (void *)OB_DRAWTRANSP}, - - {"enableNLAOverride", - (getter)Object_getNLAflagBits, (setter)Object_setNLAflagBits, - "Toggles Action-NLA based animation", - (void *)OB_NLA_OVERRIDE}, - - {"enableDupVerts", - (getter)Object_getTransflagBits, (setter)Object_setTransflagBits, - "Duplicate child objects on all vertices", - (void *)OB_DUPLIVERTS}, - {"enableDupFaces", - (getter)Object_getTransflagBits, (setter)Object_setTransflagBits, - "Duplicate child objects on all faces", - (void *)OB_DUPLIFACES}, - {"enableDupFacesScale", - (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", - (void *)OB_DUPLIFRAMES}, - {"enableDupGroup", - (getter)Object_getTransflagBits, (setter)Object_setTransflagBits, - "Enable group instancing", - (void *)OB_DUPLIGROUP}, - {"enableDupRot", - (getter)Object_getTransflagBits, (setter)Object_setTransflagBits, - "Rotate dupli according to vertex normal", - (void *)OB_DUPLIROT}, - {"enableDupNoSpeed", - (getter)Object_getTransflagBits, (setter)Object_setTransflagBits, - "Set dupliframes to still, regardless of frame", - (void *)OB_DUPLINOSPEED}, - {"DupObjects", - (getter)Object_getDupliObjects, (setter)NULL, - "Get a list of tuple pairs (object, matrix), for getting dupli objects", - NULL}, - {"DupGroup", - (getter)Object_getDupliGroup, (setter)Object_setDupliGroup, - "Get a list of tuples for object duplicated by dupliframe", - NULL}, - - {"effects", - (getter)Object_getEffects, (setter)NULL, - "The list of particle effects associated with the object", - NULL}, - {"actionStrips", - (getter)Object_getActionStrips, (setter)NULL, - "The action strips associated with the object", - NULL}, - {"constraints", - (getter)Object_getConstraints, (setter)NULL, - "The constraints associated with the object", - NULL}, - {"modifiers", - (getter)Object_getModifiers, (setter)Object_setModifiers, - "The modifiers associated with the object", - NULL}, - {"protectFlags", - (getter)Object_getProtectFlags, (setter)Object_setProtectFlags, - "The \"transform locking\" bitfield for the object", - NULL}, - {"drawSize", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "The size to display the Empty", - (void *)EXPP_OBJ_ATTR_DRAWSIZE}, - - {"rbFlags", - (getter)Object_getRBFlags, (setter)Object_setRBFlags, - "Rigid body flags", - NULL}, - {"rbMass", - (getter)Object_getRBMass, (setter)Object_setRBMass, - "Rigid body object mass", - NULL}, - {"rbRadius", - (getter)Object_getRBRadius, (setter)Object_setRBRadius, - "Rigid body bounding sphere size", - NULL}, - {"rbShapeBoundType", - (getter)Object_getRBShapeBoundType, (setter)Object_setRBShapeBoundType, - "Rigid body physics bounds object type", - NULL}, - {"rbHalfExtents", - (getter)Object_getRBHalfExtents, (setter)NULL, - "Rigid body physics bounds object type", - NULL}, - - {"restrictDisplay", - (getter)Object_getRestricted, (setter)Object_setRestricted, - "Toggle object restrictions", - (void *)OB_RESTRICT_VIEW}, - {"restrictSelect", - (getter)Object_getRestricted, (setter)Object_setRestricted, - "Toggle object restrictions", - (void *)OB_RESTRICT_SELECT}, - {"restrictRender", - (getter)Object_getRestricted, (setter)Object_setRestricted, - "Toggle object restrictions", - (void *)OB_RESTRICT_RENDER}, - - {"pinShape", - (getter)Object_getShapeFlag, (setter)Object_setShapeFlag, - "Set the state for pinning this object", - (void *)OB_SHAPE_LOCK}, - {"activeShape", - (getter)getIntAttr, (setter)setIntAttrClamp, - "set the index for the active shape key", - (void *)EXPP_OBJ_ATTR_ACT_SHAPE}, - - - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Object_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Object_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Object", /* char *tp_name; */ - sizeof( BPy_Object ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) Object_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) Object_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Object_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Object_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Object_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 -}; - -static PyObject *M_Object_DrawModesDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "AXIS", PyInt_FromLong( OB_AXIS ) ); - PyConstant_Insert( d, "TEXSPACE", PyInt_FromLong( OB_TEXSPACE ) ); - PyConstant_Insert( d, "NAME", PyInt_FromLong( OB_DRAWNAME ) ); - PyConstant_Insert( d, "WIRE", PyInt_FromLong( OB_DRAWWIRE ) ); - PyConstant_Insert( d, "XRAY", PyInt_FromLong( OB_DRAWXRAY ) ); - PyConstant_Insert( d, "TRANSP", PyInt_FromLong( OB_DRAWTRANSP ) ); - } - return M; -} - -static PyObject *M_Object_DrawTypesDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "BOUNDBOX", PyInt_FromLong( OB_BOUNDBOX ) ); - PyConstant_Insert( d, "WIRE", PyInt_FromLong( OB_WIRE ) ); - PyConstant_Insert( d, "SOLID", PyInt_FromLong( OB_SOLID ) ); - PyConstant_Insert( d, "SHADED", PyInt_FromLong( OB_SHADED ) ); - } - return M; -} - -static PyObject *M_Object_ParentTypesDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "OBJECT", PyInt_FromLong( PAROBJECT ) ); - PyConstant_Insert( d, "CURVE", PyInt_FromLong( PARCURVE ) ); - - /* 2.43 was released as LATTICE as PARKEY, my bad, - lattice uses PARSKEL also - Campbell */ - PyConstant_Insert( d, "LATTICE", PyInt_FromLong( PARSKEL ) ); - - PyConstant_Insert( d, "ARMATURE", PyInt_FromLong( PARSKEL ) ); - PyConstant_Insert( d, "VERT1", PyInt_FromLong( PARVERT1 ) ); - PyConstant_Insert( d, "VERT3", PyInt_FromLong( PARVERT3 ) ); - PyConstant_Insert( d, "BONE", PyInt_FromLong( PARBONE ) ); - } - return M; -} - -static PyObject *M_Object_PITypesDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "NONE", PyInt_FromLong( 0 ) ); - PyConstant_Insert( d, "FORCE", PyInt_FromLong( PFIELD_FORCE ) ); - PyConstant_Insert( d, "VORTEX", PyInt_FromLong( PFIELD_VORTEX ) ); - PyConstant_Insert( d, "WIND", PyInt_FromLong( PFIELD_WIND ) ); - PyConstant_Insert( d, "GUIDE", PyInt_FromLong( PFIELD_GUIDE ) ); - } - return M; -} - -static PyObject *M_Object_ProtectDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "LOCX", PyInt_FromLong( OB_LOCK_LOCX ) ); - PyConstant_Insert( d, "LOCY", PyInt_FromLong( OB_LOCK_LOCY ) ); - PyConstant_Insert( d, "LOCZ", PyInt_FromLong( OB_LOCK_LOCZ ) ); - PyConstant_Insert( d, "LOC", PyInt_FromLong( OB_LOCK_LOC ) ); - PyConstant_Insert( d, "ROTX", PyInt_FromLong( OB_LOCK_ROTX ) ); - PyConstant_Insert( d, "ROTY", PyInt_FromLong( OB_LOCK_ROTY ) ); - PyConstant_Insert( d, "ROTZ", PyInt_FromLong( OB_LOCK_ROTZ ) ); - PyConstant_Insert( d, "ROT", - PyInt_FromLong( OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ ) ); - PyConstant_Insert( d, "SCALEX", PyInt_FromLong( OB_LOCK_SCALEX ) ); - PyConstant_Insert( d, "SCALEY", PyInt_FromLong( OB_LOCK_SCALEY ) ); - PyConstant_Insert( d, "SCALEZ", PyInt_FromLong( OB_LOCK_SCALEZ ) ); - PyConstant_Insert( d, "SCALE", - PyInt_FromLong( OB_LOCK_SCALEX|OB_LOCK_SCALEY|OB_LOCK_SCALEZ ) ); - } - return M; -} - -static PyObject *M_Object_RBFlagsDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "DYNAMIC", PyInt_FromLong( OB_DYNAMIC ) ); - PyConstant_Insert( d, "CHILD", PyInt_FromLong( OB_CHILD ) ); - PyConstant_Insert( d, "ACTOR", PyInt_FromLong( OB_ACTOR ) ); - PyConstant_Insert( d, "USEFH", PyInt_FromLong( OB_DO_FH ) ); - PyConstant_Insert( d, "ROTFH", PyInt_FromLong( OB_ROT_FH ) ); - PyConstant_Insert( d, "ANISOTROPIC", - PyInt_FromLong( OB_ANISOTROPIC_FRICTION ) ); - PyConstant_Insert( d, "GHOST", PyInt_FromLong( OB_GHOST ) ); - PyConstant_Insert( d, "RIGIDBODY", PyInt_FromLong( OB_RIGID_BODY ) ); - PyConstant_Insert( d, "BOUNDS", PyInt_FromLong( OB_BOUNDS ) ); - PyConstant_Insert( d, "COLLISION_RESPONSE", - PyInt_FromLong( OB_COLLISION_RESPONSE ) ); - PyConstant_Insert( d, "SECTOR", PyInt_FromLong( OB_SECTOR ) ); - PyConstant_Insert( d, "PROP", PyInt_FromLong( OB_PROP ) ); - PyConstant_Insert( d, "MAINACTOR", PyInt_FromLong( OB_MAINACTOR ) ); - } - return M; -} - -static PyObject *M_Object_RBShapeBoundDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "BOX", PyInt_FromLong( OB_BOUND_BOX ) ); - PyConstant_Insert( d, "SPHERE", PyInt_FromLong( OB_BOUND_SPHERE ) ); - PyConstant_Insert( d, "CYLINDER", PyInt_FromLong( OB_BOUND_CYLINDER ) ); - PyConstant_Insert( d, "CONE", PyInt_FromLong( OB_BOUND_CONE ) ); - PyConstant_Insert( d, "POLYHEDERON", PyInt_FromLong( OB_BOUND_POLYH ) ); - } - return M; -} - -static PyObject *M_Object_IpoKeyTypesDict( void ) -{ - PyObject *M = PyConstant_New( ); - - if( M ) { - BPy_constant *d = ( BPy_constant * ) M; - PyConstant_Insert( d, "LOC", PyInt_FromLong( IPOKEY_LOC ) ); - PyConstant_Insert( d, "ROT", PyInt_FromLong( IPOKEY_ROT ) ); - 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 ) ); - PyConstant_Insert( d, "PI_SURFACEDAMP", PyInt_FromLong( IPOKEY_PI_SURFACEDAMP ) ); - PyConstant_Insert( d, "PI_RANDOMDAMP", PyInt_FromLong( IPOKEY_PI_RANDOMDAMP ) ); - PyConstant_Insert( d, "PI_PERM", PyInt_FromLong( IPOKEY_PI_PERM ) ); - } - return M; -} - -/*****************************************************************************/ -/* Function: initObject */ -/*****************************************************************************/ -PyObject *Object_Init( void ) -{ - PyObject *module, *dict; - PyObject *DrawModesDict = M_Object_DrawModesDict( ); - PyObject *DrawTypesDict = M_Object_DrawTypesDict( ); - PyObject *ParentTypesDict = M_Object_ParentTypesDict( ); - PyObject *ProtectDict = M_Object_ProtectDict( ); - PyObject *PITypesDict = M_Object_PITypesDict( ); - PyObject *RBFlagsDict = M_Object_RBFlagsDict( ); - PyObject *RBShapesDict = M_Object_RBShapeBoundDict( ); - PyObject *IpoKeyTypesDict = M_Object_IpoKeyTypesDict( ); - - PyType_Ready( &Object_Type ) ; - - module = Py_InitModule3( "Blender.Object", M_Object_methods, - M_Object_doc ); - - - /* We Should Remove these!!!! */ - PyModule_AddIntConstant( module, "LOC", IPOKEY_LOC ); - PyModule_AddIntConstant( module, "ROT", IPOKEY_ROT ); - 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 ); - PyModule_AddIntConstant( module, "PI_RANDOMDAMP", IPOKEY_PI_RANDOMDAMP ); - PyModule_AddIntConstant( module, "PI_PERM", IPOKEY_PI_PERM ); - - PyModule_AddIntConstant( module, "NONE",0 ); - PyModule_AddIntConstant( module, "FORCE",PFIELD_FORCE ); - PyModule_AddIntConstant( module, "VORTEX",PFIELD_VORTEX ); - PyModule_AddIntConstant( module, "MAGNET",PFIELD_MAGNET ); - PyModule_AddIntConstant( module, "WIND",PFIELD_WIND ); - /* Only keeping above so as not to break compat */ - - - if( DrawModesDict ) - PyModule_AddObject( module, "DrawModes", DrawModesDict ); - if( DrawTypesDict ) - PyModule_AddObject( module, "DrawTypes", DrawTypesDict ); - if( ParentTypesDict ) - PyModule_AddObject( module, "ParentTypes", ParentTypesDict ); - if( PITypesDict ) - PyModule_AddObject( module, "PITypes", PITypesDict ); - if( ProtectDict ) - PyModule_AddObject( module, "ProtectFlags", ProtectDict ); - if( RBFlagsDict ) - PyModule_AddObject( module, "RBFlags", RBFlagsDict ); - if( RBShapesDict ) - PyModule_AddObject( module, "RBShapes", RBShapesDict ); - if( IpoKeyTypesDict ) - PyModule_AddObject( module, "IpoKeyTypes", IpoKeyTypesDict ); - - /*Add SUBMODULES to the module*/ - dict = PyModule_GetDict( module ); /*borrowed*/ - PyDict_SetItemString(dict, "Pose", Pose_Init()); /*creates a *new* module*/ - /*PyDict_SetItemString(dict, "Constraint", Constraint_Init()); */ /*creates a *new* module*/ - - return ( module ); -} - -/* #####DEPRECATED###### */ - -static PyObject *Object_SetIpo( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Object_setIpo ); -} - -static PyObject *Object_Select( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Object_setSelect ); -} - -static PyObject *Object_SetDrawMode( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setDrawMode ); -} - -static PyObject *Object_SetDrawType( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setDrawType ); -} - -static PyObject *Object_SetMatrix( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setMatrix ); -} - -static PyObject *Object_SetEuler( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapperTuple( (void *)self, args, - (setter)Object_setEuler ); -} - -static PyObject *Object_setTimeOffset( BPy_Object * self, PyObject * args ) -{ - float newTimeOffset; - - if( !PyArg_ParseTuple( args, "f", &newTimeOffset ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a float as argument" ); - - self->object->sf = newTimeOffset; - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - - -/*************************************************************************/ -/* particle defection methods */ -/*************************************************************************/ - -static PyObject *Object_SetPIDeflection( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setPIDeflection ); -} - -static PyObject *Object_SetPIType( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setPIType ); -} - -static PyObject *Object_SetPIUseMaxDist( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setPIUseMaxDist ); -} - -static PyObject *Object_getPISurfaceDamp( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->pd->pdef_damp ); -} - -static PyObject *Object_SetPISurfaceDamp( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return NULL; - - self->object->pd->pdef_damp = EXPP_ClampFloat( value, - EXPP_OBJECT_PIDAMP_MIN, EXPP_OBJECT_PIDAMP_MAX ); - self->object->recalc |= OB_RECALC_OB; - Py_RETURN_NONE; -} - -static PyObject *Object_getPIPerm( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - return PyFloat_FromDouble ( (double) self->object->pd->pdef_perm ); -} - -static PyObject *Object_SetPIPerm( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return NULL; - - self->object->pd->pdef_perm = EXPP_ClampFloat( value, - EXPP_OBJECT_PIPERM_MIN, EXPP_OBJECT_PIPERM_MAX ); - self->object->recalc |= OB_RECALC_OB; - Py_RETURN_NONE; -} - -static PyObject *Object_getPIStrength( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->pd->f_strength ); -} - -static PyObject *Object_setPIStrength( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->pd->f_strength = EXPP_ClampFloat( value, - EXPP_OBJECT_PISTRENGTH_MIN, EXPP_OBJECT_PISTRENGTH_MAX ); - self->object->recalc |= OB_RECALC_OB; - Py_RETURN_NONE; -} - -static PyObject *Object_getPIFalloff( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->pd->f_power ); -} - -static PyObject *Object_setPIFalloff( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->pd->f_power = EXPP_ClampFloat( value, - EXPP_OBJECT_PIPOWER_MIN, EXPP_OBJECT_PIPOWER_MAX ); - self->object->recalc |= OB_RECALC_OB; - Py_RETURN_NONE; -} - -static PyObject *Object_getPIMaxDist( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->pd->maxdist ); -} - -static PyObject *Object_setPIMaxDist( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->pd->maxdist = EXPP_ClampFloat( value, - EXPP_OBJECT_PIMAXDIST_MIN, EXPP_OBJECT_PIMAXDIST_MAX ); - self->object->recalc |= OB_RECALC_OB; - Py_RETURN_NONE; -} - -static PyObject *Object_getPIRandomDamp( BPy_Object * self ) -{ - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->pd->pdef_rdamp ); -} - -static PyObject *Object_setPIRandomDamp( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->pd && !setupPI(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "particle deflection could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return NULL; - - self->object->pd->pdef_rdamp = EXPP_ClampFloat( value, - EXPP_OBJECT_PIRDAMP_MIN, EXPP_OBJECT_PIRDAMP_MAX ); - self->object->recalc |= OB_RECALC_OB; - Py_RETURN_NONE; -} - -/*************************************************************************/ -/* softbody methods */ -/*************************************************************************/ - -static PyObject *Object_getSBMass( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->nodemass ); -} - -static PyObject *Object_setSBMass( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->nodemass = EXPP_ClampFloat( value, - EXPP_OBJECT_SBNODEMASSMIN, EXPP_OBJECT_SBNODEMASSMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBGravity( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->grav ); -} - -static PyObject *Object_setSBGravity( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->grav = EXPP_ClampFloat( value, - EXPP_OBJECT_SBGRAVMIN, EXPP_OBJECT_SBGRAVMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBFriction( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->mediafrict ); -} - -static PyObject *Object_setSBFriction( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->mediafrict = EXPP_ClampFloat( value, - EXPP_OBJECT_SBMEDIAFRICTMIN, EXPP_OBJECT_SBMEDIAFRICTMAX ); - self->object->recalc |= OB_RECALC_OB; - Py_RETURN_NONE; -} - -static PyObject *Object_getSBErrorLimit( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->rklimit ); -} - -static PyObject *Object_setSBErrorLimit( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->rklimit = EXPP_ClampFloat( value, - EXPP_OBJECT_SBRKLIMITMIN, EXPP_OBJECT_SBRKLIMITMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBGoalSpring( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->goalspring ); -} - -static PyObject *Object_setSBGoalSpring( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->goalspring = EXPP_ClampFloat( value, - EXPP_OBJECT_SBGOALSPRINGMIN, EXPP_OBJECT_SBGOALSPRINGMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBGoalFriction( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->goalfrict ); -} - -static PyObject *Object_setSBGoalFriction( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->goalfrict = EXPP_ClampFloat( value, - EXPP_OBJECT_SBGOALFRICTMIN, EXPP_OBJECT_SBGOALFRICTMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBMinGoal( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->mingoal ); -} - -static PyObject *Object_setSBMinGoal( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->mingoal = EXPP_ClampFloat( value, - EXPP_OBJECT_SBMINGOALMIN, EXPP_OBJECT_SBMINGOALMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBMaxGoal( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->maxgoal ); -} - -static PyObject *Object_setSBMaxGoal( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->maxgoal = EXPP_ClampFloat( value, - EXPP_OBJECT_SBMAXGOALMIN, EXPP_OBJECT_SBMAXGOALMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBDefaultGoal( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->defgoal ); -} - -static PyObject *Object_setSBDefaultGoal( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->defgoal = EXPP_ClampFloat( value, - EXPP_OBJECT_SBDEFGOALMIN, EXPP_OBJECT_SBDEFGOALMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBInnerSpring( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->inspring ); -} - -static PyObject *Object_setSBInnerSpring( BPy_Object * self, PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->inspring = EXPP_ClampFloat( value, - EXPP_OBJECT_SBINSPRINGMIN, EXPP_OBJECT_SBINSPRINGMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_getSBInnerSpringFriction( BPy_Object * self ) -{ - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - return PyFloat_FromDouble( ( double ) self->object->soft->infrict ); -} - -static PyObject *Object_setSBInnerSpringFriction( BPy_Object * self, - PyObject * args ) -{ - float value; - - if( !self->object->soft && !setupSB(self->object) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "softbody could not be accessed" ); - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected float argument" ); - - self->object->soft->infrict = EXPP_ClampFloat( value, - EXPP_OBJECT_SBINFRICTMIN, EXPP_OBJECT_SBINFRICTMAX ); - self->object->recalc |= OB_RECALC_OB; - - Py_RETURN_NONE; -} - -static PyObject *Object_SetSBUseGoal( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setSBUseGoal ); -} - -static PyObject *Object_SetSBUseEdges( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setSBUseEdges ); -} - -static PyObject *Object_SetSBStiffQuads( BPy_Object * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Object_setSBStiffQuads ); -} diff --git a/source/blender/python/api2_2x/Object.h b/source/blender/python/api2_2x/Object.h deleted file mode 100644 index 7891f99da09..00000000000 --- a/source/blender/python/api2_2x/Object.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * $Id: Object.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_OBJECT_H -#define EXPP_OBJECT_H - -#include -#include "DNA_object_types.h" - -/* The Object PyType Object defined in Object.c */ -extern PyTypeObject Object_Type; - -#define BPy_Object_Check(v) \ - ((v)->ob_type == &Object_Type) /* for type checking */ - -/*****************************************************************************/ -/* Python BPy_Object structure definition. */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - struct Object *object; /* libdata must be second */ - short realtype; -} BPy_Object; - -PyObject *Object_Init( void ); -PyObject *Object_CreatePyObject( struct Object *obj ); -Object *Object_FromPyObject( PyObject * py_obj ); - -void Object_updateDag( void *data ); - -int EXPP_add_obdata( struct Object *object ); - -#endif /* EXPP_OBJECT_H */ diff --git a/source/blender/python/api2_2x/Particle.c b/source/blender/python/api2_2x/Particle.c deleted file mode 100644 index 84c0c727792..00000000000 --- a/source/blender/python/api2_2x/Particle.c +++ /dev/null @@ -1,1040 +0,0 @@ -/* - * $Id: Particle.c 10279 2007-03-16 11:38:02Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot, Jean-Michel Soler - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Particle.h" /*This must come first */ - -#include "DNA_object_types.h" -#include "BKE_effect.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_object.h" -#include "BLI_blenlib.h" -#include "gen_utils.h" - -/*****************************************************************************/ -/* Python API function prototypes for the Particle module. */ -/*****************************************************************************/ -PyObject *M_Particle_New( PyObject * self, PyObject * args ); -PyObject *M_Particle_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* Python BPy_Particle methods declarations: */ -/*****************************************************************************/ -PyObject *Effect_getType( BPy_Effect * self ); -PyObject *Effect_setType( BPy_Effect * self, PyObject * args ); -PyObject *Effect_getFlag( BPy_Effect * self ); -PyObject *Effect_setFlag( BPy_Effect * self, PyObject * args ); -PyObject *Particle_getSta( BPy_Particle * self ); -PyObject *Particle_setSta( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getEnd( BPy_Particle * self ); -PyObject *Particle_setEnd( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getLifetime( BPy_Particle * self ); -PyObject *Particle_setLifetime( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getNormfac( BPy_Particle * self ); -PyObject *Particle_setNormfac( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getObfac( BPy_Particle * self ); -PyObject *Particle_setObfac( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getRandfac( BPy_Particle * self ); -PyObject *Particle_setRandfac( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getTexfac( BPy_Particle * self ); -PyObject *Particle_setTexfac( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getRandlife( BPy_Particle * self ); -PyObject *Particle_setRandlife( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getNabla( BPy_Particle * self ); -PyObject *Particle_setNabla( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getVectsize( BPy_Particle * self ); -PyObject *Particle_setVectsize( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getTotpart( BPy_Particle * self ); -PyObject *Particle_setTotpart( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getTotkey( BPy_Particle * self ); -PyObject *Particle_setTotkey( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getSeed( BPy_Particle * self ); -PyObject *Particle_setSeed( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getForce( BPy_Particle * self ); -PyObject *Particle_setForce( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getMult( BPy_Particle * self ); -PyObject *Particle_setMult( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getLife( BPy_Particle * self ); -PyObject *Particle_setLife( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getMat( BPy_Particle * self ); -PyObject *Particle_setMat( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getChild( BPy_Particle * self ); -PyObject *Particle_setChild( BPy_Particle * self, PyObject * a ); -PyObject *Particle_getDefvec( BPy_Particle * self ); -PyObject *Particle_setDefvec( BPy_Particle * self, PyObject * a ); - -/*****************************************************************************/ -/* Python Particle_Type callback function prototypes: */ -/*****************************************************************************/ -void ParticleDeAlloc( BPy_Particle * msh ); -//int ParticlePrint (BPy_Particle *msh, FILE *fp, int flags); -int ParticleSetAttr( BPy_Particle * msh, char *name, PyObject * v ); -PyObject *ParticleGetAttr( BPy_Particle * msh, char *name ); -PyObject *ParticleRepr( void ); -PyObject *ParticleCreatePyObject( struct Effect *particle ); -int ParticleCheckPyObject( PyObject * py_obj ); -struct Particle *ParticleFromPyObject( PyObject * py_obj ); - - -/*****************************************************************************/ -/* Python BPy_Particle methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Particle_methods[] = { - {"getType", ( PyCFunction ) Effect_getType, - METH_NOARGS, "() - Return Effect type"}, - {"setType", ( PyCFunction ) Effect_setType, - METH_VARARGS, "() - Set Effect type"}, - {"getFlag", ( PyCFunction ) Effect_getFlag, - METH_NOARGS, "() - Return Effect flag"}, - {"setFlag", ( PyCFunction ) Effect_setFlag, - METH_VARARGS, "() - Set Effect flag"}, - {"getStartTime", ( PyCFunction ) Particle_getSta, - METH_NOARGS, "()-Return particle start time"}, - {"setStartTime", ( PyCFunction ) Particle_setSta, METH_VARARGS, - "()- Sets particle start time"}, - {"getEndTime", ( PyCFunction ) Particle_getEnd, - METH_NOARGS, "()-Return particle end time"}, - {"setEndTime", ( PyCFunction ) Particle_setEnd, METH_VARARGS, - "()- Sets particle end time"}, - {"getLifetime", ( PyCFunction ) Particle_getLifetime, - METH_NOARGS, "()-Return particle life time"}, - {"setLifetime", ( PyCFunction ) Particle_setLifetime, METH_VARARGS, - "()- Sets particle life time "}, - {"getNormfac", ( PyCFunction ) Particle_getNormfac, - METH_NOARGS, "()-Return particle life time"}, - {"setNormfac", ( PyCFunction ) Particle_setNormfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getObfac", ( PyCFunction ) Particle_getObfac, - METH_NOARGS, "()-Return particle life time"}, - {"setObfac", ( PyCFunction ) Particle_setObfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getRandfac", ( PyCFunction ) Particle_getRandfac, - METH_NOARGS, "()-Return particle life time"}, - {"setRandfac", ( PyCFunction ) Particle_setRandfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getTexfac", ( PyCFunction ) Particle_getTexfac, - METH_NOARGS, "()-Return particle life time"}, - {"setTexfac", ( PyCFunction ) Particle_setTexfac, METH_VARARGS, - "()- Sets particle life time "}, - {"getRandlife", ( PyCFunction ) Particle_getRandlife, - METH_NOARGS, "()-Return particle life time"}, - {"setRandlife", ( PyCFunction ) Particle_setRandlife, METH_VARARGS, - "()- Sets particle life time "}, - {"getNabla", ( PyCFunction ) Particle_getNabla, - METH_NOARGS, "()-Return particle life time"}, - {"setNabla", ( PyCFunction ) Particle_setNabla, METH_VARARGS, - "()- Sets particle life time "}, - {"getVectsize", ( PyCFunction ) Particle_getVectsize, - METH_NOARGS, "()-Return particle life time"}, - {"setVectsize", ( PyCFunction ) Particle_setVectsize, METH_VARARGS, - "()- Sets particle life time "}, - {"getTotpart", ( PyCFunction ) Particle_getTotpart, - METH_NOARGS, "()-Return particle life time"}, - {"setTotpart", ( PyCFunction ) Particle_setTotpart, METH_VARARGS, - "()- Sets particle life time "}, - {"getTotkey", ( PyCFunction ) Particle_getTotkey, - METH_NOARGS, "()-Return particle life time"}, - {"setTotkey", ( PyCFunction ) Particle_setTotkey, METH_VARARGS, - "()- Sets particle life time "}, - {"getSeed", ( PyCFunction ) Particle_getSeed, - METH_NOARGS, "()-Return particle life time"}, - {"setSeed", ( PyCFunction ) Particle_setSeed, METH_VARARGS, - "()- Sets particle life time "}, - {"getForce", ( PyCFunction ) Particle_getForce, - METH_NOARGS, "()-Return particle life time"}, - {"setForce", ( PyCFunction ) Particle_setForce, METH_VARARGS, - "()- Sets particle life time "}, - {"getMult", ( PyCFunction ) Particle_getMult, - METH_NOARGS, "()-Return particle life time"}, - {"setMult", ( PyCFunction ) Particle_setMult, METH_VARARGS, - "()- Sets particle life time "}, - {"getLife", ( PyCFunction ) Particle_getLife, - METH_NOARGS, "()-Return particle life time"}, - {"setLife", ( PyCFunction ) Particle_setLife, METH_VARARGS, - "()- Sets particle life time "}, - {"getMat", ( PyCFunction ) Particle_getMat, - METH_NOARGS, "()-Return particle life time"}, - {"setMat", ( PyCFunction ) Particle_setMat, METH_VARARGS, - "()- Sets particle life time "}, - {"getChild", ( PyCFunction ) Particle_getChild, - METH_NOARGS, "()-Return particle life time"}, - {"setChild", ( PyCFunction ) Particle_setChild, METH_VARARGS, - "()- Sets particle life time "}, - {"getDefvec", ( PyCFunction ) Particle_getDefvec, - METH_NOARGS, "()-Return particle life time"}, - {"setDefvec", ( PyCFunction ) Particle_setDefvec, METH_VARARGS, - "()- Sets particle life time "}, - - - {NULL, NULL, 0, NULL} -}; - -/**************** prototypes ********************/ -PyObject *Particle_Init( void ); - - -/*****************************************************************************/ -/* Python Particle_Type structure definition: */ -/*****************************************************************************/ - -PyTypeObject Particle_Type = { - PyObject_HEAD_INIT( NULL ) - 0, - "Particle", - sizeof( BPy_Particle ), - 0, - - ( destructor ) ParticleDeAlloc, - 0, - ( getattrfunc ) ParticleGetAttr, - ( setattrfunc ) ParticleSetAttr, - 0, - ( reprfunc ) ParticleRepr, - 0, - 0, - 0, - 0, - 0, 0, 0, 0, 0, 0, - 0, - 0, 0, 0, 0, 0, 0, - BPy_Particle_methods, - 0, -}; -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Particle.__doc__ */ -/*****************************************************************************/ -char M_Particle_doc[] = "The Blender Particle module\n\n\ -This module provides access to **Object Data** in Blender.\n\ -Functions :\n\ - New(object mesh's name) : creates a new part object and adds it to the given mesh object \n\ - Get(name) : retreives a particle with the given name (mandatory)\n\ - get(name) : same as Get. Kept for compatibility reasons.\n"; -char M_Particle_New_doc[] = "New(name) : creates a new part object and adds it to the given mesh object\n"; -char M_Particle_Get_doc[] = "xxx"; - - -/*****************************************************************************/ -/* Python method structure definition for Blender.Particle module: */ -/*****************************************************************************/ -struct PyMethodDef M_Particle_methods[] = { - {"New", ( PyCFunction ) M_Particle_New, METH_VARARGS, M_Particle_New_doc}, - {"Get", M_Particle_Get, METH_VARARGS, M_Particle_Get_doc}, - {"get", M_Particle_Get, METH_VARARGS, M_Particle_Get_doc}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Function: M_Particle_New */ -/* Python equivalent: Blender.Effect.Particle.New */ -/* Description : Create a particle effect and add a link */ -/* to the given mesh-type Object */ -/* Data : String mesh object name */ -/* Return : pyobject particle */ -/*****************************************************************************/ -PyObject *M_Particle_New( PyObject * self, PyObject * args ) -{ - BPy_Effect *pyeffect; - Effect *bleffect = 0; - Object *ob; - char *name = NULL; - - if( !PyArg_ParseTuple( args, "s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - for( ob = G.main->object.first; ob; ob = ob->id.next ) - if( !strcmp( name, ob->id.name + 2 ) ) - break; - - if( !ob ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object does not exist" ); - - if( ob->type != OB_MESH ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "object is not a mesh" ); - - pyeffect = ( BPy_Effect * ) PyObject_NEW( BPy_Effect, &Effect_Type ); - if( !pyeffect ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Effect Data object" ); - - bleffect = add_effect( EFF_PARTICLE ); - if( !bleffect ) { - Py_DECREF( pyeffect ); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Effect Data in Blender" ); - } - - pyeffect->effect = (PartEff *)bleffect; - BLI_addtail( &ob->effect, bleffect ); - - return ( PyObject * ) pyeffect; -} - -/*****************************************************************************/ -/* Function: M_Particle_Get */ -/* Python equivalent: Blender.Effect.Particle.Get */ -/*****************************************************************************/ -PyObject *M_Particle_Get( PyObject * self, PyObject * args ) -{ - /*arguments : string object name - int : position of effect in the obj's effect list */ - char *name = 0; - Object *object_iter; - Effect *eff; - BPy_Particle *wanted_eff; - int num, i; - - if( !PyArg_ParseTuple( args, "si", &name, &num ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string int argument" ) ); - - object_iter = G.main->object.first; - if( !object_iter ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "Scene contains no object" ); - - while( object_iter ) { - if( strcmp( name, object_iter->id.name + 2 ) ) { - object_iter = object_iter->id.next; - continue; - } - - if( object_iter->effect.first != NULL ) { - eff = object_iter->effect.first; - for( i = 0; i < num; i++ ) { - if( eff->type != EFF_PARTICLE ) - continue; - eff = eff->next; - if( !eff ) - return ( EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "Object" ) ); - } - wanted_eff = - ( BPy_Particle * ) PyObject_NEW( BPy_Particle, - &Particle_Type ); - wanted_eff->particle = eff; - return ( PyObject * ) wanted_eff; - } - object_iter = object_iter->id.next; - } - Py_INCREF( Py_None ); - return Py_None; -} - -/*****************************************************************************/ -/* Function: Particle_Init */ -/*****************************************************************************/ -PyObject *Particle_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &Particle_Type) < 0) - return NULL; - - submodule = - Py_InitModule3( "Blender.Particle", M_Particle_methods, M_Particle_doc ); - return ( submodule ); -} - -/*****************************************************************************/ -/* Python BPy_Particle methods: */ -/*****************************************************************************/ - -PyObject *Particle_getSta( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->sta ); -} - - - -PyObject *Particle_setSta( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val = 0; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->sta = val; - Py_INCREF( Py_None ); - return Py_None; -} - -PyObject *Particle_getEnd( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->end ); -} - - - -PyObject *Particle_setEnd( BPy_Particle * self, PyObject * args ) -{ - float val = 0; - PartEff *ptr = ( PartEff * ) self->particle; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->end = val; - Py_INCREF( Py_None ); - return Py_None; -} - -PyObject *Particle_getLifetime( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->lifetime ); -} - - - -PyObject *Particle_setLifetime( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val = 0; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->lifetime = val; - Py_INCREF( Py_None ); - return Py_None; -} - - -PyObject *Particle_getNormfac( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->normfac ); -} - - - -PyObject *Particle_setNormfac( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val = 0; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->normfac = val; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getObfac( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->obfac ); -} - - - -PyObject *Particle_setObfac( BPy_Particle * self, PyObject * args ) -{ - float val = 0; - PartEff *ptr = ( PartEff * ) self->particle; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->obfac = val; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getRandfac( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->randfac ); -} - - - -PyObject *Particle_setRandfac( BPy_Particle * self, PyObject * args ) -{ - float val = 0; - PartEff *ptr = ( PartEff * ) self->particle; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->randfac = val; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getTexfac( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->texfac ); -} - - - -PyObject *Particle_setTexfac( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val = 0; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->texfac = val; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getRandlife( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->randlife ); -} - - - -PyObject *Particle_setRandlife( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val = 0; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->randlife = val; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getNabla( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->nabla ); -} - - - -PyObject *Particle_setNabla( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val = 0; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->nabla = val; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getVectsize( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyFloat_FromDouble( ptr->vectsize ); -} - - - -PyObject *Particle_setVectsize( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val = 0; - if( !PyArg_ParseTuple( args, "f", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - ptr->vectsize = val; - Py_INCREF( Py_None ); - return Py_None; -} - - -PyObject *Particle_getTotpart( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyInt_FromLong( ptr->totpart ); -} - - - -PyObject *Particle_setTotpart( BPy_Particle * self, PyObject * args ) -{ - int val = 0; - PartEff *ptr = ( PartEff * ) self->particle; - if( !PyArg_ParseTuple( args, "i", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument" ) ); - ptr->totpart = val; - Py_INCREF( Py_None ); - return Py_None; -} - - -PyObject *Particle_getTotkey( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyInt_FromLong( ptr->totkey ); -} - - - -PyObject *Particle_setTotkey( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - int val = 0; - if( !PyArg_ParseTuple( args, "i", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument" ) ); - ptr->totkey = val; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getSeed( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return PyInt_FromLong( ptr->seed ); -} - - - -PyObject *Particle_setSeed( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - int val = 0; - if( !PyArg_ParseTuple( args, "i", &val ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument" ) ); - ptr->seed = val; - Py_INCREF( Py_None ); - return Py_None; -} - -PyObject *Particle_getForce( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return Py_BuildValue( "(f,f,f)", ptr->force[0], ptr->force[1], - ptr->force[2] ); -} - - -PyObject *Particle_setForce( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val[3]; - if( PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - val[0] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 0 ) ); - val[1] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 1 ) ); - val[2] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 2 ) ); - /* - if (!PyArg_ParseTuple(args, "fff", val,val+1,val+2 )) - return(EXPP_ReturnPyObjError(PyExc_AttributeError,\ - "expected three float arguments")); - */ - ptr->force[0] = val[0]; - ptr->force[1] = val[1]; - ptr->force[2] = val[2]; - Py_INCREF( Py_None ); - return Py_None; -} - -PyObject *Particle_getMult( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return Py_BuildValue( "(f,f,f,f)", - ptr->mult[0], ptr->mult[1], ptr->mult[2], - ptr->mult[3] ); -} - - -PyObject *Particle_setMult( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val[4]; - if( PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - val[0] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 0 ) ); - val[1] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 1 ) ); - val[2] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 2 ) ); - val[3] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 3 ) ); - ptr->mult[0] = val[0]; - ptr->mult[1] = val[1]; - ptr->mult[2] = val[2]; - ptr->mult[3] = val[3]; - Py_INCREF( Py_None ); - return Py_None; -} - - - - -PyObject *Particle_getLife( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return Py_BuildValue( "(f,f,f,f)", - ptr->life[0], ptr->life[1], ptr->life[2], - ptr->life[3] ); -} - - -PyObject *Particle_setLife( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val[4]; - if( PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - val[0] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 0 ) ); - val[1] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 1 ) ); - val[2] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 2 ) ); - val[3] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 3 ) ); - ptr->life[0] = val[0]; - ptr->life[1] = val[1]; - ptr->life[2] = val[2]; - ptr->life[3] = val[3]; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getChild( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return Py_BuildValue( "(f,f,f,f)", - ptr->child[0], ptr->child[1], ptr->child[2], - ptr->child[3] ); -} - - -PyObject *Particle_setChild( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val[4]; - if( PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - val[0] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 0 ) ); - val[1] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 1 ) ); - val[2] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 2 ) ); - val[3] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 3 ) ); - ptr->child[0] = (short)val[0]; - ptr->child[1] = (short)val[1]; - ptr->child[2] = (short)val[2]; - ptr->child[3] = (short)val[3]; - Py_INCREF( Py_None ); - return Py_None; -} - - - -PyObject *Particle_getMat( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return Py_BuildValue( "(f,f,f,f)", - ptr->mat[0], ptr->mat[1], ptr->mat[2], - ptr->mat[3] ); -} - - -PyObject *Particle_setMat( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val[4]; - if( PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - val[0] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 0 ) ); - val[1] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 1 ) ); - val[2] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 2 ) ); - val[3] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 3 ) ); - ptr->mat[0] = (short)val[0]; - ptr->mat[1] = (short)val[1]; - ptr->mat[2] = (short)val[2]; - ptr->mat[3] = (short)val[3]; - Py_INCREF( Py_None ); - return Py_None; -} - - -PyObject *Particle_getDefvec( BPy_Particle * self ) -{ - - PartEff *ptr = ( PartEff * ) self->particle; - return Py_BuildValue( "(f,f,f)", - ptr->defvec[0], ptr->defvec[1], ptr->defvec[2] ); -} - - -PyObject *Particle_setDefvec( BPy_Particle * self, PyObject * args ) -{ - PartEff *ptr = ( PartEff * ) self->particle; - float val[3]; - if( PyTuple_Size( args ) == 1 ) - args = PyTuple_GetItem( args, 0 ); - val[0] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 0 ) ); - val[1] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 1 ) ); - val[2] = (float)PyFloat_AsDouble( PyTuple_GetItem( args, 2 ) ); - ptr->defvec[0] = val[0]; - ptr->defvec[1] = val[1]; - ptr->defvec[2] = val[2]; - Py_INCREF( Py_None ); - return Py_None; -} - - -/*****************************************************************************/ -/* Function: ParticleDeAlloc */ -/* Description: This is a callback function for the BPy_Particle type. It is */ -/* the destructor function. */ -/*****************************************************************************/ -void ParticleDeAlloc( BPy_Particle * self ) -{ - PartEff *ptr = ( PartEff * ) self; - PyObject_DEL( ptr ); -} - -/*****************************************************************************/ -/* Function: ParticleGetAttr */ -/* Description: This is a callback function for the BPy_Particle type. It is */ -/* the function that accesses BPy_Particle "member variables" */ -/* and methods. */ -/*****************************************************************************/ - - -PyObject *ParticleGetAttr( BPy_Particle * self, char *name ) -{ - - if( strcmp( name, "seed" ) == 0 ) - return Particle_getSeed( self ); - else if( strcmp( name, "nabla" ) == 0 ) - return Particle_getNabla( self ); - else if( strcmp( name, "sta" ) == 0 ) - return Particle_getSta( self ); - else if( strcmp( name, "end" ) == 0 ) - return Particle_getEnd( self ); - else if( strcmp( name, "lifetime" ) == 0 ) - return Particle_getLifetime( self ); - else if( strcmp( name, "normfac" ) == 0 ) - return Particle_getNormfac( self ); - else if( strcmp( name, "obfac" ) == 0 ) - return Particle_getObfac( self ); - else if( strcmp( name, "randfac" ) == 0 ) - return Particle_getRandfac( self ); - else if( strcmp( name, "texfac" ) == 0 ) - return Particle_getTexfac( self ); - else if( strcmp( name, "randlife" ) == 0 ) - return Particle_getRandlife( self ); - else if( strcmp( name, "vectsize" ) == 0 ) - return Particle_getVectsize( self ); - else if( strcmp( name, "totpart" ) == 0 ) - return Particle_getTotpart( self ); - else if( strcmp( name, "force" ) == 0 ) - return Particle_getForce( self ); - else if( strcmp( name, "mult" ) == 0 ) - return Particle_getMult( self ); - else if( strcmp( name, "life" ) == 0 ) - return Particle_getLife( self ); - else if( strcmp( name, "child" ) == 0 ) - return Particle_getChild( self ); - else if( strcmp( name, "mat" ) == 0 ) - return Particle_getMat( self ); - else if( strcmp( name, "defvec" ) == 0 ) - return Particle_getDefvec( self ); - - - return Py_FindMethod( BPy_Particle_methods, ( PyObject * ) self, - name ); -} - -/*****************************************************************************/ -/* Function: ParticleSetAttr */ -/* Description: This is a callback function for the BPy_Particle type. */ -/* It is the function that sets Particle Data attributes */ -/* (member vars) */ -/*****************************************************************************/ -int ParticleSetAttr( BPy_Particle * self, char *name, PyObject * value ) -{ - - PyObject *valtuple; - PyObject *error = NULL; - - valtuple = Py_BuildValue( "(N)", value ); - - if( !valtuple ) - return EXPP_ReturnIntError( PyExc_MemoryError, - "ParticleSetAttr: couldn't create PyTuple" ); - - if( strcmp( name, "seed" ) == 0 ) - error = Particle_setSeed( self, valtuple ); - else if( strcmp( name, "nabla" ) == 0 ) - error = Particle_setNabla( self, valtuple ); - else if( strcmp( name, "sta" ) == 0 ) - error = Particle_setSta( self, valtuple ); - else if( strcmp( name, "end" ) == 0 ) - error = Particle_setEnd( self, valtuple ); - else if( strcmp( name, "lifetime" ) == 0 ) - error = Particle_setLifetime( self, valtuple ); - else if( strcmp( name, "normfac" ) == 0 ) - error = Particle_setNormfac( self, valtuple ); - else if( strcmp( name, "obfac" ) == 0 ) - error = Particle_setObfac( self, valtuple ); - else if( strcmp( name, "randfac" ) == 0 ) - error = Particle_setRandfac( self, valtuple ); - else if( strcmp( name, "texfac" ) == 0 ) - error = Particle_setTexfac( self, valtuple ); - else if( strcmp( name, "randlife" ) == 0 ) - error = Particle_setRandlife( self, valtuple ); - else if( strcmp( name, "nabla" ) == 0 ) - error = Particle_setNabla( self, valtuple ); - else if( strcmp( name, "vectsize" ) == 0 ) - error = Particle_setVectsize( self, valtuple ); - else if( strcmp( name, "totpart" ) == 0 ) - error = Particle_setTotpart( self, valtuple ); - else if( strcmp( name, "seed" ) == 0 ) - error = Particle_setSeed( self, valtuple ); - else if( strcmp( name, "force" ) == 0 ) - error = Particle_setForce( self, valtuple ); - else if( strcmp( name, "mult" ) == 0 ) - error = Particle_setMult( self, valtuple ); - else if( strcmp( name, "life" ) == 0 ) - error = Particle_setLife( self, valtuple ); - else if( strcmp( name, "child" ) == 0 ) - error = Particle_setChild( self, valtuple ); - else if( strcmp( name, "mat" ) == 0 ) - error = Particle_setMat( self, valtuple ); - else if( strcmp( name, "defvec" ) == 0 ) - error = Particle_setDefvec( self, valtuple ); - - else { - Py_DECREF( valtuple ); - - if( ( strcmp( name, "Types" ) == 0 ) || - ( strcmp( name, "Modes" ) == 0 ) ) - return ( EXPP_ReturnIntError( PyExc_AttributeError, - "constant dictionary -- cannot be changed" ) ); - - else - return ( EXPP_ReturnIntError( PyExc_KeyError, - "attribute not found" ) ); - } - - Py_DECREF(valtuple); - if( error != Py_None ) - return -1; - - Py_DECREF( Py_None ); - return 0; -} - -/*****************************************************************************/ -/* Function: ParticlePrint */ -/* Description: This is a callback function for the BPy_Particle type. It */ -/* particles a meaninful string to 'print' particle objects. */ -/*****************************************************************************/ -/* -int ParticlePrint(BPy_Particle *self, FILE *fp, int flags) -{ - printf("Hi, I'm a particle!"); - return 0; -} -*/ -/*****************************************************************************/ -/* Function: ParticleRepr */ -/* Description: This is a callback function for the BPy_Particle type. It */ -/* particles a meaninful string to represent particle objects. */ -/*****************************************************************************/ -PyObject *ParticleRepr( void ) -{ - return PyString_FromString( "Particle" ); -} - -PyObject *ParticleCreatePyObject( struct Effect * particle ) -{ - BPy_Particle *blen_object; - - - blen_object = - ( BPy_Particle * ) PyObject_NEW( BPy_Particle, - &Particle_Type ); - - if( blen_object == NULL ) { - return ( NULL ); - } - blen_object->particle = particle; - return ( ( PyObject * ) blen_object ); - -} - -int ParticleCheckPyObject( PyObject * py_obj ) -{ - return ( py_obj->ob_type == &Particle_Type ); -} - - -struct Particle *ParticleFromPyObject( PyObject * py_obj ) -{ - BPy_Particle *blen_obj; - - blen_obj = ( BPy_Particle * ) py_obj; - return ( ( struct Particle * ) blen_obj->particle ); - -} diff --git a/source/blender/python/api2_2x/Particle.h b/source/blender/python/api2_2x/Particle.h deleted file mode 100644 index 73b5363dac6..00000000000 --- a/source/blender/python/api2_2x/Particle.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * $Id: Particle.h 5702 2005-11-04 20:34:38Z khughes $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#ifndef EXPP_PARTICLE_H -#define EXPP_PARTICLE_H - -#include -#include "DNA_effect_types.h" - -extern PyTypeObject Particle_Type; - -#define BPy_Particle_Check(v) ((v)->ob_type==&Particle_Type) - -/* Python BPy_Particle structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - Effect * particle; -} BPy_Particle; - -#include "Effect.h" - -/*****************************************************************************/ -/* Python Particle_Type callback function prototypes: */ -/*****************************************************************************/ -#if 0 -void ParticleDeAlloc( BPy_Particle * msh ); -//int ParticlePrint (BPy_Particle *msh, FILE *fp, int flags); -int ParticleSetAttr( BPy_Particle * msh, char *name, PyObject * v ); -PyObject *ParticleGetAttr( BPy_Particle * msh, char *name ); -PyObject *ParticleRepr( void ); -PyObject *ParticleCreatePyObject( struct Effect *particle ); -int ParticleCheckPyObject( PyObject * py_obj ); -struct Particle *ParticleFromPyObject( PyObject * py_obj ); -#endif - - - -#endif /* EXPP_PARTICLE_H */ diff --git a/source/blender/python/api2_2x/Pose.c b/source/blender/python/api2_2x/Pose.c deleted file mode 100644 index 01fbe591a74..00000000000 --- a/source/blender/python/api2_2x/Pose.c +++ /dev/null @@ -1,1395 +0,0 @@ -/* - * $Id: - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * Contributor(s): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Pose.h" - - -#include "mydevice.h" -#include "BKE_armature.h" -#include "BKE_main.h" -#include "BKE_global.h" -#include "BKE_action.h" -#include "BKE_utildefines.h" -#include "BIF_editaction.h" -#include "BIF_space.h" -#include "BIF_poseobject.h" -#include "BKE_depsgraph.h" -#include "DNA_object_types.h" -#include "DNA_ipo_types.h" -#include "DNA_scene_types.h" -#include "DNA_space_types.h" //1 - this order -#include "BSE_editipo.h" //2 -#include "BLI_blenlib.h" -#include "BLI_arithb.h" -#include "Mathutils.h" -#include "Object.h" -#include "Constraint.h" -#include "NLA.h" -#include "gen_utils.h" -#include "gen_library.h" - -#include "DNA_armature_types.h" /*used for pose bone select*/ - -#include "MEM_guardedalloc.h" - -extern void chan_calc_mat(bPoseChannel *chan); - -//------------------------ERROR CODES--------------------------------- -//This is here just to make me happy and to have more consistant error strings :) -static const char sPoseError[] = "Pose - Error: "; -//static const char sPoseBadArgs[] = "Pose - Bad Arguments: "; -static const char sPoseBoneError[] = "PoseBone - Error: "; -//static const char sPoseBoneBadArgs[] = "PoseBone - Bad Arguments: "; -static const char sPoseBonesDictError[] = "PoseBone - Error: "; -//static const char sPoseBonesDictBadArgs[] = "PoseBone - Bad Arguments: "; - -//################## PoseBonesDict_Type (internal) ######################## -/*This is an internal psuedo-dictionary type that allows for manipulation -* of posechannels inside of a pose structure. It is a subobject of pose. -* i.e. Pose.bones['key']*/ -//################################################################ - -//------------------METHOD IMPLEMENTATIONS----------------------------- -//------------------------Pose.bones.items() -//Returns a list of key:value pairs like dict.items() -static PyObject* PoseBonesDict_items(BPy_PoseBonesDict *self) -{ - return PyDict_Items(self->bonesMap); -} -//------------------------Pose.bones.keys() -//Returns a list of keys like dict.keys() -static PyObject* PoseBonesDict_keys(BPy_PoseBonesDict *self) -{ - return PyDict_Keys(self->bonesMap); -} -//------------------------Armature.bones.values() -//Returns a list of values like dict.values() -static PyObject* PoseBonesDict_values(BPy_PoseBonesDict *self) -{ - return PyDict_Values(self->bonesMap); -} -//------------------ATTRIBUTE IMPLEMENTATION--------------------------- -//------------------TYPE_OBECT IMPLEMENTATION----------------------- -//------------------------tp_doc -//The __doc__ string for this object -static char BPy_PoseBonesDict_doc[] = "This is an internal subobject of pose\ -designed to act as a Py_PoseBone dictionary."; - -//------------------------tp_methods -//This contains a list of all methods the object contains -static PyMethodDef BPy_PoseBonesDict_methods[] = { - {"items", (PyCFunction) PoseBonesDict_items, METH_NOARGS, - "() - Returns the key:value pairs from the dictionary"}, - {"keys", (PyCFunction) PoseBonesDict_keys, METH_NOARGS, - "() - Returns the keys the dictionary"}, - {"values", (PyCFunction) PoseBonesDict_values, METH_NOARGS, - "() - Returns the values from the dictionary"}, - {NULL, NULL, 0, NULL} -}; -//-----------------(internal) -static int PoseBoneMapping_Init(PyObject *dictionary, ListBase *posechannels){ - bPoseChannel *pchan = NULL; - PyObject *py_posechannel = NULL; - - for (pchan = posechannels->first; pchan; pchan = pchan->next){ - py_posechannel = PyPoseBone_FromPosechannel(pchan); - if (!py_posechannel) - return -1; - - if(PyDict_SetItemString(dictionary, - pchan->name, py_posechannel) == -1){ - return -1; - } - Py_DECREF(py_posechannel); - } - return 0; -} - -//----------------- BonesDict_InitBones -static int PoseBonesDict_InitBones(BPy_PoseBonesDict *self) -{ - PyDict_Clear(self->bonesMap); - if (PoseBoneMapping_Init(self->bonesMap, self->bones) == -1) - return 0; - return 1; -} - -//------------------------tp_repr -//This is the string representation of the object -static PyObject *PoseBonesDict_repr(BPy_PoseBonesDict *self) -{ - char buffer[128], *str; - PyObject *key, *value; - int pos = 0; - - /* probably a bit of overkill but better then crashing */ - str = MEM_mallocN( 64 + ( PyDict_Size( self->bonesMap ) * 128), "PoseBonesDict_repr" ); - str[0] = '\0'; - - sprintf(buffer, "[Pose Bone Dict: {"); - strcat(str,buffer); - while (PyDict_Next(self->bonesMap, &pos, &key, &value)) { - sprintf(buffer, "%s : %s, ", PyString_AsString(key), - PyString_AsString(value->ob_type->tp_repr(value))); - strcat(str,buffer); - } - sprintf(buffer, "}]\n"); - strcat(str,buffer); - - MEM_freeN( str ); - - return PyString_FromString(str); -} - -//------------------------tp_dealloc -//This tells how to 'tear-down' our object when ref count hits 0 -static void PoseBonesDict_dealloc(BPy_PoseBonesDict * self) -{ - Py_DECREF(self->bonesMap); - PoseBonesDict_Type.tp_free(self); - return; -} -//------------------------mp_length -//This gets the size of the dictionary -static int PoseBonesDict_len(BPy_PoseBonesDict *self) -{ - return BLI_countlist(self->bones); -} -//-----------------------mp_subscript -//This defines getting a bone from the dictionary - x = Bones['key'] -static PyObject *PoseBonesDict_GetItem(BPy_PoseBonesDict *self, PyObject* key) -{ - PyObject *value = NULL; - - value = PyDict_GetItem(self->bonesMap, key); - if(value == NULL) - Py_RETURN_NONE; - - return EXPP_incr_ret(value); -} -//------------------TYPE_OBECT DEFINITION-------------------------- -//Mapping Protocol -static PyMappingMethods PoseBonesDict_MapMethods = { - (inquiry) PoseBonesDict_len, //mp_length - (binaryfunc)PoseBonesDict_GetItem, //mp_subscript - 0, //mp_ass_subscript -}; -//PoseBonesDict TypeObject -PyTypeObject PoseBonesDict_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "PoseBonesDict", //tp_name - sizeof(BPy_PoseBonesDict), //tp_basicsize - 0, //tp_itemsize - (destructor)PoseBonesDict_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - 0, //tp_compare - (reprfunc) PoseBonesDict_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - &PoseBonesDict_MapMethods, //tp_as_mapping - 0, //tp_hash - 0, //tp_call - 0, //tp_str - 0, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT, //tp_flags - BPy_PoseBonesDict_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - 0, //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_PoseBonesDict_methods, //tp_methods - 0, //tp_members - 0, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - 0, //tp_init - 0, //tp_alloc - 0, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; -//-----------------------PyPoseBonesDict_FromPyPose -static PyObject *PyPoseBonesDict_FromPyPose(BPy_Pose *py_pose) -{ - BPy_PoseBonesDict *py_posebonesdict = NULL; - - //create py object - py_posebonesdict = (BPy_PoseBonesDict *)PoseBonesDict_Type.tp_alloc(&PoseBonesDict_Type, 0); - if (!py_posebonesdict) - goto RuntimeError; - - //create internal dictionaries - py_posebonesdict->bonesMap = PyDict_New(); - if (!py_posebonesdict->bonesMap) - goto RuntimeError; - - //set listbase pointer - py_posebonesdict->bones = &py_pose->pose->chanbase; - - //now that everything is setup - init the mappings - if (!PoseBonesDict_InitBones(py_posebonesdict)) - goto RuntimeError; - - return (PyObject*)py_posebonesdict; - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s", - sPoseBonesDictError, "Failed to create class"); -} - -//################## Pose_Type ########################## -/*This type is a wrapper for a pose*/ -//#################################################### -//------------------METHOD IMPLEMENTATIONS------------------------------ -static PyObject *Pose_update(BPy_Pose *self) -{ - Object *daddy = NULL; - - self->pose->flag |= POSE_RECALC; - - for (daddy = G.main->object.first; daddy; daddy = daddy->id.next){ - if (daddy->pose == self->pose){ - break; - } - } - - if(daddy) - where_is_pose(daddy); - - Py_RETURN_NONE; -} -//------------------------tp_methods -//This contains a list of all methods the object contains -static PyMethodDef BPy_Pose_methods[] = { - {"update", (PyCFunction) Pose_update, METH_NOARGS, - "() - Rebuilds the pose with new values"}, - {NULL, NULL, 0, NULL} -}; -//------------------ATTRIBUTE IMPLEMENTATIONS--------------------------- -//------------------------Pose.bones (getter) -//Gets the bones attribute -static PyObject *Pose_getBoneDict(BPy_Pose *self, void *closure) -{ - return EXPP_incr_ret((PyObject*)self->Bones); -} -//------------------------Pose.bones (setter) -//Sets the bones attribute -static int Pose_setBoneDict(BPy_Pose *self, PyObject *value, void *closure) -{ - goto AttributeError; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s", - sPoseError, "You are not allowed to change the .bones attribute"); -} -//------------------TYPE_OBECT IMPLEMENTATION--------------------------- -//------------------------tp_getset -//This contains methods for attributes that require checking -static PyGetSetDef BPy_Pose_getset[] = { - {"bones", (getter)Pose_getBoneDict, (setter)Pose_setBoneDict, - "The pose's Bone dictionary", NULL}, - {NULL, NULL, NULL, NULL, NULL} -}; -//------------------------tp_dealloc -//This tells how to 'tear-down' our object when ref count hits 0 -static void Pose_dealloc(BPy_Pose *self) -{ - Py_DECREF(self->Bones); - Pose_Type.tp_free(self); - return; -} -//------------------------tp_cmp -//This compares 2 pose types -static int Pose_compare(BPy_Pose *a, BPy_Pose *b ) -{ - return ( a->pose== b->pose ) ? 0 : -1; -} -//------------------------tp_repr -//This is the string representation of the object -static PyObject *Pose_repr(BPy_Pose *self) -{ - return PyString_FromFormat( "[Pose \"%s\"]", self->name); -} -//------------------------tp_doc -//The __doc__ string for this object -static char BPy_Pose_doc[] = "This object wraps a Blender Pose object."; - -//------------------TYPE_OBECT DEFINITION-------------------------- -PyTypeObject Pose_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "Pose", //tp_name - sizeof(BPy_Pose), //tp_basicsize - 0, //tp_itemsize - (destructor)Pose_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - (cmpfunc)Pose_compare, //tp_compare - (reprfunc)Pose_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - 0, //tp_as_mapping - 0, //tp_hash - 0, //tp_call - 0, //tp_str - 0, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT, //tp_flags - BPy_Pose_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - 0, //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_Pose_methods, //tp_methods - 0, //tp_members - BPy_Pose_getset, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - 0, //tp_init - 0, //tp_alloc - 0, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; -//################## PoseBone_Type ##################### -/*This type is a wrapper for a posechannel*/ -//#################################################### -//------------------METHOD IMPLEMENTATIONS------------------------------ -//------------------------------PoseBone.insertKey() -static PyObject *PoseBone_insertKey(BPy_PoseBone *self, PyObject *args) -{ - PyObject *parent_object = NULL; - PyObject *constants = NULL, *item = NULL; - int frame = 1, oldframe, length, x, numeric_value = 0, oldflag, no_ipo_update = 0; - bPoseChannel *pchan = NULL; - - - if (!PyArg_ParseTuple(args, "O!i|Oi", &Object_Type, &parent_object, &frame, &constants, &no_ipo_update )) - goto AttributeError; - - /* incase we ever have a value other then 1 for fast */ - if (no_ipo_update) - no_ipo_update = 1; - - //verify that this pchannel is part of the object->pose - for (pchan = ((BPy_Object*)parent_object)->object->pose->chanbase.first; - pchan; pchan = pchan->next){ - if (pchan == self->posechannel) - break; - } - if (!pchan) - goto AttributeError2; - - //verify that there is an action bound to this object - if (!((BPy_Object*)parent_object)->object->action){ - goto AttributeError5; - } - - oldflag = self->posechannel->flag; - self->posechannel->flag = 0; - //set the flags for this posechannel - if (constants){ - if(PySequence_Check(constants)){ - length = PySequence_Length(constants); - for (x = 0; x < length; x++){ - item = PySequence_GetItem(constants, x); - if (item == EXPP_GetModuleConstant("Blender.Object.Pose", "ROT")){ - numeric_value |= POSE_ROT; - }else if (item == EXPP_GetModuleConstant("Blender.Object.Pose", "LOC")){ - numeric_value |= POSE_LOC; - }else if (item == EXPP_GetModuleConstant("Blender.Object.Pose", "SIZE")){ - numeric_value |= POSE_SIZE; - }else{ - Py_DECREF(item); - self->posechannel->flag = (short)oldflag; - goto AttributeError4; - } - Py_DECREF(item); - } - self->posechannel->flag = (short)numeric_value; - }else if (BPy_Constant_Check(constants)){ - if (constants == EXPP_GetModuleConstant("Blender.Object.Pose", "ROT")){ - numeric_value |= POSE_ROT; - }else if (constants == EXPP_GetModuleConstant("Blender.Object.Pose", "LOC")){ - numeric_value |= POSE_LOC; - }else if (constants == EXPP_GetModuleConstant("Blender.Object.Pose", "SIZE")){ - numeric_value |= POSE_SIZE; - }else{ - self->posechannel->flag = (short)oldflag; - goto AttributeError4; - } - self->posechannel->flag = (short)numeric_value; - }else{ - goto AttributeError3; - } - }else{ //nothing passed so set them all - self->posechannel->flag |= POSE_ROT; - self->posechannel->flag |= POSE_LOC; - self->posechannel->flag |= POSE_SIZE; - } - - //set the frame we want insertion on - oldframe = G.scene->r.cfra; - G.scene->r.cfra = frame; - - //add the action channel if it's not there - verify_action_channel(((BPy_Object*)parent_object)->object->action, - self->posechannel->name); - - //insert the pose keys - if (self->posechannel->flag & POSE_ROT){ - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_QUAT_X, no_ipo_update); - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_QUAT_Y, no_ipo_update); - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_QUAT_Z, no_ipo_update); - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_QUAT_W, no_ipo_update); - } - if (self->posechannel->flag & POSE_LOC){ - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_LOC_X, no_ipo_update); - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_LOC_Y, no_ipo_update); - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_LOC_Z, no_ipo_update); - } - if (self->posechannel->flag & POSE_SIZE){ - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_SIZE_X, no_ipo_update); - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_SIZE_Y, no_ipo_update); - insertkey(&((BPy_Object*)parent_object)->object->id, - ID_PO, self->posechannel->name, NULL, AC_SIZE_Z, no_ipo_update); - } - - //flip the frame back - G.scene->r.cfra = oldframe; - - //update the IPOs - if (no_ipo_update==0) - remake_action_ipos (((BPy_Object*)parent_object)->object->action); - - Py_RETURN_NONE; - -AttributeError: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".insertKey: ", "expects an Object, int, (optional) constants"); -AttributeError2: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".insertKey: ", "wrong object detected. \ - Use the object this pose came from"); -AttributeError3: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".insertKey: ", "Expects a constant or list of constants"); -AttributeError4: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".insertKey: ", "Please use a constant defined in the Pose module"); -AttributeError5: - return EXPP_objError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".insertKey: ", "You must set up and link an Action to this object first"); -} -//------------------------tp_methods -//This contains a list of all methods the object contains -static PyMethodDef BPy_PoseBone_methods[] = { - {"insertKey", (PyCFunction) PoseBone_insertKey, METH_VARARGS, - "() - insert a key for this pose into an action"}, - {NULL, NULL, 0, NULL} -}; -//------------------ATTRIBUTE IMPLEMENTATIONS--------------------------- -//------------------------PoseBone.name (getter) -//Gets the name attribute -static PyObject *PoseBone_getName(BPy_PoseBone *self, void *closure) -{ - return PyString_FromString(self->posechannel->name); -} -//------------------------PoseBone.name (setter) -//Sets the name attribute -static int PoseBone_setName(BPy_PoseBone *self, PyObject *value, void *closure) -{ - char *name = ""; - - if (!PyArg_Parse(value, "s", &name)) - goto AttributeError; - - BLI_strncpy(self->posechannel->name, name, 32); - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".name: ", "expects a string"); -} -//------------------------PoseBone.loc (getter) -//Gets the loc attribute -static PyObject *PoseBone_getLoc(BPy_PoseBone *self, void *closure) -{ - return newVectorObject(self->posechannel->loc, 3, Py_WRAP); -} -//------------------------PoseBone.loc (setter) -//Sets the loc attribute -static int PoseBone_setLoc(BPy_PoseBone *self, PyObject *value, void *closure) -{ - VectorObject *vec = NULL; - int x; - - if (!PyArg_Parse(value, "O!", &vector_Type, &vec)) - goto AttributeError; - if (vec->size != 3) - goto AttributeError; - - for (x = 0; x < 3; x++){ - self->posechannel->loc[x] = vec->vec[x]; - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".loc: ", "expects a 3d vector object"); -} -//------------------------PoseBone.size (getter) -//Gets the size attribute -static PyObject *PoseBone_getSize(BPy_PoseBone *self, void *closure) -{ - return newVectorObject(self->posechannel->size, 3, Py_WRAP); -} -//------------------------PoseBone.size (setter) -//Sets the size attribute -static int PoseBone_setSize(BPy_PoseBone *self, PyObject *value, void *closure) -{ - VectorObject *vec = NULL; - int x; - - if (!PyArg_Parse(value, "O!", &vector_Type, &vec)) - goto AttributeError; - if (vec->size != 3) - goto AttributeError; - - for (x = 0; x < 3; x++){ - self->posechannel->size[x] = vec->vec[x]; - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".size: ", "expects a 3d vector object"); -} -//------------------------PoseBone.quat (getter) -//Gets the quat attribute -static PyObject *PoseBone_getQuat(BPy_PoseBone *self, void *closure) -{ - return newQuaternionObject(self->posechannel->quat, Py_WRAP); -} -//------------------------PoseBone.quat (setter) -//Sets the quat attribute -static int PoseBone_setQuat(BPy_PoseBone *self, PyObject *value, void *closure) -{ - QuaternionObject *quat = NULL; - int x; - - if (!PyArg_Parse(value, "O!", &quaternion_Type, &quat)) - goto AttributeError; - - for (x = 0; x < 4; x++){ - self->posechannel->quat[x] = quat->quat[x]; - } - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".quat: ", "expects a quaternion object"); -} -//------------------------PoseBone.localMatrix (getter) -//Gets the chan_mat -static PyObject *PoseBone_getLocalMatrix(BPy_PoseBone *self, void *closure) -{ - return newMatrixObject((float*)self->posechannel->chan_mat, 4, 4, Py_WRAP); -} -//------------------------PoseBone.localMatrix (setter) -//Sets the chan_mat -static int PoseBone_setLocalMatrix(BPy_PoseBone *self, PyObject *value, void *closure) -{ - MatrixObject *matrix = NULL; - float size[3], quat[4], loc[3]; - float mat3[3][3], mat4[4][4]; - int matsize = 0; - - if (!PyArg_Parse(value, "O!", &matrix_Type, &matrix)) - goto AttributeError; - - if (matrix->rowSize == 3 && matrix->colSize == 3){ - matsize = 3; - Mat3CpyMat3(mat3, (float(*)[3])*matrix->matrix); - }else if (matrix->rowSize == 4 && matrix->colSize == 4){ - matsize = 4; - Mat4CpyMat4(mat4, (float(*)[4])*matrix->matrix); - } - - if (matsize != 3 && matsize != 4){ - goto AttributeError; - } - - //get size and rotation - if (matsize == 3){ - Mat3ToSize(mat3, size); - Mat3Ortho(mat3); - Mat3ToQuat(mat3, quat); - }else if (matsize == 4){ - Mat4ToSize(mat4, size); - Mat4Ortho(mat4); - Mat4ToQuat(mat4, quat); - } - - //get loc - if (matsize == 4) { - VECCOPY(loc, matrix->matrix[3]); - } - else { - loc[0]= loc[1]= loc[2]= 0.0f; - } - - //copy new attributes - VECCOPY(self->posechannel->size, size); - QUATCOPY(self->posechannel->quat, quat); - if (matsize == 4){ - VECCOPY(self->posechannel->loc, loc); - } - - //rebuild matrix - chan_calc_mat(self->posechannel); - return 0; - -AttributeError: - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".localMatrix: ", "expects a 3x3 or 4x4 matrix object"); -} -//------------------------PoseBone.poseMatrix (getter) -//Gets the pose_mat -static PyObject *PoseBone_getPoseMatrix(BPy_PoseBone *self, void *closure) -{ - 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 delta_mat[4][4], quat[4]; /* rotation */ - float size[4]; /* size only */ - - if( !MatrixObject_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected matrix object as argument" ); - - if( value->colSize != 4 || value->rowSize != 4 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "matrix must be a 4x4 transformation matrix\n" - "for example as returned by object.matrixWorld" ); - - /* get bone-space cursor matrix and extract location */ - armature_mat_pose_to_bone(self->posechannel, (float (*)[4]) *value->matrix, delta_mat); - - /* Visual Location */ - VECCOPY(self->posechannel->loc, delta_mat[3]); - - /* Visual Size */ - Mat4ToSize(delta_mat, size); - VECCOPY(self->posechannel->size, size); - - /* Visual Rotation */ - Mat4ToQuat(delta_mat, quat); - QUATCOPY(self->posechannel->quat, quat); - - return 0; -} -//------------------------PoseBone.constraints (getter) -//Gets the constraints sequence -static PyObject *PoseBone_getConstraints(BPy_PoseBone *self, void *closure) -{ - return PoseConstraintSeq_CreatePyObject( self->posechannel ); -} -//------------------------PoseBone.limitmin (getter) -//Gets the pose bone limitmin value -static PyObject *PoseBone_getLimitMin(BPy_PoseBone *self, void *closure) -{ - float mylimitmin[3]; - Object *obj = NULL; - - obj = Object_FromPoseChannel(self->posechannel); - if (obj==NULL){ - return EXPP_ReturnPyObjError(PyExc_AttributeError, "Bone data is not found"); - } - mylimitmin[0]=0.0f; - mylimitmin[1]=0.0f; - mylimitmin[2]=0.0f; - if(pose_channel_in_IK_chain(obj, self->posechannel)){ - if ((self->posechannel->ikflag & BONE_IK_NO_XDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_XLIMIT)) { - mylimitmin[0] = self->posechannel->limitmin[0]; - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_YDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_YLIMIT)) { - mylimitmin[1] = self->posechannel->limitmin[1]; - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_ZDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_ZLIMIT)) { - mylimitmin[2] = self->posechannel->limitmin[2]; - } - } - } - return newVectorObject(mylimitmin, 3, Py_NEW); -} -//------------------------PoseBone.limitmin (setter) -//Sets the pose bone limitmin value -static int PoseBone_setLimitMin(BPy_PoseBone *self, PyObject *value, void *closure) -{ - float newlimitmin[3]; - int x; - Object *obj = NULL; - if(!PySequence_Check(value)){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Argument is not a sequence"); - } - if (PySequence_Size(value) !=3){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Argument size must be 3"); - } - newlimitmin[0]=0.0f; - newlimitmin[1]=0.0f; - newlimitmin[2]=0.0f; - for (x = 0; x<3;x++){ - PyObject *item; - item = PySequence_GetItem(value, x); //new reference - if (PyFloat_Check(item)){ - newlimitmin[x] = (float)PyFloat_AsDouble(item); - }else if (PyInt_Check(item)){ - newlimitmin[x] = (float)PyInt_AsLong(item); - } - Py_DECREF(item); - } - obj = Object_FromPoseChannel(self->posechannel); - if (obj==NULL){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Bone data is not found"); - } - if(!pose_channel_in_IK_chain(obj, self->posechannel)){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Bone is not part of an IK chain"); - } - if ((self->posechannel->ikflag & BONE_IK_NO_XDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_XLIMIT)) { - self->posechannel->limitmin[0] = EXPP_ClampFloat(newlimitmin[0], -180.0f, 0.0f); - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_YDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_YLIMIT)) { - self->posechannel->limitmin[1] = EXPP_ClampFloat(newlimitmin[1], -180.0f, 0.0f); - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_ZDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_ZLIMIT)) { - self->posechannel->limitmin[2] = EXPP_ClampFloat(newlimitmin[2], -180.0f, 0.0f); - } - } - DAG_object_flush_update(G.scene, obj, OB_RECALC_DATA); - return 0; -} - -//------------------------PoseBone.limitmax (getter) -//Gets the pose bone limitmax value -static PyObject *PoseBone_getLimitMax(BPy_PoseBone *self, void *closure) -{ - float mylimitmax[3]; - Object *obj = NULL; - - obj = Object_FromPoseChannel(self->posechannel); - if (obj==NULL){ - return EXPP_ReturnPyObjError(PyExc_AttributeError, "Bone data is not found"); - } - mylimitmax[0]=0.0f; - mylimitmax[1]=0.0f; - mylimitmax[2]=0.0f; - if(pose_channel_in_IK_chain(obj, self->posechannel)){ - if ((self->posechannel->ikflag & BONE_IK_NO_XDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_XLIMIT)) { - mylimitmax[0] = self->posechannel->limitmax[0]; - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_YDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_YLIMIT)) { - mylimitmax[1] = self->posechannel->limitmax[1]; - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_ZDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_ZLIMIT)) { - mylimitmax[2] = self->posechannel->limitmax[2]; - } - } - } - return newVectorObject(mylimitmax, 3, Py_NEW); -} -//------------------------PoseBone.limitmax (setter) -//Sets the pose bone limitmax value -static int PoseBone_setLimitMax(BPy_PoseBone *self, PyObject *value, void *closure) -{ - float newlimitmax[3]; - int x; - Object *obj = NULL; - if(!PySequence_Check(value)){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Argument is not a sequence"); - } - if (PySequence_Size(value) !=3){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Argument size must be 3"); - } - newlimitmax[0]=0.0f; - newlimitmax[1]=0.0f; - newlimitmax[2]=0.0f; - for (x = 0; x<3;x++){ - PyObject *item; - item = PySequence_GetItem(value, x); //new reference - if (PyFloat_Check(item)){ - newlimitmax[x] = (float)PyFloat_AsDouble(item); - }else if (PyInt_Check(item)){ - newlimitmax[x] = (float)PyInt_AsLong(item); - } - Py_DECREF(item); - } - obj = Object_FromPoseChannel(self->posechannel); - if (obj==NULL){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Bone data is not found"); - } - if(!pose_channel_in_IK_chain(obj, self->posechannel)){ - return EXPP_ReturnIntError(PyExc_AttributeError, "Bone is not part of an IK chain"); - } - if ((self->posechannel->ikflag & BONE_IK_NO_XDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_XLIMIT)) { - self->posechannel->limitmax[0] = EXPP_ClampFloat(newlimitmax[0], 0.0f, 180.0f); - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_YDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_YLIMIT)) { - self->posechannel->limitmax[1] = EXPP_ClampFloat(newlimitmax[1], 0.0f, 180.0f); - } - } - if ((self->posechannel->ikflag & BONE_IK_NO_ZDOF)==0) { - if ((self->posechannel->ikflag & BONE_IK_ZLIMIT)) { - self->posechannel->limitmax[2] = EXPP_ClampFloat(newlimitmax[2], 0.0f, 180.0f); - } - } - DAG_object_flush_update(G.scene, obj, OB_RECALC_DATA); - return 0; -} -//------------------------PoseBone.head (getter) -//Gets the pose head position -static PyObject *PoseBone_getHead(BPy_PoseBone *self, void *closure) -{ - return newVectorObject(self->posechannel->pose_head, 3, Py_NEW); -} -//------------------------PoseBone.head (setter) -//Sets the pose head position -static int PoseBone_setHead(BPy_PoseBone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".head: ", "not able to set this property"); -} -//------------------------PoseBone.tail (getter) -//Gets the pose tail position -static PyObject *PoseBone_getTail(BPy_PoseBone *self, void *closure) -{ - return newVectorObject(self->posechannel->pose_tail, 3, Py_NEW); -} -//------------------------PoseBone.tail (setter) -//Sets the pose tail position -static int PoseBone_setTail(BPy_PoseBone *self, PyObject *value, void *closure) -{ - return EXPP_intError(PyExc_AttributeError, "%s%s%s", - sPoseBoneError, ".tail: ", "not able to set this property"); -} -//------------------------PoseBone.sel (getter) -//Gets the pose bones selection -static PyObject *PoseBone_getSelect(BPy_PoseBone *self, void *closure) -{ - if (self->posechannel->bone->flag & BONE_SELECTED) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} -//------------------------PoseBone.sel (setter) -//Sets the pose bones selection -static int PoseBone_setSelect(BPy_PoseBone *self, PyObject *value, void *closure) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if ( param ) - self->posechannel->bone->flag |= BONE_SELECTED; - else - self->posechannel->bone->flag &= ~(BONE_SELECTED | BONE_ACTIVE); - return 0; -} - - -//------------------------PoseBone.parent (getter) -//Gets the bones parent if any -static PyObject *PoseBone_getParent(BPy_PoseBone *self, void *closure) -{ - if (self->posechannel->parent) - return PyPoseBone_FromPosechannel(self->posechannel->parent); - else - Py_RETURN_NONE; -} - -//------------------------PoseBone.displayObject (getter) -//Gets the pose bones object used for display -static PyObject *PoseBone_getDisplayObject(BPy_PoseBone *self, void *closure) -{ - if (self->posechannel->custom) - return Object_CreatePyObject(self->posechannel->custom); - else - Py_RETURN_NONE; -} - -//------------------------PoseBone.displayObject (setter) -//Sets the pose bones object used for display -static int PoseBone_setDisplayObject(BPy_PoseBone *self, PyObject *value, void *closure) -{ - return GenericLib_assignData(value, (void **) &self->posechannel->custom, 0, 0, ID_OB, 0); -} - -//------------------------PoseBone.hasIK (getter) -//Returns True/False if the bone has IK's -static PyObject *PoseBone_hasIK(BPy_PoseBone *self, void *closure) -{ - Object *obj = NULL; - - obj = Object_FromPoseChannel(self->posechannel); - if (obj==NULL) - Py_RETURN_FALSE; - - if( pose_channel_in_IK_chain(obj, self->posechannel) ) - Py_RETURN_TRUE; - - Py_RETURN_FALSE; -} - -//------------------------PoseBone.stretch (getter) -//Gets the pose bones IK Stretch value -static PyObject *PoseBone_getStretch(BPy_PoseBone *self, void *closure) -{ - return PyFloat_FromDouble( self->posechannel->ikstretch ); -} - -//------------------------PoseBone.stretch (setter) -//Sets the pose bones IK Stretch value -static int PoseBone_setStretch(BPy_PoseBone *self, PyObject *value, void *closure) -{ - float ikstretch; - - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - - ikstretch = (float)PyFloat_AsDouble(value); - if (ikstretch<0) ikstretch = 0.0; - if (ikstretch>1) ikstretch = 1.0; - self->posechannel->ikstretch = ikstretch; - return 0; -} - -//------------------------PoseBone.stiffX/Y/Z (getter) -//Gets the pose bones IK stiffness -static PyObject *PoseBone_getStiff(BPy_PoseBone *self, void *axis) -{ - return PyFloat_FromDouble( self->posechannel->stiffness[(int)axis] ); -} - -//------------------------PoseBone.stiffX/Y/Z (setter) -//Sets the pose bones IK stiffness -static int PoseBone_setStiff(BPy_PoseBone *self, PyObject *value, void *axis) -{ - float stiff; - - if( !PyNumber_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected float argument" ); - - stiff = (float)PyFloat_AsDouble(value); - if (stiff<0) stiff = 0; - if (stiff>0.990) stiff = 0.990f; - self->posechannel->stiffness[(int)axis] = stiff; - return 0; -} - -//------------------------PoseBone.* (getter) -//Gets the pose bones flag -/* -static PyObject *PoseBone_getFlag(BPy_PoseBone *self, void *flag) -{ - if (self->posechannel->flag & (int)flag) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; - -} -*/ - -//------------------------PoseBone.* (setter) -//Gets the pose bones flag -/* -static int PoseBone_setFlag(BPy_PoseBone *self, PyObject *value, void *flag) -{ - if ( PyObject_IsTrue(value) ) - self->posechannel->flag |= (int)flag; - else - self->posechannel->flag &= ~(int)flag; - return 0; -} -*/ - -//------------------------PoseBone.* (getter) -//Gets the pose bones ikflag -static PyObject *PoseBone_getIKFlag(BPy_PoseBone *self, void *flag) -{ - if (self->posechannel->ikflag & (int)flag) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; - -} - -//------------------------PoseBone.* (setter) -//Sets the pose bones ikflag -static int PoseBone_setIKFlag(BPy_PoseBone *self, PyObject *value, void *flag) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if ( param ) - self->posechannel->ikflag |= (int)flag; - else - self->posechannel->ikflag &= ~(int)flag; - return 0; -} - -//------------------------Bone.layerMask (get) -static PyObject *PoseBone_getLayerMask(BPy_PoseBone *self) -{ - /* do this extra stuff because the short's bits can be negative values */ - unsigned short laymask = 0; - laymask |= self->posechannel->bone->layer; - return PyInt_FromLong((int)laymask); -} -//------------------------Bone.layerMask (set) -static int PoseBone_setLayerMask(BPy_PoseBone *self, PyObject *value) -{ - int laymask; - if (!PyInt_Check(value)) { - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected an integer (bitmask) as argument" ); - } - - laymask = PyInt_AsLong(value); - - if (laymask <= 0 || laymask > (1<<16) - 1) - return EXPP_ReturnIntError( PyExc_AttributeError, - "bitmask must have from 1 up to 16 bits set"); - - self->posechannel->bone->layer = 0; - self->posechannel->bone->layer |= laymask; - - return 0; -} - -//------------------TYPE_OBECT IMPLEMENTATION--------------------------- -//------------------------tp_getset -//This contains methods for attributes that require checking -static PyGetSetDef BPy_PoseBone_getset[] = { - {"name", (getter)PoseBone_getName, (setter)PoseBone_setName, - "The pose bone's name", NULL}, - {"loc", (getter)PoseBone_getLoc, (setter)PoseBone_setLoc, - "The pose bone's change in location as a vector", NULL}, - {"size", (getter)PoseBone_getSize, (setter)PoseBone_setSize, - "The pose bone's change in size as a vector", NULL}, - {"quat", (getter)PoseBone_getQuat, (setter)PoseBone_setQuat, - "The pose bone's change in rotation as a quat", NULL}, - {"localMatrix", (getter)PoseBone_getLocalMatrix, (setter)PoseBone_setLocalMatrix, - "The pose bone's change matrix built from the quat, loc, and size", NULL}, - {"poseMatrix", (getter)PoseBone_getPoseMatrix, (setter)PoseBone_setPoseMatrix, - "The pose bone's matrix", NULL}, - {"head", (getter)PoseBone_getHead, (setter)PoseBone_setHead, - "The pose bone's head positon", NULL}, - {"tail", (getter)PoseBone_getTail, (setter)PoseBone_setTail, - "The pose bone's tail positon", NULL}, - {"sel", (getter)PoseBone_getSelect, (setter)PoseBone_setSelect, - "The pose selection state", NULL}, - {"limitMin", (getter)PoseBone_getLimitMin, (setter)PoseBone_setLimitMin, - "The pose bone dof min", NULL}, - {"limitMax", (getter)PoseBone_getLimitMax, (setter)PoseBone_setLimitMax, - "The pose bone dof max", NULL}, - {"constraints", (getter)PoseBone_getConstraints, (setter)NULL, - "The list of contraints that pertain to this pose bone", NULL}, - {"parent", (getter)PoseBone_getParent, (setter)NULL, - "The bones parent (read only for posebones)", NULL}, - {"displayObject", (getter)PoseBone_getDisplayObject, (setter)PoseBone_setDisplayObject, - "The poseMode object to draw in place of this bone", NULL}, - - {"hasIK", (getter)PoseBone_hasIK, (setter)NULL, - "True if the pose bone has IK (readonly)", NULL }, - - {"stretch", (getter)PoseBone_getStretch, (setter)PoseBone_setStretch, - "Stretch the bone to the IK Target", NULL }, - - {"stiffX", (getter)PoseBone_getStiff, (setter)PoseBone_setStiff, - "bones stiffness on the X axis", (void *)0 }, - {"stiffY", (getter)PoseBone_getStiff, (setter)PoseBone_setStiff, - "bones stiffness on the Y axis", (void *)1 }, - {"stiffZ", (getter)PoseBone_getStiff, (setter)PoseBone_setStiff, - "bones stiffness on the Z axis", (void *)2 }, - - {"limitX", (getter)PoseBone_getIKFlag, (setter)PoseBone_setIKFlag, - "limit rotation over X axis when part of an IK", (void *)BONE_IK_XLIMIT }, - {"limitY", (getter)PoseBone_getIKFlag, (setter)PoseBone_setIKFlag, - "limit rotation over Y axis when part of an IK", (void *)BONE_IK_YLIMIT }, - {"limitZ", (getter)PoseBone_getIKFlag, (setter)PoseBone_setIKFlag, - "limit rotation over Z axis when part of an IK", (void *)BONE_IK_ZLIMIT }, - - {"lockXRot", (getter)PoseBone_getIKFlag, (setter)PoseBone_setIKFlag, - "disable X DoF when part of an IK", (void *)BONE_IK_NO_XDOF }, - {"lockYRot", (getter)PoseBone_getIKFlag, (setter)PoseBone_setIKFlag, - "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 -//This tells how to 'tear-down' our object when ref count hits 0 -static void PoseBone_dealloc(BPy_PoseBone *self) -{ - PoseBone_Type.tp_free(self); - return; -} -//------------------------tp_repr -//This is the string representation of the object -static PyObject *PoseBone_repr(BPy_PoseBone *self) -{ - return PyString_FromFormat( "[PoseBone \"%s\"]", self->posechannel->name); -} -//------------------------tp_doc -//The __doc__ string for this object -static char BPy_PoseBone_doc[] = "This object wraps a Blender PoseBone object."; - -//------------------TYPE_OBECT DEFINITION-------------------------- -PyTypeObject PoseBone_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "PoseBone", //tp_name - sizeof(BPy_PoseBone), //tp_basicsize - 0, //tp_itemsize - (destructor)PoseBone_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - 0, //tp_compare - (reprfunc)PoseBone_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - 0, //tp_as_mapping - 0, //tp_hash - 0, //tp_call - 0, //tp_str - 0, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT, //tp_flags - BPy_PoseBone_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - 0, //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_PoseBone_methods, //tp_methods - 0, //tp_members - BPy_PoseBone_getset, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - 0, //tp_init - 0, //tp_alloc - 0, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; -//-------------------MODULE METHODS IMPLEMENTATION------------------------ -//-------------------MODULE METHODS DEFINITION----------------------------- -struct PyMethodDef M_Pose_methods[] = { - {NULL, NULL, 0, NULL} -}; -//-------------------MODULE INITIALIZATION-------------------------------- -PyObject *Pose_Init(void) -{ - PyObject *module; - - //Initializes TypeObject.ob_type - if (PyType_Ready(&Pose_Type) < 0 || PyType_Ready(&PoseBone_Type) < 0 || - PyType_Ready(&PoseBonesDict_Type) < 0) { - Py_RETURN_NONE; - } - - //Register the module - module = Py_InitModule3("Blender.Object.Pose", M_Pose_methods, - "The Blender Pose module"); - - //Add TYPEOBJECTS to the module - PyModule_AddObject(module, "Pose", - EXPP_incr_ret((PyObject *)&Pose_Type)); //*steals* - PyModule_AddObject(module, "PoseBone", - EXPP_incr_ret((PyObject *)&PoseBone_Type)); //*steals* - - //Add CONSTANTS to the module - PyModule_AddObject(module, "ROT", - PyConstant_NewInt("ROT", POSE_ROT)); - PyModule_AddObject(module, "LOC", - PyConstant_NewInt("LOC", POSE_LOC)); - PyModule_AddObject(module, "SIZE", - PyConstant_NewInt("SIZE", POSE_SIZE)); - - return module; -} -//------------------VISIBLE PROTOTYPE IMPLEMENTATION----------------------- -//------------------------------PyPose_FromPose (internal) -//Returns a PyPose from a bPose - return PyNone if bPose is NULL -PyObject *PyPose_FromPose(bPose *pose, char *name) -{ - BPy_Pose *py_pose = NULL; - - if (pose){ - py_pose = (BPy_Pose*)Pose_Type.tp_alloc(&Pose_Type, 0); - if (!py_pose) - goto RuntimeError; - - py_pose->pose = pose; - BLI_strncpy(py_pose->name, name, 24); - - //create armature.bones - py_pose->Bones = (BPy_PoseBonesDict*)PyPoseBonesDict_FromPyPose(py_pose); - if (!py_pose->Bones) - goto RuntimeError; - - return (PyObject*)py_pose; - }else{ - Py_RETURN_NONE; - } - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sPoseError, "PyPose_FromPose: ", "Internal Error Ocurred"); -} -//------------------------------PyPoseBone_FromPosechannel (internal) -//Returns a PyPoseBone from a bPoseChannel - return PyNone if bPoseChannel is NULL -PyObject *PyPoseBone_FromPosechannel(bPoseChannel *pchan) -{ - BPy_PoseBone *py_posechannel = NULL; - - if (pchan){ - py_posechannel = (BPy_PoseBone*)PoseBone_Type.tp_alloc(&PoseBone_Type, 0); - if (!py_posechannel) - goto RuntimeError; - py_posechannel->posechannel = pchan; - return (PyObject*)py_posechannel; - }else{ - Py_RETURN_NONE; - } - -RuntimeError: - return EXPP_objError(PyExc_RuntimeError, "%s%s%s", - sPoseBoneError, "PyPoseBone_FromPosechannel: ", "Internal Error Ocurred"); -} -//------------------------------Object_FromPoseChannel (internal) -//An ugly method for determining where the pchan chame from -Object *Object_FromPoseChannel(bPoseChannel *curr_pchan) -{ - int success = 0; - Object *obj = NULL; - bPoseChannel *pchan = NULL; - for(obj = G.main->object.first; obj; obj = obj->id.next){ - if (obj->pose){ - for (pchan = obj->pose->chanbase.first; pchan; pchan = pchan->next){ - if (curr_pchan == pchan){ - success = 1; - break; - } - } - if (success) - break; - } - } - return obj; -} diff --git a/source/blender/python/api2_2x/Pose.h b/source/blender/python/api2_2x/Pose.h deleted file mode 100644 index 17a9f871ee3..00000000000 --- a/source/blender/python/api2_2x/Pose.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * $Id: - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * Contributor(s): Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_POSE_H -#define EXPP_POSE_H - -#include -#include "DNA_action_types.h" -#include "DNA_object_types.h" - -//-------------------TYPE CHECKS--------------------------------- -#define BPy_Pose_Check(v) ((v)->ob_type == &Pose_Type) -#define BPy_PoseBone_Check(v) ((v)->ob_type == &PoseBone_Type) -#define BPy_PoseBonesDict_Check(v) ((v)->ob_type == &PoseBonesDict_Type) -//-------------------TYPEOBJECT---------------------------------- -extern PyTypeObject Pose_Type; -extern PyTypeObject PoseBone_Type; -extern PyTypeObject PoseBonesDict_Type; -//-------------------STRUCT DEFINITION---------------------------- -typedef struct { - PyObject_HEAD - PyObject *bonesMap; - ListBase *bones; -} BPy_PoseBonesDict; - -typedef struct { - PyObject_HEAD - bPose *pose; - char name[24]; //because poses have not names :( - BPy_PoseBonesDict *Bones; -} BPy_Pose; - -typedef struct { - PyObject_HEAD - bPoseChannel *posechannel; - -} BPy_PoseBone; - -//-------------------VISIBLE PROTOTYPES------------------------- -PyObject *Pose_Init(void); -PyObject *PyPose_FromPose(bPose *pose, char *name); -PyObject *PyPoseBone_FromPosechannel(bPoseChannel *pchan); -Object *Object_FromPoseChannel(bPoseChannel *curr_pchan); -#endif diff --git a/source/blender/python/api2_2x/Registry.c b/source/blender/python/api2_2x/Registry.c deleted file mode 100644 index 4eb4fd93294..00000000000 --- a/source/blender/python/api2_2x/Registry.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * $Id: Registry.c 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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Registry.h" /*This must come first */ - -#include "BKE_global.h" -#include "gen_utils.h" - - -/* the Registry dictionary */ -PyObject *bpy_registryDict = NULL; - -/*****************************************************************************/ -/* Python API function prototypes for the Registry module. */ -/*****************************************************************************/ -static PyObject *M_Registry_Keys( PyObject * self ); -static PyObject *M_Registry_GetKey( PyObject * self, PyObject * args ); -static PyObject *M_Registry_SetKey( PyObject * self, PyObject * args ); -static PyObject *M_Registry_RemoveKey( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Registry.__doc__ */ -/*****************************************************************************/ -char M_Registry_doc[] = - "The Blender Registry module (persistent data cache)\n\n\ - Use this module to store configuration data that a script can reload\n\ - when it is executed again.\n"; - -char M_Registry_Keys_doc[] = - "() - Get all keys in the Registry dictionary.\n\n\ - Each key references another dict with saved data from a specific script.\n"; - -char M_Registry_GetKey_doc[] = - "(name, disk = False) - Get an entry (a dict) from the Registry dictionary\n\ - (name) - a string that references a specific script;\n\ - (disk = False) - search on the user (if available) or default scripts config\n\ -data dir.\n"; - -char M_Registry_SetKey_doc[] = - "(key, dict, disk = False) - Store an entry in the Registry dictionary.\n\ - If an entry with the same 'key' already exists, it is substituted.\n\ - (key) - the string to use as a key for the dict being saved.\n\ - (dict) - a dictionary with the data to be stored.\n\ - (disk = False) - also write data as a config file inside the user (if\n\ -available) or default scripts config data dir.\n"; - -char M_Registry_RemoveKey_doc[] = - "(key, disk = False) - Remove the dict with key 'key' from the Registry.\n\ - (key) - the name of the key to delete;\n\ - (disk = False) - if True the respective config file is also deleted.\n"; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Registry module: */ -/*****************************************************************************/ -struct PyMethodDef M_Registry_methods[] = { - {"Keys", ( PyCFunction ) M_Registry_Keys, METH_VARARGS, - M_Registry_Keys_doc}, - {"GetKey", M_Registry_GetKey, METH_VARARGS, M_Registry_GetKey_doc}, - {"SetKey", M_Registry_SetKey, METH_VARARGS, M_Registry_SetKey_doc}, - {"RemoveKey", M_Registry_RemoveKey, METH_VARARGS, - M_Registry_RemoveKey_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Function: M_Registry_Keys */ -/* Python equivalent: Blender.Registry.Keys */ -/*****************************************************************************/ -PyObject *M_Registry_Keys( PyObject * self ) -{ - PyObject *pydict = NULL; - - if( !bpy_registryDict ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "No Registry dictionary found!" ); - - pydict = PyDict_Keys( bpy_registryDict ); - - if( !pydict ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Registry_Keys: couldn't get keys" ); - - return pydict; -} - -/*****************************************************************************/ -/* Function: M_Registry_GetKey */ -/* Python equivalent: Blender.Registry.GetKey */ -/*****************************************************************************/ -static PyObject *M_Registry_GetKey( PyObject * self, PyObject * args ) -{ - PyObject *pyentry = NULL; - PyObject *pydict = NULL; - int disk = 0; - - if( !bpy_registryDict ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "No Registry dictionary found!" ); - - if( !PyArg_ParseTuple( args, "O!|i", &PyString_Type, &pyentry, &disk ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected a string and optionally a bool" ); - - pydict = PyDict_GetItem( bpy_registryDict, pyentry ); /* borrowed ... */ - - if (!pydict) { - if (disk > 0) { - /* try to get data from disk */ - char buf[256]; - PyOS_snprintf(buf, sizeof(buf), - "import Blender, BPyRegistry; BPyRegistry.LoadConfigData('%s')", - PyString_AsString(pyentry)); - if (!PyRun_SimpleString(buf)) - pydict = PyDict_GetItem(bpy_registryDict, pyentry); - else PyErr_Clear(); - } - - if (!pydict) /* no need to return a KeyError, since without doubt */ - pydict = Py_None; /* Py_None means no key (all valid keys are dicts) */ - } - - return EXPP_incr_ret (pydict); /* ... so we incref it */ -} - -/*****************************************************************************/ -/* Function: M_Registry_SetKey */ -/* Python equivalent: Blender.Registry.SetKey */ -/*****************************************************************************/ -static PyObject *M_Registry_SetKey( PyObject * self, PyObject * args ) -{ - PyObject *pystr = NULL; - PyObject *pydict = NULL; - int disk = 0; - - if( !bpy_registryDict ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "No Registry dictionary found!" ); - - if( !PyArg_ParseTuple( args, "O!O!|i", - &PyString_Type, &pystr, &PyDict_Type, - &pydict, &disk ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected a string and a dictionary" ); - - if( PyDict_SetItem( bpy_registryDict, pystr, pydict ) ) /* 0 on success */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Registry_SetKey: couldn't update the Registry dict" ); - - if (disk) { - /* try to save data to disk */ - char buf[256]; - PyOS_snprintf(buf, sizeof(buf), - "import Blender, BPyRegistry; BPyRegistry.SaveConfigData('%s')", - PyString_AsString(pystr)); - if (PyRun_SimpleString(buf) != 0) { - PyErr_Clear(); - if (G.f & G_DEBUG) - fprintf(stderr, "\nCan't save script configuration data!\n"); - } - } - - Py_INCREF( Py_None ); - return Py_None; -} - -/*****************************************************************************/ -/* Function: M_Registry_RemoveKey */ -/* Python equivalent: Blender.Registry.RemoveKey */ -/*****************************************************************************/ -static PyObject *M_Registry_RemoveKey( PyObject * self, PyObject * args ) -{ - PyObject *pystr = NULL; - int disk = 0; - - if( !bpy_registryDict ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "No Registry dictionary found!" ); - - if( !PyArg_ParseTuple( args, "O!|i", &PyString_Type, &pystr, &disk ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected a string and optionally a bool" ); - - if( PyDict_DelItem( bpy_registryDict, pystr ) ) /* returns 0 on success */ - return EXPP_ReturnPyObjError( PyExc_KeyError, - "no such key in the Registry" ); - else if (disk) { - /* try to delete from disk too */ - char buf[256]; - PyOS_snprintf(buf, sizeof(buf), - "import Blender, BPyRegistry; BPyRegistry.RemoveConfigData('%s')", - PyString_AsString(pystr)); - if (PyRun_SimpleString(buf) != 0) { - PyErr_Clear(); - if (G.f & G_DEBUG) - fprintf(stderr, "\nCan't remove script configuration data file!\n"); - } - } - - Py_INCREF( Py_None ); - return Py_None; -} - -/*****************************************************************************/ -/* Function: Registry_Init */ -/*****************************************************************************/ -PyObject *Registry_Init( void ) -{ - PyObject *submodule; - - submodule = Py_InitModule3( "Blender.Registry", M_Registry_methods, - M_Registry_doc ); - - return submodule; -} diff --git a/source/blender/python/api2_2x/Registry.h b/source/blender/python/api2_2x/Registry.h deleted file mode 100644 index 58cfe65dfd0..00000000000 --- a/source/blender/python/api2_2x/Registry.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * $Id: Registry.h 3209 2004-10-07 19:25:40Z stiv $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* This submodule was introduced as a way to preserve configured data in - * scripts. A very simple idea: the script writer saves this data in a dict - * and registers this dict in the "Registry" dict. This way we can discard - * the global interpreter dictionary after a script is executed, since the - * data meant to be kept was copied to the Registry elsewhere. The current - * implementation is naive: scripts can deliberately mess with data saved by - * other scripts. This is so new script versions can delete older entries, if - * they need to. XXX Or should we block this? */ - -#ifndef EXPP_REGISTRY_H -#define EXPP_REGISTRY_H - -#include - -extern PyObject *bpy_registryDict; -PyObject *Registry_Init( void ); - -#endif /* EXPP_REGISTRY_H */ diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c deleted file mode 100644 index 397cee0ad5e..00000000000 --- a/source/blender/python/api2_2x/Scene.c +++ /dev/null @@ -1,1868 +0,0 @@ -/* - * - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Jacques Guignot, Joseph Gilbert, - * Campbell Barton, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ -struct View3D; - -#include "Scene.h" /*This must come first */ - -#include "BKE_global.h" -#include "BKE_main.h" -#include "MEM_guardedalloc.h" /* for MEM_callocN */ -#include "DNA_space_types.h" /* SPACE_VIEW3D, SPACE_SEQ */ -#include "DNA_screen_types.h" -#include "DNA_userdef_types.h" /* U.userdefs */ -#include "DNA_object_types.h" /* SceneObSeq_new */ -#include "BKE_depsgraph.h" -#include "BKE_library.h" -#include "BKE_object.h" -#include "BKE_scene.h" -#include "BKE_font.h" -#include "BKE_idprop.h" -#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" -/* only for SceneObSeq_new */ -#include "BKE_material.h" -#include "BLI_arithb.h" -#include "Armature.h" -#include "Lamp.h" -#include "Curve.h" -#include "NMesh.h" -#include "Mesh.h" -#include "World.h" -#include "Lattice.h" -#include "Metaball.h" -#include "IDProp.h" -#include "Text3d.h" -#include "Library.h" - -#include "gen_utils.h" -#include "gen_library.h" -#include "sceneRender.h" -#include "sceneRadio.h" -#include "sceneTimeLine.h" -#include "sceneSequence.h" - - -#include "BKE_utildefines.h" /* vec copy */ -#include "vector.h" - -PyObject *M_Object_Get( PyObject * self, PyObject * args ); /* from Object.c */ - -/* checks for the scene being removed */ -#define SCENE_DEL_CHECK_PY(bpy_scene) if (!(bpy_scene->scene)) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "Scene has been removed" ) ) -#define SCENE_DEL_CHECK_INT(bpy_scene) if (!(bpy_scene->scene)) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "Scene has been removed" ) ) - - -enum obj_consts { - EXPP_OBSEQ_NORMAL = 0, - EXPP_OBSEQ_SELECTED, - EXPP_OBSEQ_CONTEXT -}; - - -/*-----------------------Python API function prototypes for the Scene module--*/ -static PyObject *M_Scene_New( PyObject * self, PyObject * args, - PyObject * keywords ); -static PyObject *M_Scene_Get( PyObject * self, PyObject * args ); -static PyObject *M_Scene_GetCurrent( PyObject * self ); -static PyObject *M_Scene_getCurrent_deprecated( PyObject * self ); -static PyObject *M_Scene_Unlink( PyObject * self, PyObject * arg ); -/*-----------------------Scene module doc strings-----------------------------*/ -static char M_Scene_doc[] = "The Blender.Scene submodule"; -static char M_Scene_New_doc[] = - "(name = 'Scene') - Create a new Scene called 'name' in Blender."; -static char M_Scene_Get_doc[] = - "(name = None) - Return the scene called 'name'. If 'name' is None, return a list with all Scenes."; -static char M_Scene_GetCurrent_doc[] = - "() - Return the currently active Scene in Blender."; -static char M_Scene_Unlink_doc[] = - "(scene) - Unlink (delete) scene 'Scene' from Blender. (scene) is of type Blender scene."; -/*----------------------Scene module method def----------------------------*/ -struct PyMethodDef M_Scene_methods[] = { - {"New", ( PyCFunction ) M_Scene_New, METH_VARARGS | METH_KEYWORDS, - M_Scene_New_doc}, - {"Get", M_Scene_Get, METH_VARARGS, M_Scene_Get_doc}, - {"get", M_Scene_Get, METH_VARARGS, M_Scene_Get_doc}, - {"GetCurrent", ( PyCFunction ) M_Scene_GetCurrent, - METH_NOARGS, M_Scene_GetCurrent_doc}, - {"getCurrent", ( PyCFunction ) M_Scene_getCurrent_deprecated, - METH_NOARGS, M_Scene_GetCurrent_doc}, - {"Unlink", M_Scene_Unlink, METH_VARARGS, M_Scene_Unlink_doc}, - {"unlink", M_Scene_Unlink, METH_VARARGS, M_Scene_Unlink_doc}, - {NULL, NULL, 0, NULL} -}; -/*-----------------------BPy_Scene method declarations--------------------*/ -static PyObject *Scene_getLayerList( BPy_Scene * self ); -static PyObject *Scene_oldsetLayers( BPy_Scene * self, PyObject * arg ); -static PyObject *Scene_copy( BPy_Scene * self, PyObject * arg ); -static PyObject *Scene_makeCurrent( BPy_Scene * self ); -static PyObject *Scene_update( BPy_Scene * self, PyObject * args ); -static PyObject *Scene_link( BPy_Scene * self, PyObject * args ); -static PyObject *Scene_unlink( BPy_Scene * self, PyObject * args ); -static PyObject *Scene_getChildren( BPy_Scene * self ); -static PyObject *Scene_getActiveObject(BPy_Scene *self); -static PyObject *Scene_getCurrentCamera( BPy_Scene * self ); -static PyObject *Scene_setCurrentCamera( BPy_Scene * self, PyObject * args ); -static PyObject *Scene_getRenderingContext( BPy_Scene * self ); -static PyObject *Scene_getRadiosityContext( BPy_Scene * self ); -static PyObject *Scene_getScriptLinks( BPy_Scene * self, PyObject * value ); -static PyObject *Scene_getSequence( BPy_Scene * self ); -static PyObject *Scene_addScriptLink( BPy_Scene * self, PyObject * args ); -static PyObject *Scene_clearScriptLinks( BPy_Scene * self, PyObject * args ); -static PyObject *Scene_play( BPy_Scene * self, PyObject * args ); -static PyObject *Scene_getTimeLine( BPy_Scene * self ); - - -/*internal*/ -static int Scene_compare( BPy_Scene * a, BPy_Scene * b ); -static PyObject *Scene_repr( BPy_Scene * self ); - -/*object seq*/ -static PyObject *SceneObSeq_CreatePyObject( BPy_Scene *self, Base *iter, int mode); - -/*-----------------------BPy_Scene method def------------------------------*/ -static PyMethodDef BPy_Scene_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return Scene name"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(str) - Change Scene name"}, - {"getLayers", ( PyCFunction ) Scene_getLayerList, METH_NOARGS, - "() - Return a list of layers int indices which are set in this scene "}, - {"setLayers", ( PyCFunction ) Scene_oldsetLayers, METH_VARARGS, - "(layers) - Change layers which are set in this scene\n" - "(layers) - list of integers in the range [1, 20]."}, - {"copy", ( PyCFunction ) Scene_copy, METH_VARARGS, - "(duplicate_objects = 1) - Return a copy of this scene\n" - "The optional argument duplicate_objects defines how the scene\n" - "children are duplicated:\n\t0: Link Objects\n\t1: Link Object Data" - "\n\t2: Full copy\n"}, - {"makeCurrent", ( PyCFunction ) Scene_makeCurrent, METH_NOARGS, - "() - Make self the current scene"}, - {"update", ( PyCFunction ) Scene_update, METH_VARARGS, - "(full = 0) - Update scene self.\n" - "full = 0: sort the base list of objects." - "full = 1: full update -- also regroups, does ipos, keys"}, - {"link", ( PyCFunction ) Scene_link, METH_VARARGS, - "(obj) - Link Object obj to this scene"}, - {"unlink", ( PyCFunction ) Scene_unlink, METH_VARARGS, - "(obj) - Unlink Object obj from this scene"}, - {"getChildren", ( PyCFunction ) Scene_getChildren, METH_NOARGS, - "() - Return list of all objects linked to this scene"}, - {"getActiveObject", (PyCFunction)Scene_getActiveObject, METH_NOARGS, - "() - Return this scene's active object"}, - {"getCurrentCamera", ( PyCFunction ) Scene_getCurrentCamera, - METH_NOARGS, - "() - Return current active Camera"}, - {"getScriptLinks", ( PyCFunction ) Scene_getScriptLinks, METH_O, - "(eventname) - Get a list of this scene's scriptlinks (Text names) " - "of the given type\n" - "(eventname) - string: FrameChanged, OnLoad, OnSave, Redraw or Render."}, - {"addScriptLink", ( PyCFunction ) Scene_addScriptLink, METH_VARARGS, - "(text, evt) - Add a new scene scriptlink.\n" - "(text) - string: an existing Blender Text name;\n" - "(evt) string: FrameChanged, OnLoad, OnSave, Redraw or Render."}, - {"clearScriptLinks", ( PyCFunction ) Scene_clearScriptLinks, - METH_VARARGS, - "() - Delete all scriptlinks from this scene.\n" - "([s1<,s2,s3...>]) - Delete specified scriptlinks from this scene."}, - {"setCurrentCamera", ( PyCFunction ) Scene_setCurrentCamera, - METH_VARARGS, - "() - Set the currently active Camera"}, - {"getRenderingContext", ( PyCFunction ) Scene_getRenderingContext, - METH_NOARGS, - "() - Get the rendering context for the scene and return it as a BPy_RenderData"}, - {"getRadiosityContext", ( PyCFunction ) Scene_getRadiosityContext, - METH_NOARGS, - "() - Get the radiosity context for this scene."}, - {"play", ( PyCFunction ) Scene_play, METH_VARARGS, - "(mode = 0, win = VIEW3D) - Play realtime animation in Blender" - " (not rendered).\n" - "(mode) - int:\n" - "\t0 - keep playing in biggest given 'win';\n" - "\t1 - keep playing in all 'win', VIEW3D and SEQ windows;\n" - "\t2 - play once in biggest given 'win';\n" - "\t3 - play once in all 'win', VIEW3D and SEQ windows.\n" - "(win) - int: see Blender.Window.Types. Only these are meaningful here:" - "VIEW3D, SEQ, IPO, ACTION, NLA, SOUND. But others are also accepted, " - "since they can be used just as an interruptible timer. If 'win' is not" - "available or invalid, VIEW3D is tried, then any bigger window." - "Returns 0 for normal exit or 1 when canceled by user input."}, - {"getTimeLine", ( PyCFunction ) Scene_getTimeLine, METH_NOARGS, - "() - Get time line of this Scene"}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Python BPy_Scene getsetattr funcs: */ -/*****************************************************************************/ -static PyObject *Scene_getLayerMask( BPy_Scene * self ) -{ - SCENE_DEL_CHECK_PY(self); - return PyInt_FromLong( self->scene->lay & ((1<<20)-1) ); -} - -static int Scene_setLayerMask( BPy_Scene * self, PyObject * value ) -{ - int laymask = 0; - - SCENE_DEL_CHECK_INT(self); - - if (!PyInt_Check(value)) { - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected an integer (bitmask) as argument" ); - } - - laymask = PyInt_AsLong(value); - - if (laymask <= 0 || laymask > (1<<20) - 1) /* binary: 1111 1111 1111 1111 1111 */ - return EXPP_ReturnIntError( PyExc_AttributeError, - "bitmask must have from 1 up to 20 bits set"); - - self->scene->lay = laymask; - /* if this is the current scene then apply the scene layers value - * to the view layers value: */ - if (G.vd && (self->scene == G.scene)) { - int val, bit = 0; - G.vd->lay = laymask; - - while( bit < 20 ) { - val = 1 << bit; - if( laymask & val ) { - G.vd->layact = val; - break; - } - bit++; - } - } - - return 0; -} - -static PyObject *Scene_getLayerList( BPy_Scene * self ) -{ - PyObject *laylist, *item; - int layers, bit = 0, val = 0; - - SCENE_DEL_CHECK_PY(self); - - laylist = PyList_New( 0 ); - - if( !laylist ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create pylist!" ) ); - - layers = self->scene->lay; - - while( bit < 20 ) { - val = 1 << bit; - if( layers & val ) { - item = Py_BuildValue( "i", bit + 1 ); - PyList_Append( laylist, item ); - Py_DECREF( item ); - } - bit++; - } - return laylist; -} - -static int Scene_setLayerList( BPy_Scene * self, PyObject * value ) -{ - PyObject *item = NULL; - int layers = 0, val, i, len_list; - - SCENE_DEL_CHECK_INT(self); - - if( !PySequence_Check( value ) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of integers in the range [1, 20]" ) ); - - len_list = PySequence_Size(value); - - if (len_list == 0) - return ( EXPP_ReturnIntError( PyExc_AttributeError, - "list can't be empty, at least one layer must be set" ) ); - - for( i = 0; i < len_list; i++ ) { - item = PySequence_GetItem( value, i ); - - if( !PyInt_Check( item ) ) { - Py_DECREF( item ); - return EXPP_ReturnIntError - ( PyExc_AttributeError, - "list must contain only integer numbers" ); - } - - val = ( int ) PyInt_AsLong( item ); - if( val < 1 || val > 20 ) - return EXPP_ReturnIntError - ( PyExc_AttributeError, - "layer values must be in the range [1, 20]" ); - - layers |= 1 << ( val - 1 ); - } - self->scene->lay = layers; - - if (G.vd && (self->scene == G.scene)) { - int bit = 0; - G.vd->lay = layers; - - while( bit < 20 ) { - val = 1 << bit; - if( layers & val ) { - G.vd->layact = val; - break; - } - bit++; - } - } - - return 0; -} - -static PyObject *Scene_getWorld( BPy_Scene * self ) -{ - SCENE_DEL_CHECK_PY(self); - - if (!self->scene->world) - Py_RETURN_NONE; - return World_CreatePyObject(self->scene->world); -} - -static int Scene_setWorld( BPy_Scene * self, PyObject * value ) -{ - SCENE_DEL_CHECK_INT(self); - return GenericLib_assignData(value, (void **) &self->scene->world, NULL, 1, ID_WO, 0); -} - -/* accessed from scn.objects */ -static PyObject *Scene_getObjects( BPy_Scene *self) -{ - SCENE_DEL_CHECK_PY(self); - return SceneObSeq_CreatePyObject(self, NULL, 0); -} - -static PyObject *Scene_getCursor( BPy_Scene * self ) -{ - SCENE_DEL_CHECK_PY(self); - return newVectorObject( self->scene->cursor, 3, Py_WRAP ); -} - -static int Scene_setCursor( BPy_Scene * self, PyObject * value ) -{ - VectorObject *bpy_vec; - SCENE_DEL_CHECK_INT(self); - if (!VectorObject_Check(value)) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected a vector" ) ); - - bpy_vec = (VectorObject *)value; - - if (bpy_vec->size != 3) - return ( EXPP_ReturnIntError( PyExc_ValueError, - "can only assign a 3D vector" ) ); - - VECCOPY(self->scene->cursor, bpy_vec->vec); - return 0; -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Scene_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"Layers", - (getter)Scene_getLayerMask, (setter)Scene_setLayerMask, - "Scene layer bitmask", - NULL}, - {"layers", - (getter)Scene_getLayerList, (setter)Scene_setLayerList, - "Scene layer list", - NULL}, - {"world", - (getter)Scene_getWorld, (setter)Scene_setWorld, - "Scene layer bitmask", - NULL}, - {"cursor", - (getter)Scene_getCursor, (setter)Scene_setCursor, - "Scene layer bitmask", - NULL}, - {"timeline", - (getter)Scene_getTimeLine, (setter)NULL, - "Scenes timeline (read only)", - NULL}, - {"render", - (getter)Scene_getRenderingContext, (setter)NULL, - "Scenes rendering context (read only)", - NULL}, - {"radiosity", - (getter)Scene_getRadiosityContext, (setter)NULL, - "Scenes radiosity context (read only)", - NULL}, - {"sequence", - (getter)Scene_getSequence, (setter)NULL, - "Scene sequencer data (read only)", - NULL}, - - {"objects", - (getter)Scene_getObjects, (setter)NULL, - "Scene object iterator", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - - -/*-----------------------BPy_Scene method def------------------------------*/ -PyTypeObject Scene_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "Scene", /* tp_name */ - sizeof( BPy_Scene ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) Scene_compare, /* tp_compare */ - ( reprfunc ) Scene_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Scene_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Scene_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 -}; - -/*-----------------------Scene module Init())-----------------------------*/ -PyObject *Scene_Init( void ) -{ - - PyObject *submodule; - PyObject *dict; - - if( PyType_Ready( &Scene_Type ) < 0 ) - return NULL; - if( PyType_Ready( &SceneObSeq_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Scene", M_Scene_methods, M_Scene_doc ); - - dict = PyModule_GetDict( submodule ); - PyDict_SetItemString( dict, "Render", Render_Init( ) ); - PyDict_SetItemString( dict, "Radio", Radio_Init( ) ); - PyDict_SetItemString( dict, "Sequence", Sequence_Init( ) ); - - return submodule; -} - -/*-----------------------compare----------------------------------------*/ -static int Scene_compare( BPy_Scene * a, BPy_Scene * b ) -{ - return ( a->scene == b->scene ) ? 0 : -1; -} - -/*----------------------repr--------------------------------------------*/ -static PyObject *Scene_repr( BPy_Scene * self ) -{ - if( !(self->scene) ) - return PyString_FromString( "[Scene - Removed]"); - else - return PyString_FromFormat( "[Scene \"%s\"]", - self->scene->id.name + 2 ); -} - -/*-----------------------CreatePyObject---------------------------------*/ -PyObject *Scene_CreatePyObject( Scene * scene ) -{ - BPy_Scene *pyscene; - - pyscene = ( BPy_Scene * ) PyObject_NEW( BPy_Scene, &Scene_Type ); - - if( !pyscene ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Scene object" ); - - pyscene->scene = scene; - - return ( PyObject * ) pyscene; -} - -/*-----------------------FromPyObject-----------------------------------*/ -Scene *Scene_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Scene * ) pyobj )->scene; -} - -/*-----------------------Scene module function defintions---------------*/ -/*-----------------------Scene.New()------------------------------------*/ -static PyObject *M_Scene_New( PyObject * self, PyObject * args, - PyObject * kword ) -{ - char *name = "Scene"; - char *kw[] = { "name", NULL }; - PyObject *pyscene; /* for the Scene object wrapper in Python */ - Scene *blscene; /* for the actual Scene we create in Blender */ - - if( !PyArg_ParseTupleAndKeywords( args, kword, "|s", kw, &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected a string or an empty argument list" ) ); - - blscene = add_scene( name ); /* first create the Scene in Blender */ - - if( blscene ) { - /* normally, for most objects, we set the user count to zero here. - * Scene is different than most objs since it is the container - * for all the others. Since add_scene() has already set - * the user count to one, we leave it alone. - */ - - /* now create the wrapper obj in Python */ - pyscene = Scene_CreatePyObject( blscene ); - } else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Scene obj in Blender" ) ); - - if( pyscene == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Scene PyObject" ) ); - - return pyscene; -} - -/*-----------------------Scene.Get()------------------------------------*/ -static PyObject *M_Scene_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Scene *scene_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - scene_iter = G.main->scene.first; - - if( name ) { /* (name) - Search scene by name */ - - PyObject *wanted_scene = NULL; - - while( ( scene_iter ) && ( wanted_scene == NULL ) ) { - - if( strcmp( name, scene_iter->id.name + 2 ) == 0 ) - wanted_scene = - Scene_CreatePyObject( scene_iter ); - - scene_iter = scene_iter->id.next; - } - - if( wanted_scene == NULL ) { /* Requested scene doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Scene \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return wanted_scene; - } - - else { /* () - return a list with wrappers for all scenes in Blender */ - int index = 0; - PyObject *sce_pylist, *pyobj; - - sce_pylist = PyList_New( BLI_countlist( &( G.main->scene ) ) ); - - if( sce_pylist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( scene_iter ) { - pyobj = Scene_CreatePyObject( scene_iter ); - - if( !pyobj ) { - Py_DECREF(sce_pylist); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create PyString" ) ); - } - PyList_SET_ITEM( sce_pylist, index, pyobj ); - - scene_iter = scene_iter->id.next; - index++; - } - - return sce_pylist; - } -} - -/*-----------------------Scene.GetCurrent()------------------------------*/ -static PyObject *M_Scene_GetCurrent( PyObject * self ) -{ - return Scene_CreatePyObject( ( Scene * ) G.scene ); -} - -static PyObject *M_Scene_getCurrent_deprecated( PyObject * self ) -{ - static char warning = 1; - if( warning ) { - printf("Blender.Scene.getCurrent() is deprecated,\n\tuse Blender.Scene.GetCurrent() instead.\n"); - --warning; - } - - return Scene_CreatePyObject( ( Scene * ) G.scene ); -} - - -/*-----------------------Scene.Unlink()----------------------------------*/ -static PyObject *M_Scene_Unlink( PyObject * self, PyObject * args ) -{ - PyObject *pyobj; - BPy_Scene *pyscn; - Scene *scene, *sce; - bScreen *sc; - - if( !PyArg_ParseTuple( args, "O!", &Scene_Type, &pyobj ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Scene PyType object" ); - - pyscn = (BPy_Scene *)pyobj; - scene = pyscn->scene; - - SCENE_DEL_CHECK_PY(pyscn); - - if( scene == G.scene ) - 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; - Py_RETURN_NONE; -} - -/* DEPRECATE ME !!! */ -/*-----------------------BPy_Scene function defintions-------------------*/ - -/*-----------------------Scene.setLayers()---------------------------------*/ -static PyObject *Scene_oldsetLayers( BPy_Scene * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Scene_setLayerList ); -} -/* END DEPRECATE CODE */ - - -/*-----------------------Scene.copy()------------------------------------*/ -static PyObject *Scene_copy( BPy_Scene * self, PyObject * args ) -{ - short dup_objs = 1; - Scene *scene = self->scene; - - SCENE_DEL_CHECK_PY(self); - - if( !PyArg_ParseTuple( args, "|h", &dup_objs ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int in [0,2] or nothing as argument" ); - - return Scene_CreatePyObject( copy_scene( scene, dup_objs ) ); -} - -/*-----------------------Scene.makeCurrent()-----------------------------*/ -static PyObject *Scene_makeCurrent( BPy_Scene * self ) -{ - Scene *scene = self->scene; -#if 0 /* add back in when bpy becomes "official" */ - static char warning = 1; - if( warning ) { - printf("scene.makeCurrent() deprecated!\n\tuse bpy.scenes.active = scene instead\n"); - --warning; - } -#endif - - SCENE_DEL_CHECK_PY(self); - - if( scene && scene != G.scene) { - set_scene( scene ); - scene_update_for_newframe(scene, scene->lay); - } - - Py_RETURN_NONE; -} - -/*-----------------------Scene.update()----------------------------------*/ -static PyObject *Scene_update( BPy_Scene * self, PyObject * args ) -{ - Scene *scene = self->scene; - int full = 0; - - SCENE_DEL_CHECK_PY(self); - if( !PyArg_ParseTuple( args, "|i", &full ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or int (0 or 1) argument" ); - -/* Under certain circunstances, DAG_scene_sort *here* can crash Blender. - * A "RuntimeError: max recursion limit" happens when a scriptlink - * on frame change has scene.update(1). - * Investigate better how to avoid this. */ - if( !full ) - DAG_scene_sort( scene ); - - 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 ); - 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" - "1: for a full update (regroups, does ipos, keys, etc.)" ); - - Py_RETURN_NONE; -} - -/*-----------------------Scene.link()------------------------------------*/ -static PyObject *Scene_link( BPy_Scene * self, PyObject * args ) -{ - Scene *scene = self->scene; - BPy_Object *bpy_obj; - Object *object = NULL; - static char warning = 1; - - if( warning ) { - printf("scene.link(ob) deprecated!\n\tuse scene.objects.link(ob) instead\n"); - --warning; - } - - SCENE_DEL_CHECK_PY(self); - - if( !PyArg_ParseTuple( args, "O!", &Object_Type, &bpy_obj ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Object argument" ); - - - /*return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Could not create data on demand for this object type!" );*/ - - object = bpy_obj->object; - - /* Object.c's EXPP_add_obdata does not support these objects */ - if (!object->data && (object->type == OB_SURF || object->type == OB_FONT || object->type == OB_WAVE )) { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Object has no data and new data cant be automaticaly created for Surf, Text or Wave type objects!" ); - } else { - /* Ok, all is fine, let's try to link it */ - Base *base; - - /* We need to link the object to a 'Base', then link this base - * to the scene. See DNA_scene_types.h ... */ - - /* First, check if the object isn't already in the scene */ - base = object_in_scene( object, scene ); - /* if base is not NULL ... */ - if( base ) /* ... the object is already in one of the Scene Bases */ - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "object already in scene!" ); - - /* not linked, go get mem for a new base object */ - - base = MEM_callocN( sizeof( Base ), "pynewbase" ); - - if( !base ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't allocate new Base for object" ); - - /* if the object has not yet been linked to object data, then - * set the real type before we try creating data */ - - if( bpy_obj->realtype != OB_EMPTY ) { - object->type = bpy_obj->realtype; - bpy_obj->realtype = OB_EMPTY; - } - - /* check if this object has obdata, case not, try to create it */ - - if( !object->data && ( object->type != OB_EMPTY ) ) - EXPP_add_obdata( object ); /* returns -1 on error, defined in Object.c */ - - base->object = object; /* link object to the new base */ - base->lay = object->lay; - base->flag = object->flag; - - object->id.us += 1; /* incref the object user count in Blender */ - - BLI_addhead( &scene->base, base ); /* finally, link new base to scene */ - } - - Py_RETURN_NONE; -} - -/*-----------------------Scene.unlink()----------------------------------*/ -static PyObject *Scene_unlink( BPy_Scene * self, PyObject * args ) -{ - BPy_Object *bpy_obj = NULL; - Scene *scene = self->scene; - Base *base; - static char warning = 1; - - if( warning ) { - printf("scene.unlink(ob) deprecated!\n\tuse scene.objects.unlink(ob) instead\n"); - --warning; - } - - SCENE_DEL_CHECK_PY(self); - - if( !PyArg_ParseTuple( args, "O!", &Object_Type, &bpy_obj ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Object as argument" ); - - /* is the object really in the scene? */ - base = object_in_scene( bpy_obj->object, scene ); - - if( base ) { /* if it is, remove it */ - if (scene->basact==base) - scene->basact= NULL; /* in case the object was selected */ - - free_and_unlink_base_from_scene( scene, base ); - Py_RETURN_TRUE; - } - else - Py_RETURN_FALSE; -} - -/*-----------------------Scene.getChildren()-----------------------------*/ -static PyObject *Scene_getChildren( BPy_Scene * self ) -{ - Scene *scene = self->scene; - PyObject *pylist; - PyObject *bpy_obj; - Object *object; - Base *base; - static char warning = 1; - - if( warning ) { - printf("scene.getChildren() deprecated!\n\tuse scene.objects instead\n"); - --warning; - } - - SCENE_DEL_CHECK_PY(self); - - pylist = PyList_New( 0 ); - - base = scene->base.first; - - while( base ) { - object = base->object; - - bpy_obj = Object_CreatePyObject( object ); - - if( !bpy_obj ) { - Py_DECREF(pylist); - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create new object wrapper" ); - } - PyList_Append( pylist, bpy_obj ); - Py_DECREF( bpy_obj ); /* PyList_Append incref'ed it */ - - base = base->next; - } - - return pylist; -} - -/*-----------------------Scene.getActiveObject()------------------------*/ -static PyObject *Scene_getActiveObject(BPy_Scene *self) -{ - Scene *scene = self->scene; - PyObject *pyob; - Object *ob; - static char warning = 1; - - if( warning ) { - printf("scene.getActiveObject() deprecated!\n\tuse scene.objects.active instead\n"); - --warning; - } - - SCENE_DEL_CHECK_PY(self); - - ob = ((scene->basact) ? (scene->basact->object) : 0); - - if (ob) { - pyob = Object_CreatePyObject( ob ); - - if (!pyob) - return EXPP_ReturnPyObjError(PyExc_MemoryError, - "couldn't create new object wrapper!"); - - return pyob; - } - - Py_RETURN_NONE; /* no active object */ -} - -/*-----------------------Scene.getCurrentCamera()------------------------*/ -static PyObject *Scene_getCurrentCamera( BPy_Scene * self ) -{ - static char warning = 1; - - if( warning ) { - printf("scene.getCurrentCamera() deprecated!\n\tuse scene.objects.camera instead\n"); - --warning; - } - - SCENE_DEL_CHECK_PY(self); - /* None is ok */ - return Object_CreatePyObject( self->scene->camera ); -} - -/*-----------------------Scene.setCurrentCamera()------------------------*/ -static PyObject *Scene_setCurrentCamera( BPy_Scene * self, PyObject * args ) -{ - Object *object; - BPy_Object *cam_obj; - Scene *scene = self->scene; - static char warning = 1; - - if( warning ) { - printf("scene.setCurrentCamera(ob) deprecated!\n\tSet scene.objects.camera = ob instead\n"); - --warning; - } - - SCENE_DEL_CHECK_PY(self); - - if( !PyArg_ParseTuple( args, "O!", &Object_Type, &cam_obj ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Camera Object as argument" ); - - object = cam_obj->object; - if( object->type != OB_CAMERA ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "expected Camera Object as argument" ); - - scene->camera = object; /* set the current Camera */ - - /* if this is the current scene, update its window now */ - if( !G.background && scene == G.scene ) /* Traced a crash to redrawing while in background mode -Campbell */ - copy_view3d_lock( REDRAW ); - -/* XXX copy_view3d_lock(REDRAW) prints "bad call to addqueue: 0 (18, 1)". - * The same happens in bpython. */ - - Py_RETURN_NONE; -} - -/*-----------------------Scene.getRenderingContext()---------------------*/ -static PyObject *Scene_getRenderingContext( BPy_Scene * self ) -{ - SCENE_DEL_CHECK_PY(self); - return RenderData_CreatePyObject( self->scene ); -} - -static PyObject *Scene_getRadiosityContext( BPy_Scene * self ) -{ - SCENE_DEL_CHECK_PY(self); - return Radio_CreatePyObject( self->scene ); -} - -static PyObject *Scene_getSequence( BPy_Scene * self ) -{ - SCENE_DEL_CHECK_PY(self); - if (self->scene->ed) /* we should create this if its not there :/ */ - return SceneSeq_CreatePyObject( self->scene, NULL ); - else - Py_RETURN_NONE; -} - -/* scene.addScriptLink */ -static PyObject *Scene_addScriptLink( BPy_Scene * self, PyObject * args ) -{ - Scene *scene = self->scene; - ScriptLink *slink = NULL; - - SCENE_DEL_CHECK_PY(self); - - slink = &( scene )->scriptlink; - - return EXPP_addScriptLink( slink, args, 1 ); -} - -/* scene.clearScriptLinks */ -static PyObject *Scene_clearScriptLinks( BPy_Scene * self, PyObject * args ) -{ - Scene *scene = self->scene; - ScriptLink *slink = NULL; - - SCENE_DEL_CHECK_PY(self); - - slink = &( scene )->scriptlink; - - return EXPP_clearScriptLinks( slink, args ); -} - -/* scene.getScriptLinks */ -static PyObject *Scene_getScriptLinks( BPy_Scene * self, PyObject * value ) -{ - Scene *scene = self->scene; - ScriptLink *slink = NULL; - PyObject *ret = NULL; - - SCENE_DEL_CHECK_PY(self); - - slink = &( scene )->scriptlink; - - ret = EXPP_getScriptLinks( slink, value, 1 ); - - if( ret ) - return ret; - else - return NULL; -} - -static PyObject *Scene_play( BPy_Scene * self, PyObject * args ) -{ - int mode = 0, win = SPACE_VIEW3D; - PyObject *ret = NULL; - ScrArea *sa = NULL, *oldsa = curarea; - - SCENE_DEL_CHECK_PY(self); - - if( !PyArg_ParseTuple( args, "|ii", &mode, &win ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing, or or two ints as arguments." ); - - if( mode < 0 || mode > 3 ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "mode should be in range [0, 3]." ); - - switch ( win ) { - case SPACE_VIEW3D: - case SPACE_SEQ: - case SPACE_IPO: - case SPACE_ACTION: - case SPACE_NLA: - case SPACE_SOUND: - case SPACE_BUTS: /* from here they don't 'play', but ... */ - case SPACE_TEXT: /* ... might be used as a timer. */ - case SPACE_SCRIPT: - case SPACE_OOPS: - case SPACE_IMAGE: - case SPACE_IMASEL: - case SPACE_INFO: - case SPACE_FILE: - break; - default: - win = SPACE_VIEW3D; - } - - /* we have to move to a proper win */ - sa = find_biggest_area_of_type( win ); - if( !sa && win != SPACE_VIEW3D ) - sa = find_biggest_area_of_type( SPACE_VIEW3D ); - - if( !sa ) - sa = find_biggest_area( ); - - if( sa ) - areawinset( sa->win ); - - /* play_anim returns 0 for normal exit or 1 if user canceled it */ - ret = PyInt_FromLong( (long)play_anim( mode ) ); - - if( sa ) - areawinset( oldsa->win ); - - return ret; -} - -static PyObject *Scene_getTimeLine( BPy_Scene *self ) -{ - BPy_TimeLine *tm; - - SCENE_DEL_CHECK_PY(self); - - tm= (BPy_TimeLine *) PyObject_NEW (BPy_TimeLine, &TimeLine_Type); - if (!tm) - return EXPP_ReturnPyObjError (PyExc_MemoryError, - "couldn't create BPy_TimeLine object"); - tm->marker_list= &(self->scene->markers); - tm->sfra= (int) self->scene->r.sfra; - tm->efra= (int) self->scene->r.efra; - - return (PyObject *)tm; -} - -/************************************************************************ - * - * Object Sequence - * - ************************************************************************/ -/* - * create a thin wrapper for the scenes objects - */ - -/* accessed from scn.objects.selected or scn.objects.context */ -static PyObject *SceneObSeq_getObjects( BPy_SceneObSeq *self, void *mode) -{ - SCENE_DEL_CHECK_PY(self->bpyscene); - return SceneObSeq_CreatePyObject(self->bpyscene, NULL, (int)((long)mode)); -} - -int SceneObSeq_setObjects( BPy_SceneObSeq *self, PyObject *value, void *_mode_) -{ - /* - ONLY SUPPORTS scn.objects.selected and scn.objects.context - cannot assign to scn.objects yet!!! - */ - PyObject *item; - Scene *scene= self->bpyscene->scene; - Object *blen_ob; - Base *base; - int size, mode = (int)_mode_; - - SCENE_DEL_CHECK_INT(self->bpyscene); - - /* scn.objects.selected = scn.objects - shortcut to select all */ - if (BPy_SceneObSeq_Check(value)) { - BPy_SceneObSeq *bpy_sceneseq = (BPy_SceneObSeq *)value; - if (self->bpyscene->scene != bpy_sceneseq->bpyscene->scene) - return EXPP_ReturnIntError( PyExc_ValueError, - "Cannot assign a SceneObSeq type from another scene" ); - if (bpy_sceneseq->mode != EXPP_OBSEQ_NORMAL) - return EXPP_ReturnIntError( PyExc_ValueError, - "Can only assign scn.objects to scn.objects.context or scn.objects.selected" ); - - for (base= scene->base.first; base; base= base->next) { - base->flag |= SELECT; - base->object->flag |= SELECT; - - if (mode==EXPP_OBSEQ_CONTEXT && G.vd) { - base->object->lay= base->lay= G.vd->lay; - } - } - return 0; - } - - if (!PySequence_Check(value)) - return EXPP_ReturnIntError( PyExc_ValueError, - "Error, must assign a sequence of objects to scn.objects.selected" ); - - /* for context and selected, just deselect, dont remove */ - for (base= scene->base.first; base; base= base->next) { - base->flag &= ~SELECT; - base->object->flag &= ~SELECT; - } - - size = PySequence_Length(value); - while (size) { - size--; - item = PySequence_GetItem(value, size); - if ( PyObject_TypeCheck(item, &Object_Type) ) { - blen_ob= ((BPy_Object *)item)->object; - base = object_in_scene( blen_ob, scene ); - if (base) { - blen_ob->flag |= SELECT; - base->flag |= SELECT; - if (mode==EXPP_OBSEQ_CONTEXT && G.vd) { - blen_ob->restrictflag &= ~OB_RESTRICT_VIEW; - blen_ob->lay= base->lay= G.vd->lay; - } - } - } - Py_DECREF(item); - } - return 0; -} - - -static PyObject *SceneObSeq_CreatePyObject( BPy_Scene *self, Base *iter, int mode ) -{ - BPy_SceneObSeq *seq = PyObject_NEW( BPy_SceneObSeq, &SceneObSeq_Type); - seq->bpyscene = self; Py_INCREF(self); - seq->iter = iter; - seq->mode = mode; - return (PyObject *)seq; -} - -static int SceneObSeq_len( BPy_SceneObSeq * self ) -{ - Scene *scene= self->bpyscene->scene; - SCENE_DEL_CHECK_INT(self->bpyscene); - - if (self->mode == EXPP_OBSEQ_NORMAL) - return BLI_countlist( &( scene->base ) ); - else if (self->mode == EXPP_OBSEQ_SELECTED) { - int len=0; - Base *base; - for (base= scene->base.first; base; base= base->next) { - if (base->flag & SELECT) { - len++; - } - } - return len; - } else if (self->mode == EXPP_OBSEQ_CONTEXT) { - int len=0; - Base *base; - - if( G.vd == NULL ) /* No 3d view has been initialized yet, simply return an empty list */ - return 0; - - for (base= scene->base.first; base; base= base->next) { - if TESTBASE(base) { - len++; - } - } - return len; - } - /*should never run this */ - return 0; -} - -/* - * retrive a single Object from somewhere in the Object list - */ - -static PyObject *SceneObSeq_item( BPy_SceneObSeq * self, int i ) -{ - int index=0; - Base *base= NULL; - Scene *scene= self->bpyscene->scene; - - SCENE_DEL_CHECK_PY(self->bpyscene); - - /* objects */ - if (self->mode==EXPP_OBSEQ_NORMAL) - for (base= scene->base.first; base && i!=index; base= base->next, index++) {} - /* selected */ - else if (self->mode==EXPP_OBSEQ_SELECTED) { - for (base= scene->base.first; base && i!=index; base= base->next) - if (base->flag & SELECT) - index++; - } - /* context */ - else if (self->mode==EXPP_OBSEQ_CONTEXT) { - if (G.vd) - for (base= scene->base.first; base && i!=index; base= base->next) - if TESTBASE(base) - index++; - } - - if (!(base)) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - - return Object_CreatePyObject( base->object ); -} - -static PySequenceMethods SceneObSeq_as_sequence = { - ( inquiry ) SceneObSeq_len, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) SceneObSeq_item, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) 0, /* sq_ass_item */ - ( intintobjargproc ) 0, /* sq_ass_slice */ - 0,0,0, -}; - - -/************************************************************************ - * - * Python SceneObSeq_Type iterator (iterates over GroupObjects) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *SceneObSeq_getIter( BPy_SceneObSeq * self ) -{ - /* we need to get the first base, but for selected context we may need to advance - to the first selected or first conext base */ - Base *base= self->bpyscene->scene->base.first; - - SCENE_DEL_CHECK_PY(self->bpyscene); - - if (self->mode==EXPP_OBSEQ_SELECTED) - while (base && !(base->flag & SELECT)) - base= base->next; - else if (self->mode==EXPP_OBSEQ_CONTEXT) { - if (!G.vd) - base= NULL; /* will never iterate if we have no */ - else - while (base && !TESTBASE(base)) - base= base->next; - } - /* create a new iterator if were alredy using this one */ - if (self->iter==NULL) { - self->iter = base; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - return SceneObSeq_CreatePyObject(self->bpyscene, base, self->mode); - } -} - -/* - * Return next SceneOb. - */ - -static PyObject *SceneObSeq_nextIter( BPy_SceneObSeq * self ) -{ - PyObject *object; - Base *base; - if( !(self->iter) || !(self->bpyscene->scene) ) { - self->iter= NULL; - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - object= Object_CreatePyObject( self->iter->object ); - base= self->iter->next; - - if (self->mode==EXPP_OBSEQ_SELECTED) - while (base && !(base->flag & SELECT)) - base= base->next; - else if (self->mode==EXPP_OBSEQ_CONTEXT) { - if (!G.vd) - base= NULL; /* will never iterate if we have no */ - else - while (base && !TESTBASE(base)) - base= base->next; - } - self->iter= base; - return object; -} - - -static PyObject *SceneObSeq_link( BPy_SceneObSeq * self, PyObject *pyobj ) -{ - SCENE_DEL_CHECK_PY(self->bpyscene); - - /* this shold eventually replace Scene_link */ - if (self->mode != EXPP_OBSEQ_NORMAL) - return (EXPP_ReturnPyObjError( PyExc_TypeError, - "Cannot link to objects.selection or objects.context!" )); - - /* - if (self->iter != NULL) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Cannot modify scene objects while iterating" ); - */ - - if( PyTuple_Size(pyobj) == 1 ) { - BPy_LibraryData *seq = ( BPy_LibraryData * )PyTuple_GET_ITEM( pyobj, 0 ); - if( BPy_LibraryData_Check( seq ) ) - return LibraryData_importLibData( seq, seq->name, - ( seq->kind == OBJECT_IS_LINK ? FILE_LINK : 0 ), - self->bpyscene->scene ); - } - return Scene_link(self->bpyscene, pyobj); -} - -/* This is buggy with new object data not already linked to an object, for now use the above code */ -static PyObject *SceneObSeq_new( BPy_SceneObSeq * self, PyObject *args ) -{ - - void *data = NULL; - char *name = NULL; - char *desc = NULL; - short type = OB_EMPTY; - struct Object *object; - Base *base; - PyObject *py_data; - Scene *scene= self->bpyscene->scene; - - SCENE_DEL_CHECK_PY(self->bpyscene); - - if (self->mode != EXPP_OBSEQ_NORMAL) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Cannot add new to objects.selection or objects.context!" ); - - if( !PyArg_ParseTuple( args, "O|s", &py_data, &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "scene.objects.new(obdata) - expected obdata to be\n\ta python obdata type or the string 'Empty'" ); - - if( BPy_Armature_Check( py_data ) ) { - data = ( void * ) Armature_FromPyObject( py_data ); - type = OB_ARMATURE; - } else if( BPy_Camera_Check( py_data ) ) { - data = ( void * ) Camera_FromPyObject( py_data ); - type = OB_CAMERA; - } else if( BPy_Lamp_Check( py_data ) ) { - data = ( void * ) Lamp_FromPyObject( py_data ); - type = OB_LAMP; - } else if( BPy_Curve_Check( py_data ) ) { - data = ( void * ) Curve_FromPyObject( py_data ); - type = OB_CURVE; - } else if( BPy_NMesh_Check( py_data ) ) { - data = ( void * ) NMesh_FromPyObject( py_data, NULL ); - type = OB_MESH; - if( !data ) /* NULL means there is already an error */ - return NULL; - } else if( BPy_Mesh_Check( py_data ) ) { - data = ( void * ) Mesh_FromPyObject( py_data, NULL ); - type = OB_MESH; - } else if( BPy_Lattice_Check( py_data ) ) { - data = ( void * ) Lattice_FromPyObject( py_data ); - type = OB_LATTICE; - } else if( BPy_Metaball_Check( py_data ) ) { - data = ( void * ) Metaball_FromPyObject( py_data ); - type = OB_MBALL; - } else if( BPy_Text3d_Check( py_data ) ) { - data = ( void * ) Text3d_FromPyObject( py_data ); - type = OB_FONT; - } else if( ( desc = PyString_AsString( (PyObject *)py_data ) ) != NULL ) { - if( !strcmp( desc, "Empty" ) ) { - type = OB_EMPTY; - data = NULL; - } else - goto typeError; - } else { -typeError: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an object and optionally a string as arguments" ); - } - - if (!name) { - if (type == OB_EMPTY) - name = "Empty"; - else - name = ((ID *)data)->name + 2; - } - - object = add_only_object(type, name); - - if( data ) { - object->data = data; - id_us_plus((ID *)data); - } - - object->flag = SELECT; - - /* creates the curve for the text object */ - if (type == OB_FONT) - text_to_curve(object, 0); - - /* link to scene */ - base = MEM_callocN( sizeof( Base ), "pynewbase" ); - - if( !base ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't allocate new Base for object" ); - - base->object = object; /* link object to the new base */ - - if (scene == G.scene && G.vd) { - if (G.vd->localview) { - object->lay= G.vd->layact + G.vd->lay; - } else { - object->lay= G.vd->layact; - } - } else { - base->lay= object->lay = scene->lay & ((1<<20)-1); /* Layer, by default visible*/ - } - - base->lay= object->lay; - - base->flag = SELECT; - object->id.us = 1; /* we will exist once in this scene */ - - BLI_addhead( &(scene->base), base ); /* finally, link new base to scene */ - - /* make sure data and object materials are consistent */ - test_object_materials( (ID *)object->data ); - - /* so we can deal with vertex groups */ - if (type == OB_MESH) - ((BPy_Mesh *)py_data)->object = object; - - return Object_CreatePyObject( object ); - -} - -static PyObject *SceneObSeq_unlink( BPy_SceneObSeq * self, PyObject *args ) -{ - PyObject *pyobj; - Object *blen_ob; - Scene *scene; - Base *base= NULL; - - SCENE_DEL_CHECK_PY(self->bpyscene); - - if (self->mode != EXPP_OBSEQ_NORMAL) - return (EXPP_ReturnPyObjError( PyExc_TypeError, - "Cannot add new to objects.selection or objects.context!" )); - - if( !PyArg_ParseTuple( args, "O!", &Object_Type, &pyobj ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a python object as an argument" ) ); - - blen_ob = ( ( BPy_Object * ) pyobj )->object; - - scene = self->bpyscene->scene; - - /* is the object really in the scene? */ - base = object_in_scene( blen_ob, scene); - if( base ) { /* if it is, remove it */ - if (scene->basact==base) - scene->basact= NULL; /* in case the object was selected */ - free_and_unlink_base_from_scene(scene, base); - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -PyObject *SceneObSeq_getActive(BPy_SceneObSeq *self) -{ - Base *base; - SCENE_DEL_CHECK_PY(self->bpyscene); - - if (self->mode!=EXPP_OBSEQ_NORMAL) - return (EXPP_ReturnPyObjError( PyExc_TypeError, - "cannot get active from objects.selected or objects.context" )); - - base= self->bpyscene->scene->basact; - if (!base) - Py_RETURN_NONE; - - return Object_CreatePyObject( base->object ); -} - -static int SceneObSeq_setActive(BPy_SceneObSeq *self, PyObject *value) -{ - Base *base; - - SCENE_DEL_CHECK_INT(self->bpyscene); - - if (self->mode!=EXPP_OBSEQ_NORMAL) - return (EXPP_ReturnIntError( PyExc_TypeError, - "cannot set active from objects.selected or objects.context" )); - - if (value==Py_None) { - self->bpyscene->scene->basact= NULL; - return 0; - } - - if (!BPy_Object_Check(value)) - return (EXPP_ReturnIntError( PyExc_ValueError, - "Object or None types can only be assigned to active!" )); - - base = object_in_scene( ((BPy_Object *)value)->object, self->bpyscene->scene ); - - if (!base) - return (EXPP_ReturnIntError( PyExc_ValueError, - "cannot assign an active object outside the scene." )); - - self->bpyscene->scene->basact= base; - return 0; -} - -PyObject *SceneObSeq_getCamera(BPy_SceneObSeq *self) -{ - SCENE_DEL_CHECK_PY(self->bpyscene); - - if (self->mode!=EXPP_OBSEQ_NORMAL) - return (EXPP_ReturnPyObjError( PyExc_TypeError, - "cannot get camera from objects.selected or objects.context" )); - - return Object_CreatePyObject( self->bpyscene->scene->camera ); -} - -static int SceneObSeq_setCamera(BPy_SceneObSeq *self, PyObject *value) -{ - int ret; - - SCENE_DEL_CHECK_INT(self->bpyscene); - if (self->mode!=EXPP_OBSEQ_NORMAL) - return EXPP_ReturnIntError( PyExc_TypeError, - "cannot set camera from objects.selected or objects.context" ); - - ret = GenericLib_assignData(value, (void **) &self->bpyscene->scene->camera, 0, 0, ID_OB, 0); - - /* if this is the current scene, update its window now */ - if( ret == 0 && !G.background && self->bpyscene->scene == G.scene ) /* Traced a crash to redrawing while in background mode -Campbell */ - copy_view3d_lock( REDRAW ); - -/* XXX copy_view3d_lock(REDRAW) prints "bad call to addqueue: 0 (18, 1)". - * The same happens in bpython. */ - - return ret; -} - - -static struct PyMethodDef BPy_SceneObSeq_methods[] = { - {"link", (PyCFunction)SceneObSeq_link, METH_VARARGS, - "link object to this scene"}, - {"new", (PyCFunction)SceneObSeq_new, METH_VARARGS, - "Create a new object in this scene from the obdata given and return a new object"}, - {"unlink", (PyCFunction)SceneObSeq_unlink, METH_VARARGS, - "unlinks the object from the scene"}, - {NULL, NULL, 0, NULL} -}; - -/************************************************************************ - * - * Python SceneObSeq_Type standard operations - * - ************************************************************************/ - -static void SceneObSeq_dealloc( BPy_SceneObSeq * self ) -{ - Py_DECREF(self->bpyscene); - PyObject_DEL( self ); -} - -static int SceneObSeq_compare( BPy_SceneObSeq * a, BPy_SceneObSeq * b ) -{ - return ( a->bpyscene->scene == b->bpyscene->scene && a->mode == b->mode) ? 0 : -1; -} - -/* - * repr function - * callback functions building meaninful string to representations - */ -static PyObject *SceneObSeq_repr( BPy_SceneObSeq * self ) -{ - if( !(self->bpyscene->scene) ) - return PyString_FromFormat( "[Scene ObjectSeq Removed]" ); - else if (self->mode==EXPP_OBSEQ_SELECTED) - return PyString_FromFormat( "[Scene ObjectSeq Selected \"%s\"]", - self->bpyscene->scene->id.name + 2 ); - else if (self->mode==EXPP_OBSEQ_CONTEXT) - return PyString_FromFormat( "[Scene ObjectSeq Context \"%s\"]", - self->bpyscene->scene->id.name + 2 ); - - /*self->mode==0*/ - return PyString_FromFormat( "[Scene ObjectSeq \"%s\"]", - self->bpyscene->scene->id.name + 2 ); -} - -static PyGetSetDef SceneObSeq_getseters[] = { - {"selected", - (getter)SceneObSeq_getObjects, (setter)SceneObSeq_setObjects, - "sequence of selected objects", - (void *)EXPP_OBSEQ_SELECTED}, - {"context", - (getter)SceneObSeq_getObjects, (setter)SceneObSeq_setObjects, - "sequence of user context objects", - (void *)EXPP_OBSEQ_CONTEXT}, - {"active", - (getter)SceneObSeq_getActive, (setter)SceneObSeq_setActive, - "active object", - NULL}, - {"camera", - (getter)SceneObSeq_getCamera, (setter)SceneObSeq_setCamera, - "camera object", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python SceneObSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject SceneObSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender SceneObSeq", /* char *tp_name; */ - sizeof( BPy_SceneObSeq ), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - ( destructor ) SceneObSeq_dealloc,/* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - ( cmpfunc ) SceneObSeq_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) SceneObSeq_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &SceneObSeq_as_sequence, /* 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 */ - ( getiterfunc) SceneObSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) SceneObSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_SceneObSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - SceneObSeq_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 -}; diff --git a/source/blender/python/api2_2x/Scene.h b/source/blender/python/api2_2x/Scene.h deleted file mode 100644 index eefa72562b5..00000000000 --- a/source/blender/python/api2_2x/Scene.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * $Id: Scene.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_SCENE_H -#define EXPP_SCENE_H - -#include -#include "DNA_scene_types.h" - -/* The Scene PyType Object defined in Scene.c */ -extern PyTypeObject Scene_Type; -extern PyTypeObject SceneObSeq_Type; - -#define BPy_Scene_Check(v) \ - ((v)->ob_type == &Scene_Type) -#define BPy_SceneObSeq_Check(v) \ - ((v)->ob_type == &SceneObSeq_Type) - -/*---------------------------Python BPy_Scene structure definition----------*/ -typedef struct { - PyObject_HEAD - Scene * scene; /* libdata must be second */ -} BPy_Scene; -/*---------------------------Python BPy_Scene visible prototypes-----------*/ -/* Python Scene_Type helper functions needed by Blender (the Init function) and Object modules. */ - - -/* Scene object sequence, iterate on the scene object listbase*/ -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - BPy_Scene *bpyscene; /* link to the python scene so we can know if its been removed */ - Base *iter; /* so we can iterate over the objects */ - int mode; /*0:all objects, 1:selected objects, 2:user context*/ -} BPy_SceneObSeq; - - -PyObject *Scene_Init( void ); -PyObject *Scene_CreatePyObject( Scene * scene ); -/*Scene *Scene_FromPyObject( PyObject * pyobj );*/ /* not used yet */ - -#endif /* EXPP_SCENE_H */ diff --git a/source/blender/python/api2_2x/Sound.c b/source/blender/python/api2_2x/Sound.c deleted file mode 100644 index 25f557eb0c1..00000000000 --- a/source/blender/python/api2_2x/Sound.c +++ /dev/null @@ -1,607 +0,0 @@ -/* - * $Id: Sound.c 11123 2007-06-29 08:59:26Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Chris Keith - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Sound.h" /*This must come first*/ - -#include "BKE_global.h" -#include "BKE_main.h" -#include "BLI_blenlib.h" -#include "BKE_sound.h" -#include "BKE_library.h" -#include "BIF_editsound.h" -#include "BKE_packedFile.h" -#include "mydevice.h" /* redraw defines */ -#include "gen_utils.h" -#include "gen_library.h" -#include "DNA_space_types.h" /* for FILE_MAXDIR only */ - -/*****************************************************************************/ -/* Python BPy_Sound defaults: */ -/*****************************************************************************/ - -#define EXPP_SND_volume_MIN 0.0 -#define EXPP_SND_volume_MAX 1.0 -#define EXPP_SND_pitch_MIN -12.0 -#define EXPP_SND_pitch_MAX 12.0 -#define EXPP_SND_attenuation_MIN 0.0 -#define EXPP_SND_attenuation_MAX 5.0 - -/*****************************************************************************/ -/* Python API function prototypes for the Sound module. */ -/*****************************************************************************/ -static PyObject *M_Sound_Get( PyObject * self, PyObject * args ); -static PyObject *M_Sound_Load( PyObject * self, PyObject * value ); - -/************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Sound.__doc__ */ -/************************************************************************/ -static char M_Sound_doc[] = "The Blender Sound module\n\n"; - -static char M_Sound_Get_doc[] = - "(name) - return the sound with the name 'name', \ -returns None if not found.\n If 'name' is not specified, \ -it returns a list of all sounds in the\ncurrent scene."; - -static char M_Sound_Load_doc[] = - "(filename) - return sound from file filename as a Sound Object,\n\ -returns None if not found."; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Sound module: */ -/*****************************************************************************/ -struct PyMethodDef M_Sound_methods[] = { - {"Get", M_Sound_Get, METH_VARARGS, M_Sound_Get_doc}, - {"Load", M_Sound_Load, METH_O, M_Sound_Load_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python Sound_Type callback function prototypes: */ -/*****************************************************************************/ -static int Sound_compare( BPy_Sound * a, BPy_Sound * b ); -static PyObject *Sound_repr( BPy_Sound * self ); - -#define SOUND_FLOAT_METHODS(funcname, varname) \ -static PyObject *Sound_get ## funcname(BPy_Sound *self) { \ - return PyFloat_FromDouble(self->sound->varname); \ -} \ -static PyObject *Sound_set ## funcname(BPy_Sound *self, PyObject *args) { \ - float f = 0; \ - if (!PyArg_ParseTuple(args, "f", &f)) \ - return (EXPP_ReturnPyObjError (PyExc_TypeError, \ - "expected float argument")); \ - self->sound->varname = EXPP_ClampFloat(f, \ - EXPP_SND_##varname##_MIN, EXPP_SND_##varname##_MAX); \ - Py_RETURN_NONE; \ -} - -#define SOUND_FLOAT_METHOD_FUNCS(varname) \ -{"get"#varname, (PyCFunction)Sound_get ## varname, METH_NOARGS, \ -"() - Return Sound object "#varname}, \ -{"set"#varname, (PyCFunction)Sound_set ## varname, METH_VARARGS, \ -"(float) - Change Sound object "#varname}, - - -/*****************************************************************************/ -/* Python BPy_Sound methods declarations: */ -/*****************************************************************************/ -static PyObject *Sound_getName( BPy_Sound * self ); -static PyObject *Sound_getFilename( BPy_Sound * self ); -static PyObject *Sound_setName( BPy_Sound * self, PyObject * args ); -static int Sound_setFilename( BPy_Sound * self, PyObject * args ); -static PyObject *Sound_oldsetFilename( BPy_Sound * self, PyObject * args ); -static PyObject *Sound_setCurrent( BPy_Sound * self ); -static PyObject *Sound_play( BPy_Sound * self ); -static PyObject *Sound_unpack( BPy_Sound * self, PyObject * args); -static PyObject *Sound_pack( BPy_Sound * self ); -/*static PyObject *Sound_reload ( BPy_Sound * self );*/ -SOUND_FLOAT_METHODS( Volume, volume ) -SOUND_FLOAT_METHODS( Attenuation, attenuation ) -SOUND_FLOAT_METHODS( Pitch, pitch ) -/* these can't be set via interface, removed for now */ -/* -SOUND_FLOAT_METHODS( Panning, panning ) -SOUND_FLOAT_METHODS( MinGain, min_gain ) -SOUND_FLOAT_METHODS( MaxGain, max_gain ) -SOUND_FLOAT_METHODS( Distance, distance ) -*/ - -/*****************************************************************************/ -/* Python BPy_Sound methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Sound_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) Sound_getName, METH_NOARGS, - "() - Return Sound object name"}, - {"getFilename", ( PyCFunction ) Sound_getFilename, METH_NOARGS, - "() - Return Sound object filename"}, - {"setName", ( PyCFunction ) Sound_setName, METH_VARARGS, - "(name) - Set Sound object name"}, - {"setFilename", ( PyCFunction ) Sound_oldsetFilename, METH_VARARGS, - "(filename) - Set Sound object filename"}, - {"setCurrent", ( PyCFunction ) Sound_setCurrent, METH_NOARGS, - "() - make this the active sound in the sound buttons win (also redraws)"}, - {"play", ( PyCFunction ) Sound_play, METH_NOARGS, - "() - play this sound"}, - {"unpack", ( PyCFunction ) Sound_unpack, METH_VARARGS, - "(int) - Unpack sound. Uses one of the values defined in Blender.UnpackModes."}, - {"pack", ( PyCFunction ) Sound_pack, METH_NOARGS, - "() Pack the sound"}, -/* - {"reload", ( PyCFunction ) Sound_setCurrent, METH_NOARGS, - "() - reload this Sound object's sample.\n\ - This is only useful if the original sound file has changed."}, -*/ - SOUND_FLOAT_METHOD_FUNCS( Volume ) - SOUND_FLOAT_METHOD_FUNCS( Attenuation ) - SOUND_FLOAT_METHOD_FUNCS( Pitch ) - /* - SOUND_FLOAT_METHOD_FUNCS( Panning ) - SOUND_FLOAT_METHOD_FUNCS( MinGain ) - SOUND_FLOAT_METHOD_FUNCS( MaxGain ) - SOUND_FLOAT_METHOD_FUNCS( Distance ) - */ - {NULL, NULL, 0, NULL} -}; - -/* NOTE: these were copied and modified from image.h. To Be Done TBD: - * macro-ize them, or C++ templates eventually? - */ -/****************************************************************************/ -/* Function: M_Sound_Get */ -/* Python equivalent: Blender.Sound.Get */ -/* Description: Receives a string and returns the Sound object */ -/* whose name matches the string. If no argument is */ -/* passed in, a list of all Sound names in the */ -/* current scene is returned. */ -/****************************************************************************/ -static PyObject *M_Sound_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - bSound *snd_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - snd_iter = G.main->sound.first; - - if( name ) { /* (name) - Search Sound by name */ - - BPy_Sound *wanted_Sound = NULL; - - while( ( snd_iter ) && ( wanted_Sound == NULL ) ) { - if( strcmp( name, snd_iter->id.name + 2 ) == 0 ) { - wanted_Sound = - ( BPy_Sound * ) - PyObject_NEW( BPy_Sound, &Sound_Type ); - if( wanted_Sound ) { - wanted_Sound->sound = snd_iter; - break; - } - } - snd_iter = snd_iter->id.next; - } - - if( wanted_Sound == NULL ) { /* Requested Sound doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Sound \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return ( PyObject * ) wanted_Sound; - } - - else { /* () - return a list of all Sounds in the scene */ - int index = 0; - PyObject *snd_list, *pyobj; - - snd_list = PyList_New( BLI_countlist( &( G.main->sound ) ) ); - - if( snd_list == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( snd_iter ) { - pyobj = Sound_CreatePyObject( snd_iter ); - - if( !pyobj ) { - Py_DECREF(snd_list); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create PyObject" ) ); - } - PyList_SET_ITEM( snd_list, index, pyobj ); - - snd_iter = snd_iter->id.next; - index++; - } - - return ( snd_list ); - } -} - -/*****************************************************************************/ -/* Function: M_Sound_Load */ -/* Python equivalent: Blender.Sound.Load */ -/* Description: Receives a string and returns the Sound object */ -/* whose filename matches the string. */ -/*****************************************************************************/ -static PyObject *M_Sound_Load( PyObject * self, PyObject * value ) -{ - char *fname = PyString_AsString(value); - bSound *snd_ptr; - BPy_Sound *snd; - - if( !fname ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ) ); - - snd = ( BPy_Sound * ) PyObject_NEW( BPy_Sound, &Sound_Type ); - - if( !snd ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyObject Sound_Type" ) ); - - snd_ptr = sound_new_sound( fname ); - - if( snd_ptr ) { - if( G.ssound ) { - G.ssound->sound = snd_ptr; - } - } - - if( !snd_ptr ) - return ( EXPP_ReturnPyObjError( PyExc_IOError, - "not a valid sound sample" ) ); - - snd->sound = snd_ptr; - - return ( PyObject * ) snd; -} - -/*****************************************************************************/ -/* Function: Sound_Init */ -/*****************************************************************************/ -PyObject *Sound_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &Sound_Type ) < 0 ) - return NULL; - - submodule = - Py_InitModule3( "Blender.Sound", M_Sound_methods, - M_Sound_doc ); - - return ( submodule ); -} - -/************************/ -/*** The Sound PyType ***/ -/************************/ - - -/*****************************************************************************/ -/* Function: Sound_CreatePyObject */ -/* Description: This function will create a new BPy_Sound from an existing */ -/* Blender Sound structure. */ -/*****************************************************************************/ -PyObject *Sound_CreatePyObject( bSound * snd ) -{ - BPy_Sound *py_snd; - - py_snd = ( BPy_Sound * ) PyObject_NEW( BPy_Sound, &Sound_Type ); - - if( !py_snd ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Sound object" ); - - py_snd->sound = snd; - - return ( PyObject * ) py_snd; -} - -/*****************************************************************************/ -/* Function: Sound_FromPyObject */ -/* Description: Returns the Blender Sound associated with this object */ -/*****************************************************************************/ -bSound *Sound_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Sound * ) pyobj )->sound; -} - -/*****************************************************************************/ -/* Python BPy_Sound methods: */ -/*****************************************************************************/ -static PyObject *Sound_getName( BPy_Sound * self ) -{ - return PyString_FromString( self->sound->id.name + 2 ); -} - -static PyObject *Sound_getFilename( BPy_Sound * self ) -{ - return PyString_FromString( self->sound->name ); -} - -static PyObject *Sound_getPacked( BPy_Sound * self ) -{ - if (!sound_sample_is_null(self->sound)) { - bSample *sample = sound_find_sample(self->sound); - if (sample->packedfile) - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -static PyObject *Sound_setName( BPy_Sound * self, PyObject * args ) -{ - char *name; - - if( !PyArg_ParseTuple( args, "s", &name ) ) { - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected a String as argument" ) ); - } - - rename_id( &self->sound->id, name ); - - Py_RETURN_NONE; -} - -static int Sound_setFilename( BPy_Sound * self, PyObject * value ) -{ - char *name; - - /* max len is FILE_MAXDIR = 160 chars like in DNA_image_types.h */ - name = PyString_AsString(value); - if (!name || strlen(name) > FILE_MAXDIR) - return ( EXPP_ReturnIntError( PyExc_ValueError, - "string argument is limited to 160 chars at most" ) ); - - strcpy( self->sound->name, name ); - return 0; -} - -static PyObject *Sound_oldsetFilename( BPy_Sound * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)Sound_setFilename ); -} - - -static PyObject *Sound_play( BPy_Sound * self ) -{ - sound_play_sound( self->sound ); - - Py_RETURN_NONE; -} - -static PyObject *Sound_setCurrent( BPy_Sound * self ) -{ - bSound *snd_ptr = self->sound; - - if( snd_ptr ) { - if( G.ssound ) { - G.ssound->sound = snd_ptr; - } - } - - EXPP_allqueue( REDRAWSOUND, 0 ); - EXPP_allqueue( REDRAWBUTSLOGIC, 0 ); - - Py_RETURN_NONE; -} - -/* unpack sound */ - -static PyObject *Sound_unpack( BPy_Sound * self, PyObject * args ) -{ - bSound *sound = self->sound; - int mode; - if( !PyArg_ParseTuple( args, "i", &mode ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an integer from Blender.UnpackModes" ); - - if (!sound_sample_is_null(sound)) { - bSample *sample = sound_find_sample(sound); - if (sample->packedfile) { - if (unpackSample(sample, mode) == RET_ERROR) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "error unpacking sound"); - } - } else { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, "sound has no samples" ); - } - Py_RETURN_NONE; -} - -/* pack sound */ - -static PyObject *Sound_pack( BPy_Sound * self ) -{ - bSound *sound = self->sound; - if (!sound_sample_is_null(sound)) - { - bSample *sample = sound_find_sample(sound); - if (sample->packedfile ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "sound alredy packed" ); - sound_set_packedfile(sample, newPackedFile(sample->name)); - } - else - { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "sound has no samples" ); - } - Py_RETURN_NONE; -} - -/* -static PyObject *Sound_reload( BPy_Sound * self) -{ - sound_free_sample(); - - if (sound->snd_sound) { - SND_RemoveSound(ghSoundScene, sound->snd_sound); - sound->snd_sound = NULL; - } - - Py_RETURN_NONE; -} -*/ - - - -/*****************************************************************************/ -/* Function: Sound_compare */ -/* Description: This is a callback function for the BPy_Sound type. It */ -/* compares two Sound_Type objects. Only the "==" and "!=" */ -/* comparisons are meaninful. Returns 0 for equality and -1 if */ -/* they don't point to the same Blender Sound struct. */ -/* In Python it becomes 1 if they are equal, 0 otherwise. */ -/*****************************************************************************/ -static int Sound_compare( BPy_Sound * a, BPy_Sound * b ) -{ - return ( a->sound == b->sound ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Sound_repr */ -/* Description: This is a callback function for the BPy_Sound type. It */ -/* builds a meaninful string to represent Sound objects. */ -/*****************************************************************************/ -static PyObject *Sound_repr( BPy_Sound * self ) -{ - return PyString_FromFormat( "[Sound \"%s\"]", - self->sound->id.name + 2 ); -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Sound_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"filename", (getter)Sound_getFilename, (setter)Sound_setFilename, - "text filename", NULL}, - {"packed", (getter)Sound_getPacked, (setter)NULL, - "text filename", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - - -/*****************************************************************************/ -/* Python Sound_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Sound_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "Blender Sound", /* tp_name */ - sizeof( BPy_Sound ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - 0, /* tp_print */ - NULL, /* tp_getattr */ - NULL, /* tp_setattr */ - ( cmpfunc ) Sound_compare, /* tp_compare */ - ( reprfunc ) Sound_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Sound_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Sound_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 -}; - - diff --git a/source/blender/python/api2_2x/Sound.h b/source/blender/python/api2_2x/Sound.h deleted file mode 100644 index 06e9a95bdc5..00000000000 --- a/source/blender/python/api2_2x/Sound.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * $Id: Sound.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Chris Keith - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_SOUND_H -#define EXPP_SOUND_H - -#include -#include "DNA_sound_types.h" - -#define BPy_Sound_Check(v) ((v)->ob_type == &Sound_Type) -extern PyTypeObject Sound_Type; - -/*****************************************************************************/ -/* Python BPy_Sound structure definition */ -/*****************************************************************************/ -typedef struct { - PyObject_HEAD - bSound * sound; -} BPy_Sound; - -/*****************************************************************************/ -/* Module Blender.Sound - public functions */ -/*****************************************************************************/ -PyObject *Sound_Init( void ); -PyObject *Sound_CreatePyObject( bSound * sound ); -bSound *Sound_FromPyObject( PyObject * pyobj ); - -#endif /* EXPP_SOUND_H */ diff --git a/source/blender/python/api2_2x/SurfNurb.c b/source/blender/python/api2_2x/SurfNurb.c deleted file mode 100644 index 1d2e74a26a8..00000000000 --- a/source/blender/python/api2_2x/SurfNurb.c +++ /dev/null @@ -1,857 +0,0 @@ -/* - * $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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Stephen Swaney - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "SurfNurb.h" /*This must come first */ - -#include "BKE_curve.h" -#include "BDR_editcurve.h" /* for convertspline */ -#include "MEM_guardedalloc.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "BezTriple.h" - -/* - * forward declarations go here - */ - -static int SurfNurb_setPoint( BPy_SurfNurb * self, int index, PyObject * ob ); -static int SurfNurb_length( PyInstanceObject * inst ); -static PyObject *SurfNurb_getIter( BPy_SurfNurb * self ); -static PyObject *SurfNurb_iterNext( BPy_SurfNurb * self ); -PyObject *SurfNurb_append( BPy_SurfNurb * self, PyObject * args ); - -char M_SurfNurb_doc[] = "SurfNurb"; - -/* - table of module methods - these are the equivalent of class or static methods. - you do not need an object instance to call one. -*/ - -static PyMethodDef M_SurfNurb_methods[] = { -/* name, method, flags, doc_string */ -/* {"Get", (PyCFunction) M_SurfNurb_method, METH_NOARGS, " () - doc string"}, */ -/* {"method", (PyCFunction) M_SurfNurb_method, METH_NOARGS, " () - doc string"}, */ - - {NULL, NULL, 0, NULL} -}; - -/* - * method table - * table of instance methods - * these methods are invoked on an instance of the type. -*/ - -static PyMethodDef BPy_SurfNurb_methods[] = { -# if 0 - {"append", ( PyCFunction ) SurfNurb_append, METH_VARARGS, - "( point ) - add a new point. arg is BezTriple or list of x,y,z,w floats"}, -#endif - {NULL, NULL, 0, NULL} -}; - -/* - * SurfNurb_appendPointToNurb - * this is a non-bpy utility func to add a point to a given nurb. - * notice the first arg is Nurb*. - */ - -#if 0 -static PyObject *SurfNurb_appendPointToNurb( Nurb * nurb, PyObject * args ) -{ - - int i; - int size; - PyObject *pyOb; - int npoints = nurb->pntsu; - - /* - do we have a list of four floats or a BezTriple? - */ - if( !PyArg_ParseTuple( args, "O", &pyOb )) - return EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "Internal error parsing arguments" ); - - - - /* if curve is empty, adjust type depending on input type */ - if (nurb->bezt==NULL && nurb->bp==NULL) { - if (BPy_BezTriple_Check( pyOb )) - nurb->type |= CU_BEZIER; - else if (PySequence_Check( pyOb )) - nurb->type |= CU_NURBS; - else - return( EXPP_ReturnPyObjError( PyExc_TypeError, - "Expected a BezTriple or a Sequence of 4 (or 5) floats" ) ); - } - - - - if ((nurb->type & 7)==CU_BEZIER) { - BezTriple *tmp; - - if( !BPy_BezTriple_Check( pyOb ) ) - return( EXPP_ReturnPyObjError( PyExc_TypeError, - "Expected a BezTriple\n" ) ); - -/* printf("\ndbg: got a BezTriple\n"); */ - tmp = nurb->bezt; /* save old points */ - nurb->bezt = - ( BezTriple * ) MEM_mallocN( sizeof( BezTriple ) * - ( npoints + 1 ), - "SurfNurb_append2" ); - - if( !nurb->bezt ) - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, "allocation failed" ) ); - - /* copy old points to new */ - if( tmp ) { - memmove( nurb->bezt, tmp, sizeof( BezTriple ) * npoints ); - MEM_freeN( tmp ); - } - - nurb->pntsu++; - /* add new point to end of list */ - memcpy( nurb->bezt + npoints, - BezTriple_FromPyObject( pyOb ), sizeof( BezTriple ) ); - - } - else if( PySequence_Check( pyOb ) ) { - size = PySequence_Size( pyOb ); -/* printf("\ndbg: got a sequence of size %d\n", size ); */ - if( size == 4 || size == 5 ) { - BPoint *tmp; - - tmp = nurb->bp; /* save old pts */ - - nurb->bp = - ( BPoint * ) MEM_mallocN( sizeof( BPoint ) * - ( npoints + 1 ), - "SurfNurb_append1" ); - if( !nurb->bp ) - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "allocation failed" ) ); - - memmove( nurb->bp, tmp, sizeof( BPoint ) * npoints ); - if( tmp ) - MEM_freeN( tmp ); - - ++nurb->pntsu; - /* initialize new BPoint from old */ - memcpy( nurb->bp + npoints, nurb->bp, - sizeof( BPoint ) ); - - for( i = 0; i < 4; ++i ) { - PyObject *item = PySequence_GetItem( pyOb, i ); - - if (item == NULL) - return NULL; - - - nurb->bp[npoints].vec[i] = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - - if (size == 5) { - PyObject *item = PySequence_GetItem( pyOb, i ); - - if (item == NULL) - return NULL; - - nurb->bp[npoints].alfa = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - else { - nurb->bp[npoints].alfa = 0.0f; - } - - makeknots( nurb, 1, nurb->flagu >> 1 ); - - } else { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of 4 or 5 floats" ); - } - - } else { - /* bail with error */ - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a sequence of 4 or 5 floats" ); - - } - - return ( EXPP_incr_ret( Py_None ) ); -} - -/* - * SurfNurb_append( point ) - * append a new point to a nurb curve. - * arg is BezTriple or list of xyzw floats - */ - -PyObject *SurfNurb_append( BPy_SurfNurb * self, PyObject * args ) -{ - Nurb *nurb = self->nurb; - - return SurfNurb_appendPointToNurb( nurb, args ); -} -#endif - -#if 0 -/* - * SurfNurb_getMatIndex - * - * returns index into material list - */ - -static PyObject *SurfNurb_getMatIndex( BPy_SurfNurb * self ) -{ - return PyInt_FromLong( ( long ) self->nurb->mat_nr ); -} - -/* - * SurfNurb_setMatIndex - * - * set index into material list - */ - -static int SurfNurb_setMatIndex( BPy_SurfNurb * self, PyObject * args ) -{ - args = PyNumber_Int( args ); - - if( !args ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - /* fixme: some range checking would be nice! */ - /* can't do range checking without knowing the "parent" curve! */ - self->nurb->mat_nr = ( short )PyInt_AS_LONG( args ); - Py_DECREF( args ); - - return 0; -} -#endif - -/* - * SurfNurb_getPointsU - * - * returns number of control points in U direction - */ - -static PyObject *SurfNurb_getPointsU( BPy_SurfNurb * self ) -{ - return PyInt_FromLong( ( long ) self->nurb->pntsu ); -} - -/* - * SurfNurb_getPointsV - * - * returns number of control points in V direction - */ - -static PyObject *SurfNurb_getPointsV( BPy_SurfNurb * self ) -{ - return PyInt_FromLong( ( long ) self->nurb->pntsv ); -} - -/* - * SurfNurb_getFlagU - * - * returns curve's flagu - */ - -static PyObject *SurfNurb_getFlagU( BPy_SurfNurb * self ) -{ - return PyInt_FromLong( ( long ) (self->nurb->flagu >> 1) ); -} - -/* - * SurfNurb_setFlagU - * - * set curve's flagu and recalculate the knots - * - * Possible values: 0 - uniform, 2 - endpoints, 4 - bezier - * bit 0 controls CU_CYCLIC - */ - -static int SurfNurb_setFlagU( BPy_SurfNurb * self, PyObject * args ) -{ - int flagu; - - args = PyNumber_Int( args ); - if( !args ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - flagu = ( int )PyInt_AS_LONG( args ); - Py_DECREF( args ); - - if( flagu < 0 || flagu > 2 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected integer argument in range [0,2]" ); - - flagu = (flagu << 1) | (self->nurb->flagu & CU_CYCLIC); - if( self->nurb->flagu != flagu ) { - self->nurb->flagu = (short)flagu; - makeknots( self->nurb, 1, self->nurb->flagu >> 1 ); - } - - return 0; -} - -/* - * SurfNurb_getFlagV - * - * returns curve's flagu - */ - -static PyObject *SurfNurb_getFlagV( BPy_SurfNurb * self ) -{ - return PyInt_FromLong( ( long ) (self->nurb->flagv >> 1) ); -} - -/* - * SurfNurb_setFlagV - * - * set curve's flagu and recalculate the knots - * - * Possible values: 0 - uniform, 1 - endpoints, 2 - bezier - */ - -static int SurfNurb_setFlagV( BPy_SurfNurb * self, PyObject * args ) -{ - int flagv; - - args = PyNumber_Int( args ); - if( !args ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - flagv = ( int )PyInt_AS_LONG( args ); - Py_DECREF( args ); - - if( flagv < 0 || flagv > 2 ) - return EXPP_ReturnIntError( PyExc_AttributeError, - "expected integer argument in range [0,2]" ); - - flagv = (flagv << 1) | (self->nurb->flagv & CU_CYCLIC); - if( self->nurb->flagv != flagv ) { - self->nurb->flagv = (short)flagv; - makeknots( self->nurb, 2, self->nurb->flagv >> 1 ); - } - - return 0; -} - -/* - * SurfNurb_getOrder - * - * returns curve's order - */ - -static PyObject *SurfNurb_getOrderU( BPy_SurfNurb * self ) -{ - return PyInt_FromLong( ( long ) self->nurb->orderu ); -} - -static int SurfNurb_setOrderU( BPy_SurfNurb * self, PyObject * args ) -{ - int order; - - args = PyNumber_Int( args ); - if( !args ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - order = ( int )PyInt_AS_LONG( args ); - Py_DECREF( args ); - - if( order < 2 ) order = 2; - else if( order > 6 ) order = 6; - - if( self->nurb->pntsu < order ) - order = self->nurb->pntsu; - - self->nurb->orderu = (short)order; - makeknots( self->nurb, 1, self->nurb->flagu >> 1 ); - - return 0; -} - -static PyObject *SurfNurb_getOrderV( BPy_SurfNurb * self ) -{ - return PyInt_FromLong( ( long ) self->nurb->orderv ); -} - -static int SurfNurb_setOrderV( BPy_SurfNurb * self, PyObject * args ) -{ - int order; - - args = PyNumber_Int( args ); - if( !args ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - order = ( int )PyInt_AS_LONG( args ); - Py_DECREF( args ); - - if( order < 2 ) order = 2; - else if( order > 6 ) order = 6; - - if( self->nurb->pntsv < order ) - order = self->nurb->pntsv; - - self->nurb->orderv = (short)order; - makeknots( self->nurb, 2, self->nurb->flagv >> 1 ); - return 0; -} - -/* - * SurfNurb_getCyclic() - * test whether surface is cyclic (closed) or not (open) - */ - -static PyObject *SurfNurb_getCyclicU( BPy_SurfNurb * self ) -{ - if( self->nurb->flagu & CU_CYCLIC ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static PyObject *SurfNurb_getCyclicV( BPy_SurfNurb * self ) -{ - if( self->nurb->flagv & CU_CYCLIC ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static int SurfNurb_setCyclicU( BPy_SurfNurb * self, PyObject * value ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) - self->nurb->flagu |= CU_CYCLIC; - else - self->nurb->flagu &= ~CU_CYCLIC; - makeknots( self->nurb, 1, self->nurb->flagu >> 1 ); - return 0; -} - -static int SurfNurb_setCyclicV( BPy_SurfNurb * self, PyObject * value ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) - self->nurb->flagv |= CU_CYCLIC; - else - self->nurb->flagv &= ~CU_CYCLIC; - makeknots( self->nurb, 2, self->nurb->flagu >> 1 ); - return 0; -} - - -/* - * SurfNurb_getIter - * - * create an iterator for our SurfNurb. - * this iterator returns the points for this SurfNurb. - */ - -static PyObject *SurfNurb_getIter( BPy_SurfNurb * self ) -{ - self->bp = self->nurb->bp; - self->bezt = self->nurb->bezt; - self->nextPoint = 0; - - Py_INCREF( self ); - return ( PyObject * ) self; -} - -static PyObject *SurfNurb_iterNext( BPy_SurfNurb * self ) -{ - Nurb *pnurb = self->nurb; - int npoints = pnurb->pntsu * pnurb->pntsv; - - if( self->bp && self->nextPoint < npoints ) - return SurfNurb_pointAtIndex( self->nurb, self->nextPoint++ ); - else - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); -} - -/* - * SurfNurb_length - * returns the number of points in a Nurb - * this is a tp_as_sequence method, not a regular instance method. - */ - -static int SurfNurb_length( PyInstanceObject * inst ) -{ - Nurb *nurb; - - if( BPy_SurfNurb_Check( ( PyObject * ) inst ) ) { - nurb = ( ( BPy_SurfNurb * ) inst )->nurb; - return (int)(nurb->pntsu * nurb->pntsu); - } - - return EXPP_ReturnIntError( PyExc_RuntimeError, - "arg is not a BPy_SurfNurb" ); -} - - -/* - * SurfNurb_getPoint - * returns the Nth point in a Nurb - * this is one of the tp_as_sequence methods, hence the int N argument. - * it is called via the [] operator, not as a usual instance method. - */ - -PyObject *SurfNurb_getPoint( BPy_SurfNurb * self, int index ) -{ - Nurb *myNurb; - - int npoints; - - /* for convenince */ - myNurb = self->nurb; - npoints = myNurb->pntsu * myNurb->pntsv; - - /* bail if no Nurbs in Curve */ - if( npoints == 0 ) - return ( EXPP_ReturnPyObjError( PyExc_IndexError, - "no points in this SurfNurb" ) ); - - /* check index limits */ - if( index >= npoints || index < 0 ) - return ( EXPP_ReturnPyObjError( PyExc_IndexError, - "index out of range" ) ); - - return SurfNurb_pointAtIndex( myNurb, index ); -} - -/* - * SurfNurb_setPoint - * modifies the Nth point in a Nurb - * this is one of the tp_as_sequence methods, hence the int N argument. - * it is called via the [] = operator, not as a usual instance method. - */ -static int SurfNurb_setPoint( BPy_SurfNurb * self, int index, PyObject * pyOb ) -{ - Nurb *nurb = self->nurb; - int size; - - /* check index limits */ - if( index < 0 || index >= nurb->pntsu * nurb->pntsv ) - return EXPP_ReturnIntError( PyExc_IndexError, - "array assignment index out of range\n" ); - - /* branch by curve type */ -#if 0 - if ((nurb->type & 7)==CU_BEZIER) { /* BEZIER */ - /* check parameter type */ - if( !BPy_BezTriple_Check( pyOb ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a BezTriple\n" ); - - /* copy bezier in array */ - memcpy( nurb->bezt + index, - BezTriple_FromPyObject( pyOb ), sizeof( BezTriple ) ); - - return 0; /* finished correctly */ - } - else -#endif - { /* NURBS or POLY */ - int i; - - /* check parameter type */ - if (!PySequence_Check( pyOb )) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of 4 (or optionaly 5 if the curve is 3D) floats\n" ); - - size = PySequence_Size( pyOb ); - - /* check sequence size */ - if( size != 4 && size != 5 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a list of 4 (or optionaly 5 if the curve is 3D) floats\n" ); - - /* copy x, y, z, w */ - for( i = 0; i < 4; ++i ) { - PyObject *item = PySequence_GetItem( pyOb, i ); - - if (item == NULL) - return -1; - - nurb->bp[index].vec[i] = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - - if (size == 5) { /* set tilt, if present */ - PyObject *item = PySequence_GetItem( pyOb, i ); - - if (item == NULL) - return -1; - - nurb->bp[index].alfa = ( float ) PyFloat_AsDouble( item ); - Py_DECREF( item ); - } - else { /* if not, set default */ - nurb->bp[index].alfa = 0.0f; - } - - return 0; /* finished correctly */ - } -} - - -/* - * this is an internal routine. not callable directly from python - */ - -PyObject *SurfNurb_pointAtIndex( Nurb * nurb, int index ) -{ - PyObject *pyo; - - if( nurb->bp ) { /* we have a nurb curve */ - int i; - - /* add Tilt only if curve is 3D */ - if (nurb->flag & CU_3D) - pyo = PyList_New( 5 ); - else - pyo = PyList_New( 4 ); - - for( i = 0; i < 4; i++ ) { - PyList_SetItem( pyo, i, - PyFloat_FromDouble( nurb->bp[index]. - vec[i] ) ); - } - - /* add Tilt only if curve is 3D */ - if (nurb->flag & CU_3D) - PyList_SetItem( pyo, 4, PyFloat_FromDouble( nurb->bp[index].alfa ) ); - return pyo; - - } else /* something is horribly wrong */ - return EXPP_ReturnPyObjError( PyExc_SystemError, - "non-NURB surface found" ); -} - -/* - * methods for SurfNurb as sequence - */ - -static PySequenceMethods SurfNurb_as_sequence = { - ( inquiry ) SurfNurb_length, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) SurfNurb_getPoint, /* sq_item */ - ( intintargfunc ) 0, /* sq_slice */ - ( intobjargproc ) SurfNurb_setPoint, /* sq_ass_item */ - 0, /* sq_ass_slice */ - ( objobjproc ) 0, /* sq_contains */ - 0, - 0 -}; - -static PyGetSetDef BPy_SurfNurb_getseters[] = { -#if 0 - {"matIndex", - (getter)SurfNurb_getMatIndex, (setter)SurfNurb_setMatIndex, - "material index", NULL}, -#endif - {"pointsU", - (getter)SurfNurb_getPointsU, (setter)NULL, - "number of control points in U direction", NULL}, - {"pointsV", - (getter)SurfNurb_getPointsV, (setter)NULL, - "number of control points in V direction", NULL}, - {"flagU", - (getter)SurfNurb_getFlagU, (setter)SurfNurb_setFlagU, - "knot flag for U direction", NULL}, - {"flagV", - (getter)SurfNurb_getFlagV, (setter)SurfNurb_setFlagV, - "knot flag for V direction", NULL}, - {"cyclicU", - (getter)SurfNurb_getCyclicU, (setter)SurfNurb_setCyclicU, - "cyclic setting for U direction", NULL}, - {"cyclicV", - (getter)SurfNurb_getCyclicV, (setter)SurfNurb_setCyclicV, - "cyclic setting for V direction", NULL}, - {"orderU", - (getter)SurfNurb_getOrderU, (setter)SurfNurb_setOrderU, - "order setting for U direction", NULL}, - {"orderV", - (getter)SurfNurb_getOrderV, (setter)SurfNurb_setOrderV, - "order setting for V direction", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/* - * compare - * in this case, we consider two SurfNurbs equal, if they point to the same - * blender data. -*/ -static int SurfNurb_compare( BPy_SurfNurb * a, BPy_SurfNurb * b ) -{ - return ( a->nurb == b->nurb ) ? 0 : -1; -} - -/* - * SurfNurb_repr - */ -static PyObject *SurfNurb_repr( BPy_SurfNurb * self ) -{ - return PyString_FromFormat( "[SurfNurb \"%d\"]", self->nurb->type ); -} - -/*****************************************************************************/ -/* Python SurfNurb_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject SurfNurb_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "SurfNurb", /* char *tp_name; */ - sizeof( BPy_SurfNurb ), /* 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; */ - ( cmpfunc ) SurfNurb_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) SurfNurb_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &SurfNurb_as_sequence, /* 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 */ - ( getiterfunc ) SurfNurb_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) SurfNurb_iterNext, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_SurfNurb_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_SurfNurb_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 -}; - -/* - factory method to create a BPy_SurfNurb from a Blender Nurb -*/ - -PyObject *SurfNurb_CreatePyObject( Nurb * blen_nurb ) -{ - BPy_SurfNurb *pyNurb; - - pyNurb = ( BPy_SurfNurb * ) PyObject_NEW( BPy_SurfNurb, &SurfNurb_Type ); - - if( !pyNurb ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "could not create BPy_SurfNurb PyObject" ); - - pyNurb->nurb = blen_nurb; - return ( PyObject * ) pyNurb; -} - - -PyObject *SurfNurb_Init( void ) -{ - PyType_Ready( &SurfNurb_Type ); - return Py_InitModule3( "Blender.SurfNurb", M_SurfNurb_methods, - M_SurfNurb_doc ); -} - diff --git a/source/blender/python/api2_2x/SurfNurb.h b/source/blender/python/api2_2x/SurfNurb.h deleted file mode 100644 index 30d9a48012e..00000000000 --- a/source/blender/python/api2_2x/SurfNurb.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * $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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Stephen Swaney - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#ifndef EXPP_SURFNURB_H -#define EXPP_SURFNURB_H - -#include -#include "DNA_curve_types.h" - -extern PyTypeObject SurfNurb_Type; - -#define BPy_SurfNurb_Check(v) ((v)->ob_type == &SurfNurb_Type) /* for type checking */ - -/* Python BPy_SurfNurb structure definition */ -typedef struct { - PyObject_HEAD - Nurb * nurb; - - /* iterator stuff */ - /* internal ptrs to point data. do not free */ - BPoint *bp; - BezTriple *bezt; - int atEnd; /* iter exhausted flag */ - int nextPoint; - -} BPy_SurfNurb; - - -/* - * prototypes - */ - -PyObject *SurfNurb_Init( void ); -PyObject *SurfNurb_CreatePyObject( Nurb * bzt ); -Nurb *SurfNurb_FromPyObject( PyObject * pyobj ); - -PyObject *SurfNurb_getPoint( BPy_SurfNurb * self, int index ); -PyObject *SurfNurb_pointAtIndex( Nurb * nurb, int index ); - -#endif /* EXPP_SURFNURB_H */ diff --git a/source/blender/python/api2_2x/Sys.c b/source/blender/python/api2_2x/Sys.c deleted file mode 100644 index e936eb56b59..00000000000 --- a/source/blender/python/api2_2x/Sys.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - * $Id: Sys.c 10945 2007-06-16 13:17:41Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Sys.h" /*This must come first*/ - -#include "BKE_utildefines.h" -#include "BKE_global.h" -#include "BLI_blenlib.h" -#include "DNA_scene_types.h" /* G.scene-"r.cfra */ -#include "PIL_time.h" -#include "gen_utils.h" - -#ifdef WIN32 -#define DIRSEP '\\' -#define DIRSEP_STR "\\" -#else -#define DIRSEP '/' -#define DIRSEP_STR "/" -#endif - - -/*****************************************************************************/ -/* Python API function prototypes for the sys module. */ -/*****************************************************************************/ -static PyObject *M_sys_basename( PyObject * self, PyObject * value ); -static PyObject *M_sys_dirname( PyObject * self, PyObject * value ); -static PyObject *M_sys_join( PyObject * self, PyObject * args ); -static PyObject *M_sys_splitext( PyObject * self, PyObject * value ); -static PyObject *M_sys_makename( PyObject * self, PyObject * args, - PyObject * kw ); -static PyObject *M_sys_exists( PyObject * self, PyObject * value ); -static PyObject *M_sys_time( PyObject * self ); -static PyObject *M_sys_sleep( PyObject * self, PyObject * args ); -static PyObject *M_sys_expandpath( PyObject *self, PyObject *value); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.sys.__doc__ */ -/*****************************************************************************/ -static char M_sys_doc[] = "The Blender.sys submodule\n\ -\n\ -This is a minimal system module to supply simple functionality available\n\ -in the default Python module os."; - -static char M_sys_basename_doc[] = - "(path) - Split 'path' in dir and filename.\n\ -Return the filename."; - -static char M_sys_dirname_doc[] = - "(path) - Split 'path' in dir and filename.\n\ -Return the dir."; - -static char M_sys_join_doc[] = - "(dir, file) - Join dir and file to form a full filename.\n\ -Return the filename."; - -static char M_sys_splitext_doc[] = - "(path) - Split 'path' in root and extension:\n\ -/this/that/file.ext -> ('/this/that/file','.ext').\n\ -Return the pair (root, extension)."; - -static char M_sys_makename_doc[] = - "(path = Blender.Get('filename'), ext = \"\", strip = 0) -\n\ -Strip dir and extension from path, leaving only a name, then append 'ext'\n\ -to it (if given) and return the resulting string.\n\n\ -(path) - string: a pathname -- Blender.Get('filename') if 'path' isn't given;\n\ -(ext = \"\") - string: the extension to append.\n\ -(strip = 0) - int: strip dirname from 'path' if given and non-zero.\n\ -Ex: makename('/path/to/file/myfile.foo','-01.abc') returns 'myfile-01.abc'\n\ -Ex: makename(ext='.txt') returns 'untitled.txt' if Blender.Get('filename')\n\ -returns a path to the file 'untitled.blend'"; - -static char M_sys_time_doc[] = - "() - Return a float representing time elapsed in seconds.\n\ -Each successive call is garanteed to return values greater than or\n\ -equal to the previous call."; - -static char M_sys_sleep_doc[] = - "(milliseconds = 10) - Sleep for the specified time.\n\ -(milliseconds = 10) - the amount of time in milliseconds to sleep.\n\ -This function can be necessary in tight 'get event' loops."; - -static char M_sys_exists_doc[] = - "(path) - Check if the given pathname exists.\n\ -The return value is as follows:\n\ -\t 0: path doesn't exist;\n\ -\t 1: path is an existing filename;\n\ -\t 2: path is an existing dirname;\n\ -\t-1: path exists but is neither a regular file nor a dir."; - -static char M_sys_expandpath_doc[] = -"(path) - Expand this Blender internal path to a proper file system path.\n\ -(path) - the string path to convert.\n\n\ -Note: internally Blender paths can contain two special character sequences:\n\ -- '//' (at start) for base path directory (the current .blend's dir path);\n\ -- '#' (at ending) for current frame number.\n\n\ -This function expands these to their actual content, returning a valid path.\n\ -If the special chars are not found in the given path, it is simply returned."; - -/*****************************************************************************/ -/* Python method structure definition for Blender.sys module: */ -/*****************************************************************************/ -struct PyMethodDef M_sys_methods[] = { - {"basename", M_sys_basename, METH_O, M_sys_basename_doc}, - {"dirname", M_sys_dirname, METH_O, M_sys_dirname_doc}, - {"join", M_sys_join, METH_VARARGS, M_sys_join_doc}, - {"splitext", M_sys_splitext, METH_O, M_sys_splitext_doc}, - {"makename", ( PyCFunction ) M_sys_makename, - METH_VARARGS | METH_KEYWORDS, - M_sys_makename_doc}, - {"exists", M_sys_exists, METH_O, M_sys_exists_doc}, - {"sleep", M_sys_sleep, METH_VARARGS, M_sys_sleep_doc}, - {"time", ( PyCFunction ) M_sys_time, METH_NOARGS, M_sys_time_doc}, - {"expandpath", M_sys_expandpath, METH_O, M_sys_expandpath_doc}, - {NULL, NULL, 0, NULL} -}; - -/* Module Functions */ - -static PyObject *g_sysmodule = NULL; /* pointer to Blender.sys module */ - -PyObject *sys_Init( void ) -{ - PyObject *submodule, *dict; - - submodule = Py_InitModule3( "Blender.sys", M_sys_methods, M_sys_doc ); - - g_sysmodule = submodule; - - dict = PyModule_GetDict( submodule ); - - EXPP_dict_set_item_str( dict, "dirsep", PyString_FromString(DIRSEP_STR) ); - EXPP_dict_set_item_str( dict, "sep", PyString_FromString(DIRSEP_STR) ); - - return submodule; -} - -static PyObject *M_sys_basename( PyObject * self, PyObject * value ) -{ - char *name = PyString_AsString(value); - char *p, basename[FILE_MAXDIR + FILE_MAXFILE]; - int n, len; - - if( !name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - len = strlen( name ); - -#ifdef WIN32 - p = MAX2(strrchr( name, '/' ), strrchr( name, '\\' )); -#else - p = strrchr( name, DIRSEP ); -#endif - - if( p ) { - n = name + len - p - 1; /* - 1 because we don't want the sep */ - - if( n > FILE_MAXDIR + FILE_MAXFILE ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "path too long" ); - - BLI_strncpy( basename, p + 1, n + 1 ); - return PyString_FromString( basename ); - } - - return PyString_FromString( name ); -} - -static PyObject *M_sys_dirname( PyObject * self, PyObject * value ) -{ - char *name = PyString_AsString(value); - char *p, dirname[FILE_MAXDIR + FILE_MAXFILE]; - int n; - - if( !name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - -#ifdef WIN32 - p = MAX2(strrchr( name, '/' ), strrchr( name, '\\' )); -#else - p = strrchr( name, DIRSEP ); -#endif - - if( p ) { - n = p - name; - - if( n > FILE_MAXDIR + FILE_MAXFILE ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "path too long" ); - - BLI_strncpy( dirname, name, n + 1 ); - return PyString_FromString( dirname ); - } - - return PyString_FromString( "." ); -} - -static PyObject *M_sys_join( PyObject * self, PyObject * args ) -{ - char *name = NULL, *path = NULL; - char filename[FILE_MAXDIR + FILE_MAXFILE]; - int pathlen = 0, namelen = 0; - - if( !PyArg_ParseTuple( args, "ss", &path, &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - pathlen = strlen( path ) + 1; - namelen = strlen( name ) + 1; /* + 1 to account for '\0' for BLI_strncpy */ - - if( pathlen + namelen > FILE_MAXDIR + FILE_MAXFILE - 1 ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "filename is too long." ); - - BLI_strncpy( filename, path, pathlen ); - - if( filename[pathlen - 2] != DIRSEP ) { - filename[pathlen - 1] = DIRSEP; - pathlen += 1; - } - - BLI_strncpy( filename + pathlen - 1, name, namelen ); - - return PyString_FromString( filename ); -} - -static PyObject *M_sys_splitext( PyObject * self, PyObject * value ) -{ - char *name = PyString_AsString(value); - char *dot, *p, path[FILE_MAXDIR + FILE_MAXFILE], ext[FILE_MAXDIR + FILE_MAXFILE]; - int n, len; - - if( !name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - len = strlen( name ); - dot = strrchr( name, '.' ); - - if( !dot ) - return Py_BuildValue( "ss", name, "" ); - - p = strrchr( name, DIRSEP ); - - if( p ) { - if( p > dot ) - return Py_BuildValue( "ss", name, "" ); - } - - n = name + len - dot; - - /* loong extensions are supported -- foolish, but Python's os.path.splitext - * supports them, so ... */ - - if( n >= FILE_MAXDIR + FILE_MAXFILE || ( len - n ) >= FILE_MAXDIR + FILE_MAXFILE ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, "path too long" ); - - BLI_strncpy( ext, dot, n + 1 ); - BLI_strncpy( path, name, dot - name + 1 ); - - return Py_BuildValue( "ss", path, ext ); -} - -static PyObject *M_sys_makename( PyObject * self, PyObject * args, - PyObject * kw ) -{ - char *path = G.sce, *ext = NULL; - int strip = 0; - static char *kwlist[] = { "path", "ext", "strip", NULL }; - char *dot = NULL, *p = NULL, basename[FILE_MAXDIR + FILE_MAXFILE]; - int n, len, lenext = 0; - - if( !PyArg_ParseTupleAndKeywords( args, kw, "|ssi", kwlist, - &path, &ext, &strip ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected one or two strings and an int (or nothing) as arguments" ); - - len = strlen( path ) + 1; /* + 1 to consider ending '\0' */ - if( ext ) - lenext = strlen( ext ) + 1; - - if( ( len + lenext ) > FILE_MAXDIR + FILE_MAXFILE ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "path too long" ); - - p = strrchr( path, DIRSEP ); - - if( p && strip ) { - n = path + len - p; - BLI_strncpy( basename, p + 1, n ); /* + 1 to skip the sep */ - } else - BLI_strncpy( basename, path, len ); - - dot = strrchr( basename, '.' ); - - /* now the extension: always remove the one in basename */ - if( dot || ext ) { - if( !ext ) - basename[dot - basename] = '\0'; - else { /* if user gave an ext, append it */ - - if( dot ) - n = dot - basename; - else - n = strlen( basename ); - - BLI_strncpy( basename + n, ext, lenext ); - } - } - - return PyString_FromString( basename ); -} - -static PyObject *M_sys_time( PyObject * self ) -{ - return PyFloat_FromDouble( PIL_check_seconds_timer( ) ); -} - -static PyObject *M_sys_sleep( PyObject * self, PyObject * args ) -{ - int millisecs = 10; - - if( !PyArg_ParseTuple( args, "|i", &millisecs ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ); - - PIL_sleep_ms( millisecs ); - - return EXPP_incr_ret( Py_None ); -} - -static PyObject *M_sys_exists( PyObject * self, PyObject * value ) -{ - char *fname = PyString_AsString(value); - - int mode = 0, i = -1; - - if( !fname ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string (pathname) argument" ); - - mode = BLI_exist(fname); - - if( mode == 0 ) - i = 0; - else if( S_ISREG( mode ) ) - i = 1; - else if( S_ISDIR( mode ) ) - i = 2; - /* i stays as -1 if path exists but is neither a regular file nor a dir */ - - return PyInt_FromLong(i); -} - -static PyObject *M_sys_expandpath( PyObject * self, PyObject * value ) -{ - char *path = PyString_AsString(value); - char expanded[FILE_MAXDIR + FILE_MAXFILE]; - - if (!path) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - BLI_strncpy(expanded, path, FILE_MAXDIR + FILE_MAXFILE); - BLI_convertstringcode(expanded, G.sce, G.scene->r.cfra); - - return PyString_FromString(expanded); -} diff --git a/source/blender/python/api2_2x/Sys.h b/source/blender/python/api2_2x/Sys.h deleted file mode 100644 index 3e5f78f4922..00000000000 --- a/source/blender/python/api2_2x/Sys.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * $Id: Sys.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_sys_H -#define EXPP_sys_H - -#include - -PyObject *sys_Init( void ); - -#endif /* EXPP_sys_H */ diff --git a/source/blender/python/api2_2x/Text.c b/source/blender/python/api2_2x/Text.c deleted file mode 100644 index 29c404f7266..00000000000 --- a/source/blender/python/api2_2x/Text.c +++ /dev/null @@ -1,576 +0,0 @@ -/* - * $Id: Text.c 11123 2007-06-29 08:59:26Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Text.h" /*This must come first*/ - -#include "BKE_library.h" -#include "BKE_sca.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BIF_drawtext.h" -#include "BKE_text.h" -#include "BLI_blenlib.h" -#include "DNA_space_types.h" -#include "gen_utils.h" -#include "gen_library.h" -#include "../BPY_extern.h" - -#define EXPP_TEXT_MODE_FOLLOW TXT_FOLLOW - -/*****************************************************************************/ -/* Python API function prototypes for the Text module. */ -/*****************************************************************************/ -static PyObject *M_Text_New( PyObject * self, PyObject * args); -static PyObject *M_Text_Get( PyObject * self, PyObject * args ); -static PyObject *M_Text_Load( PyObject * self, PyObject * value ); -static PyObject *M_Text_unlink( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Text.__doc__ */ -/*****************************************************************************/ -static char M_Text_doc[] = "The Blender Text module\n\n"; - -static char M_Text_New_doc[] = "() - return a new Text object"; - -static char M_Text_Get_doc[] = "(name) - return the Text with name 'name', \ -returns None if not found.\n If 'name' is not specified, \ -it returns a list of all Texts in the\ncurrent scene."; - -static char M_Text_Load_doc[] = - "(filename) - return text from file filename as a Text Object, \ -returns None if not found.\n"; - -static char M_Text_unlink_doc[] = - "(text) - remove Text object 'text' from Blender"; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Text module: */ -/*****************************************************************************/ -struct PyMethodDef M_Text_methods[] = { - {"New", M_Text_New, METH_VARARGS, M_Text_New_doc}, - {"Get", M_Text_Get, METH_VARARGS, M_Text_Get_doc}, - {"get", M_Text_Get, METH_VARARGS, M_Text_Get_doc}, - {"Load", M_Text_Load, METH_O, M_Text_Load_doc}, - {"unlink", M_Text_unlink, METH_VARARGS, M_Text_unlink_doc}, - {NULL, NULL, 0, NULL} -}; - - -/*****************************************************************************/ -/* Python BPy_Text methods declarations: */ -/*****************************************************************************/ -static PyObject *Text_getFilename( BPy_Text * self ); -static PyObject *Text_getNLines( BPy_Text * self ); -static PyObject *Text_clear( BPy_Text * self ); -static PyObject *Text_write( BPy_Text * self, PyObject * value ); -static PyObject *Text_set( BPy_Text * self, PyObject * args ); -static PyObject *Text_asLines( BPy_Text * self ); - -/*****************************************************************************/ -/* Python BPy_Text methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Text_methods[] = { - /* name, method, flags, doc */ - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return Text Object name"}, - {"getFilename", ( PyCFunction ) Text_getFilename, METH_VARARGS, - "() - Return Text Object filename"}, - {"getNLines", ( PyCFunction ) Text_getNLines, METH_VARARGS, - "() - Return number of lines in text buffer"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(str) - Change Text Object name"}, - {"clear", ( PyCFunction ) Text_clear, METH_NOARGS, - "() - Clear Text buffer"}, - {"write", ( PyCFunction ) Text_write, METH_O, - "(line) - Append string 'str' to Text buffer"}, - {"set", ( PyCFunction ) Text_set, METH_VARARGS, - "(name, val) - Set attribute 'name' to value 'val'"}, - {"asLines", ( PyCFunction ) Text_asLines, METH_NOARGS, - "() - Return text buffer as a list of lines"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python Text_Type callback function prototypes: */ -/*****************************************************************************/ -static int Text_compare( BPy_Text * a, BPy_Text * b ); -static PyObject *Text_repr( BPy_Text * self ); - -/*****************************************************************************/ -/* Function: M_Text_New */ -/* Python equivalent: Blender.Text.New */ -/*****************************************************************************/ -static PyObject *M_Text_New( PyObject * self, PyObject * args) -{ - char *name = "Text"; - int follow = 0; - Text *bl_text; /* blender text object */ - PyObject *py_text; /* python wrapper */ - - if( !PyArg_ParseTuple( args, "|si", &name, &follow ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string and int arguments (or nothing)" ); - - bl_text = add_empty_text( name ); - - if( bl_text ) { - /* do not set user count because Text is already linked */ - - /* create python wrapper obj */ - py_text = Text_CreatePyObject( bl_text ); - } else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Text Object in Blender" ); - if( !py_text ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Text Object wrapper" ); - - if( follow ) - bl_text->flags |= EXPP_TEXT_MODE_FOLLOW; - - return py_text; -} - -/*****************************************************************************/ -/* Function: M_Text_Get */ -/* Python equivalent: Blender.Text.Get */ -/* Description: Receives a string and returns the text object */ -/* whose name matches the string. If no argument is */ -/* passed in, a list of all text names in the current */ -/* scene is returned. */ -/*****************************************************************************/ -static PyObject *M_Text_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Text *txt_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - txt_iter = G.main->text.first; - - if( name ) { /* (name) - Search text by name */ - - PyObject *wanted_txt = NULL; - - while( ( txt_iter ) && ( wanted_txt == NULL ) ) { - - if( strcmp( name, txt_iter->id.name + 2 ) == 0 ) { - wanted_txt = Text_CreatePyObject( txt_iter ); - } - - txt_iter = txt_iter->id.next; - } - - if( wanted_txt == NULL ) { /* Requested text doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Text \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return wanted_txt; - } - - else { /* () - return a list of all texts in the scene */ - int index = 0; - PyObject *txtlist, *pyobj; - - txtlist = PyList_New( BLI_countlist( &( G.main->text ) ) ); - - if( txtlist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( txt_iter ) { - pyobj = Text_CreatePyObject( txt_iter ); - - if( !pyobj ) { - Py_DECREF(txtlist); - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create PyString" ) ); - } - PyList_SET_ITEM( txtlist, index, pyobj ); - - txt_iter = txt_iter->id.next; - index++; - } - - return ( txtlist ); - } -} - -/*****************************************************************************/ -/* Function: M_Text_Load */ -/* Python equivalent: Blender.Text.Load */ -/* Description: Receives a filename and returns the text object */ -/* created from the corresponding file. */ -/*****************************************************************************/ -static PyObject *M_Text_Load( PyObject * self, PyObject * value ) -{ - char *fname = PyString_AsString(value); - char fpath[FILE_MAXDIR + FILE_MAXFILE]; - Text *txt_ptr = NULL; - unsigned int maxlen = FILE_MAXDIR + FILE_MAXFILE; - - if( !fname ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ) ); - - if (strlen(fname) > (maxlen - 1)) - return EXPP_ReturnPyObjError (PyExc_AttributeError, - "text filename too long"); - else if (!BLI_exists(fname)) - return EXPP_ReturnPyObjError (PyExc_AttributeError, - "text file not found"); - - BLI_strncpy(fpath, fname, maxlen); - - txt_ptr = add_text( fpath ); - if( !txt_ptr ) - return EXPP_ReturnPyObjError( PyExc_IOError, - "couldn't load text" ); - - return Text_CreatePyObject(txt_ptr); -} - -/*****************************************************************************/ -/* Function: M_Text_unlink */ -/* Python equivalent: Blender.Text.unlink */ -/* Description: Removes the given Text object from Blender */ -/*****************************************************************************/ -static PyObject *M_Text_unlink( PyObject * self, PyObject * args ) -{ - BPy_Text *textobj; - Text *text; - - if( !PyArg_ParseTuple( args, "O!", &Text_Type, &textobj ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a Text object as argument" ); - - text = ( ( BPy_Text * ) textobj )->text; - - if( !text ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "this text was already unlinked!" ); - - BPY_clear_bad_scriptlinks( text ); - free_text_controllers( text ); - unlink_text( text ); - - free_libblock( &G.main->text, text ); - - ( ( BPy_Text * ) textobj )->text = NULL; - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: Text_Init */ -/*****************************************************************************/ -PyObject *Text_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &Text_Type ) < 0 ) - return NULL; - - submodule = - Py_InitModule3( "Blender.Text", M_Text_methods, M_Text_doc ); - - return ( submodule ); -} - -/*****************************************************************************/ -/* Function: Text_CreatePyObject */ -/*****************************************************************************/ -PyObject *Text_CreatePyObject( Text * txt ) -{ - BPy_Text *pytxt; - - pytxt = ( BPy_Text * ) PyObject_NEW( BPy_Text, &Text_Type ); - - if( !pytxt ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Text PyObject" ); - - pytxt->text = txt; - - return ( PyObject * ) pytxt; -} - -/*****************************************************************************/ -/* Python BPy_Text methods: */ -/*****************************************************************************/ -static PyObject *Text_getFilename( BPy_Text * self ) -{ - if( self->text->name ) - return PyString_FromString( self->text->name ); - - Py_RETURN_NONE; -} - -static PyObject *Text_getNLines( BPy_Text * self ) -{ /* text->nlines isn't updated in Blender (?) */ - int nlines = 0; - TextLine *line; - - line = self->text->lines.first; - - while( line ) { /* so we have to count them ourselves */ - line = line->next; - nlines++; - } - - self->text->nlines = nlines; /* and update Blender, too (should we?) */ - - return PyInt_FromLong( nlines ); -} - -static PyObject *Text_clear( BPy_Text * self) -{ - int oldstate; - - if( !self->text ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This object isn't linked to a Blender Text Object" ); - - oldstate = txt_get_undostate( ); - txt_set_undostate( 1 ); - txt_sel_all( self->text ); - txt_cut_sel( self->text ); - txt_set_undostate( oldstate ); - - Py_RETURN_NONE; -} - -static PyObject *Text_set( BPy_Text * self, PyObject * args ) -{ - int ival; - char *attr; - - if( !PyArg_ParseTuple( args, "si", &attr, &ival ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string and an int as arguments" ); - - if( strcmp( "follow_cursor", attr ) == 0 ) { - if( ival ) - self->text->flags |= EXPP_TEXT_MODE_FOLLOW; - else - self->text->flags &= EXPP_TEXT_MODE_FOLLOW; - } - - Py_RETURN_NONE; -} - -static PyObject *Text_write( BPy_Text * self, PyObject * value ) -{ - char *str = PyString_AsString(value); - int oldstate; - - if( !self->text ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This object isn't linked to a Blender Text Object" ); - - if( !str ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - oldstate = txt_get_undostate( ); - txt_insert_buf( self->text, str ); - txt_move_eof( self->text, 0 ); - txt_set_undostate( oldstate ); - - Py_RETURN_NONE; -} - -static PyObject *Text_asLines( BPy_Text * self ) -{ - TextLine *line; - PyObject *list, *tmpstr; - - if( !self->text ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This object isn't linked to a Blender Text Object" ); - - line = self->text->lines.first; - list = PyList_New( 0 ); - - if( !list ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ); - - while( line ) { - tmpstr = PyString_FromString( line->line ); - PyList_Append( list, tmpstr ); - Py_DECREF(tmpstr); - line = line->next; - } - - return list; -} - -/*****************************************************************************/ -/* Function: Text_compare */ -/* Description: This is a callback function for the BPy_Text type. It */ -/* compares two Text_Type objects. Only the "==" and "!=" */ -/* comparisons are meaninful. Returns 0 for equality and -1 if */ -/* they don't point to the same Blender Text struct. */ -/* In Python it becomes 1 if they are equal, 0 otherwise. */ -/*****************************************************************************/ -static int Text_compare( BPy_Text * a, BPy_Text * b ) -{ - return ( a->text == b->text ) ? 0 : -1; -} - -/*****************************************************************************/ -/* Function: Text_repr */ -/* Description: This is a callback function for the BPy_Text type. It */ -/* builds a meaninful string to represent text objects. */ -/*****************************************************************************/ -static PyObject *Text_repr( BPy_Text * self ) -{ - if( self->text ) - return PyString_FromFormat( "[Text \"%s\"]", - self->text->id.name + 2 ); - else - return PyString_FromString( "[Text ]" ); -} - -/*****************************************************************************/ -/* Python attributes get/set functions: */ -/*****************************************************************************/ -static PyObject *Text_getMode(BPy_Text * self) -{ - return PyInt_FromLong( self->text->flags ); -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Text_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"filename", (getter)Text_getFilename, (setter)NULL, - "text filename", NULL}, - {"mode", (getter)Text_getMode, (setter)NULL, - "text mode flag", NULL}, - {"nlines", (getter)Text_getNLines, (setter)NULL, - "number of lines", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Text_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Text_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "Blender Text", /* tp_name */ - sizeof( BPy_Text ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - NULL, /* tp_print */ - NULL, /* tp_getattr */ - NULL, /* tp_setattr */ - ( cmpfunc ) Text_compare, /* tp_compare */ - ( reprfunc ) Text_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Text_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Text_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 -}; diff --git a/source/blender/python/api2_2x/Text.h b/source/blender/python/api2_2x/Text.h deleted file mode 100644 index 90de82f1254..00000000000 --- a/source/blender/python/api2_2x/Text.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * $Id: Text.h 10136 2007-02-25 01:07:28Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_TEXT_H -#define EXPP_TEXT_H - -#include -#include "DNA_text_types.h" - -extern PyTypeObject Text_Type; - -/* Type checking for EXPP PyTypes */ -#define BPy_Text_Check(v) ((v)->ob_type == &Text_Type) - -typedef struct { - PyObject_HEAD - Text * text; /* libdata must be second */ -} BPy_Text; - -PyObject *Text_Init( void ); -PyObject *Text_CreatePyObject( Text * txt ); - -#endif /* EXPP_TEXT_H */ diff --git a/source/blender/python/api2_2x/Text3d.c b/source/blender/python/api2_2x/Text3d.c deleted file mode 100644 index 6194b232401..00000000000 --- a/source/blender/python/api2_2x/Text3d.c +++ /dev/null @@ -1,1206 +0,0 @@ -/* - * $Id: Text3d.c 11099 2007-06-28 13:46:42Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joilnen Leite - * Johnny Matthews - * Campbell BArton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ - -#include "Text3d.h" /*This must come first*/ - -#include "DNA_object_types.h" -#include "MEM_guardedalloc.h" -#include "BKE_curve.h" -#include "BKE_library.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BIF_editfont.h" /* do_textedit() */ -#include "Curve.h" -#include "constant.h" -#include "Font.h" -#include "gen_utils.h" -#include "gen_library.h" - - -enum t3d_consts { - EXPP_T3D_ATTR_FRAME_WIDTH = 0, - EXPP_T3D_ATTR_FRAME_HEIGHT, - EXPP_T3D_ATTR_FRAME_X, - EXPP_T3D_ATTR_FRAME_Y -}; - - -/*no prototypes declared in header files - external linkage outside of python*/ -extern VFont *get_builtin_font(void); -extern void freedisplist(struct ListBase *lb); -extern VFont *give_vfontpointer(int); -extern VFont *exist_vfont(char *str); -extern VFont *load_vfont(char *name); -extern int BLI_exist(char *name); - -/*****************************************************************************/ -/* Python API function prototypes for the Text3D module. */ -/*****************************************************************************/ -static PyObject *M_Text3d_New( PyObject * self, PyObject * args ); -static PyObject *M_Text3d_Get( PyObject * self, PyObject * args ); -PyObject *M_Text3d_LoadFont (PyObject * self, PyObject * args ); - -/***************************************************************************** - * Python callback function prototypes for the Text3D module. - *****************************************************************************/ -static PyObject *return_ModuleConstant( char *constant_name); -static PyObject *generate_ModuleIntConstant(char *name, int value); - -/*****************************************************************************/ -/* Python method structure definition for Blender.Text3d module: */ -/*****************************************************************************/ -struct PyMethodDef M_Text3d_methods[] = { - {"New", ( PyCFunction ) M_Text3d_New, METH_VARARGS, NULL}, - {"Get", ( PyCFunction ) M_Text3d_Get, METH_VARARGS, NULL}, - {"LoadFont", ( PyCFunction ) M_Text3d_LoadFont, METH_O, NULL}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python Text3d_Type callback function prototypes: */ -/*****************************************************************************/ -/* int Text3dPrint (BPy_Text3d *msh, FILE *fp, int flags); */ - - -static PyObject *Text3d_repr( BPy_Text3d * self ); -static int Text3d_compare( BPy_Text3d * a, BPy_Text3d * b ); - -/*****************************************************************************/ -/* Python BPy_Text3d methods declarations: */ -/*****************************************************************************/ -/*PyObject *Text3d_getType(BPy_Text3d *self);*/ -static PyObject *Text3d_getName( BPy_Text3d * self ); -static PyObject *Text3d_setName( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_setText( BPy_Text3d * self, PyObject * value ); -static PyObject *Text3d_getText( BPy_Text3d * self ); -static PyObject *Text3d_getDrawMode( BPy_Text3d * self ); -static PyObject *Text3d_setDrawMode( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getUVorco( BPy_Text3d * self ); -static PyObject *Text3d_setUVorco( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getBevelAmount( BPy_Text3d * self ); -static PyObject *Text3d_setBevelAmount( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getDefaultResolution( BPy_Text3d * self ); -static PyObject *Text3d_setDefaultResolution( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getWidth( BPy_Text3d * self ); -static PyObject *Text3d_setWidth( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getExtrudeDepth( BPy_Text3d * self ); -static PyObject *Text3d_setExtrudeDepth( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getExtrudeBevelDepth( BPy_Text3d * self ); -static PyObject *Text3d_setExtrudeBevelDepth( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getShear( BPy_Text3d * self ); -static PyObject *Text3d_setShear( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getSize( BPy_Text3d * self ); -static PyObject *Text3d_setSize( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getLineSeparation( BPy_Text3d * self ); -static PyObject *Text3d_setLineSeparation( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getSpacing( BPy_Text3d * self ); -static PyObject *Text3d_setSpacing( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getXoffset( BPy_Text3d * self ); -static PyObject *Text3d_setXoffset( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getYoffset( BPy_Text3d * self ); -static PyObject *Text3d_setYoffset( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getAlignment( BPy_Text3d * self ); -static PyObject *Text3d_setAlignment( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_getFont( BPy_Text3d * self ); -static PyObject *Text3d_setFont( BPy_Text3d * self, PyObject * args ); -static PyObject *Text3d_addFrame( BPy_Text3d * self ); -static PyObject *Text3d_removeFrame( BPy_Text3d * self, PyObject * args ); - -/*****************************************************************************/ -/* Python BPy_Text3d methods table: */ -/*****************************************************************************/ -char M_Text3D_doc[] = "The Blender Text3D module\n\n\ - This module provides control over Text Curve objects in Blender.\n"; - -static PyMethodDef BPy_Text3d_methods[] = { - {"getName", ( PyCFunction ) Text3d_getName, - METH_NOARGS, "() - Return Text3d Data name"}, - {"setName", ( PyCFunction ) Text3d_setName, - METH_VARARGS, "() - Sets Text3d Data name"}, - {"setText", ( PyCFunction ) Text3d_setText, - METH_O, "() - Sets Text3d Data"}, - {"getText", ( PyCFunction ) Text3d_getText, - METH_NOARGS, "() - Gets Text3d Data"}, - {"getDrawMode", ( PyCFunction ) Text3d_getDrawMode, - METH_NOARGS, "() - Return the font drawing mode"}, - {"setDrawMode", ( PyCFunction ) Text3d_setDrawMode, - METH_VARARGS, "(int) - Set the font drawing mode"}, - {"getUVorco", ( PyCFunction ) Text3d_getUVorco, - METH_NOARGS, "() - Return wether UV coords are used for Texture mapping"}, - {"setUVorco", ( PyCFunction ) Text3d_setUVorco, - METH_VARARGS, "() - Set the font to use UV coords for Texture mapping"}, - {"getBevelAmount", ( PyCFunction ) Text3d_getBevelAmount, - METH_NOARGS, "() - Return bevel resolution"}, - {"setBevelAmount", ( PyCFunction ) Text3d_setBevelAmount, - METH_VARARGS, "() - Sets bevel resolution"}, - {"getDefaultResolution", ( PyCFunction ) Text3d_getDefaultResolution, - METH_NOARGS, "() - Return Default text resolution"}, - {"setDefaultResolution", ( PyCFunction ) Text3d_setDefaultResolution, - METH_VARARGS, "() - Sets Default text Resolution"}, - {"getWidth", ( PyCFunction ) Text3d_getWidth, - METH_NOARGS, "() - Return curve width"}, - {"setWidth", ( PyCFunction ) Text3d_setWidth, - METH_VARARGS, "(int) - Sets curve width"}, - {"getExtrudeDepth", ( PyCFunction ) Text3d_getExtrudeDepth, - METH_NOARGS, "() - Gets Text3d ExtrudeDepth"}, - {"setExtrudeDepth", ( PyCFunction ) Text3d_setExtrudeDepth, - METH_VARARGS, "() - Sets Text3d ExtrudeDepth"}, - {"getExtrudeBevelDepth", ( PyCFunction ) Text3d_getExtrudeBevelDepth, - METH_NOARGS, "() - Gets Text3d ExtrudeBevelDepth"}, - {"setExtrudeBevelDepth", ( PyCFunction ) Text3d_setExtrudeBevelDepth, - METH_VARARGS, "() - Sets Text3d ExtrudeBevelDepth"}, - {"getShear", ( PyCFunction ) Text3d_getShear, - METH_NOARGS, "() - Gets Text3d Shear Data"}, - {"setShear", ( PyCFunction ) Text3d_setShear, - METH_VARARGS, "() - Sets Text3d Shear Data"}, - {"getSize", ( PyCFunction ) Text3d_getSize, - METH_NOARGS, "() - Gets Text3d Size Data"}, - {"setSize", ( PyCFunction ) Text3d_setSize, - METH_VARARGS, "() - Sets Text3d Size Data"}, - {"getLineSeparation", ( PyCFunction ) Text3d_getLineSeparation, - METH_NOARGS, "() - Gets Text3d LineSeparation Data"}, - {"setLineSeparation", ( PyCFunction ) Text3d_setLineSeparation, - METH_VARARGS, "() - Sets Text3d LineSeparation Data"}, - {"getSpacing", ( PyCFunction ) Text3d_getSpacing, - METH_NOARGS, "() - Gets Text3d letter spacing"}, - {"setSpacing", ( PyCFunction ) Text3d_setSpacing, - METH_VARARGS, "() - Sets Text3d letter spacing"}, - {"getXoffset", ( PyCFunction ) Text3d_getXoffset, - METH_NOARGS, "() - Gets Text3d Xoffset Data"}, - {"setXoffset", ( PyCFunction ) Text3d_setXoffset, - METH_VARARGS, "() - Sets Text3d Xoffset Data"}, - {"getYoffset", ( PyCFunction ) Text3d_getYoffset, - METH_NOARGS, "() - Gets Text3d Yoffset Data"}, - {"setYoffset", ( PyCFunction ) Text3d_setYoffset, - METH_VARARGS, "() - Sets Text3d Yoffset Data"}, - {"getAlignment", ( PyCFunction ) Text3d_getAlignment, - METH_NOARGS, "() - Gets Text3d Alignment Data"}, - {"setAlignment", ( PyCFunction ) Text3d_setAlignment, - METH_VARARGS, "() - Sets Text3d Alignment Data"}, - {"getFont", ( PyCFunction ) Text3d_getFont, - METH_NOARGS, "() - Gets font list for Text3d"}, - {"setFont", ( PyCFunction ) Text3d_setFont, - METH_VARARGS, "() - Sets font for Text3d"}, - {"addFrame", ( PyCFunction ) Text3d_addFrame, - METH_NOARGS, "() - adds a new text frame"}, - {"removeFrame", ( PyCFunction ) Text3d_removeFrame, - METH_VARARGS, "(index) - remove this frame"}, - {NULL, NULL, 0, NULL} -}; - - -static PyObject *Text3d_getTotalFrames( BPy_Text3d * self ) -{ - return PyInt_FromLong( (long)(self->curve->totbox ) ); -} - -static PyObject *Text3d_getActiveFrame( BPy_Text3d * self ) -{ - return PyInt_FromLong( (long)(self->curve->actbox-1) ); -} - -static int Text3d_setActiveFrame( BPy_Text3d * self, PyObject * value ) -{ - struct Curve *curve= self->curve; - PyObject* frame_int = PyNumber_Int( value ); - int index; - - - if( !frame_int ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected integer argument" ); - - index = ( int )PyInt_AS_LONG( frame_int ); - index ++; - if (index < 1 || index > curve->totbox) - return EXPP_ReturnIntError( PyExc_IndexError, - "index out of range" ); - - curve->actbox = index; - - return 0; -} - - -static PyObject *getFloatAttr( BPy_Text3d *self, void *type ) -{ - float param; - struct Curve *curve= self->curve; - - switch( (int)type ) { - case EXPP_T3D_ATTR_FRAME_WIDTH: - param = curve->tb[curve->actbox-1].w; - break; - case EXPP_T3D_ATTR_FRAME_HEIGHT: - param = curve->tb[curve->actbox-1].h; - break; - case EXPP_T3D_ATTR_FRAME_X: - param = curve->tb[curve->actbox-1].x; - break; - case EXPP_T3D_ATTR_FRAME_Y: - param = curve->tb[curve->actbox-1].y; - break; - - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "undefined type in getFloatAttr" ); - } - return PyFloat_FromDouble( param ); -} - -static int setFloatAttrClamp( BPy_Text3d *self, PyObject *value, void *type ) -{ - float *param; - struct Curve *curve= self->curve; - float min, max; - - switch( (int)type ) { - case EXPP_T3D_ATTR_FRAME_WIDTH: - min = 0.0; - max = 50.0; - param = &(curve->tb[curve->actbox-1].w); - break; - case EXPP_T3D_ATTR_FRAME_HEIGHT: - min = 0.0; - max = 50.0; - param = &(curve->tb[curve->actbox-1].h); - break; - case EXPP_T3D_ATTR_FRAME_X: - min = 0.0; - max = 50.0; - param = &(curve->tb[curve->actbox-1].x); - break; - case EXPP_T3D_ATTR_FRAME_Y: - min = 0.0; - max = 50.0; - param = &(curve->tb[curve->actbox-1].y); - break; - - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setFloatAttrClamp" ); - } - - return EXPP_setFloatClamped( value, param, min, max ); -} - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Text3d_getseters[] = { - GENERIC_LIB_GETSETATTR, /* didnt have any attributes, at least lets have the standard ID attrs */ - {"activeFrame", - (getter)Text3d_getActiveFrame, (setter)Text3d_setActiveFrame, - "the index of the active text frame", - NULL}, - {"totalFrames", - (getter)Text3d_getTotalFrames, (setter)NULL, - "the total number of text frames", - NULL}, - - {"frameWidth", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the width of the active text frame", - (void *)EXPP_T3D_ATTR_FRAME_WIDTH}, - {"frameHeight", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the height of the active text frame", - (void *)EXPP_T3D_ATTR_FRAME_HEIGHT}, - {"frameX", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the X position of the active text frame", - (void *)EXPP_T3D_ATTR_FRAME_X}, - {"frameY", - (getter)getFloatAttr, (setter)setFloatAttrClamp, - "the Y position of the active text frame", - (void *)EXPP_T3D_ATTR_FRAME_Y}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Text3d_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Text3d_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "Text3d", /* tp_name */ - sizeof( BPy_Text3d ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - NULL, /* tp_print */ - NULL, /* tp_getattr */ - NULL, /* tp_setattr */ - ( cmpfunc ) Text3d_compare, /* tp_compare */ - ( reprfunc ) Text3d_repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Text3d_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Text3d_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 -}; - - -/* - * Text3d_update( ) - * method to update display list for a Curve. - */ -static PyObject *Text3d_update( BPy_Text3d * self ) -{ - freedisplist( &self->curve->disp ); - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: M_Text3d_New */ -/* Python equivalent: Blender.Text3d.New */ -/*****************************************************************************/ - -PyObject *M_Text3d_New( PyObject * self, PyObject * args ) -{ - char *name = NULL; - BPy_Text3d *pytext3d; /* for Curve Data object wrapper in Python */ - Text3d *bltext3d = 0; /* for actual Curve Data we create in Blender */ - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "expected string argument or no argument" ) ); - - bltext3d = add_curve( "Text", OB_FONT ); /* first create the Curve Data in Blender */ - bltext3d->vfont= get_builtin_font(); - bltext3d->vfont->id.us++; - bltext3d->str= MEM_mallocN(12, "str"); - strcpy(bltext3d->str, "Text"); - bltext3d->pos= 4; - - bltext3d->strinfo= MEM_callocN(12*sizeof(CharInfo), "strinfo"); - bltext3d->totbox= bltext3d->actbox= 1; - bltext3d->tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "textbox"); - bltext3d->tb[0].w = bltext3d->tb[0].h = 0.0; - - if( bltext3d == NULL ) /* bail out if add_curve() failed */ - return ( EXPP_ReturnPyObjError - ( PyExc_RuntimeError, - "couldn't create Curve Data in Blender" ) ); - - /* return user count to zero because add_curve() inc'd it */ - bltext3d->id.us = 0; - /* create python wrapper obj */ - pytext3d = ( BPy_Text3d * ) PyObject_NEW( BPy_Text3d, &Text3d_Type ); - - if( pytext3d == NULL ) - return ( EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create Curve Data object" ) ); - - pytext3d->curve = bltext3d; /* link Python curve wrapper to Blender Curve */ - if( name ) - rename_id( &bltext3d->id, name ); - - Text3d_update ( pytext3d ); - return ( PyObject * ) pytext3d; -} - -PyObject *M_Text3d_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Text3d *curv_iter; - BPy_Text3d *wanted_curv; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) /* expects nothing or a string */ - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string argument" ) ); - if( name ) { /*a name has been given */ - /* Use the name to search for the curve requested */ - wanted_curv = NULL; - curv_iter = G.main->curve.first; - - while( ( curv_iter ) && ( wanted_curv == NULL ) ) { - - if( strcmp( name, curv_iter->id.name + 2 ) == 0 ) { - wanted_curv = ( BPy_Text3d * ) - PyObject_NEW( BPy_Text3d, &Text3d_Type ); - if( wanted_curv ) - wanted_curv->curve = curv_iter; - } - - curv_iter = curv_iter->id.next; - } - - if( wanted_curv == NULL ) { /* Requested curve doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Curve \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return ( PyObject * ) wanted_curv; - } /* end of if(name) */ - else { - /* no name has been given; return a list of all curves by name. */ - PyObject *curvlist; - - curv_iter = G.main->curve.first; - curvlist = PyList_New( 0 ); - - if( curvlist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( curv_iter && curv_iter->vfont ) { - BPy_Text3d *found_text3d = - ( BPy_Text3d * ) PyObject_NEW( BPy_Text3d, - &Text3d_Type ); - found_text3d->curve = curv_iter; - PyList_Append( curvlist, ( PyObject * ) found_text3d ); - Py_DECREF(found_text3d); - curv_iter = curv_iter->id.next; - } - return ( curvlist ); - } -} - -static PyObject *generate_ModuleIntConstant(char *name, int value) -{ - PyObject *constant = PyConstant_New(); - - PyConstant_Insert((BPy_constant*)constant, - "value", PyInt_FromLong(value)); - PyConstant_Insert((BPy_constant*)constant, - "name", PyString_FromString(name)); - - Py_INCREF(constant); - return constant; -} - -PyObject *Text3d_Init( void ) -{ - //module - PyObject *submodule, *dict; - - //add module... - if( PyType_Ready( &Text3d_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.Text3d", M_Text3d_methods, - M_Text3D_doc); - - //add constants to module... - PyModule_AddObject( submodule, "LEFT", - generate_ModuleIntConstant("Text3d.LEFT", CU_LEFT)); - PyModule_AddObject( submodule, "MIDDLE", - generate_ModuleIntConstant("Text3d.MIDDLE", CU_MIDDLE)); - PyModule_AddObject( submodule, "RIGHT", - generate_ModuleIntConstant("Text3d.RIGHT", CU_RIGHT)); - PyModule_AddObject( submodule, "FLUSH", - generate_ModuleIntConstant("Text3d.FLUSH", CU_FLUSH)); - PyModule_AddObject( submodule, "JUSTIFY", - generate_ModuleIntConstant("Text3d.JUSTIFY", CU_JUSTIFY)); - PyModule_AddObject( submodule, "DRAW3D", - generate_ModuleIntConstant("Text3d.DRAW3D", CU_3D)); - PyModule_AddObject( submodule, "DRAWFRONT", - generate_ModuleIntConstant("Text3d.DRAWFRONT", CU_FRONT)); - PyModule_AddObject( submodule, "DRAWBACK", - generate_ModuleIntConstant("Text3d.DRAWBACK", CU_BACK)); - PyModule_AddObject( submodule, "UVORCO", - generate_ModuleIntConstant("Text3d.UVORCO", CU_UV_ORCO)); - dict = PyModule_GetDict( submodule ); - PyDict_SetItemString( dict, "Font", Font_Init( ) ); - return ( submodule ); -} - -/**************************************************************************** - * Function: Text3d_repr - * Description: Callback function for the BPy_Text3d type to It - * build a meaninful string to represent Text3d objects. - * - ***************************************************************************/ - -static PyObject *Text3d_repr( BPy_Text3d * self ) -{ - /* skip over CU in idname. CUTEXT */ - return PyString_FromFormat( "[Text3d \"%s\"]", - self->curve->id.name + 2 ); -} - -/**************************************************************************** - * Function: Text3d_compare - * Description: Callback function for the BPy_Text3d type to Compare 2 types - * - ***************************************************************************/ - -/* mat_a==mat_b or mat_a!=mat_b*/ -static int Text3d_compare( BPy_Text3d * a, BPy_Text3d * b ) -{ - return ( a->curve == b->curve) ? 0 : -1; -} - -struct Text3d *Text3d_FromPyObject( PyObject * py_obj ) -{ - BPy_Text3d *blen_obj; - - blen_obj = ( BPy_Text3d * ) py_obj; - return ((struct Text3d*) blen_obj->curve ); -} - -static PyObject *return_ModuleConstant( char *constant_name){ - - PyObject *module = NULL, *dict = NULL, *constant = NULL;; - - module = PyImport_AddModule("Blender.Text3d"); - if(!module){ //null = error returning module - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "error encountered with returning module constant..." ) ); - } - dict = PyModule_GetDict(module); //never fails - - constant = PyDict_GetItemString(dict, constant_name); - if(!constant){ //null = key not found - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "error encountered with returning module constant..." ) ); - } - - return EXPP_incr_ret( constant ); -} - -static PyObject *Text3d_getName( BPy_Text3d * self ) -{ - return Curve_getName( (BPy_Curve*)self ); -} - -static PyObject *Text3d_setName( BPy_Text3d * self, PyObject * args ) -{ - return Curve_setName( (BPy_Curve*)self,args ); -} - -static PyObject *Text3d_setText( BPy_Text3d * self, PyObject * value ) -{ - char *text = PyString_AsString(value); - - if( !text ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected string argument" ); - - /* - * If the text is currently being edited, then we have to put the - * text into the edit buffer. - */ - - if( G.obedit && G.obedit->data == self->curve ) { - short qual = G.qual; - G.qual = 0; /* save key qualifier, then clear it */ - self->curve->pos = self->curve->len = 0; - while ( *text ) - do_textedit( 0, 0, *text++ ); - G.qual = qual; - } else { - short len = (short)strlen(text); - MEM_freeN( self->curve->str ); - self->curve->str = MEM_callocN( len+sizeof(wchar_t), "str" ); - strcpy( self->curve->str, text ); - self->curve->pos = len; - self->curve->len = len; - - if( self->curve->strinfo ) - MEM_freeN( self->curve->strinfo ); - /* don't know why this is +4, just duplicating load_editText() */ - self->curve->strinfo = MEM_callocN( (len+4) *sizeof(CharInfo), - "strinfo"); - } - Py_RETURN_NONE; -} - -static PyObject *Text3d_getText( BPy_Text3d * self ) -{ - if( self->curve->str ) - return PyString_FromString( self->curve->str ); - - Py_RETURN_NONE; -} - -static PyObject* Text3d_getDrawMode(BPy_Text3d* self) -{ - PyObject *tuple = NULL; - int size = 0, pos = 0; - - //get the tuple size - if(self->curve->flag & CU_3D) - size++; - if (self->curve->flag & CU_FRONT) - size++; - if (self->curve->flag & CU_BACK) - size++; - - //generate tuple - tuple = PyTuple_New(size); - - //load tuple - if(self->curve->flag & CU_3D){ - PyTuple_SET_ITEM( tuple, pos, return_ModuleConstant("DRAW3D")); - pos++; - } - if (self->curve->flag & CU_FRONT){ - PyTuple_SET_ITEM( tuple, pos, return_ModuleConstant("DRAWFRONT")); - pos++; - } - if (self->curve->flag & CU_BACK){ - PyTuple_SET_ITEM( tuple, pos, return_ModuleConstant("DRAWBACK")); - pos++; - } - - return tuple; -} - -static PyObject* Text3d_setDrawMode(BPy_Text3d* self,PyObject* args) -{ - PyObject *listObject = NULL; - int size, i; - short temp; - - size = PySequence_Length(args); - if ( size == 1 ) { - listObject = PySequence_GetItem(args, 0); - if ( PySequence_Check(listObject) ) { - size = PySequence_Length(listObject); - }else{ //not a sequence but maybe a single constant - Py_INCREF(args); - listObject = args; - } - } else { //a list of objects (non-sequence) - Py_INCREF(args); - listObject = args; - } - if ( size > 3 || size < 1 ) { - //bad number of arguments - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "too many parameters - expects 1 - 3 constants" ) ); - } - //clear bits - temp = self->curve->flag; //in case of failure - if(self->curve->flag & CU_3D) - self->curve->flag &= ~CU_3D; - if(self->curve->flag & CU_FRONT) - self->curve->flag &= ~CU_FRONT; - if(self->curve->flag & CU_BACK) - self->curve->flag &= ~CU_BACK; - - //parse and set bits - for (i = 0; i < size; i++) { - PyObject *v; - int value; - - v = PySequence_GetItem(listObject, i); - if (v == NULL) { //unable to return item - null = failure - Py_DECREF(listObject); - self->curve->flag = temp; - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "unable to parse list" ) ); - } - if( !BPy_Constant_Check(v)){ - Py_DECREF(listObject); - Py_DECREF(v); - self->curve->flag = temp; - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "bad argument types - expects module constants" ) ); - } - value = PyInt_AS_LONG(PyDict_GetItemString( - ((BPy_constant*)v)->dict, "value")); - self->curve->flag |= (short)value; - Py_DECREF(v); - } - Py_DECREF(listObject); - Py_RETURN_NONE; -} - -static PyObject* Text3d_getUVorco(BPy_Text3d* self) -{ - if(self->curve->flag & CU_UV_ORCO) - return EXPP_incr_ret_True(); - else - return EXPP_incr_ret_False(); -} - -static PyObject* Text3d_setUVorco(BPy_Text3d* self,PyObject* args) -{ - int flag; - - if( !PyArg_ParseTuple( args, "i", &flag ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected TRUE or FALSE (1 or 0)" ); - - if( flag < 0 || flag > 1 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected TRUE or FALSE (1 or 0)" ); - - if( flag ) - self->curve->flag |= CU_UV_ORCO; - else - self->curve->flag &= ~CU_UV_ORCO; - - Py_RETURN_NONE; -} - -static PyObject* Text3d_getBevelAmount(BPy_Text3d* self) -{ - return Curve_getBevresol((BPy_Curve*)self); -} - -static PyObject* Text3d_setBevelAmount(BPy_Text3d* self,PyObject* args) -{ - return Curve_setBevresol((BPy_Curve*)self,args); -} - -static PyObject *Text3d_getDefaultResolution( BPy_Text3d * self ) -{ - return Curve_getResolu( (BPy_Curve*)self ); -} - -static PyObject *Text3d_setDefaultResolution( BPy_Text3d * self, PyObject * args ) -{ - return Curve_setResolu( (BPy_Curve*)self,args ); -} - -static PyObject *Text3d_getWidth( BPy_Text3d * self ) -{ - return Curve_getWidth( (BPy_Curve*)self ); -} - -static PyObject *Text3d_setWidth( BPy_Text3d * self, PyObject * args ) -{ - return Curve_setWidth( (BPy_Curve*)self,args ); -} - -static PyObject *Text3d_getExtrudeDepth( BPy_Text3d * self ) -{ - return Curve_getExt1( (BPy_Curve*)self ); -} - -static PyObject *Text3d_setExtrudeDepth( BPy_Text3d * self, PyObject * args ) -{ - return Curve_setExt1( (BPy_Curve*)self,args ); -} - -static PyObject *Text3d_getExtrudeBevelDepth( BPy_Text3d * self ) -{ - return Curve_getExt2( (BPy_Curve*)self ); -} - -static PyObject *Text3d_setExtrudeBevelDepth( BPy_Text3d * self, PyObject * args ) -{ - return Curve_setExt2( (BPy_Curve*)self,args ); -} - -static PyObject *Text3d_getShear( BPy_Text3d * self ) -{ - PyObject *attr = PyFloat_FromDouble( (double) self->curve->shear ); - - if( attr ) - return attr; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Curve.shear attribute" ) ); -} - -static PyObject *Text3d_setShear( BPy_Text3d * self, PyObject * args ) -{ - float value; - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - - if(value > 1.0f || value < -1.0f) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "acceptable values are between 1.0 and -1.0" ) ); - self->curve->shear = value; - - Py_RETURN_NONE; -} - -static PyObject *Text3d_getSize( BPy_Text3d * self ) -{ - PyObject *attr = PyFloat_FromDouble( (double) self->curve->fsize ); - - if( attr ) - return attr; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Curve.fsize attribute" ) ); -} - -static PyObject *Text3d_setSize( BPy_Text3d * self, PyObject * args ) -{ - float value; - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - - if(value > 10.0f || value < 0.1f) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "acceptable values are between 10.0 and 0.1" ) ); - self->curve->fsize = value; - - Py_RETURN_NONE; -} - -static PyObject *Text3d_getLineSeparation( BPy_Text3d * self ) -{ - PyObject *attr = PyFloat_FromDouble( (double) self->curve->linedist ); - - if( attr ) - return attr; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Curve.linedist attribute" ) ); -} - -static PyObject *Text3d_setLineSeparation( BPy_Text3d * self, PyObject * args ) -{ - float value; - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - - if(value > 10.0f || value < 0.0f) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "acceptable values are between 10.0 and 0.0" ) ); - self->curve->linedist = value; - - Py_RETURN_NONE; -} - -static PyObject *Text3d_getSpacing( BPy_Text3d * self ) -{ - PyObject *attr = PyFloat_FromDouble( (double) self->curve->spacing ); - - if( attr ) - return attr; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Curve.spacing attribute" ) ); -} - -static PyObject *Text3d_setSpacing( BPy_Text3d * self, PyObject * args ) -{ - float value; - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - - if(value > 10.0f || value < 0.0f) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "acceptable values are between 10.0 and 0.0" ) ); - self->curve->spacing = value; - - Py_RETURN_NONE; -} -static PyObject *Text3d_getXoffset( BPy_Text3d * self ) -{ - PyObject *attr = PyFloat_FromDouble( (double) self->curve->xof ); - - if( attr ) - return attr; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Curve.xof attribute" ) ); -} - -static PyObject *Text3d_setXoffset( BPy_Text3d * self, PyObject * args ) -{ - float value; - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - - if(value > 50.0f || value < -50.0f) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "acceptable values are between 50.0 and -50.0" ) ); - self->curve->xof = value; - - Py_RETURN_NONE; -} - -static PyObject *Text3d_getYoffset( BPy_Text3d * self ) -{ - PyObject *attr = PyFloat_FromDouble( (double) self->curve->yof ); - - if( attr ) - return attr; - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Curve.yof attribute" ) ); -} - -static PyObject *Text3d_setYoffset( BPy_Text3d * self, PyObject * args ) -{ - float value; - - if( !PyArg_ParseTuple( args, "f", &value ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected float argument" ) ); - - if(value > 50.0f || value < -50.0f) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "acceptable values are between 50.0 and -50.0" ) ); - self->curve->yof = value; - - Py_RETURN_NONE; -} - -static PyObject *Text3d_getAlignment( BPy_Text3d * self ) -{ - if(self->curve->spacemode == CU_LEFT){ - return return_ModuleConstant("LEFT"); - }else if (self->curve->spacemode == CU_MIDDLE){ - return return_ModuleConstant("MIDDLE"); - }else if (self->curve->spacemode == CU_RIGHT){ - return return_ModuleConstant("RIGHT"); - }else if (self->curve->spacemode == CU_FLUSH){ - return return_ModuleConstant("FLUSH"); - }else if (self->curve->spacemode == CU_JUSTIFY){ - return return_ModuleConstant("JUSTIFY"); - } - - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't get Curve.spacemode attribute" ) ); -} - -static PyObject *Text3d_setAlignment( BPy_Text3d * self, PyObject * args ) -{ - BPy_constant *constant; - int value; - - if( !PyArg_ParseTuple( args, "O!", &constant_Type, &constant ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected module constant" ) ); - - value = PyInt_AS_LONG(PyDict_GetItemString(constant->dict, "value")); - self->curve->spacemode = (short)value; - - Py_RETURN_NONE; -} - - -/***************************************************************************** - * Function: Text3d_CreatePyObject - * Description: This function will create a new BPy_Text3d from an existing - * Blender structure. - *****************************************************************************/ - -PyObject *Text3d_CreatePyObject( Text3d * text3d ) -{ - BPy_Text3d *pytext3d; - - pytext3d = ( BPy_Text3d * ) PyObject_NEW( BPy_Text3d, &Text3d_Type ); - - if( !pytext3d ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Text3d object" ); - - pytext3d->curve = text3d; - - return ( PyObject * ) pytext3d; -} - -static PyObject *Text3d_getFont( BPy_Text3d * self ) -{ - if (self->curve) - return Font_CreatePyObject (self->curve->vfont); - else - Py_RETURN_NONE; -} - -static PyObject *Text3d_setFont( BPy_Text3d * self, PyObject * args ) -{ - BPy_Font *pyobj= NULL; - VFont *vf; //, *vfont; - if( !PyArg_ParseTuple( args, "|O!",&Font_Type, &pyobj) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string" ); - if( !pyobj ) { - // pyobj= M_Text3d_LoadFont (self, Py_BuildValue("(s)", "")); - self->curve->vfont= get_builtin_font (); - Py_RETURN_NONE; - } - vf= exist_vfont(pyobj->font->name); - if (vf) { - id_us_plus((ID *)vf); - self->curve->vfont->id.us--; - self->curve->vfont= vf; - } - else { - vf= load_vfont (pyobj->font->name); - if (vf) { - id_us_plus((ID *)vf); - self->curve->vfont->id.us--; - self->curve->vfont= vf; - } - } - Py_RETURN_NONE; -} - -static PyObject *Text3d_addFrame( BPy_Text3d * self ) -{ - Curve *cu = self->curve; - - if (cu->totbox >= 256) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "limited to 256 frames" ); - - cu->totbox++; - cu->tb[cu->totbox-1]= cu->tb[cu->totbox-2]; - Py_RETURN_NONE; -} - -static PyObject *Text3d_removeFrame( BPy_Text3d * self, PyObject * args ) -{ - Curve *cu = self->curve; - int index, i; - - if (cu->totbox == 1) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "cannot remove the last frame" ); - - index = cu->totbox-1; - - if( !PyArg_ParseTuple( args, "|i", &index ) ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "expected an int" ); - - if (index < 0 || index >= cu->totbox ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "index out of range" ); - - for (i = index; i < cu->totbox; i++) cu->tb[i]= cu->tb[i+1]; - cu->totbox--; - cu->actbox--; - Py_RETURN_NONE; -} - - -PyObject *M_Text3d_LoadFont( PyObject * self, PyObject * value ) -{ - char *fontfile= PyString_AsString(value); - FILE *file= NULL; - VFont *vf= NULL; - - if( !fontfile ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected a string" ); - vf= exist_vfont(fontfile); - if( vf ) - return Font_CreatePyObject( vf ); - /* No use for that -- lukep - else - vf= NULL; - */ - file= fopen( fontfile, "r"); - - if( file || !strcmp (fontfile, "") ) { - load_vfont( fontfile ); - if(file) fclose( file ); - vf = exist_vfont( fontfile ); - if(vf) - return Font_CreatePyObject( vf ); - Py_RETURN_NONE; - } - - return EXPP_ReturnPyObjError( PyExc_TypeError, - "string isn't filename or fontpath" ); -} - diff --git a/source/blender/python/api2_2x/Text3d.h b/source/blender/python/api2_2x/Text3d.h deleted file mode 100644 index ddab385ca66..00000000000 --- a/source/blender/python/api2_2x/Text3d.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * $Id: Text3d.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Joilnen Leite - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_TEXT3D_H -#define EXPP_TEXT3D_H - -#include -#include "DNA_curve_types.h" - -extern PyTypeObject Text3d_Type; - -#define BPy_Text3d_Check(v) ((v)->ob_type==&Text3d_Type) -typedef Curve Text3d; - -/*prototypes*/ -PyObject *Text3d_Init( void ); -struct Text3d *Text3d_FromPyObject( PyObject * py_obj ); -PyObject *Text3d_CreatePyObject( Text3d* text3d ); - -/* Python BPy_Text3d structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - Text3d * curve; -} BPy_Text3d; - -#endif /* EXPP_TEXT3D_H */ - diff --git a/source/blender/python/api2_2x/Texture.c b/source/blender/python/api2_2x/Texture.c deleted file mode 100644 index 66ed88df8d0..00000000000 --- a/source/blender/python/api2_2x/Texture.c +++ /dev/null @@ -1,2516 +0,0 @@ -/* - * $Id: Texture.c 12535 2007-11-09 10:29:19Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Alex Mole, Nathan Letwory, Joilnen B. Leite, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ -#include "Texture.h" /*This must come first*/ - -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_idprop.h" -#include "BKE_library.h" -#include "BKE_texture.h" -#include "BKE_utildefines.h" - -#include "BLI_blenlib.h" - -#include "DNA_object_types.h" -#include "DNA_material_types.h" -#include "DNA_scene_types.h" -#include "DNA_texture_types.h" - -#include "MTex.h" -#include "Image.h" -#include "Ipo.h" -#include "IDProp.h" -#include "constant.h" -#include "blendef.h" -#include "gen_utils.h" -#include "gen_library.h" - -#include "vector.h" /* for Texture_evaluate(vec) */ -#include "Material.h" /* for EXPP_Colorband_fromPyList and EXPP_PyList_fromColorband */ -#include "RE_shader_ext.h" - -/*****************************************************************************/ -/* Blender.Texture constants */ -/*****************************************************************************/ -#define EXPP_TEX_TYPE_NONE 0 - -#define EXPP_TEX_TYPE_MIN EXPP_TEX_TYPE_NONE -#define EXPP_TEX_TYPE_MAX TEX_DISTNOISE - -#define EXPP_TEX_ANIMFRAME_MIN 0 -#define EXPP_TEX_ANIMFRAME_MAX ((int)MAXFRAMEF) -#define EXPP_TEX_ANIMLEN_MIN 0 -#define EXPP_TEX_ANIMLEN_MAX ((int)(MAXFRAMEF)/2) -#define EXPP_TEX_ANIMMONSTART_MIN 0 -#define EXPP_TEX_ANIMMONSTART_MAX ((int)MAXFRAMEF) -#define EXPP_TEX_ANIMMONDUR_MIN 0 -#define EXPP_TEX_ANIMMONDUR_MAX 250 -#define EXPP_TEX_ANIMOFFSET_MIN -((int)MAXFRAMEF) -#define EXPP_TEX_ANIMOFFSET_MAX ((int)MAXFRAMEF) -#define EXPP_TEX_ANIMSTART_MIN 1 -#define EXPP_TEX_ANIMSTART_MAX ((int)MAXFRAMEF) -#define EXPP_TEX_FIEIMA_MIN 1 -#define EXPP_TEX_FIEIMA_MAX 200 -#define EXPP_TEX_NOISEDEPTH_MIN 0 -#define EXPP_TEX_NOISEDEPTH_MAX 6 -/* max depth is different for magic type textures */ -#define EXPP_TEX_NOISEDEPTH_MAX_MAGIC 10 -#define EXPP_TEX_REPEAT_MIN 1 -#define EXPP_TEX_REPEAT_MAX 512 - -#define EXPP_TEX_FILTERSIZE_MIN 0.1f -#define EXPP_TEX_FILTERSIZE_MAX 25.0f -#define EXPP_TEX_NOISESIZE_MIN 0.0001f -#define EXPP_TEX_NOISESIZE_MAX 2.0f -#define EXPP_TEX_BRIGHTNESS_MIN 0.0f -#define EXPP_TEX_BRIGHTNESS_MAX 2.0f -#define EXPP_TEX_CONTRAST_MIN 0.01f -#define EXPP_TEX_CONTRAST_MAX 5.0f -#define EXPP_TEX_CROP_MIN -10.0f -#define EXPP_TEX_CROP_MAX 10.0f -#define EXPP_TEX_RGBCOL_MIN 0.0f -#define EXPP_TEX_RGBCOL_MAX 2.0f -#define EXPP_TEX_TURBULENCE_MIN 0.0f -#define EXPP_TEX_TURBULENCE_MAX 200.0f -#define EXPP_TEX_MH_G_MIN 0.0001f -#define EXPP_TEX_MH_G_MAX 2.0f -#define EXPP_TEX_LACUNARITY_MIN 0.0f -#define EXPP_TEX_LACUNARITY_MAX 6.0f -#define EXPP_TEX_OCTS_MIN 0.0f -#define EXPP_TEX_OCTS_MAX 8.0f -#define EXPP_TEX_ISCALE_MIN 0.0f -#define EXPP_TEX_ISCALE_MAX 10.0f -#define EXPP_TEX_EXP_MIN 0.010f -#define EXPP_TEX_EXP_MAX 10.0f -#define EXPP_TEX_WEIGHT1_MIN -2.0f -#define EXPP_TEX_WEIGHT1_MAX 2.0f -#define EXPP_TEX_WEIGHT2_MIN -2.0f -#define EXPP_TEX_WEIGHT2_MAX 2.0f -#define EXPP_TEX_WEIGHT3_MIN -2.0f -#define EXPP_TEX_WEIGHT3_MAX 2.0f -#define EXPP_TEX_WEIGHT4_MIN -2.0f -#define EXPP_TEX_WEIGHT4_MAX 2.0f -#define EXPP_TEX_DISTAMNT_MIN 0.0f -#define EXPP_TEX_DISTAMNT_MAX 10.0f - -/* i can't find these defined anywhere- they're just taken from looking at */ -/* the button creation code in source/blender/src/buttons_shading.c */ -/* cloud stype */ -#define EXPP_TEX_STYPE_CLD_DEFAULT 0 -#define EXPP_TEX_STYPE_CLD_COLOR 1 -/* wood stype */ -#define EXPP_TEX_STYPE_WOD_BANDS 0 -#define EXPP_TEX_STYPE_WOD_RINGS 1 -#define EXPP_TEX_STYPE_WOD_BANDNOISE 2 -#define EXPP_TEX_STYPE_WOD_RINGNOISE 3 -/* magic stype */ -#define EXPP_TEX_STYPE_MAG_DEFAULT 0 -/* marble stype */ -#define EXPP_TEX_STYPE_MBL_SOFT 0 -#define EXPP_TEX_STYPE_MBL_SHARP 1 -#define EXPP_TEX_STYPE_MBL_SHARPER 2 -/* blend stype */ -#define EXPP_TEX_STYPE_BLN_LIN 0 -#define EXPP_TEX_STYPE_BLN_QUAD 1 -#define EXPP_TEX_STYPE_BLN_EASE 2 -#define EXPP_TEX_STYPE_BLN_DIAG 3 -#define EXPP_TEX_STYPE_BLN_SPHERE 4 -#define EXPP_TEX_STYPE_BLN_HALO 5 -/* stucci stype */ -#define EXPP_TEX_STYPE_STC_PLASTIC 0 -#define EXPP_TEX_STYPE_STC_WALLIN 1 -#define EXPP_TEX_STYPE_STC_WALLOUT 2 -/* noise stype */ -#define EXPP_TEX_STYPE_NSE_DEFAULT 0 -/* image stype */ -#define EXPP_TEX_STYPE_IMG_DEFAULT 0 -/* plug-in stype */ -#define EXPP_TEX_STYPE_PLG_DEFAULT 0 -/* envmap stype */ -#define EXPP_TEX_STYPE_ENV_STATIC 0 -#define EXPP_TEX_STYPE_ENV_ANIM 1 -#define EXPP_TEX_STYPE_ENV_LOAD 2 -/* musgrave stype */ -#define EXPP_TEX_STYPE_MUS_MFRACTAL 0 -#define EXPP_TEX_STYPE_MUS_RIDGEDMF 1 -#define EXPP_TEX_STYPE_MUS_HYBRIDMF 2 -#define EXPP_TEX_STYPE_MUS_FBM 3 -#define EXPP_TEX_STYPE_MUS_HTERRAIN 4 -/* voronoi stype */ -#define EXPP_TEX_STYPE_VN_INT 0 -#define EXPP_TEX_STYPE_VN_COL1 1 -#define EXPP_TEX_STYPE_VN_COL2 2 -#define EXPP_TEX_STYPE_VN_COL3 3 - -#define EXPP_TEX_EXTEND_MIN TEX_EXTEND -#define EXPP_TEX_EXTEND_MAX TEX_CHECKER - -#define EXPP_TEX_NOISE_SINE 0 -#define EXPP_TEX_NOISE_SAW 1 -#define EXPP_TEX_NOISE_TRI 2 -#define EXPP_TEX_NOISEBASIS2 0xffff - -/****************************************************************************/ -/* Texture String->Int maps */ -/****************************************************************************/ - -static const EXPP_map_pair tex_type_map[] = { - {"None", EXPP_TEX_TYPE_NONE}, - {"Clouds", TEX_CLOUDS}, - {"Wood", TEX_WOOD}, - {"Marble", TEX_MARBLE}, - {"Magic", TEX_MAGIC}, - {"Blend", TEX_BLEND}, - {"Stucci", TEX_STUCCI}, - {"Noise", TEX_NOISE}, - {"Image", TEX_IMAGE}, - {"Plugin", TEX_PLUGIN}, - {"EnvMap", TEX_ENVMAP}, - {"Musgrave", TEX_MUSGRAVE}, - {"Voronoi", TEX_VORONOI}, - {"DistortedNoise", TEX_DISTNOISE}, - {NULL, 0} -}; - -static const EXPP_map_pair tex_flag_map[] = { -/* NOTE "CheckerOdd" and "CheckerEven" are new */ - {"ColorBand", TEX_COLORBAND }, - {"FlipBlend", TEX_FLIPBLEND}, - {"NegAlpha", TEX_NEGALPHA}, - {"CheckerOdd",TEX_CHECKER_ODD}, - {"CheckerEven",TEX_CHECKER_EVEN}, - {"PreviewAlpha",TEX_PRV_ALPHA}, - {"RepeatXMirror",TEX_REPEAT_XMIR}, - {"RepeatYMirror",TEX_REPEAT_YMIR}, - {NULL, 0} -}; - -/* NOTE: flags moved to image... */ -static const EXPP_map_pair tex_imageflag_map[] = { - {"InterPol", TEX_INTERPOL}, - {"UseAlpha", TEX_USEALPHA}, - {"MipMap", TEX_MIPMAP}, - {"Rot90", TEX_IMAROT}, - {"CalcAlpha", TEX_CALCALPHA}, - {"NormalMap", TEX_NORMALMAP}, - {NULL, 0} -}; - -static const EXPP_map_pair tex_extend_map[] = { - {"Extend", TEX_EXTEND}, - {"Clip", TEX_CLIP}, - {"ClipCube", TEX_CLIPCUBE}, - {"Repeat", TEX_REPEAT}, -/* NOTE "Checker" is new */ - {"Checker", TEX_CHECKER}, - {NULL, 0} -}; - -/* array of maps for stype */ -static const EXPP_map_pair tex_stype_default_map[] = { - {"Default", 0}, - {NULL, 0} -}; -static const EXPP_map_pair tex_stype_clouds_map[] = { - {"Default", 0}, - {"CloudDefault", EXPP_TEX_STYPE_CLD_DEFAULT}, - {"CloudColor", EXPP_TEX_STYPE_CLD_COLOR}, - {NULL, 0} -}; -static const EXPP_map_pair tex_stype_wood_map[] = { - {"Default", 0}, - {"WoodBands", EXPP_TEX_STYPE_WOD_BANDS}, - {"WoodRings", EXPP_TEX_STYPE_WOD_RINGS}, - {"WoodBandNoise", EXPP_TEX_STYPE_WOD_BANDNOISE}, - {"WoodRingNoise", EXPP_TEX_STYPE_WOD_RINGNOISE}, - {NULL, 0} -}; -static const EXPP_map_pair tex_stype_marble_map[] = { - {"Default", 0}, - {"MarbleSoft", EXPP_TEX_STYPE_MBL_SOFT}, - {"MarbleSharp", EXPP_TEX_STYPE_MBL_SHARP}, - {"MarbleSharper", EXPP_TEX_STYPE_MBL_SHARPER}, - {NULL, 0} -}; -static const EXPP_map_pair tex_stype_blend_map[] = { - {"Default", 0}, - {"BlendLin", EXPP_TEX_STYPE_BLN_LIN}, - {"BlendQuad", EXPP_TEX_STYPE_BLN_QUAD}, - {"BlendEase", EXPP_TEX_STYPE_BLN_EASE}, - {"BlendDiag", EXPP_TEX_STYPE_BLN_DIAG}, - {"BlendSphere", EXPP_TEX_STYPE_BLN_SPHERE}, - {"BlendHalo", EXPP_TEX_STYPE_BLN_HALO}, - {NULL, 0} -}; -static const EXPP_map_pair tex_stype_stucci_map[] = { - {"Default", 0}, - {"StucciPlastic", EXPP_TEX_STYPE_STC_PLASTIC}, - {"StucciWallIn", EXPP_TEX_STYPE_STC_WALLIN}, - {"StucciWallOut", EXPP_TEX_STYPE_STC_WALLOUT}, - {NULL, 0} -}; -static const EXPP_map_pair tex_stype_envmap_map[] = { - {"Default", 0}, - {"EnvmapStatic", EXPP_TEX_STYPE_ENV_STATIC}, - {"EnvmapAnim", EXPP_TEX_STYPE_ENV_ANIM}, - {"EnvmapLoad", EXPP_TEX_STYPE_ENV_LOAD}, - {NULL, 0} -}; - -static const EXPP_map_pair tex_stype_musg_map[] = { - {"Default", 0}, - {"MultiFractal", EXPP_TEX_STYPE_MUS_MFRACTAL}, - {"HeteroTerrain", EXPP_TEX_STYPE_MUS_HTERRAIN}, - {"RidgedMultiFractal", EXPP_TEX_STYPE_MUS_RIDGEDMF}, - {"HybridMultiFractal", EXPP_TEX_STYPE_MUS_HYBRIDMF}, - {"fBM", EXPP_TEX_STYPE_MUS_FBM}, - {NULL, 0} -}; - -static const EXPP_map_pair tex_stype_distortednoise_map[] = { - {"Default", 0}, - {"BlenderOriginal", TEX_BLENDER}, - {"OriginalPerlin", TEX_STDPERLIN}, - {"ImprovedPerlin", TEX_NEWPERLIN}, - {"VoronoiF1", TEX_VORONOI_F1}, - {"VoronoiF2", TEX_VORONOI_F2}, - {"VoronoiF3", TEX_VORONOI_F3}, - {"VoronoiF4", TEX_VORONOI_F4}, - {"VoronoiF2-F1", TEX_VORONOI_F2F1}, - {"VoronoiCrackle", TEX_VORONOI_CRACKLE}, - {"CellNoise", TEX_CELLNOISE}, - {NULL, 0} -}; - -static const EXPP_map_pair tex_stype_voronoi_map[] = { - {"Default", 0}, - {"Int", EXPP_TEX_STYPE_VN_INT}, - {"Col1", EXPP_TEX_STYPE_VN_COL1}, - {"Col2", EXPP_TEX_STYPE_VN_COL2}, - {"Col3", EXPP_TEX_STYPE_VN_COL3}, - {NULL, 0} -}; - -static const EXPP_map_pair tex_distance_voronoi_map[] = { - {"Default", 0}, - {"Distance", TEX_DISTANCE}, - {"DistanceSquared", TEX_DISTANCE_SQUARED}, - {"Manhattan", TEX_MANHATTAN}, - {"Chebychev", TEX_CHEBYCHEV}, - {"MinkovskyHalf", TEX_MINKOVSKY_HALF}, - {"MinkovskyFour", TEX_MINKOVSKY_FOUR}, - {"Minkovsky", TEX_MINKOVSKY}, - {NULL, 0} -}; - -static const EXPP_map_pair *tex_stype_map[] = { - tex_stype_default_map, /* none */ - tex_stype_clouds_map, - tex_stype_wood_map, - tex_stype_marble_map, - tex_stype_default_map, /* magic */ - tex_stype_blend_map, - tex_stype_stucci_map, - tex_stype_default_map, /* noise */ - tex_stype_default_map, /* image */ - tex_stype_default_map, /* plugin */ - tex_stype_envmap_map, - tex_stype_musg_map, /* musgrave */ - tex_stype_voronoi_map, /* voronoi */ - tex_stype_distortednoise_map, /* distorted noise */ - tex_distance_voronoi_map -}; - -/*****************************************************************************/ -/* Python API function prototypes for the Texture module. */ -/*****************************************************************************/ -static PyObject *M_Texture_New( PyObject * self, PyObject * args, - PyObject * keywords ); -static PyObject *M_Texture_Get( PyObject * self, PyObject * args ); - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Texture.__doc__ */ -/*****************************************************************************/ -static char M_Texture_doc[] = "The Blender Texture module\n\ -\n\ -This module provides access to **Texture** objects in Blender\n"; - -static char M_Texture_New_doc[] = "Texture.New (name = 'Tex'):\n\ - Return a new Texture object with the given type and name."; - -static char M_Texture_Get_doc[] = "Texture.Get (name = None):\n\ - Return the texture with the given 'name', None if not found, or\n\ - Return a list with all texture objects in the current scene,\n\ - if no argument was given."; - -/*****************************************************************************/ -/* Python method structure definition for Blender.Texture module: */ -/*****************************************************************************/ -struct PyMethodDef M_Texture_methods[] = { - {"New", ( PyCFunction ) M_Texture_New, METH_VARARGS | METH_KEYWORDS, - M_Texture_New_doc}, - {"Get", M_Texture_Get, METH_VARARGS, M_Texture_Get_doc}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python BPy_Texture methods declarations: */ -/*****************************************************************************/ -#define GETFUNC(name) static PyObject *Texture_##name(BPy_Texture *self) -#define OLDSETFUNC(name) static PyObject *Texture_old##name(BPy_Texture *self, \ - PyObject *args) -#define SETFUNC(name) static int Texture_##name(BPy_Texture *self, \ - PyObject *value) -#if 0 -GETFUNC( getExtend ); -GETFUNC( getImage ); -GETFUNC( getType ); -GETFUNC( getSType ); -GETFUNC( clearIpo ); -GETFUNC( getAnimMontage ); -GETFUNC( getAnimLength ); -SETFUNC( setAnimLength ); -SETFUNC( setAnimMontage ); -#endif - -GETFUNC( oldgetSType ); -GETFUNC( oldgetType ); - -GETFUNC( clearIpo ); -GETFUNC( getAnimFrames ); -GETFUNC( getAnimOffset ); -GETFUNC( getAnimStart ); -GETFUNC( getBrightness ); -GETFUNC( getContrast ); -GETFUNC( getCrop ); -GETFUNC( getDistAmnt ); -GETFUNC( getDistMetric ); -GETFUNC( getExp ); -GETFUNC( getExtend ); -GETFUNC( getIntExtend ); -GETFUNC( getFieldsPerImage ); -GETFUNC( getFilterSize ); -GETFUNC( getFlags ); -GETFUNC( getHFracDim ); -GETFUNC( getImage ); -GETFUNC( getIpo ); -GETFUNC( getIScale ); -GETFUNC( getLacunarity ); -GETFUNC( getNoiseBasis ); -GETFUNC( getNoiseDepth ); -GETFUNC( getNoiseSize ); -GETFUNC( getNoiseType ); -GETFUNC( getOcts ); -GETFUNC( getRepeat ); -GETFUNC( getRGBCol ); -GETFUNC( getSType ); -GETFUNC( getTurbulence ); -GETFUNC( getType ); -GETFUNC( getWeight1 ); -GETFUNC( getWeight2 ); -GETFUNC( getWeight3 ); -GETFUNC( getWeight4 ); -#if 0 -/* not defined */ -GETFUNC( getUsers ); -#endif - -OLDSETFUNC( setDistMetric ); -OLDSETFUNC( setDistNoise ); /* special case used for ".noisebasis = ... */ -OLDSETFUNC( setExtend ); -OLDSETFUNC( setFlags ); -OLDSETFUNC( setImage ); -OLDSETFUNC( setImageFlags ); -OLDSETFUNC( setIpo ); -OLDSETFUNC( setNoiseBasis ); -OLDSETFUNC( setSType ); -OLDSETFUNC( setType ); - -SETFUNC( setAnimFrames ); -SETFUNC( setAnimOffset ); -SETFUNC( setAnimStart ); -SETFUNC( setBrightness ); -SETFUNC( setContrast ); -SETFUNC( setCrop ); -SETFUNC( setDistAmnt ); -SETFUNC( setDistMetric ); -SETFUNC( setExp ); -SETFUNC( setIntExtend ); -SETFUNC( setFieldsPerImage ); -SETFUNC( setFilterSize ); -SETFUNC( setFlags ); -SETFUNC( setHFracDim ); -SETFUNC( setImage ); -SETFUNC( setIpo ); -SETFUNC( setIScale ); -SETFUNC( setLacunarity ); -SETFUNC( setNoiseBasis ); -SETFUNC( setNoiseDepth ); -SETFUNC( setNoiseSize ); -SETFUNC( setNoiseType ); -SETFUNC( setOcts ); -SETFUNC( setRepeat ); -SETFUNC( setRGBCol ); -SETFUNC( setSType ); -SETFUNC( setTurbulence ); -SETFUNC( setType ); -SETFUNC( setWeight1 ); -SETFUNC( setWeight2 ); -SETFUNC( setWeight3 ); -SETFUNC( setWeight4 ); - -static PyObject *Texture_getImageFlags( BPy_Texture *self, void *type ); -static PyObject *Texture_getIUserFlags( BPy_Texture *self, void *type ); -static PyObject *Texture_getIUserCyclic( BPy_Texture *self ); -static PyObject *Texture_getNoiseBasis2( BPy_Texture *self, void *type ); -static int Texture_setImageFlags( BPy_Texture *self, PyObject *args, - void *type ); -static int Texture_setIUserFlags( BPy_Texture *self, PyObject *args, - void *type ); -static int Texture_setIUserCyclic( BPy_Texture *self, PyObject *args ); -static int Texture_setNoiseBasis2( BPy_Texture *self, PyObject *args, - void *type ); - -static PyObject *Texture_getColorband( BPy_Texture * self); -int Texture_setColorband( BPy_Texture * self, PyObject * value); -static PyObject *Texture_evaluate( BPy_Texture *self, PyObject *value ); -static PyObject *Texture_copy( BPy_Texture *self ); - -/*****************************************************************************/ -/* Python BPy_Texture methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_Texture_methods[] = { - /* name, method, flags, doc */ - {"getExtend", ( PyCFunction ) Texture_getExtend, METH_NOARGS, - "() - Return Texture extend mode"}, - {"getImage", ( PyCFunction ) Texture_getImage, METH_NOARGS, - "() - Return Texture Image"}, - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return Texture name"}, - {"getSType", ( PyCFunction ) Texture_oldgetSType, METH_NOARGS, - "() - Return Texture stype as string"}, - {"getType", ( PyCFunction ) Texture_oldgetType, METH_NOARGS, - "() - Return Texture type as string"}, - {"getIpo", ( PyCFunction ) Texture_getIpo, METH_NOARGS, - "() - Return Texture Ipo"}, - {"setIpo", ( PyCFunction ) Texture_oldsetIpo, METH_VARARGS, - "(Blender Ipo) - Set Texture Ipo"}, - {"clearIpo", ( PyCFunction ) Texture_clearIpo, METH_NOARGS, - "() - Unlink Ipo from this Texture."}, - {"setExtend", ( PyCFunction ) Texture_oldsetExtend, METH_VARARGS, - "(s) - Set Texture extend mode"}, - {"setFlags", ( PyCFunction ) Texture_oldsetFlags, METH_VARARGS, - "(f1,f2,f3,f4,f5) - Set Texture flags"}, - {"setImage", ( PyCFunction ) Texture_oldsetImage, METH_VARARGS, - "(Blender Image) - Set Texture Image"}, - {"setImageFlags", ( PyCFunction ) Texture_oldsetImageFlags, METH_VARARGS, - "(s,s,s,s,...) - Set Texture image flags"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "(s) - Set Texture name"}, - {"setSType", ( PyCFunction ) Texture_oldsetSType, METH_VARARGS, - "(s) - Set Texture stype"}, - {"setType", ( PyCFunction ) Texture_oldsetType, METH_VARARGS, - "(s) - Set Texture type"}, - {"setNoiseBasis", ( PyCFunction ) Texture_oldsetNoiseBasis, METH_VARARGS, - "(s) - Set Noise basis"}, - {"setDistNoise", ( PyCFunction ) Texture_oldsetDistNoise, METH_VARARGS, - "(s) - Set Dist Noise"}, - {"setDistMetric", ( PyCFunction ) Texture_oldsetDistMetric, METH_VARARGS, - "(s) - Set Dist Metric"}, - {"evaluate", ( PyCFunction ) Texture_evaluate, METH_O, - "(vector) - evaluate the texture at this position"}, - {"__copy__", ( PyCFunction ) Texture_copy, METH_NOARGS, - "() - return a copy of the the texture"}, - {"copy", ( PyCFunction ) Texture_copy, METH_NOARGS, - "() - return a copy of the the texture"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python Texture_Type attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_Texture_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"animFrames", - (getter)Texture_getAnimFrames, (setter)Texture_setAnimFrames, - "Number of frames of a movie to use", - NULL}, -#if 0 - {"animLength", - (getter)Texture_getAnimLength, (setter)Texture_setAnimLength, - "Number of frames of a movie to use (0 for all)", - NULL}, - {"animMontage", - (getter)Texture_getAnimMontage, (setter)Texture_setAnimMontage, - "Montage mode, start frames and durations", - NULL}, -#endif - {"animOffset", - (getter)Texture_getAnimOffset, (setter)Texture_setAnimOffset, - "Offsets the number of the first movie frame to use", - NULL}, - {"animStart", - (getter)Texture_getAnimStart, (setter)Texture_setAnimStart, - "Starting frame of the movie to use", - NULL}, - {"brightness", - (getter)Texture_getBrightness, (setter)Texture_setBrightness, - "Changes the brightness of a texture's color", - NULL}, - {"contrast", - (getter)Texture_getContrast, (setter)Texture_setContrast, - "Changes the contrast of a texture's color", - NULL}, - {"crop", - (getter)Texture_getCrop, (setter)Texture_setCrop, - "Sets the cropping extents (for image textures)", - NULL}, - {"distAmnt", - (getter)Texture_getDistAmnt, (setter)Texture_setDistAmnt, - "Amount of distortion (for distorted noise textures)", - NULL}, - {"distMetric", - (getter)Texture_getDistMetric, (setter)Texture_setDistMetric, - "The distance metric (for Voronoi textures)", - NULL}, - {"exp", - (getter)Texture_getExp, (setter)Texture_setExp, - "Minkovsky exponent (for Minkovsky Voronoi textures)", - NULL}, - {"extend", - (getter)Texture_getIntExtend, (setter)Texture_setIntExtend, - "Texture's 'Extend' mode (for image textures)", - NULL}, - {"fieldsPerImage", - (getter)Texture_getFieldsPerImage, (setter)Texture_setFieldsPerImage, - "Number of fields per rendered frame", - NULL}, - {"filterSize", - (getter)Texture_getFilterSize, (setter)Texture_setFilterSize, - "The filter size (for image and envmap textures)", - NULL}, - {"flags", - (getter)Texture_getFlags, (setter)Texture_setFlags, - "Texture's 'Flag' bits", - NULL}, - {"hFracDim", - (getter)Texture_getHFracDim, (setter)Texture_setHFracDim, - "Highest fractional dimension (for Musgrave textures)", - NULL}, - {"imageFlags", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Texture's 'ImageFlags' bits", - NULL}, - {"image", - (getter)Texture_getImage, (setter)Texture_setImage, - "Texture's image object", - NULL}, - {"ipo", - (getter)Texture_getIpo, (setter)Texture_setIpo, - "Texture Ipo data", - NULL}, - {"iScale", - (getter)Texture_getIScale, (setter)Texture_setIScale, - "Intensity output scale (for Musgrave and Voronoi textures)", - NULL}, - {"lacunarity", - (getter)Texture_getLacunarity, (setter)Texture_setLacunarity, - "Gap between succesive frequencies (for Musgrave textures)", - NULL}, - {"noiseBasis", - (getter)Texture_getNoiseBasis, (setter)Texture_setNoiseBasis, - "Noise basis type (wood, stucci, marble, clouds, Musgrave, distorted noise)", - NULL}, - {"noiseBasis2", - (getter)Texture_getNoiseBasis2, (setter)Texture_setNoiseBasis2, - "Additional noise basis type (wood, marble, distorted noise)", - (void *)EXPP_TEX_NOISEBASIS2}, - {"noiseDepth", - (getter)Texture_getNoiseDepth, (setter)Texture_setNoiseDepth, - "Noise depth (magic, marble, clouds)", - NULL}, - {"noiseSize", - (getter)Texture_getNoiseSize, (setter)Texture_setNoiseSize, - "Noise size (wood, stucci, marble, clouds, Musgrave, distorted noise, Voronoi)", - NULL}, -/* NOTE for API rewrite: should use dict constants instead of strings */ - {"noiseType", - (getter)Texture_getNoiseType, (setter)Texture_setNoiseType, - "Noise type (for wood, stucci, marble, clouds textures)", - NULL}, - {"octs", - (getter)Texture_getOcts, (setter)Texture_setOcts, - "Number of frequencies (for Musgrave textures)", - NULL}, - {"repeat", - (getter)Texture_getRepeat, (setter)Texture_setRepeat, - "Repetition multiplier (for image textures)", - NULL}, - {"rgbCol", - (getter)Texture_getRGBCol, (setter)Texture_setRGBCol, - "RGB color tuple", - NULL}, - {"stype", - (getter)Texture_getSType, (setter)Texture_setSType, - "Texture's 'SType' mode", - NULL}, - {"turbulence", - (getter)Texture_getTurbulence, (setter)Texture_setTurbulence, - "Turbulence (for magic, wood, stucci, marble textures)", - NULL}, - {"type", - (getter)Texture_getType, (setter)Texture_setType, - "Texture's 'Type' mode", - NULL}, - {"weight1", - (getter)Texture_getWeight1, (setter)Texture_setWeight1, - "Weight 1 (for Voronoi textures)", - NULL}, - {"weight2", - (getter)Texture_getWeight2, (setter)Texture_setWeight2, - "Weight 2 (for Voronoi textures)", - NULL}, - {"weight3", - (getter)Texture_getWeight3, (setter)Texture_setWeight3, - "Weight 3 (for Voronoi textures)", - NULL}, - {"weight4", - (getter)Texture_getWeight4, (setter)Texture_setWeight4, - "Weight 4 (for Voronoi textures)", - NULL}, - {"sine", - (getter)Texture_getNoiseBasis2, (setter)Texture_setNoiseBasis2, - "Produce bands using sine wave (marble, wood textures)", - (void *)EXPP_TEX_NOISE_SINE}, - {"saw", - (getter)Texture_getNoiseBasis2, (setter)Texture_setNoiseBasis2, - "Produce bands using saw wave (marble, wood textures)", - (void *)EXPP_TEX_NOISE_SAW}, - {"tri", - (getter)Texture_getNoiseBasis2, (setter)Texture_setNoiseBasis2, - "Produce bands using triangle wave (marble, wood textures)", - (void *)EXPP_TEX_NOISE_TRI}, - {"interpol", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Interpolate image's pixels to fit texture mapping enabled ('ImageFlags')", - (void *)TEX_INTERPOL}, - {"useAlpha", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Use of image's alpha channel enabled ('ImageFlags')", - (void *)TEX_USEALPHA}, - {"calcAlpha", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Calculation of image's alpha channel enabled ('ImageFlags')", - (void *)TEX_CALCALPHA}, - {"mipmap", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Mipmaps enabled ('ImageFlags')", - (void *)TEX_MIPMAP}, - {"rot90", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "X/Y flip for rendering enabled ('ImageFlags')", - (void *)TEX_IMAROT}, - {"autoRefresh", - (getter)Texture_getIUserFlags, (setter)Texture_setIUserFlags, - "Refresh image on frame changes enabled", - (void *)IMA_ANIM_ALWAYS}, - {"cyclic", - (getter)Texture_getIUserCyclic, (setter)Texture_setIUserCyclic, - "Cycling of animated frames enabled", - NULL}, -#if 0 - /* disabled, moved to image */ - {"fields", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Use of image's fields enabled ('ImageFlags')", - (void *)TEX_FIELDS}, - {"movie", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Movie frames as images enabled ('ImageFlags')", - (void *)TEX_ANIM5}, - {"anti", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Image anti-aliasing enabled ('ImageFlags')", - (void *)TEX_ANTIALI}, - {"stField", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Standard field deinterlacing enabled ('ImageFlags')", - (void *)TEX_STD_FIELD}, -#endif - {"normalMap", - (getter)Texture_getImageFlags, (setter)Texture_setImageFlags, - "Use of image RGB values for normal mapping enabled ('ImageFlags')", - (void *)TEX_NORMALMAP}, - {"colorband", - (getter)Texture_getColorband, (setter)Texture_setColorband, - "The colorband for this texture", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python Texture_Type callback function prototypes: */ -/*****************************************************************************/ -static int Texture_compare( BPy_Texture * a, BPy_Texture * b ); -static PyObject *Texture_repr( BPy_Texture * self ); - -/*****************************************************************************/ -/* Python Texture_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject Texture_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Texture", /* char *tp_name; */ - sizeof( BPy_Texture ), /* 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; */ - ( cmpfunc ) Texture_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) Texture_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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_Texture_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_Texture_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 -}; - -static PyObject *M_Texture_New( PyObject * self, PyObject * args, - PyObject * kwords ) -{ - char *name_str = "Tex"; - static char *kwlist[] = { "name_str", NULL }; - PyObject *pytex; /* for Texture object wrapper in Python */ - Tex *bltex; /* for actual Tex we create in Blender */ - - /* Parse the arguments passed in by the Python interpreter */ - if( !PyArg_ParseTupleAndKeywords - ( args, kwords, "|s", kwlist, &name_str ) ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected zero, one or two strings as arguments" ); - - bltex = add_texture( name_str ); /* first create the texture in Blender */ - - if( bltex ) /* now create the wrapper obj in Python */ - pytex = Texture_CreatePyObject( bltex ); - else - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create Texture in Blender" ); - - /* let's return user count to zero, because add_texture() incref'd it */ - bltex->id.us = 0; - - if( pytex == NULL ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create Tex PyObject" ); - - return pytex; -} - -static PyObject *M_Texture_Get( PyObject * self, PyObject * args ) -{ - char *name = NULL; - Tex *tex_iter; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ); - - tex_iter = G.main->tex.first; - - if( name ) { /* (name) - Search for texture by name */ - - PyObject *wanted_tex = NULL; - - while( tex_iter ) { - if( STREQ( name, tex_iter->id.name + 2 ) ) { - wanted_tex = - Texture_CreatePyObject( tex_iter ); - break; - } - - tex_iter = tex_iter->id.next; - } - - if( !wanted_tex ) { /* Requested texture doesn't exist */ - char error_msg[64]; - PyOS_snprintf( error_msg, sizeof( error_msg ), - "Texture \"%s\" not found", name ); - return EXPP_ReturnPyObjError( PyExc_NameError, - error_msg ); - } - - return wanted_tex; - } - - else { /* () - return a list of wrappers for all textures in the scene */ - int index = 0; - PyObject *tex_pylist, *pyobj; - - tex_pylist = PyList_New( BLI_countlist( &( G.main->tex ) ) ); - if( !tex_pylist ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ); - - while( tex_iter ) { - pyobj = Texture_CreatePyObject( tex_iter ); - if( !pyobj ) { - Py_DECREF(tex_pylist); - return EXPP_ReturnPyObjError - ( PyExc_MemoryError, - "couldn't create Texture PyObject" ); - } - PyList_SET_ITEM( tex_pylist, index, pyobj ); - - tex_iter = tex_iter->id.next; - index++; - } - - return tex_pylist; - } -} - -static int Texture_compare( BPy_Texture * a, BPy_Texture * b ) -{ - return ( a->texture == b->texture ) ? 0 : -1; -} - -static PyObject *Texture_repr( BPy_Texture * self ) -{ - return PyString_FromFormat( "[Texture \"%s\"]", - self->texture->id.name + 2 ); -} - -static PyObject *M_Texture_TypesDict( void ) -{ - PyObject *Types = PyConstant_New( ); - if( Types ) { - BPy_constant *d = ( BPy_constant * ) Types; - PyConstant_Insert(d, "NONE", PyInt_FromLong(EXPP_TEX_TYPE_NONE)); - PyConstant_Insert(d, "CLOUDS", PyInt_FromLong(TEX_CLOUDS)); - PyConstant_Insert(d, "WOOD", PyInt_FromLong(TEX_WOOD)); - PyConstant_Insert(d, "MARBLE", PyInt_FromLong(TEX_MARBLE)); - PyConstant_Insert(d, "MAGIC", PyInt_FromLong(TEX_MAGIC)); - PyConstant_Insert(d, "BLEND", PyInt_FromLong(TEX_BLEND)); - PyConstant_Insert(d, "STUCCI", PyInt_FromLong(TEX_STUCCI)); - PyConstant_Insert(d, "NOISE", PyInt_FromLong(TEX_NOISE)); - PyConstant_Insert(d, "IMAGE", PyInt_FromLong(TEX_IMAGE)); - PyConstant_Insert(d, "PLUGIN", PyInt_FromLong(TEX_PLUGIN)); - PyConstant_Insert(d, "ENVMAP", PyInt_FromLong(TEX_ENVMAP)); - PyConstant_Insert(d, "MUSGRAVE", PyInt_FromLong(TEX_MUSGRAVE)); - PyConstant_Insert(d, "VORONOI", PyInt_FromLong(TEX_VORONOI)); - PyConstant_Insert(d, "DISTNOISE", PyInt_FromLong(TEX_DISTNOISE)); - } - return Types; -} - -static PyObject *M_Texture_STypesDict( void ) -{ - PyObject *STypes = PyConstant_New( ); - if( STypes ) { - BPy_constant *d = ( BPy_constant * ) STypes; - - PyConstant_Insert(d, "CLD_DEFAULT", - PyInt_FromLong(EXPP_TEX_STYPE_CLD_DEFAULT)); - PyConstant_Insert(d, "CLD_COLOR", - PyInt_FromLong(EXPP_TEX_STYPE_CLD_COLOR)); - PyConstant_Insert(d, "WOD_BANDS", - PyInt_FromLong(EXPP_TEX_STYPE_WOD_BANDS)); - PyConstant_Insert(d, "WOD_RINGS", - PyInt_FromLong(EXPP_TEX_STYPE_WOD_RINGS)); - PyConstant_Insert(d, "WOD_BANDNOISE", - PyInt_FromLong(EXPP_TEX_STYPE_WOD_BANDNOISE)); - PyConstant_Insert(d, "WOD_RINGNOISE", - PyInt_FromLong(EXPP_TEX_STYPE_WOD_RINGNOISE)); - PyConstant_Insert(d, "MAG_DEFAULT", - PyInt_FromLong(EXPP_TEX_STYPE_MAG_DEFAULT)); - PyConstant_Insert(d, "MBL_SOFT", - PyInt_FromLong(EXPP_TEX_STYPE_MBL_SOFT)); - PyConstant_Insert(d, "MBL_SHARP", - PyInt_FromLong(EXPP_TEX_STYPE_MBL_SHARP)); - PyConstant_Insert(d, "MBL_SHARPER", - PyInt_FromLong(EXPP_TEX_STYPE_MBL_SHARPER)); - PyConstant_Insert(d, "BLN_LIN", - PyInt_FromLong(EXPP_TEX_STYPE_BLN_LIN)); - PyConstant_Insert(d, "BLN_QUAD", - PyInt_FromLong(EXPP_TEX_STYPE_BLN_QUAD)); - PyConstant_Insert(d, "BLN_EASE", - PyInt_FromLong(EXPP_TEX_STYPE_BLN_EASE)); - PyConstant_Insert(d, "BLN_DIAG", - PyInt_FromLong(EXPP_TEX_STYPE_BLN_DIAG)); - PyConstant_Insert(d, "BLN_SPHERE", - PyInt_FromLong(EXPP_TEX_STYPE_BLN_SPHERE)); - PyConstant_Insert(d, "BLN_HALO", - PyInt_FromLong(EXPP_TEX_STYPE_BLN_HALO)); - PyConstant_Insert(d, "STC_PLASTIC", - PyInt_FromLong(EXPP_TEX_STYPE_STC_PLASTIC)); - PyConstant_Insert(d, "STC_WALLIN", - PyInt_FromLong(EXPP_TEX_STYPE_STC_WALLIN)); - PyConstant_Insert(d, "STC_WALLOUT", - PyInt_FromLong(EXPP_TEX_STYPE_STC_WALLOUT)); - PyConstant_Insert(d, "NSE_DEFAULT", - PyInt_FromLong(EXPP_TEX_STYPE_NSE_DEFAULT)); - PyConstant_Insert(d, "IMG_DEFAULT", - PyInt_FromLong(EXPP_TEX_STYPE_IMG_DEFAULT)); - PyConstant_Insert(d, "PLG_DEFAULT", - PyInt_FromLong(EXPP_TEX_STYPE_PLG_DEFAULT)); - PyConstant_Insert(d, "ENV_STATIC", - PyInt_FromLong(EXPP_TEX_STYPE_ENV_STATIC)); - PyConstant_Insert(d, "ENV_ANIM", - PyInt_FromLong(EXPP_TEX_STYPE_ENV_ANIM)); - PyConstant_Insert(d, "ENV_LOAD", - PyInt_FromLong(EXPP_TEX_STYPE_ENV_LOAD)); - PyConstant_Insert(d, "MUS_MFRACTAL", - PyInt_FromLong(EXPP_TEX_STYPE_MUS_MFRACTAL)); - PyConstant_Insert(d, "MUS_RIDGEDMF", - PyInt_FromLong(EXPP_TEX_STYPE_MUS_RIDGEDMF)); - PyConstant_Insert(d, "MUS_HYBRIDMF", - PyInt_FromLong(EXPP_TEX_STYPE_MUS_HYBRIDMF)); - PyConstant_Insert(d, "MUS_FBM", - PyInt_FromLong(EXPP_TEX_STYPE_MUS_FBM)); - PyConstant_Insert(d, "MUS_HTERRAIN", - PyInt_FromLong(EXPP_TEX_STYPE_MUS_HTERRAIN)); - PyConstant_Insert(d, "DN_BLENDER", - PyInt_FromLong(TEX_BLENDER)); - PyConstant_Insert(d, "DN_PERLIN", - PyInt_FromLong(TEX_STDPERLIN)); - PyConstant_Insert(d, "DN_IMPROVEDPERLIN", - PyInt_FromLong(TEX_NEWPERLIN)); - PyConstant_Insert(d, "DN_VORONOIF1", - PyInt_FromLong(TEX_VORONOI_F1)); - PyConstant_Insert(d, "DN_VORONOIF2", - PyInt_FromLong(TEX_VORONOI_F2)); - PyConstant_Insert(d, "DN_VORONOIF3", - PyInt_FromLong(TEX_VORONOI_F3)); - PyConstant_Insert(d, "DN_VORONOIF4", - PyInt_FromLong(TEX_VORONOI_F4)); - PyConstant_Insert(d, "DN_VORONOIF2F1", - PyInt_FromLong(TEX_VORONOI_F2F1)); - PyConstant_Insert(d, "DN_VORONOICRACKLE", - PyInt_FromLong(TEX_VORONOI_CRACKLE)); - PyConstant_Insert(d, "DN_CELLNOISE", - PyInt_FromLong(TEX_CELLNOISE)); - PyConstant_Insert(d, "VN_INT", - PyInt_FromLong(EXPP_TEX_STYPE_VN_INT)); - PyConstant_Insert(d, "VN_COL1", - PyInt_FromLong(EXPP_TEX_STYPE_VN_COL1)); - PyConstant_Insert(d, "VN_COL2", - PyInt_FromLong(EXPP_TEX_STYPE_VN_COL2)); - PyConstant_Insert(d, "VN_COL3", - PyInt_FromLong(EXPP_TEX_STYPE_VN_COL3)); - PyConstant_Insert(d, "VN_TEX_DISTANCE", - PyInt_FromLong(TEX_DISTANCE)); - PyConstant_Insert(d, "VN_TEX_DISTANCE_SQUARED", - PyInt_FromLong(TEX_DISTANCE_SQUARED)); - PyConstant_Insert(d, "VN_TEX_MANHATTAN", - PyInt_FromLong(TEX_MANHATTAN)); - PyConstant_Insert(d, "VN_TEX_CHEBYCHEV", - PyInt_FromLong(TEX_CHEBYCHEV)); - PyConstant_Insert(d, "VN_TEX_MINKOVSKY_HALF", - PyInt_FromLong(TEX_MINKOVSKY_HALF)); - PyConstant_Insert(d, "VN_TEX_MINKOVSKY_FOUR", - PyInt_FromLong(TEX_MINKOVSKY_FOUR)); - PyConstant_Insert(d, "VN_TEX_MINKOVSKY", - PyInt_FromLong(TEX_MINKOVSKY)); - - } - return STypes; -} - -static PyObject *M_Texture_TexCoDict( void ) -{ - PyObject *TexCo = PyConstant_New( ); - if( TexCo ) { - BPy_constant *d = ( BPy_constant * ) TexCo; - PyConstant_Insert(d, "ORCO", PyInt_FromLong(TEXCO_ORCO)); - PyConstant_Insert(d, "REFL", PyInt_FromLong(TEXCO_REFL)); - PyConstant_Insert(d, "NOR", PyInt_FromLong(TEXCO_NORM)); - PyConstant_Insert(d, "GLOB", PyInt_FromLong(TEXCO_GLOB)); - PyConstant_Insert(d, "UV", PyInt_FromLong(TEXCO_UV)); - PyConstant_Insert(d, "OBJECT", PyInt_FromLong(TEXCO_OBJECT)); - PyConstant_Insert(d, "WIN", PyInt_FromLong(TEXCO_WINDOW)); - PyConstant_Insert(d, "VIEW", PyInt_FromLong(TEXCO_VIEW)); - PyConstant_Insert(d, "STICK", PyInt_FromLong(TEXCO_STICKY)); - PyConstant_Insert(d, "STRESS", PyInt_FromLong(TEXCO_STRESS)); - PyConstant_Insert(d, "TANGENT", PyInt_FromLong(TEXCO_TANGENT)); - } - return TexCo; -} - -static PyObject *M_Texture_MapToDict( void ) -{ - PyObject *MapTo = PyConstant_New( ); - if( MapTo ) { - BPy_constant *d = ( BPy_constant * ) MapTo; - PyConstant_Insert(d, "COL", PyInt_FromLong(MAP_COL)); - PyConstant_Insert(d, "NOR", PyInt_FromLong(MAP_NORM)); - PyConstant_Insert(d, "CSP", PyInt_FromLong(MAP_COLSPEC)); - PyConstant_Insert(d, "CMIR", PyInt_FromLong(MAP_COLMIR)); - PyConstant_Insert(d, "REF", PyInt_FromLong(MAP_REF)); - PyConstant_Insert(d, "SPEC", PyInt_FromLong(MAP_SPEC)); - PyConstant_Insert(d, "HARD", PyInt_FromLong(MAP_HAR)); - PyConstant_Insert(d, "ALPHA", PyInt_FromLong(MAP_ALPHA)); - PyConstant_Insert(d, "EMIT", PyInt_FromLong(MAP_EMIT)); - PyConstant_Insert(d, "RAYMIR", PyInt_FromLong(MAP_RAYMIRR)); - PyConstant_Insert(d, "AMB", PyInt_FromLong(MAP_AMB)); - PyConstant_Insert(d, "TRANSLU", PyInt_FromLong(MAP_TRANSLU)); - PyConstant_Insert(d, "DISP", PyInt_FromLong(MAP_DISPLACE)); - PyConstant_Insert(d, "WARP", PyInt_FromLong(MAP_WARP)); - } - return MapTo; -} - -static PyObject *M_Texture_FlagsDict( void ) -{ - PyObject *Flags = PyConstant_New( ); - if( Flags ) { - BPy_constant *d = ( BPy_constant * ) Flags; - PyConstant_Insert(d, "COLORBAND", PyInt_FromLong(TEX_COLORBAND)); - PyConstant_Insert(d, "FLIPBLEND", PyInt_FromLong(TEX_FLIPBLEND)); - PyConstant_Insert(d, "NEGALPHA", PyInt_FromLong(TEX_NEGALPHA)); - PyConstant_Insert(d, "CHECKER_ODD", PyInt_FromLong(TEX_CHECKER_ODD)); - PyConstant_Insert(d, "CHECKER_EVEN", PyInt_FromLong(TEX_CHECKER_EVEN)); - PyConstant_Insert(d, "PREVIEW_ALPHA", PyInt_FromLong(TEX_PRV_ALPHA)); - PyConstant_Insert(d, "REPEAT_XMIR", PyInt_FromLong(TEX_REPEAT_XMIR)); - PyConstant_Insert(d, "REPEAT_YMIR", PyInt_FromLong(TEX_REPEAT_YMIR)); - } - return Flags; -} - -static PyObject *M_Texture_ExtendModesDict( void ) -{ - PyObject *ExtendModes = PyConstant_New( ); - if( ExtendModes ) { - BPy_constant *d = ( BPy_constant * ) ExtendModes; - PyConstant_Insert(d, "EXTEND", PyInt_FromLong(TEX_EXTEND)); - PyConstant_Insert(d, "CLIP", PyInt_FromLong(TEX_CLIP)); - PyConstant_Insert(d, "CLIPCUBE", PyInt_FromLong(TEX_CLIPCUBE)); - PyConstant_Insert(d, "REPEAT", PyInt_FromLong(TEX_REPEAT)); - } - return ExtendModes; -} - -static PyObject *M_Texture_ImageFlagsDict( void ) -{ - PyObject *ImageFlags = PyConstant_New( ); - if( ImageFlags ) { - BPy_constant *d = ( BPy_constant * ) ImageFlags; - PyConstant_Insert(d, "INTERPOL", PyInt_FromLong(TEX_INTERPOL)); - PyConstant_Insert(d, "USEALPHA", PyInt_FromLong(TEX_USEALPHA)); - PyConstant_Insert(d, "MIPMAP", PyInt_FromLong(TEX_MIPMAP)); - PyConstant_Insert(d, "ROT90", PyInt_FromLong(TEX_IMAROT)); - PyConstant_Insert(d, "CALCALPHA", PyInt_FromLong(TEX_CALCALPHA)); - PyConstant_Insert(d, "NORMALMAP", PyInt_FromLong(TEX_NORMALMAP)); - } - return ImageFlags; -} - -static PyObject *M_Texture_NoiseDict( void ) -{ - PyObject *Noise = PyConstant_New( ); - if( Noise ) { - BPy_constant *d = ( BPy_constant * ) Noise; - PyConstant_Insert(d, "SINE", PyInt_FromLong(EXPP_TEX_NOISE_SINE)); - PyConstant_Insert(d, "SAW", PyInt_FromLong(EXPP_TEX_NOISE_SAW)); - PyConstant_Insert(d, "TRI", PyInt_FromLong(EXPP_TEX_NOISE_TRI)); - PyConstant_Insert(d, "BLENDER", PyInt_FromLong(TEX_BLENDER)); - PyConstant_Insert(d, "PERLIN", PyInt_FromLong(TEX_STDPERLIN)); - PyConstant_Insert(d, "IMPROVEDPERLIN", PyInt_FromLong(TEX_NEWPERLIN)); - PyConstant_Insert(d, "VORONOIF1", PyInt_FromLong(TEX_VORONOI_F1)); - PyConstant_Insert(d, "VORONOIF2", PyInt_FromLong(TEX_VORONOI_F2)); - PyConstant_Insert(d, "VORONOIF3", PyInt_FromLong(TEX_VORONOI_F3)); - PyConstant_Insert(d, "VORONOIF4", PyInt_FromLong(TEX_VORONOI_F4)); - PyConstant_Insert(d, "VORONOIF2F1", PyInt_FromLong(TEX_VORONOI_F2F1)); - PyConstant_Insert(d, "VORONOICRACKLE", - PyInt_FromLong(TEX_VORONOI_CRACKLE)); - PyConstant_Insert(d, "CELLNOISE", PyInt_FromLong(TEX_CELLNOISE)); - } - return Noise; -} - -static PyObject *M_Texture_BlendModesDict( void ) -{ - PyObject *BlendModes = PyConstant_New( ); - if( BlendModes ) { - BPy_constant *d = ( BPy_constant * ) BlendModes; - PyConstant_Insert(d, "MIX", PyInt_FromLong(MTEX_BLEND)); - PyConstant_Insert(d, "MULTIPLY", PyInt_FromLong(MTEX_MUL)); - PyConstant_Insert(d, "ADD", PyInt_FromLong(MTEX_ADD)); - PyConstant_Insert(d, "SUBTRACT", PyInt_FromLong(MTEX_SUB)); - PyConstant_Insert(d, "DIVIDE", PyInt_FromLong(MTEX_DIV)); - PyConstant_Insert(d, "DARKEN", PyInt_FromLong(MTEX_DARK)); - PyConstant_Insert(d, "DIFFERENCE", PyInt_FromLong(MTEX_DIFF)); - PyConstant_Insert(d, "LIGHTEN", PyInt_FromLong(MTEX_LIGHT)); - PyConstant_Insert(d, "SCREEN", PyInt_FromLong(MTEX_SCREEN)); - } - return BlendModes; -} - -static PyObject *M_Texture_MappingsDict( void ) -{ - PyObject *Mappings = PyConstant_New( ); - if( Mappings ) { - BPy_constant *d = ( BPy_constant * ) Mappings; - PyConstant_Insert(d, "FLAT", PyInt_FromLong(MTEX_FLAT)); - PyConstant_Insert(d, "CUBE", PyInt_FromLong(MTEX_CUBE)); - PyConstant_Insert(d, "TUBE", PyInt_FromLong(MTEX_TUBE)); - PyConstant_Insert(d, "SPHERE", PyInt_FromLong(MTEX_SPHERE)); - } - return Mappings; -} - -static PyObject *M_Texture_ProjDict( void ) -{ - PyObject *Proj = PyConstant_New( ); - if( Proj ) { - BPy_constant *d = ( BPy_constant * ) Proj; - PyConstant_Insert(d, "NONE", PyInt_FromLong(PROJ_N)); - PyConstant_Insert(d, "X", PyInt_FromLong(PROJ_X)); - PyConstant_Insert(d, "Y", PyInt_FromLong(PROJ_Y)); - PyConstant_Insert(d, "Z", PyInt_FromLong(PROJ_Z)); - } - return Proj; -} - -PyObject *Texture_Init( void ) -{ - PyObject *submodule; - PyObject *dict; - - /* constants */ - PyObject *Types = M_Texture_TypesDict( ); - PyObject *STypes = M_Texture_STypesDict( ); - PyObject *TexCo = M_Texture_TexCoDict( ); - PyObject *MapTo = M_Texture_MapToDict( ); - PyObject *Flags = M_Texture_FlagsDict( ); - PyObject *ExtendModes = M_Texture_ExtendModesDict( ); - PyObject *ImageFlags = M_Texture_ImageFlagsDict( ); - PyObject *Noise = M_Texture_NoiseDict( ); - PyObject *BlendModes = M_Texture_BlendModesDict( ); - PyObject *Mappings = M_Texture_MappingsDict( ); - PyObject *Proj = M_Texture_ProjDict( ); - - if( PyType_Ready( &Texture_Type ) < 0) - return NULL; - - submodule = Py_InitModule3( "Blender.Texture", - M_Texture_methods, M_Texture_doc ); - - if( Types ) - PyModule_AddObject( submodule, "Types", Types ); - if( STypes ) - PyModule_AddObject( submodule, "STypes", STypes ); - if( TexCo ) - PyModule_AddObject( submodule, "TexCo", TexCo ); - if( MapTo ) - PyModule_AddObject( submodule, "MapTo", MapTo ); - if( Flags ) - PyModule_AddObject( submodule, "Flags", Flags ); - if( ExtendModes ) - PyModule_AddObject( submodule, "ExtendModes", ExtendModes ); - if( ImageFlags ) - PyModule_AddObject( submodule, "ImageFlags", ImageFlags ); - if( Noise ) - PyModule_AddObject( submodule, "Noise", Noise ); - if ( BlendModes ) - PyModule_AddObject( submodule, "BlendModes", BlendModes ); - if ( Mappings ) - PyModule_AddObject( submodule, "Mappings", Mappings ); - if ( Proj ) - PyModule_AddObject( submodule, "Proj", Proj ); - - /* Add the MTex submodule to this module */ - dict = PyModule_GetDict( submodule ); - PyDict_SetItemString( dict, "MTex", MTex_Init( ) ); - - return submodule; -} - -PyObject *Texture_CreatePyObject( Tex * tex ) -{ - BPy_Texture *pytex; - - pytex = ( BPy_Texture * ) PyObject_NEW( BPy_Texture, &Texture_Type ); - if( !pytex ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create BPy_Texture PyObject" ); - - pytex->texture = tex; - return ( PyObject * ) pytex; -} - -Tex *Texture_FromPyObject( PyObject * pyobj ) -{ - return ( ( BPy_Texture * ) pyobj )->texture; -} - -/*****************************************************************************/ -/* Python BPy_Texture methods: */ -/*****************************************************************************/ - -static PyObject *Texture_getExtend( BPy_Texture * self ) -{ - const char *extend = NULL; - - if( EXPP_map_getStrVal - ( tex_extend_map, self->texture->extend, &extend ) ) - return PyString_FromString( extend ); - - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "invalid internal extend mode" ); -} - -static PyObject *Texture_getImage( BPy_Texture * self ) -{ - /* we need this to be an IMAGE texture, and we must have an image */ - if( ( self->texture->type == TEX_IMAGE || - self->texture->type == TEX_ENVMAP ) - && self->texture->ima ) - return Image_CreatePyObject( self->texture->ima ); - - Py_RETURN_NONE; -} - -static PyObject *Texture_oldgetSType( BPy_Texture * self ) -{ - const char *stype = NULL; - int n_stype; - - if( self->texture->type == TEX_VORONOI ) - n_stype = self->texture->vn_coltype; -#if 0 - else if( self->texture->type == TEX_MUSGRAVE ) - n_stype = self->texture->noisebasis; -#endif - else if( self->texture->type == TEX_ENVMAP ) - n_stype = self->texture->env->stype; - else - n_stype = self->texture->stype; - - if( EXPP_map_getStrVal( tex_stype_map[self->texture->type], - n_stype, &stype ) ) - return PyString_FromString( stype ); - - - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "invalid texture stype internally" ); -} - -static PyObject *Texture_oldgetType( BPy_Texture * self ) -{ - const char *type = NULL; - - if( EXPP_map_getStrVal( tex_type_map, self->texture->type, &type ) ) - return PyString_FromString( type ); - - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "invalid texture type internally" ); -} - -static int Texture_setAnimFrames( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->texture->iuser.frames, - EXPP_TEX_ANIMFRAME_MIN, - EXPP_TEX_ANIMFRAME_MAX, 'h' ); -} - -static int Texture_setIUserCyclic( BPy_Texture * self, PyObject * value ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) - self->texture->iuser.cycl = 1; - else - self->texture->iuser.cycl = 0; - return 0; -} - -#if 0 -/* this was stupid to begin with! (ton) */ -static int Texture_setAnimLength( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->texture->len, - EXPP_TEX_ANIMLEN_MIN, - EXPP_TEX_ANIMLEN_MAX, 'h' ); -} - -/* this is too simple to keep supporting? disabled for time being (ton) */ -static int Texture_setAnimMontage( BPy_Texture * self, PyObject * value ) -{ - int fradur[4][2]; - int i; - - if( !PyArg_ParseTuple( value, "(ii)(ii)(ii)(ii)", - &fradur[0][0], &fradur[0][1], - &fradur[1][0], &fradur[1][1], - &fradur[2][0], &fradur[2][1], - &fradur[3][0], &fradur[3][1] ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected a tuple of tuples" ); - - for( i = 0; i < 4; ++i ) { - self->texture->fradur[i][0] = - (short)EXPP_ClampInt ( fradur[i][0], EXPP_TEX_ANIMMONSTART_MIN, - EXPP_TEX_ANIMMONSTART_MAX ); - self->texture->fradur[i][1] = - (short)EXPP_ClampInt ( fradur[i][1], EXPP_TEX_ANIMMONDUR_MIN, - EXPP_TEX_ANIMMONDUR_MAX ); - } - - return 0; -} -#endif - -static int Texture_setAnimOffset( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->texture->iuser.offset, - EXPP_TEX_ANIMOFFSET_MIN, - EXPP_TEX_ANIMOFFSET_MAX, 'h' ); -} - -static int Texture_setAnimStart( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->texture->iuser.sfra, - EXPP_TEX_ANIMSTART_MIN, - EXPP_TEX_ANIMSTART_MAX, 'h' ); -} - -static int Texture_setBrightness( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->bright, - EXPP_TEX_BRIGHTNESS_MIN, - EXPP_TEX_BRIGHTNESS_MAX ); -} - -static int Texture_setContrast( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->contrast, - EXPP_TEX_CONTRAST_MIN, - EXPP_TEX_CONTRAST_MAX ); -} - -static int Texture_setCrop( BPy_Texture * self, PyObject * value ) -{ - float crop[4]; - - if( !PyArg_ParseTuple( value, "ffff", - &crop[0], &crop[1], &crop[2], &crop[3] ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected tuple of 4 floats" ); - - self->texture->cropxmin = EXPP_ClampFloat( crop[0], EXPP_TEX_CROP_MIN, - EXPP_TEX_CROP_MAX ); - self->texture->cropymin = EXPP_ClampFloat( crop[1], EXPP_TEX_CROP_MIN, - EXPP_TEX_CROP_MAX ); - self->texture->cropxmax = EXPP_ClampFloat( crop[2], EXPP_TEX_CROP_MIN, - EXPP_TEX_CROP_MAX ); - self->texture->cropymax = EXPP_ClampFloat( crop[3], EXPP_TEX_CROP_MIN, - EXPP_TEX_CROP_MAX ); - - return 0; -} - -static int Texture_setIntExtend( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setIValueRange ( value, &self->texture->extend, - EXPP_TEX_EXTEND_MIN, - EXPP_TEX_EXTEND_MAX, 'h' ); -} - -static int Texture_setFieldsPerImage( BPy_Texture * self, - PyObject * value ) -{ - return EXPP_setIValueClamped ( value, &self->texture->iuser.fie_ima, - EXPP_TEX_FIEIMA_MIN, - EXPP_TEX_FIEIMA_MAX, 'h' ); - -} - -static int Texture_setFilterSize( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->filtersize, - EXPP_TEX_FILTERSIZE_MIN, - EXPP_TEX_FILTERSIZE_MAX ); -} - -static int Texture_setFlags( BPy_Texture * self, PyObject * value ) -{ - int param; - - if( !PyInt_Check( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%08x", TEX_FLAG_MASK ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - param = PyInt_AS_LONG ( value ); - - if ( ( param & TEX_FLAG_MASK ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - - self->texture->flag = (short)param; - -#if 0 - /* if Colorband enabled, make sure we allocate memory for it */ - - if ( ( param & TEX_COLORBAND ) && !self->texture->coba ) - self->texture->coba = add_colorband(); -#endif - - return 0; -} - -static int Texture_setImage( BPy_Texture * self, PyObject * value ) -{ - Image *blimg = NULL; - - if( !BPy_Image_Check (value) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected an Image" ); - blimg = Image_FromPyObject( value ); - - if( self->texture->ima ) { - self->texture->ima->id.us--; - } - - self->texture->ima = blimg; - id_us_plus( &blimg->id ); - - return 0; -} - -static int Texture_setImageFlags( BPy_Texture * self, PyObject * value, - void *type ) -{ - short param; - - /* - * if type is non-zero, then attribute is "mipmap", "calcAlpha", etc., - * so set/clear the bit in the bitfield based on the type - */ - - if( (int)type ) { - int err; - param = self->texture->imaflag; - err = EXPP_setBitfield( value, ¶m, (int)type, 'h' ); - if( err ) - return err; - - /* - * if type is zero, then attribute is "imageFlags", so check - * value for a valid bitmap range. - */ - - } else { - int bitmask = TEX_INTERPOL - | TEX_USEALPHA - | TEX_MIPMAP - | TEX_IMAROT - | TEX_CALCALPHA - | TEX_NORMALMAP; - - if( !PyInt_Check( value ) ) { - char errstr[128]; - sprintf ( errstr , "expected int bitmask of 0x%08x", bitmask ); - return EXPP_ReturnIntError( PyExc_TypeError, errstr ); - } - - param = (short)PyInt_AS_LONG( value ); - if( ( param & bitmask ) != param ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid bit(s) set in mask" ); - } - - /* everything is OK; save the new flag setting */ - - self->texture->imaflag = param; - return 0; -} - -static int Texture_setIUserFlags( BPy_Texture * self, PyObject * value, - void *flag ) -{ - int param = PyObject_IsTrue( value ); - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - if( param ) - self->texture->iuser.flag |= (int)flag; - else - self->texture->iuser.flag &= ~(int)flag; - return 0; -} - -static int Texture_setNoiseDepth( BPy_Texture * self, PyObject * value ) -{ - short max = EXPP_TEX_NOISEDEPTH_MAX; - - /* for whatever reason, magic texture has a different max value */ - - if( self->texture->type == TEX_MAGIC ) - max = EXPP_TEX_NOISEDEPTH_MAX_MAGIC; - - return EXPP_setIValueClamped ( value, &self->texture->noisedepth, - EXPP_TEX_NOISEDEPTH_MIN, max, 'h' ); -} - -static int Texture_setNoiseSize( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->noisesize, - EXPP_TEX_NOISESIZE_MIN, - EXPP_TEX_NOISESIZE_MAX ); -} - -static int Texture_setNoiseType( BPy_Texture * self, PyObject * value ) -{ - char *param; - - if( !PyString_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected string argument" ); - param = PyString_AS_STRING( value ); - - if( STREQ( param, "soft" ) ) - self->texture->noisetype = TEX_NOISESOFT; - else if( STREQ( param, "hard" ) ) - self->texture->noisetype = TEX_NOISEPERL; - else - return EXPP_ReturnIntError( PyExc_ValueError, - "noise type must be 'soft' or 'hard'" ); - - return 0; -} - -static int Texture_setNoiseBasis( BPy_Texture * self, PyObject * value ) -{ - int param; - - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int (see 'Noise' constant dictionary)" ); - - param = PyInt_AS_LONG ( value ); - - if ( param < TEX_BLENDER - || ( param > TEX_VORONOI_CRACKLE - && param != TEX_CELLNOISE ) ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid noise type" ); - - self->texture->noisebasis = (short)param; - return 0; -} - -static int Texture_setNoiseBasis2( BPy_Texture * self, PyObject * value, - void *type ) -{ - /* - * if type is EXPP_TEX_NOISEBASIS2, then this is the "noiseBasis2" - * attribute, so check the range and set the whole value - */ - - if( (int)type == EXPP_TEX_NOISEBASIS2 ) { - int param; - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int (see 'Noise' constant dictionary)" ); - - param = PyInt_AS_LONG ( value ); - - if ( param < TEX_BLENDER - || ( param > TEX_VORONOI_CRACKLE - && param != TEX_CELLNOISE ) ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid noise type" ); - - self->texture->noisebasis2 = (short)param; - - /* - * for other type values, the attribute is "sine", "saw" or "tri", - * so set the noise basis to the supplied type if value is 1 - */ - - } else { - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int value of 1" ); - - if( PyInt_AS_LONG ( value ) != 1 ) - return EXPP_ReturnIntError( PyExc_ValueError, - "expected int value of 1" ); - - self->texture->noisebasis2 = (short)(int)type; - } - return 0; -} - -static int Texture_setRepeat( BPy_Texture * self, PyObject * args ) -{ - int repeat[2]; - - if( !PyArg_ParseTuple( args, "ii", &repeat[0], &repeat[1] ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected tuple of 2 ints" ); - - self->texture->xrepeat = (short)EXPP_ClampInt( repeat[0], EXPP_TEX_REPEAT_MIN, - EXPP_TEX_REPEAT_MAX ); - self->texture->yrepeat = (short)EXPP_ClampInt( repeat[1], EXPP_TEX_REPEAT_MIN, - EXPP_TEX_REPEAT_MAX ); - - return 0; -} - -static int Texture_setRGBCol( BPy_Texture * self, PyObject * args ) -{ - float rgb[3]; - - if( !PyArg_ParseTuple( args, "fff", &rgb[0], &rgb[1], &rgb[2] ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected tuple of 3 floats" ); - - self->texture->rfac = EXPP_ClampFloat( rgb[0], EXPP_TEX_RGBCOL_MIN, - EXPP_TEX_RGBCOL_MAX ); - self->texture->gfac = EXPP_ClampFloat( rgb[1], EXPP_TEX_RGBCOL_MIN, - EXPP_TEX_RGBCOL_MAX ); - self->texture->bfac = EXPP_ClampFloat( rgb[2], EXPP_TEX_RGBCOL_MIN, - EXPP_TEX_RGBCOL_MAX ); - - return 0; -} - -static int Texture_setSType( BPy_Texture * self, PyObject * value ) -{ - short param; - const char *dummy = NULL; - - if( !PyInt_Check( value ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ); - - param = (short)PyInt_AS_LONG ( value ); - - /* use the stype map to find out if this is a valid stype for this type * - * note that this will allow CLD_COLOR when type is ENVMAP. there's not * - * much that we can do about this though. */ - if( !EXPP_map_getStrVal - ( tex_stype_map[self->texture->type], param, &dummy ) ) - return EXPP_ReturnIntError( PyExc_ValueError, - "invalid stype (for this type)" ); - - if( self->texture->type == TEX_VORONOI ) - self->texture->vn_coltype = param; -#if 0 - else if( self->texture->type == TEX_MUSGRAVE ) - self->texture->noisebasis = param; -#endif - else if( self->texture->type == TEX_ENVMAP ) - self->texture->env->stype = param; - else - self->texture->stype = param; - - return 0; -} - -static int Texture_setTurbulence( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->turbul, - EXPP_TEX_TURBULENCE_MIN, - EXPP_TEX_TURBULENCE_MAX ); -} - -static int Texture_setHFracDim( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->mg_H, - EXPP_TEX_MH_G_MIN, - EXPP_TEX_MH_G_MAX ); -} - -static int Texture_setLacunarity( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->mg_lacunarity, - EXPP_TEX_LACUNARITY_MIN, - EXPP_TEX_LACUNARITY_MAX ); -} - -static int Texture_setOcts( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->mg_octaves, - EXPP_TEX_OCTS_MIN, - EXPP_TEX_OCTS_MAX ); -} - -static int Texture_setIScale( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->ns_outscale, - EXPP_TEX_ISCALE_MIN, - EXPP_TEX_ISCALE_MAX ); -} - -static int Texture_setType( BPy_Texture * self, PyObject * value ) -{ - int err = EXPP_setIValueRange ( value, &self->texture->type, - EXPP_TEX_TYPE_MIN, - EXPP_TEX_TYPE_MAX, 'h' ); - - /* - * if we set the texture OK, and it's a environment map, and - * there is no environment map yet, allocate one (code borrowed - * from texture_panel_envmap() in source/blender/src/buttons_shading.c) - */ - - if( !err && self->texture->type == TEX_ENVMAP - && !self->texture->env ) { - self->texture->env = BKE_add_envmap(); - self->texture->env->object= OBACT; - } - return err; -} - -static int Texture_setDistMetric( BPy_Texture * self, PyObject * value ) -{ -#if 0 - char *dist = NULL; - - if( !PyArg_ParseTuple( value, "s", &dist ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - /* can we really trust texture->type? */ - if( self->texture->type == TEX_VORONOI && - !EXPP_map_getShortVal( tex_stype_map[self->texture->type + 2], - dist, &self->texture->vn_distm ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "invalid dist metric type" ); - - Py_RETURN_NONE; -#else - return EXPP_setIValueRange ( value, &self->texture->vn_distm, - TEX_DISTANCE, - TEX_MINKOVSKY, 'h' ); -#endif -} - -static int Texture_setExp( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->vn_mexp, - EXPP_TEX_EXP_MIN, - EXPP_TEX_EXP_MAX ); -} - -static int Texture_setWeight1( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->vn_w1, - EXPP_TEX_WEIGHT1_MIN, - EXPP_TEX_WEIGHT1_MAX ); -} - -static int Texture_setWeight2( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->vn_w2, - EXPP_TEX_WEIGHT2_MIN, - EXPP_TEX_WEIGHT2_MAX ); -} - -static int Texture_setWeight3( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->vn_w3, - EXPP_TEX_WEIGHT3_MIN, - EXPP_TEX_WEIGHT3_MAX ); -} - -static int Texture_setWeight4( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->vn_w4, - EXPP_TEX_WEIGHT4_MIN, - EXPP_TEX_WEIGHT4_MAX ); -} - -static int Texture_setDistAmnt( BPy_Texture * self, PyObject * value ) -{ - return EXPP_setFloatClamped ( value, &self->texture->dist_amount, - EXPP_TEX_DISTAMNT_MIN, - EXPP_TEX_DISTAMNT_MAX ); -} - -static PyObject *Texture_getIpo( BPy_Texture * self ) -{ - struct Ipo *ipo = self->texture->ipo; - - if( !ipo ) - Py_RETURN_NONE; - - return Ipo_CreatePyObject( ipo ); -} - -/* - * this should accept a Py_None argument and just delete the Ipo link - * (as Texture_clearIpo() does) - */ - -static int Texture_setIpo( BPy_Texture * self, PyObject * value ) -{ - Ipo *ipo = NULL; - Ipo *oldipo = self->texture->ipo; - ID *id; - - /* if parameter is not None, check for valid Ipo */ - - if ( value != Py_None ) { - if ( !BPy_Ipo_Check( value ) ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "expected an Ipo object" ); - - ipo = Ipo_FromPyObject( value ); - - if( !ipo ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "null ipo!" ); - - if( ipo->blocktype != ID_TE ) - return EXPP_ReturnIntError( PyExc_TypeError, - "Ipo is not a texture data Ipo" ); - } - - /* if already linked to Ipo, delete link */ - - if ( oldipo ) { - id = &oldipo->id; - if( id->us > 0 ) - id->us--; - } - - /* assign new Ipo and increment user count, or set to NULL if deleting */ - - self->texture->ipo = ipo; - if ( ipo ) { - id = &ipo->id; - id_us_plus(id); - } - - return 0; -} - -static PyObject *Texture_getAnimFrames( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->iuser.frames ); -} - -static PyObject *Texture_getIUserCyclic( BPy_Texture *self ) -{ - if( self->texture->iuser.cycl ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -#if 0 -/* disabled. this option was too stupid! (ton) */ -static PyObject *Texture_getAnimLength( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->len ); -} - -static PyObject *Texture_getAnimMontage( BPy_Texture *self ) -{ - return Py_BuildValue( "((i,i),(i,i),(i,i),(i,i))", - self->texture->fradur[0][0], - self->texture->fradur[0][1], - self->texture->fradur[1][0], - self->texture->fradur[1][1], - self->texture->fradur[2][0], - self->texture->fradur[2][1], - self->texture->fradur[3][0], - self->texture->fradur[3][1] ); -} -#endif - -static PyObject *Texture_getAnimOffset( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->iuser.offset ); -} - -static PyObject *Texture_getAnimStart( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->iuser.sfra ); -} - -static PyObject *Texture_getBrightness( BPy_Texture *self ) -{ - return PyFloat_FromDouble ( self->texture->bright ); -} - -static PyObject *Texture_getContrast( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->contrast ); -} - -static PyObject *Texture_getCrop( BPy_Texture *self ) -{ - return Py_BuildValue( "(f,f,f,f)", - self->texture->cropxmin, - self->texture->cropymin, - self->texture->cropxmax, - self->texture->cropymax ); -} - -static PyObject *Texture_getDistAmnt( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->dist_amount ); -} - -static PyObject *Texture_getDistMetric( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->vn_distm ); -} - -static PyObject *Texture_getExp( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->vn_mexp ); -} - -static PyObject *Texture_getIntExtend( BPy_Texture * self ) -{ - return PyInt_FromLong( self->texture->extend ); -} - -static PyObject *Texture_getFieldsPerImage( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->iuser.fie_ima ); -} - -static PyObject *Texture_getFilterSize( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->filtersize ); -} - -static PyObject *Texture_getFlags( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->flag ); -} - -static PyObject *Texture_getHFracDim( BPy_Texture *self ) -{ - return PyInt_FromLong( (long)self->texture->mg_H ); -} - -static PyObject *Texture_getImageFlags( BPy_Texture *self, void *type ) -{ - /* type == 0 means attribute "imageFlags" - * other types means attribute "mipmap", "calcAlpha", etc - */ - - if( (int)type ) - return EXPP_getBitfield( &self->texture->imaflag, (int)type, 'h' ); - else - return PyInt_FromLong( self->texture->imaflag ); -} - -static PyObject *Texture_getIUserFlags( BPy_Texture *self, void *flag ) -{ - if( self->texture->iuser.flag & (int)flag ) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static PyObject *Texture_getIScale( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->ns_outscale ); -} - -static PyObject *Texture_getLacunarity( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->mg_lacunarity ); -} - -static PyObject *Texture_getNoiseBasis( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->noisebasis ); -} - -static PyObject *Texture_getNoiseBasis2( BPy_Texture *self, void *type ) -{ - /* type == EXPP_TEX_NOISEBASIS2 means attribute "noiseBasis2" - * other types means attribute "sine", "saw", or "tri" attribute - */ - - if( (int)type == EXPP_TEX_NOISEBASIS2 ) - return PyInt_FromLong( self->texture->noisebasis2 ); - else - return PyInt_FromLong( ( self->texture->noisebasis2 == (int)type ) ? 1 : 0 ); -} - -static PyObject *Texture_getNoiseDepth( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->noisedepth ); -} - -static PyObject *Texture_getNoiseSize( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->noisesize ); -} - -static PyObject *Texture_getNoiseType( BPy_Texture *self ) -{ - if ( self->texture->noisetype == TEX_NOISESOFT ) - return PyString_FromString( "soft" ); - else - return PyString_FromString( "hard" ); -} - -static PyObject *Texture_getOcts( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->mg_octaves ); -} - -static PyObject *Texture_getRepeat( BPy_Texture *self ) -{ - return Py_BuildValue( "(i,i)", self->texture->xrepeat, - self->texture->yrepeat ); -} - -static PyObject *Texture_getRGBCol( BPy_Texture *self ) -{ - return Py_BuildValue( "(f,f,f)", self->texture->rfac, - self->texture->gfac, self->texture->bfac ); -} - -static PyObject *Texture_getSType( BPy_Texture *self ) -{ - if( self->texture->type == TEX_VORONOI ) - return PyInt_FromLong( self->texture->vn_coltype ); -#if 0 - if( self->texture->type == TEX_MUSGRAVE ) - return PyInt_FromLong( self->texture->noisebasis ); -#endif - if( self->texture->type == TEX_ENVMAP ) - return PyInt_FromLong( self->texture->env->stype ); - - return PyInt_FromLong( self->texture->stype ); -} - -static PyObject *Texture_getTurbulence( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->turbul ); -} - -static PyObject *Texture_getType( BPy_Texture *self ) -{ - return PyInt_FromLong( self->texture->type ); -} - -static PyObject *Texture_getWeight1( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->vn_w1 ); -} - -static PyObject *Texture_getWeight2( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->vn_w2 ); -} - -static PyObject *Texture_getWeight3( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->vn_w3 ); -} - -static PyObject *Texture_getWeight4( BPy_Texture *self ) -{ - return PyFloat_FromDouble( self->texture->vn_w4 ); -} - -/* #####DEPRECATED###### */ - -static PyObject *Texture_oldsetImage( BPy_Texture * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, - (setter)Texture_setImage ); -} - -static PyObject *Texture_oldsetIpo( BPy_Texture * self, PyObject * args ) -{ - return EXPP_setterWrapper ( (void *)self, args, (setter)Texture_setIpo ); -} - -/* - * clearIpo() returns True/False depending on whether material has an Ipo - */ - -static PyObject *Texture_clearIpo( BPy_Texture * self ) -{ - /* if Ipo defined, delete it and return true */ - - if( self->texture->ipo ) { - PyObject *value = Py_BuildValue( "(O)", Py_None ); - EXPP_setterWrapper( (void *)self, value, (setter)Texture_setIpo ); - Py_DECREF( value ); - return EXPP_incr_ret_True(); - } - return EXPP_incr_ret_False(); /* no ipo found */ -} - -/* - * these older setter methods take strings as parameters; check the list of - * strings to figure out which bits to set, then call new attribute setters - * using the wrapper. - */ - -static PyObject *Texture_oldsetFlags( BPy_Texture * self, PyObject * args ) -{ - unsigned int i, flag = 0; - PyObject *value, *error; - - /* check that we're passed a tuple */ - - if ( !PyTuple_Check( args ) ) - return EXPP_ReturnPyObjError ( PyExc_AttributeError, - "expected a tuple of string arguments" ); - - /* check each argument for type, find its value */ - - for ( i = PyTuple_Size( args ); i-- ; ) { - short thisflag; - char * name = PyString_AsString( PyTuple_GET_ITEM( args, i ) ); - if( !name ) - return EXPP_ReturnPyObjError ( PyExc_AttributeError, - "expected string argument" ); - - if( !EXPP_map_getShortVal( tex_flag_map, name, &thisflag ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "unknown Texture flag argument" ) ); - - flag |= thisflag; - } - - /* build tuple, call wrapper */ - - value = Py_BuildValue( "(i)", flag ); - error = EXPP_setterWrapper( (void *)self, value, (setter)Texture_setFlags ); - Py_DECREF ( value ); - return error; -} - -/* - * Texture_oldsetType() and Texture_oldsetExtend() - * - * These older setter methods convert a string into an integer setting, so - * doesn't make sense to try wrapping them. - */ - -static PyObject *Texture_oldsetType( BPy_Texture * self, PyObject * args ) -{ - char *type = NULL; - - if( !PyArg_ParseTuple( args, "s", &type ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if( !EXPP_map_getShortVal( tex_type_map, type, &self->texture->type ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "invalid texture type" ); - - /* - * if we set the texture OK, and it's a environment map, and - * there is no environment map yet, allocate one (code borrowed - * from texture_panel_envmap() in source/blender/src/buttons_shading.c) - */ - - if( self->texture->type == TEX_ENVMAP - && !self->texture->env ) { - self->texture->env = BKE_add_envmap(); - self->texture->env->object= OBACT; - } - - Py_RETURN_NONE; -} - -static PyObject *Texture_oldsetExtend( BPy_Texture * self, PyObject * args ) -{ - char *extend = NULL; - if( !PyArg_ParseTuple( args, "s", &extend ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - if( !EXPP_map_getShortVal - ( tex_extend_map, extend, &self->texture->extend ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "invalid extend mode" ); - - Py_RETURN_NONE; -} - -/* - * Texture_oldsetNoiseBasis(), Texture_oldsetDistNoise() - * Texture_oldsetSType(), Texture_oldsetDistMetric(), - * Texture_oldsetImageFlags() - * - * these old setter methods behave differently from the attribute - * setters, so they are left unchanged. - */ - -static PyObject *Texture_oldsetNoiseBasis( BPy_Texture * self, PyObject * args ) -{ -/* NOTE: leave as-is: don't use setterWrapper */ - char *nbasis; - - if( !PyArg_ParseTuple( args, "s", &nbasis ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - if( self->texture->type == TEX_MUSGRAVE && - EXPP_map_getShortVal( tex_stype_map[TEX_DISTNOISE], - nbasis, &self->texture->noisebasis ) ); - else if( self->texture->type == TEX_DISTNOISE && - !EXPP_map_getShortVal( tex_stype_map[TEX_DISTNOISE], - nbasis, &self->texture->noisebasis2 ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "invalid noise basis" ); - - Py_RETURN_NONE; -} - -static PyObject *Texture_oldsetDistNoise( BPy_Texture * self, PyObject * args ) -{ -/* NOTE: leave as-is: don't use setterWrapper */ - char *nbasis; - - if( !PyArg_ParseTuple( args, "s", &nbasis ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - if( self->texture->type == TEX_DISTNOISE && - !EXPP_map_getShortVal( tex_stype_map[TEX_DISTNOISE], - nbasis, &self->texture->noisebasis ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "invalid noise basis" ); - - Py_RETURN_NONE; -} - -static PyObject *Texture_oldsetSType( BPy_Texture * self, PyObject * args ) -{ - char *stype = NULL; - if( !PyArg_ParseTuple( args, "s", &stype ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - - /* can we really trust texture->type? */ - if( ( self->texture->type == TEX_VORONOI && - EXPP_map_getShortVal( tex_stype_map[self->texture->type], - stype, &self->texture->vn_coltype ) ) ); -#if 0 - else if( ( self->texture->type == TEX_MUSGRAVE && - EXPP_map_getShortVal( tex_stype_map - [TEX_DISTNOISE], stype, - &self->texture->noisebasis ) ) ); -#endif - else if( ( self->texture->type == TEX_ENVMAP && - EXPP_map_getShortVal( tex_stype_map[self->texture->type], - stype, &self->texture->env->stype ) ) ); - else if( !EXPP_map_getShortVal - ( tex_stype_map[self->texture->type], stype, - &self->texture->stype ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "invalid texture stype" ); - - Py_RETURN_NONE; -} - -static PyObject *Texture_oldsetDistMetric( BPy_Texture * self, PyObject * args ) -{ -/* NOTE: leave as-is: don't use setterWrapper */ - char *dist = NULL; - - if( !PyArg_ParseTuple( args, "s", &dist ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument" ); - /* can we really trust texture->type? */ - if( self->texture->type == TEX_VORONOI && - !EXPP_map_getShortVal( tex_stype_map[self->texture->type + 2], - dist, &self->texture->vn_distm ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "invalid dist metric type" ); - - Py_RETURN_NONE; -} - -static PyObject *Texture_oldsetImageFlags( BPy_Texture * self, PyObject * args ) -{ - unsigned int i, flag = 0; - - /* check that we're passed a tuple of no more than 3 args*/ - - if( !PyTuple_Check( args ) ) - return EXPP_ReturnPyObjError ( PyExc_AttributeError, - "expected tuple of string arguments" ); - - /* check each argument for type, find its value */ - - for( i = PyTuple_Size( args ); i-- ; ) { - short thisflag; - char * name = PyString_AsString( PyTuple_GET_ITEM( args, i ) ); - if( !name ) - return EXPP_ReturnPyObjError ( PyExc_AttributeError, - "expected string argument" ); - - if( !EXPP_map_getShortVal( tex_imageflag_map, name, &thisflag ) ) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "unknown Texture image flag name" ); - - flag |= thisflag; - } - - self->texture->imaflag = (short)flag; - - Py_RETURN_NONE; -} - -static PyObject *Texture_getColorband( BPy_Texture * self) -{ - return EXPP_PyList_fromColorband( self->texture->coba ); -} - -int Texture_setColorband( BPy_Texture * self, PyObject * value) -{ - return EXPP_Colorband_fromPyList( &self->texture->coba, value ); -} - -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(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; - vec[3] = texres.tin; - - return newVectorObject(vec, 4, Py_NEW); -} - -static PyObject *Texture_copy( BPy_Texture * self ) -{ - Tex *tex = copy_texture(self->texture ); - tex->id.us = 0; - return Texture_CreatePyObject(tex); -} diff --git a/source/blender/python/api2_2x/Texture.h b/source/blender/python/api2_2x/Texture.h deleted file mode 100644 index a00fe6faf94..00000000000 --- a/source/blender/python/api2_2x/Texture.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * $Id: Texture.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Alex Mole - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* based on Image.h */ - -#ifndef EXPP_TEXTURE_H -#define EXPP_TEXTURE_H - -#include -#include "DNA_texture_types.h" - -/*****************************************************************************/ -/* Python BPy_Texture structure definition */ -/*****************************************************************************/ - -typedef struct { - PyObject_HEAD - Tex * texture; /* libdata must be second */ -} BPy_Texture; - -extern PyTypeObject Texture_Type; - -#define BPy_Texture_Check(v) ((v)->ob_type == &Texture_Type) - - -/*****************************************************************************/ -/* Module Blender.Texture - public functions */ -/*****************************************************************************/ - -PyObject *Texture_Init( void ); -PyObject *Texture_CreatePyObject( struct Tex *tex ); -Tex *Texture_FromPyObject( PyObject * pyobj ); - - -#endif /* EXPP_TEXTURE_H */ diff --git a/source/blender/python/api2_2x/Types.c b/source/blender/python/api2_2x/Types.c deleted file mode 100644 index 425584f84ac..00000000000 --- a/source/blender/python/api2_2x/Types.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * $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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Alex Mole, Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "Types.h" -#include "IDProp.h" -/* - stuff pasted from the old Types.h - is only need here now -*/ - -extern PyTypeObject IDGroup_Type, IDArray_Type; -extern PyTypeObject Action_Type, Armature_Type; -extern PyTypeObject Pose_Type; -extern PyTypeObject BezTriple_Type, Bone_Type, Button_Type; -extern PyTypeObject Camera_Type; -extern PyTypeObject CurNurb_Type, SurfNurb_Type; -extern PyTypeObject Curve_Type; -extern PyTypeObject Effect_Type, Font_Type; -extern PyTypeObject Image_Type, Ipo_Type, IpoCurve_Type; -extern PyTypeObject Lamp_Type, Lattice_Type; -extern PyTypeObject Material_Type, Metaball_Type, MTex_Type; -extern PyTypeObject NMFace_Type, NMEdge_Type, NMVert_Type, NMCol_Type, - NMesh_Type; -extern PyTypeObject MFace_Type, MVert_Type, PVert_Type, MEdge_Type, MCol_Type, - Mesh_Type; - -extern PyTypeObject Object_Type; -extern PyTypeObject Group_Type; -extern PyTypeObject Particle_Type; -extern PyTypeObject Scene_Type, RenderData_Type; -extern PyTypeObject Text_Type, Text3d_Type, Texture_Type; -extern PyTypeObject World_Type; -extern PyTypeObject property_Type; -extern PyTypeObject buffer_Type, constant_Type, euler_Type; -extern PyTypeObject matrix_Type, quaternion_Type, rgbTuple_Type, vector_Type; -extern PyTypeObject point_Type; -extern PyTypeObject Modifier_Type, ModSeq_Type; -extern PyTypeObject EditBone_Type; -extern PyTypeObject ThemeSpace_Type; -extern PyTypeObject ThemeUI_Type; -extern PyTypeObject TimeLine_Type; - -char M_Types_doc[] = "The Blender Types module\n\n\ -This module is a dictionary of all Blender Python types"; - -struct PyMethodDef Null_methods[] = { {NULL, NULL, 0, NULL} }; - - - -/* The internal types (lowercase first letter, like constant_Type) are only - * set when some object initializes them. But unless we do it early, we get - * some easy and unpredictable (varies with platform, even distro) ways to - * crash Blender. Some modules also need this early up, so let's generalize - * and init all our pytypes here. - */ - -void types_InitAll( void ) -{ - Action_Type.ob_type = &PyType_Type; - Pose_Type.ob_type = &PyType_Type; - Armature_Type.ob_type = &PyType_Type; - BezTriple_Type.ob_type = &PyType_Type; - Bone_Type.ob_type = &PyType_Type; - Button_Type.ob_type = &PyType_Type; - Camera_Type.ob_type = &PyType_Type; - CurNurb_Type.ob_type = &PyType_Type; - Curve_Type.ob_type = &PyType_Type; - Effect_Type.ob_type = &PyType_Type; - Image_Type.ob_type = &PyType_Type; - Ipo_Type.ob_type = &PyType_Type; - IpoCurve_Type.ob_type = &PyType_Type; - Lamp_Type.ob_type = &PyType_Type; - Lattice_Type.ob_type = &PyType_Type; - Material_Type.ob_type = &PyType_Type; - Metaball_Type.ob_type = &PyType_Type; - MTex_Type.ob_type = &PyType_Type; - NMCol_Type.ob_type = &PyType_Type; - NMFace_Type.ob_type = &PyType_Type; - NMEdge_Type.ob_type = &PyType_Type; - NMVert_Type.ob_type = &PyType_Type; - NMesh_Type.ob_type = &PyType_Type; - MFace_Type.ob_type = &PyType_Type; - MVert_Type.ob_type = &PyType_Type; - PVert_Type.ob_type = &PyType_Type; - MEdge_Type.ob_type = &PyType_Type; - MCol_Type.ob_type = &PyType_Type; - Mesh_Type.ob_type = &PyType_Type; - Object_Type.ob_type = &PyType_Type; - Group_Type.ob_type = &PyType_Type; - RenderData_Type.ob_type = &PyType_Type; - Scene_Type.ob_type = &PyType_Type; - SurfNurb_Type.ob_type = &PyType_Type; - Text_Type.ob_type = &PyType_Type; - Text3d_Type.ob_type = &PyType_Type; - Texture_Type.ob_type = &PyType_Type; - //TimeLine_Type.ob_type = &PyType_Type; - World_Type.ob_type = &PyType_Type; - buffer_Type.ob_type = &PyType_Type; - constant_Type.ob_type = &PyType_Type; - euler_Type.ob_type = &PyType_Type; - matrix_Type.ob_type = &PyType_Type; - quaternion_Type.ob_type = &PyType_Type; - PyType_Ready( &rgbTuple_Type ); - vector_Type.ob_type = &PyType_Type; - property_Type.ob_type = &PyType_Type; - point_Type.ob_type = &PyType_Type; - PyType_Ready( &Modifier_Type ); - PyType_Ready( &ModSeq_Type ); - PyType_Ready( &EditBone_Type ); - PyType_Ready( &ThemeSpace_Type ); - PyType_Ready( &ThemeUI_Type ); - IDProp_Init_Types(); -} - -/*****************************************************************************/ -/* Function: Types_Init */ -/*****************************************************************************/ -PyObject *Types_Init( void ) -{ - PyObject *submodule, *dict; - - submodule = - Py_InitModule3( "Blender.Types", Null_methods, M_Types_doc ); - - dict = PyModule_GetDict( submodule ); - - /* The Blender Object Type */ - - PyDict_SetItemString( dict, "ObjectType", - ( PyObject * ) &Object_Type ); - - /* Blender Object Data Types */ - - PyDict_SetItemString( dict, "GroupType", - ( PyObject * ) &Group_Type ); - - PyDict_SetItemString( dict, "SceneType", ( PyObject * ) &Scene_Type ); - PyDict_SetItemString( dict, "RenderDataType", - ( PyObject * ) &RenderData_Type ); - - PyDict_SetItemString( dict, "NMeshType", ( PyObject * ) &NMesh_Type ); - PyDict_SetItemString( dict, "NMFaceType", - ( PyObject * ) &NMFace_Type ); - PyDict_SetItemString( dict, "NMVertType", - ( PyObject * ) &NMVert_Type ); - PyDict_SetItemString( dict, "NMEdgeType", - ( PyObject * ) &NMEdge_Type ); - PyDict_SetItemString( dict, "NMColType", ( PyObject * ) &NMCol_Type ); - - PyDict_SetItemString( dict, "MeshType", ( PyObject * ) &Mesh_Type ); - PyDict_SetItemString( dict, "MFaceType", - ( PyObject * ) &MFace_Type ); - PyDict_SetItemString( dict, "MEdgeType", - ( PyObject * ) &MEdge_Type ); - PyDict_SetItemString( dict, "MVertType", - ( PyObject * ) &MVert_Type ); - PyDict_SetItemString( dict, "PVertType", - ( PyObject * ) &PVert_Type ); - PyDict_SetItemString( dict, "MColType", ( PyObject * ) &MCol_Type ); - - PyDict_SetItemString( dict, "ArmatureType", - ( PyObject * ) &Armature_Type ); - PyDict_SetItemString( dict, "BoneType", ( PyObject * ) &Bone_Type ); - - PyDict_SetItemString( dict, "CurNurb_Type", - ( PyObject * ) &CurNurb_Type ); - PyDict_SetItemString( dict, "SurfNurb_Type", - ( PyObject * ) &SurfNurb_Type ); - PyDict_SetItemString( dict, "CurveType", ( PyObject * ) &Curve_Type ); - - PyDict_SetItemString( dict, "IpoType", ( PyObject * ) &Ipo_Type ); - PyDict_SetItemString( dict, "MetaballType", - ( PyObject * ) &Metaball_Type ); - - PyDict_SetItemString( dict, "CameraType", - ( PyObject * ) &Camera_Type ); - PyDict_SetItemString( dict, "ImageType", ( PyObject * ) &Image_Type ); - PyDict_SetItemString( dict, "LampType", ( PyObject * ) &Lamp_Type ); - PyDict_SetItemString( dict, "TextType", ( PyObject * ) &Text_Type ); - PyDict_SetItemString( dict, "Text3dType", ( PyObject * ) &Text3d_Type ); - PyDict_SetItemString( dict, "MaterialType", - ( PyObject * ) &Material_Type ); - - PyDict_SetItemString( dict, "ButtonType", - ( PyObject * ) &Button_Type ); - - PyDict_SetItemString( dict, "LatticeType", - ( PyObject * ) &Lattice_Type ); - - PyDict_SetItemString( dict, "TextureType", - ( PyObject * ) &Texture_Type ); - PyDict_SetItemString( dict, "MTexType", ( PyObject * ) &MTex_Type ); - - /* External helper Types available to the main ones above */ - - PyDict_SetItemString( dict, "vectorType", - ( PyObject * ) &vector_Type ); - PyDict_SetItemString( dict, "bufferType", - ( PyObject * ) &buffer_Type ); - PyDict_SetItemString( dict, "constantType", - ( PyObject * ) &constant_Type ); - PyDict_SetItemString( dict, "rgbTupleType", - ( PyObject * ) &rgbTuple_Type ); - PyDict_SetItemString( dict, "matrix_Type", - ( PyObject * ) &matrix_Type ); - PyDict_SetItemString( dict, "eulerType", ( PyObject * ) &euler_Type ); - PyDict_SetItemString( dict, "quaternionType", - ( PyObject * ) &quaternion_Type ); - PyDict_SetItemString( dict, "BezTripleType", - ( PyObject * ) &BezTriple_Type ); - PyDict_SetItemString( dict, "ActionType", - ( PyObject * ) &Action_Type ); - PyDict_SetItemString( dict, "PoseType", - ( PyObject * ) &Pose_Type ); - PyDict_SetItemString( dict, "propertyType", - ( PyObject * ) &property_Type ); - PyDict_SetItemString( dict, "pointType", - ( PyObject * ) &point_Type ); - PyDict_SetItemString( dict, "ModifierType", - ( PyObject * ) &Modifier_Type ); - PyDict_SetItemString( dict, "ModSeqType", - ( PyObject * ) &ModSeq_Type ); - PyDict_SetItemString( dict, "EditBoneType", - ( PyObject * ) &EditBone_Type); - PyDict_SetItemString( dict, "ThemeSpaceType", - ( PyObject * ) &ThemeSpace_Type); - PyDict_SetItemString( dict, "ThemeUI_Type", - ( PyObject * ) &ThemeUI_Type); - PyDict_SetItemString( dict, "IDGroupType", - ( PyObject * ) &IDGroup_Type); - PyDict_SetItemString( dict, "IDArrayType", - ( PyObject * ) &IDArray_Type); - return submodule; -} diff --git a/source/blender/python/api2_2x/Types.h b/source/blender/python/api2_2x/Types.h deleted file mode 100644 index b905ab75d62..00000000000 --- a/source/blender/python/api2_2x/Types.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * $Id: Types.h 7266 2006-04-16 15:28:50Z stiv $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Alex Mole - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_TYPES_H -#define EXPP_TYPES_H - -#include - -PyObject *Types_Init( void ); -void types_InitAll( void ); - -#endif /* EXPP_TYPES_H */ diff --git a/source/blender/python/api2_2x/Window.c b/source/blender/python/api2_2x/Window.c deleted file mode 100644 index 73edcb2df9c..00000000000 --- a/source/blender/python/api2_2x/Window.c +++ /dev/null @@ -1,1594 +0,0 @@ -/* - * $Id: Window.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Tom Musgrove, Michael Reimpell, - * Yann Vernier, Ken Hughes - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include - -#include "BDR_editobject.h" /* enter / leave editmode */ -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_object.h" /* for during_script() and during_scriptlink() */ -#include "BKE_scene.h" /* scene_find_camera() */ -#include "BPI_script.h" -#include "BIF_mywindow.h" -#include "BIF_imasel.h" -#include "BSE_headerbuttons.h" -#include "BSE_filesel.h" -#include "BIF_editmesh.h" /* for undo_push_mesh() */ -#include "BIF_screen.h" -#include "BIF_space.h" -#include "BIF_drawtext.h" -#include "BIF_poseobject.h" -#include "DNA_view3d_types.h" -#include "DNA_space_types.h" -#include "DNA_scene_types.h" -#include "DNA_text_types.h" -#include "DNA_object_types.h" -#include "mydevice.h" -#include "blendef.h" /* OBACT */ -#include "windowTheme.h" -#include "Mathutils.h" -#include "constant.h" -#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); - -/*****************************************************************************/ -/* Python API function prototypes for the Window module. */ -/*****************************************************************************/ -PyObject *M_Window_Redraw( PyObject * self, PyObject * args ); -static PyObject *M_Window_RedrawAll( PyObject * self, PyObject * args ); -static PyObject *M_Window_QRedrawAll( PyObject * self, PyObject * args ); -static PyObject *M_Window_DrawProgressBar( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetCursorPos( PyObject * self ); -static PyObject *M_Window_SetCursorPos( PyObject * self, PyObject * args ); -static PyObject *M_Window_WaitCursor( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetViewVector( PyObject * self ); -static PyObject *M_Window_GetActiveLayer( PyObject * self ); -static PyObject *M_Window_SetActiveLayer( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetViewQuat( PyObject * self ); -static PyObject *M_Window_SetViewQuat( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetViewOffset( PyObject * self ); -static PyObject *M_Window_SetViewOffset( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetViewMatrix( PyObject * self ); -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 ); -static PyObject *M_Window_QRead( PyObject * self ); -static PyObject *M_Window_QAdd( PyObject * self, PyObject * args ); -static PyObject *M_Window_QHandle( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetMouseCoords( PyObject * self ); -static PyObject *M_Window_SetMouseCoords( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetMouseButtons( PyObject * self ); -static PyObject *M_Window_GetKeyQualifiers( PyObject * self ); -static PyObject *M_Window_SetKeyQualifiers( PyObject * self, PyObject * args ); -static PyObject *M_Window_GetAreaSize( PyObject * self ); -static PyObject *M_Window_GetAreaID( PyObject * self ); -static PyObject *M_Window_GetScreenSize( PyObject * self ); -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 ); - - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.Window.__doc__ */ -/*****************************************************************************/ -static char M_Window_doc[] = "The Blender Window module\n\n"; - -static char M_Window_Redraw_doc[] = - "() - Force a redraw of a specific Window Type (see Window.Types)"; - -static char M_Window_RedrawAll_doc[] = "() - Redraw all windows"; - -static char M_Window_QRedrawAll_doc[] = - "() - Redraw all windows by queue event"; - -static char M_Window_FileSelector_doc[] = - "(callback [, title, filename]) - Open a file selector window.\n\ -The selected file name is used as argument to a function callback f(name)\n\ -that you must provide. 'title' is optional and defaults to 'SELECT FILE'.\n\ -'filename' is optional and defaults to Blender.Get('filename').\n\n\ -Example:\n\n\ -import Blender\n\n\ -def my_function(filename):\n\ - print 'The selected file was: ', filename\n\n\ -Blender.Window.FileSelector(my_function, 'SAVE FILE')\n"; - -static char M_Window_ImageSelector_doc[] = - "(callback [, title, filename]) - Open an image selector window.\n\ -The selected file name is used as argument to a function callback f(name)\n\ -that you must provide. 'title' is optional and defaults to 'SELECT IMAGE'.\n\ -'filename' is optional and defaults to Blender.Get('filename').\n\n\ -Example:\n\n\ -import Blender\n\n\ -def my_function(filename):\n\ - print 'The selected image file was: ', filename\n\n\ -Blender.Window.ImageSelector(my_function, 'LOAD IMAGE')\n"; - -static char M_Window_DrawProgressBar_doc[] = - "(done, text) - Draw a progress bar.\n\ -'done' is a float value <= 1.0, 'text' contains info about what is\n\ -currently being done."; - -static char M_Window_GetCursorPos_doc[] = - "() - Get the current 3d cursor position as a list of three floats."; - -static char M_Window_SetCursorPos_doc[] = - "([f,f,f]) - Set the current 3d cursor position from a list of three floats."; - -static char M_Window_WaitCursor_doc[] = - "(bool) - Set cursor to wait mode (nonzero bool) or normal mode (0)."; - -static char M_Window_GetViewVector_doc[] = - "() - Get the current 3d view vector as a list of three floats [x,y,z]."; - -static char M_Window_GetActiveLayer_doc[] = - "() - Get the current 3d views active layer where new objects are created."; - -static char M_Window_SetActiveLayer_doc[] = - "(int) - Set the current 3d views active layer where new objects are created."; - -static char M_Window_GetViewMatrix_doc[] = - "() - Get the current 3d view matrix."; - -static char M_Window_GetPerspMatrix_doc[] = - "() - Get the current 3d Persp matrix."; - -static char M_Window_EditMode_doc[] = - "() - Get the current status -- 0: not in edit mode; 1: in edit mode.\n\ -(status) - if 1: enter edit mode; if 0: leave edit mode.\n\ -Returns the current status. This function is mostly useful to leave\n\ -edit mode before applying changes to a mesh (otherwise the changes will\n\ -be lost) and then returning to it upon leaving."; -static char M_Window_PoseMode_doc[] = - "() - Get the current status -- 0: not in pose mode; 1: in edit mode"; - -static char M_Window_ViewLayers_doc[] = - "(layers = [], winid = None) - Get/set active layers in all 3d View windows.\n\ -() - Make no changes, only return currently visible layers.\n\ -(layers = []) - a list of integers, each in the range [1, 20].\n\ -(layers = [], winid = int) - layers as above, winid is an optional.\n\ -arg that makes the function only set layers for that view.\n\ -This function returns the currently visible layers as a list of ints."; - -static char M_Window_GetViewQuat_doc[] = - "() - Get the current VIEW3D view quaternion values."; - -static char M_Window_SetViewQuat_doc[] = - "(quat) - Set the current VIEW3D view quaternion values.\n\ -(quat) - [f,f,f,f] or f,f,f,f: the new float values."; - -static char M_Window_GetViewOffset_doc[] = - "() - Get the current VIEW3D view offset values."; - -static char M_Window_SetViewOffset_doc[] = - "(ofs) - Set the current VIEW3D view offset values.\n\ -(ofs) - [f,f,f] or f,f,f: the new float values."; - -static char M_Window_CameraView_doc[] = - "(camtov3d = 0) - Set the current VIEW3D view to the active camera's view.\n\ -(camtov3d = 0) - bool: if nonzero it's the camera that gets positioned at the\n\ -current view, instead of the view being changed to that of the camera.\n\n\ -If no camera is the active object, the active camera for the current scene\n\ -is used."; - -static char M_Window_QTest_doc[] = - "() - Check if there are pending events in the event queue."; - -static char M_Window_QRead_doc[] = - "() - Get the next pending event from the event queue.\n\ -This function returns a list [event, val], where:\n\ -event - int: the key or mouse event (see Blender.Draw module);\n\ -val - int: if 1 it's a key or mouse button press, if 0 a release. For\n\ - mouse movement events 'val' returns the new coordinates in x or y."; - -static char M_Window_QAdd_doc[] = - "(win, evt, val, after = 0) - Add an event to some window's event queue.\n\ -(win) - int: the win id, see Blender.Window.GetScreenInfo();\n\ -(evt) - int: the event number, see events in Blender.Draw;\n\ -(val) - bool: 1 for a key press, 0 for a release;\n\ -(after) - bool: if 1 the event is put after the current queue and added later."; - -static char M_Window_QHandle_doc[] = - "(win) - Process all events for the given window (area) now.\n\ -(win) - int: the window id, see Blender.Window.GetScreenInfo().\n\n\ -See Blender.Window.QAdd() for how to send events to a particular window."; - -static char M_Window_GetMouseCoords_doc[] = - "() - Get mouse pointer's current screen coordinates."; - -static char M_Window_SetMouseCoords_doc[] = - "(x, y) - Set mouse pointer's current screen coordinates.\n\ -(x,y) - ints ([x, y] also accepted): the new x, y coordinates."; - -static char M_Window_GetMouseButtons_doc[] = - "() - Get the current mouse button state (see Blender.Window.MButs dict)."; - -static char M_Window_GetKeyQualifiers_doc[] = - "() - Get the current qualifier keys state.\n\ -An int is returned: or'ed combination of values in Blender.Window.Qual's dict."; - -static char M_Window_SetKeyQualifiers_doc[] = - "(qual) - Fake qualifier keys state.\n\ -(qual) - int: an or'ed combination of the values in Blender.Window.Qual dict.\n\ -Note: remember to reset to 0 after handling the related event (see QAdd())."; - -static char M_Window_GetAreaID_doc[] = - "() - Get the current window's (area) ID."; - -static char M_Window_GetAreaSize_doc[] = - "() - Get the current window's (area) size as [width, height]."; - -static char M_Window_GetScreenSize_doc[] = - "() - Get the screen's size as [width, height]."; - -static char M_Window_GetScreens_doc[] = - "() - Get a list with the names of all available screens."; - -static char M_Window_SetScreen_doc[] = - "(name) - Set current screen to the one with the given 'name'."; - -static char M_Window_GetScreenInfo_doc[] = - "(type = -1, rect = 'win', screen = None)\n\ -- Get info about the the areas in the current screen setup.\n\ -(type = -1) - int: the space type (Blender.Window.Types) to restrict the\n\ - results to, all if -1;\n\ -(rect = 'win') - str: the rectangle of interest. This defines if the corner\n\ - coordinates returned will refer to:\n\ - - the whole area: 'total';\n\ - - only the header: 'header';\n\ - - only the window content (default): 'win'.\n\ -(screen = None) - str: the screen name, current if not given.\n\n\ -A list of dictionaries (one for each area) is returned.\n\ -Each dictionary has keys:\n\ -'vertices': [xmin, ymin, xmax, ymax] area corners;\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: */ -/*****************************************************************************/ -struct PyMethodDef M_Window_methods[] = { - {"Redraw", M_Window_Redraw, METH_VARARGS, M_Window_Redraw_doc}, - {"RedrawAll", M_Window_RedrawAll, METH_VARARGS, - M_Window_RedrawAll_doc}, - {"QRedrawAll", M_Window_QRedrawAll, METH_VARARGS, - M_Window_QRedrawAll_doc}, - {"FileSelector", M_Window_FileSelector, METH_VARARGS, - M_Window_FileSelector_doc}, - {"ImageSelector", ( PyCFunction ) M_Window_ImageSelector, METH_VARARGS, - M_Window_ImageSelector_doc}, - {"DrawProgressBar", M_Window_DrawProgressBar, METH_VARARGS, - M_Window_DrawProgressBar_doc}, - {"drawProgressBar", M_Window_DrawProgressBar, METH_VARARGS, - M_Window_DrawProgressBar_doc}, - {"GetCursorPos", ( PyCFunction ) M_Window_GetCursorPos, METH_NOARGS, - M_Window_GetCursorPos_doc}, - {"SetCursorPos", M_Window_SetCursorPos, METH_VARARGS, - M_Window_SetCursorPos_doc}, - {"WaitCursor", M_Window_WaitCursor, METH_VARARGS, - M_Window_WaitCursor_doc}, - {"GetViewVector", ( PyCFunction ) M_Window_GetViewVector, METH_NOARGS, - M_Window_GetViewVector_doc}, - {"GetActiveLayer", ( PyCFunction ) M_Window_GetActiveLayer, METH_NOARGS, - M_Window_GetActiveLayer_doc}, - {"SetActiveLayer", ( PyCFunction ) M_Window_SetActiveLayer, METH_VARARGS, - M_Window_SetActiveLayer_doc}, - {"GetViewQuat", ( PyCFunction ) M_Window_GetViewQuat, METH_NOARGS, - M_Window_GetViewQuat_doc}, - {"SetViewQuat", ( PyCFunction ) M_Window_SetViewQuat, METH_VARARGS, - M_Window_SetViewQuat_doc}, - {"GetViewOffset", ( PyCFunction ) M_Window_GetViewOffset, METH_NOARGS, - M_Window_GetViewOffset_doc}, - {"SetViewOffset", ( PyCFunction ) M_Window_SetViewOffset, METH_VARARGS, - M_Window_SetViewOffset_doc}, - {"GetViewMatrix", ( PyCFunction ) M_Window_GetViewMatrix, METH_NOARGS, - M_Window_GetViewMatrix_doc}, - {"GetPerspMatrix", ( PyCFunction ) M_Window_GetPerspMatrix, METH_NOARGS, - 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: */ - {"ViewLayer", ( PyCFunction ) M_Window_ViewLayers, METH_VARARGS, - M_Window_ViewLayers_doc}, - {"CameraView", ( PyCFunction ) M_Window_CameraView, METH_VARARGS, - M_Window_CameraView_doc}, - {"QTest", ( PyCFunction ) M_Window_QTest, METH_NOARGS, - M_Window_QTest_doc}, - {"QRead", ( PyCFunction ) M_Window_QRead, METH_NOARGS, - M_Window_QRead_doc}, - {"QAdd", ( PyCFunction ) M_Window_QAdd, METH_VARARGS, - M_Window_QAdd_doc}, - {"QHandle", ( PyCFunction ) M_Window_QHandle, METH_VARARGS, - M_Window_QHandle_doc}, - {"GetMouseCoords", ( PyCFunction ) M_Window_GetMouseCoords, - METH_NOARGS, - M_Window_GetMouseCoords_doc}, - {"SetMouseCoords", ( PyCFunction ) M_Window_SetMouseCoords, - METH_VARARGS, - M_Window_SetMouseCoords_doc}, - {"GetMouseButtons", ( PyCFunction ) M_Window_GetMouseButtons, - METH_NOARGS, - M_Window_GetMouseButtons_doc}, - {"GetKeyQualifiers", ( PyCFunction ) M_Window_GetKeyQualifiers, - METH_NOARGS, - M_Window_GetKeyQualifiers_doc}, - {"SetKeyQualifiers", ( PyCFunction ) M_Window_SetKeyQualifiers, - METH_VARARGS, - M_Window_SetKeyQualifiers_doc}, - {"GetAreaSize", ( PyCFunction ) M_Window_GetAreaSize, METH_NOARGS, - M_Window_GetAreaSize_doc}, - {"GetAreaID", ( PyCFunction ) M_Window_GetAreaID, METH_NOARGS, - M_Window_GetAreaID_doc}, - {"GetScreenSize", ( PyCFunction ) M_Window_GetScreenSize, METH_NOARGS, - M_Window_GetScreenSize_doc}, - {"GetScreens", ( PyCFunction ) M_Window_GetScreens, METH_NOARGS, - M_Window_GetScreens_doc}, - {"SetScreen", ( PyCFunction ) M_Window_SetScreen, METH_O, - 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} -}; - -/*****************************************************************************/ -/* Function: M_Window_Redraw */ -/* Python equivalent: Blender.Window.Redraw */ -/*****************************************************************************/ -/* not static so py_slider_update in Draw.[ch] can use it */ -PyObject *M_Window_Redraw( PyObject * self, PyObject * args ) -{ - ScrArea *tempsa, *sa; - int wintype = SPACE_VIEW3D; - short redraw_all = 0; - - if( !PyArg_ParseTuple( args, "|i", &wintype ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument (or nothing)" ) ); - - if( wintype < 0 ) - redraw_all = 1; - - if( !during_script( ) && !G.background ) { - tempsa = curarea; - sa = G.curscreen->areabase.first; - - while( sa ) { - - if( sa->spacetype == wintype || redraw_all ) { - if (sa->spacetype == SPACE_SCRIPT && EXPP_disable_force_draw) { - scrarea_queue_redraw(sa); - } - else { - /* do not call fancy hacks here like pop_space_text(st); (ton) */ - scrarea_do_windraw( sa ); - if( sa->headwin ) scrarea_do_headdraw( sa ); - } - } - sa = sa->next; - } - - if( curarea != tempsa ) - areawinset( tempsa->win ); - - if( curarea ) { /* is null if Blender is in bg mode */ - if( curarea->headwin ) - scrarea_do_headdraw( curarea ); - screen_swapbuffers( ); - } - } - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: M_Window_RedrawAll */ -/* Python equivalent: Blender.Window.RedrawAll */ -/*****************************************************************************/ -static PyObject *M_Window_RedrawAll( PyObject * self, PyObject * args ) -{ - PyObject *arg = Py_BuildValue( "(i)", -1 ); - PyObject *ret = M_Window_Redraw( self, arg ); - Py_DECREF(arg); - return ret; -} - -/*****************************************************************************/ -/* Function: M_Window_QRedrawAll */ -/* Python equivalent: Blender.Window.QRedrawAll */ -/*****************************************************************************/ -static PyObject *M_Window_QRedrawAll( PyObject * self, PyObject * args ) -{ - EXPP_allqueue( REDRAWALL, 0 ); - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: M_Window_FileSelector */ -/* Python equivalent: Blender.Window.FileSelector */ -/*****************************************************************************/ - -/* This is the callback to "activate_fileselect" below. It receives the - * selected filename and (using it as argument) calls the Python callback - * provided by the script writer and stored in EXPP_FS_PyCallback. */ - -static void getSelectedFile( char *name ) -{ - PyObject *pycallback; - PyObject *result; - Script *script; - - /* let's find the script that owns this callback */ - script = G.main->script.first; - while (script) { - if (script->flags & SCRIPT_RUNNING) break; - script = script->id.next; - } - - if (!script) { - if (curarea->spacetype == SPACE_SCRIPT) { - SpaceScript *sc = curarea->spacedata.first; - script = sc->script; - } - } - - pycallback = script->py_browsercallback; - - if (pycallback) { - result = PyObject_CallFunction( pycallback, "s", name ); - - if (!result) { - if (G.f & G_DEBUG) - fprintf(stderr, "BPy error: Callback call failed!\n"); - } - else Py_DECREF(result); - - if (script->py_browsercallback == pycallback) - script->py_browsercallback = NULL; - /* else another call to selector was made inside pycallback */ - - Py_DECREF(pycallback); - } - - return; -} - -static PyObject *M_Window_FileSelector( PyObject * self, PyObject * args ) -{ - char *title = "SELECT FILE"; - char *filename = G.sce; - SpaceScript *sc; - Script *script = NULL; - PyObject *pycallback = NULL; - int startspace = 0; - - if (during_scriptlink()) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "script links can't call the file selector"); - - if (G.background) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "the file selector is not available in background mode"); - - if((!PyArg_ParseTuple( args, "O|ss", &pycallback, &title, &filename)) - || (!PyCallable_Check(pycallback))) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "\nexpected a callback function (and optionally one or two strings) " - "as argument(s)" ); - - Py_INCREF(pycallback); - -/* trick: we move to a spacescript because then the fileselector will properly - * unset our SCRIPT_FILESEL flag when the user chooses a file or cancels the - * selection. This is necessary because when a user cancels, the - * getSelectedFile function above doesn't get called and so couldn't unset the - * flag. */ - startspace = curarea->spacetype; - if( startspace != SPACE_SCRIPT ) - newspace( curarea, SPACE_SCRIPT ); - - sc = curarea->spacedata.first; - - /* let's find the script that called us */ - script = G.main->script.first; - while (script) { - if (script->flags & SCRIPT_RUNNING) break; - script = script->id.next; - } - - if( !script ) { - /* if not running, then we were already on a SpaceScript space, executing - * a registered callback -- aka: this script has a gui */ - script = sc->script; /* this is the right script */ - } else { /* still running, use the trick */ - script->lastspace = startspace; - sc->script = script; - } - - script->flags |= SCRIPT_FILESEL; - - /* clear any previous callback (nested calls to selector) */ - if (script->py_browsercallback) { - Py_DECREF((PyObject *)script->py_browsercallback); - } - script->py_browsercallback = pycallback; - - activate_fileselect( FILE_BLENDER, title, filename, getSelectedFile ); - - Py_RETURN_NONE; -} - -static PyObject *M_Window_ImageSelector( PyObject * self, PyObject * args ) -{ - char *title = "SELECT IMAGE"; - char *filename = G.sce; - SpaceScript *sc; - Script *script = NULL; - PyObject *pycallback = NULL; - int startspace = 0; - - if (during_scriptlink()) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "script links can't call the image selector"); - - if (G.background) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "the image selector is not available in background mode"); - - if( !PyArg_ParseTuple( args, "O|ss", &pycallback, &title, &filename ) - || (!PyCallable_Check(pycallback))) - return EXPP_ReturnPyObjError ( PyExc_AttributeError, - "\nexpected a callback function (and optionally one or two strings) " - "as argument(s)" ); - - Py_INCREF(pycallback); - -/* trick: we move to a spacescript because then the fileselector will properly - * unset our SCRIPT_FILESEL flag when the user chooses a file or cancels the - * selection. This is necessary because when a user cancels, the - * getSelectedFile function above doesn't get called and so couldn't unset the - * flag. */ - startspace = curarea->spacetype; - if( startspace != SPACE_SCRIPT ) - newspace( curarea, SPACE_SCRIPT ); - - sc = curarea->spacedata.first; - - /* let's find the script that called us */ - script = G.main->script.first; - while (script) { - if (script->flags & SCRIPT_RUNNING) break; - script = script->id.next; - } - - if( !script ) { - /* if not running, then we were already on a SpaceScript space, executing - * a registered callback -- aka: this script has a gui */ - script = sc->script; /* this is the right script */ - } else { /* still running, use the trick */ - script->lastspace = startspace; - sc->script = script; - } - - script->flags |= SCRIPT_FILESEL; /* same flag as filesel */ - /* clear any previous callback (nested calls to selector) */ - if (script->py_browsercallback) { - Py_DECREF((PyObject *)script->py_browsercallback); - } - script->py_browsercallback = pycallback; - - activate_imageselect( FILE_BLENDER, title, filename, getSelectedFile ); - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: M_Window_DrawProgressBar */ -/* Python equivalent: Blender.Window.DrawProgressBar */ -/*****************************************************************************/ -static PyObject *M_Window_DrawProgressBar( PyObject * self, PyObject * args ) -{ - float done; - char *info = NULL; - int retval = 0; - ScrArea *sa = curarea; - - if (G.background) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "the progress bar is not available in background mode"); - - if( !PyArg_ParseTuple( args, "fs", &done, &info ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected a float and a string as arguments" ) ); - - retval = progress_bar( done, info ); - - areawinset(sa->win); - - return Py_BuildValue( "i", retval ); -} - -/*****************************************************************************/ -/* Function: M_Window_GetCursorPos */ -/* Python equivalent: Blender.Window.GetCursorPos */ -/*****************************************************************************/ -static PyObject *M_Window_GetCursorPos( PyObject * self ) -{ - float *cursor = NULL; - PyObject *pylist; - - if( G.vd && G.vd->localview ) - cursor = G.vd->cursor; - else - cursor = G.scene->cursor; - - pylist = Py_BuildValue( "[fff]", cursor[0], cursor[1], cursor[2] ); - - if( !pylist ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "GetCursorPos: couldn't create pylist" ) ); - - return pylist; -} - -/*****************************************************************************/ -/* Function: M_Window_SetCursorPos */ -/* Python equivalent: Blender.Window.SetCursorPos */ -/*****************************************************************************/ -static PyObject *M_Window_SetCursorPos( PyObject * self, PyObject * args ) -{ - int ok = 0; - float val[3]; - - if( PyObject_Length( args ) == 3 ) - ok = PyArg_ParseTuple( args, "fff", &val[0], &val[1], - &val[2] ); - else - ok = PyArg_ParseTuple( args, "(fff)", &val[0], &val[1], - &val[2] ); - - if( !ok ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected [f,f,f] or f,f,f as arguments" ); - - if( G.vd && G.vd->localview ) { - G.vd->cursor[0] = val[0]; - G.vd->cursor[1] = val[1]; - G.vd->cursor[2] = val[2]; - } else { - G.scene->cursor[0] = val[0]; - G.scene->cursor[1] = val[1]; - G.scene->cursor[2] = val[2]; - } - - Py_RETURN_NONE; -} - -static PyObject *M_Window_WaitCursor( PyObject * self, PyObject * args ) -{ - int bool; - - if( !PyArg_ParseTuple( args, "i", &bool ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected bool (0 or 1) or nothing as argument" ); - - waitcursor( bool ); /* nonzero bool sets, zero unsets */ - - Py_RETURN_NONE; -} - -/*****************************************************************************/ -/* Function: M_Window_GetViewVector */ -/* Python equivalent: Blender.Window.GetViewVector */ -/*****************************************************************************/ -static PyObject *M_Window_GetViewVector( PyObject * self ) -{ - float *vec = NULL; - - if( !G.vd ) - Py_RETURN_NONE; - - vec = G.vd->viewinv[2]; - - return Py_BuildValue( "[fff]", vec[0], vec[1], vec[2] ); -} - -/*****************************************************************************/ -/* Function: M_Window_GetActiveLayer */ -/* Python equivalent: Blender.Window.GetActiveLayer */ -/*****************************************************************************/ -static PyObject *M_Window_GetActiveLayer( PyObject * self ) -{ - if (!G.vd) { - return PyInt_FromLong(0); - } else { - return PyInt_FromLong( G.vd->layact ); - } -} - -static PyObject *M_Window_SetActiveLayer( PyObject * self, PyObject * args ) -{ - int layer, bit=1; - if( !PyArg_ParseTuple( args, "i", &layer ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an int" ) ); - - if (!G.vd) - Py_RETURN_FALSE; - - bit= 0; - while(bit<32) { - if(layer & (1<layact= 1<lay |= G.vd->layact; - - if (G.vd->scenelock) { - G.scene->lay |= G.vd->layact; - } - bit = -1; /* no error */ - break; - } - bit++; - } - - if (bit != -1) - return ( EXPP_ReturnPyObjError( PyExc_ValueError, - "The flag could not be used for the active layer" ) ); - - Py_RETURN_NONE; -} - -static PyObject *M_Window_GetViewQuat( PyObject * self ) -{ - float *vec = NULL; - - if( !G.vd ) - Py_RETURN_NONE; - - vec = G.vd->viewquat; - - return Py_BuildValue( "[ffff]", vec[0], vec[1], vec[2], vec[3] ); -} - -static PyObject *M_Window_SetViewQuat( PyObject * self, PyObject * args ) -{ - int ok = 0; - float val[4]; - - if( !G.vd ) - Py_RETURN_NONE; - - if( PyObject_Length( args ) == 4 ) - ok = PyArg_ParseTuple( args, "ffff", &val[0], &val[1], &val[2], - &val[3] ); - else - ok = PyArg_ParseTuple( args, "(ffff)", &val[0], &val[1], - &val[2], &val[3] ); - - if( !ok ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected [f,f,f,f] or f,f,f,f as arguments" ); - - G.vd->viewquat[0] = val[0]; - G.vd->viewquat[1] = val[1]; - G.vd->viewquat[2] = val[2]; - G.vd->viewquat[3] = val[3]; - - Py_RETURN_NONE; -} - -static PyObject *M_Window_GetViewOffset( PyObject * self ) -{ - if( !G.vd ) - Py_RETURN_NONE; - return Py_BuildValue( "[fff]", G.vd->ofs[0], G.vd->ofs[1], G.vd->ofs[2] ); -} - -static PyObject *M_Window_SetViewOffset( PyObject * self, PyObject * args ) -{ - int ok = 0; - float val[3]; - - if( !G.vd ) - Py_RETURN_NONE; - - if( PyObject_Length( args ) == 3 ) - ok = PyArg_ParseTuple( args, "fff", &val[0], &val[1], - &val[2] ); - else - ok = PyArg_ParseTuple( args, "(fff)", &val[0], &val[1], - &val[2] ); - - if( !ok ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected [f,f,f] or f,f,f as arguments" ); - - G.vd->ofs[0] = val[0]; - G.vd->ofs[1] = val[1]; - G.vd->ofs[2] = val[2]; - - Py_RETURN_NONE; -} - - -/*****************************************************************************/ -/* Function: M_Window_GetViewMatrix */ -/* Python equivalent: Blender.Window.GetViewMatrix */ -/*****************************************************************************/ -static PyObject *M_Window_GetViewMatrix( PyObject * self ) -{ - if( !G.vd ) - Py_RETURN_NONE; - - return newMatrixObject( ( float * ) G.vd->viewmat, 4, 4, Py_WRAP ); -} - -/*****************************************************************************/ -/* Function: M_Window_GetPerspMatrix */ -/* Python equivalent: Blender.Window.GetPerspMatrix */ -/*****************************************************************************/ -static PyObject *M_Window_GetPerspMatrix( PyObject * self ) -{ - if( !G.vd ) - Py_RETURN_NONE; - - return newMatrixObject( ( float * ) G.vd->persmat, 4, 4, Py_WRAP ); -} - - -/* update_armature_weakrefs() - * helper function used in M_Window_EditMode. - * rebuilds list of Armature weakrefs in __main__ - */ - -static int update_armature_weakrefs() -{ - /* stuff for armature weak refs */ - char *list_name = ARM_WEAKREF_LIST_NAME; - PyObject *maindict = NULL, *armlist = NULL; - PyObject *pyarmature = NULL; - int x; - - maindict= PyModule_GetDict(PyImport_AddModule( "__main__")); - armlist = PyDict_GetItemString(maindict, list_name); - if( !armlist){ - printf("Oops - update_armature_weakrefs()\n"); - return 0; - } - - for (x = 0; x < PySequence_Size(armlist); x++){ - pyarmature = PyWeakref_GetObject(PySequence_GetItem( armlist, x)); - if (pyarmature != Py_None) - Armature_RebuildEditbones(pyarmature); - } - return 1; -} - - -static PyObject *M_Window_EditMode( PyObject * self, PyObject * args ) -{ - short status = -1; - char *undo_str = "From script"; - int undo_str_len = 11; - int do_undo = 1; - - if( !PyArg_ParseTuple( args, - "|hs#i", &status, &undo_str, &undo_str_len, &do_undo ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected optional int (bool), string and int (bool) as arguments" ); - - if( status >= 0 ) { - if( status ) { - if( !G.obedit ){ - - //update armatures - if(! update_armature_weakrefs()){ - return EXPP_ReturnPyObjError( - PyExc_RuntimeError, - "internal error - update_armature_weakrefs"); - } - - //enter editmode - enter_editmode(0); - } - } else if( G.obedit ) { - if( undo_str_len > 63 ) - undo_str[63] = '\0'; /* 64 is max */ - BIF_undo_push( undo_str ); /* This checks user undo settings */ - exit_editmode( EM_FREEDATA ); - - //update armatures - if(! update_armature_weakrefs()){ - return EXPP_ReturnPyObjError( - PyExc_RuntimeError, - "internal error - update_armature_weakrefs"); - } - - } - } - - 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; - PyObject *list = NULL, *resl = NULL; - int val, i, bit = 0, layer = 0, len_list; - short winid = -1; - - if( !G.scene ) { - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "can't get pointer to global scene" ); - } - - /* Pase Args, Nothing, One list, Or a list and an int */ - if (PyTuple_GET_SIZE(args)!=0) { - if( !PyArg_ParseTuple ( args, "O!|h", &PyList_Type, &list, &winid) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "nothing or a list and optionaly a window ID argument" ); - } - } - - if( list ) { - len_list = PyList_Size(list); - - if (len_list == 0) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "list can't be empty, at list one layer must be set" ); - - for( i = 0; i < len_list; i++ ) { - item = PyList_GetItem( list, i ); - if( !PyInt_Check( item ) ) - return EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "list must contain only integer numbers" ); - - val = ( int ) PyInt_AsLong( item ); - if( val < 1 || val > 20 ) - return EXPP_ReturnPyObjError - ( PyExc_AttributeError, - "layer values must be in the range [1, 20]" ); - - layer |= 1 << ( val - 1 ); - } - - if (winid==-1) { - /* set scene and viewport */ - G.scene->lay = layer; - if (G.vd) { - G.vd->lay = layer; - - while( bit < 20 ) { - val = 1 << bit; - if( layer & val ) { - G.vd->layact = val; - break; - } - bit++; - } - } - } else { - /* only set the windows layer */ - ScrArea *sa; - SpaceLink *sl; - View3D *vd; - - if (G.curscreen) { /* can never be too careful */ - for (sa=G.curscreen->areabase.first; sa; sa= sa->next) { - if (winid == sa->win) { - - for (sl= sa->spacedata.first; sl; sl= sl->next) - if(sl->spacetype==SPACE_VIEW3D) - break; - - if (!sl) - return EXPP_ReturnPyObjError( PyExc_ValueError, - "The window matching the winid has no 3d viewport" ); - - vd= (View3D *) sl; - vd->lay = layer; - - for(bit= 0; bit < 20; bit++) { - val = 1 << bit; - if( layer & val ) { - vd->layact = val; - break; - } - } - - winid = -1; /* so we know its done */ - break; - } - } - if (winid!=-1) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "The winid argument did not match any window" ); - } - } - } - - resl = PyList_New( 0 ); - if( !resl ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create pylist!" ) ); - - layer = G.scene->lay; - - bit = 0; - while( bit < 20 ) { - val = 1 << bit; - if( layer & val ) { - item = Py_BuildValue( "i", bit + 1 ); - PyList_Append( resl, item ); - Py_DECREF( item ); - } - bit++; - } - - return resl; -} - -static PyObject *M_Window_CameraView( PyObject * self, PyObject * args ) -{ - short camtov3d = 0; - - if( !PyArg_ParseTuple( args, "|i", &camtov3d ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an int (from Window.Views) as argument" ); - - if( !G.vd ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "this function can only be used after a 3d View has been initialized" ); - - if( !G.vd->camera ) { - if( BASACT && OBACT->type == OB_CAMERA ) - G.vd->camera = OBACT; - else - G.vd->camera = scene_find_camera( G.scene ); - handle_view3d_lock( ); - } - - G.vd->persp = 2; - G.vd->view = 0; - - if( camtov3d ) - setcameratoview3d( ); - - Py_RETURN_NONE; -} - -static PyObject *M_Window_QTest( PyObject * self ) -{ - return Py_BuildValue( "h", qtest( ) ); -} - -static PyObject *M_Window_QRead( PyObject * self ) -{ - short val = 0; - unsigned short event; - - if (G.background) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "QRead is not available in background mode"); - - event = extern_qread( &val ); - - return Py_BuildValue( "ii", event, val ); -} - -static PyObject *M_Window_QAdd( PyObject * self, PyObject * args ) -{ - short win; - short evt; /* unsigned, we check below */ - short val; - short after = 0; - - if (G.background) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "QAdd is not available in background mode"); - - if( !PyArg_ParseTuple( args, "hhh|h", &win, &evt, &val, &after ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected three or four ints as arguments" ); - - if( evt < 0 ) /* evt is unsigned short */ - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "event value must be a positive int, check events in Blender.Draw" ); - - if( after ) - addafterqueue( win, evt, val ); - else - addqueue( win, evt, val ); - - Py_RETURN_NONE; -} - -static PyObject *M_Window_QHandle( PyObject * self, PyObject * args ) -{ - short win; - ScrArea *sa; - ScrArea *oldsa = NULL; - - if (G.background) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "QHandle is not available in background mode"); - - if (!G.curscreen) - return EXPP_ReturnPyObjError(PyExc_RuntimeError, - "No screens available"); - - if( !PyArg_ParseTuple( args, "h", &win ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected an int as argument" ); - - for (sa= G.curscreen->areabase.first; sa; sa= sa->next) - if( sa->win == win ) - break; - - if( sa ) { - BWinEvent evt; - short do_redraw = 0, do_change = 0; - - if( sa != curarea || sa->win != mywinget( ) ) { - oldsa = curarea; - areawinset( sa->win ); - set_g_activearea( sa ); - } - while( bwin_qread( sa->win, &evt ) ) { - if( evt.event == REDRAW ) { - do_redraw = 1; - } else if( evt.event == CHANGED ) { - sa->win_swap = 0; - do_change = 1; - do_redraw = 1; - } else { - scrarea_do_winhandle( sa, &evt ); - } - } - } - - if( oldsa ) { - areawinset( oldsa->win ); - set_g_activearea( oldsa ); - } - - Py_RETURN_NONE; -} - -static PyObject *M_Window_GetMouseCoords( PyObject * self ) -{ - short mval[2]; - - getmouse( mval ); - - return Py_BuildValue( "hh", mval[0], mval[1] ); -} - -static PyObject *M_Window_SetMouseCoords( PyObject * self, PyObject * args ) -{ - int ok, x, y; - - if( !G.curscreen ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "no current screen to retrieve info from!" ); - - x = G.curscreen->sizex / 2; - y = G.curscreen->sizey / 2; - - if( PyObject_Length( args ) == 2 ) - ok = PyArg_ParseTuple( args, "hh", &x, &y ); - else - ok = PyArg_ParseTuple( args, "|(hh)", &x, &y ); - - if( !ok ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected [i, i] or i,i as arguments (or nothing)." ); - - warp_pointer( x, y ); - - Py_RETURN_NONE; -} - -static PyObject *M_Window_GetMouseButtons( PyObject * self ) -{ - short mbut = get_mbut( ); - - return Py_BuildValue( "h", mbut ); -} - -static PyObject *M_Window_GetKeyQualifiers( PyObject * self ) -{ - short qual = get_qual( ); - - return Py_BuildValue( "h", qual ); -} - -static PyObject *M_Window_SetKeyQualifiers( PyObject * self, PyObject * args ) -{ - short qual = 0; - - if( !PyArg_ParseTuple( args, "|h", &qual ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int (or'ed flags) as argument" ); - - if( qual < 0 ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "value must be a positive int, check Blender.Window.Qual" ); - - G.qual = qual; - - return Py_BuildValue( "h", qual ); -} - -static PyObject *M_Window_GetAreaSize( PyObject * self ) -{ - ScrArea *sa = curarea; - - if( !sa ) - Py_RETURN_NONE; - - return Py_BuildValue( "hh", sa->winx, sa->winy ); -} - -static PyObject *M_Window_GetAreaID( PyObject * self ) -{ - ScrArea *sa = curarea; - - if( !sa ) - Py_RETURN_NONE; - - return Py_BuildValue( "h", sa->win ); -} - -static PyObject *M_Window_GetScreenSize( PyObject * self ) -{ - bScreen *scr = G.curscreen; - - if( !scr ) - Py_RETURN_NONE; - - return Py_BuildValue( "hh", scr->sizex, scr->sizey ); -} - - -static PyObject *M_Window_SetScreen( PyObject * self, PyObject * value ) -{ - bScreen *scr = G.main->screen.first; - char *name = PyString_AsString(value); - - if( !name ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string as argument" ); - - while( scr ) { - if( !strcmp( scr->id.name + 2, name ) ) { - setscreen( scr ); - break; - } - scr = scr->id.next; - } - - if( !scr ) - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no such screen, check Window.GetScreens() for valid names" ); - - Py_RETURN_NONE; -} - -static PyObject *M_Window_GetScreens( PyObject * self ) -{ - bScreen *scr = G.main->screen.first; - PyObject *list = PyList_New( 0 ); - PyObject *str = NULL; - - if( !list ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create py list!" ); - - while( scr ) { - str = PyString_FromString( scr->id.name + 2 ); - - if( !str ) { - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create py string!" ); - } - - PyList_Append( list, str ); /* incref's str */ - Py_DECREF( str ); - - scr = scr->id.next; - } - - return list; -} - -static PyObject *M_Window_GetScreenInfo( PyObject * self, PyObject * args, - PyObject * kwords ) -{ - ScrArea *sa = G.curscreen->areabase.first; - bScreen *scr = G.main->screen.first; - PyObject *item, *list; - rcti *rct; - int type = -1; - char *rect = "win"; - char *screen = ""; - static char *kwlist[] = { "type", "rect", "screen", NULL }; - int rctype = 0; - - if( !PyArg_ParseTupleAndKeywords( args, kwords, "|iss", kwlist, &type, - &rect, &screen ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected nothing or an int and two strings as arguments" ); - - if( !strcmp( rect, "win" ) ) - rctype = 0; - else if( !strcmp( rect, "total" ) ) - rctype = 1; - else if( !strcmp( rect, "header" ) ) - rctype = 2; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "requested invalid type for area rectangle coordinates." ); - - list = PyList_New( 0 ); - - if( screen && screen[0] != '\0' ) { - while( scr ) { - if( !strcmp( scr->id.name + 2, screen ) ) { - sa = scr->areabase.first; - break; - } - scr = scr->id.next; - } - } - - if( !scr ) { - Py_DECREF( list ); - return EXPP_ReturnPyObjError( PyExc_AttributeError, - "no such screen, see existing ones with Window.GetScreens." ); - } - - while( sa ) { - if( type != -1 && sa->spacetype != type ) { - sa = sa->next; - continue; - } - - switch ( rctype ) { - case 0: - rct = &sa->winrct; - break; - case 1: - rct = &sa->totrct; - break; - case 2: - default: - rct = &sa->headrct; - } - - item = Py_BuildValue( "{s:[h,h,h,h],s:h,s:h}", - "vertices", rct->xmin, rct->ymin, - rct->xmax, rct->ymax, "type", - ( short ) sa->spacetype, "id", - ( short ) sa->win ); - PyList_Append( list, item ); - Py_DECREF( item ); - - sa = sa->next; - } - - 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, *PivotTypes, *dict; - - submodule = - Py_InitModule3( "Blender.Window", M_Window_methods, - M_Window_doc ); - - dict = PyModule_GetDict( submodule ); - if( dict ) - PyDict_SetItemString( dict, "Theme", Theme_Init( ) ); - - Types = PyConstant_New( ); - Qual = PyConstant_New( ); - MButs = PyConstant_New( ); - PivotTypes = PyConstant_New( ); - - if( Types ) { - BPy_constant *d = ( BPy_constant * ) Types; - - PyConstant_Insert( d, "VIEW3D", PyInt_FromLong( SPACE_VIEW3D ) ); - PyConstant_Insert( d, "IPO", PyInt_FromLong( SPACE_IPO ) ); - PyConstant_Insert( d, "OOPS", PyInt_FromLong( SPACE_OOPS ) ); - PyConstant_Insert( d, "BUTS", PyInt_FromLong( SPACE_BUTS ) ); - PyConstant_Insert( d, "FILE", PyInt_FromLong( SPACE_FILE ) ); - PyConstant_Insert( d, "IMAGE", PyInt_FromLong( SPACE_IMAGE ) ); - PyConstant_Insert( d, "INFO", PyInt_FromLong( SPACE_INFO ) ); - PyConstant_Insert( d, "SEQ", PyInt_FromLong( SPACE_SEQ ) ); - PyConstant_Insert( d, "IMASEL", PyInt_FromLong( SPACE_IMASEL ) ); - PyConstant_Insert( d, "SOUND", PyInt_FromLong( SPACE_SOUND ) ); - PyConstant_Insert( d, "ACTION", PyInt_FromLong( SPACE_ACTION ) ); - PyConstant_Insert( d, "TEXT", PyInt_FromLong( SPACE_TEXT ) ); - PyConstant_Insert( d, "NLA", PyInt_FromLong( SPACE_NLA ) ); - PyConstant_Insert( d, "SCRIPT", PyInt_FromLong( SPACE_SCRIPT ) ); - PyConstant_Insert( d, "TIME", PyInt_FromLong( SPACE_TIME ) ); - PyConstant_Insert( d, "NODE", PyInt_FromLong( SPACE_NODE ) ); - - PyModule_AddObject( submodule, "Types", Types ); - } - - if( Qual ) { - BPy_constant *d = ( BPy_constant * ) Qual; - - PyConstant_Insert( d, "LALT", PyInt_FromLong( L_ALTKEY ) ); - PyConstant_Insert( d, "RALT", PyInt_FromLong( R_ALTKEY ) ); - PyConstant_Insert( d, "ALT", PyInt_FromLong( LR_ALTKEY ) ); - PyConstant_Insert( d, "LCTRL", PyInt_FromLong( L_CTRLKEY ) ); - PyConstant_Insert( d, "RCTRL", PyInt_FromLong( R_CTRLKEY ) ); - PyConstant_Insert( d, "CTRL", PyInt_FromLong( LR_CTRLKEY ) ); - PyConstant_Insert( d, "LSHIFT", PyInt_FromLong( L_SHIFTKEY ) ); - PyConstant_Insert( d, "RSHIFT", PyInt_FromLong( R_SHIFTKEY ) ); - PyConstant_Insert( d, "SHIFT", PyInt_FromLong( LR_SHIFTKEY ) ); - - PyModule_AddObject( submodule, "Qual", Qual ); - } - - if( MButs ) { - BPy_constant *d = ( BPy_constant * ) MButs; - - PyConstant_Insert( d, "L", PyInt_FromLong( L_MOUSE ) ); - PyConstant_Insert( d, "M", PyInt_FromLong( M_MOUSE ) ); - PyConstant_Insert( d, "R", PyInt_FromLong( R_MOUSE ) ); - - 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/Window.h b/source/blender/python/api2_2x/Window.h deleted file mode 100644 index a39856ecd58..00000000000 --- a/source/blender/python/api2_2x/Window.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * $Id:* - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* This file is useless now, CAN BE REMOVED. */ - -#ifndef EXPP_WINDOW_H -#define EXPP_WINDOW_H - -#include - -PyObject *Window_Init( void ); -PyObject *M_Window_Redraw( PyObject * self, PyObject * args ); - -#endif /* EXPP_WINDOW_H */ diff --git a/source/blender/python/api2_2x/World.c b/source/blender/python/api2_2x/World.c deleted file mode 100644 index a6fac327360..00000000000 --- a/source/blender/python/api2_2x/World.c +++ /dev/null @@ -1,1034 +0,0 @@ -/* - * $Id: World.c 12078 2007-09-18 06:41:29Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot, Johnny Matthews - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/** - * \file World.c - * \ingroup scripts - * \brief Blender.World Module and World Data PyObject implementation. - * - * Note: Parameters between "<" and ">" are optional. But if one of them is - * given, all preceding ones must be given, too. Of course, this only relates - * to the Python functions and methods described here and only inside Python - * code. [ This will go to another file later, probably the main exppython - * doc file]. XXX Better: put optional args with their default value: - * (self, name = "MyName") - */ - -#include "World.h" /*This must come first*/ - -#include "DNA_scene_types.h" /* for G.scene */ -#include "BKE_global.h" -#include "BKE_world.h" -#include "BKE_main.h" -#include "BKE_library.h" -#include "BLI_blenlib.h" -#include "BSE_editipo.h" -#include "BIF_space.h" -#include "mydevice.h" -#include "Ipo.h" -#include "gen_utils.h" -#include "gen_library.h" - -#define IPOKEY_ZENITH 0 -#define IPOKEY_HORIZON 1 -#define IPOKEY_MIST 2 -#define IPOKEY_STARS 3 -#define IPOKEY_OFFSET 4 -#define IPOKEY_SIZE 5 -/*****************************************************************************/ -/* Python BPy_World methods declarations: */ -/*****************************************************************************/ -static PyObject *World_getRange( BPy_World * self ); -static PyObject *World_setRange( BPy_World * self, PyObject * args ); -static PyObject *World_getIpo( BPy_World * self ); -static PyObject *World_oldsetIpo( BPy_World * self, PyObject * args ); -static int World_setIpo( BPy_World * self, PyObject * args ); -static PyObject *World_clearIpo( BPy_World * self ); -static PyObject *World_insertIpoKey( BPy_World * self, PyObject * args ); -static PyObject *World_getMode( BPy_World * self ); -static PyObject *World_oldsetMode( BPy_World * self, PyObject * args ); -static int World_setMode( BPy_World * self, PyObject * args ); -static PyObject *World_getSkytype( BPy_World * self ); -static PyObject *World_oldsetSkytype( BPy_World * self, PyObject * args ); -static int World_setSkytype( BPy_World * self, PyObject * args ); -static PyObject *World_getMistype( BPy_World * self ); -static PyObject *World_oldsetMistype( BPy_World * self, PyObject * args ); -static int World_setMistype( BPy_World * self, PyObject * args ); -static PyObject *World_getHor( BPy_World * self ); -static PyObject *World_oldsetHor( BPy_World * self, PyObject * args ); -static int World_setHor( BPy_World * self, PyObject * args ); -static PyObject *World_getZen( BPy_World * self ); -static PyObject *World_oldsetZen( BPy_World * self, PyObject * args ); -static int World_setZen( BPy_World * self, PyObject * args ); -static PyObject *World_getAmb( BPy_World * self ); -static PyObject *World_oldsetAmb( BPy_World * self, PyObject * args ); -static int World_setAmb( BPy_World * self, PyObject * args ); -static PyObject *World_getStar( BPy_World * self ); -static PyObject *World_oldsetStar( BPy_World * self, PyObject * args ); -static int World_setStar( BPy_World * self, PyObject * args ); -static PyObject *World_getMist( BPy_World * self ); -static PyObject *World_oldsetMist( BPy_World * self, PyObject * args ); -static int World_setMist( BPy_World * self, PyObject * args ); -static PyObject *World_getScriptLinks( BPy_World * self, PyObject * value ); -static PyObject *World_addScriptLink( BPy_World * self, PyObject * args ); -static PyObject *World_clearScriptLinks( BPy_World * self, PyObject * args ); -static PyObject *World_setCurrent( BPy_World * self ); -static PyObject *World_copy( BPy_World * self ); - - -/*****************************************************************************/ -/* Python API function prototypes for the World module. */ -/*****************************************************************************/ -static PyObject *M_World_New( PyObject * self, PyObject * args, - PyObject * keywords ); -static PyObject *M_World_Get( PyObject * self, PyObject * args ); -static PyObject *M_World_GetCurrent( PyObject * self ); - - -/*****************************************************************************/ -/* Python World_Type callback function prototypes: */ -/*****************************************************************************/ -//static int World_Print (BPy_World *self, FILE *fp, int flags); -static int World_Compare( BPy_World * a, BPy_World * b ); -static PyObject *World_Repr( BPy_World * self ); - - - -/*****************************************************************************/ -/* The following string definitions are used for documentation strings. */ -/* In Python these will be written to the console when doing a */ -/* Blender.World.__doc__ */ -/*****************************************************************************/ -static char M_World_doc[] = "The Blender World module\n\n\ -This module provides access to **World Data** objects in Blender\n\n"; - -static char M_World_New_doc[] = "() - return a new World object"; - -static char M_World_Get_doc[] = - "(name) - return the world with the name 'name', \ -returns None if not found.\n If 'name' is not specified, \ -it returns a list of all worlds in the\ncurrent scene."; -static char M_World_GetCurrent_doc[] = "() - returns the current world, or \ -None if the Scene has no world"; - - - -/*****************************************************************************/ -/* Python method structure definition for Blender.World module: */ -/*****************************************************************************/ -struct PyMethodDef M_World_methods[] = { - {"New", ( PyCFunction ) M_World_New, METH_VARARGS | METH_KEYWORDS, - M_World_New_doc}, - {"Get", M_World_Get, METH_VARARGS, M_World_Get_doc}, - {"GetActive", ( PyCFunction ) M_World_GetCurrent, METH_NOARGS, - M_World_GetCurrent_doc}, - {"GetCurrent", ( PyCFunction ) M_World_GetCurrent, METH_NOARGS, - M_World_GetCurrent_doc}, - {"get", M_World_Get, METH_VARARGS, M_World_Get_doc}, - {NULL, NULL, 0, NULL} -}; - - - -/*****************************************************************************/ -/* Python BPy_World methods table: */ -/*****************************************************************************/ -static PyMethodDef BPy_World_methods[] = { - {"getRange", ( PyCFunction ) World_getRange, METH_NOARGS, - "() - Return World Range"}, - {"setRange", ( PyCFunction ) World_setRange, METH_VARARGS, - "() - Change this World's range"}, - {"getIpo", ( PyCFunction ) World_getIpo, METH_NOARGS, - "() - Return World Ipo"}, - {"setIpo", ( PyCFunction ) World_oldsetIpo, METH_VARARGS, - "() - Change this World's ipo"}, - {"clearIpo", ( PyCFunction ) World_clearIpo, METH_VARARGS, - "() - Unlink Ipo from this World"}, - {"getName", ( PyCFunction ) GenericLib_getName, METH_NOARGS, - "() - Return World Data name"}, - {"setName", ( PyCFunction ) GenericLib_setName_with_method, METH_VARARGS, - "() - Set World Data name"}, - {"getMode", ( PyCFunction ) World_getMode, METH_NOARGS, - "() - Return World Data mode"}, - {"setMode", ( PyCFunction ) World_oldsetMode, METH_VARARGS, - "(i) - Set World Data mode"}, - {"getSkytype", ( PyCFunction ) World_getSkytype, METH_NOARGS, - "() - Return World Data skytype"}, - {"setSkytype", ( PyCFunction ) World_oldsetSkytype, METH_VARARGS, - "() - Return World Data skytype"}, - {"getMistype", ( PyCFunction ) World_getMistype, METH_NOARGS, - "() - Return World Data mistype"}, - {"setMistype", ( PyCFunction ) World_oldsetMistype, METH_VARARGS, - "() - Return World Data mistype"}, - {"getHor", ( PyCFunction ) World_getHor, METH_NOARGS, - "() - Return World Data hor"}, - {"setHor", ( PyCFunction ) World_oldsetHor, METH_VARARGS, - "() - Return World Data hor"}, - {"getZen", ( PyCFunction ) World_getZen, METH_NOARGS, - "() - Return World Data zen"}, - {"setZen", ( PyCFunction ) World_oldsetZen, METH_VARARGS, - "() - Return World Data zen"}, - {"getAmb", ( PyCFunction ) World_getAmb, METH_NOARGS, - "() - Return World Data amb"}, - {"setAmb", ( PyCFunction ) World_oldsetAmb, METH_VARARGS, - "() - Return World Data amb"}, - {"getStar", ( PyCFunction ) World_getStar, METH_NOARGS, - "() - Return World Data star"}, - {"setStar", ( PyCFunction ) World_oldsetStar, METH_VARARGS, - "() - Return World Data star"}, - {"getMist", ( PyCFunction ) World_getMist, METH_NOARGS, - "() - Return World Data mist"}, - {"setMist", ( PyCFunction ) World_oldsetMist, METH_VARARGS, - "() - Return World Data mist"}, - {"getScriptLinks", ( PyCFunction ) World_getScriptLinks, METH_O, - "(eventname) - Get a list of this world's scriptlinks (Text names) " - "of the given type\n" - "(eventname) - string: FrameChanged, Redraw or Render."}, - {"addScriptLink", ( PyCFunction ) World_addScriptLink, METH_VARARGS, - "(text, evt) - Add a new world scriptlink.\n" - "(text) - string: an existing Blender Text name;\n" - "(evt) string: FrameChanged, Redraw or Render."}, - {"clearScriptLinks", ( PyCFunction ) World_clearScriptLinks, - METH_VARARGS, - "() - Delete all scriptlinks from this world.\n" - "([s1<,s2,s3...>]) - Delete specified scriptlinks from this world."}, - {"setCurrent", ( PyCFunction ) World_setCurrent, METH_NOARGS, - "() - Makes this world the active world for the current scene."}, - {"makeActive", ( PyCFunction ) World_setCurrent, METH_NOARGS, - "please use setCurrent instead, this alias will be removed."}, - {"insertIpoKey", ( PyCFunction ) World_insertIpoKey, METH_VARARGS, - "( World IPO type ) - Inserts a key into the IPO"}, - {"__copy__", ( PyCFunction ) World_copy, METH_NOARGS, - "() - Makes a copy of this world."}, - {"copy", ( PyCFunction ) World_copy, METH_NOARGS, - "() - Makes a copy of this world."}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python attributes get/set structure: */ -/*****************************************************************************/ -static PyGetSetDef BPy_World_getseters[] = { - GENERIC_LIB_GETSETATTR, - {"skytype", (getter)World_getSkytype, (setter)World_setSkytype, - "sky settings as a list", NULL}, - {"mode", (getter)World_getMode, (setter)World_setMode, - "world mode", NULL}, - {"mistype", (getter)World_getMistype, (setter)World_setMistype, - "world mist type", NULL}, - {"hor", (getter)World_getHor, (setter)World_setHor, - "world horizon color", NULL}, - {"amb", (getter)World_getAmb, (setter)World_setAmb, - "world ambient color", NULL}, - {"mist", (getter)World_getMist, (setter)World_setMist, - "world mist settings", NULL}, - {"ipo", (getter)World_getIpo, (setter)World_setIpo, - "world ipo", NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python World_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject World_Type = { - PyObject_HEAD_INIT( NULL ) - 0, /* ob_size */ - "World", /* tp_name */ - sizeof( BPy_World ), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - NULL, /* tp_dealloc */ - 0, /* tp_print */ - NULL, /* tp_getattr */ - NULL, /* tp_setattr */ - ( cmpfunc ) World_Compare, /* tp_compare */ - ( reprfunc ) World_Repr, /* 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) */ - - ( hashfunc ) GenericLib_hash, /* 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 ***/ - BPy_World_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_World_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 -}; - -/** - * \defgroup World_Module Blender.World module functions - * - */ - -/*@{*/ - -/** - * \brief Python module function: Blender.World.New() - * - * This is the .New() function of the Blender.World submodule. It creates - * new World Data in Blender and returns its Python wrapper object. The - * name parameter is mandatory. - * \param - string: The World Data name. - * \return A new World PyObject. - */ - -static PyObject *M_World_New( PyObject * self, PyObject * args, - PyObject * kwords ) -{ - char *name = NULL; - BPy_World *pyworld; - World *blworld; - - if( !PyArg_ParseTuple( args, "s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument" ) ); - - - blworld = add_world( name ); - - if( blworld ) { - /* return user count to zero because add_world() inc'd it */ - blworld->id.us = 0; - /* create python wrapper obj */ - pyworld = - ( BPy_World * ) PyObject_NEW( BPy_World, &World_Type ); - } else - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create World Data in Blender" ) ); - - if( pyworld == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create World Data object" ) ); - - pyworld->world = blworld; - - return ( PyObject * ) pyworld; -} - -/** - * \brief Python module function: Blender.World.Get() - * - * This is the .Get() function of the Blender.World submodule. It searches - * the list of current World Data objects and returns a Python wrapper for - * the one with the name provided by the user. If called with no arguments, - * it returns a list of all current World Data object names in Blender. - * \param - string: The name of an existing Blender World Data object. - * \return () - A list with the names of all current World Data objects;\n - * \return (name) - A Python wrapper for the World Data called 'name' - * in Blender. - */ - -static PyObject *M_World_Get( PyObject * self, PyObject * args ) -{ - - char *name = NULL; - World *world_iter; - PyObject *worldlist; - char error_msg[64]; - - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return ( EXPP_ReturnPyObjError( PyExc_TypeError, - "expected string argument (or nothing)" ) ); - - if( name ) { /* (name) - Search world by name */ - world_iter = ( World * ) GetIdFromList( &( G.main->world ), name ); - - if( world_iter == NULL ) { /* Requested world doesn't exist */ - PyOS_snprintf( error_msg, sizeof( error_msg ), - "World \"%s\" not found", name ); - return ( EXPP_ReturnPyObjError - ( PyExc_NameError, error_msg ) ); - } - - return ( PyObject * ) World_CreatePyObject(world_iter); - } - - else { /* return a list of all worlds in the scene */ - world_iter = G.main->world.first; - worldlist = PyList_New( 0 ); - if( worldlist == NULL ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ) ); - - while( world_iter ) { - BPy_World *found_world = - ( BPy_World * ) PyObject_NEW( BPy_World, - &World_Type ); - found_world->world = world_iter; - PyList_Append( worldlist, ( PyObject * ) found_world ); - Py_DECREF(found_world); - - world_iter = world_iter->id.next; - } - return ( worldlist ); - } - -} - -static PyObject *M_World_GetCurrent( PyObject * self ) -{ - BPy_World *w = NULL; -#if 0 /* add back in when bpy becomes "official" */ - static char warning = 1; - if( warning ) { - printf("Blender.World.GetCurrent() deprecated!\n\tuse bpy.scenes.world instead\n"); - --warning; - } -#endif - - if( !G.scene->world ) - Py_RETURN_NONE; - - w = ( BPy_World * ) PyObject_NEW( BPy_World, &World_Type ); - w->world = G.scene->world; - return ( PyObject * ) w; -} - -/*@}*/ - -/** - * \brief Initializes the Blender.World submodule - * - * This function is used by Blender_Init() in Blender.c to register the - * Blender.World submodule in the main Blender module. - * \return PyObject*: The initialized submodule. - */ - -PyObject *World_Init( void ) -{ - PyObject *submodule; - - if( PyType_Ready( &World_Type ) < 0 ) - return NULL; - - submodule = Py_InitModule3( "Blender.World", - M_World_methods, M_World_doc ); - - PyModule_AddIntConstant( submodule, "ZENITH", IPOKEY_ZENITH ); - PyModule_AddIntConstant( submodule, "HORIZON", IPOKEY_HORIZON ); - PyModule_AddIntConstant( submodule, "MIST", IPOKEY_MIST ); - PyModule_AddIntConstant( submodule, "STARS", IPOKEY_STARS ); - PyModule_AddIntConstant( submodule, "OFFSET", IPOKEY_OFFSET ); - PyModule_AddIntConstant( submodule, "SIZE", IPOKEY_SIZE ); - - return ( submodule ); -} - -/*****************************************************************************/ -/* Python BPy_World methods: */ -/*****************************************************************************/ -static PyObject *World_getRange( BPy_World * self ) -{ - return PyFloat_FromDouble( self->world->range ); -} - -static PyObject *World_setRange( BPy_World * self, PyObject * args ) -{ - float range = 0.f; - if( !PyArg_ParseTuple( args, "f", &range ) ) - return ( EXPP_ReturnPyObjError - ( PyExc_TypeError, "expected a float argument" ) ); - self->world->range = range; - Py_RETURN_NONE; -} - - -static PyObject *World_getIpo( BPy_World * self ) -{ - struct Ipo *ipo = self->world->ipo; - - if( !ipo ) - Py_RETURN_NONE; - - return Ipo_CreatePyObject( ipo ); -} - -static int World_setIpo( BPy_World * self, PyObject * value ) -{ - return GenericLib_assignData(value, (void **) &self->world->ipo, 0, 1, ID_IP, ID_WO); -} - -static PyObject *World_oldsetIpo( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setIpo ); -} - -static PyObject *World_clearIpo( BPy_World * self ) -{ - World *world = self->world; - Ipo *ipo = ( Ipo * ) world->ipo; - - if( ipo ) { - ID *id = &ipo->id; - if( id->us > 0 ) - id->us--; - world->ipo = NULL; - - return EXPP_incr_ret_True(); - } - - return EXPP_incr_ret_False(); /* no ipo found */ -} - -/** - * \brief World PyMethod getSkytype - * - * \return int : The World Data skytype. - */ - -static PyObject *World_getSkytype( BPy_World * self ) -{ - return PyInt_FromLong( ( long ) self->world->skytype ); -} - - -/** - * \brief World PyMethod setSkytype - * - * \return int : The World Data skytype. - */ - -static int World_setSkytype( BPy_World * self, PyObject * value ) -{ - if( !PyInt_Check(value) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ) ); - self->world->skytype = (short)PyInt_AsLong(value); - return 0; -} - -static PyObject *World_oldsetSkytype( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setSkytype ); -} - - -/** - * \brief World PyMethod getMode - * - * \return int : The World Data mode. - */ - -static PyObject *World_getMode( BPy_World * self ) -{ - return PyInt_FromLong( ( long ) self->world->mode ); -} - - -/** - * \brief World PyMethod setMode - * - * \return int : The World Data mode. - */ - -static int World_setMode( BPy_World * self, PyObject * value ) -{ - if( !PyInt_Check(value) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ) ); - self->world->mode = (short)PyInt_AsLong(value); - return 0; -} - -static PyObject *World_oldsetMode( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setMode ); -} - - - -/** - * \brief World PyMethod getMistype - * - * \return int : The World Data mistype. - */ - -static PyObject *World_getMistype( BPy_World * self ) -{ - return PyInt_FromLong( ( long ) self->world->mistype ); -} - - -/** - * \brief World PyMethod setMistype - * - * \return int : The World Data mistype. - */ - -static int World_setMistype( BPy_World * self, PyObject * value ) -{ - if( !PyInt_Check(value) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected int argument" ) ); - self->world->mistype = (short)PyInt_AsLong(value); - return 0; -} - -static PyObject *World_oldsetMistype( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setMistype ); -} - - - -static PyObject *World_getHor( BPy_World * self ) -{ - PyObject *attr = PyList_New( 3 ); - if( !attr ) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create list" ) ); - PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->horr ) ); - PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->horg ) ); - PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->horb ) ); - return attr; -} - - -static int World_setHor( BPy_World * self, PyObject * value ) -{ - if( !PyList_Check( value ) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected list argument" ) ); - if( PyList_Size( value ) != 3 ) - return ( EXPP_ReturnIntError - ( PyExc_TypeError, "list size must be 3" ) ); - self->world->horr = (float)PyFloat_AsDouble( PyList_GetItem( value, 0 ) ); - self->world->horg = (float)PyFloat_AsDouble( PyList_GetItem( value, 1 ) ); - self->world->horb = (float)PyFloat_AsDouble( PyList_GetItem( value, 2 ) ); - return 0; -} - -static PyObject *World_oldsetHor( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setHor ); -} - -static PyObject *World_getZen( BPy_World * self ) -{ - PyObject *attr = PyList_New( 3 ); - if( !attr ) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create list" ) ); - PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->zenr ) ); - PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->zeng ) ); - PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->zenb ) ); - return attr; -} - - -static int World_setZen( BPy_World * self, PyObject * value ) -{ - if( !PyList_Check( value ) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected list argument" ) ); - if( PyList_Size( value ) != 3 ) - return ( EXPP_ReturnIntError - ( PyExc_TypeError, "list size must be 3" ) ); - self->world->zenr = (float)PyFloat_AsDouble( PyList_GetItem( value, 0 ) ); - self->world->zeng = (float)PyFloat_AsDouble( PyList_GetItem( value, 1 ) ); - self->world->zenb = (float)PyFloat_AsDouble( PyList_GetItem( value, 2 ) ); - return 0; -} - -static PyObject *World_oldsetZen( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setZen ); -} - - -static PyObject *World_getAmb( BPy_World * self ) -{ - PyObject *attr = PyList_New( 3 ); - if( !attr ) - return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, - "couldn't create list" ) ); - PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->ambr ) ); - PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->ambg ) ); - PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->ambb ) ); - return attr; -} - - -static int World_setAmb( BPy_World * self, PyObject * value ) -{ - if( !PyList_Check( value ) ) - return ( EXPP_ReturnIntError( PyExc_TypeError, - "expected list argument" ) ); - if( PyList_Size( value ) != 3 ) - return ( EXPP_ReturnIntError - ( PyExc_TypeError, "wrong list size" ) ); - self->world->ambr = (float)PyFloat_AsDouble( PyList_GetItem( value, 0 ) ); - self->world->ambg = (float)PyFloat_AsDouble( PyList_GetItem( value, 1 ) ); - self->world->ambb = (float)PyFloat_AsDouble( PyList_GetItem( value, 2 ) ); - return 0; -} - -static PyObject *World_oldsetAmb( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setAmb ); -} - -static PyObject *World_getStar( BPy_World * self ) -{ - PyObject *attr = PyList_New( 7 ); - if( !attr ) - return ( EXPP_ReturnPyObjError - ( PyExc_RuntimeError, "couldn't create list" ) ); - PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->starr ) ); - PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->starg ) ); - PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->starb ) ); - PyList_SET_ITEM( attr, 3, PyFloat_FromDouble( self->world->starsize ) ); - PyList_SET_ITEM( attr, 4, PyFloat_FromDouble( self->world->starmindist ) ); - PyList_SET_ITEM( attr, 5, PyFloat_FromDouble( self->world->stardist ) ); - PyList_SET_ITEM( attr, 6, PyFloat_FromDouble( self->world->starcolnoise ) ); - return attr; -} - - -static int World_setStar( BPy_World * self, PyObject * value ) -{ - if( !PyList_Check( value ) ) - return ( EXPP_ReturnIntError - ( PyExc_TypeError, "expected list argument" ) ); - if( PyList_Size( value ) != 7 ) - return ( EXPP_ReturnIntError - ( PyExc_TypeError, "wrong list size" ) ); - self->world->starr = (float)PyFloat_AsDouble( PyList_GetItem( value, 0 ) ); - self->world->starg = (float)PyFloat_AsDouble( PyList_GetItem( value, 1 ) ); - self->world->starb = (float)PyFloat_AsDouble( PyList_GetItem( value, 2 ) ); - self->world->starsize = - (float)PyFloat_AsDouble( PyList_GetItem( value, 3 ) ); - self->world->starmindist = - (float)PyFloat_AsDouble( PyList_GetItem( value, 4 ) ); - self->world->stardist = - (float)PyFloat_AsDouble( PyList_GetItem( value, 5 ) ); - self->world->starcolnoise = - (float)PyFloat_AsDouble( PyList_GetItem( value, 6 ) ); - return 0; -} - -static PyObject *World_oldsetStar( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setStar ); -} - - -static PyObject *World_getMist( BPy_World * self ) -{ - PyObject *attr = PyList_New( 4 ); - if( !attr ) - return ( EXPP_ReturnPyObjError - ( PyExc_RuntimeError, "couldn't create list" ) ); - PyList_SET_ITEM( attr, 0, PyFloat_FromDouble( self->world->misi ) ); - PyList_SET_ITEM( attr, 1, PyFloat_FromDouble( self->world->miststa ) ); - PyList_SET_ITEM( attr, 2, PyFloat_FromDouble( self->world->mistdist ) ); - PyList_SET_ITEM( attr, 3, PyFloat_FromDouble( self->world->misthi ) ); - return attr; -} - -static int World_setMist( BPy_World * self, PyObject * value ) -{ - if( !PyList_Check( value ) ) - return ( EXPP_ReturnIntError - ( PyExc_TypeError, "expected list argument" ) ); - if( PyList_Size( value ) != 4 ) - return ( EXPP_ReturnIntError - ( PyExc_TypeError, "wrong list size" ) ); - self->world->misi = (float)PyFloat_AsDouble( PyList_GetItem( value, 0 ) ); - self->world->miststa = - (float)PyFloat_AsDouble( PyList_GetItem( value, 1 ) ); - self->world->mistdist = - (float)PyFloat_AsDouble( PyList_GetItem( value, 2 ) ); - self->world->misthi = - (float)PyFloat_AsDouble( PyList_GetItem( value, 3 ) ); - return 0; -} - -static PyObject *World_oldsetMist( BPy_World * self, PyObject * args ) -{ - return EXPP_setterWrapper( (void *)self, args, (setter)World_setMist ); -} - - -/* world.addScriptLink */ -static PyObject *World_addScriptLink( BPy_World * self, PyObject * args ) -{ - World *world = self->world; - ScriptLink *slink = NULL; - - slink = &( world )->scriptlink; - - return EXPP_addScriptLink( slink, args, 0 ); -} - -/* world.clearScriptLinks */ -static PyObject *World_clearScriptLinks( BPy_World * self, PyObject * args ) -{ - World *world = self->world; - ScriptLink *slink = NULL; - - slink = &( world )->scriptlink; - - return EXPP_clearScriptLinks( slink, args ); -} - -/* world.getScriptLinks */ -static PyObject *World_getScriptLinks( BPy_World * self, PyObject * value ) -{ - World *world = self->world; - ScriptLink *slink = NULL; - PyObject *ret = NULL; - - slink = &( world )->scriptlink; - - ret = EXPP_getScriptLinks( slink, value, 0 ); - - if( ret ) - return ret; - else - return NULL; -} - - -/* world.setCurrent */ -static PyObject *World_setCurrent( BPy_World * self ) -{ - World *world = self->world; -#if 0 /* add back in when bpy becomes "official" */ - static char warning = 1; - if( warning ) { - printf("world.setCurrent() deprecated!\n\tuse bpy.scenes.world=world instead\n"); - --warning; - } -#endif - - /* If there is a world then it now has one less user */ - if( G.scene->world ) - G.scene->world->id.us--; - world->id.us++; - G.scene->world = world; - Py_RETURN_NONE; -} - -/* world.__copy__ */ -static PyObject *World_copy( BPy_World * self ) -{ - World *world = copy_world(self->world ); - world->id.us = 0; - return World_CreatePyObject(world); -} - -/** - * \brief The World PyType compare function - * - * This function compares two given World PyObjects, returning 0 for equality - * and -1 otherwise. In Python it becomes 1 if they are equal and 0 case not. - * The comparison is done with their pointers to Blender World Data objects, - * so any two wrappers pointing to the same Blender World Data will be - * considered the same World PyObject. Currently, only the "==" and "!=" - * comparisons are meaninful -- the "<", "<=", ">" or ">=" are not. - */ - -static int World_Compare( BPy_World * a, BPy_World * b ) -{ - return ( a->world == b->world ) ? 0 : -1; -} - -/** - * \brief The World PyType print callback - * - * This function is called when the user tries to print a PyObject of type - * World. It builds a string with the name of the wrapped Blender World. - */ - -/* -static int World_Print(BPy_World *self, FILE *fp, int flags) -{ - fprintf(fp, "[World \"%s\"]", self->world->id.name+2); - return 0; -} -*/ - -/** - * \brief The World PyType repr callback - * - * This function is called when the statement "repr(myworld)" is executed in - * Python. Repr gives a string representation of a PyObject. - */ - -static PyObject *World_Repr( BPy_World * self ) -{ - return PyString_FromFormat( "[World \"%s\"]", - self->world->id.name + 2 ); -} - -/*@}*/ -/* -static int World_compare (BPy_World *a, BPy_World *b) -{ - World *pa = a->world, *pb = b->world; - return (pa == pb) ? 0:-1; -} -*/ -PyObject *World_CreatePyObject( struct World * world ) -{ - BPy_World *blen_object; - - blen_object = ( BPy_World * ) PyObject_NEW( BPy_World, &World_Type ); - - if( blen_object == NULL ) { - return ( NULL ); - } - blen_object->world = world; - return ( ( PyObject * ) blen_object ); -} - -World *World_FromPyObject( PyObject * py_obj ) -{ - BPy_World *blen_obj; - - blen_obj = ( BPy_World * ) py_obj; - return ( blen_obj->world ); - -} - -/* - * World_insertIpoKey() - * inserts World IPO key for ZENITH,HORIZON,MIST,STARS,OFFSET,SIZE - */ - -static PyObject *World_insertIpoKey( BPy_World * self, PyObject * args ) -{ - int key = 0, map; - - if( !PyArg_ParseTuple( args, "i", &( key ) ) ) - return ( EXPP_ReturnPyObjError( PyExc_AttributeError, - "expected int argument" ) ); - - map = texchannel_to_adrcode(self->world->texact); - - if(key == IPOKEY_ZENITH) { - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_R, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_G, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_B, 0); - } - if(key == IPOKEY_HORIZON) { - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_R, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_G, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_B, 0); - } - if(key == IPOKEY_MIST) { - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISI, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTDI, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTSTA, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTHI, 0); - } - if(key == IPOKEY_STARS) { - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_R, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_G, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_B, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARDIST, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARSIZE, 0); - } - if(key == IPOKEY_OFFSET) { - insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_X, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Y, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Z, 0); - } - if(key == IPOKEY_SIZE) { - insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_X, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Y, 0); - insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Z, 0); - } - - allspace(REMAKEIPO, 0); - EXPP_allqueue(REDRAWIPO, 0); - EXPP_allqueue(REDRAWVIEW3D, 0); - EXPP_allqueue(REDRAWACTION, 0); - EXPP_allqueue(REDRAWNLA, 0); - - Py_RETURN_NONE; -} diff --git a/source/blender/python/api2_2x/World.h b/source/blender/python/api2_2x/World.h deleted file mode 100644 index 71c407bff19..00000000000 --- a/source/blender/python/api2_2x/World.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * $Id: World.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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Jacques Guignot - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_WORLD_H -#define EXPP_WORLD_H - -#include -#include "DNA_world_types.h" - -#define BPy_World_Check(v) ((v)->ob_type==&World_Type) - -/* Python BPy_World structure definition */ -typedef struct { - PyObject_HEAD /* required py macro */ - World * world; /* Libdata must be second */ -} BPy_World; - -extern PyTypeObject World_Type; - -/*****************************************************************************/ -/* Python World_Type helper functions needed by Blender (the Init function) */ -/* and Object modules. */ -/*****************************************************************************/ - -PyObject *World_Init( void ); -PyObject *World_CreatePyObject( World * world ); -World *World_FromPyObject( PyObject * pyobj ); - -#endif /* EXPP_WORLD_H */ diff --git a/source/blender/python/api2_2x/bpy.c b/source/blender/python/api2_2x/bpy.c deleted file mode 100644 index 6ddbcfe4096..00000000000 --- a/source/blender/python/api2_2x/bpy.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * $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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten, Willian P. Germano, Joseph Gilbert, - * Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* for open, close in Blender_Load */ - -#include "BLI_blenlib.h" -#include "BKE_global.h" -#include "BKE_utildefines.h" -#include "BKE_scene.h" -#include "BKE_main.h" - -#include "DNA_scene_types.h" - -#include "Types.h" -#include "Library.h" - -#include "bpy.h" -#include "bpy_data.h" -#include "bpy_config.h" - -/*****************************************************************************/ -/* Global variables */ -/*****************************************************************************/ -PyObject *g_bpydict; - -/*****************************************************************************/ -/* Function: initBlender */ -/*****************************************************************************/ - -void m_bpy_init(void) -{ - PyObject *module; - PyObject *dict; - - /* G.scene should only aver be NULL if blender is executed in - background mode, not loading a blend file and executing a python script eg. - blender -P somescript.py -b - The if below solves the segfaults that happen when python runs and - G.scene is NULL */ - if(G.background && G.main->scene.first==NULL) { - Scene *sce= add_scene("1"); - /*set_scene(sce);*/ /* causes a crash */ - G.scene= sce; - } - - module = Py_InitModule3("bpy", NULL, "The main bpy module"); - - types_InitAll(); /* set all our pytypes to &PyType_Type */ - - dict = PyModule_GetDict(module); - g_bpydict = dict; - - PyModule_AddObject( module, "config", Config_CreatePyObject() ); - PyDict_SetItemString( dict, "data", Data_Init()); - PyDict_SetItemString( dict, "libraries", Library_Init( ) ); - -} diff --git a/source/blender/python/api2_2x/bpy.h b/source/blender/python/api2_2x/bpy.h deleted file mode 100644 index 855da49bd2b..00000000000 --- a/source/blender/python/api2_2x/bpy.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * $Id: bpy.h 10546 2007-04-18 14:40:01Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Michel Selten, Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_BPYMOD_H -#define EXPP_BPYMOD_H - -#include - -extern PyObject *g_bpydict; -void m_bpy_init( void ); - -#endif /* EXPP_BPYMOD_H */ diff --git a/source/blender/python/api2_2x/bpy_config.c b/source/blender/python/api2_2x/bpy_config.c deleted file mode 100644 index ce8ce0bc39c..00000000000 --- a/source/blender/python/api2_2x/bpy_config.c +++ /dev/null @@ -1,414 +0,0 @@ -/* - * $Id: bpy_config.c 11123 2007-06-29 08:59:26Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -/* python types */ -#include "DNA_userdef_types.h" -#include "../api2_2x/gen_utils.h" -#include "bpy_config.h" - -enum conf_consts { - /*string*/ - EXPP_CONF_ATTR_PATH_YF_EXPORT = 0, - EXPP_CONF_ATTR_PATH_FONT, - EXPP_CONF_ATTR_PATH_RENDER, - EXPP_CONF_ATTR_PATH_TEXTURE, - EXPP_CONF_ATTR_PATH_PYTHON, - EXPP_CONF_ATTR_PATH_TEX_PLUGIN, - EXPP_CONF_ATTR_PATH_SOUND, - EXPP_CONF_ATTR_PATH_SEQ_PLUGIN, - EXPP_CONF_ATTR_PATH_TEMP, - - /*int*/ - EXPP_CONF_ATTR_UNDOSTEPS, - EXPP_CONF_ATTR_TEX_TIMEOUT, - EXPP_CONF_ATTR_TEX_COLLECT_RATE, - EXPP_CONF_ATTR_MEM_CACHE_LIMIT, - EXPP_CONF_ATTR_FONT_SIZE -}; - -PyObject *Config_CreatePyObject( ) -{ - BPy_Config *conf = PyObject_NEW( BPy_Config, &Config_Type); - return (PyObject *)conf; -} - -/* - * repr function - * callback functions building meaninful string to representations - */ -static PyObject *Config_repr( BPy_Config * self ) -{ - return PyString_FromFormat( "[Blender Configuration Data]"); -} - - -/*-----------------------Config module Init())-----------------------------*/ -/* see Main.c */ -/* -static struct PyMethodDef BPy_Config_methods[] = { - {"new", (PyCFunction)MainSeq_new, METH_VARARGS, - "(name) - Create a new object in this scene from the obdata given and return a new object"}, - {"load", (PyCFunction)MainSeq_load, METH_VARARGS, - "(filename) - loads the given filename for image, font and sound types"}, - {"unlink", (PyCFunction)MainSeq_unlink, METH_VARARGS, - "unlinks the object from the scene"}, - {NULL, NULL, 0, NULL} -};*/ - -/* - * get integer attributes - */ -static PyObject *getStrAttr( BPy_Config *self, void *type ) -{ - char *param = NULL; - - switch( (int)type ) { - case EXPP_CONF_ATTR_PATH_YF_EXPORT: - param = U.yfexportdir; - break; - case EXPP_CONF_ATTR_PATH_FONT: - param = U.fontdir; - break; - case EXPP_CONF_ATTR_PATH_RENDER: - param = U.renderdir; - break; - case EXPP_CONF_ATTR_PATH_TEXTURE: - param = U.textudir; - break; - case EXPP_CONF_ATTR_PATH_PYTHON: - param = U.pythondir; - break; - case EXPP_CONF_ATTR_PATH_TEX_PLUGIN: - param = U.plugtexdir; - break; - case EXPP_CONF_ATTR_PATH_SOUND: - param = U.sounddir; - break; - case EXPP_CONF_ATTR_PATH_SEQ_PLUGIN: - param = U.plugseqdir; - break; - case EXPP_CONF_ATTR_PATH_TEMP: - param = U.tempdir; - break; - - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "undefined type in getStrAttr" ); - } - - return PyString_FromString( param ); -} - -/* - * set integer attributes which require clamping - */ - -static int setStrAttr( BPy_Config *self, PyObject *value, void *type ) -{ - char *param; - int len=160; - char *str = PyString_AsString(value); - - if (!str) - return EXPP_ReturnIntError( PyExc_TypeError, - "error, must assign a python string for setStrAttr"); - - switch( (int)type ) { - case EXPP_CONF_ATTR_PATH_YF_EXPORT: - param = U.yfexportdir; - break; - case EXPP_CONF_ATTR_PATH_FONT: - param = U.fontdir; - break; - case EXPP_CONF_ATTR_PATH_RENDER: - param = U.renderdir; - break; - case EXPP_CONF_ATTR_PATH_TEXTURE: - param = U.textudir; - break; - case EXPP_CONF_ATTR_PATH_PYTHON: - param = U.pythondir; - break; - case EXPP_CONF_ATTR_PATH_TEX_PLUGIN: - param = U.plugtexdir; - break; - case EXPP_CONF_ATTR_PATH_SOUND: - param = U.sounddir; - break; - case EXPP_CONF_ATTR_PATH_SEQ_PLUGIN: - param = U.plugseqdir; - break; - case EXPP_CONF_ATTR_PATH_TEMP: - param = U.tempdir; - break; - - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setStrAttr"); - } - - strncpy(param, str, len); - return 0; -} - - -/* - * get integer attributes - */ - -static PyObject *getIntAttr( BPy_Config *self, void *type ) -{ - int param; - - switch( (int)type ) { - case EXPP_CONF_ATTR_UNDOSTEPS: - param = (int)U.undosteps; - break; - case EXPP_CONF_ATTR_TEX_TIMEOUT: - param = U.textimeout; - break; - case EXPP_CONF_ATTR_TEX_COLLECT_RATE: - param = U.texcollectrate; - break; - case EXPP_CONF_ATTR_MEM_CACHE_LIMIT: - param = U.memcachelimit; - break; - case EXPP_CONF_ATTR_FONT_SIZE: - param = U.fontsize; - break; - - default: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "undefined type in getIntAttr" ); - } - - return PyInt_FromLong( param ); -} - -/* - * set integer attributes which require clamping - */ - -static int setIntAttrClamp( BPy_Config *self, PyObject *value, void *type ) -{ - void *param; - int min, max, size; - - switch( (int)type ) { - case EXPP_CONF_ATTR_UNDOSTEPS: - min = 0; - max = 64; - size = 'h'; - param = (void *)&U.undosteps; - break; - case EXPP_CONF_ATTR_TEX_TIMEOUT: - min = 1; - max = 3600; - size = 'i'; - param = (void *)&U.textimeout; - break; - case EXPP_CONF_ATTR_TEX_COLLECT_RATE: - min = 1; - max = 3600; - size = 'i'; - param = (void *)&U.texcollectrate; - break; - case EXPP_CONF_ATTR_MEM_CACHE_LIMIT: - min = 1; - max = 1024; - size = 'i'; - param = (void *)&U.memcachelimit; - break; - case EXPP_CONF_ATTR_FONT_SIZE: - min = 8; - max = 16; - size = 'i'; - param = (void *)&U.fontsize; - break; - - default: - return EXPP_ReturnIntError( PyExc_RuntimeError, - "undefined type in setIntAttrClamp"); - } - return EXPP_setIValueClamped( value, param, min, max, size ); -} - -static PyGetSetDef Config_getseters[] = { - - /* ints & shorts */ - {"undoSteps", - (getter)getIntAttr, (setter)setIntAttrClamp, - "undo steps", - (void *)EXPP_CONF_ATTR_UNDOSTEPS}, - {"textureTimeout", - (getter)getIntAttr, (setter)setIntAttrClamp, - "time for textures to stay in openGL memory", - (void *)EXPP_CONF_ATTR_TEX_TIMEOUT}, - {"textureCollectRate", - (getter)getIntAttr, (setter)setIntAttrClamp, - "intervel for textures to be tagged as used", - (void *)EXPP_CONF_ATTR_TEX_COLLECT_RATE}, - {"sequenceMemCacheLimit", - (getter)getIntAttr, (setter)setIntAttrClamp, - "maximum memory for the sequencer to use as cache", - (void *)EXPP_CONF_ATTR_MEM_CACHE_LIMIT}, - {"fontSize", - (getter)getIntAttr, (setter)setIntAttrClamp, - "user interface font size", - (void *)EXPP_CONF_ATTR_FONT_SIZE}, - - /* Paths */ - {"yfExportDir", - (getter)getStrAttr, (setter)setStrAttr, - "yafray export path", - (void *)EXPP_CONF_ATTR_PATH_YF_EXPORT}, - {"fontDir", - (getter)getStrAttr, (setter)setStrAttr, - "default font path", - (void *)EXPP_CONF_ATTR_PATH_FONT}, - {"renderDir", - (getter)getStrAttr, (setter)setStrAttr, - "default render path", - (void *)EXPP_CONF_ATTR_PATH_RENDER}, - {"textureDir", - (getter)getStrAttr, (setter)setStrAttr, - "default texture path", - (void *)EXPP_CONF_ATTR_PATH_TEXTURE}, - {"userScriptsDir", - (getter)getStrAttr, (setter)setStrAttr, - "user scripts path", - (void *)EXPP_CONF_ATTR_PATH_PYTHON}, - {"texturePluginsDir", - (getter)getStrAttr, (setter)setStrAttr, - "default texture plugins path", - (void *)EXPP_CONF_ATTR_PATH_TEX_PLUGIN}, - {"soundDir", - (getter)getStrAttr, (setter)setStrAttr, - "default sound path", - (void *)EXPP_CONF_ATTR_PATH_SOUND}, - {"sequencePluginsDir", - (getter)getStrAttr, (setter)setStrAttr, - "sequencer plugins path", - (void *)EXPP_CONF_ATTR_PATH_SEQ_PLUGIN}, - {"tempDir", - (getter)getStrAttr, (setter)setStrAttr, - "temporary file path", - (void *)EXPP_CONF_ATTR_PATH_TEMP}, - - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - - -/* - * Python Config_Type structure definition - */ -PyTypeObject Config_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender Config", /* char *tp_name; */ - sizeof( BPy_Config ), /* 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)Config_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, /*BPy_Config_methods*/ /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - Config_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 -}; diff --git a/source/blender/python/api2_2x/bpy_config.h b/source/blender/python/api2_2x/bpy_config.h deleted file mode 100644 index ae1f114dc81..00000000000 --- a/source/blender/python/api2_2x/bpy_config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * $Id: bpy_config.h 10546 2007-04-18 14:40:01Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_BPY_CONFIG_H -#define EXPP_BPY_CONFIG_H - -#include - -/* The Main PyType Object defined in Main.c */ -extern PyTypeObject Config_Type; - -#define BPy_Config_Check(v) \ - ((v)->ob_type == &Config_Type) - -/* Main sequence, iterate on the libdatas listbase*/ -typedef struct { - PyObject_VAR_HEAD /* required python macro */ -} BPy_Config; - -PyObject *Config_CreatePyObject(); - - -#endif /* EXPP_BPY_CONFIG_H */ diff --git a/source/blender/python/api2_2x/bpy_data.c b/source/blender/python/api2_2x/bpy_data.c deleted file mode 100644 index fd5fe27fbaf..00000000000 --- a/source/blender/python/api2_2x/bpy_data.c +++ /dev/null @@ -1,817 +0,0 @@ -/* - * $Id: bpy_data.c 12056 2007-09-17 06:11:06Z aligorith $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "bpy_data.h" - -#include "MEM_guardedalloc.h" /* for MEM_callocN */ -#include "DNA_space_types.h" /* SPACE_VIEW3D, SPACE_SEQ */ -#include "DNA_scene_types.h" -#include "DNA_object_types.h" /* LibBlockSeq_new */ -#include "DNA_texture_types.h" -#include "DNA_curve_types.h" -#include "DNA_ipo_types.h" -#include "DNA_group_types.h" -#include "DNA_world_types.h" -#include "DNA_vfont_types.h" -#include "DNA_armature_types.h" -#include "DNA_sound_types.h" -#include "DNA_text_types.h" -#include "DNA_action_types.h" -#include "DNA_meta_types.h" - -/* Use the add_* from BKE_* */ -#include "BKE_global.h" -#include "BKE_utildefines.h" /* clamp */ -#include "BKE_armature.h" -#include "BKE_ipo.h" -#include "BKE_image.h" -#include "BKE_main.h" -#include "BKE_library.h" -#include "BKE_lattice.h" -#include "BKE_object.h" -#include "BKE_scene.h" -#include "BKE_sca.h" /*free_text_controllers*/ -#include "BKE_font.h" -#include "BKE_mball.h" -#include "BKE_mesh.h" -#include "BKE_curve.h" -#include "BKE_material.h" -#include "BKE_group.h" -#include "BKE_text.h" -#include "BKE_texture.h" -#include "BKE_world.h" - -#include "BLI_blenlib.h" /* BLI_countlist */ -#include "BIF_drawscene.h" /* for set_scene */ -#include "BIF_screen.h" /* curarea */ -#include "BIF_drawimage.h" /* what image */ -#include "BIF_drawtext.h" /* unlink_text */ -#include "BIF_editsound.h" /* sound_new_sound */ -#include "BIF_editaction.h" /* add_empty_action */ - -/* python types */ -#include "../BPY_extern.h" /* clearing scriptlinks */ - -#include "gen_utils.h" -#include "gen_library.h" /* generic ID functions */ - -#include "Object.h" -#include "Camera.h" -#include "Armature.h" -#include "Lamp.h" -#include "Curve.h" -#include "NMesh.h" -#include "Mesh.h" -#include "Lattice.h" -#include "Metaball.h" -#include "Text.h" -#include "Text3d.h" -#include "Font.h" -#include "Group.h" -#include "World.h" -#include "Texture.h" -#include "Ipo.h" -#include "Text.h" -#include "Sound.h" -#include "NLA.h" -#include "Scene.h" -#include "Library.h" - -#include "bpy_config.h" /* config pydata */ - -/* used only for texts.active */ -#include "BIF_screen.h" -#include "DNA_space_types.h" -#include "DNA_screen_types.h" - -extern VFont *get_builtin_font(void); - -static PyObject *LibBlockSeq_CreatePyObject( Link *iter, int type ) -{ - BPy_LibBlockSeq *seq = PyObject_NEW( BPy_LibBlockSeq, &LibBlockSeq_Type); - seq->iter = iter; - seq->type = type; - return (PyObject *)seq; -} - - -static int LibBlockSeq_len( BPy_LibBlockSeq * self ) -{ - ListBase *lb = wich_libbase(G.main, self->type); - return BLI_countlist( lb ); -} - -static PyObject * LibBlockSeq_subscript(BPy_LibBlockSeq * self, PyObject *key) -{ - char *name; - char *lib= NULL; - char use_lib = 0; - ID *id; - - id = (ID *)wich_libbase(G.main, self->type)->first; - - if ( PyString_Check(key) ) { - name = PyString_AsString ( key ); - } else if (PyTuple_Check(key) && (PyTuple_Size(key) == 2) ) { - PyObject *pydata; - use_lib = 1; - - /* Get the first arg */ - pydata = PyTuple_GET_ITEM(key, 0); - if (!PyString_Check(pydata)) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "the data name must be a string" ); - } - - name = PyString_AsString ( pydata ); - - /* Get the second arg */ - pydata = PyTuple_GET_ITEM(key, 1); - if (pydata == Py_None) { - lib = NULL; /* data must be local */ - } else if (PyString_Check(pydata)) { - lib = PyString_AsString ( pydata ); - if (!strcmp( "", lib)) { - lib = NULL; /* and empty string also means data must be local */ - } - } else { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "the lib name must be a string or None" ); - } - } else { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected the a name string or a tuple (lib, name)" ); - } - - for (; id; id = id->next) { - if(!strcmp( name, id->name+2 )) { - if ( - (!use_lib) || /* any data, local or external lib data */ - (use_lib && !lib && !id->lib) || /* only local */ - (lib && use_lib && id->lib && (!strcmp( id->lib->name, lib))) /* only external lib */ - ) - { - return GetPyObjectFromID(id); - } - } - } - return ( EXPP_ReturnPyObjError - ( PyExc_KeyError, "Requested data does not exist") ); -} - -static PyMappingMethods LibBlockSeq_as_mapping = { - ( inquiry ) LibBlockSeq_len, /* mp_length */ - ( binaryfunc ) LibBlockSeq_subscript, /* mp_subscript */ - ( objobjargproc ) 0, /* mp_ass_subscript */ -}; - - -/************************************************************************ - * - * Python LibBlockSeq_Type iterator (iterates over GroupObjects) - * - ************************************************************************/ - -/* - * Initialize the interator index - */ - -static PyObject *LibBlockSeq_getIter( BPy_LibBlockSeq * self ) -{ - /* we need to get the first base, but for selected context we may need to advance - to the first selected or first conext base */ - - ListBase *lb; - Link *link; - lb = wich_libbase(G.main, self->type); - - link = lb->first; - - /* create a new iterator if were alredy using this one */ - if (self->iter==NULL) { - self->iter = link; - return EXPP_incr_ret ( (PyObject *) self ); - } else { - return LibBlockSeq_CreatePyObject(link, self->type); - } -} - -/* - * Return next LibBlockSeq iter. - */ - -static PyObject *LibBlockSeq_nextIter( BPy_LibBlockSeq * self ) -{ - PyObject *object; - Link *link; - if( !(self->iter) ) { - self->iter= NULL; - return EXPP_ReturnPyObjError( PyExc_StopIteration, - "iterator at end" ); - } - - object = GetPyObjectFromID((ID *)self->iter); - - link= self->iter->next; - self->iter= link; - return object; -} - -PyObject *LibBlockSeq_getActive(BPy_LibBlockSeq *self) -{ - switch (self->type) { - case ID_SCE: - if ( !G.scene ) { - Py_RETURN_NONE; - } else { - return Scene_CreatePyObject( ( Scene * ) G.scene ); - } - - break; - case ID_IM: - if (!G.sima || !G.sima->image) { - Py_RETURN_NONE; - } else { - what_image( G.sima ); /* make sure image data exists */ - return Image_CreatePyObject( G.sima->image ); - } - break; - case ID_TXT: { - SpaceText *st= curarea->spacedata.first; - - if (st->spacetype!=SPACE_TEXT || st->text==NULL) { - Py_RETURN_NONE; - } else { - return Text_CreatePyObject( st->text ); - } - } - } - - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Only Scene and Image types have the active attribute" ); -} - -static int LibBlockSeq_setActive(BPy_LibBlockSeq *self, PyObject *value) -{ - switch (self->type) { - case ID_SCE: - if (!BPy_Scene_Check(value)) { - return EXPP_ReturnIntError(PyExc_TypeError, - "Must be a scene" ); - } else { - BPy_Scene *bpydata; - Scene *data; - - bpydata = (BPy_Scene *)value; - data= bpydata->scene; - - if (!data) - return EXPP_ReturnIntError(PyExc_RuntimeError, - "This Scene has been removed" ); - - if (data != G.scene) { - set_scene( data ); - scene_update_for_newframe(data, data->lay); - } - } - return 0; - - case ID_IM: - if (!BPy_Image_Check(value)) { - return EXPP_ReturnIntError(PyExc_TypeError, - "Must be a scene" ); - } else { - BPy_Image *bpydata; - Image *data; - - if (!G.sima) - return 0; - - bpydata = (BPy_Image *)value; - data= bpydata->image; - - if (!data) - return EXPP_ReturnIntError(PyExc_RuntimeError, - "This Scene has been removed" ); - - if (data != G.sima->image) - G.sima->image= data; - } - return 0; - - case ID_TXT: - if (!BPy_Text_Check(value)) { - return EXPP_ReturnIntError(PyExc_TypeError, - "Must be a text" ); - } else { - SpaceText *st= curarea->spacedata.first; - Text *data = ((BPy_Text *)value)->text; - - if( !data ) - return EXPP_ReturnIntError( PyExc_RuntimeError, - "This object isn't linked to a Blender Text Object" ); - if(st->spacetype!=SPACE_TEXT) - return 0; - st->text = data; - } - return 0; - } - - return EXPP_ReturnIntError( PyExc_TypeError, - "Only Scene and Image types have the active attribute" ); -} - -static int LibBlockSeq_setTag(BPy_LibBlockSeq *self, PyObject *value) -{ - ID *id; - int param = PyObject_IsTrue( value ); - - if( param == -1 ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected True/False or 0/1" ); - - id = (ID *)wich_libbase(G.main, self->type)->first; - - if (param) { - for (; id; id = id->next) { - id->flag |= LIB_DOIT; - } - } else { - for (; id; id = id->next) { - id->flag &= ~LIB_DOIT; - } - } - - return 0; -} - - -/* New Data, internal functions */ -Mesh *add_mesh__internal(char *name) -{ - Mesh *mesh = add_mesh(name); /* doesn't return NULL now, but might someday */ - - /* Bound box set to null needed because a new mesh is initialized - with a bounding box of -1 -1 -1 -1 -1 -1 - if its not set to null the bounding box is not re-calculated - when ob.getBoundBox() is called.*/ - MEM_freeN(mesh->bb); - mesh->bb= NULL; - return mesh; -} - -/* used for new and load */ -PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd) -{ - ID *id = NULL; - char *name=NULL, *filename=NULL, *data_type=NULL; - int img_width=256, img_height=256; - float color[] = {0, 0, 0, 1}; - short data_code = 0; - int user_count = 0; - - /* Load from file */ - if ( ( self->type==ID_IM || self->type==ID_VF || - self->type==ID_SO || self->type==ID_TXT) && - ( PyTuple_Size( args ) < 3 )) - { - static char *kwlist[] = {"name", "filename", NULL}; - - if(PyArg_ParseTupleAndKeywords(args, kwd, "|ss", kwlist, &name, &filename) && filename ) { - PyObject *ret= NULL; - - if (strlen(filename) > FILE_MAXDIR + FILE_MAXFILE - 1) - return ( EXPP_ReturnPyObjError( PyExc_IOError, - "filename too long" ) ); - - if (self->type == ID_IM) { - Image *img = BKE_add_image_file( filename ); - if (!img) - return ( EXPP_ReturnPyObjError( PyExc_IOError, - "couldn't load image" ) ); - ret = Image_CreatePyObject( img ); - - } else if (self->type == ID_VF) { - VFont *vf = load_vfont (filename); - if (!vf) - return EXPP_ReturnPyObjError( PyExc_IOError, - "couldn't load font" ); - ret = Font_CreatePyObject(vf); - - } else if (self->type == ID_SO) { - bSound *snd = sound_new_sound( filename ); - if (!snd) - return EXPP_ReturnPyObjError( PyExc_IOError, - "couldn't load sound" ); - ret = Sound_CreatePyObject(snd); - - } else if (self->type == ID_TXT) { - Text *txt = NULL; - txt = add_text( filename ); - if( !txt ) - return EXPP_ReturnPyObjError( PyExc_IOError, - "couldn't load text" ); - ret = Text_CreatePyObject(txt); - } - - if (!ret) - return EXPP_ReturnPyObjError( PyExc_IOError, - "couldn't create pyobject on load, unknown error" ); - if (name) { - ID *id = ((BPy_GenericLib *)ret)->id; - rename_id( id, name ); - } - return ret; - } - } - - /* New Data */ - if (self->type == ID_IM) { - /* Image, accepts width and height*/ - if( !PyArg_ParseTuple( args, "|sii", &name, &img_width, &img_height ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "one string and two ints expected as arguments" ); - CLAMP(img_width, 4, 5000); - CLAMP(img_height, 4, 5000); - - } else if (self->type == ID_CU) { - /* Curve, needs name and type strings */ - if( !PyArg_ParseTuple( args, "ss", &name, &data_type ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "two strings expected as arguments" ); - - if( !strcmp( data_type, "Curve" ) ) data_code = OB_CURVE; - else if( !strcmp( data_type, "Text3d" ) ) data_code = OB_FONT;/* - else if( !strcmp( data_type, "Surf" ) ) data_code = OB_SURF;*/ - else return EXPP_ReturnPyObjError( PyExc_TypeError, - "Second argument for Curve type incorrect\t\nmust be a string in (Curve or Text - Surf is not supported yet)" ); - - } else if (self->type == ID_IP) { - /* IPO, needs name and type strings */ - if( !PyArg_ParseTuple( args, "ss", &name, &data_type ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "two strings expected as arguments" ); - - if( !strcmp( data_type, "Object" ) ) data_code = ID_OB; - else if( !strcmp( data_type, "Camera" ) ) data_code = ID_CA; - else if( !strcmp( data_type, "World" ) ) data_code = ID_WO; - else if( !strcmp( data_type, "Material" ) ) data_code = ID_MA; - else if( !strcmp( data_type, "Texture" ) ) data_code = ID_TE; - else if( !strcmp( data_type, "Lamp" ) ) data_code = ID_LA; - else if( !strcmp( data_type, "Action" ) ) data_code = ID_PO; - else if( !strcmp( data_type, "Constraint" ) ) data_code = ID_CO; - else if( !strcmp( data_type, "Sequence" ) ) data_code = ID_SEQ; - else if( !strcmp( data_type, "Curve" ) ) data_code = ID_CU; - else if( !strcmp( data_type, "Key" ) ) data_code = ID_KE; - else return EXPP_ReturnPyObjError( PyExc_TypeError, - "Second argument for IPO type incorrect\t\nmust be a string in (Object, Camera, World, Material, Texture, Lamp, Action, Sequence, Curve, Key)" ); - - } else { - /* Other types only need the name */ - if( !PyArg_ParseTuple( args, "|s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "new(name) - name must be a string argument" ); - } - - switch (self->type) { - case ID_SCE: - id = (ID *)add_scene( name?name:"Scene" ); - user_count = 1; - break; - case ID_OB: - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "Add objects through the scenes objects iterator" ); - case ID_ME: - id = (ID *)add_mesh__internal( name?name:"Mesh" ); - break; - case ID_CU: - id = (ID *)add_curve( name?name:"Curve", data_code ); - if (data_code==OB_FONT) { - Text3d *text3d = (Text3d *)id; - text3d->vfont= get_builtin_font(); - text3d->vfont->id.us++; - text3d->str= MEM_mallocN(sizeof(wchar_t), "str"); - text3d->str[0] = '\0'; - text3d->totbox= text3d->actbox= 1; - text3d->tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "textbox"); - text3d->tb[0].w = text3d->tb[0].h = 0.0; - - } /*else { CURVE - Dont need to do anything } */ - break; - case ID_MB: - id = (ID *)add_mball( name?name:"MBall" ); - break; - case ID_MA: - id = (ID *)add_material( name?name:"Material" ); - break; - case ID_TE: - id = (ID *)add_texture( name?name:"Texture" ); - break; - case ID_IM: - { - id = (ID *)BKE_add_image_size(img_width, img_height, name?name:"Image", 0, color); - if( !id ) - return ( EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyObject Image_Type" ) ); - /* new images have zero user count */ - break; - } - case ID_LT: - id = (ID *)add_lattice( name?name:"Lattice" ); - break; - case ID_LA: - id = (ID *)add_lamp( name?name:"Lamp" ); - break; - case ID_CA: - id = (ID *)add_camera( name?name:"Camera" ); - break; - case ID_IP: - id = (ID *)add_ipo( name?name:"Ipo", data_code ); - break; - case ID_WO: - id = (ID *)add_world( name?name:"World" ); - break; - case ID_VF: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Cannot create new fonts, use the load() function to load from a file" ); - case ID_TXT: - id = (ID *)add_empty_text( name?name:"Text" ); - user_count = 1; - break; - case ID_SO: - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Cannot create new sounds, use the load() function to load from a file" ); - case ID_GR: - id = (ID *)add_group( name?name:"Group" ); - user_count = 1; - break; - case ID_AR: - id = (ID *)add_armature( name?name:"Armature" ); - break; - case ID_AC: - id = (ID *)add_empty_action( name?name:"Action" ); - user_count = 1; - break; - } - - if (!id) - Py_RETURN_NONE; - - /* set some types user count to 1, otherwise zero */ - id->us = user_count; - - return GetPyObjectFromID(id); -} - - -PyObject *LibBlockSeq_unlink(BPy_LibBlockSeq *self, PyObject * value) -{ - switch (self->type) { - case ID_SCE: - if( !BPy_Scene_Check(value) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Scene object" ); - } else { - Scene *data = ((BPy_Scene *)value)->scene; - - if (!data) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This Scene has been removed" ); - - /* Run the removal code */ - free_libblock( &G.main->scene, data ); - ((BPy_Scene *)value)->scene = NULL; - Py_RETURN_NONE; - } - case ID_GR: - if( !BPy_Group_Check(value) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Group object" ); - } else { - Group *data = ((BPy_Group *)value)->group; - - if (!data) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This Group has been removed alredy" ); - - /* Run the removal code */ - free_group(data); - unlink_group(data); - data->id.us= 0; - free_libblock( &G.main->group, data ); - ((BPy_Group *)value)->group = NULL; - - Py_RETURN_NONE; - } - - case ID_TXT: - if( !BPy_Text_Check(value) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected Text object" ); - } else { - Text *data = ((BPy_Text *)value)->text; - - if (!data) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, - "This Group has been removed alredy" ); - - /* Run the removal code */ - BPY_clear_bad_scriptlinks( data ); - free_text_controllers( data ); - unlink_text( data ); - free_libblock( &G.main->text, data ); - ((BPy_Text *)value)->text = NULL; - - Py_RETURN_NONE; - } - } - return EXPP_ReturnPyObjError( PyExc_TypeError, - "Only types Scene, Group and Text can unlink" ); -} - -static int LibBlockSeq_compare( BPy_LibBlockSeq * a, BPy_LibBlockSeq * b ) -{ - return ( a->type == b->type) ? 0 : -1; -} - -/* - * repr function - * callback functions building meaninful string to representations - */ -static PyObject *LibBlockSeq_repr( BPy_LibBlockSeq * self ) -{ - return PyString_FromFormat( "[LibBlockSeq Iterator]"); -} - -static PyGetSetDef LibBlockSeq_getseters[] = { - {"active", - (getter)LibBlockSeq_getActive, (setter)LibBlockSeq_setActive, - "active object", - NULL}, - {"tag", - (getter)NULL, (setter)LibBlockSeq_setTag, - "tag all data in True or False (write only)", - NULL}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -static struct PyMethodDef BPy_LibBlockSeq_methods[] = { - {"new", (PyCFunction)LibBlockSeq_new, METH_VARARGS | METH_KEYWORDS, - "(name) - Create a new object in this scene from the obdata given and return a new object"}, - {"unlink", (PyCFunction)LibBlockSeq_unlink, METH_O, - "unlinks the object from the scene"}, - {NULL, NULL, 0, NULL} -}; - -/*****************************************************************************/ -/* Python LibBlockSeq_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject LibBlockSeq_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "Blender LibBlockSeq", /* char *tp_name; */ - sizeof( BPy_LibBlockSeq ), /* 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; */ - ( cmpfunc ) LibBlockSeq_compare, /* cmpfunc tp_compare; */ - ( reprfunc ) LibBlockSeq_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - &LibBlockSeq_as_mapping, /* 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 */ - ( getiterfunc) LibBlockSeq_getIter, /* getiterfunc tp_iter; */ - ( iternextfunc ) LibBlockSeq_nextIter, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_LibBlockSeq_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - LibBlockSeq_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 module Init())-----------------------------*/ - -PyObject * Data_Init( void ) -{ - PyObject *module; - PyObject *dict; - - - PyType_Ready( &LibBlockSeq_Type ); - PyType_Ready( &Config_Type ); - - /*submodule = Py_InitModule3( "Blender.Main", NULL, M_Main_doc );*/ - module = Py_InitModule3( "bpy.data", NULL, "The bpy.data submodule" ); - dict = PyModule_GetDict( module ); - - /* Python Data Types */ - PyModule_AddObject( module, "scenes", LibBlockSeq_CreatePyObject(NULL, ID_SCE) ); - PyModule_AddObject( module, "objects", LibBlockSeq_CreatePyObject(NULL, ID_OB) ); - PyModule_AddObject( module, "meshes", LibBlockSeq_CreatePyObject(NULL, ID_ME) ); - PyModule_AddObject( module, "curves", LibBlockSeq_CreatePyObject(NULL, ID_CU) ); - PyModule_AddObject( module, "metaballs",LibBlockSeq_CreatePyObject(NULL, ID_MB) ); - PyModule_AddObject( module, "materials",LibBlockSeq_CreatePyObject(NULL, ID_MA) ); - PyModule_AddObject( module, "textures", LibBlockSeq_CreatePyObject(NULL, ID_TE) ); - PyModule_AddObject( module, "images", LibBlockSeq_CreatePyObject(NULL, ID_IM) ); - PyModule_AddObject( module, "lattices", LibBlockSeq_CreatePyObject(NULL, ID_LT) ); - PyModule_AddObject( module, "lamps", LibBlockSeq_CreatePyObject(NULL, ID_LA) ); - PyModule_AddObject( module, "cameras", LibBlockSeq_CreatePyObject(NULL, ID_CA) ); - PyModule_AddObject( module, "ipos", LibBlockSeq_CreatePyObject(NULL, ID_IP) ); - PyModule_AddObject( module, "worlds", LibBlockSeq_CreatePyObject(NULL, ID_WO) ); - PyModule_AddObject( module, "fonts", LibBlockSeq_CreatePyObject(NULL, ID_VF) ); - PyModule_AddObject( module, "texts", LibBlockSeq_CreatePyObject(NULL, ID_TXT) ); - PyModule_AddObject( module, "sounds", LibBlockSeq_CreatePyObject(NULL, ID_SO) ); - PyModule_AddObject( module, "groups", LibBlockSeq_CreatePyObject(NULL, ID_GR) ); - PyModule_AddObject( module, "armatures",LibBlockSeq_CreatePyObject(NULL, ID_AR) ); - PyModule_AddObject( module, "actions", LibBlockSeq_CreatePyObject(NULL, ID_AC) ); - return module; -} diff --git a/source/blender/python/api2_2x/bpy_data.h b/source/blender/python/api2_2x/bpy_data.h deleted file mode 100644 index 45600df6471..00000000000 --- a/source/blender/python/api2_2x/bpy_data.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Campbell Barton - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_BPYDATA_H -#define EXPP_BPYDATA_H - -#include -#include "DNA_listBase.h" - -/* The Main PyType Object defined in Main.c */ -extern PyTypeObject LibBlockSeq_Type; - -#define BPy_LibBlockSeq_Check(v) \ - ((v)->ob_type == &LibBlockSeq_Type) - -/* Main sequence, iterate on the libdatas listbase*/ -typedef struct { - PyObject_VAR_HEAD /* required python macro */ - Link *iter; /* so we can iterate over the listbase */ - - short type; /* store the ID type such as ID_ME */ -} BPy_LibBlockSeq; - - -PyObject * Data_Init( void ); - -#endif /* EXPP_BPYDATA_H */ diff --git a/source/blender/python/api2_2x/bpy_types.h b/source/blender/python/api2_2x/bpy_types.h deleted file mode 100644 index fcada098d1e..00000000000 --- a/source/blender/python/api2_2x/bpy_types.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * $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 - * 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_bpy_types_h -#define EXPP_bpy_types_h - - -/*****************************************************************************/ -/* Camera Data */ -/*****************************************************************************/ - - -/*****************************************************************************/ -/* Lamp Data */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* Ipo Data */ -/*****************************************************************************/ - - - -/*****************************************************************************/ -/* Metaball Data */ -/*****************************************************************************/ - - -/*****************************************************************************/ -/* Metaelem Data */ -/*****************************************************************************/ - - -/*****************************************************************************/ -/* Effect Data */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* Wave Data */ -/*****************************************************************************/ - - -/*****************************************************************************/ -/* Build Data */ -/*****************************************************************************/ - - -/*****************************************************************************/ -/* Particle Data */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* Curve Data */ -/*****************************************************************************/ - -/********** - CurNurb data -***********/ - - -/*****************************************************************************/ -/* World Data */ -/*****************************************************************************/ - - -#endif /* EXPP_bpy_types_h */ diff --git a/source/blender/python/api2_2x/charRGBA.c b/source/blender/python/api2_2x/charRGBA.c deleted file mode 100644 index 087ddecc1c5..00000000000 --- a/source/blender/python/api2_2x/charRGBA.c +++ /dev/null @@ -1,475 +0,0 @@ -/* - * $Id: charRGBA.c 10782 2007-05-26 04:39:31Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "charRGBA.h" /*This must come first */ -#include "gen_utils.h" - -/* This file is heavily based on the old bpython Constant object code in - Blender */ - -/*****************************************************************************/ -/* Python charRGBA_Type callback function prototypes: */ -/*****************************************************************************/ -static PyObject *charRGBA_repr( BPy_charRGBA * self ); - -static int charRGBALength( BPy_charRGBA * self ); - -static PyObject *charRGBASubscript( BPy_charRGBA * self, PyObject * key ); -static int charRGBAAssSubscript( BPy_charRGBA * self, PyObject * who, - PyObject * cares ); - -static PyObject *charRGBAItem( BPy_charRGBA * self, int i ); -static int charRGBAAssItem( BPy_charRGBA * self, int i, PyObject * ob ); -static PyObject *charRGBASlice( BPy_charRGBA * self, int begin, int end ); -static int charRGBAAssSlice( BPy_charRGBA * self, int begin, int end, - PyObject * seq ); -static PyObject *charRGBA_getColor( BPy_charRGBA * self, void * type); -static int charRGBA_setColor( BPy_charRGBA * self, PyObject * value, void * type); - -/*****************************************************************************/ -/* Python charRGBA_Type Mapping Methods table: */ -/*****************************************************************************/ -static PyMappingMethods charRGBAAsMapping = { - ( inquiry ) charRGBALength, /* mp_length */ - ( binaryfunc ) charRGBASubscript, /* mp_subscript */ - ( objobjargproc ) charRGBAAssSubscript, /* mp_ass_subscript */ -}; - -/*****************************************************************************/ -/* Python charRGBA_Type Sequence Methods table: */ -/*****************************************************************************/ -static PySequenceMethods charRGBAAsSequence = { - ( inquiry ) charRGBALength, /* sq_length */ - ( binaryfunc ) 0, /* sq_concat */ - ( intargfunc ) 0, /* sq_repeat */ - ( intargfunc ) charRGBAItem, /* sq_item */ - ( intintargfunc ) charRGBASlice, /* sq_slice */ - ( intobjargproc ) charRGBAAssItem, /* sq_ass_item */ - ( intintobjargproc ) charRGBAAssSlice, /* sq_ass_slice */ -}; - -static PyGetSetDef charRGBA_getseters[] = { - {"R", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the red component", - (void *) 0}, - {"r", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the red component", - (void *) 0}, - {"G", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the green component", - (void *) 1}, - {"g", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the green component", - (void *) 1}, - {"B", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the blue component", - (void *) 2}, - {"b", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the blue component", - (void *) 2}, - {"A", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the alpha component", - (void *) 3}, - {"a", - (getter)charRGBA_getColor, (setter)charRGBA_setColor, - "the alpha component", - (void *) 3}, - {NULL,NULL,NULL,NULL,NULL} /* Sentinel */ -}; - -/*****************************************************************************/ -/* Python charRGBA_Type structure definition: */ -/*****************************************************************************/ -PyTypeObject charRGBA_Type = { - PyObject_HEAD_INIT( NULL ) /* required py macro */ - 0, /* ob_size */ - /* For printing, in format "." */ - "charRGBA", /* tp_name */ - sizeof( BPy_charRGBA ), /* 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 ) charRGBA_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &charRGBAAsSequence, /* PySequenceMethods *tp_as_sequence; */ - &charRGBAAsMapping, /* 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; */ - charRGBA_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 -}; - -/*****************************************************************************/ -/* Function: charRGBA_New */ -/*****************************************************************************/ -PyObject *charRGBA_New( char *rgba ) -{ - BPy_charRGBA *charRGBA = NULL; - - /* - * When called the first time, charRGBA_Type.tp_dealloc will be NULL. - * If that's the case, initialize the PyTypeObject. If the - * initialization succeeds, then create a new object. - */ - - if( charRGBA_Type.tp_dealloc || PyType_Ready( &charRGBA_Type ) >= 0 ) { - charRGBA = ( BPy_charRGBA * ) PyObject_NEW( BPy_charRGBA, - &charRGBA_Type ); - } - - if( charRGBA == NULL ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create charRGBA object" ); - - /* rgba is a pointer to the first item of a char[4] array */ - charRGBA->rgba[0] = &rgba[0]; - charRGBA->rgba[1] = &rgba[1]; - charRGBA->rgba[2] = &rgba[2]; - charRGBA->rgba[3] = &rgba[3]; - - return ( PyObject * ) charRGBA; -} - -/*****************************************************************************/ -/* Functions: charRGBA_getCol and charRGBA_setCol */ -/* Description: These functions get/set rgba color triplet values. The */ -/* get function returns a tuple, the set one accepts three */ -/* chars (separated or in a tuple) as arguments. */ -/*****************************************************************************/ -PyObject *charRGBA_getCol( BPy_charRGBA * self ) -{ - PyObject *list = PyList_New( 4 ); - - if( !list ) - return EXPP_ReturnPyObjError( PyExc_MemoryError, - "couldn't create PyList" ); - - PyList_SET_ITEM( list, 0, PyInt_FromLong( *(self->rgba[0])) ); - PyList_SET_ITEM( list, 1, PyInt_FromLong( *(self->rgba[1])) ); - PyList_SET_ITEM( list, 2, PyInt_FromLong( *(self->rgba[2])) ); - PyList_SET_ITEM( list, 3, PyInt_FromLong( *(self->rgba[3])) ); - return list; -} - -PyObject *charRGBA_setCol( BPy_charRGBA * self, PyObject * args ) -{ - int ok; - char r = 0, g = 0, b = 0, a = 0; - - if( PyObject_Length( args ) == 4 ) - ok = PyArg_ParseTuple( args, "bbbb", &r, &g, &b, &a ); - - else - ok = PyArg_ParseTuple( args, "|(bbbb)", &r, &g, &b, &a ); - - if( !ok ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected 1-byte ints [b,b,b,b] or b,b,b,b as arguments (or nothing)" ); - - *( self->rgba[0] ) = (char)EXPP_ClampInt( r, 0, 255 ); - *( self->rgba[1] ) = (char)EXPP_ClampInt( g, 0, 255 ); - *( self->rgba[2] ) = (char)EXPP_ClampInt( b, 0, 255 ); - *( self->rgba[3] ) = (char)EXPP_ClampInt( a, 0, 255 ); - - return EXPP_incr_ret( Py_None ); -} - -/* return color value for one of the components */ - -static PyObject *charRGBA_getColor( BPy_charRGBA * self, void * type) -{ - int index = ((long)type) & 3; - return PyInt_FromLong ( *self->rgba[index] ); -} - -/* sets the color value of one of the components */ - -static int charRGBA_setColor( BPy_charRGBA * self, PyObject * value, - void * type) -{ - int index = ((long)type) & 3; - PyObject *num = PyNumber_Int( value ); - - /* argument must be a number */ - if( !num ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected char argument" ); - - /* clamp valut to 0..255 then assign */ - *self->rgba[index] = (char)EXPP_ClampInt( (int)PyInt_AS_LONG(value), - 0, 255 ); - Py_DECREF( num ); - return 0; -} - -/*****************************************************************************/ -/* Section: charRGBA as Mapping */ -/* These functions provide code to access charRGBA objects as */ -/* mappings. */ -/*****************************************************************************/ -static int charRGBALength( BPy_charRGBA * self ) -{ - return 4; -} - -static PyObject *charRGBASubscript( BPy_charRGBA * self, PyObject * key ) -{ - char *name = NULL; - int i; - - if( PyNumber_Check( key ) ) - return charRGBAItem( self, ( int ) PyInt_AsLong( key ) ); - - if( !PyArg_ParseTuple( key, "s", &name ) ) - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int or string argument" ); - - if( !strcmp( name, "R" ) || !strcmp( name, "r" ) ) - i = 0; - else if( !strcmp( name, "G" ) || !strcmp( name, "g" ) ) - i = 1; - else if( !strcmp( name, "B" ) || !strcmp( name, "b" ) ) - i = 2; - else if( !strcmp( name, "A" ) || !strcmp( name, "a" ) ) - i = 3; - else - return EXPP_ReturnPyObjError( PyExc_AttributeError, name ); - - return PyInt_FromLong( (long)(*self->rgba[i]) ); -} - -static int charRGBAAssSubscript( BPy_charRGBA * self, PyObject * key, - PyObject * v ) -{ - char *name = NULL; - int i; - - if( !PyNumber_Check( v ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "value to assign must be a number" ); - - if( PyNumber_Check( key ) ) - return charRGBAAssItem( self, ( int ) PyInt_AsLong( key ), v ); - - if( !PyArg_Parse( key, "s", &name ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "expected int or string argument" ); - - if( !strcmp( name, "R" ) || !strcmp( name, "r" ) ) - i = 0; - else if( !strcmp( name, "G" ) || !strcmp( name, "g" ) ) - i = 1; - else if( !strcmp( name, "B" ) || !strcmp( name, "b" ) ) - i = 2; - else if( !strcmp( name, "A" ) || !strcmp( name, "a" ) ) - i = 3; - else - return EXPP_ReturnIntError( PyExc_AttributeError, name ); - - *( self->rgba[i] ) = (char)EXPP_ClampInt( PyInt_AsLong( v ), 0, 255 ); - - return 0; -} - -/*****************************************************************************/ -/* Section: charRGBA as Sequence */ -/* These functions provide code to access charRGBA objects as */ -/* sequences. */ -/*****************************************************************************/ -static PyObject *charRGBAItem( BPy_charRGBA * self, int i ) -{ - if( i < 0 || i >= 4 ) - return EXPP_ReturnPyObjError( PyExc_IndexError, - "array index out of range" ); - - return PyInt_FromLong( *(self->rgba[i]) ); -} - -static PyObject *charRGBASlice( BPy_charRGBA * self, int begin, int end ) -{ - PyObject *list; - int count; - - if( begin < 0 ) - begin = 0; - if( end > 4 ) - end = 4; - if( begin > end ) - begin = end; - - list = PyList_New( end - begin ); - - for( count = begin; count < end; count++ ) - PyList_SetItem( list, count - begin, - PyInt_FromLong( *( self->rgba[count] ) ) ); - - return list; -} - -static int charRGBAAssItem( BPy_charRGBA * self, int i, PyObject * ob ) -{ - if( i < 0 || i >= 4 ) - return EXPP_ReturnIntError( PyExc_IndexError, - "array assignment index out of range" ); - - if( !PyNumber_Check( ob ) ) - return EXPP_ReturnIntError( PyExc_IndexError, - "color component must be a number" ); - - *( self->rgba[i] ) = (char)EXPP_ClampInt( PyInt_AsLong( ob ), 0, 255 ); - - return 0; -} - -static int charRGBAAssSlice( BPy_charRGBA * self, int begin, int end, - PyObject * seq ) -{ - int count; - - if( begin < 0 ) - begin = 0; - if( end > 4 ) - end = 4; - if( begin > end ) - begin = end; - - if( !PySequence_Check( seq ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "illegal argument type for built-in operation" ); - - if( PySequence_Length( seq ) != ( end - begin ) ) - return EXPP_ReturnIntError( PyExc_TypeError, - "size mismatch in slice assignment" ); - - for( count = begin; count < end; count++ ) { - char value; - PyObject *ob = PySequence_GetItem( seq, count ); - - if( !PyArg_Parse( ob, "b", &value ) ) { - Py_DECREF( ob ); - return -1; - } - - *( self->rgba[count] ) = (char)EXPP_ClampInt( value, 0, 255 ); - - Py_DECREF( ob ); - } - - return 0; -} - -/*****************************************************************************/ -/* Function: charRGBA_repr */ -/* Description: This is a callback function for the BPy_charRGBA type. It */ -/* builds a meaninful string to represent charRGBA objects. */ -/*****************************************************************************/ -static PyObject *charRGBA_repr( BPy_charRGBA * self ) -{ - char r, g, b, a; - - r = *( self->rgba[0] ); - g = *( self->rgba[1] ); - b = *( self->rgba[2] ); - a = *( self->rgba[3] ); - - return PyString_FromFormat( "[%d, %d, %d, %d]", r, g, b, a ); -} diff --git a/source/blender/python/api2_2x/charRGBA.h b/source/blender/python/api2_2x/charRGBA.h deleted file mode 100644 index 9cc3dc739d1..00000000000 --- a/source/blender/python/api2_2x/charRGBA.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * $Id: charRGBA.h 10280 2007-03-16 14:44:31Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_charRGBA_H -#define EXPP_charRGBA_H - -#include - -/* Objects of are used inside other Blender Python - * objects, so this header file must contain only 'public' declarations */ -/* there's also rgbTuple, for rgb floats and a color obj in NMesh, messy! */ - -/* Python BPy_charRGBA structure definition: */ - -typedef struct { - PyObject_HEAD - char *rgba[4]; /* array of four pointers to chars */ - -} BPy_charRGBA; - -extern PyTypeObject charRGBA_Type; - -/*****************************************************************************/ -/* Python API function prototypes for the charRGBA helper module. */ -/*****************************************************************************/ -PyObject *charRGBA_New( char *rgba ); -PyObject *charRGBA_getCol( BPy_charRGBA * self ); -PyObject *charRGBA_setCol( BPy_charRGBA * self, PyObject * args ); - -#endif /* EXPP_charRGBA_H */ diff --git a/source/blender/python/api2_2x/constant.c b/source/blender/python/api2_2x/constant.c deleted file mode 100644 index 1034fbd616c..00000000000 --- a/source/blender/python/api2_2x/constant.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * $Id: constant.c 10778 2007-05-25 16:43:25Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#include "constant.h" /*This must come first */ - -#include "gen_utils.h" -#include "BLI_blenlib.h" - -PyTypeObject constant_Type; - -//------------------METHOD IMPLEMENTATIONS----------------------------- -//------------------------constant.items() -//Returns a list of key:value pairs like dict.items() -PyObject* constant_items(BPy_constant *self) -{ - return PyDict_Items(self->dict); -} -//------------------------constant.keys() -//Returns a list of keys like dict.keys() -PyObject* constant_keys(BPy_constant *self) -{ - return PyDict_Keys(self->dict); -} -//------------------------constant.values() -//Returns a list of values like dict.values() -PyObject* constant_values(BPy_constant *self) -{ - return PyDict_Values(self->dict); -} -//------------------ATTRIBUTE IMPLEMENTATION--------------------------- -//------------------TYPE_OBECT IMPLEMENTATION-------------------------- -//-----------------------(internal) -//Creates a new constant object -static PyObject *new_const(void) -{ - BPy_constant *constant; - - constant = (BPy_constant *) PyObject_NEW(BPy_constant, &constant_Type); - if(constant == NULL){ - return (EXPP_ReturnPyObjError(PyExc_MemoryError, - "couldn't create constant object")); - } - if((constant->dict = PyDict_New()) == NULL){ - return (EXPP_ReturnPyObjError(PyExc_MemoryError, - "couldn't create constant object's dictionary")); - } - - return (PyObject *)constant; -} -//------------------------tp_doc -//The __doc__ string for this object -static char BPy_constant_doc[] = "This is an internal subobject of armature\ -designed to act as a Py_Bone dictionary."; - -//------------------------tp_methods -//This contains a list of all methods the object contains -static PyMethodDef BPy_constant_methods[] = { - {"items", (PyCFunction) constant_items, METH_NOARGS, - "() - Returns the key:value pairs from the dictionary"}, - {"keys", (PyCFunction) constant_keys, METH_NOARGS, - "() - Returns the keys the dictionary"}, - {"values", (PyCFunction) constant_values, METH_NOARGS, - "() - Returns the values from the dictionary"}, - {NULL, NULL, 0, NULL} -}; -//------------------------mp_length -static int constantLength(BPy_constant *self) -{ - return 0; -} -//------------------------mp_subscript -static PyObject *constantSubscript(BPy_constant *self, PyObject *key) -{ - if(self->dict) { - PyObject *v = PyDict_GetItem(self->dict, key); - if(v) { - return EXPP_incr_ret(v); - } - return EXPP_ReturnPyObjError( PyExc_KeyError, - "key not found" ); - } - return NULL; -} -//------------------------mp_ass_subscript -static int constantAssSubscript(BPy_constant *self, PyObject *who, PyObject *cares) -{ - return 0; /* no user assignments allowed */ -} -//------------------------tp_getattro -static PyObject *constant_getAttro(BPy_constant * self, PyObject *value) -{ - if(self->dict) { - PyObject *v; - char *name = PyString_AS_STRING( value ); - - if(!strcmp(name, "__members__")) - return PyDict_Keys(self->dict); - -#if 0 - if(!strcmp(name, "__methods__") || !strcmp(name, "__dict__")) { - return PyObject_GenericGetAttr( (PyObject *)self, value ); - } -#endif - - v = PyDict_GetItemString(self->dict, name); - if(v) { - return EXPP_incr_ret(v); /* was a borrowed ref */ - } - return PyObject_GenericGetAttr( (PyObject *)self, value ); - } - return (EXPP_ReturnPyObjError(PyExc_RuntimeError, - "constant object lacks a dictionary")); -} -//------------------------tp_repr -static PyObject *constant_repr(BPy_constant * self) -{ - char str[4096]; - PyObject *key, *value, *tempstr; - int pos = 0; - - BLI_strncpy(str,"[Constant: ",4096); - tempstr = PyString_FromString("name"); - value = PyDict_GetItem( self->dict, tempstr ); - Py_DECREF(tempstr); - if(value) { - strcat(str, PyString_AsString(value)); - } else { - short sep = 0; - strcat(str,"{"); - while (PyDict_Next(self->dict, &pos, &key, &value)) { - if( sep ) - strcat (str, ", "); - else - sep = 1; - strcat (str, PyString_AsString(key)); - } - strcat(str,"}"); - } - strcat(str, "]"); - return PyString_FromString(str); -} -//------------------------tp_dealloc -static void constant_dealloc(BPy_constant * self) -{ - Py_DECREF(self->dict); - PyObject_DEL(self); -} - -//------------------TYPE_OBECT DEFINITION------------------------------ -static PyMappingMethods constantAsMapping = { - (inquiry) constantLength, // mp_length - (binaryfunc) constantSubscript, // mp_subscript - (objobjargproc) constantAssSubscript, // mp_ass_subscript -}; - -PyTypeObject constant_Type = { - PyObject_HEAD_INIT(NULL) //tp_head - 0, //tp_internal - "Constant", //tp_name - sizeof(BPy_constant), //tp_basicsize - 0, //tp_itemsize - (destructor)constant_dealloc, //tp_dealloc - 0, //tp_print - 0, //tp_getattr - 0, //tp_setattr - 0, //tp_compare - (reprfunc) constant_repr, //tp_repr - 0, //tp_as_number - 0, //tp_as_sequence - &constantAsMapping, //tp_as_mapping - 0, //tp_hash - 0, //tp_call - 0, //tp_str - (getattrofunc)constant_getAttro, //tp_getattro - 0, //tp_setattro - 0, //tp_as_buffer - Py_TPFLAGS_DEFAULT, //tp_flags - BPy_constant_doc, //tp_doc - 0, //tp_traverse - 0, //tp_clear - 0, //tp_richcompare - 0, //tp_weaklistoffset - 0, //tp_iter - 0, //tp_iternext - BPy_constant_methods, //tp_methods - 0, //tp_members - 0, //tp_getset - 0, //tp_base - 0, //tp_dict - 0, //tp_descr_get - 0, //tp_descr_set - 0, //tp_dictoffset - 0, //tp_init - 0, //tp_alloc - 0, //tp_new - 0, //tp_free - 0, //tp_is_gc - 0, //tp_bases - 0, //tp_mro - 0, //tp_cache - 0, //tp_subclasses - 0, //tp_weaklist - 0 //tp_del -}; -//------------------VISIBLE PROTOTYPE IMPLEMENTATION------------------- -//Creates a default empty constant -PyObject *PyConstant_New(void) -{ - return new_const(); -} -//Inserts a key:value pair into the constant and then returns 0/1 -int PyConstant_Insert(BPy_constant *self, char *name, PyObject *value) -{ - PyType_Ready( &constant_Type ); - return EXPP_dict_set_item_str(self->dict, name, value); -} -//This is a helper function for generating constants...... -PyObject *PyConstant_NewInt(char *name, int value) -{ - PyObject *constant = PyConstant_New(); - - if (constant) - { - PyConstant_Insert((BPy_constant*)constant, "name", PyString_FromString(name)); - PyConstant_Insert((BPy_constant*)constant, "value", PyInt_FromLong(value)); - } - return constant; -} -//This is a helper function for generating constants...... -PyObject *PyConstant_NewString(char *name, char *value) -{ - PyObject *constant = PyConstant_New(); - - if (constant) - { - PyConstant_Insert((BPy_constant*)constant, "name", PyString_FromString(name)); - PyConstant_Insert((BPy_constant*)constant, "value", PyString_FromString(value)); - } - return constant; -} diff --git a/source/blender/python/api2_2x/constant.h b/source/blender/python/api2_2x/constant.h deleted file mode 100644 index 1e325cef012..00000000000 --- a/source/blender/python/api2_2x/constant.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * $Id: constant.h 7089 2006-03-18 15:23:02Z campbellbarton $ - * - * ***** 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. - * - * This is a new part of Blender. - * - * Contributor(s): Willian P. Germano, Joseph Gilbert - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** -*/ - -#ifndef EXPP_constant_H -#define EXPP_constant_H - -#include - -/*-------------------TYPE CHECKS-------------------------------*/ -#define BPy_Constant_Check(v) ((v)->ob_type==&constant_Type) -/*-------------------TYPEOBJECT--------------------------------*/ -extern PyTypeObject constant_Type; -/*-------------------STRUCT DEFINITION-------------------------*/ -typedef struct { - PyObject_HEAD - PyObject * dict; -} BPy_constant; -/*-------------------VISIBLE PROTOTYPES-----------------------*/ -PyObject *PyConstant_New(void); -int PyConstant_Insert(BPy_constant *self, char *name, PyObject *value); -PyObject *PyConstant_NewInt(char *name, int value); -PyObject *PyConstant_NewString(char *name, char *value); - -#endif /* EXPP_constant_H */ diff --git a/source/blender/python/api2_2x/doc/API_intro.py b/source/blender/python/api2_2x/doc/API_intro.py deleted file mode 100644 index a630c47229e..00000000000 --- a/source/blender/python/api2_2x/doc/API_intro.py +++ /dev/null @@ -1,247 +0,0 @@ -# This is not a real module, it's simply an introductory text. - -""" -The Blender Python API Reference -================================ - - An asterisk (*) means the module has been updated. - - for a full list of changes since 2.42 see U{http://mediawiki.blender.org/index.php/Release_Notes/Notes243/Python_API} - - Top Module: - ----------- - - - L{Blender} - - L{bpy} (experimental) - - Submodules: - ----------- - - L{Armature} (*) - - L{NLA} - - L{Action} - - L{BezTriple} (*) - - L{BGL} - - L{Camera} (*) - - L{Curve} (*) - - L{Draw} (*) - - L{Effect} - - L{Geometry} (*) - - L{Group} (*) - - L{Image} (*) - - L{Ipo} (*) - - L{IpoCurve} (*) - - L{Key} (*) - - L{Lamp} - - L{Lattice} (*) - - L{Library} (*) - - L{Material} (*) - - L{Mathutils} (*) - - L{Mesh} (*) - - L{MeshPrimitives} (*) - - L{Metaball} (*) - - L{NMesh} (deprecated) - - L{Noise} - - L{Object} (*) - - L{Modifier} (*) - - L{Pose} (*) - - L{Constraint} (*) - - L{ActionStrips} (*) - - L{Registry} - - L{Scene} (*) - - L{Radio} - - L{Render} (*) - - L{Sound} (*) - - L{Text} - - L{Text3d} - - L{Font} - - L{Texture} (*) - - L{TimeLine} - - L{Types} - - L{Window} - - L{Theme} (*) - - L{World} - - L{sys} - - Additional information: - ----------------------- - - - L{Special features}: - - scripts: registering in menus, documenting, configuring (new); - - command line examples (new); - - script links (*), space handler script links, Group module (new). - -Introduction: -============= - - This reference documents the Blender Python API, a growing collection of - Python modules (libraries) that give access to part of the program's internal - data and functions. - - Through scripting Blender can be extended in real-time via - U{Python }, an impressive high level, multi-paradigm, open - source language. Newcomers are recommended to start with the tutorial that - comes with it. - - This opens many interesting possibilities, ranging from automating repetitive - tasks to adding new functionality to the program: procedural models, - importers and exporters, even complex applications and so on. Blender itself - comes with some scripts, but many others can be found in the Scripts & Plugins - sections and forum posts at the Blender-related sites listed below. - -Scripting and Blender: -====================== - -These are the basic ways to execute scripts in Blender: - - 1. They can be loaded or typed as text files in the Text Editor window, then - executed with ALT+P. - 2. Via command line: C{blender -P } will start Blender and execute - the given script. can be a filename in the user's file system or - the name of a text saved in a .blend Blender file: - 'blender myfile.blend -P textname'. - 3. Via command line in I{background mode}: use the '-b' flag (the order is - important): C{blender -b -P }. can be any - .blend file, including the default .B.blend that is in Blender's home directory - L{Blender.Get}('homedir'). In this mode no window will be opened and the - program will leave as soon as the script finishes execution. - 4. Properly registered scripts can be selected directly from the program's - menus. - 5. Scriptlinks: these are also loaded or typed in the Text Editor window and - can be linked to objects, materials or scenes using the Scriptlink buttons - tab. Script links get executed automatically when their events (ONLOAD, - REDRAW, FRAMECHANGED) are triggered. Normal scripts can create (L{Text}) and - link other scripts to objects and events, see L{Object.Object.addScriptLink}, - for example. - 6. A script can call another script (that will run in its own context, with - its own global dictionary) with the L{Blender.Run} module function. - - -Interaction with users: ------------------------ - - Scripts can: - - simply run and exit; - - pop messages, menus and small number and text input boxes; - - draw graphical user interfaces (GUIs) with OpenGL calls and native - program buttons, which stay there accepting user input like any other - Blender window until the user closes them; - - attach themselves to a space's event or drawing code (aka space handlers, - L{check here}); - - make changes to the 3D View (set visible layer(s), view point, etc); - - grab the main input event queue and process (or pass to Blender) selected - keyboard, mouse, redraw events -- not considered good practice, but still - available for private use; - - tell Blender to execute other scripts (see L{Blender.Run}()); - - use external Python libraries, if available. - - You can read the documentation for the L{Window}, L{Draw} and L{BGL} modules - for more information and also check the Python site for external modules that - might be useful to you. Note though that any imported module will become a - requirement of your script, since Blender itself does not bundle external - modules. - -Command line mode: ------------------- - - Python was embedded in Blender, so to access BPython modules you need to - run scripts from the program itself: you can't import the Blender module - into an external Python interpreter. - - On the other hand, for many tasks it's possible to control Blender via - some automated process using scripts. Interested readers should learn about - features like "OnLoad" script links, the "-b " (background mode) - and "-P